[
  {
    "path": ".editorconfig",
    "content": "# @see: http://editorconfig.org\n\n# top-most EditorConfig file\nroot = true\n\n# Tab indentation\n[*]\nindent_style = space\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n\n[*.md]\ntrim_trailing_whitespace = false\n\n[*.{ts,js,vue,css}]\nindent_size = 2\n\n# The indent size used in the `package.json` file cannot be changed\n# https://github.com/npm/npm/pull/3180#issuecomment-16336516\n[*.{yml,yaml,json}]\nindent_style = space\nindent_size = 2\n"
  },
  {
    "path": ".env.example",
    "content": "ELECTRON_WEB_SERVER_PORT = 42710\nELECTRON_DEV_NETEASE_API_PORT = 30001\nVITE_API_PORT = 9978\nVITE_API_URL = http://127.0.0.1:9978\nVITE_API_URL_PREFIX = /api\nVITE_MAIN_BUNDLE_ID = com.github.zyfun\n"
  },
  {
    "path": ".git-blame-ignore-revs",
    "content": ""
  },
  {
    "path": ".gitattributes",
    "content": "* text=auto eol=lf\n\nLICENSE.txt eol=crlf\nThirdPartyNotices.txt eol=crlf\n\n*.bat eol=crlf\n*.cmd eol=crlf\n*.ps1 eol=lf\n*.sh eol=lf\n*.rtf -text\n**/*.json linguist-language=jsonc\n\n/.yarn/**            linguist-vendored\n/.yarn/releases/*    binary\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "ko_fi: hiramwong\ncustom: [https://ifdian.net/a/hiram]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report.zh-CN.yml",
    "content": "name: 反馈 Bug\ndescription: 通过 github 模板进行 Bug 反馈。\ntitle: '[组件名称] 描述问题的标题'\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        # 欢迎你的参与\n        Issue 列表接受 bug 报告或是新功能请求。\n\n        在发布一个 Issue 前，请确保：\n        - 在 [旧Issue列表](https://github.com/Hiram-Wong/zyfun/issues?q=is%3Aissue) 中搜索过你的问题。（你的问题可能已有人提出，也可能已在最新版本中被修正）\n        - 如果你发现一个已经关闭的旧 Issue 在最新版本中仍然存在，不要在旧 Issue 下面留言，请建一个新的 issue。\n\n  - type: input\n    id: version\n    attributes:\n      label: zyfun 版本\n      description: 请检查在最新项目版本中能否重现此 issue。\n      placeholder: 请填写\n    validations:\n      required: true\n\n  - type: textarea\n    id: reproduceSteps\n    attributes:\n      label: 重现步骤\n      description: 请清晰的描述重现该 Issue 的步骤，这能帮助我们快速定位问题。没有清晰重现步骤将不会被修复，标有 'need reproduction' 的 Issue 在 7 天内不提供相关步骤，将被关闭。\n      placeholder: 请填写\n    validations:\n      required: true\n\n  - type: textarea\n    id: errorMessage\n    attributes:\n      label: 报错信息\n      description: F12, 重新复现后, 复制控制台报错信息。\n      placeholder: 请填写\n\n  - type: textarea\n    id: expect\n    attributes:\n      label: 期望结果\n      placeholder: 请填写\n\n  - type: textarea\n    id: actual\n    attributes:\n      label: 实际结果\n      placeholder: 请填写\n\n  - type: input\n    id: systemInfo\n    attributes:\n      label: 系统信息\n      placeholder: MacOS(11.2.3)系统 M1芯片 arm64架构\n\n  - type: textarea\n    id: remarks\n    attributes:\n      label: 补充说明\n      description: 可以是遇到这个 bug 的业务场景、上下文等信息。\n      placeholder: 请填写\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-report.zh-CN.yml",
    "content": "name: 反馈新功能\ndescription: 通过 github 模板进行新功能反馈。\ntitle: '[组件名称] 描述问题的标题'\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        # 欢迎你的参与\n        Issue 列表接受 bug 报告或是新功能请求。\n\n        在发布一个 Issue 前，请确保：\n        - 在 [旧Issue列表](https://github.com/Hiram-Wong/zyfun/issues?q=is%3Aissue) 中搜索过你的问题。（你的问题可能已有人提出，也可能已在最新版本中被修正）\n        - 如果你发现一个已经关闭的旧 Issue 在最新版本中仍然存在，不要在旧 Issue 下面留言，请建一个新的 issue。\n\n  - type: textarea\n    id: functionContent\n    attributes:\n      label: 这个功能解决了什么问题\n      description: 请详尽说明这个需求的用例和场景。最重要的是：解释清楚是怎样的用户体验需求催生了这个功能上的需求。我们将考虑添加在现有 API 无法轻松实现的功能。新功能的用例也应当足够常见。\n      placeholder: 请填写\n    validations:\n      required: true\n\n  - type: textarea\n    id: functionalExpectations\n    attributes:\n      label: 你建议的方案是什么\n      description: 请详尽说明这个需求的实现的方案。例如相关Electron API。\n      placeholder: 请填写\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!--\n首先，感谢你的贡献！😄\n请阅读并遵循 [zyfun 贡献指南]，填写以下 pull request 的信息。\nPR 在维护者审核通过后会合并，谢谢！\n-->\n\n### 🤔 这个 PR 的性质是？\n\n- [ ] 日常 bug 修复\n- [ ] 新特性提交\n- [ ] 文档改进\n- [ ] 组件样式/交互改进\n- [ ] 重构\n- [ ] 代码风格优化\n- [ ] 测试用例\n- [ ] 分支合并\n- [ ] 其他\n\n### 🔗 相关 Issue\n\n<!--\n1. 描述相关需求的来源，如相关的 issue 讨论链接。\n-->\n\n### 💡 需求背景和解决方案\n\n<!--\n1. 要解决的具体问题。\n2. 列出最终的 API 实现和用法。\n3. 涉及UI/交互变动需要有截图或 GIF。\n-->\n\n### 📝 更新日志\n\n<!--\n从用户角度描述具体变化，以及可能的 breaking change 和其他风险。\n-->\n\n- fix(组件名称): 处理问题或特性描述 ...\n\n- [ ] 本条 PR 不需要纳入 Changelog\n\n### ☑️ 请求合并前的自查清单\n\n⚠️ 请自检并全部**勾选全部选项**。⚠️\n\n- [ ] 文档已补充或无须补充\n- [ ] 代码演示已提供或无须提供\n- [ ] TypeScript 定义已补充或无须补充\n- [ ] Changelog 已提供或无须提供\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: 'github-actions'\n    directory: '/'\n    schedule:\n      interval: 'monthly'\n    open-pull-requests-limit: 3\n    commit-message:\n      prefix: 'ci'\n      include: 'scope'\n    groups:\n      github-actions:\n        patterns:\n          - '*'\n        update-types:\n          - 'minor'\n          - 'patch'\n"
  },
  {
    "path": ".github/workflows/nightly-build.yml",
    "content": "name: Nightly Build\n\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 17 * * *' # 1:00 BJ Time\n\npermissions:\n  contents: write\n  actions: write # Required for deleting artifacts\n\njobs:\n  cleanup-artifacts:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Delete old artifacts\n        env:\n          GH_TOKEN: ${{ github.token }}\n          REPO: ${{ github.repository }}\n        run: |\n          # Calculate the date 14 days ago\n          cutoff_date=$(date -d \"14 days ago\" +%Y-%m-%d)\n\n          # List and delete artifacts older than cutoff date\n          gh api repos/$REPO/actions/artifacts --paginate | \\\n          jq -r '.artifacts[] | select(.name | startswith(\"zyfun-nightly-\")) | select(.created_at < \"'$cutoff_date'\") | .id' | \\\n          while read artifact_id; do\n            echo \"Deleting artifact $artifact_id\"\n            gh api repos/$REPO/actions/artifacts/$artifact_id -X DELETE\n          done\n\n  check-repository:\n    runs-on: ubuntu-latest\n    outputs:\n      should_run: ${{ github.repository == 'Hiram-Wong/zyfun' }}\n    steps:\n      - name: Check if running in main repository\n        run: |\n          echo \"Running in repository: ${{ github.repository }}\"\n          echo \"Should run: ${{ github.repository == 'Hiram-Wong/zyfun' }}\"\n\n  check-commit:\n    runs-on: ubuntu-latest\n    outputs:\n      has_commit: ${{ steps.check.outputs.has_commit }}\n    steps:\n      - name: Check commits in last 24h\n        id: check\n        run: |\n          until=$(date -u +\"%Y-%m-%dT%H:%M:%SZ\")\n          since=$(date -u -d \"24 hours ago\" +\"%Y-%m-%dT%H:%M:%SZ\")\n\n          echo \"Checking commits:\"\n          echo \"  since: $since\"\n          echo \"  until: $until\"\n\n          count=$(gh api \\\n            -X GET \\\n            \"repos/${{ github.repository }}/commits?sha=main&since=$since&until=$until\" \\\n            --jq 'length')\n\n          echo \"Commit count: $count\"\n\n          if [ \"$count\" -gt 0 ]; then\n            echo \"has_commit=true\" >> $GITHUB_OUTPUT\n          else\n            echo \"has_commit=false\" >> $GITHUB_OUTPUT\n          fi\n        env:\n          GH_TOKEN: ${{ github.token }}\n\n  nightly-build:\n    needs: [check-repository, check-commit]\n    if: |\n      needs.check-repository.outputs.should_run == 'true' &&\n      (\n        github.event_name == 'workflow_dispatch' ||\n        needs.check-commit.outputs.has_commit == 'true'\n      )\n    runs-on: ${{ matrix.os }}\n    strategy:\n      matrix:\n        os: [macos-latest, windows-latest, ubuntu-latest]\n      fail-fast: false\n\n    steps:\n      - name: Check out Git repository\n        uses: actions/checkout@v6\n        with:\n          ref: main\n\n      - name: Install Node.js\n        uses: actions/setup-node@v6\n        with:\n          node-version-file: '.node-version'\n\n      - name: macos-latest dependencies fix\n        if: matrix.os == 'macos-latest'\n        run: |\n          brew install python-setuptools\n\n      - name: Install pnpm\n        uses: pnpm/action-setup@v4\n\n      - name: Get pnpm store directory\n        id: pnpm-cache\n        shell: bash\n        run: echo \"STORE_PATH=$(pnpm store path --silent)\" >> $GITHUB_OUTPUT\n\n      - name: Cache pnpm dependencies\n        uses: actions/cache@v5\n        with:\n          path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}\n          key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}\n          restore-keys: |\n            ${{ runner.os }}-pnpm-\n\n      - name: Install Dependencies\n        run: pnpm install\n\n      - name: Prepare env file\n        shell: bash\n        run: cp -f .env.example .env\n\n      - name: Generate date tag\n        id: date\n        run: echo \"date=$(date +'%Y%m%d')\" >> $GITHUB_OUTPUT\n        shell: bash\n\n      - name: Build Linux\n        if: matrix.os == 'ubuntu-latest'\n        run: |\n          sudo apt-get install -y rpm\n          pnpm build:linux\n        env:\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          NODE_OPTIONS: --max-old-space-size=8192\n\n      - name: Build Mac\n        if: matrix.os == 'macos-latest'\n        run: |\n          sudo -H pip install setuptools\n          pnpm build:mac\n        env:\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          NODE_OPTIONS: --max-old-space-size=8192\n\n      - name: Build Windows\n        if: matrix.os == 'windows-latest'\n        run: |\n          pnpm build:win\n        env:\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          NODE_OPTIONS: --max-old-space-size=8192\n\n      - name: Rename artifacts with nightly format\n        shell: bash\n        run: |\n          mkdir -p renamed-artifacts\n          DATE=${{ steps.date.outputs.date }}\n\n          # Windows artifacts - based on actual file naming pattern\n          if [ \"${{ matrix.os }}\" == \"windows-latest\" ]; then\n            # Setup installer\n            find dist -name \"*-x64-setup.exe\" -exec cp {} renamed-artifacts/zyfun-nightly-${DATE}-x64-setup.exe \\;\n            find dist -name \"*-arm64-setup.exe\" -exec cp {} renamed-artifacts/zyfun-nightly-${DATE}-arm64-setup.exe \\;\n\n            # Portable exe\n            find dist -name \"*-x64-portable.exe\" -exec cp {} renamed-artifacts/zyfun-nightly-${DATE}-x64-portable.exe \\;\n            find dist -name \"*-arm64-portable.exe\" -exec cp {} renamed-artifacts/zyfun-nightly-${DATE}-arm64-portable.exe \\;\n          fi\n\n          # macOS artifacts\n          if [ \"${{ matrix.os }}\" == \"macos-latest\" ]; then\n            find dist -name \"*-arm64.dmg\" -exec cp {} renamed-artifacts/zyfun-nightly-${DATE}-arm64.dmg \\;\n            find dist -name \"*-x64.dmg\" -exec cp {} renamed-artifacts/zyfun-nightly-${DATE}-x64.dmg \\;\n          fi\n\n          # Linux artifacts\n          if [ \"${{ matrix.os }}\" == \"ubuntu-latest\" ]; then\n            find dist -name \"*-x86_64.AppImage\" -exec cp {} renamed-artifacts/zyfun-nightly-${DATE}-x86_64.AppImage \\;\n            find dist -name \"*-arm64.AppImage\" -exec cp {} renamed-artifacts/zyfun-nightly-${DATE}-arm64.AppImage \\;\n          fi\n\n          # Copy update files\n          cp dist/latest*.yml renamed-artifacts/ || true\n\n      # Generate SHA256 checksums (Windows)\n      - name: Generate SHA256 checksums (Windows)\n        if: runner.os == 'Windows'\n        shell: pwsh\n        run: |\n          cd renamed-artifacts\n          echo \"# SHA256 checksums for Windows - $(Get-Date -Format 'yyyy-MM-dd')\" > SHA256SUMS.txt\n          Get-ChildItem -File | Where-Object { $_.Name -ne 'SHA256SUMS.txt' } | ForEach-Object {\n            $file = $_.Name\n            $hash = (Get-FileHash -Algorithm SHA256 $file).Hash.ToLower()\n            Add-Content -Path SHA256SUMS.txt -Value \"$hash  $file\"\n          }\n          cat SHA256SUMS.txt\n\n      # Generate SHA256 checksums (macOS/Linux)\n      - name: Generate SHA256 checksums (macOS/Linux)\n        if: runner.os != 'Windows'\n        shell: bash\n        run: |\n          cd renamed-artifacts\n          echo \"# SHA256 checksums for ${{ runner.os }} - $(date +'%Y-%m-%d')\" > SHA256SUMS.txt\n          if command -v shasum &>/dev/null; then\n            # macOS\n            shasum -a 256 * 2>/dev/null | grep -v SHA256SUMS.txt >> SHA256SUMS.txt || echo \"No files to hash\" >> SHA256SUMS.txt\n          else\n            # Linux\n            sha256sum * 2>/dev/null | grep -v SHA256SUMS.txt >> SHA256SUMS.txt || echo \"No files to hash\" >> SHA256SUMS.txt\n          fi\n          cat SHA256SUMS.txt\n\n      - name: List files to be uploaded\n        shell: bash\n        run: |\n          echo \"准备上传的文件:\"\n          if [ -x \"$(command -v tree)\" ]; then\n            tree renamed-artifacts\n          elif [ \"$RUNNER_OS\" == \"Windows\" ]; then\n            dir renamed-artifacts\n          else\n            ls -la renamed-artifacts\n          fi\n          echo \"总计: $(find renamed-artifacts -type f | wc -l) 个文件\"\n\n      - name: Upload artifacts\n        uses: actions/upload-artifact@v7\n        with:\n          name: zyfun-nightly-${{ steps.date.outputs.date }}-${{ matrix.os }}\n          path: renamed-artifacts/*\n          retention-days: 3 # 保留3天\n          compression-level: 8\n\n  Build-Summary:\n    needs: [check-commit, nightly-build]\n    if: always()\n    runs-on: ubuntu-latest\n    steps:\n      - name: Get date tag\n        id: date\n        run: echo \"date=$(date +'%Y%m%d')\" >> $GITHUB_OUTPUT\n        shell: bash\n\n      - name: Download all artifacts\n        if: needs.check-commit.outputs.has_commit == 'true'\n        uses: actions/download-artifact@v8\n        with:\n          path: all-artifacts\n          merge-multiple: false\n        continue-on-error: true\n\n      - name: Create summary report\n        run: |\n          if [ \"${{ needs.check-commit.outputs.has_commit }}\" != \"true\" ]; then\n            echo \"## 💤 今日未触发 Nightly 构建\" >> $GITHUB_STEP_SUMMARY\n            echo \"\" >> $GITHUB_STEP_SUMMARY\n            echo \"- 原因：过去 24 小时内 main 分支没有新的提交\" >> $GITHUB_STEP_SUMMARY\n            echo \"- 构建策略：仅在有提交时才触发 Nightly Build\" >> $GITHUB_STEP_SUMMARY\n            echo \"\" >> $GITHUB_STEP_SUMMARY\n            echo \"⏱ 检查窗口：最近 24 小时(UTC)\" >> $GITHUB_STEP_SUMMARY\n          else\n            echo \"## ⚠️ 警告：这是每日构建版本\" >> $GITHUB_STEP_SUMMARY\n            echo \"此版本为自动构建的不稳定版本，仅供测试使用。不建议在生产环境中使用。\" >> $GITHUB_STEP_SUMMARY\n            echo \"安装此版本前请务必备份数据，并做好数据迁移准备。\" >> $GITHUB_STEP_SUMMARY\n            echo \"构建日期：$(date +'%Y-%m-%d')\" >> $GITHUB_STEP_SUMMARY\n            echo \"\" >> $GITHUB_STEP_SUMMARY\n\n            echo \"## 📦 安装包校验和\" >> $GITHUB_STEP_SUMMARY\n            echo \"请在下载后验证文件完整性。提供 SHA256 校验和。\" >> $GITHUB_STEP_SUMMARY\n            echo \"\" >> $GITHUB_STEP_SUMMARY\n\n            # Check each platform's artifacts and show checksums if available\n\n            # Windows\n            WIN_ARTIFACT_DIR=\"all-artifacts/zyfun-nightly-${{ steps.date.outputs.date }}-windows-latest\"\n            if [ -d \"$WIN_ARTIFACT_DIR\" ] && [ -f \"$WIN_ARTIFACT_DIR/SHA256SUMS.txt\" ]; then\n              echo \"### Windows 安装包\" >> $GITHUB_STEP_SUMMARY\n              echo '```' >> $GITHUB_STEP_SUMMARY\n              cat \"$WIN_ARTIFACT_DIR/SHA256SUMS.txt\" >> $GITHUB_STEP_SUMMARY\n              echo '```' >> $GITHUB_STEP_SUMMARY\n              echo \"\" >> $GITHUB_STEP_SUMMARY\n            else\n              echo \"### Windows 安装包\" >> $GITHUB_STEP_SUMMARY\n              echo \"❌ Windows 构建未成功完成或未生成校验和。\" >> $GITHUB_STEP_SUMMARY\n              echo \"\" >> $GITHUB_STEP_SUMMARY\n            fi\n\n            # macOS\n            MAC_ARTIFACT_DIR=\"all-artifacts/zyfun-nightly-${{ steps.date.outputs.date }}-macos-latest\"\n            if [ -d \"$MAC_ARTIFACT_DIR\" ] && [ -f \"$MAC_ARTIFACT_DIR/SHA256SUMS.txt\" ]; then\n              echo \"### macOS 安装包\" >> $GITHUB_STEP_SUMMARY\n              echo '```' >> $GITHUB_STEP_SUMMARY\n              cat \"$MAC_ARTIFACT_DIR/SHA256SUMS.txt\" >> $GITHUB_STEP_SUMMARY\n              echo '```' >> $GITHUB_STEP_SUMMARY\n              echo \"\" >> $GITHUB_STEP_SUMMARY\n            else\n              echo \"### macOS 安装包\" >> $GITHUB_STEP_SUMMARY\n              echo \"❌ macOS 构建未成功完成或未生成校验和。\" >> $GITHUB_STEP_SUMMARY\n              echo \"\" >> $GITHUB_STEP_SUMMARY\n            fi\n\n            # Linux\n            LINUX_ARTIFACT_DIR=\"all-artifacts/zyfun-nightly-${{ steps.date.outputs.date }}-ubuntu-latest\"\n            if [ -d \"$LINUX_ARTIFACT_DIR\" ] && [ -f \"$LINUX_ARTIFACT_DIR/SHA256SUMS.txt\" ]; then\n              echo \"### Linux 安装包\" >> $GITHUB_STEP_SUMMARY\n              echo '```' >> $GITHUB_STEP_SUMMARY\n              cat \"$LINUX_ARTIFACT_DIR/SHA256SUMS.txt\" >> $GITHUB_STEP_SUMMARY\n              echo '```' >> $GITHUB_STEP_SUMMARY\n              echo \"\" >> $GITHUB_STEP_SUMMARY\n            else\n              echo \"### Linux 安装包\" >> $GITHUB_STEP_SUMMARY\n              echo \"❌ Linux 构建未成功完成或未生成校验和。\" >> $GITHUB_STEP_SUMMARY\n              echo \"\" >> $GITHUB_STEP_SUMMARY\n            fi\n\n            echo \"## ⚠️ Warning: This is a nightly build version\" >> $GITHUB_STEP_SUMMARY\n            echo \"This version is an unstable version built automatically and is only for testing. It is not recommended to use it in a production environment.\" >> $GITHUB_STEP_SUMMARY\n            echo \"Please backup your data before installing this version and prepare for data migration.\" >> $GITHUB_STEP_SUMMARY\n            echo \"Build date: $(date +'%Y-%m-%d')\" >> $GITHUB_STEP_SUMMARY\n          fi\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release\n\non:\n  workflow_dispatch:\n    inputs:\n      tag:\n        description: 'Release tag (e.g. v1.0.0)'\n        required: true\n        default: 'v1.0.0'\n      platform:\n        description: 'Build platform'\n        required: true\n        default: 'all'\n        type: choice\n        options:\n          - all\n          - windows\n          - mac\n          - linux\n  push:\n    tags:\n      - v*.*.*\n\n  pull_request_target:\n    branches:\n      - main\n    types:\n      - opened\n      - synchronize\n\npermissions:\n  contents: write\n\njobs:\n  release:\n    runs-on: ${{ matrix.os }}\n\n    strategy:\n      matrix:\n        os: ${{ fromJSON(\n          github.event_name == 'push' && '[\"macos-latest\", \"windows-latest\", \"ubuntu-latest\"]' ||\n          github.event_name == 'pull_request_target' && '[\"macos-latest\", \"windows-latest\", \"ubuntu-latest\"]' ||\n          github.event.inputs.platform == 'all' && '[\"macos-latest\", \"windows-latest\", \"ubuntu-latest\"]' ||\n          github.event.inputs.platform == 'linux' && '[\"ubuntu-latest\"]' ||\n          github.event.inputs.platform == 'windows' && '[\"windows-latest\"]' ||\n          github.event.inputs.platform == 'mac' && '[\"macos-latest\"]' ||\n          '[\"macos-latest\", \"windows-latest\", \"ubuntu-latest\"]'\n          ) }}\n      fail-fast: false\n\n    steps:\n      - name: Check out Git repository\n        uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n          ref: ${{ github.event_name == 'pull_request_target' && github.event.pull_request.head.sha || '' }}\n\n      - name: Get release tag\n        id: get-tag\n        shell: bash\n        run: |\n          if [ \"${{ github.event_name }}\" = \"workflow_dispatch\" ]; then\n            echo \"tag=${{ github.event.inputs.tag }}\" >> $GITHUB_OUTPUT\n          elif [ \"${{ github.event_name }}\" = \"pull_request_target\" ]; then\n            # Extract version from branch name (release/v1.0.0 -> v1.0.0)\n            BRANCH=\"${{ github.event.pull_request.head.ref }}\"\n            echo \"tag=${BRANCH#release/}\" >> $GITHUB_OUTPUT\n          else\n            echo \"tag=${GITHUB_REF#refs/tags/}\" >> $GITHUB_OUTPUT\n          fi\n\n      - name: Set package.json version\n        shell: bash\n        run: |\n          TAG=\"${{ steps.get-tag.outputs.tag }}\"\n          VERSION=\"${TAG#v}\"\n          npm version \"$VERSION\" --no-git-tag-version --allow-same-version\n\n      - name: Install Node.js\n        uses: actions/setup-node@v6\n        with:\n          node-version-file: '.node-version'\n\n      - name: macos-latest dependencies fix\n        if: matrix.os == 'macos-latest'\n        run: |\n          brew install python-setuptools\n\n      - name: Install pnpm\n        uses: pnpm/action-setup@v4\n\n      - name: Get pnpm store directory\n        id: pnpm-cache\n        shell: bash\n        run: echo \"STORE_PATH=$(pnpm store path --silent)\" >> $GITHUB_OUTPUT\n\n      - name: Cache pnpm dependencies\n        uses: actions/cache@v5\n        with:\n          path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}\n          key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}\n          restore-keys: |\n            ${{ runner.os }}-pnpm-\n\n      - name: Install Dependencies\n        run: pnpm install\n\n      - name: Prepare env file\n        shell: bash\n        run: cp -f .env.example .env\n\n      - name: Build Linux\n        if: matrix.os == 'ubuntu-latest'\n        run: |\n          sudo apt-get install -y rpm\n          pnpm build:linux\n        env:\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          NODE_OPTIONS: --max-old-space-size=8192\n\n      - name: Build Mac\n        if: matrix.os == 'macos-latest'\n        run: |\n          sudo -H pip install setuptools\n          pnpm build:mac\n        env:\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          NODE_OPTIONS: --max-old-space-size=8192\n\n      - name: Build Windows\n        if: matrix.os == 'windows-latest'\n        run: |\n          pnpm build:win\n        env:\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          NODE_OPTIONS: --max-old-space-size=8192\n\n      - name: Release\n        uses: ncipollo/release-action@v1\n        with:\n          draft: true\n          allowUpdates: true\n          makeLatest: false\n          tag: ${{ steps.get-tag.outputs.tag }}\n          artifacts: 'dist/*.exe,dist/*.dmg,dist/*.AppImage,dist/*.snap,dist/*.deb,dist/*.rpm,dist/*.tar.gz,dist/latest*.yml'\n          token: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\npnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\n\n# Dependencies\nnode_modules\nvenv\n.venv\n\n# Yarn\n.pnp.*\n.yarn/*\n!.yarn/patches\n!.yarn/plugins\n!.yarn/releases\n!.yarn/sdks\n!.yarn/versions\n.yarn-cache\n\n# Python\nuv.lock\n\n# Build Outputs\n.next\ndev-dist\ndist\ndist-ssr\nout\npackages/*/build\n\n# Turbo\n.turbo\n\n# Vercel\n.vercel\n\n# Editors\n.project\n.classpath\n.c9/\n*.launch\n.settings/\n*.sublime-workspace\n\n# IDE\n.aider*\n.claude/*\n.claude-code-router/*\n.codebuddy/*\n.cursor/*\n!.claude/skills/\n!.claude/skills/**\n.gemini/*\n.idea/*\n**/.idea/*\n.qwen/*\n.trae/*\n.vscode/*\n!.vscode/extensions.json\n!.vscode/launch.json\n!.vscode/mcp.json\n!.vscode/settings.json\n.zed/*\n\n# Env\n.env\n.env.*\n!.env.example\n\n# OS\n.DS_Store\n\n# Misc\n*.pem\n\n# Tests\ncoverage\n.vitest-cache\nvitest.config.*.timestamp-*\n.nyc_output\nplaywright-report\ntest-results\n\n# TypeScript incremental build\n.tsbuildinfo\n**/auto-imports.d.ts\n**/components.d.ts\n\n# Temp\n.temp\n.tmp\n\n# Runtime\npids\n*.pid\n*.pid.lock\n*.seed\n*.pyc\n__pycache__/\n\n# Husky\n.husky/*\n!.husky/_/*\n\n# Diagnostic reports (https://nodejs.org/api/report.html)\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\n\n# Dump\n*.dmp\ndmp.txt\n"
  },
  {
    "path": ".ncurc.yaml",
    "content": "reject:\n  # Electron\n  - vite\n  - '@electron/notarize'\n  - electron\n  - electron-builder\n  - electron-updater\n  - electron-store\n  - builder-util-runtime\n\n  # Libsql\n  - '@libsql/client'\n  - '@libsql/darwin-arm64'\n  - '@libsql/darwin-x64'\n  - '@libsql/linux-arm64-gnu'\n  - '@libsql/linux-x64-gnu'\n  - '@libsql/linux-arm64-musl'\n  - '@libsql/linux-x64-musl'\n  - '@libsql/win32-x64-msvc'\n  - '@strongtz/win32-arm64-msvc'\n\n  # Vitest\n  - vitest\n  - '@vitest/browser'\n  - '@vitest/coverage-v8'\n  - '@vitest/ui'\n  - '@vitest/web-worker'\n\n  # Others\n  - '@types/node'\n  - eslint\n  - monaco-editor\n  - npminstall\n  - pnpm\n  - proxy-agent\n  - undici\n"
  },
  {
    "path": ".node-version",
    "content": "24.11.1\n"
  },
  {
    "path": ".npmrc",
    "content": ""
  },
  {
    "path": ".nvmrc",
    "content": "24.11.1\n"
  },
  {
    "path": ".prettierignore",
    "content": "out\ndist\npnpm-lock.yaml\nLICENSE.md\ntsconfig.json\ntsconfig.*.json\nCHANGELOG*.md\n"
  },
  {
    "path": ".prettierrc.yaml",
    "content": "# 一行最多 120 字符\nprintWidth: 120\n# 使用 2 个空格缩进\ntabWidth: 2\n# 不使用缩进符，而使用空格\nuseTabs: false\n# 行尾需要有分号\nsemi: true\n# 使用单引号\nsingleQuote: true\n# 对象的 key 仅在必要时用引号\nquoteProps: as-needed\n# jsx 不使用单引号，而使用双引号\njsxSingleQuote: false\n# 末尾需要有逗号\ntrailingComma: all\n# 大括号内的首尾需要空格\nbracketSpacing: true\n# jsx 标签的反尖括号需要换行\nbracketSameLine: false\n# 箭头函数，只有一个参数的时候，也需要括号\narrowParens: always\n# 每个文件格式化的范围是文件的全部内容\nrangeStart: 0\nrangeEnd: .inf\n# 不需要写文件开头的 @prettier\nrequirePragma: false\n# 不需要自动在文件开头插入 @prettier\ninsertPragma: false\n# 使用默认的折行标准\nproseWrap: preserve\n# 根据显示样式决定 html 要不要折行\nhtmlWhitespaceSensitivity: css\n# vue 文件中的 script 和 style 内不用缩进\nvueIndentScriptAndStyle: false\n# 换行符使用 lf\nendOfLine: lf\n# JSON 递归排序\njsonRecursiveSort: true\n# JSON 排序规则\njsonSortOrder: '{\"*\": \"lexical\"}'\n# 插件\nplugins:\n  - prettier-plugin-sort-json\n"
  },
  {
    "path": ".stylelintignore",
    "content": "# .stylelintignore\n# 旧的不需打包的样式库\n*.min.css\n\n# 其他类型文件\n*.js\n*.jpg\n*.woff\n"
  },
  {
    "path": ".stylelintrc.yml",
    "content": "defaultSeverity: error\n\nextends:\n  - stylelint-config-standard\n\nplugins:\n  - stylelint-order\n\nrules:\n  no-descending-specificity: null\n  import-notation: string\n  no-empty-source: null\n  custom-property-pattern: null\n  selector-class-pattern: null\n\n  selector-pseudo-class-no-unknown:\n    - true\n    - ignorePseudoClasses:\n        - deep\n\n  # 官方说明：以下规则仅适用于原生 CSS，预处理器（Less）应关闭\n  media-query-no-invalid: null\n  declaration-property-value-no-unknown: null\n\noverrides:\n  - files:\n      - '**/*.html'\n      - '**/*.vue'\n    customSyntax: postcss-html\n\n  - files:\n      - '**/*.less'\n    customSyntax: postcss-less\n"
  },
  {
    "path": ".vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\",\n    \"editorconfig.editorconfig\",\n    \"lokalise.i18n-ally\",\n    // \"oxc.oxc-vscode\",\n    \"typescriptteam.native-preview\",\n    \"sdras.vue-vscode-snippets\",\n    \"vitest.explorer\",\n    \"vue.volar\"\n  ]\n}\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n  \"compounds\": [\n    {\n      \"configurations\": [\"Debug Main Process\", \"Debug Renderer Process\"],\n      \"name\": \"Debug All\",\n      \"presentation\": {\n        \"order\": 1\n      }\n    }\n  ],\n  \"configurations\": [\n    {\n      \"cwd\": \"${workspaceRoot}\",\n      \"env\": {\n        \"REMOTE_DEBUGGING_PORT\": \"9222\"\n      },\n      \"name\": \"Debug Main Process\",\n      \"request\": \"launch\",\n      \"runtimeArgs\": [\"--sourcemap\"],\n      \"runtimeExecutable\": \"${workspaceRoot}/node_modules/.bin/electron-vite\",\n      \"type\": \"node\",\n      \"windows\": {\n        \"runtimeExecutable\": \"${workspaceRoot}/node_modules/.bin/electron-vite.cmd\"\n      }\n    },\n    {\n      \"name\": \"Debug Renderer Process\",\n      \"port\": 9222,\n      \"presentation\": {\n        \"hidden\": true\n      },\n      \"request\": \"attach\",\n      \"timeout\": 60000,\n      \"type\": \"chrome\",\n      \"webRoot\": \"${workspaceFolder}/src/renderer\"\n    }\n  ],\n  \"version\": \"0.2.0\"\n}\n"
  },
  {
    "path": ".vscode/mcp.json",
    "content": "{\n  \"servers\": {\n    \"debug-electron-mcp\": {\n      \"args\": [\"-y\", \"@debugelectron/debug-electron-mcp@latest\"],\n      \"command\": \"npx\"\n    },\n    \"swagger-mcp\": {\n      \"args\": [\"-y\", \"swagger-mcp@latest\"],\n      \"command\": \"npx\",\n      \"env\": {\n        \"API_BASE_URL\": \"http://127.0.0.1:9978\",\n        \"API_DOCS_URL\": \"http://127.0.0.1:9978/docs/json\"\n      }\n    },\n    \"tdesign-mcp-server\": {\n      \"args\": [\"-y\", \"tdesign-mcp-server\"],\n      \"command\": \"npx\"\n    }\n  }\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"[css]\": {\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n  },\n  \"[javascript]\": {\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n  },\n  \"[javascriptreact]\": {\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n  },\n  \"[json]\": {\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n  },\n  \"[jsonc]\": {\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n  },\n  \"[less]\": {\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n  },\n  \"[markdown]\": {\n    \"files.trimTrailingWhitespace\": false\n  },\n  \"[scss]\": {\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n  },\n  \"[typescript]\": {\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n  },\n  \"[typescriptreact]\": {\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n  },\n  \"[vue]\": {\n    \"editor.defaultFormatter\": \"dbaeumer.vscode-eslint\"\n  },\n  \"editor.codeActionsOnSave\": {\n    \"source.fixAll.eslint\": \"explicit\",\n    // \"source.fixAll.oxc\": \"explicit\",\n    \"source.organizeImports\": \"never\"\n  },\n  \"editor.formatOnSave\": true,\n  \"editor.tabSize\": 2,\n  \"files.eol\": \"\\n\",\n  \"i18n-ally.displayLanguage\": \"zh-CN\",\n  \"i18n-ally.enabledFrameworks\": [\"vue\", \"i18next\"],\n  \"i18n-ally.enabledParsers\": [\"ts\", \"js\", \"json\"],\n  \"i18n-ally.fullReloadOnChanged\": true,\n  \"i18n-ally.keystyle\": \"nested\",\n  \"i18n-ally.localesPaths\": [\"packages/shared/locales/lang\"],\n  \"i18n-ally.namespace\": true,\n  \"i18n-ally.pathMatcher\": \"{locale}/{namespaces}.{ext}\",\n  \"i18n-ally.sortKeys\": true,\n  \"i18n-ally.sourceLanguage\": \"zh-CN\",\n  \"i18n-ally.usage.derivedKeyRules\": [\"{key}_one\", \"{key}_other\"],\n  \"search.exclude\": {\n    \"**/*.min.js\": true,\n    \"**/*.svg\": true,\n    \"**/dist/**\": true,\n    \"**/node_modules/**\": true,\n    \"out/**\": true,\n    \"patches/**\": true\n  },\n  \"typescript.disableAutomaticTypeAcquisition\": true,\n  \"typescript.tsdk\": \"node_modules/typescript/lib\",\n  \"typescript.tsserver.experimental.enableProjectDiagnostics\": false,\n  // \"typescript.experimental.useTsgo\": true\n  \"typescript.tsserver.maxTsServerMemory\": 4096\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n\n> All notable changes to this project will be documented in this file.\n\n## 3.4.4\n\n- 优化: mac/window侧边栏配色\n- 修复: windows x64平台调用npminstall失败\n- 修复: webview组件 缺失请求头加载方法\n- 修复: 改进更新行为，防止意外自动更新\n- 修复: window部分情况关闭窗口导致整个应用程序崩溃; arm平台打包失败\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.4.4)\n\n## 3.4.3 (2026-03-14)\n\n- 特性: vscode增加mcp工具\n- 特性: 支持影视action动作操作(action组件)\n- 优化: 简化hash路由加载\n- 优化: ip接口参数ipv4/ipv6优先缺失; 增加结果isChinaMainland字段\n- 优化: 鸿蒙操作系统标识识别\n- 优化: 数据配置-快捷配置 兼容直接导入频道\n- 优化: webview组件 src参数以支持默认加载\n- 优化: terminal组件 渲染样式\n- 优化: github action cicd引用仓库node版本\n- 修复: 影视 适配器初始化失败无具体报错信息; 适配器类型标注优化; T3Alist和T3Catopen适配器ext参数序列化处理, T3Drpy和T3Catopen缓存冲突以及执行失败无日志打印; T3Py适配器引用错误参数, 关闭时zmq有未返回时将阻塞主进程, 启动时获取pid不全, 部分情况进程异常退出, 不激活venv导致环境异常, 使用端口替代参数关键词匹配进程; 数据源检测vod—tag为folder或action报错(直接放行, 检测无意义)\n- 修复: 实验室-写源工具 首次加载非js适配器时提示语法报错; 代理上传处理三元组失败\n- 修复: 直播配置 上传时文件筛选参数错误\n- 修复: 历史记录 影视缺失集数数据; 接口进度跳过参数不返回\n- 修复: 同步请求模块 application/json处理错误\n- 修复: 缩放 尺寸计算错误; 刷新丢失缩放比例; 数值组件改为滑块; mac系统缩放不同步; 比例最大值和最小值\n- 修复: common-nav组件 像素计算错误; 重复滚动; 点击部分dom再点击第一个将滚动至最后; 切换页面(或搜索结果点击)搜索列表丢失; 搜索结果清空不触发滚动\n- 修复: dialog-document组件 类型错误; 文件名错误\n- 修复: search-panel组件 输入框有内容时清空按钮替代搜索按钮(因为搜索图标没实际效果) -> 点击生效\n- 修复: emitter 1.x -> 2.x 事件接收变动适配\n- 修复: ua含有控制字符时主程序崩溃\n- 修复: 影视分类只有一个时触发folder模式时没有重置按钮\n- 修复: 部分机器判断electron环境报错\n- 修复: MacOS Tahoe(26)以下操作系统交通灯位置错位\n- 修复: 复制成功提示类型错误 info -> success\n- 修复: ui库 alert组件info颜色错误; qrcode组件样式错误\n- 变动: 参数歧义 isChinaMainland(中国大陆) -> isCHS(简体中文)\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.4.3)\n\n## 3.4.2 (2026-02-15)\n\n- 特性: 支持配置缩放\n- 修复: 设置-基础配置 无效超时参数检测不符合逻辑(改为失焦校验)\n- 修复: 实验室-写源工具 文件目录在未创建时打开失败\n- 修复: AIGC 存在思考过程时一直显示思考中; 思考样式颜色错误; prompt提示词优化\n- 修复: 主进程未捕获告警日志\n- 修复: 部分参数未使用环境变量\n- 修复: 单词拼写错误(outher -> other)\n- 修复: 进程匹配不精确导致结束进程找不到\n- 修复: 影视检查可用性逻辑错误; 支持仅搜索检查; t3_py适配器增加类型标注\n- 修复: swagger文档部分参数解释缺失\n- 修复: uv处理依赖时证书错误\n- 修复: 扩展程序在启用/禁用/卸载时ipc通讯时参数序列化失败\n- 修复: 同步请求模块: fetch不必要的类型转换导致性能消耗; fetch请求体ContentType大小写错误; fetchCookie序列化错误; convertBase64Image错误; 取消对请求体Referer的处理\n- 变动: cdp嗅探: 默认规则启用 -> 未传自定义规则时启用\n- 变动: 影视适配器hiker公共库路径变动\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.4.2)\n\n## 3.4.1 (2026-02-08)\n\n> 破坏性更新\n\n- 特性: 支持软件级网络代理(子进程请求除外) [issue #437]\n- 特性: 硬件加速回归\n- 特性: 影视/电视/解析均提供检查可用性\n- 特性: 日志支持sse流输出(仅主程序日志)\n- 特性: 实验室-数据编码支持RC4Drop, AES和SM4适配GCM运算, RSA适配OAEP填充, 哈希支持SHA412-224/SHA512-256/SM3\n- 特性: epg电子节目单支持xml格式(无法指定日期)\n- 特性: 播放页设置跳过片头片尾提取当前进度条时间 [issue #463]\n- 特性: 播放解析类型数据时支持查询播放记录; 加载弹幕\n- 特性: 数据备份可备份至iCloud(MacOS专属)\n- 特性: 增加扩展环境自主下载页\n- 特性: 影视适配器支持catopen\n- 特性: 影视推荐分类动态显示\n- 优化: 国际化(翻译/解析平台/赞助/主程序), 整理公共节点, 支持繁体中文, 部分译文过长导致样式溢出\n- 优化: 主程序重构, 接口提供schema(支持swagger文档), 前后端提取公共模块, 统一多处写法, UI/UX调整, 部分逻辑迁移至后端处理, 前后端使用公共参数对其\n- 优化: 热榜数据接口参数归一化, 适配百度/夸克数据来源\n- 优化: 简化store跨标签页同步逻辑\n- 优化: 移除多处TDesgin组件库遗留问题导致过渡方案(三方已修复)\n- 优化: 影视py适配器pd系列函数适配, 调优rpc通讯, 支持传参\n- 优化: 直播页适配浅色模式\n- 优化: 设置 无效数据更新\n- 优化: 实验室-文本对比 导入导出逻辑\n- 优化: 实验室-插件中心 安装引导逻辑; 预览模块可能存在的冲突\n- 优化: 实验室-写源工具 采用实时日志; 移除预览模块\n- 优化: 实验室-静态筛选 采用写源工具同设计\n- 优化: 设置-数据管理 支持tvbox类加密数据\n- 优化: 弹幕参数兼容嵌套取值\n- 优化: 免责声明弹窗逻辑, 必须阅读后才可同意\n- 优化: 减少播放窗口io消耗, 窗口存在则通过刷新而不是重建\n- 优化: common-nav组件 搜索匹配性能(fuse.js -> include)\n- 优化: terminal组件 上下文记忆数调整; 适配搜索; webgl引擎渲染; 可见性切换画布填充bug; 选择错位\n- 优化: code-editor组件 hooks\n- 优化: aigc组件 优化提示词; 适配tdesgin库5.x版本\n- 优化: 封装多个公共组件 webview|group-btn|lazy-bg|input-req\n- 修复: 开发环境下主程序部分情况下无法热重载问题\n- 修复: 开发环境下代码规范(eslint prettierrc)格式化不生效\n- 修复: github action构建mac包内存溢出\n- 修复: windows首次使用弹命令行窗口(仅3.4.0版本) [issue #447]\n- 修复: 字体加载不渲染问题\n- 修复: 请求头: 开发者工具请求头显示不对应; CDP嗅探请求头不生效\n- 修复: 影视xml适配器搜索异常 [issue #445]\n- 修复: 在线更新更新包未下载完成可点击安装问题, 并增加下载进度显示 [issue #423]\n- 修复: 设置-数据源点击编辑不修改数据关闭后触发状态变更按钮不切换\n- 修复: 默认懒加载图卡顿且多分辨率下适配不全问题\n- 修复: 播放页: 数据重复传递问题(无效渲染); 部分情况metadata不加载; 小窗最小尺寸528*297(16:9); 小窗标题和拖拽冲突; 重复监听进度; 设置参数不立即生效问题\n- 修复: 调用系统播放器时播放观看数据清零问题\n- 修复: 解析页调优酷页路径异常\n- 修复: req-html(input-req)组件 子父数据不同步; post切换get存在data参数请求出错\n- 修复: router-control组件 部分页面打包环境下无法触发刷新\n- 修复: play-show组件 状态更新不稳定(机器性能较低); 节目名太长导致留白时间长问题\n- 修复: monaco-editor组件 diff模式下原文不同步问题\n- 修复: common-nav组件 点击范围缺失问题\n- 修复: title-menu组件 高度不统一, 数据变动不触发渲染或重复渲染\n- 修复: multi-player组件 已知问题(详见该组件CHANGELOG)\n- 修复: Linux操作系统rpm打包bug\n- 变动: 标识: zyplayer -> zyfun(全部字段均迁移)\n- 变动: 网盘入口不再提供, 合入影视Alist适配器\n- 变动: 影视适配器drpy使用3.9.52beta3 20250801\n- 变动: 插件: 安装/卸载/启动/停止 请求通道 http(超时机制) -> ipc(无超时)\n- 变动: 直播-缩略图: 外部ffmpeg -> 自主下载(win-arm不支持); 直播-台标和节目单增加字段标识所需说明\n- 变动: 窗口记忆: 设置-窗口记忆删除调整入口, 默认记忆模式(仅单台电脑记忆, 不作为同步数据)\n- 变动: 解析标识: 解析-线路标识(全局) -> 单源级别\n- 变动: 解析索引: 区分大陆和境外\n- 变动: 云端备份: 定时备份 -> 数据变化备份; 备份路径: zyplayer/文件名 -> zy/文件名\n- 变动: 设置-基础配置-数据管理(导入/导出/清理/同步) -> 设置-数据管理\n- 变动: 实验室-嗅探播放 -> 实验室-媒体嗅探 + 实验室-播放测试\n- 变动: aigc: 实验室-人工智脑 -> 全局入口; 预留供应商参数(默认 openai)\n- 变动: 挂载点: 统一对话框和抽屉挂等组件载dom\n- 变动: 标签页共享存储状态: 自研 -> pinia-shared-state\n- 变动: 调试回放记录: pageSpy(在线) -> oSpy(离线)\n- 变动: 开源协议: MIT -> AGPL3.0\n- 变动: 免责声明: 根据内容变化做出相应的变动\n- 变动: 数据库: pgsql -> sqlite (原数据库故障概率高, 维护不便) [issue #447]\n- 变动: vite: rollup -> rolldown; typescript: tsc -> ts-go (速度更快)\n- 变动: 数据库字段(注意备份)\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.4.1)\n\n## v3.4.0 (2025-04-30)\n\n- 特性: 支持oplayer+样式按播放器导入(样式调整)+修复xgplayer倍速显示undefeated+artplayer方法playNext封装错误+svg图标微调+修复formatUrlHeaders数据类型错误导致播放地址拼接失败\n- 特性: 导入数据支持历记忆\n- 特性: 右键支持复制粘贴等+频道中忽略触发\n- 特性: 数据源支持T3Py+写源工具支持T3Py(需要电脑安装py3.8+和对应依赖)\n- 优化: 基础设置页面打开慢(win和mac intel系列感受明显)\n- 优化: 数据源检测逻辑(分类+列表)+批量检测\n- 优化: drpy重复初始化+缓存从3个改到6个+重构worker逻辑\n- 优化: 统一Dialog挂载节点+统一表单处理方法+优化参数校验\n- 优化: 重构解析页, 直接展示站点, 播放跳转播放器(腾讯不支持搜索, 未知原因)\n- 优化: 所有数据均可记录至时刻(此前只支持影视)\n- 优化: 插件功能项重写依赖安装逻辑(集成7.24.2)+布局调整\n- 优化: ai接口重构(支持常规和sse)+记忆上下文+sse响应+停止则取消请求(停止提示)+响应打字机效果+响应中禁止操作+仅最后响应可重生成\n- 优化: 去广逻辑采用龙头大佬20250416版本\n- 优化: 重构ipc(替代@electron/remote)+renderer进程禁用node环境开启上下文隔离\n- 优化: 主进程部分模块解耦(参数归一)+启动流程优化+快捷键模块重构+增加hiker路径模块\n- 优化: 基础设置逻辑优化+提取快捷键组件\n- 修复: 数据编码样式错乱+不依赖node:Buffer模块+rc4参数控制错误+sm4解密错误\n- 修复: 写源工具面板分隔不跟手(使用splitpanes替代arco)+控制台重构(@xterm/xterm替代luna-console)+日志输出\n- 修复: 静态筛选批量结果不显示\n- 修复: 普通输入框重复粘贴+monaco-editor编辑器无法粘贴\n- 修复: monaco-editor组件按钮错位+主题不跟随\n- 修复: windows和linux在写源工具和静态筛选页面样式错乱问题\n- 修复: 影视详情主演｜演员等参数匹配为空问题\n- 修复: 写源工具代理数据上传三元组校验+过滤条件不生效\n- 修复: 清理缩略图后不会重新计算空间\n- 修复: 网盘(alist)提示配置路径错误\n- 修复: 解析为json时类型headers逻辑错误-应获取解析数据头而不是请求解析头\n- 修复: 主进程解析畸形url地址异常\n- 变动: 调整用户代理默认值\n- 变动: 补全缺失多语言词条\n- 变动: 数据库字段(注意备份)\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.4.0)\n\n## v3.3.10 (2025-02-06)\n\n- 特性: 调试模式启动数据库端口(5432), 前端console打印\n- 特性: 插件中心(实验性)\n- 特性: 文件对比diff\n- 优化: 播放影视时顶部显示当前播放的剧集\n- 优化: fastify路由\n- 优化: 去广逻辑\n- 优化: lrucache加载同源数据变动加载机制(仅支持数据规则在源中) [issue #382]\n- 优化: 多播放器-完善类型判断(先走HEAD, 重试走GET)｜xgplayer,artplayer支持i18n和下集调用 | 移除dplayer,nplayer(核心与artplayer一致, 仅ui区别)\n- 优化: 续下集+跳时间 对其腾讯视频\n- 优化: markdown 渲染\n- 优化: 写源工具(重构)\n- 优化: 公共组件侧边栏默认滚动到当前激活\n- 优化: AI组件重写\n- 优化: 收藏(时刻)倒序, 新增date字段\n- 优化: 源管理搜索过滤like(大小写敏感)改为ilike(大小写模糊)\n- 优化: 公共组件title-menu过滤空数据\n- 优化: ipc和hiker(file+request)方法完善\n- 修复: 参数拼写错误 [issue #378]\n- 修复: 时刻调用第三方播放器提示数据报错 [issue #363]\n- 修复: 收藏load数据长度报错导致无法翻页 [issue #376]\n- 修复: 去广和请求头同时存在导致数据冲突 & 优化去广前置判断 & 播放请求头去除不安全部分(浏览器报错)\n- 修复: 影视搜索中数据源只有一组时数据不翻页\n- 修复: 数据源 drpyjs0,t0xml,t1json,t4hipy vod_content格式化错误 | drpyjs0,t4hipy 返回play参数不规范 [issue #387] | t0xml 返回参数不规范 | drpyjs0,t0xml,t1json,t4hipy,catvod categories参数为空时报错 | wd参数重复编码问题 | drpyjs0,t4hipy 缺失pg参数| t0xml,t1json 兼容性 [issue #388]\n- 修复: 弹幕参数下标存在为0加载失败问题\n- 修复: 开启预加载+点击非下集选集播放链接不正确\n- 修复: 开启预加载+弹幕下集加载弹幕不显示\n- 修复: 预加载不生效\n- 修复: 影视+时刻二级返回值没有vod_id导致历史存的数据不准确(用一级vod_id赋值)\n- 修复: 电视开启缩略图时生成失败+生成后刷新生效问题\n- 变动: 弹幕增加返回标识字段\n- 变动: 部分数据库字段长度变更\n- 变动: drpy2库更新至`3.9.51beta6 20241126`\n- 变动: 数据库字段(注意备份)\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.10)\n\n## v3.3.9 (2024-12-01)\n\n- 特性: 数据追加能力(注意数据清洗能力永远不会上线)\n- 特性: 仅搜索源不在数据源中显示(增加开关)[issue #283]\n- 特性: 支持播放器请求头(实验性)\n- 特性: 播放页自动续集(增加开关)\n- 修复: 数据源T0xml无法加载 | catbox筛选不生效 | xbpq xyq网络源无法加载 | appysv2判断逻辑 | T0xml T1json搜索逻辑\n- 修复: 历史播放记录无法读取(未开启跳进度的时候存在该问题)\n- 修复: 播放页解析记录为空时组件bug导致点击无效(tdesgin组件bug暂时规避,等腾讯修复)\n- 修复: 软件运行时再次打开奔溃[issue #354]\n- 修复: 数据非标准JSON格式无法导入(改为JSON5兼容)[issue #350]\n- 修复: win在线更新无限提醒 issue(下载完成后不安装一直点下载时存在该问题)[issue #349]\n- 修复: 数据源搜索时数据不显示(数据达不到当前搜索页时存在)[issue #347]\n- 修复: 频道名称显示不完整(名称含空格时存在该问题)[issue #342]\n- 修复: 网盘不显示全部文件(增加开关)\n- 修复: 写源工具导入部分情况失败\n- 修复: drpy库部分逻辑错误(atob问题｜withHeaders问题)\n- 修复: 全局用户代理不生效\n- 优化: 多播放器融合统一能力\n- 优化: 系统托盘支持快捷打开软件数据目录\n- 优化: 去广逻辑升级{感谢 @hpindigo}\n- 优化: 子进程中网络请求能力(mac下快一倍)\n- 优化: 嗅探播放页增加视频类型Auto选项系统自己判断\n- 优化: 数据源配置滚动标题栏固定\n- 优化: 数据加解密支持更多参数并支持3DES、Rabbit、RabbitLegacy、SM4 | 哈希计算支持Hmac\n- 变动: debug数据源可删除(部分用户强迫症)\n- 变动: 回归数据源检测, 仅支持单次检测(批量会窜数据)\n- 变动: 数据库字段(注意备份)\n- 变动: 依赖升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.9)\n\n## v3.3.8 (2024-11-15)\n\n> 破坏性更新\n\n- 特性: 支持csp_XBPQ|csp_XYQ|csp_AppYSv2源格式(实验性)\n- 特性: 注册URL Scheme, 支持通过zy://协议唤醒应用\n- 特性: 支持常见加解密|hash计算|数据编码\n- 特性: 支持folderInfolder模式\n- 特性: 抽离加解密方法, 封装部分海阔方法(开发者福音)\n- 优化: 多语言适配已知未适配内容+已知样式溢出内容修改+支持tdesgin内置组件\n- 优化: 侧边栏采用虚拟列表渲染(数据太多导致太多dom元素卡顿)\n- 优化: 嗅探逻辑支持sniffer_exclude参数，对齐道长嗅探器传参格式\n- 优化: 电视导入时过滤不支持协议(ftp|rtsp|rsp)\n- 优化: 重新导入历史和收藏均显示找不到数据源(回归key设计-注意之前历史会失效)\n- 优化: 解析类型为web时调用嗅探器嗅探后使用播放器(iframe显示可能有广)\n- 优化: 全局超时时间调整为最小3s最大60s, 超过范围自动设置为3s\n- 优化: 数据源选择csp_XBPQ|csp_XYQ|csp_AppYSv2可自动填充api\n- 优化: 老板键在原有隐藏窗口基础上增加窗口静音和暂停[issue #323]\n- 优化: 网络请求优化, 部分逻辑迁移到后端(如无法篡改请求头内容, 此前方式为先自定义再底层恢复)\n- 优化: 数据源实现逻辑解耦合, 每个实现逻辑都为一个适配器模式(开发者福音)\n- 优化: 修改打包hook机制, 跳过签名校验, 仅保留 zh & en 字体(win+linux 生效)\n- 优化: 统一主进程和渲染进程通讯规范, 采用小驼峰命名(开发者福音)\n- 优化: ui统一更多设计样式, 部分ux操作加入过渡动画\n- 优化: 简化前端权限逻辑实现(逻辑过于复杂)\n- 优化: 封装前端组件减，少冗余代码(monaco编辑器|数据源配置|md渲染)\n- 优化: 新版TdesginUI组件库empty组件替代原有提取自ElementUI手搓组件\n- 优化: 使用vue3.5版本, 使用部分新特性替代老代码(如useTemplateRef)\n- 优化: 拦截多个开发者工具无限debugger脚本(devtools-detector|disable-devtool)\n- 优化: 重构播播放器逻辑\n- 优化: 播放器共享并记忆音量|倍速|静音(注意:dplayer设置静音项图标不对应)\n- 优化: 数据源初始化Adapter适配器时使用LRU缓存(10个)\n- 修复: 新版titlebar组件不兼容问题(win、linux均有该问题)\n- 修复: mac系统触发每次打开应用都弹窗网络请求权限校验(打开防火墙情况)\n- 修复: win11系统存在安装应用后无法打开(nsis安装脚写注册表逻辑问题)\n- 修复: 数据源列表通过搜索加载的数据选中删除无效\n- 修复: 数据源编辑内容无需点击确认就可修改原始数据\n- 修复: 播放器中epg列表不加载数据源中的专属epg\n- 修复: 网盘错误逻辑导致切换数据源会导致数据源消失[issue #314]\n- 修复: 网盘匹配不到password导致服务终止\n- 修复: 播放器播放影视视频, 点击推荐数据无法触发事件\n- 修复: 数据导入时涉及基础配置时以及webdev远端同步本地数据不刷新\n- 修复: 新版本electron前端获取不到文件路径, 替换为electron-dialog方案\n- 修复: 智脑无法打开openai链接\n- 修复: 切换分类｜切换数据源, 顶部搜索关键词不恢复默认问题\n- 修复: 基础数据设置数据不成功问题(已初始化数据为基准)\n- 修复: 侧边栏收起对不齐顶部问题(强迫着患者福音)\n- 修复: 用户数据导入不规范导致窗口无法打开[issue #312]\n- 修复: 切换频道节目单不更新[issue #346]\n- 修复: md文档内容无法渲染有序和无序dom\n- 修复: 嗅探器服务脱离窗口池问题(窗口服务统一管理)\n- 修复: 开启webdev自动同步会无限创建webdev对象导致内存未释放\n- 修复: 影视和站点顶部菜单已经激活的菜单再次点击无法触发 数据加载\n- 变动: 字体采用小米字体(MiSans)\n- 变动: 拆封写源工具部分功能并独立于设置页面\n- 变动: 剔除-iframe嗅探方案(限制较多, 和pie方案功能相差较多)\n- 变动: 剔除-收藏页检查更新功能(效果与实际设想相差较大);\n- 变动: 剔除-数据源类型appv1和appv2(实验性csp_AppYSv2替代)\n- 变动: 剔除-设置页hipy的推广内容\n- 变动: 剔除-数据源有限性检测(现有逻辑较为鸡肋, 同时导致用户不断询问)\n- 变动: 剔除-硬件加速开关(数据库变更后硬件加速禁用失败)\n- 变动: 剔除-随心看功能(鸡肋功能)\n- 变动: 剔除-v8引擎缓存机制(没有带来性能提升)\n- 变动: 修改-数据管理-快捷配置剔除此软件导入方式, 合并tvbox和hipy导入格式\n- 变动: 修改-影视第一个分类数据改为加载首页数据(homeVod)\n- 变动: 修改-电视相关参数epg应携带{name}和{date}|logo应携带{name}(优先级:自带->源自带->全局)\n- 变动: 修改-电视过滤ipv6频道改为仅标识ipv6(跳过检测会增加加载时间, 不友好)\n- 变动: 修改-数据库从lowdb变更为PGLite(数据强校验, 字段不规范直接报错)\n- 变动: 修改-升级所有依赖, 前端部分依赖不再依赖nodejs(不再兼容老系统, 稳定性有提升)\n- 变动: 修改-drpy核心对齐道长仓库最新版本2024.10(取消摇树, 最新侵入库本身)\n- 变动: 修改-debug涉及PageSpy服务域名变更\n- 变动: 数据库字段(注意备份)\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.8)\n\n## v3.3.7 (2024-07-30)\n\n> 最后一个版本支持win7\n\n- 特性: 全新卡片式ui(侧边导航可折叠)\n- 特性: DNS-over-HTTP回归(重构逻辑)\n- 特性: 调试模式\n- 特性: 影视搜索支持过滤\n- 特性: 写原工具之筛选插件\n- 特性: 热搜增加移动爱家和豆瓣接口[issue #221]\n- 特性: 播放页小窗设计[issue #218]\n- 特性: 侧边导航可搜索源[issue #241]\n- 特性: 写原工具支持拖拽文件展示数据\n- 特性: 播放器支持 mpd 和 dash\n- 优化: 线路选择样式变动[issue #240]\n- 优化: 调整底层版本支持硬解hevc[issue #261]\n- 优化: 播放器倍速逻辑重构[issue #278 #279]\n- 优化: loading 层重构，减少内存消耗\n- 优化: 多窗口数据交互接口重构\n- 优化: 嗅探支持更多格式\n- 优化: 多窗口逻辑重构\n- 修复: 配置源需要刷新问题 (重构bus总线)\n- 修复: 搜索输入框双击触发最大化问题1\n- 修复: 部分情况下搜索页无法进入详细页[issue #228]\n- 修复: 部分提示词变动及多语言适配[issue #288]\n- 变动: openai默认模型调整, 支持输入模型\n- 变动: 写源工具文档地址调整为github-wiki\n- 变动: 播放器背景图\n- 变动: 数据库字段(注意备份)\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.7)\n\n## v3.3.6 (2024-05-20)\n\n- 修复: 播放页倒序后逻辑混乱\n- 修复: 解析切换type前播放器未摧毁\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.6)\n\n## v3.3.5 (2024-05-19)\n\n- 特性: 解析支持json格式(type:1)\n- 特性: 播放器支持去插播、预嗅探加载下一集[issue #205]\n- 特性: 播放页支持选择解析线路\n- 特性: 支持全局超时时间(不要设置太短影响本地服务器数据读取)\n- 优化: 播放器重构, 全播放器支持弹幕(破坏性的)\n- 优化: 写源工具支持嗅探、源代码格式化、源代码编码、编辑器智能提醒、ai、服务生成式[discussions #180]\n- 优化: 嗅探器支持初始化参数\n- 优化: 写源工具导致整个设置页面白屏时间长\n- 优化: 推荐数据逻辑重构(破坏性的)\n- 修复: 数据源可以添加空白数据\n- 修复: 嗅探器定时器失效导致内存溢出\n- 修复: 分类有重复id导致vue内存溢出\n- 修复: 选集倒序序号不变化\n- 变动: 免责申明协议更新\n- 变动: drpy库同步保持最新\n- 变动: 数据库字段(注意备份)\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.5)\n\n## v3.3.4 (2024-04-27)\n\n- 特性: 支持国际化(中文｜英语)\n- 特性: webdev支持自动同步数据(5分钟一次)[issue #158]\n- 特性: 写源工具\n- 特性: 支持第三方嗅探[issue #164]\n- 特性: 上线随心看\n- 特性: 支持弹幕(仅西瓜播放器)\n- 优化: t3模块支持本地代理(暂未测试)｜同步保持更新(当前为3.9.50beta2 202400427){感谢 @hjdhnx}\n- 优化: 数据导入支持相对路径\n- 优化: 播放页逻辑解耦部分、样式优化、支持同步主题变化\n- 修复: Linux不显示桌面图标[issue #179]\n- 修复: 修改老板键写入脏数据\n- 修复: 时刻取消后重新收藏出现该源被删除[issue #173 #162]\n- 修复: 当触发不同站点详情页数据不变化[issue 146]\n- 修复: 搜索通过点击触发显示事件e\n- 修复: 搜索触发多次多余详情爬虫\n- 修复: 搜索当源不是t3时搜索失败\n- 修复: 外部播放器传递特殊字符数据丢失一部分[issue #171]\n- 修复: 播放页、详情页触发多个高亮选中集数(重构逻辑和历史数据冲突，表现为有历史数据时不自动播放，需手动点击或者清空历史)\n- 修复: 播放页为直播时无法使用全局台标\n- 修复: 采用新架构后版本升级数据字段变动无法随版本迁移\n- 修复: 生产模式下不生成日志文件\n- 修复: windows快捷键无法打开开发者模式\n- 变动: 数据库字段(注意备份)\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.4)\n\n## v3.3.3 (2024-03-25)\n\n- 特性: 兼容t3影视源(不支持本地代理){感谢 @hjdhnx}\n- 特性: 兼容catvod影视源(不支持本地代理){感谢 @catvod}\n- 优化: 调用系统播放器不再使用环境变量[issue #152]\n- 优化: 影视、电视、过刻页面采用响应式方案\n- 修复: 修复mac系统托盘不适应背景色问题[issue #143]\n- 修复: 修复影视搜索时过刻数据错乱问题[issue #157]\n- 修复: 修复西瓜播放器快捷键问题[issue #150]\n- 修复: 修复免责申明无法打开问题(含申明内容更新)\n- 修复: 修复解析历史抽屉点击删除触发播放和页面自动关闭问题\n- 修复: 修复缩略图文件夹未生成问题\n- 修复: 修复重启软件老板键失效问题[issue #153]\n- 修复: 修复搜索交互问题[issue #153]\n- 变动: 端口变更8345->9978 (同tvbox本地端口)\n- 变动: 数据库字段(注意备份)\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.3)\n\n## v3.3.2 (2024-02-29)\n\n- 特性: 新增系统托盘\n- 特性: 兼容hipy影视源\n- 优化: 重构大部分页面，框架升级至electron-vite(流畅性玄学优化)\n- 优化: 数据不在存储在前端采用lowdb，并开一个后端fastify服务(端口 8345)\n- 优化: 全新logo，优化win尺寸偏小问题{感谢 @fourbeauty}\n- 优化: 直播延迟检测机制\n- 优化: 播放器为系统时，支持先嗅探在调用系统播放器\n- 优化: 影视源有效检测机制、收藏更新检测机制、影视聚合搜索增加队列并发\n- 优化: 空间优化 (mac减少100+mb | win 减少20+mb | linux 减少30+mb)\n- 修复: 修复影视和直播页面内存溢出问题\n- 修复: 修复影视菜单映射关系不存在导致切换分类失败问题\n- 修复: 修复播放器为系统时，影视详情播放列表不对应问题\n- 修复: 修复解析历史抽屉遮挡无法点击系统操作栏问题(除苹果操作系统外)\n- 修复: 修复解析历史抽屉点击删除触发播放和页面自动关闭问题\n- 修复: 修复解析搜索时关闭按钮遮挡无法点击系统操作栏问题(除苹果操作系统外)\n- 修复: 修复影视聚合搜索重复源搜索问题\n- 变动: 删除腾讯播放器(特性开始恶心新增账号验证才能使用)，增加系统调用vlc(需保证环境变量)\n- 变动: 彩蛋开放，不再需要触发\n- 变动: 数据库字段(注意备份)\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.2)\n\n## v3.3.1 (2023-12-17)\n\n- 特性: 主窗口退出保存位置[issue #113]\n- 特性: 设置增加全局配置 iptv 台标配置\n- 优化: 各项目可直接跳转到配置源\n- 优化: 修改默认加载图\n- 修复: windows 状态栏错乱(特地在 win 平台测试了)[issue #118 #116]\n- 修复: 设置表格中存在大量逻辑问题\n- 修复: 调用播放窗口标题 undefined\n- 修复: 开发模式下 ffmpeg 调用失败\n- 修复: 影视源连续添加不同配置提示已存在\n- 修复: 搜索栏高度问题导致出现滚动条\n- 变动: 免责申明协议调整至基础设置\n- 变动: 数据库字段(注意备份)\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.1)\n\n## v3.3.0 (2023-12-03)\n\n- 优化: 加载页动画效果\n- 修复: pie嗅探报错(electron版本导致)\n- 修复: 无法从解析历史播放\n- 修复: 影视搜索一个报错后面无法执行[issue #108]\n- 修复: 设置中嗅探方案不显示选择项\n- 修复: 分享组件特殊情况下无法生成二维码\n- 变动: 修改系统默认菜单栏\n- 变动: 数据库字段(注意备份)\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.0)\n\n## v3.2.10 (2023-09-30)\n\n- 特性: 支持alist网盘功能(实验性){感谢开源项目@CatVodOpen}\n- 特性: 支持pie嗅探{感谢 开源项目@CatVodOpen}\n- 优化: 重构底部加载细节(自认为有优化)\n- 优化: iptv缩略图创建文件夹时机优化\n- 优化: 数据导入导出做了更多的逻辑校验(防止手贱玩家)\n- 修复: 修复一键配置单词拼写错误导致的问题7.变动：修改系统默认菜单栏(mac 生效)\n- 变动: 数据库字段(注意备份)\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.10)\n\n## v3.2.9 (2023-09-14)\n\n- 修复: 一键配置回归\n- 修复: 已知 bugs\n- 变动: 数据库字段(注意备份)\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.9)\n\n## v3.2.8 (2023-09-03)\n\n- 特性: 新增dp播放器替代阿里、火山播放器(支持调用mac本地 iina, win本地potplayer)\n- 特性: 数据管理模块重构[支持备份到 webdev]\n- 修复: 直播缩略图实验性功能导致打开报错[issue #73 #69]\n- 修复: 播放器分享功能地址失效[pr #72]\n- 变动: 增加drpy推荐位\n- 变动: 数据库字段(注意备份)\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.8)\n\n## v3.2.7 (2023-08-20)\n\n- 特性: 全新ui/ux\n- 特性: 直播缩略图(实验性, 需安装ffmpeg)\n- 特性: 增加loading层窗口优化打开软件白屏久\n- 修复: 基础设置判断ipv6获取地址不是公网ip的问题\n- 修复: 通过设置源切换默认加载出错以及分类不对的问题\n- 修复: 直播无法切换非远程链接的问题\n- 修复: mac双击标题栏不放大和缩小窗口的问题\n- 修复: api兼容性问题\n- 变动: 直播有效性改成延迟时间\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.7)\n\n## v3.2.6 (2023-08-03)\n\n- 特性: 兼容 app-v1 源[issue #58]\n- 特性: 设置源添加资源数[issue #50]\n- 特性: 热榜支持ky.live和高合数据(酷云好像挂了)\n- 修复: 图标 win 过小，liux 老图标的问题[issue #59]\n- 修复: 推荐数据请求错误的问题，优化兼容性\n- 修复: 选中筛选条件切换分类不变的问题(重构所有源类型的数据结构)\n- 变动: 设置源分类代替全局过滤\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.6)\n\n## v3.2.5 (2023-07-09)\n\n- 特性: 兼容 app-v3 源\n- 修复: 直播列表勾选跳过ipv6内存泄露的问题\n- 修复: 热榜为站内且为drpy源时数据报错的问题\n- 修复: 热榜数据没有随站点源变化的问题\n- 修复: 播放器剧集倒序乱序的问题\n- 修复: 非链接源播放器无法加载的问题\n- 修复: 源解析和'哎呦疼'冲突的问题\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.5)\n\n## v3.2.4 (2023-07-01)\n\n- 特性: 历史和收藏支持显示播放源[issue #41]\n- 特性: 播放支持选集倒序\n- 优化: 搜索交互优化\n- 优化: 设置源表格重构（支持跨多页选择数据和搜索）[issue #23]\n- 优化: 直播判断逻辑{感谢 @jahem}\n- 修复: 兼容drpy搜索参数问题（兼容 drpy 的 c#版本）\n- 变动: 下架社区功能[issue #40]\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.4)\n\n## v3.2.3 (2023-06-04)\n\n- 特性: 适配多款播放器\n- 优化: 解析增加分享（提取播放器公共组件，并重写样式\n- 优化: 彩蛋增强（webview 替代 iframe，支持前进后退\n- 修复: 搜索和推荐接口多次请求的问题（可能嘎嘎快）\n- 修复: 兼容部分源无效参数导致请求失败的问题（1080zyku）\n- 修复: 导出源不显示保存路径的问题（electron+fs 替代 saveas 库）\n- 修复: 播放器全屏时顶部无法点击的问题（drag 冲突）\n- 修复: tdesgin1.3.5输入装饰器slot不生效的问题（被迫修改逻辑）\n- 修复: 酷云热搜请求 3 次实际只请求 2 次的问题\n- 变动: 站点源检测有效性添加请求超时时间为 3 秒\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.3)\n\n## v3.2.2 (2023-05-28)\n\n- 特性: 兼容dr_py的免嗅模式{感谢 @hjdhnx}\n- 特性: 兼容两套播放器（新增tcplayer）\n- 优化: 热搜兼容夸克、百度 接口\n- 优化: iptv 状态检测优化（引入队列和取消请求）\n- 修复: 嗅探链接大小写问题导致无法播放的问题\n- 修复: iptv不开启跳过 ipv6无限请求的问题\n- 修复: iptv解析 dns 失败数据不继续加载的问题\n- 变动: 删除软解(字节确认 v3 版本 xgplayer 不支持)\n- 变动: 部分 svg 图标更换\n- 变动: 数据库字段(注意备份)\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.2)\n\n## v3.2.1 (2023-05-21)\n\n- 特性: 兼容dr_py的filters|search{感谢 @hjdhnx}\n- 特性: 兼容xml格式源\n- 优化: 兼容json5(一键配置里用注释的 xx 行为)\n- 修复: iptv 切换源不刷新分类的问题\n- 修复: 搜索组件无限请求数据的问题\n- 修复: 错别字(Issues #20 )\n- 修复: 部分奇葩源无分类的问题（海X看）\n- 修复: film切换源,搜索依旧使用默认源的问题\n- 变动: 修改免责声明及部分提示文案\n- 变动: 播放器逻辑\n- 变动: 接口请求失败重试次数调整为3\n- 变动: 数据库字段(注意备份)\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.1)\n\n## v3.2.0 (2023-05-13)\n\n- 特性: 兼容dr_py的type:1的数据{感谢 @hjdhnx}\n- 修复: 触发老板键错误的问题(同时修改不同系统默认快捷键)\n- 修复: 社区刷新冲突的问题\n- 修复: 一直播放下集的问题\n- 修复: 三大金刚双击标题栏导致 icon 不同步的问题\n- 修复: main 程序关闭时点击回到主页无法打开的问题\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.0)\n\n## v3.1.10 (2023-05-07)\n\n- 特性: 增加社区\n- 特性: 直播源支持本地 m3u\n- 优化: ui调整\n- 优化: 影视热榜、搜索框重构\n- 优化: 彩蛋增强(自己探索代码中的 todo，不要传播)\n- 修复: 恢复出厂数据不彻底导致冲突的问题(同时软重启改为硬重启)\n- 修复: 影视搜索后导致无法下拉的问题\n- 修复: 播放下集冲突的问题，重构播放进度记录(播放器事件替代定时器)\n- 修复: 添加站点源分类空白的问题\n- 修复: main 程序关闭时点击回到主页无法打开的问题\n- 变动: 视频流特征采集改为 5s 同步一次数据\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.10)\n\n## v3.1.9 (2023-04-22)\n\n- 特性: 支持查看播放器信息\n- 优化: 不同操作系统兼容性\n- 修复: 自动切换下集与画中画冲突\n- 修复: 过滤为空导致加载分类错误{感谢 @jim114042}\n- 变动: 删除最小化自动暂停/恢复播放\n- 变动: 西瓜播放器beta到release\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.9)\n\n## v3.1.8 (2023-04-16)\n\n- 特性: 自动播放下集\n- 特性: 部分页面增加返回顶部(T-Desgin 1.3.0 support)\n- 优化: 彩蛋(希望发现的童鞋不要传播打开方法)\n- 修复: 影视逻辑错误{感谢 @jim114042}\n- 修复: 播放器加载解析错误导致无法播放问题\n- 修复: 部分视频无法加载问题(xgplayer 3.0.0-next.55-2 fix)\n- 变动: 免责声明协议(语句不通顺、错别字)\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.8)\n\n## v3.1.7 (2023-04-09)\n\n- 特性: 基础配置增加安全User-Agent设置\n- 优化: 彩蛋(希望发现的童鞋不要传播打开方法)\n- 优化: ipv6检测(支持域名dns解析)\n- 优化: 播放页重构部分函数(播放加载明显加快)、兼容另类的cms源(剧集不带名称)、iptv数据多卡顿、切换剧集重复查询豆瓣\n- 优化: 绘制部分svg替代png图标\n- 修复: 切换基础配置闪屏问题\n- 修复: 基础配置导致影视直接加载完成问题\n- 修复: 打开app首屏加载慢问题\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.7)\n\n## v3.1.6 (2023-04-05)\n\n- 特性: 播放页兼容调用解析(不记录历史进度)\n- 特性: 我的收藏增加更新检测\n- 特性: 基础配置增加安全DNS设置(重启软件生效)\n- 优化: 彩蛋(希望发现的童鞋不要传播打开方法)\n- 优化: 播放器iptv直播逻辑判断(代码重构)\n- 优化: 借助chatgpt优化有必要de代码\n- 修复: 历史记录列表统计错误(代码重构)\n- 修复: 去除原有load函数等待(代码重构)\n- 修复: 播放器进度条错误、播放历史日期不更新问题\n- 修复: 部分已知css问题(variables导入错误)\n- 修复: 解析历史切换不加载url、日期不更新、sohu获取标题乱码问题\n- 修复: 三大金刚浅色模式下播放页看不清问题(win、Linux)\n- 修复: 主题外观是自动时系统外观变化不同步问题(主要针对mac)\n- 修复: iptv开启v6检测空数据报错、ipv6检测不严谨问题\n- 修复: 源设置排序与分页冲突问题\n- 变动: 代理使用系统配置\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.6)\n\n## v3.1.5 (2023-03-25)\n\n- 特性: 基础配置增加ipv6检测的支持\n- 特性: 播放页增加影视离线缓存链接复制的支持\n- 特性: 播放页增加iptv频道的支持\n- 优化: 交互(配置变动页面该刷新就刷新、css样式)\n- 修复: 基础配置检查更新逻辑错误\n- 修复: 系统媒体正在播放显示名称错误\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.5)\n\n## v3.1.4 (2023-03-19)\n\n- 特性: 基础配置增加硬件加速开关(Linux兼容性)\n- 特性: 基础配置增加在线更新(仅win支持; mac|linux不支持)\n- 优化: 适配直播源解析不同规则兼容性\n- 优化: 分享成功提示\n- 优化: 影视和直播选择分类样式\n- 修复: 最小化不暂停播放的问题\n- 修复: win开启开机自启无法取消\n- 变动: 基础配置重置拆分还原出厂(重置数据、清理缓存)+清理缓存\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.4)\n\n## v3.1.3 (2023-03-12)\n\n- 特性: 基础配置增加一键配置、开机自启功能\n- 特性: 源配置页面增加配置提示\n- 特性: 解析页面增加历史功能\n- 优化: 基础配置设计重构\n- 优化: 老板键逻辑-增加校验\n- 优化: 源配置页面样式主题色同步全局\n- 优化: iptv页面设计同步站点源页面\n- 优化: 站点源页面筛选功能重新设计(减少条条框框)\n- 修复: 站点源切换源分类不更新导致的错误\n- 修复: 源配置当前页面全选会删除全部数据的错误\n- 修复: 源配置通过网络源增加失败的错误\n- 变动: 依赖库升级\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.3)\n\n## v3.1.2 (2023-03-06)\n\n- 修复: 表格排序问题\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.2)\n\n## v3.1.1 (2023-03-05)\n\n- 优化: 设置显示默认源样式\n- 优化: iptv部分样式\n- 修复: 切换选集m3u8地址不变、切换选集进度条不回滚\n- 修复: 播放历史时始终为第一个url\n- 修复: 播放非m3u8时拼接m3u链接错误\n- 修复: 设置中源index错误导致的编辑和默认错乱\n- 修复: onMounted没加载完就触发load\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.1)\n\n## 3.1.0 (2023-02-28)\n\n- 特性: 新增全局刷新\n- 特性: 新增播放器播放历史播放进度及跳过开头\n- 优化: 交互逻辑\n- 优化: 兼容vite4，播放器使用西瓜视频组件v3beta\n- 优化: 使用electron ts和import导入\n- 修复: 修复老板键不生效问题\n- 变动: 修改主题色对应于logo的配色\n- 变动: 修改解析支持平台(减少风险，彩蛋在TODO)\n- 变动: 去除waterwall第三方组件导致的切换页面变成一列\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/3.1.0)\n\n## 3.0.0 (2023-02-06)\n\n- 特性:上线用户协议与免责声明\n- 特性:影视支持多源搜索\n- 特性:支持直接切换源，不用进设置配置\n- 特性:新增老板键\n- 优化:适配windwos无标题框模式\n- 修复: 修复缺少单个iptv的epg\n\n[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/3.0.0)\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\r\n                       Version 3, 19 November 2007\r\n\r\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\r\n Everyone is permitted to copy and distribute verbatim copies\r\n of this license document, but changing it is not allowed.\r\n\r\n                            Preamble\r\n\r\n  The GNU Affero General Public License is a free, copyleft license for\r\nsoftware and other kinds of works, specifically designed to ensure\r\ncooperation with the community in the case of network server software.\r\n\r\n  The licenses for most software and other practical works are designed\r\nto take away your freedom to share and change the works.  By contrast,\r\nour General Public Licenses are intended to guarantee your freedom to\r\nshare and change all versions of a program--to make sure it remains free\r\nsoftware for all its users.\r\n\r\n  When we speak of free software, we are referring to freedom, not\r\nprice.  Our General Public Licenses are designed to make sure that you\r\nhave the freedom to distribute copies of free software (and charge for\r\nthem if you wish), that you receive source code or can get it if you\r\nwant it, that you can change the software or use pieces of it in new\r\nfree programs, and that you know you can do these things.\r\n\r\n  Developers that use our General Public Licenses protect your rights\r\nwith two steps: (1) assert copyright on the software, and (2) offer\r\nyou this License which gives you legal permission to copy, distribute\r\nand/or modify the software.\r\n\r\n  A secondary benefit of defending all users' freedom is that\r\nimprovements made in alternate versions of the program, if they\r\nreceive widespread use, become available for other developers to\r\nincorporate.  Many developers of free software are heartened and\r\nencouraged by the resulting cooperation.  However, in the case of\r\nsoftware used on network servers, this result may fail to come about.\r\nThe GNU General Public License permits making a modified version and\r\nletting the public access it on a server without ever releasing its\r\nsource code to the public.\r\n\r\n  The GNU Affero General Public License is designed specifically to\r\nensure that, in such cases, the modified source code becomes available\r\nto the community.  It requires the operator of a network server to\r\nprovide the source code of the modified version running there to the\r\nusers of that server.  Therefore, public use of a modified version, on\r\na publicly accessible server, gives the public access to the source\r\ncode of the modified version.\r\n\r\n  An older license, called the Affero General Public License and\r\npublished by Affero, was designed to accomplish similar goals.  This is\r\na different license, not a version of the Affero GPL, but Affero has\r\nreleased a new version of the Affero GPL which permits relicensing under\r\nthis license.\r\n\r\n  The precise terms and conditions for copying, distribution and\r\nmodification follow.\r\n\r\n                       TERMS AND CONDITIONS\r\n\r\n  0. Definitions.\r\n\r\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\r\n\r\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\r\nworks, such as semiconductor masks.\r\n\r\n  \"The Program\" refers to any copyrightable work licensed under this\r\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\r\n\"recipients\" may be individuals or organizations.\r\n\r\n  To \"modify\" a work means to copy from or adapt all or part of the work\r\nin a fashion requiring copyright permission, other than the making of an\r\nexact copy.  The resulting work is called a \"modified version\" of the\r\nearlier work or a work \"based on\" the earlier work.\r\n\r\n  A \"covered work\" means either the unmodified Program or a work based\r\non the Program.\r\n\r\n  To \"propagate\" a work means to do anything with it that, without\r\npermission, would make you directly or secondarily liable for\r\ninfringement under applicable copyright law, except executing it on a\r\ncomputer or modifying a private copy.  Propagation includes copying,\r\ndistribution (with or without modification), making available to the\r\npublic, and in some countries other activities as well.\r\n\r\n  To \"convey\" a work means any kind of propagation that enables other\r\nparties to make or receive copies.  Mere interaction with a user through\r\na computer network, with no transfer of a copy, is not conveying.\r\n\r\n  An interactive user interface displays \"Appropriate Legal Notices\"\r\nto the extent that it includes a convenient and prominently visible\r\nfeature that (1) displays an appropriate copyright notice, and (2)\r\ntells the user that there is no warranty for the work (except to the\r\nextent that warranties are provided), that licensees may convey the\r\nwork under this License, and how to view a copy of this License.  If\r\nthe interface presents a list of user commands or options, such as a\r\nmenu, a prominent item in the list meets this criterion.\r\n\r\n  1. Source Code.\r\n\r\n  The \"source code\" for a work means the preferred form of the work\r\nfor making modifications to it.  \"Object code\" means any non-source\r\nform of a work.\r\n\r\n  A \"Standard Interface\" means an interface that either is an official\r\nstandard defined by a recognized standards body, or, in the case of\r\ninterfaces specified for a particular programming language, one that\r\nis widely used among developers working in that language.\r\n\r\n  The \"System Libraries\" of an executable work include anything, other\r\nthan the work as a whole, that (a) is included in the normal form of\r\npackaging a Major Component, but which is not part of that Major\r\nComponent, and (b) serves only to enable use of the work with that\r\nMajor Component, or to implement a Standard Interface for which an\r\nimplementation is available to the public in source code form.  A\r\n\"Major Component\", in this context, means a major essential component\r\n(kernel, window system, and so on) of the specific operating system\r\n(if any) on which the executable work runs, or a compiler used to\r\nproduce the work, or an object code interpreter used to run it.\r\n\r\n  The \"Corresponding Source\" for a work in object code form means all\r\nthe source code needed to generate, install, and (for an executable\r\nwork) run the object code and to modify the work, including scripts to\r\ncontrol those activities.  However, it does not include the work's\r\nSystem Libraries, or general-purpose tools or generally available free\r\nprograms which are used unmodified in performing those activities but\r\nwhich are not part of the work.  For example, Corresponding Source\r\nincludes interface definition files associated with source files for\r\nthe work, and the source code for shared libraries and dynamically\r\nlinked subprograms that the work is specifically designed to require,\r\nsuch as by intimate data communication or control flow between those\r\nsubprograms and other parts of the work.\r\n\r\n  The Corresponding Source need not include anything that users\r\ncan regenerate automatically from other parts of the Corresponding\r\nSource.\r\n\r\n  The Corresponding Source for a work in source code form is that\r\nsame work.\r\n\r\n  2. Basic Permissions.\r\n\r\n  All rights granted under this License are granted for the term of\r\ncopyright on the Program, and are irrevocable provided the stated\r\nconditions are met.  This License explicitly affirms your unlimited\r\npermission to run the unmodified Program.  The output from running a\r\ncovered work is covered by this License only if the output, given its\r\ncontent, constitutes a covered work.  This License acknowledges your\r\nrights of fair use or other equivalent, as provided by copyright law.\r\n\r\n  You may make, run and propagate covered works that you do not\r\nconvey, without conditions so long as your license otherwise remains\r\nin force.  You may convey covered works to others for the sole purpose\r\nof having them make modifications exclusively for you, or provide you\r\nwith facilities for running those works, provided that you comply with\r\nthe terms of this License in conveying all material for which you do\r\nnot control copyright.  Those thus making or running the covered works\r\nfor you must do so exclusively on your behalf, under your direction\r\nand control, on terms that prohibit them from making any copies of\r\nyour copyrighted material outside their relationship with you.\r\n\r\n  Conveying under any other circumstances is permitted solely under\r\nthe conditions stated below.  Sublicensing is not allowed; section 10\r\nmakes it unnecessary.\r\n\r\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\r\n\r\n  No covered work shall be deemed part of an effective technological\r\nmeasure under any applicable law fulfilling obligations under article\r\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\r\nsimilar laws prohibiting or restricting circumvention of such\r\nmeasures.\r\n\r\n  When you convey a covered work, you waive any legal power to forbid\r\ncircumvention of technological measures to the extent such circumvention\r\nis effected by exercising rights under this License with respect to\r\nthe covered work, and you disclaim any intention to limit operation or\r\nmodification of the work as a means of enforcing, against the work's\r\nusers, your or third parties' legal rights to forbid circumvention of\r\ntechnological measures.\r\n\r\n  4. Conveying Verbatim Copies.\r\n\r\n  You may convey verbatim copies of the Program's source code as you\r\nreceive it, in any medium, provided that you conspicuously and\r\nappropriately publish on each copy an appropriate copyright notice;\r\nkeep intact all notices stating that this License and any\r\nnon-permissive terms added in accord with section 7 apply to the code;\r\nkeep intact all notices of the absence of any warranty; and give all\r\nrecipients a copy of this License along with the Program.\r\n\r\n  You may charge any price or no price for each copy that you convey,\r\nand you may offer support or warranty protection for a fee.\r\n\r\n  5. Conveying Modified Source Versions.\r\n\r\n  You may convey a work based on the Program, or the modifications to\r\nproduce it from the Program, in the form of source code under the\r\nterms of section 4, provided that you also meet all of these conditions:\r\n\r\n    a) The work must carry prominent notices stating that you modified\r\n    it, and giving a relevant date.\r\n\r\n    b) The work must carry prominent notices stating that it is\r\n    released under this License and any conditions added under section\r\n    7.  This requirement modifies the requirement in section 4 to\r\n    \"keep intact all notices\".\r\n\r\n    c) You must license the entire work, as a whole, under this\r\n    License to anyone who comes into possession of a copy.  This\r\n    License will therefore apply, along with any applicable section 7\r\n    additional terms, to the whole of the work, and all its parts,\r\n    regardless of how they are packaged.  This License gives no\r\n    permission to license the work in any other way, but it does not\r\n    invalidate such permission if you have separately received it.\r\n\r\n    d) If the work has interactive user interfaces, each must display\r\n    Appropriate Legal Notices; however, if the Program has interactive\r\n    interfaces that do not display Appropriate Legal Notices, your\r\n    work need not make them do so.\r\n\r\n  A compilation of a covered work with other separate and independent\r\nworks, which are not by their nature extensions of the covered work,\r\nand which are not combined with it such as to form a larger program,\r\nin or on a volume of a storage or distribution medium, is called an\r\n\"aggregate\" if the compilation and its resulting copyright are not\r\nused to limit the access or legal rights of the compilation's users\r\nbeyond what the individual works permit.  Inclusion of a covered work\r\nin an aggregate does not cause this License to apply to the other\r\nparts of the aggregate.\r\n\r\n  6. Conveying Non-Source Forms.\r\n\r\n  You may convey a covered work in object code form under the terms\r\nof sections 4 and 5, provided that you also convey the\r\nmachine-readable Corresponding Source under the terms of this License,\r\nin one of these ways:\r\n\r\n    a) Convey the object code in, or embodied in, a physical product\r\n    (including a physical distribution medium), accompanied by the\r\n    Corresponding Source fixed on a durable physical medium\r\n    customarily used for software interchange.\r\n\r\n    b) Convey the object code in, or embodied in, a physical product\r\n    (including a physical distribution medium), accompanied by a\r\n    written offer, valid for at least three years and valid for as\r\n    long as you offer spare parts or customer support for that product\r\n    model, to give anyone who possesses the object code either (1) a\r\n    copy of the Corresponding Source for all the software in the\r\n    product that is covered by this License, on a durable physical\r\n    medium customarily used for software interchange, for a price no\r\n    more than your reasonable cost of physically performing this\r\n    conveying of source, or (2) access to copy the\r\n    Corresponding Source from a network server at no charge.\r\n\r\n    c) Convey individual copies of the object code with a copy of the\r\n    written offer to provide the Corresponding Source.  This\r\n    alternative is allowed only occasionally and noncommercially, and\r\n    only if you received the object code with such an offer, in accord\r\n    with subsection 6b.\r\n\r\n    d) Convey the object code by offering access from a designated\r\n    place (gratis or for a charge), and offer equivalent access to the\r\n    Corresponding Source in the same way through the same place at no\r\n    further charge.  You need not require recipients to copy the\r\n    Corresponding Source along with the object code.  If the place to\r\n    copy the object code is a network server, the Corresponding Source\r\n    may be on a different server (operated by you or a third party)\r\n    that supports equivalent copying facilities, provided you maintain\r\n    clear directions next to the object code saying where to find the\r\n    Corresponding Source.  Regardless of what server hosts the\r\n    Corresponding Source, you remain obligated to ensure that it is\r\n    available for as long as needed to satisfy these requirements.\r\n\r\n    e) Convey the object code using peer-to-peer transmission, provided\r\n    you inform other peers where the object code and Corresponding\r\n    Source of the work are being offered to the general public at no\r\n    charge under subsection 6d.\r\n\r\n  A separable portion of the object code, whose source code is excluded\r\nfrom the Corresponding Source as a System Library, need not be\r\nincluded in conveying the object code work.\r\n\r\n  A \"User Product\" is either (1) a \"consumer product\", which means any\r\ntangible personal property which is normally used for personal, family,\r\nor household purposes, or (2) anything designed or sold for incorporation\r\ninto a dwelling.  In determining whether a product is a consumer product,\r\ndoubtful cases shall be resolved in favor of coverage.  For a particular\r\nproduct received by a particular user, \"normally used\" refers to a\r\ntypical or common use of that class of product, regardless of the status\r\nof the particular user or of the way in which the particular user\r\nactually uses, or expects or is expected to use, the product.  A product\r\nis a consumer product regardless of whether the product has substantial\r\ncommercial, industrial or non-consumer uses, unless such uses represent\r\nthe only significant mode of use of the product.\r\n\r\n  \"Installation Information\" for a User Product means any methods,\r\nprocedures, authorization keys, or other information required to install\r\nand execute modified versions of a covered work in that User Product from\r\na modified version of its Corresponding Source.  The information must\r\nsuffice to ensure that the continued functioning of the modified object\r\ncode is in no case prevented or interfered with solely because\r\nmodification has been made.\r\n\r\n  If you convey an object code work under this section in, or with, or\r\nspecifically for use in, a User Product, and the conveying occurs as\r\npart of a transaction in which the right of possession and use of the\r\nUser Product is transferred to the recipient in perpetuity or for a\r\nfixed term (regardless of how the transaction is characterized), the\r\nCorresponding Source conveyed under this section must be accompanied\r\nby the Installation Information.  But this requirement does not apply\r\nif neither you nor any third party retains the ability to install\r\nmodified object code on the User Product (for example, the work has\r\nbeen installed in ROM).\r\n\r\n  The requirement to provide Installation Information does not include a\r\nrequirement to continue to provide support service, warranty, or updates\r\nfor a work that has been modified or installed by the recipient, or for\r\nthe User Product in which it has been modified or installed.  Access to a\r\nnetwork may be denied when the modification itself materially and\r\nadversely affects the operation of the network or violates the rules and\r\nprotocols for communication across the network.\r\n\r\n  Corresponding Source conveyed, and Installation Information provided,\r\nin accord with this section must be in a format that is publicly\r\ndocumented (and with an implementation available to the public in\r\nsource code form), and must require no special password or key for\r\nunpacking, reading or copying.\r\n\r\n  7. Additional Terms.\r\n\r\n  \"Additional permissions\" are terms that supplement the terms of this\r\nLicense by making exceptions from one or more of its conditions.\r\nAdditional permissions that are applicable to the entire Program shall\r\nbe treated as though they were included in this License, to the extent\r\nthat they are valid under applicable law.  If additional permissions\r\napply only to part of the Program, that part may be used separately\r\nunder those permissions, but the entire Program remains governed by\r\nthis License without regard to the additional permissions.\r\n\r\n  When you convey a copy of a covered work, you may at your option\r\nremove any additional permissions from that copy, or from any part of\r\nit.  (Additional permissions may be written to require their own\r\nremoval in certain cases when you modify the work.)  You may place\r\nadditional permissions on material, added by you to a covered work,\r\nfor which you have or can give appropriate copyright permission.\r\n\r\n  Notwithstanding any other provision of this License, for material you\r\nadd to a covered work, you may (if authorized by the copyright holders of\r\nthat material) supplement the terms of this License with terms:\r\n\r\n    a) Disclaiming warranty or limiting liability differently from the\r\n    terms of sections 15 and 16 of this License; or\r\n\r\n    b) Requiring preservation of specified reasonable legal notices or\r\n    author attributions in that material or in the Appropriate Legal\r\n    Notices displayed by works containing it; or\r\n\r\n    c) Prohibiting misrepresentation of the origin of that material, or\r\n    requiring that modified versions of such material be marked in\r\n    reasonable ways as different from the original version; or\r\n\r\n    d) Limiting the use for publicity purposes of names of licensors or\r\n    authors of the material; or\r\n\r\n    e) Declining to grant rights under trademark law for use of some\r\n    trade names, trademarks, or service marks; or\r\n\r\n    f) Requiring indemnification of licensors and authors of that\r\n    material by anyone who conveys the material (or modified versions of\r\n    it) with contractual assumptions of liability to the recipient, for\r\n    any liability that these contractual assumptions directly impose on\r\n    those licensors and authors.\r\n\r\n  All other non-permissive additional terms are considered \"further\r\nrestrictions\" within the meaning of section 10.  If the Program as you\r\nreceived it, or any part of it, contains a notice stating that it is\r\ngoverned by this License along with a term that is a further\r\nrestriction, you may remove that term.  If a license document contains\r\na further restriction but permits relicensing or conveying under this\r\nLicense, you may add to a covered work material governed by the terms\r\nof that license document, provided that the further restriction does\r\nnot survive such relicensing or conveying.\r\n\r\n  If you add terms to a covered work in accord with this section, you\r\nmust place, in the relevant source files, a statement of the\r\nadditional terms that apply to those files, or a notice indicating\r\nwhere to find the applicable terms.\r\n\r\n  Additional terms, permissive or non-permissive, may be stated in the\r\nform of a separately written license, or stated as exceptions;\r\nthe above requirements apply either way.\r\n\r\n  8. Termination.\r\n\r\n  You may not propagate or modify a covered work except as expressly\r\nprovided under this License.  Any attempt otherwise to propagate or\r\nmodify it is void, and will automatically terminate your rights under\r\nthis License (including any patent licenses granted under the third\r\nparagraph of section 11).\r\n\r\n  However, if you cease all violation of this License, then your\r\nlicense from a particular copyright holder is reinstated (a)\r\nprovisionally, unless and until the copyright holder explicitly and\r\nfinally terminates your license, and (b) permanently, if the copyright\r\nholder fails to notify you of the violation by some reasonable means\r\nprior to 60 days after the cessation.\r\n\r\n  Moreover, your license from a particular copyright holder is\r\nreinstated permanently if the copyright holder notifies you of the\r\nviolation by some reasonable means, this is the first time you have\r\nreceived notice of violation of this License (for any work) from that\r\ncopyright holder, and you cure the violation prior to 30 days after\r\nyour receipt of the notice.\r\n\r\n  Termination of your rights under this section does not terminate the\r\nlicenses of parties who have received copies or rights from you under\r\nthis License.  If your rights have been terminated and not permanently\r\nreinstated, you do not qualify to receive new licenses for the same\r\nmaterial under section 10.\r\n\r\n  9. Acceptance Not Required for Having Copies.\r\n\r\n  You are not required to accept this License in order to receive or\r\nrun a copy of the Program.  Ancillary propagation of a covered work\r\noccurring solely as a consequence of using peer-to-peer transmission\r\nto receive a copy likewise does not require acceptance.  However,\r\nnothing other than this License grants you permission to propagate or\r\nmodify any covered work.  These actions infringe copyright if you do\r\nnot accept this License.  Therefore, by modifying or propagating a\r\ncovered work, you indicate your acceptance of this License to do so.\r\n\r\n  10. Automatic Licensing of Downstream Recipients.\r\n\r\n  Each time you convey a covered work, the recipient automatically\r\nreceives a license from the original licensors, to run, modify and\r\npropagate that work, subject to this License.  You are not responsible\r\nfor enforcing compliance by third parties with this License.\r\n\r\n  An \"entity transaction\" is a transaction transferring control of an\r\norganization, or substantially all assets of one, or subdividing an\r\norganization, or merging organizations.  If propagation of a covered\r\nwork results from an entity transaction, each party to that\r\ntransaction who receives a copy of the work also receives whatever\r\nlicenses to the work the party's predecessor in interest had or could\r\ngive under the previous paragraph, plus a right to possession of the\r\nCorresponding Source of the work from the predecessor in interest, if\r\nthe predecessor has it or can get it with reasonable efforts.\r\n\r\n  You may not impose any further restrictions on the exercise of the\r\nrights granted or affirmed under this License.  For example, you may\r\nnot impose a license fee, royalty, or other charge for exercise of\r\nrights granted under this License, and you may not initiate litigation\r\n(including a cross-claim or counterclaim in a lawsuit) alleging that\r\nany patent claim is infringed by making, using, selling, offering for\r\nsale, or importing the Program or any portion of it.\r\n\r\n  11. Patents.\r\n\r\n  A \"contributor\" is a copyright holder who authorizes use under this\r\nLicense of the Program or a work on which the Program is based.  The\r\nwork thus licensed is called the contributor's \"contributor version\".\r\n\r\n  A contributor's \"essential patent claims\" are all patent claims\r\nowned or controlled by the contributor, whether already acquired or\r\nhereafter acquired, that would be infringed by some manner, permitted\r\nby this License, of making, using, or selling its contributor version,\r\nbut do not include claims that would be infringed only as a\r\nconsequence of further modification of the contributor version.  For\r\npurposes of this definition, \"control\" includes the right to grant\r\npatent sublicenses in a manner consistent with the requirements of\r\nthis License.\r\n\r\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\r\npatent license under the contributor's essential patent claims, to\r\nmake, use, sell, offer for sale, import and otherwise run, modify and\r\npropagate the contents of its contributor version.\r\n\r\n  In the following three paragraphs, a \"patent license\" is any express\r\nagreement or commitment, however denominated, not to enforce a patent\r\n(such as an express permission to practice a patent or covenant not to\r\nsue for patent infringement).  To \"grant\" such a patent license to a\r\nparty means to make such an agreement or commitment not to enforce a\r\npatent against the party.\r\n\r\n  If you convey a covered work, knowingly relying on a patent license,\r\nand the Corresponding Source of the work is not available for anyone\r\nto copy, free of charge and under the terms of this License, through a\r\npublicly available network server or other readily accessible means,\r\nthen you must either (1) cause the Corresponding Source to be so\r\navailable, or (2) arrange to deprive yourself of the benefit of the\r\npatent license for this particular work, or (3) arrange, in a manner\r\nconsistent with the requirements of this License, to extend the patent\r\nlicense to downstream recipients.  \"Knowingly relying\" means you have\r\nactual knowledge that, but for the patent license, your conveying the\r\ncovered work in a country, or your recipient's use of the covered work\r\nin a country, would infringe one or more identifiable patents in that\r\ncountry that you have reason to believe are valid.\r\n\r\n  If, pursuant to or in connection with a single transaction or\r\narrangement, you convey, or propagate by procuring conveyance of, a\r\ncovered work, and grant a patent license to some of the parties\r\nreceiving the covered work authorizing them to use, propagate, modify\r\nor convey a specific copy of the covered work, then the patent license\r\nyou grant is automatically extended to all recipients of the covered\r\nwork and works based on it.\r\n\r\n  A patent license is \"discriminatory\" if it does not include within\r\nthe scope of its coverage, prohibits the exercise of, or is\r\nconditioned on the non-exercise of one or more of the rights that are\r\nspecifically granted under this License.  You may not convey a covered\r\nwork if you are a party to an arrangement with a third party that is\r\nin the business of distributing software, under which you make payment\r\nto the third party based on the extent of your activity of conveying\r\nthe work, and under which the third party grants, to any of the\r\nparties who would receive the covered work from you, a discriminatory\r\npatent license (a) in connection with copies of the covered work\r\nconveyed by you (or copies made from those copies), or (b) primarily\r\nfor and in connection with specific products or compilations that\r\ncontain the covered work, unless you entered into that arrangement,\r\nor that patent license was granted, prior to 28 March 2007.\r\n\r\n  Nothing in this License shall be construed as excluding or limiting\r\nany implied license or other defenses to infringement that may\r\notherwise be available to you under applicable patent law.\r\n\r\n  12. No Surrender of Others' Freedom.\r\n\r\n  If conditions are imposed on you (whether by court order, agreement or\r\notherwise) that contradict the conditions of this License, they do not\r\nexcuse you from the conditions of this License.  If you cannot convey a\r\ncovered work so as to satisfy simultaneously your obligations under this\r\nLicense and any other pertinent obligations, then as a consequence you may\r\nnot convey it at all.  For example, if you agree to terms that obligate you\r\nto collect a royalty for further conveying from those to whom you convey\r\nthe Program, the only way you could satisfy both those terms and this\r\nLicense would be to refrain entirely from conveying the Program.\r\n\r\n  13. Remote Network Interaction; Use with the GNU General Public License.\r\n\r\n  Notwithstanding any other provision of this License, if you modify the\r\nProgram, your modified version must prominently offer all users\r\ninteracting with it remotely through a computer network (if your version\r\nsupports such interaction) an opportunity to receive the Corresponding\r\nSource of your version by providing access to the Corresponding Source\r\nfrom a network server at no charge, through some standard or customary\r\nmeans of facilitating copying of software.  This Corresponding Source\r\nshall include the Corresponding Source for any work covered by version 3\r\nof the GNU General Public License that is incorporated pursuant to the\r\nfollowing paragraph.\r\n\r\n  Notwithstanding any other provision of this License, you have\r\npermission to link or combine any covered work with a work licensed\r\nunder version 3 of the GNU General Public License into a single\r\ncombined work, and to convey the resulting work.  The terms of this\r\nLicense will continue to apply to the part which is the covered work,\r\nbut the work with which it is combined will remain governed by version\r\n3 of the GNU General Public License.\r\n\r\n  14. Revised Versions of this License.\r\n\r\n  The Free Software Foundation may publish revised and/or new versions of\r\nthe GNU Affero General Public License from time to time.  Such new versions\r\nwill be similar in spirit to the present version, but may differ in detail to\r\naddress new problems or concerns.\r\n\r\n  Each version is given a distinguishing version number.  If the\r\nProgram specifies that a certain numbered version of the GNU Affero General\r\nPublic License \"or any later version\" applies to it, you have the\r\noption of following the terms and conditions either of that numbered\r\nversion or of any later version published by the Free Software\r\nFoundation.  If the Program does not specify a version number of the\r\nGNU Affero General Public License, you may choose any version ever published\r\nby the Free Software Foundation.\r\n\r\n  If the Program specifies that a proxy can decide which future\r\nversions of the GNU Affero General Public License can be used, that proxy's\r\npublic statement of acceptance of a version permanently authorizes you\r\nto choose that version for the Program.\r\n\r\n  Later license versions may give you additional or different\r\npermissions.  However, no additional obligations are imposed on any\r\nauthor or copyright holder as a result of your choosing to follow a\r\nlater version.\r\n\r\n  15. Disclaimer of Warranty.\r\n\r\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\r\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\r\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\r\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\r\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\r\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\r\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\r\n\r\n  16. Limitation of Liability.\r\n\r\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\r\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\r\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\r\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\r\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\r\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\r\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\r\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\r\nSUCH DAMAGES.\r\n\r\n  17. Interpretation of Sections 15 and 16.\r\n\r\n  If the disclaimer of warranty and limitation of liability provided\r\nabove cannot be given local legal effect according to their terms,\r\nreviewing courts shall apply local law that most closely approximates\r\nan absolute waiver of all civil liability in connection with the\r\nProgram, unless a warranty or assumption of liability accompanies a\r\ncopy of the Program in return for a fee.\r\n\r\n                     END OF TERMS AND CONDITIONS\r\n\r\n            How to Apply These Terms to Your New Programs\r\n\r\n  If you develop a new program, and you want it to be of the greatest\r\npossible use to the public, the best way to achieve this is to make it\r\nfree software which everyone can redistribute and change under these terms.\r\n\r\n  To do so, attach the following notices to the program.  It is safest\r\nto attach them to the start of each source file to most effectively\r\nstate the exclusion of warranty; and each file should have at least\r\nthe \"copyright\" line and a pointer to where the full notice is found.\r\n\r\n    <one line to give the program's name and a brief idea of what it does.>\r\n    Copyright (C) <year>  <name of author>\r\n\r\n    This program is free software: you can redistribute it and/or modify\r\n    it under the terms of the GNU Affero General Public License as published by\r\n    the Free Software Foundation, either version 3 of the License, or\r\n    (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU Affero General Public License for more details.\r\n\r\n    You should have received a copy of the GNU Affero General Public License\r\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\r\n\r\nAlso add information on how to contact you by electronic and paper mail.\r\n\r\n  If your software can interact with users remotely through a computer\r\nnetwork, you should also make sure that it provides a way for users to\r\nget its source.  For example, if your program is a web application, its\r\ninterface could display a \"Source\" link that leads users to an archive\r\nof the code.  There are many ways you could offer source, and different\r\nsolutions will be better for different programs; see section 13 for the\r\nspecific requirements.\r\n\r\n  You should also get your employer (if you work as a programmer) or school,\r\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\r\nFor more information on this, and how to apply and follow the GNU AGPL, see\r\n<https://www.gnu.org/licenses/>.\r\n"
  },
  {
    "path": "README.md",
    "content": "<div align=\"right\">\n  <details>\n    <summary >🌐 Language</summary>\n    <div>\n      <div align=\"center\">\n        <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=en\">English</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=zh-CN\">简体中文</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=zh-TW\">繁體中文</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=ja\">日本語</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=ko\">한국어</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=hi\">हिन्दी</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=th\">ไทย</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=fr\">Français</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=de\">Deutsch</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=es\">Español</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=it\">Italiano</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=ru\">Русский</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=pt\">Português</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=nl\">Nederlands</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=pl\">Polski</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=ar\">العربية</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=fa\">فارسی</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=tr\">Türkçe</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=vi\">Tiếng Việt</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=id\">Bahasa Indonesia</a>\n        | <a href=\"https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=as\">অসমীয়া</\n      </div>\n    </div>\n  </details>\n</div>\n\n<p align=\"center\">\n  <a href=\"https://github.com/Hiram-Wong/zyfun/releases\">\n    <!-- <img src=\"https://github.com/Hiram-Wong/zyfun/blob/main/build/icon.png?raw=true\" width=\"150\" height=\"150\" alt=\"banner\" /> -->\n    <img width=\"128\" src=\"https://s2.loli.net/2024/02/29/7Q1nVbhkHdSmo5D.png\">\n    <br>\n  </a>\n</p>\n\n<div align=\"center\">\n\n[![][github-release-shield]][github-release-link]\n[![][github-nightly-shield]][github-nightly-link]\n[![][github-license-shield]][github-license-link]\n[![][fossa-shield]][fossa-link]\n[![][telegram-shield]][telegram-link]\n[![][sponsor-shield]][sponsor-link]\n\n</div>\n<div align=\"center\">\n\n[![][readmex-shield]][readmex-link]\n[![][deepwiki-shield]][deepwiki-link]\n[![][zread-shield]][zread-link]\n\n</div>\n<div align=\"center\">\n\n[![][rank-hellogithub-shield]][rank-hellogithub-link]\n[![][rank-trendshift-shield]][rank-trendshift-link]\n[![][rank-producthunt-shield]][rank-producthunt-link]\n\n</div>\n\n# 软件介绍\n\nzyfun是一款免费、极简、全能的跨平台影音管家，一站式管理 T1-T4 全类型资源，内置多核播放器随心切换。独家老板键，一键隐身摸鱼无忧。用观影发现世界！\n\n<details>\n<summary>展开查看软件截图</summary>\n\n|                    影视                     |                   直播                   |\n| :-----------------------------------------: | :--------------------------------------: |\n|  ![影视](docs/assets/images/app-film.png)   | ![直播](docs/assets/images/app-live.png) |\n|                  **历史**                   |                 **播放**                 |\n| ![历史](docs/assets/images/app-history.png) | ![播放](docs/assets/images/app-play.png) |\n\n</details>\n\n## 🌴 注意事项\n\n- 仅此Github发布，请勿上当受骗；请各管理者不要宣传及引流本软件。\n- 强烈倡导合法观影，本软件仅作为播放工具，不涉及资源存储或分发。\n- 仅供个人学习交流之用，24小时内请自觉卸载，勿作商业用途。\n- 前身来源于[ZY-Player](https://github.com/Hunlongyu/ZY-Player)，图标由@fourbeauty设计。\n- 在开始使用前，请务必详读并同意用户协议，确保遵守相关规定。\n\n## 💻 跨平台说明\n\n- **MacOS**:\n  - 数据库/文件/插件/日志 路径: `~/Library/Application Support/zyfun/`\n  - 二进制 路径: `~/.zy/bin/`\n- **Linux**:\n  - 数据库/文件/插件/日志 路径: `~/.config/zyfun/`\n  - 二进制 路径: `~/.zy/bin/`\n- **Windows**:\n  - 数据库/文件/插件/日志 路径: `%USERPROFILE%\\AppData\\Roaming\\zyfun\\`\n  - 二进制 路径: `%USERPROFILE%\\.zy\\bin\\`\n  <!-- - **OpenHarmony**:\n  - 数据库/文件/插件/日志 路径: `/data/storage/zyfun/base/files/log`\n  - 二进制 路径: `~/.zy/bin/`-->\n\n## 🛠️ 下载安装\n\n> **开发版下载**: 需登录Github账号\n\n> **最低要求**: 和chromium内核要求保持一致\n\n| 操作系统 | x64 | arm64 | loong64 | 发行版                                                                                                                                                                                                                      | 开发版                                                                            | 最低要求   |\n| :------: | :-: | :---: | :-----: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ---------- |\n| Windows  | ✅  |  ✅   |   ➖    | [GitHub](https://github.com/Hiram-Wong/zyfun/releases)                                                                                                                                                                      | [GitHub](https://github.com/Hiram-Wong/zyfun/actions/workflows/nightly-build.yml) | >= win10   |\n|  MacOS   | ✅  |  ✅   |   ➖    | [GitHub](https://github.com/Hiram-Wong/zyfun/releases)                                                                                                                                                                      | [GitHub](https://github.com/Hiram-Wong/zyfun/actions/workflows/nightly-build.yml) | >= macOS12 |\n|  Linux   | ✅  |  ✅   |   ❌    | [GitHub](https://github.com/Hiram-Wong/zyfun/releases) <br/> [如意玲珑应用商店](https://store.linyaps.org.cn/) <br/> [AUR软件包](https://aur.archlinux.org/packages?O=0&SeB=nd&K=zyfun&outdated=&SB=p&SO=d&PP=50&submit=Go) | [GitHub](https://github.com/Hiram-Wong/zyfun/actions/workflows/nightly-build.yml) |            |\n| Harmony  | ❌  |  ❌   |   ➖    |                                                                                                                                                                                                                             |                                                                                   |\n\n<details>\n<summary>展开查看安装问题</summary>\n\n#### MacOS 安装后打开提示「文件已损坏」\n\n```bash\nsudo spctl --master-disable\nsudo xattr -cr /Applications/zyfun.app\n```\n\n#### Linux Appimage运行失败\n\n> Running as root without --no-sandbox is not supported\n\n```bash\n./zyfun.AppImage --no-sandbox\n```\n\n> dlopen()：error loading libfuse.so.2\n\n```bash\nsudo apt-get install libfuse2\n```\n\n> Exiting GPU process due to errors during initialization\n\n```bash\nxhost +\n```\n\n#### Linux deb包安装失败\n\n> Package libnss3-1d is not installed\n\n```bash\nsudo apt-get install libnss3-1d\n```\n\n> Package libxss1 is not installed\n\n```bash\nsudo apt-get install libxss1\n```\n\n#### Linux rpm包安装失败\n\n> Dependency check failed libXScrnSaver is needed\n\n```bash\nsudo yum install epel-release\nsudo yum install libXScrnSaver\n```\n\n> Dependency check failed xdg-utils is needed\n\n```bash\nsudo yum install xdg-utils\n```\n\n</details>\n\n## 📚 数据结构\n\n> 请严格按照数据结构导入数据, 避免不必要的报错(如数据字段类型不匹配)\n\n<details>\n<summary>展开查看接口说明</summary>\n\n```json\n{\n  \"analyze\": [\n    {\n      \"id\": \"fddfb425-6fd9-0b39-459f-a21f69739a6e\", // 数据唯一uuid标识(不可重复)\n      \"key\": \"51793af6-c923-5504-85db-0ef686624dec\", // <3.4.0 启用> 业务唯一标识(不可重复)\n      \"name\": \"Parse\", // 名称(展示用)\n      \"url\": \"https://xxx.top/?jx=\", // <3.4.1 **弃用**> 解析源地址(仅兼容旧版本)\n      \"api\": \"https://xxx.top/?jx=\", // <3.4.1 启用> 解析源地址(推荐使用)\n      \"type\": 0, // 解析类型(<=3.4.0: 0=web,1=json | >=3.4.1: 1=web,2=json)\n      \"flag\": [], // <3.4.1 启用> 解析线路/标签标识\n      \"headers\": {}, // <3.4.0 启用> 请求头配置(预留字段)\n      \"script\": \"\", // <3.4.1 启用> 执行脚本，仅 type=web 时生效\n      \"isActive\": true, // 是否启用(true=启用,false=禁用)\n      \"createdAt\": 1768310498000, // <3.4.1 启用> 创建时间戳(ms)\n      \"updatedAt\": 1768310498000 // <3.4.1 启用> 更新时间戳(ms)\n    }\n  ],\n  \"iptv\": [\n    {\n      \"id\": \"fddfb425-6fd9-0b39-459f-a21f69739a6e\", // 数据唯一uuidv标识(不可重复)\n      \"key\": \"51793af6-c923-5504-85db-0ef686624dec\", // <3.4.0 启用> 业务唯一标识(不可重复)\n      \"name\": \"Iptv\", // 名称(展示用)\n      \"url\": \"https://xxx.com/m3u/iptv.m3u\", // <3.4.1 **弃用**> 直播源地址(仅兼容旧版本)\n      \"api\": \"https://xxx.com/m3u/iptv.m3u\", // <3.4.1 启用> 直播源地址(推荐使用)\n      \"type\": 1, // 解析类型(<=3.4.0: remote=远程,local=本地, manual=文本 | >=3.4.1: 1=远程,2=本地,3=文本)\n      \"epg\": \"https://epg.112114.eu.org/?ch={name}&date={date}\", // 电子节目单地址[string]\n      \"logo\": \"https://epg.112114.eu.org/logo/{name}.png\", // 台标地址[string] - 3.3.8启用该参数\n      \"headers\": {}, // <3.4.0 启用> 请求头配置(预留字段)\n      \"isActive\": true, // 是否启用(true=启用,false=禁用)\n      \"createdAt\": 1768310498000, // <3.4.1 启用> 创建时间戳(ms)\n      \"updatedAt\": 1768310498000 // <3.4.1 启用> 更新时间戳(ms)\n    }\n  ],\n  \"channel\": [\n    {\n      \"id\": \"fddfb425-6fd9-0b39-459f-a21f69739a6e\", // 数据唯一uuidv4标识(不可重复)\n      \"name\": \"Channel\", // 名称(展示用)\n      \"url\": \"https://xxx.com/m3u/iptv.m3u8\", // <3.4.1 **弃用**> 播放地址(仅兼容旧版本)\n      \"api\": \"https://xxx.com/m3u/iptv.m3u8\", // <3.4.1 启用> 播放地址(推荐使用)\n      \"logo\": \"https://xxx.com/logo/xxx.png\", // <3.4.1 启用> 台标地址\n      \"playback\": \"\", // <3.4.1 启用> 预留回播参数\n      \"group\": \"默认\", // 分组\n      \"createdAt\": 1768310498000, // <3.4.1 启用> 创建时间戳(ms)\n      \"updatedAt\": 1768310498000 // <3.4.1 启用> 更新时间戳(ms)\n    }\n  ],\n  \"site\": [\n    {\n      \"id\": \"fddfb425-6fd9-0b39-459f-a21f69739a6e\", // 数据唯一uuidv4标识(不可重复)\n      \"key\": \"51793af6-c923-5504-85db-0ef686624dec\", // <3.4.0 启用> 业务唯一标识(不可重复)\n      \"name\": \"Film\", // 名称(展示用)\n      \"api\": \"https://www.xxx.com/api.php/provide/vod/\", // 接口地址\n      \"playUrl\": \"\", // 配合解析去url地址\n      \"search\": 0, // 是否支持搜索(<=3.4.0: 0= 关闭,1=聚合搜索,2=仅搜索 | >=3.4.1: true= 开启,false=关闭)\n      \"group\": \"切片\", // 分组\n      \"type\": 1, // 适配器类型(0=T0_XML,1=T1_JSON,6=T4_DRPYS,7=T3_DRPY,8=T4_CATVOD,9=T3_XBPQ,10=T3_XYQ,11=T3_APPYSV2,12=T3_PY,13=T3_ALIST)\n      \"ext\": \"\", // 扩展参数\n      \"categories\": \"电视,影视\", // 按顺序展示所配置的分类 不配置则默认展示所有分类[string]\n      \"isActive\": true // 是否启用(true=启用,false=禁用)\n      \"createdAt\": 1768310498000, // <3.4.1 启用> 创建时间戳(ms)\n      \"updatedAt\": 1768310498000 // <3.4.1 启用> 更新时间戳(ms)\n    }\n  ],\n  \"drive\": [\n    {\n      \"id\": \"fddfb425-6fd9-0b39-459f-a21f69739a6e\", // 数据唯一uuidv4标识(不可重复)\n      \"key\": \"51793af6-c923-5504-85db-0ef686624dec\", // <3.4.0 启用> 业务唯一标识(不可重复)\n      \"name\": \"alist\", // 名称(展示用)\n      \"server\": \"http://alist.xxx.pro/\", // 网盘地址\n      \"showAll\": false, // 是否展示全部(true=全部,false=仅视频)\n      \"startPage\": \"\", // 开始页路径\n      \"search\": false, // 是否支持搜索(true=启用,false=禁用)\n      \"headers\": \"{}\", // 请求头(预留字段)\n      \"params\": \"{}\", // 参数(预留字段)\n      \"isActive\": true // 是否启用(true=启用,false=禁用)\n    }\n  ], // <3.4.1 **弃用**>\n  \"setting\": [\n    {\n      \"version\": \"3.3.2\", // <3.2.2 启用> 当前版本(一定要根据实际填写,不然数据库执行会报错)\n      \"theme\": \"system\", // 主题 (<=3.4.0: auto=跟随系统,light=亮色,dark=暗色 | system=跟随系统,light=亮色,dark=暗色)\n      \"lang\": \"zh_CN\", // <3.3.4 启用> 语言(<=3.4.0: zh_CN=简体中文,en_US=英文 | system=更随系统,zh_CN=简体中文,zh_TW=繁体中文,en_US=英文)\n      \"zoom\": 1, // <3.4.1 启用> 界面缩放比例(预留)\n      \"proxy\": {\n        \"type\": \"none\", // 代理类型(system=系统代理,custom=自定义代理,direct=直连)\n        \"url\": \"\", // 代理地址(支持socks5/http/https协议)\n        \"bypass\": \"\" // 忽略主机名\n      }, <3.4.1 启用> 代理设置\n      \"defaultHot\": \"kylive\", // <3.4.1 **弃用**> 热搜(kylive=酷云数据,enlightent=云合数据)\n      \"hot\": \"kylive\", // <3.4.1 启用> 热搜(baidu=百度,douban=豆瓣,enlightent=云合,komect=移动爱家,kylive=酷云,quark=夸克)\n      \"defaultSearchRecommend\": \"site\", // 搜索推荐 site:站点 quark:夸克 baidu:百度 douban:豆瓣  弃用\n      \"defaultSearchType\": \"site\", // <3.4.1 **弃用**> 全局搜索模式 site:本站 group:组内 all:全部\n      \"defaultFilterType\": false, // <3.3.7 启用, 3.4.1 **弃用**> 影视搜索过滤关键词\n      \"site\": {\n        \"searchMode\": \"site\", // 全局搜索模式 site:本站 group:组内 all:全部\n        \"filterMode\": false, // 影视搜索过滤关键词\n      }, // <3.4.1 启用> 影视设置\n      \"defaultIptvEpg\": \"https://epg.112114.eu.org/?ch={name}&date={date}\", // <3.4.1 **弃用**> iptv电子节目单(name=频道名称 date=日期)\n      \"defaultIptvLogo\": \"https://epg.112114.eu.org/logo/{name}.png\", // <3.4.1 **弃用**> iptv台标(name=频道名称)\n      \"iptvSkipIpv6\": true, // <3.3.8 **弃用**> iptv是否跳过ipv6节目\n      \"iptvMarkIp\": true, // <3.3.8 启用, 3.4.1 **弃用**> iptv标识IP类型\n      \"iptvThumbnail\": true, // <3.4.1 **弃用**> iptv是否显示缩略图\n      \"iptvStatus\": true, // <3.3.8 **弃用**> iptv是否检测延迟\n      \"iptvDelay\": true, // <3.3.8 启用, 3.4.1 **弃用**> iptv是否检测延迟\n      \"live\": {\n        \"ipMark\": true, // IP类型\n        \"thumbnail\": false, // 缩略图\n        \"delay\": false, // 延迟测速\n        \"epg\": \"https://epg.112114.eu.org/?ch={name}&date={date}\", // 电子节目单(name=频道名称 date=日期)\n        \"logo\": \"https://epg.112114.eu.org/logo/{name}.png\", // 台标(name=频道名称)\n      }, // <3.4.1 启用> 直播设置\n      \"defaultSite\": \"51793af6-c923-5504-85db-0ef686624dec\", // site 默认源标识\n      \"defaultIptv\": \"993841fe-5e91-5e5d-35d6-5be81822960b\", // iptv 默认源标识\n      \"defaultAnalyze\": \"fddfb425-6fd9-0b39-459f-a21f69739a6e\", // analyze 默认源标识\n      \"defaultDrive\": \"3293dc45-cf14-9c66-3028-5b7765b240b7\", // <3.4.1 **弃用**> drive 默认源标识\n      \"defaultViewCasual\": \"\", // <3.3.4 启用 3.3.5 **弃用**> 随心看\n      \"barrage\": {\n        \"url\": \"\", // 弹幕地址\n        \"id\": \"name\", // 弹幕接口返回数据对应的id\n        \"key\": \"danmuku\", // 弹幕接口返回数据对应的key\n        \"support\": [\"qq\", \"qiyi\", \"youku\", \"mgtv\"], // 弹幕支持的线路\n        \"start\": \"0\", <3.4.1 **弃用**> // 返回数据对应的开始时间下标\n        \"time\": 0, // <3.4.1 启用> 返回数据对应的开始时间下标\n        \"mode\": \"1\", // <3.4.1 **弃用**> 返回数据对应的位置下标\n        \"type\": 1, // <3.4.1 启用> 返回数据对应的位置下标\n        \"color\": 2, // 返回数据对应的颜色下标(<=3.4.0: string | >=3.4.1: number)\n        \"content\": \"4\" // <3.4.1 **弃用**> 返回数据对应的内容下标\n        \"text\": 4 // <3.4.1 启用> 返回数据对应的内容下标\n      }, // <3.3.4 启用> 弹幕参数\n      \"analyzeFlag\": [\"youku\", \"qq\", \"iqiyi\", \"qiyi\", \"letv\", \"leshi\", \"sohu\", \"tudou\", \"pptv\", \"mgtv\", \"imgo\"], // <3.4.1 **弃用**> 解析标识\n      \"broadcasterType\": \"xgplayer\", // <3.3.4 **弃用**> 播放器(xgplayer=西瓜播放器,dplayer=呆呆播放器,custom=调外部播放器)\n      \"externalPlayer\": \"\", // <3.3.4 **弃用**> 调外部播放器(类型为custom启用)\n      \"playerMode\": {\n        \"type\": \"xgplayer\", // 播放器(xgplayer=西瓜播放器,artplayer=艺术播放器,custom=调外部播放器)\n        \"external\": \"\" // 调外部播放器(类型为custom启用)\n      }, // <3.3.4 启用, 3.4.1 **弃用**>\n      \"player\": {\n        \"type\": \"xgplayer\", // 播放器(xgplayer=西瓜播放器,artplayer=艺术播放器,custom=调外部播放器)\n        \"external\": \"\" // 调外部播放器(类型为custom启用)\n      }, // <3.4.1 启用>\n      \"softSolution\": false, // 软解(预留字段 true=启用,false=禁用)\n      \"skipStartEnd\": false, // <3.3.5 **弃用**> 是否跳过首尾空白\n      \"agreementMask\": true, // <3.4.1 **弃用**> 是否同意协议\n      \"disclaimer\": true, // <3.4.1 启用> 是否同意协议\n      \"recordShortcut\": \"Shift+Command+Z\", // <3.4.1 **弃用**> 老板键\n      \"bossKey\": \"Shift+Command+Z\", // <3.4.1 启用> 老板键\n      \"snifferType\": \"pie\", // <3.3.4 **弃用**> 嗅探模式(pie=内置嗅探,iframe=原生嗅探)\n      \"snifferMode\": {\n        \"type\": \"pie\", // 嗅探模式(pie=内置嗅探,custom=三方嗅探)\n        \"url\": \"\" // 三方嗅探接口(类型为custom时启用)\n      }, // <3.3.4 启用, 3.4.1 **弃用**>\n      \"sniffer\": {\n        \"type\": \"cdp\", // 嗅探模式(cdp=内置嗅探,custom=三方嗅探)\n        \"url\": \"\" // 三方嗅探接口(类型为custom时启用)\n      }, // <3.4.1 启用>\n      \"selfBoot\": false, // <3.4.1 **弃用**> 是否开机自启动\n      \"autoStart\": false, // <3.4.1 启用> 是否开机自启动\n      \"hardwareAcceleration\": true, // 是否启用硬件加速\n      \"ua\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36\", // User-Agent\n      \"dns\": \"\" // <3.3.7 启用> DNS-over-HTTP\n      \"webdavUrl\": \"https://dav.jianguoyun.com/dav/\", // <3.3.4 **弃用**> webdav同步盘地址\n      \"webdavUsername\": \"\", // <3.3.4 **弃用**> webdeav用户名\n      \"webdavPassword\": \"\", // <3.3.4 **弃用**> webdav密码\n      \"webdav\": {\n        \"sync\": false, // 自动同步\n        \"data\": {\n          \"url\": \"https://dav.jianguoyun.com/dav/\", // webdav同步盘地址\n          \"user\": \"\", // webdav用户名\n          \"password\": \"\" // webdav密码\n        }\n      }, // <3.3.4 启用, 3.4.1 **弃用**>\n      \"cloud\": {\n        \"sync\": false, // 自动同步\n        \"type\": \"webdav\", // 备份类型(webdav=webdav同步盘, icloud=icloud云盘仅mac)\n        \"data\": {\n          \"url\": \"https://dav.jianguoyun.com/dav/\", // webdav同步盘地址\n          \"user\": \"\", // webdav用户名\n          \"password\": \"\" // webdav密码\n        } // 仅类型为webdav启用\n      }, // <3.4.1 启用>\n      \"ai\": {\n        \"server\": \"\",  // AI服务器地址\n        \"key\": \"\", // API密钥\n        \"model\": \"gpt-3.5-turbo\" // 模型名称\n      }, // <3.3.5 启用, 3.4.1 **弃用**>\n      \"aigc\": {\n        \"type\": \"openai\", // AI类型(仅支持openai)\n        \"server\": \"\",  // AI服务器地址\n        \"key\": \"\", // API密钥\n        \"model\": \"gpt-3.5-turbo\" // 模型名称\n      }, // <3.4.1 启用> AI设置\n      \"timeout\": 5000, // <3.3.5 启用> 全局请求超时(ms)\n      \"restoreWindowPositionAndSize\": false, // <3.3.7 **弃用**> 是否记录窗口位置\n      \"windowPosition\": {\n        \"status\": false, // 是否记录窗口位置\n        \"position\": {\n          \"width\": 1000,\n          \"height\": 640\n        }, // <3.3.7 **弃用**> 窗口位置\n        \"position_main\": {\n          \"width\": 1000,\n          \"height\": 640\n        }, // <3.3.7 启用> 记录主窗口位置\n        \"position_play\": {\n          \"width\": 875,\n          \"height\": 550\n        } // <3.3.7 启用> 记录播放窗口位置\n      }, // <3.4.1 **弃用**>\n      \"debug\": false, // <3.3.7 启用> 用于部分调试\n    }\n  ]\n}\n```\n\n</details>\n\n## 🤝 参与贡献\n\n以下是您可以做出贡献的一些方式：\n\n- **贡献代码**：开发新功能或优化现有代码 <[开发文档](docs/Develop.md)> <[Mcp文档](docs/Mcp.md)>\n- **修复错误**：提交您发现的任何错误的修复 <[提交规范](docs/Conventional_Commits.md)>\n- **维护问题**：帮助管理GitHub问题\n- **产品设计**：参与设计讨论\n- **编写文档**：改进用户手册和指南\n- **社区参与**：加入讨论并帮助用户\n- **用爱发电**：支持项目发展(不限于资金,服务器等) <[kofi](https://ko-fi.com/hiramwong)> <[爱发电](https://ifdian.net/a/hiram)>\n\n[![][github-contributors-shield]][github-contributors-link]\n\n## 🌟 Star历史\n\n<a href=\"https://www.star-history.com/#Hiram-Wong/zyfun&Date\">\n <picture>\n   <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=Hiram-Wong/zyfun&type=Date&theme=dark\" />\n   <source media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=Hiram-Wong/zyfun&type=Date\" />\n   <img alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=Hiram-Wong/zyfun&type=Date\" />\n </picture>\n</a>\n\n## 💰 金主爸爸\n\n- [NodeSupport](https://github.com/NodeSeekDev/NodeSupport) 赞助了本项目\n- [![image](https://s2.loli.net/2025/04/09/JMyQZUKY2bX4G3q.png)](https://yxvm.com/)\n\n<!-- Links & Images -->\n\n[github-release-shield]: https://img.shields.io/github/v/release/Hiram-Wong/zyfun?label=Release&logo=github\n[github-release-link]: https://github.com/Hiram-Wong/zyfun/releases\n[github-nightly-shield]: https://img.shields.io/github/actions/workflow/status/Hiram-Wong/zyfun/nightly-build.yml?label=NightlyBuild&logo=github\n[github-nightly-link]: https://github.com/Hiram-Wong/zyfun/actions/workflows/nightly-build.yml\n[github-contributors-shield]: https://openomy.app/svg?repo=Hiram-Wong/zyfun&chart=bubble&latestMonth=12\n[github-contributors-link]: https://openomy.app/github/Hiram-Wong/zyfun\n[github-license-shield]: https://img.shields.io/github/license/Hiram-Wong/zyfun?label=License&logo=gnu\n[github-license-link]: https://github.com/Hiram-Wong/zyfun/blob/main/LICENSE.txt\n[fossa-shield]: https://app.fossa.com/api/projects/git%2Bgithub.com%2FHiram-Wong%2Fzyfun.svg?type=shield\n[fossa-link]: https://app.fossa.com/projects/git%2Bgithub.com%2FHiram-Wong%2Fzyfun?ref=badge_shield\n[sponsor-shield]: https://img.shields.io/badge/赞助支持-FF6699.svg?logo=githubsponsors&logoColor=white\n[sponsor-link]: https://ko-fi.com/hiramwong\n[telegram-shield]: https://img.shields.io/badge/IM-Telegram-0088CC?logo=telegram\n[telegram-link]: https://t.me/+IOovrYLP7gYwYmNl\n\n<!-- Links & Images -->\n\n[readmex-shield]: https://raw.githubusercontent.com/CodePhiliaX/resource-trusteeship/main/readmex.svg\n[readmex-link]: https://readmex.com/Hiram-Wong/ZyPlayer\n[deepwiki-shield]: https://deepwiki.com/badge.svg\n[deepwiki-link]: https://deepwiki.com/Hiram-Wong/zyfun\n[zread-shield]: https://img.shields.io/badge/Ask_Zread-_.svg?style=flat&color=00b0aa&labelColor=000000&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTQuOTYxNTYgMS42MDAxSDIuMjQxNTZDMS44ODgxIDEuNjAwMSAxLjYwMTU2IDEuODg2NjQgMS42MDE1NiAyLjI0MDFWNC45NjAxQzEuNjAxNTYgNS4zMTM1NiAxLjg4ODEgNS42MDAxIDIuMjQxNTYgNS42MDAxSDQuOTYxNTZDNS4zMTUwMiA1LjYwMDEgNS42MDE1NiA1LjMxMzU2IDUuNjAxNTYgNC45NjAxVjIuMjQwMUM1LjYwMTU2IDEuODg2NjQgNS4zMTUwMiAxLjYwMDEgNC45NjE1NiAxLjYwMDFaIiBmaWxsPSIjZmZmIi8%2BCjxwYXRoIGQ9Ik00Ljk2MTU2IDEwLjM5OTlIMi4yNDE1NkMxLjg4ODEgMTAuMzk5OSAxLjYwMTU2IDEwLjY4NjQgMS42MDE1NiAxMS4wMzk5VjEzLjc1OTlDMS42MDE1NiAxNC4xMTM0IDEuODg4MSAxNC4zOTk5IDIuMjQxNTYgMTQuMzk5OUg0Ljk2MTU2QzUuMzE1MDIgMTQuMzk5OSA1LjYwMTU2IDE0LjExMzQgNS42MDE1NiAxMy43NTk5VjExLjAzOTlDNS42MDE1NiAxMC42ODY0IDUuMzE1MDIgMTAuMzk5OSA0Ljk2MTU2IDEwLjM5OTlaIiBmaWxsPSIjZmZmIi8%2BCjxwYXRoIGQ9Ik0xMy43NTg0IDEuNjAwMUgxMS4wMzg0QzEwLjY4NSAxLjYwMDEgMTAuMzk4NCAxLjg4NjY0IDEwLjM5ODQgMi4yNDAxVjQuOTYwMUMxMC4zOTg0IDUuMzEzNTYgMTAuNjg1IDUuNjAwMSAxMS4wMzg0IDUuNjAwMUgxMy43NTg0QzE0LjExMTkgNS42MDAxIDE0LjM5ODQgNS4zMTM1NiAxNC4zOTg0IDQuOTYwMVYyLjI0MDFDMTQuMzk4NCAxLjg4NjY0IDE0LjExMTkgMS42MDAxIDEzLjc1ODQgMS42MDAxWiIgZmlsbD0iI2ZmZiIvPgo8cGF0aCBkPSJNNCAxMkwxMiA0TDQgMTJaIiBmaWxsPSIjZmZmIi8%2BCjxwYXRoIGQ9Ik00IDEyTDEyIDQiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8L3N2Zz4K&logoColor=ffffff\n[zread-link]: https://zread.ai/Hiram-Wong/zyfun\n\n<!-- Links & Images -->\n\n[rank-hellogithub-shield]: https://api.hellogithub.com/v1/widgets/recommend.svg?rid=c54bf4d457b64ee7a84fd1ea0b36419a\n[rank-hellogithub-link]: https://hellogithub.com/repository/Hunlongyu/ZY-Player\n[rank-trendshift-shield]: https://trendshift.io/api/badge/repositories/20293\n[rank-trendshift-link]: https://trendshift.io/repositories/20293\n[rank-producthunt-shield]: https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=1019733&theme=light\n[rank-producthunt-link]: https://www.producthunt.com/products/zyfun?embed=true&utm_source=badge-featured&utm_medium=badge&utm_source=badge-zyfun\n"
  },
  {
    "path": "SECURITY.md",
    "content": "## Security\n\nWe takes the security of our software products and services seriously, which\nincludes all source code repositories in our GitHub organizations.\n\n**Please do not report security vulnerabilities through public GitHub issues.**\n\nFor security reporting information, locations, contact information, and policies,\nplease link to our team.\n"
  },
  {
    "path": "ThirdPartyNotices.txt",
    "content": "NOTICES\r\n\r\nThis repository incorporates material as listed below or described in the code.\r\n\r\n\r\n---------------------------------------------------------\r\n\r\n7zip-bin-full\r\nhttps://github.com/ollm/7zip-bin-full\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2016 Vladimir Krivosheev\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nadm-zip\r\nhttps://github.com/cthackers/adm-zip\r\n\r\nMIT License\r\n\r\nCopyright (c) 2012 Another-D-Mention Software and other contributors\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nartplayer-plugin-danmuku\r\nhttps://github.com/zhw2590582/ArtPlayer\r\n\r\nNO LICENSE CONTENT, USE MIT GENERIC RULES\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nartplayer\r\nhttps://github.com/zhw2590582/ArtPlayer\r\n\r\nNO LICENSE CONTENT, USE MIT GENERIC RULES\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\naxios\r\nhttps://github.com/axios/axios\r\n\r\n# Copyright (c) 2014-present Matt Zabriskie & Collaborators\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nbuilder-util-runtime\r\nhttps://github.com/electron-userland/electron-builder\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2015 Loopline Systems\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\ncheerio\r\nhttps://github.com/cheeriojs/cheerio\r\n\r\nMIT License\r\n\r\nCopyright (c) 2022 The Cheerio contributors\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nchokidar\r\nhttps://github.com/paulmillr/chokidar\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2012 Paul Miller (https://paulmillr.com), Elan Shanker\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the “Software”), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\ncommitizen\r\nhttps://github.com/commitizen/cz-cli\r\n\r\nThe MIT License (MIT)\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\ncrypto-js\r\nhttps://github.com/brix/crypto-js\r\n\r\n# License\r\n\r\n[The MIT License (MIT)](http://opensource.org/licenses/MIT)\r\n\r\nCopyright (c) 2009-2013 Jeff Mott  \r\nCopyright (c) 2013-2016 Evan Vosberg\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\ncz-conventional-changelog\r\nhttps://github.com/commitizen/cz-conventional-changelog\r\n\r\nMIT License\r\n\r\nCopyright (c) 2015-2018 Commitizen Contributors\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\ndashjs\r\nhttps://github.com/Dash-Industry-Forum/dash.js\r\n\r\n# dash.js BSD License Agreement\r\n\r\nThe copyright in this software is being made available under the BSD License, included below. This software may be subject to other third party and contributor rights, including patent rights, and no such rights are granted under this license.\r\n\r\n**Copyright (c) 2015, Dash Industry Forum.\r\n**All rights reserved.**\r\n \r\n* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\r\n* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\r\n* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the  documentation and/or other materials provided with the distribution.\r\n* Neither the name of the Dash Industry Forum nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\r\n\r\n**THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.**\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\ndayjs\r\nhttps://github.com/iamkun/dayjs\r\n\r\nMIT License\r\n\r\nCopyright (c) 2018-present, iamkun\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\ndotenv-cli\r\nhttps://github.com/entropitor/dotenv-cli\r\n\r\nCopyright (c) 2025 Jens Claes\r\n\r\nThe MIT License (MIT)\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\ndplayer\r\nhttps://github.com/tsukumijima/DPlayer\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) DIYgod <diy.d.god@gmail.com> (https://www.anotherhome.net/)\r\nCopyright (c) 2019-2024 tsukumi\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\ndrizzle-orm\r\nhttps://github.com/drizzle-team/drizzle-orm\r\n\r\nNO LICENSE CONTENT, USE Apache-2.0 GENERIC RULES\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nelectron-localshortcut\r\nhttps://github.com/parro-it/electron-localshortcut\r\n\r\nThe MIT License (MIT)\r\nCopyright (c) 2017 Andrea Parodi\r\n\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r\nDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\r\nOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE\r\nOR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nelectron-store\r\nhttps://github.com/sindresorhus/electron-store\r\n\r\nMIT License\r\n\r\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nelectron-updater\r\nhttps://github.com/electron-userland/electron-builder\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2015 Loopline Systems\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nelectron-window-state\r\nhttps://github.com/mawie81/electron-window-state\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2015 Jakub Szwacz\r\nCopyright (c) Marcel Wiehle <marcel@wiehle.me> (http://marcel.wiehle.me)\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nemittery\r\nhttps://github.com/sindresorhus/emittery\r\n\r\nMIT License\r\n\r\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nes-toolkit\r\nhttps://github.com/toss/es-toolkit\r\n\r\nMIT License\r\n\r\nCopyright (c) 2024 Viva Republica, Inc\r\n\r\nCopyright OpenJS Foundation and other contributors\r\n\r\nParts of the test suite and compatibility layer in `es-toolkit/compat` are derived from Lodash (https://github.com/lodash/lodash) by the OpenJS Foundation (https://openjsf.org/) and Underscore.js by Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors (http://underscorejs.org/)\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nfast-xml-parser\r\nhttps://github.com/NaturalIntelligence/fast-xml-parser\r\n\r\nMIT License\r\n\r\nCopyright (c) 2017 Amit Kumar Gupta\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nfastify\r\nhttps://github.com/fastify/fastify\r\n\r\nMIT License\r\n\r\nCopyright (c) 2016-present The Fastify team <https://github.com/fastify/fastify#team>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nfdir\r\nhttps://github.com/thecodrr/fdir\r\n\r\nCopyright 2023 Abdullah Atta\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nfetch-socks\r\nhttps://github.com/Kaciras/fetch-socks\r\n\r\nCopyright (c) 2022-2024 Kaciras\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nfluent-ffmpeg\r\nhttps://github.com/fluent-ffmpeg/node-fluent-ffmpeg\r\n\r\n(The MIT License)\r\n\r\nCopyright (c) 2011-2015 The fluent-ffmpeg contributors\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nflv.js\r\nhttps://github.com/Bilibili/flv.js\r\n\r\nApache License\r\n                           Version 2.0, January 2004\r\n                        http://www.apache.org/licenses/\r\n\r\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\r\n\r\n   1. Definitions.\r\n\r\n      \"License\" shall mean the terms and conditions for use, reproduction,\r\n      and distribution as defined by Sections 1 through 9 of this document.\r\n\r\n      \"Licensor\" shall mean the copyright owner or entity authorized by\r\n      the copyright owner that is granting the License.\r\n\r\n      \"Legal Entity\" shall mean the union of the acting entity and all\r\n      other entities that control, are controlled by, or are under common\r\n      control with that entity. For the purposes of this definition,\r\n      \"control\" means (i) the power, direct or indirect, to cause the\r\n      direction or management of such entity, whether by contract or\r\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\r\n      outstanding shares, or (iii) beneficial ownership of such entity.\r\n\r\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\r\n      exercising permissions granted by this License.\r\n\r\n      \"Source\" form shall mean the preferred form for making modifications,\r\n      including but not limited to software source code, documentation\r\n      source, and configuration files.\r\n\r\n      \"Object\" form shall mean any form resulting from mechanical\r\n      transformation or translation of a Source form, including but\r\n      not limited to compiled object code, generated documentation,\r\n      and conversions to other media types.\r\n\r\n      \"Work\" shall mean the work of authorship, whether in Source or\r\n      Object form, made available under the License, as indicated by a\r\n      copyright notice that is included in or attached to the work\r\n      (an example is provided in the Appendix below).\r\n\r\n      \"Derivative Works\" shall mean any work, whether in Source or Object\r\n      form, that is based on (or derived from) the Work and for which the\r\n      editorial revisions, annotations, elaborations, or other modifications\r\n      represent, as a whole, an original work of authorship. For the purposes\r\n      of this License, Derivative Works shall not include works that remain\r\n      separable from, or merely link (or bind by name) to the interfaces of,\r\n      the Work and Derivative Works thereof.\r\n\r\n      \"Contribution\" shall mean any work of authorship, including\r\n      the original version of the Work and any modifications or additions\r\n      to that Work or Derivative Works thereof, that is intentionally\r\n      submitted to Licensor for inclusion in the Work by the copyright owner\r\n      or by an individual or Legal Entity authorized to submit on behalf of\r\n      the copyright owner. For the purposes of this definition, \"submitted\"\r\n      means any form of electronic, verbal, or written communication sent\r\n      to the Licensor or its representatives, including but not limited to\r\n      communication on electronic mailing lists, source code control systems,\r\n      and issue tracking systems that are managed by, or on behalf of, the\r\n      Licensor for the purpose of discussing and improving the Work, but\r\n      excluding communication that is conspicuously marked or otherwise\r\n      designated in writing by the copyright owner as \"Not a Contribution.\"\r\n\r\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\r\n      on behalf of whom a Contribution has been received by Licensor and\r\n      subsequently incorporated within the Work.\r\n\r\n   2. Grant of Copyright License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      copyright license to reproduce, prepare Derivative Works of,\r\n      publicly display, publicly perform, sublicense, and distribute the\r\n      Work and such Derivative Works in Source or Object form.\r\n\r\n   3. Grant of Patent License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      (except as stated in this section) patent license to make, have made,\r\n      use, offer to sell, sell, import, and otherwise transfer the Work,\r\n      where such license applies only to those patent claims licensable\r\n      by such Contributor that are necessarily infringed by their\r\n      Contribution(s) alone or by combination of their Contribution(s)\r\n      with the Work to which such Contribution(s) was submitted. If You\r\n      institute patent litigation against any entity (including a\r\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\r\n      or a Contribution incorporated within the Work constitutes direct\r\n      or contributory patent infringement, then any patent licenses\r\n      granted to You under this License for that Work shall terminate\r\n      as of the date such litigation is filed.\r\n\r\n   4. Redistribution. You may reproduce and distribute copies of the\r\n      Work or Derivative Works thereof in any medium, with or without\r\n      modifications, and in Source or Object form, provided that You\r\n      meet the following conditions:\r\n\r\n      (a) You must give any other recipients of the Work or\r\n          Derivative Works a copy of this License; and\r\n\r\n      (b) You must cause any modified files to carry prominent notices\r\n          stating that You changed the files; and\r\n\r\n      (c) You must retain, in the Source form of any Derivative Works\r\n          that You distribute, all copyright, patent, trademark, and\r\n          attribution notices from the Source form of the Work,\r\n          excluding those notices that do not pertain to any part of\r\n          the Derivative Works; and\r\n\r\n      (d) If the Work includes a \"NOTICE\" text file as part of its\r\n          distribution, then any Derivative Works that You distribute must\r\n          include a readable copy of the attribution notices contained\r\n          within such NOTICE file, excluding those notices that do not\r\n          pertain to any part of the Derivative Works, in at least one\r\n          of the following places: within a NOTICE text file distributed\r\n          as part of the Derivative Works; within the Source form or\r\n          documentation, if provided along with the Derivative Works; or,\r\n          within a display generated by the Derivative Works, if and\r\n          wherever such third-party notices normally appear. The contents\r\n          of the NOTICE file are for informational purposes only and\r\n          do not modify the License. You may add Your own attribution\r\n          notices within Derivative Works that You distribute, alongside\r\n          or as an addendum to the NOTICE text from the Work, provided\r\n          that such additional attribution notices cannot be construed\r\n          as modifying the License.\r\n\r\n      You may add Your own copyright statement to Your modifications and\r\n      may provide additional or different license terms and conditions\r\n      for use, reproduction, or distribution of Your modifications, or\r\n      for any such Derivative Works as a whole, provided Your use,\r\n      reproduction, and distribution of the Work otherwise complies with\r\n      the conditions stated in this License.\r\n\r\n   5. Submission of Contributions. Unless You explicitly state otherwise,\r\n      any Contribution intentionally submitted for inclusion in the Work\r\n      by You to the Licensor shall be under the terms and conditions of\r\n      this License, without any additional terms or conditions.\r\n      Notwithstanding the above, nothing herein shall supersede or modify\r\n      the terms of any separate license agreement you may have executed\r\n      with Licensor regarding such Contributions.\r\n\r\n   6. Trademarks. This License does not grant permission to use the trade\r\n      names, trademarks, service marks, or product names of the Licensor,\r\n      except as required for reasonable and customary use in describing the\r\n      origin of the Work and reproducing the content of the NOTICE file.\r\n\r\n   7. Disclaimer of Warranty. Unless required by applicable law or\r\n      agreed to in writing, Licensor provides the Work (and each\r\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\r\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\r\n      implied, including, without limitation, any warranties or conditions\r\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\r\n      PARTICULAR PURPOSE. You are solely responsible for determining the\r\n      appropriateness of using or redistributing the Work and assume any\r\n      risks associated with Your exercise of permissions under this License.\r\n\r\n   8. Limitation of Liability. In no event and under no legal theory,\r\n      whether in tort (including negligence), contract, or otherwise,\r\n      unless required by applicable law (such as deliberate and grossly\r\n      negligent acts) or agreed to in writing, shall any Contributor be\r\n      liable to You for damages, including any direct, indirect, special,\r\n      incidental, or consequential damages of any character arising as a\r\n      result of this License or out of the use or inability to use the\r\n      Work (including but not limited to damages for loss of goodwill,\r\n      work stoppage, computer failure or malfunction, or any and all\r\n      other commercial damages or losses), even if such Contributor\r\n      has been advised of the possibility of such damages.\r\n\r\n   9. Accepting Warranty or Additional Liability. While redistributing\r\n      the Work or Derivative Works thereof, You may choose to offer,\r\n      and charge a fee for, acceptance of support, warranty, indemnity,\r\n      or other liability obligations and/or rights consistent with this\r\n      License. However, in accepting such obligations, You may act only\r\n      on Your own behalf and on Your sole responsibility, not on behalf\r\n      of any other Contributor, and only if You agree to indemnify,\r\n      defend, and hold each Contributor harmless for any liability\r\n      incurred by, or claims asserted against, such Contributor by reason\r\n      of your accepting any such warranty or additional liability.\r\n\r\n   END OF TERMS AND CONDITIONS\r\n\r\n   APPENDIX: How to apply the Apache License to your work.\r\n\r\n      To apply the Apache License to your work, attach the following\r\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\r\n      replaced with your own identifying information. (Don't include\r\n      the brackets!)  The text should be enclosed in the appropriate\r\n      comment syntax for the file format. We also recommend that a\r\n      file or class name and description of purpose be included on the\r\n      same \"printed page\" as the copyright notice for easier\r\n      identification within third-party archives.\r\n\r\n   Copyright [yyyy] [name of copyright owner]\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nform-data\r\nhttps://github.com/form-data/form-data\r\n\r\nCopyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in\r\n all copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nfs-extra\r\nhttps://github.com/jprichardson/node-fs-extra\r\n\r\n(The MIT License)\r\n\r\nCopyright (c) 2011-2024 JP Richardson\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files\r\n(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,\r\n merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\r\nWARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\r\nOR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\r\n ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nfuse.js\r\nhttps://github.com/krisk/Fuse\r\n\r\nApache License\r\n                           Version 2.0, January 2004\r\n                        http://www.apache.org/licenses/\r\n\r\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\r\n\r\n   1. Definitions.\r\n\r\n      \"License\" shall mean the terms and conditions for use, reproduction,\r\n      and distribution as defined by Sections 1 through 9 of this document.\r\n\r\n      \"Licensor\" shall mean the copyright owner or entity authorized by\r\n      the copyright owner that is granting the License.\r\n\r\n      \"Legal Entity\" shall mean the union of the acting entity and all\r\n      other entities that control, are controlled by, or are under common\r\n      control with that entity. For the purposes of this definition,\r\n      \"control\" means (i) the power, direct or indirect, to cause the\r\n      direction or management of such entity, whether by contract or\r\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\r\n      outstanding shares, or (iii) beneficial ownership of such entity.\r\n\r\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\r\n      exercising permissions granted by this License.\r\n\r\n      \"Source\" form shall mean the preferred form for making modifications,\r\n      including but not limited to software source code, documentation\r\n      source, and configuration files.\r\n\r\n      \"Object\" form shall mean any form resulting from mechanical\r\n      transformation or translation of a Source form, including but\r\n      not limited to compiled object code, generated documentation,\r\n      and conversions to other media types.\r\n\r\n      \"Work\" shall mean the work of authorship, whether in Source or\r\n      Object form, made available under the License, as indicated by a\r\n      copyright notice that is included in or attached to the work\r\n      (an example is provided in the Appendix below).\r\n\r\n      \"Derivative Works\" shall mean any work, whether in Source or Object\r\n      form, that is based on (or derived from) the Work and for which the\r\n      editorial revisions, annotations, elaborations, or other modifications\r\n      represent, as a whole, an original work of authorship. For the purposes\r\n      of this License, Derivative Works shall not include works that remain\r\n      separable from, or merely link (or bind by name) to the interfaces of,\r\n      the Work and Derivative Works thereof.\r\n\r\n      \"Contribution\" shall mean any work of authorship, including\r\n      the original version of the Work and any modifications or additions\r\n      to that Work or Derivative Works thereof, that is intentionally\r\n      submitted to Licensor for inclusion in the Work by the copyright owner\r\n      or by an individual or Legal Entity authorized to submit on behalf of\r\n      the copyright owner. For the purposes of this definition, \"submitted\"\r\n      means any form of electronic, verbal, or written communication sent\r\n      to the Licensor or its representatives, including but not limited to\r\n      communication on electronic mailing lists, source code control systems,\r\n      and issue tracking systems that are managed by, or on behalf of, the\r\n      Licensor for the purpose of discussing and improving the Work, but\r\n      excluding communication that is conspicuously marked or otherwise\r\n      designated in writing by the copyright owner as \"Not a Contribution.\"\r\n\r\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\r\n      on behalf of whom a Contribution has been received by Licensor and\r\n      subsequently incorporated within the Work.\r\n\r\n   2. Grant of Copyright License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      copyright license to reproduce, prepare Derivative Works of,\r\n      publicly display, publicly perform, sublicense, and distribute the\r\n      Work and such Derivative Works in Source or Object form.\r\n\r\n   3. Grant of Patent License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      (except as stated in this section) patent license to make, have made,\r\n      use, offer to sell, sell, import, and otherwise transfer the Work,\r\n      where such license applies only to those patent claims licensable\r\n      by such Contributor that are necessarily infringed by their\r\n      Contribution(s) alone or by combination of their Contribution(s)\r\n      with the Work to which such Contribution(s) was submitted. If You\r\n      institute patent litigation against any entity (including a\r\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\r\n      or a Contribution incorporated within the Work constitutes direct\r\n      or contributory patent infringement, then any patent licenses\r\n      granted to You under this License for that Work shall terminate\r\n      as of the date such litigation is filed.\r\n\r\n   4. Redistribution. You may reproduce and distribute copies of the\r\n      Work or Derivative Works thereof in any medium, with or without\r\n      modifications, and in Source or Object form, provided that You\r\n      meet the following conditions:\r\n\r\n      (a) You must give any other recipients of the Work or\r\n          Derivative Works a copy of this License; and\r\n\r\n      (b) You must cause any modified files to carry prominent notices\r\n          stating that You changed the files; and\r\n\r\n      (c) You must retain, in the Source form of any Derivative Works\r\n          that You distribute, all copyright, patent, trademark, and\r\n          attribution notices from the Source form of the Work,\r\n          excluding those notices that do not pertain to any part of\r\n          the Derivative Works; and\r\n\r\n      (d) If the Work includes a \"NOTICE\" text file as part of its\r\n          distribution, then any Derivative Works that You distribute must\r\n          include a readable copy of the attribution notices contained\r\n          within such NOTICE file, excluding those notices that do not\r\n          pertain to any part of the Derivative Works, in at least one\r\n          of the following places: within a NOTICE text file distributed\r\n          as part of the Derivative Works; within the Source form or\r\n          documentation, if provided along with the Derivative Works; or,\r\n          within a display generated by the Derivative Works, if and\r\n          wherever such third-party notices normally appear. The contents\r\n          of the NOTICE file are for informational purposes only and\r\n          do not modify the License. You may add Your own attribution\r\n          notices within Derivative Works that You distribute, alongside\r\n          or as an addendum to the NOTICE text from the Work, provided\r\n          that such additional attribution notices cannot be construed\r\n          as modifying the License.\r\n\r\n      You may add Your own copyright statement to Your modifications and\r\n      may provide additional or different license terms and conditions\r\n      for use, reproduction, or distribution of Your modifications, or\r\n      for any such Derivative Works as a whole, provided Your use,\r\n      reproduction, and distribution of the Work otherwise complies with\r\n      the conditions stated in this License.\r\n\r\n   5. Submission of Contributions. Unless You explicitly state otherwise,\r\n      any Contribution intentionally submitted for inclusion in the Work\r\n      by You to the Licensor shall be under the terms and conditions of\r\n      this License, without any additional terms or conditions.\r\n      Notwithstanding the above, nothing herein shall supersede or modify\r\n      the terms of any separate license agreement you may have executed\r\n      with Licensor regarding such Contributions.\r\n\r\n   6. Trademarks. This License does not grant permission to use the trade\r\n      names, trademarks, service marks, or product names of the Licensor,\r\n      except as required for reasonable and customary use in describing the\r\n      origin of the Work and reproducing the content of the NOTICE file.\r\n\r\n   7. Disclaimer of Warranty. Unless required by applicable law or\r\n      agreed to in writing, Licensor provides the Work (and each\r\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\r\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\r\n      implied, including, without limitation, any warranties or conditions\r\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\r\n      PARTICULAR PURPOSE. You are solely responsible for determining the\r\n      appropriateness of using or redistributing the Work and assume any\r\n      risks associated with Your exercise of permissions under this License.\r\n\r\n   8. Limitation of Liability. In no event and under no legal theory,\r\n      whether in tort (including negligence), contract, or otherwise,\r\n      unless required by applicable law (such as deliberate and grossly\r\n      negligent acts) or agreed to in writing, shall any Contributor be\r\n      liable to You for damages, including any direct, indirect, special,\r\n      incidental, or consequential damages of any character arising as a\r\n      result of this License or out of the use or inability to use the\r\n      Work (including but not limited to damages for loss of goodwill,\r\n      work stoppage, computer failure or malfunction, or any and all\r\n      other commercial damages or losses), even if such Contributor\r\n      has been advised of the possibility of such damages.\r\n\r\n   9. Accepting Warranty or Additional Liability. While redistributing\r\n      the Work or Derivative Works thereof, You may choose to offer,\r\n      and charge a fee for, acceptance of support, warranty, indemnity,\r\n      or other liability obligations and/or rights consistent with this\r\n      License. However, in accepting such obligations, You may act only\r\n      on Your own behalf and on Your sole responsibility, not on behalf\r\n      of any other Contributor, and only if You agree to indemnify,\r\n      defend, and hold each Contributor harmless for any liability\r\n      incurred by, or claims asserted against, such Contributor by reason\r\n      of your accepting any such warranty or additional liability.\r\n\r\n   END OF TERMS AND CONDITIONS\r\n\r\n   APPENDIX: How to apply the Apache License to your work.\r\n\r\n      To apply the Apache License to your work, attach the following\r\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\r\n      replaced with your own identifying information. (Don't include\r\n      the brackets!)  The text should be enclosed in the appropriate\r\n      comment syntax for the file format. We also recommend that a\r\n      file or class name and description of purpose be included on the\r\n      same \"printed page\" as the copyright notice for easier\r\n      identification within third-party archives.\r\n\r\n   Copyright 2017 Kirollos Risk\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nglobals\r\nhttps://github.com/sindresorhus/globals\r\n\r\nMIT License\r\n\r\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nhe\r\nhttps://github.com/mathiasbynens/he\r\n\r\nCopyright Mathias Bynens <https://mathiasbynens.be/>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining\r\na copy of this software and associated documentation files (the\r\n\"Software\"), to deal in the Software without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Software, and to\r\npermit persons to whom the Software is furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nhls.js\r\nhttps://github.com/video-dev/hls.js\r\n\r\nCopyright (c) 2017 Dailymotion (http://www.dailymotion.com)\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n    http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n\r\nsrc/remux/mp4-generator.js and src/demux/exp-golomb.ts implementation in this project\r\nare derived from the HLS library for video.js (https://github.com/videojs/videojs-contrib-hls)\r\n\r\nThat work is also covered by the Apache 2 License, following copyright:\r\nCopyright (c) 2013-2015 Brightcove\r\n\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nhttp-status-codes\r\nhttps://github.com/prettymuchbryce/http-status-codes\r\n\r\nThe MIT License (MIT)\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nhusky\r\nhttps://github.com/typicode/husky\r\n\r\nMIT License\r\n\r\nCopyright (c) 2021 typicode\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\ni18next\r\nhttps://github.com/i18next/i18next\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2025 i18next\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\niconv-lite\r\nhttps://github.com/pillarjs/iconv-lite\r\n\r\nCopyright (c) 2011 Alexander Shtuchkin\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining\r\na copy of this software and associated documentation files (the\r\n\"Software\"), to deal in the Software without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Software, and to\r\npermit persons to whom the Software is furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nipaddr.js\r\nhttps://github.com/whitequark/ipaddr.js\r\n\r\nCopyright (C) 2011-2017 whitequark <whitequark@whitequark.org>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nisomorphic-ws\r\nhttps://github.com/heineiuo/isomorphic-ws\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2018 Zejin Zhuang <heineiuo@gmail.com>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\njs-yaml\r\nhttps://github.com/nodeca/js-yaml\r\n\r\n(The MIT License)\r\n\r\nCopyright (C) 2011-2015 by Vitaly Puzrin\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\njson5\r\nhttps://github.com/json5/json5\r\n\r\nMIT License\r\n\r\nCopyright (c) 2012-2018 Aseem Kishore, and [others].\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n\r\n[others]: https://github.com/json5/json5/contributors\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\njsonpath-plus\r\nhttps://github.com/s3u/JSONPath\r\n\r\nMIT License\r\n\r\nCopyright (c) 2011-2019 Stefan Goessner, Subbu Allamaraju, Mike Brevoort,\r\nRobert Krahn, Brett Zamir, Richard Schneider\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nless\r\nhttps://github.com/less/less.js\r\n\r\nNO LICENSE CONTENT, USE Apache-2.0 GENERIC RULES\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nmacos-release\r\nhttps://github.com/sindresorhus/macos-release\r\n\r\nMIT License\r\n\r\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nmagnet-uri\r\nhttps://github.com/webtorrent/magnet-uri\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) Feross Aboukhadijeh and WebTorrent, LLC\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of\r\nthis software and associated documentation files (the \"Software\"), to deal in\r\nthe Software without restriction, including without limitation the rights to\r\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\nthe Software, and to permit persons to whom the Software is furnished to do so,\r\nsubject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nmime-types\r\nhttps://github.com/jshttp/mime-types\r\n\r\n(The MIT License)\r\n\r\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\r\nCopyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining\r\na copy of this software and associated documentation files (the\r\n'Software'), to deal in the Software without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Software, and to\r\npermit persons to whom the Software is furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nminimist\r\nhttps://github.com/minimistjs/minimist\r\n\r\nThis software is released under the MIT license:\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of\r\nthis software and associated documentation files (the \"Software\"), to deal in\r\nthe Software without restriction, including without limitation the rights to\r\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\nthe Software, and to permit persons to whom the Software is furnished to do so,\r\nsubject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nmonaco-editor\r\nhttps://github.com/microsoft/monaco-editor\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2016 - present Microsoft Corporation\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nmonaco-yaml\r\nhttps://github.com/remcohaszing/monaco-yaml\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) Microsoft Corporation\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and\r\nassociated documentation files (the “Software”), to deal in the Software without restriction,\r\nincluding without limitation the rights to use, copy, modify, merge, publish, distribute,\r\nsublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial\r\nportions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT\r\nNOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES\r\nOR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nmpegts.js\r\nhttps://github.com/xqq/mpegts.js\r\n\r\nApache License\r\n                           Version 2.0, January 2004\r\n                        http://www.apache.org/licenses/\r\n\r\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\r\n\r\n   1. Definitions.\r\n\r\n      \"License\" shall mean the terms and conditions for use, reproduction,\r\n      and distribution as defined by Sections 1 through 9 of this document.\r\n\r\n      \"Licensor\" shall mean the copyright owner or entity authorized by\r\n      the copyright owner that is granting the License.\r\n\r\n      \"Legal Entity\" shall mean the union of the acting entity and all\r\n      other entities that control, are controlled by, or are under common\r\n      control with that entity. For the purposes of this definition,\r\n      \"control\" means (i) the power, direct or indirect, to cause the\r\n      direction or management of such entity, whether by contract or\r\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\r\n      outstanding shares, or (iii) beneficial ownership of such entity.\r\n\r\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\r\n      exercising permissions granted by this License.\r\n\r\n      \"Source\" form shall mean the preferred form for making modifications,\r\n      including but not limited to software source code, documentation\r\n      source, and configuration files.\r\n\r\n      \"Object\" form shall mean any form resulting from mechanical\r\n      transformation or translation of a Source form, including but\r\n      not limited to compiled object code, generated documentation,\r\n      and conversions to other media types.\r\n\r\n      \"Work\" shall mean the work of authorship, whether in Source or\r\n      Object form, made available under the License, as indicated by a\r\n      copyright notice that is included in or attached to the work\r\n      (an example is provided in the Appendix below).\r\n\r\n      \"Derivative Works\" shall mean any work, whether in Source or Object\r\n      form, that is based on (or derived from) the Work and for which the\r\n      editorial revisions, annotations, elaborations, or other modifications\r\n      represent, as a whole, an original work of authorship. For the purposes\r\n      of this License, Derivative Works shall not include works that remain\r\n      separable from, or merely link (or bind by name) to the interfaces of,\r\n      the Work and Derivative Works thereof.\r\n\r\n      \"Contribution\" shall mean any work of authorship, including\r\n      the original version of the Work and any modifications or additions\r\n      to that Work or Derivative Works thereof, that is intentionally\r\n      submitted to Licensor for inclusion in the Work by the copyright owner\r\n      or by an individual or Legal Entity authorized to submit on behalf of\r\n      the copyright owner. For the purposes of this definition, \"submitted\"\r\n      means any form of electronic, verbal, or written communication sent\r\n      to the Licensor or its representatives, including but not limited to\r\n      communication on electronic mailing lists, source code control systems,\r\n      and issue tracking systems that are managed by, or on behalf of, the\r\n      Licensor for the purpose of discussing and improving the Work, but\r\n      excluding communication that is conspicuously marked or otherwise\r\n      designated in writing by the copyright owner as \"Not a Contribution.\"\r\n\r\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\r\n      on behalf of whom a Contribution has been received by Licensor and\r\n      subsequently incorporated within the Work.\r\n\r\n   2. Grant of Copyright License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      copyright license to reproduce, prepare Derivative Works of,\r\n      publicly display, publicly perform, sublicense, and distribute the\r\n      Work and such Derivative Works in Source or Object form.\r\n\r\n   3. Grant of Patent License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      (except as stated in this section) patent license to make, have made,\r\n      use, offer to sell, sell, import, and otherwise transfer the Work,\r\n      where such license applies only to those patent claims licensable\r\n      by such Contributor that are necessarily infringed by their\r\n      Contribution(s) alone or by combination of their Contribution(s)\r\n      with the Work to which such Contribution(s) was submitted. If You\r\n      institute patent litigation against any entity (including a\r\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\r\n      or a Contribution incorporated within the Work constitutes direct\r\n      or contributory patent infringement, then any patent licenses\r\n      granted to You under this License for that Work shall terminate\r\n      as of the date such litigation is filed.\r\n\r\n   4. Redistribution. You may reproduce and distribute copies of the\r\n      Work or Derivative Works thereof in any medium, with or without\r\n      modifications, and in Source or Object form, provided that You\r\n      meet the following conditions:\r\n\r\n      (a) You must give any other recipients of the Work or\r\n          Derivative Works a copy of this License; and\r\n\r\n      (b) You must cause any modified files to carry prominent notices\r\n          stating that You changed the files; and\r\n\r\n      (c) You must retain, in the Source form of any Derivative Works\r\n          that You distribute, all copyright, patent, trademark, and\r\n          attribution notices from the Source form of the Work,\r\n          excluding those notices that do not pertain to any part of\r\n          the Derivative Works; and\r\n\r\n      (d) If the Work includes a \"NOTICE\" text file as part of its\r\n          distribution, then any Derivative Works that You distribute must\r\n          include a readable copy of the attribution notices contained\r\n          within such NOTICE file, excluding those notices that do not\r\n          pertain to any part of the Derivative Works, in at least one\r\n          of the following places: within a NOTICE text file distributed\r\n          as part of the Derivative Works; within the Source form or\r\n          documentation, if provided along with the Derivative Works; or,\r\n          within a display generated by the Derivative Works, if and\r\n          wherever such third-party notices normally appear. The contents\r\n          of the NOTICE file are for informational purposes only and\r\n          do not modify the License. You may add Your own attribution\r\n          notices within Derivative Works that You distribute, alongside\r\n          or as an addendum to the NOTICE text from the Work, provided\r\n          that such additional attribution notices cannot be construed\r\n          as modifying the License.\r\n\r\n      You may add Your own copyright statement to Your modifications and\r\n      may provide additional or different license terms and conditions\r\n      for use, reproduction, or distribution of Your modifications, or\r\n      for any such Derivative Works as a whole, provided Your use,\r\n      reproduction, and distribution of the Work otherwise complies with\r\n      the conditions stated in this License.\r\n\r\n   5. Submission of Contributions. Unless You explicitly state otherwise,\r\n      any Contribution intentionally submitted for inclusion in the Work\r\n      by You to the Licensor shall be under the terms and conditions of\r\n      this License, without any additional terms or conditions.\r\n      Notwithstanding the above, nothing herein shall supersede or modify\r\n      the terms of any separate license agreement you may have executed\r\n      with Licensor regarding such Contributions.\r\n\r\n   6. Trademarks. This License does not grant permission to use the trade\r\n      names, trademarks, service marks, or product names of the Licensor,\r\n      except as required for reasonable and customary use in describing the\r\n      origin of the Work and reproducing the content of the NOTICE file.\r\n\r\n   7. Disclaimer of Warranty. Unless required by applicable law or\r\n      agreed to in writing, Licensor provides the Work (and each\r\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\r\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\r\n      implied, including, without limitation, any warranties or conditions\r\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\r\n      PARTICULAR PURPOSE. You are solely responsible for determining the\r\n      appropriateness of using or redistributing the Work and assume any\r\n      risks associated with Your exercise of permissions under this License.\r\n\r\n   8. Limitation of Liability. In no event and under no legal theory,\r\n      whether in tort (including negligence), contract, or otherwise,\r\n      unless required by applicable law (such as deliberate and grossly\r\n      negligent acts) or agreed to in writing, shall any Contributor be\r\n      liable to You for damages, including any direct, indirect, special,\r\n      incidental, or consequential damages of any character arising as a\r\n      result of this License or out of the use or inability to use the\r\n      Work (including but not limited to damages for loss of goodwill,\r\n      work stoppage, computer failure or malfunction, or any and all\r\n      other commercial damages or losses), even if such Contributor\r\n      has been advised of the possibility of such damages.\r\n\r\n   9. Accepting Warranty or Additional Liability. While redistributing\r\n      the Work or Derivative Works thereof, You may choose to offer,\r\n      and charge a fee for, acceptance of support, warranty, indemnity,\r\n      or other liability obligations and/or rights consistent with this\r\n      License. However, in accepting such obligations, You may act only\r\n      on Your own behalf and on Your sole responsibility, not on behalf\r\n      of any other Contributor, and only if You agree to indemnify,\r\n      defend, and hold each Contributor harmless for any liability\r\n      incurred by, or claims asserted against, such Contributor by reason\r\n      of your accepting any such warranty or additional liability.\r\n\r\n   END OF TERMS AND CONDITIONS\r\n\r\n   APPENDIX: How to apply the Apache License to your work.\r\n\r\n      To apply the Apache License to your work, attach the following\r\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\r\n      replaced with your own identifying information. (Don't include\r\n      the brackets!)  The text should be enclosed in the appropriate\r\n      comment syntax for the file format. We also recommend that a\r\n      file or class name and description of purpose be included on the\r\n      same \"printed page\" as the copyright notice for easier\r\n      identification within third-party archives.\r\n\r\n   Copyright [yyyy] [name of copyright owner]\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nnode-7z\r\nhttps://github.com/quentinrossetti/node-7z\r\n\r\nCopyright (c) 2014-2019, Quentin Rossetti <quentin.rossetti@gmail.com>\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted, provided that the above\r\ncopyright notice and this permission notice appear in all copies.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nnode-forge\r\nhttps://github.com/digitalbazaar/forge\r\n\r\nYou may use the Forge project under the terms of either the BSD License or the\r\nGNU General Public License (GPL) Version 2.\r\n\r\nThe BSD License is recommended for most projects. It is simple and easy to\r\nunderstand and it places almost no restrictions on what you can do with the\r\nForge project.\r\n\r\nIf the GPL suits your project better you are also free to use Forge under\r\nthat license.\r\n\r\nYou don't have to do anything special to choose one license or the other and\r\nyou don't have to notify anyone which license you are using. You are free to\r\nuse this project in commercial projects as long as the copyright header is\r\nleft intact.\r\n\r\nIf you are a commercial entity and use this set of libraries in your\r\ncommercial software then reasonable payment to Digital Bazaar, if you can\r\nafford it, is not required but is expected and would be appreciated. If this\r\nlibrary saves you time, then it's saving you money. The cost of developing\r\nthe Forge software was on the order of several hundred hours and tens of\r\nthousands of dollars. We are attempting to strike a balance between helping\r\nthe development community while not being taken advantage of by lucrative\r\ncommercial entities for our efforts.\r\n\r\n-------------------------------------------------------------------------------\r\nNew BSD License (3-clause)\r\nCopyright (c) 2010, Digital Bazaar, Inc.\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n    * Redistributions of source code must retain the above copyright\r\n      notice, this list of conditions and the following disclaimer.\r\n    * Redistributions in binary form must reproduce the above copyright\r\n      notice, this list of conditions and the following disclaimer in the\r\n      documentation and/or other materials provided with the distribution.\r\n    * Neither the name of Digital Bazaar, Inc. nor the\r\n      names of its contributors may be used to endorse or promote products\r\n      derived from this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\nDISCLAIMED. IN NO EVENT SHALL DIGITAL BAZAAR BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n-------------------------------------------------------------------------------\r\n        GNU GENERAL PUBLIC LICENSE\r\n           Version 2, June 1991\r\n\r\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.\r\n 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n Everyone is permitted to copy and distribute verbatim copies\r\n of this license document, but changing it is not allowed.\r\n\r\n          Preamble\r\n\r\n  The licenses for most software are designed to take away your\r\nfreedom to share and change it.  By contrast, the GNU General Public\r\nLicense is intended to guarantee your freedom to share and change free\r\nsoftware--to make sure the software is free for all its users.  This\r\nGeneral Public License applies to most of the Free Software\r\nFoundation's software and to any other program whose authors commit to\r\nusing it.  (Some other Free Software Foundation software is covered by\r\nthe GNU Lesser General Public License instead.)  You can apply it to\r\nyour programs, too.\r\n\r\n  When we speak of free software, we are referring to freedom, not\r\nprice.  Our General Public Licenses are designed to make sure that you\r\nhave the freedom to distribute copies of free software (and charge for\r\nthis service if you wish), that you receive source code or can get it\r\nif you want it, that you can change the software or use pieces of it\r\nin new free programs; and that you know you can do these things.\r\n\r\n  To protect your rights, we need to make restrictions that forbid\r\nanyone to deny you these rights or to ask you to surrender the rights.\r\nThese restrictions translate to certain responsibilities for you if you\r\ndistribute copies of the software, or if you modify it.\r\n\r\n  For example, if you distribute copies of such a program, whether\r\ngratis or for a fee, you must give the recipients all the rights that\r\nyou have.  You must make sure that they, too, receive or can get the\r\nsource code.  And you must show them these terms so they know their\r\nrights.\r\n\r\n  We protect your rights with two steps: (1) copyright the software, and\r\n(2) offer you this license which gives you legal permission to copy,\r\ndistribute and/or modify the software.\r\n\r\n  Also, for each author's protection and ours, we want to make certain\r\nthat everyone understands that there is no warranty for this free\r\nsoftware.  If the software is modified by someone else and passed on, we\r\nwant its recipients to know that what they have is not the original, so\r\nthat any problems introduced by others will not reflect on the original\r\nauthors' reputations.\r\n\r\n  Finally, any free program is threatened constantly by software\r\npatents.  We wish to avoid the danger that redistributors of a free\r\nprogram will individually obtain patent licenses, in effect making the\r\nprogram proprietary.  To prevent this, we have made it clear that any\r\npatent must be licensed for everyone's free use or not licensed at all.\r\n\r\n  The precise terms and conditions for copying, distribution and\r\nmodification follow.\r\n\r\n        GNU GENERAL PUBLIC LICENSE\r\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r\n\r\n  0. This License applies to any program or other work which contains\r\na notice placed by the copyright holder saying it may be distributed\r\nunder the terms of this General Public License.  The \"Program\", below,\r\nrefers to any such program or work, and a \"work based on the Program\"\r\nmeans either the Program or any derivative work under copyright law:\r\nthat is to say, a work containing the Program or a portion of it,\r\neither verbatim or with modifications and/or translated into another\r\nlanguage.  (Hereinafter, translation is included without limitation in\r\nthe term \"modification\".)  Each licensee is addressed as \"you\".\r\n\r\nActivities other than copying, distribution and modification are not\r\ncovered by this License; they are outside its scope.  The act of\r\nrunning the Program is not restricted, and the output from the Program\r\nis covered only if its contents constitute a work based on the\r\nProgram (independent of having been made by running the Program).\r\nWhether that is true depends on what the Program does.\r\n\r\n  1. You may copy and distribute verbatim copies of the Program's\r\nsource code as you receive it, in any medium, provided that you\r\nconspicuously and appropriately publish on each copy an appropriate\r\ncopyright notice and disclaimer of warranty; keep intact all the\r\nnotices that refer to this License and to the absence of any warranty;\r\nand give any other recipients of the Program a copy of this License\r\nalong with the Program.\r\n\r\nYou may charge a fee for the physical act of transferring a copy, and\r\nyou may at your option offer warranty protection in exchange for a fee.\r\n\r\n  2. You may modify your copy or copies of the Program or any portion\r\nof it, thus forming a work based on the Program, and copy and\r\ndistribute such modifications or work under the terms of Section 1\r\nabove, provided that you also meet all of these conditions:\r\n\r\n    a) You must cause the modified files to carry prominent notices\r\n    stating that you changed the files and the date of any change.\r\n\r\n    b) You must cause any work that you distribute or publish, that in\r\n    whole or in part contains or is derived from the Program or any\r\n    part thereof, to be licensed as a whole at no charge to all third\r\n    parties under the terms of this License.\r\n\r\n    c) If the modified program normally reads commands interactively\r\n    when run, you must cause it, when started running for such\r\n    interactive use in the most ordinary way, to print or display an\r\n    announcement including an appropriate copyright notice and a\r\n    notice that there is no warranty (or else, saying that you provide\r\n    a warranty) and that users may redistribute the program under\r\n    these conditions, and telling the user how to view a copy of this\r\n    License.  (Exception: if the Program itself is interactive but\r\n    does not normally print such an announcement, your work based on\r\n    the Program is not required to print an announcement.)\r\n\r\nThese requirements apply to the modified work as a whole.  If\r\nidentifiable sections of that work are not derived from the Program,\r\nand can be reasonably considered independent and separate works in\r\nthemselves, then this License, and its terms, do not apply to those\r\nsections when you distribute them as separate works.  But when you\r\ndistribute the same sections as part of a whole which is a work based\r\non the Program, the distribution of the whole must be on the terms of\r\nthis License, whose permissions for other licensees extend to the\r\nentire whole, and thus to each and every part regardless of who wrote it.\r\n\r\nThus, it is not the intent of this section to claim rights or contest\r\nyour rights to work written entirely by you; rather, the intent is to\r\nexercise the right to control the distribution of derivative or\r\ncollective works based on the Program.\r\n\r\nIn addition, mere aggregation of another work not based on the Program\r\nwith the Program (or with a work based on the Program) on a volume of\r\na storage or distribution medium does not bring the other work under\r\nthe scope of this License.\r\n\r\n  3. You may copy and distribute the Program (or a work based on it,\r\nunder Section 2) in object code or executable form under the terms of\r\nSections 1 and 2 above provided that you also do one of the following:\r\n\r\n    a) Accompany it with the complete corresponding machine-readable\r\n    source code, which must be distributed under the terms of Sections\r\n    1 and 2 above on a medium customarily used for software interchange; or,\r\n\r\n    b) Accompany it with a written offer, valid for at least three\r\n    years, to give any third party, for a charge no more than your\r\n    cost of physically performing source distribution, a complete\r\n    machine-readable copy of the corresponding source code, to be\r\n    distributed under the terms of Sections 1 and 2 above on a medium\r\n    customarily used for software interchange; or,\r\n\r\n    c) Accompany it with the information you received as to the offer\r\n    to distribute corresponding source code.  (This alternative is\r\n    allowed only for noncommercial distribution and only if you\r\n    received the program in object code or executable form with such\r\n    an offer, in accord with Subsection b above.)\r\n\r\nThe source code for a work means the preferred form of the work for\r\nmaking modifications to it.  For an executable work, complete source\r\ncode means all the source code for all modules it contains, plus any\r\nassociated interface definition files, plus the scripts used to\r\ncontrol compilation and installation of the executable.  However, as a\r\nspecial exception, the source code distributed need not include\r\nanything that is normally distributed (in either source or binary\r\nform) with the major components (compiler, kernel, and so on) of the\r\noperating system on which the executable runs, unless that component\r\nitself accompanies the executable.\r\n\r\nIf distribution of executable or object code is made by offering\r\naccess to copy from a designated place, then offering equivalent\r\naccess to copy the source code from the same place counts as\r\ndistribution of the source code, even though third parties are not\r\ncompelled to copy the source along with the object code.\r\n\r\n  4. You may not copy, modify, sublicense, or distribute the Program\r\nexcept as expressly provided under this License.  Any attempt\r\notherwise to copy, modify, sublicense or distribute the Program is\r\nvoid, and will automatically terminate your rights under this License.\r\nHowever, parties who have received copies, or rights, from you under\r\nthis License will not have their licenses terminated so long as such\r\nparties remain in full compliance.\r\n\r\n  5. You are not required to accept this License, since you have not\r\nsigned it.  However, nothing else grants you permission to modify or\r\ndistribute the Program or its derivative works.  These actions are\r\nprohibited by law if you do not accept this License.  Therefore, by\r\nmodifying or distributing the Program (or any work based on the\r\nProgram), you indicate your acceptance of this License to do so, and\r\nall its terms and conditions for copying, distributing or modifying\r\nthe Program or works based on it.\r\n\r\n  6. Each time you redistribute the Program (or any work based on the\r\nProgram), the recipient automatically receives a license from the\r\noriginal licensor to copy, distribute or modify the Program subject to\r\nthese terms and conditions.  You may not impose any further\r\nrestrictions on the recipients' exercise of the rights granted herein.\r\nYou are not responsible for enforcing compliance by third parties to\r\nthis License.\r\n\r\n  7. If, as a consequence of a court judgment or allegation of patent\r\ninfringement or for any other reason (not limited to patent issues),\r\nconditions are imposed on you (whether by court order, agreement or\r\notherwise) that contradict the conditions of this License, they do not\r\nexcuse you from the conditions of this License.  If you cannot\r\ndistribute so as to satisfy simultaneously your obligations under this\r\nLicense and any other pertinent obligations, then as a consequence you\r\nmay not distribute the Program at all.  For example, if a patent\r\nlicense would not permit royalty-free redistribution of the Program by\r\nall those who receive copies directly or indirectly through you, then\r\nthe only way you could satisfy both it and this License would be to\r\nrefrain entirely from distribution of the Program.\r\n\r\nIf any portion of this section is held invalid or unenforceable under\r\nany particular circumstance, the balance of the section is intended to\r\napply and the section as a whole is intended to apply in other\r\ncircumstances.\r\n\r\nIt is not the purpose of this section to induce you to infringe any\r\npatents or other property right claims or to contest validity of any\r\nsuch claims; this section has the sole purpose of protecting the\r\nintegrity of the free software distribution system, which is\r\nimplemented by public license practices.  Many people have made\r\ngenerous contributions to the wide range of software distributed\r\nthrough that system in reliance on consistent application of that\r\nsystem; it is up to the author/donor to decide if he or she is willing\r\nto distribute software through any other system and a licensee cannot\r\nimpose that choice.\r\n\r\nThis section is intended to make thoroughly clear what is believed to\r\nbe a consequence of the rest of this License.\r\n\r\n  8. If the distribution and/or use of the Program is restricted in\r\ncertain countries either by patents or by copyrighted interfaces, the\r\noriginal copyright holder who places the Program under this License\r\nmay add an explicit geographical distribution limitation excluding\r\nthose countries, so that distribution is permitted only in or among\r\ncountries not thus excluded.  In such case, this License incorporates\r\nthe limitation as if written in the body of this License.\r\n\r\n  9. The Free Software Foundation may publish revised and/or new versions\r\nof the General Public License from time to time.  Such new versions will\r\nbe similar in spirit to the present version, but may differ in detail to\r\naddress new problems or concerns.\r\n\r\nEach version is given a distinguishing version number.  If the Program\r\nspecifies a version number of this License which applies to it and \"any\r\nlater version\", you have the option of following the terms and conditions\r\neither of that version or of any later version published by the Free\r\nSoftware Foundation.  If the Program does not specify a version number of\r\nthis License, you may choose any version ever published by the Free Software\r\nFoundation.\r\n\r\n  10. If you wish to incorporate parts of the Program into other free\r\nprograms whose distribution conditions are different, write to the author\r\nto ask for permission.  For software which is copyrighted by the Free\r\nSoftware Foundation, write to the Free Software Foundation; we sometimes\r\nmake exceptions for this.  Our decision will be guided by the two goals\r\nof preserving the free status of all derivatives of our free software and\r\nof promoting the sharing and reuse of software generally.\r\n\r\n          NO WARRANTY\r\n\r\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\r\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\r\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\r\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\r\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\r\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\r\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\r\nREPAIR OR CORRECTION.\r\n\r\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\r\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\r\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\r\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\r\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\r\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\r\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\r\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\r\nPOSSIBILITY OF SUCH DAMAGES.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nnode-stream-zip\r\nhttps://github.com/antelle/node-stream-zip\r\n\r\nCopyright (c) 2021 Antelle https://github.com/antelle\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining\r\na copy of this software and associated documentation files (the\r\n\"Software\"), to deal in the Software without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Software, and to\r\npermit persons to whom the Software is furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n== dependency license: adm-zip ==\r\n\r\nCopyright (c) 2012 Another-D-Mention Software and other contributors, \r\nhttp://www.another-d-mention.ro/\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining\r\na copy of this software and associated documentation files (the\r\n\"Software\"), to deal in the Software without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Software, and to\r\npermit persons to whom the Software is furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nnplayer\r\nhttps://github.com/woopen/nplayer\r\n\r\nNO LICENSE CONTENT, USE MIT GENERIC RULES\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nnpminstall\r\nhttps://github.com/cnpm/npminstall\r\n\r\nThis software is licensed under the MIT License.\r\n\r\nCopyright (c) 2016-present cnpm and other contributors\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nopenai\r\nhttps://github.com/openai/openai-node\r\n\r\nApache License\r\n                           Version 2.0, January 2004\r\n                        http://www.apache.org/licenses/\r\n\r\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\r\n\r\n   1. Definitions.\r\n\r\n      \"License\" shall mean the terms and conditions for use, reproduction,\r\n      and distribution as defined by Sections 1 through 9 of this document.\r\n\r\n      \"Licensor\" shall mean the copyright owner or entity authorized by\r\n      the copyright owner that is granting the License.\r\n\r\n      \"Legal Entity\" shall mean the union of the acting entity and all\r\n      other entities that control, are controlled by, or are under common\r\n      control with that entity. For the purposes of this definition,\r\n      \"control\" means (i) the power, direct or indirect, to cause the\r\n      direction or management of such entity, whether by contract or\r\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\r\n      outstanding shares, or (iii) beneficial ownership of such entity.\r\n\r\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\r\n      exercising permissions granted by this License.\r\n\r\n      \"Source\" form shall mean the preferred form for making modifications,\r\n      including but not limited to software source code, documentation\r\n      source, and configuration files.\r\n\r\n      \"Object\" form shall mean any form resulting from mechanical\r\n      transformation or translation of a Source form, including but\r\n      not limited to compiled object code, generated documentation,\r\n      and conversions to other media types.\r\n\r\n      \"Work\" shall mean the work of authorship, whether in Source or\r\n      Object form, made available under the License, as indicated by a\r\n      copyright notice that is included in or attached to the work\r\n      (an example is provided in the Appendix below).\r\n\r\n      \"Derivative Works\" shall mean any work, whether in Source or Object\r\n      form, that is based on (or derived from) the Work and for which the\r\n      editorial revisions, annotations, elaborations, or other modifications\r\n      represent, as a whole, an original work of authorship. For the purposes\r\n      of this License, Derivative Works shall not include works that remain\r\n      separable from, or merely link (or bind by name) to the interfaces of,\r\n      the Work and Derivative Works thereof.\r\n\r\n      \"Contribution\" shall mean any work of authorship, including\r\n      the original version of the Work and any modifications or additions\r\n      to that Work or Derivative Works thereof, that is intentionally\r\n      submitted to Licensor for inclusion in the Work by the copyright owner\r\n      or by an individual or Legal Entity authorized to submit on behalf of\r\n      the copyright owner. For the purposes of this definition, \"submitted\"\r\n      means any form of electronic, verbal, or written communication sent\r\n      to the Licensor or its representatives, including but not limited to\r\n      communication on electronic mailing lists, source code control systems,\r\n      and issue tracking systems that are managed by, or on behalf of, the\r\n      Licensor for the purpose of discussing and improving the Work, but\r\n      excluding communication that is conspicuously marked or otherwise\r\n      designated in writing by the copyright owner as \"Not a Contribution.\"\r\n\r\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\r\n      on behalf of whom a Contribution has been received by Licensor and\r\n      subsequently incorporated within the Work.\r\n\r\n   2. Grant of Copyright License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      copyright license to reproduce, prepare Derivative Works of,\r\n      publicly display, publicly perform, sublicense, and distribute the\r\n      Work and such Derivative Works in Source or Object form.\r\n\r\n   3. Grant of Patent License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      (except as stated in this section) patent license to make, have made,\r\n      use, offer to sell, sell, import, and otherwise transfer the Work,\r\n      where such license applies only to those patent claims licensable\r\n      by such Contributor that are necessarily infringed by their\r\n      Contribution(s) alone or by combination of their Contribution(s)\r\n      with the Work to which such Contribution(s) was submitted. If You\r\n      institute patent litigation against any entity (including a\r\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\r\n      or a Contribution incorporated within the Work constitutes direct\r\n      or contributory patent infringement, then any patent licenses\r\n      granted to You under this License for that Work shall terminate\r\n      as of the date such litigation is filed.\r\n\r\n   4. Redistribution. You may reproduce and distribute copies of the\r\n      Work or Derivative Works thereof in any medium, with or without\r\n      modifications, and in Source or Object form, provided that You\r\n      meet the following conditions:\r\n\r\n      (a) You must give any other recipients of the Work or\r\n          Derivative Works a copy of this License; and\r\n\r\n      (b) You must cause any modified files to carry prominent notices\r\n          stating that You changed the files; and\r\n\r\n      (c) You must retain, in the Source form of any Derivative Works\r\n          that You distribute, all copyright, patent, trademark, and\r\n          attribution notices from the Source form of the Work,\r\n          excluding those notices that do not pertain to any part of\r\n          the Derivative Works; and\r\n\r\n      (d) If the Work includes a \"NOTICE\" text file as part of its\r\n          distribution, then any Derivative Works that You distribute must\r\n          include a readable copy of the attribution notices contained\r\n          within such NOTICE file, excluding those notices that do not\r\n          pertain to any part of the Derivative Works, in at least one\r\n          of the following places: within a NOTICE text file distributed\r\n          as part of the Derivative Works; within the Source form or\r\n          documentation, if provided along with the Derivative Works; or,\r\n          within a display generated by the Derivative Works, if and\r\n          wherever such third-party notices normally appear. The contents\r\n          of the NOTICE file are for informational purposes only and\r\n          do not modify the License. You may add Your own attribution\r\n          notices within Derivative Works that You distribute, alongside\r\n          or as an addendum to the NOTICE text from the Work, provided\r\n          that such additional attribution notices cannot be construed\r\n          as modifying the License.\r\n\r\n      You may add Your own copyright statement to Your modifications and\r\n      may provide additional or different license terms and conditions\r\n      for use, reproduction, or distribution of Your modifications, or\r\n      for any such Derivative Works as a whole, provided Your use,\r\n      reproduction, and distribution of the Work otherwise complies with\r\n      the conditions stated in this License.\r\n\r\n   5. Submission of Contributions. Unless You explicitly state otherwise,\r\n      any Contribution intentionally submitted for inclusion in the Work\r\n      by You to the Licensor shall be under the terms and conditions of\r\n      this License, without any additional terms or conditions.\r\n      Notwithstanding the above, nothing herein shall supersede or modify\r\n      the terms of any separate license agreement you may have executed\r\n      with Licensor regarding such Contributions.\r\n\r\n   6. Trademarks. This License does not grant permission to use the trade\r\n      names, trademarks, service marks, or product names of the Licensor,\r\n      except as required for reasonable and customary use in describing the\r\n      origin of the Work and reproducing the content of the NOTICE file.\r\n\r\n   7. Disclaimer of Warranty. Unless required by applicable law or\r\n      agreed to in writing, Licensor provides the Work (and each\r\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\r\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\r\n      implied, including, without limitation, any warranties or conditions\r\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\r\n      PARTICULAR PURPOSE. You are solely responsible for determining the\r\n      appropriateness of using or redistributing the Work and assume any\r\n      risks associated with Your exercise of permissions under this License.\r\n\r\n   8. Limitation of Liability. In no event and under no legal theory,\r\n      whether in tort (including negligence), contract, or otherwise,\r\n      unless required by applicable law (such as deliberate and grossly\r\n      negligent acts) or agreed to in writing, shall any Contributor be\r\n      liable to You for damages, including any direct, indirect, special,\r\n      incidental, or consequential damages of any character arising as a\r\n      result of this License or out of the use or inability to use the\r\n      Work (including but not limited to damages for loss of goodwill,\r\n      work stoppage, computer failure or malfunction, or any and all\r\n      other commercial damages or losses), even if such Contributor\r\n      has been advised of the possibility of such damages.\r\n\r\n   9. Accepting Warranty or Additional Liability. While redistributing\r\n      the Work or Derivative Works thereof, You may choose to offer,\r\n      and charge a fee for, acceptance of support, warranty, indemnity,\r\n      or other liability obligations and/or rights consistent with this\r\n      License. However, in accepting such obligations, You may act only\r\n      on Your own behalf and on Your sole responsibility, not on behalf\r\n      of any other Contributor, and only if You agree to indemnify,\r\n      defend, and hold each Contributor harmless for any liability\r\n      incurred by, or claims asserted against, such Contributor by reason\r\n      of your accepting any such warranty or additional liability.\r\n\r\n   END OF TERMS AND CONDITIONS\r\n\r\n   APPENDIX: How to apply the Apache License to your work.\r\n\r\n      To apply the Apache License to your work, attach the following\r\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\r\n      replaced with your own identifying information. (Don't include\r\n      the brackets!)  The text should be enclosed in the appropriate\r\n      comment syntax for the file format. We also recommend that a\r\n      file or class name and description of purpose be included on the\r\n      same \"printed page\" as the copyright notice for easier\r\n      identification within third-party archives.\r\n\r\n   Copyright 2026 OpenAI\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nos-proxy-config\r\nhttps://github.com/httptoolkit/os-proxy-config\r\n\r\nApache License\r\n                           Version 2.0, January 2004\r\n                        http://www.apache.org/licenses/\r\n\r\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\r\n\r\n   1. Definitions.\r\n\r\n      \"License\" shall mean the terms and conditions for use, reproduction,\r\n      and distribution as defined by Sections 1 through 9 of this document.\r\n\r\n      \"Licensor\" shall mean the copyright owner or entity authorized by\r\n      the copyright owner that is granting the License.\r\n\r\n      \"Legal Entity\" shall mean the union of the acting entity and all\r\n      other entities that control, are controlled by, or are under common\r\n      control with that entity. For the purposes of this definition,\r\n      \"control\" means (i) the power, direct or indirect, to cause the\r\n      direction or management of such entity, whether by contract or\r\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\r\n      outstanding shares, or (iii) beneficial ownership of such entity.\r\n\r\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\r\n      exercising permissions granted by this License.\r\n\r\n      \"Source\" form shall mean the preferred form for making modifications,\r\n      including but not limited to software source code, documentation\r\n      source, and configuration files.\r\n\r\n      \"Object\" form shall mean any form resulting from mechanical\r\n      transformation or translation of a Source form, including but\r\n      not limited to compiled object code, generated documentation,\r\n      and conversions to other media types.\r\n\r\n      \"Work\" shall mean the work of authorship, whether in Source or\r\n      Object form, made available under the License, as indicated by a\r\n      copyright notice that is included in or attached to the work\r\n      (an example is provided in the Appendix below).\r\n\r\n      \"Derivative Works\" shall mean any work, whether in Source or Object\r\n      form, that is based on (or derived from) the Work and for which the\r\n      editorial revisions, annotations, elaborations, or other modifications\r\n      represent, as a whole, an original work of authorship. For the purposes\r\n      of this License, Derivative Works shall not include works that remain\r\n      separable from, or merely link (or bind by name) to the interfaces of,\r\n      the Work and Derivative Works thereof.\r\n\r\n      \"Contribution\" shall mean any work of authorship, including\r\n      the original version of the Work and any modifications or additions\r\n      to that Work or Derivative Works thereof, that is intentionally\r\n      submitted to Licensor for inclusion in the Work by the copyright owner\r\n      or by an individual or Legal Entity authorized to submit on behalf of\r\n      the copyright owner. For the purposes of this definition, \"submitted\"\r\n      means any form of electronic, verbal, or written communication sent\r\n      to the Licensor or its representatives, including but not limited to\r\n      communication on electronic mailing lists, source code control systems,\r\n      and issue tracking systems that are managed by, or on behalf of, the\r\n      Licensor for the purpose of discussing and improving the Work, but\r\n      excluding communication that is conspicuously marked or otherwise\r\n      designated in writing by the copyright owner as \"Not a Contribution.\"\r\n\r\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\r\n      on behalf of whom a Contribution has been received by Licensor and\r\n      subsequently incorporated within the Work.\r\n\r\n   2. Grant of Copyright License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      copyright license to reproduce, prepare Derivative Works of,\r\n      publicly display, publicly perform, sublicense, and distribute the\r\n      Work and such Derivative Works in Source or Object form.\r\n\r\n   3. Grant of Patent License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      (except as stated in this section) patent license to make, have made,\r\n      use, offer to sell, sell, import, and otherwise transfer the Work,\r\n      where such license applies only to those patent claims licensable\r\n      by such Contributor that are necessarily infringed by their\r\n      Contribution(s) alone or by combination of their Contribution(s)\r\n      with the Work to which such Contribution(s) was submitted. If You\r\n      institute patent litigation against any entity (including a\r\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\r\n      or a Contribution incorporated within the Work constitutes direct\r\n      or contributory patent infringement, then any patent licenses\r\n      granted to You under this License for that Work shall terminate\r\n      as of the date such litigation is filed.\r\n\r\n   4. Redistribution. You may reproduce and distribute copies of the\r\n      Work or Derivative Works thereof in any medium, with or without\r\n      modifications, and in Source or Object form, provided that You\r\n      meet the following conditions:\r\n\r\n      (a) You must give any other recipients of the Work or\r\n          Derivative Works a copy of this License; and\r\n\r\n      (b) You must cause any modified files to carry prominent notices\r\n          stating that You changed the files; and\r\n\r\n      (c) You must retain, in the Source form of any Derivative Works\r\n          that You distribute, all copyright, patent, trademark, and\r\n          attribution notices from the Source form of the Work,\r\n          excluding those notices that do not pertain to any part of\r\n          the Derivative Works; and\r\n\r\n      (d) If the Work includes a \"NOTICE\" text file as part of its\r\n          distribution, then any Derivative Works that You distribute must\r\n          include a readable copy of the attribution notices contained\r\n          within such NOTICE file, excluding those notices that do not\r\n          pertain to any part of the Derivative Works, in at least one\r\n          of the following places: within a NOTICE text file distributed\r\n          as part of the Derivative Works; within the Source form or\r\n          documentation, if provided along with the Derivative Works; or,\r\n          within a display generated by the Derivative Works, if and\r\n          wherever such third-party notices normally appear. The contents\r\n          of the NOTICE file are for informational purposes only and\r\n          do not modify the License. You may add Your own attribution\r\n          notices within Derivative Works that You distribute, alongside\r\n          or as an addendum to the NOTICE text from the Work, provided\r\n          that such additional attribution notices cannot be construed\r\n          as modifying the License.\r\n\r\n      You may add Your own copyright statement to Your modifications and\r\n      may provide additional or different license terms and conditions\r\n      for use, reproduction, or distribution of Your modifications, or\r\n      for any such Derivative Works as a whole, provided Your use,\r\n      reproduction, and distribution of the Work otherwise complies with\r\n      the conditions stated in this License.\r\n\r\n   5. Submission of Contributions. Unless You explicitly state otherwise,\r\n      any Contribution intentionally submitted for inclusion in the Work\r\n      by You to the Licensor shall be under the terms and conditions of\r\n      this License, without any additional terms or conditions.\r\n      Notwithstanding the above, nothing herein shall supersede or modify\r\n      the terms of any separate license agreement you may have executed\r\n      with Licensor regarding such Contributions.\r\n\r\n   6. Trademarks. This License does not grant permission to use the trade\r\n      names, trademarks, service marks, or product names of the Licensor,\r\n      except as required for reasonable and customary use in describing the\r\n      origin of the Work and reproducing the content of the NOTICE file.\r\n\r\n   7. Disclaimer of Warranty. Unless required by applicable law or\r\n      agreed to in writing, Licensor provides the Work (and each\r\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\r\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\r\n      implied, including, without limitation, any warranties or conditions\r\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\r\n      PARTICULAR PURPOSE. You are solely responsible for determining the\r\n      appropriateness of using or redistributing the Work and assume any\r\n      risks associated with Your exercise of permissions under this License.\r\n\r\n   8. Limitation of Liability. In no event and under no legal theory,\r\n      whether in tort (including negligence), contract, or otherwise,\r\n      unless required by applicable law (such as deliberate and grossly\r\n      negligent acts) or agreed to in writing, shall any Contributor be\r\n      liable to You for damages, including any direct, indirect, special,\r\n      incidental, or consequential damages of any character arising as a\r\n      result of this License or out of the use or inability to use the\r\n      Work (including but not limited to damages for loss of goodwill,\r\n      work stoppage, computer failure or malfunction, or any and all\r\n      other commercial damages or losses), even if such Contributor\r\n      has been advised of the possibility of such damages.\r\n\r\n   9. Accepting Warranty or Additional Liability. While redistributing\r\n      the Work or Derivative Works thereof, You may choose to offer,\r\n      and charge a fee for, acceptance of support, warranty, indemnity,\r\n      or other liability obligations and/or rights consistent with this\r\n      License. However, in accepting such obligations, You may act only\r\n      on Your own behalf and on Your sole responsibility, not on behalf\r\n      of any other Contributor, and only if You agree to indemnify,\r\n      defend, and hold each Contributor harmless for any liability\r\n      incurred by, or claims asserted against, such Contributor by reason\r\n      of your accepting any such warranty or additional liability.\r\n\r\n   END OF TERMS AND CONDITIONS\r\n\r\n   APPENDIX: How to apply the Apache License to your work.\r\n\r\n      To apply the Apache License to your work, attach the following\r\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\r\n      replaced with your own identifying information. (Don't include\r\n      the brackets!)  The text should be enclosed in the appropriate\r\n      comment syntax for the file format. We also recommend that a\r\n      file or class name and description of purpose be included on the\r\n      same \"printed page\" as the copyright notice for easier\r\n      identification within third-party archives.\r\n\r\n   Copyright [yyyy] [name of copyright owner]\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\np-queue\r\nhttps://github.com/sindresorhus/p-queue\r\n\r\nMIT License\r\n\r\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\npako\r\nhttps://github.com/nodeca/pako\r\n\r\n(The MIT License)\r\n\r\nCopyright (C) 2014-2017 by Vitaly Puzrin and Andrei Tuputcyn\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\npinia-shared-state\r\nhttps://github.com/wobsoriano/pinia-shared-state\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2022 Robert Soriano\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\npinia\r\nhttps://github.com/vuejs/pinia\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2019-present Eduardo San Martin Morote\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\npostcss-html\r\nhttps://github.com/ota-meshi/postcss-html\r\n\r\nMIT License\r\n\r\nCopyright (c) 2018 刘祺\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\npostcss-less\r\nhttps://github.com/shellscape/postcss-less\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2013 Andrey Sitnik <andrey@sitnik.ru>\r\nCopyright (c) 2016 Denys Kniazevych <webschik@gmail.com>\r\nCopyright (c) 2016 Pat Sissons <patricksissons@gmail.com>\r\nCopyright (c) 2017 Andrew Powell <andrew@shellscape.org>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nprotobufjs\r\nhttps://github.com/protobufjs/protobuf.js\r\n\r\nThis license applies to all parts of protobuf.js except those files\r\neither explicitly including or referencing a different license or\r\nlocated in a directory containing a different LICENSE file.\r\n\r\n---\r\n\r\nCopyright (c) 2016, Daniel Wirtz  All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are\r\nmet:\r\n\r\n* Redistributions of source code must retain the above copyright\r\n  notice, this list of conditions and the following disclaimer.\r\n* Redistributions in binary form must reproduce the above copyright\r\n  notice, this list of conditions and the following disclaimer in the\r\n  documentation and/or other materials provided with the distribution.\r\n* Neither the name of its author, nor the names of its contributors\r\n  may be used to endorse or promote products derived from this software\r\n  without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n---\r\n\r\nCode generated by the command line utilities is owned by the owner\r\nof the input file used when generating it. This code is not\r\nstandalone and requires a support library to be linked with it. This\r\nsupport library is itself covered by the above license.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nproxy-agent\r\nhttps://github.com/TooTallNate/proxy-agents\r\n\r\n(The MIT License)\r\n\r\nCopyright (c) 2013 Nathan Rajlich <nathan@tootallnate.net>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining\r\na copy of this software and associated documentation files (the\r\n'Software'), to deal in the Software without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Software, and to\r\npermit persons to whom the Software is furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\npuppeteer-core\r\nhttps://github.com/puppeteer/puppeteer/tree/main/packages/puppeteer-core\r\n\r\nNO LICENSE CONTENT, USE Apache-2.0 GENERIC RULES\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\npuppeteer-in-electron\r\nhttps://github.com/TrevorSundberg/puppeteer-in-electron\r\n\r\nMIT License\r\n\r\nCopyright (c) 2019 TrevorSundberg\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nqs\r\nhttps://github.com/ljharb/qs\r\n\r\nBSD 3-Clause License\r\n\r\nCopyright (c) 2014, Nathan LaFreniere and other [contributors](https://github.com/ljharb/qs/graphs/contributors)\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n1. Redistributions of source code must retain the above copyright notice, this\r\n   list of conditions and the following disclaimer.\r\n\r\n2. Redistributions in binary form must reproduce the above copyright notice,\r\n   this list of conditions and the following disclaimer in the documentation\r\n   and/or other materials provided with the distribution.\r\n\r\n3. Neither the name of the copyright holder nor the names of its\r\n   contributors may be used to endorse or promote products derived from\r\n   this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nrollup-plugin-visualizer\r\nhttps://github.com/btd/rollup-plugin-visualizer\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2016 Denis Bardadym\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nsemver\r\nhttps://github.com/npm/node-semver\r\n\r\nThe ISC License\r\n\r\nCopyright (c) Isaac Z. Schlueter and Contributors\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted, provided that the above\r\ncopyright notice and this permission notice appear in all copies.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\r\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nsm-crypto-v2\r\nhttps://github.com/Cubelrti/sm-crypto-v2\r\n\r\nNO LICENSE CONTENT, USE MIT GENERIC RULES\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nspdx-satisfies\r\nhttps://github.com/kemitchell/spdx-satisfies.js\r\n\r\nThe MIT License\r\n\r\nCopyright (c) spdx-satisfies.js contributors\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a\r\ncopy of this software and associated documentation files (the \"Software\"),\r\nto deal in the Software without restriction, including without limitation\r\nthe rights to use, copy, modify, merge, publish, distribute, sublicense,\r\nand/or sell copies of the Software, and to permit persons to whom the\r\nSoftware is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included\r\nin all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\nTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR\r\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\r\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\r\nOTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nsplitpanes\r\nhttps://github.com/antoniandre/splitpanes\r\n\r\nMIT License\r\n\r\nCopyright (c) 2018 Antoni Andre\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nsync-fetch\r\nhttps://github.com/larsgw/sync-fetch\r\n\r\nMIT License\r\n\r\nCopyright (c) 2019 Lars Willighagen\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nsync-request\r\nhttps://github.com/ForbesLindesay/sync-request\r\n\r\nCopyright (c) 2014 Forbes Lindesay\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\ntar\r\nhttps://github.com/isaacs/node-tar\r\n\r\n# Blue Oak Model License\r\n\r\nVersion 1.0.0\r\n\r\n## Purpose\r\n\r\nThis license gives everyone as much permission to work with\r\nthis software as possible, while protecting contributors\r\nfrom liability.\r\n\r\n## Acceptance\r\n\r\nIn order to receive this license, you must agree to its\r\nrules.  The rules of this license are both obligations\r\nunder that agreement and conditions to your license.\r\nYou must not do anything with this software that triggers\r\na rule that you cannot or will not follow.\r\n\r\n## Copyright\r\n\r\nEach contributor licenses you to do everything with this\r\nsoftware that would otherwise infringe that contributor's\r\ncopyright in it.\r\n\r\n## Notices\r\n\r\nYou must ensure that everyone who gets a copy of\r\nany part of this software from you, with or without\r\nchanges, also gets the text of this license or a link to\r\n<https://blueoakcouncil.org/license/1.0.0>.\r\n\r\n## Excuse\r\n\r\nIf anyone notifies you in writing that you have not\r\ncomplied with [Notices](#notices), you can keep your\r\nlicense by taking all practical steps to comply within 30\r\ndays after the notice.  If you do not do so, your license\r\nends immediately.\r\n\r\n## Patent\r\n\r\nEach contributor licenses you to do everything with this\r\nsoftware that would otherwise infringe any patent claims\r\nthey can license or become able to license.\r\n\r\n## Reliability\r\n\r\nNo contributor can revoke this license.\r\n\r\n## No Liability\r\n\r\n***As far as the law allows, this software comes as is,\r\nwithout any warranty or condition, and no contributor\r\nwill be liable to anyone for any damages related to this\r\nsoftware or this license, under any kind of legal claim.***\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\ntdesign-icons-vue-next\r\nhttps://github.com/Tencent/tdesign-icons\r\n\r\nMIT License\r\n\r\nCopyright (c) 2021-present TDesign\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\ntdesign-vue-next\r\nhttps://github.com/Tencent/tdesign-vue-next\r\n\r\nMIT License\r\n\r\nCopyright (c) 2021-present TDesign\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\ntldts\r\nhttps://github.com/remusao/tldts\r\n\r\nCopyright (c) 2017 Thomas Parisot, 2018 Rémi Berson\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and\r\nassociated documentation files (the \"Software\"), to deal in the Software without restriction,\r\nincluding without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,\r\nand/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,\r\nsubject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r\n WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\ntokenx\r\nhttps://github.com/johannschopplich/tokenx\r\n\r\nMIT License\r\n\r\nCopyright (c) 2023-PRESENT Johann Schopplich\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nturndown\r\nhttps://github.com/mixmark-io/turndown\r\n\r\nMIT License\r\n\r\nCopyright (c) 2017 Dom Christie\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nundici\r\nhttps://github.com/nodejs/undici\r\n\r\nMIT License\r\n\r\nCopyright (c) Matteo Collina and Undici contributors\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nuuid\r\nhttps://github.com/uuidjs/uuid\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2010-2020 Robert Kieffer and other contributors\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nv3-infinite-loading\r\nhttps://github.com/oumoussa98/vue3-infinite-loading\r\n\r\nNO LICENSE CONTENT, USE MIT GENERIC RULES\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nvite-svg-loader\r\nhttps://github.com/jpkleemans/vite-svg-loader\r\n\r\nMIT License\r\n\r\nCopyright (c) 2021 Jan-Paul Kleemans\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nvue-i18n\r\nhttps://github.com/intlify/vue-i18n\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2020 kazuya kawaguchi\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of\r\nthis software and associated documentation files (the \"Software\"), to deal in\r\nthe Software without restriction, including without limitation the rights to\r\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\nthe Software, and to permit persons to whom the Software is furnished to do so,\r\nsubject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nvue-router\r\nhttps://github.com/vuejs/router\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2019-present Eduardo San Martin Morote\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nvue-tsc\r\nhttps://github.com/vuejs/language-tools\r\n\r\nMIT License\r\n\r\nCopyright (c) 2021-present Johnson Chu\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nvue\r\nhttps://github.com/vuejs/core\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2018-present, Yuxi (Evan) You\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nweb-vitals\r\nhttps://github.com/GoogleChrome/web-vitals\r\n\r\nApache License\r\n                           Version 2.0, January 2004\r\n                        http://www.apache.org/licenses/\r\n\r\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\r\n\r\n   1. Definitions.\r\n\r\n      \"License\" shall mean the terms and conditions for use, reproduction,\r\n      and distribution as defined by Sections 1 through 9 of this document.\r\n\r\n      \"Licensor\" shall mean the copyright owner or entity authorized by\r\n      the copyright owner that is granting the License.\r\n\r\n      \"Legal Entity\" shall mean the union of the acting entity and all\r\n      other entities that control, are controlled by, or are under common\r\n      control with that entity. For the purposes of this definition,\r\n      \"control\" means (i) the power, direct or indirect, to cause the\r\n      direction or management of such entity, whether by contract or\r\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\r\n      outstanding shares, or (iii) beneficial ownership of such entity.\r\n\r\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\r\n      exercising permissions granted by this License.\r\n\r\n      \"Source\" form shall mean the preferred form for making modifications,\r\n      including but not limited to software source code, documentation\r\n      source, and configuration files.\r\n\r\n      \"Object\" form shall mean any form resulting from mechanical\r\n      transformation or translation of a Source form, including but\r\n      not limited to compiled object code, generated documentation,\r\n      and conversions to other media types.\r\n\r\n      \"Work\" shall mean the work of authorship, whether in Source or\r\n      Object form, made available under the License, as indicated by a\r\n      copyright notice that is included in or attached to the work\r\n      (an example is provided in the Appendix below).\r\n\r\n      \"Derivative Works\" shall mean any work, whether in Source or Object\r\n      form, that is based on (or derived from) the Work and for which the\r\n      editorial revisions, annotations, elaborations, or other modifications\r\n      represent, as a whole, an original work of authorship. For the purposes\r\n      of this License, Derivative Works shall not include works that remain\r\n      separable from, or merely link (or bind by name) to the interfaces of,\r\n      the Work and Derivative Works thereof.\r\n\r\n      \"Contribution\" shall mean any work of authorship, including\r\n      the original version of the Work and any modifications or additions\r\n      to that Work or Derivative Works thereof, that is intentionally\r\n      submitted to Licensor for inclusion in the Work by the copyright owner\r\n      or by an individual or Legal Entity authorized to submit on behalf of\r\n      the copyright owner. For the purposes of this definition, \"submitted\"\r\n      means any form of electronic, verbal, or written communication sent\r\n      to the Licensor or its representatives, including but not limited to\r\n      communication on electronic mailing lists, source code control systems,\r\n      and issue tracking systems that are managed by, or on behalf of, the\r\n      Licensor for the purpose of discussing and improving the Work, but\r\n      excluding communication that is conspicuously marked or otherwise\r\n      designated in writing by the copyright owner as \"Not a Contribution.\"\r\n\r\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\r\n      on behalf of whom a Contribution has been received by Licensor and\r\n      subsequently incorporated within the Work.\r\n\r\n   2. Grant of Copyright License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      copyright license to reproduce, prepare Derivative Works of,\r\n      publicly display, publicly perform, sublicense, and distribute the\r\n      Work and such Derivative Works in Source or Object form.\r\n\r\n   3. Grant of Patent License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      (except as stated in this section) patent license to make, have made,\r\n      use, offer to sell, sell, import, and otherwise transfer the Work,\r\n      where such license applies only to those patent claims licensable\r\n      by such Contributor that are necessarily infringed by their\r\n      Contribution(s) alone or by combination of their Contribution(s)\r\n      with the Work to which such Contribution(s) was submitted. If You\r\n      institute patent litigation against any entity (including a\r\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\r\n      or a Contribution incorporated within the Work constitutes direct\r\n      or contributory patent infringement, then any patent licenses\r\n      granted to You under this License for that Work shall terminate\r\n      as of the date such litigation is filed.\r\n\r\n   4. Redistribution. You may reproduce and distribute copies of the\r\n      Work or Derivative Works thereof in any medium, with or without\r\n      modifications, and in Source or Object form, provided that You\r\n      meet the following conditions:\r\n\r\n      (a) You must give any other recipients of the Work or\r\n          Derivative Works a copy of this License; and\r\n\r\n      (b) You must cause any modified files to carry prominent notices\r\n          stating that You changed the files; and\r\n\r\n      (c) You must retain, in the Source form of any Derivative Works\r\n          that You distribute, all copyright, patent, trademark, and\r\n          attribution notices from the Source form of the Work,\r\n          excluding those notices that do not pertain to any part of\r\n          the Derivative Works; and\r\n\r\n      (d) If the Work includes a \"NOTICE\" text file as part of its\r\n          distribution, then any Derivative Works that You distribute must\r\n          include a readable copy of the attribution notices contained\r\n          within such NOTICE file, excluding those notices that do not\r\n          pertain to any part of the Derivative Works, in at least one\r\n          of the following places: within a NOTICE text file distributed\r\n          as part of the Derivative Works; within the Source form or\r\n          documentation, if provided along with the Derivative Works; or,\r\n          within a display generated by the Derivative Works, if and\r\n          wherever such third-party notices normally appear. The contents\r\n          of the NOTICE file are for informational purposes only and\r\n          do not modify the License. You may add Your own attribution\r\n          notices within Derivative Works that You distribute, alongside\r\n          or as an addendum to the NOTICE text from the Work, provided\r\n          that such additional attribution notices cannot be construed\r\n          as modifying the License.\r\n\r\n      You may add Your own copyright statement to Your modifications and\r\n      may provide additional or different license terms and conditions\r\n      for use, reproduction, or distribution of Your modifications, or\r\n      for any such Derivative Works as a whole, provided Your use,\r\n      reproduction, and distribution of the Work otherwise complies with\r\n      the conditions stated in this License.\r\n\r\n   5. Submission of Contributions. Unless You explicitly state otherwise,\r\n      any Contribution intentionally submitted for inclusion in the Work\r\n      by You to the Licensor shall be under the terms and conditions of\r\n      this License, without any additional terms or conditions.\r\n      Notwithstanding the above, nothing herein shall supersede or modify\r\n      the terms of any separate license agreement you may have executed\r\n      with Licensor regarding such Contributions.\r\n\r\n   6. Trademarks. This License does not grant permission to use the trade\r\n      names, trademarks, service marks, or product names of the Licensor,\r\n      except as required for reasonable and customary use in describing the\r\n      origin of the Work and reproducing the content of the NOTICE file.\r\n\r\n   7. Disclaimer of Warranty. Unless required by applicable law or\r\n      agreed to in writing, Licensor provides the Work (and each\r\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\r\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\r\n      implied, including, without limitation, any warranties or conditions\r\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\r\n      PARTICULAR PURPOSE. You are solely responsible for determining the\r\n      appropriateness of using or redistributing the Work and assume any\r\n      risks associated with Your exercise of permissions under this License.\r\n\r\n   8. Limitation of Liability. In no event and under no legal theory,\r\n      whether in tort (including negligence), contract, or otherwise,\r\n      unless required by applicable law (such as deliberate and grossly\r\n      negligent acts) or agreed to in writing, shall any Contributor be\r\n      liable to You for damages, including any direct, indirect, special,\r\n      incidental, or consequential damages of any character arising as a\r\n      result of this License or out of the use or inability to use the\r\n      Work (including but not limited to damages for loss of goodwill,\r\n      work stoppage, computer failure or malfunction, or any and all\r\n      other commercial damages or losses), even if such Contributor\r\n      has been advised of the possibility of such damages.\r\n\r\n   9. Accepting Warranty or Additional Liability. While redistributing\r\n      the Work or Derivative Works thereof, You may choose to offer,\r\n      and charge a fee for, acceptance of support, warranty, indemnity,\r\n      or other liability obligations and/or rights consistent with this\r\n      License. However, in accepting such obligations, You may act only\r\n      on Your own behalf and on Your sole responsibility, not on behalf\r\n      of any other Contributor, and only if You agree to indemnify,\r\n      defend, and hold each Contributor harmless for any liability\r\n      incurred by, or claims asserted against, such Contributor by reason\r\n      of your accepting any such warranty or additional liability.\r\n\r\n   END OF TERMS AND CONDITIONS\r\n\r\n   APPENDIX: How to apply the Apache License to your work.\r\n\r\n      To apply the Apache License to your work, attach the following\r\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\r\n      replaced with your own identifying information. (Don't include\r\n      the brackets!)  The text should be enclosed in the appropriate\r\n      comment syntax for the file format. We also recommend that a\r\n      file or class name and description of purpose be included on the\r\n      same \"printed page\" as the copyright notice for easier\r\n      identification within third-party archives.\r\n\r\n   Copyright 2020 Google LLC\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       https://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nwebdav\r\nhttps://github.com/perry-mitchell/webdav-client\r\n\r\nMIT License\r\n\r\nCopyright (c) 2016 Perry Mitchell\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nwinston-daily-rotate-file\r\nhttps://github.com/winstonjs/winston-daily-rotate-file\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2015-2024 winstonjs\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nwinston\r\nhttps://github.com/winstonjs/winston\r\n\r\nCopyright (c) 2010 Charlie Robbins\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nworkerpool\r\nhttps://github.com/josdejong/workerpool\r\n\r\nApache License\r\n                           Version 2.0, January 2004\r\n                        http://www.apache.org/licenses/\r\n\r\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\r\n\r\n   1. Definitions.\r\n\r\n      \"License\" shall mean the terms and conditions for use, reproduction,\r\n      and distribution as defined by Sections 1 through 9 of this document.\r\n\r\n      \"Licensor\" shall mean the copyright owner or entity authorized by\r\n      the copyright owner that is granting the License.\r\n\r\n      \"Legal Entity\" shall mean the union of the acting entity and all\r\n      other entities that control, are controlled by, or are under common\r\n      control with that entity. For the purposes of this definition,\r\n      \"control\" means (i) the power, direct or indirect, to cause the\r\n      direction or management of such entity, whether by contract or\r\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\r\n      outstanding shares, or (iii) beneficial ownership of such entity.\r\n\r\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\r\n      exercising permissions granted by this License.\r\n\r\n      \"Source\" form shall mean the preferred form for making modifications,\r\n      including but not limited to software source code, documentation\r\n      source, and configuration files.\r\n\r\n      \"Object\" form shall mean any form resulting from mechanical\r\n      transformation or translation of a Source form, including but\r\n      not limited to compiled object code, generated documentation,\r\n      and conversions to other media types.\r\n\r\n      \"Work\" shall mean the work of authorship, whether in Source or\r\n      Object form, made available under the License, as indicated by a\r\n      copyright notice that is included in or attached to the work\r\n      (an example is provided in the Appendix below).\r\n\r\n      \"Derivative Works\" shall mean any work, whether in Source or Object\r\n      form, that is based on (or derived from) the Work and for which the\r\n      editorial revisions, annotations, elaborations, or other modifications\r\n      represent, as a whole, an original work of authorship. For the purposes\r\n      of this License, Derivative Works shall not include works that remain\r\n      separable from, or merely link (or bind by name) to the interfaces of,\r\n      the Work and Derivative Works thereof.\r\n\r\n      \"Contribution\" shall mean any work of authorship, including\r\n      the original version of the Work and any modifications or additions\r\n      to that Work or Derivative Works thereof, that is intentionally\r\n      submitted to Licensor for inclusion in the Work by the copyright owner\r\n      or by an individual or Legal Entity authorized to submit on behalf of\r\n      the copyright owner. For the purposes of this definition, \"submitted\"\r\n      means any form of electronic, verbal, or written communication sent\r\n      to the Licensor or its representatives, including but not limited to\r\n      communication on electronic mailing lists, source code control systems,\r\n      and issue tracking systems that are managed by, or on behalf of, the\r\n      Licensor for the purpose of discussing and improving the Work, but\r\n      excluding communication that is conspicuously marked or otherwise\r\n      designated in writing by the copyright owner as \"Not a Contribution.\"\r\n\r\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\r\n      on behalf of whom a Contribution has been received by Licensor and\r\n      subsequently incorporated within the Work.\r\n\r\n   2. Grant of Copyright License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      copyright license to reproduce, prepare Derivative Works of,\r\n      publicly display, publicly perform, sublicense, and distribute the\r\n      Work and such Derivative Works in Source or Object form.\r\n\r\n   3. Grant of Patent License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      (except as stated in this section) patent license to make, have made,\r\n      use, offer to sell, sell, import, and otherwise transfer the Work,\r\n      where such license applies only to those patent claims licensable\r\n      by such Contributor that are necessarily infringed by their\r\n      Contribution(s) alone or by combination of their Contribution(s)\r\n      with the Work to which such Contribution(s) was submitted. If You\r\n      institute patent litigation against any entity (including a\r\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\r\n      or a Contribution incorporated within the Work constitutes direct\r\n      or contributory patent infringement, then any patent licenses\r\n      granted to You under this License for that Work shall terminate\r\n      as of the date such litigation is filed.\r\n\r\n   4. Redistribution. You may reproduce and distribute copies of the\r\n      Work or Derivative Works thereof in any medium, with or without\r\n      modifications, and in Source or Object form, provided that You\r\n      meet the following conditions:\r\n\r\n      (a) You must give any other recipients of the Work or\r\n          Derivative Works a copy of this License; and\r\n\r\n      (b) You must cause any modified files to carry prominent notices\r\n          stating that You changed the files; and\r\n\r\n      (c) You must retain, in the Source form of any Derivative Works\r\n          that You distribute, all copyright, patent, trademark, and\r\n          attribution notices from the Source form of the Work,\r\n          excluding those notices that do not pertain to any part of\r\n          the Derivative Works; and\r\n\r\n      (d) If the Work includes a \"NOTICE\" text file as part of its\r\n          distribution, then any Derivative Works that You distribute must\r\n          include a readable copy of the attribution notices contained\r\n          within such NOTICE file, excluding those notices that do not\r\n          pertain to any part of the Derivative Works, in at least one\r\n          of the following places: within a NOTICE text file distributed\r\n          as part of the Derivative Works; within the Source form or\r\n          documentation, if provided along with the Derivative Works; or,\r\n          within a display generated by the Derivative Works, if and\r\n          wherever such third-party notices normally appear. The contents\r\n          of the NOTICE file are for informational purposes only and\r\n          do not modify the License. You may add Your own attribution\r\n          notices within Derivative Works that You distribute, alongside\r\n          or as an addendum to the NOTICE text from the Work, provided\r\n          that such additional attribution notices cannot be construed\r\n          as modifying the License.\r\n\r\n      You may add Your own copyright statement to Your modifications and\r\n      may provide additional or different license terms and conditions\r\n      for use, reproduction, or distribution of Your modifications, or\r\n      for any such Derivative Works as a whole, provided Your use,\r\n      reproduction, and distribution of the Work otherwise complies with\r\n      the conditions stated in this License.\r\n\r\n   5. Submission of Contributions. Unless You explicitly state otherwise,\r\n      any Contribution intentionally submitted for inclusion in the Work\r\n      by You to the Licensor shall be under the terms and conditions of\r\n      this License, without any additional terms or conditions.\r\n      Notwithstanding the above, nothing herein shall supersede or modify\r\n      the terms of any separate license agreement you may have executed\r\n      with Licensor regarding such Contributions.\r\n\r\n   6. Trademarks. This License does not grant permission to use the trade\r\n      names, trademarks, service marks, or product names of the Licensor,\r\n      except as required for reasonable and customary use in describing the\r\n      origin of the Work and reproducing the content of the NOTICE file.\r\n\r\n   7. Disclaimer of Warranty. Unless required by applicable law or\r\n      agreed to in writing, Licensor provides the Work (and each\r\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\r\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\r\n      implied, including, without limitation, any warranties or conditions\r\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\r\n      PARTICULAR PURPOSE. You are solely responsible for determining the\r\n      appropriateness of using or redistributing the Work and assume any\r\n      risks associated with Your exercise of permissions under this License.\r\n\r\n   8. Limitation of Liability. In no event and under no legal theory,\r\n      whether in tort (including negligence), contract, or otherwise,\r\n      unless required by applicable law (such as deliberate and grossly\r\n      negligent acts) or agreed to in writing, shall any Contributor be\r\n      liable to You for damages, including any direct, indirect, special,\r\n      incidental, or consequential damages of any character arising as a\r\n      result of this License or out of the use or inability to use the\r\n      Work (including but not limited to damages for loss of goodwill,\r\n      work stoppage, computer failure or malfunction, or any and all\r\n      other commercial damages or losses), even if such Contributor\r\n      has been advised of the possibility of such damages.\r\n\r\n   9. Accepting Warranty or Additional Liability. While redistributing\r\n      the Work or Derivative Works thereof, You may choose to offer,\r\n      and charge a fee for, acceptance of support, warranty, indemnity,\r\n      or other liability obligations and/or rights consistent with this\r\n      License. However, in accepting such obligations, You may act only\r\n      on Your own behalf and on Your sole responsibility, not on behalf\r\n      of any other Contributor, and only if You agree to indemnify,\r\n      defend, and hold each Contributor harmless for any liability\r\n      incurred by, or claims asserted against, such Contributor by reason\r\n      of your accepting any such warranty or additional liability.\r\n\r\n   END OF TERMS AND CONDITIONS\r\n\r\n   APPENDIX: How to apply the Apache License to your work.\r\n\r\n      To apply the Apache License to your work, attach the following\r\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\r\n      replaced with your own identifying information. (Don't include\r\n      the brackets!)  The text should be enclosed in the appropriate\r\n      comment syntax for the file format. We also recommend that a\r\n      file or class name and description of purpose be included on the\r\n      same \"printed page\" as the copyright notice for easier\r\n      identification within third-party archives.\r\n\r\n   Copyright (C) 2014-2025 Jos de Jong wjosdejong@gmail.com\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nws\r\nhttps://github.com/websockets/ws\r\n\r\nCopyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>\r\nCopyright (c) 2013 Arnout Kazemier and contributors\r\nCopyright (c) 2016 Luigi Pinca and contributors\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of\r\nthis software and associated documentation files (the \"Software\"), to deal in\r\nthe Software without restriction, including without limitation the rights to\r\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\nthe Software, and to permit persons to whom the Software is furnished to do so,\r\nsubject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nxgplayer-mp4\r\nhttps://github.com/bytedance/xgplayer\r\n\r\nNO LICENSE CONTENT, USE MIT GENERIC RULES\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nxgplayer-music\r\nhttps://github.com/bytedance/xgplayer\r\n\r\nNO LICENSE CONTENT, USE MIT GENERIC RULES\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nxgplayer-shaka\r\nhttps://github.com/bytedance/xgplayer\r\n\r\nNO LICENSE CONTENT, USE MIT GENERIC RULES\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nxgplayer\r\nhttps://github.com/bytedance/xgplayer\r\n\r\nNO LICENSE CONTENT, USE MIT GENERIC RULES\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nxterm-addon-search-bar\r\nN/A\r\n\r\nMIT License\r\n\r\nCopyright (c) 2018 Leo Hui\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n---------------------------------------------------------\r\n\r\n---------------------------------------------------------\r\n\r\nzeromq\r\nhttps://github.com/zeromq/zeromq.js\r\n\r\nCopyright 2019-2024 Amin Yahyaabadi\r\nCopyright 2017-2019 Rolf Timmermans\r\nCopyright 2011 TJ Holowaychuk\r\nCopyright 2010, 2011 Justin Tulloss\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of\r\nthis software and associated documentation files (the \"Software\"), to deal in\r\nthe Software without restriction, including without limitation the rights to\r\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\nthe Software, and to permit persons to whom the Software is furnished to do so,\r\nsubject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n---------------------------------------------------------\r\n\r\n"
  },
  {
    "path": "build/entitlements.mac.inherit.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>com.apple.security.app-sandbox</key>\n    <true/>\n    <key>com.apple.security.inherit</key>\n    <true/>\n  </dict>\n</plist>\n"
  },
  {
    "path": "build/entitlements.mac.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>com.apple.security.cs.allow-jit</key>\n    <true/>\n    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>\n    <true/>\n    <key>com.apple.security.cs.allow-dyld-environment-variables</key>\n    <true/>\n    <key>com.apple.security.cs.disable-library-validation</key>\n    <true/>\n  </dict>\n</plist>\n"
  },
  {
    "path": "build/nsis-installer.nsh",
    "content": ";Inspired by:\n; https://gist.github.com/bogdibota/062919938e1ed388b3db5ea31f52955c\n; https://stackoverflow.com/questions/34177547/detect-if-visual-c-redistributable-for-visual-studio-2013-is-installed\n; https://stackoverflow.com/a/54391388\n; https://github.com/GitCommons/cpp-redist-nsis/blob/main/installer.nsh\n\n;Find latests downloads here:\n; https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist\n\n!include LogicLib.nsh\n!include x64.nsh\n\n; https://github.com/electron-userland/electron-builder/issues/1122\n!ifndef BUILD_UNINSTALLER\n  ; Check VC++ Redistributable based on architecture stored in $1\n  Function checkVCRedist\n    ${If} $1 == \"arm64\"\n      ReadRegDWORD $0 HKLM \"SOFTWARE\\Microsoft\\VisualStudio\\14.0\\VC\\Runtimes\\ARM64\" \"Installed\"\n    ${Else}\n      ReadRegDWORD $0 HKLM \"SOFTWARE\\Microsoft\\VisualStudio\\14.0\\VC\\Runtimes\\x64\" \"Installed\"\n    ${EndIf}\n  FunctionEnd\n\n  Function checkArchitectureCompatibility\n    ; Initialize variables\n    StrCpy $0 \"0\"  ; Default to incompatible\n    StrCpy $1 \"\"   ; System architecture\n    StrCpy $3 \"\"   ; App architecture\n\n    ; Check system architecture using built-in NSIS functions\n    ${If} ${RunningX64}\n      ; Check if it's ARM64 by looking at processor architecture\n      ReadEnvStr $2 \"PROCESSOR_ARCHITECTURE\"\n      ReadEnvStr $4 \"PROCESSOR_ARCHITEW6432\"\n\n      ${If} $2 == \"ARM64\"\n      ${OrIf} $4 == \"ARM64\"\n        StrCpy $1 \"arm64\"\n      ${Else}\n        StrCpy $1 \"x64\"\n      ${EndIf}\n    ${Else}\n      StrCpy $1 \"x86\"\n    ${EndIf}\n\n    ; Determine app architecture based on build variables\n    !ifdef APP_ARM64_NAME\n      !ifndef APP_64_NAME\n        StrCpy $3 \"arm64\"  ; App is ARM64 only\n      !endif\n    !endif\n    !ifdef APP_64_NAME\n      !ifndef APP_ARM64_NAME\n        StrCpy $3 \"x64\"    ; App is x64 only\n      !endif\n    !endif\n    !ifdef APP_64_NAME\n      !ifdef APP_ARM64_NAME\n        StrCpy $3 \"universal\"  ; Both architectures available\n      !endif\n    !endif\n\n    ; If no architecture variables are defined, assume x64\n    ${If} $3 == \"\"\n      StrCpy $3 \"x64\"\n    ${EndIf}\n\n    ; Compare system and app architectures\n    ${If} $3 == \"universal\"\n      ; Universal build, compatible with all architectures\n      StrCpy $0 \"1\"\n    ${ElseIf} $1 == $3\n      ; Architectures match\n      StrCpy $0 \"1\"\n    ${Else}\n      ; Architectures don't match\n      StrCpy $0 \"0\"\n    ${EndIf}\n  FunctionEnd\n!endif\n\n!macro customInit\n  Push $0\n  Push $1\n  Push $2\n  Push $3\n  Push $4\n\n  ; Check architecture compatibility first\n  Call checkArchitectureCompatibility\n  ${If} $0 != \"1\"\n    MessageBox MB_ICONEXCLAMATION \"\\\n      Architecture Mismatch$\\r$\\n$\\r$\\n\\\n      This installer is not compatible with your system architecture.$\\r$\\n\\\n      Your system: $1$\\r$\\n\\\n      App architecture: $3$\\r$\\n$\\r$\\n\\\n      Please download the correct version\"\n    Abort\n  ${EndIf}\n\n  Call checkVCRedist\n  ${If} $0 != \"1\"\n    ; VC++ is required - install automatically since declining would abort anyway\n    ; Select download URL based on system architecture (stored in $1)\n    ${If} $1 == \"arm64\"\n      StrCpy $2 \"https://aka.ms/vs/17/release/vc_redist.arm64.exe\"\n      StrCpy $3 \"$TEMP\\vc_redist.arm64.exe\"\n    ${Else}\n      StrCpy $2 \"https://aka.ms/vs/17/release/vc_redist.x64.exe\"\n      StrCpy $3 \"$TEMP\\vc_redist.x64.exe\"\n    ${EndIf}\n\n    inetc::get /CAPTION \" \" /BANNER \"Downloading Microsoft Visual C++ Redistributable...\" \\\n      $2 $3 /END\n    Pop $0  ; Get download status from inetc::get\n    ${If} $0 != \"OK\"\n      MessageBox MB_ICONSTOP|MB_YESNO \"\\\n        Failed to download Microsoft Visual C++ Redistributable.$\\r$\\n$\\r$\\n\\\n        Error: $0$\\r$\\n$\\r$\\n\\\n        Would you like to open the download page in your browser?$\\r$\\n\\\n        $2\" IDYES openDownloadUrl IDNO skipDownloadUrl\n      openDownloadUrl:\n        ExecShell \"open\" $2\n      skipDownloadUrl:\n      Abort\n    ${EndIf}\n\n    ExecWait \"$3 /install /quiet /norestart\"\n    ; Note: vc_redist exit code is unreliable, verify via registry check instead\n\n    Call checkVCRedist\n    ${If} $0 != \"1\"\n      MessageBox MB_ICONSTOP|MB_YESNO \"\\\n        Microsoft Visual C++ Redistributable installation failed.$\\r$\\n$\\r$\\n\\\n        Would you like to open the download page in your browser?$\\r$\\n\\\n        $2$\\r$\\n$\\r$\\n\\\n        The installation of ${PRODUCT_NAME} cannot continue.\" IDYES openInstallUrl IDNO skipInstallUrl\n      openInstallUrl:\n        ExecShell \"open\" $2\n      skipInstallUrl:\n      Abort\n    ${EndIf}\n  ${EndIf}\n    Pop $4\n    Pop $3\n    Pop $2\n    Pop $1\n    Pop $0\n!macroend\n"
  },
  {
    "path": "commitlint.config.js",
    "content": "// commit-lint config\nexport default {\n  extends: ['@commitlint/config-conventional'],\n  rules: {\n    // @see https://commitlint.js.org/#/reference-rules\n    'type-enum': [\n      2,\n      'always',\n      ['build', 'chore', 'ci', 'docs', 'feat', 'fix', 'perf', 'refactor', 'revert', 'style', 'test', 'types'],\n    ],\n  },\n};\n"
  },
  {
    "path": "dev-app-update.yml",
    "content": "provider: github\nowner: Hiram-Wong\nrepo: zyfun\nupdaterCacheDirName: zyfun-updater\n"
  },
  {
    "path": "docs/Conventional_Commits.md",
    "content": "> 参考[Conventional Commits](https://www.conventionalcommits.org/zh-hans/v1.0.0/)\n\n## 结构\n\n提交信息由 三部分组成：\n\n1. 标题 (Header)：简洁描述此次更改内容。\n2. 正文 (Body)：详细说明更改的背景、原因、以及具体改动（可选）。\n3. 页脚 (Footer)：用于补充关联任务或备注信息（如关闭的 issue 编号或重大变更提醒）。\n\n基本格式：\n\n```plain\n<type>(<scope>): <subject>\n<BLANK LINE>\n<body>\n<BLANK LINE>\n<footer>\n```\n\n### 1. 标题格式\n\n```\n<type>(<scope>): <subject>\n```\n\n- `type` (必填)：本次提交的更改类型，明确表明变更的性质。\n- `scope` (可选)：本次变更影响的范围（模块、功能、文件等）。\n- `subject` (必填)：简要描述更改内容，控制在 50 个字符以内，语句开头小写，不加句号。\n\ntype 的取值：\n\n- `feat`：新功能（feature）。\n- `fix`：修复 bug。\n- `docs`：文档相关（如 README、注释）。\n- `style`：代码格式化（不影响代码逻辑）。\n- `refactor`：代码重构（既不修 bug 也不加功能）。\n- `perf`：性能优化。\n- `test`：增加或修改测试用例。\n- `build`：构建系统或外部依赖相关（如修改 package.json）。\n- `ci`：修改 CI 配置或脚本。\n- `chore`：不修改代码的杂务（如更改构建流程、配置文件）。\n- `revert`：回滚提交。\n\n---\n\n示例：\n\n```\nfeat(auth): 添加用户登录功能\nfix(cart): 修复购物车价格计算错误\ndocs: 更新 API 文档\nstyle: 格式化代码\nrefactor(core): 优化数据处理逻辑\n```\n\n### 2. 正文格式\n\n正文用于详细说明本次更改的背景和原因，建议包括以下内容：\n\n- 改变的动机（Why）。\n- 具体改动内容（What）。\n- 改动的影响（Impact）。\n\n书写规范：\n\n- 每行控制在 72 个字符以内。\n- 使用英文句子结构（推荐），或者简洁的中文描述。\n\n示例：\n\n```\nfix(cart): 修复购物车价格计算错误\n- 修复了当购物车有多个商品时，价格计算不正确的问题。\n- 原因是数量累加逻辑未考虑浮点数运算的精度。\n```\n\n### 3.页脚格式\n\n页脚用于补充重要信息，例如：\n\n- 关闭的 Issue：\n\n```\nCloses #123\n```\n\n- 重大变更：\n\n```\nBREAKING CHANGE: 重命名了用户认证接口 `/auth` 为 `/user/auth`。\n```\n\n- 其他备注：\n\n示例：\n\n```\nfeat(user): 添加用户注册功能\n\n实现了用户通过邮箱注册的功能，并进行了基础验证。\n未来将进一步支持手机号注册。\n\nBREAKING CHANGE: 用户模型字段 `username` 已改为 `userName`。\nCloses #45\n```\n\n### 完整示例\n\n```\nfeat(auth): 添加用户登录功能\n\n支持通过邮箱和密码登录，并返回 JWT token。\n未来版本将支持 OAuth 登录。\n\nBREAKING CHANGE: API 接口 `/api/v1/login` 改为 `/api/v2/auth/login`。\nCloses #101\n```\n\n## 使用工具强制规范\n\n1. `commitlint`：检查提交信息是否符合规范。\n2. `husky`：在提交前（如 pre-commit 或 commit-msg 阶段）自动检查提交信息。\n\n### 配置步骤：\n\n1. 安装依赖：\n\n```bash\nyarn add -D @commitlint/config-conventional @commitlint/cli husky\n```\n\n2. 创建 commitlint.config.js 文件：\n\n```js\nexport default {\n  extends: ['@commitlint/config-conventional'],\n  rules: {\n    'type-enum': [\n      2,\n      'always',\n      ['build', 'chore', 'ci', 'docs', 'feat', 'fix', 'perf', 'refactor', 'revert', 'style', 'test', 'types'],\n    ],\n  },\n};\n```\n\n3. 启用 husky 钩子：\n\n```bash\nyarn husky install\n```\n\n创建 commit-msg 钩子文件：\n\n```bash title=\".husky/commit-msg\"\n#!/bin/sh\n. \"$(dirname \"$0\")/_/husky.sh\"\n\nnpx --no-install commitlint --edit \"$1\"\n```\n\n然后使脚本可执行：\n\n```bash\nchmod +x .husky/commit-msg\n```\n\n4. 验证提交信息： 当提交的消息不符合规范时，Git 会报错并中断提交流程。\n\n使用 Angular 提交规范可以提高项目协作的效率，并为版本管理和自动化工具（如 Semantic Release）提供基础支持。\n\n> 也可以使用[simple-git-hooks](https://www.npmjs.com/package/simple-git-hooks)\n"
  },
  {
    "path": "docs/Develop.md",
    "content": "# 🖥️ Develop\n\n## IDE Setup\n\n### VSCode like\n\n- Editor: [VS Code](https://code.visualstudio.com), etc. Any VS Code compatible editor.\n- Recommended extensions are listed in [`.vscode/extensions.json`](/.vscode/extensions.json).\n\n## Project Setup\n\n### Install\n\n```bash\npnpm install\n```\n\n### Development\n\n### Setup Node.js\n\nThe required Node.js version is defined in `.node-version`. Use a version manager like [nvm](https://github.com/nvm-sh/nvm) or [fnm](https://github.com/Schniz/fnm) to install it automatically:\n\n```bash\nnvm install\n```\n\n### Setup pnpm\n\nThe pnpm version is locked in the `packageManager` field of `package.json`. Just enable corepack and it will use the correct version automatically:\n\n```bash\ncorepack enable\n```\n\n### Install Dependencies\n\n```bash\npnpm install\n```\n\n### ENV\n\n```bash\ncp .env.example .env\n```\n\n### Start\n\n```bash\npnpm dev\n```\n\n### Debug\n\n```bash\npnpm debug\n```\n\nThen input chrome://inspect in browser\n\n### Test\n\n```bash\npnpm test\n```\n\n### Build\n\n```bash\n# For windows\n$ pnpm build:win\n\n# For macOS\n$ pnpm build:mac\n\n# For Linux\n$ pnpm build:linux\n```\n"
  },
  {
    "path": "docs/HarmonyOS_Electron.md",
    "content": "# HarmonyOS Electron 快速上手指南\n\n本指南将帮助您在 30 分钟内快速上手 HarmonyOS Electron 开发。\n\n## 📋 准备清单\n\n### 开发环境\n\n- [ ] DevEco Studio 4.0+\n- [ ] HarmonyOS SDK API Level 10+\n- [ ] Node.js 16.x+\n- [ ] 鸿蒙设备或模拟器\n\n### 必需文件\n\n- [ ] Electron 应用源码或编译产物\n- [ ] 开发者证书（可选，用于签名）\n\n## 🚀 5 分钟快速开始\n\n### 步骤 1: 克隆项目\n\n```bash\ngit clone https://github.com/ohosvscode/ohos_electron_hap.git\ncd ohos_electron_hap\n```\n\n### 步骤 2: 添加 Electron 应用\n\n将您的 Electron 应用代码放入：\n\n```\nweb_engine/src/main/resources/resfile/resources/app/\n```\n\n### 步骤 3: 构建运行\n\n1. 用 DevEco Studio 打开项目\n2. 点击 **Build** → **Build Hap(s)**\n3. 点击运行按钮安装到设备\n\n🎉 **恭喜！您的第一个鸿蒙 Electron 应用已经运行起来了！**\n\n## 📖 详细配置教程\n\n### 自定义应用信息\n\n#### 修改应用名称\n\n编辑 `electron/src/main/resources/zh_CN/element/string.json`：\n\n```json\n{\n  \"string\": [\n    {\n      \"name\": \"EntryAbility_label\",\n      \"value\": \"我的鸿蒙应用\"\n    }\n  ]\n}\n```\n\n#### 替换应用图标\n\n1. 准备图标文件（建议 512x512 PNG）\n2. 替换 `AppScope/resources/base/media/app_icon.png`\n3. 重新构建应用\n\n#### 设置启动窗口\n\n编辑 `electron/src/main/module.json5`，在 abilities 中添加：\n\n```json\n\"metadata\": [\n  {\n    \"name\": \"ohos.ability.window.width\",\n    \"value\": \"1200\"\n  },\n  {\n    \"name\": \"ohos.ability.window.height\",\n    \"value\": \"800\"\n  },\n  {\n    \"name\": \"ohos.ability.window.left\",\n    \"value\": \"center\"\n  },\n  {\n    \"name\": \"ohos.ability.window.top\",\n    \"value\": \"center\"\n  }\n]\n```\n\n### 权限配置\n\n#### 基础权限（自动获得）\n\n这些权限会自动获得，无需特殊申请：\n\n- 网络访问\n- 获取网络信息\n- 后台运行\n- 读取剪贴板\n\n#### 需要申请的权限\n\n编辑 `web_engine/src/main/module.json5`，在 `requestPermissions` 中添加：\n\n```json\n{\n  \"name\": \"ohos.permission.CAMERA\",\n  \"reason\": \"$string:camera_reason\",\n  \"usedScene\": {\n    \"abilities\": [\"EntryAbility\"],\n    \"when\": \"inuse\"\n  }\n}\n```\n\n常用权限列表：\n\n- `ohos.permission.CAMERA` - 相机\n- `ohos.permission.MICROPHONE` - 麦克风\n- `ohos.permission.LOCATION` - 位置\n- `ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY` - 下载目录\n\n### 应用签名\n\n#### 申请开发者证书\n\n1. 访问 [华为开发者联盟](https://developer.huawei.com/)\n2. 注册开发者账号\n3. 申请 HarmonyOS 应用签名证书\n\n#### 配置签名\n\n1. 在 DevEco Studio 中选择 **File** → **Project Structure**\n2. 选择 **Signing Configs**\n3. 配置证书文件和密码\n4. 重新构建生成已签名 HAP\n\n## 💡 实用示例\n\n### 示例 1: 创建悬浮窗\n\n```javascript\nconst { BrowserWindow } = require('electron');\n\nfunction createFloatWindow() {\n  const floatWindow = new BrowserWindow({\n    windowInfo: {\n      type: 'floatWindow',\n    },\n    width: 400,\n    height: 300,\n    transparent: true,\n    opacity: 0.9,\n    frame: false,\n    alwaysOnTop: true,\n  });\n\n  floatWindow.loadURL('https://www.example.com');\n  return floatWindow;\n}\n```\n\n### 示例 2: 请求系统权限\n\n```javascript\nconst { systemPreferences } = require('electron');\n\nasync function requestPermissions() {\n  // 请求相机权限\n  const cameraGranted = await systemPreferences.requestSystemPermission('camera');\n  console.log('相机权限:', cameraGranted ? '已授权' : '被拒绝');\n\n  // 请求麦克风权限\n  const micGranted = await systemPreferences.requestSystemPermission('microphone');\n  console.log('麦克风权限:', micGranted ? '已授权' : '被拒绝');\n\n  // 请求目录访问权限\n  const dirGranted = await systemPreferences.requestDirectoryPermission(null);\n  console.log('目录权限:', dirGranted ? '已授权' : '被拒绝');\n}\n\n// 在应用启动时调用\napp.whenReady().then(requestPermissions);\n```\n\n### 示例 3: 检查权限状态\n\n```javascript\nconst { systemPreferences } = require('electron');\n\nfunction checkPermissionStatus() {\n  const cameraStatus = systemPreferences.getMediaAccessStatus('camera');\n  const micStatus = systemPreferences.getMediaAccessStatus('microphone');\n\n  console.log('权限状态:', {\n    camera: cameraStatus, // 'granted', 'denied', 'not-determined'\n    microphone: micStatus,\n  });\n}\n```\n\n## 🛠️ 调试技巧\n\n### 渲染进程调试\n\n```javascript\n// 在主进程中\nconst { BrowserWindow } = require('electron');\n\nconst win = new BrowserWindow({\n  webPreferences: {\n    nodeIntegration: true,\n    contextIsolation: false,\n  },\n});\n\n// 打开开发者工具\nwin.webContents.openDevTools();\n```\n\n### 主进程调试\n\n#### 1. 启用调试模式\n\n编辑 `web_engine/src/main/ets/components/WebWindow.ets`：\n\n```typescript\n// 添加调试参数\nlet inspect = '--inspect=9229';\nlet vec_args = [\n  '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',\n  resDir,\n  inspect, // 添加这行\n];\n```\n\n#### 2. 配置端口转发\n\n```bash\nhdc fport tcp:9229 tcp:9229\n```\n\n#### 3. Chrome 调试\n\n1. 在 Chrome 中访问：`chrome://inspect`\n2. 点击 \"Configure...\" 添加 `localhost:9229`\n3. 启动应用后点击 \"inspect\" 开始调试\n\n## 🔧 常见问题解决\n\n### 问题 1: 构建失败 \"找不到 SO 库\"\n\n**解决方案**:\n\n1. 检查 `electron/libs/arm64-v8a/` 目录是否存在\n2. 确认 5 个 SO 文件都已正确放置\n3. 检查文件权限\n\n### 问题 2: 应用启动崩溃\n\n**解决方案**:\n\n1. 检查 Electron 应用代码是否放在正确位置\n2. 确认应用代码已正确编译（如 TypeScript → JavaScript）\n3. 查看 DevEco Studio 的日志输出\n\n### 问题 3: 权限被拒绝\n\n**解决方案**:\n\n1. 检查 `module.json5` 中的权限声明\n2. 确认已正确调用权限请求 API\n3. 对于 ACL 权限，确认已申请相应证书\n\n### 问题 4: 三方库不兼容\n\n**解决方案**:\n\n```javascript\n// 检查平台\nif (process.platform === 'ohos') {\n  // 鸿蒙平台特殊处理\n  console.log('运行在 HarmonyOS 上');\n}\n\n// 替换不兼容的库\nconst fs = process.platform === 'ohos' ? require('./ohos-fs-polyfill') : require('fs');\n```\n\n## 📚 进阶学习\n\n### 了解鸿蒙文件系统\n\n```javascript\n// 应用数据目录\nconst userDataPath = '/data/storage/el2/base/files';\nconst tempPath = '/data/storage/el2/base/temp';\nconst cachePath = '/data/storage/el2/base/cache';\n\n// 使用 Electron API\nconst { app } = require('electron');\nconsole.log('用户数据目录:', app.getPath('userData'));\nconsole.log('临时目录:', app.getPath('temp'));\n```\n\n### 性能优化建议\n\n1. **预加载重要资源**: 将常用文件放在应用包内\n2. **合理使用权限**: 只申请必需的权限\n3. **优化启动时间**: 减少首屏加载资源\n4. **内存管理**: 及时释放不用的窗口和资源\n\n### 发布准备\n\n1. **测试各种权限场景**\n2. **验证多窗口功能**\n3. **检查应用图标和名称**\n4. **准备应用商店描述**\n\n## 🎯 下一步\n\n- 💬 加入开发者社区交流\n\n---\n\n**需要帮助？**\n\n- 📖 查看完整文档\n- 🐛 提交 Issue\n- 💬 联系维护团队\n\n祝您开发愉快！🎉\n"
  },
  {
    "path": "docs/Loong_Electron.md",
    "content": "# Loong Electron 快速上手指南\n\n本指南将帮助您在 5 分钟内快速上手 Loong Electron 开发。\n\n[uos loong文档](https://uosdn.uniontech.com/#document3?dirid=6669618394a5a82328adfa2c&id=6669618394a5a82328adfa30)\n\n[loong官方文档](https://docs.loongnix.cn/electron/doc/list/02.%E5%AE%89%E8%A3%85%E8%AF%B4%E6%98%8E.html)\n\n[咱龙了吗?](https://areweloongyet.com/)\n\n### 步骤 1: 安装npm管理工具。\n\n```bash\n#!/bin/bash\npkgsource=http://ftp.loongnix.cn/nodejs/LoongArch/dist/v20.8.0/node-v20.8.0-linux-loong64.tar.gz\n[ -f $(basename $pkgsource) ] || wget $pkgsource\nsudo mkdir -p /opt/nodejs\nsudo tar --strip-components=1 -C /opt/nodejs -xvf $(basename $pkgsource)\nsudo tee /etc/profile.d/nodejs.sh << \"EOF\"\nexport PATH=/opt/nodejs/bin:$PATH\nexport C_INCLUDE_PATH=/opt/nodejs/include:$C_INCLUDE_PATH\nEOF\n```\n\n```bash\nsudo bash install_npm.sh\nsource /etc/profile.d/nodejs.sh\n```\n\n### 步骤 2: 安装Electron\n\n由于loongarch环境的electron官方没有编译对应的版本。\n\n因此需要ELECTRON_MIRROR指定龙芯镜像源。同时设置electron_use_remote_checksums=1不检查校验文件。\n\n```bash\n#!/bin/bash\nexport electron_use_remote_checksums=1\nif [ \"$(arch)\" == \"loongarch\" ];then\nexport ELECTRON_MIRROR=\"http://ftp.loongnix.cn/electron/LoongArch/\"\nelse\nexport ELECTRON_MIRROR=\"https://npmmirror.com/mirrors/electron/\"\nfi\nnpm install electron@26.4.3 -g --unsafe-perm=true --allow-root\nnpm info -g electron\n```\n\n```bash\nsudo bash install_electron.sh\n```\n\n## 💡 程序示例\n\n### 步骤 1: 下载源码及安装依赖\n\n```bash\ngit clone https://github.com/electron/electron-quick-start\ncd electron-quick-start\nnpm install\n```\n\n### 步骤 2: 编译打包\n\n```bash\nnpm install --save-dev @electron-forge/cli\nnpx electron-forge import\nnpm run make\nsudo dpkg -i /home/$HOME/electron-quick-start/out/make/deb/x64/electron-quick-start_1.0.0_amd64.deb\n```\n"
  },
  {
    "path": "docs/Mcp.md",
    "content": "# Mcp\n\n### debug-electron-mcp\n\n> [Document](https://github.com/TheDarkSkyXD/debug-electron-mcp)\n\n```json\n{\n  \"debug-electron-mcp\": {\n    \"args\": [\"-y\", \"@debugelectron/debug-electron-mcp@latest\"],\n    \"command\": \"npx\"\n  }\n}\n```\n\n### swagger-mcp\n\n> [Document](https://github.com/amrsa1/swagger-mcp)\n\n```json\n{\n  \"swagger-mcp\": {\n    \"args\": [\"-y\", \"swagger-mcp@latest\"],\n    \"command\": \"npx\",\n    \"env\": {\n      \"API_BASE_URL\": \"http://127.0.0.1:9978\",\n      \"API_DOCS_URL\": \"http://127.0.0.1:9978/docs/json\"\n    }\n  }\n}\n```\n\n### tdesign-mcp\n\n> [Document](https://cloud.tencent.com/developer/mcp/server/11721)\n\n```json\n{\n  \"tdesign-mcp-server\": {\n    \"args\": [\"-y\", \"tdesign-mcp-server\"],\n    \"command\": \"npx\"\n  }\n}\n```\n"
  },
  {
    "path": "electron-builder.yml",
    "content": "# see config at https://www.electron.build/configuration\n\nappId: com.github.zyfun\nproductName: zyfun\ncopyright: Copyright © 2023 zyfun Inc.\nelectronLanguages:\n  - zh-CN\n  - zh-TW\n  - en-US\n  - zh_CN # for macOS\n  - zh_TW # for macOS\n  - en # for macOS\ndirectories:\n  buildResources: build\nprotocols:\n  - name: zyfun\n    schemes:\n      - zy\nfiles:\n  - '**/*'\n\n  # Exclusion IDE\n  - '!**/{.vscode,.idea,.cursor,.codebuddy,.trae,.qwen,.gemini,.claude}/*'\n  - '!**/{.editorconfig,.jekyll-metadata}'\n\n  # Exclusion build and configuration files\n  - '!electron.vite.config.{js,ts,mjs,cjs}'\n  - '!dev-app-update.yml'\n  - '!**/{tsconfig.json,tsconfig.tsbuildinfo,tsconfig.node.json,tsconfig.web.json}'\n\n  # Exclusion code quality and formatting tool configurations\n  - '!**/{.eslintignore,.eslintrc.js,.eslintrc.json,.eslintrc.cjs,.eslintcache,root.eslint.config.js,eslint.config.js,.eslint.config.mjs}'\n  - '!**/{.prettierignore,.prettierrc.yaml,.prettierrc.yml,.prettierrc.js}'\n  - '!**/{.stylelintignore,stylelint.config.js,.stylelintrc.yaml,.stylelintrc.yml}'\n  - '!commitlintrc.{json,yml,yaml,js,cjs,mjs,ts,mts,cts}'\n  - '!commitlint.config.{js,cjs,mjs,ts,mts,cts}'\n\n  # Exclusion package managers\n  - '!{.nvmrc,.npmrc,pnpm-lock.yaml,yarn.lock,package-lock.json}'\n  - '!{.yarnclean,.yarnrc.yml}'\n\n  # Exclusion environment variable files\n  - '!{.env,.env.*}'\n\n  # Exclusion source code/documentation/design\n  - '!src'\n  - '!script'\n  - '!scripts'\n  - '!docs'\n  - '!packages'\n  - '!patches'\n  - '!design/*.sketch'\n\n  # Exclusion python\n  - '!**/.venv'\n  - '!**/venv'\n  - '!**/__pycache__'\n  - '!**/*.pyc'\n  - '!**/uv.lock'\n\n  # Exclusion version control\n  - '!**/{.git.gitignore,.gitattributes,.git-blame-ignore-revs,.hg,.svn,CVS,RCS,SCCS,}'\n  - '!**/.DS_Store'\n  - '!._*'\n\n  # Exclusion tests/examples\n  - '!**/{test,tests,__tests__,powered-test,coverage}/**'\n  - '!**/{example,examples}/**'\n  - '!**/*.{spec,test}.{js,jsx,ts,tsx}'\n\n  # Exclusion native build files\n  - '!**/node_modules/**/*.cpp'\n  - '!**/node_modules/node-addon-api/**'\n  - '!**/node_modules/prebuild-install/**'\n  - '!**/*.{h,iobj,ipdb,tlog,recipe,vcxproj,vcxproj.filters,Makefile,*.Makefile}' # filter .node build files\n\n  # Exclusion others\n  - '!.swc'\n  - '!.bin'\n  - '!**/*.min.*.map'\n  - '!**/*.d.ts'\n  - '!*.log'\n  - '!**/{LICENSE,LICENSE.txt,ThirdPartyNotices.txt,NOTICE.txt,README.md,RELEASE.md,CHANGELOG.md}'\n  - '!node_modules/rollup-plugin-visualizer'\nasar: true\nasarUnpack:\n  - resources/**\nwin:\n  artifactName: ${productName}-${os}-${version}-${arch}-setup.${ext}\n  executableName: zyfun\n  icon: build/icon.ico\n  # signAndEditExecutable: false\n  signtoolOptions:\n    sign: scripts/win-sign.js\n  target:\n    - target: nsis\n    # - target: portable\n  verifyUpdateCodeSignature: false\nnsis:\n  allowToChangeInstallationDirectory: true\n  artifactName: ${productName}-${os}-${version}-${arch}-setup.${ext}\n  buildUniversalInstaller: false\n  createDesktopShortcut: always\n  differentialPackage: false\n  include: build/nsis-installer.nsh\n  oneClick: false\n  shortcutName: ${productName}\n  uninstallDisplayName: ${productName}\nportable:\n  artifactName: ${productName}-${os}-${version}-${arch}-portable.${ext}\n  buildUniversalInstaller: false\nmac:\n  artifactName: ${productName}-${os}-${version}-${arch}.${ext}\n  category: public.app-category.video\n  entitlementsInherit: build/entitlements.mac.plist\n  executableName: zyfun\n  extendInfo:\n    - NSCameraUsageDescription: Application requests access to the device's camera.\n    - NSMicrophoneUsageDescription: Application requests access to the device's microphone.\n    - NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder.\n    - NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder.\n  icon: build/icon.icns\n  notarize: false\n  target:\n    - target: dmg\n    - target: zip\ndmg:\n  writeUpdateInfo: false\nlinux:\n  artifactName: ${productName}-${os}-${version}-${arch}.${ext}\n  category: Video;AudioVideo\n  desktop:\n    entry:\n      Name: zyfun\n      StartupWMClass: zyfun\n  executableName: zyfun\n  icon: build/icon.icns\n  maintainer: zyfun\n  mimeTypes:\n    - x-scheme-handler/zy\n  target:\n    - target: AppImage\n    - target: deb\n    - target: rpm\nrpm:\n  # Workaround for electron build issue on rpm package:\n  # https://github.com/electron/forge/issues/3594\n  fpm: ['--rpm-rpmbuild-define=_build_id_links none']\npublish:\n  provider: github\n  owner: 'Hiram-Wong'\n  repo: 'zyfun'\nelectronDownload:\n  mirror: https://npmmirror.com/mirrors/electron/\nbeforePack: scripts/before-pack.js\nafterPack: scripts/after-pack.js\nafterSign: scripts/notarize.js\nartifactBuildCompleted: scripts/artifact-build-completed.js\n"
  },
  {
    "path": "electron.vite.config.ts",
    "content": "import { resolve } from 'node:path';\nimport process from 'node:process';\n\nimport { TDesignResolver } from '@tdesign-vue-next/auto-import-resolver';\nimport vue from '@vitejs/plugin-vue';\nimport vueJsx from '@vitejs/plugin-vue-jsx';\nimport { defineConfig } from 'electron-vite';\nimport { visualizer } from 'rollup-plugin-visualizer';\nimport AutoImport from 'unplugin-auto-import/vite';\nimport Components from 'unplugin-vue-components/vite';\nimport viteVueDevTools from 'vite-plugin-vue-devtools';\nimport viteSvgLoader from 'vite-svg-loader';\n\nimport pkg from './package.json';\n\nconst isDev = process.env.NODE_ENV === 'development';\nconst isProd = process.env.NODE_ENV === 'production';\n\nconst visualizerPlugin = (type: 'renderer' | 'main') => {\n  return process.env[`VISUALIZER_${type.toUpperCase()}`] ? [visualizer({ open: true })] : [];\n};\n\n/**\n * @see https://vitejs.dev/config/\n * @see https://rolldown.rs/reference/config-options/\n */\nexport default defineConfig({\n  main: {\n    plugins: [...visualizerPlugin('main')],\n    resolve: {\n      alias: {\n        '@main': resolve('src/main'),\n        '@shared': resolve('packages/shared'),\n        '@logger': resolve('src/main/services/LoggerService'),\n        '@db': resolve('src/main/services/DatabaseService'),\n        '@server': resolve('src/main/services/FastifyService'),\n        '@pkg': resolve('package.json'),\n      },\n    },\n    build: {\n      rollupOptions: {\n        external: ['bufferutil', 'utf-8-validate', 'electron', ...Object.keys(pkg.dependencies)],\n        input: {\n          index: resolve(__dirname, 'src/main/index.ts'),\n          film_cms_adapter_t3_drpy_worker: resolve(\n            __dirname,\n            'src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Drpy/worker.ts',\n          ),\n          film_cms_adapter_t3_catopen_worker: resolve(\n            __dirname,\n            'src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Catopen/worker.ts',\n          ),\n        },\n        onwarn: (warning, defaultHandler) => {\n          // TODO: We should resolve these warnings instead of ignoring them\n          switch (warning.code) {\n            case 'EVAL':\n            case 'SOURCEMAP_ERROR':\n            case 'COMMONJS_VARIABLE_IN_ESM':\n              return;\n            default:\n              break;\n          }\n\n          // Handle all other warnings normally\n          defaultHandler(warning);\n        },\n        output: {\n          manualChunks: undefined, // Disable code splitting completely-return null to force single file packaging\n          inlineDynamicImports: true, // Inline all dynamic imports, this is a key configuration\n          format: 'cjs',\n        },\n        treeshake: false,\n      },\n      externalizeDeps: {},\n      sourcemap: isDev,\n    },\n    esbuild: isProd ? { legalComments: 'none' } : {},\n    optimizeDeps: {\n      noDiscovery: isDev,\n    },\n    worker: {\n      format: 'es',\n    },\n  },\n  preload: {\n    plugins: [],\n    resolve: {\n      alias: {\n        '@shared': resolve('packages/shared'),\n        '@pkg': resolve('package.json'),\n      },\n    },\n    build: {\n      sourcemap: isDev,\n    },\n  },\n  renderer: {\n    plugins: [\n      vue({\n        template: {\n          compilerOptions: {\n            isCustomElement: (tag) => ['webview'].includes(tag),\n          },\n        },\n      }),\n      vueJsx({\n        transformOn: true,\n        // oxc: true,\n      }),\n      AutoImport({\n        resolvers: [\n          TDesignResolver({\n            library: 'vue-next',\n          }),\n          TDesignResolver({\n            library: 'chat',\n          }),\n        ],\n      }),\n      Components({\n        resolvers: [\n          TDesignResolver({\n            library: 'vue-next',\n          }),\n          TDesignResolver({\n            library: 'chat',\n          }),\n        ],\n      }),\n      viteSvgLoader(),\n      viteVueDevTools(),\n      ...visualizerPlugin('renderer'),\n    ],\n    resolve: {\n      alias: {\n        '@': resolve('src/renderer/src'),\n        '@pkg': resolve('package.json'),\n        '@renderer': resolve('src/renderer'),\n        '@shared': resolve('packages/shared'),\n        '@logger': resolve('src/main/services/LoggerService'),\n      },\n    },\n    optimizeDeps: {\n      include: ['monaco-yaml/yaml.worker.js'],\n      esbuildOptions: {\n        target: 'esnext', // for dev\n      },\n    },\n    worker: {\n      format: 'es',\n    },\n    build: {\n      target: 'esnext', // for build\n      rollupOptions: {\n        external: ['crypto'],\n        input: {\n          index: resolve(__dirname, 'src/renderer/index.html'),\n        },\n        output: {\n          entryFileNames: `assets/entry/[name]_[hash].js`,\n          chunkFileNames: `assets/chunk/[name]_[hash].js`,\n          assetFileNames: `assets/static/[ext]/[name]_[hash].[ext]`,\n          advancedChunks: {\n            groups: [\n              {\n                name: 'vendor_tdesign',\n                test: /[\\\\/]node_modules[\\\\/](tdesign-vue-next|tdesign-icons-vue-next|@tdesign-vue-next\\/chat)[\\\\/]/,\n              },\n              {\n                name: 'vendor_vue',\n                test: /[\\\\/]node_modules[\\\\/](vue|vue-router|vue-i18n|pinia|pinia-plugin-persistedstate|pinia-shared-state|@vueuse\\/core|v3-infinite-loading|emittery)[\\\\/]/,\n              },\n              {\n                name: 'vendor_crypto',\n                test: /[\\\\/]node_modules[\\\\/](crypto-js|he|pako|node-forge|sm-crypto-v2|uuid)[\\\\/]/,\n              },\n              {\n                name: 'vendor_video-decoder',\n                test: /[\\\\/]node_modules[\\\\/](dashjs|flv\\.js|hls\\.js|mpegts\\.js|shaka-player)[\\\\/]/,\n              },\n              {\n                name: 'vendor_xgplayer',\n                test: /[\\\\/]node_modules[\\\\/](xgplayer|xgplayer-.*)[\\\\/]/,\n              },\n              {\n                name: 'vendor_artplayer',\n                test: /[\\\\/]node_modules[\\\\/](artplayer|artplayer-.*)[\\\\/]/,\n              },\n              {\n                name: 'vendor_dplayer',\n                test: /[\\\\/]node_modules[\\\\/]dplayer[\\\\/]/,\n              },\n              {\n                name: 'vendor_nplayer',\n                test: /[\\\\/]node_modules[\\\\/](nplayer|@nplayer\\/.*)[\\\\/]/,\n              },\n              {\n                name: 'vendor_oplayer',\n                test: /[\\\\/]node_modules[\\\\/]@oplayer[\\\\/]/,\n              },\n            ],\n          },\n        },\n        experimental: {\n          strictExecutionOrder: true,\n        },\n        onwarn: (warning, defaultHandler) => {\n          // TODO: We should resolve these warnings instead of ignoring them\n          switch (warning.code) {\n            case 'EVAL':\n            case 'COMMONJS_VARIABLE_IN_ESM':\n            case 'PLUGIN_TIMINGS':\n              return;\n            default:\n              break;\n          }\n\n          // Handle all other warnings normally\n          defaultHandler(warning);\n        },\n      },\n    },\n    esbuild: isProd ? { legalComments: 'none' } : {},\n    css: {\n      preprocessorOptions: {\n        less: {\n          modifyVars: {\n            hack: `true; @import (reference) \"${resolve('src/renderer/src/style/variables.less')}\";`,\n          },\n          math: 'strict',\n          javascriptEnabled: true,\n        },\n      },\n    },\n  },\n});\n"
  },
  {
    "path": "eslint.config.js",
    "content": "import antfu from '@antfu/eslint-config';\nimport { globalIgnores } from 'eslint/config';\nimport prettier from 'eslint-plugin-prettier/recommended';\nimport simpleImportSort from 'eslint-plugin-simple-import-sort';\nimport vueCss from 'eslint-plugin-vue-scoped-css';\nimport globals from 'globals';\nimport typescript from 'typescript-eslint';\n\nexport default antfu(\n  {\n    typescript: true,\n    vue: true,\n    jsonc: false,\n    yaml: false,\n    markdown: false,\n    formatters: false,\n  },\n  [\n    ...vueCss.configs['flat/recommended'],\n    prettier,\n    {\n      languageOptions: {\n        globals: {\n          ...globals.browser,\n          ...globals.node,\n          ...globals.jest,\n          defineProps: 'readonly',\n          defineEmits: 'readonly',\n        },\n        ecmaVersion: 6,\n        sourceType: 'module',\n\n        parserOptions: {\n          parser: typescript.parser,\n          allowImportExportEverywhere: true,\n\n          ecmaFeatures: {\n            jsx: true,\n          },\n        },\n      },\n      plugins: {\n        'simple-import-sort': simpleImportSort,\n      },\n\n      settings: {\n        'import/extensions': ['.js', '.jsx', '.ts', '.tsx'],\n      },\n\n      rules: {\n        /* Closed due to template running\n         * (Recommended to open!)\n         */\n        'no-console': 'off',\n        'ts/no-explicit-any': 'off',\n\n        /* Disallow person rules */\n        'antfu/top-level-function': 'off',\n        'antfu/if-newline': 'off',\n        'n/prefer-global/process': 'off',\n\n        /* If you need control the imports sequence, must be off\n         *  https://github.com/vuejs/vue-eslint-parser/issues/58\n         */\n        'import/first': 'off',\n\n        /* Allow start with _ */\n        '@typescript-eslint/no-unused-vars': [\n          'error',\n          {\n            argsIgnorePattern: '^_',\n            varsIgnorePattern: '^_',\n          },\n        ],\n        'vue/no-unused-vars': [\n          'error',\n          {\n            ignorePattern: '^_',\n          },\n        ],\n        // Using ts/no-unused-vars instead\n        'no-unused-vars': 'off',\n\n        /* Some variables are initialized in the function */\n        '@typescript-eslint/no-use-before-define': 'off',\n        'no-use-before-define': 'off',\n\n        /* Disable e18e */\n        'e18e/prefer-static-regex': 'off',\n        'e18e/ban-dependencies': 'off',\n\n        /* Disable antfu sort, use simple sort import */\n        'perfectionist/sort-imports': 'off',\n        'perfectionist/sort-named-imports': 'off',\n        'simple-import-sort/imports': 'error',\n        'simple-import-sort/exports': 'error',\n\n        // Disable unused-imports rules in other presets\n        'unused-imports/no-unused-imports': 'off',\n        'unused-imports/no-unused-vars': 'off',\n      },\n    },\n    {\n      files: ['**/*.vue'],\n\n      rules: {\n        'vue/component-name-in-template-casing': ['error', 'kebab-case'],\n        'vue/custom-event-name-casing': ['error', 'kebab-case'],\n        'vue/block-order': [\n          'error',\n          {\n            order: ['template', 'script', 'style'],\n          },\n        ],\n        'vue/block-lang': [\n          'error',\n          {\n            script: {\n              lang: ['ts', 'tsx'],\n            },\n          },\n        ],\n        'vue/multi-word-component-names': 'off',\n        'vue/no-reserved-props': 'off',\n        'vue/no-v-html': 'off',\n\n        'vue-scoped-css/no-parsing-error': 'off',\n        'vue-scoped-css/no-unused-selector': 'off',\n        'vue-scoped-css/enforce-style-type': [\n          'error',\n          {\n            allows: ['scoped'],\n          },\n        ],\n        'vue/padding-line-between-blocks': ['error', 'never'],\n      },\n    },\n    globalIgnores([\n      '**/snapshot*',\n      '**/dist',\n      '**/out',\n      '**/lib',\n      '**/es',\n      '**/esm',\n      '**/node_modules',\n      '**/build',\n      '**/*.min.js',\n      '**/*.min.css',\n      '**/*.toml',\n      '**/*.py',\n      '.yarn/**',\n      '.gitignore',\n      '!**/.prettierrc.js',\n      'resources/t3Catopen/*.js',\n    ]),\n  ],\n);\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"zyfun\",\n  \"version\": \"3.4.4-rc4\",\n  \"private\": true,\n  \"description\": \"Discover the world by watching movies.\",\n  \"main\": \"./out/main/index.js\",\n  \"desktopName\": \"zyfun.desktop\",\n  \"author\": {\n    \"name\": \"Hiram-Wong\",\n    \"email\": \"admin@catni.cn\"\n  },\n  \"license\": \"AGPL-3.0\",\n  \"homepage\": \"https://github.com/Hiram-Wong/zyfun\",\n  \"engines\": {\n    \"node\": \">=24.11.1\"\n  },\n  \"scripts\": {\n    \"analyze:renderer\": \"VISUALIZER_RENDERER=true pnpm build\",\n    \"analyze:main\": \"VISUALIZER_MAIN=true pnpm build\",\n    \"format\": \"prettier --write .\",\n    \"lint\": \"eslint --ext .vue,.js,.jsx,.ts,.tsx ./ --max-warnings 0\",\n    \"lint:fix\": \"eslint --ext .vue,.js,.jsx,.ts,.tsx ./ --max-warnings 0 --fix\",\n    \"stylelint\": \"stylelint src/**/*.{html,vue,sass,less}\",\n    \"stylelint:fix\": \"stylelint --fix src/**/*.{html,vue,css,sass,less}\",\n    \"typecheck\": \"npm run typecheck:node && npm run typecheck:web\",\n    \"typecheck:node\": \"tsgo --noEmit -p tsconfig.node.json --composite false\",\n    \"typecheck:web\": \"vue-tsc --noEmit -p tsconfig.web.json --composite false\",\n    \"npmcheck\": \"ncu -u\",\n    \"depcheck\": \"depcheck --skip-missing=true\",\n    \"generate:license\": \"node ./scripts/generate-license.js\",\n    \"generate:icons\": \"electron-icon-builder --input=./build/logo.png --output=build\",\n    \"postinstall\": \"electron-builder install-app-deps\",\n    \"prepare\": \"husky\",\n    \"start\": \"electron-vite preview\",\n    \"dev\": \"dotenv electron-vite dev\",\n    \"dev:watch\": \"dotenv electron-vite dev -- -w\",\n    \"debug\": \"electron-vite -- --inspect --sourcemap --remote-debugging-port=9222\",\n    \"build\": \"npm run typecheck && electron-vite build\",\n    \"build:check\": \"pnpm lint && pnpm test\",\n    \"build:web\": \"npm run build\",\n    \"build:unpack\": \"dotenv npm run build && electron-builder --dir\",\n    \"build:win\": \"dotenv npm run build && electron-builder --win --x64 --arm64\",\n    \"build:win:x64\": \"dotenv npm run build && electron-builder --win --x64\",\n    \"build:win:arm64\": \"dotenv npm run build && electron-builder --win --arm64\",\n    \"build:mac\": \"dotenv npm run build && electron-builder --mac --arm64 --x64\",\n    \"build:mac:arm64\": \"dotenv npm run build && electron-builder --mac --arm64\",\n    \"build:mac:x64\": \"dotenv npm run build && electron-builder --mac --x64\",\n    \"build:linux\": \"dotenv npm run build && electron-builder --linux --x64 --arm64\",\n    \"build:linux:arm64\": \"dotenv npm run build && electron-builder --linux --arm64\",\n    \"build:linux:x64\": \"dotenv npm run build && electron-builder --linux --x64\",\n    \"test\": \"vitest run --silent\",\n    \"test:main\": \"vitest run --project main\",\n    \"test:renderer\": \"vitest run --project renderer\",\n    \"test:shared\": \"vitest run --project shared\",\n    \"test:update\": \"pnpm test:renderer --update\",\n    \"test:coverage\": \"vitest run --coverage --silent\",\n    \"test:ui\": \"vitest --ui\",\n    \"test:scripts\": \"vitest scripts\",\n    \"test:watch\": \"vitest\"\n  },\n  \"dependencies\": {\n    \"7zip-bin-full\": \"^26.0.1\",\n    \"@fastify/swagger-ui\": \"^5.2.5\",\n    \"@libsql/client\": \"0.14.0\",\n    \"adm-zip\": \"^0.5.16\",\n    \"node-7z\": \"^3.0.0\",\n    \"node-stream-zip\": \"^1.15.0\",\n    \"npminstall\": \"5.8.1\",\n    \"os-proxy-config\": \"^1.1.2\",\n    \"puppeteer-core\": \"^24.40.0\",\n    \"puppeteer-in-electron\": \"^3.0.5\",\n    \"sync-fetch\": \"^0.6.0\",\n    \"sync-request\": \"^6.1.0\",\n    \"turndown\": \"^7.2.2\",\n    \"workerpool\": \"^10.0.1\",\n    \"zeromq\": \"^6.5.0\"\n  },\n  \"devDependencies\": {\n    \"@antfu/eslint-config\": \"^7.7.3\",\n    \"@commitlint/cli\": \"^20.5.0\",\n    \"@commitlint/config-conventional\": \"^20.5.0\",\n    \"@electron-toolkit/eslint-config-ts\": \"^3.1.0\",\n    \"@electron-toolkit/preload\": \"^3.0.2\",\n    \"@electron-toolkit/tsconfig\": \"^2.0.0\",\n    \"@electron-toolkit/utils\": \"^4.0.0\",\n    \"@electron/notarize\": \"^2.5.0\",\n    \"@fastify/cors\": \"^11.2.0\",\n    \"@fastify/multipart\": \"^9.4.0\",\n    \"@fastify/swagger\": \"^9.7.0\",\n    \"@fastify/type-provider-typebox\": \"^6.1.0\",\n    \"@huolala-tech/page-spy-plugin-ospy\": \"^2.2.11\",\n    \"@logdna/tail-file\": \"^4.0.2\",\n    \"@microsoft/fetch-event-source\": \"^2.0.1\",\n    \"@nplayer/danmaku\": \"^1.0.12\",\n    \"@oplayer/core\": \"^1.2.38-beta.2\",\n    \"@oplayer/danmaku\": \"^1.2.26-beta.0\",\n    \"@oplayer/dash\": \"^1.2.27-beta.2\",\n    \"@oplayer/hls\": \"^1.2.28-beta.1\",\n    \"@oplayer/mpegts\": \"^1.2.26-beta.0\",\n    \"@oplayer/plugins\": \"^1.0.15-beta.4\",\n    \"@oplayer/torrent\": \"^1.2.25-beta.2\",\n    \"@oplayer/ui\": \"^1.3.4-beta.10\",\n    \"@sinclair/typebox\": \"^0.34.48\",\n    \"@swc/core\": \"^1.15.18\",\n    \"@tdesign-vue-next/auto-import-resolver\": \"^0.1.6\",\n    \"@tdesign-vue-next/chat\": \"^0.5.1\",\n    \"@types/crypto-js\": \"^4.2.2\",\n    \"@types/dotenv\": \"^8.2.3\",\n    \"@types/electron-localshortcut\": \"^3\",\n    \"@types/fluent-ffmpeg\": \"^2.1.28\",\n    \"@types/fs-extra\": \"^11.0.4\",\n    \"@types/he\": \"^1\",\n    \"@types/js-yaml\": \"^4.0.9\",\n    \"@types/minimist\": \"^1\",\n    \"@types/node\": \"24.10.4\",\n    \"@types/node-forge\": \"^1.3.14\",\n    \"@types/pako\": \"^2.0.4\",\n    \"@types/semver\": \"^7.7.1\",\n    \"@types/turndown\": \"^5.0.6\",\n    \"@types/ws\": \"^8.18.1\",\n    \"@typescript/native-preview\": \"latest\",\n    \"@vitejs/plugin-vue\": \"^6.0.5\",\n    \"@vitejs/plugin-vue-jsx\": \"^5.1.5\",\n    \"@vitest/browser\": \"3.2.4\",\n    \"@vitest/coverage-v8\": \"3.2.4\",\n    \"@vitest/ui\": \"3.2.4\",\n    \"@vitest/web-worker\": \"3.2.4\",\n    \"@vue/compiler-sfc\": \"~3.5.30\",\n    \"@vueuse/core\": \"14.2.1\",\n    \"@xterm/addon-fit\": \"^0.11.0\",\n    \"@xterm/addon-search\": \"^0.16.0\",\n    \"@xterm/addon-web-links\": \"^0.12.0\",\n    \"@xterm/addon-webgl\": \"^0.19.0\",\n    \"@xterm/xterm\": \"^6.0.0\",\n    \"artplayer\": \"^5.4.0\",\n    \"artplayer-plugin-danmuku\": \"^5.3.0\",\n    \"axios\": \"^1.13.6\",\n    \"builder-util-runtime\": \"9.5.0\",\n    \"cheerio\": \"^1.2.0\",\n    \"chokidar\": \"^5.0.0\",\n    \"commitizen\": \"^4.3.1\",\n    \"crypto-js\": \"^4.2.0\",\n    \"cz-conventional-changelog\": \"^3.3.0\",\n    \"dashjs\": \"^5.1.1\",\n    \"dayjs\": \"^1.11.20\",\n    \"depcheck\": \"^1.4.7\",\n    \"dotenv-cli\": \"^11.0.0\",\n    \"dplayer\": \"github:Hiram-Wong/DPlayer#20fee56a188cc6397c686d4437f149dbe25894c6\",\n    \"drizzle-orm\": \"^0.45.1\",\n    \"electron\": \"40.8.0\",\n    \"electron-builder\": \"26.8.1\",\n    \"electron-devtools-installer\": \"4.0.0\",\n    \"electron-icon-builder\": \"^2.0.1\",\n    \"electron-localshortcut\": \"^3.2.1\",\n    \"electron-store\": \"^8.2.0\",\n    \"electron-updater\": \"6.7.0\",\n    \"electron-vite\": \"^5.0.0\",\n    \"electron-window-state\": \"^5.0.3\",\n    \"emittery\": \"^2.0.0\",\n    \"es-toolkit\": \"^1.45.1\",\n    \"eslint\": \"^9.39.2\",\n    \"eslint-config-prettier\": \"^10.1.8\",\n    \"eslint-plugin-prettier\": \"^5.5.5\",\n    \"eslint-plugin-simple-import-sort\": \"^12.1.1\",\n    \"eslint-plugin-vue-scoped-css\": \"^3.0.0\",\n    \"fast-xml-parser\": \"^5.5.8\",\n    \"fastify\": \"^5.8.2\",\n    \"fdir\": \"^6.5.0\",\n    \"fetch-socks\": \"^1.3.2\",\n    \"fluent-ffmpeg\": \"^2.1.3\",\n    \"flv.js\": \"^1.6.2\",\n    \"form-data\": \"^4.0.5\",\n    \"fs-extra\": \"^11.3.4\",\n    \"fuse.js\": \"^7.1.0\",\n    \"globals\": \"^17.4.0\",\n    \"he\": \"^1.2.0\",\n    \"hls.js\": \"^1.6.15\",\n    \"http-status-codes\": \"^2.3.0\",\n    \"husky\": \"^9.1.7\",\n    \"i18next\": \"^25.9.0\",\n    \"iconv-lite\": \"^0.7.2\",\n    \"ipaddr.js\": \"^2.3.0\",\n    \"isomorphic-ws\": \"^5.0.0\",\n    \"jest-styled-components\": \"^7.2.0\",\n    \"js-yaml\": \"4.1.1\",\n    \"json5\": \"^2.2.3\",\n    \"jsonpath-plus\": \"^10.4.0\",\n    \"less\": \"^4.6.4\",\n    \"license-checker\": \"^25.0.1\",\n    \"lint-staged\": \"^16.4.0\",\n    \"macos-release\": \"^3.4.0\",\n    \"magnet-uri\": \"^7.0.7\",\n    \"mime-types\": \"^3.0.2\",\n    \"minimist\": \"^1.2.8\",\n    \"monaco-editor\": \"0.52.2\",\n    \"monaco-yaml\": \"^5.4.1\",\n    \"mpegts.js\": \"github:tsukumijima/mpegts.js#726d91becfa178a68bbea154175213ab6b3dfdba\",\n    \"node-forge\": \"^1.3.3\",\n    \"nplayer\": \"^1.0.15\",\n    \"npm-check-updates\": \"^19.6.5\",\n    \"openai\": \"^6.32.0\",\n    \"p-queue\": \"^9.1.0\",\n    \"pako\": \"^2.1.0\",\n    \"pinia\": \"^3.0.4\",\n    \"pinia-plugin-persistedstate\": \"^4.7.1\",\n    \"pinia-shared-state\": \"^1.0.1\",\n    \"postcss-html\": \"^1.8.1\",\n    \"postcss-less\": \"^6.0.0\",\n    \"prettier\": \"^3.8.1\",\n    \"prettier-plugin-sort-json\": \"4.2.0\",\n    \"protobufjs\": \"^8.0.0\",\n    \"proxy-agent\": \"^6.5.0\",\n    \"qs\": \"^6.15.0\",\n    \"rollup-plugin-visualizer\": \"^7.0.1\",\n    \"semver\": \"^7.7.4\",\n    \"sm-crypto-v2\": \"^1.15.1\",\n    \"spdx-satisfies\": \"^6.0.0\",\n    \"splitpanes\": \"^4.0.4\",\n    \"stylelint\": \"~17.5.0\",\n    \"stylelint-config-standard\": \"^40.0.0\",\n    \"stylelint-order\": \"~8.1.1\",\n    \"tar\": \"^7.5.12\",\n    \"tdesign-icons-vue-next\": \"^0.4.2\",\n    \"tdesign-vue-next\": \"^1.18.5\",\n    \"tldts\": \"^7.0.27\",\n    \"tokenx\": \"^1.3.0\",\n    \"typescript\": \"~5.9.3\",\n    \"typescript-eslint\": \"^8.57.1\",\n    \"undici\": \"6.21.2\",\n    \"unplugin-auto-import\": \"^21.0.0\",\n    \"unplugin-vue-components\": \"^31.0.0\",\n    \"uuid\": \"^13.0.0\",\n    \"v3-infinite-loading\": \"^1.3.2\",\n    \"vite\": \"npm:rolldown-vite@7.3.0\",\n    \"vite-plugin-vue-devtools\": \"^8.1.0\",\n    \"vite-svg-loader\": \"^5.1.1\",\n    \"vitest\": \"^3.2.4\",\n    \"vue\": \"^3.5.30\",\n    \"vue-i18n\": \"^11.3.0\",\n    \"vue-router\": \"^5.0.4\",\n    \"vue-tsc\": \"^3.2.6\",\n    \"web-vitals\": \"^5.1.0\",\n    \"webdav\": \"^5.9.0\",\n    \"winston\": \"^3.19.0\",\n    \"winston-daily-rotate-file\": \"^5.0.0\",\n    \"ws\": \"^8.19.0\",\n    \"xgplayer\": \"^3.0.24\",\n    \"xgplayer-flv\": \"^3.0.24\",\n    \"xgplayer-hls\": \"^3.0.24\",\n    \"xgplayer-mp4\": \"^3.0.24\",\n    \"xgplayer-music\": \"^3.0.24\",\n    \"xgplayer-shaka\": \"^3.0.24\",\n    \"xterm-addon-search-bar\": \"^0.2.0\"\n  },\n  \"optionalDependencies\": {\n    \"@libsql/darwin-arm64\": \"0.4.7\",\n    \"@libsql/darwin-x64\": \"0.4.7\",\n    \"@libsql/linux-arm64-gnu\": \"0.4.7\",\n    \"@libsql/linux-arm64-musl\": \"0.4.7\",\n    \"@libsql/linux-x64-gnu\": \"0.4.7\",\n    \"@libsql/linux-x64-musl\": \"0.4.7\",\n    \"@libsql/win32-x64-msvc\": \"0.4.7\",\n    \"@strongtz/win32-arm64-msvc\": \"^0.4.7\"\n  },\n  \"pnpm\": {\n    \"overrides\": {\n      \"basic-ftp\": \">=5.2.0\",\n      \"esbuild\": \"^0.25.0\",\n      \"fast-xml-parser\": \">=5.3.6\",\n      \"jsonc-eslint-parser\": \"2.4.0\",\n      \"minimatch@<3.1.3\": \"3.1.5\",\n      \"minimatch@>=5.0.0 <5.1.7\": \"5.1.7\",\n      \"minimatch@>=9.0.0 <9.0.6\": \"9.0.6\",\n      \"minimatch@>=10.0.0 <10.2.1\": \"10.2.1\",\n      \"node-abi\": \"4.24.0\",\n      \"proxy-agent\": \"^6.5.0\",\n      \"semver\": \"^7.7.4\",\n      \"tar\": \"^7.5.12\",\n      \"tar-fs\": \"^2.1.4\",\n      \"undici\": \"6.23.0\",\n      \"vite\": \"npm:rolldown-vite@7.3.0\"\n    },\n    \"patchedDependencies\": {\n      \"@oplayer/core@1.2.38-beta.2\": \"patches/@oplayer-core-npm-1.2.38-beta.2-66bf7d6252.patch\",\n      \"@oplayer/torrent@1.2.25-beta.2\": \"patches/@oplayer-torrent-npm-1.2.25-beta.2-6efddccea2.patch\",\n      \"artplayer@5.4.0\": \"patches/artplayer@5.4.0.patch\",\n      \"atomically@1.7.0\": \"patches/atomically-npm-1.7.0-e742e5293b.patch\",\n      \"electron-devtools-installer@4.0.0\": \"patches/electron-devtools-installer-npm-4.0.0-ea55a28d94.patch\",\n      \"electron-updater@6.7.0\": \"patches/electron-updater-npm-6.7.0-47b11bb0d4.patch\",\n      \"file-stream-rotator@0.6.1\": \"patches/file-stream-rotator-npm-0.6.1-eab45fb13d.patch\",\n      \"libsql@0.4.7\": \"patches/libsql-npm-0.4.7-444e260fb1.patch\",\n      \"dplayer@1.32.7\": \"patches/dplayer@1.32.7.patch\"\n    },\n    \"onlyBuiltDependencies\": [\n      \"@swc/core\",\n      \"dplayer\",\n      \"electron\",\n      \"electron-winstaller\",\n      \"esbuild\",\n      \"msw\",\n      \"protobufjs\",\n      \"registry-js\",\n      \"zeromq\"\n    ]\n  },\n  \"packageManager\": \"pnpm@10.27.0\",\n  \"lint-staged\": {\n    \"*.{js,jsx,ts,tsx,cjs,mjs,cts,mts,vue}\": [\n      \"prettier --write\",\n      \"eslint --fix\"\n    ],\n    \"*.{html,vue,css,sass,less,yml,yaml,json}\": [\n      \"prettier --write\"\n    ]\n  }\n}\n"
  },
  {
    "path": "packages/shared/config/appinfo.ts",
    "content": "import pkg from '@pkg';\n\n// App information\nexport const APP_NAME: string = pkg.name;\nexport const APP_NAME_ALIAS: string = 'zy';\nexport const APP_NAME_PROTOCOL: string = `${APP_NAME_ALIAS}://`;\nexport const APP_DESC: string = pkg.description;\nexport const APP_VERSION: string = pkg.version;\nexport const APP_AUTHOR: string = `${pkg.author.name}<${pkg.author.email}>`;\nexport const APP_COPYRIGHT: string = `Copyright © ${new Date().getFullYear()} ${pkg.author.name}. All rights reserved.`;\n\n// App urls\nexport const WEBSITE_URL: string = pkg.homepage;\nexport const ISSUE_URL: string = `${pkg.homepage}/issues`;\nexport const DOCUMENT_URL: string = 'https://zy.catni.cn';\nexport const PLUGIN_STORE_URL: string = 'https://github.com/Hiram-Wong/zyfun/discussions/386';\n\n// App overlay\nexport const titleBarOverlayDark = {\n  height: 42,\n  color: 'rgba(255,255,255,0)',\n  symbolColor: '#fff',\n};\n\nexport const titleBarOverlayLight = {\n  height: 42,\n  color: 'rgba(255,255,255,0)',\n  symbolColor: '#000',\n};\n"
  },
  {
    "path": "packages/shared/config/cmsAction.ts",
    "content": "export const CMS_ACTION_TYPE = {\n  INPUT: 'input',\n  EDIT: 'edit',\n  MULTI_INPUT: 'multiInput',\n  MULTI_INPUT_X: 'multiInputX',\n  MENU: 'menu',\n  SELECT: 'select',\n  MULTI_SELECT: 'multiSelect',\n  MSGBOX: 'msgbox',\n  WEBVIEW: 'webview',\n  BROWSER: 'browser',\n  ORDER: 'order',\n  HELP: 'help',\n} as const;\nexport type ICmsActionType = (typeof CMS_ACTION_TYPE)[keyof typeof CMS_ACTION_TYPE];\n\nexport const CMS_ACTION_FORM_TYPE = [\n  CMS_ACTION_TYPE.INPUT,\n  CMS_ACTION_TYPE.EDIT,\n  CMS_ACTION_TYPE.MULTI_INPUT,\n  CMS_ACTION_TYPE.MULTI_INPUT_X,\n  CMS_ACTION_TYPE.SELECT,\n  CMS_ACTION_TYPE.MULTI_SELECT,\n  CMS_ACTION_TYPE.MENU,\n] as const;\nexport type ICmsActionFormType = (typeof CMS_ACTION_FORM_TYPE)[number];\n\nexport const CMS_ACTION_INPUT_TYPE = {\n  TEXT: 0,\n  PASSWORD: 1,\n  NUMBER: 2,\n  EMAIL: 3,\n  URL: 4,\n  FOLDER_SELECT: 5,\n  FILE_SELECT: 6,\n  DATE_SELECT: 7,\n  IMAGE_BASE64: 8,\n} as const;\nexport type ICmsActionInputType = (typeof CMS_ACTION_INPUT_TYPE)[keyof typeof CMS_ACTION_INPUT_TYPE];\n\nexport type ICmsActionButtonTypeEnum = 0 | 1 | 2 | 3 | 4;\nexport type ICmsActionButtonType = boolean | ICmsActionButtonTypeEnum;\n\nexport type ICmsActionButtonTypeDisplay = 'cancel' | 'confirm' | 'reset' | 'preview';\n\nexport const CMS_ACTION_SPECIAL_ID_TYPE = {\n  SELF_SEARCH: '__self_search__',\n  DETAIL: '__detail__',\n  KTVPLAYER: '__ktvplayer__',\n  REFRESH_LIST: '__refresh_list__',\n  COPY: '__copy__',\n  KEEP: '__keep__',\n  COMMENT_CLOSE: '__comment_close__',\n} as const;\nexport type ICmsActionSpecialIdType = (typeof CMS_ACTION_SPECIAL_ID_TYPE)[keyof typeof CMS_ACTION_SPECIAL_ID_TYPE];\nexport const CMS_ACTION_SPECIAL_ID_TYPES = Object.values(CMS_ACTION_SPECIAL_ID_TYPE);\nexport type ICmsActionSpecialIdTypes = keyof typeof CMS_ACTION_SPECIAL_ID_TYPES;\n"
  },
  {
    "path": "packages/shared/config/constant.ts",
    "content": "export const ZOOM_LEVELS = [0.25, 0.33, 0.5, 0.67, 0.75, 0.8, 0.9, 1, 1.1, 1.25, 1.5, 1.75, 2, 2.5, 3, 4, 5];\n\n// 从 ZOOM_LEVELS 生成 Ant Design Select 所需的 options 结构\nexport const ZOOM_OPTIONS = ZOOM_LEVELS.map((level) => ({\n  value: level,\n  label: `${Math.round(level * 100)}%`,\n}));\n\nexport const ZOOM_SHORTCUTS = [\n  {\n    key: 'zoom_in',\n    shortcut: ['CommandOrControl', '='],\n    editable: false,\n    enabled: true,\n    system: true,\n  },\n  {\n    key: 'zoom_out',\n    shortcut: ['CommandOrControl', '-'],\n    editable: false,\n    enabled: true,\n    system: true,\n  },\n  {\n    key: 'zoom_reset',\n    shortcut: ['CommandOrControl', '0'],\n    editable: false,\n    enabled: true,\n    system: true,\n  },\n];\n\nexport const KB = 1024;\nexport const MB = 1024 * KB;\nexport const GB = 1024 * MB;\n\nexport enum UpgradeChannel {\n  LATEST = 'latest',\n  RC = 'rc',\n  BETA = 'beta',\n}\n\nexport const defaultTimeout = 10 * 1000 * 60;\n\nexport const occupiedDirs = ['logs', 'Network', 'Partitions/webview/Network'];\n\nexport const defaultByPassRules = 'localhost,127.0.0.1,::1';\n"
  },
  {
    "path": "packages/shared/config/data.ts",
    "content": "export const DATA_IMPORT_TYPE = {\n  SIMPLE: 'simple',\n  COMPLETE: 'complete',\n} as const;\nexport type IDataImportType = (typeof DATA_IMPORT_TYPE)[keyof typeof DATA_IMPORT_TYPE];\nexport const dataImportTypes = Object.values(DATA_IMPORT_TYPE);\n\nexport const DATA_SIMPLE_TYPE = {\n  TVBOX: 'tvbox',\n  CATVOD: 'catvod',\n  DRPY: 'drpy',\n} as const;\nexport type IDataSimpleType = (typeof DATA_SIMPLE_TYPE)[keyof typeof DATA_SIMPLE_TYPE];\nconst dataSimpleTypes = Object.values(DATA_SIMPLE_TYPE);\n\nexport const DATA_COMPLETE_TYPE = {\n  LOCAL: 'local',\n  REMOTE: 'remote',\n} as const;\nexport type IDataCompleteType = (typeof DATA_COMPLETE_TYPE)[keyof typeof DATA_COMPLETE_TYPE];\nconst dataCompleteTypes = Object.values(DATA_COMPLETE_TYPE);\n\nexport type IDataRemoteType = IDataSimpleType | IDataCompleteType;\nexport const dataRemoteTypes = [...dataSimpleTypes, ...dataCompleteTypes];\n\nexport const DATA_PUT_TYPE = {\n  OVERWRITE: 'overwrite',\n  ADDITIONAL: 'additional',\n} as const;\nexport type IDataPutType = (typeof DATA_PUT_TYPE)[keyof typeof DATA_PUT_TYPE];\nexport const dataPutTypes = Object.values(DATA_PUT_TYPE);\n\nexport const DATA_PAGE = {\n  FILM: 'film',\n  LIVE: 'live',\n  MOMENT: 'moment',\n  PARSE: 'parse',\n} as const;\nexport type IDataPage = (typeof DATA_PAGE)[keyof typeof DATA_PAGE];\nexport const dataPages = Object.values(DATA_PAGE);\nexport const DATA_TABLE_PAGE = {\n  FILM: ['site'],\n  LIVE: ['iptv', 'channel'],\n  MOMENT: ['history', 'star'],\n  PARSE: ['analyze'],\n} as const;\n"
  },
  {
    "path": "packages/shared/config/dns.ts",
    "content": "export enum DNS {\n  TENCENT = 'https://sm2.doh.pub/dns-query',\n  ALI = 'https://dns.alidns.com/dns-query',\n  QIHOO = 'https://doh.360.cn/dns-query',\n  CLOUDFLARE = 'https://cloudflare-dns.com/dns-query',\n  OPENDNS = 'https://doh.opendns.com/dns-query',\n  GOOGLE = 'https://dns.google/dns-query',\n}\n\nexport type IDns = `${DNS}`;\n"
  },
  {
    "path": "packages/shared/config/env.ts",
    "content": "export const ORIGIN = import.meta.env.VITE_API_URL;\nexport const PORT = import.meta.env.VITE_API_PORT;\nexport const PREFIX = import.meta.env.VITE_API_URL_PREFIX;\nexport const PREFIX_API = `${ORIGIN}${PREFIX}`;\n\nexport const PROXY_API = `${ORIGIN}/proxy`;\nexport const AIGC_CHAT_COMPLETION_API = `${PREFIX_API}/v1/aigc/chat/completion`;\nexport const FILE_MANAGE_API = `${PREFIX_API}/v1/file/manage/file`;\nexport const SYSTEM_M3U8_AD_REMOVE_API = `${PREFIX_API}/v1/system/m3u8/adremove`;\n"
  },
  {
    "path": "packages/shared/config/film.ts",
    "content": "export const SITE_TYPE = {\n  T0_XML: 0,\n  T1_JSON: 1,\n  T4_DRPYJS0: 2,\n  T4_DRPYS: 6,\n  T3_DRPY: 7,\n  T4_CATVOD: 8,\n  T3_XBPQ: 9,\n  T3_XYQ: 10,\n  T3_APPYSV2: 11,\n  T3_PY: 12,\n  T3_ALIST: 13,\n  T3_CATOPEN: 14,\n  T3_APPGET: 15,\n  T3_APPQI: 16,\n  T3_APPFOX: 17,\n} as const;\nimport { LOG_MODULE } from './logger';\n\nexport type ISiteType = (typeof SITE_TYPE)[keyof typeof SITE_TYPE];\nexport const siteTypes = Object.values(SITE_TYPE);\n\nexport const SITE_LOGGER_MAP = {\n  [SITE_TYPE.T0_XML]: `${LOG_MODULE.FILM_CMS}<t0_xml>`,\n  [SITE_TYPE.T1_JSON]: `${LOG_MODULE.FILM_CMS}<t1_json>`,\n  [SITE_TYPE.T4_DRPYJS0]: `${LOG_MODULE.FILM_CMS}<t4_drpyjs0>`,\n  [SITE_TYPE.T4_DRPYS]: `${LOG_MODULE.PLUGIN}<drpy-node>`,\n  [SITE_TYPE.T3_DRPY]: `${LOG_MODULE.FILM_CMS}<t3_drpy>`,\n  [SITE_TYPE.T4_CATVOD]: `${LOG_MODULE.PLUGIN}<cat_vod_nodejs_fastify>`,\n  [SITE_TYPE.T3_XBPQ]: `${LOG_MODULE.FILM_CMS}<t3_xbpq>`,\n  [SITE_TYPE.T3_XYQ]: `${LOG_MODULE.FILM_CMS}<t3_xyq>`,\n  [SITE_TYPE.T3_APPYSV2]: `${LOG_MODULE.FILM_CMS}<t3_appysv2>`,\n  [SITE_TYPE.T3_PY]: `${LOG_MODULE.FILM_CMS}<t3_py>`,\n  [SITE_TYPE.T3_CATOPEN]: `${LOG_MODULE.FILM_CMS}<t3_catopen>`,\n  [SITE_TYPE.T3_ALIST]: `${LOG_MODULE.FILM_CMS}<t3_alist>`,\n  [SITE_TYPE.T3_APPGET]: `${LOG_MODULE.FILM_CMS}<t3_appget>`,\n  [SITE_TYPE.T3_APPQI]: `${LOG_MODULE.FILM_CMS}<t3_appqi>`,\n  [SITE_TYPE.T3_APPFOX]: `${LOG_MODULE.FILM_CMS}<t3_appfox>`,\n};\n\nexport const SITE_API_MAP = {\n  [SITE_TYPE.T0_XML]: '',\n  [SITE_TYPE.T1_JSON]: '',\n  [SITE_TYPE.T4_DRPYJS0]: '',\n  [SITE_TYPE.T4_DRPYS]: '',\n  [SITE_TYPE.T3_DRPY]: './drpy.min.js',\n  [SITE_TYPE.T4_CATVOD]: '',\n  [SITE_TYPE.T3_XBPQ]: 'csp_XBPQ',\n  [SITE_TYPE.T3_XYQ]: 'csp_XYQHiker',\n  [SITE_TYPE.T3_APPYSV2]: 'csp_AppYsV2',\n  [SITE_TYPE.T3_PY]: '',\n  [SITE_TYPE.T3_ALIST]: 'csp_Alist',\n  [SITE_TYPE.T3_CATOPEN]: '',\n  [SITE_TYPE.T3_APPGET]: 'csp_AppGet',\n  [SITE_TYPE.T3_APPQI]: 'csp_AppQi',\n  [SITE_TYPE.T3_APPFOX]: 'csp_AppFox',\n};\n"
  },
  {
    "path": "packages/shared/config/ipcChannel.ts",
    "content": "export enum IPC_CHANNEL {\n  // api\n  API_SERVER_START = 'api-server:start',\n  API_SERVER_STOP = 'api-server:stop',\n  API_SERVER_RESTART = 'api-server:restart',\n  API_SERVER_STATUS = 'api-server:status',\n\n  // app\n  APP_GET_CACHE_SIZE = 'app:get-cache-size',\n  APP_CLEAR_CACHE = 'app:clear-cache',\n\n  APP_AUTO_LAUNCH = 'app:auto-launch',\n  APP_ZOOM = 'app:zoom',\n  APP_DNS = 'app:dns',\n  APP_PROXY = 'app:proxy',\n  APP_PROXY_SYSTEM = 'app:proxy-system',\n  APP_QUIT = 'app:quit',\n  APP_REBOOT = 'app:reboot',\n\n  // binary\n  BINARY_INSTALL = 'binary:install',\n\n  // business\n  BROWSER_NAVIGATE = 'business:browser-navigate',\n  CALL_PLAYER = 'business:call-player',\n\n  // change\n  CHANGE_THEME = 'change:theme',\n  CHANGE_LANG = 'change:lang',\n  CHANGE_ZOOM = 'change:zoom',\n\n  // event\n  THEME_UPDATED = 'theme:updated',\n  LANG_UPDATED = 'lang:updated',\n  FULLSCREEN_UPDATED = 'fullscreen:updated',\n  URI_BLOCKED = 'uri:blocked',\n  ZOOM_UPDATED = 'zoom:updated',\n\n  // file\n  FILE_SELECT_FOLDER_DIALOG = 'file:select-folder-dialog',\n  FILE_SELECT_FILE_DIALOG = 'file:select-file-dialog',\n  FILE_SAVE_FILE_DIALOG = 'file:save-file-dialog',\n  FILE_SELECT_FOLDER_READ = 'file:select-folder-read',\n  FILE_SELECT_FILE_WRITE = 'file:select-file-write',\n\n  // fs\n  FS_EXIST = 'fs:exist',\n  FS_DELETE = 'fs:delete',\n  FS_FILE_READ = 'fs:file-read',\n  FS_FILE_WRITE = 'fs:file-write',\n  FS_DIR_READ = 'fs:dir-read',\n  FS_DIR_CREATE = 'fs:dir-create',\n\n  INSTALL_UV_BINARY = 'app:install-uv-binary',\n\n  // logger\n  APP_LOG_TO_MAIN = 'app:log-to-main',\n\n  // notification\n  NOTIFICATION_SEND = 'notification:send',\n\n  // open\n  OPEN_PATH = 'open:path',\n  OPEN_WEBSITE = 'open:website',\n\n  // path\n  PATH_SYSTEM = 'path:system',\n  PATH_HOME = 'path:home',\n  PATH_USER = 'path:user',\n  PATH_JOIN = 'path:join',\n  PATH_RESOLVE = 'path:resolve',\n\n  // plugin\n  PLUGIN_INSTALL = 'plugin:install',\n  PLUGIN_UNINSTALL = 'plugin:uninstall',\n  PLUGIN_START = 'plugin:start',\n  PLUGIN_STOP = 'plugin:stop',\n\n  // python\n  PYTHON_EXECUTE = 'python:execute',\n\n  // shortcut\n  SHORTCUTS_IS_REGISTERD = 'shortcuts:is-registered',\n  SHORTCUT_REGISTER = 'shortcut:register',\n  SHORTCUT_UNREGISTER = 'shortcut:unregister',\n  SHORTCUT_CLEAR = 'shortcut:clear',\n\n  // system\n  SYSTEM_ARCH = 'system:arch',\n  SYSTEM_PLATFORM = 'system:platform',\n\n  // update\n  UPDATE_AVAILABLE = 'update:available',\n  UPDATE_DOWNLOAD_PROGRESS = 'update:download-progress',\n  UPDATE_DOWNLOADED = 'update:update-downloaded',\n  UPDATE_ERROR = 'update:error',\n  UPDATE_NOT_AVAILABLE = 'update:not-available',\n  UPDATE_CHECK = 'update:check',\n  UPDATE_INSTALL = 'update:install',\n  UPDATE_DOWNLOAD = 'update:download',\n\n  // webview\n  WEBVIEW_SPELL_CHECK = 'webview:spell-check',\n  WEBVIEW_LINK_BLOCK = 'webview:link-block',\n  WEBVIEW_LINK_BLOCK_RELAY = 'webview:link-block-relay',\n  WEBVIEW_HEADER_BLOCK = 'webview:header-block',\n\n  // window\n  WINDOW_CLOSE = 'window:close',\n  WINDOW_MIN = 'window:min',\n  WINDOW_MAX = 'window:max',\n  WINDOW_PIN = 'window:pin',\n  WINDOW_SIZE = 'window:size',\n  WINDOW_FULLSCREEN = 'window:fullscreen',\n  WINDOW_POSITION = 'window:position',\n  WINDOW_DRAG = 'window:drag',\n  WINDOW_DESTROY = 'window:destroy',\n  WINDOW_DESTROY_RELAY = 'window:destroy-relay',\n  WINDOW_HIDE = 'window:hide',\n  WINDOW_SHOW = 'window:show',\n  WINDOW_STATUS = 'window:status',\n\n  WINDOW_PLAYER = 'window:player',\n  WINDOW_MAIN = 'window:main',\n  WINDOW_BROWSER = 'window:browser',\n}\n"
  },
  {
    "path": "packages/shared/config/live.ts",
    "content": "export const IPTV_TYPE = {\n  REMOTE: 1,\n  LOCAL: 2,\n  MANUAL: 3,\n} as const;\nexport type IIptvType = (typeof IPTV_TYPE)[keyof typeof IPTV_TYPE];\nexport const iptvTypes = Object.values(IPTV_TYPE);\n"
  },
  {
    "path": "packages/shared/config/logger.ts",
    "content": "export interface LogSourceWithContext {\n  process: 'main' | 'renderer';\n  window?: string; // only for renderer process\n  module?: string;\n  context?: Record<string, any>;\n}\n\ntype NullableObject = object | undefined | null;\n\nexport type LogContextData = [] | [Error | NullableObject] | [Error | NullableObject, ...NullableObject[]];\n\nexport type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'verbose' | 'silly' | 'none';\n\nexport const LEVEL = {\n  ERROR: 'error',\n  WARN: 'warn',\n  INFO: 'info',\n  DEBUG: 'debug',\n  VERBOSE: 'verbose',\n  SILLY: 'silly',\n  NONE: 'none',\n} satisfies Record<string, LogLevel>;\n\nexport const LEVEL_MAP: Record<LogLevel, number> = {\n  [LEVEL.ERROR]: 10,\n  [LEVEL.WARN]: 8,\n  [LEVEL.INFO]: 6,\n  [LEVEL.DEBUG]: 4,\n  [LEVEL.VERBOSE]: 2,\n  [LEVEL.SILLY]: 0,\n  [LEVEL.NONE]: -1,\n};\n\nexport enum LOG_MODULE {\n  MAIN = 'Main',\n  PRELOAD = 'Preload',\n  RENDERER = 'Renderer',\n\n  APP_IPC = 'AppIpc',\n  APP_SERVICE = 'AppService',\n  APP_UPDATE = 'AppUpdater',\n  APP_PROTOCOL = 'AppProtocol',\n  APP_PROXY = 'AppProxy',\n  APP_POWER_MONITOR = 'AppPowerMonitor',\n  APP_WINDOW = 'AppWindow',\n  APP_SHORTCUT = 'AppShortcut',\n  APP_LOCALE = 'AppLocale',\n\n  CDP = 'Cdp',\n  DATABASE = 'Database',\n  FASTIFY = 'Fastify',\n  FFMPEG = 'FFmpeg',\n  FILE_STORAGE = 'FileStorage',\n  PYTHON = 'Python',\n  SYNC_STORAGE = 'SyncStorage',\n  BINARY = 'Binary',\n\n  FILM_REC_DOUBAN = 'FilmRecDouban',\n  FILM_REC_HOT = 'FilmRecHot',\n  FILM_REC_BARRAGE = 'FilmRecBarrage',\n  FILM_CMS = 'FilmCms',\n\n  AIGC_HELPER = 'AigcHelper',\n  DATA_HELPER = 'DataHelper',\n  PARSE_HELPER = 'ParseHelper',\n  SYSTEM_HELPER = 'SystemHelper',\n\n  UTIL_PROCESS = 'UtilProcess',\n  UTIL_ZIP = 'UtilsZip',\n\n  PLUGIN = 'Plugin',\n\n  I18N = 'I18n',\n}\n\nexport type ILogModuleType = `${LOG_MODULE}`;\n\nexport const ANSICOLORS = {\n  RED: '\\x1B[31m',\n  GREEN: '\\x1B[32m',\n  // YELLOW: '\\x1B[33m', // light yellow is hard to see on light background\n  YELLOW: '\\x1B[38;5;178m',\n  BLUE: '\\x1B[34m',\n  MAGENTA: '\\x1B[35m',\n  CYAN: '\\x1B[36m',\n  END: '\\x1B[0m',\n  BOLD: '\\x1B[1m',\n  ITALIC: '\\x1B[3m',\n  UNDERLINE: '\\x1B[4m',\n};\n\nexport const LEVEL_COLOR_MAP: Record<LogLevel, keyof typeof ANSICOLORS> = {\n  [LEVEL.ERROR]: 'RED',\n  [LEVEL.WARN]: 'YELLOW',\n  [LEVEL.INFO]: 'GREEN',\n  [LEVEL.DEBUG]: 'CYAN',\n  [LEVEL.VERBOSE]: 'END',\n  [LEVEL.SILLY]: 'END',\n  [LEVEL.NONE]: 'END',\n};\n"
  },
  {
    "path": "packages/shared/config/notification.ts",
    "content": "export type INotificationType = 'progress' | 'success' | 'error' | 'warning' | 'info' | 'action';\nexport type INotificationSource = 'assistant' | 'backup' | 'knowledge' | 'update';\n\nexport interface INotification<T = any> {\n  /** 通知唯一标识 */\n  id: string;\n  /** 通知分类 */\n  type: INotificationType;\n  /** 简要标题，用于列表或弹框的主文案 */\n  title: string;\n  /** 详细描述，可包含执行上下文、结果摘要等 */\n  message: string;\n  /** 时间戳，便于排序与去重 */\n  timestamp: number;\n  /** 可选的进度值（0～1），针对长任务反馈 */\n  progress?: number;\n  /** 附加元数据，T 可定制各种业务字段 */\n  meta?: T;\n  /** 点击或操作回调标识，前端可根据此字段触发路由或函数 */\n  actionKey?: string;\n  /** 声音/声音开关标识，结合用户偏好决定是否播放 */\n  silent?: boolean;\n  /** 渠道：系统级（OS 通知）｜应用内（UI 通知） */\n  channel?: 'system' | 'in-app';\n  /** 点击回调函数，仅在 type 为 'action' 时有效 */\n  onClick?: () => void;\n  /** 通知源 */\n  source: INotificationSource;\n}\n"
  },
  {
    "path": "packages/shared/config/parse.ts",
    "content": "export const ANALYZE_TYPE = {\n  WEB: 1,\n  JSON: 2,\n} as const;\nexport type IAnalyzeType = (typeof ANALYZE_TYPE)[keyof typeof ANALYZE_TYPE];\nexport const analyzeTypes = Object.values(ANALYZE_TYPE);\n"
  },
  {
    "path": "packages/shared/config/req.ts",
    "content": "export const REQ_METHOD = {\n  GET: 'GET',\n  POST: 'POST',\n  PUT: 'PUT',\n  DELETE: 'DELETE',\n  PATCH: 'PATCH',\n  HEAD: 'HEAD',\n  OPTIONS: 'OPTIONS',\n} as const;\nexport type IReqMethod = (typeof REQ_METHOD)[keyof typeof REQ_METHOD];\nexport const reqMethods = Object.values(REQ_METHOD);\n\nexport const REQ_CONTENT_TYPE = {\n  FORM_URLENCODED: 'application/x-www-form-urlencoded',\n  FORM_DATA: 'multipart/form-data',\n  JSON: 'application/json',\n  XML: 'application/xml',\n  TEXT: 'text/plain',\n} as const;\nexport type IReqContentType = (typeof REQ_CONTENT_TYPE)[keyof typeof REQ_CONTENT_TYPE];\nexport const reqContentTypes = Object.values(REQ_CONTENT_TYPE);\n\nexport const REQ_ENCODE = {\n  GB18030: 'GB18030',\n  GB2312: 'GB2312',\n  GBK: 'GBK',\n  UTF8: 'UTF-8',\n} as const;\nexport type IReqEncode = (typeof REQ_ENCODE)[keyof typeof REQ_ENCODE];\nexport const reqEncodes = Object.values(REQ_ENCODE);\n\nexport interface IReqOptions {\n  url: string;\n  method: IReqMethod;\n  encode: IReqEncode;\n  headers: Record<string, any> | string;\n  params: Record<string, any> | string;\n  data: Record<string, any> | string;\n  timeout: number;\n}\n\nexport interface IReqResponse {\n  code: number;\n  headers: Record<string, any>;\n  data: any;\n}\n"
  },
  {
    "path": "packages/shared/config/setting.ts",
    "content": "export enum SNIFFER_TYPE {\n  CDP = 'cdp',\n  CUSTOM = 'custom',\n}\nexport type ISnifferType = `${SNIFFER_TYPE}`;\n\nexport enum REC_HOT_TYPE {\n  BAIDU = 'baidu',\n  DOUBAN = 'douban',\n  ENLIGHTENT = 'enlightent',\n  KOMECT = 'komect',\n  KYLIVE = 'kylive',\n  QUARK = 'quark',\n}\nexport type IRecHotType = `${REC_HOT_TYPE}`;\n\nexport enum PLAYER_TYPE {\n  XGPLAYER = 'xgplayer',\n  DPLAYER = 'dplayer',\n  ARTPLAYER = 'artplayer',\n  NPLAYER = 'nplayer',\n  OPLAYER = 'oplayer',\n  // ALIPLAYER = 'aliplayer',\n  // VEPLAYER = 'veplayer',\n  CUSTOM = 'custom',\n}\nexport type IPlayerType = `${PLAYER_TYPE}`;\nexport type IPlayerTypeWithoutCustom = Exclude<IPlayerType, 'custom'>;\n\nexport enum AIGC_PROVIDER_TYPE {\n  AMZON = 'amazon',\n  ANTHROPIC = 'anthropic',\n  AZURE = 'azure',\n  GEMINI = 'gemini',\n  OPENAI = 'openai',\n}\nexport type IAigcProviderType = `${AIGC_PROVIDER_TYPE}`;\n\nexport enum PROXY_TYPE {\n  CUSTOM = 'custom',\n  DIRECT = 'direct',\n  SYSTEM = 'system',\n}\nexport type IProxyType = `${PROXY_TYPE}`;\n"
  },
  {
    "path": "packages/shared/config/shortcut.ts",
    "content": "export enum SHORTCUT_TYPE {\n  GLOBAL = 'global',\n  LOCAL = 'local',\n}\nexport type IShortcutType = (typeof SHORTCUT_TYPE)[keyof typeof SHORTCUT_TYPE];\n\nexport interface IShortcutConfig {\n  type: IShortcutType;\n  winName?: string;\n  shortcut: string;\n  handler: () => Promise<void> | void | string;\n  cb?: () => Promise<void> | void;\n}\n"
  },
  {
    "path": "packages/shared/config/tblSetting.ts",
    "content": "import type { IAigcProviderType, IPlayerType, IRecHotType, ISnifferType } from '../config/setting';\nimport type { ITheme } from '../config/theme';\nimport { USER_AGENT } from '../config/userAgent';\nimport type { ILang } from '../locales';\n\nexport const settingList = [\n  { key: 'version', value: '3.4.1' },\n  { key: 'disclaimer', value: false },\n  { key: 'theme', value: 'system' },\n  { key: 'lang', value: 'system' },\n  { key: 'timeout', value: 10000 },\n  { key: 'hot', value: 'kylive' },\n  { key: 'defaultAnalyze', value: '' },\n  { key: 'defaultIptv', value: '' },\n  { key: 'defaultSite', value: '' },\n  {\n    key: 'site',\n    value: {\n      searchMode: 'site',\n      filterMode: false,\n    },\n  },\n  {\n    key: 'live',\n    value: {\n      ipMark: true,\n      thumbnail: false,\n      delay: false,\n      epg: 'https://epg.112114.eu.org/?ch={name}&date={date}',\n      logo: 'https://epg.112114.eu.org/logo/{name}.png',\n    },\n  },\n  { key: 'bossKey', value: '' },\n  { key: 'autoLaunch', value: false },\n  { key: 'hardwareAcceleration', value: true },\n  {\n    key: 'ua',\n    value: USER_AGENT.PC_DARWIN_CHROME,\n  },\n  { key: 'proxy', value: { type: 'system', url: '', bypass: '' } },\n  { key: 'dns', value: '' },\n  { key: 'player', value: { type: 'artplayer', external: '' } },\n  { key: 'sniffer', value: { type: 'cdp', url: '' } },\n  {\n    key: 'barrage',\n    value: {\n      url: '',\n      id: 'name',\n      key: 'danmuku',\n      support: ['youku', 'qq', 'iqiyi', 'qiyi', 'letv', 'leshi', 'sohu', 'tudou', 'pptv', 'mgtv', 'imgo'],\n      type: 1,\n      text: 4,\n      start: 0,\n      color: 2,\n    },\n  },\n  {\n    key: 'cloud',\n    value: {\n      sync: false,\n      type: 'webdav',\n      url: 'https://dav.jianguoyun.com/dav/',\n      username: '',\n      password: '',\n    },\n  },\n  { key: 'aigc', value: { type: 'openai', server: '', key: '', model: 'gpt-3.5-turbo' } },\n  { key: 'zoom', value: 1 },\n  { key: 'debug', value: false },\n] as const;\n\nexport const settingObj: ISetting = settingList.reduce(\n  (acc, { key, value }) => ({ ...acc, [key]: value }),\n  {} as ISetting,\n);\n\nexport type ISettingKey = (typeof settingList)[number]['key'];\n\nexport const settingKeys: ISettingKey[] = settingList.map((item) => item.key);\n\nexport interface ISetting {\n  version: string;\n  disclaimer: boolean;\n  theme: ITheme;\n  lang: ILang;\n  timeout: number;\n  hot: IRecHotType;\n  defaultAnalyze: string;\n  defaultIptv: string;\n  defaultSite: string;\n  site: {\n    searchMode: string;\n    filterMode: boolean;\n  };\n  live: {\n    ipMark: boolean;\n    thumbnail: boolean;\n    delay: boolean;\n    epg: string;\n    logo: string;\n  };\n  bossKey: string;\n  autoLaunch: boolean;\n  hardwareAcceleration: boolean;\n  ua: string;\n  proxy: {\n    type: string;\n    url: string;\n    bypass: string;\n  };\n  dns: string;\n  player: {\n    type: IPlayerType;\n    external: string;\n  };\n  sniffer: {\n    type: ISnifferType;\n    url: string;\n  };\n  barrage: {\n    url: string;\n    id: string;\n    key: string;\n    support: string[];\n    type: number;\n    text: number;\n    start: number;\n    color: number;\n  };\n  cloud: {\n    sync: boolean;\n    type: 'webdav' | 'icloud';\n    url: string;\n    username: string;\n    password: string;\n  };\n  aigc: {\n    type: IAigcProviderType;\n    server: string;\n    key: string;\n    model: string;\n  };\n  zoom: number;\n  debug: boolean;\n}\n\nexport type ISetupKey = 'disclaimer' | 'theme' | 'lang' | 'bossKey' | 'player' | 'barrage' | 'timeout' | 'debug';\n\nexport const setupKeys: ISetupKey[] = [\n  'disclaimer',\n  'theme',\n  'lang',\n  'bossKey',\n  'player',\n  'barrage',\n  'timeout',\n  'debug',\n];\n\nexport type ISetup = Pick<ISetting, ISetupKey>;\n\nexport const setupList = settingList.filter((item) => setupKeys.includes(item.key as ISetupKey));\n\nexport const setupObj = setupList.reduce((acc, { key, value }) => ({ ...acc, [key]: value }), {} as ISetup);\n"
  },
  {
    "path": "packages/shared/config/theme.ts",
    "content": "export enum THEME {\n  LIGHT = 'light',\n  DARK = 'dark',\n  SYSTEM = 'system',\n}\n\nexport type ITheme = `${THEME}`;\nexport type IThemeWithoutSystem = Exclude<ITheme, 'system'>;\n"
  },
  {
    "path": "packages/shared/config/userAgent.ts",
    "content": "export enum USER_AGENT {\n  PC_DARWIN_CHROME = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',\n  PC_DARWIN_SAFARI = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15',\n  PC_WIN32_CHROME = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36',\n  PC_WIN32_EDGE = 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.20231',\n  PC_WIN32_FIREFOX = 'Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0',\n  MOBILE_IOS_SAFARI = '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',\n  MOBILE_ANDROID_PIXEL = 'Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36',\n  MOBILE_ANDROID_MI_UC = 'Mozilla/5.0 (Linux; U; Android 9; zh-CN; MI 9 Build/PKQ1.181121.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.5.5.1035 Mobile Safari/537.36',\n  MPV = 'libmpv',\n  OKHTTP = 'okhttp/4.9.1',\n  DART = 'Dart/2.14 (dart:io)',\n  UA = 'Mozilla/5.0',\n}\n\nexport type IUserAgent = `${USER_AGENT}`;\n"
  },
  {
    "path": "packages/shared/config/window.ts",
    "content": "export enum WINDOW_NAME {\n  MAIN = 'main',\n  PLAYER = 'player',\n  SNIFFER = 'sniffer',\n  BROWSER = 'browser',\n  OTHER = 'other',\n}\n\nexport interface ISize {\n  width: number;\n  height: number;\n}\n\nexport interface IWindowSize {\n  default: ISize;\n  min: ISize;\n}\n\nexport const WINDOW_SIZE: Record<WINDOW_NAME, IWindowSize> = {\n  [WINDOW_NAME.MAIN]: {\n    default: { width: 1000, height: 640 },\n    min: { width: 1000, height: 640 },\n  },\n  [WINDOW_NAME.PLAYER]: {\n    default: { width: 960, height: 600 },\n    min: { width: 528, height: 297 },\n  },\n  [WINDOW_NAME.SNIFFER]: {\n    default: { width: 1000, height: 640 },\n    min: { width: 1000, height: 640 },\n  },\n  [WINDOW_NAME.BROWSER]: {\n    default: { width: 1000, height: 640 },\n    min: { width: 1000, height: 640 },\n  },\n  [WINDOW_NAME.OTHER]: {\n    default: { width: 1000, height: 640 },\n    min: { width: 1000, height: 640 },\n  },\n};\n"
  },
  {
    "path": "packages/shared/config/xmlOptions.ts",
    "content": "// @see https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/docs/v6/3.Options.md\nexport const defaultOptions = {\n  ignoreDeclaration: true,\n  ignoreAttributes: false,\n  attributeNamePrefix: '',\n  textNodeName: '$text',\n  parseAttributeValue: true, // \"true\" → true，\"123\" → 123\n  trimValues: true,\n};\n"
  },
  {
    "path": "packages/shared/locales/index.ts",
    "content": "const langModules = import.meta.glob('./lang/*/index.ts', { eager: true });\n\nconst langModuleMap = new Map<string, object>();\n\nexport const langCode: Array<ILangWithoutSystem> = [];\n\nexport type ILangCode = (typeof langCode)[number];\n\nexport type ISupportLang = 'zh-CN' | 'zh-TW' | 'el-GR' | 'en-US' | 'es-ES' | 'fr-FR' | 'ja-JP' | 'pt-PT' | 'ru-RU';\nexport type ILang = ISupportLang | 'system';\nexport type ILangWithoutSystem = Exclude<ILang, 'system'>;\n\nconst generateLangModuleMap = () => {\n  const fullPaths = Object.keys(langModules);\n  fullPaths.forEach((fullPath) => {\n    const k = fullPath.replace('./lang', '');\n    const startIndex = 1;\n    const lastIndex = k.lastIndexOf('/');\n    const code = k.substring(startIndex, lastIndex);\n    langCode.push(code as ILangWithoutSystem);\n    langModuleMap.set(code, langModules[fullPath] as object);\n  });\n};\n\nexport const messages = () => {\n  generateLangModuleMap();\n\n  const message = {};\n  langModuleMap.forEach((value: any, key) => {\n    message[key] = value.default;\n  });\n  return message;\n};\n\nexport const lang = () => {\n  if (langModuleMap.size === 0) generateLangModuleMap();\n\n  const list: Array<{ value: ILangWithoutSystem; label: string }> = [];\n  langModuleMap.forEach((value: any, key) => {\n    list.push({ label: value.default.lang, value: key as ILangWithoutSystem });\n  });\n\n  return list;\n};\n\nexport const fallbackLocale = 'en-US';\nexport const defaultLocale = 'zh-CN';\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/aigc.ts",
    "content": "export default {\n  title: 'Intelligent Assistant',\n  subheading: 'AIGC',\n  field: {\n    key: 'Key',\n    model: 'Model',\n    providerMap: {\n      amazon: 'Amazon Bedrock',\n      anthropic: 'Anthropic',\n      azure: 'Azure',\n      gemini: 'Gemini',\n      openai: 'OpenAI',\n    },\n  },\n  chat: {\n    tip: 'Hello! I am the {0} intelligent assistant, how can I help you?',\n    suggestion: {\n      desc: {\n        title: 'What is {0}?',\n        prompt: 'Introduce {0}',\n      },\n    },\n    modelChange: 'Provided by {0} model',\n    stopGenerating: 'User has stopped content generation',\n  },\n  status: {\n    reason: 'Think',\n    reasoning: 'Thinking...',\n    reasoned: 'Thought deeply',\n  },\n  declare: 'Content generated by AI, for reference only.',\n  noParam: 'Parameters are incorrect, please go to [Setting->Base Config] to configure ai related data.',\n  message: {\n    createSessionFailed: 'Create session failed',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/common.ts",
    "content": "export default {\n  success: 'Success',\n  fail: 'Fail',\n  copy: 'Copy',\n  copySuccess: 'Copy Success',\n  copyFail: 'Copy Fail',\n  error: 'Error',\n  cancel: 'Cancel',\n  confirm: 'Confirm',\n  default: 'Default',\n  clear: 'Clear',\n  reset: 'Reset',\n  delete: 'Delete',\n  save: 'Save',\n  close: 'Close',\n  open: 'Open',\n  execute: 'Execute',\n  original: 'Original',\n  sourceCode: 'Source Code',\n  debug: 'Debug',\n  demo: 'Demo',\n  help: 'Help',\n  store: 'Store',\n  provider: 'Provider',\n  step: 'Step',\n  stepNum: 'Step {0}',\n  input: 'Input',\n  output: 'Output',\n  preview: 'Preview',\n  action: 'Action',\n  select: 'Select',\n  search: 'Search',\n  filter: 'Filter',\n  play: 'Play',\n  home: 'Home',\n  recommend: 'Recommend',\n  all: 'All',\n  more: 'More',\n  moreParams: 'More Params',\n  optional: 'Optional',\n  optionalParams: 'Optional Params',\n  auto: 'Auto',\n  followSystem: 'Auto',\n  manual: 'Manual',\n  lang: 'Language',\n  agree: 'Agree',\n  disagree: 'Disagree',\n  enable: 'Enable',\n  disable: 'Disable',\n  on: 'On',\n  off: 'Off',\n  installed: 'Installed',\n  uninstalled: 'Uninstalled',\n  install: 'Install',\n  installing: 'Installing',\n  uninstall: 'Uninstall',\n  valid: 'Valid',\n  invalid: 'Invalid',\n  encode: 'Encode',\n  decode: 'Decode',\n  compute: 'Compute',\n  unknown: 'Unknown',\n  status: 'Status',\n  id: 'Id',\n  operate: 'Operate',\n  add: 'Add',\n  edit: 'Edit',\n  view: 'View',\n  env: 'Env',\n  check: 'Check',\n  checking: 'Please wait, checking...',\n  reCheck: 'ReCheck',\n  download: 'Download',\n  downloading: 'Please wait, downloading...',\n  downloaded: 'Downloaded',\n  register: 'Register',\n  unRegister: 'Unregister',\n  Registerd: 'Registered',\n  import: 'Import',\n  export: 'Export',\n  flag: 'Flag',\n  random: 'Random',\n  tip: 'Tip',\n  config: 'Config',\n  name: 'Name',\n  type: 'Type',\n  group: 'Group',\n  upload: 'Upload',\n  update: 'Update',\n  info: 'Info',\n  explain: 'Explain',\n  param: 'Parameters',\n  url: 'Url',\n  link: 'Link',\n  api: 'Api',\n  log: 'Log',\n  cache: 'Cache',\n  support: 'Support',\n  unSupport: 'UnSupport',\n  scan: 'Scan',\n  space: 'Space',\n  data: 'Data',\n  content: 'Content',\n  custom: 'Custom',\n  gain: 'Gain',\n  test: 'Test',\n  connect: 'Connect',\n  reconnect: 'Reconnect',\n  adapter: 'Adapter',\n  request: {\n    title: 'Request',\n    param: 'Parameters',\n    headers: 'Headers',\n    data: 'Data',\n    method: 'Method',\n    contentType: 'Type',\n  },\n  unit: {\n    s: '{0}s',\n    ms: '{0}ms',\n  },\n  theme: {\n    title: 'Theme',\n    light: 'Light',\n    dark: 'Dark',\n  },\n  placeholder: {\n    input: 'please enter',\n    inputTag: 'please enter, press enter to confirm tag',\n    inputSplit: `please enter, split by '{0}'`,\n    inputEg: 'please enter, e.g. {0}',\n    inputSet: 'click to set',\n    request: {\n      headers: `please enter, e.g. {'{'} \"User-Agent\": \"zyfun\" {'}'}`,\n      data: `please enter, e.g. {'{'} \"uuid\": \"zyfun\" {'}'}`,\n    },\n  },\n  message: {\n    noSelect: 'Please select at least one item',\n    noData: 'No data available',\n    noMore: 'No more',\n    noUrl: 'No URL',\n    noEnable: 'Data is not enabled yet',\n    noRequiredParam: 'Missing required parameters {0}',\n    errRequiredParam: 'Required parameter {0} format error',\n    installing: 'Installing, please refresh later to check...',\n  },\n  popup: {\n    delete: 'Are you sure you want to delete?',\n  },\n  alert: {\n    debugModuleConflict:\n      'Page conflicts with debug mode, please go to [Setting->Base Config->Permission] to turn it off',\n  },\n  infiniteLoading: {\n    noSelect: 'Please select a data source',\n    complete: 'Load Complete',\n    error: 'Load Error',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/component.ts",
    "content": "export default {\n  action: {\n    countdown: '{0}s to close',\n    fullview: 'Full View',\n  },\n  hot: {\n    title: 'Hot Searches',\n    category: {\n      title: 'Category',\n      field: {\n        1: 'Movie',\n        2: 'Tv',\n        3: 'Art',\n        4: 'Animation',\n      },\n    },\n  },\n  search: {\n    title: 'Search',\n    history: 'Search History',\n    placeholder: {\n      input: 'Search all network resources',\n    },\n  },\n  share: {\n    title: 'Share',\n    scan: 'Scan to continue watching',\n    copyright: 'Only provide support, strictly prohibit resource distribution.',\n  },\n  sponsor: {\n    title: 'Sponsor',\n    buyCoffee: 'Buy author a coffee',\n    scanDonate: 'Scan to donate',\n  },\n  codeEditor: {\n    editor: {\n      code: 'Editor',\n      html: 'Web Source',\n    },\n    output: {\n      problem: 'Problem',\n      output: 'Output',\n      debugConsole: 'Debug Console',\n      logger: 'Logger',\n      terminal: 'Terminal',\n      testResult: 'Test Result',\n    },\n  },\n  terminal: {\n    logger: {\n      message: {\n        success: 'Logger module connected successfully',\n        fail: 'Logger module connection failed',\n        error: 'Logger module encountered an error',\n        noSupport: 'Current adapter does not support logging output',\n      },\n    },\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/index.ts",
    "content": "import componentsLocale from 'tdesign-vue-next/es/locale/en_US';\n\nimport aigc from './aigc';\nimport common from './common';\nimport component from './component';\nimport media from './media';\nimport pages from './pages';\nimport system from './system';\n\nexport default {\n  lang: 'English',\n  aigc,\n  common,\n  component,\n  componentsLocale,\n  media,\n  pages,\n  system,\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/media.ts",
    "content": "export default {\n  decoder: 'Decoder',\n  decoderMap: {\n    audio: 'Audio',\n    hls: 'Hls',\n    flv: 'Flv',\n    mp4: 'Mp4',\n    dash: 'Dash',\n    torrent: 'Torrent',\n  },\n  player: 'Player',\n  playerMap: {\n    veplayer: 'VePlayer',\n    xgplayer: 'XgPlayer',\n    tcplayer: 'TcPlayer',\n    aliplayer: 'AliPlayer',\n    artplayer: 'ArtPlayer',\n    oplayer: 'OPlayer',\n    dplayer: 'DPlayer',\n    nplayer: 'NPlayer',\n    ckplayer: 'CkPlayer',\n    customplayer: 'CustomPlayer',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/assets/binary-help.md",
    "content": "- Click to install and it will be added to the task queue, no need to click multiple times to trigger, wait patiently.\n- If the installation takes too long, try refreshing the page and re-installing.\n- Some installations may require scientific internet access (limited by network provider).\n- Some binaries are only compatible with some operating systems (limited by service providers).\n- Check logs for specific reasons for failed installations.\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/assets/custom-player.md",
    "content": "> Dependent software path or env\n\n- How to set:\n  - Windows: `software -> right-click -> properties -> target`\n  - Mac: `/Applications/SoftwareName.app`\n  - Linux: `whereis SoftwareName`\n- Common player `[modify path to suit]`\n  - PotPlayer(Window): `C:\\Program Files (x86)\\PotPlayer\\PotPlayerMini64.exe`\n  - VLC(Window): `C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe`\n  - IINA(Mac): `/Applications/IINA.app`\n  - VLC(Mac): `/Applications/VLC.app`\n  - VLC(Linux): `/usr/bin/vlc`\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/assets/disclaimer.md",
    "content": "> Release date: December 1, 2025\n\n> Effective Date: December 1, 2025\n\n**Thank you for choosing to use `zyfun` (hereinafter referred to as the Software), the user (hereinafter referred to as you) before using the Software, please read and understand the following:**\n\n1. If you do not agree with any of the following, please stop using the Software immediately. Once you start using the Software, you agree.\n2. This software is for personal study, research and technical exchange only, and only provides display functions, all data resources are provided by your own production, including but not limited to video sites, media sharing sites. The Software has no control over the legality, accuracy, completeness or availability of these data resources, and therefore is not responsible for the authenticity, legality or applicability of the content of the resources.\n3. We would like to remind you that third-party advertisements, product promotion information and other related content may appear in the videos or pop-ups, which are implanted by the data resources provided by you, so please be vigilant in the process of experiencing the authenticity and legitimacy of such information, and the Software will not be responsible for any loss incurred as a result.\n4. This software uses web crawler (including sniffing) technology to obtain part of the data to provide you with more comprehensive information services, it is worth noting that these data have not been authorized. The copyright holder has the right to charge you the relevant fees, this software is not responsible for this part of the license fee. Including but not limited to `douban.com` `kuy.live` `enlightent.cn` `komect.com` `baidu.com` `quark.sm.cn`and `112114.xyz`.\n5. The Software only uses `iframe` technology to embed the content of multiple video platforms, including but not limited to `360 Video(360kan.com)` `IQIYI(iq.com)` `WeTv(wetv.vip)` `YouKu(youku.tv)` `MangoTV(w.mgtv.com)` `Letv(le.com)` `Sohu Video(tv.sohu.com)` `PPTV(pptv.com)`and`Bilibili(bilibili.tv)`. You should comply with the privacy policy or service agreement of the corresponding platform.\n6. This software contains the option of \"Remove Ads\" to enhance the user experience, and you should be aware that there may be compatibility problems when this option is turned on. You should be aware that there may be compatibility problems when this option is enabled. At the same time, this option may violate the terms of business of third-party vendors, and you should comply with the terms and conditions of the corresponding vendor.\n7. In order to comply with the content auditing requirements of the Cybersecurity Law, this software does not have the ability to audit the content and therefore does not provide the service of sending pop-ups. The content of the pop-up screen display may contain undesirable remarks, due to the data from the data resources you provide, we can not clean this process, you should ignore this part of the pop-up screen content. We call on users to use civilized language, and work together to maintain a healthy network environment.\n8. We realize that privacy is priceless. Therefore, this software never collects any user data, except for the necessary backup (this process is managed by the third-party vendors you provide), all information is strictly stored locally to ensure that your data is only under your control. The Software does not share any of your information with any third party.\n9. According to the relevant regulations of Artificial Generative Intelligence (AIGC), users shall strictly observe the principles of lawful use, content specification and prohibition of misuse when using AIGC services.The content generated by AIGC is for reference only, and its accuracy, completeness or suitability is not guaranteed and does not represent our position. The relevant data will be shared to the third party AIGC service provider.\n10. This software is completely `free` and `open source`, if you pay to download this software through any channel, it means you have been cheated. If you like the software, you can sponsor us to show your support for open source software, but you should clearly understand that sponsorship does not guarantee any service and does not constitute any form of contractual relationship.\n11. You are solely responsible for all operations and results of your use of the Software. The Software is not responsible for any content you obtain through the use of the Software, including but not limited to the accuracy, copyright compliance, completeness, security and availability of media resources. No liability is accepted for any loss, damage or legal dispute arising from the use of the Software.\n12. You must comply with the relevant laws and regulations of your country or region when using the Software, and are prohibited from using the Software to conduct any unlawful activities, including, but not limited to, producing, uploading, disseminating, storing any illegal, infringing, obscene, defamatory, malware and other content. If you violate the relevant laws and regulations, you need to bear the corresponding legal responsibility.\n13. This Agreement applies to all users of the Software. The Software reserves the right to modify and update this statement at any time and notify users in the form of `software updates` or `Github Readme` documents. Please review and comply with the latest agreement periodically.\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/assets/lab-edit-help.md",
    "content": "- Init\n  - The ext parameter will be lost every time it is initialized, to use the ext parameter you need to go to [Setting -> Film Config] to configure the debug source manually.\n  - If the debug source doesn't exist, you can refresh the page or go to [Setting -> Film Config] to manually create a debug source (the id field must be debug, others are optional).\n- Editor: If you get a lot of syntax errors, switch to another adapter and reselect it.\n- Logger: Some adapters do not support log output.\n- Adapter\n  - T4: Go to [Lab->Extension Manager->Plugin] install the corresponding module\n  - T3[py]\n    - For those who have adapted the plugin, go to[Lab->Extension Manager->Environment] install uv module\n    - Click initialize will automatically install python environment, first time you need to wait patiently, if it fails, you need to do it manually.\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/assets/live-epg.md",
    "content": "**The absence of electronic program listings for some channels is a normal phenomenon and is controlled by a third-party data platform.**\n\n> The interface supports `diyp` and `xml` modes.\n\n- diyp\n  - Requires the parameters {'{'}name{'}'} (identifying the channel name to be queried) and {'{'}date{'}'} (identifying the channel date to be queried).\n  - e.g. `https://epg.xxx.com/?ch={'{'}name{'}'}&date={'{'}date{'}'}`\n- xml\n  - This mode requires no configuration parameters\n  - This mode does not support date lookups\n  - e.g. `http://epg.xxx.com/e.xml`\n\n> Priority: [Setting->Live Config->Single Source-Epg field] > [Setting->BasicConfig->Live-Epg field]\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/assets/live-logo.md",
    "content": "**It is normal that some channels are not labeled, which is controlled by third-party data platforms.**\n\n- Configuration parameter {'{'}name{'}'}(identify the name of the station) is required.\n- e.g. `https://epg.xxx.com/logo/{name}.png`\n\n> Priority: [Channel's own logo field] > [Setting-Live Config-Single Source-Logo field] > [Setting-BasicConfig-Live- Logo field]\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/browser.ts",
    "content": "export default {\n  title: 'Browser',\n  message: {\n    tabOverflow: 'Too many tabs, please close some tabs',\n    noSupportProtocol: 'Links with this protocol are not supported to open',\n  },\n  button: {\n    openInBrowser: 'Open with default browser',\n  },\n  history: {\n    recent: 'Recently opened',\n    tip: 'Record only the most recent {0} views',\n  },\n  tab: {\n    newTab: 'New Tab',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/film.ts",
    "content": "export default {\n  title: 'Film',\n  noDesc: 'No plot summary',\n  info: {\n    type: 'Type',\n    area: 'Area',\n    release: 'Release',\n  },\n  infiniteLoading: {\n    noConfig: 'Please go to [Setting->Film Config] to configure the data',\n  },\n  message: {\n    formatEpisodeError: 'Data source formatting episode error, check if the data source is normal',\n    notSelectAnalyze: 'Recognized official data, but no analyze selected',\n    notSelectSourceBeforeSearch: 'No data source selected or Site Mode data source search status is off',\n    noEffectiveSearchSource:\n      'No effective search data source, please check the data source search configuration and search mode',\n    noDetailInfo: 'Detail data is missing or incorrect',\n    noSiteInfo: 'Failed to find associated data source',\n    noSupportAction: 'Current operation is not supported',\n  },\n  field: {\n    name: 'Name',\n    type: 'Type',\n    typeMap: {\n      't0-xml': 'T0[xml]',\n      't1-json': 'T1[json]',\n      't3-js_drpy': 'T3[js_drpy]',\n      't3-js_catopen': 'T3[catopen]',\n      't3-csp_xbpq': 'T3[csp_xbpq]',\n      't3-csp_xyq': 'T3[csp_xyq]',\n      't3-csp_appysv2': 'T3[csp_appysv2]',\n      't3-alist': 'T3[alist]',\n      't3-csp_appget': 'T3[csp_appget]',\n      't3-csp_appqi': 'T3[csp_appqi]',\n      't3-csp_appfox': 'T3[csp_appfox]',\n      't3-py': 'T3[py]',\n      't4-drpys': 'T4[drpys]',\n      't4-catvod': 'T4[catvod]',\n      't4-drpy_js0': 'T4[drpy_js0]',\n    },\n    key: 'Key',\n    api: 'Api',\n    search: 'Search',\n    searchMap: {\n      close: 'Close',\n      only: 'Only',\n      gather: 'Gather',\n    },\n    playUrl: 'Parse',\n    ext: 'Extension',\n    group: 'Group',\n    category: 'Category',\n    searchClose: 'Close',\n    searchOnly: 'Only',\n    searchGather: 'Gather',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/index.ts",
    "content": "import browser from './browser';\nimport film from './film';\nimport lab from './lab';\nimport live from './live';\nimport md from './md';\nimport moment from './moment';\nimport parse from './parse';\nimport player from './player';\nimport plugin from './plugin';\nimport setting from './setting';\n\nexport default {\n  browser,\n  film,\n  lab,\n  live,\n  md,\n  moment,\n  parse,\n  player,\n  plugin,\n  setting,\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/lab.ts",
    "content": "export default {\n  title: 'Lab',\n  crypto: {\n    title: 'Char Encoding',\n    field: {\n      content: 'Content',\n      key: 'Key',\n      cert: 'Cert',\n      inputEncode: 'Input',\n      outputEncode: 'Output',\n    },\n    encrypt: {\n      title: 'Encrypt',\n      field: {\n        iv: 'IV',\n        mode: 'Mode',\n        pad: 'Padding',\n        tag: 'Tag',\n        aad: 'AAD',\n        passphrase: 'Passphrase',\n        drop: 'Drop',\n        encodeMap: {\n          base64: 'Base64',\n          hex: 'Hex',\n          utf8: 'Utf8',\n          utf16: 'Utf16',\n          utf16be: 'Utf16BE',\n          utf16le: 'Utf16LE',\n          latin1: 'Latin1',\n        },\n        modeMap: {\n          cbc: 'CBC',\n          ctr: 'CTR',\n          cfb: 'CFB',\n          ofb: 'OFB',\n          ecb: 'ECB',\n          gcm: 'GCM',\n          xts: 'XTS',\n          ccm: 'CCM',\n        },\n        paddingMap: {\n          pkcs5Padding: 'Pkcs5',\n          pkcs7Padding: 'Pkcs7',\n          zeroPadding: 'Zero',\n          ansiX923: 'AnsiX923',\n          iso10126: 'Iso10126',\n          iso97971: 'Iso97971',\n          noPadding: 'NoPadding',\n          rsaesPkcs1: 'PKCS1',\n          rsaOaep: 'OAEP',\n          rsaOaepSha1: 'OAEP-SHA1',\n          rsaOaepSha256: 'OAEP-SHA256',\n          rsaOaepSha384: 'OAEP-SHA384',\n          rsaOaepSha512: 'OAEP-SHA512',\n          rsaOaepMd5: 'OAEP-MD5',\n        },\n        algorithmMap: {\n          rsa: 'RSA',\n          rc4: 'RC4',\n          rc4Drop: 'RC4Drop',\n          aes: 'AES',\n          des: 'DES',\n          tripleDes: '3DES',\n          rabbit: 'Rabbit',\n          rabbitLegacy: 'RabbitLegacy',\n          sm4: 'SM4',\n        },\n      },\n      message: {\n        encodeNotUtf8: 'Encryption does not support utf8 as an output format',\n        decodeNotUtf8: 'Decryption does not support utf8 as input format',\n      },\n    },\n    hash: {\n      title: 'Hash',\n      field: {\n        typeMap: {\n          hash: 'Hash',\n          hmac: 'Hmac',\n        },\n        algorithmMap: {\n          'md5-16': 'MD5-16',\n          'md5-32': 'MD5-32',\n          sha1: 'SHA1',\n          sha224: 'SHA224',\n          sha256: 'SHA256',\n          sha3: 'SHA3',\n          sha384: 'SHA384',\n          sha512: 'SHA512',\n          'sha512-224': 'SHA512-224',\n          'sha512-256': 'SHA512-256',\n          ripemd160: 'RIPEMD160',\n          sm3: 'SM3',\n        },\n      },\n    },\n    encode: {\n      title: 'Encode',\n      field: {\n        algorithmMap: {\n          unicode: 'UniCode',\n          base64: 'Base64',\n          html: 'Html',\n          url: 'URL',\n          hex: 'Hex',\n          gzip: 'Gzip',\n        },\n      },\n    },\n  },\n  diff: {\n    title: 'Text Diff',\n    file: 'File',\n    origin: 'Origin',\n    target: 'Target',\n    diff: 'Comparison',\n  },\n  edit: {\n    title: 'Source Editor',\n    nav: {\n      template: 'Template',\n      file: {\n        title: 'File',\n        folder: 'Folder',\n        import: 'Import',\n        export: 'Export',\n      },\n      decode: 'Decode',\n      debug: 'Debug',\n    },\n    rule: {\n      pdfa: 'Pdfa',\n      pdfh: 'Pdfh',\n      url: 'URL',\n      wd: 'Word',\n      page: 'Page',\n      tid: 'Tid',\n      filter: 'Filter',\n      ids: 'Ids',\n      flag: 'Flag',\n      play: 'Play',\n    },\n    action: {\n      init: 'Init',\n      home: 'Home',\n      homeVod: 'HomeVod',\n      category: 'Category',\n      detail: 'Detail',\n      search: 'Search',\n      play: 'Play',\n      proxy: 'Proxy',\n      proxyUpload: 'ProxyUpload',\n    },\n    debug: {\n      dom: 'Dom',\n      data: 'Data',\n    },\n    message: {\n      noInitSource:\n        'Automation process failed, please manually create a debug source as per the help and refresh the page',\n      codeNoData: 'Editor content is empty',\n      htmlNoData: 'HTML content is empty',\n    },\n    placeholder: {\n      pdfa: 'Please enter list rule (e.g. body&&li)',\n      pdfh: 'Please enter node rule (e.g. body&&a,0&&href)',\n      proxyUpload: 'Please enter a triple, [response code, response header, response body]',\n    },\n  },\n  sift: {\n    title: 'Static Sift',\n    source: 'editSource',\n    rule: {\n      className: 'ClassName',\n      classUrl: 'ClassUrl',\n      class: 'Class',\n      cateExclude: 'CateExclude',\n      link: 'Link',\n      filter: 'Filter',\n      filterInfo: 'FilterInfo',\n      excludeKeys: 'ExcludeKeys',\n      match: {\n        plot: 'Plot',\n        area: 'Area',\n        lang: 'Lang',\n        year: 'Year',\n        letter: 'Letter',\n        sort: 'Sort',\n      },\n    },\n    debug: {\n      data: 'Data',\n    },\n    action: {\n      category: 'Generate Category Info',\n      match: 'Generate Match List',\n      currentSift: 'Generate Current Sift',\n      finalSift: 'Generate Final Sift',\n      copyFinalSift: 'Copy Final Sift',\n    },\n    placeholder: {\n      classNameTip: 'Supplement Name(e.g. movie&plot), use & to split',\n      classUrlTip: 'Supplement Id(e.g. movie&plot), use & to split',\n      classParseTip: 'Selector(list;title;url;match), use ; to split',\n      cateExcludeTip: `Excluded(e.g. HOME{'|'}APP), use {'|'} to split`,\n      linkTip: 'Splicing fyclass(e.g. /id/fyclass.html)',\n      filterTip: 'Selector(e.g. body&&.scroll-content), use ; to split same type, use new line to split different type',\n      filterInfoTip: 'Selector(key;name;type;title;url), one per line',\n      keyExcludeTip: `Key Excluded(e.g. area{'|'}year), use {'|'} to split`,\n      reg: 'Regular Expression(e.g. show(.*?)/id',\n    },\n    message: {\n      inputNoClassParse: 'Parms classParse is empty',\n      inputNoFilterAndFilterInfo: 'Parms filter or filterInfo is empty',\n      sourceFirst: 'Get source first',\n      classResultisEmpty: 'Please execute generate sift category first',\n      siftResultisEmpty: 'Please execute generate final sift first',\n    },\n  },\n  sniffer: {\n    title: 'Media Sniffer',\n    field: {\n      initScript: 'Init Script',\n      runScript: 'Run Script',\n      customRegex: 'Match',\n      snifferExclude: 'Exclude',\n    },\n  },\n  player: {\n    title: 'Play Test',\n  },\n  extension: {\n    title: 'Extension Manager',\n    plugin: {\n      title: 'Plugin',\n      server: 'Server',\n      file: 'File',\n      empty: 'Empty',\n      info: {\n        title: 'Info',\n        author: 'Author',\n        desc: 'Desc',\n        status: 'Status',\n        stop: 'Stop',\n        start: 'Start',\n        error: 'Error',\n      },\n      control: {\n        title: 'Control',\n        start: 'Start',\n        stop: 'Stop',\n        devtool: 'Devtool',\n        upgrade: 'Upgrade',\n        update: 'Update',\n        install: 'Install',\n        uninstall: 'UnInstall',\n        uninstallTip: 'It will not work after uninstall, Please careful',\n        cancelTip: 'The current plug-in has an incomplete command, please wait moment',\n        devtoolDomAttchErrTip: 'The DOM is not mounted on the page, and the developer Tool failed to open',\n        loadUiEntryError: 'Failed to load entry',\n      },\n      content: {\n        title: 'README',\n      },\n      webview: {\n        title: 'ContentView',\n      },\n      installDialog: {\n        tip: {\n          tip1: 'Put the project into the specified directory, the file name must not have any special characters (if it is already in the directory, it will be ignored).',\n          tip2: 'Enter the project name to install (project file name)',\n        },\n        step: 'Step',\n        goDir: 'Go to Specified Directory',\n        confirm: 'Install',\n      },\n    },\n    env: {\n      title: 'Environment',\n    },\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/live.ts",
    "content": "export default {\n  title: 'Live',\n  delay: 'Delay',\n  infiniteLoading: {\n    noConfig: 'Please go to [Setting->Live Config] to configure the data',\n  },\n  field: {\n    name: 'Name',\n    api: 'Api',\n    apiMap: {\n      remote: 'Remote',\n      local: 'Local',\n      manual: 'Manual',\n    },\n    epg: 'Epg',\n    logo: 'Logo',\n  },\n  popup: {\n    epg: `diyp need to configure parameters {'{'}name{'}'}(identify the channel name to be queried) and {'{'}date{'}'}(identify the date of the channel to be queried); xml don't need to configure parameters.`,\n    logo: `Configuration parameter {'{'}name{'}'} is required (the logo needs to be queried for the name of the platform).`,\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/md.ts",
    "content": "import binaryHelpMD from './assets/binary-help.md?raw';\nimport customPlayerMD from './assets/custom-player.md?raw';\nimport disclaimerMD from './assets/disclaimer.md?raw';\nimport labEditHelpMD from './assets/lab-edit-help.md?raw';\nimport liveEpgMD from './assets/live-epg.md?raw';\nimport liveLogoMD from './assets/live-logo.md?raw';\n\nexport default {\n  customPlayer: {\n    title: 'Custom Player',\n    content: customPlayerMD,\n  },\n  disclaimer: {\n    title: 'Disclaimer',\n    content: disclaimerMD,\n    readComplete: 'Read complete',\n    readProcess: 'Read {0}%',\n    message: {\n      agree: 'Discover the world through movie watching',\n      disagree: 'Automatically exit the software after 3 seconds',\n    },\n  },\n  liveEpg: {\n    title: 'Live Channel Epg',\n    content: liveEpgMD,\n  },\n  liveLogo: {\n    title: 'Live Channel Logo',\n    content: liveLogoMD,\n  },\n  labEditHelp: {\n    title: 'Source Editor Help',\n    content: labEditHelpMD,\n  },\n  binaryHelp: {\n    title: 'Installation Help',\n    content: binaryHelpMD,\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/moment.ts",
    "content": "export default {\n  title: 'Moment',\n  history: {\n    title: 'History',\n  },\n  star: {\n    title: 'Favorite',\n    checkUpdate: 'Update',\n    isUpdate: 'Updated',\n  },\n  date: {\n    today: 'Today',\n    week: 'Weekly',\n    ago: 'Earlier',\n  },\n  progress: {\n    watched: 'Finished',\n    watching: 'Seen',\n  },\n  message: {},\n  noRelatedSource: 'No related data source',\n  noDesc: 'No plot summary',\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/parse.ts",
    "content": "export default {\n  title: 'Analyze',\n  play: 'Play',\n  search: {\n    input: 'Enter keyword to search',\n    enter: 'Enter',\n    clear: 'Clear',\n    tip: 'Enter {0} to quickly search source, for example',\n    watch: 'watch all about',\n    content: 'content',\n  },\n  platform: {\n    title: 'Support Platform',\n    360: '360',\n    iqiyi: 'Iqiyi',\n    youku: 'YouKu',\n    tencent: 'Tencent',\n    sohu: 'Sohu',\n    mgtv: 'MgTV',\n    pptv: 'PPTV',\n    letv: 'LeTV',\n    bilibili: 'Bilibili',\n  },\n  message: {\n    invalidAddress: 'Invalid address bar address',\n    invalidApi: 'Invalid parsing interface',\n    noActiveSource: 'No parsing source selected',\n    info: 'The current video is loading, please be patient',\n    error: 'Load failed, try switching to another interface',\n    empty: 'Please select the parsing interface or enter the address first',\n  },\n  field: {\n    name: 'Name',\n    type: 'Type',\n    api: 'Api',\n    apiMap: {\n      web: 'Web',\n      json: 'Json',\n    },\n    script: 'Script',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/player.ts",
    "content": "export default {\n  title: 'Player',\n  film: {\n    desc: 'Description',\n    anthology: 'Anthology',\n    episode: 'Episode',\n    recommend: 'Recommend',\n    info: {\n      background: 'Background',\n      actors: 'Staff',\n      director: 'Director',\n      actor: 'Actor',\n    },\n  },\n  live: {\n    epg: 'EPG',\n    channel: 'Channel',\n    group: 'Group',\n  },\n  header: {\n    backMain: 'BackToMain',\n  },\n  function: {\n    like: 'Like',\n    download: 'Down',\n    share: 'Share',\n    setting: 'Setting',\n  },\n  status: {\n    unplay: 'unplay',\n    played: 'played',\n    playing: 'play',\n    useing: 'useing',\n    unuse: 'unuse',\n  },\n  message: {\n    play: 'Please later, data processing, If not played for a long time, please change the source',\n    noActiveAnalyze: 'This line requires selecting an analysis interface first',\n    noRecMatch: 'No matching recommendation found, continue playing current content',\n    noPlayUrl: 'Play address acquisition failed, please change the source or line',\n  },\n  setting: {\n    title: 'Setting',\n    loopEnabled: 'Loop Playback',\n    skipHeadAndEnd: 'Skip Progress',\n    playNextEnabled: 'Auto Next',\n    playNextPreload: 'Preload Next',\n    skipAd: 'Smart Skip Ad',\n    skipStart: 'Start',\n    skipEnd: 'End',\n    tip: 'The switch takes effect globally.',\n  },\n  download: {\n    title: 'Offline Cache',\n    copy: 'Copy Link',\n    copyCurrentUrl: 'Copy Current Link',\n    recommendDownloaderName: 'M3U8-Downloader',\n    recommendDownloaderTip: 'Recommend downloader',\n    statusAwaitDownload: 'To be',\n    statusRequireDownload: 'Need',\n    soureceSelect: 'Please select',\n    copySuccess: 'Copy success, quick download to the downloader',\n    copyFail: 'Copy failed, the current environment does not support one-click copying',\n    copyEmpty: 'Please select what you want to download first',\n    copyError: 'The current environment does not support one-click copy, please copy the link manually',\n    copyCheck: 'Currently copied content may require sniffing',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/plugin.ts",
    "content": "export default {\n  title: 'Plugin',\n  field: {\n    typeMap: {\n      ui: 'UI',\n      system: 'System',\n      mix: 'Mix',\n    },\n  },\n  install: {\n    tip: {\n      file: 'Place the project in the directory, the file name cannot contain special characters (ignore if already placed)',\n      input: 'Enter the project name to install (file name)',\n    },\n    goDir: 'Go to the plugin directory',\n  },\n  message: {\n    install:\n      'Asynchronous installation in progress, a timeout does not necessarily indicate failure, please refresh later to check...',\n    uninstall:\n      'Asynchronous uninstallation in progress, a timeout does not necessarily indicate failure, please refresh later to check...',\n    start:\n      'Asynchronous start in progress, a timeout does not necessarily indicate failure, please refresh later to check...',\n    stop: 'Asynchronous stop in progress, a timeout does not necessarily indicate failure, please refresh later to check...',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/setting.ts",
    "content": "export default {\n  title: 'Setting',\n  nav: {\n    baseConfig: 'Base Config',\n    dataManage: 'Data Manage',\n    filmSource: 'Film Config',\n    liveSource: 'Live Config',\n    parseSource: 'Parse Config',\n  },\n  base: {\n    bossKey: 'BossKey',\n    timeout: 'Timeout',\n    zoom: {\n      title: 'Zoom',\n      levelMap: {\n        small: 'Small',\n        standard: 'Standard',\n        large: 'Large',\n      },\n    },\n    hot: 'Hot',\n    site: {\n      title: 'Site',\n      hotMap: {\n        baidu: 'Baidu',\n        douban: 'Douban',\n        enlightent: 'Enlightent',\n        kylive: 'Kylive',\n        komect: 'Komect',\n        quark: 'Quark',\n      },\n      searchMap: {\n        local: 'Local',\n        group: 'Group',\n        all: 'All',\n      },\n      filter: 'Filter',\n    },\n    live: {\n      ipMark: 'IP Mark',\n      delay: 'Delay',\n      thumbnail: 'Thumbnail',\n      popup: {\n        thumbnail:\n          'Please go to [Lab->Extension Manager->Environment] to install ffmpeg and ffprobe to enable the thumbnail function',\n      },\n    },\n    player: {\n      title: 'Player',\n      barrage: 'Barrage',\n      command: 'Command',\n      sniffer: 'Sniffer',\n    },\n    security: {\n      title: 'Security',\n      proxy: 'Network Proxy',\n      ua: 'User Agent',\n      dns: 'DNS',\n    },\n    permission: {\n      title: 'Permission',\n      autoLaunch: 'Auto Launch',\n      windowPosition: 'Window Position',\n      debug: 'Debug Mode',\n      hardwareAcceleration: 'Hardware Acceleration',\n    },\n    other: {\n      title: 'Other',\n      factoryReset: 'Factory Reset',\n      checkUpdate: 'Check Update',\n      disclaimer: 'Privacy Policy',\n      license: 'License',\n    },\n  },\n  message: {\n    willReboot: 'Application is about to restart',\n    effectReboot: 'Restart the application to take effect',\n    partialReboot: 'Restarting the relevant modules will take effect',\n  },\n  sniffer: {\n    title: 'Sniffer',\n    typeMap: {\n      puppeteer: 'Automate',\n      thirdParty: 'Third Party',\n    },\n  },\n  barrage: {\n    title: 'Barrage',\n    param: {\n      base: 'Basic Parameter',\n      map: 'Map Parameter',\n    },\n    tip: {\n      base: '',\n      map: 'The position corresponding to the barrage return, starting from index 0.',\n    },\n    field: {\n      key: 'Data',\n      support: 'Line',\n      type: 'Scroll',\n      text: 'Barrage',\n      time: 'Time',\n      color: 'Color',\n    },\n    popup: {\n      url: `Configuration parameter {'{'}id{'}'} is required (the id needs to be queried for the name of the barrage id).`,\n      nested: 'Nested values are accessed using dot notation (.)',\n    },\n  },\n  ua: {\n    title: 'User-Agent',\n    topTip: 'Emulate User Agent',\n    bottomTip: 'Recommend Chrome, empty use system default',\n  },\n  proxy: {\n    title: 'Proxy',\n    typeMap: {\n      system: 'System Proxy',\n      custom: 'Custom Proxy',\n      direct: 'Direct Proxy',\n    },\n    field: {\n      url: 'Proxy',\n      bypass: 'Bypass',\n    },\n    placeholder: {\n      url: 'socks5://127.0.0.1:6153',\n      bypass: 'localhost,127.0.0.1,::1',\n    },\n  },\n  dns: {\n    title: 'DNS-over-HTTP',\n    topTip: 'Using Secure DNS',\n    bottomTip: 'Recommend Tencent, empty use system default',\n  },\n  factoryReset: {\n    title: 'Factory Reset',\n    content: 'Are you sure you want to restore the factory? Confirmation will erase all data.',\n  },\n  data: {\n    title: 'Data Mange',\n    override: 'Override',\n    additional: 'Additional',\n    config: {\n      title: 'Config',\n      field: {\n        url: 'Url',\n      },\n      popup: {\n        override: 'Original data will be erased.',\n        additional: 'Additions to original data.',\n        clear: 'The selected type will be erased data.',\n      },\n    },\n    easyConfig: {\n      title: 'Quick Config',\n      field: {\n        typeMap: {\n          catvod: 'Catvod',\n          drpy: 'Drpy(js0)',\n          tvbox: 'Tvbox',\n        },\n      },\n    },\n    configImport: {\n      title: 'Data Import',\n      field: {\n        typeMap: {\n          remote: 'Remote',\n          local: 'Local',\n        },\n      },\n    },\n    configExport: {\n      title: 'Data Export',\n    },\n    clearData: {\n      title: 'Data Clear',\n    },\n    sync: {\n      title: 'Data Sync',\n      field: {\n        typeMap: {\n          icloud: 'iCloud',\n          webdav: 'WebDav',\n        },\n        url: 'Url',\n        username: 'Username',\n        password: 'Password',\n        autoSync: 'Auto Sync',\n      },\n      action: {\n        backup: 'Back up to cloud',\n        resume: 'Resume from cloud',\n      },\n      popup: {\n        backup: 'Cloud data will be overwritten, Confirm operation?',\n        resume: 'Local data will be overwritten, Confirm operation?',\n      },\n    },\n  },\n  update: {\n    title: 'Check Update',\n    noUpdate: 'You are currently using the latest version',\n    latestVersion: 'Latest Version',\n    changelog: 'ChangeLog',\n    errorlog: 'ErrorLog',\n    downloadProcess: 'Downloaded {0}%',\n    message: {\n      downloaded: 'The download of the installation package is complete',\n    },\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/system.ts",
    "content": "export default {\n  app: {\n    about: 'About {{ name }}',\n    hide: 'Hide',\n    hideOthers: 'Hide Others',\n    show: 'Show',\n    showAll: 'Show All',\n    quit: 'Quit {{ name }}',\n    reboot: 'Reboot',\n  },\n  file: {\n    title: 'File',\n    closeWindow: 'Close Window',\n  },\n  edit: {\n    title: 'Edit',\n    undo: 'Undo',\n    redo: 'Redo',\n    cut: 'Cut',\n    copy: 'Copy',\n    paste: 'Paste',\n    pasteAndMatchStyle: 'Paste and Match Style',\n    delete: 'Delete',\n    selectAll: 'Select all',\n  },\n  view: {\n    title: 'View',\n    reload: 'Reload',\n    forceReload: 'Force Reload',\n    toggleDevTools: 'Toggle Developer Tools',\n    actualSize: 'Actual Size',\n    zoomIn: 'Zoom In',\n    zoomOut: 'Zoom Out',\n    toggleFullScreen: 'Toggle Full Screen',\n  },\n  window: {\n    title: 'Window',\n    minimize: 'Minimize',\n    zoom: 'Zoom',\n    fill: 'Fill',\n    center: 'Center',\n  },\n  help: {\n    title: 'Help',\n  },\n  contextMenu: {\n    inspect: 'Inspect',\n  },\n  tray: {\n    open: 'Open {{ name }}',\n    version: 'Version: {{ version }}',\n    website: 'Website',\n    document: 'Document',\n    reportIssue: 'Report Issue',\n    openData: 'Open Data Folder',\n    quit: 'Quit',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/aigc.ts",
    "content": "export default {\n  title: '智能助手',\n  subheading: 'AIGC',\n  field: {\n    key: '密钥',\n    model: '模型',\n    providerMap: {\n      amazon: 'Amazon Bedrock',\n      anthropic: 'Anthropic',\n      azure: 'Azure',\n      gemini: 'Gemini',\n      openai: 'OpenAI',\n    },\n  },\n  chat: {\n    tip: '你好! 我是 {0} 智能助手, 有什么可以帮助你的吗?',\n    suggestion: {\n      desc: {\n        title: '{0} 是什么?',\n        prompt: '介绍一下 {0}',\n      },\n    },\n    modelChange: '由 {0} 模型提供服务',\n    stopGenerating: '用户已停止内容生成',\n  },\n  status: {\n    reason: '思考',\n    reasoning: '思考中...',\n    reasoned: '已深度思考',\n  },\n  declare: '内容由AI生成, 仅供参考',\n  noParam: '参数不正确, 请前往 [设置->基础配置] 配置AIGC相关数据',\n  message: {\n    createSessionFailed: '创建会话失败',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/common.ts",
    "content": "export default {\n  success: '成功',\n  fail: '失败',\n  copy: '复制',\n  copySuccess: '复制成功',\n  copyFail: '复制失败',\n  error: '错误',\n  cancel: '取消',\n  confirm: '确定',\n  default: '默认',\n  clear: '清空',\n  reset: '重置',\n  delete: '删除',\n  save: '保存',\n  close: '关闭',\n  open: '打开',\n  execute: '执行',\n  original: '原始',\n  sourceCode: '源码',\n  debug: '调试',\n  demo: '示例',\n  help: '帮助',\n  store: '商店',\n  provider: '提供商',\n  step: '步骤',\n  stepNum: '步骤 {0}',\n  input: '输入',\n  output: '输出',\n  preview: '预览',\n  action: '操作',\n  select: '选择',\n  search: '搜索',\n  filter: '过滤',\n  play: '播放',\n  home: '首页',\n  recommend: '推荐',\n  all: '全部',\n  more: '更多',\n  moreParams: '更多参数',\n  optional: '可选',\n  optionalParams: '可选参数',\n  auto: '自动',\n  followSystem: '跟随系统',\n  manual: '手动',\n  lang: '语言',\n  agree: '同意',\n  disagree: '不同意',\n  enable: '启用',\n  disable: '禁用',\n  on: '开启',\n  off: '关闭',\n  installed: '已安装',\n  uninstalled: '未安装',\n  install: '安装',\n  installing: '安装中',\n  uninstall: '卸载',\n  valid: '有效',\n  invalid: '无效',\n  encode: '编码',\n  decode: '解码',\n  compute: '计算',\n  unknown: '未知',\n  status: '状态',\n  id: '标识',\n  operate: '操作',\n  add: '添加',\n  edit: '编辑',\n  view: '查看',\n  env: '环境',\n  check: '检查',\n  checking: '请等待, 检查中...',\n  reCheck: '重新检查',\n  download: '下載',\n  downloading: '请等待, 下载中...',\n  downloaded: '已下载',\n  register: '注册',\n  unRegister: '取消注册',\n  Registerd: '已注册',\n  import: '导入',\n  export: '导出',\n  flag: '标识',\n  random: '随机',\n  tip: '提示',\n  config: '配置',\n  name: '名称',\n  type: '类型',\n  group: '分组',\n  upload: '上传',\n  update: '更新',\n  info: '信息',\n  explain: '说明',\n  param: '参数',\n  url: '网址',\n  link: '链接',\n  api: '接口',\n  log: '日志',\n  cache: '缓存',\n  support: '支持',\n  unSupport: '不支持',\n  scan: '扫描',\n  space: '空格',\n  data: '数据',\n  content: '内容',\n  custom: '自定义',\n  gain: '获取',\n  test: '测试',\n  connect: '连接',\n  reconnect: '重连',\n  adapter: '适配器',\n  request: {\n    title: '请求',\n    param: '请求参数',\n    headers: '请求头',\n    data: '请求载荷',\n    method: '请求方法',\n    contentType: '请求类型',\n  },\n  unit: {\n    s: '{0}秒',\n    ms: '{0}毫秒',\n  },\n  theme: {\n    title: '主题',\n    light: '浅色',\n    dark: '深色',\n  },\n  placeholder: {\n    input: '请输入',\n    inputTag: '请输入, 回车确认标籤',\n    inputSplit: `请输入, 用'{0}'分隔`,\n    inputEg: '请输入, 如: {0}',\n    inputSet: '点击设置',\n    request: {\n      headers: `请输入, 如: {'{'} \"User-Agent\": \"zyfun\" {'}'}`,\n      data: `请输入, 如: {'{'} \"uuid\": \"zyfun\" {'}'}`,\n    },\n  },\n  message: {\n    noSelect: '请至少选择一项',\n    noData: '暂无数据',\n    noMore: '没有更多',\n    noUrl: '无链接',\n    noEnable: '数据暂未启用',\n    noRequiredParam: '缺少必要参数{0}',\n    errRequiredParam: '必要参数{0}格式错误',\n    installing: '正在安装, 请稍后刷新查看...',\n  },\n  popup: {\n    delete: '确认删除吗?',\n  },\n  alert: {\n    debugModuleConflict: '页面与调试模式冲突, 请前往 [设置->基础配置->权限] 关闭',\n  },\n  infiniteLoading: {\n    noSelect: '请选择数据源',\n    complete: '人家是有底线的',\n    error: '哎呀，出了点差错',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/component.ts",
    "content": "export default {\n  action: {\n    countdown: '{0}秒后关闭',\n    fullview: '全屏预览',\n  },\n  hot: {\n    title: '热门搜索',\n    category: {\n      title: '分类',\n      field: {\n        1: '电影',\n        2: '电视剧',\n        3: '综艺',\n        4: '动漫',\n      },\n    },\n  },\n  search: {\n    title: '搜索',\n    history: '搜索历史',\n    placeholder: {\n      input: '搜索全网资源',\n    },\n  },\n  share: {\n    title: '分享',\n    scan: '扫码继续观看',\n    copyright: '仅提供支持, 严禁传播资源',\n  },\n  sponsor: {\n    title: '赞助',\n    buyCoffee: '请作者喝杯咖啡',\n    scanDonate: '扫码赞助',\n  },\n  codeEditor: {\n    editor: {\n      code: '编辑器',\n      html: '网页源码',\n    },\n    output: {\n      problem: '问题',\n      output: '输出',\n      debugConsole: '调试控制台',\n      logger: '日志',\n      terminal: '终端',\n      testResult: '测试结果',\n    },\n  },\n  terminal: {\n    logger: {\n      message: {\n        success: '日志模块连接成功',\n        fail: '日志模块连接失败',\n        error: '日志模块发生错误',\n        noSupport: '当前适配器不支持日志输出',\n      },\n    },\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/index.ts",
    "content": "import componentsLocale from 'tdesign-vue-next/es/locale/zh_CN';\n\nimport aigc from './aigc';\nimport common from './common';\nimport component from './component';\nimport media from './media';\nimport pages from './pages';\nimport system from './system';\n\nexport default {\n  lang: '简体中文',\n  aigc,\n  common,\n  component,\n  componentsLocale,\n  media,\n  pages,\n  system,\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/media.ts",
    "content": "export default {\n  decoder: '解码器',\n  decoderMap: {\n    audio: '音频',\n    hls: 'Hls',\n    flv: 'Flv',\n    mp4: 'Mp4',\n    dash: 'Dash',\n    torrent: 'Torrent',\n  },\n  player: '播放器',\n  playerMap: {\n    veplayer: '火山播放器',\n    tcplayer: '腾讯播放器',\n    aliplayer: '阿里播放器',\n    xgplayer: '西瓜播放器',\n    artplayer: '艺术播放器',\n    oplayer: '欧耶播放器',\n    dplayer: '呆呆播放器',\n    nplayer: '玩家播放器',\n    ckplayer: '超酷播放器',\n    customplayer: '自定义播放器',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/assets/binary-help.md",
    "content": "- 点击安装会添加到任务队列, 无需多次点击触发, 耐心等待\n- 如安装时间过久可尝试刷新页面后重新安装\n- 部分安装可能需科学上网(受限于网络提供商)\n- 部分二进制文件仅兼容部分操作系统(受限于服务提供商)\n- 安装失败原因具体需查看日志\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/assets/custom-player.md",
    "content": "> 该功能依赖于系统命令, 可调用`环境变量`或`指定路径`\n\n- 如何设置:\n  - Windows: `[右键图标->右键属性->目标]`查看路径\n  - Mac: `/Applications/软件名.app`\n  - Linux: `[whereis 软件名]`查看路径\n- 常见播放器`[根据实际修改路径]`\n  - PotPlayer(Window): `C:\\Program Files (x86)\\PotPlayer\\PotPlayerMini64.exe`\n  - VLC(Window): `C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe`\n  - IINA(Mac): `/Applications/IINA.app`\n  - VLC(Mac): `/Applications/VLC.app`\n  - VLC(Linux): `/usr/bin/vlc`\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/assets/disclaimer.md",
    "content": "> 发布日期：2025 年 12 月 1 日\n\n> 生效日期：2025 年 12 月 1 日\n\n**感谢您选择使用`zyfun`(以下简称本软件)，用户(以下简称您)在使用本软件之前，请您仔细阅读和理解以下内容:**\n\n1. 若您不同意如下的任何内容，请您立即停止使用本软件。一旦您开始使用本软件，则表示您已同意。\n2. 本软件仅供个人学习、研究和技术交流使用，仅提供展示功能，所有数据资源均由您自身制作提供，包括但不限于视频网站、媒体分享站点等。本软件无法控制这些数据资源的合法性、准确性、完整性或可用性，因此不对资源内容的真实性、合法性或适用性负责。\n3. 我们在此特别提醒, 视频或弹幕中可能出现第三方广告、产品推广信息等相关内容，均由您提供的数据资源植入，请您在体验过程中保持警惕，对这类信息的真实性及合法性进行自主甄别，如因此产生的损失，本软件不承担任何责任。\n4. 本软件利用网络爬虫(含嗅探)技术获取部分数据为您提供更全面的信息服务, 值得注意的是这些数据未经过授权。版权方有权向您收取相关费用, 本软件不承担此部分的授权费。包括不限于`豆瓣(douban.com)` `酷云(ky.live)` `云合(enlightent.cn)` `移动爱家(komect.com)` `百度(baidu.com)` `夸克(quark.sm.cn)`及`112114(112114.xyz)`等。\n5. 本软件仅使用`iframe`技术嵌入多家视频平台内容，包括但不限于`360影视(360kan.com)` `爱奇艺(iqiyi.com)` `腾讯视频(v.qq.com)` `优酷视频(youku.com)` `芒果TV(mgtv.com)` `乐视视频(letv.com)` `搜狐视频(tv.sohu.com)` `聚力网(pptv.com)`及`哔哩哔哩(bilibili.com)`等。您应当遵守相应平台的隐私政策或服务协议等。\n6. 本软件含\"去广告\"选项可增强使用体验，您应知悉开启后可能存在兼容性问题。同时该选项可能会违反第三方厂商的商业条款，您应遵守相应厂商的条款。\n7. 为遵守网络安全法的内容审核要求，本软件不具备内容审核能力因此不提供弹幕发送服务。弹幕展示的内容可能存在不良言论，由于数据来源于您提供的数据资源，我们无法对此进程清洗，您应当忽略这部分弹幕内容。我们呼吁用户文明用语，共同维护网络健康环境。\n8. 我们深知隐私无价。因此，本软件绝不收集任何用户数据，除了必要的备份（此过程由您提供的第三方厂商进行管理）外，所有信息均严格本地存储，确保您的数据仅在您掌控之中。本软件不与任何第三方共享您的任何信息。\n9. 根据生成式人工智能（AIGC）相关规定，用户在使用AIGC服务时须严格遵守合法用途、内容规范及禁止滥用原则。AIGC生成的内容仅供参考，其准确性、完整性或适用性不获保证，亦不代表我方立场。相关数据将共享至第三方AIGC服务商。\n10. 本软件完全`免费`且`开源`，如果您通过任何渠道付费下载本软件说明您已经受骗。如果您喜欢本软件可以赞助我们，旨在表达对开源软件表示支持，但您应当清楚理解，赞助款项不享有任何服务保障，也不构成任何形式的合同关系。\n11. 您在使用本软件时需自行负责所有操作和使用结果。本软件不对您通过使用本软件获取的任何内容负责，包括但不限于媒体资源的准确性、版权合规性、完整性、安全性和可用性。对于任何因使用本软件导致的损失、损害或法律纠纷，不承担任何责任。\n12. 您在使用本软件时必须遵守您所在国家或地区的相关法律法规，禁止使用本软件进行任何违法活动，包括但不限于制作、上传、传播、存储任何违法、侵权、淫秽、诽谤、恶意软件等内容。如您违反相关法律法规，需承担相应的法律责任。\n13. 本协议适用于使用本软件的所有用户。本软件保留随时修改、更新本声明的权利，并以`软件更新`或`Github Readme`文档等形式通知您。请您定期查阅并遵守最新的协议。\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/assets/lab-edit-help.md",
    "content": "- 初始化\n  - 每次初始化ext参数会丢失, 需使用ext参数需前往 [设置->影视配置] 手动配置debug源\n  - 如提示debug源不存在, 可刷新页面或前往 [设置->影视配置] 手动创建debug源(标识填写debug, 其他随意)\n- 编辑器: 如提示大量语法报错, 先切换其他适配器再重新选择\n- 日志: 部分适配器不支持日志输出\n- 适配器\n  - T4: 已适配插件的可前往 [实验室->插件程序->插件] 安装对应模块\n  - T3[py]\n    - 前往 [实验室->插件程序->环境] 安装uv模块\n    - 点击初始化会自动化安装python环境, 首次需耐心等待, 如失败则需要手动操作\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/assets/live-epg.md",
    "content": "**部分频道无电子节目单属于正常现象, 由第三方数据平台控制**\n\n> 接口支持 `diyp` 和 `xml` 模式\n\n- diyp\n  - 需配置参数: {'{'}name{'}'}(标识需查询频道名称)和{'{'}date{'}'}(标识需查询频道日期)\n  - 例: `https://epg.xxx.com/?ch={'{'}name{'}'}&date={'{'}date{'}'}`\n- xml\n  - 该模式无需配置参数\n  - 该模式不支持日期查询\n  - 例: `http://epg.xxx.com/e.xml`\n\n> 优先级: [设置->直播配置->单源->节目单字段] > [设置->基础配置->直播->节目单字段]\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/assets/live-logo.md",
    "content": "**部分频道无台标属于正常现象, 由第三方数据平台控制**\n\n- 需配置参数{'{'}name{'}'}(标识需查询台标名称)\n- 例: `https://epg.xxx.com/logo/{name}.png`\n\n> 优先级: [频道自带台标字段] > [设置->直播配置->单源->台标字段] > [设置->基础配置->直播->台标字段]\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/browser.ts",
    "content": "export default {\n  title: '浏览',\n  message: {\n    tabOverflow: '标签页过多, 请关闭部分标签页',\n    noSupportProtocol: '不支持该协议链接打开',\n  },\n  button: {\n    openInBrowser: '使用默认浏览器打开',\n  },\n  history: {\n    recent: '最近打开',\n    tip: '只记录最近{0}条浏览数据',\n  },\n  tab: {\n    newTab: '新建标签页',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/film.ts",
    "content": "export default {\n  title: '影视',\n  noDesc: '暂无剧情简介',\n  info: {\n    type: '类型',\n    area: '地区',\n    release: '上映',\n  },\n  infiniteLoading: {\n    noConfig: '请前往 [设置->影视配置] 配置数据',\n  },\n  message: {\n    formatEpisodeError: '数据源格式化剧集错误, 确认数据源是否正常',\n    notSelectAnalyze: '识别到官解数据, 但未选择解析线路',\n    notSelectSourceBeforeSearch: '未选择数据源或本站模式数据源搜索状态为关闭',\n    noEffectiveSearchSource: '无有效搜索数据源, 请检查数据源搜索配置和搜索模式',\n    noDetailInfo: '详情数据缺失或错误',\n    noSiteInfo: '关联数据源查找失败',\n    noSupportAction: '当前操作不支持',\n  },\n  field: {\n    name: '名称',\n    type: '类型',\n    typeMap: {\n      't0-xml': 'T0[xml]',\n      't1-json': 'T1[json]',\n      't3-js_drpy': 'T3[js_drpy]',\n      't3-js_catopen': 'T3[js_catopen]',\n      't3-csp_xbpq': 'T3[csp_xbpq]',\n      't3-csp_xyq': 'T3[csp_xyq]',\n      't3-csp_appysv2': 'T3[csp_appysv2]',\n      't3-alist': 'T3[alist]',\n      't3-csp_appget': 'T3[csp_appget]',\n      't3-csp_appqi': 'T3[csp_appqi]',\n      't3-csp_appfox': 'T3[csp_appfox]',\n      't3-py': 'T3[py]',\n      't4-drpys': 'T4[drpys]',\n      't4-catvod': 'T4[catvod]',\n      't4-drpy_js0': 'T4[drpy_js0]',\n    },\n    key: '标识',\n    api: '接口',\n    search: '搜索',\n    searchMap: {\n      close: '关闭',\n      only: '仅搜索',\n      gather: '聚合',\n    },\n    playUrl: '解析',\n    ext: '扩展',\n    group: '分组',\n    category: '类别',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/index.ts",
    "content": "import browser from './browser';\nimport film from './film';\nimport lab from './lab';\nimport live from './live';\nimport md from './md';\nimport moment from './moment';\nimport parse from './parse';\nimport player from './player';\nimport plugin from './plugin';\nimport setting from './setting';\n\nexport default {\n  browser,\n  film,\n  lab,\n  live,\n  md,\n  moment,\n  parse,\n  player,\n  plugin,\n  setting,\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/lab.ts",
    "content": "export default {\n  title: '实验室',\n  crypto: {\n    title: '字符编码',\n    field: {\n      content: '内容',\n      key: '密钥',\n      cert: '证书',\n      inputEncode: '原文格式',\n      outputEncode: '输出格式',\n    },\n    encrypt: {\n      title: '加解密',\n      field: {\n        iv: '偏移',\n        mode: '运算',\n        pad: '填充',\n        tag: '标签',\n        aad: '附加数据',\n        passphrase: '密钥密码',\n        drop: '丢弃',\n        encodeMap: {\n          base64: 'Base64',\n          hex: 'Hex',\n          utf8: 'Utf8',\n          utf16: 'Utf16',\n          utf16be: 'Utf16BE',\n          utf16le: 'Utf16LE',\n          latin1: 'Latin1',\n        },\n        modeMap: {\n          cbc: 'CBC',\n          ctr: 'CTR',\n          cfb: 'CFB',\n          ofb: 'OFB',\n          ecb: 'ECB',\n          gcm: 'GCM',\n          xts: 'XTS',\n          ccm: 'CCM',\n        },\n        paddingMap: {\n          pkcs5Padding: 'Pkcs5',\n          pkcs7Padding: 'Pkcs7',\n          zeroPadding: 'Zero',\n          ansiX923: 'AnsiX923',\n          iso10126: 'Iso10126',\n          iso97971: 'Iso97971',\n          noPadding: 'NoPadding',\n          rsaesPkcs1: 'PKCS1',\n          rsaOaep: 'OAEP',\n          rsaOaepSha1: 'OAEP-SHA1',\n          rsaOaepSha256: 'OAEP-SHA256',\n          rsaOaepSha384: 'OAEP-SHA384',\n          rsaOaepSha512: 'OAEP-SHA512',\n          rsaOaepMd5: 'OAEP-MD5',\n        },\n        algorithmMap: {\n          rsa: 'RSA',\n          rc4: 'RC4',\n          rc4Drop: 'RC4Drop',\n          aes: 'AES',\n          des: 'DES',\n          tripleDes: '3DES',\n          rabbit: 'Rabbit',\n          rabbitLegacy: 'RabbitLegacy',\n          sm4: 'SM4',\n        },\n      },\n      message: {\n        encodeNotUtf8: '加密不支持utf8作为输出格式',\n        decodeNotUtf8: '解密不支持utf8作为输入格式',\n      },\n    },\n    hash: {\n      title: '哈希',\n      field: {\n        typeMap: {\n          hash: '散列计算',\n          hmac: '散列消息认证码',\n        },\n        algorithmMap: {\n          'md5-16': 'MD5-16',\n          'md5-32': 'MD5-32',\n          sha1: 'SHA1',\n          sha224: 'SHA224',\n          sha256: 'SHA256',\n          sha3: 'SHA3',\n          sha384: 'SHA384',\n          sha512: 'SHA512',\n          'sha512-224': 'SHA512-224',\n          'sha512-256': 'SHA512-256',\n          ripemd160: 'RIPEMD160',\n          sm3: 'SM3',\n        },\n      },\n    },\n    encode: {\n      title: '编解码',\n      field: {\n        algorithmMap: {\n          unicode: 'UniCode',\n          base64: 'Base64',\n          html: 'Html',\n          url: 'URL',\n          hex: 'Hex',\n          gzip: 'Gzip',\n        },\n      },\n    },\n  },\n  diff: {\n    title: '文本对比',\n    file: '文件',\n    origin: '原始',\n    target: '目标',\n    diff: '对比',\n  },\n  edit: {\n    title: '写源工具',\n    nav: {\n      template: '模板',\n      file: {\n        title: '文件',\n        folder: '目录',\n        import: '导入',\n        export: '导出',\n      },\n      decode: '解码',\n      debug: '调试',\n    },\n    rule: {\n      pdfa: '列表',\n      pdfh: '节点',\n      url: '地址',\n      wd: '关键词',\n      page: '分页',\n      tid: '类',\n      filter: '过滤',\n      ids: '标识',\n      flag: '线路',\n      play: '选集',\n    },\n    action: {\n      init: '初始化',\n      home: '分类',\n      homeVod: '首页',\n      category: '列表',\n      detail: '详情',\n      search: '搜索',\n      play: '播放',\n      proxy: '代理',\n      proxyUpload: '代理上传',\n    },\n    debug: {\n      dom: '节点',\n      data: '数据',\n    },\n    message: {\n      noInitSource: '自动化流程失败, 请按帮助手动创建debug源, 并刷新页面',\n      codeNoData: '编辑器内容为空',\n      htmlNoData: '源代码内容为空',\n    },\n    placeholder: {\n      pdfa: '请输入列表规则(如 body&&li)',\n      pdfh: '请输入节点规则(如 body&&a,0&&href)',\n      proxyUpload: '请输入三元组, [响应码, 响应头, 响应体]',\n    },\n  },\n  sift: {\n    title: '静态筛选',\n    source: '写源',\n    rule: {\n      className: '类名',\n      classUrl: '类标识',\n      class: '大类',\n      cateExclude: '排除',\n      link: '链接',\n      filter: '筛选',\n      filterInfo: '详细',\n      excludeKeys: '键移除',\n      match: {\n        plot: '剧情',\n        area: '地区',\n        lang: '语言',\n        year: '年份',\n        letter: '字母',\n        sort: '排序',\n      },\n    },\n    action: {\n      category: '生成筛选分类',\n      match: '生成筛选列表',\n      currentSift: '生成当前筛选',\n      finalSift: '生成最终筛选',\n      copyFinalSift: '复制最终筛选',\n    },\n    debug: {\n      data: '数据',\n    },\n    placeholder: {\n      classNameTip: '补充类名(如: 电影&剧集), 用&分隔',\n      classUrlTip: '补充类标识(如: movie&plot), 用&分隔',\n      classParseTip: '选择器(list;title;url;match), 用;分隔',\n      cateExcludeTip: `排除(如: 首页{'|'}留言), 用{'|'}分隔`,\n      linkTip: '拼接fyclass(如: /id/fyclass.html)',\n      filterTip: '选择器(如: body&&.scroll-content), 同类型用;分隔, 不同类型换行',\n      filterInfoTip: '详细筛选(key;name;type;title;url), 每行对应一个',\n      keyExcludeTip: `键排除(如: 地区{'|'}年份), 用{'|'}分隔`,\n      reg: '正则表达式(如: show(.*?)/id',\n    },\n    message: {\n      inputNoClassParse: '参数大类为空',\n      inputNoFilterAndFilterInfo: '参数筛选或筛选详细为空',\n      sourceFirst: '必须先获取源代码',\n      classResultisEmpty: '请先执行生成筛选分类',\n      siftResultisEmpty: '请先执行生成最终筛选',\n    },\n  },\n  sniffer: {\n    title: '媒体嗅探',\n    field: {\n      initScript: '初始参数',\n      runScript: '运行参数',\n      customRegex: '正则匹配',\n      snifferExclude: '正则排除',\n    },\n  },\n  player: {\n    title: '播放测试',\n  },\n  extension: {\n    title: '扩展程序',\n    plugin: {\n      title: '插件',\n      server: '服务',\n      file: '目录',\n      empty: '空空如也',\n      field: {\n        typeMap: {\n          ui: '界面插件',\n          system: '系统插件',\n          mix: '混合插件',\n        },\n      },\n      info: {\n        title: '应用信息',\n        author: '作者',\n        desc: '描述',\n        status: '状态',\n        stop: '停止',\n        start: '启动',\n        error: '出错',\n      },\n      control: {\n        title: '控制中心',\n        start: '启动服务',\n        stop: '停止服务',\n        devtool: '开发者工具',\n        upgrade: '升级',\n        update: '更新',\n        install: '安装',\n        uninstall: '卸载',\n        uninstallTip: '卸载后将无法使用, 请谨慎操作',\n        cancelTip: '当前插件存在未执行完命令, 请稍后',\n        devtoolDomAttchErrTip: '打开开发者工具失败, DOM未挂载到页面上',\n        loadUiEntryError: '加载入口失败',\n      },\n      content: {\n        title: 'README',\n      },\n      webview: {\n        title: '内容视图',\n      },\n      installDialog: {\n        tip: {\n          tip1: '将项目放入指定目录中, 文件名不可有特殊字符(如已放入则忽略)',\n          tip2: '输入项目名进行安装(项目文件名)',\n        },\n        step: '步骤',\n        goDir: '前往指定目录',\n        confirm: '安装',\n      },\n    },\n    env: {\n      title: '环境',\n    },\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/live.ts",
    "content": "export default {\n  title: '直播',\n  delay: '超时',\n  infiniteLoading: {\n    noConfig: '请前往 [设置->直播配置] 配置数据',\n  },\n  field: {\n    name: '名称',\n    api: '接口',\n    apiMap: {\n      remote: '远程',\n      local: '本地',\n      manual: '手动',\n    },\n    epg: '节目',\n    logo: '台标',\n  },\n  popup: {\n    epg: `diyp需配置参数{'{'}name{'}'}(标识需查询频道名称)和{'{'}date{'}'}(标识需查询频道日期); xml无需配置参数`,\n    logo: `需配置参数{'{'}name{'}'}(标识需查询台标名称)`,\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/md.ts",
    "content": "import binaryHelpMD from './assets/binary-help.md?raw';\nimport customPlayerMD from './assets/custom-player.md?raw';\nimport disclaimerMD from './assets/disclaimer.md?raw';\nimport labEditHelpMD from './assets/lab-edit-help.md?raw';\nimport liveEpgMD from './assets/live-epg.md?raw';\nimport liveLogoMD from './assets/live-logo.md?raw';\n\nexport default {\n  customPlayer: {\n    title: '自定义播放器',\n    content: customPlayerMD,\n  },\n  disclaimer: {\n    title: '用户须知',\n    content: disclaimerMD,\n    readComplete: '已完成阅读',\n    readProcess: '已阅读{0}%',\n    message: {\n      agree: '用观影发现世界',\n      disagree: '3秒后自动退出软件',\n    },\n  },\n  liveEpg: {\n    title: '直播节目单',\n    content: liveEpgMD,\n  },\n  liveLogo: {\n    title: '直播频道图标',\n    content: liveLogoMD,\n  },\n  labEditHelp: {\n    title: '写源工具帮助',\n    content: labEditHelpMD,\n  },\n  binaryHelp: {\n    title: '安装帮助',\n    content: binaryHelpMD,\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/moment.ts",
    "content": "export default {\n  title: '时刻',\n  history: {\n    title: '历史',\n  },\n  star: {\n    title: '收藏',\n    checkUpdate: '更新',\n    isUpdate: '有更新',\n  },\n  date: {\n    today: '今天',\n    week: '七天内',\n    ago: '更早',\n  },\n  progress: {\n    watched: '已看完',\n    watching: '已看',\n  },\n  message: {},\n  noRelatedSource: '暂无关联数据源',\n  noDesc: '暂无剧情简介',\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/parse.ts",
    "content": "export default {\n  title: '解析',\n  play: '播放',\n  search: {\n    input: '输入关键词搜索',\n    enter: '回车',\n    clear: '清空',\n    tip: '输入 {0} 快速指定搜索源, 例如',\n    watch: '查看',\n    content: '的所有内容',\n  },\n  platform: {\n    title: '支持平台',\n    360: '360影视',\n    iqiyi: '爱奇艺',\n    youku: '优酷视频',\n    tencent: '腾讯视频',\n    sohu: '搜狐视频',\n    mgtv: '芒果tv',\n    pptv: '聚力网',\n    letv: '乐视视频',\n    bilibili: '哔哩哔哩',\n  },\n  message: {\n    invalidAddress: '地址栏地址不正确',\n    invalidApi: '解析接口不正确',\n    noActiveSource: '未选择解析源',\n    info: '正在加载当前视频, 请耐心等待',\n    error: '加载失败, 请尝试切换其他接口',\n    empty: '请选择解析接口或输入需要解析的地址',\n  },\n  field: {\n    name: '名称',\n    type: '类型',\n    api: '接口',\n    apiMap: {\n      web: 'Web',\n      json: 'Json',\n    },\n    script: '脚本',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/player.ts",
    "content": "export default {\n  title: '播放器',\n  film: {\n    desc: '简介',\n    anthology: '选集',\n    episode: '剧集',\n    recommend: '猜你喜欢',\n    info: {\n      background: '背景',\n      actors: '演职员',\n      director: '导演',\n      actor: '主演',\n    },\n  },\n  live: {\n    epg: '节目',\n    channel: '频道',\n    group: '分组',\n  },\n  header: {\n    backMain: '回到主界面',\n  },\n  function: {\n    like: '收藏',\n    download: '下载',\n    share: '分享',\n    setting: '设置',\n  },\n  status: {\n    unplay: '未播放',\n    played: '已播放',\n    playing: '播放中',\n    useing: '使用中',\n    unuse: '未使用',\n  },\n  message: {\n    play: '请稍后,数据处理中,如长时间未播放请换源',\n    noActiveAnalyze: '该线路需先选择解析接口',\n    noRecMatch: '未找到匹配推荐, 继续播放当前内容',\n    noPlayUrl: '播放地址获取失败,请换源或线路',\n  },\n  setting: {\n    title: '设置',\n    loopEnabled: '循环播放',\n    skipHeadAndEnd: '进度跳过',\n    playNextEnabled: '自动连播',\n    playNextPreload: '预载下集',\n    skipAd: '智能去广',\n    skipStart: '片头',\n    skipEnd: '片尾',\n    tip: '开关全局生效',\n  },\n  download: {\n    title: '离线缓存',\n    copy: '复制链接',\n    copyCurrentUrl: '复制当前地址',\n    recommendDownloaderName: 'M3U8-Downloader',\n    recommendDownloaderTip: '推荐使用开源下载器',\n    statusAwaitDownload: '待下载',\n    statusRequireDownload: '需下载',\n    soureceSelect: '请选下载源',\n    copySuccess: '复制成功，快到下载器里下载吧',\n    copyFail: '复制失败，当前环境不支持一键复制',\n    copyEmpty: '请先选择需要下载的内容',\n    copyError: '当前环境不支持一键复制, 请手动复制链接',\n    copyCheck: '当前复制的内容可能需要嗅探',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/plugin.ts",
    "content": "export default {\n  title: '插件',\n  field: {\n    typeMap: {\n      ui: '界面',\n      system: '系统',\n      mix: '混合',\n    },\n  },\n  install: {\n    tip: {\n      file: '将项目放入目录中, 文件名不可含特殊字符(如已放入则忽略)',\n      input: '输入项目名进行安装(文件名)',\n    },\n    goDir: '前往插件目录',\n  },\n  message: {\n    install: '异步安装中, 超时不一定代表失败, 请稍后刷新查看...',\n    uninstall: '异步卸载中, 超时不一定代表失败, 请稍后刷新查看...',\n    start: '异步启动中, 超时不一定代表失败, 请稍后刷新查看...',\n    stop: '异步停止中, 超时不一定代表失败, 请稍后刷新查看...',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/setting.ts",
    "content": "export default {\n  title: '设置',\n  nav: {\n    baseConfig: '基础配置',\n    dataManage: '数据配置',\n    filmSource: '影视配置',\n    liveSource: '直播配置',\n    parseSource: '解析配置',\n  },\n  base: {\n    bossKey: '老板键',\n    timeout: '超时',\n    zoom: {\n      title: '缩放',\n      levelMap: {\n        small: '小',\n        standard: '标准',\n        large: '大',\n      },\n    },\n    hot: '热榜',\n    site: {\n      title: '站点',\n      hotMap: {\n        baidu: '百度',\n        douban: '豆瓣',\n        enlightent: '云合',\n        kylive: '酷云',\n        komect: '移动爱家',\n        quark: '夸克',\n      },\n      searchMap: {\n        local: '本站',\n        group: '组内',\n        all: '全部',\n      },\n      filter: '过滤',\n    },\n    live: {\n      ipMark: '网络标识',\n      delay: '延迟',\n      thumbnail: '缩略图',\n      popup: {\n        thumbnail: '请前往 [实验室->扩展程序->环境] 安装ffmpeg和ffprobe 以启用缩略图功能',\n      },\n    },\n    player: {\n      title: '播放器',\n      barrage: '弹幕',\n      command: '命令',\n      sniffer: '嗅探',\n    },\n    security: {\n      title: '安全',\n      proxy: '网络代理',\n      ua: '用户代理',\n      dns: '域名解析',\n    },\n    permission: {\n      title: '权限',\n      autoLaunch: '开机自启',\n      windowPosition: '窗口位置',\n      debug: '调试模式',\n      hardwareAcceleration: '硬件加速',\n    },\n    other: {\n      title: '其他',\n      factoryReset: '恢复出厂',\n      checkUpdate: '检查更新',\n      disclaimer: '用户协议',\n      license: '开源软件声明',\n    },\n  },\n  message: {\n    willReboot: '应用即将重启',\n    effectReboot: '重启应用后生效',\n    partialReboot: '部分模块重启应用后生效',\n  },\n  sniffer: {\n    title: '嗅探',\n    typeMap: {\n      puppeteer: '自动化',\n      thirdParty: '三方接入',\n    },\n  },\n  barrage: {\n    title: '弹幕',\n    param: {\n      base: '基础参数',\n      map: '映射参数',\n    },\n    tip: {\n      base: '',\n      map: '对应弹幕返回的位置, 下标从0开始',\n    },\n    field: {\n      key: '数据',\n      support: '线路',\n      type: '滚动',\n      text: '弹幕',\n      time: '时间',\n      color: '颜色',\n    },\n    popup: {\n      url: `需配置参数{'{'}id{'}'}(标识需查询弹幕ID)`,\n      nested: '嵌套取值使用点号(.)分隔',\n    },\n  },\n  ua: {\n    title: 'User-Agent',\n    topTip: '模拟用户代理',\n    bottomTip: '推荐chrome, 空使用系统默认',\n  },\n  proxy: {\n    title: '代理',\n    typeMap: {\n      system: '系统代理',\n      custom: '自定义代理',\n      direct: '不使用代理',\n    },\n    field: {\n      url: '代理地址',\n      bypass: '绕过规则',\n    },\n    placeholder: {\n      url: 'socks5://127.0.0.1:6153',\n      bypass: 'localhost,127.0.0.1,::1',\n    },\n  },\n  dns: {\n    title: 'DNS-over-HTTP',\n    topTip: '使用安全DNS',\n    bottomTip: '推荐腾讯, 空使用系统默认',\n  },\n  factoryReset: {\n    title: '恢复出厂',\n    content: '你确定要恢复出厂吗? 确认后将擦除所有数据。',\n  },\n  data: {\n    title: '数据管理',\n    override: '覆盖',\n    additional: '追加',\n    config: {\n      title: '配置',\n      field: {\n        url: '接口',\n      },\n      popup: {\n        override: '原有数据将清除，确认配置吗',\n        additional: '原有数据上追加，确认配置吗',\n        clear: '选中数据将被删除, 确认操作吗',\n      },\n    },\n    easyConfig: {\n      title: '快捷配置',\n      field: {\n        typeMap: {\n          catvod: 'Catvod',\n          drpy: 'Drpy(js0)',\n          tvbox: 'Tvbox',\n        },\n      },\n    },\n    configImport: {\n      title: '数据导入',\n      field: {\n        typeMap: {\n          remote: '远程',\n          local: '本地',\n        },\n      },\n    },\n    configExport: {\n      title: '数据导出',\n    },\n    clearData: {\n      title: '数据清理',\n    },\n    sync: {\n      title: '数据同步',\n      field: {\n        typeMap: {\n          icloud: 'iCloud',\n          webdav: 'WebDav',\n        },\n        url: '地址',\n        username: '用户名',\n        password: '授权码',\n        autoSync: '自动同步',\n      },\n      action: {\n        backup: '备份到云端',\n        resume: '从云端恢复',\n      },\n      popup: {\n        backup: '云端数据将被覆盖, 确认操作吗?',\n        resume: '本地数据将被覆盖, 确认操作吗?',\n      },\n    },\n  },\n  update: {\n    title: '检查更新',\n    noUpdate: '当前已经是最新版本',\n    latestVersion: '最新版本',\n    changelog: '更新日志',\n    errorlog: '出错日志',\n    downloadProcess: '已下载 {0}%',\n    message: {\n      downloaded: '安装包下载完成',\n    },\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/system.ts",
    "content": "export default {\n  app: {\n    about: '关于 {{ name }}',\n    hide: '隐藏',\n    hideOthers: '隐藏其他',\n    show: '显示',\n    showAll: '显示全部',\n    quit: '退出 {{ name }}',\n    reboot: '重启',\n  },\n  file: {\n    title: '文件',\n    closeWindow: '关闭窗口',\n  },\n  edit: {\n    title: '编辑',\n    undo: '撤销',\n    redo: '重做',\n    cut: '剪切',\n    copy: '复制',\n    paste: '粘贴',\n    pasteAndMatchStyle: '粘贴并匹配样式',\n    delete: '删除',\n    selectAll: '全选',\n  },\n  view: {\n    title: '视图',\n    reload: '重新加载',\n    forceReload: '强制重新加载',\n    toggleDevTools: '切换开发者工具',\n    actualSize: '实际大小',\n    zoomIn: '放大',\n    zoomOut: '缩小',\n    toggleFullScreen: '切换全屏模式',\n  },\n  window: {\n    title: '窗口',\n    minimize: '最小化',\n    zoom: '缩放',\n    fill: '填充',\n    center: '居中',\n  },\n  help: {\n    title: '帮助',\n  },\n  contextMenu: {\n    inspect: '检查',\n  },\n  tray: {\n    open: '打开 {{ name }}',\n    version: '版本: {{ version }}',\n    website: '网站',\n    document: '文档',\n    reportIssue: '报告问题',\n    openData: '打开数据文件夹',\n    quit: '退出',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/aigc.ts",
    "content": "export default {\n  title: '智能助手',\n  subheading: 'AIGC',\n  field: {\n    key: '密鑰',\n    model: '模型',\n    providerMap: {\n      amazon: 'Amazon Bedrock',\n      anthropic: 'Anthropic',\n      azure: 'Azure',\n      gemini: 'Gemini',\n      openai: 'OpenAI',\n    },\n  },\n  chat: {\n    tip: '你好! 我是 {0} 智能助手, 有什麼可以幫助你的吗?',\n    suggestion: {\n      desc: {\n        title: '{0} 是什麼?',\n        prompt: '介紹一下 {0}',\n      },\n    },\n    modelChange: '由 {0} 模型提供服務',\n    stopGenerating: '用戶已停止內容生成',\n  },\n  status: {\n    reason: '思考',\n    reasoning: '思考中...',\n    reasoned: '已深度思考',\n  },\n  declare: '內容由AI生成, 僅供參考',\n  noParam: '參數不正確, 請前往 [設置->基礎配置] 配置AI相關數據',\n  message: {\n    createSessionFailed: '創建會話失敗',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/common.ts",
    "content": "export default {\n  success: '成功',\n  fail: '失敗',\n  copy: '複製',\n  copySuccess: '複製成功',\n  copyFail: '複製失敗',\n  error: '錯誤',\n  cancel: '取消',\n  confirm: '確定',\n  default: '默認',\n  clear: '清空',\n  reset: '重置',\n  delete: '刪除',\n  save: '保存',\n  close: '關閉',\n  open: '打開',\n  execute: '執行',\n  original: '原始',\n  sourceCode: '源碼',\n  debug: '調試',\n  demo: '示例',\n  help: '幫助',\n  store: '商店',\n  provider: '提供商',\n  step: '步驟',\n  stepNum: '步驟 {0}',\n  input: '輸入',\n  output: '輸出',\n  preview: '預覽',\n  action: '操作',\n  select: '選擇',\n  search: '搜索',\n  filter: '過濾',\n  play: '播放',\n  home: '首頁',\n  recommend: '推薦',\n  all: '全部',\n  more: '更多',\n  moreParams: '更多參數',\n  optional: '可選',\n  optionalParams: '可選參數',\n  auto: '自動',\n  followSystem: '跟隨系統',\n  manual: '手動',\n  lang: '語言',\n  agree: '同意',\n  disagree: '不同意',\n  on: '開啟',\n  off: '關閉',\n  enable: '啟用',\n  disable: '禁用',\n  installed: '已安裝',\n  uninstalled: '未安裝',\n  install: '安裝',\n  installing: '安裝中',\n  uninstall: '卸載',\n  valid: '有效',\n  invalid: '無效',\n  encode: '編碼',\n  decode: '解碼',\n  compute: '計算',\n  unknown: '未知',\n  status: '狀態',\n  id: '標識',\n  operate: '操作',\n  add: '添加',\n  edit: '編輯',\n  view: '查看',\n  env: '環境',\n  check: '檢查',\n  checking: '請等待, 檢查中...',\n  reCheck: '重新檢查',\n  download: '下載',\n  downloading: '請等待, 下载中...',\n  downloaded: '已下載',\n  register: '註冊',\n  unRegister: '取消註冊',\n  Registerd: '已註冊',\n  import: '導入',\n  export: '導出',\n  flag: '標識',\n  random: '隨機',\n  tip: '提示',\n  config: '配置',\n  name: '名稱',\n  type: '類型',\n  group: '分組',\n  upload: '上傳',\n  update: '更新',\n  info: '訊息',\n  explain: '說明',\n  param: '參數',\n  url: '網址',\n  link: '鏈接',\n  api: '接口',\n  log: '日誌',\n  cache: '緩存',\n  support: '支持',\n  unSupport: '不支持',\n  scan: '掃描',\n  space: '空格',\n  data: '數據',\n  content: '內容',\n  custom: '自定義',\n  gain: '獲取',\n  test: '測試',\n  connect: '連接',\n  reconnect: '重連',\n  adapter: '適配器',\n  request: {\n    title: '請求',\n    param: '請求參數',\n    headers: '請求頭',\n    data: '請求載荷',\n    method: '請求方法',\n    contentType: '請求類型',\n  },\n  unit: {\n    s: '{0}秒',\n    ms: '{0}毫秒',\n  },\n  theme: {\n    title: '主題',\n    light: '淺色',\n    dark: '深色',\n  },\n  placeholder: {\n    input: '請輸入',\n    inputTag: '請輸入, 回車確認標籤',\n    inputSplit: `請輸入, 用'{0}'分隔`,\n    inputEg: '請輸入, 如: {0}',\n    inputSet: '點擊設置',\n    request: {\n      headers: `請輸入, 如: {'{'} \"User-Agent\": \"zyfun\" {'}'}`,\n      data: `請輸入, 如: {'{'} \"uuid\": \"zyfun\" {'}'}`,\n    },\n  },\n  message: {\n    noSelect: '請至少選擇一項',\n    noData: '暫無數據',\n    noMore: '沒有更多',\n    noUrl: '無鏈接',\n    noEnable: '數據暫未啟用',\n    noRequiredParam: '缺少必要參數{0}',\n    errRequiredParam: '必要參數{0}格式錯誤',\n    installing: '正在安裝, 請稍後刷新查看...',\n  },\n  popup: {\n    delete: '確認刪除嗎?',\n  },\n  alert: {\n    debugModuleConflict: '頁面與調試模式沖突, 請前往 [設置->基礎配置->權限] 關閉',\n  },\n  infiniteLoading: {\n    noSelect: '請選擇數據源',\n    complete: '人家是有底線的',\n    error: '哎呀，出了點差錯',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/component.ts",
    "content": "export default {\n  action: {\n    countdown: '{0}秒後關閉',\n    fullview: '全屏預覽',\n  },\n  hot: {\n    title: '熱門搜索',\n    category: {\n      title: '分類',\n      field: {\n        1: '電影',\n        2: '電視劇',\n        3: '綜藝',\n        4: '動漫',\n      },\n    },\n  },\n  search: {\n    title: '搜索',\n    history: '搜索歷史',\n    placeholder: {\n      input: '搜索全網資源',\n    },\n  },\n  share: {\n    title: '分享',\n    scan: '掃碼繼續觀看',\n    copyright: '僅提供支持, 嚴禁傳播資源',\n  },\n  sponsor: {\n    title: '贊助',\n    buyCoffee: '請作者喝杯咖啡',\n    scanDonate: '掃碼贊助',\n  },\n  codeEditor: {\n    editor: {\n      code: '編輯器',\n      html: '網頁源碼',\n    },\n    output: {\n      problem: '問題',\n      output: '輸出',\n      debugConsole: '調試控製臺',\n      logger: '日誌',\n      terminal: '終端',\n      testResult: '測試結果',\n    },\n  },\n  terminal: {\n    logger: {\n      message: {\n        success: '日誌模塊連接成功',\n        fail: '日誌模塊連接失敗',\n        error: '日誌模塊發生錯誤',\n        noSupport: '當前適配器不支持日誌輸出',\n      },\n    },\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/index.ts",
    "content": "import componentsLocale from 'tdesign-vue-next/es/locale/zh_TW';\n\nimport aigc from './aigc';\nimport common from './common';\nimport component from './component';\nimport media from './media';\nimport pages from './pages';\nimport system from './system';\n\nexport default {\n  lang: '繁體中文',\n  aigc,\n  common,\n  component,\n  componentsLocale,\n  media,\n  pages,\n  system,\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/media.ts",
    "content": "export default {\n  decoder: '解碼器',\n  decoderMap: {\n    audio: '音頻',\n    hls: 'Hls',\n    flv: 'Flv',\n    mp4: 'Mp4',\n    dash: 'Dash',\n    torrent: 'Torrent',\n  },\n  player: '播放器',\n  playerMap: {\n    veplayer: '火山播放器',\n    tcplayer: '騰訊播放器',\n    aliplayer: '阿裏播放器',\n    xgplayer: '西瓜播放器',\n    artplayer: '藝術播放器',\n    oplayer: '歐耶播放器',\n    dplayer: '呆呆播放器',\n    nplayer: '玩家播放器',\n    ckplayer: '超酷播放器',\n    customplayer: '自定義播放器',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/assets/binary-help.md",
    "content": "- 點擊安裝會添加到任務隊列, 無需多次點擊觸發, 耐心等待\n- 如安裝時間過久可嘗試刷新頁面後重新安裝\n- 部分安裝可能需科學上網(受限於網絡提供商)\n- 部分二進製文件僅兼容部分操作系統(受限於服務提供商)\n- 安裝失敗原因具體需查看日誌\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/assets/custom-player.md",
    "content": "> 該功能依賴於系統命令, 可調用`環境變量`或`指定路徑`\n\n- 如何設置:\n  - Windows: `[右鍵圖標->右鍵屬性->目標]`查看路徑\n  - Mac: `/Applications/軟件名.app`\n  - Linux: `[whereis 軟件名]`查看路徑\n- 常見播放器`[根據實際修改路徑]`\n  - PotPlayer(Window): `C:\\Program Files (x86)\\PotPlayer\\PotPlayerMini64.exe`\n  - VLC(Window): `C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe`\n  - IINA(Mac): `/Applications/IINA.app`\n  - VLC(Mac): `/Applications/VLC.app`\n  - VLC(Linux): `/usr/bin/vlc`\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/assets/disclaimer.md",
    "content": "> 發布日期：2025 年 12 月 1 日\n\n> 生效日期：2025 年 12 月 1 日\n\n**感謝您選擇使用`zyfun`(以下簡稱本軟件)，用戶(以下簡稱您)在使用本軟件之前，請您仔細閱讀和理解以下內容:**\n\n1. 若您不同意如下的任何內容，請您立即停止使用本軟件。一旦您開始使用本軟件，則表示您已同意。\n2. 本軟件僅供個人學習、研究和技術交流使用，僅提供展示功能，所有數據資源均由您自身製作提供，包括但不限於視頻網站、媒體分享站點等。本軟件無法控製這些數據資源的合法性、準確性、完整性或可用性，因此不對資源內容的真實性、合法性或適用性負責。\n3. 我們在此特別提醒, 視頻或彈幕中可能出現第三方廣告、產品推廣信息等相關內容，均由您提供的數據資源植入，請您在體驗過程中保持警惕，對這類信息的真實性及合法性進行自主甄別，如因此產生的損失，本軟件不承擔任何責任。\n4. 本軟件利用網絡爬蟲(含嗅探)技術獲取部分數據為您提供更全面的信息服務, 值得註意的是這些數據未經過授權。版權方有權向您收取相關費用, 本軟件不承擔此部分的授權費。包括不限於`豆瓣(douban.com)` `酷雲(ky.live)` `雲合(enlightent.cn)` `移動愛家(komect.com)` `百度(baidu.com)` `誇克(quark.sm.cn)`及`112114(112114.xyz)`等。\n5. 本軟件僅使用`iframe`技術嵌入多家視頻平臺內容，包括但不限於`360影視(360kan.com)` `愛奇藝(iq.com)` `騰訊視頻(wetv.vip)` `優酷視頻(youku.tv)` `芒果TV(w.mgtv.com)` `樂視視頻(letv.com)` `搜狐視頻(tv.sohu.com)` `聚力網(pptv.com)`及`嗶哩嗶哩(bilibili.tv)`等。您應當遵守相應平臺的隱私政策或服務協議等。\n6. 本軟件含\"去廣告\"選項可增強使用體驗，您應知悉開啟後可能存在兼容性問題。同時該選項可能會違反第三方廠商的商業條款，您應遵守相應廠商的條款。\n7. 為遵守網絡安全法的內容審核要求，本軟件不具備內容審核能力因此不提供彈幕發送服務。彈幕展示的內容可能存在不良言論，由於數據來源於您提供的數據資源，我們無法對此進程清洗，您應當忽略這部分彈幕內容。我們呼籲用戶文明用語，共同維護網絡健康環境。\n8. 我們深知隱私無價。因此，本軟件絕不收集任何用戶數據，除了必要的備份（此過程由您提供的第三方廠商進行管理）外，所有信息均嚴格本地存儲，確保您的數據僅在您掌控之中。本軟件不與任何第三方共享您的任何信息。\n9. 根據生成式人工智能（AIGC）相關規定，用戶在使用AIGC服務時須嚴格遵守合法用途、內容規範及禁止濫用原則。AIGC生成的內容僅供參考，其準確性、完整性或適用性不獲保證，亦不代表我方立場。相關數據將共享至第三方AIGC服務商。\n10. 本軟件完全`免費`且`開源`，如果您通過任何渠道付費下載本軟件說明您已經受騙。如果您喜歡本軟件可以贊助我們，旨在表達對開源軟件表示支持，但您應當清楚理解，贊助款項不享有任何服務保障，也不構成任何形式的合同關系。\n11. 您在使用本軟件時需自行負責所有操作和使用結果。本軟件不對您通過使用本軟件獲取的任何內容負責，包括但不限於媒體資源的準確性、版權合規性、完整性、安全性和可用性。對於任何因使用本軟件導致的損失、損害或法律糾紛，不承擔任何責任。\n12. 您在使用本軟件時必須遵守您所在國家或地區的相關法律法規，禁止使用本軟件進行任何違法活動，包括但不限於製作、上傳、傳播、存儲任何違法、侵權、淫穢、誹謗、惡意軟件等內容。如您違反相關法律法規，需承擔相應的法律責任。\n13. 本協議適用於使用本軟件的所有用戶。本軟件保留隨時修改、更新本聲明的權利，並以`軟件更新`或`Github Readme`文檔等形式通知您。請您定期查閱並遵守最新的協議。\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/assets/lab-edit-help.md",
    "content": "- 初始化\n  - 每次初始化ext參數會丟失, 需使用ext參數需前往 [設置->影視配置] 手動配置debug源\n  - 如提示debug源不存在, 可刷新頁面或前往 [設置->影視配置] 手動創建debug源(標識填寫debug, 其他隨意)\n- 編輯器: 如提示大量語法報錯, 先切換其他適配器再重新選擇\n- 日誌: 部分適配器不支持日誌輸出\n- 適配器\n  - T4: 已適配插件的可前往 [實驗室->插件程序->插件] 安裝對應模塊\n  - T3[py]\n    - 前往 [實驗室->插件程序->環境] 安裝uv模塊\n    - 點擊初始化會自動化安裝python環境, 首次需耐心等待, 如失敗則需要手動操作\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/assets/live-epg.md",
    "content": "**部分頻道無電子節目單屬於正常現象, 由第三方數據平臺控製**\n\n> 接口支持 `diyp` 和 `xml` 模式\n\n- diyp\n  - 需配置參數: {'{'}name{'}'}(標識需查詢頻道名稱)和{'{'}date{'}'}(標識需查詢頻道日期)\n  - 例: `https://epg.xxx.com/?ch={'{'}name{'}'}&date={'{'}date{'}'}`\n- xml\n  - 該模式無需配置參數\n  - 該模式不支持日期查詢\n  - 例: `http://epg.xxx.com/e.xml`\n\n> 優先級: [設置->直播配置->單源->節目單字段] > [設置->基礎配置->直播->節目單字段]\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/assets/live-logo.md",
    "content": "**部分頻道無臺標屬於正常現象, 由第三方數據平臺控製**\n\n- 需配置參數{'{'}name{'}'}(標識需查詢臺標名稱)\n- 例: `https://epg.xxx.com/logo/{name}.png`\n\n> 優先級: [頻道自帶臺標字段] > [設置->直播配置->單源->臺標字段] > [設置->基礎配置->直播->臺標字段]\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/browser.ts",
    "content": "export default {\n  title: '瀏覽',\n  message: {\n    tabOverflow: '標簽頁過多, 請關閉部分標簽頁',\n    noSupportProtocol: '不支持該協議連結打開',\n  },\n  button: {\n    openInBrowser: '使用預設瀏覽器打開',\n  },\n  history: {\n    recent: '最近打開',\n    tip: '只記錄最近{0}條瀏覽數據',\n  },\n  tab: {\n    newTab: '新建標簽頁',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/film.ts",
    "content": "export default {\n  title: '影視',\n  noDesc: '暫無劇情簡介',\n  info: {\n    type: '類型',\n    area: '地區',\n    release: '上映',\n  },\n  infiniteLoading: {\n    noConfig: '請前往 [設置->影視配置] 配置數據',\n  },\n  message: {\n    formatEpisodeError: '數據源格式化劇集錯誤, 確認數據源是否正常',\n    notSelectAnalyze: '識別到官解數據, 但未選擇解析線路',\n    notSelectSourceBeforeSearch: '未選擇數據源或本站模式數據源搜索狀態為關閉',\n    noEffectiveSearchSource: '無有效搜索數據源, 請檢查數據源搜索配置和搜索模式',\n    noDetailInfo: '詳情數據缺失或錯誤',\n    noSiteInfo: '關聯數據源查找失敗',\n    noSupportAction: '當前操作不支持',\n  },\n  field: {\n    name: '名稱',\n    type: '類型',\n    typeMap: {\n      't0-xml': 'T0[xml]',\n      't1-json': 'T1[json]',\n      't3-js_drpy': 'T3[js_drpy]',\n      't3-js_catopen': 'T3[js_catopen]',\n      't3-csp_xbpq': 'T3[csp_xbpq]',\n      't3-csp_xyq': 'T3[csp_xyq]',\n      't3-csp_appysv2': 'T3[csp_appysv2]',\n      't3-alist': 'T3[alist]',\n      't3-csp_appget': 'T3[csp_appget]',\n      't3-csp_appqi': 'T3[csp_appqi]',\n      't3-csp_appfox': 'T3[csp_appfox]',\n      't3-py': 'T3[py]',\n      't4-drpys': 'T4[drpys]',\n      't4-catvod': 'T4[catvod]',\n      't4-drpy_js0': 'T4[drpy_js0]',\n    },\n    key: '標識',\n    api: '接口',\n    search: '搜索',\n    searchMap: {\n      close: '關閉',\n      only: '僅搜索',\n      gather: '聚合',\n    },\n    playUrl: '解析',\n    ext: '擴展',\n    group: '分組',\n    category: '類別',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/index.ts",
    "content": "import browser from './browser';\nimport film from './film';\nimport lab from './lab';\nimport live from './live';\nimport md from './md';\nimport moment from './moment';\nimport parse from './parse';\nimport player from './player';\nimport plugin from './plugin';\nimport setting from './setting';\n\nexport default {\n  browser,\n  film,\n  lab,\n  live,\n  md,\n  moment,\n  parse,\n  player,\n  plugin,\n  setting,\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/lab.ts",
    "content": "export default {\n  title: '實驗室',\n  crypto: {\n    title: '字符編碼',\n    field: {\n      content: '內容',\n      key: '密鑰',\n      cert: '證書',\n      inputEncode: '原文格式',\n      outputEncode: '輸出格式',\n    },\n    encrypt: {\n      title: '加解密',\n      field: {\n        iv: '偏移',\n        mode: '運算',\n        pad: '填充',\n        tag: '標簽',\n        aad: '附加數據',\n        passphrase: '密鑰密碼',\n        drop: '丟棄',\n        encodeMap: {\n          base64: 'Base64',\n          hex: 'Hex',\n          utf8: 'Utf8',\n          utf16: 'Utf16',\n          utf16be: 'Utf16BE',\n          utf16le: 'Utf16LE',\n          latin1: 'Latin1',\n        },\n        modeMap: {\n          cbc: 'CBC',\n          ctr: 'CTR',\n          cfb: 'CFB',\n          ofb: 'OFB',\n          ecb: 'ECB',\n          gcm: 'GCM',\n          xts: 'XTS',\n          ccm: 'CCM',\n        },\n        paddingMap: {\n          pkcs5Padding: 'Pkcs5',\n          pkcs7Padding: 'Pkcs7',\n          zeroPadding: 'Zero',\n          ansiX923: 'AnsiX923',\n          iso10126: 'Iso10126',\n          iso97971: 'Iso97971',\n          noPadding: 'NoPadding',\n          rsaesPkcs1: 'PKCS1',\n          rsaOaep: 'OAEP',\n          rsaOaepSha1: 'OAEP-SHA1',\n          rsaOaepSha256: 'OAEP-SHA256',\n          rsaOaepSha384: 'OAEP-SHA384',\n          rsaOaepSha512: 'OAEP-SHA512',\n          rsaOaepMd5: 'OAEP-MD5',\n        },\n        algorithmMap: {\n          rsa: 'RSA',\n          rc4: 'RC4',\n          rc4Drop: 'RC4Drop',\n          aes: 'AES',\n          des: 'DES',\n          tripleDes: '3DES',\n          rabbit: 'Rabbit',\n          rabbitLegacy: 'RabbitLegacy',\n          sm4: 'SM4',\n        },\n      },\n      message: {\n        encodeNotUtf8: '加密不支持utf8作為輸出格式',\n        decodeNotUtf8: '解密不支持utf8作為輸入格式',\n      },\n    },\n    hash: {\n      title: '哈希',\n      field: {\n        typeMap: {\n          hash: '散列計算',\n          hmac: '散列消息認證碼',\n        },\n        algorithmMap: {\n          'md5-16': 'MD5-16',\n          'md5-32': 'MD5-32',\n          sha1: 'SHA1',\n          sha224: 'SHA224',\n          sha256: 'SHA256',\n          sha3: 'SHA3',\n          sha384: 'SHA384',\n          sha512: 'SHA512',\n          'sha512-224': 'SHA512-224',\n          'sha512-256': 'SHA512-256',\n          ripemd160: 'RIPEMD160',\n          sm3: 'SM3',\n        },\n      },\n    },\n    encode: {\n      title: '編解碼',\n      field: {\n        algorithmMap: {\n          unicode: 'UniCode',\n          base64: 'Base64',\n          html: 'Html',\n          url: 'URL',\n          hex: 'Hex',\n          gzip: 'Gzip',\n        },\n      },\n    },\n  },\n  diff: {\n    title: '文本對比',\n    file: '文件',\n    origin: '原始',\n    target: '目標',\n    diff: '對比',\n  },\n  edit: {\n    title: '寫源工具',\n    nav: {\n      template: '模板',\n      file: {\n        title: '文件',\n        folder: '目錄',\n        import: '導入',\n        export: '導出',\n      },\n      decode: '解碼',\n      debug: '調試',\n    },\n    rule: {\n      pdfa: '列表',\n      pdfh: '節點',\n      url: '地址',\n      wd: '關鍵詞',\n      page: '分頁',\n      tid: '類',\n      filter: '過濾',\n      ids: '標識',\n      flag: '線路',\n      play: '選集',\n    },\n    action: {\n      init: '初始化',\n      home: '分類',\n      homeVod: '首頁',\n      category: '列表',\n      detail: '詳情',\n      search: '搜索',\n      play: '播放',\n      proxy: '代理',\n      proxyUpload: '代理上傳',\n    },\n    debug: {\n      dom: '節點',\n      data: '數據',\n    },\n    message: {\n      noInitSource: '自動化流程失敗, 請按幫助手動創建debug源, 並刷新頁面',\n      codeNoData: '編輯器內容為空',\n      htmlNoData: '源代碼內容為空',\n    },\n    placeholder: {\n      pdfa: '請輸入列表規則(如 body&&li)',\n      pdfh: '請輸入節點規則(如 body&&a,0&&href)',\n      proxyUpload: '請輸入三元組, [響應碼, 響應頭, 響應體]',\n    },\n  },\n  sift: {\n    title: '靜態篩選',\n    source: '寫源',\n    rule: {\n      className: '類名',\n      classUrl: '類標識',\n      class: '大類',\n      cateExclude: '排除',\n      link: '鏈接',\n      filter: '篩選',\n      filterInfo: '詳細',\n      excludeKeys: '鍵移除',\n      match: {\n        plot: '劇情',\n        area: '地區',\n        lang: '語言',\n        year: '年份',\n        letter: '字母',\n        sort: '排序',\n      },\n    },\n    action: {\n      category: '生成篩選分類',\n      match: '生成篩選列表',\n      currentSift: '生成當前篩選',\n      finalSift: '生成最終篩選',\n      copyFinalSift: '復製最終篩選',\n    },\n    debug: {\n      data: '數據',\n    },\n    placeholder: {\n      classNameTip: '補充類名(如: 電影&劇集), 用&分隔',\n      classUrlTip: '補充類標識(如: movie&plot), 用&分隔',\n      classParseTip: '選擇器(list;title;url;match), 用;分隔',\n      cateExcludeTip: `排除(如: 首頁{'|'}留言), 用{'|'}分隔`,\n      linkTip: '拼接fyclass(如: /id/fyclass.html)',\n      filterTip: '選擇器(如: body&&.scroll-content), 同類型用;分隔, 不同類型換行',\n      filterInfoTip: '詳細篩選(key;name;type;title;url), 每行對應一個',\n      keyExcludeTip: `鍵排除(如: 地區{'|'}年份), 用{'|'}分隔`,\n      reg: '正則表達式(如: show(.*?)/id',\n    },\n    message: {\n      inputNoClassParse: '參數大類為空',\n      inputNoFilterAndFilterInfo: '參數篩選或篩選詳細為空',\n      sourceFirst: '必須先獲取源代碼',\n      classResultisEmpty: '請先執行生成篩選分類',\n      siftResultisEmpty: '請先執行生成最終篩選',\n    },\n  },\n  sniffer: {\n    title: '媒體嗅探',\n    field: {\n      initScript: '初始參數',\n      runScript: '運行參數',\n      customRegex: '正則匹配',\n      snifferExclude: '正則排除',\n    },\n  },\n  player: {\n    title: '播放測試',\n  },\n  extension: {\n    title: '擴展程序',\n    plugin: {\n      title: '插件',\n      server: '服務',\n      file: '目錄',\n      empty: '空空如也',\n      field: {\n        typeMap: {\n          ui: '界面插件',\n          system: '系統插件',\n          mix: '混合插件',\n        },\n      },\n      info: {\n        title: '應用信息',\n        author: '作者',\n        desc: '描述',\n        status: '狀態',\n        stop: '停止',\n        start: '啟動',\n        error: '出錯',\n      },\n      control: {\n        title: '控製中心',\n        start: '啟動服務',\n        stop: '停止服務',\n        devtool: '開發者工具',\n        upgrade: '升級',\n        update: '更新',\n        install: '安裝',\n        uninstall: '卸載',\n        uninstallTip: '卸載後將無法使用, 請謹慎操作',\n        cancelTip: '當前插件存在未執行完命令, 請稍後',\n        devtoolDomAttchErrTip: '打開開發者工具失敗, DOM未掛載到頁面上',\n        loadUiEntryError: '加載入口失敗',\n      },\n      content: {\n        title: 'README',\n      },\n      webview: {\n        title: '內容視圖',\n      },\n      installDialog: {\n        tip: {\n          tip1: '將項目放入指定目錄中, 文件名不可有特殊字符(如已放入則忽略)',\n          tip2: '輸入項目名進行安裝(項目文件名)',\n        },\n        step: '步驟',\n        goDir: '前往指定目錄',\n        confirm: '安裝',\n      },\n    },\n    env: {\n      title: '環境',\n    },\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/live.ts",
    "content": "export default {\n  title: '直播',\n  delay: '超時',\n  infiniteLoading: {\n    noConfig: '請前往 [設置->直播配置] 配置數據',\n  },\n  field: {\n    name: '名稱',\n    api: '接口',\n    apiMap: {\n      remote: '遠程',\n      local: '本地',\n      manual: '手動',\n    },\n    epg: '節目',\n    logo: '臺標',\n  },\n  popup: {\n    epg: `diyp需配置參數{'{'}name{'}'}(標識需查詢頻道名稱)和{'{'}date{'}'}(標識需查詢頻道日期); xml無需配置參數`,\n    logo: `需配置參數{'{'}name{'}'}(標識需查詢臺標名稱)`,\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/md.ts",
    "content": "import binaryHelpMD from './assets/binary-help.md?raw';\nimport customPlayerMD from './assets/custom-player.md?raw';\nimport disclaimerMD from './assets/disclaimer.md?raw';\nimport labEditHelpMD from './assets/lab-edit-help.md?raw';\nimport liveEpgMD from './assets/live-epg.md?raw';\nimport liveLogoMD from './assets/live-logo.md?raw';\n\nexport default {\n  customPlayer: {\n    title: '自定義播放器',\n    content: customPlayerMD,\n  },\n  disclaimer: {\n    title: '用戶須知',\n    content: disclaimerMD,\n    readComplete: '已完成閱讀',\n    readProcess: '已閱讀{0}%',\n    message: {\n      agree: '用觀影發現世界',\n      disagree: '3秒後自動退出軟件',\n    },\n  },\n  liveEpg: {\n    title: '直播節目單',\n    content: liveEpgMD,\n  },\n  liveLogo: {\n    title: '直播頻道圖標',\n    content: liveLogoMD,\n  },\n  labEditHelp: {\n    title: '寫源工具幫助',\n    content: labEditHelpMD,\n  },\n  binaryHelp: {\n    title: '安裝幫助',\n    content: binaryHelpMD,\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/moment.ts",
    "content": "export default {\n  name: '時刻',\n  history: {\n    title: '歷史',\n  },\n  star: {\n    title: '收藏',\n    checkUpdate: '更新',\n    isUpdate: '有更新',\n  },\n  date: {\n    today: '今天',\n    week: '七天內',\n    ago: '更早',\n  },\n  progress: {\n    watched: '已看完',\n    watching: '已看',\n  },\n  message: {},\n  noRelatedSource: '暫無關聯數據源',\n  noDesc: '暫無劇情簡介',\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/parse.ts",
    "content": "export default {\n  title: '解析',\n  play: '播放',\n  search: {\n    input: '輸入關鍵詞搜索',\n    enter: '回車',\n    clear: '清空',\n    tip: '輸入 {0} 快速指定搜索源, 例如',\n    watch: '查看',\n    content: '的所有內容',\n  },\n  platform: {\n    title: '支持平臺',\n    360: '360影視',\n    iqiyi: '愛奇藝',\n    youku: '優酷視頻',\n    tencent: '騰訊視頻',\n    sohu: '搜狐視頻',\n    mgtv: '芒果tv',\n    pptv: '聚力網',\n    letv: '樂視視頻',\n    bilibili: '嗶哩嗶哩',\n  },\n  message: {\n    invalidAddress: '地址欄地址不正確',\n    invalidApi: '解析接口不正確',\n    noActiveSource: '未選擇解析源',\n    info: '正在加載當前視頻, 請耐心等待',\n    error: '加載失敗, 請嘗試切換其他接口',\n    empty: '請選擇解析接口或輸入需要解析的地址',\n  },\n  field: {\n    name: '名稱',\n    type: '類型',\n    api: '接口',\n    apiMap: {\n      web: 'Web',\n      json: 'Json',\n    },\n    script: '腳本',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/player.ts",
    "content": "export default {\n  title: '播放器',\n  film: {\n    desc: '簡介',\n    anthology: '選集',\n    episode: '劇集',\n    recommend: '猜你喜歡',\n    info: {\n      background: '背景',\n      actors: '演職員',\n      director: '導演',\n      actor: '主演',\n    },\n  },\n  live: {\n    epg: '節目',\n    channel: '頻道',\n    group: '分組',\n  },\n  header: {\n    backMain: '回到主界面',\n  },\n  function: {\n    like: '收藏',\n    download: '下載',\n    share: '分享',\n    setting: '設置',\n  },\n  status: {\n    unplay: '未播放',\n    played: '已播放',\n    playing: '播放中',\n    useing: '使用中',\n    unuse: '未使用',\n  },\n  message: {\n    play: '請稍後,數據處理中,如長時間未播放請換源',\n    noActiveAnalyze: '該線路需先選擇解析接口',\n    noRecMatch: '未找到匹配推薦, 繼續播放當前內容',\n    noPlayUrl: '播放地址獲取失敗,請換源或線路',\n  },\n  setting: {\n    title: '設置',\n    loopEnabled: '循環播放',\n    skipHeadAndEnd: '進度跳過',\n    playNextEnabled: '自動連播',\n    playNextPreload: '預載下集',\n    skipAd: '智能去廣',\n    skipStart: '片頭',\n    skipEnd: '片尾',\n    tip: '開關全局生效',\n  },\n  download: {\n    title: '離線緩存',\n    copy: '復製鏈接',\n    copyCurrentUrl: '復製當前地址',\n    recommendDownloaderName: 'M3U8-Downloader',\n    recommendDownloaderTip: '推薦使用開源下載器',\n    statusAwaitDownload: '待下載',\n    statusRequireDownload: '需下載',\n    soureceSelect: '請選下載源',\n    copySuccess: '復製成功，快到下載器裏下載吧',\n    copyFail: '復製失敗，當前環境不支持一鍵復製',\n    copyEmpty: '請先選擇需要下載的內容',\n    copyError: '當前環境不支持一鍵復製, 請手動復製鏈接',\n    copyCheck: '當前復製的內容可能需要嗅探',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/plugin.ts",
    "content": "export default {\n  title: '插件',\n  field: {\n    typeMap: {\n      ui: '界面',\n      system: '系統',\n      mix: '混合',\n    },\n  },\n  install: {\n    tip: {\n      file: '將項目放入目錄中, 文件名不可含特殊字符(如已放入則忽略)',\n      input: '輸入項目名進行安裝(文件名)',\n    },\n    goDir: '前往插件目錄',\n  },\n  message: {\n    install: '異步安裝中, 超時不一定代表失敗, 請稍後刷新查看...',\n    uninstall: '異步卸載中, 超時不一定代表失敗, 請稍後刷新查看...',\n    start: '異步啟動中, 超時不一定代表失敗, 請稍後刷新查看...',\n    stop: '異步停止中, 超時不一定代表失敗, 請稍後刷新查看...',\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/setting.ts",
    "content": "export default {\n  title: '設置',\n  nav: {\n    baseConfig: '基礎配置',\n    dataManage: '數據配置',\n    filmSource: '影視配置',\n    liveSource: '直播配置',\n    parseSource: '解析配置',\n  },\n  base: {\n    bossKey: '老板鍵',\n    timeout: '超時',\n    zoom: {\n      title: '縮放',\n      levelMap: {\n        small: '小',\n        standard: '標準',\n        large: '大',\n      },\n    },\n    hot: '熱榜',\n    site: {\n      title: '站點',\n      hotMap: {\n        baidu: '百度',\n        douban: '豆瓣',\n        enlightent: '雲合',\n        kylive: '酷雲',\n        komect: '移動愛家',\n        quark: '誇克',\n      },\n      searchMap: {\n        local: '本站',\n        group: '組內',\n        all: '全部',\n      },\n      filter: '過濾',\n    },\n    live: {\n      ipMark: '網絡標識',\n      delay: '延遲',\n      thumbnail: '縮略圖',\n      popup: {\n        thumbnail: '請前往 [實驗室->擴展程序->環境] 安裝ffmpeg和ffprobe 以啟用縮略圖功能',\n      },\n    },\n    player: {\n      title: '播放器',\n      barrage: '彈幕',\n      command: '命令',\n      sniffer: '嗅探',\n    },\n    security: {\n      title: '安全',\n      proxy: '網絡代理',\n      ua: '用戶代理',\n      dns: '域名解析',\n    },\n    permission: {\n      title: '權限',\n      autoLaunch: '開機自啟',\n      windowPosition: '窗口位置',\n      debug: '調試模式',\n      hardwareAcceleration: '硬件加速',\n    },\n    other: {\n      title: '其他',\n      factoryReset: '恢復出廠',\n      checkUpdate: '檢查更新',\n      disclaimer: '用戶協議',\n      license: '開源軟件聲明',\n    },\n  },\n  message: {\n    willReboot: '應用即將重啟',\n    effectReboot: '重啟應用後生效',\n    partialReboot: '部分模塊重啟應用後生效',\n  },\n  sniffer: {\n    title: '嗅探',\n    typeMap: {\n      puppeteer: '自動化',\n      thirdParty: '三方接入',\n    },\n  },\n  barrage: {\n    title: '彈幕',\n    param: {\n      base: '基礎參數',\n      map: '映射參數',\n    },\n    tip: {\n      base: '',\n      map: '對應彈幕返回的位置, 下標從0開始',\n    },\n    field: {\n      key: '數據',\n      support: '線路',\n      type: '滾動',\n      text: '彈幕',\n      time: '時間',\n      color: '顏色',\n    },\n    popup: {\n      url: `需配置參數{'{'}id{'}'}(標識需查詢彈幕ID)`,\n      nested: '嵌套取值使用點號(.)分隔',\n    },\n  },\n  ua: {\n    title: 'User-Agent',\n    topTip: '模擬用戶代理',\n    bottomTip: '推薦chrome, 空使用系統默認',\n  },\n  proxy: {\n    title: '代理',\n    typeMap: {\n      system: '系統代理',\n      custom: '自定義代理',\n      direct: '不使用代理',\n    },\n    field: {\n      url: '代理地址',\n      bypass: '繞過規則',\n    },\n    placeholder: {\n      url: 'socks5://127.0.0.1:6153',\n      bypass: 'localhost,127.0.0.1,::1',\n    },\n  },\n  dns: {\n    title: 'DNS-over-HTTP',\n    topTip: '使用安全DNS',\n    bottomTip: '推薦騰訊, 空使用系統默認',\n  },\n  factoryReset: {\n    title: '恢復出廠',\n    content: '你確定要恢復出廠嗎? 確認後將擦除所有數據。',\n  },\n  data: {\n    title: '數據管理',\n    override: '覆蓋',\n    additional: '追加',\n    config: {\n      title: '配置',\n      field: {\n        url: '接口',\n      },\n      popup: {\n        override: '原有數據將清除，確認配置嗎',\n        additional: '原有數據上追加，確認配置嗎',\n        clear: '選中數據將被刪除, 確認操作嗎',\n      },\n    },\n    easyConfig: {\n      title: '快捷配置',\n      field: {\n        typeMap: {\n          catvod: 'Catvod',\n          drpy: 'Drpy(js0)',\n          tvbox: 'Tvbox',\n        },\n      },\n    },\n    configImport: {\n      title: '數據導入',\n      field: {\n        typeMap: {\n          remote: '遠程',\n          local: '本地',\n        },\n      },\n    },\n    configExport: {\n      title: '數據導出',\n    },\n    clearData: {\n      title: '數據清理',\n    },\n    sync: {\n      title: '數據同步',\n      field: {\n        typeMap: {\n          icloud: 'iCloud',\n          webdav: 'WebDav',\n        },\n        url: '地址',\n        username: '用戶名',\n        password: '授權碼',\n        autoSync: '自動同步',\n      },\n      action: {\n        backup: '備份到雲端',\n        resume: '從雲端恢復',\n      },\n      popup: {\n        backup: '雲端數據將被覆蓋, 確認操作嗎?',\n        resume: '本地數據將被覆蓋, 確認操作嗎?',\n      },\n    },\n  },\n  update: {\n    title: '檢查更新',\n    noUpdate: '當前已經是最新版本',\n    latestVersion: '最新版本',\n    changelog: '更新日誌',\n    errorlog: '出錯日誌',\n    downloadProcess: '已下載 {0}%',\n    message: {\n      downloaded: '安裝包下載完成',\n    },\n  },\n};\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/system.ts",
    "content": "export default {\n  app: {\n    about: '關於 {{ name }}',\n    hide: '隱藏',\n    hideOthers: '隱藏其他',\n    show: '顯示',\n    showAll: '顯示全部',\n    quit: '退出 {{ name }}',\n    reboot: '重啟',\n  },\n  file: {\n    title: '文件',\n    closeWindow: '關閉窗口',\n  },\n  edit: {\n    title: '編輯',\n    undo: '撤銷',\n    redo: '重做',\n    cut: '剪切',\n    copy: '複製',\n    paste: '粘貼',\n    pasteAndMatchStyle: '粘貼並匹配樣式',\n    delete: '刪除',\n    selectAll: '全選',\n  },\n  view: {\n    title: '視圖',\n    reload: '重新加載',\n    forceReload: '強制重新加載',\n    toggleDevTools: '切換開發者工具',\n    actualSize: '實際大小',\n    zoomIn: '放大',\n    zoomOut: '縮小',\n    toggleFullScreen: '切換全屏模式',\n  },\n  window: {\n    title: '窗口',\n    minimize: '最小化',\n    zoom: '縮放',\n    fill: '填充',\n    center: '居中',\n  },\n  help: {\n    title: '幫助',\n  },\n  contextMenu: {\n    inspect: '檢查',\n  },\n  tray: {\n    open: '打開 {{ name }}',\n    version: '版本: {{ version }}',\n    website: '網站',\n    document: '文檔',\n    reportIssue: '報告問題',\n    openData: '打開數據文件夾',\n    quit: '退出',\n  },\n};\n"
  },
  {
    "path": "packages/shared/modules/__tests__/camelcase.test.ts",
    "content": "import { describe, expect, it } from 'vitest';\n\nimport {\n  camelCase,\n  constantCase,\n  delimiterLowerCase,\n  delimiterUpperCase,\n  kebabCase,\n  pascalCase,\n  snakeCase,\n  titleCase,\n} from '../camelcase';\n\ndescribe('camelcase', () => {\n  it('validateAndCleanInput should trim and handle empty strings', () => {\n    expect(camelCase('  hello-world  ')).toBe('helloWorld');\n    expect(camelCase('')).toBe('');\n    expect(camelCase('   ')).toBe('');\n  });\n\n  it('camelCase should convert strings correctly', () => {\n    expect(camelCase('hello-world')).toBe('helloWorld');\n    expect(camelCase('hello_world', '_')).toBe('helloWorld');\n    expect(camelCase('hello.world', '.')).toBe('helloWorld');\n    expect(camelCase('hello-world', '-', '-')).toBe('hello-World');\n  });\n\n  it('pascalCase should convert strings correctly', () => {\n    expect(pascalCase('hello-world')).toBe('HelloWorld');\n    expect(pascalCase('hello_world', '_')).toBe('HelloWorld');\n    expect(pascalCase('hello.world', '.')).toBe('HelloWorld');\n    expect(pascalCase('hello-world', '-', '-')).toBe('Hello-World');\n  });\n\n  it('snakeCase should convert strings correctly', () => {\n    expect(snakeCase('hello-world')).toBe('hello_world');\n    expect(snakeCase('hello.world', '.')).toBe('hello_world');\n  });\n\n  it('kebabCase should convert strings correctly', () => {\n    expect(kebabCase('hello_world', '_')).toBe('hello-world');\n    expect(kebabCase('hello.world', '.')).toBe('hello-world');\n  });\n\n  it('constantCase should convert strings correctly', () => {\n    expect(constantCase('hello-world')).toBe('HELLO_WORLD');\n    expect(constantCase('hello.world', '.')).toBe('HELLO_WORLD');\n  });\n\n  it('titleCase should convert strings correctly', () => {\n    expect(titleCase('hello-world')).toBe('Hello World');\n    expect(titleCase('hello_world', '_')).toBe('Hello World');\n  });\n\n  it('delimiterLowerCase should convert strings correctly', () => {\n    expect(delimiterLowerCase('hello-world')).toBe('hello-world');\n    expect(delimiterLowerCase('hello_world', '_', ' ')).toBe('hello world');\n    expect(delimiterLowerCase('hello.world', '.', '_')).toBe('hello_world');\n  });\n\n  it('delimiterUpperCase should convert strings correctly', () => {\n    expect(delimiterUpperCase('hello-world')).toBe('HELLO-WORLD');\n    expect(delimiterUpperCase('hello_world', '_', ' ')).toBe('HELLO WORLD');\n    expect(delimiterUpperCase('hello.world', '.', '_')).toBe('HELLO_WORLD');\n  });\n\n  it('should handle empty or invalid input', () => {\n    expect(camelCase('')).toBe('');\n    expect(pascalCase('')).toBe('');\n    expect(snakeCase('')).toBe('');\n    expect(kebabCase('')).toBe('');\n    expect(constantCase('')).toBe('');\n    expect(titleCase('')).toBe('');\n  });\n});\n"
  },
  {
    "path": "packages/shared/modules/__tests__/headers.test.ts",
    "content": "import { describe, expect, it } from 'vitest';\n\nimport { convertStandardToUri, convertUriToStandard, newUrl, stripUrlParam } from '../headers';\n\ndescribe('headers', () => {\n  describe('convertUriToStandard', () => {\n    it('should parse URL without headers correctly', () => {\n      const url = 'https://example.com/path?foo=bar#top';\n      const result = convertUriToStandard(url);\n      expect(result).toEqual({ redirect: url, headers: {} });\n    });\n\n    it('should parse only UNSAFE_HEADERS correctly', () => {\n      const url = 'https://example.com/path@Cookie=session123@User-Agent=UA123';\n      const result = convertUriToStandard(url);\n      expect(result).toEqual({\n        redirect: 'https://example.com/path',\n        headers: { Cookie: 'session123', 'User-Agent': 'UA123' },\n      });\n    });\n\n    it('should parse @Headers with JSON correctly', () => {\n      const url = 'https://example.com/path@Headers=%7B%22custom%22%3A%22abc%22%7D';\n      const result = convertUriToStandard(url);\n      expect(result).toEqual({\n        redirect: 'https://example.com/path',\n        headers: { custom: 'abc' },\n      });\n    });\n\n    it('should parse mixed UNSAFE_HEADERS and @Headers', () => {\n      const url = 'https://example.com/path@Cookie=abc@Headers=%7B%22custom%22%3A%22abc%22%7D';\n      const result = convertUriToStandard(url);\n      expect(result).toEqual({\n        redirect: 'https://example.com/path',\n        headers: { Cookie: 'abc', custom: 'abc' },\n      });\n    });\n\n    it('should decode special characters correctly', () => {\n      const url =\n        'https://example.com/path@Cookie=tok%26en@Headers=%7B%22custom%22%3A%22%E4%BD%A0%E5%A5%BD%20%26%20123%22%7D';\n      const result = convertUriToStandard(url);\n      expect(result).toEqual({\n        redirect: 'https://example.com/path',\n        headers: {\n          Cookie: 'tok&en',\n          custom: '你好 & 123',\n        },\n      });\n    });\n\n    it('should handle URL with search and hash', () => {\n      const url = 'https://example.com/path?foo=bar#section@Cookie=abc@Headers=%7B%22custom%22%3A%22abc%22%7D';\n      const result = convertUriToStandard(url);\n      expect(result).toEqual({\n        redirect: 'https://example.com/path?foo=bar#section',\n        headers: { Cookie: 'abc', custom: 'abc' },\n      });\n    });\n\n    it('should ignore non-UNSAFE headers in @Headers', () => {\n      const url =\n        'https://example.com/path@Headers=%7B%22Authorization%22%3A%22tok%26en%22%2C%22custom%22%3A%22abc%22%7D';\n      const result = convertUriToStandard(url);\n      expect(result).toEqual({\n        redirect: 'https://example.com/path',\n        headers: { Authorization: 'tok&en', custom: 'abc' },\n      });\n    });\n  });\n\n  describe('convertStandardToUri', () => {\n    const baseUrl = 'https://example.com/path';\n\n    it('should handle UNSAFE_HEADERS', () => {\n      const headers = { Cookie: 'abc', Host: 'example.com' };\n      const result = convertStandardToUri(baseUrl, headers, true);\n\n      const expected = `${baseUrl}@Host=example.com@Cookie=abc`;\n      expect(result).toBe(expected);\n    });\n\n    it('should handle normal headers into @Headers (encoded)', () => {\n      const headers = { Authorization: 'token123', custom: 'abc' };\n      const result = convertStandardToUri(baseUrl, headers, true);\n\n      const expectedHeaders = encodeURIComponent(JSON.stringify(headers));\n      const expected = `${baseUrl}@Headers=${expectedHeaders}`;\n      expect(result).toBe(expected);\n    });\n\n    it('should handle normal headers into @Headers (not encoded)', () => {\n      const headers = { Authorization: 'token123', custom: 'abc' };\n      const result = convertStandardToUri(baseUrl, headers, false);\n\n      const expected = `${baseUrl}@Headers=${JSON.stringify(headers)}`;\n      expect(result).toBe(expected);\n    });\n\n    it('should handle mixed UNSAFE_HEADERS and normal headers', () => {\n      const headers = { Cookie: 'abc', custom: 'abc' };\n      const result = convertStandardToUri(baseUrl, headers, true);\n\n      const expectedHeaders = encodeURIComponent(JSON.stringify({ custom: 'abc' }));\n      const expected = `${baseUrl}@Cookie=abc@Headers=${expectedHeaders}`;\n      expect(result).toBe(expected);\n    });\n\n    it('should handle special characters in headers', () => {\n      const headers = { Cookie: 'tok&en', custom: '你好 & 123' };\n      const result = convertStandardToUri(baseUrl, headers, true);\n\n      const expectedHeaders = encodeURIComponent(JSON.stringify({ custom: '你好 & 123' }));\n      const expected = `${baseUrl}@Cookie=tok&en@Headers=${expectedHeaders}`;\n      expect(result).toBe(expected);\n    });\n\n    it('should not encode redirect, only unsafeHeaders when encode=true', () => {\n      const redirect = 'https://example.com/path?foo=bar#top';\n      const headers = { Cookie: 'abc', custom: 'abc' };\n      const result = convertStandardToUri(redirect, headers, true);\n\n      const expectedHeaders = encodeURIComponent(JSON.stringify({ custom: 'abc' }));\n      const expected = `${redirect}@Cookie=abc@Headers=${expectedHeaders}`;\n      expect(result).toBe(expected);\n    });\n\n    it('should handle encode=false correctly', () => {\n      const redirect = 'https://example.com/path?foo=bar#top';\n      const headers = { Cookie: 'abc', custom: 'abc' };\n      const result = convertStandardToUri(redirect, headers, false);\n\n      const expected = `${redirect}@Cookie=abc@Headers=${JSON.stringify({ custom: 'abc' })}`;\n      expect(result).toBe(expected);\n    });\n  });\n\n  describe('newUrl', () => {\n    it('should build only hostname', () => {\n      const url = newUrl({ hostname: 'example.com' });\n      expect(url).toBe('https://example.com/');\n    });\n\n    it('should build only hostname and remove protocol', () => {\n      const url = newUrl({ hostname: 'http://example.com' });\n      expect(url).toBe('https://example.com/');\n    });\n\n    it('should build custom protocol', () => {\n      const url = newUrl({ protocol: 'http', hostname: 'example.com' });\n      expect(url).toBe('http://example.com/');\n    });\n\n    it('should support pathname as string', () => {\n      const url = newUrl({ hostname: 'example.com', pathname: '/foo/bar' });\n      expect(url).toBe('https://example.com/foo/bar');\n    });\n\n    it('should support pathname as array', () => {\n      const url = newUrl({ hostname: 'example.com', pathname: ['foo', 'bar', 'baz'] });\n      expect(url).toBe('https://example.com/foo/bar/baz');\n    });\n\n    it('should support pathname with duplicated slashes in array', () => {\n      const url = newUrl({ hostname: 'example.com', pathname: ['foo', '/bar/', 'baz'] });\n      expect(url).toBe('https://example.com/foo/bar/baz');\n    });\n\n    it('should support searchParams as object', () => {\n      const url = newUrl({ hostname: 'example.com', searchParams: { a: 1, b: 'test' } });\n      expect(url).toBe('https://example.com/?a=1&b=test');\n    });\n\n    it('should support searchParams as string', () => {\n      const url = newUrl({ hostname: 'example.com', searchParams: 'a=1&b=test' });\n      expect(url).toBe('https://example.com/?a=1&b=test');\n    });\n\n    it('should keep duplicated search params from string', () => {\n      const url = newUrl({ hostname: 'example.com', searchParams: 'a=1&a=2' });\n      expect(url).toBe('https://example.com/?a[]=1&a[]=2');\n    });\n\n    it('should support hash fragment', () => {\n      const url = newUrl({ hostname: 'example.com', hash: '#section' });\n      expect(url).toBe('https://example.com/#section');\n    });\n\n    it('should support all options together (encoded)', () => {\n      const url = newUrl(\n        {\n          protocol: 'http',\n          hostname: 'example.com',\n          pathname: ['api', '用户'],\n          searchParams: {\n            q: 'hello world',\n          },\n          hash: '#top',\n        },\n        true,\n      );\n\n      expect(url).toBe('http://example.com/api/%E7%94%A8%E6%88%B7?q=hello%20world#top');\n    });\n\n    it('should support all options together (decoded)', () => {\n      const url = newUrl(\n        {\n          protocol: 'http',\n          hostname: 'example.com',\n          pathname: ['api', '用户'],\n          searchParams: 'q=hello+world',\n          hash: '#top',\n        },\n        false,\n      );\n\n      expect(url).toBe('http://example.com/api/用户?q=hello world#top');\n    });\n  });\n\n  describe('stripUrlParam', () => {\n    it('should remove query params by value', () => {\n      expect(stripUrlParam('/?a=1&b={id}&c=3', '{id}', 'value')).toBe('/?a=1&c=3');\n    });\n\n    it('should remove query params by key', () => {\n      expect(stripUrlParam('/?a=1&b=2&c=3', 'b', 'key')).toBe('/?a=1&c=3');\n    });\n\n    it('should delete matched items in array value', () => {\n      expect(stripUrlParam('/?x=1&x={id}&x=2', '{id}', 'value')).toBe('/?x=1&x=2');\n    });\n\n    it('should keep hash while removing param', () => {\n      expect(stripUrlParam('/?a={id}&b=2#section', '{id}', 'value')).toBe('/?b=2#section');\n    });\n\n    it('should return original url when nothing changed', () => {\n      expect(stripUrlParam('/?a=1&b=2#hash', 'notExist', 'key')).toBe('/?a=1&b=2#hash');\n    });\n  });\n});\n"
  },
  {
    "path": "packages/shared/modules/__tests__/obj.test.ts",
    "content": "import { describe, expect, it } from 'vitest';\n\nimport { objPathValue } from '../obj';\n\ndescribe('obj', () => {\n  describe('objPathValue', () => {\n    const data = {\n      user: { list: [{ name: 'Tom' }, { name: 'Jerry' }] },\n      meta: { count: 2 },\n      empty: null,\n    };\n\n    it('should handle valid dot notation paths', () => {\n      expect(objPathValue(data, 'meta.count')).toBe(2);\n    });\n\n    it('should handle array indices', () => {\n      expect(objPathValue(data, 'user.list.0.name')).toBe('Tom');\n      expect(objPathValue(data, 'user.list[1].name')).toBe('Jerry');\n    });\n\n    it('should handle non-existent paths', () => {\n      expect(objPathValue(data, 'user.list.10.name')).toBeUndefined();\n      expect(objPathValue(data, 'a.b.c')).toBeUndefined();\n    });\n\n    it('should handle edge cases', () => {\n      expect(objPathValue(data, '')).toBeUndefined();\n      expect(objPathValue(data, null as any)).toBeUndefined();\n      expect(objPathValue(data, 123 as any)).toBeUndefined();\n    });\n  });\n});\n"
  },
  {
    "path": "packages/shared/modules/__tests__/validate.test.ts",
    "content": "import { describe, expect, it } from 'vitest';\n\nimport { isMultidimensionalArray } from '../validate';\n\ndescribe('validate', () => {\n  describe('one-dimensional array', () => {\n    it('should handle valid 1D array', () => {\n      expect(isMultidimensionalArray([1, 2, 3], 1)).toBe(true);\n    });\n\n    it('should handle valid empty 1D array', () => {\n      expect(isMultidimensionalArray([], 1)).toBe(true);\n    });\n  });\n\n  describe('isMultidimensionalArray', () => {\n    describe('two-dimensional array', () => {\n      it('should handle valid 2D array', () => {\n        expect(isMultidimensionalArray([[1, 2]], 2)).toBe(true);\n      });\n\n      it('should handle valid 2D array with empty sub-arrays', () => {\n        expect(isMultidimensionalArray([[], []], 2)).toBe(true);\n      });\n\n      it('should handle valid 1D array', () => {\n        expect(isMultidimensionalArray([1, 2, 3], 2)).toBe(false);\n      });\n\n      it('should handle valid empty array', () => {\n        expect(isMultidimensionalArray([], 2)).toBe(false);\n      });\n\n      it('should handle valid mixed array', () => {\n        expect(isMultidimensionalArray([[1, 2], 3], 2)).toBe(false);\n      });\n    });\n\n    describe('three-dimensional array', () => {\n      it('should handle valid 3D array', () => {\n        expect(isMultidimensionalArray([[[1], [2], [3]]], 3)).toBe(true);\n      });\n\n      it('should handle valid 3D array with nested empty arrays', () => {\n        expect(isMultidimensionalArray([[[], []]], 3)).toBe(true);\n      });\n\n      it('should handle valid 2D array', () => {\n        expect(isMultidimensionalArray([[1, 2]], 3)).toBe(false);\n      });\n\n      it('should handle valid empty array', () => {\n        expect(isMultidimensionalArray([], 3)).toBe(false);\n      });\n\n      it('should handle valid mixed depth array', () => {\n        expect(isMultidimensionalArray([[[1]], [2]], 3)).toBe(false);\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/shared/modules/cache.ts",
    "content": "interface CacheItem<T> {\n  data: T;\n  timestamp: number;\n  duration: number;\n}\n\nexport class CacheService {\n  private static cache: Map<string, CacheItem<any>> = new Map();\n\n  /**\n   * Set cache\n   * @param key Cache key\n   * @param data Cache data\n   * @param duration Cache duration (in milliseconds)\n   */\n  static set<T>(key: string, data: T, duration: number = 0): void {\n    this.cache.set(key, {\n      data,\n      timestamp: Date.now(),\n      duration,\n    });\n  }\n\n  /**\n   * Get cache\n   * @param key Cache key\n   * @returns Returns data if cache exists and not expired, otherwise returns null\n   */\n  static get<T>(key: string): T | null {\n    const item = this.cache.get(key);\n    if (!item) return null;\n\n    const now = Date.now();\n    if (now - item.timestamp > item.duration && item.duration > 0) {\n      this.remove(key);\n      return null;\n    }\n\n    return item.data;\n  }\n\n  /**\n   * Remove specific cache\n   * @param key Cache key\n   */\n  static remove(key: string): void {\n    this.cache.delete(key);\n  }\n\n  /**\n   * Clear all cache\n   */\n  static clear(): void {\n    this.cache.clear();\n  }\n\n  /**\n   * Check if cache exists and is valid\n   * @param key Cache key\n   * @returns boolean\n   */\n  static has(key: string): boolean {\n    const item = this.cache.get(key);\n    if (!item) return false;\n\n    const now = Date.now();\n    if (now - item.timestamp > item.duration && item.duration > 0) {\n      this.remove(key);\n      return false;\n    }\n\n    return true;\n  }\n}\n\nexport interface ICacheService {\n  set: <T>(key: string, data: T, duration?: number) => void;\n  get: <T>(key: string) => T | null;\n  remove: (key: string) => void;\n  clear: () => void;\n  has: (key: string) => boolean;\n}\n"
  },
  {
    "path": "packages/shared/modules/camelcase.ts",
    "content": "import { isStrEmpty } from './validate';\n\n/**\n * Input validation and cleaning\n * @param str Input string\n * @returns Cleaned string, or empty string if invalid\n */\nconst validateAndCleanInput = (str: string): string => {\n  if (isStrEmpty(str)) {\n    return '';\n  }\n  return str.trim() || '';\n};\n\n/**\n * Split string into an array of words\n * @param str Input string\n * @param delimiter Separator, defaults to '-'\n * @returns Array of words\n */\nconst splitToWords = (str: string, delimiter: string = '-'): string[] => {\n  return str.split(delimiter).filter((word) => word.length > 0);\n};\n\n/**\n * Convert string to camel-case format\n * @param str Input string\n * @param delimiter Separator, defaults to '-'\n * @param newDelimiter Output separator, defaults to ''\n * @returns camelCase formatted string\n *\n * @example\n * camelCase('hello-world') // 'helloWorld'\n * camelCase('hello_world', '_') // 'helloWorld'\n * camelCase('hello.world', '.') // 'helloWorld'\n * camelCase('hello-world', '-', '-') // 'hello-World'\n */\nexport const camelCase = (str: string, delimiter: string = '-', newDelimiter: string = ''): string => {\n  return transformCase(str, delimiter, newDelimiter, (word, index) => {\n    const lowerWord = word.toLowerCase();\n    return index === 0 ? lowerWord : lowerWord.charAt(0).toUpperCase() + lowerWord.slice(1);\n  });\n};\n\n/**\n * Convert string to pascal-case format\n * @param str Input string\n * @param delimiter Separator, defaults to '-'\n * @param newDelimiter Output separator, defaults to ''\n * @returns PascalCase formatted string\n *\n * @example\n * pascalCase('hello-world') // 'HelloWorld'\n * pascalCase('hello_world', '_') // 'HelloWorld'\n * pascalCase('hello.world', '.') // 'HelloWorld'\n * camelCase('hello-world', '-', '-') // 'Hello-World'\n */\nexport const pascalCase = (str: string, delimiter: string = '-', newDelimiter: string = ''): string => {\n  return transformCase(str, delimiter, newDelimiter, (word) => {\n    const lowerWord = word.toLowerCase();\n    return lowerWord.charAt(0).toUpperCase() + lowerWord.slice(1);\n  });\n};\n\n/**\n * Convert string to snake_case format\n * @param str Input string\n * @param delimiter Separator, defaults to '-'\n * @returns snake_case formatted string\n *\n * @example\n * snakeCase('hello-world') // 'hello_world'\n * snakeCase('hello.world', '.') // 'hello_world'\n */\nexport const snakeCase = (str: string, delimiter: string = '-'): string => {\n  return transformCase(str, delimiter, '_', (word) => word.toLowerCase());\n};\n\n/**\n * Convert string to kebab-case format\n * @param str Input string\n * @param delimiter Separator, defaults to '-'\n * @returns kebab-case formatted string\n *\n * @example\n * kebabCase('hello_world', '_') // 'hello-world'\n * kebabCase('hello.world', '.') // 'hello-world'\n */\nexport const kebabCase = (str: string, delimiter: string = '-'): string => {\n  return transformCase(str, delimiter, '-', (word) => word.toLowerCase());\n};\n\n/**\n * Convert string to constant_case format\n * @param str Input string\n * @param delimiter Separator, defaults to '-'\n * @returns CONSTANT_CASE formatted string\n *\n * @example\n * constantCase('hello-world') // 'HELLO_WORLD'\n * constantCase('hello.world', '.') // 'HELLO_WORLD'\n */\nexport const constantCase = (str: string, delimiter: string = '-'): string => {\n  return transformCase(str, delimiter, '_', (word) => word.toUpperCase());\n};\n\n/**\n * Convert string to title-case format\n * @param str Input string\n * @param delimiter Separator, defaults to '-'\n * @returns Title Case formatted string\n *\n * @example\n * titleCase('hello-world') // 'Hello World'\n * titleCase('hello_world', '_') // 'Hello World'\n */\nexport const titleCase = (str: string, delimiter: string = '-'): string => {\n  return transformCase(str, delimiter, ' ', (word) => {\n    const lowerWord = word.toLowerCase();\n    return lowerWord.charAt(0).toUpperCase() + lowerWord.slice(1);\n  });\n};\n\n/**\n * Convert string to lowercase with custom delimiter\n * @param str Input string\n * @param delimiter Input separator, defaults to '-'\n * @param newDelimiter Output separator, defaults to '-'\n * @returns Converted string\n *\n * @example\n * delimiterLowerCase('hello-world') // 'hello-world'\n * delimiterLowerCase('hello_world', '_', ' ') // 'hello world'\n * delimiterLowerCase('hello.world', '.', '_') // 'hello_world'\n */\nexport const delimiterLowerCase = (str: string, delimiter: string = '-', newDelimiter: string = '-'): string => {\n  return transformCase(str, delimiter, newDelimiter, (word) => word.toLowerCase());\n};\n\n/**\n * Convert string to uppercase with custom delimiter\n * @param str Input string\n * @param delimiter Input separator, defaults to '-'\n * @param newDelimiter Output separator, defaults to '-'\n * @returns Converted string\n *\n * @example\n * delimiterUpperCase('hello-world') // 'HELLO-WORLD'\n * delimiterUpperCase('hello_world', '_', ' ') // 'HELLO WORLD'\n * delimiterUpperCase('hello.world', '.', '_') // 'HELLO_WORLD'\n */\nexport const delimiterUpperCase = (str: string, delimiter: string = '-', newDelimiter: string = '-'): string => {\n  return transformCase(str, delimiter, newDelimiter, (word) => word.toUpperCase());\n};\n\n/**\n * Generic string format conversion function\n * @param str Input string\n * @param delimiter Input separator, defaults to '-'\n * @param joiner Joining character, defaults to ''\n * @param transform Word transformation function\n * @returns Converted string\n */\nconst transformCase = (\n  str: string,\n  delimiter: string = '-',\n  joiner: string = '',\n  transform: (word: string, index: number) => string,\n): string => {\n  const cleanStr = validateAndCleanInput(str);\n  if (cleanStr.length === 0) return '';\n\n  const words = splitToWords(cleanStr, delimiter);\n  if (words.length === 0) return '';\n\n  return words.map(transform).join(joiner);\n};\n\nexport default {\n  camelCase,\n  pascalCase,\n  snakeCase,\n  kebabCase,\n  constantCase,\n  titleCase,\n  delimiterLowerCase,\n  delimiterUpperCase,\n  transformCase,\n};\n"
  },
  {
    "path": "packages/shared/modules/crypto/core/base.ts",
    "content": "import type { UUIDTypes } from 'uuid';\nimport { v3 as uuidv3, v4 as uuidv4, v5 as uuidv5 } from 'uuid';\n\nimport { toString } from '../../toString';\nimport { isPositiveFiniteNumber, isUUID } from '../../validate';\n\n/**\n * Generate a random version 4 UUID\n * @returns A random UUID\n */\nexport const randomUUID = (): string => {\n  // return 'xxxxxxxx-xxxx-4xxx-Vxxx-xxxxxxxxxxxx'.replace(/[xV]/g, (placeholder) => {\n  //   let nibble = (Math.random() * 16) | 0;\n\n  //   if (placeholder === 'V') {\n  //     // Per RFC, the two MSB of byte 8 must be 0b10 (0x8).\n  //     // 0x3 (0b11) masks out the bottom two bits.\n  //     // See: https://tools.ietf.org/html/rfc4122.html#section-4.1.1\n  //     nibble = (nibble & 0x3) | 0x8;\n  //   }\n\n  //   return nibble.toString(16);\n  // });\n  return uuidv4();\n};\n\n/**\n * Generate a random nanoid\n * @param {number} [len] Length of the nanoid\n * @returns {string} A random nanoid\n */\nexport const randomNanoid = (len?: number): string => {\n  if (!isPositiveFiniteNumber(len)) len = 21;\n\n  const URL_ALPHABET = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict';\n\n  const bytes = new Uint8Array(len!);\n  for (let i = 0; i < len!; i++) {\n    bytes[i] = (Math.random() * 256) | 0;\n  }\n\n  let id = '';\n  for (let i = 0; i < len!; i++) {\n    id += URL_ALPHABET[63 & bytes[i]]!;\n  }\n\n  return id;\n};\n\n/**\n * Generates the Name-Based UUID hashes v3 and v5 according to RFC-4122\n * https://tools.ietf.org/html/rfc4122#section-4.3\n * @param {string} value Hashing target\n * @param {string} [namespace] Some name space within which generation occurs, defaults to zeros if invalid or not provided\n * @param {3|5} [version] Version of UUID. Available versions is 3 and 5\n * according to RFC-4122. The version is responsible for the hashing algorithm:\n * version 3 uses MD5, and version 5 uses SHA-1. Default is 5.\n * @returns {string} UUID\n */\nexport const generateStrUUID = (value: string, namespace?: UUIDTypes, version?: number): string => {\n  const content = toString(value);\n\n  const safeNamespace = isUUID(namespace) ? namespace! : '00000000-0000-0000-0000-000000000000';\n  const safeVersion = version === 3 || version === 5 ? version : 5;\n\n  switch (safeVersion) {\n    case 3:\n      return uuidv3(content, safeNamespace);\n    case 5:\n    default:\n      return uuidv5(content, safeNamespace);\n  }\n};\n"
  },
  {
    "path": "packages/shared/modules/crypto/core/encode.ts",
    "content": "import CryptoJS from 'crypto-js';\nimport * as he from 'he';\nimport pako from 'pako';\n\nimport { atob, btoa } from '../modules/atob-btoa';\nimport type {\n  Base64DecodeOptions,\n  Base64EncodeOptions,\n  GzipDecodeOptions,\n  GzipEncodeOptions,\n  HexDecodeOptions,\n  HexEncodeOptions,\n  HtmlDecodeOptions,\n  HtmlEncodeOptions,\n  UnicodeDecodeOptions,\n  UnicodeEncodeOptions,\n  UrlDecodeOptions,\n  UrlEncodeOptions,\n} from '../type';\nimport { arrayToWordArray, parse as wordParse, stringify as wordStringify, wordArrayToArray } from '../utils/wordArray';\nimport { isLatin1String } from './../utils/base';\n\n/**\n * Base64 编码/解码工具\n */\nexport const base64 = {\n  /**\n   * Base64 编码\n   * 在线工具参考: https://rivers.chaitin.cn/toolkit/cyberChef/Base64Encoder\n   *\n   * @param {Base64EncodeOptions} options 编码参数\n   * @returns {string} - 编码结果\n   *\n   * @example\n   * base64.encode({ src: 'this is an example' }) // => 'dGhpcyBpcyBhbiBleGFtcGxl'\n   */\n  encode: (options: Base64EncodeOptions): string => {\n    const { src, inputEncode = 'utf8' } = options;\n    if (src === '') return '';\n    const srcBuffer = wordParse[inputEncode](src);\n    return CryptoJS.enc.Base64.stringify(srcBuffer);\n  },\n\n  /**\n   * Base64 解码\n   * 在线工具参考: https://rivers.chaitin.cn/toolkit/cyberChef/Base64Decoder\n   *\n   * @param {Base64DecodeOptions} options 解码参数\n   * @returns {string} - 解码结果\n   *\n   * @example\n   * base64.decode({ src: 'dGhpcyBpcyBhbiBleGFtcGxl' }) // => 'this is an example'\n   */\n  decode: (options: Base64DecodeOptions): string => {\n    const { src, outputEncode = 'utf8' } = options;\n    if (src === '') return '';\n    const decryptedBuffer = CryptoJS.enc.Base64.parse(src);\n    return wordStringify[outputEncode](decryptedBuffer);\n  },\n\n  /**\n   * 浏览器原生Base64编码 (latin1 to base64)\n   * @param {Base64EncodeOptions} options 加密参数\n   * @returns {string} - 加密结果\n   *\n   * @example\n   * base64.btoa({ src: 'this is an example' }) // => 'dGhpcyBpcyBhbiBleGFtcGxl'\n   */\n  btoa: (options: Base64EncodeOptions): string => {\n    const { src, inputEncode = 'utf8', ignore = false } = options;\n    if (src === '') return '';\n    const srcBuffer = wordParse[inputEncode](src);\n    const srcStr = wordStringify.utf8(srcBuffer);\n    const isLatin1 = isLatin1String(srcStr);\n    if (!ignore && !isLatin1) {\n      throw new Error('Input string must be Latin-1 encoded for btoa');\n    }\n    return btoa(wordStringify.utf8(srcBuffer));\n  },\n\n  /**\n   * 浏览器原生Base64解码 (base64 to latin1)\n   * @param {Base64DecodeOptions} options 解码参数\n   * @returns {string} - 解码结果\n   *\n   * @example\n   * base64.atob({ src: 'dGhpcyBpcyBhbiBleGFtcGxl' }) // => 'this is an example'\n   */\n  atob: (options: Base64DecodeOptions): string => {\n    const { src, outputEncode = 'utf8' } = options;\n    if (src === '') return '';\n    const decrypted = atob(src);\n    return wordStringify[outputEncode](wordParse.utf8(decrypted));\n  },\n};\n\n/**\n * Unicode 编码/解码工具\n */\nexport const unicode = {\n  /**\n   * Unicode 编码\n   * 在线工具参考: https://rivers.chaitin.cn/toolkit/cyberChef/UnicodeEncode\n   *\n   * @param {UnicodeEncodeOptions} options 编码参数\n   * @returns {string} - 编码结果\n   *\n   * @example\n   * unicode.encode({ src: 'this is an example', prefix: '%u', pad: 4, encodeEverything: true }) // => \\u0074\\u0068\\u0069\\u0073\\u0020\\u0069\\u0073\\u0020\\u0061\\u006e\\u0020\\u0065\\u0078\\u0061\\u006d\\u0070\\u006c\\u0065\n   */\n  encode: (options: UnicodeEncodeOptions): string => {\n    const { src, prefix = '\\\\u', pad = 4, encodeEverything = true, inputEncode = 'utf8' } = options;\n    if (src === '') return '';\n    const plaintext = wordStringify.utf8(wordParse[inputEncode](src));\n    let encrypted = '';\n\n    const encodeChar = (char: string): string => {\n      const codePoint = char.codePointAt(0);\n      if (codePoint === undefined) return '';\n\n      let hex = codePoint.toString(16);\n      if (hex.length < pad) hex = hex.padStart(pad, '0');\n\n      return prefix + hex;\n    };\n\n    for (const char of plaintext) {\n      const shouldEncode = encodeEverything || char.charCodeAt(0) > 127;\n      if (shouldEncode) {\n        encrypted += encodeChar(char);\n      } else {\n        encrypted += char;\n      }\n    }\n\n    return encrypted;\n  },\n\n  /**\n   * Unicode 编码\n   * 在线工具参考: https://rivers.chaitin.cn/toolkit/cyberChef/UnicodeDecode\n   *\n   * @param {UnicodeDecodeOptions} options 编码参数\n   * @returns {string} - 编码结果\n   *\n   * @example\n   * unicode.decode({ src: '\\u0074\\u0068\\u0069\\u0073\\u0020\\u0069\\u0073\\u0020\\u0061\\u006e\\u0020\\u0065\\u0078\\u0061\\u006d\\u0070\\u006c\\u0065' }) // => this is an example\n   */\n  decode: (options: UnicodeDecodeOptions): string => {\n    const { src, prefix = '\\\\u', outputEncode = 'utf8' } = options;\n    if (src === '') return '';\n    let regx: RegExp | null = null;\n    if (prefix === 'U+') {\n      regx = /U\\+([0-9A-Fa-f]{4,6})/g;\n    } else if (prefix === '\\\\u') {\n      regx = /\\\\u([0-9A-Fa-f]{4,6})/g;\n    } else if (prefix === '%u') {\n      regx = /%u([0-9A-Fa-f]{4,6})/g;\n    }\n\n    const decrypted = src.replace(regx!, (_match, hex) => {\n      const codePoint = Number.parseInt(hex, 16);\n      return String.fromCodePoint(codePoint);\n    });\n\n    return wordStringify[outputEncode](wordParse.utf8(decrypted));\n  },\n};\n\n/**\n * HTML 编码/解码工具\n */\nexport const html = {\n  /**\n   * HTML 编码\n   * 在线工具参考: https://rivers.chaitin.cn/toolkit/cyberChef/HTMLEncode\n   *\n   * @param {HtmlEncodeOptions} options 编码参数\n   * @returns {string} - 编码结果\n   *\n   * @example\n   * html.encode({ src: 'foo © bar ≠ baz 𝌆 qux' }) // => &#x66;&#x6f;&#x6f;&#x20;&#xa9;&#x20;&#x62;&#x61;&#x72;&#x20;&#x2260;&#x20;&#x62;&#x61;&#x7a;&#x20;&#x1d306;&#x20;&#x71;&#x75;&#x78;\n   * html.encode({ src: 'foo © bar ≠ baz 𝌆 qux', encodeEverything: false, entities: 'hex' }) // => foo &#xa9; bar &#x2260; baz &#x1d306; qux\n   * html.encode({ src: '中国this is an example', encodeEverything: false, entities: 'numeric' }) // => &#20013;&#22269;this is an example\n   */\n  encode: (options: HtmlEncodeOptions): string => {\n    const { src, entities = 'named', encodeEverything = true, inputEncode = 'utf8' } = options;\n    if (src === '') return '';\n    const plaintext = wordStringify.utf8(wordParse[inputEncode](src));\n    const encrypted = he.encode(plaintext, {\n      encodeEverything,\n      ...(entities === 'numeric' ? { decimal: true } : {}),\n      ...(['named', 'hex'].includes(entities) ? { useNamedReferences: entities === 'named' } : {}),\n    });\n\n    return encrypted;\n  },\n\n  /**\n   * HTML 解码参数\n   * https://rivers.chaitin.cn/toolkit/cyberChef/HTMLDecode\n   *\n   * @param {HtmlDecodeOptions} options 解码参数\n   * @returns {string} - 解码结果\n   *\n   * @example\n   * html.decode({ src: '1 &lt; 2 &amp; 3 &gt; 4' }) // => 1 < 2 & 3 > 4\n   */\n  decode: (options: HtmlDecodeOptions): string => {\n    const { src, outputEncode = 'utf8' } = options;\n    if (src === '') return '';\n    const decrypted = he.decode(src);\n    return wordStringify[outputEncode](wordParse.utf8(decrypted));\n  },\n};\n\n/**\n * Gzip 压缩/解压工具\n */\nexport const gzip = {\n  /**\n   * Gzip 编码\n   * 在线工具参考: https://www.toolhelper.cn/EncodeDecode/Compress\n   *\n   * @param {GzipEncodeOptions} options 编码参数\n   * @returns {string} - 编码结果\n   *\n   * @example\n   * gzip.encode({ src: 'this is an example' }) // => 'H4sIAAAAAAAAAyvJyCxWAKLEPIXUisTcgpxUAG3ADfISAAAA'\n   */\n  encode: (options: GzipEncodeOptions): string => {\n    const { src, inputEncode = 'utf8', outputEncode = 'base64' } = options;\n    if (src === '') return '';\n    const buffer = wordParse[inputEncode](src);\n    const compressed = pako.gzip(wordArrayToArray(buffer));\n    return wordStringify[outputEncode](arrayToWordArray(compressed));\n  },\n\n  /**\n   * Gzip 解码\n   * 在线工具参考: https://www.toolhelper.cn/EncodeDecode/Compress\n   *\n   * @param {GzipDecodeOptions} options 解码参数\n   * @returns {string} - 解码结果\n   *\n   * @example\n   * gzip.decode({ src: 'H4sIAAAAAAAAAyvJyCxWAKLEPIXUisTcgpxUAG3ADfISAAAA' }) // => 'this is an example'\n   */\n  decode: (options: GzipDecodeOptions): string => {\n    const { src, inputEncode = 'base64', outputEncode = 'utf8' } = options;\n    if (src === '') return '';\n    const buffer = wordParse[inputEncode](src);\n    const decompressed = pako.ungzip(wordArrayToArray(buffer));\n    if (!decompressed) {\n      throw new Error('Not a valid Gzip string');\n    }\n    return wordStringify[outputEncode](arrayToWordArray(decompressed));\n  },\n};\n\n/**\n * URL 编码/解码工具\n */\nexport const url = {\n  /**\n   * Url 解码\n   * 在线工具参考: https://rivers.chaitin.cn/toolkit/cyberChef/URLEncoder\n   *\n   * @param {UrlEncodeOptions} options 解码参数\n   * @returns {string} - 解码结果\n   *\n   * @example\n   * url.encode({ src: 'https://www.google.com/search?q=google map' }) // => 'https://www.google.com/search?q=google%20map'\n   * url.encode({ src: 'https://www.google.com/search?q=google map', type: 'uri' }) // => 'https%3A%2F%2Fwww%2Egoogle%2Ecom%2Fsearch%3Fq%3Dgoogle%20map'\n   */\n  encode: (options: UrlEncodeOptions): string => {\n    const { src, type = 'component', inputEncode = 'utf8' } = options;\n    if (!src) return '';\n    const plaintext = wordStringify.utf8(wordParse[inputEncode](src));\n    const encrypted = type === 'component' ? encodeURIComponent(plaintext) : encodeURI(plaintext);\n    return encrypted;\n  },\n\n  /**\n   * Url 解码\n   * 在线工具参考: https://rivers.chaitin.cn/toolkit/cyberChef/URLDecoder\n   *\n   * @param {UrlDecodeOptions} options 解码参数\n   * @returns {string} - 解码结果\n   *\n   * @example\n   * url.decode({ src: 'https://www.google.com/search?q=google%20map' }) // => 'https://www.google.com/search?q=google map'\n   * url.decode({ src: 'https%3A%2F%2Fwww%2Egoogle%2Ecom%2Fsearch%3Fq%3Dgoogle%20map', type: 'uri' }) // => 'https://www.google.com/search?q=google map'\n   */\n  decode: (options: UrlDecodeOptions): string => {\n    const { src, type = 'component', outputEncode = 'utf8' } = options;\n    if (!src) return '';\n    const decrypted = type === 'component' ? decodeURIComponent(src) : decodeURI(src);\n    return wordStringify[outputEncode](wordParse.utf8(decrypted));\n  },\n};\n\n/**\n * 十六进制分隔符映射\n */\nconst HEX_DELIMITER_MAP = {\n  space: '- ',\n  percent: '-%',\n  comma: '-,',\n  semiColon: '-;',\n  colon: '-:',\n  lineFeed: '-\\n',\n  crlf: '-\\r\\n',\n  '0x': '0x-',\n  '0xComma': '0x-,',\n  '\\\\x': '\\\\x-',\n  none: '-',\n} as const;\n\n/**\n * Hex制编码/解码工具\n */\nexport const hex = {\n  /**\n   * Hex 编码\n   * 在线工具参考: https://rivers.chaitin.cn/toolkit/cyberChef/HexEncoder\n   *\n   * @param {HexEncodeOptions} options 编码参数\n   * @returns {string} - 编码结果\n   *\n   * @example\n   * hex.encode({ src: 'this is an example', delimiter: 'none' }) // => '7468697320697320616e206578616d706c65'\n   */\n  encode: (options: HexEncodeOptions): string => {\n    const { src, delimiter = 'none', inputEncode = 'utf8' } = options;\n    const delimiterStr = HEX_DELIMITER_MAP[delimiter];\n    const [prefix, suffix] = delimiterStr.split('-');\n    const hexString = wordStringify.hex(wordParse[inputEncode](src));\n\n    const bytes = hexString.match(/.{1,2}/g);\n    if (!bytes) return hexString;\n\n    return bytes\n      .map((byte, index, array) => {\n        const isLast = index === array.length - 1;\n        return `${prefix}${byte}${isLast ? '' : suffix}`;\n      })\n      .join('');\n  },\n\n  /**\n   * Hex 解码\n   * 在线工具参考: https://rivers.chaitin.cn/toolkit/cyberChef/HexDecoder\n   *\n   * @param {HexDecodeOptions} options 解码参数\n   * @returns {string} - 解码结果\n   *\n   * @example\n   * hex.decode({ src: '7468697320697320616e206578616d706c65', delimiter: 'none' }) // => 'this is an example'\n   */\n  decode: (options: HexDecodeOptions): string => {\n    const { src, delimiter = 'none', outputEncode = 'utf8' } = options;\n\n    // 特殊处理 \\x 格式\n    if (delimiter === '\\\\x') {\n      return wordStringify[outputEncode](wordParse.utf8(src));\n    }\n\n    const delimiterStr = HEX_DELIMITER_MAP[delimiter];\n    const [prefix, suffix] = delimiterStr.split('-');\n\n    let hexString = src;\n\n    const escapeRegExp = (string: string): string => {\n      return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n    };\n\n    // 移除前缀和后缀\n    if (prefix) {\n      hexString = hexString.replace(new RegExp(escapeRegExp(prefix), 'g'), '');\n    }\n    if (suffix) {\n      hexString = hexString.replace(new RegExp(escapeRegExp(suffix), 'g'), '');\n    }\n\n    // 验证十六进制字符串长度\n    if (hexString.length % 2 !== 0) {\n      throw new Error('String length must be even');\n    }\n\n    return wordStringify[outputEncode](wordParse.hex(hexString));\n  },\n};\n"
  },
  {
    "path": "packages/shared/modules/crypto/core/encrypt/aes.ts",
    "content": "import { cipher } from 'node-forge';\n\nimport type { AesOptionsNew, Pad } from '../../type';\nimport {\n  arrayToBytes as forgeArrayToBytes,\n  bytesToArray as forgeBytesToArray,\n  stringify as forgeStringify,\n} from '../../utils/forge';\nimport {\n  arrayToWordArray,\n  pad as wordArrayPad,\n  parse as wordArrayParse,\n  unpad as wordArrayUnpad,\n  wordArrayToArray,\n} from '../../utils/wordArray';\n\n/**\n * 获取填充模式名称\n */\nconst getPad = (pad: string): Pad => {\n  switch (pad.toLowerCase()) {\n    case 'pkcs5padding':\n    case 'pkcs7padding':\n      return 'pkcs7padding';\n    case 'ansix923':\n      return 'ansix923';\n    case 'iso10126':\n      return 'iso10126';\n    case 'iso97971':\n      return 'iso97971';\n    case 'zeropadding':\n      return 'zeropadding';\n    case 'nopadding':\n    default:\n      return 'nopadding';\n  }\n};\n\n/**\n * 获取加密模式\n */\nconst getMode = (mode: string): cipher.Algorithm => {\n  switch (mode.toLowerCase()) {\n    case 'cfb':\n      return 'AES-CFB';\n    case 'ofb':\n      return 'AES-OFB';\n    case 'ctr':\n      return 'AES-CTR';\n    case 'ecb':\n      return 'AES-ECB';\n    case 'gcm':\n      return 'AES-GCM';\n    case 'cbc':\n    default:\n      return 'AES-CBC';\n  }\n};\n\n/**\n * AES 加密/解密工具\n */\nexport const aes = {\n  /**\n   * AES 加密方法\n   * 不支持中文-https://rivers.chaitin.cn/toolkit/cyberChef/AESEncrypt\n   * 不支持gcm-https://emn178.github.io/online-tools/aes/encrypt/\n   * https://www.toolhelper.cn/SymmetricEncryption/AES\n   *\n   * @param {AesOptions} options - 加密参数\n   * @returns {string} - 加密结果\n   *\n   * @example\n   * aes.encode({\n   *   src: 'this is an example',\n   *   key: '8jki8sihkdjh7sukebky9j',\n   *   iv: '8jki8sihkdjh7sukebky9j',\n   *   mode: 'cbc',\n   *   pad: 'pkcs7padding',\n   *   inputEncode: 'utf8',\n   *   keyEncode: 'base64',\n   *   ivEncode: 'base64',\n   *   outputEncode: 'hex',\n   * });\n   *  => 308988e542e1da36e676ad117627c3b496c2e64a63711a0310f6f562aa3904f8\n   *  => MImI5ULh2jbmdq0RdifDtJbC5kpjcRoDEPb1Yqo5BPg=\n   */\n  encode: (options: AesOptionsNew): string => {\n    const {\n      src,\n      key,\n      iv,\n      mode = 'cbc',\n      pad = 'pkcs7padding',\n      aad,\n      inputEncode = 'utf8',\n      keyEncode = 'utf8',\n      ivEncode = 'utf8',\n      aadEncode = 'utf8',\n      tagEncode = 'utf8',\n      outputEncode = 'base64',\n    } = options;\n\n    if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n    if (key === '' || src === '') return '';\n    if (!['ecb', 'gcm'].includes(mode.toLowerCase()) && (!iv || iv === '')) {\n      throw new Error('IV is required in CBC/CFB/OFB/CTR mode');\n    }\n\n    const keyBuffer = wordArrayParse[keyEncode](key);\n    const ivBuffer = mode.toLowerCase() !== 'ecb' ? wordArrayParse[ivEncode](iv!) : undefined;\n\n    if (![16, 24, 32].includes(keyBuffer.sigBytes)) {\n      throw new Error('Key must be 128, 192, or 256 bytes');\n    }\n    if (!['ecb', 'gcm'].includes(mode.toLowerCase()) && ivBuffer!.sigBytes !== 16) {\n      throw new Error('IV must be 128 bytes');\n    }\n\n    const srcBuffer = wordArrayParse[inputEncode](src);\n    const aadBuffer = mode.toLowerCase() === 'gcm' && aad ? wordArrayParse[aadEncode](aad) : undefined;\n\n    const encipher = cipher.createCipher(\n      getMode(mode),\n      forgeArrayToBytes(wordArrayToArray(keyBuffer) as unknown as ArrayBuffer),\n    );\n    encipher.start({\n      iv: ivBuffer ? forgeArrayToBytes(wordArrayToArray(ivBuffer) as unknown as ArrayBuffer) : undefined,\n      additionalData: aadBuffer\n        ? (forgeArrayToBytes(wordArrayToArray(aadBuffer) as unknown as ArrayBuffer) as unknown as string)\n        : undefined,\n    });\n    const paddedData = ['cbc', 'ecb'].includes(mode.toLowerCase())\n      ? wordArrayPad[getPad(pad) as keyof typeof wordArrayPad](srcBuffer, 4)\n      : srcBuffer;\n\n    if (\n      paddedData.sigBytes % 16 !== 0 &&\n      pad.toLowerCase() === 'nopadding' &&\n      ['cbc', 'ecb'].includes(mode.toLowerCase())\n    ) {\n      throw new Error('Message must be multipler of 128 bits');\n    }\n\n    // @ts-expect-error private property\n    encipher.mode.pad = false;\n    encipher.update(forgeArrayToBytes(wordArrayToArray(paddedData) as unknown as ArrayBuffer));\n    encipher.finish();\n    const encrypted = encipher.output;\n\n    // GCM模式需要返回标签\n    if (mode.toLowerCase() === 'gcm') {\n      const encryptedData = forgeStringify[outputEncode as keyof typeof forgeStringify](encrypted.getBytes() as never);\n      const tag = forgeStringify[tagEncode as keyof typeof forgeStringify](encipher.mode.tag as never);\n      return `${encryptedData}\\nTag:${tag}`;\n    }\n\n    return forgeStringify[outputEncode as keyof typeof forgeStringify](encrypted.getBytes() as never);\n  },\n\n  /**\n   * AES 解密方法\n   * 不支持中文-https://rivers.chaitin.cn/toolkit/cyberChef/AESDecrypt\n   * 不支持gcm-https://emn178.github.io/online-tools/aes/decrypt/\n   * https://www.toolhelper.cn/SymmetricEncryption/AES\n   *\n   * @param {AesOptions} options - 解密参数\n   * @returns {string} - 解密结果\n   *\n   * @example\n   * aes.decode({\n   *   src: '308988e542e1da36e676ad117627c3b496c2e64a63711a0310f6f562aa3904f8',\n   *   key: '8jki8sihkdjh7sukebky9j',\n   *   iv: '8jki8sihkdjh7sukebky9j',\n   *   mode: 'cbc',\n   *   pad: 'pkcs7padding',\n   *   inputEncode: 'hex',\n   *   keyEncode: 'base64',\n   *   ivEncode: 'base64',\n   *   outputEncode: 'utf8',\n   * });\n   *  => this is an example\n   */\n  decode: (options: AesOptionsNew): string => {\n    const {\n      src,\n      key,\n      iv,\n      mode = 'cbc',\n      pad = 'pkcs7padding',\n      aad,\n      tag,\n      inputEncode = 'base64',\n      keyEncode = 'utf8',\n      ivEncode = 'utf8',\n      aadEncode = 'utf8',\n      tagEncode = 'utf8',\n      outputEncode = 'utf8',\n    } = options;\n\n    if (!['base64', 'hex'].includes(inputEncode.toLowerCase())) return '';\n    if (key === '' || src === '') return '';\n    if (!['ecb', 'gcm'].includes(mode.toLowerCase()) && (!iv || iv === '')) {\n      throw new Error('IV is required in CBC/CFB/OFB/CTR mode');\n    }\n\n    const keyBuffer = wordArrayParse[keyEncode](key);\n    const ivBuffer = mode.toLowerCase() !== 'ecb' ? wordArrayParse[ivEncode](iv!) : undefined;\n\n    if (![16, 24, 32].includes(keyBuffer.sigBytes)) {\n      throw new Error('Key must be 128, 192, or 256 bytes');\n    }\n    if (!['ecb', 'gcm'].includes(mode.toLowerCase()) && ivBuffer!.sigBytes !== 16) {\n      throw new Error('IV must be 128 bytes');\n    }\n\n    const srcBuffer = wordArrayParse[inputEncode](src);\n    const aadBuffer = mode.toLowerCase() === 'gcm' && aad ? wordArrayParse[aadEncode](aad) : undefined;\n    const tagBuffer = mode.toLowerCase() === 'gcm' && tag ? wordArrayParse[tagEncode](tag) : undefined;\n\n    const decipher = cipher.createDecipher(\n      getMode(mode),\n      forgeArrayToBytes(wordArrayToArray(keyBuffer) as unknown as ArrayBuffer),\n    );\n    decipher.start({\n      iv: ivBuffer ? forgeArrayToBytes(wordArrayToArray(ivBuffer) as unknown as ArrayBuffer) : undefined,\n      additionalData: aadBuffer\n        ? (forgeArrayToBytes(wordArrayToArray(aadBuffer) as unknown as ArrayBuffer) as unknown as string)\n        : undefined,\n      tag: tagBuffer ? forgeArrayToBytes(wordArrayToArray(tagBuffer) as unknown as ArrayBuffer) : undefined,\n    });\n\n    // @ts-expect-error private property\n    decipher.mode.unpad = false;\n    decipher.update(forgeArrayToBytes(wordArrayToArray(srcBuffer) as unknown as ArrayBuffer));\n    decipher.finish();\n    const decrypted = decipher.output;\n\n    const unpaddedBuffer = wordArrayUnpad[getPad(pad) as keyof typeof wordArrayPad](\n      arrayToWordArray(forgeBytesToArray(decrypted)),\n    );\n    const unpaddedBytes = forgeArrayToBytes(wordArrayToArray(unpaddedBuffer) as unknown as ArrayBuffer);\n\n    return forgeStringify[outputEncode as keyof typeof forgeStringify](unpaddedBytes.getBytes() as never);\n  },\n};\n"
  },
  {
    "path": "packages/shared/modules/crypto/core/encrypt/crypto.ts",
    "content": "import CryptoJS from 'crypto-js';\n\nimport type {\n  AesOptions,\n  DesOptions,\n  RabbitLegacyOptions,\n  RabbitOptions,\n  Rc4DropOptions,\n  Rc4Options,\n  TripleDesOptions,\n} from '../../type';\nimport { parse, stringify } from '../../utils/wordArray';\n\nconst getMode = (mode: string) => {\n  switch (mode.toLowerCase()) {\n    case 'cfb':\n      return CryptoJS.mode.CFB;\n    case 'ofb':\n      return CryptoJS.mode.OFB;\n    case 'ctr':\n      return CryptoJS.mode.CTR;\n    case 'ecb':\n      return CryptoJS.mode.ECB;\n    case 'cbc':\n    default:\n      return CryptoJS.mode.CBC;\n  }\n};\n\nconst getPad = (pad: string) => {\n  switch (pad.toLowerCase()) {\n    case 'pkcs5padding':\n    case 'pkcs7padding':\n      return CryptoJS.pad.Pkcs7;\n    case 'ansix923':\n      return CryptoJS.pad.AnsiX923;\n    case 'iso10126':\n      return CryptoJS.pad.Iso10126;\n    case 'iso97971':\n      return CryptoJS.pad.Iso97971;\n    case 'zeropadding':\n      return CryptoJS.pad.ZeroPadding;\n    case 'nopadding':\n    default:\n      return CryptoJS.pad.NoPadding;\n  }\n};\n\n/**\n * RC4 加密/解密工具\n */\nexport const rc4 = {\n  /**\n   * RC4 加密方法\n   * https://emn178.github.io/online-tools/rc4/encrypt/\n   * https://rivers.chaitin.cn/toolkit/cyberChef/RC4\n   *\n   * @param {Rc4Options} options - 加密参数\n   * @returns {string} - 加密后的字符串\n   *\n   * @example\n   * rc4.encode({\n   *   src: 'this is an example',\n   *   key: 'test',\n   *   inputEncode: 'utf8',\n   *   keyEncode: 'utf8',\n   *   outputEncode: 'hex',\n   * });\n   *  => dae74e62c0430e05b7207d0669c58abfd1fb\n   *  => 2udOYsBDDgW3IH0GacWKv9H7\n   */\n  encode: (options: Rc4Options): string => {\n    const { src, key, inputEncode = 'utf8', keyEncode = 'utf8', outputEncode = 'base64' } = options;\n\n    if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n    if (!src) return '';\n    if (key === '') {\n      throw new Error('Key is required for RC4 encryption');\n    }\n\n    const k = parse[keyEncode](key);\n\n    const plaintext = parse[inputEncode](src);\n    const encrypted = CryptoJS.RC4.encrypt(plaintext, k);\n    return stringify[outputEncode](encrypted.ciphertext);\n  },\n\n  /**\n   * RC4 解密方法\n   * https://emn178.github.io/online-tools/rc4/decrypt/\n   *\n   * @param {Rc4Options} options - 解密参数\n   * @returns {string} - 解密后的字符串\n   *\n   * @example\n   * rc4.decode({\n   *   src: 'dae74e62c0430e05b7207d0669c58abfd1fb',\n   *   key: 'test',\n   *   inputEncode: 'hex',\n   *   keyEncode: 'utf8',\n   *   outputEncode: 'utf8',\n   * });\n   *  => this is an example\n   */\n  decode: (options: Rc4Options): string => {\n    const { src, key, inputEncode = 'utf8', keyEncode = 'utf8', outputEncode = 'base64' } = options;\n\n    if (!['base64', 'hex'].includes(inputEncode.toLowerCase())) return '';\n    if (!src) return '';\n    if (key === '') {\n      throw new Error('Key is required for RC4 encryption');\n    }\n\n    const k = parse[keyEncode](key);\n\n    const ciphertext = parse[inputEncode](src);\n    const cipherParams = CryptoJS.lib.CipherParams.create({ ciphertext });\n    const decrypted = CryptoJS.RC4.decrypt(cipherParams, k);\n    return stringify[outputEncode](decrypted);\n  },\n};\n\n/**\n * RC4 Drop 加密/解密工具\n */\nexport const rc4Drop = {\n  /**\n   * RC4 Drop 加密方法\n   * https://rivers.chaitin.cn/toolkit/cyberChef/RC4Drop\n   *\n   * @param {Rc4DropOptions} options - 加密参数\n   * @returns {string} - 加密后的字符串\n   *\n   * @example\n   * rc4Drop.encode({\n   *   src: 'this is an example',\n   *   key: 'text',\n   *   drop: 192,\n   *   inputEncode: 'utf8',\n   *   keyEncode: 'utf8',\n   *   outputEncode: 'hex',\n   * });\n   *  => d664763b8fc6df3c25c24bdd822069a99fb0\n   *  => 1mR2O4/G3zwlwkvdgiBpqZ+w\n   */\n  encode: (options: Rc4DropOptions): string => {\n    const { src, key, drop = 192, inputEncode = 'utf8', keyEncode = 'utf8', outputEncode = 'base64' } = options;\n\n    if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n    if (!src) return '';\n    if (!(Number.isFinite(drop) && Number.isInteger(drop) && drop >= 0)) {\n      throw new Error('Drop must be a positive integer');\n    }\n    if (key === '') {\n      throw new Error('Key is required for RC4 encryption');\n    }\n\n    const k = parse[keyEncode](key);\n\n    const plaintext = parse[inputEncode](src);\n    const encrypted = CryptoJS.RC4Drop.encrypt(plaintext, k, {\n      drop,\n    });\n    return stringify[outputEncode](encrypted.ciphertext);\n  },\n\n  /**\n   * RC4 Drop 解密方法\n   * https://rivers.chaitin.cn/toolkit/cyberChef/RC4Drop\n   *\n   * @param {Rc4DropOptions} options - 解密参数\n   * @returns {string} - 解密后的字符串\n   *\n   * @example\n   * rc4Drop.decode({\n   *   src: 'd664763b8fc6df3c25c24bdd822069a99fb0',\n   *   key: 'text',\n   *   drop: 192,\n   *   inputEncode: 'hex',\n   *   keyEncode: 'utf8',\n   *   outputEncode: 'utf8',\n   * });\n   *  => this is an example\n   */\n  decode: (options: Rc4DropOptions): string => {\n    const { src, key, drop = 192, inputEncode = 'utf8', keyEncode = 'utf8', outputEncode = 'base64' } = options;\n\n    if (!['base64', 'hex'].includes(inputEncode.toLowerCase())) return '';\n    if (!src) return '';\n    if (!(Number.isFinite(drop) && Number.isInteger(drop) && drop >= 0)) {\n      throw new Error('Drop must be a positive integer');\n    }\n    if (key === '') {\n      throw new Error('Key is required for RC4 encryption');\n    }\n\n    const k = parse[keyEncode](key);\n\n    const ciphertext = parse[inputEncode](src);\n    const cipherParams = CryptoJS.lib.CipherParams.create({ ciphertext });\n    const decrypted = CryptoJS.RC4Drop.decrypt(cipherParams, k, {\n      drop,\n    });\n    return stringify[outputEncode](decrypted);\n  },\n};\n\n/**\n * AES 加密/解密工具\n */\nexport const _aes = {\n  /**\n   * AES 加密方法\n   * 不支持中文-https://rivers.chaitin.cn/toolkit/cyberChef/AESDecrypt\n   * 不支持gcm-https://emn178.github.io/online-tools/aes/decrypt/\n   * https://www.toolhelper.cn/SymmetricEncryption/AES\n   *\n   * @param {AesOptions} options - 加密参数\n   * @returns {string} - 加密结果\n   *\n   * @example\n   * aes.encode({\n   *   src: 'this is an example',\n   *   key: '8jki8sihkdjh7sukebky9j',\n   *   iv: '8jki8sihkdjh7sukebky9j',\n   *   mode: 'cbc',\n   *   pad: 'pkcs7padding',\n   *   inputEncode: 'utf8',\n   *   keyEncode: 'base64',\n   *   ivEncode: 'base64',\n   *   outputEncode: 'hex',\n   * });\n   *  => 308988e542e1da36e676ad117627c3b496c2e64a63711a0310f6f562aa3904f8\n   *  => MImI5ULh2jbmdq0RdifDtJbC5kpjcRoDEPb1Yqo5BPg=\n   */\n  encode: (options: AesOptions): string => {\n    const {\n      src,\n      key,\n      iv,\n      mode = 'cbc',\n      pad = 'pkcs7padding',\n      inputEncode = 'utf8',\n      keyEncode = 'utf8',\n      ivEncode = 'utf8',\n      outputEncode = 'base64',\n    } = options;\n\n    if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n    if (src === '') return '';\n    if (key === '') {\n      throw new Error('Key is required for AES encryption');\n    }\n    if (!['ecb', 'gcm'].includes(mode.toLowerCase()) && iv === '') {\n      throw new Error('IV is required in CBC/CFB/OFB/CTR mode');\n    }\n\n    const k = parse[keyEncode](key);\n    const v = mode.toLowerCase() !== 'ecb' ? parse[ivEncode](iv!) : undefined;\n    const plaintext = parse[inputEncode](src);\n\n    if (![16, 24, 32].includes(k.sigBytes)) throw new Error('Key must be 128, 192 or 256 bytes');\n    if (mode !== 'ecb' && v!.sigBytes !== 16) throw new Error('IV must be 128 bytes');\n\n    if (\n      plaintext.sigBytes % 64 !== 0 &&\n      pad.toLowerCase() === 'nopadding' &&\n      ['cbc', 'ecb'].includes(mode.toLowerCase())\n    ) {\n      throw new Error('Message must be multipler of 128 bits');\n    }\n\n    const encrypted = CryptoJS.AES.encrypt(plaintext, k, {\n      iv: v,\n      mode: getMode(mode),\n      padding: getPad(['cbc', 'ecb'].includes(mode.toLowerCase()) ? pad : 'nopadding'),\n    });\n    return stringify[outputEncode](encrypted.ciphertext);\n  },\n\n  /**\n   * AES 解密方法\n   * 不支持中文-https://rivers.chaitin.cn/toolkit/cyberChef/AESDecrypt\n   * 不支持gcm-https://emn178.github.io/online-tools/aes/decrypt/\n   * https://www.toolhelper.cn/SymmetricEncryption/AES\n   *\n   * @param {AesOptions} options - 解密参数\n   * @returns {string} - 解密结果\n   *\n   * @example\n   * aes.decode({\n   *   src: '308988e542e1da36e676ad117627c3b496c2e64a63711a0310f6f562aa3904f8',\n   *   key: '8jki8sihkdjh7sukebky9j',\n   *   iv: '8jki8sihkdjh7sukebky9j',\n   *   mode: 'cbc',\n   *   pad: 'pkcs7padding',\n   *   inputEncode: 'hex',\n   *   keyEncode: 'base64',\n   *   ivEncode: 'base64',\n   *   outputEncode: 'utf8',\n   * });\n   *  => this is an example\n   */\n  decode: (options: AesOptions): string => {\n    const {\n      src,\n      key,\n      iv,\n      mode = 'cbc',\n      pad = 'pkcs7padding',\n      inputEncode = 'utf8',\n      keyEncode = 'utf8',\n      ivEncode = 'utf8',\n      outputEncode = 'base64',\n    } = options;\n\n    if (!['base64', 'hex'].includes(inputEncode.toLowerCase())) return '';\n    if (src === '') return '';\n    if (key === '') {\n      throw new Error('Key is required for AES encryption');\n    }\n    if (!['ecb', 'gcm'].includes(mode.toLowerCase()) && iv === '') {\n      throw new Error('IV is required in CBC/CFB/OFB/CTR mode');\n    }\n\n    const k = parse[keyEncode](key);\n    const v = mode.toLowerCase() !== 'ecb' ? parse[ivEncode](iv!) : undefined;\n\n    if (![16, 24, 32].includes(k.sigBytes)) throw new Error('Key must be 128, 192 or 256 bytes');\n    if (mode !== 'ecb' && v!.sigBytes !== 16) throw new Error('IV must be 128 bytes');\n\n    const ciphertext = parse[inputEncode](src);\n    const cipherParams = CryptoJS.lib.CipherParams.create({ ciphertext });\n    const decrypted = CryptoJS.AES.decrypt(cipherParams, k, {\n      iv: v,\n      mode: getMode(mode),\n      padding: getPad(['cbc', 'ecb'].includes(mode.toLowerCase()) ? pad : 'nopadding'),\n    });\n    return stringify[outputEncode](decrypted);\n  },\n};\n\n/**\n * DES 加密/解密工具\n */\nexport const des = {\n  /**\n   * DES 加密方法\n   * 中文有问题-https://rivers.chaitin.cn/toolkit/cyberChef/DESEncrypt\n   * https://emn178.github.io/online-tools/des/encrypt/\n   *\n   * @param {DesOptions} options - 加密参数\n   * @returns {string} - 加密结果\n   *\n   * @example\n   * des.encode({\n   *   src: 'this is an example',\n   *   key: '4fr4g4jhbiu',\n   *   iv: '4fr4g4jhbiu',\n   *   mode: 'cbc',\n   *   pad: 'pkcs7padding',\n   *   inputEncode: 'utf8',\n   *   keyEncode: 'base64',\n   *   ivEncode: 'base64',\n   *   outputEncode: 'hex',\n   * });\n   *  => 8aae2e6c45114fd43eebce934eeeda428b0cb01924613398\n   *  => iq4ubEURT9Q+686TTu7aQosMsBkkYTOY\n   */\n  encode: (options: DesOptions): string => {\n    const {\n      src,\n      key,\n      iv,\n      mode = 'cbc',\n      pad = 'pkcs7padding',\n      inputEncode = 'utf8',\n      keyEncode = 'utf8',\n      ivEncode = 'utf8',\n      outputEncode = 'base64',\n    } = options;\n\n    if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n    if (src === '') return '';\n    if (key === '') {\n      throw new Error('Key is required for DES encryption');\n    }\n    if (!['ecb'].includes(mode.toLowerCase()) && (!iv || iv === '')) {\n      throw new Error('IV is required in CBC/CFB/OFB/CTR mode');\n    }\n\n    const k = parse[keyEncode](key);\n    const v = mode.toLowerCase() !== 'ecb' ? parse[ivEncode](iv!) : undefined;\n    const plaintext = parse[inputEncode](src);\n\n    if (k.sigBytes !== 8) throw new Error('Key must be 64 bytes');\n    if (mode !== 'ecb' && v!.sigBytes !== 8) throw new Error('IV must be 64 bytes');\n\n    const encrypted = CryptoJS.DES.encrypt(plaintext, k, {\n      iv: v,\n      mode: getMode(mode),\n      padding: getPad(['cbc', 'ecb'].includes(mode.toLowerCase()) ? pad : 'nopadding'),\n    });\n    return stringify[outputEncode](encrypted.ciphertext);\n  },\n\n  /**\n   * DES 解密方法\n   * https://rivers.chaitin.cn/toolkit/cyberChef/DESDecrypt\n   * https://emn178.github.io/online-tools/des/decrypt/\n   *\n   * @param {DesOptions} options - 解密参数\n   * @returns {string} - 解密结果\n   *\n   * @example\n   * des.decode({\n   *  src: '8aae2e6c45114fd43eebce934eeeda428b0cb01924613398',\n   *  key: '4fr4g4jhbiu',\n   *  iv: '4fr4g4jhbiu',\n   *  mode: 'cbc',\n   *  pad: 'pkcs7padding',\n   *  inputEncode: 'hex',\n   *  keyEncode: 'base64',\n   *  ivEncode: 'base64',\n   *  outputEncode: 'utf8',\n   * });\n   *  => this is an example\n   */\n  decode: (options: DesOptions): string => {\n    const {\n      src,\n      key,\n      iv,\n      mode = 'cbc',\n      pad = 'pkcs7padding',\n      inputEncode = 'utf8',\n      keyEncode = 'utf8',\n      ivEncode = 'utf8',\n      outputEncode = 'base64',\n    } = options;\n\n    if (!['base64', 'hex'].includes(inputEncode.toLowerCase())) return '';\n    if (src === '') return '';\n    if (key === '') {\n      throw new Error('Key is required for DES encryption');\n    }\n    if (!['ecb'].includes(mode.toLowerCase()) && (!iv || iv === '')) {\n      throw new Error('IV is required in CBC/CFB/OFB/CTR mode');\n    }\n\n    const k = parse[keyEncode](key);\n    const v = mode.toLowerCase() !== 'ecb' ? parse[ivEncode](iv!) : undefined;\n\n    if (k.sigBytes !== 8) throw new Error('Key must be 64 bytes');\n    if (mode !== 'ecb' && v!.sigBytes !== 8) throw new Error('IV must be 64 bytes');\n\n    const ciphertext = parse[inputEncode](src);\n    const cipherParams = CryptoJS.lib.CipherParams.create({ ciphertext });\n    const decrypted = CryptoJS.DES.decrypt(cipherParams, k, {\n      iv: v,\n      mode: getMode(mode),\n      padding: getPad(['cbc', 'ecb'].includes(mode.toLowerCase()) ? pad : 'nopadding'),\n    });\n    return stringify[outputEncode](decrypted);\n  },\n};\n\n/**\n * 3DES 加密/解密工具\n */\nexport const tripleDes = {\n  /**\n   * 3DES 加密方法\n   * 中文有问题-https://rivers.chaitin.cn/toolkit/cyberChef/3DESEncrypt\n   * https://emn178.github.io/online-tools/triple-des/encrypt/\n   *\n   * @param {TripleDesOptions} options - 加密参数\n   * @returns {string} - 加密结果\n   *\n   * @example\n   * tripleDes.encode({\n   *   src: 'this is an example',\n   *   key: 'ugyi76iv2c4o87bo8q7238495btc0q87',\n   *   iv: 'q7238495btc',\n   *   mode: 'cbc',\n   *   pad: 'pkcs7padding',\n   *   inputEncode: 'utf8',\n   *   keyEncode: 'base64',\n   *   ivEncode: 'base64',\n   *   outputEncode: 'hex',\n   * });\n   *  => 1dfb0a46f6f788bc7708736bc508d16c2b640b683fc87246\n   *  => HfsKRvb3iLx3CHNrxQjRbCtkC2g/yHJG\n   */\n  encode: (options: TripleDesOptions): string => {\n    const {\n      src,\n      key,\n      iv,\n      mode = 'cbc',\n      pad = 'pkcs7padding',\n      inputEncode = 'utf8',\n      keyEncode = 'utf8',\n      ivEncode = 'utf8',\n      outputEncode = 'base64',\n    } = options;\n\n    if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n    if (src === '') return '';\n    if (key === '') {\n      throw new Error('Key is required for 3DES encryption');\n    }\n    if (!['ecb'].includes(mode.toLowerCase()) && (!iv || iv === '')) {\n      throw new Error('IV is required in CBC/CFB/OFB/CTR mode');\n    }\n\n    const k = parse[keyEncode](key);\n    const v = mode.toLowerCase() !== 'ecb' ? parse[ivEncode](iv!) : undefined;\n    const plaintext = parse[inputEncode](src);\n\n    if (k.sigBytes !== 24) throw new Error('Key must be 192 bytes');\n    if (mode !== 'ecb' && v!.sigBytes !== 8) throw new Error('IV must be 64 bytes');\n\n    const encrypted = CryptoJS.TripleDES.encrypt(plaintext, k, {\n      iv: v,\n      mode: getMode(mode),\n      padding: getPad(['cbc', 'ecb'].includes(mode.toLowerCase()) ? pad : 'nopadding'),\n    });\n    return stringify[outputEncode](encrypted.ciphertext);\n  },\n\n  /**\n   * 3DES 解密方法\n   * https://rivers.chaitin.cn/toolkit/cyberChef/3DESDecrypt\n   * https://emn178.github.io/online-tools/triple-des/decrypt/\n   *\n   * @param {TripleDesOptions} options - 解密参数\n   * @returns {string} - 解密结果\n   *\n   * @example\n   * tripleDes.decode({\n   *  src: '1dfb0a46f6f788bc7708736bc508d16c2b640b683fc87246',\n   *  key: 'ugyi76iv2c4o87bo8q7238495btc0q87',\n   *  iv: 'q7238495btc',\n   *  mode: 'cbc',\n   *  pad: 'pkcs7padding',\n   *  inputEncode: 'hex',\n   *  keyEncode: 'base64',\n   *  ivEncode: 'base64',\n   *  outputEncode: 'utf8',\n   * });\n   *  => this is an example\n   */\n  decode: (options: TripleDesOptions): string => {\n    const {\n      src,\n      key,\n      iv,\n      mode = 'cbc',\n      pad = 'pkcs7padding',\n      inputEncode = 'utf8',\n      keyEncode = 'utf8',\n      ivEncode = 'utf8',\n      outputEncode = 'base64',\n    } = options;\n\n    if (!['base64', 'hex'].includes(inputEncode.toLowerCase())) return '';\n    if (src === '') return '';\n    if (key === '') {\n      throw new Error('Key is required for DES encryption');\n    }\n    if (!['ecb'].includes(mode.toLowerCase()) && (!iv || iv === '')) {\n      throw new Error('IV is required in CBC/CFB/OFB/CTR mode');\n    }\n\n    const k = parse[keyEncode](key);\n    const v = mode.toLowerCase() !== 'ecb' ? parse[ivEncode](iv!) : undefined;\n\n    if (k.sigBytes !== 24) throw new Error('Key must be 256 bytes');\n    if (mode !== 'ecb' && v!.sigBytes !== 8) throw new Error('IV must be 64 bytes');\n\n    const ciphertext = parse[inputEncode](src);\n    const cipherParams = CryptoJS.lib.CipherParams.create({ ciphertext });\n    const decrypted = CryptoJS.TripleDES.decrypt(cipherParams, k, {\n      iv: v,\n      mode: getMode(mode),\n      padding: getPad(['cbc', 'ecb'].includes(mode.toLowerCase()) ? pad : 'nopadding'),\n    });\n    return stringify[outputEncode](decrypted);\n  },\n};\n\n/**\n * Rabbit 加密/解密工具\n */\nexport const rabbit = {\n  /**\n   * Rabbit 加密方法\n   * 不支持中文-https://rivers.chaitin.cn/toolkit/cyberChef/Rabbit\n   * https://www.toolhelper.cn/SymmetricEncryption/Rabbit\n   *\n   * @param {RabbitOptions} options - 加密参数\n   * @returns {string} - 加密后的字符串\n   *\n   * @example\n   * rabbit.encode({\n   *   src: 'this is an example',\n   *   key: '7hjhguib67i6vtiuyg6rtv',\n   *   iv: '',\n   *   inputEncode: 'utf8',\n   *   keyEncode: 'base64',\n   *   ivEncode: 'utf8',\n   *   outputEncode: 'hex',\n   * });\n   *  => ab78255724b9dd5eaa4a95d5b573f56fffa9\n   *  => q3glVyS53V6qSpXVtXP1b/+p\n   */\n  encode: (options: RabbitOptions): string => {\n    const {\n      src,\n      key,\n      iv,\n      inputEncode = 'utf8',\n      keyEncode = 'utf8',\n      ivEncode = 'utf8',\n      outputEncode = 'base64',\n    } = options;\n\n    if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n    if (!src) return '';\n    if (key === '') {\n      throw new Error('Key is required for Rabbit encryption');\n    }\n\n    const k = parse[keyEncode](key);\n    const v = iv ? parse[ivEncode](iv) : undefined;\n\n    if (k.sigBytes !== 16) throw new Error('Key must be 128 bytes');\n    if (iv && v!.sigBytes !== 8) throw new Error('IV must be 64 bytes');\n\n    const plaintext = parse[inputEncode](src);\n    const encrypted = CryptoJS.Rabbit.encrypt(plaintext, k, {\n      iv: v,\n    });\n    return stringify[outputEncode](encrypted.ciphertext);\n  },\n\n  /**\n   * Rabbit 解密方法\n   * https://rivers.chaitin.cn/toolkit/cyberChef/Rabbit\n   *\n   * @param {RabbitOptions} options - 解密参数\n   * @returns {string} - 解密后的字符串\n   *\n   * @example\n   * rabbit.decode({\n   *   src: 'ab78255724b9dd5eaa4a95d5b573f56fffa9',\n   *   key: '7hjhguib67i6vtiuyg6rtv',\n   *   iv: '',\n   *   inputEncode: 'hex',\n   *   keyEncode: 'base64',\n   *   ivEncode: 'utf8',\n   *   outputEncode: 'utf8',\n   * });\n   *  => this is an example\n   */\n  decode: (options: RabbitOptions): string => {\n    const {\n      src,\n      key,\n      iv,\n      inputEncode = 'utf8',\n      keyEncode = 'utf8',\n      ivEncode = 'utf8',\n      outputEncode = 'base64',\n    } = options;\n\n    if (!['base64', 'hex'].includes(inputEncode.toLowerCase())) return '';\n    if (!src) return '';\n    if (key === '') {\n      throw new Error('Key is required for Rabbit encryption');\n    }\n\n    const k = parse[keyEncode](key);\n    const v = iv ? parse[ivEncode](iv) : undefined;\n\n    if (k.sigBytes !== 16) throw new Error('Key must be 128 bytes');\n    if (iv && v!.sigBytes !== 8) throw new Error('IV must be 64 bytes');\n\n    const ciphertext = parse[inputEncode](src);\n    const cipherParams = CryptoJS.lib.CipherParams.create({ ciphertext });\n    const decrypted = CryptoJS.Rabbit.decrypt(cipherParams, k, {\n      iv: v,\n    });\n    return stringify[outputEncode](decrypted);\n  },\n};\n\n/**\n * Rabbit Legacy 加密/解密工具\n */\nexport const rabbitLegacy = {\n  /**\n   * Rabbit Legacy 加密方法\n   *\n   * @param {RabbitLegacyOptions} options - 加密参数\n   * @returns {string} - 加密后的字符串\n   *\n   * @example\n   * rabbit.encode({\n   *   src: 'this is an example',\n   *   key: '7hjhguib67i6vtiuyg6rtv',\n   *   iv: '',\n   *   inputEncode: 'utf8',\n   *   keyEncode: 'base64',\n   *   ivEncode: 'utf8',\n   *   outputEncode: 'hex',\n   * });\n   *  => db81826a0d4a3fb16d4b6540d8083256361e\n   *  => 24GCag1KP7FtS2VA2AgyVjYe\n   */\n  encode: (options: RabbitLegacyOptions): string => {\n    const {\n      src,\n      key,\n      iv,\n      inputEncode = 'utf8',\n      keyEncode = 'utf8',\n      ivEncode = 'utf8',\n      outputEncode = 'base64',\n    } = options;\n\n    if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n    if (src === '') return '';\n    if (key === '') {\n      throw new Error('Key is required for RabbitLegacy encryption');\n    }\n\n    const k = parse[keyEncode](key);\n    const v = iv ? parse[ivEncode](iv) : undefined;\n\n    if (k.sigBytes !== 16) throw new Error('Key must be 128 bytes');\n    if (iv && v!.sigBytes !== 8) throw new Error('IV must be 64 bytes');\n\n    const plaintext = parse[inputEncode](src);\n    const encrypted = CryptoJS.RabbitLegacy.encrypt(plaintext, k);\n    return stringify[outputEncode](encrypted.ciphertext);\n  },\n\n  /**\n   * Rabbit Legacy 解密方法\n   *\n   * @param {RabbitLegacyOptions} options - 解密参数\n   * @returns {string} - 解密后的字符串\n   *\n   * @example\n   * rabbit.decode({\n   *   src: 'db81826a0d4a3fb16d4b6540d8083256361e',\n   *   key: '7hjhguib67i6vtiuyg6rtv',\n   *   iv: '',\n   *   inputEncode: 'hex',\n   *   keyEncode: 'base64',\n   *   ivEncode: 'utf8',\n   *   outputEncode: 'utf8',\n   * });\n   *  => this is an example\n   */\n  decode: (options: RabbitLegacyOptions): string => {\n    const {\n      src,\n      key,\n      iv,\n      inputEncode = 'utf8',\n      keyEncode = 'utf8',\n      ivEncode = 'utf8',\n      outputEncode = 'base64',\n    } = options;\n\n    if (!['base64', 'hex'].includes(inputEncode.toLowerCase())) return '';\n    if (src === '') return '';\n    if (key === '') {\n      throw new Error('Key is required for RabbitLegacy encryption');\n    }\n\n    const k = parse[keyEncode](key);\n    const v = iv ? parse[ivEncode](iv) : undefined;\n\n    if (k.sigBytes !== 16) throw new Error('Key must be 128 bytes');\n    if (iv && v!.sigBytes !== 8) throw new Error('IV must be 64 bytes');\n\n    const ciphertext = parse[inputEncode](src);\n    const cipherParams = CryptoJS.lib.CipherParams.create({ ciphertext });\n    const decrypted = CryptoJS.RabbitLegacy.decrypt(cipherParams, k);\n    return stringify[outputEncode](decrypted);\n  },\n};\n"
  },
  {
    "path": "packages/shared/modules/crypto/core/encrypt/index.ts",
    "content": "export * from './aes';\nexport * from './crypto';\nexport * from './rsa';\nexport * from './sm';\n"
  },
  {
    "path": "packages/shared/modules/crypto/core/encrypt/rsa.ts",
    "content": "import { md, pki } from 'node-forge';\n\nimport type { RsaOptions } from '../../type';\nimport { arrayToBytes as forgeArrayToBytes, stringify as forgeStringify } from '../../utils/forge';\nimport { parse as wordArrayParse, wordArrayToArray } from '../../utils/wordArray';\n\nconst PUB_REGEX = /^-----BEGIN PUBLIC KEY-----[\\s\\S]+?-----END PUBLIC KEY-----[\\s\\S]*$/;\nconst PRI_REGEX =\n  /^-----BEGIN (?:RSA |ENCRYPTED )?PRIVATE KEY-----[\\s\\S]+?-----END (?:RSA |ENCRYPTED )?PRIVATE KEY-----[\\s\\S]*$/;\n\nconst getPad = (pad: string): pki.rsa.EncryptionScheme => {\n  switch (pad.toLowerCase()) {\n    case 'rsa-oaep':\n    case 'rsa-oaep-sha1':\n    case 'rsa-oaep-sha256':\n    case 'rsa-oaep-sha384':\n    case 'rsa-oaep-sha512':\n    case 'rsa-oaep-md5':\n      return 'RSA-OAEP';\n    case 'rsaes-pkcs1-v1_5':\n      return 'RSAES-PKCS1-V1_5';\n    case 'nopadding':\n    default:\n      return 'RAW';\n  }\n};\n\n/**\n * RSA 加密/解密工具对象\n */\nexport const rsa = {\n  /**\n   * RSA 加密 - 不支持私钥加密\n   * https://emn178.github.io/online-tools/rsa/encrypt/\n   * https://rivers.chaitin.cn/toolkit/cyberChef/RSAEncrypt\n   * http://tool.chacuo.net/cryptrsapubkey\n   * https://the-x.cn/cryptography/Rsa.aspx\n   * https://www.toolzl.com/tools/testrsa.html\n   *\n   * @param {RsaOptions} options - 加密参数\n   * @returns {string} - 加密结果\n   *\n   * @example\n   * rsa.encode({\n   *   src: 'this is an example',\n   *   key: `-----BEGIN PUBLIC KEY-----\n        MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtT8DozafVIYR3Xim2GQX\n        TRN0Y/LOh6iwX9xnBwDv+dmEvgJ9J7EDyzkubzsRPGsD+QPtim0Pf4qFat0g2nZb\n        0VdTPWubYif2dS6R+I7Orw9khaXAGl6TS3DB1hc66u4EKx2v2dHLIhXj580T1VlY\n        SU6+mibO2Lxj0NQfTKlYr9IHo2MnFwVJxCXuxv2hSn5WQT0eQRV1NpxPmeV5soHg\n        mDjhqEc4S+2fH1LD73IVkqtZtgkhw3t2kZQWiX7jPWcydKMisG+s7SPNKDq1EMTq\n        yCIKiJRUvLfZV1GRSaeYw5clbbxcoPIGv2L7iq/NrbZCWgQs6Bk88p8lJaK77HOl\n        AQIDAQAB\n        -----END PUBLIC KEY-----\n      `,\n   *   passphrase: 'zy',\n   *   type: 0,\n   *   pad: 'rsaes-pkcs1-v1_5',\n   *   passphraseEncode: 'utf8',\n   *   inputEncode: 'utf8',\n   *   outputEncode: 'hex',\n   * });\n   *  => 091ddc4bb40a8acfaace3585bfb0e78ef3e69a7e4abe9abad9ebce6a8c76aca8887d018ef830a93575c37d1ff132a0ee8055e4e549982d36cf56bb39f6a9f59dad5457cb70ae22be44a3dccd5e03c56a41c975edb7d8134b73d511ec02fa170ac9e12b0aa703cc543ee439276bf16a65cfb2217ff1b7f2069bd1cbbfdb6486a5f42c061f7a59a1468bca612d29eefa83b664987f62d88d621f4568be335d11b71bacbdf6798bf0ac9a5c9fde298255bbf1aca8e5047caeec9f9da7d7b717a9cd3d7ccfa0b6029cf94c99a3ffd17e359391668a11d14a6e4da132d870a4ce4addba22e7fe9c3b90df9e908e796d4a10ea33d86c22ba2af320ee096f6ceaf6e5e7\n   *  => nKuZeJClPhChgZRwHwuREXz044ty8lYwOIIOY6fM1PhivBef60t6VfcBNsaHYT9OpNFuu7thcD5GT9ritD8pZbcJFWzcAXm3ica3TJUJ1acXrb7OBJhT9qS2+fB61x3T79U5hY9uVfDwctCNruQWeA96TD8unPc8B/hTioRVfFeqxSYcMn2urO0LQ49TvvYsOATcIEaeweaBDoEiwNjiyWJT6b258t9qD1AiCFzCEX1we0eOmRsL3qpuvGE5vK0KL5pRZDUJOg1GTrGOMcRcfzVWTMBABuy9HsvbA4ezQZ0LS96lB7hqxPG01CV8J+aCD3PLL5XFzOIXnFLs4f3t3g==\n   */\n  encode: (options: RsaOptions): string => {\n    const {\n      src,\n      key,\n      passphrase = '',\n      type = 0,\n      long = false,\n      pad = 'rsaes-pkcs1-v1_5',\n      passphraseEncode = 'utf8',\n      inputEncode = 'utf8',\n      outputEncode = 'base64',\n    } = options;\n\n    if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n    if (!src || !key) return '';\n\n    let rsaKey: pki.rsa.PublicKey | pki.rsa.PrivateKey;\n    if (type === 0) {\n      if (!PUB_REGEX.test(key)) throw new Error('Key is not a valid public key');\n\n      rsaKey = pki.publicKeyFromPem(key);\n    } else if (type === 1) {\n      if (!PRI_REGEX.test(key)) throw new Error('Key is not a valid private key');\n\n      if (key.includes('ENCRYPTED')) {\n        if (!passphrase) throw new Error('Passphrase is required for encrypted private key');\n\n        const passphraseBuffer = wordArrayParse[passphraseEncode](passphrase);\n        rsaKey = pki.decryptRsaPrivateKey(\n          key,\n          forgeArrayToBytes(wordArrayToArray(passphraseBuffer) as unknown as ArrayBuffer).getBytes(),\n        );\n      } else {\n        rsaKey = pki.privateKeyFromPem(key);\n      }\n    }\n\n    const srcBuffer = wordArrayParse[inputEncode](src);\n\n    const padding = getPad(pad);\n    let schemeOptions = {};\n    if (padding === 'RSA-OAEP' && pad.toLowerCase() !== 'rsa-oaep') {\n      const algorithm = pad.toLowerCase().replace('rsa-oaep-', '') || 'sha1';\n      if (!['md5', 'sha1', 'sha256', 'sha384', 'sha512'].includes(algorithm)) {\n        throw new Error(`Unsupported RSA-OAEP algorithm: ${algorithm}`);\n      }\n\n      schemeOptions = {\n        md: (md[algorithm as keyof typeof md] as { create: () => any }).create(),\n        mgf1: {\n          md: (md[algorithm as keyof typeof md] as { create: () => any }).create(),\n        },\n      };\n    }\n\n    let encrypted = '';\n    if (long) {\n      const chunks = wordArrayToArray(srcBuffer);\n      const chunkLength = chunks.length;\n      let offSet = 0;\n\n      // 根据RSA密钥长度和填充方式确定最大加密块大小\n      // 对于2048位密钥，PKCS#1 v1.5填充最大为245字节，OAEP填充最大为214字节\n      // 这里根据填充方式动态调整块大小\n      const MAX_ENCRYPT_BLOCK = padding === 'RSA-OAEP' ? 117 : 117;\n\n      const encryptedChunks: string[] = [];\n\n      while (offSet < chunkLength) {\n        let end = offSet + MAX_ENCRYPT_BLOCK;\n        if (end > chunkLength) {\n          end = chunkLength;\n        }\n\n        const chunk = chunks.slice(offSet, end);\n\n        // @ts-expect-error use before\n        const encryptedChunk = (rsaKey as pki.rsa.PublicKey).encrypt(\n          forgeArrayToBytes(chunk).getBytes(),\n          padding,\n          schemeOptions,\n        );\n        encryptedChunks.push(encryptedChunk);\n\n        offSet += MAX_ENCRYPT_BLOCK;\n      }\n\n      encrypted = encryptedChunks.join('');\n    } else {\n      // @ts-expect-error use before\n      encrypted = (rsaKey as pki.rsa.PublicKey).encrypt(\n        forgeArrayToBytes(wordArrayToArray(srcBuffer) as unknown as ArrayBuffer).getBytes(),\n        padding,\n        schemeOptions,\n      );\n    }\n\n    return forgeStringify[outputEncode as keyof typeof forgeStringify](encrypted as never);\n  },\n  /**\n   * RSA 解密 - 支持长解密\n   * https://emn178.github.io/online-tools/rsa/decrypt/\n   * https://rivers.chaitin.cn/toolkit/cyberChef/RSADecrypt\n   * http://tool.chacuo.net/cryptrsaprikey\n   *\n   * @param {RsaOptions} options - 解密参数\n   * @returns {string} - 解密结果\n   *\n   * @example\n   * rsa.decode({\n   *   src: '091ddc4bb40a8acfaace3585bfb0e78ef3e69a7e4abe9abad9ebce6a8c76aca8887d018ef830a93575c37d1ff132a0ee8055e4e549982d36cf56bb39f6a9f59dad5457cb70ae22be44a3dccd5e03c56a41c975edb7d8134b73d511ec02fa170ac9e12b0aa703cc543ee439276bf16a65cfb2217ff1b7f2069bd1cbbfdb6486a5f42c061f7a59a1468bca612d29eefa83b664987f62d88d621f4568be335d11b71bacbdf6798bf0ac9a5c9fde298255bbf1aca8e5047caeec9f9da7d7b717a9cd3d7ccfa0b6029cf94c99a3ffd17e359391668a11d14a6e4da132d870a4ce4addba22e7fe9c3b90df9e908e796d4a10ea33d86c22ba2af320ee096f6ceaf6e5e7',\n   *   key: `-----BEGIN ENCRYPTED PRIVATE KEY-----\n        MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIDmaxKA1sPuECAggA\n        MBQGCCqGSIb3DQMHBAiQ+zejUc+vvASCBMh+wCmZc8Z6eTuuxO2Vk+0u2eyEh5YF\n        ysJ450CFlBP6XT8XLB3YkvhFYJPAE1GcBe0MJjRcRGDsE+XINwOqzALbdwAXEVcF\n        gMCvDnG0SR2Q4oEmZd02ExgcbI3098V7kVMQkXH0DHzquH6QQJjxPKkLgA5B6VAn\n        c+lmpTsduHossG3Xtl1RSchcOiBsTcOgrcRacVx/gD9PIEbzyoHD0tz0R7HEIZJ2\n        ZJ4lbRBGgNPPo6VxPKel6mIfGCfWQpKTc8OVKnHxk3WPmmLssxsMHNMP2SGY8JzG\n        WseO479YV+PkR9iSEJj4hvBVW1vIzX1JIrva2RTowBE3T8M/r/p+zdFFoKvOjvDf\n        Ko4nrOp8dQ86qTo1vjwxjOTJNhqDFhLz6JXaz9613sVBISbhbVRrvqgrhe2ZcUjt\n        y8iN1ajLe/5mWY3Pj9nnKmZC4ZuXYquOgNayjxGNR/F7oaJLETNkTZ/zQJYvyq5A\n        PqvdPWSsNDex7K46F0Gpte5B9NZrISN4/BL9QX4tQFBOoXsCWqyA0Vjk6BE0uFZg\n        nsHCPMNjNr1LjniXBM8uHysEvSfEV2YFu8gZSkKvmjEPwWePvV5JMV0js1rtV8Bs\n        u58lIV+iQ8W5TxCu2Bm+wXd3z1ylNrboteAwpe6onz53RWRNLr215WIh8Rqo+xUE\n        qlJ3W5Oim/lwnnafd5lcSPLFgvkrhiDtLmZOJZxP28Kty0JvIapi93sXBClZim5Q\n        swgo/BKt0zxa1g9c/Wrn5UBXnUu59LSIro50vrcF77r/awhmvnjtm5ocQdhmFshp\n        oHXbcgXAFIfIJkRcLT58bm0Yvzw7lTmB0cpg6+eN3CrqlWDOtzDgSY3hPii/aIQq\n        sxSL7OufYUaGY1p2N/r/ZRlGGsdgATUYhkllD+9pIZbwRDjfmkmI11xm+FKarkFK\n        1/wagJpyu8WXO1BhzwZXxS7HWN6RwfL8aF94gPrb1XzFJgL8PTWNWtjWWcY5cN0f\n        p/hzgJ8rj9iMycBj7hNoDF+L6jZRIQ/N67AMDXW7YrmQQG+KvSGckisJzNrwMXZO\n        wBseBitkgC38WC4nMhPGcA45ovX4g2jyJnug5zMoa94X58SCzCjIt9Q+fd8U0g1i\n        djxHGZguvh2EbSJYmKw3yumU1jDIfqc5Pdio3It74XCuWKSVaxVa8oVmcZGByvDw\n        XYcbcq6MZsS3jrIo2tvbjRHqoNYO6djnfHeO80YVb/xuL5f28zawz+X2JC5oiOT7\n        iafE7KMa0ACd/CkR2Wguf1PqEL/tO6K3EkVxDrYPP8X9QlZJriM5jP5zWwy3PtKi\n        y/po8dQLmARJveyoyJrog8clHC20VaMfs9Y+WTjREwRe80ZXkvZD8l/b4zWjfMIX\n        IVPBUa20weJUUiEe5m0vld1M3W+dIEdjoeQWujPIVYO58+Cy7QOzclWOR0XPldHL\n        zu2ec5HjylRM4dVQVbgelkDndYOP8C0Dek5ahsm95G+4Pm7TjW7HJA0TsRcBjDnv\n        KDVoCXFTx+MVMI98fcJKNaOMVtmlUpk5QFO2TLV72HknzsGRcmd3+kTOHDkzb/PP\n        btl1/B0Iv/JqYYbJFpu0xRL8esTHuTd/tsc8kDV4ryClSvwgZAjbv/3/wlcvUbfe\n        yYk=\n        -----END ENCRYPTED PRIVATE KEY-----\n      `,\n   *   passphrase: 'zy',\n   *   type: 1,\n   *   long: true,\n   *   pad: 'rsaes-pkcs1-v1_5',\n   *   passphraseEncode: 'utf8',\n   *   inputEncode: 'hex',\n   *   outputEncode: 'utf8',\n   * });\n   *  => this is an example\n   */\n  decode: (options: RsaOptions): string => {\n    const {\n      src,\n      key,\n      passphrase = '',\n      type = 1, // 0: 公钥解密, 1: 私钥解密\n      long = false,\n      pad = 'rsaes-pkcs1-v1_5',\n      passphraseEncode = 'utf8',\n      inputEncode = 'base64',\n      outputEncode = 'utf8',\n    } = options;\n\n    if (!['base64', 'hex'].includes(inputEncode.toLowerCase())) return '';\n    if (!src || !key) return '';\n\n    let rsaKey: pki.rsa.PublicKey | pki.rsa.PrivateKey;\n    if (type === 0) {\n      if (!PUB_REGEX.test(key)) throw new Error('Key is not a valid public key');\n\n      rsaKey = pki.publicKeyFromPem(key);\n    } else if (type === 1) {\n      if (!PRI_REGEX.test(key)) throw new Error('Key is not a valid private key');\n\n      if (key.includes('ENCRYPTED')) {\n        if (!passphrase) throw new Error('Passphrase is required for encrypted private key');\n\n        const passphraseBuffer = wordArrayParse[passphraseEncode](passphrase);\n        rsaKey = pki.decryptRsaPrivateKey(\n          key,\n          forgeArrayToBytes(wordArrayToArray(passphraseBuffer) as unknown as ArrayBuffer).getBytes(),\n        );\n      } else {\n        rsaKey = pki.privateKeyFromPem(key);\n      }\n    }\n\n    const srcBuffer = wordArrayParse[inputEncode](src);\n\n    const padding = getPad(pad);\n    let schemeOptions = {};\n    if (padding === 'RSA-OAEP' && pad.toLowerCase() !== 'rsa-oaep') {\n      const algorithm = pad.toLowerCase().replace('rsa-oaep-', '') || 'sha1';\n      if (!['md5', 'sha1', 'sha256', 'sha384', 'sha512'].includes(algorithm)) {\n        throw new Error(`Unsupported RSA-OAEP algorithm: ${algorithm}`);\n      }\n\n      schemeOptions = {\n        md: (md[algorithm as keyof typeof md] as { create: () => any }).create(),\n        mgf1: {\n          md: (md[algorithm as keyof typeof md] as { create: () => any }).create(),\n        },\n      };\n    }\n\n    let decryptedBytes = '';\n\n    if (long) {\n      const bytes = forgeArrayToBytes(wordArrayToArray(srcBuffer) as unknown as ArrayBuffer).getBytes();\n\n      // 对于RSA解密，块大小固定为密钥长度\n      // 例如：2048位RSA密钥对应256字节的块大小\n      // @ts-expect-error use before\n      const keySize = rsaKey.n.bitLength() / 8; // 获取密钥长度（字节）\n      const MAX_DECRYPT_BLOCK = keySize || 256; // 如果无法获取密钥长度，默认使用256字节（适用于2048位密钥）\n\n      const byteLength = bytes.length;\n      let offSet = 0;\n\n      const decryptedChunks: string[] = [];\n\n      while (offSet < byteLength) {\n        let end = offSet + MAX_DECRYPT_BLOCK;\n        if (end > byteLength) {\n          end = byteLength;\n        }\n\n        const chunk = bytes.substring(offSet, end);\n\n        // @ts-expect-error use before\n        const decryptedChunk = (rsaKey as pki.rsa.PrivateKey).decrypt(chunk, padding, schemeOptions);\n        decryptedChunks.push(decryptedChunk);\n\n        offSet += MAX_DECRYPT_BLOCK;\n      }\n\n      decryptedBytes = decryptedChunks.join('');\n    } else {\n      // @ts-expect-error use before\n      decryptedBytes = (rsaKey as pki.rsa.PrivateKey).decrypt(\n        forgeArrayToBytes(wordArrayToArray(srcBuffer) as unknown as ArrayBuffer).getBytes(),\n        padding,\n        schemeOptions,\n      );\n    }\n\n    return forgeStringify[outputEncode as keyof typeof forgeStringify](decryptedBytes as never);\n  },\n};\n"
  },
  {
    "path": "packages/shared/modules/crypto/core/encrypt/sm.ts",
    "content": "import * as SmCrypto from 'sm-crypto-v2';\n\nimport type { Sm4Options } from '../../type';\nimport {\n  arrayToWordArray,\n  parse as wordParse,\n  stringify as wordStringify,\n  wordArrayToArray,\n} from '../../utils/wordArray';\n\ntype IGCMResult = SmCrypto.sm4.GCMResult<Uint8Array>;\n\nconst getMode = (mode: string) => {\n  switch (mode.toLowerCase()) {\n    case 'ecb':\n      return 'ecb';\n    case 'gcm':\n      return 'gcm';\n    case 'cbc':\n    default:\n      return 'cbc';\n  }\n};\n\nconst getPad = (pad: string) => {\n  switch (pad.toLowerCase()) {\n    case 'pkcs5padding':\n    case 'pkcs7padding':\n      return 'pkcs#7';\n    case 'nopadding':\n    default:\n      return 'none';\n  }\n};\n\n/**\n * SM4 加密/解密工具\n */\nexport const sm4 = {\n  /**\n   * SM4 加密方法\n   * 不支持中文-https://rivers.chaitin.cn/toolkit/cyberChef/SM4Encrypt\n   * https://www.toolhelper.cn/SymmetricEncryption/SM4\n   * 没找到 sm4-gcm 在线工具\n   *\n   * @param {Sm4Options} options - 加密参数\n   * @returns {string} - 加密结果\n   *\n   * @example\n   * sm4.encode({\n   *   src: 'this is an example',\n   *   key: 'h9g86bgiuygbi76bigbi76',\n   *   iv: 'h9g86bgiuygbi76bigbi76',\n   *   mode: 'cbc',\n   *   pad: 'pkcs7padding',\n   *   inputEncode: 'utf8',\n   *   keyEncode: 'base64',\n   *   ivEncode: 'base64',\n   *   outputEncode: 'hex',\n   * });\n   *  => 11586f53f74451daa0bb8286d46dcfda7629e31e3f2ff0a587d0e92eccef54b9\n   *  => EVhvU/dEUdqgu4KG1G3P2nYp4x4/L/Clh9DpLszvVLk=\n   */\n  encode: (options: Sm4Options): string => {\n    const {\n      src,\n      key,\n      iv,\n      mode = 'cbc',\n      pad = 'pkcs7padding',\n      aad,\n      inputEncode = 'utf-8',\n      keyEncode = 'utf-8',\n      ivEncode = 'utf-8',\n      aadEncode = 'utf8',\n      tagEncode = 'utf8',\n      outputEncode = 'base64',\n    } = options;\n\n    if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n    if (src === '') return '';\n    if (key === '') {\n      throw new Error('Key is required for SM4 encryption');\n    }\n    if (!['ecb'].includes(mode.toLowerCase()) && iv === '') {\n      throw new Error('IV is required in CBC/CFB/OFB/CTR mode');\n    }\n\n    const keyBuffer = wordParse[keyEncode as keyof typeof wordParse](key);\n    const ivBuffer = mode.toLowerCase() !== 'ecb' ? wordParse[ivEncode as keyof typeof wordParse](iv!) : undefined;\n    const aadBuffer = mode.toLowerCase() === 'gcm' && aad ? wordParse[aadEncode](aad) : undefined;\n    const srcBuffer = wordParse[inputEncode as keyof typeof wordParse](src);\n\n    if (keyBuffer.sigBytes !== 16) throw new Error('Key must be 128 bytes');\n    if (mode !== 'ecb' && ivBuffer!.sigBytes !== 16) throw new Error('IV must be 128 bytes');\n    if (\n      srcBuffer.sigBytes % 16 !== 0 &&\n      pad.toLowerCase() === 'nopadding' &&\n      ['cbc', 'ecb'].includes(mode.toLowerCase())\n    ) {\n      throw new Error('Message must be multipler of 128 bits');\n    }\n\n    const encrypted = SmCrypto.sm4.encrypt(wordArrayToArray(srcBuffer), wordArrayToArray(keyBuffer), {\n      mode: getMode(mode),\n      padding: mode.toLowerCase() !== 'gcm' ? getPad(pad) : 'none',\n      output: 'array',\n      ...(ivBuffer !== undefined ? { iv: wordArrayToArray(ivBuffer) } : {}),\n      ...(mode.toLowerCase() === 'gcm' && aadBuffer ? { associatedData: wordArrayToArray(aadBuffer) } : {}),\n      ...(mode.toLowerCase() === 'gcm' ? { outputTag: true } : {}),\n    } as any);\n\n    if (mode.toLowerCase() === 'gcm') {\n      const gcmResult = encrypted as IGCMResult;\n      const output = wordStringify[outputEncode](arrayToWordArray(gcmResult.output));\n      const tag = wordStringify[tagEncode](arrayToWordArray(gcmResult.tag!));\n      return `${output}\\nTag:${tag}`;\n    }\n\n    return wordStringify[outputEncode](arrayToWordArray(encrypted as unknown as Uint8Array));\n  },\n  /**\n   * SM4 解密方法\n   * 不支持中文-https://rivers.chaitin.cn/toolkit/cyberChef/SM4Decrypt\n   * https://www.toolhelper.cn/SymmetricEncryption/SM4\n   * 没找到 sm4-gcm 在线工具\n   *\n   * @param {Sm4Options} options - 解密参数\n   * @returns {string} - 解密结果\n   *\n   * @example\n   * sm4.decode({\n   *   src: '11586f53f74451daa0bb8286d46dcfda7629e31e3f2ff0a587d0e92eccef54b9',\n   *   key: 'h9g86bgiuygbi76bigbi76',\n   *   iv: 'h9g86bgiuygbi76bigbi76',\n   *   mode: 'cbc',\n   *   pad: 'pkcs7padding',\n   *   inputEncode: 'hex',\n   *   keyEncode: 'base64',\n   *   ivEncode: 'base64',\n   *   outputEncode: 'utf8',\n   * });\n   * => this is an example\n   */\n  decode: (options: Sm4Options): string => {\n    const {\n      src,\n      key,\n      iv,\n      mode = 'cbc',\n      pad = 'pkcs7padding',\n      aad,\n      tag,\n      inputEncode = 'utf-8',\n      keyEncode = 'utf-8',\n      ivEncode = 'utf-8',\n      aadEncode = 'utf8',\n      tagEncode = 'utf8',\n      outputEncode = 'base64',\n    } = options;\n\n    if (!['base64', 'hex'].includes(inputEncode.toLowerCase())) return '';\n    if (src === '') return '';\n    if (key === '') {\n      throw new Error('Key is required for SM4 encryption');\n    }\n    if (!['ecb'].includes(mode.toLowerCase()) && iv === '') {\n      throw new Error('IV is required in CBC/CFB/OFB/CTR mode');\n    }\n\n    const keyBuffer = wordParse[keyEncode as keyof typeof wordParse](key);\n    const ivBuffer = mode.toLowerCase() !== 'ecb' ? wordParse[ivEncode as keyof typeof wordParse](iv!) : undefined;\n    const aadBuffer = mode.toLowerCase() === 'gcm' && aad ? wordParse[aadEncode](aad) : undefined;\n    const tagBuffer = mode.toLowerCase() === 'gcm' && tag ? wordParse[tagEncode](tag) : undefined;\n    const srcBuffer = wordParse[inputEncode as keyof typeof wordParse](src);\n\n    if (keyBuffer.sigBytes !== 16) throw new Error('Key must be 128 bytes');\n    if (mode !== 'ecb' && ivBuffer!.sigBytes !== 16) throw new Error('IV must be 128 bytes');\n\n    const decrypted = SmCrypto.sm4.decrypt(wordArrayToArray(srcBuffer), wordArrayToArray(keyBuffer), {\n      mode: getMode(mode),\n      padding: mode.toLowerCase() !== 'gcm' ? getPad(pad) : 'none',\n      output: 'array',\n      ...(ivBuffer !== undefined ? { iv: wordArrayToArray(ivBuffer) } : {}),\n      ...(mode.toLowerCase() === 'gcm' && aadBuffer ? { associatedData: wordArrayToArray(aadBuffer) } : {}),\n      ...(mode.toLowerCase() === 'gcm' && tagBuffer ? { tag: wordArrayToArray(tagBuffer) } : {}),\n    } as any);\n\n    return wordStringify[outputEncode](arrayToWordArray(decrypted as unknown as Uint8Array));\n  },\n};\n"
  },
  {
    "path": "packages/shared/modules/crypto/core/mac.ts",
    "content": "import CryptoJS from 'crypto-js';\nimport { hmac as forgeHmac, md as forgeMd } from 'node-forge';\nimport * as SmCrypto from 'sm-crypto-v2';\n\nimport type { HashOptions, HmacOptions } from '../type';\nimport { arrayToBytes as forgeArrayToBytes, stringify as forgeStringify } from '../utils/forge';\nimport { parse as wordParse, stringify as wordStringify, wordArrayToArray } from '../utils/wordArray';\n\n/**\n * 通用哈希处理函数\n * @param options 哈希选项\n * @param hashFn 哈希函数\n * @returns 哈希结果\n */\nconst processHash = (options: HashOptions, hashFn: (srcBuffer: any) => any): string => {\n  const { src, inputEncode = 'utf8', outputEncode = 'hex' } = options;\n  if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n  const srcBuffer = wordParse[inputEncode](src);\n  const cipherBuffer = hashFn(srcBuffer);\n  return wordStringify[outputEncode](cipherBuffer);\n};\n\n/**\n * 通用HMAC处理函数\n * @param options HMAC选项\n * @param hmacFn HMAC函数\n * @returns HMAC结果\n */\nconst processHmac = (options: HmacOptions, hmacFn: (srcBuffer: any, keyBuffer: any) => any): string => {\n  const { src, key = '', inputEncode = 'utf8', outputEncode = 'hex', keyEncode = 'utf8' } = options;\n  if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n  const srcBuffer = wordParse[inputEncode](src);\n  const keyBuffer = wordParse[keyEncode](key);\n  const cipherBuffer = hmacFn(srcBuffer, keyBuffer);\n  return wordStringify[outputEncode](cipherBuffer);\n};\n\n/**\n * 哈希算法集合\n * 在线工具参考:\n * - 全功能: https://1024tools.com/hash\n * - 普通: https://btool.cn/hash-text\n * - SM3: https://tool.hiofd.com/sm3-online/\n */\nexport const hash = {\n  /**\n   * MD5-16位 哈希算法\n   * @param options 哈希选项\n   * @returns 16位MD5哈希值\n   * @example hash['md5-16']({ src: 'this is an example' }) => 'abaaf34bb106a104'\n   */\n  'md5-16': (options: HashOptions): string => {\n    return processHash(options, (srcBuffer) => {\n      const cipherHex = CryptoJS.MD5(srcBuffer).toString().slice(8, 24);\n      return wordParse.hex(cipherHex);\n    });\n  },\n\n  /**\n   * MD5-32位 哈希算法\n   * @param options 哈希选项\n   * @returns 32位MD5哈希值\n   * @example hash['md5-32']({ src: 'this is an example' }) => '9202816dabaaf34bb106a10421b9a0d0'\n   */\n  'md5-32': (options: HashOptions): string => {\n    return processHash(options, (srcBuffer) => CryptoJS.MD5(srcBuffer));\n  },\n\n  /**\n   * SHA1 哈希算法\n   * @param options 哈希选项\n   * @returns SHA1哈希值\n   * @example hash.sha1({ src: 'this is an example' }) => '87b4af8c0dda53bb757c0badf9d506e260bc04ba'\n   */\n  sha1: (options: HashOptions): string => {\n    return processHash(options, (srcBuffer) => CryptoJS.SHA1(srcBuffer));\n  },\n\n  /**\n   * SHA224 哈希算法\n   * @param options 哈希选项\n   * @returns SHA224哈希值\n   * @example hash.sha224({ src: 'this is an example' }) => 'e48c98e09bd59adea0f335815e43fd1eb308688495d9247980e01ae6'\n   */\n  sha224: (options: HashOptions): string => {\n    return processHash(options, (srcBuffer) => CryptoJS.SHA224(srcBuffer));\n  },\n\n  /**\n   * SHA256 哈希算法\n   * @param options 哈希选项\n   * @returns SHA256哈希值\n   * @example hash.sha256({ src: 'this is an example' }) => 'd44c035835f1c5e0668b7d186a2ff5b0dc2e3137ec3c50b12a34c47b7af51e44'\n   */\n  sha256: (options: HashOptions): string => {\n    return processHash(options, (srcBuffer) => CryptoJS.SHA256(srcBuffer));\n  },\n\n  /**\n   * SHA3 哈希算法\n   * @param options 哈希选项\n   * @returns SHA3哈希值\n   * @example hash.sha3({ src: 'this is an example' }) => 'fd68f056afd39a54158979cd5dd68e64d49f001556f45979877b09968b897d7cebd49f2ee022675d221ed56f8ca8e82b1236fe2c441fc23a1aa34639e7f1faa0'\n   */\n  sha3: (options: HashOptions): string => {\n    return processHash(options, (srcBuffer) => CryptoJS.SHA3(srcBuffer));\n  },\n\n  /**\n   * SHA384 哈希算法\n   * @param options 哈希选项\n   * @returns SHA384哈希值\n   * @example hash.sha384({ src: 'this is an example' }) => 'e4f8571338b2ceda5859ed5c8663b8a3fcea2a40c42e932d7dd03bddf6744832d7c3d6263ef82b4e4b6408fe3ef29544'\n   */\n  sha384: (options: HashOptions): string => {\n    return processHash(options, (srcBuffer) => CryptoJS.SHA384(srcBuffer));\n  },\n\n  /**\n   * SHA512 哈希算法\n   * @param options 哈希选项\n   * @returns SHA512哈希值\n   * @example hash.sha512({ src: 'this is an example' }) => '3fb303c89207ddbfbf71fb4299fe6374d7adb298d56f43e5d2e1760b2dd1b00b27f16d3e39ebde4ca23109e9dd158b84e1a03bbba0c1b4a7fb586e3e0e6e6918'\n   */\n  sha512: (options: HashOptions): string => {\n    return processHash(options, (srcBuffer) => CryptoJS.SHA512(srcBuffer));\n  },\n  /**\n   * SHA512-224 哈希算法\n   * @param options 哈希选项\n   * @returns SHA512-224哈希值\n   * @example hash['sha512-224']({ src: 'this is an example' }) => 'd4d5c27c47ca844bfd91bf41668e7fd7ae3049dcb3654ab6ec4f6197'\n   */\n  'sha512-224': (options: HashOptions): string => {\n    const { src, inputEncode = 'utf8', outputEncode = 'hex' } = options;\n    if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n    const srcBuffer = wordParse[inputEncode](src);\n    const cipherBuffer = forgeMd['sha512/224']\n      .create()\n      .update(forgeArrayToBytes(wordArrayToArray(srcBuffer) as unknown as ArrayBuffer).getBytes())\n      .digest();\n    return forgeStringify[outputEncode as keyof typeof forgeStringify](cipherBuffer.getBytes() as never);\n  },\n\n  /**\n   * SHA512-256 哈希算法\n   * @param options 哈希选项\n   * @returns SHA512-256哈希值\n   * @example hash['sha512-256']({ src: 'this is an example' }) => '8ab46fda39de9dfafef41b16268edd30751de364df432795c06730aae5f6a3e6'\n   */\n  'sha512-256': (options: HashOptions): string => {\n    const { src, inputEncode = 'utf8', outputEncode = 'hex' } = options;\n    if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n    const srcBuffer = wordParse[inputEncode](src);\n    const cipherBuffer = forgeMd['sha512/256']\n      .create()\n      .update(forgeArrayToBytes(wordArrayToArray(srcBuffer) as unknown as ArrayBuffer).getBytes())\n      .digest();\n    return forgeStringify[outputEncode as keyof typeof forgeStringify](cipherBuffer.getBytes() as never);\n  },\n\n  /**\n   * RIPEMD160 哈希算法\n   * @param options 哈希选项\n   * @returns RIPEMD160哈希值\n   * @example hash.ripemd160({ src: 'this is an example' }) => '9d9334f6733a18415045e946e6ab85d3174e0a4e'\n   */\n  ripemd160: (options: HashOptions): string => {\n    return processHash(options, (srcBuffer) => CryptoJS.RIPEMD160(srcBuffer));\n  },\n\n  /**\n   * SM3 哈希算法（国密算法）\n   * @param options 哈希选项\n   * @returns SM3哈希值\n   * @example hash.sm3({ src: 'this is an example' }) => 'e66750ddcee668315bdbdf47fcced115c3d62f6153d4724ab800660900a06093'\n   */\n  sm3: (options: HashOptions): string => {\n    const { src, inputEncode = 'utf8', outputEncode = 'hex' } = options;\n    if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n    const srcBuffer = wordParse[inputEncode](src);\n    const cipherHex = SmCrypto.sm3(wordArrayToArray(srcBuffer));\n    const cipherBuffer = wordParse.hex(cipherHex);\n    return wordStringify[outputEncode](cipherBuffer);\n  },\n};\n\n/**\n * HMAC算法集合\n * 在线工具参考:\n * - 全功能: https://1024tools.com/hmac\n * - 普通+SM3: https://btool.cn/hmac-generator\n */\nexport const hmac = {\n  /**\n   * HMAC-MD5-16位算法\n   * @param options HMAC选项\n   * @returns 16位HMAC-MD5值\n   * @example hmac['md5-16']({ src: 'this is an example', key: 'zy' }) => 'ec8e0c400f4a2207'\n   */\n  'md5-16': (options: HmacOptions): string => {\n    return processHmac(options, (srcBuffer, keyBuffer) => {\n      const cipherHex = CryptoJS.HmacMD5(srcBuffer, keyBuffer).toString().slice(8, 24);\n      return wordParse.hex(cipherHex);\n    });\n  },\n\n  /**\n   * HMAC-MD5-32位算法\n   * @param options HMAC选项\n   * @returns 32位HMAC-MD5值\n   * @example hmac['md5-32']({ src: 'this is an example', key: 'zy' }) => 'fe4c3df9ec8e0c400f4a2207124f36cc'\n   */\n  'md5-32': (options: HmacOptions): string => {\n    return processHmac(options, (srcBuffer, keyBuffer) => CryptoJS.HmacMD5(srcBuffer, keyBuffer));\n  },\n\n  /**\n   * HMAC-SHA1算法\n   * @param options HMAC选项\n   * @returns HMAC-SHA1值\n   * @example hmac.sha1({ src: 'this is an example', key: 'zy' }) => 'd68a1c8607443eced2b9ddd106019c9df371c550'\n   */\n  sha1: (options: HmacOptions): string => {\n    return processHmac(options, (srcBuffer, keyBuffer) => CryptoJS.HmacSHA1(srcBuffer, keyBuffer));\n  },\n\n  /**\n   * HMAC-SHA224算法\n   * @param options HMAC选项\n   * @returns HMAC-SHA224值\n   * @example hmac.sha224({ src: 'this is an example', key: 'zy' }) => '97285486cefddaf30d1cd3c82e8954a8711f726a3b0413f3d93c8028'\n   */\n  sha224: (options: HmacOptions): string => {\n    return processHmac(options, (srcBuffer, keyBuffer) => CryptoJS.HmacSHA224(srcBuffer, keyBuffer));\n  },\n\n  /**\n   * HMAC-SHA256算法\n   * @param options HMAC选项\n   * @returns HMAC-SHA256值\n   * @example hmac.sha256({ src: 'this is an example', key: 'zy' }) => '4ac4435d831ecf3f472969e0fd892c01890041dc80f087ec8baa67ea31d66731'\n   */\n  sha256: (options: HmacOptions): string => {\n    return processHmac(options, (srcBuffer, keyBuffer) => CryptoJS.HmacSHA256(srcBuffer, keyBuffer));\n  },\n\n  /**\n   * HMAC-SHA3算法\n   * @param options HMAC选项\n   * @returns HMAC-SHA3值\n   * @example hmac.sha3({ src: 'this is an example', key: 'zy' }) => '3c58d36a563637fd4d1c437c52b42cce007db422ef04485cc2bffe8c0e2fcd833408762ffbc140617aab73b9e4fc7b7139b1927dbb1b9d0f473f8f6295fbe6ef'\n   */\n  sha3: (options: HmacOptions): string => {\n    return processHmac(options, (srcBuffer, keyBuffer) => CryptoJS.HmacSHA3(srcBuffer, keyBuffer));\n  },\n\n  /**\n   * HMAC-SHA384算法\n   * @param options HMAC选项\n   * @returns HMAC-SHA384值\n   * @example hmac.sha384({ src: 'this is an example', key: 'zy' }) => '843b0c90c009370b4947cbb2fa0ed023a1fd0b68e00554927a31cd419ac2fdfb5c47d7a0c4768a06b895499c7b6925f4'\n   */\n  sha384: (options: HmacOptions): string => {\n    return processHmac(options, (srcBuffer, keyBuffer) => CryptoJS.HmacSHA384(srcBuffer, keyBuffer));\n  },\n\n  /**\n   * HMAC-SHA512算法\n   * @param options HMAC选项\n   * @returns HMAC-SHA512值\n   * @example hmac.sha512({ src: 'this is an example', key: 'zy' }) => 'd7d752e9477327133df026a74e4fe5df488906f5f7e7a12aa21075c09498f6b5dc00659dd08f35eafa7028aff818f4166dd979ee9b9690f495be4fe93ec3125a'\n   */\n  sha512: (options: HmacOptions): string => {\n    return processHmac(options, (srcBuffer, keyBuffer) => CryptoJS.HmacSHA512(srcBuffer, keyBuffer));\n  },\n  /**\n   * HMAC-SHA512/224算法\n   * @param options HMAC选项\n   * @returns HMAC-SHA512/224值\n   * @example hmac['sha512-224']({ src: 'this is an example', key: 'zy' }) => 'b2fe57483a595bd575ad5b69f4ec1f223566500c9f39b5c1d9c92f00'\n   */\n  'sha512-224': (options: HmacOptions): string => {\n    const { src, key = '', inputEncode = 'utf8', outputEncode = 'hex', keyEncode = 'utf8' } = options;\n    if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n    const srcBuffer = wordParse[inputEncode](src);\n    const keyBuffer = wordParse[keyEncode](key);\n    const hmac = forgeHmac.create();\n    hmac.start('sha512/224', forgeArrayToBytes(wordArrayToArray(keyBuffer) as unknown as ArrayBuffer).getBytes());\n    hmac.update(forgeArrayToBytes(wordArrayToArray(srcBuffer) as unknown as ArrayBuffer).getBytes());\n    const cipherBuffer = hmac.digest();\n    return forgeStringify[outputEncode as keyof typeof forgeStringify](cipherBuffer.getBytes() as never);\n  },\n\n  /**\n   * HMAC-SHA512/256算法\n   * @param options HMAC选项\n   * @returns HMAC-SHA512/256值\n   * @example hmac['sha512-256']({ src: 'this is an example', key: 'zy' }) => 'd6ae99f22346f65342fab4cf9e40adf8aa88cec4bc32f30a023a14e1c5dbc919'\n   */\n  'sha512-256': (options: HmacOptions): string => {\n    const { src, key = '', inputEncode = 'utf8', outputEncode = 'hex', keyEncode = 'utf8' } = options;\n    if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n    const srcBuffer = wordParse[inputEncode](src);\n    const keyBuffer = wordParse[keyEncode](key);\n    const hmac = forgeHmac.create();\n    hmac.start('sha512/256', forgeArrayToBytes(wordArrayToArray(keyBuffer) as unknown as ArrayBuffer).getBytes());\n    hmac.update(forgeArrayToBytes(wordArrayToArray(srcBuffer) as unknown as ArrayBuffer).getBytes());\n    const cipherBuffer = hmac.digest();\n    return forgeStringify[outputEncode as keyof typeof forgeStringify](cipherBuffer.getBytes() as never);\n  },\n\n  /**\n   * HMAC-RIPEMD160算法\n   * @param options HMAC选项\n   * @returns HMAC-RIPEMD160值\n   * @example hmac.ripemd160({ src: 'this is an example', key: 'zy' }) => 'fe022aff0043dca6497a18d21779f396296db1dd'\n   */\n  ripemd160: (options: HmacOptions): string => {\n    return processHmac(options, (srcBuffer, keyBuffer) => CryptoJS.HmacRIPEMD160(srcBuffer, keyBuffer));\n  },\n\n  /**\n   * HMAC-SM3算法\n   * @param options HMAC选项\n   * @returns HMAC-SM3值\n   * @example hmac.sm3({ src: 'this is an example', key: 'zy' }) => '063f083039a56c7440de518c62b6d9cfb8e0275440c7d55dcdbd9034af127f46'\n   */\n  sm3: (options: HmacOptions): string => {\n    const { src, key = '', inputEncode = 'utf8', outputEncode = 'hex', keyEncode = 'utf8' } = options;\n    if (!['base64', 'hex'].includes(outputEncode.toLowerCase())) return '';\n    const srcBuffer = wordParse[inputEncode](src);\n    const keyBuffer = wordParse[keyEncode](key);\n    const cipherHex = SmCrypto.sm3(wordArrayToArray(srcBuffer), {\n      mode: 'hmac',\n      key: wordArrayToArray(keyBuffer),\n    });\n    const cipherBuffer = wordParse.hex(cipherHex);\n    return wordStringify[outputEncode](cipherBuffer);\n  },\n};\n"
  },
  {
    "path": "packages/shared/modules/crypto/index.ts",
    "content": "import * as base from './core/base';\nimport * as encode from './core/encode';\nimport * as encrypt from './core/encrypt';\nimport * as mac from './core/mac';\n\nexport { base, encode, encrypt, mac };\n\nexport * from './core/base';\nexport * from './core/encode';\nexport * from './core/encrypt';\nexport * from './core/mac';\n"
  },
  {
    "path": "packages/shared/modules/crypto/modules/atob-btoa.ts",
    "content": "/* eslint-disable antfu/consistent-list-newline */\n// Base64 Encoded Character Mapping Table\nconst BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n// Base64 Decode Character Mapping Table (precomputed lookup table)\nconst BASE64_DECODE_MAP = new Int8Array([\n  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,\n  -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n  25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n  48, 49, 50, 51, -1, -1, -1, -1, -1,\n]);\n\n// ASCII code of the equal sign character\nconst EQUALS_CHAR_CODE = 61; // '='\n\n/**\n * Convert strings to Base64 encoding\n * @param input - the input string to encode\n * @returns Base64 encoded string\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa\n */\nexport const btoa = (input: string): string => {\n  const len = input.length;\n  let output = '';\n  let i = 0;\n\n  while (i < len) {\n    const c1 = input.charCodeAt(i++) & 0xff;\n    if (i === len) {\n      output += BASE64_CHARS.charAt(c1 >> 2);\n      output += BASE64_CHARS.charAt((c1 & 0x3) << 4);\n      output += '==';\n      break;\n    }\n\n    const c2 = input.charCodeAt(i++);\n    if (i === len) {\n      output += BASE64_CHARS.charAt(c1 >> 2);\n      output += BASE64_CHARS.charAt(((c1 & 0x3) << 4) | ((c2 & 0xf0) >> 4));\n      output += BASE64_CHARS.charAt((c2 & 0xf) << 2);\n      output += '=';\n      break;\n    }\n\n    const c3 = input.charCodeAt(i++);\n    output += BASE64_CHARS.charAt(c1 >> 2);\n    output += BASE64_CHARS.charAt(((c1 & 0x3) << 4) | ((c2 & 0xf0) >> 4));\n    output += BASE64_CHARS.charAt(((c2 & 0xf) << 2) | ((c3 & 0xc0) >> 6));\n    output += BASE64_CHARS.charAt(c3 & 0x3f);\n  }\n\n  return output;\n};\n\n/**\n * Converts Base64 encoded to strings\n * @param input - the input string to decode\n * @returns UTF-8 encoded string\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/atob\n */\nexport const atob = (input: string): string => {\n  const len = input.length;\n  let output = '';\n  let i = 0;\n\n  while (i < len) {\n    let c1: number;\n    do {\n      c1 = BASE64_DECODE_MAP[input.charCodeAt(i++) & 0xff];\n    } while (i < len && c1 === -1);\n\n    if (c1 === -1) break;\n\n    let c2: number;\n    do {\n      c2 = BASE64_DECODE_MAP[input.charCodeAt(i++) & 0xff];\n    } while (i < len && c2 === -1);\n\n    if (c2 === -1) break;\n    output += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));\n\n    let c3: number;\n    do {\n      c3 = input.charCodeAt(i++) & 0xff;\n      if (c3 === EQUALS_CHAR_CODE) return output;\n      c3 = BASE64_DECODE_MAP[c3];\n    } while (i < len && c3 === -1);\n    if (c3 === -1) break;\n    output += String.fromCharCode(((c2 & 0xf) << 4) | ((c3 & 0x3c) >> 2));\n\n    let c4: number;\n    do {\n      c4 = input.charCodeAt(i++) & 0xff;\n      if (c4 === EQUALS_CHAR_CODE) return output;\n      c4 = BASE64_DECODE_MAP[c4];\n    } while (i < len && c4 === -1);\n    if (c4 === -1) break;\n    output += String.fromCharCode(((c3 & 0x03) << 6) | c4);\n  }\n\n  return output;\n};\n\nexport default { atob, btoa };\n"
  },
  {
    "path": "packages/shared/modules/crypto/type.ts",
    "content": "import type * as CryptoJS from 'crypto-js';\n\nexport type Pad = 'pkcs5padding' | 'pkcs7padding' | 'ansix923' | 'iso10126' | 'iso97971' | 'nopadding' | 'zeropadding';\nexport type RsaPad = 'rsaes-pkcs1-v1_5' | 'rsaes-oaep-sha1';\nexport type Sm4Pad = 'pkcs5padding' | 'pkcs7padding' | 'nopadding';\n\nexport type Mode = 'cfb' | 'ofb' | 'ctr' | 'ecb' | 'cbc';\nexport type Sm4Mode = 'ecb' | 'cbc' | 'gcm';\nexport type AesMode = Mode | 'gcm';\n\nexport type Encode = 'utf8' | 'utf16' | 'utf16be' | 'utf16le' | 'hex' | 'base64' | 'latin1';\n\nexport type ParseFunction = (str: string) => CryptoJS.lib.WordArray;\nexport type StringifyFunction = (wordArray: CryptoJS.lib.WordArray) => string;\n\nexport interface HashOptions {\n  src: string;\n  inputEncode?: Encode;\n  outputEncode?: Encode;\n}\n\nexport interface HmacOptions extends HashOptions {\n  key?: string;\n  keyEncode?: Encode;\n}\n\nexport interface Rc4Options {\n  src: string;\n  key: string;\n  inputEncode?: Encode;\n  keyEncode?: Encode;\n  outputEncode?: Encode;\n}\n\nexport interface Rc4DropOptions {\n  src: string;\n  key: string;\n  drop?: number;\n  inputEncode?: Encode;\n  keyEncode?: Encode;\n  outputEncode?: Encode;\n}\n\nexport interface AesOptions {\n  src: string;\n  key: string;\n  iv?: string;\n  mode?: Mode;\n  pad?: Pad;\n  aad?: string;\n  tag?: string;\n  inputEncode?: Encode;\n  keyEncode?: Encode;\n  ivEncode?: Encode;\n  tagEncode?: Encode;\n  aadEncode?: Encode;\n  outputEncode?: Encode;\n}\n\nexport interface AesOptionsNew {\n  src: string;\n  key: string;\n  iv?: string;\n  mode?: AesMode;\n  pad?: Pad;\n  aad?: string;\n  tag?: string;\n  inputEncode?: Encode;\n  keyEncode?: Encode;\n  ivEncode?: Encode;\n  tagEncode?: Encode;\n  aadEncode?: Encode;\n  outputEncode?: Encode;\n}\n\nexport interface DesOptions {\n  src: string;\n  key: string;\n  iv?: string;\n  mode?: Mode;\n  pad?: Pad;\n  inputEncode?: Encode;\n  keyEncode?: Encode;\n  ivEncode?: Encode;\n  outputEncode?: Encode;\n}\n\nexport interface TripleDesOptions {\n  src: string;\n  key: string;\n  iv?: string;\n  mode?: Mode;\n  pad?: Pad;\n  inputEncode?: Encode;\n  keyEncode?: Encode;\n  ivEncode?: Encode;\n  outputEncode?: Encode;\n}\n\nexport interface RabbitOptions {\n  src: string;\n  key: string;\n  iv?: string;\n  inputEncode?: Encode;\n  keyEncode?: Encode;\n  ivEncode?: Encode;\n  outputEncode?: Encode;\n}\n\nexport interface RabbitLegacyOptions {\n  src: string;\n  key: string;\n  iv?: string;\n  inputEncode?: Encode;\n  keyEncode?: Encode;\n  ivEncode?: Encode;\n  outputEncode?: Encode;\n}\n\nexport interface Sm4Options {\n  src: string;\n  key: string;\n  iv?: string;\n  mode?: Sm4Mode;\n  pad?: Sm4Pad;\n  aad?: string;\n  tag?: string;\n  inputEncode?: Encode;\n  keyEncode?: Encode;\n  ivEncode?: Encode;\n  tagEncode?: Encode;\n  aadEncode?: Encode;\n  outputEncode?: Encode;\n}\n\nexport interface RsaOptions {\n  src: string;\n  key: string;\n  pad?: RsaPad;\n  type?: 0 | 1; // 0: 公钥加密, 私钥解密; 1: 私钥加密, 公钥解密\n  long?: boolean;\n  passphrase?: string;\n  passphraseEncode?: Encode;\n  inputEncode?: Encode;\n  outputEncode?: Encode;\n}\n\nexport interface Base64EncodeOptions {\n  src: string;\n  inputEncode?: Encode;\n  ignore?: boolean; // 是否忽略 Latin-1 编码检查\n}\n\nexport interface Base64DecodeOptions {\n  src: string;\n  outputEncode?: Encode;\n}\n\nexport type UniCodePrefix = '\\\\u' | '%u' | 'U+';\n\nexport interface UnicodeEncodeOptions {\n  src: string;\n  prefix?: UniCodePrefix;\n  pad?: number;\n  encodeEverything?: boolean;\n  inputEncode?: Encode;\n}\n\nexport interface UnicodeDecodeOptions {\n  src: string;\n  outputEncode?: Encode;\n  prefix?: UniCodePrefix;\n}\n\nexport type HtmlEntities = 'hex' | 'named' | 'numeric';\n\nexport interface HtmlEncodeOptions {\n  src: string;\n  encodeEverything?: boolean;\n  entities?: HtmlEntities;\n  inputEncode?: Encode;\n}\n\nexport interface HtmlDecodeOptions {\n  src: string;\n  outputEncode?: Encode;\n}\n\nexport interface GzipEncodeOptions {\n  src: string;\n  inputEncode?: Encode;\n  outputEncode?: Encode;\n}\n\nexport interface GzipDecodeOptions {\n  src: string;\n  inputEncode?: Encode;\n  outputEncode?: Encode;\n}\n\nexport type UrlType = 'component' | 'uri';\n\nexport interface UrlEncodeOptions {\n  src: string;\n  type?: UrlType;\n  inputEncode?: Encode;\n}\n\nexport interface UrlDecodeOptions {\n  src: string;\n  type?: UrlType;\n  outputEncode?: Encode;\n}\n\nexport type HexDelimiter =\n  | 'space'\n  | 'percent'\n  | 'comma'\n  | 'semiColon'\n  | 'colon'\n  | 'lineFeed'\n  | 'crlf'\n  | '0x'\n  | '0xComma'\n  | '\\\\x'\n  | 'none';\n\nexport interface HexEncodeOptions {\n  src: string;\n  delimiter?: HexDelimiter;\n  inputEncode?: Encode;\n}\n\nexport interface HexDecodeOptions {\n  src: string;\n  delimiter?: HexDelimiter;\n  outputEncode?: Encode;\n}\n"
  },
  {
    "path": "packages/shared/modules/crypto/utils/base.ts",
    "content": "/**\n * Converts a UTF-8 string to a Uint8Array.\n * @param {string} str - The UTF-8 string to convert.\n * @returns {Uint8Array} The Uint8Array representation of the UTF-8 string.\n */\nexport const utf8ToArray = (str: string): Uint8Array => new TextEncoder().encode(str);\n\n/**\n * Converts a Uint8Array to a UTF-8 string.\n * @param {Uint8Array} arr - The Uint8Array to convert.\n * @returns {string} The UTF-8 string representation of the Uint8Array.\n */\nexport const arrayToUtf8 = (arr: Uint8Array): string => new TextDecoder().decode(arr);\n\n/**\n * Converts a Latin-1 string to a Uint8Array.\n * @param str - The Latin-1 encoded string.\n * @returns Uint8Array\n */\nexport const latin1ToArray = (str: string): Uint8Array => {\n  const len = str.length;\n  const bytes = new Uint8Array(len);\n  for (let i = 0; i < len; i++) {\n    bytes[i] = str.charCodeAt(i) & 0xff; // mask to 1 byte\n  }\n  return bytes;\n};\n\n/**\n * Converts a Uint8Array to a Latin-1 string.\n * @param arr - The Uint8Array to convert.\n * @returns Latin-1 encoded string\n */\nexport const arrayToLatin1 = (arr: Uint8Array): string => {\n  let str = '';\n  for (let i = 0; i < arr.length; i++) {\n    str += String.fromCharCode(arr[i]!);\n  }\n  return str;\n};\n\n/**\n * Converts a Uint8Array to a base64 string.\n * @param {Uint8Array} arr - The Uint8Array to convert.\n * @returns {string} The base64 string representation of the Uint8Array.\n */\nexport const arrayToBase64 = (arr: Uint8Array): string => {\n  let binary = '';\n  arr.forEach((byte) => (binary += String.fromCharCode(byte)));\n  return btoa(binary);\n};\n\n/**\n * Converts a base64 string to a Uint8Array.\n * @param {string} b64 - The base64 string to convert.\n * @returns {Uint8Array} The Uint8Array representation of the base64 string.\n */\nexport const base64ToArray = (b64: string): Uint8Array => {\n  const binary = atob(b64);\n  const len = binary.length;\n  const bytes = new Uint8Array(len);\n  for (let i = 0; i < len; i++) bytes[i] = binary.charCodeAt(i);\n  return bytes;\n};\n\n/**\n * Converts a hex string to a Uint8Array.\n * @param {string} hex - The hex string to convert.\n * @returns {Uint8Array} The Uint8Array representation of the hex string.\n */\nexport const hexToArray = (hex: string): Uint8Array => {\n  const length = hex.length;\n  const arr = new Uint8Array(length / 2);\n  for (let i = 0; i < length; i += 2) {\n    arr[i / 2] = Number.parseInt(hex.slice(i, i + 2), 16);\n  }\n  return arr;\n};\n\n/**\n * Converts a Uint8Array to a hex string.\n * @param {Uint8Array} arr - The Uint8Array to convert.\n * @returns {string} The hex string representation of the Uint8Array.\n */\nexport const arrayToHex = (arr: Uint8Array): string => Array.from(arr, (b) => b.toString(16).padStart(2, '0')).join('');\n\n/**\n * Checks if a string is Latin-1 encoded.\n * @param {string} input - The string to check.\n * @returns {boolean} True if the string is Latin-1 encoded, false otherwise.\n */\nexport const isLatin1String = (input: string): boolean => {\n  for (let i = 0; i < input.length; i++) {\n    if (input.charCodeAt(i) > 255) {\n      return false;\n    }\n  }\n  return true;\n};\n\n/**\n * Checks if the current environment is a browser.\n * @returns {boolean} True if the environment is a browser, false otherwise.\n */\nexport const isBrowser = (): boolean => {\n  return typeof window !== 'undefined' && typeof document !== 'undefined';\n};\n\n/**\n * Checks if the current environment is Node.js.\n * @returns {boolean} True if the environment is Node.js, false otherwise.\n */\nexport const isNode = (): boolean => {\n  return typeof process !== 'undefined' && process.versions != null && process.versions.node != null;\n};\n\nexport default {\n  isLatin1String,\n  arrayToBase64,\n  arrayToHex,\n  arrayToLatin1,\n  arrayToUtf8,\n  base64ToArray,\n  hexToArray,\n  latin1ToArray,\n  utf8ToArray,\n  isBrowser,\n  isNode,\n};\n"
  },
  {
    "path": "packages/shared/modules/crypto/utils/forge.ts",
    "content": "import { util } from 'node-forge';\n\nconst bytesTobase64 = (bytes: string): string => {\n  return util.encode64(bytes);\n};\n\nconst bytesToHex = (bytes: string): string => {\n  return util.bytesToHex(bytes);\n};\n\nconst bytesToUtf8 = (bytes: string): string => {\n  return util.decodeUtf8(bytes);\n};\n\nconst bytesToUtf16 = (bytes: Uint8Array<ArrayBufferLike>): string => {\n  return util.text.utf16.decode(bytes);\n};\n\nconst hexToBytes = (str: string): string => {\n  return util.hexToBytes(str);\n};\n\nconst base64ToBytes = (str: string): string => {\n  return util.decode64(str);\n};\n\nconst utf8ToBytes = (str: string): string => {\n  return util.encodeUtf8(str);\n};\n\nconst utf16ToBytes = (str: string): Uint8Array => {\n  return util.text.utf16.encode(str);\n};\n\nexport const parse = {\n  utf8: utf8ToBytes,\n  utf16: utf16ToBytes,\n  hex: hexToBytes,\n  base64: base64ToBytes,\n};\n\nexport const stringify = {\n  utf8: bytesToUtf8,\n  utf16: bytesToUtf16,\n  hex: bytesToHex,\n  base64: bytesTobase64,\n};\n\nexport const cloneBytes = (buffer: util.ByteBuffer): util.ByteBuffer => {\n  const clonedBuffer = util.createBuffer();\n  const data = buffer.getBytes();\n  clonedBuffer.putBytes(data);\n\n  return clonedBuffer;\n};\n\nexport const arrayToBytes = (\n  array: string | ArrayBuffer | util.ArrayBufferView | util.ByteStringBuffer,\n): util.ByteBuffer => {\n  return util.createBuffer(array);\n};\n\nexport const bytesToArray = (buffer: util.ByteBuffer): Uint8Array => {\n  const clonedData = cloneBytes(buffer);\n  const bytesStr = clonedData.getBytes();\n  const uint8Array = new Uint8Array(bytesStr.length);\n  for (let i = 0; i < bytesStr.length; i++) {\n    uint8Array[i] = bytesStr.charCodeAt(i);\n  }\n  return uint8Array;\n};\n\nexport default { parse, stringify, arrayToBytes, bytesToArray };\n"
  },
  {
    "path": "packages/shared/modules/crypto/utils/wordArray.ts",
    "content": "import CryptoJS from 'crypto-js';\n\nimport type { Encode, ParseFunction, StringifyFunction } from '../type';\n\nconst wordArrayToUtf8 = (wordArray: CryptoJS.lib.WordArray): string => {\n  return CryptoJS.enc.Utf8.stringify(wordArray);\n};\n\nconst wordArrayToUtf16 = (wordArray: CryptoJS.lib.WordArray): string => {\n  return CryptoJS.enc.Utf16.stringify(wordArray);\n};\n\nconst wordArrayToUtf16Be = (wordArray: CryptoJS.lib.WordArray): string => {\n  return CryptoJS.enc.Utf16BE.stringify(wordArray);\n};\n\nconst wordArrayToUtf16Le = (wordArray: CryptoJS.lib.WordArray): string => {\n  return CryptoJS.enc.Utf16LE.stringify(wordArray);\n};\n\nconst wordArrayToHex = (wordArray: CryptoJS.lib.WordArray): string => {\n  return CryptoJS.enc.Hex.stringify(wordArray);\n};\n\nconst wordArrayToBase64 = (wordArray: CryptoJS.lib.WordArray): string => {\n  return CryptoJS.enc.Base64.stringify(wordArray);\n};\n\nconst wordArrayToLatin1 = (wordArray: CryptoJS.lib.WordArray): string => {\n  return CryptoJS.enc.Latin1.stringify(wordArray);\n};\n\nexport const stringify: { [key in Encode]: StringifyFunction } = {\n  utf8: wordArrayToUtf8,\n  utf16: wordArrayToUtf16,\n  utf16be: wordArrayToUtf16Be,\n  utf16le: wordArrayToUtf16Le,\n  hex: wordArrayToHex,\n  base64: wordArrayToBase64,\n  latin1: wordArrayToLatin1,\n};\n\nconst utf8ToWordArray = (str: string): CryptoJS.lib.WordArray => {\n  return CryptoJS.enc.Utf8.parse(str);\n};\n\nconst utf16ToWordArray = (str: string): CryptoJS.lib.WordArray => {\n  return CryptoJS.enc.Utf16.parse(str);\n};\n\nconst utf16BeToWordArray = (str: string): CryptoJS.lib.WordArray => {\n  return CryptoJS.enc.Utf16BE.parse(str);\n};\n\nconst utf16LeToWordArray = (str: string): CryptoJS.lib.WordArray => {\n  return CryptoJS.enc.Utf16LE.parse(str);\n};\n\nconst hexToWordArray = (str: string): CryptoJS.lib.WordArray => {\n  return CryptoJS.enc.Hex.parse(str);\n};\n\nconst base64ToWordArray = (str: string): CryptoJS.lib.WordArray => {\n  return CryptoJS.enc.Base64.parse(str);\n};\n\nconst latin1ToWordArray = (str: string): CryptoJS.lib.WordArray => {\n  return CryptoJS.enc.Latin1.parse(str);\n};\n\nexport const parse: { [key in Encode]: ParseFunction } = {\n  utf8: utf8ToWordArray,\n  utf16: utf16ToWordArray,\n  utf16be: utf16BeToWordArray,\n  utf16le: utf16LeToWordArray,\n  hex: hexToWordArray,\n  base64: base64ToWordArray,\n  latin1: latin1ToWordArray,\n};\n\nexport const wordArrayToArray = (wordArray: CryptoJS.lib.WordArray): Uint8Array => {\n  const words = wordArray.words;\n  const sigBytes = wordArray.sigBytes;\n  const result = new Uint8Array(sigBytes);\n  for (let i = 0; i < sigBytes; i++) {\n    result[i] = (words[i >>> 2]! >>> (24 - (i % 4) * 8)) & 0xff;\n  }\n  return result;\n};\n\nexport const arrayToWordArray = (array: Uint8Array): CryptoJS.lib.WordArray => {\n  const words: number[] = [];\n  const len = array.length;\n  for (let i = 0; i < len; i++) {\n    words[i >>> 2]! |= (array[i]! & 0xff) << (24 - (i % 4) * 8);\n  }\n  return CryptoJS.lib.WordArray.create(words, len);\n};\n\nexport const cloneWordArray = (wordArray: CryptoJS.lib.WordArray): CryptoJS.lib.WordArray => {\n  const clonedWords = wordArray.words.slice();\n  const clonedSigBytes = wordArray.sigBytes;\n\n  return CryptoJS.lib.WordArray.create(clonedWords, clonedSigBytes);\n};\n\nconst wordArrayPadPkcs7 = (data: CryptoJS.lib.WordArray, blockSize: number): CryptoJS.lib.WordArray => {\n  const clonedData = cloneWordArray(data);\n  CryptoJS.pad.Pkcs7.pad(clonedData, blockSize);\n  return clonedData;\n};\n\nconst wordArrayPadAnsiX923 = (data: CryptoJS.lib.WordArray, blockSize: number): CryptoJS.lib.WordArray => {\n  const clonedData = cloneWordArray(data);\n  CryptoJS.pad.AnsiX923.pad(clonedData, blockSize);\n  return clonedData;\n};\n\nconst wordArrayPadIso10126 = (data: CryptoJS.lib.WordArray, blockSize: number): CryptoJS.lib.WordArray => {\n  const clonedData = cloneWordArray(data);\n  CryptoJS.pad.Iso10126.pad(clonedData, blockSize);\n  return clonedData;\n};\n\nconst wordArrayPadIso97971 = (data: CryptoJS.lib.WordArray, blockSize: number): CryptoJS.lib.WordArray => {\n  const clonedData = cloneWordArray(data);\n  CryptoJS.pad.Iso97971.pad(clonedData, blockSize);\n  return clonedData;\n};\n\nconst wordArrayPadZeroPadding = (data: CryptoJS.lib.WordArray, blockSize: number): CryptoJS.lib.WordArray => {\n  const clonedData = cloneWordArray(data);\n  CryptoJS.pad.ZeroPadding.pad(clonedData, blockSize);\n  return clonedData;\n};\n\nconst wordArrayPadNoPadding = (data: CryptoJS.lib.WordArray, blockSize: number): CryptoJS.lib.WordArray => {\n  const clonedData = cloneWordArray(data);\n  CryptoJS.pad.NoPadding.pad(clonedData, blockSize);\n  return clonedData;\n};\n\nexport const pad = {\n  pkcs7padding: wordArrayPadPkcs7,\n  ansix923: wordArrayPadAnsiX923,\n  iso10126: wordArrayPadIso10126,\n  iso97971: wordArrayPadIso97971,\n  zeropadding: wordArrayPadZeroPadding,\n  nopadding: wordArrayPadNoPadding,\n};\n\nconst wordArrayUnpadPkcs7 = (data: CryptoJS.lib.WordArray): CryptoJS.lib.WordArray => {\n  const clonedData = cloneWordArray(data);\n  CryptoJS.pad.Pkcs7.unpad(clonedData);\n  return clonedData;\n};\n\nconst wordArrayUnpadAnsiX923 = (data: CryptoJS.lib.WordArray): CryptoJS.lib.WordArray => {\n  const clonedData = cloneWordArray(data);\n  CryptoJS.pad.AnsiX923.unpad(clonedData);\n  return clonedData;\n};\n\nconst wordArrayUnpadIso10126 = (data: CryptoJS.lib.WordArray): CryptoJS.lib.WordArray => {\n  const clonedData = cloneWordArray(data);\n  CryptoJS.pad.Iso10126.unpad(clonedData);\n  return clonedData;\n};\n\nconst wordArrayUnpadIso97971 = (data: CryptoJS.lib.WordArray): CryptoJS.lib.WordArray => {\n  const clonedData = cloneWordArray(data);\n  CryptoJS.pad.Iso97971.unpad(clonedData);\n  return clonedData;\n};\n\nconst wordArrayUnpadZeroPadding = (data: CryptoJS.lib.WordArray): CryptoJS.lib.WordArray => {\n  const clonedData = cloneWordArray(data);\n  CryptoJS.pad.ZeroPadding.unpad(clonedData);\n  return clonedData;\n};\n\nconst wordArrayUnpadNoPadding = (data: CryptoJS.lib.WordArray): CryptoJS.lib.WordArray => {\n  const clonedData = cloneWordArray(data);\n  CryptoJS.pad.NoPadding.unpad(clonedData);\n  return clonedData;\n};\n\nexport const unpad = {\n  pkcs7padding: wordArrayUnpadPkcs7,\n  ansix923: wordArrayUnpadAnsiX923,\n  iso10126: wordArrayUnpadIso10126,\n  iso97971: wordArrayUnpadIso97971,\n  zeropadding: wordArrayUnpadZeroPadding,\n  nopadding: wordArrayUnpadNoPadding,\n};\n\nexport const base64ToHex = (base64: string): string => {\n  const wordArray = base64ToWordArray(base64);\n  return wordArrayToHex(wordArray);\n};\n\nexport const hexToBase64 = (hex: string): string => {\n  const wordArray = hexToWordArray(hex);\n  return wordArrayToBase64(wordArray);\n};\n\nexport const utf8ToHex = (utf8: string): string => {\n  const wordArray = utf8ToWordArray(utf8);\n  return wordArrayToHex(wordArray);\n};\n\nexport const hexToUtf8 = (hex: string): string => {\n  const wordArray = hexToWordArray(hex);\n  return wordArrayToUtf8(wordArray);\n};\n\nexport const base64ToUtf8 = (base64: string): string => {\n  const wordArray = base64ToWordArray(base64);\n  return wordArrayToUtf8(wordArray);\n};\n\nexport const utf8ToBase64 = (utf8: string): string => {\n  const wordArray = utf8ToWordArray(utf8);\n  return wordArrayToBase64(wordArray);\n};\n\nexport default {\n  parse,\n  stringify,\n  arrayToWordArray,\n  wordArrayToArray,\n  cloneWordArray,\n  pad,\n  unpad,\n};\n"
  },
  {
    "path": "packages/shared/modules/date.ts",
    "content": "import type { ConfigType, Dayjs, ManipulateType, UnitType } from 'dayjs';\nimport dayjs from 'dayjs';\n\nimport { isNumber, isPositiveFiniteNumber } from './validate';\n\ntype TimeUnit = 's' | 'ms';\n\ntype DateSetObject = Partial<Record<UnitType, number>>;\n\ninterface RelativeTimeInfo {\n  minute: number;\n  hour: number;\n  day: number;\n  week: number;\n  month: number;\n  year: number;\n}\n\n/**\n * Intelligently process date input, automatically recognize second and millisecond timestamps\n * @param date Date input\n * @returns dayjs object\n */\nconst smartDayjs = (date?: ConfigType): Dayjs => {\n  try {\n    if (isPositiveFiniteNumber(date)) {\n      const timestamp = Number(date);\n      const timestampStr = String(timestamp);\n\n      if (timestampStr.length < 13) {\n        const paddingZeros = '0'.repeat(13 - timestampStr.length);\n        return dayjs(Number(timestampStr + paddingZeros));\n      } else if (timestampStr.length > 13) {\n        return dayjs(Number(timestampStr.substring(0, 13)));\n      } else {\n        return dayjs(timestamp);\n      }\n    }\n\n    return dayjs(date);\n  } catch {\n    return Object.assign(dayjs(), { isValid: () => false });\n  }\n};\n\n/**\n * Convert to Unix timestamp\n * @param unit Time unit, 's' for seconds, 'ms' for milliseconds\n * @param date Date input, can be string, number, Date object, etc.\n * @returns Unix timestamp\n */\nexport const toUnix = (unit: TimeUnit = 'ms', date?: ConfigType): number => {\n  try {\n    const dayjsObj = smartDayjs(date);\n    if (!dayjsObj.isValid()) {\n      return unit === 's' ? dayjs().unix() : dayjs().valueOf();\n    }\n\n    switch (unit) {\n      case 's':\n        return dayjsObj.unix();\n      case 'ms':\n      default:\n        return dayjsObj.valueOf();\n    }\n  } catch {\n    return unit === 's' ? dayjs().unix() : dayjs().valueOf();\n  }\n};\n\n/**\n * Format to YYYY-MM-DD HH:mm:ss format\n * @param date Date input\n * @returns Formatted date string\n */\nexport const toYMDHMS = (date?: ConfigType): string => {\n  try {\n    const dayjsObj = smartDayjs(date);\n    return dayjsObj.isValid() ? dayjsObj.format('YYYY-MM-DD HH:mm:ss') : '';\n  } catch {\n    return '';\n  }\n};\n\n/**\n * Format to YYYY-MM-DD format\n * @param date Date input\n * @returns Formatted date string\n */\nexport const toYMD = (date?: ConfigType): string => {\n  try {\n    const dayjsObj = smartDayjs(date);\n    return dayjsObj.isValid() ? dayjsObj.format('YYYY-MM-DD') : '';\n  } catch {\n    return '';\n  }\n};\n\n/**\n * Format to HH:mm:ss format\n * @param date Date input\n * @returns Formatted time string\n */\nexport const toHMS = (date?: ConfigType): string => {\n  try {\n    const dayjsObj = smartDayjs(date);\n    return dayjsObj.isValid() ? dayjsObj.format('HH:mm:ss') : '';\n  } catch {\n    return '';\n  }\n};\n\n/**\n * Get year\n * @param date Date input\n * @returns Year string\n */\nexport const toY = (date?: ConfigType): string => {\n  try {\n    const dayjsObj = smartDayjs(date);\n    return dayjsObj.isValid() ? dayjsObj.format('YYYY') : '';\n  } catch {\n    return '';\n  }\n};\n\n/**\n * Get month\n * @param date Date input\n * @returns Month string (01-12)\n */\nexport const toM = (date?: ConfigType): string => {\n  try {\n    const dayjsObj = smartDayjs(date);\n    return dayjsObj.isValid() ? dayjsObj.format('MM') : '';\n  } catch {\n    return '';\n  }\n};\n\n/**\n * Get day\n * @param date Date input\n * @returns Day string (01-31)\n */\nexport const toD = (date?: ConfigType): string => {\n  try {\n    const dayjsObj = smartDayjs(date);\n    return dayjsObj.isValid() ? dayjsObj.format('DD') : '';\n  } catch {\n    return '';\n  }\n};\n\n/**\n * Get day of week\n * @param date Date input\n * @returns Day of week (1-7, where 1 is Monday and 7 is Sunday)\n */\nexport const toW = (date?: ConfigType): number => {\n  try {\n    const dayjsObj = smartDayjs(date);\n    if (!dayjsObj.isValid()) {\n      return -1;\n    }\n    // dayjs.day() returns 0-6 (0 is Sunday), convert to 1-7 (1 is Monday, 7 is Sunday)\n    const dayOfWeek = dayjsObj.day();\n    return dayOfWeek === 0 ? 7 : dayOfWeek;\n  } catch {\n    return -1;\n  }\n};\n\n/**\n * Calculate time difference from now\n * @param unit Time unit\n * @param date Date to compare\n * @returns Time difference (positive for past, negative for future)\n */\nexport const toAgoDay = (unit: ManipulateType = 'day', date?: ConfigType): number => {\n  try {\n    const then = smartDayjs(date);\n    const now = dayjs();\n\n    if (!then.isValid()) {\n      return 0;\n    }\n\n    return now.diff(then, unit);\n  } catch {\n    return 0;\n  }\n};\n\n/**\n * Add time to a specified date\n * @param num Amount to add\n * @param unit Time unit\n * @param date Base date\n * @returns Timestamp after addition (milliseconds)\n */\nexport const toAdd = (num: number, unit: ManipulateType = 'day', date?: ConfigType): number => {\n  try {\n    const dayjsObj = smartDayjs(date);\n    if (!dayjsObj.isValid()) {\n      return dayjs().valueOf();\n    }\n\n    return dayjsObj.add(num, unit).valueOf();\n  } catch {\n    return dayjs().valueOf();\n  }\n};\n\n/**\n * Subtract time from a specified date\n * @param num Amount to subtract\n * @param unit Time unit\n * @param date Base date\n * @returns Timestamp after subtraction (milliseconds)\n */\nexport const toSubtract = (num: number, unit: ManipulateType = 'day', date?: ConfigType): number => {\n  try {\n    const dayjsObj = smartDayjs(date);\n    if (!dayjsObj.isValid()) {\n      return dayjs().valueOf();\n    }\n\n    return dayjsObj.subtract(num, unit).valueOf();\n  } catch {\n    return dayjs().valueOf();\n  }\n};\n\n/**\n * Check if a date is within a specified range\n * @param start Start date\n * @param end End date\n * @param date Date to check\n * @returns Whether the date is within the range\n */\nexport const isBetween = (start: ConfigType, end: ConfigType, date?: ConfigType): boolean => {\n  try {\n    const startDate = smartDayjs(start);\n    const endDate = smartDayjs(end);\n    const checkDate = smartDayjs(date);\n\n    if (!startDate.isValid() || !endDate.isValid() || !checkDate.isValid()) {\n      return false;\n    }\n\n    return checkDate.isAfter(startDate) && checkDate.isBefore(endDate);\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Check if a date is before a specified date\n * @param compare Date to compare against\n * @param date Date to check\n * @returns Whether the date is before the comparison date\n */\nexport const isBefore = (compare: ConfigType, date?: ConfigType): boolean => {\n  try {\n    const compareDate = smartDayjs(compare);\n    const checkDate = smartDayjs(date);\n\n    if (!compareDate.isValid() || !checkDate.isValid()) {\n      return false;\n    }\n\n    return checkDate.isBefore(compareDate);\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Check if a date is after a specified date\n * @param compare Date to compare against\n * @param date Date to check\n * @returns Whether the date is after the comparison date\n */\nexport const isAfter = (compare: ConfigType, date?: ConfigType): boolean => {\n  try {\n    const compareDate = smartDayjs(compare);\n    const checkDate = smartDayjs(date);\n\n    if (!compareDate.isValid() || !checkDate.isValid()) {\n      return false;\n    }\n\n    return checkDate.isAfter(compareDate);\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Set specific parts of a date\n * @param setObject Object containing date parts to set\n * @param baseDate Base date, defaults to current time\n * @returns Timestamp after setting (milliseconds)\n */\nexport const set = (setObject: DateSetObject, baseDate?: ConfigType): number => {\n  try {\n    let date = smartDayjs(baseDate);\n\n    if (!date.isValid()) {\n      date = dayjs();\n    }\n\n    Object.entries(setObject).forEach(([key, value]) => {\n      if (isNumber(value)) {\n        date = date.set(key as UnitType, value);\n      }\n    });\n\n    return date.valueOf();\n  } catch {\n    return dayjs().valueOf();\n  }\n};\n\n/**\n * Custom date formatting\n * @param format Format string\n * @param date Date input\n * @returns Formatted string\n */\nexport const format = (format: string, date?: ConfigType): string => {\n  try {\n    const dayjsObj = smartDayjs(date);\n    return dayjsObj.isValid() ? dayjsObj.format(format) : '';\n  } catch {\n    return '';\n  }\n};\n\n/**\n * Get relative time information object\n * @param date Date input\n * @param baseDate Base date, defaults to current time\n * @returns Object containing time differences in various units\n */\nexport const fromNow = (date?: ConfigType, baseDate?: ConfigType): RelativeTimeInfo => {\n  const defaultRes = { minute: 0, hour: 0, day: 0, week: 0, month: 0, year: 0 };\n  try {\n    const targetDate = smartDayjs(date);\n\n    if (!targetDate.isValid()) {\n      return defaultRes;\n    }\n\n    const base = baseDate ? smartDayjs(baseDate) : dayjs();\n    if (!base.isValid()) {\n      return defaultRes;\n    }\n\n    // Calculate time differences in various units\n    const minute = base.diff(targetDate, 'minute');\n    const hour = base.diff(targetDate, 'hour');\n    const day = base.diff(targetDate, 'day');\n    const week = base.diff(targetDate, 'week');\n    const month = base.diff(targetDate, 'month');\n    const year = base.diff(targetDate, 'year');\n\n    return { minute, hour, day, week, month, year };\n  } catch {\n    return defaultRes;\n  }\n};\n\n/**\n * Get the number of days in a month\n * @param date Date input\n * @returns Number of days in the month\n */\nexport const daysInMonth = (date?: ConfigType): number => {\n  try {\n    const dayjsObj = smartDayjs(date);\n    return dayjsObj.isValid() ? dayjsObj.daysInMonth() : 0;\n  } catch {\n    return 0;\n  }\n};\n\n/**\n * Check if date is valid\n * @param date Date input\n * @returns Whether the date is valid\n */\nexport const isValid = (date?: ConfigType): boolean => {\n  try {\n    return smartDayjs(date).isValid();\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Check if date is today\n * @param date Date input\n * @returns Whether the date is today\n */\nexport const isToday = (date?: ConfigType): boolean => {\n  try {\n    const checkDate = smartDayjs(date);\n    return checkDate.isValid() && checkDate.isSame(dayjs(), 'day');\n  } catch {\n    return false;\n  }\n};\n\nexport default {\n  toUnix,\n  toYMDHMS,\n  toYMD,\n  toHMS,\n  toY,\n  toM,\n  toD,\n  toW,\n  toAgoDay,\n  toAdd,\n  toSubtract,\n  isBetween,\n  isBefore,\n  isAfter,\n  set,\n  format,\n  fromNow,\n  daysInMonth,\n  isValid,\n  isToday,\n};\n"
  },
  {
    "path": "packages/shared/modules/function.ts",
    "content": "import { isFunction, isNil, isPositiveFiniteNumber } from './validate';\n\nexport const runFunction = async <T>(fn: () => T | Promise<T>) => {\n  await fn();\n};\n\nexport const runCatchFunction = <T>(fn: () => T, message: string): T => {\n  try {\n    return fn();\n  } catch (error) {\n    throw new Error(message, { cause: error });\n  }\n};\n\nexport const runCatchAsyncFunction = async <T>(fn: () => Promise<T>, message: string): Promise<T> => {\n  try {\n    return await fn();\n  } catch (error) {\n    throw new Error(message, { cause: error });\n  }\n};\nexport const runRetryFunction = <T>(fn: () => T, retry: number = 3, validate?: (result: T) => boolean): T => {\n  if (!isPositiveFiniteNumber(retry) || retry <= 0) throw new Error('retry must be a positive finite number');\n\n  let lastError: Error | null = null;\n\n  for (let attempt = 1; attempt <= retry; attempt++) {\n    try {\n      const result = fn();\n\n      if (isNil(validate) || !isFunction(validate)) return result;\n      if (validate(result)) return result;\n\n      lastError = new Error(`Validation failed on attempt ${attempt}`);\n    } catch (error) {\n      lastError = error instanceof Error ? error : new Error(String(error));\n    }\n  }\n\n  throw lastError || new Error('All retry attempts failed');\n};\n\nexport const runRetryAsyncFunction = async <T>(\n  fn: () => Promise<T>,\n  retry: number = 3,\n  validate?: (result: T) => boolean,\n): Promise<T> => {\n  if (!isPositiveFiniteNumber(retry) || retry <= 0) throw new Error('retry must be a positive finite number');\n\n  let lastError: Error | null = null;\n\n  for (let attempt = 1; attempt <= retry; attempt++) {\n    try {\n      const result = await fn();\n\n      if (isNil(validate) || !isFunction(validate)) return result;\n      if (validate(result)) return result;\n\n      lastError = new Error(`Validation failed on attempt ${attempt}`);\n    } catch (error) {\n      lastError = error instanceof Error ? error : new Error(String(error));\n    }\n  }\n\n  throw lastError || new Error('All retry attempts failed');\n};\n"
  },
  {
    "path": "packages/shared/modules/headers.ts",
    "content": "import JSON5 from 'json5';\nimport type { ParsedQs } from 'qs';\nimport qs from 'qs';\n\nimport { pascalCase } from './camelcase';\nimport { isArray, isNil, isObject, isObjectEmpty, isStrEmpty, isString, isUndefined } from './validate';\n\ntype IHeaders = Record<string, any>;\n\nexport const UNSAFE_HEADERS: Array<string> = [\n  'Host',\n  'Referer',\n  'Origin',\n  'User-Agent',\n  'Content-Length',\n  'Set-Cookie',\n  'Cookie',\n  // 'Authorization',\n  // 'X-CSRF-Token',\n  // 'X-XSRF-Token'\n];\nexport const UNSAFE_HEADERS_LOWER = UNSAFE_HEADERS.map((item: string) => item.toLowerCase());\nexport const UNSAFE_HEADERS_UPPER = UNSAFE_HEADERS.map((item: string) => item.toUpperCase());\n\nexport const ELECTRON_TAG: string = 'Electron';\n\n/**\n * Converting HTTP headers keys to PascalCase format\n * @param headersRaw - HTTP headers object\n * @returns PascalCase HTTP headers object\n */\nexport const headersPascalCase = (headersRaw: IHeaders = {}): IHeaders => {\n  if (isObjectEmpty(headersRaw)) return {};\n\n  return Object.entries(headersRaw).reduce((acc, [key, val]) => {\n    const newKey = pascalCase(key, '-', '-');\n    acc[newKey] = val;\n    return acc;\n  }, {});\n};\n\n/**\n * Get all HTTP header keys in PascalCase format\n * @param headersRaw - HTTP headers object\n * @returns Array of PascalCase HTTP header keys\n */\nexport const headerKeysPascalCase = (headersRaw: IHeaders = {}): string[] => {\n  if (isObjectEmpty(headersRaw)) return [];\n\n  const headers = headersPascalCase(headersRaw);\n  return Object.keys(headers);\n};\n\n/**\n * Checks whether a given document header is secure\n *\n * @param doc - The document header to check\n * @returns Returns true if all headers are safe, otherwise false\n */\nexport const isSafeHeader = (doc: string | Array<string> | IHeaders): boolean => {\n  const check = (key: string): boolean => {\n    const standardKey = pascalCase(key, '-', '-');\n\n    if (UNSAFE_HEADERS.includes(standardKey) || standardKey.startsWith('Sec-')) {\n      return false;\n    } else {\n      return true;\n    }\n  };\n\n  if (isString(doc)) return check(doc);\n\n  if (isArray(doc)) {\n    return (doc as Array<string>).every((item: string) => check(item));\n  }\n\n  if (isObject(doc)) {\n    return Object.keys(doc).every((key: string) => check(key));\n  }\n\n  return false;\n};\n\n/**\n * Remove insecure fields in the HTTP headers\n * @param headersRaw - Raw HTTP header object\n * @returns Filtered HTTP Header Objects\n */\nexport const removeUnSafeHeaders = (headersRaw: IHeaders = {}): IHeaders => {\n  if (isObjectEmpty(headersRaw)) return {};\n\n  const headers = headersPascalCase(headersRaw);\n  const standardHeaders = {};\n\n  for (const [key, value] of Object.entries(headers)) {\n    if (isUndefined(value)) continue;\n    if (isSafeHeader(key)) {\n      standardHeaders[key] = value;\n    }\n  }\n\n  return standardHeaders;\n};\n\n/**\n * Remove \"Remove-\" prefix from headers\n * @param headersRaw - Raw HTTP headers object\n * @param prefixRaw - The prefix to remove (default: \"Remove\")\n * @param strict - Whether to strictly check for \"Remove-\" prefix (default: true)\n * @returns Standard HTTP headers object\n */\nexport const removePrefixHeaders = (\n  headersRaw: IHeaders = {},\n  prefixRaw: string = 'Remove',\n  strict: boolean = true,\n): IHeaders => {\n  if (isObjectEmpty(headersRaw)) return {};\n\n  const headers = headersPascalCase(headersRaw);\n  const prefix = pascalCase(prefixRaw, '-', '-');\n  const standardHeaders = {};\n\n  for (const [key, value] of Object.entries(headers)) {\n    if (isUndefined(value)) continue;\n    const newKey = strict ? `${prefix}-${key}` : prefix;\n    if (!value.startsWith(newKey)) {\n      standardHeaders[key] = value;\n    }\n  }\n\n  return standardHeaders;\n};\n\n/**\n * Convert Web HTTP Headers to Electron Compatible Format\n * @param headersRaw - Raw HTTP header object\n * @returns Electron compatible HTTP header object\n */\nexport const convertWebToElectron = (headersRaw: IHeaders = {}): IHeaders => {\n  if (isObjectEmpty(headersRaw)) return {};\n\n  const headers = headersPascalCase(headersRaw);\n  const standardHeaders = {};\n\n  for (const [key, value] of Object.entries(headers)) {\n    if (isUndefined(value)) continue;\n    const newKey = isSafeHeader(key) ? key : `${ELECTRON_TAG}-${key}`;\n    standardHeaders[newKey] = value;\n  }\n\n  return standardHeaders;\n};\n\n/**\n * Convert Electron HTTP Headers to Web Compatible Format\n * @param headersRaw - Electron HTTP header object\n * @returns Web compatible HTTP header object\n */\nexport const convertElectronToWeb = (headersRaw: IHeaders = {}): IHeaders => {\n  if (isObjectEmpty(headersRaw)) return {};\n\n  const headers = headersPascalCase(headersRaw);\n  const standardHeaders = {};\n\n  for (const [key, value] of Object.entries(headers)) {\n    if (isUndefined(value)) continue;\n    const newKey = isSafeHeader(key) ? key : key.replace(`${ELECTRON_TAG}-`, '');\n    standardHeaders[newKey] = value;\n  }\n\n  return standardHeaders;\n};\n\n/**\n * Convert a URI to standard format\n * @param url - The URI to convert\n * @returns The converted URI\n *\n * @example http://xxx.com/xxx.png@Referer=xxx.com@User-Agent=okhttp\n */\nexport const convertUriToStandard = (url: string): { redirect: string; headers: IHeaders } => {\n  try {\n    url = decodeURIComponent(url);\n    const headers = {};\n\n    // Handle keys from UNSAFE_HEADERS.\n    UNSAFE_HEADERS.forEach((key) => {\n      const unsafeRegex = new RegExp(`@${key}=([^@]*)`, 'i');\n      const unsafeMatch = unsafeRegex.exec(url);\n      if (unsafeMatch && unsafeMatch[1]) {\n        headers[key] = decodeURIComponent(unsafeMatch[1]);\n        url = url.replace(unsafeMatch[0], '');\n      }\n    });\n\n    // Handle @Headers={...}\n    const headerRegex = /@Headers=(\\{[^}]+\\})/i;\n    const headerMatch = headerRegex.exec(url);\n    if (headerMatch && headerMatch[1]) {\n      try {\n        const parsedHeaders = JSON5.parse(decodeURIComponent(headerMatch[1]));\n        Object.assign(headers, parsedHeaders);\n      } catch {\n        // intentionally ignore JSON parse errors\n      }\n      url = url.replace(headerMatch[0], '');\n    }\n\n    return { redirect: url, headers: headersPascalCase(headers) };\n  } catch {\n    return { redirect: url, headers: {} };\n  }\n};\n\n/**\n * Convert a standard URI to a URI\n * @param redirect - The standard URI to convert\n * @param headersRaw - The HTTP headers\n * @param encode - Whether to return an encoded URL string (default: true)\n * @returns The converted URI\n *\n * @see https://github.com/takagen99/Box/blob/main/app/src/main/java/com/github/tvbox/osc/util/ImgUtil.java#L211\n *\n */\nexport const convertStandardToUri = (redirect: string, headersRaw: IHeaders = {}, encode: boolean = false): string => {\n  try {\n    if (isObjectEmpty(headersRaw)) return redirect;\n\n    const headers = headersPascalCase(headersRaw);\n    const unsafeHeaders = {};\n\n    // Handle keys from UNSAFE_HEADERS.\n    UNSAFE_HEADERS.forEach((key) => {\n      if (headers[key]) {\n        unsafeHeaders[`@${key}`] = headers[key];\n        delete headers[key];\n      }\n    });\n\n    // Handle @Headers={...}\n    if (!isObjectEmpty(headers)) {\n      unsafeHeaders['@Headers'] = encode ? encodeURIComponent(JSON.stringify(headers)) : JSON.stringify(headers);\n    }\n\n    const unsafePart = Object.entries(unsafeHeaders)\n      .map(([key, value]) => `${key}=${value}`)\n      .join('');\n\n    return `${redirect}${unsafePart}`;\n  } catch {\n    return redirect;\n  }\n};\n\n/**\n * Convert HTTP headers to standard format\n * @param headersRaw - Raw HTTP headers object\n * @param type - The type of headers ('electron' | 'web'), default is 'electron'\n * @param strict - Whether to strictly check for safe headers (default: true)\n * @returns Standard HTTP headers object\n */\nexport const convertStandardHeaders = (\n  headersRaw: IHeaders = {},\n  type: 'electron' | 'web' = 'electron',\n  strict: boolean = true,\n): IHeaders => {\n  if (isObjectEmpty(headersRaw)) return {};\n\n  const headers = headersPascalCase(headersRaw);\n  let standardHeaders = {};\n\n  for (const [key, value] of Object.entries(headers)) {\n    if (isUndefined(value)) continue;\n\n    let newKey = key;\n    if (type === 'web' && !isSafeHeader(key)) {\n      newKey = `${ELECTRON_TAG}-${key}`;\n    }\n    if (type === 'electron' && !isSafeHeader(key) && key.startsWith(`${ELECTRON_TAG}-`)) {\n      newKey = key.replace(`${ELECTRON_TAG}-`, '');\n    }\n\n    standardHeaders[newKey] = value;\n  }\n\n  standardHeaders = removePrefixHeaders(standardHeaders, 'Remove', strict);\n\n  return standardHeaders;\n};\n\n/**\n * Check if the URI is localhost\n * @param url - The URI to check\n * @returns Whether the URI is localhost\n */\nexport const isLocalhostURI = (url: string): boolean => {\n  if (isNil(url) || !isString(url) || isStrEmpty(url)) return false;\n  try {\n    const hostname = new URL(url).hostname;\n    return ['localhost', '127.0.0.1', '[::1]'].includes(hostname);\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Get the origin part of a URL\n * @param str - Input string\n * @returns Origin part of the URL\n */\nexport const getHome = (str: string): string => {\n  if (!isString(str)) return str;\n\n  try {\n    const url = new URL(str);\n    return url.origin;\n  } catch {\n    return str;\n  }\n};\n\n/**\n * Parse a query string into an object\n * @param str - Query string\n * @returns Parsed query parameters\n */\nexport const parseQueryString = (str: string): ParsedQs => {\n  const query = str.replace(/^[?&]/, '');\n  return qs.parse(query);\n};\n\n/**\n * Resolve URL from base URL and relative URL\n * @param from - The base URL\n * @param to - The relative URL\n * @returns The resolved URL\n */\nexport function urlResolve(from: string = '', to: string = ''): string {\n  try {\n    const base = new URL(from, 'resolve://');\n    const resolved = new URL(to, base);\n    return resolved.protocol === 'resolve:' ? `${resolved.pathname}${resolved.search}${resolved.hash}` : resolved.href;\n  } catch {\n    return from;\n  }\n}\n\n/**\n * Build a URL by appending a path or query string to a base URL\n * @param baseUrl - The base URL\n * @param append - The path or query string to append\n * @returns The constructed URL\n */\nexport const buildUrl = (baseUrl: string, append: string = ''): string => {\n  try {\n    const u = new URL(baseUrl);\n    const basePath = u.pathname.replace(/\\/$/, '');\n    const api = u.origin + basePath;\n\n    if (/^[?&]/.test(append)) {\n      const originalParams = new URLSearchParams(u.search);\n      const newParams = new URLSearchParams(append);\n\n      newParams.forEach((value, key) => originalParams.set(key, value));\n      const query = originalParams.toString();\n      return query ? `${api}?${query}` : api;\n    }\n\n    const extraPath = append.replace(/^\\/+/, '');\n    return extraPath ? `${api}/${extraPath}` : api;\n  } catch {\n    return baseUrl;\n  }\n};\n\n/**\n * Remove the scheme and separators from the given URL.\n *\n * @example\n * ```javascript\n * removeScheme('https://music.apple.com/browse') // => 'music.apple.com/browse'\n * removeScheme('apple-music://music.apple.com/browse') // => 'music.apple.com/browse'\n * removeScheme('music.apple.com/browse') // => 'music.apple.com/browse'\n * ```\n */\nexport function removeScheme(url: string | URL | null | undefined): string {\n  if (isNil(url)) {\n    return '';\n  }\n\n  return String(url).replace(/^([^:]*:\\/{0,2}|:?\\/\\/)/, '');\n}\n\n/**\n * Strip scheme and host (hostname + port) from a URL, leaving just the path, query\n * params, and hash.\n *\n * @param {string} url The URL possibly containing a host\n * @returns {string} hostlessUrl The url without its host\n */\nexport function removeHost(url: string | URL | null | undefined): string {\n  return removeScheme(url)?.replace(/^([^/]*)/, '');\n}\n\n/**\n * Strip query params and fragment from a URL.\n */\nexport function removeQueryParams(url: string | URL | undefined): string {\n  if (isNil(url)) {\n    return '';\n  }\n\n  const value = String(url);\n  const splitIndex = value.indexOf('?');\n  return splitIndex >= 0 ? value.slice(0, splitIndex) : value;\n}\n\n/**\n * Get the base URL of the current window\n * @returns The base URL as a string\n */\nexport function getBaseUrl(): string {\n  const currentUrl = new URL(window.location.href);\n  return `${currentUrl.protocol}//${currentUrl.host}`;\n}\n\n/**\n * Builds a URL string from the given components.\n *\n * This utility normalizes the hostname, constructs the pathname,\n * appends query parameters and hash, and returns the final URL string.\n *\n * By default, the returned URL is fully encoded (RFC 3986 compliant).\n * If `encode` is set to `false`, the URL will be decoded for readability\n * (e.g. spaces and non-ASCII characters will remain visible).\n *\n * @param props - URL components\n * @param props.protocol - URL protocol (default: \"https\")\n * @param props.hostname - Hostname, with or without protocol\n * @param props.pathname - URL pathname as a string or string array\n * @param props.searchParams - Query parameters as a string or key-value object\n * @param props.hash - URL hash fragment (e.g. \"#section\")\n * @param encode - Whether to return an encoded URL string (default: true)\n *\n * @returns The generated URL as a string\n */\nexport function newUrl(\n  props: {\n    protocol?: string;\n    hostname: string;\n    pathname?: string | string[];\n    searchParams?: string | IHeaders;\n    hash?: string;\n  },\n  encode: boolean = true,\n): string {\n  try {\n    const { hostname, pathname = '/', searchParams = {}, protocol = 'https', hash = '' } = props;\n\n    const url = new URL(`${protocol}://${removeScheme(hostname)}`);\n    url.pathname = `/${Array.isArray(pathname) ? `${pathname.join('/')}` : pathname}`.replace(/\\/+/g, '/'); // pathname\n    url.hash = hash; // hash\n\n    const queryObj: IHeaders =\n      isString(searchParams) && !isStrEmpty(searchParams)\n        ? qs.parse(searchParams)\n        : isObject(searchParams) && !isObjectEmpty(searchParams)\n          ? searchParams\n          : {};\n    const queryString = qs.stringify(queryObj, {\n      encode, // encode values if true\n      encodeValuesOnly: true,\n      arrayFormat: 'brackets',\n      format: 'RFC3986', // %20 instead of +\n    });\n    url.search = queryString ? `?${queryString}` : ''; // search\n\n    return encode ? url.toString() : decodeURI(url.toString());\n  } catch {\n    return '';\n  }\n}\n\n/**\n * Strip all occurrences of a specific query parameter value from a URL.\n * @param url - The original URL\n * @param param - The query parameter to remove\n * @param type - Whether to remove by 'key' or 'value' (default is 'key')\n * @returns The URL with the specified query parameter value removed\n */\nexport function stripUrlParam(url: string, param: string, type: 'key' | 'value' = 'key'): string {\n  if (!param) return url;\n\n  const [beforeHash, hash = ''] = url.split('#');\n  const [originPath, search] = beforeHash.split('?');\n  if (!search) return url;\n\n  const query = qs.parse(search);\n  let changed = false;\n\n  Object.keys(query).forEach((key) => {\n    const value = query[key];\n\n    // remove by key\n    if (type === 'key' && key === param) {\n      delete query[key];\n      changed = true;\n      return;\n    }\n\n    // remove by value\n    if (type === 'value') {\n      if (Array.isArray(value)) {\n        const filtered = value.filter((v) => v !== param);\n        if (filtered.length !== value.length) {\n          changed = true;\n          if (filtered.length === 0) {\n            delete query[key];\n          } else {\n            query[key] = filtered;\n          }\n        }\n      } else if (value === param) {\n        delete query[key];\n        changed = true;\n      }\n    }\n  });\n\n  // nothing changed → return original url\n  if (!changed) return url;\n\n  const newSearch = qs.stringify(query, { addQueryPrefix: true, arrayFormat: 'repeat' });\n  return originPath + newSearch + (hash ? `#${hash}` : '');\n}\n"
  },
  {
    "path": "packages/shared/modules/ip.ts",
    "content": "import ipaddr from 'ipaddr.js';\n\nimport { isStrEmpty } from './validate';\n\nexport type IPVersion = 4 | 6 | -1;\n\nexport interface IPInfo {\n  ip: string;\n  version: IPVersion;\n  valid: boolean;\n}\n\nexport interface IPLocation {\n  country: string;\n  region: string;\n  city: string;\n  isp: string;\n}\n\nexport type IP = IPInfo & { location: Partial<IPLocation> };\n\n/**\n * Check ip version\n * @param ip - Value to check\n * @returns IP version (4, 6, or -1 for invalid)\n */\nexport const checkIpVersion = (ip: string): IPVersion => {\n  if (isStrEmpty(ip)) {\n    return -1;\n  }\n\n  try {\n    const ipParse = ipaddr.parse(ip.trim());\n    switch (ipParse.kind()) {\n      case 'ipv4':\n        return 4;\n      case 'ipv6':\n        return 6;\n      default:\n        return -1;\n    }\n  } catch {\n    return -1;\n  }\n};\n\n/**\n * Check if the IP address is valid\n * @param ip - Value to check\n * @returns Whether the IP address is valid\n */\nexport const isValidIP = (ip: string): boolean => {\n  const version = checkIpVersion(ip);\n  return version === 4 || version === 6;\n};\n\n/**\n * Get basic information about the IP address\n * @param ip - Value to check\n * @returns IP information object\n */\nexport const getIPInfo = (ip: string): IPInfo => {\n  const version = checkIpVersion(ip);\n  const valid = isValidIP(ip);\n\n  return {\n    ip: ip?.trim() || '',\n    version,\n    valid,\n  };\n};\n\n/**\n * Check if the IP address is in the specified CIDR range\n * @param ip - Value to check\n * @param cidr - CIDR notation of the network range\n * @returns Whether the IP address is in the range\n */\nexport const isIPInRange = (ip: string, cidr: string): boolean => {\n  try {\n    if (!isValidIP(ip)) {\n      return false;\n    }\n\n    const addr = ipaddr.parse(ip.trim());\n    const [network, prefixLength] = cidr.split('/');\n\n    if (!network || !prefixLength) {\n      return false;\n    }\n\n    const networkAddr = ipaddr.parse(network.trim());\n    const prefix = Number.parseInt(prefixLength, 10);\n\n    if (Number.isNaN(prefix)) {\n      return false;\n    }\n\n    return addr.match(networkAddr, prefix);\n  } catch {\n    return false;\n  }\n};\n\nexport default {\n  checkIpVersion,\n  getIPInfo,\n  isIPInRange,\n  isValidIP,\n};\n"
  },
  {
    "path": "packages/shared/modules/lrucache.ts",
    "content": "export class LruCache<K = string, V = any> {\n  readonly cache: Map<K, V>;\n  readonly capacity: number;\n\n  constructor(capacity: number = 30) {\n    this.capacity = capacity;\n    this.cache = new Map<K, V>();\n  }\n\n  /**\n   * Check if a key exists in the cache\n   * @param key Key to check\n   * @returns Whether the key exists\n   */\n  has(key: K): boolean {\n    return this.cache.has(key);\n  }\n\n  /**\n   * Get the value for the specified key\n   * If the key exists, it will be moved to the most recently used position\n   * @param key Key to retrieve\n   * @returns The corresponding value, or undefined if it doesn't exist\n   */\n  get(key: K): V | undefined {\n    if (!this.cache.has(key)) {\n      return undefined;\n    }\n\n    // Updating the order of use\n    const value = this.cache.get(key)!;\n    this.cache.delete(key);\n    this.cache.set(key, value);\n\n    return value;\n  }\n\n  /**\n   * Set a key-value pair\n   * If the cache is full, the least recently used item will be removed\n   * @param key The key\n   * @param value The value\n   * @returns The set value\n   */\n  put(key: K, value: V): V {\n    if (this.cache.has(key)) {\n      // If the key already exists, delete the old entry\n      this.cache.delete(key);\n    } else if (this.cache.size >= this.capacity) {\n      // If the cache is full, delete the oldest entry (first one)\n      const firstKey = this.cache.keys().next().value;\n      this.cache.delete(firstKey!);\n    }\n\n    // Add the new entry\n    this.cache.set(key, value);\n    return value;\n  }\n\n  /**\n   * Delete a cache item with the specified key\n   * @param key Key to delete\n   * @returns Whether the deletion was successful\n   */\n  delete(key: K): boolean {\n    this.cache.delete(key);\n    return true;\n  }\n\n  /**\n   * Clear all cache entries\n   */\n  clear(): void {\n    this.cache.clear();\n  }\n\n  /**\n   * Get the current cache size\n   * @returns Number of items in the cache\n   */\n  size(): number {\n    return this.cache.size;\n  }\n\n  /**\n   * Get the cache capacity\n   * @returns Maximum capacity\n   */\n  getCapacity(): number {\n    return this.capacity;\n  }\n\n  /**\n   * Check if the cache is empty\n   * @returns Whether the cache is empty\n   */\n  isEmpty(): boolean {\n    return this.cache.size === 0;\n  }\n\n  /**\n   * Check if the cache is full\n   * @returns Whether the cache is full\n   */\n  isFull(): boolean {\n    return this.cache.size >= this.capacity;\n  }\n\n  /**\n   * Get an array of all keys\n   * Arranged in order of use (most recently used at the end)\n   * @returns Array of keys\n   */\n  keys(): K[] {\n    return [...this.cache.keys()];\n  }\n\n  /**\n   * Get an array of all values\n   * Arranged in order of use (most recently used at the end)\n   * @returns Array of values\n   */\n  values(): V[] {\n    return [...this.cache.values()];\n  }\n\n  /**\n   * Get an array of all key-value pairs\n   * Arranged in order of use (most recently used at the end)\n   * @returns Array of key-value pairs\n   */\n  entries(): [K, V][] {\n    return [...this.cache.entries()];\n  }\n\n  /**\n   * Get cache statistics\n   * @returns Statistics object\n   */\n  getStats(): {\n    size: number;\n    capacity: number;\n    usage: number;\n    isEmpty: boolean;\n    isFull: boolean;\n  } {\n    const size = this.cache.size;\n    return {\n      size,\n      capacity: this.capacity,\n      usage: Math.round((size / this.capacity) * 100),\n      isEmpty: size === 0,\n      isFull: size >= this.capacity,\n    };\n  }\n}\n\nexport default LruCache;\n"
  },
  {
    "path": "packages/shared/modules/obj.ts",
    "content": "import JSON5 from 'json5';\n\nimport { isJson, isJsonStr, isStrEmpty, isString } from './validate';\n\n/**\n * Convert a JSON string to an object\n *\n * @param val - The JSON string to convert\n * @returns The converted object\n */\nexport const jsonStrToObj = (val: string): Record<string, any> => {\n  try {\n    if (!isJsonStr(val)) return {};\n    return JSON5.parse(val);\n  } catch {\n    return {};\n  }\n};\n\n/**\n * Convert a JSON5 object to a JSON object\n *\n * @param val - The JSON5 object to convert\n * @returns The converted JSON object\n */\nexport const json5Tojson = (val: Record<string, any>): Record<string, any> => {\n  try {\n    if (!isJson(val)) return {};\n    return JSON.parse(JSON5.stringify(val));\n  } catch {\n    return {};\n  }\n};\n\n/**\n * Convert a JSON string to an object by eval\n *\n * @param val - The JSON string to convert\n * @returns The converted object\n */\nexport const jsonStrToObjByEval = (val: string): Record<string, any> => {\n  try {\n    const raw = String.raw`${val}`;\n    // eslint-disable-next-line no-new-func\n    return new Function(`return (${raw});`)();\n  } catch {\n    return {};\n  }\n};\n\n/**\n * Create an object from an iterable of key/value pairs\n *\n * @param entries - The key value pairs (ex. [['a', 1], ['b', 2]])\n * @return The created object\n */\nexport function entriesToObj<V>(entries: Iterable<readonly [PropertyKey, V]>): {\n  [k: string]: V;\n} {\n  try {\n    const result: Record<PropertyKey, V> = {};\n\n    for (const [key, value] of entries) {\n      result[key] = value;\n    }\n\n    return result;\n  } catch {\n    return {};\n  }\n}\n\n/**\n * Get value by path from object\n * @param obj - The object to get value from\n * @param path - The path string (ex. 'a.b.c')\n * @returns The value at the specified path\n */\nexport const objPathValue = (obj: Record<string, any>, path: string): any => {\n  if (!isString(path) || isStrEmpty(path)) return undefined;\n  const normalized = path\n    .replace(/\\['?\"?'?([^'\\]]+)'?\"?'?\\]/g, '.$1')\n    .replace(/\\[(\\d+)\\]/g, '.$1')\n    .replace(/\\[\\*\\]/g, '.0');\n  return normalized.split('.').reduce((acc, key) => acc?.[key], obj);\n};\n"
  },
  {
    "path": "packages/shared/modules/request/axios/Axios.ts",
    "content": "import type {\n  AxiosError,\n  AxiosInstance,\n  AxiosRequestConfig,\n  AxiosRequestHeaders,\n  AxiosResponse,\n  InternalAxiosRequestConfig,\n} from 'axios';\nimport axios from 'axios';\nimport { cloneDeep, debounce, isFunction, throttle } from 'es-toolkit';\nimport { stringify } from 'qs';\n\nimport { ContentTypeEnum } from '../constants';\nimport type { AxiosRequestConfigRetry, RequestOptions, Result } from '../type';\nimport { AxiosCanceler } from './AxiosCancel';\nimport type { CreateAxiosOptions } from './AxiosTransform';\n\n/**\n * Axios 模块\n */\nexport class VAxios {\n  /**\n   * Axios实例句柄\n   * @private\n   */\n  private instance: AxiosInstance;\n\n  /**\n   * Axios配置\n   * @private\n   */\n  private readonly options: CreateAxiosOptions;\n\n  constructor(options: CreateAxiosOptions) {\n    this.options = options;\n    this.instance = axios.create(options);\n    this.setupInterceptors();\n  }\n\n  /**\n   * 创建Axios实例\n   * @param config\n   * @private\n   */\n  private createAxios(config: CreateAxiosOptions): void {\n    this.instance = axios.create(config);\n  }\n\n  /**\n   * 获取数据处理类\n   * @private\n   */\n  private getTransform() {\n    const { transform } = this.options;\n    return transform;\n  }\n\n  /**\n   * 获取Axios实例\n   */\n  getAxios(): AxiosInstance {\n    return this.instance;\n  }\n\n  /**\n   * 配置Axios\n   * @param config\n   */\n  configAxios(config: CreateAxiosOptions) {\n    if (!this.instance) return;\n    this.createAxios(config);\n  }\n\n  /**\n   * 设置公共头部信息\n   * @param headers\n   */\n  setHeader(headers: Record<string, string>): void {\n    if (!this.instance) return;\n    Object.assign(this.instance.defaults.headers, headers);\n  }\n\n  /**\n   * 设置拦截器\n   * @private\n   */\n  private setupInterceptors() {\n    const transform = this.getTransform();\n    if (!transform) return;\n\n    const { requestInterceptors, requestInterceptorsCatch, responseInterceptors, responseInterceptorsCatch } =\n      transform;\n    const axiosCanceler = new AxiosCanceler();\n\n    // 请求拦截器\n    this.instance.interceptors.request.use((config: InternalAxiosRequestConfig) => {\n      // 如果忽略取消令牌，则不会取消重复的请求\n      // @ts-expect-error 类型“InternalAxiosRequestConfig<any>”上不存在属性“requestOptions”。\n      const { ignoreCancelToken } = config.requestOptions;\n      const ignoreCancel = ignoreCancelToken ?? this.options.requestOptions?.ignoreCancelToken;\n      if (!ignoreCancel) axiosCanceler.addPending(config);\n\n      if (requestInterceptors && isFunction(requestInterceptors)) {\n        config = requestInterceptors(config, this.options) as InternalAxiosRequestConfig;\n      }\n\n      return config;\n    }, undefined);\n\n    // 请求错误处理\n    if (requestInterceptorsCatch && isFunction(requestInterceptorsCatch)) {\n      this.instance.interceptors.request.use(undefined, requestInterceptorsCatch);\n    }\n\n    // 响应结果处理\n    this.instance.interceptors.response.use((res: AxiosResponse) => {\n      if (res) axiosCanceler.removePending(res.config);\n      if (responseInterceptors && isFunction(responseInterceptors)) {\n        res = responseInterceptors(res);\n      }\n      return res;\n    }, undefined);\n\n    // 响应错误处理\n    if (responseInterceptorsCatch && isFunction(responseInterceptorsCatch)) {\n      this.instance.interceptors.response.use(undefined, (error) => responseInterceptorsCatch(error, this.instance));\n    }\n  }\n\n  /**\n   * 支持 FormData 请求格式\n   * @param config\n   */\n  supportFormData(config: AxiosRequestConfig) {\n    const headers = config.headers || (this.options.headers as AxiosRequestHeaders);\n    const contentType = headers?.['Content-Type'] || headers?.['content-type'];\n\n    if (\n      contentType !== ContentTypeEnum.FormURLEncoded ||\n      !Reflect.has(config, 'data') ||\n      config.method?.toUpperCase() === 'GET'\n    ) {\n      return config;\n    }\n\n    return {\n      ...config,\n      data: stringify(config.data, { arrayFormat: 'brackets' }),\n    };\n  }\n\n  /**\n   * 支持 params 序列化\n   * @param config\n   */\n  supportParamsStringify(config: AxiosRequestConfig): AxiosRequestConfig {\n    const headers = config.headers || this.options.headers;\n    const contentType = headers?.['Content-Type'] || headers?.['content-type'];\n\n    if (contentType === ContentTypeEnum.FormURLEncoded || !Reflect.has(config, 'params')) {\n      return config;\n    }\n\n    return {\n      ...config,\n      paramsSerializer: (params: any) => stringify(params, { arrayFormat: 'brackets' }),\n    };\n  }\n\n  get<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {\n    return this.request({ ...config, method: 'GET' }, options);\n  }\n\n  post<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {\n    return this.request({ ...config, method: 'POST' }, options);\n  }\n\n  put<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {\n    return this.request({ ...config, method: 'PUT' }, options);\n  }\n\n  delete<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {\n    return this.request({ ...config, method: 'DELETE' }, options);\n  }\n\n  patch<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {\n    return this.request({ ...config, method: 'PATCH' }, options);\n  }\n\n  head<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {\n    return this.request({ ...config, method: 'HEAD' }, options);\n  }\n\n  /**\n   * 上传文件封装\n   * @param key 文件所属的key\n   * @param file 文件\n   * @param config 请求配置\n   * @param options\n   */\n  upload<T = any>(key: string, file: File, config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {\n    const params: FormData = config.params ?? new FormData();\n    params.append(key, file);\n\n    return this.request(\n      {\n        ...config,\n        method: 'POST',\n        headers: {\n          'Content-Type': ContentTypeEnum.FormData,\n        },\n        params,\n      },\n      options,\n    );\n  }\n\n  /**\n   * 请求封装\n   * @param config\n   * @param options\n   */\n  request<T = any>(config: AxiosRequestConfigRetry, options?: RequestOptions): Promise<T> {\n    const { requestOptions } = this.options;\n\n    if (requestOptions?.throttle !== undefined && requestOptions.debounce !== undefined) {\n      throw new Error('throttle and debounce cannot be set at the same time');\n    }\n\n    if (requestOptions?.throttle && requestOptions.throttle.delay !== 0) {\n      return new Promise((resolve) => {\n        throttle(() => resolve(this.synthesisRequest(config, options)), requestOptions.throttle?.delay as number);\n      });\n    }\n\n    if (requestOptions?.debounce && requestOptions.debounce.delay !== 0) {\n      return new Promise((resolve) => {\n        debounce(() => resolve(this.synthesisRequest(config, options)), requestOptions.debounce?.delay as number);\n      });\n    }\n\n    return this.synthesisRequest(config, options);\n  }\n\n  /**\n   * 请求方法\n   * @private\n   */\n  private async synthesisRequest<T = any>(config: AxiosRequestConfigRetry, options?: RequestOptions): Promise<T> {\n    let conf: CreateAxiosOptions = cloneDeep(config);\n    const transform = this.getTransform();\n\n    const { requestOptions } = this.options;\n\n    const opt: RequestOptions = { ...requestOptions, ...options };\n\n    const { beforeRequestHook, requestCatchHook, transformRequestHook } = transform || {};\n    if (beforeRequestHook && isFunction(beforeRequestHook)) {\n      conf = beforeRequestHook(conf, opt);\n    }\n    conf.requestOptions = opt;\n\n    conf = this.supportFormData(conf);\n    // 支持params数组参数格式化，因axios默认的toFormData即为brackets方式，无需配置paramsSerializer为qs，有需要可解除注释，参数参考qs文档\n    // conf = this.supportParamsStringify(conf);\n\n    return new Promise((resolve, reject) => {\n      this.instance\n        .request<any, AxiosResponse<Result>>(!config.retryCount ? conf : config)\n        .then((res: AxiosResponse<Result>) => {\n          if (transformRequestHook && isFunction(transformRequestHook)) {\n            try {\n              const ret = transformRequestHook(res, opt);\n              resolve(ret);\n            } catch (error) {\n              reject(error || new Error('请求错误!'));\n            }\n            return;\n          }\n          resolve(res as unknown as Promise<T>);\n        })\n        .catch((e: Error | AxiosError) => {\n          if (requestCatchHook && isFunction(requestCatchHook)) {\n            reject(requestCatchHook(e, opt));\n            return;\n          }\n          if (axios.isAxiosError(e)) {\n            // 在这里重写Axios的错误信息\n          }\n          reject(e);\n        });\n    });\n  }\n}\n"
  },
  {
    "path": "packages/shared/modules/request/axios/AxiosCancel.ts",
    "content": "import type { AxiosRequestConfig, Canceler } from 'axios';\nimport axios from 'axios';\nimport { isFunction } from 'es-toolkit';\n\n// 存储请求与取消令牌的键值对列表\nlet pendingMap = new Map<string, Canceler>();\n\n/**\n * 获取请求Url\n * @param config\n */\nexport const getPendingUrl = (config: AxiosRequestConfig) => [config.method, config.url].join('&');\n\n/**\n * @description 请求管理器\n */\nexport class AxiosCanceler {\n  /**\n   * 添加请求到列表中\n   * @param config\n   */\n  addPending(config: AxiosRequestConfig) {\n    this.removePending(config);\n    const url = getPendingUrl(config);\n    config.cancelToken =\n      config.cancelToken ||\n      new axios.CancelToken((cancel) => {\n        if (!pendingMap.has(url)) {\n          // 如果当前没有相同请求就添加\n          pendingMap.set(url, cancel);\n        }\n      });\n  }\n\n  /**\n   * 移除现有的所有请求\n   */\n  removeAllPending() {\n    pendingMap.forEach((cancel) => {\n      if (cancel && isFunction(cancel)) cancel();\n    });\n    pendingMap.clear();\n  }\n\n  /**\n   * 移除指定请求\n   * @param config\n   */\n  removePending(config: AxiosRequestConfig) {\n    const url = getPendingUrl(config);\n\n    if (pendingMap.has(url)) {\n      // If there is a current request identifier in pending,\n      // the current request needs to be cancelled and removed\n      const cancel = pendingMap.get(url);\n      if (cancel) cancel(url);\n      pendingMap.delete(url);\n    }\n  }\n\n  /**\n   * 重置\n   */\n  reset() {\n    pendingMap = new Map<string, Canceler>();\n  }\n}\n"
  },
  {
    "path": "packages/shared/modules/request/axios/AxiosTransform.ts",
    "content": "import type { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\n\nimport type { RequestOptions, Result } from '../type';\n\n/**\n * @description 创建Axios实例配置\n */\nexport interface CreateAxiosOptions extends AxiosRequestConfig {\n  /**\n   * 请求验证方案\n   *\n   * https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#authentication_schemes\n   */\n  authenticationScheme?: string;\n  /**\n   * 请求数据处理\n   */\n  transform?: AxiosTransform;\n  /**\n   * 请求配置\n   */\n  requestOptions?: RequestOptions;\n}\n\n/**\n * Axios请求数据处理 抽象类\n */\nexport abstract class AxiosTransform {\n  /**\n   * 请求前钩子\n   */\n  beforeRequestHook?: (config: AxiosRequestConfig, options: RequestOptions) => AxiosRequestConfig;\n\n  /**\n   * 数据处理前钩子\n   */\n  transformRequestHook?: <T = any>(res: AxiosResponse<Result>, options: RequestOptions) => T;\n\n  /**\n   * 请求失败钩子\n   */\n  requestCatchHook?: <T = any>(e: Error | AxiosError, options: RequestOptions) => Promise<T>;\n\n  /**\n   * 请求拦截器\n   */\n  requestInterceptors?: (config: AxiosRequestConfig, options: CreateAxiosOptions) => AxiosRequestConfig;\n\n  /**\n   * 响应拦截器\n   */\n  responseInterceptors?: (res: AxiosResponse) => AxiosResponse;\n\n  /**\n   * 请求拦截器错误处理\n   */\n  requestInterceptorsCatch?: (error: AxiosError) => void;\n\n  /**\n   * 响应拦截器错误处理\n   */\n  responseInterceptorsCatch?: (error: AxiosError, instance: AxiosInstance) => void;\n}\n"
  },
  {
    "path": "packages/shared/modules/request/constants.ts",
    "content": "export enum ContentTypeEnum {\n  Json = 'application/json;charset=UTF-8',\n  FormURLEncoded = 'application/x-www-form-urlencoded;charset=UTF-8',\n  FormData = 'multipart/form-data;charset=UTF-8',\n}\n"
  },
  {
    "path": "packages/shared/modules/request/index.ts",
    "content": "export * from './axios/Axios';\nexport * from './sse/Sse';\nexport * from './ws/Ws';\n"
  },
  {
    "path": "packages/shared/modules/request/sse/Sse.ts",
    "content": "import type { EventSourceMessage } from '@microsoft/fetch-event-source';\nimport { fetchEventSource } from '@microsoft/fetch-event-source';\nimport { cloneDeep, debounce, isFunction, throttle } from 'es-toolkit';\nimport { stringify } from 'qs';\n\nimport { ContentTypeEnum } from '../constants';\nimport type { RequestOptions } from '../type';\nimport { SseCanceler } from './SseCancel';\nimport type { ICreateSseInsOptions, ICreateSseOptions, ISseRequestConfig } from './SseTransform';\n\nexport class VSse {\n  canceler: SseCanceler;\n  private readonly options: ICreateSseInsOptions;\n\n  constructor(options: ICreateSseInsOptions) {\n    this.options = options;\n    this.canceler = new SseCanceler();\n  }\n\n  /**\n   * 获取数据处理类\n   * @private\n   */\n  private getTransform() {\n    const { transform } = this.options;\n    return transform;\n  }\n\n  /**\n   * 支持 FormData 请求格式\n   * @param config\n   */\n  supportFormData(config: ISseRequestConfig): ISseRequestConfig {\n    const headers = config.headers;\n    const contentType = headers?.['Content-Type'] || headers?.['content-type'];\n\n    if (\n      contentType !== ContentTypeEnum.FormURLEncoded ||\n      !Reflect.has(config, 'data') ||\n      config.method?.toUpperCase() === 'GET'\n    ) {\n      return config;\n    }\n\n    return {\n      ...config,\n      data: stringify(config.data, { arrayFormat: 'brackets' }),\n    };\n  }\n\n  /**\n   * 支持 params 序列化\n   * @param config\n   */\n  supportParamsStringify(config: ISseRequestConfig): ISseRequestConfig {\n    const headers = config.headers;\n    const contentType = headers?.['Content-Type'] || headers?.['content-type'];\n\n    if (contentType === ContentTypeEnum.FormURLEncoded || !Reflect.has(config, 'params')) {\n      return config;\n    }\n\n    return {\n      ...config,\n      // paramsSerializer: (params: any) => stringify(params, { arrayFormat: 'brackets' }),\n    };\n  }\n\n  get<T = any>(config: ISseRequestConfig, options?: RequestOptions): Promise<T> {\n    return this.request({ ...config, method: 'GET' }, options);\n  }\n\n  post<T = any>(config: ISseRequestConfig, options?: RequestOptions): Promise<T> {\n    return this.request({ ...config, method: 'POST' }, options);\n  }\n\n  /**\n   * 请求封装\n   * @param config\n   * @param options\n   */\n  request<T = any>(config: ISseRequestConfig, options?: RequestOptions): Promise<T> {\n    const { requestOptions } = this.options;\n\n    if (requestOptions?.throttle !== undefined && requestOptions.debounce !== undefined) {\n      throw new Error('throttle and debounce cannot be set at the same time');\n    }\n\n    if (requestOptions?.throttle && requestOptions.throttle.delay !== 0) {\n      return new Promise((resolve) => {\n        throttle(() => resolve(this.synthesisRequest(config, options)), requestOptions.throttle?.delay as number);\n      });\n    }\n\n    if (requestOptions?.debounce && requestOptions.debounce.delay !== 0) {\n      return new Promise((resolve) => {\n        debounce(() => resolve(this.synthesisRequest(config, options)), requestOptions.debounce?.delay as number);\n      });\n    }\n\n    return this.synthesisRequest(config, options);\n  }\n\n  private async synthesisRequest<T = any>(config: ISseRequestConfig, options?: RequestOptions): Promise<T> {\n    const { onMessage, onComplete, onAbort, onError, ...configRest } = config;\n\n    const transform = this.getTransform();\n\n    const { requestOptions } = this.options;\n    const opt = { ...requestOptions, ...options };\n\n    let conf: ICreateSseOptions = cloneDeep(configRest);\n\n    const {\n      beforeRequestHook,\n      requestCatchHook,\n      requestInterceptors,\n      transformRequestHook,\n      responseInterceptors,\n      responseInterceptorsCatch,\n    } = transform || {};\n\n    if (beforeRequestHook && isFunction(beforeRequestHook)) {\n      conf = beforeRequestHook(conf, opt);\n    }\n\n    conf.requestOptions = opt;\n    conf.method ||= 'GET';\n\n    conf.headers = {\n      ...(conf.headers || {}),\n    };\n\n    if (\n      conf.method.toUpperCase() !== 'GET' &&\n      (conf.headers?.['Content-Type'] === ContentTypeEnum.Json ||\n        conf.headers?.['content-type'] === ContentTypeEnum.Json) &&\n      conf.data &&\n      Object.keys(conf.data).length > 0\n    ) {\n      (conf as unknown as Omit<typeof conf, 'data'> & { data: string }).data = JSON.stringify(conf.data);\n    }\n\n    conf = this.supportFormData(conf);\n    // 支持params数组参数格式化，因axios默认的toFormData即为brackets方式，无需配置paramsSerializer为qs，有需要可解除注释，参数参考qs文档\n    // conf = this.supportParamsStringify(conf);\n\n    if (conf.params) conf.url += `?${new URLSearchParams(conf.params).toString()}`;\n\n    const canceler = this.canceler;\n    const controller = new AbortController();\n    controller.signal.onabort = () => {\n      canceler.removePending(conf);\n      onAbort?.();\n    };\n\n    const { ignoreCancelToken } = conf.requestOptions!;\n    const ignoreCancel = ignoreCancelToken ?? this.options.requestOptions?.ignoreCancelToken;\n    if (!ignoreCancel) canceler.addPending({ ...conf, signal: controller });\n    if (requestInterceptors && isFunction(requestInterceptors)) {\n      conf = requestInterceptors(conf, opt);\n    }\n\n    const startTime = Date.now();\n\n    return new Promise((resolve, reject) => {\n      fetchEventSource(conf.url, {\n        method: conf.method,\n        headers: conf.headers,\n        body: conf.method !== 'GET' ? (conf.data as BodyInit) : undefined,\n        signal: controller.signal,\n        async onopen(response: Response): Promise<void> {\n          if (conf.timeout && Date.now() - startTime > conf.timeout) {\n            canceler.removePending(conf);\n            reject(new Error('Request timeout'));\n          }\n\n          if (!response.ok) {\n            if (requestCatchHook && isFunction(requestCatchHook)) {\n              requestCatchHook(response.statusText, opt);\n            }\n            reject(new Error(`Request failed with status ${response.status}`));\n          }\n\n          resolve({ abort: () => controller.abort() } as unknown as T);\n        },\n        onmessage(event: EventSourceMessage): void {\n          let chunk = event;\n\n          try {\n            if (transformRequestHook && isFunction(transformRequestHook)) {\n              chunk = transformRequestHook(chunk, opt);\n            }\n\n            if (responseInterceptors && isFunction(responseInterceptors)) {\n              chunk = responseInterceptors(chunk);\n            }\n          } catch {}\n\n          onMessage?.(chunk);\n        },\n        onerror(error: Error): void {\n          let err: Error = error;\n\n          // 1. response interceptor\n          if (responseInterceptorsCatch && isFunction(responseInterceptorsCatch)) {\n            try {\n              responseInterceptorsCatch(error);\n            } catch (e) {\n              err = e as Error;\n            }\n          }\n\n          // 2. user onError hook\n          if (onError && isFunction(onError)) {\n            try {\n              onError(err);\n            } catch {}\n          }\n\n          reject(err);\n          throw err; // Needed to stop the fetchEventSource retrying\n        },\n        onclose(): void {\n          canceler.removePending(conf);\n          onComplete?.(controller.signal.aborted === true, conf);\n        },\n      });\n    });\n  }\n}\n"
  },
  {
    "path": "packages/shared/modules/request/sse/SseCancel.ts",
    "content": "import { isFunction } from 'es-toolkit';\n\n// 存储请求与取消令牌的键值对列表\nlet pendingMap = new Map<string, AbortController>();\n\n/**\n * 获取请求Url\n * @param config\n */\nexport const getPendingUrl = (config: Record<string, string>) => [config.method, config.url].join('&');\n\n/**\n * @description 请求管理器\n */\nexport class SseCanceler {\n  /**\n   * 添加请求到列表中\n   * @param config\n   */\n  addPending(config: Record<string, any>) {\n    this.removePending(config);\n    const url = getPendingUrl(config);\n    config.signal = config.signal || new AbortController();\n    if (!pendingMap.has(url)) {\n      // 如果当前没有相同请求就添加\n      pendingMap.set(url, config.signal);\n    }\n  }\n\n  /**\n   * 移除现有的所有请求\n   */\n  removeAllPending() {\n    pendingMap.forEach((cancel) => {\n      if (cancel && isFunction(cancel)) cancel.abort();\n    });\n    pendingMap.clear();\n  }\n\n  /**\n   * 移除指定请求\n   * @param config\n   */\n  removePending(config: Record<string, any>) {\n    const url = getPendingUrl(config);\n\n    if (pendingMap.has(url)) {\n      // If there is a current request identifier in pending,\n      // the current request needs to be cancelled and removed\n      const cancel = pendingMap.get(url);\n      if (cancel) cancel.abort();\n      pendingMap.delete(url);\n    }\n  }\n\n  /**\n   * 重置\n   */\n  reset() {\n    pendingMap = new Map<string, AbortController>();\n  }\n}\n"
  },
  {
    "path": "packages/shared/modules/request/sse/SseTransform.ts",
    "content": "import type { EventSourceMessage } from '@microsoft/fetch-event-source';\n\nimport type { RequestOptions } from '../type';\n\nexport interface ICreateSseParamsOptions {\n  url: string;\n  method: 'GET' | 'POST';\n  timeout?: number;\n  params?: Record<string, any>;\n  data?: Record<string, any>;\n  headers?: Record<string, any>;\n}\n\nexport interface ICreateSseCallbackOptions {\n  onAbort?: () => void;\n  onComplete?: (aborted: boolean, config: ICreateSseParamsOptions) => void;\n  onError?: (error: Error) => void;\n  onMessage?: (event: EventSourceMessage) => void;\n}\n\nexport type ISseRequestConfig = ICreateSseParamsOptions & ICreateSseCallbackOptions;\n\nexport type ICreateSseOptions = ICreateSseInsOptions & ICreateSseParamsOptions;\n\n/**\n * @description 创建Sse实例配置\n */\nexport interface ICreateSseInsOptions {\n  /**\n   * 请求验证方案\n   *\n   * https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#authentication_schemes\n   */\n  authenticationScheme?: string;\n  /**\n   * 请求数据处理\n   */\n  transform?: ISseTransform;\n  /**\n   * 请求配置\n   */\n  requestOptions?: RequestOptions;\n}\n\n/**\n * Sse请求数据处理 抽象类\n */\nexport abstract class ISseTransform {\n  /**\n   * 请求前钩子\n   */\n  beforeRequestHook?: (config: ICreateSseParamsOptions, options: RequestOptions) => ISseRequestConfig;\n\n  /**\n   * 数据处理前钩子\n   */\n  transformRequestHook?: <T = any>(res, options: RequestOptions) => T;\n\n  /**\n   * 请求失败钩子\n   */\n  requestCatchHook?: <T = any>(error: string, options: RequestOptions) => Promise<T>;\n\n  /**\n   * 请求拦截器\n   */\n  requestInterceptors?: (config: ICreateSseParamsOptions, options: RequestOptions) => ISseRequestConfig;\n\n  /**\n   * 响应拦截器\n   */\n  responseInterceptors?: (res) => any;\n\n  /**\n   * 请求拦截器错误处理\n   */\n  requestInterceptorsCatch?: (error: Error) => void;\n\n  /**\n   * 响应拦截器错误处理\n   */\n  responseInterceptorsCatch?: (error: Error) => void;\n}\n"
  },
  {
    "path": "packages/shared/modules/request/type.ts",
    "content": "import type { AxiosRequestConfig } from 'axios';\n\n/**\n * 请求配置\n */\nexport interface RequestOptions {\n  /**\n   * 接口地址\n   *\n   * 例: http://www.baidu.com/api\n   */\n  apiUrl?: string;\n  /**\n   * 是否自动添加接口前缀\n   *\n   * 例: http://www.baidu.com/api\n   * urlPrefix: 'api'\n   */\n  isJoinPrefix?: boolean;\n  /**\n   * 接口前缀\n   */\n  urlPrefix?: string;\n  /**\n   * POST请求的时候添加参数到Url中\n   */\n  joinParamsToUrl?: boolean;\n  /**\n   * 格式化提交参数时间\n   */\n  formatDate?: boolean;\n  /**\n   * 是否需要对响应数据进行处理\n   */\n  isTransformResponse?: boolean;\n  /**\n   * 是否返回原生响应头\n   *\n   * 例: 需要获取响应头时使用该属性\n   */\n  isReturnNativeResponse?: boolean;\n  /**\n   * 是否忽略请求取消令牌\n   *\n   * 如果启用，则重复请求时不进行处理\n   *\n   * 如果禁用，则重复请求时会取消当前请求\n   */\n  ignoreCancelToken?: boolean;\n  /**\n   * 自动对请求添加时间戳参数\n   */\n  joinTime?: boolean;\n  /**\n   * 是否携带Token\n   */\n  withToken?: boolean;\n  /**\n   * 重试配置\n   */\n  retry?: {\n    /**\n     * 重试次数\n     */\n    count: number;\n    /**\n     * 隔多久重试\n     *\n     * 单位: 毫秒\n     */\n    delay: number;\n  };\n  /**\n   * 接口级节流\n   *\n   * 单位: 毫秒\n   */\n  throttle?: {\n    delay: number;\n  };\n  /**\n   * 接口级防抖\n   *\n   * 单位: 毫秒\n   */\n  debounce?: {\n    delay: number;\n  };\n}\n\nexport interface Result<T = any> {\n  code: number;\n  data: T;\n}\n\nexport interface AxiosRequestConfigRetry extends AxiosRequestConfig {\n  retryCount?: number;\n}\n"
  },
  {
    "path": "packages/shared/modules/request/utils.ts",
    "content": "import { isObject, isString } from '../validate';\n\nconst DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';\n\nexport function joinTimestamp<T extends boolean>(join: boolean, restful: T): T extends true ? string : object;\n\nexport function joinTimestamp(join: boolean, restful = false): string | object {\n  if (!join) {\n    return restful ? '' : {};\n  }\n  const now = Date.now();\n  if (restful) {\n    return `?_t=${now}`;\n  }\n  return { _t: now };\n}\n\n// 格式化提交参数时间\nexport function formatRequestDate(params: any) {\n  if (Object.prototype.toString.call(params) !== '[object Object]') {\n    return;\n  }\n\n  for (const key in params) {\n    if (params[key] && params[key]._isAMomentObject) {\n      params[key] = params[key].format(DATE_TIME_FORMAT);\n    }\n    if (isString(key)) {\n      const value = params[key];\n      if (value) {\n        try {\n          params[key] = isString(value) ? value.trim() : value;\n        } catch (error: any) {\n          throw new Error(error);\n        }\n      }\n    }\n    if (isObject(params[key])) {\n      formatRequestDate(params[key]);\n    }\n  }\n}\n\n// 将对象转为Url参数\nexport function setObjToUrlParams(baseUrl: string, obj: { [index: string]: any }): string {\n  let parameters = '';\n  for (const key in obj) {\n    parameters += `${key}=${encodeURIComponent(obj[key])}&`;\n  }\n  parameters = parameters.replace(/&$/, '');\n  return /\\?$/.test(baseUrl) ? baseUrl + parameters : baseUrl.replace(/\\/?$/, '?') + parameters;\n}\n"
  },
  {
    "path": "packages/shared/modules/request/ws/Ws.ts",
    "content": "import { cloneDeep, debounce, isFunction, throttle } from 'es-toolkit';\nimport WebSocket from 'isomorphic-ws';\n\nimport type { RequestOptions } from '../type';\nimport { WsCanceler } from './WsCancel';\nimport type { ICreateWsInsOptions, ICreateWsOptions, IWsRequestConfig } from './WsTransform';\nimport { WsCloseCodeReasonMap } from './WsTransform';\n\nexport class VWs {\n  canceler: WsCanceler;\n  private readonly options: ICreateWsInsOptions;\n\n  constructor(options: ICreateWsInsOptions) {\n    this.options = options;\n    this.canceler = new WsCanceler();\n  }\n\n  /**\n   * 获取数据处理类\n   * @private\n   */\n  private getTransform() {\n    const { transform } = this.options;\n    return transform;\n  }\n\n  get<T = any>(config: IWsRequestConfig, options?: RequestOptions): Promise<T> {\n    return this.request({ ...config, method: 'GET' }, options);\n  }\n\n  /**\n   * 请求封装\n   * @param config\n   * @param options\n   */\n  request<T = any>(config: IWsRequestConfig, options?: RequestOptions): Promise<T> {\n    const { requestOptions } = this.options;\n\n    if (requestOptions?.throttle !== undefined && requestOptions.debounce !== undefined) {\n      throw new Error('throttle and debounce cannot be set at the same time');\n    }\n\n    if (requestOptions?.throttle && requestOptions.throttle.delay !== 0) {\n      return new Promise((resolve) => {\n        throttle(() => resolve(this.synthesisRequest(config, options)), requestOptions.throttle?.delay as number);\n      });\n    }\n\n    if (requestOptions?.debounce && requestOptions.debounce.delay !== 0) {\n      return new Promise((resolve) => {\n        debounce(() => resolve(this.synthesisRequest(config, options)), requestOptions.debounce?.delay as number);\n      });\n    }\n\n    return this.synthesisRequest(config, options);\n  }\n\n  private async synthesisRequest<T = any>(config: IWsRequestConfig, options?: RequestOptions): Promise<T> {\n    const { onConnected, onDisconnected, onMessage, onError, ...configRest } = config;\n\n    const transform = this.getTransform();\n\n    const { requestOptions } = this.options;\n    const opt = { ...requestOptions, ...options };\n\n    let conf: ICreateWsOptions = cloneDeep(configRest);\n\n    const {\n      beforeRequestHook,\n      requestCatchHook,\n      requestInterceptors,\n      transformRequestHook,\n      responseInterceptors,\n      responseInterceptorsCatch,\n    } = transform || {};\n\n    if (beforeRequestHook && isFunction(beforeRequestHook)) {\n      conf = beforeRequestHook(conf, opt);\n    }\n\n    conf.requestOptions = opt;\n    conf.method ||= 'GET';\n\n    conf.headers = {\n      ...(conf.headers || {}),\n    };\n\n    if (conf.params) conf.url += `?${new URLSearchParams(conf.params).toString()}`;\n\n    let aborted = false;\n    const canceler = this.canceler;\n    const controller = new AbortController();\n    controller.signal.onabort = () => {\n      if (aborted) return;\n      aborted = true;\n      stopHeartbeat();\n      ws?.close();\n      canceler.removePending(conf);\n    };\n\n    const { ignoreCancelToken } = conf.requestOptions;\n    const ignoreCancel = ignoreCancelToken ?? this.options.requestOptions?.ignoreCancelToken;\n    if (!ignoreCancel) canceler.addPending({ ...conf, signal: controller });\n    if (requestInterceptors && isFunction(requestInterceptors)) {\n      conf = requestInterceptors(conf, opt);\n    }\n\n    let ws: WebSocket;\n    let reconnectCount: number = 0;\n\n    const heartbeatCfg =\n      typeof conf?.heartbeat === 'object'\n        ? {\n            message: conf.heartbeat.message ?? 'ping',\n            responseMessage: conf.heartbeat.responseMessage ?? conf.heartbeat.message ?? 'ping',\n            interval: conf.heartbeat.interval ?? 1000,\n            pongTimeout: conf.heartbeat.pongTimeout ?? 1000,\n          }\n        : conf?.heartbeat\n          ? {\n              message: 'ping',\n              responseMessage: 'ping',\n              interval: 1000,\n              pongTimeout: 1000,\n            }\n          : null;\n\n    let heartbeatTimer: NodeJS.Timeout | null = null;\n    let pongTimer: NodeJS.Timeout | null = null;\n\n    const startHeartbeat = () => {\n      if (!heartbeatCfg) return;\n      stopHeartbeat();\n      heartbeatTimer = setInterval(() => {\n        if (!ws || ws.readyState !== WebSocket.OPEN) return;\n        ws.send(heartbeatCfg.message as any);\n        pongTimer = setTimeout(() => ws.close(), heartbeatCfg.pongTimeout);\n      }, heartbeatCfg.interval);\n    };\n\n    const stopHeartbeat = () => {\n      heartbeatTimer && clearInterval(heartbeatTimer);\n      pongTimer && clearTimeout(pongTimer);\n      heartbeatTimer = pongTimer = null;\n    };\n\n    const autoReconnectCfg =\n      typeof conf?.autoReconnect === 'object'\n        ? conf.autoReconnect\n        : conf?.autoReconnect\n          ? { retries: -1, delay: 1000 }\n          : null;\n\n    const canReconnect = () => {\n      if (!autoReconnectCfg) return false;\n      if (typeof autoReconnectCfg.retries === 'function') {\n        return autoReconnectCfg.retries(reconnectCount);\n      }\n      if (typeof autoReconnectCfg.retries === 'number') {\n        return autoReconnectCfg.retries < 0 || reconnectCount < autoReconnectCfg.retries;\n      }\n      return true;\n    };\n\n    const getReconnectDelay = () => {\n      if (typeof autoReconnectCfg?.delay === 'function') {\n        return autoReconnectCfg.delay(reconnectCount);\n      }\n      return autoReconnectCfg?.delay ?? 1000;\n    };\n\n    if (!conf.requestOptions?.ignoreCancelToken) {\n      this.canceler.addPending({\n        ...conf,\n        abort: () => {\n          stopHeartbeat();\n          ws?.close();\n        },\n      });\n    }\n\n    const connect = (): Promise<T> => {\n      return new Promise((resolve, reject) => {\n        const socket = new WebSocket(conf.url);\n\n        socket.onopen = (_event: WebSocket.Event): void => {\n          reconnectCount = 0;\n          onConnected?.(socket);\n          startHeartbeat();\n\n          resolve(socket as unknown as T);\n        };\n\n        socket.onmessage = (event: WebSocket.MessageEvent): void => {\n          if (heartbeatCfg && event.data === heartbeatCfg.responseMessage) {\n            pongTimer && clearTimeout(pongTimer);\n            return;\n          }\n\n          let packet = event;\n\n          try {\n            if (transformRequestHook && isFunction(transformRequestHook)) {\n              packet = transformRequestHook(packet, opt);\n            }\n\n            if (responseInterceptors && isFunction(responseInterceptors)) {\n              packet = responseInterceptors(packet);\n            }\n          } catch {}\n\n          onMessage?.(socket, packet);\n        };\n\n        socket.onerror = (event: WebSocket.ErrorEvent): void => {\n          let err: Error = new Error('WebSocket error occurred');\n\n          // 1. response interceptor\n          if (responseInterceptorsCatch && isFunction(responseInterceptorsCatch)) {\n            try {\n              responseInterceptorsCatch(event);\n            } catch (e) {\n              err = e as Error;\n            }\n          }\n\n          // 2. user onError hook\n          if (onError && isFunction(onError)) {\n            try {\n              onError?.(socket, err);\n            } catch {}\n          }\n        };\n\n        socket.onclose = (event: WebSocket.CloseEvent): void => {\n          stopHeartbeat();\n          canceler.removePending(conf);\n          onDisconnected?.(socket, event);\n\n          if (!aborted && canReconnect()) {\n            reconnectCount++;\n            setTimeout(async () => {\n              ws = (await connect()) as WebSocket;\n            }, getReconnectDelay());\n          }\n\n          if (!event.wasClean && !canReconnect()) {\n            if (requestCatchHook && isFunction(requestCatchHook)) {\n              requestCatchHook(event, opt);\n            }\n            const reason = WsCloseCodeReasonMap?.[event.code] || 'WebSocket disconnected unexpectedly';\n            reject(new Error(reason));\n          }\n        };\n      });\n    };\n\n    ws = (await connect()) as WebSocket;\n\n    return ws as unknown as Promise<T>;\n  }\n}\n"
  },
  {
    "path": "packages/shared/modules/request/ws/WsCancel.ts",
    "content": "import { isFunction } from 'es-toolkit';\n\n// 存储请求与取消令牌的键值对列表\nlet pendingMap = new Map<string, AbortController>();\n\n/**\n * 获取请求Url\n * @param config\n */\nexport const getPendingUrl = (config: Record<string, string>) => [config.method, config.url].join('&');\n\n/**\n * @description 请求管理器\n */\nexport class WsCanceler {\n  /**\n   * 添加请求到列表中\n   * @param config\n   */\n  addPending(config: Record<string, any>) {\n    this.removePending(config);\n    const url = getPendingUrl(config);\n    config.signal = config.signal || new AbortController();\n    if (!pendingMap.has(url)) {\n      // 如果当前没有相同请求就添加\n      pendingMap.set(url, config.signal);\n    }\n  }\n\n  /**\n   * 移除现有的所有请求\n   */\n  removeAllPending() {\n    pendingMap.forEach((cancel) => {\n      if (cancel && isFunction(cancel)) cancel.abort();\n    });\n    pendingMap.clear();\n  }\n\n  /**\n   * 移除指定请求\n   * @param config\n   */\n  removePending(config: Record<string, any>) {\n    const url = getPendingUrl(config);\n\n    if (pendingMap.has(url)) {\n      // If there is a current request identifier in pending,\n      // the current request needs to be cancelled and removed\n      const cancel = pendingMap.get(url);\n      if (cancel) cancel.abort();\n      pendingMap.delete(url);\n    }\n  }\n\n  /**\n   * 重置\n   */\n  reset() {\n    pendingMap = new Map<string, AbortController>();\n  }\n}\n"
  },
  {
    "path": "packages/shared/modules/request/ws/WsTransform.ts",
    "content": "import type WebSocket from 'isomorphic-ws';\n\nimport type { RequestOptions } from '../type';\n\nexport const WsCloseCodeReasonMap: Record<number, string> = {\n  1000: 'Normal Closure',\n  1001: 'Going Away',\n  1002: 'Protocol Error',\n  1003: 'Unsupported Data',\n\n  1005: 'No Status Received (client-side)',\n  1006: 'Abnormal Closure (no close frame)',\n\n  1007: 'Invalid Payload Data',\n  1008: 'Policy Violation',\n  1009: 'Message Too Big',\n  1010: 'Mandatory Extension Missing',\n  1011: 'Internal Server Error',\n\n  1012: 'Service Restart',\n  1013: 'Try Again Later',\n  1014: 'Bad Gateway',\n  1015: 'TLS Handshake Failure',\n};\n\nexport type IWebSocketHeartbeatMessage = string | ArrayBuffer | Blob;\n\nexport interface ICreateWsParamsOptions {\n  url: string;\n  method: 'GET';\n  params?: Record<string, any>;\n  data?: Record<string, any>;\n  headers?: Record<string, any>;\n  /**\n   * Send heartbeat for every x milliseconds passed\n   *\n   * @default false\n   */\n  heartbeat?:\n    | boolean\n    | {\n        /**\n         * Message for the heartbeat\n         *\n         * @default 'ping'\n         */\n        message?: IWebSocketHeartbeatMessage;\n        /**\n         * Response message for the heartbeat, if undefined the message will be used\n         */\n        responseMessage?: IWebSocketHeartbeatMessage;\n        /**\n         * Interval, in milliseconds\n         *\n         * @default 1000\n         */\n        interval?: number;\n        /**\n         * Heartbeat response timeout, in milliseconds\n         *\n         * @default 1000\n         */\n        pongTimeout?: number;\n      };\n  /**\n   * Enabled auto reconnect\n   *\n   * @default false\n   */\n  autoReconnect?:\n    | boolean\n    | {\n        /**\n         * Maximum retry times.\n         *\n         * Or you can pass a predicate function (which returns true if you want to retry).\n         *\n         * @default -1\n         */\n        retries?: number | ((retried: number) => boolean);\n        /**\n         * Delay for reconnect, in milliseconds\n         *\n         * Or you can pass a function to calculate the delay based on the number of retries.\n         *\n         * @default 1000\n         */\n        delay?: number | ((retries: number) => number);\n      };\n}\n\nexport interface ICreateWsCallbackOptions {\n  onConnected?: (ws: WebSocket) => void;\n  onDisconnected?: (ws: WebSocket, event: WebSocket.CloseEvent) => void;\n  onError?: (ws: WebSocket, error: Error) => void;\n  onMessage?: (ws: WebSocket, event: WebSocket.MessageEvent) => void;\n}\n\nexport type IWsRequestConfig = ICreateWsParamsOptions & ICreateWsCallbackOptions;\n\nexport type ICreateWsOptions = ICreateWsInsOptions & ICreateWsParamsOptions;\n\n/**\n * @description 创建Ws实例配置\n */\nexport interface ICreateWsInsOptions {\n  /**\n   * 请求验证方案\n   *\n   * https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#authentication_schemes\n   */\n  authenticationScheme?: string;\n  /**\n   * 请求数据处理\n   */\n  transform?: IWsTransform;\n  /**\n   * 请求配置\n   */\n  requestOptions?: RequestOptions;\n}\n\n/**\n * Ws请求数据处理 抽象类\n */\nexport abstract class IWsTransform {\n  /**\n   * 请求前钩子\n   */\n  beforeRequestHook?: (config: ICreateWsParamsOptions, options: RequestOptions) => IWsRequestConfig;\n\n  /**\n   * 数据处理前钩子\n   */\n  transformRequestHook?: <T = any>(res, options: RequestOptions) => T;\n\n  /**\n   * 请求失败钩子\n   */\n  requestCatchHook?: <T = any>(error, options: RequestOptions) => Promise<T>;\n\n  /**\n   * 请求拦截器\n   */\n  requestInterceptors?: (config: ICreateWsParamsOptions, options: RequestOptions) => IWsRequestConfig;\n\n  /**\n   * 响应拦截器\n   */\n  responseInterceptors?: (res) => any;\n\n  /**\n   * 请求拦截器错误处理\n   */\n  requestInterceptorsCatch?: (error: WebSocket.ErrorEvent) => void;\n\n  /**\n   * 响应拦截器错误处理\n   */\n  responseInterceptorsCatch?: (error: WebSocket.ErrorEvent) => void;\n}\n"
  },
  {
    "path": "packages/shared/modules/schedule.ts",
    "content": "/**\n * Schedule option interface\n */\nexport interface RegisterScheduleOption {\n  name: string;\n  fun: () => void;\n  interval: number;\n  immediate?: boolean;\n  [key: string]: any;\n}\n\n/**\n * Schedule interface\n */\nexport interface Schedule extends RegisterScheduleOption {\n  isRunning?: boolean;\n  instance?: any;\n}\n\n/**\n * Schedule manager class (Singleton)\n */\nexport class ScheduleManager {\n  private static instance: ScheduleManager;\n  private schedules: Map<string, Schedule>;\n\n  private constructor() {\n    this.schedules = new Map<string, Schedule>();\n  }\n\n  /**\n   * Get singleton instance\n   */\n  public static getInstance(): ScheduleManager {\n    if (!ScheduleManager.instance) {\n      ScheduleManager.instance = new ScheduleManager();\n    }\n    return ScheduleManager.instance;\n  }\n\n  /**\n   * Register a new schedule\n   * @param schedule Schedule options\n   * @returns Schedule object\n   */\n  public registerSchedule(schedule: RegisterScheduleOption): Schedule {\n    if (this.hasSchedule(schedule.name)) {\n      const thisSchedule = this.getSchedule(schedule.name);\n      if (thisSchedule?.isRunning) {\n        this.stopSchedule(schedule.name);\n      }\n    }\n\n    this.schedules.set(schedule.name, schedule);\n    this.runSchedule(schedule.name);\n\n    return schedule;\n  }\n\n  /**\n   * Check if a schedule exists\n   * @param name Schedule name\n   * @returns Whether the schedule exists\n   */\n  public hasSchedule(name: string): boolean {\n    return this.schedules.has(name);\n  }\n\n  /**\n   * Get a schedule by name\n   * @param name Schedule name\n   * @returns Schedule object or undefined\n   */\n  public getSchedule(name: string): Schedule | undefined {\n    return this.schedules.get(name);\n  }\n\n  /**\n   * Check if a schedule is running\n   * @param name Schedule name\n   * @returns Whether the schedule is running\n   */\n  public isRunningSchedule(name: string): boolean {\n    return !!this.schedules.get(name)?.isRunning;\n  }\n\n  /**\n   * Run a schedule\n   * @param name Schedule name\n   */\n  public runSchedule(name: string): void {\n    const schedule = this.getSchedule(name);\n    if (!schedule) {\n      return;\n    }\n\n    const { isRunning, instance, immediate, fun, interval } = schedule;\n    if (isRunning && instance) {\n      instance.clear();\n    }\n    if (immediate) {\n      fun();\n    }\n    this.schedules.set(name, {\n      ...schedule,\n      instance: this.createInterval(() => {\n        fun();\n      }, interval),\n      isRunning: true,\n    });\n  }\n\n  /**\n   * Stop a schedule\n   * @param name Schedule name\n   */\n  public stopSchedule(name: string): void {\n    if (this.hasSchedule(name)) {\n      const thisSchedule = this.getSchedule(name);\n      if (thisSchedule?.instance) {\n        thisSchedule.instance.clear();\n        this.schedules.set(name, {\n          ...thisSchedule,\n          instance: null,\n          isRunning: false,\n        });\n      }\n    }\n  }\n\n  /**\n   * Clear a schedule\n   * @param name Schedule name\n   */\n  public clearSchedule(name: string): void {\n    if (this.hasSchedule(name)) {\n      const thisSchedule = this.getSchedule(name);\n      if (thisSchedule?.instance) {\n        thisSchedule.instance.clear();\n      }\n      this.schedules.delete(name);\n    }\n  }\n\n  /**\n   * Clear all schedules\n   */\n  public clearAllSchedules(): void {\n    const schedulesArray = [...this.schedules.values()];\n    schedulesArray.forEach((schedule) => {\n      if (schedule.instance) {\n        schedule.instance.clear();\n      }\n    });\n    this.schedules.clear();\n  }\n\n  /**\n   * Get all schedules\n   * @returns Map of all schedules\n   */\n  public getAllSchedules(): Map<string, Schedule> {\n    return this.schedules;\n  }\n\n  /**\n   * Create an interval with better control than setInterval\n   * @param callback Callback function\n   * @param delay Delay in milliseconds\n   * @returns Interval object with clear method\n   */\n  private createInterval(callback: () => void, delay: number) {\n    let timeoutId = setTimeout(function repeat() {\n      callback();\n      timeoutId = setTimeout(repeat, delay);\n    }, delay);\n\n    return {\n      clear() {\n        clearTimeout(timeoutId);\n      },\n    };\n  }\n}\n\nexport const scheduleManager = ScheduleManager.getInstance();\n"
  },
  {
    "path": "packages/shared/modules/singleton.ts",
    "content": "export const singleton = <T extends new (...args: any[]) => any>(className: T): T => {\n  let instance: InstanceType<T> | null = null;\n  const proxy = new Proxy(className, {\n    construct(target, args) {\n      if (!instance) {\n        instance = Reflect.construct(target, args);\n      }\n      return instance as InstanceType<T>;\n    },\n  });\n  proxy.prototype.construct = proxy;\n  return proxy;\n};\n\nexport default singleton;\n"
  },
  {
    "path": "packages/shared/modules/size.ts",
    "content": "import { isPositiveFiniteNumber } from './validate';\n\nexport type ISizeUnit = 'B' | 'KB' | 'MB' | 'GB' | 'TB';\n\nexport interface ISizeOption {\n  unit?: ISizeUnit | 'auto';\n  increment?: number;\n  decimal?: number;\n}\n\nconst UNITS: ISizeUnit[] = ['B', 'KB', 'MB', 'GB', 'TB'];\n\n/**\n * Converts a byte count into a scaled value with a unit label (e.g. KB, MB, GB).\n * Automatically remove meaningless tail zeros.\n *\n * @param {number} bytes - The number of bytes.\n * @param {ISizeOption} options - Configuration options.\n * @returns {{ count: number, unit: string }} Scaled value and its corresponding unit.\n *\n * @example\n * ```javascript\n * calculateSize(512); // => { count: 512.00, unit: 'B' }\n * calculateSize(1500); // => { count: 1.50, unit: 'KB' }\n * calculateSize(1048576); // => { count: 1.05, unit: 'MB' }\n * calculateSize(5368709120); // => { count: 5.37, unit: 'GB' }\n * calculateSize(1048576, { unit: 'KB' }); // => { count: 1024.00, unit: 'KB' }\n * calculateSize(3018576, { unit: 'MB', decimal: 1, increment: 1024 }); // => { count: 2.9, unit: 'MB' }\n * ```\n */\nexport function calculateSize(bytes: number, options: ISizeOption = {}): { count: number; unit: ISizeUnit } {\n  if (!isPositiveFiniteNumber(bytes)) {\n    return { count: 0, unit: 'B' };\n  }\n\n  const { unit = 'auto', increment = 1000, decimal = 2 } = options;\n\n  let targetIndex = 0;\n\n  if (unit === 'auto' || !UNITS.includes(unit)) {\n    // Auto-scale: find the appropriate unit\n    while (bytes >= increment && targetIndex < UNITS.length - 1) {\n      bytes /= increment;\n      targetIndex++;\n    }\n  } else {\n    // Fixed unit: convert to specified unit\n    targetIndex = UNITS.indexOf(unit as ISizeUnit);\n    if (targetIndex === -1) {\n      targetIndex = 0; // Fallback to bytes for invalid unit\n    }\n\n    // Scale down to target unit\n    for (let i = 0; i < targetIndex; i++) {\n      bytes /= increment;\n    }\n  }\n\n  const round = 10 * decimal;\n  const count = Math.round(bytes * round) / round;\n\n  return { count, unit: UNITS[targetIndex] };\n}\n"
  },
  {
    "path": "packages/shared/modules/toString.ts",
    "content": "import JSON5 from 'json5';\n\nimport { isBoolean, isDate, isFunction, isJson, isMap, isNil, isNumber, isSet, isString, isSymbol } from './validate';\n\nexport const toString = (value: unknown): string => {\n  if (isNil(value)) {\n    return '';\n  }\n\n  if (isString(value)) {\n    return value;\n  }\n\n  if (isNumber(value)) {\n    if (typeof value === 'bigint') {\n      return `${value.toString()}n`;\n    } else if (typeof value === 'number') {\n      return String(value);\n    }\n  }\n\n  if (isBoolean(value)) return value ? 'true' : 'false';\n\n  if (isSymbol(value) || isFunction(value)) {\n    return value.toString();\n  }\n\n  if (typeof value === 'object') {\n    try {\n      if (isDate(value)) return value.toISOString();\n      if (isMap(value)) return JSON5.stringify(Object.fromEntries(value));\n      if (isSet(value)) return JSON5.stringify([...value]);\n      if (isJson(value)) return JSON5.stringify(value);\n      return JSON5.stringify(value);\n    } catch {\n      return '[object Object]';\n    }\n  }\n\n  try {\n    return value?.toString?.() ?? '';\n  } catch {\n    return '';\n  }\n};\n"
  },
  {
    "path": "packages/shared/modules/validate.ts",
    "content": "import {\n  isArrayBuffer,\n  isBoolean,\n  isBuffer,\n  isJSONArray,\n  isJSONObject,\n  isJSONValue,\n  isMap,\n  isNil,\n  isSet,\n  isString,\n  isTypedArray,\n} from 'es-toolkit';\nimport JSON5 from 'json5';\n\n/**\n * Export typeof validation function directly from es-toolkit\n */\nexport {\n  isBoolean,\n  isDate,\n  isFunction,\n  isMap,\n  isNil,\n  isNull,\n  isSet,\n  isString,\n  isSymbol,\n  isUndefined,\n} from 'es-toolkit';\n\n/**\n * Check if value is a valid number\n * @param value - Value to check\n * @returns Returns true if it's a valid number, otherwise false\n */\nexport function isNumber(value: unknown): boolean {\n  return typeof value === 'number' || typeof value === 'bigint';\n}\n\n/**\n * Check if value is a valid integer\n * @param value - Value to check\n * @returns Returns true if it's a valid integer, otherwise false\n */\nexport function isIntNumber(value: unknown): boolean {\n  if (!isNumber(value)) return false;\n  if (typeof value === 'bigint') return true; // bigint is always an integer\n  return Number.isInteger(value) && !Number.isNaN(value);\n}\n\n/**\n * Check if value is a finite integer\n * @param value - Value to check\n * @returns Returns true if value is a finite integer, otherwise false\n */\nexport function isFiniteNumber(value: unknown): boolean {\n  if (!isNumber(value)) return false;\n  if (typeof value === 'bigint') return true; // bigint is always finite\n  return Number.isFinite(value);\n}\n\n/**\n * Check if value is a positive finite integer\n * @param value - Value to check\n * @returns Returns true if value is a finite integer, otherwise false\n */\nexport function isPositiveFiniteNumber(value: unknown): boolean {\n  return isFiniteNumber(value) && (value as number) >= 0;\n}\n\n/**\n * Check if value is a valid permission number\n * @param value - Value to check\n * @returns Returns true if value is a valid permission number, otherwise false\n */\nexport function isPermissionNumber(value: unknown): boolean {\n  if (!/^[0-7]+$/.test(String(value))) return false;\n  return (value as number) >= 0 && (value as number) <= 0o777;\n}\n\n/**\n * Check if string is empty\n * @param value - Value to check\n * @returns Returns true if string is empty, otherwise false\n */\nexport function isStrEmpty(value: unknown): boolean {\n  return isString(value) && value.trim().length === 0;\n}\n\n/**\n * Check if value is an object\n * @param value - Value to check\n * @returns Returns true if value is an object, otherwise false\n */\nexport function isObject(value?: any): value is object {\n  return value !== null && (typeof value === 'object' || typeof value === 'function');\n}\n\n/**\n * Check if object is empty\n * @param value - Object to check\n * @returns Returns true if object is empty, otherwise false\n */\nexport function isObjectEmpty(value: unknown): boolean {\n  return isJSONObject(value) && Object.keys(value).length === 0;\n}\n\n/**\n * Check if value is an array\n * @param value - Value to check\n * @returns Returns true if value is an array, otherwise false\n */\n// export const isArray = isJSONArray;\nexport function isArray(value?: any): value is any[] {\n  return Array.isArray(value);\n}\n\n/**\n * Check if value is an array with multiple dimensions\n * @param value - Value to check\n * @param depth - Depth of dimensions to check, default is 2\n * @returns Returns true if value is an array with multiple dimensions, otherwise false\n */\nexport function isMultidimensionalArray(value?: any, depth: number = 2): boolean {\n  if (!isArray(value)) return false;\n  if (depth <= 1) return true;\n\n  return !isArrayEmpty(value) && value.every((item) => isMultidimensionalArray(item, depth - 1));\n}\n\n/**\n * Check if array is empty\n * @param value - Array to check\n * @returns Returns true if array is empty, otherwise false\n */\nexport function isArrayEmpty(value: unknown): boolean {\n  return isJSONArray(value) && value.length === 0;\n}\n\n/**\n * Check if object can be serialized to valid JSON\n * @param value - Object to check\n * @returns Returns true if object can be serialized to valid JSON, otherwise false\n */\nexport function isJson(value: unknown): boolean {\n  return typeof value === 'object' && value !== null && isJSONValue(value);\n}\n\n/**\n * Check if string is valid JSON format\n * @param value - String to check\n * @returns Returns true if string is valid JSON format, otherwise false\n */\nexport function isJsonStr(value: unknown): boolean {\n  if (!isString(value) || isStrEmpty(value)) return false;\n  // return isJSON(value); // not parse json5\n  try {\n    const resp = JSON5.parse(value);\n    if (!isJson(resp)) return false;\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Check if string is valid binary format\n * @param value - String to check\n * @returns Returns true if string is valid binary format, otherwise false\n */\nexport function isBinary(value: unknown): boolean {\n  return isBuffer(value) || isArrayBuffer(value) || isTypedArray(value);\n}\n\n/**\n * Check if string is valid base64 format\n * @param value - String to check\n * @returns Returns true if string is valid base64 format, otherwise false\n */\nexport function isBase64(value: unknown): boolean {\n  if (!isString(value) || isStrEmpty(value)) return false;\n\n  try {\n    const normalizedValue = value.trim();\n    if (normalizedValue.length % 4 !== 0) return false;\n    return /^[A-Z0-9+/]*={0,2}$/i.test(normalizedValue);\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Check if value is empty\n * @param value - Value to check, can be any type\n * @returns Returns true if value is empty, otherwise false\n */\nexport function isValEmpty(value: unknown): boolean {\n  // Check null/undefined\n  if (isNil(value)) {\n    return true;\n  }\n\n  // Check string\n  if (isString(value)) {\n    return value.trim().length === 0;\n  }\n\n  // Check map/set\n  if (isMap(value) || isSet(value)) {\n    return value.size === 0;\n  }\n\n  // Check array\n  if (Array.isArray(value)) {\n    return value.length === 0;\n  }\n\n  // Check object\n  if (typeof value === 'object' && value !== null) {\n    return Object.keys(value).length === 0;\n  }\n\n  return false;\n}\n\n// Cache compiled regex patterns for better performance\nconst pathMatchRegexCache = new Map<string, RegExp>();\n\n/**\n * Check if a path matches the specified pattern\n * @param pattern - Matching pattern, supports * and ** wildcards\n * @param path - Path to check\n * @returns Returns true if the path matches the pattern, otherwise false\n */\nexport function isPathMatch(pattern: string, path: string): boolean {\n  if (isValEmpty(pattern) || isValEmpty(path)) return false;\n\n  // Use cached regex if available\n  if (!pathMatchRegexCache.has(pattern)) {\n    const regexPattern = pattern.replace(/\\//g, '\\\\/').replace(/\\*\\*/g, '.*').replace(/\\*/g, '[^\\\\/]*');\n    pathMatchRegexCache.set(pattern, new RegExp(`^${regexPattern}$`));\n  }\n\n  return pathMatchRegexCache.get(pattern)!.test(path);\n}\n\n/**\n * Check if string contains HTTP/HTTPS protocol\n * @param value - String to check\n * @param strict - Check for strict protocol for https://\n * @returns Returns true if string contains HTTP/HTTPS protocol, otherwise false\n */\nexport function isHttp(value: unknown, strict: boolean = false): boolean {\n  if (!isString(value) || isValEmpty(value)) return false;\n  if (strict) {\n    return /^https:\\/\\//i.test(value);\n  }\n  return /^https?:\\/\\//i.test(value);\n}\n\n/**\n * Check if URL is an external resource (http, mailto, tel)\n * @param value - URL string to validate\n * @returns Returns true if URL is an external resource, otherwise false\n */\nexport function isExternal(value: unknown): boolean {\n  if (!isString(value) || isStrEmpty(value)) return false;\n  // eslint-disable-next-line regexp/no-unused-capturing-group\n  return /^(https?:|file:|mailto:|tel:)/i.test(value);\n}\n\n/**\n * Check if value is a valid URI\n * @param value - URL to check\n * @returns Returns true if it's a valid URI, otherwise false\n */\nexport function isURI(value: unknown): boolean {\n  if (!isString(value) || isStrEmpty(value)) return false;\n  try {\n    const url = new URL(value);\n    return Boolean(url);\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Check if string contains only lowercase letters\n * @param value - String to check\n * @returns Returns true if string contains only lowercase letters, otherwise false\n */\nexport function isLowerCase(value: unknown): boolean {\n  if (!isString(value) || isStrEmpty(value)) return false;\n  return /^[a-z]+$/.test(value);\n}\n\n/**\n * Check if string contains only uppercase letters\n * @param value - String to check\n * @returns Returns true if string contains only uppercase letters, otherwise false\n */\nexport function isUpperCase(value: unknown): boolean {\n  if (!isString(value) || isStrEmpty(value)) return false;\n  return /^[A-Z]+$/.test(value);\n}\n\n/**\n * Check if string contains only alphabets (both lowercase & uppercase)\n * @param value - String to check\n * @returns Returns true if string contains only alphabets, otherwise false\n */\nexport function isAlphabets(value: unknown): boolean {\n  if (!isString(value) || isStrEmpty(value)) return false;\n  return /^[A-Z]+$/i.test(value);\n}\n\n/**\n * Check if string contains special characters\n * @param value - String to check\n * @param patten - Regular expression pattern to match special characters, default is /[!@#¥$%.&*^()_+=\\-~]/\n * @returns Returns true if string contains special characters, otherwise false\n */\nexport const isContainsSpecialChar = (value: string, patten = /[!@#¥$%.&*^()_+=\\-~]/) => patten.test(value);\n\n/**\n * Check if string contains alpha and numeric\n * @param value - String to check\n * @returns Returns true if string contains  alpha and numeric, otherwise false\n */\nexport const isContainsAlphaNumeric = (value: string) => {\n  const hasLetter = /[a-z]/i.test(value);\n  const hasNumber = /\\d/.test(value);\n  return hasLetter && hasNumber;\n};\n\n/**\n * Check if string is a valid email address\n * @param value - Email address to check\n * @returns Returns true if it's a valid email address, otherwise false\n */\nexport function isEmail(value: unknown): boolean {\n  if (!isString(value) || isStrEmpty(value)) return false;\n  return /^[\\w.%+-]+@[a-z0-9.-]+\\.[a-z]{2,}$/i.test(value);\n}\n\nexport type UUIDVersion = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 'nil' | 'max' | 'all';\n\n/**\n * Check if string is a valid UUID\n * @param value - UUID string to check\n * @param version - UUID version, can be 1-8, 'nil', 'max', or 'all', defaults to 'all'\n * @returns Returns true if it's a valid UUID, otherwise false\n */\nexport function isUUID(value: unknown, version: UUIDVersion = 'all'): boolean {\n  if (!isString(value) || isStrEmpty(value) || value.length !== 36) return false;\n\n  // Precompile UUID regexes for better performance\n  const UUID_REGEXES: Record<UUIDVersion, RegExp> = {\n    1: /^[0-9A-F]{8}-[0-9A-F]{4}-1[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n    2: /^[0-9A-F]{8}-[0-9A-F]{4}-2[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n    3: /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n    4: /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n    5: /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n    6: /^[0-9A-F]{8}-[0-9A-F]{4}-6[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n    7: /^[0-9A-F]{8}-[0-9A-F]{4}-7[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n    8: /^[0-9A-F]{8}-[0-9A-F]{4}-8[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n    nil: /^00000000-0000-0000-0000-000000000000$/,\n    max: /^ffffffff-ffff-ffff-ffff-ffffffffffff$/i,\n    // https://github.com/uuidjs/uuid/blob/main/src/regex.ts\n    all: /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i,\n  };\n  return version in UUID_REGEXES && UUID_REGEXES[version].test(value);\n}\n\n/**\n * Check if string is a valid port number\n * @param value - String or number to check\n * @returns Returns true if it's a valid port number (1-65535), otherwise false\n */\nexport function isPort(value: unknown): boolean {\n  const num = Number(value);\n  return isPositiveFiniteNumber(num) && num >= 1 && num <= 65535;\n}\n\nexport function isTimestamp(value: unknown, type: 'ms' | 's' = 'ms'): boolean {\n  if (!isFiniteNumber(value)) return false;\n  if (type === 'ms') {\n    return String(value).length === 13;\n  }\n  return String(value).length === 10;\n}\n\n/**\n * Check if string is a valid user agent\n * @param value - String to check\n * @param strict - If true, will check for strict user agent format (no control characters), default is false\n * @returns Returns true if it's a valid user agent, otherwise false\n */\nexport function isValidUa(value: unknown, strict: boolean = false): boolean {\n  if (!isString(value) || isStrEmpty(value)) return false;\n\n  // eslint-disable-next-line no-control-regex\n  const CONTROL_CHARS_RE = /[\\u0000-\\u001F\\u007F]/; // e.g. \\r\\n\\t and other control characters\n  const MOZILLA_RE = /^Mozilla\\/\\d+\\.\\d+/i;\n  const PLATFORM_RE = /\\([^)]{2,}\\)/; // e.g. (Windows NT 10.0; Win64; x64)\n  const ENGINE_RE = /\\b(?:AppleWebKit|Gecko|Trident)\\/\\d[\\d.]*/i;\n  const BROWSER_RE = /\\b(?:Chrome|CriOS|Firefox|FxiOS|Safari|Edg|Edge|OPR|Opera|MSIE)\\/\\d[\\d.]*/i;\n  const FORBIDDEN_RE = /\\b(?:python|curl|wget|scrapy|crawler|spider|phantomjs|selenium|headless)\\b/i;\n  const ESCAPED_HEX_RE = /\\\\x[0-9a-f]{2}/i;\n  const EXCESSIVE_URL_ENCODE_RE = /(?:%[0-9a-f]{2}){3,}/i;\n\n  if (CONTROL_CHARS_RE.test(value)) return false;\n\n  if (!strict) return true;\n\n  // Strict\n  const hasValidStructure =\n    MOZILLA_RE.test(value) && PLATFORM_RE.test(value) && ENGINE_RE.test(value) && BROWSER_RE.test(value);\n  const hasForbiddenContent =\n    FORBIDDEN_RE.test(value) || ESCAPED_HEX_RE.test(value) || EXCESSIVE_URL_ENCODE_RE.test(value);\n  return hasValidStructure && !hasForbiddenContent;\n}\n\nexport default {\n  isNumber,\n  isIntNumber,\n  isFiniteNumber,\n  isPositiveFiniteNumber,\n  isPermissionNumber,\n  isString,\n  isStrEmpty,\n  isObject,\n  isObjectEmpty,\n  isArray,\n  isArrayEmpty,\n  isJson,\n  isJsonStr,\n  isBinary,\n  isBase64,\n  isBoolean,\n  isValEmpty,\n  isPathMatch,\n  isHttp,\n  isExternal,\n  isURI,\n  isLowerCase,\n  isUpperCase,\n  isAlphabets,\n  isEmail,\n  isUUID,\n  isPort,\n  isTimestamp,\n  isValidUa,\n};\n"
  },
  {
    "path": "packages/shared/modules/zip/7z.ts",
    "content": "import sevenZipBin from '7zip-bin-full';\nimport sevenZip from 'node-7z';\n\nimport { isStrEmpty, isString } from '../validate';\n\nconst sevenZipPath = sevenZipBin.path7z;\n\n/**\n * Compressing to 7z file\n */\nexport async function compress7z(src: string, dest: string): Promise<boolean> {\n  if (!isString(src) || isStrEmpty(src) || !isString(dest) || isStrEmpty(dest)) return false;\n\n  try {\n    const stream = sevenZip.add(dest, src, {\n      recursive: true,\n      $bin: sevenZipPath,\n    });\n\n    await new Promise<void>((resolve, reject) => {\n      stream.on('end', () => resolve());\n      stream.on('error', (err: Error) => reject(err));\n    });\n\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Decompress 7z file\n * @param src - The path of the .7z file\n * @param dest - The destination directory to extract the contents\n * @returns Whether the decompression was successful\n */\nexport async function decompress7z(src: string, dest: string): Promise<boolean> {\n  if (!isString(src) || isStrEmpty(src) || !isString(dest) || isStrEmpty(dest)) return false;\n\n  if (!src.endsWith('.7z')) return false;\n\n  try {\n    const stream = sevenZip.extractFull(src, dest, {\n      recursive: true,\n      $bin: sevenZipPath,\n    });\n\n    await new Promise<void>((resolve, reject) => {\n      stream.on('end', () => resolve());\n      stream.on('error', (err: Error) => reject(err));\n    });\n\n    return true;\n  } catch {\n    return false;\n  }\n}\n"
  },
  {
    "path": "packages/shared/modules/zip/gz.ts",
    "content": "import fs from 'node:fs';\nimport zlib from 'node:zlib';\n\nimport { isStrEmpty, isString } from '../validate';\n\n/**\n * Compressing a directory into a gz file\n * @param src - The string to be compressed\n * @param dest - The destination path for the .tgz file\n * @returns The compressed Buffer\n */\nexport async function compress(src: string, dest: string): Promise<boolean> {\n  if (!isString(src) || isStrEmpty(src) || !isString(dest) || isStrEmpty(dest)) return false;\n\n  try {\n    const input = fs.readFileSync(src);\n    const compressed = zlib.gzipSync(input);\n    fs.writeFileSync(dest, compressed);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Decompress gz files\n * @param src - The path of the .gz file\n * @param dest - The destination directory to extract the contents\n * @returns Whether the decompression was successful\n */\nexport async function decompress(src: string, dest: string): Promise<boolean> {\n  if (!isString(src) || isStrEmpty(src) || !isString(dest) || isStrEmpty(dest)) return false;\n\n  if (!src.endsWith('.gz')) return false;\n\n  try {\n    const compressed = fs.readFileSync(src);\n    const decompressed = zlib.gunzipSync(compressed);\n    fs.writeFileSync(dest, decompressed);\n\n    return true;\n  } catch {\n    return false;\n  }\n}\n"
  },
  {
    "path": "packages/shared/modules/zip/index.ts",
    "content": "export * as '7z' from './7z';\nexport * as gz from './gz';\nexport * as tgz from './tgz';\nexport * as zip from './zip';\n"
  },
  {
    "path": "packages/shared/modules/zip/tgz.ts",
    "content": "import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nimport { isStrEmpty, isString } from '../validate';\n\nconst execAsync = promisify(exec);\n\n/**\n * Compressing a directory into a tgz file\n * @param src - The string to be compressed\n * @param dest - The destination path for the .tgz file\n * @returns The compressed Buffer\n */\nexport async function compress(src: string, dest: string): Promise<boolean> {\n  if (!isString(src) || isStrEmpty(src) || !isString(dest) || isStrEmpty(dest)) return false;\n\n  try {\n    await execAsync(`tar -czf \"${dest}\" -C \"${src}\" .`);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Decompress tgz files\n * @param src - The path of the .tgz file\n * @param dest - The destination directory to extract the contents\n * @returns Whether the decompression was successful\n */\nexport async function decompress(src: string, dest: string): Promise<boolean> {\n  if (!isString(src) || isStrEmpty(src) || !isString(dest) || isStrEmpty(dest)) return false;\n  if (!(src.endsWith('.tar.gz') || src.endsWith('.tgz'))) return false;\n\n  try {\n    await execAsync(`tar -xzf \"${src}\" -C \"${dest}\"`);\n    return true;\n  } catch {\n    return false;\n  }\n}\n"
  },
  {
    "path": "packages/shared/modules/zip/zip.ts",
    "content": "import { readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport AdmZip from 'adm-zip';\nimport StreamZip from 'node-stream-zip';\n\nimport { isStrEmpty, isString } from '../validate';\n\nasync function addDirectoryToZip(zip: AdmZip, dirPath: string, rootPath: string): Promise<void> {\n  const entries = await readdir(dirPath);\n\n  for (const entry of entries) {\n    const fullPath = path.join(dirPath, entry);\n    const stats = await stat(fullPath);\n    const relativePath = path.relative(rootPath, fullPath);\n\n    if (stats.isDirectory()) {\n      await addDirectoryToZip(zip, fullPath, rootPath);\n    } else {\n      zip.addLocalFile(fullPath, path.dirname(relativePath));\n    }\n  }\n}\n\n/**\n * Compressing a directory into a zip file\n * @param src - The string to be compressed\n * @param dest - The destination path for the .zip file\n * @returns The compressed Buffer\n */\nexport async function compress(src: string, dest: string): Promise<boolean> {\n  if (!isString(src) || isStrEmpty(src) || !isString(dest) || isStrEmpty(dest)) return false;\n\n  try {\n    const zip = new AdmZip();\n    const stats = await stat(src);\n\n    if (stats.isDirectory()) {\n      await addDirectoryToZip(zip, src, src);\n    } else {\n      zip.addLocalFile(src);\n    }\n\n    await zip.writeZipPromise(dest);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Decompress zip files\n * @param src - The path of the .zip file\n * @param dest - The destination directory to extract the contents\n * @returns Whether the decompression was successful\n */\nexport async function decompress(src: string, dest: string): Promise<boolean> {\n  if (!isString(src) || isStrEmpty(src) || !isString(dest) || isStrEmpty(dest)) return false;\n  if (!src.endsWith('.zip')) return false;\n\n  try {\n    // eslint-disable-next-line new-cap\n    const zip = new StreamZip.async({ file: src });\n    await zip.extract(null, dest);\n    await zip.close();\n    return true;\n  } catch {\n    return false;\n  }\n}\n"
  },
  {
    "path": "packages/shared/types/barrage.ts",
    "content": "export interface IBarrage {\n  id: string;\n  type: 'top' | 'bottom' | 'left' | 'right';\n  text: string;\n  time: number;\n  color: string;\n}\n\nexport interface IBarrageResult {\n  list: IBarrage[];\n  id: string;\n}\n\nexport interface IBarrageSendOptions {\n  id: string;\n  type: 'top' | 'bottom' | 'left' | 'right';\n  text: string;\n  time: number;\n  color?: string;\n  size?: string;\n}\n"
  },
  {
    "path": "packages/shared/types/cms.ts",
    "content": "import type {\n  CMS_ACTION_SPECIAL_ID_TYPE,\n  CMS_ACTION_TYPE,\n  ICmsActionButtonType,\n  ICmsActionFormType,\n  ICmsActionInputType,\n  ICmsActionSpecialIdType,\n  ICmsActionType,\n} from '../config/cmsAction';\nimport type { IModels } from '../types/db';\n\nexport type IConstructorOptions = Omit<IModels['site'], 'categories'> & {\n  categories: string[];\n};\n\n// input options\n\nexport type ICmsInitOptions = unknown;\n\nexport type ICmsHomeOptions = void;\n\nexport type ICmsHomeVodOptions = void;\n\nexport interface ICmsCategoryOptions {\n  tid: string;\n  page?: number;\n  extend?: Record<string, string>;\n}\n\nexport interface ICmsDetailOptions {\n  ids: string;\n}\n\nexport interface ICmsSearchOptions {\n  wd: string;\n  page?: number;\n  quick?: boolean;\n}\n\nexport interface ICmsPlayOptions {\n  flag: string;\n  play: string;\n}\n\nexport interface ICmsActionOptions {\n  action: string;\n  value: string | Record<string, any>;\n  timeout?: number;\n}\n\nexport type ICmsProxyOptions = Record<string, string>;\n\nexport type ICmsRunMianOptions = Record<string, string>;\n\nexport type ICmsDestroyOptions = void;\n\n// output results\n\nexport interface ICmsInfoBase {\n  vod_id: string;\n  vod_name: string;\n  vod_pic: string;\n  vod_remarks: string;\n  vod_blurb: string;\n}\n\nexport type ICmsInfoBaseWithTag = ICmsInfoBase & {\n  vod_tag: 'file' | 'folder' | 'action' | string;\n};\n\nexport interface ICmsInfoEpisode {\n  text: string;\n  link: string;\n}\n\nexport type ICmsInfo = ICmsInfoBase & {\n  vod_lang?: string;\n  vod_year?: string | number;\n  vod_area?: string;\n  vod_score?: string;\n  vod_state?: string;\n  vod_class?: string;\n  vod_actor?: string;\n  vod_director?: string;\n  vod_content?: string;\n  vod_douban_id?: string;\n  vod_douban_type?: string;\n  vod_douban_score?: string;\n  type_name?: string;\n  vod_play_from: string;\n  vod_play_url: string;\n  vod_episode?: Record<string, Array<ICmsInfoEpisode>>;\n};\n\nexport type ICmsInit = void;\n\nexport interface ICmsHome {\n  class: Array<{\n    type_id: string;\n    type_name: string;\n  }>;\n  filters: Record<\n    string | number,\n    Array<{\n      key: string;\n      name: string;\n      value: Array<{\n        n: string;\n        v: string;\n      }>;\n    }>\n  >;\n}\n\nexport interface ICmsHomeVod {\n  page?: number;\n  pagecount?: number;\n  total?: number;\n  list: Array<ICmsInfoBaseWithTag>;\n}\n\nexport interface ICmsCategory {\n  page?: number;\n  pagecount?: number;\n  total?: number;\n  list: Array<ICmsInfoBaseWithTag>;\n}\n\nexport interface ICmsDetail {\n  page?: number;\n  pagecount?: number;\n  total?: number;\n  list: Array<ICmsInfo>;\n}\n\nexport interface ICmsSearch {\n  page?: number;\n  pagecount?: number;\n  total?: number;\n  list: Array<ICmsInfoBaseWithTag>;\n}\n\nexport interface ICmsPlay {\n  url: string;\n  quality?: Array<string | number>;\n  jx?: number;\n  parse?: number;\n  headers?: Record<string, any>;\n  script?: {\n    runScript?: string;\n    initScript?: string;\n    customRegex?: string;\n    snifferExclude?: string;\n  };\n}\n\nexport interface ICmsActionCommon {\n  actionId: ICmsActionSpecialIdType | string;\n  type?: ICmsActionType;\n  button?: ICmsActionButtonType | boolean;\n  reset?: boolean;\n  canceledOnTouchOutside?: boolean;\n  title?: string;\n  keep?: boolean;\n\n  /** receive only */\n  width?: number;\n  height?: number;\n  dimAmount?: number;\n  bottom?: number;\n\n  imageUrl?: string;\n  imageHeight?: number;\n  imageClickCoord?: boolean;\n  qrcode?: string;\n  qrcodeSize?: string;\n\n  timeout?: number;\n  httpTimeout?: number;\n\n  initAction?: string;\n  initValue?: string;\n  cancelAction?: string;\n  cancelValue?: string;\n}\n\nexport interface ICmsActionOptionItem {\n  name: string;\n  action: string;\n  selected?: boolean;\n}\nexport type ICmsActionOption = ICmsActionOptionItem[] | string[];\n\nexport interface ICmsActionFormField {\n  id: string;\n  name: string;\n  value?: string;\n  tip?: string;\n  msg?: string;\n  column?: number;\n  selectData?: string;\n\n  /** receive only */\n  selectWidth?: number;\n  selectColumn?: number;\n\n  quickSelect?: boolean;\n  onlyQuickSelect?: boolean;\n  multiSelect?: boolean;\n  inputType?: ICmsActionInputType;\n  multiLine?: number;\n  help?: string;\n  validation?: string;\n\n  option?: ICmsActionOption;\n  selectedIndex?: number;\n}\n\nexport interface ICmsActionForm extends ICmsActionCommon, ICmsActionFormField {\n  type: ICmsActionFormType;\n  input?: ICmsActionFormField[];\n}\n\nexport type ICmsActionMsgbox =\n  | (ICmsActionCommon & {\n      type: typeof CMS_ACTION_TYPE.MSGBOX;\n      msg: string;\n      htmlMsg?: never;\n    })\n  | (ICmsActionCommon & {\n      type: typeof CMS_ACTION_TYPE.MSGBOX;\n      msg?: never;\n      htmlMsg: string;\n    });\n\nexport interface ICmsActionHelp extends ICmsActionCommon {\n  type: typeof CMS_ACTION_TYPE.HELP;\n  data: Record<string, string>;\n}\n\nexport interface ICmsActionBrowser extends ICmsActionCommon {\n  type: typeof CMS_ACTION_TYPE.BROWSER | typeof CMS_ACTION_TYPE.WEBVIEW;\n  url: string;\n  header?: Record<string, any>;\n  browserHeight?: number;\n  browserWidth?: number;\n}\n\nexport type ICmsActionBase = ICmsActionForm | ICmsActionMsgbox | ICmsActionHelp | ICmsActionBrowser;\n\nexport interface ICmsActionSpecialBase {\n  actionId: ICmsActionSpecialIdType;\n}\n\nexport interface ICmsActionSpecialSelfSearch {\n  actionId: typeof CMS_ACTION_SPECIAL_ID_TYPE.SELF_SEARCH;\n  skey: string;\n  name: string;\n  tid: string;\n  flag: string;\n  folder: string | Array<{ name: string; id: string; flag: string }>;\n  msg: string;\n}\nexport interface ICmsActionSpecialDetail extends ICmsActionSpecialBase {\n  actionId: typeof CMS_ACTION_SPECIAL_ID_TYPE.DETAIL;\n  skey: string;\n  ids: string;\n}\n\nexport interface ICmsActionSpecialKtvPlayer extends ICmsActionSpecialBase {\n  actionId: typeof CMS_ACTION_SPECIAL_ID_TYPE.KTVPLAYER;\n  name: string;\n  id: string;\n}\n\nexport interface ICmsActionSpecialRefreshList extends ICmsActionSpecialBase {\n  actionId: typeof CMS_ACTION_SPECIAL_ID_TYPE.REFRESH_LIST;\n  listTab: string;\n}\n\nexport interface ICmsActionSpecialCopy extends ICmsActionSpecialBase {\n  actionId: typeof CMS_ACTION_SPECIAL_ID_TYPE.COPY;\n  content: string;\n}\n\nexport interface ICmsActionSpecialKeep extends ICmsActionSpecialBase {\n  actionId: typeof CMS_ACTION_SPECIAL_ID_TYPE.KEEP;\n  msg: string;\n  msgType: 'long_text';\n  reset: boolean;\n}\n\nexport type ICmsActionSpecial =\n  | ICmsActionSpecialSelfSearch\n  | ICmsActionSpecialDetail\n  | ICmsActionSpecialKtvPlayer\n  | ICmsActionSpecialRefreshList\n  | ICmsActionSpecialCopy\n  | ICmsActionSpecialKeep;\n\nexport type ICmsActionPayload = ICmsActionBase | ICmsActionSpecial;\n\nexport interface ICmsActionEnvelope {\n  action: ICmsActionPayload;\n  toast?: string;\n}\n\nexport type ICmsAction = ICmsActionPayload | ICmsActionEnvelope | string;\n\nexport type ICmsProxy = [number, string, string] | [];\n\nexport type ICmsRunMian = any;\n\nexport type ICmsDestroy = void;\n\nexport interface IRecMatch {\n  vod_douban_id: string;\n  vod_douban_type: string;\n  vod_pic: string;\n  vod_name: string;\n}\n\nexport interface ICmsParams {\n  init: ICmsInitOptions;\n  home: ICmsHomeOptions;\n  homeVod: ICmsHomeVodOptions;\n  category: ICmsCategoryOptions;\n  detail: ICmsDetailOptions;\n  search: ICmsSearchOptions;\n  play: ICmsPlayOptions;\n  action: ICmsActionOptions;\n  proxy: ICmsProxyOptions;\n  runMain: ICmsRunMianOptions;\n  destroy: ICmsDestroyOptions;\n}\n\nexport interface ICmsResult {\n  init: ICmsInit;\n  home: ICmsHome;\n  homeVod: ICmsHomeVod;\n  category: ICmsCategory;\n  detail: ICmsDetail;\n  play: ICmsPlay;\n  search: ICmsSearch;\n  action: ICmsAction;\n  proxy: ICmsProxy;\n  runMain: ICmsRunMian;\n  destroy: ICmsDestroy;\n}\n\nexport type ICmsResultPromise = {\n  [K in keyof ICmsResult]: ICmsResult[K] extends (...args: infer A) => infer R\n    ? 0 extends 1 & ICmsResult[K]\n      ? Promise<ICmsResult[K]>\n      : (...args: A) => Promise<R>\n    : Promise<ICmsResult[K]>;\n};\n\nexport type ICmsMethodName = keyof ICmsResult;\n\nexport type ICms = {\n  [K in ICmsMethodName]: [ICmsParams[K]] extends [void]\n    ? () => Promise<ICmsResult[K]>\n    : [undefined] extends [ICmsParams[K]]\n      ? (doc?: Exclude<ICmsParams[K], undefined>) => Promise<ICmsResult[K]>\n      : (doc: ICmsParams[K]) => Promise<ICmsResult[K]>;\n};\n\nexport type ICmsAdapter = ICms & {\n  prepare?: () => Promise<void> | void;\n  terminate?: () => Promise<void> | void;\n};\n\nexport interface ICmsAdapterConstructor {\n  new (...args: any[]): ICmsAdapter;\n  prepare?: () => Promise<void> | void;\n  terminate?: () => Promise<void> | void;\n}\n"
  },
  {
    "path": "packages/shared/types/common.ts",
    "content": "export type DeepMutable<T> = T extends (...args: any[]) => any\n  ? T\n  : T extends readonly (infer R)[]\n    ? DeepMutable<R>[]\n    : T extends object\n      ? { -readonly [K in keyof T]: DeepMutable<T[K]> }\n      : T;\n\nexport type WidenLiteral<T> = T extends string ? string : T extends number ? number : T extends boolean ? boolean : T;\n\nexport type DeepWidenLiteral<T> = T extends string\n  ? string\n  : T extends number\n    ? number\n    : T extends boolean\n      ? boolean\n      : T extends readonly (infer R)[]\n        ? DeepWidenLiteral<R>[]\n        : T extends object\n          ? { [K in keyof T]: DeepWidenLiteral<T[K]> }\n          : T;\n\nexport type Normalize<T> = DeepMutable<DeepWidenLiteral<T>>;\n"
  },
  {
    "path": "packages/shared/types/db.ts",
    "content": "import type { Client, Config } from '@libsql/client';\nimport type { Models, Schemas, TableName } from '@main/services/DbService/schemas';\nimport type { drizzle } from 'drizzle-orm/libsql';\n\nimport type { ISetting } from '../config/tblSetting';\n\nexport type IClient = Client;\n\nexport type IConfig = Config;\n\nexport type IOrm = ReturnType<typeof drizzle>;\n\nexport type ISchemas = Schemas;\n\nexport type IModels = Models;\n\nexport type ITableName = TableName;\n\nexport type IMigrate = (orm: IOrm, schemas: ISchemas) => Promise<void>;\n\nexport interface IMigration {\n  version: string;\n  migrate: IMigrate;\n}\n\nexport type IMigrations = readonly IMigration[];\n\nexport type IDb = {\n  [K in keyof IModels]: IModels[K][];\n};\n\nexport type IDbStore = {\n  [K in keyof IModels]?: K extends 'setting' ? Partial<ISetting> : IModels[K][];\n};\n"
  },
  {
    "path": "packages/shared/types/sift.ts",
    "content": "export interface ISiftCategoryResult {\n  title: string;\n  uuid: string;\n  raw: Array<{ title: string; uuid: string; path_url: string; source_url: string }>;\n}\n"
  },
  {
    "path": "packages/shared/types/systeminfo.ts",
    "content": "export type IPlatform = 'win32' | 'darwin' | 'linux' | 'ohos' | 'unknown';\nexport type IArch = 'x86_64' | 'x86_32' | 'arm_64' | 'arm_32' | 'mips' | 'loong_64' | 'riscv_64' | 'unknown';\n\nexport interface ISystemInfo {\n  platform: IPlatform;\n  arch: IArch;\n  release: string;\n  osString: string;\n}\n"
  },
  {
    "path": "patches/@oplayer-core-npm-1.2.38-beta.2-66bf7d6252.patch",
    "content": "diff --git a/dist/index.es.js b/dist/index.es.js\nindex 7c8e168da09439a3169ad59a7f8ff2c37f30ea68..88ca1f38dab846ad12f6c6e8b4ccee8976f66f44 100644\n--- a/dist/index.es.js\n+++ b/dist/index.es.js\n@@ -1110,9 +1110,6 @@ const _Player = class _Player {\n };\n _Player.players = [];\n let Player = _Player;\n-if (globalThis.window) {\n-  console.log(\"%cOPlayer%c v%s\\n %c\\nOh! Another HTML5 video player.\\nhttps://github.com/shiyiya/oplayer\\n\", \"font-size:32px;\", \"font-size:12px;color:#999999;\", Player.version, \"font-size:14px;\");\n-}\n export {\n   $,\n   Player,\ndiff --git a/dist/index.min.js b/dist/index.min.js\nindex 0e2be040af077a0e16eb41c1762f698c4d9b3db9..6c837e638d0d36631ced70a9adb071bd1638ae09 100644\n--- a/dist/index.min.js\n+++ b/dist/index.min.js\n@@ -5,4 +5,4 @@\n  * author: shiyiya\n  * homepage: https://github.com/shiyiya/oplayer\n  */\n-!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).OPlayer=t()}(this,(function(){\"use strict\";var e,t,i,s,n,r,o,l,a;const u=[\"abort\",\"canplay\",\"canplaythrough\",\"durationchange\",\"emptied\",\"ended\",\"error\",\"loadeddata\",\"loadedmetadata\",\"loadstart\",\"pause\",\"play\",\"playing\",\"progress\",\"ratechange\",\"seeked\",\"seeking\",\"stalled\",\"suspend\",\"timeupdate\",\"volumechange\",\"waiting\",\"encrypted\",\"waitingforkey\",\"enterpictureinpicture\",\"leavepictureinpicture\"],c=[\"contextmenu\"],h=[\"loadedplugin\",\"videoqualitychange\",\"videosourcechange\",\"destroy\"],d=[].concat(u,c,h);class p{constructor(){this.events=Object.create(null)}on(e,t){this.events[e]||(this.events[e]=[]),this.events[e].push(t)}onAny(e,t){e.forEach((e=>this.on(e,t)))}once(e,t){const i=i=>{t({type:e,payload:i.payload})};i.raw=t,this.on(e,i)}off(e,t){if(this.events[e])for(let i=0;i<this.events[e].length;i++){const s=this.events[e][i];s!=t&&t!=s.raw||this.events[e].splice(i,1)}}offAny(e){this.events[e]=[]}offAll(){this.events=Object.create(null)}emit(e,t){var i,s;const n=[];null==(i=this.events[e])||i.forEach((i=>{i({type:e,payload:t}),i.raw&&n.push(i)})),null==(s=this.events[\"*\"])||s.forEach((i=>{i({type:e,payload:t}),i.raw&&n.push(i)})),n.forEach((t=>{this.off(e,t)}))}}function g(e){return Boolean(e&&\"object\"==typeof e&&!Array.isArray(e))}function f(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),s=1;s<t;s++)i[s-1]=arguments[s];if(!i.length)return e;const n=i.shift();if(g(e)&&g(n))for(const r in n)g(n[r])?(e[r]||Object.assign(e,{[r]:{}}),f(e[r],n[r])):Object.assign(e,{[r]:n[r]});return f.apply(void 0,[e].concat(i))}const v=Object.freeze(Object.defineProperty({__proto__:null,isObject:g,isPlainObject:function(e){if(\"object\"!=typeof e||null===e)return!1;let t=e;for(;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t},mergeDeep:f},Symbol.toStringTag,{value:\"Module\"})),y={Play:\"播放\",Pause:\"暂停\",Loop:\"循环播放\",Volume:\"音量\",\"Volume: %s\":\"音量：%s\",Mute:\"静音\",Speed:\"播放速度\",LIVE:\"直播\",Language:\"语言\",Screenshot:\"截图\",Subtitle:\"字幕\",Quality:\"画质\",Fullscreen:\"全屏\",Settings:\"设置\",\"Picture in Picture\":\"画中画\",Danmaku:\"弹幕\",Display:\"显示\",Opacity:\"透明度\",FontSize:\"字体大小\",\"Display Area\":\"显示区域\",Off:\"关闭\",Auto:\"自动\",Default:\"默认\",Normal:\"正常\",\"%ss\":\"%s秒\",Close:\"关闭\",\"Can be closed after %ss\":\"%s秒后可关闭广告\"},m={Play:\"پخش\",Next:\"بعدی\",Previous:\"قبلی\",Pause:\"توقف\",Loop:\"تکرار\",Volume:\"حجم صدا\",\"Volume: %s\":\"حجم صدا: %s\",Mute:\"بی‌صدا کردن\",Speed:\"سرعت\",LIVE:\"زنده\",WebFullscreen:\"تمام صفحه وب\",Chromecast:\"کروم کاست\",AirPlay:\"ایر پلی\",Playlist:\"پلی‌لیست\",Heatmap:\"نقشهٔ حرارتی\",Language:\"زبان\",Screenshot:\"عکس صفحه\",Subtitle:\"زیرنویس\",Quality:\"کیفیت\",Fullscreen:\"تمام صفحه\",Settings:\"تنظیمات\",\"Picture in Picture\":\"تصویر در تصویر\",Danmaku:\"دانماکو\",Display:\"نمایش\",Opacity:\"شفافیت\",FontSize:\"اندازه فونت\",\"Display Area\":\"ناحیه نمایش\",Off:\"خاموش\",Auto:\"خودکار\",Default:\"پیش‌فرض\",Normal:\"عادی\",\"%ss\":\"%s ثانیه\",Close:\"بستن\",\"Can be closed after %ss\":\"قابل بستن پس از %s ثانیه\"},b={Play:\"پلې‌کول\",Next:\"بل\",Previous:\"مخکېنی\",Pause:\"تم کول\",Loop:\"تکرار\",Volume:\"غږ\",\"Volume: %s\":\"غږ: %s\",Mute:\"غلی کول\",Speed:\"چټکتیا\",LIVE:\"ژوندی\",WebFullscreen:\"د تمام صفحه وب\",Chromecast:\"کروم کاسټ\",AirPlay:\"ایر پلی\",Playlist:\"پلې‌لسټ\",Heatmap:\"د ډېرو کتلو نقشه\",Language:\"ژبه\",Screenshot:\"سکرین شاټ\",Subtitle:\"لاندې لیک\",Quality:\"کیفیت\",Fullscreen:\"پوره پرده\",\"\":\"د متن ډیکوډر ملاتړ نه لري\",Settings:\"ترتیبات\",\"Picture in Picture\":\"انځور په انځور\",Danmaku:\"دانماکو\",Display:\"ښکاره کول\",Opacity:\"روڼوالی\",FontSize:\"د خط اندازه\",\"Display Area\":\"د ښودلو ساحه\",Off:\"بند\",Auto:\"خودکار\",Default:\"پېل شوی\",Normal:\"عادي\",\"%ss\":\"%s ثانیه\",Close:\"بندول\",\"Can be closed after %ss\":\"د %s ثانیو وروسته تړل کېدای شي\"};class E{constructor(e){this.languages={zh:y,\"zh-CN\":y,fa:m,pa:b,en:Object.keys(y).reduce(((e,t)=>(e[t]=t,e)),{})},this.lang=\"auto\"===e?navigator.language:e,this.languages[this.lang]||navigator.languages.some((e=>{if(this.languages[e])return this.lang=e,!0;if(-1!==e.indexOf(\"-\")){const t=e.split(\"-\")[0];if(t&&this.languages[t])return this.lang=t,!0}return!1})),this.languages[this.lang]||(this.lang=\"en\")}get(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),s=1;s<t;s++)i[s-1]=arguments[s];const n=this.languages[this.lang][e];if(null==n)return e;let r=0;return n.replace(/%s/gi,(()=>{var e;return null!==(e=i[r++])&&void 0!==e?e:\"\"}))}update(e){f(this.languages,e)}}function P(e){return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=1540483477,s=24,n=t^e.length,r=e.length,o=0;for(;r>=4;){let t=w(e,o);t=O(t,i),t^=t>>>s,t=O(t,i),n=O(n,i),n^=t,o+=4,r-=4}switch(r){case 3:n^=S(e,o),n^=e.charCodeAt(o+2)<<16,n=O(n,i);break;case 2:n^=S(e,o),n=O(n,i);break;case 1:n^=e.charCodeAt(o),n=O(n,i)}return n^=n>>>13,n=O(n,i),n^=n>>>15,n>>>0}(e).toString(36)}function w(e,t){return e.charCodeAt(t++)+(e.charCodeAt(t++)<<8)+(e.charCodeAt(t++)<<16)+(e.charCodeAt(t)<<24)}function S(e,t){return e.charCodeAt(t++)+(e.charCodeAt(t++)<<8)}function O(e,t){return(65535&(e|=0))*(t|=0)+(((e>>>16)*t&65535)<<16)|0}var k,$=/[(),]|\"(?:\\\\.|[^\"\\n])*\"|'(?:\\\\.|[^'\\n])*'|\\/\\*[\\s\\S]*?\\*\\//g;function x(e){if(-1===e.indexOf(\",\"))return[e];for(var t,i=[],s=[],n=0;t=$.exec(e);)switch(t[0]){case\"(\":n++;break;case\")\":n--;break;case\",\":if(n)break;i.push(t.index)}for(t=i.length;t--;)s.unshift(e.slice(i[t]+1)),e=e.slice(0,i[t]);return s.unshift(e),s}function A(e,t){let i=x(e);return x(t).map((e=>e.indexOf(\"&\")>=0?e:\"&\"+e)).reduce(((e,t)=>e.concat(i.map((e=>t.replace(/\\&/g,e))))),[]).join(\",\")}function F(e){return 0===e.indexOf(\"@media\")}function T(e){return 0===e.indexOf(\"@keyframes\")}function j(e,t){var i;let s=t.rules,n=t.mediaQuery,r=t.globalSelector,o={};return r&&(e=r),null==(i=Object.keys(s))||i.forEach((t=>{if(function(e){return 0===e.indexOf(\"@global\")}(t)){const i=t,l=(t=t.substring(8)).indexOf(\"&\");let a;-1!=l?(a=A(e,t),r=t.substring(0,l-1).trim()):a=t,f(o,j(a,{mediaQuery:n,rules:s[i],globalSelector:a}))}else if(function(e){let t=[\":\",\".\",\"[\",\">\",\" \"],i=!1,s=e.charAt(0);for(let n=0;n<t.length;n++)if(s===t[n]){i=!0;break}return i||e.indexOf(\"&\")>=0}(t))f(o,j(A(e,t),{rules:s[t],mediaQuery:n}));else if(F(t))f(o,j(e,{mediaQuery:(d=n,p=t,d?\"@media \"+d.substring(6)+\" and \"+p.substring(6):p),rules:s[t]}));else{var i,l,a,u,c,h;if(n)null!==(i=o[n])&&void 0!==i||(o[n]={}),null!==(u=(l=o[n])[a=e])&&void 0!==u||(l[a]={}),o[n][e][t]=s[t];else if(T(t))o[t]=s[t];else null!==(h=o[c=e])&&void 0!==h||(o[c]={}),o[e][t]=s[t]}var d,p})),o}function C(e){let t=[];for(const i in e)if(Object.hasOwnProperty.call(e,i)){const s=e[i];g(s)?t.push(i+\"{\"+C(s)+\"}\"):t.push(i+\":\"+s)}return/^\\d%/.test(t[0])?t.join(\" \"):t.join(\";\")}function L(e){let t=[];for(const i in e)if(Object.hasOwnProperty.call(e,i)){const s=e[i];if(F(i))t.push(i+\"{\"+L(s)+\"}\");else if(T(i))t.push(i+\"{\"+C(s)+\"}\");else{const e=Object.entries(s).map((e=>e[0]+\":\"+e[1])).join(\";\");t.push(i+\"{\"+e+\"}\")}}return t}function D(e,t){return L(j(t,{rules:e}))}(e=>{function t(t){if(!(0,e.isBrowser)())return null;let i=document.createElement(\"style\");i.setAttribute(\"data-\"+t,\"\"),i.appendChild(document.createTextNode(\"\")),(document.head||document.getElementsByTagName(\"head\")[0]).appendChild(i);for(let e=0;e<document.styleSheets.length;e++)if(document.styleSheets[e].ownerNode===i)return document.styleSheets.item(e);return null}e.create=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\";const s=-1!==e.indexOf(\"#\"),n=-1!==e.indexOf(\".\"),r=s?e.split(\"#\"):n?e.split(\".\"):[e],o=r[0],l=r[1],a=document.createElement(o);return s&&(a.id=l),n&&a.classList.add(l),i&&(a.innerHTML=i),Object.keys(t).forEach((e=>{const i=t[e];\"video\"!==o&&\"audio\"!==o||\"boolean\"!=typeof i?void 0!==i&&a.setAttribute(e,\"\"+i):i&&a.setAttribute(e,\"\")})),a},e.render=(e,t)=>t.appendChild(e),e.isBrowser=()=>Boolean(\"undefined\"!=typeof globalThis&&globalThis.document&&globalThis.document.documentElement),e.createSheet=t;const i=(()=>{const e=Object.create({});return t=>{const i=\"object\"==typeof t?JSON.stringify(t):t;return e[i]||(e[i]=\"css-\"+P(i)),e[i]}})();e.createCss=e=>{let t=e.sheet,s=e.ssrData;return function(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];const l=Boolean(r[0]&&r[0].length&&r[0].raw);let a=\"\";if(l){let e=r[0];a+=e[0];for(let t=1;t<r.length;t++)a+=\"string\"!=typeof r[t]?\"\":r[t],a+=e[t]}else a=\"string\"==typeof r[0]?r[0]:JSON.stringify(r[0]);const u=i(a);if(t)for(let i=0;i<t.cssRules.length;i++)if((null==(e=t.cssRules[i])?void 0:e.selectorText)==\".\"+u)return u;let c=[\".\"+u+\"{\"+a+\"}\"];return l||\"object\"!=typeof r[0]||(c=D(r[0],\".\"+u)),t?c.forEach((e=>{t.insertRule(e,t.cssRules.length)})):s=s.concat(c),u}},e.createStyled=()=>{const i=[],s=t(\"oplayer\");return{css:(0,e.createCss)({sheet:s,ssrData:i}),getCssValue:()=>i}};var s=(0,e.createStyled)();e.css=s.css,e.getCssValue=s.getCssValue,e.cls=e=>\"css-\"+P(e)})(k||(k={}));const _=k,N=/(iPad)/gi.test(null==(e=globalThis.navigator)?void 0:e.userAgent)||/Macintosh/i.test(null==(t=globalThis.navigator)?void 0:t.userAgent)&&Boolean(null==(i=globalThis.navigator)?void 0:i.maxTouchPoints)&&(null==(s=globalThis.navigator)?void 0:s.maxTouchPoints)>=1,R=/iPhone/gi.test(null==(n=globalThis.navigator)?void 0:n.userAgent),V=/^((?!chrome|android).)*safari/i.test(null==(r=globalThis.navigator)?void 0:r.userAgent),I=R||N,M=/Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone/i.test(null==(o=globalThis.navigator)?void 0:o.userAgent)||I,q=/mqqbrowser/i.test(null==(l=globalThis.navigator)?void 0:l.userAgent)&&!/ qq/i.test(null==(a=globalThis.navigator)?void 0:a.userAgent),z=Object.freeze(Object.defineProperty({__proto__:null,isIOS:I,isMobile:M,isQQBrowser:q,isSafari:V,isiPad:N,isiPhone:R},Symbol.toStringTag,{value:\"Module\"})),B={autoplay:!1,muted:!1,loop:!1,volume:1,preload:\"metadata\",playbackRate:1,playsinline:!0,lang:\"auto\",source:{},videoAttr:{},isLive:!1,autopause:!0,isNativeUI:()=>q},Q=class e{constructor(e,t){if(this.plugins=[],this.context={},this.listeners=Object.create(null),this.hasError=!1,this.isSourceChanging=!1,this.container=\"string\"==typeof e?document.querySelector(e):e,!this.container)throw new Error((\"string\"==typeof e?e:\"Element\")+\"does not exist\");this.options=Object.assign({},B,\"string\"==typeof t?{source:{src:t}}:t),this.locales=new E(this.options.lang),this.eventEmitter=new p}static make(t,i){return new e(t,i)}use(e){return e.forEach((e=>{this.plugins.push(e)})),this}create(){return this.render(),this.initEvent(),this.plugins.forEach((e=>this.applyPlugin(e,!0))),this.options.source.src&&this.load(this.options.source),e.players.push(this),this}initEvent(){this.listeners.error=e=>{this.$video.error&&(this.hasError=!0,this.eventEmitter.emit(\"error\",e))},this.$video.addEventListener(\"error\",(e=>this.listeners.error(e)));const e=(e,t)=>{this.eventEmitter.emit(e,t)};[[this.$video,[\"fullscreenchange\",\"webkitbeginfullscreen\",\"webkitendfullscreen\"],[\"fullscreenerror\",\"webkitfullscreenerror\",\"mozfullscreenerror\"]],[this.$root,[\"fullscreenchange\",\"webkitfullscreenchange\"],[\"fullscreenerror\",\"webkitfullscreenerror\",\"mozfullscreenerror\"]]].forEach((t=>{const i=t[0];t.slice(1).forEach((t=>{const s=t[0];this.listeners[s]=e,t.forEach((e=>{i.addEventListener(e,(e=>{this.listeners[s](s,e)}),{passive:!0})}))}))})),[[this.$video,u],[this.$root,c]].forEach((t=>{let i=t[0];t[1].forEach((t=>{this.listeners[t]||(this.listeners[t]=e,i.addEventListener(t,(e=>{var i;null==(i=this.listeners)||i[t](t,e)}),{passive:!0}))}))}))}render(){this.$video=_.create(\"video.\"+_.css(\"\\n        width: 100%;\\n        height: 100%;\\n        display: block;\\n        position: relative;\\n      \"),Object.assign({autoplay:this.options.autoplay,loop:this.options.loop,playsinline:this.options.playsinline,\"webkit-playsinline\":this.options.playsinline,\"x5-playsinline\":this.options.playsinline,preload:this.options.preload,poster:this.options.source.poster},this.options.videoAttr));const e=this.options,t=e.muted,i=e.volume,s=e.playbackRate;t&&this.mute(),this.$video.volume=i,setTimeout((()=>{this.$root&&this.setPlaybackRate(s)})),this.$root=_.create(\"div.\"+_.css(\"\\n        position: relative;\\n        width: 100%;\\n        height: 100%;\\n        overflow: hidden;\\n        background-color: #000;\\n      \")),_.render(this.$video,this.$root),_.render(this.$root,this.container)}async load(e){var t;await(null==(t=this.loader)?void 0:t.destroy()),this.loader=void 0;for(const i of this.plugins)if(i.load){const t=await i.load(this,e);if(0!=t&&!this.loader){this.loader=t,this.emit(\"loaderchange\",t);break}}return this.loader||(this.$video.src=e.src),e}applyPlugin(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const i=e.name,s=e.key;if(this.context[e.key||e.name])throw new Error(\"duplicate plugin\");t||this.plugins.push(e);const n=e.apply(this);n&&(this.context[s||i]=n)}on(e,t){return\"string\"==typeof e?this.eventEmitter.on(e,t):Array.isArray(e)?this.eventEmitter.onAny(e,t):\"function\"==typeof e&&this.eventEmitter.on(\"*\",e),this}once(e,t){this.eventEmitter.once(e,t)}off(e,t){this.eventEmitter.off(e,t)}emit(e,t){this.eventEmitter.emit(e,t)}setPoster(e){this.$video.poster=e}play(){if((this.$video.src||this.$video.currentSrc)&&!this.isSourceChanging){if(this.options.autopause)for(let t=0;t<e.players.length;t++){const i=e.players[t];i!=this&&i.pause()}return this.$video.play()}}pause(){return this.$video.pause()}togglePlay(){return this.isPlaying?this.pause():this.play()}mute(){this.$video.muted=!0}unmute(){this.$video.muted=!1}toggleMute(){this.isMuted?this.unmute():this.mute()}setVolume(e){this.$video.volume=e>1?1:e<0?0:e,this.$video.volume>0&&this.isMuted&&this.unmute()}setPlaybackRate(e){this.$video.playbackRate=e}seek(e){this.$video.currentTime=e}setLoop(e){this.$video.loop=e}async enterFullscreen(){this.isInPip&&await this.exitPip(),this._requestFullscreen?this._requestFullscreen.call(this.$root,{navigationUI:\"hide\"}):this.$video.webkitEnterFullscreen()}exitFullscreen(){return this._exitFullscreen.call(document)}get isFullscreenEnabled(){return document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled||this.$video.webkitEnterFullscreen}get isFullScreen(){return Boolean((document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement)===this.$root||this.$video.webkitDisplayingFullscreen)}toggleFullScreen(){return this.isFullScreen?this.exitFullscreen():this.enterFullscreen()}get isPipEnabled(){return document.pictureInPictureEnabled}enterPip(){return this.$video.requestPictureInPicture()}exitPip(){return!!this.isInPip&&document.exitPictureInPicture()}get isInPip(){return document.pictureInPictureElement==this.$video}togglePip(){return this.isInPip?this.exitPip():this.enterPip()}changeQuality(e){return this._loader(e,{keepPlaying:!0,keepTime:!0,preEvent:\"videoqualitychange\",event:\"videoqualitychanged\",brokenEvent:\"qualitychangeerror\"})}changeSource(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return this._loader(e,{keepPlaying:t,preEvent:\"videosourcechange\",event:\"videosourcechanged\",brokenEvent:\"sourcechangeerror\"})}_loader(e,t){return new Promise(((i,s)=>{if(this.isSourceChanging)return s(Error(\"Previous Source is Changing.\"));const n=this.isPlaying,r=this.currentTime,o=this.volume,l=this.playbackRate;this.pause(),this.hasError=!1,this.isSourceChanging=!0,this.emit(t.preEvent,e);const a=t.keepPlaying,u=t.keepTime,c=\"none\"==this.options.preload,h=c?\"loadstart\":\"loadedmetadata\",d=a&&n;let p;const g=i=>{this.$root&&(this.off(h,v),this.emit(t.brokenEvent,{source:p||e,error:i}),\"videosourcechanged\"==t.event?this.isSourceChanging=!1:this.load(this.options.source).then(f).finally((()=>{this.isSourceChanging=!1})),s(i))},f=()=>{o!=this.volume&&this.setVolume(o),l!=this.playbackRate&&this.setPlaybackRate(l),c&&u&&this.$video.load(),u&&!this.options.isLive&&this.seek(r),d&&!this.isPlaying&&this.$video.play(),Object.assign(this.options.source,p)},v=()=>{this.$root&&(this.off(\"error\",g),f(),this.isSourceChanging=!1,this.emit(t.event,p),i())};return(e instanceof Promise?e:Promise.resolve(e)).then((e=>{if(!e.src)throw new Error(\"Empty Source\");return p=e,this.$video.poster=e.poster||\"\",this.once(\"error\",g),this.once(h,v),e})).then((e=>this.load(e))).catch(g)}))}destroy(){e.players.splice(e.players.indexOf(this),1);const t=this.eventEmitter,i=this.loader,s=this.plugins,n=this.container,r=this.$root,o=this.$video,l=this.isPlaying,a=this.isFullScreen,u=this.isInPip;t.emit(\"destroy\"),t.offAll(),null==i||i.destroy(),s.forEach((e=>{var t;return!e.load&&(null==(t=e.destroy)?void 0:t.call(e))})),l&&this.pause(),a&&this.exitFullscreen(),u&&this.exitPip(),o.src&&URL.revokeObjectURL(o.src),n.removeChild(r),this.eventEmitter=this.locales=this.options=this.listeners=this.context=this.plugins=this.container=this.$root=this.$video=this.loader=void 0}get isNativeUI(){return this.options.isNativeUI()}get state(){return this.$video.readyState}get isPlaying(){return!this.$video.paused}get isMuted(){return this.$video.muted}get isEnded(){return this.$video.ended}get isLoop(){return this.$video.loop}get isAutoPlay(){return this.$video.autoplay}get duration(){return this.$video.duration}get buffered(){return this.$video.buffered}get currentTime(){return this.$video.currentTime}get volume(){return this.$video.volume}get playbackRate(){return this.$video.playbackRate}get _requestFullscreen(){return HTMLElement.prototype.requestFullscreen||HTMLElement.prototype.webkitRequestFullscreen||HTMLElement.prototype.mozRequestFullScreen||HTMLElement.prototype.msRequestFullscreen}get _exitFullscreen(){return Document.prototype.exitFullscreen||Document.prototype.webkitExitFullscreen||Document.prototype.cancelFullScreen||Document.prototype.mozCancelFullScreen||Document.prototype.msExitFullscreen}static get version(){return\"1.2.38-beta.2\"}};Q.players=[];let H=Q;globalThis.window&&console.log(\"%cOPlayer%c v%s\\n %c\\nOh! Another HTML5 video player.\\nhttps://github.com/shiyiya/oplayer\\n\",\"font-size:32px;\",\"font-size:12px;color:#999999;\",H.version,\"font-size:14px;\");const U=(e,t,i)=>{var s;const n=document.createElement(\"script\");n.src=e,n.onload=t,n.onerror=i;const r=document.getElementsByTagName(\"script\")[0];null==(s=null==r?void 0:r.parentNode)||s.insertBefore(n,r)},W={},J=e=>void 0===e,K=Object.freeze(Object.defineProperty({__proto__:null,isUndefined:J,loadSDK:function(e,t,i){let s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:()=>!0,n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:U;const r=e=>J(window[e])?window.exports&&window.exports[e]?window.exports[e]:window.module&&window.module.exports&&window.module.exports[e]?window.module.exports[e]:void 0:window[e],o=r(t);return o&&s(o)?Promise.resolve(o):new Promise(((s,o)=>{if(!J(W[e]))return void W[e].push({resolve:s,reject:o});W[e]=[{resolve:s,reject:o}];const l=t=>{var i;null==(i=W[e])||i.forEach((e=>e.resolve(t)))};if(!J(i)){const e=window[i];window[i]=function(){J(e)||e.apply(void 0,arguments),l(r(t))}}n(e,(()=>{J(i)&&l(r(t))}),(t=>{var i;null==(i=W[e])||i.forEach((e=>{e.reject(t)})),delete W[e]}))}))},loadScript:U},Symbol.toStringTag,{value:\"Module\"}));return Object.assign(H,{$:k,EVENTS:d,OH_EVENTS:h,VIDEO_EVENTS:u,PLAYER_EVENTS:c},v,z,K)}));\n+!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).OPlayer=t()}(this,(function(){\"use strict\";var e,t,i,s,n,r,o,l,a;const u=[\"abort\",\"canplay\",\"canplaythrough\",\"durationchange\",\"emptied\",\"ended\",\"error\",\"loadeddata\",\"loadedmetadata\",\"loadstart\",\"pause\",\"play\",\"playing\",\"progress\",\"ratechange\",\"seeked\",\"seeking\",\"stalled\",\"suspend\",\"timeupdate\",\"volumechange\",\"waiting\",\"encrypted\",\"waitingforkey\",\"enterpictureinpicture\",\"leavepictureinpicture\"],c=[\"contextmenu\"],h=[\"loadedplugin\",\"videoqualitychange\",\"videosourcechange\",\"destroy\"],d=[].concat(u,c,h);class p{constructor(){this.events=Object.create(null)}on(e,t){this.events[e]||(this.events[e]=[]),this.events[e].push(t)}onAny(e,t){e.forEach((e=>this.on(e,t)))}once(e,t){const i=i=>{t({type:e,payload:i.payload})};i.raw=t,this.on(e,i)}off(e,t){if(this.events[e])for(let i=0;i<this.events[e].length;i++){const s=this.events[e][i];s!=t&&t!=s.raw||this.events[e].splice(i,1)}}offAny(e){this.events[e]=[]}offAll(){this.events=Object.create(null)}emit(e,t){var i,s;const n=[];null==(i=this.events[e])||i.forEach((i=>{i({type:e,payload:t}),i.raw&&n.push(i)})),null==(s=this.events[\"*\"])||s.forEach((i=>{i({type:e,payload:t}),i.raw&&n.push(i)})),n.forEach((t=>{this.off(e,t)}))}}function g(e){return Boolean(e&&\"object\"==typeof e&&!Array.isArray(e))}function f(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),s=1;s<t;s++)i[s-1]=arguments[s];if(!i.length)return e;const n=i.shift();if(g(e)&&g(n))for(const r in n)g(n[r])?(e[r]||Object.assign(e,{[r]:{}}),f(e[r],n[r])):Object.assign(e,{[r]:n[r]});return f.apply(void 0,[e].concat(i))}const v=Object.freeze(Object.defineProperty({__proto__:null,isObject:g,isPlainObject:function(e){if(\"object\"!=typeof e||null===e)return!1;let t=e;for(;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t},mergeDeep:f},Symbol.toStringTag,{value:\"Module\"})),y={Play:\"播放\",Pause:\"暂停\",Loop:\"循环播放\",Volume:\"音量\",\"Volume: %s\":\"音量：%s\",Mute:\"静音\",Speed:\"播放速度\",LIVE:\"直播\",Language:\"语言\",Screenshot:\"截图\",Subtitle:\"字幕\",Quality:\"画质\",Fullscreen:\"全屏\",Settings:\"设置\",\"Picture in Picture\":\"画中画\",Danmaku:\"弹幕\",Display:\"显示\",Opacity:\"透明度\",FontSize:\"字体大小\",\"Display Area\":\"显示区域\",Off:\"关闭\",Auto:\"自动\",Default:\"默认\",Normal:\"正常\",\"%ss\":\"%s秒\",Close:\"关闭\",\"Can be closed after %ss\":\"%s秒后可关闭广告\"},m={Play:\"پخش\",Next:\"بعدی\",Previous:\"قبلی\",Pause:\"توقف\",Loop:\"تکرار\",Volume:\"حجم صدا\",\"Volume: %s\":\"حجم صدا: %s\",Mute:\"بی‌صدا کردن\",Speed:\"سرعت\",LIVE:\"زنده\",WebFullscreen:\"تمام صفحه وب\",Chromecast:\"کروم کاست\",AirPlay:\"ایر پلی\",Playlist:\"پلی‌لیست\",Heatmap:\"نقشهٔ حرارتی\",Language:\"زبان\",Screenshot:\"عکس صفحه\",Subtitle:\"زیرنویس\",Quality:\"کیفیت\",Fullscreen:\"تمام صفحه\",Settings:\"تنظیمات\",\"Picture in Picture\":\"تصویر در تصویر\",Danmaku:\"دانماکو\",Display:\"نمایش\",Opacity:\"شفافیت\",FontSize:\"اندازه فونت\",\"Display Area\":\"ناحیه نمایش\",Off:\"خاموش\",Auto:\"خودکار\",Default:\"پیش‌فرض\",Normal:\"عادی\",\"%ss\":\"%s ثانیه\",Close:\"بستن\",\"Can be closed after %ss\":\"قابل بستن پس از %s ثانیه\"},b={Play:\"پلې‌کول\",Next:\"بل\",Previous:\"مخکېنی\",Pause:\"تم کول\",Loop:\"تکرار\",Volume:\"غږ\",\"Volume: %s\":\"غږ: %s\",Mute:\"غلی کول\",Speed:\"چټکتیا\",LIVE:\"ژوندی\",WebFullscreen:\"د تمام صفحه وب\",Chromecast:\"کروم کاسټ\",AirPlay:\"ایر پلی\",Playlist:\"پلې‌لسټ\",Heatmap:\"د ډېرو کتلو نقشه\",Language:\"ژبه\",Screenshot:\"سکرین شاټ\",Subtitle:\"لاندې لیک\",Quality:\"کیفیت\",Fullscreen:\"پوره پرده\",\"\":\"د متن ډیکوډر ملاتړ نه لري\",Settings:\"ترتیبات\",\"Picture in Picture\":\"انځور په انځور\",Danmaku:\"دانماکو\",Display:\"ښکاره کول\",Opacity:\"روڼوالی\",FontSize:\"د خط اندازه\",\"Display Area\":\"د ښودلو ساحه\",Off:\"بند\",Auto:\"خودکار\",Default:\"پېل شوی\",Normal:\"عادي\",\"%ss\":\"%s ثانیه\",Close:\"بندول\",\"Can be closed after %ss\":\"د %s ثانیو وروسته تړل کېدای شي\"};class E{constructor(e){this.languages={zh:y,\"zh-CN\":y,fa:m,pa:b,en:Object.keys(y).reduce(((e,t)=>(e[t]=t,e)),{})},this.lang=\"auto\"===e?navigator.language:e,this.languages[this.lang]||navigator.languages.some((e=>{if(this.languages[e])return this.lang=e,!0;if(-1!==e.indexOf(\"-\")){const t=e.split(\"-\")[0];if(t&&this.languages[t])return this.lang=t,!0}return!1})),this.languages[this.lang]||(this.lang=\"en\")}get(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),s=1;s<t;s++)i[s-1]=arguments[s];const n=this.languages[this.lang][e];if(null==n)return e;let r=0;return n.replace(/%s/gi,(()=>{var e;return null!==(e=i[r++])&&void 0!==e?e:\"\"}))}update(e){f(this.languages,e)}}function P(e){return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=1540483477,s=24,n=t^e.length,r=e.length,o=0;for(;r>=4;){let t=w(e,o);t=O(t,i),t^=t>>>s,t=O(t,i),n=O(n,i),n^=t,o+=4,r-=4}switch(r){case 3:n^=S(e,o),n^=e.charCodeAt(o+2)<<16,n=O(n,i);break;case 2:n^=S(e,o),n=O(n,i);break;case 1:n^=e.charCodeAt(o),n=O(n,i)}return n^=n>>>13,n=O(n,i),n^=n>>>15,n>>>0}(e).toString(36)}function w(e,t){return e.charCodeAt(t++)+(e.charCodeAt(t++)<<8)+(e.charCodeAt(t++)<<16)+(e.charCodeAt(t)<<24)}function S(e,t){return e.charCodeAt(t++)+(e.charCodeAt(t++)<<8)}function O(e,t){return(65535&(e|=0))*(t|=0)+(((e>>>16)*t&65535)<<16)|0}var k,$=/[(),]|\"(?:\\\\.|[^\"\\n])*\"|'(?:\\\\.|[^'\\n])*'|\\/\\*[\\s\\S]*?\\*\\//g;function x(e){if(-1===e.indexOf(\",\"))return[e];for(var t,i=[],s=[],n=0;t=$.exec(e);)switch(t[0]){case\"(\":n++;break;case\")\":n--;break;case\",\":if(n)break;i.push(t.index)}for(t=i.length;t--;)s.unshift(e.slice(i[t]+1)),e=e.slice(0,i[t]);return s.unshift(e),s}function A(e,t){let i=x(e);return x(t).map((e=>e.indexOf(\"&\")>=0?e:\"&\"+e)).reduce(((e,t)=>e.concat(i.map((e=>t.replace(/\\&/g,e))))),[]).join(\",\")}function F(e){return 0===e.indexOf(\"@media\")}function T(e){return 0===e.indexOf(\"@keyframes\")}function j(e,t){var i;let s=t.rules,n=t.mediaQuery,r=t.globalSelector,o={};return r&&(e=r),null==(i=Object.keys(s))||i.forEach((t=>{if(function(e){return 0===e.indexOf(\"@global\")}(t)){const i=t,l=(t=t.substring(8)).indexOf(\"&\");let a;-1!=l?(a=A(e,t),r=t.substring(0,l-1).trim()):a=t,f(o,j(a,{mediaQuery:n,rules:s[i],globalSelector:a}))}else if(function(e){let t=[\":\",\".\",\"[\",\">\",\" \"],i=!1,s=e.charAt(0);for(let n=0;n<t.length;n++)if(s===t[n]){i=!0;break}return i||e.indexOf(\"&\")>=0}(t))f(o,j(A(e,t),{rules:s[t],mediaQuery:n}));else if(F(t))f(o,j(e,{mediaQuery:(d=n,p=t,d?\"@media \"+d.substring(6)+\" and \"+p.substring(6):p),rules:s[t]}));else{var i,l,a,u,c,h;if(n)null!==(i=o[n])&&void 0!==i||(o[n]={}),null!==(u=(l=o[n])[a=e])&&void 0!==u||(l[a]={}),o[n][e][t]=s[t];else if(T(t))o[t]=s[t];else null!==(h=o[c=e])&&void 0!==h||(o[c]={}),o[e][t]=s[t]}var d,p})),o}function C(e){let t=[];for(const i in e)if(Object.hasOwnProperty.call(e,i)){const s=e[i];g(s)?t.push(i+\"{\"+C(s)+\"}\"):t.push(i+\":\"+s)}return/^\\d%/.test(t[0])?t.join(\" \"):t.join(\";\")}function L(e){let t=[];for(const i in e)if(Object.hasOwnProperty.call(e,i)){const s=e[i];if(F(i))t.push(i+\"{\"+L(s)+\"}\");else if(T(i))t.push(i+\"{\"+C(s)+\"}\");else{const e=Object.entries(s).map((e=>e[0]+\":\"+e[1])).join(\";\");t.push(i+\"{\"+e+\"}\")}}return t}function D(e,t){return L(j(t,{rules:e}))}(e=>{function t(t){if(!(0,e.isBrowser)())return null;let i=document.createElement(\"style\");i.setAttribute(\"data-\"+t,\"\"),i.appendChild(document.createTextNode(\"\")),(document.head||document.getElementsByTagName(\"head\")[0]).appendChild(i);for(let e=0;e<document.styleSheets.length;e++)if(document.styleSheets[e].ownerNode===i)return document.styleSheets.item(e);return null}e.create=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\";const s=-1!==e.indexOf(\"#\"),n=-1!==e.indexOf(\".\"),r=s?e.split(\"#\"):n?e.split(\".\"):[e],o=r[0],l=r[1],a=document.createElement(o);return s&&(a.id=l),n&&a.classList.add(l),i&&(a.innerHTML=i),Object.keys(t).forEach((e=>{const i=t[e];\"video\"!==o&&\"audio\"!==o||\"boolean\"!=typeof i?void 0!==i&&a.setAttribute(e,\"\"+i):i&&a.setAttribute(e,\"\")})),a},e.render=(e,t)=>t.appendChild(e),e.isBrowser=()=>Boolean(\"undefined\"!=typeof globalThis&&globalThis.document&&globalThis.document.documentElement),e.createSheet=t;const i=(()=>{const e=Object.create({});return t=>{const i=\"object\"==typeof t?JSON.stringify(t):t;return e[i]||(e[i]=\"css-\"+P(i)),e[i]}})();e.createCss=e=>{let t=e.sheet,s=e.ssrData;return function(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];const l=Boolean(r[0]&&r[0].length&&r[0].raw);let a=\"\";if(l){let e=r[0];a+=e[0];for(let t=1;t<r.length;t++)a+=\"string\"!=typeof r[t]?\"\":r[t],a+=e[t]}else a=\"string\"==typeof r[0]?r[0]:JSON.stringify(r[0]);const u=i(a);if(t)for(let i=0;i<t.cssRules.length;i++)if((null==(e=t.cssRules[i])?void 0:e.selectorText)==\".\"+u)return u;let c=[\".\"+u+\"{\"+a+\"}\"];return l||\"object\"!=typeof r[0]||(c=D(r[0],\".\"+u)),t?c.forEach((e=>{t.insertRule(e,t.cssRules.length)})):s=s.concat(c),u}},e.createStyled=()=>{const i=[],s=t(\"oplayer\");return{css:(0,e.createCss)({sheet:s,ssrData:i}),getCssValue:()=>i}};var s=(0,e.createStyled)();e.css=s.css,e.getCssValue=s.getCssValue,e.cls=e=>\"css-\"+P(e)})(k||(k={}));const _=k,N=/(iPad)/gi.test(null==(e=globalThis.navigator)?void 0:e.userAgent)||/Macintosh/i.test(null==(t=globalThis.navigator)?void 0:t.userAgent)&&Boolean(null==(i=globalThis.navigator)?void 0:i.maxTouchPoints)&&(null==(s=globalThis.navigator)?void 0:s.maxTouchPoints)>=1,R=/iPhone/gi.test(null==(n=globalThis.navigator)?void 0:n.userAgent),V=/^((?!chrome|android).)*safari/i.test(null==(r=globalThis.navigator)?void 0:r.userAgent),I=R||N,M=/Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone/i.test(null==(o=globalThis.navigator)?void 0:o.userAgent)||I,q=/mqqbrowser/i.test(null==(l=globalThis.navigator)?void 0:l.userAgent)&&!/ qq/i.test(null==(a=globalThis.navigator)?void 0:a.userAgent),z=Object.freeze(Object.defineProperty({__proto__:null,isIOS:I,isMobile:M,isQQBrowser:q,isSafari:V,isiPad:N,isiPhone:R},Symbol.toStringTag,{value:\"Module\"})),B={autoplay:!1,muted:!1,loop:!1,volume:1,preload:\"metadata\",playbackRate:1,playsinline:!0,lang:\"auto\",source:{},videoAttr:{},isLive:!1,autopause:!0,isNativeUI:()=>q},Q=class e{constructor(e,t){if(this.plugins=[],this.context={},this.listeners=Object.create(null),this.hasError=!1,this.isSourceChanging=!1,this.container=\"string\"==typeof e?document.querySelector(e):e,!this.container)throw new Error((\"string\"==typeof e?e:\"Element\")+\"does not exist\");this.options=Object.assign({},B,\"string\"==typeof t?{source:{src:t}}:t),this.locales=new E(this.options.lang),this.eventEmitter=new p}static make(t,i){return new e(t,i)}use(e){return e.forEach((e=>{this.plugins.push(e)})),this}create(){return this.render(),this.initEvent(),this.plugins.forEach((e=>this.applyPlugin(e,!0))),this.options.source.src&&this.load(this.options.source),e.players.push(this),this}initEvent(){this.listeners.error=e=>{this.$video.error&&(this.hasError=!0,this.eventEmitter.emit(\"error\",e))},this.$video.addEventListener(\"error\",(e=>this.listeners.error(e)));const e=(e,t)=>{this.eventEmitter.emit(e,t)};[[this.$video,[\"fullscreenchange\",\"webkitbeginfullscreen\",\"webkitendfullscreen\"],[\"fullscreenerror\",\"webkitfullscreenerror\",\"mozfullscreenerror\"]],[this.$root,[\"fullscreenchange\",\"webkitfullscreenchange\"],[\"fullscreenerror\",\"webkitfullscreenerror\",\"mozfullscreenerror\"]]].forEach((t=>{const i=t[0];t.slice(1).forEach((t=>{const s=t[0];this.listeners[s]=e,t.forEach((e=>{i.addEventListener(e,(e=>{this.listeners[s](s,e)}),{passive:!0})}))}))})),[[this.$video,u],[this.$root,c]].forEach((t=>{let i=t[0];t[1].forEach((t=>{this.listeners[t]||(this.listeners[t]=e,i.addEventListener(t,(e=>{var i;null==(i=this.listeners)||i[t](t,e)}),{passive:!0}))}))}))}render(){this.$video=_.create(\"video.\"+_.css(\"\\n        width: 100%;\\n        height: 100%;\\n        display: block;\\n        position: relative;\\n      \"),Object.assign({autoplay:this.options.autoplay,loop:this.options.loop,playsinline:this.options.playsinline,\"webkit-playsinline\":this.options.playsinline,\"x5-playsinline\":this.options.playsinline,preload:this.options.preload,poster:this.options.source.poster},this.options.videoAttr));const e=this.options,t=e.muted,i=e.volume,s=e.playbackRate;t&&this.mute(),this.$video.volume=i,setTimeout((()=>{this.$root&&this.setPlaybackRate(s)})),this.$root=_.create(\"div.\"+_.css(\"\\n        position: relative;\\n        width: 100%;\\n        height: 100%;\\n        overflow: hidden;\\n        background-color: #000;\\n      \")),_.render(this.$video,this.$root),_.render(this.$root,this.container)}async load(e){var t;await(null==(t=this.loader)?void 0:t.destroy()),this.loader=void 0;for(const i of this.plugins)if(i.load){const t=await i.load(this,e);if(0!=t&&!this.loader){this.loader=t,this.emit(\"loaderchange\",t);break}}return this.loader||(this.$video.src=e.src),e}applyPlugin(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const i=e.name,s=e.key;if(this.context[e.key||e.name])throw new Error(\"duplicate plugin\");t||this.plugins.push(e);const n=e.apply(this);n&&(this.context[s||i]=n)}on(e,t){return\"string\"==typeof e?this.eventEmitter.on(e,t):Array.isArray(e)?this.eventEmitter.onAny(e,t):\"function\"==typeof e&&this.eventEmitter.on(\"*\",e),this}once(e,t){this.eventEmitter.once(e,t)}off(e,t){this.eventEmitter.off(e,t)}emit(e,t){this.eventEmitter.emit(e,t)}setPoster(e){this.$video.poster=e}play(){if((this.$video.src||this.$video.currentSrc)&&!this.isSourceChanging){if(this.options.autopause)for(let t=0;t<e.players.length;t++){const i=e.players[t];i!=this&&i.pause()}return this.$video.play()}}pause(){return this.$video.pause()}togglePlay(){return this.isPlaying?this.pause():this.play()}mute(){this.$video.muted=!0}unmute(){this.$video.muted=!1}toggleMute(){this.isMuted?this.unmute():this.mute()}setVolume(e){this.$video.volume=e>1?1:e<0?0:e,this.$video.volume>0&&this.isMuted&&this.unmute()}setPlaybackRate(e){this.$video.playbackRate=e}seek(e){this.$video.currentTime=e}setLoop(e){this.$video.loop=e}async enterFullscreen(){this.isInPip&&await this.exitPip(),this._requestFullscreen?this._requestFullscreen.call(this.$root,{navigationUI:\"hide\"}):this.$video.webkitEnterFullscreen()}exitFullscreen(){return this._exitFullscreen.call(document)}get isFullscreenEnabled(){return document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled||this.$video.webkitEnterFullscreen}get isFullScreen(){return Boolean((document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement)===this.$root||this.$video.webkitDisplayingFullscreen)}toggleFullScreen(){return this.isFullScreen?this.exitFullscreen():this.enterFullscreen()}get isPipEnabled(){return document.pictureInPictureEnabled}enterPip(){return this.$video.requestPictureInPicture()}exitPip(){return!!this.isInPip&&document.exitPictureInPicture()}get isInPip(){return document.pictureInPictureElement==this.$video}togglePip(){return this.isInPip?this.exitPip():this.enterPip()}changeQuality(e){return this._loader(e,{keepPlaying:!0,keepTime:!0,preEvent:\"videoqualitychange\",event:\"videoqualitychanged\",brokenEvent:\"qualitychangeerror\"})}changeSource(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return this._loader(e,{keepPlaying:t,preEvent:\"videosourcechange\",event:\"videosourcechanged\",brokenEvent:\"sourcechangeerror\"})}_loader(e,t){return new Promise(((i,s)=>{if(this.isSourceChanging)return s(Error(\"Previous Source is Changing.\"));const n=this.isPlaying,r=this.currentTime,o=this.volume,l=this.playbackRate;this.pause(),this.hasError=!1,this.isSourceChanging=!0,this.emit(t.preEvent,e);const a=t.keepPlaying,u=t.keepTime,c=\"none\"==this.options.preload,h=c?\"loadstart\":\"loadedmetadata\",d=a&&n;let p;const g=i=>{this.$root&&(this.off(h,v),this.emit(t.brokenEvent,{source:p||e,error:i}),\"videosourcechanged\"==t.event?this.isSourceChanging=!1:this.load(this.options.source).then(f).finally((()=>{this.isSourceChanging=!1})),s(i))},f=()=>{o!=this.volume&&this.setVolume(o),l!=this.playbackRate&&this.setPlaybackRate(l),c&&u&&this.$video.load(),u&&!this.options.isLive&&this.seek(r),d&&!this.isPlaying&&this.$video.play(),Object.assign(this.options.source,p)},v=()=>{this.$root&&(this.off(\"error\",g),f(),this.isSourceChanging=!1,this.emit(t.event,p),i())};return(e instanceof Promise?e:Promise.resolve(e)).then((e=>{if(!e.src)throw new Error(\"Empty Source\");return p=e,this.$video.poster=e.poster||\"\",this.once(\"error\",g),this.once(h,v),e})).then((e=>this.load(e))).catch(g)}))}destroy(){e.players.splice(e.players.indexOf(this),1);const t=this.eventEmitter,i=this.loader,s=this.plugins,n=this.container,r=this.$root,o=this.$video,l=this.isPlaying,a=this.isFullScreen,u=this.isInPip;t.emit(\"destroy\"),t.offAll(),null==i||i.destroy(),s.forEach((e=>{var t;return!e.load&&(null==(t=e.destroy)?void 0:t.call(e))})),l&&this.pause(),a&&this.exitFullscreen(),u&&this.exitPip(),o.src&&URL.revokeObjectURL(o.src),n.removeChild(r),this.eventEmitter=this.locales=this.options=this.listeners=this.context=this.plugins=this.container=this.$root=this.$video=this.loader=void 0}get isNativeUI(){return this.options.isNativeUI()}get state(){return this.$video.readyState}get isPlaying(){return!this.$video.paused}get isMuted(){return this.$video.muted}get isEnded(){return this.$video.ended}get isLoop(){return this.$video.loop}get isAutoPlay(){return this.$video.autoplay}get duration(){return this.$video.duration}get buffered(){return this.$video.buffered}get currentTime(){return this.$video.currentTime}get volume(){return this.$video.volume}get playbackRate(){return this.$video.playbackRate}get _requestFullscreen(){return HTMLElement.prototype.requestFullscreen||HTMLElement.prototype.webkitRequestFullscreen||HTMLElement.prototype.mozRequestFullScreen||HTMLElement.prototype.msRequestFullscreen}get _exitFullscreen(){return Document.prototype.exitFullscreen||Document.prototype.webkitExitFullscreen||Document.prototype.cancelFullScreen||Document.prototype.mozCancelFullScreen||Document.prototype.msExitFullscreen}static get version(){return\"1.2.38-beta.2\"}};Q.players=[];let H=Q;const U=(e,t,i)=>{var s;const n=document.createElement(\"script\");n.src=e,n.onload=t,n.onerror=i;const r=document.getElementsByTagName(\"script\")[0];null==(s=null==r?void 0:r.parentNode)||s.insertBefore(n,r)},W={},J=e=>void 0===e,K=Object.freeze(Object.defineProperty({__proto__:null,isUndefined:J,loadSDK:function(e,t,i){let s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:()=>!0,n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:U;const r=e=>J(window[e])?window.exports&&window.exports[e]?window.exports[e]:window.module&&window.module.exports&&window.module.exports[e]?window.module.exports[e]:void 0:window[e],o=r(t);return o&&s(o)?Promise.resolve(o):new Promise(((s,o)=>{if(!J(W[e]))return void W[e].push({resolve:s,reject:o});W[e]=[{resolve:s,reject:o}];const l=t=>{var i;null==(i=W[e])||i.forEach((e=>e.resolve(t)))};if(!J(i)){const e=window[i];window[i]=function(){J(e)||e.apply(void 0,arguments),l(r(t))}}n(e,(()=>{J(i)&&l(r(t))}),(t=>{var i;null==(i=W[e])||i.forEach((e=>{e.reject(t)})),delete W[e]}))}))},loadScript:U},Symbol.toStringTag,{value:\"Module\"}));return Object.assign(H,{$:k,EVENTS:d,OH_EVENTS:h,VIDEO_EVENTS:u,PLAYER_EVENTS:c},v,z,K)}));\ndiff --git a/dist/index.ui.js b/dist/index.ui.js\nindex 14b911728ef68f51ceefdb6f31e17d4e4da7624c..afdfa57f992f1af501ebd4c601174d80c4de379a 100644\n--- a/dist/index.ui.js\n+++ b/dist/index.ui.js\n@@ -5,4 +5,4 @@\n  * author: shiyiya\n  * homepage: https://github.com/shiyiya/oplayer\n  */\n-!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).OPlayer=t()}(this,(function(){\"use strict\";var e,t,n,o,i,r,s,a,l,c,d,u,h,p,g,m,v;function f(e,t){return t||(t=e.slice(0)),e.raw=t,e}function b(e){return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=1540483477,o=24,i=t^e.length,r=e.length,s=0;for(;r>=4;){let t=y(e,s);t=x(t,n),t^=t>>>o,t=x(t,n),i=x(i,n),i^=t,s+=4,r-=4}switch(r){case 3:i^=k(e,s),i^=e.charCodeAt(s+2)<<16,i=x(i,n);break;case 2:i^=k(e,s),i=x(i,n);break;case 1:i^=e.charCodeAt(s),i=x(i,n)}return i^=i>>>13,i=x(i,n),i^=i>>>15,i>>>0}(e).toString(36)}function y(e,t){return e.charCodeAt(t++)+(e.charCodeAt(t++)<<8)+(e.charCodeAt(t++)<<16)+(e.charCodeAt(t)<<24)}function k(e,t){return e.charCodeAt(t++)+(e.charCodeAt(t++)<<8)}function x(e,t){return(65535&(e|=0))*(t|=0)+(((e>>>16)*t&65535)<<16)|0}function w(e){return Boolean(e&&\"object\"==typeof e&&!Array.isArray(e))}function E(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];if(!n.length)return e;const i=n.shift();if(w(e)&&w(i))for(const r in i)w(i[r])?(e[r]||Object.assign(e,{[r]:{}}),E(e[r],i[r])):Object.assign(e,{[r]:i[r]});return E.apply(void 0,[e].concat(n))}var $,L=/[(),]|\"(?:\\\\.|[^\"\\n])*\"|'(?:\\\\.|[^'\\n])*'|\\/\\*[\\s\\S]*?\\*\\//g;function S(e){if(-1===e.indexOf(\",\"))return[e];for(var t,n=[],o=[],i=0;t=L.exec(e);)switch(t[0]){case\"(\":i++;break;case\")\":i--;break;case\",\":if(i)break;n.push(t.index)}for(t=n.length;t--;)o.unshift(e.slice(n[t]+1)),e=e.slice(0,n[t]);return o.unshift(e),o}function T(e,t){let n=S(e);return S(t).map((e=>e.indexOf(\"&\")>=0?e:\"&\"+e)).reduce(((e,t)=>e.concat(n.map((e=>t.replace(/\\&/g,e))))),[]).join(\",\")}function P(e){return 0===e.indexOf(\"@media\")}function z(e){return 0===e.indexOf(\"@keyframes\")}function A(e,t){var n;let o=t.rules,i=t.mediaQuery,r=t.globalSelector,s={};return r&&(e=r),null==(n=Object.keys(o))||n.forEach((t=>{if(function(e){return 0===e.indexOf(\"@global\")}(t)){const n=t,a=(t=t.substring(8)).indexOf(\"&\");let l;-1!=a?(l=T(e,t),r=t.substring(0,a-1).trim()):l=t,E(s,A(l,{mediaQuery:i,rules:o[n],globalSelector:l}))}else if(function(e){let t=[\":\",\".\",\"[\",\">\",\" \"],n=!1,o=e.charAt(0);for(let i=0;i<t.length;i++)if(o===t[i]){n=!0;break}return n||e.indexOf(\"&\")>=0}(t))E(s,A(T(e,t),{rules:o[t],mediaQuery:i}));else if(P(t))E(s,A(e,{mediaQuery:(h=i,p=t,h?\"@media \"+h.substring(6)+\" and \"+p.substring(6):p),rules:o[t]}));else{var n,a,l,c,d,u;if(i)null!==(n=s[i])&&void 0!==n||(s[i]={}),null!==(c=(a=s[i])[l=e])&&void 0!==c||(a[l]={}),s[i][e][t]=o[t];else if(z(t))s[t]=o[t];else null!==(u=s[d=e])&&void 0!==u||(s[d]={}),s[e][t]=o[t]}var h,p})),s}function O(e){let t=[];for(const n in e)if(Object.hasOwnProperty.call(e,n)){const o=e[n];w(o)?t.push(n+\"{\"+O(o)+\"}\"):t.push(n+\":\"+o)}return/^\\d%/.test(t[0])?t.join(\" \"):t.join(\";\")}function C(e){let t=[];for(const n in e)if(Object.hasOwnProperty.call(e,n)){const o=e[n];if(P(n))t.push(n+\"{\"+C(o)+\"}\");else if(z(n))t.push(n+\"{\"+O(o)+\"}\");else{const e=Object.entries(o).map((e=>e[0]+\":\"+e[1])).join(\";\");t.push(n+\"{\"+e+\"}\")}}return t}function M(e,t){return C(A(t,{rules:e}))}(e=>{function t(t){if(!(0,e.isBrowser)())return null;let n=document.createElement(\"style\");n.setAttribute(\"data-\"+t,\"\"),n.appendChild(document.createTextNode(\"\")),(document.head||document.getElementsByTagName(\"head\")[0]).appendChild(n);for(let e=0;e<document.styleSheets.length;e++)if(document.styleSheets[e].ownerNode===n)return document.styleSheets.item(e);return null}e.create=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\";const o=-1!==e.indexOf(\"#\"),i=-1!==e.indexOf(\".\"),r=o?e.split(\"#\"):i?e.split(\".\"):[e],s=r[0],a=r[1],l=document.createElement(s);return o&&(l.id=a),i&&l.classList.add(a),n&&(l.innerHTML=n),Object.keys(t).forEach((e=>{const n=t[e];\"video\"!==s&&\"audio\"!==s||\"boolean\"!=typeof n?void 0!==n&&l.setAttribute(e,\"\"+n):n&&l.setAttribute(e,\"\")})),l},e.render=(e,t)=>t.appendChild(e),e.isBrowser=()=>Boolean(\"undefined\"!=typeof globalThis&&globalThis.document&&globalThis.document.documentElement),e.createSheet=t;const n=(()=>{const e=Object.create({});return t=>{const n=\"object\"==typeof t?JSON.stringify(t):t;return e[n]||(e[n]=\"css-\"+b(n)),e[n]}})();e.createCss=e=>{let t=e.sheet,o=e.ssrData;return function(){for(var e,i=arguments.length,r=new Array(i),s=0;s<i;s++)r[s]=arguments[s];const a=Boolean(r[0]&&r[0].length&&r[0].raw);let l=\"\";if(a){let e=r[0];l+=e[0];for(let t=1;t<r.length;t++)l+=\"string\"!=typeof r[t]?\"\":r[t],l+=e[t]}else l=\"string\"==typeof r[0]?r[0]:JSON.stringify(r[0]);const c=n(l);if(t)for(let n=0;n<t.cssRules.length;n++)if((null==(e=t.cssRules[n])?void 0:e.selectorText)==\".\"+c)return c;let d=[\".\"+c+\"{\"+l+\"}\"];return a||\"object\"!=typeof r[0]||(d=M(r[0],\".\"+c)),t?d.forEach((e=>{t.insertRule(e,t.cssRules.length)})):o=o.concat(d),c}},e.createStyled=()=>{const n=[],o=t(\"oplayer\");return{css:(0,e.createCss)({sheet:o,ssrData:n}),getCssValue:()=>n}};var o=(0,e.createStyled)();e.css=o.css,e.getCssValue=o.getCssValue,e.cls=e=>\"css-\"+b(e)})($||($={}));const F=$,j=/(iPad)/gi.test(null==(l=globalThis.navigator)?void 0:l.userAgent)||/Macintosh/i.test(null==(c=globalThis.navigator)?void 0:c.userAgent)&&Boolean(null==(d=globalThis.navigator)?void 0:d.maxTouchPoints)&&(null==(u=globalThis.navigator)?void 0:u.maxTouchPoints)>=1,B=/iPhone/gi.test(null==(h=globalThis.navigator)?void 0:h.userAgent),R=/^((?!chrome|android).)*safari/i.test(null==(p=globalThis.navigator)?void 0:p.userAgent),H=B||j,q=/Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone/i.test(null==(g=globalThis.navigator)?void 0:g.userAgent)||H,I=/mqqbrowser/i.test(null==(m=globalThis.navigator)?void 0:m.userAgent)&&!/ qq/i.test(null==(v=globalThis.navigator)?void 0:v.userAgent),D=(e,t,n)=>{var o;const i=document.createElement(\"script\");i.src=e,i.onload=t,i.onerror=n;const r=document.getElementsByTagName(\"script\")[0];null==(o=null==r?void 0:r.parentNode)||o.insertBefore(i,r)},N={},V=e=>void 0===e,_=[\"abort\",\"canplay\",\"canplaythrough\",\"durationchange\",\"emptied\",\"ended\",\"error\",\"loadeddata\",\"loadedmetadata\",\"loadstart\",\"pause\",\"play\",\"playing\",\"progress\",\"ratechange\",\"seeked\",\"seeking\",\"stalled\",\"suspend\",\"timeupdate\",\"volumechange\",\"waiting\",\"encrypted\",\"waitingforkey\",\"enterpictureinpicture\",\"leavepictureinpicture\"],U=[\"contextmenu\"];class X{constructor(){this.events=Object.create(null)}on(e,t){this.events[e]||(this.events[e]=[]),this.events[e].push(t)}onAny(e,t){e.forEach((e=>this.on(e,t)))}once(e,t){const n=n=>{t({type:e,payload:n.payload})};n.raw=t,this.on(e,n)}off(e,t){if(this.events[e])for(let n=0;n<this.events[e].length;n++){const o=this.events[e][n];o!=t&&t!=o.raw||this.events[e].splice(n,1)}}offAny(e){this.events[e]=[]}offAll(){this.events=Object.create(null)}emit(e,t){var n,o;const i=[];null==(n=this.events[e])||n.forEach((n=>{n({type:e,payload:t}),n.raw&&i.push(n)})),null==(o=this.events[\"*\"])||o.forEach((n=>{n({type:e,payload:t}),n.raw&&i.push(n)})),i.forEach((t=>{this.off(e,t)}))}}const W={Play:\"播放\",Pause:\"暂停\",Loop:\"循环播放\",Volume:\"音量\",\"Volume: %s\":\"音量：%s\",Mute:\"静音\",Speed:\"播放速度\",LIVE:\"直播\",Language:\"语言\",Screenshot:\"截图\",Subtitle:\"字幕\",Quality:\"画质\",Fullscreen:\"全屏\",Settings:\"设置\",\"Picture in Picture\":\"画中画\",Danmaku:\"弹幕\",Display:\"显示\",Opacity:\"透明度\",FontSize:\"字体大小\",\"Display Area\":\"显示区域\",Off:\"关闭\",Auto:\"自动\",Default:\"默认\",Normal:\"正常\",\"%ss\":\"%s秒\",Close:\"关闭\",\"Can be closed after %ss\":\"%s秒后可关闭广告\"},Y={Play:\"پخش\",Next:\"بعدی\",Previous:\"قبلی\",Pause:\"توقف\",Loop:\"تکرار\",Volume:\"حجم صدا\",\"Volume: %s\":\"حجم صدا: %s\",Mute:\"بی‌صدا کردن\",Speed:\"سرعت\",LIVE:\"زنده\",WebFullscreen:\"تمام صفحه وب\",Chromecast:\"کروم کاست\",AirPlay:\"ایر پلی\",Playlist:\"پلی‌لیست\",Heatmap:\"نقشهٔ حرارتی\",Language:\"زبان\",Screenshot:\"عکس صفحه\",Subtitle:\"زیرنویس\",Quality:\"کیفیت\",Fullscreen:\"تمام صفحه\",Settings:\"تنظیمات\",\"Picture in Picture\":\"تصویر در تصویر\",Danmaku:\"دانماکو\",Display:\"نمایش\",Opacity:\"شفافیت\",FontSize:\"اندازه فونت\",\"Display Area\":\"ناحیه نمایش\",Off:\"خاموش\",Auto:\"خودکار\",Default:\"پیش‌فرض\",Normal:\"عادی\",\"%ss\":\"%s ثانیه\",Close:\"بستن\",\"Can be closed after %ss\":\"قابل بستن پس از %s ثانیه\"},Q={Play:\"پلې‌کول\",Next:\"بل\",Previous:\"مخکېنی\",Pause:\"تم کول\",Loop:\"تکرار\",Volume:\"غږ\",\"Volume: %s\":\"غږ: %s\",Mute:\"غلی کول\",Speed:\"چټکتیا\",LIVE:\"ژوندی\",WebFullscreen:\"د تمام صفحه وب\",Chromecast:\"کروم کاسټ\",AirPlay:\"ایر پلی\",Playlist:\"پلې‌لسټ\",Heatmap:\"د ډېرو کتلو نقشه\",Language:\"ژبه\",Screenshot:\"سکرین شاټ\",Subtitle:\"لاندې لیک\",Quality:\"کیفیت\",Fullscreen:\"پوره پرده\",\"\":\"د متن ډیکوډر ملاتړ نه لري\",Settings:\"ترتیبات\",\"Picture in Picture\":\"انځور په انځور\",Danmaku:\"دانماکو\",Display:\"ښکاره کول\",Opacity:\"روڼوالی\",FontSize:\"د خط اندازه\",\"Display Area\":\"د ښودلو ساحه\",Off:\"بند\",Auto:\"خودکار\",Default:\"پېل شوی\",Normal:\"عادي\",\"%ss\":\"%s ثانیه\",Close:\"بندول\",\"Can be closed after %ss\":\"د %s ثانیو وروسته تړل کېدای شي\"};class K{constructor(e){this.languages={zh:W,\"zh-CN\":W,fa:Y,pa:Q,en:Object.keys(W).reduce(((e,t)=>(e[t]=t,e)),{})},this.lang=\"auto\"===e?navigator.language:e,this.languages[this.lang]||navigator.languages.some((e=>{if(this.languages[e])return this.lang=e,!0;if(-1!==e.indexOf(\"-\")){const t=e.split(\"-\")[0];if(t&&this.languages[t])return this.lang=t,!0}return!1})),this.languages[this.lang]||(this.lang=\"en\")}get(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];const i=this.languages[this.lang][e];if(null==i)return e;let r=0;return i.replace(/%s/gi,(()=>{var e;return null!==(e=n[r++])&&void 0!==e?e:\"\"}))}update(e){E(this.languages,e)}}const J={autoplay:!1,muted:!1,loop:!1,volume:1,preload:\"metadata\",playbackRate:1,playsinline:!0,lang:\"auto\",source:{},videoAttr:{},isLive:!1,autopause:!0,isNativeUI:()=>I},G=class e{constructor(e,t){if(this.plugins=[],this.context={},this.listeners=Object.create(null),this.hasError=!1,this.isSourceChanging=!1,this.container=\"string\"==typeof e?document.querySelector(e):e,!this.container)throw new Error((\"string\"==typeof e?e:\"Element\")+\"does not exist\");this.options=Object.assign({},J,\"string\"==typeof t?{source:{src:t}}:t),this.locales=new K(this.options.lang),this.eventEmitter=new X}static make(t,n){return new e(t,n)}use(e){return e.forEach((e=>{this.plugins.push(e)})),this}create(){return this.render(),this.initEvent(),this.plugins.forEach((e=>this.applyPlugin(e,!0))),this.options.source.src&&this.load(this.options.source),e.players.push(this),this}initEvent(){this.listeners.error=e=>{this.$video.error&&(this.hasError=!0,this.eventEmitter.emit(\"error\",e))},this.$video.addEventListener(\"error\",(e=>this.listeners.error(e)));const e=(e,t)=>{this.eventEmitter.emit(e,t)};[[this.$video,[\"fullscreenchange\",\"webkitbeginfullscreen\",\"webkitendfullscreen\"],[\"fullscreenerror\",\"webkitfullscreenerror\",\"mozfullscreenerror\"]],[this.$root,[\"fullscreenchange\",\"webkitfullscreenchange\"],[\"fullscreenerror\",\"webkitfullscreenerror\",\"mozfullscreenerror\"]]].forEach((t=>{const n=t[0];t.slice(1).forEach((t=>{const o=t[0];this.listeners[o]=e,t.forEach((e=>{n.addEventListener(e,(e=>{this.listeners[o](o,e)}),{passive:!0})}))}))})),[[this.$video,_],[this.$root,U]].forEach((t=>{let n=t[0];t[1].forEach((t=>{this.listeners[t]||(this.listeners[t]=e,n.addEventListener(t,(e=>{var n;null==(n=this.listeners)||n[t](t,e)}),{passive:!0}))}))}))}render(){this.$video=F.create(\"video.\"+F.css(\"\\n        width: 100%;\\n        height: 100%;\\n        display: block;\\n        position: relative;\\n      \"),Object.assign({autoplay:this.options.autoplay,loop:this.options.loop,playsinline:this.options.playsinline,\"webkit-playsinline\":this.options.playsinline,\"x5-playsinline\":this.options.playsinline,preload:this.options.preload,poster:this.options.source.poster},this.options.videoAttr));const e=this.options,t=e.muted,n=e.volume,o=e.playbackRate;t&&this.mute(),this.$video.volume=n,setTimeout((()=>{this.$root&&this.setPlaybackRate(o)})),this.$root=F.create(\"div.\"+F.css(\"\\n        position: relative;\\n        width: 100%;\\n        height: 100%;\\n        overflow: hidden;\\n        background-color: #000;\\n      \")),F.render(this.$video,this.$root),F.render(this.$root,this.container)}async load(e){var t;await(null==(t=this.loader)?void 0:t.destroy()),this.loader=void 0;for(const n of this.plugins)if(n.load){const t=await n.load(this,e);if(0!=t&&!this.loader){this.loader=t,this.emit(\"loaderchange\",t);break}}return this.loader||(this.$video.src=e.src),e}applyPlugin(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const n=e.name,o=e.key;if(this.context[e.key||e.name])throw new Error(\"duplicate plugin\");t||this.plugins.push(e);const i=e.apply(this);i&&(this.context[o||n]=i)}on(e,t){return\"string\"==typeof e?this.eventEmitter.on(e,t):Array.isArray(e)?this.eventEmitter.onAny(e,t):\"function\"==typeof e&&this.eventEmitter.on(\"*\",e),this}once(e,t){this.eventEmitter.once(e,t)}off(e,t){this.eventEmitter.off(e,t)}emit(e,t){this.eventEmitter.emit(e,t)}setPoster(e){this.$video.poster=e}play(){if((this.$video.src||this.$video.currentSrc)&&!this.isSourceChanging){if(this.options.autopause)for(let t=0;t<e.players.length;t++){const n=e.players[t];n!=this&&n.pause()}return this.$video.play()}}pause(){return this.$video.pause()}togglePlay(){return this.isPlaying?this.pause():this.play()}mute(){this.$video.muted=!0}unmute(){this.$video.muted=!1}toggleMute(){this.isMuted?this.unmute():this.mute()}setVolume(e){this.$video.volume=e>1?1:e<0?0:e,this.$video.volume>0&&this.isMuted&&this.unmute()}setPlaybackRate(e){this.$video.playbackRate=e}seek(e){this.$video.currentTime=e}setLoop(e){this.$video.loop=e}async enterFullscreen(){this.isInPip&&await this.exitPip(),this._requestFullscreen?this._requestFullscreen.call(this.$root,{navigationUI:\"hide\"}):this.$video.webkitEnterFullscreen()}exitFullscreen(){return this._exitFullscreen.call(document)}get isFullscreenEnabled(){return document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled||this.$video.webkitEnterFullscreen}get isFullScreen(){return Boolean((document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement)===this.$root||this.$video.webkitDisplayingFullscreen)}toggleFullScreen(){return this.isFullScreen?this.exitFullscreen():this.enterFullscreen()}get isPipEnabled(){return document.pictureInPictureEnabled}enterPip(){return this.$video.requestPictureInPicture()}exitPip(){return!!this.isInPip&&document.exitPictureInPicture()}get isInPip(){return document.pictureInPictureElement==this.$video}togglePip(){return this.isInPip?this.exitPip():this.enterPip()}changeQuality(e){return this._loader(e,{keepPlaying:!0,keepTime:!0,preEvent:\"videoqualitychange\",event:\"videoqualitychanged\",brokenEvent:\"qualitychangeerror\"})}changeSource(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return this._loader(e,{keepPlaying:t,preEvent:\"videosourcechange\",event:\"videosourcechanged\",brokenEvent:\"sourcechangeerror\"})}_loader(e,t){return new Promise(((n,o)=>{if(this.isSourceChanging)return o(Error(\"Previous Source is Changing.\"));const i=this.isPlaying,r=this.currentTime,s=this.volume,a=this.playbackRate;this.pause(),this.hasError=!1,this.isSourceChanging=!0,this.emit(t.preEvent,e);const l=t.keepPlaying,c=t.keepTime,d=\"none\"==this.options.preload,u=d?\"loadstart\":\"loadedmetadata\",h=l&&i;let p;const g=n=>{this.$root&&(this.off(u,v),this.emit(t.brokenEvent,{source:p||e,error:n}),\"videosourcechanged\"==t.event?this.isSourceChanging=!1:this.load(this.options.source).then(m).finally((()=>{this.isSourceChanging=!1})),o(n))},m=()=>{s!=this.volume&&this.setVolume(s),a!=this.playbackRate&&this.setPlaybackRate(a),d&&c&&this.$video.load(),c&&!this.options.isLive&&this.seek(r),h&&!this.isPlaying&&this.$video.play(),Object.assign(this.options.source,p)},v=()=>{this.$root&&(this.off(\"error\",g),m(),this.isSourceChanging=!1,this.emit(t.event,p),n())};return(e instanceof Promise?e:Promise.resolve(e)).then((e=>{if(!e.src)throw new Error(\"Empty Source\");return p=e,this.$video.poster=e.poster||\"\",this.once(\"error\",g),this.once(u,v),e})).then((e=>this.load(e))).catch(g)}))}destroy(){e.players.splice(e.players.indexOf(this),1);const t=this.eventEmitter,n=this.loader,o=this.plugins,i=this.container,r=this.$root,s=this.$video,a=this.isPlaying,l=this.isFullScreen,c=this.isInPip;t.emit(\"destroy\"),t.offAll(),null==n||n.destroy(),o.forEach((e=>{var t;return!e.load&&(null==(t=e.destroy)?void 0:t.call(e))})),a&&this.pause(),l&&this.exitFullscreen(),c&&this.exitPip(),s.src&&URL.revokeObjectURL(s.src),i.removeChild(r),this.eventEmitter=this.locales=this.options=this.listeners=this.context=this.plugins=this.container=this.$root=this.$video=this.loader=void 0}get isNativeUI(){return this.options.isNativeUI()}get state(){return this.$video.readyState}get isPlaying(){return!this.$video.paused}get isMuted(){return this.$video.muted}get isEnded(){return this.$video.ended}get isLoop(){return this.$video.loop}get isAutoPlay(){return this.$video.autoplay}get duration(){return this.$video.duration}get buffered(){return this.$video.buffered}get currentTime(){return this.$video.currentTime}get volume(){return this.$video.volume}get playbackRate(){return this.$video.playbackRate}get _requestFullscreen(){return HTMLElement.prototype.requestFullscreen||HTMLElement.prototype.webkitRequestFullscreen||HTMLElement.prototype.mozRequestFullScreen||HTMLElement.prototype.msRequestFullscreen}get _exitFullscreen(){return Document.prototype.exitFullscreen||Document.prototype.webkitExitFullscreen||Document.prototype.cancelFullScreen||Document.prototype.mozCancelFullScreen||Document.prototype.msExitFullscreen}static get version(){return\"1.2.38-beta.2\"}};G.players=[];let Z=G;globalThis.window&&console.log(\"%cOPlayer%c v%s\\n %c\\nOh! Another HTML5 video player.\\nhttps://github.com/shiyiya/oplayer\\n\",\"font-size:32px;\",\"font-size:12px;color:#999999;\",Z.version,\"font-size:14px;\");const ee=Object.freeze(Object.defineProperty({__proto__:null,get $(){return $},Player:Z,default:Z,isIOS:H,isMobile:q,isObject:w,isPlainObject:function(e){if(\"object\"!=typeof e||null===e)return!1;let t=e;for(;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t},isQQBrowser:I,isSafari:R,isUndefined:V,isiPad:j,isiPhone:B,loadSDK:function(e,t,n){let o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:()=>!0,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:D;const r=e=>V(window[e])?window.exports&&window.exports[e]?window.exports[e]:window.module&&window.module.exports&&window.module.exports[e]?window.module.exports[e]:void 0:window[e],s=r(t);return s&&o(s)?Promise.resolve(s):new Promise(((o,s)=>{if(!V(N[e]))return void N[e].push({resolve:o,reject:s});N[e]=[{resolve:o,reject:s}];const a=t=>{var n;null==(n=N[e])||n.forEach((e=>e.resolve(t)))};if(!V(n)){const e=window[n];window[n]=function(){V(e)||e.apply(void 0,arguments),a(r(t))}}i(e,(()=>{V(n)&&a(r(t))}),(t=>{var n;null==(n=N[e])||n.forEach((e=>{e.reject(t)})),delete N[e]}))}))},loadScript:D,mergeDeep:E},Symbol.toStringTag,{value:\"Module\"})),te=$.cls(\"loading\"),ne=$.cls(\"playing\"),oe=$.cls(\"focused\"),ie=$.cls(\"fullscreen\"),re=$.cls(\"settingShown\"),se=$.css(\"display:none\"),ae=\"data-ctrl-hidden\",le=$.css({[\".\"+ne]:{cursor:\"none\"}}),ce=$.cls(\"error\"),de=$.css(e||(e=f([\"\\n  z-index: 99 !important;\\n  position: fixed !important;\\n  left: 0;\\n  right: 0;\\n  top: 0;\\n  bottom: 0;\"]))),ue=$.css({background:\"none\",border:\"none\",cursor:\"pointer\",padding:0,outline:\"none\",font:\"inherit\",color:\"inherit\",fill:\"#fff\",\"line-height\":\"inherit\",\"text-align\":\"inherit\",width:\"100%\",\"-webkit-tap-highlight-color\":\"transparent\",\"user-select\":\"none\"}),he=$.css({\"& > *:nth-child(1)\":{display:\"none\"}}),pe=$.css({\"& > *:nth-child(2)\":{display:\"none\"}}),ge=q?\"\":$.css({position:\"relative\",\"&:hover\":{\"&::after\":{opacity:1,transform:\"translateX(-50%) scale(1)\"},\"&:not([data-tooltip-pos]):last-child::after\":{right:0,left:\"auto\",transform:\"translateY(0) scale(1)\"},\"&[data-tooltip-pos=down]::after\":{transform:\"translateX(-50%) scale(1)\"},\"&[data-tooltip-pos=down]:last-child::after\":{right:0,transform:\"translateY(0) scale(1)\"}},\"&::after\":{position:\"absolute\",content:\"attr(aria-label)\",bottom:\"100%\",left:\"50%\",\"margin-bottom\":\"0.5em\",\"white-space\":\"nowrap\",background:\"var(--shadow-background-color)\",transform:\"translate(-50%, 10px) scale(.8)\",\"transform-origin\":\"50% 100%\",opacity:0,padding:\"6px 8px\",\"border-radius\":\"2px\",transition:\"transform .2s ease .1s,opacity .2s ease .1s\",\"pointer-events\":\"none\",\"font-size\":\"0.75em\"},\"&[data-tooltip-pos=down]::after\":{top:\"100%\",bottom:\"auto\",\"margin-top\":\"0.5em\",transform:\"translate(-50%, -10px) scale(.8)\"},\"&[data-tooltip-pos=down]:last-child::after\":{right:0,top:\"100%\",bottom:\"unset\",left:\"auto\",\"margin-top\":\"0.5em\",transform:\"translateY(-10px) scale(.8)\",\"transform-origin\":\"100% 0\"},\"&:not([data-tooltip-pos]):last-child::after\":{right:0,left:\"auto\",transform:\"translateY(10px) scale(.8)\",\"transform-origin\":\"100% 100%\"}}),me={play:'<svg viewBox=\"0 0 1024 1024\"><path  d=\"M245.76 785.203V238.797c0-50.442 34.918-69.182 77.967-42.046l422.196 266.117c43.11 27.157 43.069 71.128 0 98.284L323.727 827.249c-43.11 27.177-77.967 8.315-77.967-42.046z\" /></svg>',pause:'<svg viewBox=\"0 0 1024 1024\"><path  d=\"M327.68 184.32a81.92 81.92 0 0 1 81.92 81.92v491.52a81.92 81.92 0 1 1-163.84 0V266.24a81.92 81.92 0 0 1 81.92-81.92z m368.64 0a81.92 81.92 0 0 1 81.92 81.92v491.52a81.92 81.92 0 1 1-163.84 0V266.24a81.92 81.92 0 0 1 81.92-81.92z\" /></svg>',volume:['<svg viewBox=\"0 0 1024 1024\"><path d=\"M128 426.666667v170.666666c0 23.466667 19.2 42.666667 42.666667 42.666667h128l140.373333 140.373333c26.88 26.88 72.96 7.68 72.96-30.293333V273.493333c0-37.973333-46.08-57.173333-72.96-30.293333L298.666667 384H170.666667c-23.466667 0-42.666667 19.2-42.666667 42.666667z m576 85.333333A192 192 0 0 0 597.333333 340.053333v343.466667c63.146667-31.146667 106.666667-96 106.666667-171.52zM597.333333 189.866667v8.533333c0 16.213333 10.666667 30.293333 25.6 36.266667C733.013333 278.613333 810.666667 386.56 810.666667 512s-77.653333 233.386667-187.733334 277.333333c-15.36 5.973333-25.6 20.053333-25.6 36.266667v8.533333c0 26.88 26.88 45.653333 51.626667 36.266667C793.6 815.36 896 675.84 896 512s-102.4-303.36-247.04-358.4c-24.746667-9.813333-51.626667 9.386667-51.626667 36.266667z\"></path></svg>','<svg viewBox=\"0 0 1024 1024\"><path d=\"M154.88 154.88a42.496 42.496 0 0 0 0 60.16L311.04 371.2 298.666667 384H170.666667c-23.466667 0-42.666667 19.2-42.666667 42.666667v170.666666c0 23.466667 19.2 42.666667 42.666667 42.666667h128l140.373333 140.373333c26.88 26.88 72.96 7.68 72.96-30.293333v-177.92l178.346667 178.346667c-20.906667 15.786667-43.52 29.013333-68.266667 38.826666-15.36 6.4-24.746667 22.613333-24.746667 39.253334 0 30.72 31.146667 50.346667 59.306667 38.826666 34.133333-14.08 66.133333-32.853333 94.72-55.893333l57.173333 57.173333a42.496 42.496 0 1 0 60.16-60.16L215.466667 154.88c-16.64-16.64-43.52-16.64-60.586667 0zM810.666667 512c0 34.986667-6.4 68.693333-17.493334 99.84l65.28 65.28c23.893333-49.92 37.546667-105.813333 37.546667-165.12 0-163.413333-102.4-303.36-246.613333-358.4-25.173333-9.813333-52.053333 9.813333-52.053334 36.693333v8.106667c0 16.213333 10.666667 30.293333 26.026667 36.266667C733.013333 279.04 810.666667 386.56 810.666667 512z m-371.626667-268.373333l-7.253333 7.253333L512 331.093333V273.493333c0-37.973333-46.08-56.746667-72.96-29.866666zM704 512A192 192 0 0 0 597.333333 340.053333v76.373334l105.813334 105.813333c0.426667-3.413333 0.853333-6.826667 0.853333-10.24z\"></path></svg>'],fullscreen:['<svg viewBox=\"-113 -113 1250 1250\"><path d=\"M0 232.732444A232.732444 232.732444 0 0 1 232.732444 0h558.535112A232.732444 232.732444 0 0 1 1024 232.732444v558.535112A232.732444 232.732444 0 0 1 791.267556 1024H232.732444A232.732444 232.732444 0 0 1 0 791.267556V232.732444z m232.732444-139.662222a139.662222 139.662222 0 0 0-139.662222 139.662222v558.535112a139.662222 139.662222 0 0 0 139.662222 139.662222h558.535112a139.662222 139.662222 0 0 0 139.662222-139.662222V232.732444a139.662222 139.662222 0 0 0-139.662222-139.662222H232.732444z\"></path><path d=\"M549.575111 245.845333c0-25.799111 20.935111-46.734222 46.734222-46.734222h116.821334A140.202667 140.202667 0 0 1 853.333333 339.313778v116.821333a46.734222 46.734222 0 0 1-93.468444 0v-116.821333c0-25.827556-20.906667-46.734222-46.734222-46.734222h-116.821334a46.734222 46.734222 0 0 1-46.734222-46.734223zM245.845333 549.546667c25.799111 0 46.734222 20.935111 46.734223 46.734222v116.821333c0 25.827556 20.906667 46.734222 46.734222 46.734222h116.821333a46.734222 46.734222 0 0 1 0 93.468445h-116.821333A140.202667 140.202667 0 0 1 199.111111 713.130667v-116.821334c0-25.799111 20.935111-46.734222 46.734222-46.734222z\"></path></svg>','<svg viewBox=\"-113 -113 1250 1250\"><path d=\"M0.739556 233.130667a232.391111 232.391111 0 0 1 232.391111-232.391111h557.738666a232.391111 232.391111 0 0 1 232.391111 232.391111v557.738666a232.391111 232.391111 0 0 1-232.391111 232.391111H233.130667a232.391111 232.391111 0 0 1-232.391111-232.391111V233.130667z m232.391111-139.434667a139.434667 139.434667 0 0 0-139.434667 139.434667v557.738666a139.434667 139.434667 0 0 0 139.434667 139.434667h557.738666a139.434667 139.434667 0 0 0 139.434667-139.434667V233.130667a139.434667 139.434667 0 0 0-139.434667-139.434667H233.130667z\"></path><path d=\"M601.088 186.652444c25.685333 0 46.506667 20.792889 46.506667 46.478223v96.796444c0 25.685333 20.792889 46.478222 46.478222 46.478222h96.796444a46.478222 46.478222 0 1 1 0 92.984889h-96.796444a139.434667 139.434667 0 0 1-139.463111-139.463111V233.130667c0-25.685333 20.821333-46.478222 46.478222-46.478223z m-414.435556 414.435556c0-25.656889 20.792889-46.478222 46.478223-46.478222h96.796444a139.434667 139.434667 0 0 1 139.463111 139.463111v96.796444a46.478222 46.478222 0 0 1-92.984889 0v-96.796444c0-25.685333-20.792889-46.478222-46.478222-46.478222H233.130667a46.478222 46.478222 0 0 1-46.478223-46.506667z\"></path></svg>'],pip:['<svg viewBox=\"0 0 1024 1024\"><path d=\"M768 213.333333H256a85.333333 85.333333 0 0 0-85.333333 85.333334v426.666666a85.333333 85.333333 0 0 0 85.333333 85.333334h170.666667a42.666667 42.666667 0 1 1 0 85.333333H256a170.666667 170.666667 0 0 1-170.666667-170.666667V298.666667a170.666667 170.666667 0 0 1 170.666667-170.666667h512a170.666667 170.666667 0 0 1 170.666667 170.666667v128a42.666667 42.666667 0 1 1-85.333334 0V298.666667a85.333333 85.333333 0 0 0-85.333333-85.333334z m-128 341.333334a128 128 0 0 0-128 128v85.333333a128 128 0 0 0 128 128h170.666667a128 128 0 0 0 128-128v-85.333333a128 128 0 0 0-128-128h-170.666667z\"></path></svg>','<svg viewBox=\"0 0 1024 1024\"><path d=\"m768,213.33333l-512,0a85.33333,85.33333 0 0 0 -85.33333,85.33334l0,426.66666a85.33333,85.33333 0 0 0 85.33333,85.33334l170.66667,0a42.66667,42.66667 0 1 1 0,85.33333l-170.66667,0a170.66667,170.66667 0 0 1 -170.66667,-170.66667l0,-426.66666a170.66667,170.66667 0 0 1 170.66667,-170.66667l512,0a170.66667,170.66667 0 0 1 170.66667,170.66667l0,128a42.66667,42.66667 0 1 1 -85.33334,0l0,-128a85.33333,85.33333 0 0 0 -85.33333,-85.33334zm-128,341.33334a128,128 0 0 0 -128,128l0,85.33333a128,128 0 0 0 128,128l170.66667,0a128,128 0 0 0 128,-128l0,-85.33333a128,128 0 0 0 -128,-128l-170.66667,0z\"></path><g stroke=\"null\"><g stroke=\"null\" transform=\"matrix(0.6896517266997474,0,0,0.6896517266997474,-10241.200782450309,-10001.206060939305) \"><rect stroke=\"null\" x=\"15122.523407\" y=\"14826.656681\" width=\"582\" height=\"402\" fill=\"none\"></rect></g><g stroke=\"null\" transform=\"matrix(0.6896517266997474,0,0,0.6896517266997474,-10241.200782450309,-10001.206060939305) \"><path stroke=\"null\" d=\"m15503.523407,14924.856681l-161.8,0c-66.2,0 -120,53.8 -120,120l0,161.8c0,22.1 17.9,40 40,40s40,-17.9 40,-40l0,-144.4l169.8,169.8c7.8,7.8 18,11.7 28.3,11.7c10.2,0 20.5,-3.9 28.3,-11.7c15.6,-15.6 15.6,-40.9 0,-56.6l-170.7,-170.6l146.1,0c22.1,0 40,-17.9 40,-40s-17.9,-40 -40,-40z\"></path></g></g></svg>'],setting:'<svg viewBox=\"0 0 1024 1024\" style=\"transform: scale(1.1);\"><path d=\"M0 0h1024v1024H0z\" fill-opacity=\"0\"></path><path d=\"M501.333333 127.573333a21.333333 21.333333 0 0 1 21.333334 0l316.928 182.954667a21.333333 21.333333 0 0 1 10.666666 18.474667v365.994666a21.333333 21.333333 0 0 1-10.666666 18.474667L522.666667 896.426667a21.333333 21.333333 0 0 1-21.333334 0l-316.928-182.954667a21.333333 21.333333 0 0 1-10.666666-18.474667V328.96a21.333333 21.333333 0 0 1 10.666666-18.474667zM512 219.946667L259.029333 365.952v292.053333L512 804.010667l252.928-146.005334V365.952L512 219.946667zM512 426.666667a85.333333 85.333333 0 1 1 0 170.666666 85.333333 85.333333 0 0 1 0-170.666666z\"></path></svg>\\n',screenshot:'<svg viewBox=\"0 0 1024 1024\"><path d=\"M412.245333 757.333333a42.666667 42.666667 0 0 1-56.490666-64l356.48-314.794666a42.666667 42.666667 0 0 1 56.746666 0.256l112.896 101.461333a42.666667 42.666667 0 1 1-57.088 63.488L740.266667 467.626667l-328.021334 289.706666zM810.666667 213.333333h-128a42.666667 42.666667 0 0 1 0-85.333333h170.666666a42.666667 42.666667 0 0 1 42.666667 42.666667v170.666666a42.666667 42.666667 0 0 1-85.333333 0V213.333333zM213.333333 213.333333v128a42.666667 42.666667 0 1 1-85.333333 0V170.666667a42.666667 42.666667 0 0 1 42.666667-42.666667h170.666666a42.666667 42.666667 0 1 1 0 85.333333H213.333333z m597.333334 597.333334v-128a42.666667 42.666667 0 0 1 85.333333 0v170.666666a42.666667 42.666667 0 0 1-42.666667 42.666667h-170.666666a42.666667 42.666667 0 0 1 0-85.333333h128zM213.333333 810.666667h128a42.666667 42.666667 0 0 1 0 85.333333H170.666667a42.666667 42.666667 0 0 1-42.666667-42.666667v-170.666666a42.666667 42.666667 0 0 1 85.333333 0v128z m170.666667-298.666667a128 128 0 1 1 0-256 128 128 0 0 1 0 256z m0-85.333333a42.666667 42.666667 0 1 0 0-85.333334 42.666667 42.666667 0 0 0 0 85.333334z\"></path></svg>',playbackRate:'<svg viewBox=\"0 0 1024 1024\"><path d=\"M512 951.04a435.2 435.2 0 1 1 435.2-435.2 435.2 435.2 0 0 1-435.2 435.2z m0-819.2a384 384 0 1 0 384 384A384 384 0 0 0 512 132.096z\"></path><path d=\"M468.992 493.824l-130.048-75.008a20.992 20.992 0 0 0-31.232 18.176v150.016a20.992 20.992 0 0 0 31.232 18.176l130.048-75.008a20.992 20.992 0 0 0 0-36.352zM684.8 493.824l-129.536-75.008a21.248 21.248 0 0 0-31.744 18.432v149.504a21.248 21.248 0 0 0 31.744 18.432l129.536-75.008a20.992 20.992 0 0 0 0-36.352z\"></path></svg>',subtitle:'<svg viewBox=\"0 0 1024 1024\" version=\"1.1\"><path d=\"M800 170.666667A138.666667 138.666667 0 0 1 938.666667 309.333333v405.546667a138.666667 138.666667 0 0 1-138.666667 138.666667H224A138.666667 138.666667 0 0 1 85.333333 714.88V309.333333a138.666667 138.666667 0 0 1 130.816-138.453333L224 170.666667h576z m0 64H224l-6.144 0.256A74.666667 74.666667 0 0 0 149.333333 309.333333v405.546667c0 41.216 33.450667 74.666667 74.666667 74.666667h576a74.666667 74.666667 0 0 0 74.666667-74.666667V309.333333a74.666667 74.666667 0 0 0-74.666667-74.666666zM234.666667 512c0-134.229333 115.754667-203.733333 218.538666-145.109333A32 32 0 0 1 421.461333 422.4C361.856 388.437333 298.666667 426.410667 298.666667 512c0 85.546667 63.317333 123.562667 122.88 89.728a32 32 0 0 1 31.573333 55.637333C350.549333 715.733333 234.666667 646.101333 234.666667 512z m320 0c0-134.229333 115.754667-203.733333 218.538666-145.109333a32 32 0 0 1-31.744 55.552C681.856 388.437333 618.666667 426.410667 618.666667 512c0 85.546667 63.317333 123.562667 122.88 89.728a32 32 0 0 1 31.573333 55.637333C670.549333 715.733333 554.666667 646.101333 554.666667 512z\"></path></svg>',loop:'<svg viewBox=\"0 0 32 32\"><g><path d=\"m16 2a13.9 13.9 0 0 0 -9 3.32v-2.32a1 1 0 0 0 -2 0v5a1 1 0 0 0 1 1h5a1 1 0 0 0 0-2h-2.89a11.87 11.87 0 0 1 7.89-3 12 12 0 1 1 -11.67 9.23 1 1 0 1 0 -1.94-.46 13.72 13.72 0 0 0 -.39 3.23 14 14 0 1 0 14-14z\"/><path d=\"m14 21.2a2 2 0 0 0 1.06-.31l5.11-3.19a2 2 0 0 0 0-3.4l-5.11-3.19a2 2 0 0 0 -3.06 1.69v6.4a2 2 0 0 0 2 2zm0-8.4 5.11 3.2-5.11 3.2z\"/></g></svg>',quality:'<svg viewBox=\"0 0 32 32\"><g><path d=\"m16 2a14 14 0 1 0 14 14 14 14 0 0 0 -14-14zm0 26a12 12 0 1 1 12-12 12 12 0 0 1 -12 12z\"/><path d=\"m14.5 11a1 1 0 0 0 -1 1v3h-2v-3a1 1 0 0 0 -2 0v8a1 1 0 0 0 2 0v-3h2v3a1 1 0 0 0 2 0v-8a1 1 0 0 0 -1-1z\"/><path d=\"m19.5 11h-2a1 1 0 0 0 -1 1v8a1 1 0 0 0 1 1h2a3 3 0 0 0 3-3v-4a3 3 0 0 0 -3-3zm1 7a1 1 0 0 1 -1 1h-1v-6h1a1 1 0 0 1 1 1z\"/></g></svg>',lang:'<svg viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333C277.333333 85.333333 85.333333 277.333333 85.333333 512s192 426.666667 426.666667 426.666667 426.666667-192 426.666667-426.666667S746.666667 85.333333 512 85.333333z m294.4 256H682.666667c-12.8-55.466667-34.133333-102.4-59.733334-153.6 76.8 29.866667 145.066667 81.066667 183.466667 153.6zM512 170.666667c34.133333 51.2 64 106.666667 81.066667 170.666666h-162.133334c17.066667-59.733333 46.933333-119.466667 81.066667-170.666666zM183.466667 597.333333c-8.533333-25.6-12.8-55.466667-12.8-85.333333s4.266667-59.733333 12.8-85.333333h145.066666c-4.266667 29.866667-4.266667 55.466667-4.266666 85.333333s4.266667 55.466667 4.266666 85.333333H183.466667z m34.133333 85.333334H341.333333c12.8 55.466667 34.133333 102.4 59.733334 153.6-76.8-29.866667-145.066667-81.066667-183.466667-153.6zM341.333333 341.333333H217.6c42.666667-72.533333 106.666667-123.733333 183.466667-153.6C375.466667 238.933333 354.133333 285.866667 341.333333 341.333333z m170.666667 512c-34.133333-51.2-64-106.666667-81.066667-170.666666h162.133334c-17.066667 59.733333-46.933333 119.466667-81.066667 170.666666z m98.133333-256H413.866667c-4.266667-29.866667-8.533333-55.466667-8.533334-85.333333s4.266667-55.466667 8.533334-85.333333h200.533333c4.266667 29.866667 8.533333 55.466667 8.533333 85.333333s-8.533333 55.466667-12.8 85.333333z m12.8 238.933334c25.6-46.933333 46.933333-98.133333 59.733334-153.6h123.733333c-38.4 72.533333-106.666667 123.733333-183.466667 153.6z m76.8-238.933334c4.266667-29.866667 4.266667-55.466667 4.266667-85.333333s-4.266667-55.466667-4.266667-85.333333h145.066667c8.533333 25.6 12.8 55.466667 12.8 85.333333s-4.266667 59.733333-12.8 85.333333h-145.066667z\"></path></svg>',progressIndicator:null,loadingIndicator:null,previous:null,next:null,chromecast:null,airplay:null,danmaku:null,playlist:null};var ve,fe;(fe=ve||(ve={})).setupIcons=e=>{for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(me[t]=e[t]);return me},fe.get=e=>me[e];const be=e=>{const t=()=>e.$root.classList.add(te),n=()=>{e.isSourceChanging||e.$root.classList.remove(te)};\"none\"!=e.$video.preload&&t(),e.on(\"loadstart\",(()=>{\"none\"==e.$video.preload&&n()})),e.on([\"seeking\",\"videoqualitychange\",\"videosourcechange\"],t),e.on([\"canplaythrough\",\"playing\",\"pause\",\"seeked\",\"error\"],n),e.on(e.options.autoplay||R?\"loadedmetadata\":\"canplay\",(()=>e.$root.classList.remove(te))),e.on([\"waiting\",\"playing\"],(o=>{\"waiting\"==o.type&&t();const i=e.currentTime,r=()=>{i!==e.currentTime?(n(),e.off(\"timeupdate\",r)):t()};e.on(\"timeupdate\",r)}))},ye=(e,t)=>{(e=>{e.on(\"play\",(()=>{e.$root.classList.add(ne)})),e.on([\"pause\",\"videosourcechange\"],(()=>{e.$root.classList.remove(ne)}))})(e),be(e),(e=>{e.on(\"fullscreenchange\",(t=>{if(t.payload.isWeb)e.$root.classList.toggle(de);else{if(!e._requestFullscreen)return;e.$root.classList.toggle(ie)}}))})(e),q||((e,t)=>{function n(t){let n=t.target;n&&(e.$root.contains(n)||e.$root==n)?e.$root.classList.add(oe):e.$root.classList.remove(oe)}t&&e.$root.classList.add(oe),document.addEventListener(\"click\",n),document.addEventListener(\"contextmenu\",n),e.on(\"destroy\",(()=>{document.removeEventListener(\"click\",n),document.removeEventListener(\"contextmenu\",n)}))})(e,t.autoFocus)};function ke(e,t,n){return Math.min(Math.max(e,t),n)}function xe(e){return e<10?\"0\"+e:\"\"+e}function we(e){if(!isFinite(e))return\"--:--\";const t=Math.floor(e/3600),n=Math.floor(e%3600/60),o=Math.floor(e%3600%60);return(t>0?xe(t)+\":\":\"\")+xe(n)+\":\"+xe(o)}const Ee=e=>{if((e=>e.$root.classList.contains(te))(e)||isNaN(e.duration))return void e.emit(\"notice\",{text:e.locales.get(\"Please wait for loading to complete\")});const t=(e=>{var t;try{const n=e.$video,o=e.$root,i=e.context.ui,r=document.createElement(\"canvas\"),s=n.videoWidth,a=n.videoHeight;r.width=s,r.height=a,r.getContext(\"2d\").drawImage(n,0,0,s,a);const l=(null==(t=i.$watermark)?void 0:t.style)||{},c=l.top,d=l.left,u=l.right,h=l.bottom;if(i.$watermark&&[c,d,u,h].filter((e=>null!=e)).length>1){const e=i.$watermark,t=e.offsetLeft,n=e.offsetTop,a=e.offsetWidth,l=e.offsetHeight,p=i.$watermark.getBoundingClientRect(),g=p.width,m=p.height;let v=0,f=0;d?v=t:u&&(v=s-(o.clientWidth-t-a)-a),c?f=n:h&&(f=s-(o.clientHeight-n-l)-l),r.getContext(\"2d\").drawImage(i.$watermark,v,f,g,m)}return r.toDataURL(\"image/png\")}catch(n){return n}})(e);if(t instanceof Error)e.emit(\"notice\",{text:t.message});else{!function(e,t){const n=document.createElement(\"a\");n.href=e,n.download=t,n.click()}(t,(e.options.source.title||\"OPlayer-ScreenShot\")+\"-\"+we(e.currentTime).replace(/:/g,\"-\")+\".png\")}},$e=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1500,n=null;const o=()=>n&&clearTimeout(n);return{callee:()=>{o(),n=setTimeout((()=>{e()}),t)},clear:o}};function Le(e,t){return e.classList.add(t),e}function Se(e,t){return e.classList.remove(t),e}function Te(e,t){return e.classList.contains(t)}const Pe={dragStart:q?\"touchstart\":\"mousedown\",dragMove:q?\"touchmove\":\"mousemove\",dragEnd:q?\"touchend\":\"mouseup\"},ze={ArrowUp:e=>{const t=100*e.volume+10;e.setVolume(t/100),e.emit(\"notice\",{text:e.locales.get(\"Volume: %s\",~~(100*e.volume)+\"%\")})},ArrowDown:e=>{const t=100*e.volume-10;e.setVolume(t/100),e.emit(\"notice\",{text:e.locales.get(\"Volume: %s\",~~(100*e.volume)+\"%\")})},ArrowLeft:(e,t)=>{var n,o;if(e.options.isLive||e.hasError)return;e.currentTime-((null==(n=t.theme.progress)?void 0:n.backward)||5)<0?e.seek(0):e.seek(e.currentTime-((null==(o=t.theme.progress)?void 0:o.forward)||5)),e.emit(\"notice\",{text:we(e.currentTime)+\" / \"+we(e.duration)})},ArrowRight:e=>{e.options.isLive||e.hasError||(e.seek(e.currentTime+5),e.emit(\"notice\",{text:we(e.currentTime)+\" / \"+we(e.duration)}))},\" \":e=>e.togglePlay(),K:e=>e.togglePlay(),Escape:e=>{e.isFullScreen?e.exitFullscreen():e.$root.classList.contains(de)&&e.emit(\"fullscreenchange\",{isWeb:!0})},F:e=>e.toggleFullScreen(),W:e=>e.emit(\"fullscreenchange\",{isWeb:!0}),S:Ee,M:e=>e.isMuted?e.unmute():e.mute()};function Ae(e){var t,n;const o=e.player,i=e.config;function r(e){var t,n,r;if(\"INPUT\"==(null==(t=document.activeElement)?void 0:t.tagName)||\"TEXTAREA\"==(null==(n=document.activeElement)?void 0:n.tagName)||(null==(r=document.activeElement)?void 0:r.getAttribute(\"contenteditable\"))||i.keyboard.focused&&!(e=>e.$root.classList.contains(oe))(o)||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)return;const s=e.key.toLocaleUpperCase();ze[s]&&(e.preventDefault(),ze[s](o,i))}(!q||(null==(t=i.keyboard)?void 0:t.focused)||(null==(n=i.keyboard)?void 0:n.global))&&(e.keyboard={register:function(e){for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(ze[t]=e[t])},unregister:function(e){e.forEach((e=>{delete ze[e]}))}},document.addEventListener(\"keydown\",r),o.on(\"destroy\",(()=>{document.removeEventListener(\"keydown\",r)})))}const Oe=\"speed\";function Ce(e){var t;const n=e.player,o=e.config.theme,i=e.$mask,r=null==(t=o.controller)?void 0:t.slideToSeek;q&&!n.options.isLive&&r&&\"none\"!=r&&n.once(\"loadedmetadata\",(()=>{let e,t=0,o=0,s=0,a=0;const l=n.$root.getBoundingClientRect();function c(e){if(0==t&&0==o)return;const i=e.changedTouches[0],r=i.clientX,s=i.clientY,c=r-t,d=o-s;if(Math.abs(c)<2&&Math.abs(d)<2)return;const u=function(e,t){return 180*Math.atan2(t,e)/Math.PI}(c,d);(u>=-45&&u<45||u>=135&&u<=180||u>=-180&&u<-135)&&(e.preventDefault(),a=60*c/l.width,n.emit(\"notice\",{text:we(ke(n.currentTime+a,0,n.duration))+\" / \"+we(n.duration),pos:\"top\"}))}function d(){0==t&&0==o||(\"long-touch\"==r&&s<1e3&&(e&&clearInterval(e),i.removeEventListener(\"touchmove\",c)),Math.abs(a)>=1&&n.seek(ke(n.currentTime+a,0,n.duration)),t=o=a=s=0)}\"always\"==r&&(i.addEventListener(\"touchstart\",(e=>{if(Te(n.$root,re))return;const i=e.changedTouches[0],r=i.clientX,s=i.clientY;t=r,o=s})),i.addEventListener(\"touchmove\",c),i.addEventListener(\"touchend\",d)),\"long-touch\"==r&&i.addEventListener(\"touchstart\",(r=>{if(Te(n.$root,re))return;const a=r.changedTouches[0],l=a.clientX,u=a.clientY;t=l,o=u,e=window.setInterval((()=>{s+=100,s>=1e3&&(clearInterval(e),n.emit(\"notice\",{text:\"slid left or right to seek\",pos:\"top\"}),i.addEventListener(\"touchmove\",c))}),100),i.addEventListener(\"touchend\",d,{once:!0})}))}))}const Me=$.css(t||(t=f([\"\\n  font-variant-numeric: tabular-nums;\\n  font-size: 0.875em;\\n\"]))),Fe=$.css(\"width:0.5em;height:0.5em;background-color:var(--primary-color);border-radius:50%;margin-right:0.5em\"),je=$.css(\"\\n    position: absolute;\\n    top: 10px;\\n    right: 50%;\\n    border-radius: 2px;\\n    box-sizing: border-box;\\n    transform: translate(50%, -100%);\\n    transition: opacity 0.2s ease, top 0.2s ease;\\n    font-size: 0.875em;\\n\"),Be=$.css(\"\\n    top: calc(100% - 10px);\\n    right: 50%;\\n    transform: translateX(50%);\\n\"),Re=$.css({position:\"relative\",display:\"flex\",[\"& .\"+je]:{visibility:\"hidden\",opacity:0,\"background-color\":\"var(--shadow-background-color)\"}}),He=$.css({\"&:hover\":{\"padding-top\":\"0.5em\",\"margin-top\":\"-0.5em\",[\"& .\"+je]:{visibility:\"visible\",opacity:1,top:0}},\"&[data-dropdown-pos=top]:hover\":{\"padding-bottom\":\"0.5em\",\"margin-bottom\":\"-0.5em\",[\"& .\"+je]:{top:\"100%\"}}}),qe=$.css({padding:\"0 0.5em\",\"min-width\":\"6em\",display:\"block\",height:\"2.4em\",\"line-height\":\"2.4em\",cursor:\"pointer\",\"text-align\":\"center\",\"word-break\":\"keep-all\",\"&:nth-last-child(1)\":{\"margin-bottom\":\"0px\"},\"& *\":{\"pointer-events\":\"none\"},\"&[aria-checked=true]\":{color:\"var(--primary-color)\"},\"&:hover\":{\"background-color\":\"rgba(255, 255, 255, 0.1)\"}}),Ie=$.cls(\"textIcon\"),De=$.css({display:\"flex\",\"align-items\":\"center\",[\"& > .\"+ue+\":last-child\"+(q?\", & >  .\"+ue+'[aria-label=\"Play\"], & >  .'+ue+'[aria-label=\"Pause\"]':\"\")]:{\"margin-right\":0}}),Ne=$.css({color:\"#fff\",height:\"2.375em\",display:\"flex\",\"box-sizing\":\"border-box\",\"justify-content\":\"space-between\",\"align-items\":\"center\",\"padding-bottom\":q?0:\"0.25em\",[\"& .\"+ue+\".\"+Ie]:{width:\"auto\",\"min-width\":\"2em\",\"font-size\":\"0.875em\",padding:\"0 4px\",\"border-radius\":\"2px\"},[\"& .\"+ue]:Object.assign({width:\"2em\",height:q?\"auto\":\"2em\",\"margin-right\":\"0.5em\",\"justify-content\":\"center\",\"align-items\":\"center\",display:\"inline-flex\",\"& > *\":{height:\"1.5em\",width:\"1.5em\",\"pointer-events\":\"none\",transition:\"transform .2s ease-in-out\"}},q?{\"&:active > *\":{transform:\"scale(.9)\"}}:{\"&:hover\":{\"background-color\":\"rgb(255 255 255 / .2)\"}})}),Ve=$.css({flex:1,height:\"100%\",\"padding-left\":\"0.5em\",\"> div\":{height:\"100%\",display:\"flex\",\"align-items\":\"center\"}}),_e=$.css(\"display: block;\"),Ue=$.css(\"min-width: 15.5em;\"),Xe=$.css(\"min-width: 10.5em;\"),We=$.css(\"\\n  display: none;\\n  width: 1.4em;\\n  height: 1.4em;\\n\"),Ye=$.css(\"\\n  width: 2em;\\n  height: 2em;\\n  margin: 0 -10px 0 -5px;\\n\"),Qe=$.css(\"\\n  width: 2em;\\n  height: 2em;\\n  transform: rotate(180deg);\\n  margin-left: -10px;\\n\"),Ke=$.css({position:\"absolute\",cursor:\"pointer\",top:\"0\",left:\"0\",right:\"0\",bottom:\"0\",\"background-color\":\"#ccc\",transition:\".3s\",\"border-radius\":\"34px\",\"&:before\":{position:\"absolute\",content:'\"\"',height:\"1em\",width:\"1em\",left:\"0.25em\",bottom:\"0.1875em\",\"background-color\":\"white\",transition:\".3s\",\"border-radius\":\"50%\"}}),Je=$.css(\"\\n  position: relative;\\n  width: 2.5em;\\n  height: 1.375em;\\n\"),Ge=$.css(\"\\n  white-space: nowrap;\\n  color: rgba(255, 255, 255, 0.7);\\n  font-size: 0.8em;\\n\"),Ze=$.css({height:\"2.4em\",cursor:\"pointer\",color:\"#fff\",\"justify-content\":\"space-between\",\"align-items\":\"center\",padding:\"0 0.75em\",\"line-height\":\"1\",display:\"flex\",overflow:\"hidden\",\"&:not([aria-label=slider]) > *\":{\"pointer-events\":\"none\"},\"&:hover\":{\"background-color\":\"rgba(255, 255, 255, 0.1)\"},\"&[aria-checked='true']\":{[\"& .\"+We]:{display:\"block\"},\"&[data-index]\":{\"background-color\":\"rgba(255, 255, 255, 0.1)\"},[\"& .\"+Ke]:{\"background-color\":\"var(--primary-color)\",\"&:before\":{transform:\"translateX(1em)\"}}}}),et=$.css({display:\"flex\",\"align-items\":\"center\",\"margin-right\":\"10px\",\"& > svg\":{width:\"1.7em\",height:\"1.7em\",\"margin-right\":\"0.5em\"}}),tt=$.css(\"\\n  display: flex;\\n  align-items: center;\\n  justify-content: flex-end;\\n\"),nt=$.css({width:\"100%\",display:\"flex\",\"align-items\":\"center\",\"border-bottom\":\"1px solid rgb(255 255 255 / 10%)\"}),ot=$.css({\"-webkit-appearance\":\"none\",width:\"90%\",height:\"0.4em\",outline:\"none\",\"border-radius\":\"34px\",background:\"rgb(204, 204, 204)\",margin:\"0\",cursor:\"pointer\",position:\"relative\",\"&::-webkit-slider-thumb\":{\"-webkit-appearance\":\"none\",appearance:\"none\",background:\"#fff\",height:\"1em\",width:\"1em\",\"border-radius\":\"50%\",border:\"none\"},\"&:hover::before\":{visibility:\"visible\"},\"::before\":{position:\"absolute\",left:\"-0.3em\",top:\"50%\",transform:\"translate(-100%, -50%)\",content:\"attr(value)\",color:\"rgba(255, 255, 255, 0.7)\",visibility:\"hidden\",\"font-size\":\"0.8em\"}}),it=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Ye;return\"<svg \"+(e?'class=\"'+e+'\"':\"\")+' viewBox=\"0 0 32 32\"><path d=\"m 12.59,20.34 4.58,-4.59 -4.58,-4.59 1.41,-1.41 6,6 -6,6 z\" fill=\"#fff\"></path></svg>'},rt=function(e){return'<div class=\"'+et+'\">\\n      '+(arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\")+\"\\n      <span>\"+e+\"</span>\\n    </div>\\n    <div class=\"+tt+'>\\n      <span role=\"label\" class='+Ge+\"></span>\\n      \"+it()+\"\\n    </div>\\n\"};function st(e){let t=e.type,n=e.key,o=e.name,i=e.icon,r=e.default,s=e.index,a=e.max,l=e.min,c=e.step,d=e.hasChildren,u=$.create(\"div.\"+Ze,{\"data-key\":n,role:\"option\"==t?\"menuitemradio\":\"menuitem\",\"aria-haspopup\":!!d&&\"menu\",\"aria-label\":t||\"menuitem\"});const h={$row:u,$label:void 0};switch(t){case\"switcher\":u.innerHTML=function(e){return'<div class=\"'+et+'\">\\n    '+(arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\")+\"\\n    <span>\"+e+\"</span>\\n  </div>\\n  <div class=\"+tt+\">\\n    <label class=\"+Je+\">\\n      <span class=\"+Ke+\"></span>\\n    </label>\\n  </div>\\n\"}(o,i),u.setAttribute(\"aria-checked\",r||!1);break;case\"selector\":u.innerHTML=rt(o,i),h.$label=u.querySelector('span[role=\"label\"]');break;case\"back\":u.innerHTML=(e=>'<div class=\"'+nt+'\">\\n      '+it(Qe)+\"\\n      <span>\"+e+\"</span>\\n    </div>\\n\")(o);break;case\"slider\":u.innerHTML=(e=>{let t=e.name,n=e.icon,o=void 0===n?\"\":n,i=e.max,r=void 0===i?1:i,s=e.min,a=void 0===s?0:s,l=e.value,c=void 0===l?0:l,d=e.step;return'<div class=\"'+et+'\">\\n    '+o+\"\\n    <span>\"+t+\"</span>\\n  </div>\\n  <div class=\"+tt+'>\\n   <input type=\"range\" min=\"'+a+'\" max=\"'+r+'\" step=\"'+(void 0===d?1:d)+'\" value=\"'+c+'\" class=\"'+ot+'\" />\\n  </div>'})({name:o,max:a,min:l,icon:i,value:r,step:c});break;case\"option\":u.innerHTML=function(e){return'<div class=\"'+et+'\">\\n      '+(arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\")+\"\\n      <span>\"+e+\"</span>\\n    </div>\\n    <svg class=\"+We+' viewBox=\"0 0 24 24\">\\n      <path d=\"M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z\" fill=\"#fff\"></path>\\n    </svg>\\n'}(o,i),u.setAttribute(\"aria-checked\",r||!1),\"number\"==typeof s&&u.setAttribute(\"data-index\",s.toString());break;default:u.innerHTML=d?rt(o,i):function(e){return'<div class=\"'+et+'\">\\n    '+(arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\")+\"\\n    <span>\"+e+\"</span>\\n  </div>\\n\"}(o,i)}return h}function at(e,t,n){let o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(!n||0==n.length)return;const i=o.key,r=o.target,s=o.parent,a=o.isSelectorOptionsPanel,l=o.name;let c={},d=i||\"root\";t[0]&&\"root\"==d?(c=t[0],d=t[0].key):(c.$ref=$.create(\"div.\"+(t[0]&&a?Xe:Ue),{\"data-key\":d,role:\"menu\"}),c.key=d,t.push(c)),c.parent=s;const u=\"root\"==c.key;if(!u){const e=st({name:l,type:\"back\"}).$row;e.addEventListener(\"click\",(()=>{var e;c.$ref.classList.remove(_e),null==(e=c.parent)||e.$ref.classList.add(_e)})),$.render(e,c.$ref)}for(let h=0;h<n.length;h++){const i=n[h],s=i.name,l=i.type,d=i.key,p=i.children,g=i.icon,m=i.default,v=i.onChange,f=i.max,b=i.min,y=i.step,k=i.value,x=st(Object.assign({name:s,type:a?\"option\":l,key:d,icon:g,default:m,max:f,min:b,step:y,hasChildren:Boolean(p)},!u&&a&&{index:h})),w=x.$row,E=x.$label;if($.render(w,c.$ref),$.render(c.$ref,r),p){const n=\"selector\"==l&&p.every((e=>!Boolean(e.type)||\"option\"==e.type)),o=at(e,t,p,{key:d||s,target:r,parent:c,isSelectorOptionsPanel:n,name:s,parenOnChange:v});if(w.addEventListener(\"click\",(()=>{c.$ref.classList.remove(_e),o.$ref.classList.add(_e)})),n){const t=p.find((e=>e.default));t&&(E.innerText=t.name),o.select=(t,n)=>{var i;if(-1==t)return void(null==(i=o.$ref.querySelector(\"[aria-checked=true]\"))||i.setAttribute(\"aria-checked\",\"false\"));const r=o.$ref.querySelectorAll(\"[aria-checked]\");if(\"true\"!=r.item(t).getAttribute(\"aria-checked\")){r.forEach((e=>e.setAttribute(\"aria-checked\",\"false\"))),r.item(t).setAttribute(\"aria-checked\",\"true\");const o=p[t];E.innerText=o.name,n&&(null==v||v(o,{index:t,player:e}))}},o.$ref.addEventListener(\"click\",(e=>{const t=e.target;t.hasAttribute(\"data-index\")&&(o.select(+t.getAttribute(\"data-index\"),!0),c.$ref.classList.add(_e),o.$ref.classList.remove(_e))}))}}else if(\"switcher\"==l)w.select=function(e){const t=\"true\"==this.getAttribute(\"aria-checked\");this.setAttribute(\"aria-checked\",\"\"+!t),e&&(null==v||v(!t))},w.addEventListener(\"click\",(()=>w.select(!0)));else if(\"slider\"==l){const e=w.querySelector(\"input\");e.oninput=function(e){e.target.setAttribute(\"value\",e.target.value)},e.onchange=function(e){null==v||v(e.target.value)}}else(\"option\"==l||null==l&&!a)&&w.addEventListener(\"click\",(()=>{var e;return null==(e=v||o.parenOnChange)?void 0:e(k)}))}return c}function lt(e){var t,n;const o=e.player,i=e.$root,r=e.config;if(!1===r.settings)return;const s=null==(t=r.theme.controller)?void 0:t.setting,a=r.settings||[],l=(null==(n=r.theme.controller)?void 0:n.header)&&(\"top\"==s||q&&\"auto\"==s),c=$.create(\"div.\"+(e=>$.css({\"z-index\":\"8\",\"max-height\":\"75%\",\"border-radius\":\"2px\",display:\"block\",position:\"absolute\",right:\"1em\",[e]:\"top\"==e?\"var(--control-bar-height)\":\"2.5em\",overflow:\"auto\",\"background-color\":\"var(--shadow-background-color)\",fill:\"#fff\",\"&::-webkit-scrollbar\":{width:\"2px\"},\"&::-webkit-scrollbar-thumb\":{background:\"var(--primary-color)\"},\"& > div\":{display:\"none\",\"font-size\":\"0.875em\"},[\"& > div.\"+_e]:{display:\"block\"}}))(l?\"top\":\"bottom\"),{\"aria-label\":\"Setting\"});let d=[],u=!1;const h={loop:{name:o.locales.get(\"Loop\"),type:\"switcher\",key:\"loop\",icon:ve.get(\"loop\"),default:o.isLoop,onChange:e=>o.setLoop(e)}};function p(e){var t,n;u&&(null==(n=null==(t=d[0])?void 0:t.$ref.querySelector(\"[data-key=\"+e+\"]\"))||n.remove(),d=d.filter((t=>t.key!==e||(t.$ref.remove(),t=null,!1))))}function g(t){var n;t.length<1||(u||(u=!0,$.render(c,i),function(){const t=$.create(\"button\",{class:ue+\" \"+ge,\"aria-label\":o.locales.get(\"Settings\"),\"data-tooltip-pos\":\"top\"==s?\"down\":\"\"},\"\"+ve.get(\"setting\"));t.addEventListener(\"click\",(e=>{e.stopPropagation(),m()}));const n=[r.pictureInPicture&&o.isPipEnabled,r.fullscreen].filter(Boolean).length;if(l){const n=e.$controllerBar.lastElementChild;n.insertBefore(t,n.children[n.children.length])}else{const o=e.$controllerBottom.lastElementChild;o.insertBefore(t,o.children[o.children.length-n])}}(),null==(n=e.keyboard)||n.register({c:m})),at(o,d,t,{target:c}))}function m(){function e(t){c.contains(t.target)||(o.$root.classList.remove(re),d.forEach((e=>e.$ref.classList.remove(_e))),document.removeEventListener(\"click\",e))}o.$root.classList.add(re),d[0].$ref.classList.add(_e),setTimeout((()=>{document.addEventListener(\"click\",e)}))}g(a.map((e=>\"string\"==typeof e?h[e]:e))),e.setting={register:function(e){g((Array.isArray(e)?e:[e]).map((e=>{const t=d.find((t=>t.key==e.key));if(!t)return e;p(t.key)})).filter(Boolean))},unregister:p,updateLabel:function(e,t){if(!u)return;const n=c.querySelector('[data-key=\"'+e+'\"] span[role=\"label\"]');n&&(n.innerText=t)},select:function(e,t){var n;let o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(u)if(\"number\"==typeof t)for(let i=0;i<d.length;i++){const n=d[i];if(n.key==e){n.select(t,o);break}}else null==(n=c.querySelector('[data-key=\"'+e+'\"][aria-checked]'))||n.select(o)}}}const ct=$.css({position:\"absolute\",top:0,left:0,right:0,\"z-index\":7,padding:\"0.5em 0.5em 0\",transition:\"transform 0.3s ease\",height:\"var(--control-bar-height)\",color:\"#fff\",\"&::before\":{position:\"absolute\",content:\"''\",width:\"100%\",display:\"block\",top:0,left:0,bottom:\"-1em\",\"z-index\":-1,transition:\"opacity 0.3s ease\",\"pointer-events\":\"none\",\"background-image\":\"linear-gradient(rgba(0, 0, 0, .3), transparent)\"},\"& > div:nth-child(1)\":{overflow:\"hidden\",flex:\"1 1 0\",\"margin-right\":\"0.5em\"},[\"& > div:nth-child(2) .\"+Re+\":last-child .\"+je]:{right:\"max(50%,3em)\"},[\"@global .\"+le+\" &\"]:{transform:\"translateY(calc(-100%))\",\"&::before\":{opacity:0}}}),dt=$.css(\"width: 2.5em;height: 2.5em;margin:0 -10px;transform: rotate(180deg);\"),ut=$.css(\"flex:1;font-size:1em;margin: 0 0.25em;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;\"),ht=$.css(n||(n=f([\"\\n  width: 2.65em;\\n  display: flex;\\n  height: 7.65em;\\n  box-sizing: border-box;\\n  flex-direction: column;\\n\"]))),pt=$.css(\"\\n  width: 100%;\\n  text-align: center;\\n  height: 28px;\\n  line-height: 28px;\\n  margin-bottom: 2px;\\n  font-size: 0.75em;\\n\"),gt=$.css(\"\\n  position: relative;\\n  display: flex;\\n  justify-content: center;\\n  flex: 1;\\n  cursor: pointer;\\n  padding: 5px 0 14px;\\n\"),mt=$.css(\"\\n  height: 100%;\\n  width: 4px;\\n  position: relative;\\n\"),vt=$.css(\"\\n  width: 4px;\\n  height: 100%;\\n  overflow: hidden;\\n  border-radius: 2px;\\n  background: rgba(255, 255, 255, 0.3);\\n\"),ft=$.css(\"\\n  height: 100%;\\n  background-color: var(--primary-color);\\n  transform-origin: 0 100%;\\n\"),bt=$.css(o||(o=f([\"\\n  position:absolute;\\n  bottom: 0;\\n  top: auto;\\n  left: -4px;\\n  width: 12px;\\n  height: 12px;\\n  border-radius: 50%;\\n  background-color: var(--primary-color);\\n  vertical-align: middle;\\n  pointer-events: none;\\n  \"]))),yt=(e,t)=>{const n=$.create(\"div.\"+ht,{},\"<div class=\"+pt+\">100</div>\\n\\n    <div class=\"+gt+\">\\n        <div class=\"+mt+\">\\n          <div class=\"+vt+\">\\n            <div class=\"+ft+\"></div>\\n          </div>\\n\\n          <div class=\"+bt+\"></div>\\n        <div>\\n      </div>\"),o=n.querySelector(\".\"+gt),i=n.querySelector(\".\"+bt),r=n.querySelector(\".\"+ft),s=n.querySelector(\".\"+pt),a=t=>{t.preventDefault(),e.setVolume(l((e=>{const t=o.getBoundingClientRect(),n=(t.bottom-(e.clientY||e.changedTouches[0].clientY))/t.height;return n>=1?1:n<=0?0:n})(t)))},l=e=>(s.innerText=\"\"+~~(100*e),r.style.transform=\"scaleY(\"+e+\")\",i.style.bottom=\"calc(\"+~~(100*e)+\"% - 6px)\",e);l(e.volume),e.on(\"volumechange\",(()=>{l(e.isMuted?0:e.volume)})),o.addEventListener(Pe.dragStart,(e=>{a(e),document.addEventListener(Pe.dragMove,a,{passive:!1}),document.addEventListener(Pe.dragEnd,(()=>{document.removeEventListener(Pe.dragMove,a)}),{once:!0})})),$.render(n,t)},kt=$.css(\"\\n  display: none;\\n  bottom: 15px;\\n  position: absolute;\\n  left: 50%;\\n  padding: 6px 8px;\\n  background-color: var(--shadow-background-color);\\n  color: #fff;\\n  border-radius: 2px;\\n  white-space: nowrap;\\n  word-break: nowrap;\\n  transform: translateX(-50%);\"),xt=$.css({position:\"absolute\",width:\"0.8em\",height:\"0.33em\",\"background-color\":\"var(--highlight-color)\",transform:\"translateX(-3px)\",transition:\"all 0.2s\",[\"&:hover > .\"+kt]:{display:\"block\"}});const wt=$.css(\"\\n  position: absolute;\\n  left: 0;\\n  bottom: 12px;\\n  pointer-events: none;\\n  transform: translateX(-50%);\\n  background-position-y: center;\\n  border-radius: 2px;\\n  display: none;\"),Et=$.css(\"\\n  position: absolute;\\n  left: 0;\\n  bottom: 12px;\\n  pointer-events: none;\\n  border-radius: 2px;\\n  display: none;\"),$t={width:160,height:90};const Lt=$.css({\"background-color\":\"hsla(0, 0%, 100%, 0.4)\"}),St=$.css({\"background-color\":\"var(--primary-color)\"}),Tt=$.css({\"pointer-events\":\"none\",position:\"relative\",\"& > *\":{display:\"block\",position:\"absolute\",width:\"1.4em\",height:\"1.4em\",top:\"0\",left:\"0\",margin:\"-0.535em 0 0 -0.7em\",transform:q?\"none\":\"scale(0)\",transition:\"transform 0.3s ease\",\"z-index\":\"1\"},\"& > *:not(svg)\":{width:\"1em\",height:\"1em\",margin:\"-0.335em 0 0 -0.5em\",\"border-radius\":\"50%\",\"background-color\":\"#fff\"}}),Pt=$.css({position:\"absolute\",left:\"0\",\"border-radius\":\"2px\",padding:\"6px 8px\",\"background-color\":\"var(--shadow-background-color)\",color:\"#fff\",\"z-index\":\"2\",\"pointer-events\":\"none\",transform:\"translateX(-50%)\",display:\"none\",bottom:\"15px\"}),zt=$.css(\"/* progressDragging */\"),At=$.css(Object.assign({position:\"relative\",\"box-sizing\":\"border-box\",padding:\"0.5em\",cursor:\"pointer\",width:\"100%\",\"font-size\":\"0.75em\",transition:\"padding 0.3s ease\",[\"&.\"+zt+\" .\"+Pt+\", &.\"+zt+\" .\"+wt+\", &.\"+zt+\" .\"+Et]:{display:\"block\"}},q?{[\"@global .\"+le+\" .\"+Tt+\" > *\"]:{transform:\"scale(0)\"}}:{[\"&.\"+zt+\" .\"+Tt+\" > *, &:hover .\"+Tt+\" > *\"]:{transform:\"scale(1)\"}})),Ot=$.css({position:\"relative\",height:\"0.33em\",width:\"100%\",\"background-color\":\"hsla(0, 0%, 100%, 0.2)\",[\"& .\"+Lt+\", & .\"+St]:{position:\"absolute\",left:\"0\",top:\"0\",bottom:\"0\",\"pointer-events\":\"none\"}}),Ct=(e,t)=>{var n;const o=e.player,i=e.config;if(o.options.isLive)return;const r=e.$progress=$.create(\"div.\"+At,{},\"<div class=\"+Ot+'>\\n      <div class=\"'+Pt+'\">00:00</div>\\n      <div class=\"'+Lt+'\" style=\"width:0%\"></div>\\n      <div class=\"'+St+'\" style=\"width:0%\"></div>\\n      <div class=\"'+Tt+'\" style=\"transform: translateX(0%);\">\\n        '+(ve.get(\"progressIndicator\")||\"<span />\")+\"\\n      </div>\\n  </div>\"),s=r.firstElementChild;(null==(n=i.thumbnails)?void 0:n.isVTT)?console.warn(\"vtt thumbnails support by @oplayer/pluins\"):function(e,t){const n=e.config.thumbnails,o=e.player;let i,r=!1;const s=$.render($.create(\"div.\"+wt),t);function a(e){if(r&&e){const n=[i.width/2,t.clientWidth],o=n[0],r=n[1],a=o/r,l=(r-o)/r;if(s.style.left=100*(e<a?a:e>l?l:e)+\"%\",Array.isArray(i.src)){const t=i.number*e,n=Math.ceil(t/(i.x*i.y))-1,o=t%i.number,r=Math.floor(o/i.x),a=Math.ceil(o%i.x);s.style.backgroundImage=\"url(\"+i.src[n]+\")\",s.style.backgroundPosition=-a+\"00% \"+-r+\"00%\"}else{const t=Math.floor(e*i.number);s.style.backgroundPositionX=\"-\"+t+\"00%\"}}else r=!0,s.style.width=i.width+\"px\",s.style.height=i.height+\"px\",Array.isArray(i.src)||(s.style.backgroundImage=\"url(\"+i.src+\")\")}function l(t){r=!1,i=Object.assign({},$t,t),i.y&&!Array.isArray(i.src)&&(i.src=[i.src]),e.progressHoverCallback.push(a)}(null==n?void 0:n.src)&&l(n),o.on(\"videosourcechange\",(()=>{r=!1,s.style.backgroundImage=\"none\",e.progressHoverCallback.splice(e.progressHoverCallback.findIndex((e=>e==a)),1)})),e.changThumbnails=l}(e,s),e.vttThumbnailsCls=Et,function(e,t){const n=e.player,o=e.config.highlight;let i=[];function r(e){const t=$.create(\"div.\"+xt,{},'<span class=\"'+kt+'\">'+e.text+\"</san>\");return t.style.left=e.left+\"%\",t}function s(e,n){i.forEach((e=>e.remove()));for(let o=0;o<e.length;o++){const s=e[o],a=r({left:s.time/n*100,text:s.text});i.push(a),$.render(a,t)}}function a(e){n.duration!==1/0&&n.duration>0?s(e,n.duration):n.once(\"loadedmetadata\",(function(){s(e,n.duration)}))}t.style.setProperty(\"--highlight-color\",(null==o?void 0:o.color)||\"#FFF\"),(null==o?void 0:o.source)&&a(o.source),n.on(\"videosourcechange\",(()=>{i.forEach((e=>e.remove())),i=[]})),e.changHighlightSource=function(e){a(e)}}(e,s);const a=r.querySelector(\".\"+Lt),l=r.querySelector(\".\"+St),c=r.querySelector(\".\"+Tt),d=r.querySelector(\".\"+Pt);let u=!1;const h=e=>{const t=r.getBoundingClientRect(),n=((e.clientX||e.changedTouches[0].clientX)-t.left)/t.width;return n>=1?1:n<=0?0:n},p=e=>{const t=h(e),n=100*t;return l.style.width=n+\"%\",c.style.transform=\"translateX(\"+n+\"%)\",d.innerText=we(o.duration*t),d.style.left=n+\"%\",t};r.addEventListener(Pe.dragStart,(t=>{u=!0,r.classList.add(zt);const n=p(t);function i(t){t.preventDefault();const n=p(t);e.progressHoverCallback.forEach((e=>e(n)))}e.progressHoverCallback.forEach((e=>e(n))),document.addEventListener(Pe.dragMove,i,{passive:!1}),document.addEventListener(Pe.dragEnd,(e=>{r.classList.remove(zt),u=!1,document.removeEventListener(Pe.dragMove,i),isNaN(o.duration)||o.seek(h(e)*o.duration)}),{once:!0})})),q||(r.addEventListener(\"mouseenter\",(()=>{u||e.progressHoverCallback.forEach((e=>e()))})),r.addEventListener(\"mousemove\",(t=>{if(u)return;r.classList.add(zt),t.target.classList.contains(xt)?d.style.display=\"none\":d.removeAttribute(\"style\");const n=h(t);d.innerText=we(o.duration*n),d.style.left=100*n+\"%\",e.progressHoverCallback.forEach((e=>e(n)))}),{passive:!1}),r.addEventListener(\"mouseleave\",(()=>{u||r.classList.remove(zt)}))),o.on([\"timeupdate\",\"seeking\"],(()=>{if(u)return;const e=o.currentTime/o.duration*100||0;l.style.width=e+\"%\",c.style.transform=\"translateX(\"+e+\"%)\"})),o.on(\"progress\",(()=>{const e=o.buffered.length?o.buffered.end(o.buffered.length-1)/o.duration*100:0;a.style.width=e+\"%\"})),o.on(\"videosourcechange\",(()=>{a.style.width=\"0%\",l.style.width=\"0%\",c.style.transform=\"translateX(0%)\"})),$.render(r,t)},Mt=$.css({position:\"absolute\",left:0,right:0,bottom:0,\"z-index\":7,padding:\"0 0.5em\",transition:\"transform 0.3s ease, padding 0.3s ease\",\"min-height\":\"var(--control-bar-height)\",\"&::before\":{position:\"absolute\",content:\"''\",width:\"100%\",display:\"block\",bottom:0,left:0,\"z-index\":-1,top:\"-1em\",transition:\"opacity 0.3s ease\",\"pointer-events\":\"none\",\"background-image\":\"linear-gradient(transparent, rgba(0, 0, 0, .3))\"},[\"@global .\"+le+\" &\"]:{\"pointer-events\":\"none\",transform:\"translateY(calc(100% - 0.55em))\",padding:0,\"&::before\":{opacity:0}},[\"@global .\"+le+\" .\"+At]:{\"padding-left\":0,\"padding-right\":0}}),Ft=(e,t)=>{var n,o,i;const r=e.player,s=e.config,a=$.render($.create(\"div.\"+Mt),t);(null==(n=s.theme.progress)?void 0:n.mini)&&!r.options.isLive||$.css({[\"@global .\"+le+\" .\"+Mt]:{transform:\"translateY(100%)\"}});const l=[r.locales.get(\"Play\"),r.locales.get(\"Pause\"),r.locales.get(\"Screenshot\"),r.locales.get(\"Picture in Picture\"),r.locales.get(r.isFullscreenEnabled?\"Fullscreen\":\"WebFullscreen\"),r.locales.get(\"Previous\"),r.locales.get(\"Next\")],c=l[0],d=l[1],u=l[2],h=l[3],p=l[4],g=l[5],m=l[6],v=ve.get(\"previous\")||\"\",f=ve.get(\"next\")||\"\",b=e.$controllerBottom=$.create(\"div.\"+Ne,{},'<div class=\"'+De+'\">\\n\\n    '+(v&&'<button class=\"'+ue+\" \"+ge+'\" aria-label=\"'+g+'\" >'+v+\"</button>\")+'\\n\\n      <button\\n        class=\"'+ue+\" \"+(r.isPlaying?he:pe)+\" \"+ge+'\"\\n        aria-label=\"'+c+'\"\\n      >\\n        '+ve.get(\"play\")+\"\\n        \"+ve.get(\"pause\")+\"\\n      </button>\\n\\n      \"+(f&&'<button class=\"'+ue+\" \"+ge+'\" aria-label=\"'+m+'\">'+f+\"</button>\")+\"\\n\\n      \"+(r.options.isLive?'<span class=\"'+Fe+'\"></span>':\"\")+\"\\n\\n      <span class=\"+Me+\">\"+(r.options.isLive||\"none\"==r.$video.preload?\"00:00\":\"00:00 / --:--\")+'</span>\\n    </div>\\n\\n    <div class=\"'+Ve+'\"></div>\\n\\n    <div class=\"'+De+'\">\\n      <div class=\"'+Re+\" \"+He+'\">\\n        <button class=\"'+ue+\" \"+(r.isMuted?he:pe)+'\" aria-label=\"Volume\">\\n            '+ve.get(\"volume\")[0]+\"\\n            \"+ve.get(\"volume\")[1]+\"\\n        </button>\\n        \"+(H?\"\":\"<div class=\"+je+\"></div>\")+\"\\n      </div>\\n\\n      \"+(s.screenshot?'<button class=\"'+ue+\" \"+ge+'\" aria-label=\"'+u+'\">\\n              '+ve.get(\"screenshot\")+\"\\n            </button>\":\"\")+\"\\n\\n      \"+(s.pictureInPicture&&r.isPipEnabled?'<button\\n              class=\"'+ue+\" \"+ge+\" \"+(r.isInPip?he:pe)+'\"\\n              aria-label=\"'+h+'\">\\n                '+ve.get(\"pip\")[0]+\"\\n                \"+ve.get(\"pip\")[1]+\"\\n            </button>\":\"\")+\"\\n\\n      \"+(s.fullscreen?'<button class=\"'+ue+\" \"+pe+\" \"+ge+'\" aria-label=\"'+p+'\">\\n                '+ve.get(\"fullscreen\")[0]+\"\\n                \"+ve.get(\"fullscreen\")[1]+\"\\n              </button>\":\"\")+\"\\n    </div>\");\"auto\"==(null==(o=s.theme.progress)?void 0:o.position)&&q||\"center\"==(null==(i=s.theme.progress)?void 0:i.position)?Ct(e,b.querySelector(\".\"+Ve)):Ct(e,a);const y=b.querySelector(\"button[aria-label=Volume]\");H||yt(r,y.nextElementSibling);const k=b.querySelector(\"button[aria-label=\"+c+\"]\"),x=b.querySelector(\".\"+Me),w=b.querySelector('button[aria-label=\"'+p+'\"]'),E=b.querySelector('button[aria-label=\"'+h+'\"]'),L=(e,t)=>{e.classList.add(t?he:pe),e.classList.remove(t?pe:he)};s.fullscreen&&r.on(\"fullscreenchange\",(()=>setTimeout((()=>{L(w,(e=>e.$root.classList.contains(ie)||e.$root.classList.contains(de))(r))})))),s.pictureInPicture&&r.on([\"enterpictureinpicture\",\"leavepictureinpicture\"],(()=>L(E,r.isInPip))),r.on([\"play\",\"pause\",\"videosourcechange\"],(()=>{k.setAttribute(\"aria-label\",r.isPlaying?d:c),L(k,r.isPlaying)})),r.on(\"volumechange\",(()=>L(y,r.isMuted))),r.on([\"durationchange\",\"timeupdate\",\"seeking\",\"seeked\"],(()=>{x.innerText=we(r.currentTime)+\" \"+(r.options.isLive?\"\":\"/ \"+we(r.duration))})),r.on(\"videosourcechange\",(()=>{x.innerText=r.options.isLive||\"none\"==r.$video.preload?\"00:00\":\"00:00 / --:--\"})),b.addEventListener(\"click\",(e=>{switch(e.target.getAttribute(\"aria-label\")){case c:case d:return r.togglePlay();case\"Volume\":if(q&&!H)return;r.isMuted?r.unmute():r.mute();break;case h:return r.togglePip();case p:return void((e=>e.$root.classList.contains(de))(r)||!r.isFullscreenEnabled?r.emit(\"fullscreenchange\",{isWeb:!0}):r.toggleFullScreen());case u:Ee(r);break;case m:r.emit(\"next\");break;case g:r.emit(\"previous\")}})),$.render(b,a)},jt=e=>{const t=e.player,n=e.config,o=e.$root,i=$.create(\"div\");((e,t)=>{var n,o,i;const r=e.player,s=null==(n=e.config.theme.controller)?void 0:n.header;if(!s)return;const a=null==s?void 0:s.back,l=a&&q,c=e.$controllerBar=$.create(\"div\",{class:ct+\" \"+Ne},'<div class=\"'+De+'\">\\n    '+(l?\"<span role='button' class=\\\"\"+dt+\" \"+(\"fullscreen\"==a?se:\"\")+'\">'+it(\"\")+\"</span>\":\"\")+\"\\n      <h2 class='\"+ut+\"'>\"+((null==(i=null==(o=r.options)?void 0:o.source)?void 0:i.title)||\"\")+'</h2>\\n    </div>\\n    <div class=\"'+De+'\"></div>'),d=c.querySelector(\".\"+ut);if(l){const e=d.previousElementSibling;e.addEventListener(\"click\",(e=>{r.isFullScreen&&r.exitFullscreen(),r.emit(\"backward\",e)})),\"fullscreen\"==a&&r.on(\"fullscreenchange\",(()=>{r.isFullScreen?e.classList.remove(se):e.classList.add(se)}))}r.on(\"videosourcechange\",(e=>{let t=e.payload;t.then||(d.innerText=t.title||\"\")})),r.on(\"sourcechangeerror\",(e=>{var t,n;let o=e.payload;(null==(t=o.source)?void 0:t.title)||(d.innerText=(null==(n=o.e)?void 0:n.message)||\"ERROR\")})),r.on(\"videosourcechanged\",(e=>{let t=e.payload;d.innerText=t.title||\"\"})),$.render(c,t)})(e,i),Ft(e,i);const r=n.theme.controller||{},s=r.display,a=r.displayBehavior;\"played\"==s&&(Le(i,se),t.once(\"play\",(()=>{Se(i,se)})));const l=()=>{var e;!t.isPlaying&&!q||Te(t.$root,le)||Te(t.$root,re)||Te(t.$root,ce)||t.$root.contains(document.activeElement)&&\"INPUT\"==(null==(e=document.activeElement)?void 0:e.tagName)||(Le(t.$root,le),t.$root.setAttribute(ae,\"true\"),t.emit(\"controlshidden\",!1))},c=$e(l,2e3),d=c.callee,u=c.clear,h=()=>{u(),Te(t.$root,le)&&(Se(t.$root,le),t.$root.setAttribute(ae,\"false\"),t.emit(\"controlsshown\",!0))};\"none\"!=a&&(t.on(\"play\",d),t.on([\"pause\",\"videosourcechange\"],h),t.on(\"destroy\",u)),q||(t.$root.addEventListener(\"mousemove\",(e=>{h(),i.contains(e.target)||d()})),\"delay\"==a&&t.$root.addEventListener(\"mouseleave\",d),\"hover\"==a&&t.$root.addEventListener(\"mouseleave\",l)),e.toggleController=function(){Te(i,se)?t.play():Te(t.$root,le)?h():l()},$.render(i,o)},Bt={opacity:0,\"pointer-events\":\"none\"},Rt=$.css(Object.assign({transition:\"opacity 100ms linear\",position:\"absolute\",top:0,bottom:0,left:0,right:0,margin:\"auto\",fill:\"#fff\",width:\"3em\",height:\"3em\",\"z-index\":\"7\",\"& > button\":{width:\"100%\",height:\"100%\",\"border-radius\":\"100%\",background:\"var(--primary-color)\",opacity:.9,padding:\"1em\",transition:\"transform .2s ease-in-out\",\"&:active\":{transform:\"scale(.85)\"},\"& > *\":{position:\"relative\",width:\"1.5em\",height:\"1.5em\",left:\"-0.2em\",top:\"-0.25em\"}},[\"@global .\"+ne+\" &\"]:Bt,[\"@global .\"+te+\" &\"]:Bt,[\"@global .\"+ce+\" &\"]:Bt},q&&{[\"@global .\"+le+\" &\"]:Bt})),Ht=(e,t)=>{const n=$.create(\"div.\"+Rt,{},'<button aria-label=\"Play\" class=\"'+ue+'\" type=\"button\">\\n      '+ve.get(\"play\")+\"\\n    </button>\");return $.render(n,t).addEventListener(\"click\",(()=>e.play())),n},qt=$.css(\"\\n  display: none;\\n  position: absolute;\\n  top: 0;\\n  bottom: 0;\\n  left: 0;\\n  right: 0;\\n  color: #fff;\\n  background: #000;\\n  z-index: 7;\\n  align-items: center;\\n  padding: 0 10px;\\n  word-break: break-all;\\n  justify-content: center;\\n  text-align: center;\\n\"),It=$.css(\"display: flex;\"),Dt={1:\"MEDIA_ERR_ABORTED\",2:\"MEDIA_ERR_NETWORK\",3:\"MEDIA_ERR_DECODE\",4:\"MEDIA_ERR_SRC_NOT_SUPPORTED\"},Nt=(e,t,n)=>{const o=$.render($.create(\"div.\"+qt,{\"aria-label\":\"Error Overlay\"}),t);function i(t){var n;let i=\"\";if(t instanceof Event){const e=null==(n=t.target)?void 0:n.error;if(!e||!e.message&&\"number\"!=typeof e.code)return;i=e.message||Dt[e.code]}else i=t.message;o.innerText=i||\"UNKNOWN_ERROR\",e.$root.classList.add(ce),Le(o,It)}return e.on([\"videosourcechange\",\"videoqualitychange\",\"loadedmetadata\"],(function(){Se(o,It),e.$root.classList.remove(ce),o.innerText=\"\"})),e.on(\"error\",(e=>(e=>{n.errorBuilder?n.errorBuilder(e,o,(e=>i(e))):i(e)})(e.payload))),i},Vt=$.css({position:\"absolute\",top:\"0\",bottom:\"0\",left:\"0\",right:\"0\",display:\"none\",\"align-items\":\"center\",\"justify-content\":\"center\",[\"@global .\"+te+\" &\"]:{display:\"flex\"}}),_t=$.css({position:\"relative\",overflow:\"hidden\",width:\"20%\",height:\"4px\",\"border-radius\":\"4px\",\"&::before,&::after\":{display:\"block\",content:\"''\",position:\"absolute\",height:\"100%\",width:\"100%\",\"background-color\":\"var(--primary-color)\",\"border-radius\":\"4px\"},\"&::before\":{opacity:\"0.4\"},\"&::after\":{animation:\"indeterminate 1.3s infinite linear\",\"transform-origin\":\"0% 50%\"},\"@keyframes indeterminate\":{\"0%\":{transform:\"translateX(0) scaleX(0)\"},\"10%\":{transform:\"translateX(0) scaleX(0.2)\"},\"40%\":{transform:\"translateX(0) scaleX(0.7)\"},\"60%\":{transform:\"translateX(60%) scaleX(0.4)\"},\"100%\":{transform:\"translateX(100%) scaleX(0.2)\"}}}),Ut=(e,t)=>{const n=$.create(\"div.\"+Vt,{\"aria-label\":\"Loading\"},\"\"+(ve.get(\"loadingIndicator\")||'<div class=\"'+_t+'\"></div>'));$.render(n,t)},Xt=$.css({width:\"100%\",height:\"100%\",position:\"absolute\",top:\"0\",left:\"0\",right:\"0\",bottom:\"0\",[\"@global .\"+re+\" &\"]:{\"z-index\":\"8\"}}),Wt=e=>{const t=\"true\"==e.getAttribute(\"aria-checked\");e.setAttribute(\"aria-checked\",\"\"+!t),((e,t)=>{var n=[],o=e.parentNode.children;for(let i=0,r=o.length;i<r;i++)o[i]!==e&&(null==t||t(o[i]),n.push(o[i]))})(e,(e=>e.setAttribute(\"aria-checked\",\"\"+t)))},Yt=$.css({position:\"absolute\",display:\"none\",top:\"0.625em\",left:\"0.625em\",right:\"0.625em\",\"z-index\":9,\"margin-top\":\"var(--control-bar-height)\",transition:\"margin 0.2s\",[\"@global .\"+le+\" &\"]:{\"margin-top\":0}}),Qt=$.css(\"\\n  -moz-user-select: all;\\n  -webkit-user-select: all;\\n  -ms-user-select: all;\\n  user-select: all;\\n  color: #fff;\\n  background-color: var(--shadow-background-color);\\n  border-radius: 2px;\\n  padding: 5px 10px;\\n  font-size: 0.875em;\\n\"),Kt=$.css(i||(i=f([\"\\n  text-align: center;\\n\"]))),Jt=$.css(r||(r=f([\"\\n  text-align: right;\\n\"]))),Gt=$.css(s||(s=f([\"\\n  bottom: 6em;\\n  top: initial;\\n\"]))),Zt={center:$.css(a||(a=f([\"\\n  top: 50%;\\n  text-align: center;\\n  transform: translateY(-50%);\\n\"]))),left:\"\",\"top-left\":\"\",top:Kt,\"top-center\":Kt,\"top-right\":Jt,right:Jt,bottom:Gt,\"left-bottom\":Gt},en=$.css(\"display:block;\");function tn(e){return URL.createObjectURL(new Blob([e],{type:\"text/vtt\"}))}const nn=\"Subtitle\";class on{constructor(e,t,n,o){this.player=e,this.setting=t,this.el=n,this.isShow=!1,this.update=()=>{let e=\"\";const t=this.$track.track.activeCues;if(null==t?void 0:t.length)for(let n=0;n<t.length;n++){const o=t[n];o&&(e+=o.text.replace(/\\\\h/g,\"&nbsp;\").split(/\\r?\\n/).map((e=>\"<p><span>\"+e+\"</span></p>\")).join(\"\"))}this.$dom.innerHTML=e},window.TextDecoder?(this.options=Object.assign({source:[]},o),this.createContainer(),this.changeSource(this.options.source),this.player.on([\"destroy\",\"videosourcechange\"],this.destroy.bind(this)),this.player.on(\"videoqualitychang\",(()=>{this.isShow&&this.hide()})),this.player.on(\"videoqualitychanged\",this.fetchSubtitle.bind(this))):e.emit(\"notice\",{text:e.locales.get(\"TextDecoder not supported\")})}changeSource(e){var t;null==(t=this.setting)||t.unregister(nn),this.processDefault(e),this.loadSetting(),this.currentSubtitle&&(this.player.isSourceChanging||isNaN(this.player.duration)||this.player.duration<1?this.player.once(\"loadedmetadata\",this.fetchSubtitle.bind(this)):this.fetchSubtitle())}createContainer(){const e=this.el,t=this.options,n=t.color,o=t.shadow,i=t.fontSize,r=t.bottom,s=t.fontFamily,a=t.background,l=t.marginBottom;this.$dom=$.create(\"div.\"+$.css(Object.assign({left:\"2%\",right:\"2%\",\"text-align\":\"center\",\"pointer-events\":\"none\",position:\"absolute\",\"line-height\":\"1.5\",\"font-family\":s||\"inherit\",color:n||\"#fff\",\"text-shadow\":o||\"1px 0 1px #000, 0 1px 1px #000, -1px 0 1px #000, 0 -1px 1px #000, 1px 1px 1px #000, -1px -1px 1px #000, 1px -1px 1px #000, -1px 1px 1px #000\",bottom:r||\"2%\",\"font-size\":(i||(q?16:20))/16+\"em\",\"& > p\":{margin:0,\"& span\":{\"white-space\":\"pre-wrap\",background:a?\"rgba(8, 8, 8, 0.75)\":\"inherit\",padding:\"0 0.25em\"}}},!q&&{\"margin-bottom\":l||\"2.2em\",transition:\"margin 0.3s\",[\"@global .\"+le+\" &\"]:{\"margin-bottom\":0}})),{\"aria-label\":\"Subtitle\"}),$.render(this.$dom,e)}createTrack(){const e=this.player.$video;if(this.$track=$.render($.create(\"track\",{default:!0,kind:\"metadata\",id:\"primary\"}),e),!this.player._requestFullscreen){const t=(this.$iosTrack=$.create(\"track\",{default:!1,kind:\"captions\",id:\"__Orz__\"})).track;$.render(this.$iosTrack,e),t.mode=\"hidden\",this.player.on(\"fullscreenchange\",(e=>{e.payload.isWeb||setTimeout((()=>{const e=this.player.isFullScreen&&this.isShow;t.mode=e?\"showing\":\"hidden\"}))}))}}changeOffset(e){e&&[this.$track,this.$iosTrack].forEach((t=>{if(!t)return;const n=t.track.cues,o=this.player.duration;Array.from(n||[]).forEach((t=>{t.startTime=ke(t.startTime+e,0,o),t.endTime=ke(t.endTime+e,0,o)}))}))}processDefault(e){this.options.source=e,this.currentSubtitle=e.find((e=>e.default))}show(){this.isShow=!0,this.$track.addEventListener(\"cuechange\",this.update)}hide(){const e=this.$track,t=this.$dom;this.isShow=!1,t.innerHTML=\"\",e.removeEventListener(\"cuechange\",this.update)}fetchSubtitle(){var e;if(!this.currentSubtitle)return;this.$track||this.createTrack();const t=this.currentSubtitle,n=this.player,o=this.$track,i=this.$iosTrack,r=this.options,s=t.src,a=t.encoding,l=t.type,c=void 0===l?\"auto\":l,d=t.offset;return Promise.resolve(null==(e=r.onChange)?void 0:e.call(r,t)).then((e=>null==e?fetch(s).then((e=>e.arrayBuffer())).then((e=>new TextDecoder(a).decode(e))):e)).then((e=>{var t,n;if(!e)throw new Error(\"Empty Subtitle\");switch(\"auto\"==c?null==(t=/srt|ass|vtt(#|\\?|$)/i.exec(s))?void 0:t[0]:c){case\"srt\":return tn(\"WEBVTT \\r\\n\\r\\n\".concat((n=e,n.replace(/(\\d\\d:\\d\\d:\\d\\d)[,.](\\d+)/g,((e,t,n)=>{let o=n.slice(0,3);return 1===n.length&&(o=n+\"00\"),2===n.length&&(o=n+\"0\"),t+\",\"+o}))).replace(/\\{\\\\([ibu])\\}/g,\"</$1>\").replace(/\\{\\\\([ibu])1\\}/g,\"<$1>\").replace(/\\{([ibu])\\}/g,\"<$1>\").replace(/\\{\\/([ibu])\\}/g,\"</$1>\").replace(/(\\d\\d:\\d\\d:\\d\\d),(\\d\\d\\d)/g,\"$1.$2\").replace(/{[\\s\\S]*?}/g,\"\").concat(\"\\r\\n\\r\\n\")));case\"ass\":return tn(function(e){const t=new RegExp(\"Dialogue:\\\\s\\\\d+,(\\\\d+:\\\\d\\\\d:\\\\d\\\\d.\\\\d\\\\d),(\\\\d+:\\\\d\\\\d:\\\\d\\\\d.\\\\d\\\\d),([^,]*),([^,]*),(?:[^,]*,){4}(.*)$\",\"i\");return\"WEBVTT\\r\\n\\r\\n\"+e.split(/\\r?\\n/).map((e=>{const n=e.match(t);return n&&n[1]&&n[2]&&n[5]?{start:n[1],end:n[2],text:(o=n[5].replace(/{[\\s\\S]*?}/g,\"\").replace(/\\\\N/g,\"\\r\\n\").replace(/\\\\n/g,\" \").replace(/\\\\h/g,\"&nbsp;\"),o.replace(/[&<>'\"]/g,(e=>({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",\"'\":\"&#39;\",'\"':\"&quot;\"}[e]||e))))}:null;var o})).filter((e=>null!=e)).map(((e,t)=>t+1+\"\\r\\n0\"+e.start+\"0 --\\x3e 0\"+e.end+\"0\\r\\n\"+e.text)).join(\"\\r\\n\\r\\n\")}(e));case\"vtt\":return tn(e);default:return s}})).then((e=>{o.src&&URL.revokeObjectURL(o.src),(null==i?void 0:i.src)&&URL.revokeObjectURL(i.src),this.$track.addEventListener(\"load\",(()=>{this.changeOffset(d),this.show()}),{once:!0}),o.src=e,i&&(i.src=e)})).catch((e=>{n.emit(\"notice\",{text:\"Subtitle\"+e.message})}))}loadSetting(){if(!this.setting)return;const e=this.options.source;e.length&&this.setting.register({name:this.player.locales.get(\"Subtitle\"),type:\"selector\",icon:ve.get(\"subtitle\"),key:nn,onChange:e=>{var t;let n=e.value;n?n.src==(null==(t=this.currentSubtitle)?void 0:t.src)?this.show():(this.currentSubtitle=n,this.$dom.innerHTML=\"\",this.fetchSubtitle()):this.hide()},children:[{name:this.player.locales.get(\"OFF\"),default:!this.currentSubtitle}].concat(null==e?void 0:e.map((e=>{var t;return{name:e.name,default:(null==(t=this.currentSubtitle)?void 0:t.src)==e.src,value:e}})))})}destroy(){var e;const t=this.$dom,n=this.$track,o=this.$iosTrack;null==n||n.removeEventListener(\"cuechange\",this.update),null==(e=this.setting)||e.unregister(nn),(null==n?void 0:n.src)&&URL.revokeObjectURL(n.src),(null==o?void 0:o.src)&&URL.revokeObjectURL(o.src),null==n||n.remove(),null==o||o.remove(),t.innerHTML=\"\",this.isShow=!1,this.$track=this.$iosTrack=void 0}}const rn={theme:{primaryColor:\"#6668ab\",progress:{position:\"top\",mini:!0},controller:{setting:\"auto\",display:\"always\",coverButton:!0,displayBehavior:\"hover\"}},fullscreen:!0,autoFocus:!0,forceLandscapeOnFullscreen:!0,settings:[\"loop\"],keyboard:{focused:!0},speeds:[\"2.0\",\"1.5\",\"1.25\",\"1.0\",\"0.75\",\"0.5\"]};class sn{constructor(e){var t;this.key=\"ui\",this.version=\"1.3.4-beta.2\",this.name=\"oplayer-theme-ui\",this.keyboard={},this.setting={},this.menu={},this.progressHoverCallback=[],this.config=E({},rn,e),(null==(t=this.config.keyboard)?void 0:t.global)&&(this.config.keyboard.focused=!1)}apply(e){var t;const n=this.config;this.player=e;const o=this.$root=$.create(\"div.\"+(e=>{var t;return $.css(Object.assign({\"--primary-color\":\"\"+e.theme.primaryColor,\"--shadow-background-color\":\"rgba(28 ,28 ,28 , .9)\",\"--control-bar-height\":(null==(t=e.theme.controller)?void 0:t.display)?\"2.5em\":0,position:\"absolute\",top:\"0\",left:\"0\",width:\"100%\",height:\"100%\",\"line-height\":1,\"font-size\":q?\"16px\":\"18px\",\"&, & > *\":{\"-webkit-tap-highlight-color\":\"rgba(0, 0, 0, 0)\"},\"& [hidden]\":{display:\"none\"}},{[\"@global .\"+de+\" &\"]:{\"font-size\":q?\"18px\":\"22px\"},[\"@global .\"+ie+\" &\"]:{\"font-size\":q?\"18px\":\"22px\"}}))})(n));return((e,t)=>{const n=t.theme.watermark;if(!n)return;const o=e.$watermark=document.createElement(\"img\");o.setAttribute(\"alt\",\"watermark\");for(const i in n.style)o.style[i]=n.style[i];for(const i in n.attrs)o.setAttribute(i,n.attrs[i]);o.src=n.src,e.$root.appendChild(o)})(this,n),e.isNativeUI?(be(e),Ht(e,o),Ut(0,o),void $.render(o,e.$root)):(this.icons=ve.setupIcons(n.icons),ye(e,n),Ae(this),Nt(e,o,n),(e=>{const t=e.player,n=e.$root,o=$.create(\"div.\"+Yt,{\"aria-label\":\"Notice\"},'<span class=\"'+Qt+'\"></span>'),i=o.querySelector(\".\"+Qt),r=$e((()=>Se(o,en)),2e3).callee;function s(e,t){i.innerHTML=e,o.className=Yt+\" \"+en+\" \"+Zt[t||\"left\"],r()}t.on(\"notice\",(e=>{let t=e.payload;return s(t.text,t.pos)})),e.notice=s,$.render(o,n)})(this),Ut(0,o),(null==(t=n.theme.controller)?void 0:t.coverButton)&&(this.$coverButton=Ht(e,o)),jt(this),(e=>{const t=e.player,n=e.$root,o=e.$mask=$.create(\"div.\"+Xt);let i,r=0;o.addEventListener(\"click\",(()=>{Te(t.$root,re)||(q?e.toggleController():(0==r&&t.togglePlay(),i&&clearTimeout(i),i=window.setTimeout((()=>{2==r&&(t.togglePlay(),t.toggleFullScreen()),r=0}),200)),r+=1)})),$.render(o,n)})(this),lt(this),(e=>{var t;const n=e.config.menu,o=[],i=null==(t=e.$controllerBar)?void 0:t.lastElementChild,r=e.$controllerBottom.lastElementChild,s=[i,r].filter(Boolean);function a(t){var n,i;const r=t.target,s=r.getAttribute(\"aria-label\"),a=o.find((e=>e.name==s));a&&\"true\"!=r.getAttribute(\"aria-checked\")&&(\"SPAN\"==r.tagName.toUpperCase()?(Wt(r),null==(n=a.onChange)||n.call(a,a.children[+r.getAttribute(\"data-index\")],r.parentElement.previousElementSibling,e.player)):\"BUTTON\"==r.tagName.toUpperCase()&&(null==(i=a.onClick)||i.call(a,r,e.player)))}function l(e){const t=o.find((t=>t.name==e.name));t&&c(t.name);const n=e.name,a=e.icon,l=e.children,d=\"top\"==e.position&&2==s.length;let u=\"\";const h='\\n    <button\\n      aria-label=\"'+n+'\"\\n      '+(d?'data-tooltip-pos=\"down\"':\"\")+'\\n      class=\"'+ue+\" \"+(a?\"\":Ie)+\" \"+(e.children?\"\":ge)+'\"\\n      type=\"button\"\\n    >'+(a||n)+\"</button>\";u=e.children?'\\n      <div class=\"'+Re+\" \"+He+'\" data-dropdown-pos=\"'+e.position+'\" aria-label=\"'+n+'\">\\n        '+h+\"\\n        <div class='\"+je+\" \"+(d?Be:\"\")+\"' role='menu'>\\n          \"+l.map(((e,t)=>'<span\\n                  role=\"menuitemradio\"\\n                  aria-haspopup=\"false\"\\n                  aria-label=\"'+n+'\"\\n                  class=\"'+qe+'\"\\n                  aria-checked=\"'+Boolean(e.default)+'\"\\n                  data-index=\"'+t+'\"\\n                >'+e.name+\"</span>\")).join(\"\")+\"\\n          </div>\\n      </div>\":h,d?i.insertAdjacentHTML(\"afterbegin\",u):r.insertAdjacentHTML(\"afterbegin\",u),o.push(e)}function c(e){s.forEach((t=>{var n,o;null==(n=t.querySelector(\"button[aria-label='\"+e+\"']\"))||n.remove(),null==(o=t.querySelector(\"div[aria-label='\"+e+\"]'\"))||o.remove()}))}s.forEach((e=>{e.addEventListener(\"click\",a)})),n&&n.forEach(l),e.menu={register:function(e){(Array.isArray(e)?e:[e]).forEach(l)},unregister:c,select:function(e,t){let n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];s.forEach((o=>{const i=o.querySelector(\".\"+je+\" > span[aria-label='\"+e+\"']:nth-child(\"+(t+1)+\")\");i&&(Wt(i),n&&i.click())}))}}})(this),function(e){const t=e.player,n=e.$root,o=e.config.subtitle,i=e.setting;e.subtitle=new on(t,i,n,o)}(this),function(e){const t=e.player,n=e.config.speeds,o=e.setting;(null==n?void 0:n.length)&&o&&(o.register({key:Oe,type:\"selector\",name:t.locales.get(\"Speed\"),icon:ve.get(\"playbackRate\"),children:n.map((e=>({name:1==+e?t.locales.get(\"Normal\"):e+\"x\",value:+e,default:t.playbackRate==+e}))),onChange:e=>{let n=e.value;return t.setPlaybackRate(n)}}),t.on(\"ratechange\",(()=>{const e=t.playbackRate,i=n.findIndex((t=>+t==e));-1==i?o.updateLabel(Oe,e+\"x\"):o.select(Oe,i,!1)})))}(this),Ce(this),function(e,t){t.forceLandscapeOnFullscreen&&!H&&q&&e.on(\"fullscreenchange\",(t=>{var n,o,i,r;!t.payload.isWeb&&e._requestFullscreen&&(e.isFullScreen?null==(o=null==(n=globalThis.screen.orientation)?void 0:n.lock)||o.call(n,\"landscape\"):null==(r=null==(i=globalThis.screen.orientation)?void 0:i.unlock)||r.call(i))}))}(e,n),$.render(o,e.$root),this)}destroy(){}}return globalThis.window&&(globalThis.window.OUI=function(e){return new sn(e)}),Object.assign(Z,ee),Z}));\n+!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).OPlayer=t()}(this,(function(){\"use strict\";var e,t,n,o,i,r,s,a,l,c,d,u,h,p,g,m,v;function f(e,t){return t||(t=e.slice(0)),e.raw=t,e}function b(e){return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=1540483477,o=24,i=t^e.length,r=e.length,s=0;for(;r>=4;){let t=y(e,s);t=x(t,n),t^=t>>>o,t=x(t,n),i=x(i,n),i^=t,s+=4,r-=4}switch(r){case 3:i^=k(e,s),i^=e.charCodeAt(s+2)<<16,i=x(i,n);break;case 2:i^=k(e,s),i=x(i,n);break;case 1:i^=e.charCodeAt(s),i=x(i,n)}return i^=i>>>13,i=x(i,n),i^=i>>>15,i>>>0}(e).toString(36)}function y(e,t){return e.charCodeAt(t++)+(e.charCodeAt(t++)<<8)+(e.charCodeAt(t++)<<16)+(e.charCodeAt(t)<<24)}function k(e,t){return e.charCodeAt(t++)+(e.charCodeAt(t++)<<8)}function x(e,t){return(65535&(e|=0))*(t|=0)+(((e>>>16)*t&65535)<<16)|0}function w(e){return Boolean(e&&\"object\"==typeof e&&!Array.isArray(e))}function E(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];if(!n.length)return e;const i=n.shift();if(w(e)&&w(i))for(const r in i)w(i[r])?(e[r]||Object.assign(e,{[r]:{}}),E(e[r],i[r])):Object.assign(e,{[r]:i[r]});return E.apply(void 0,[e].concat(n))}var $,L=/[(),]|\"(?:\\\\.|[^\"\\n])*\"|'(?:\\\\.|[^'\\n])*'|\\/\\*[\\s\\S]*?\\*\\//g;function S(e){if(-1===e.indexOf(\",\"))return[e];for(var t,n=[],o=[],i=0;t=L.exec(e);)switch(t[0]){case\"(\":i++;break;case\")\":i--;break;case\",\":if(i)break;n.push(t.index)}for(t=n.length;t--;)o.unshift(e.slice(n[t]+1)),e=e.slice(0,n[t]);return o.unshift(e),o}function T(e,t){let n=S(e);return S(t).map((e=>e.indexOf(\"&\")>=0?e:\"&\"+e)).reduce(((e,t)=>e.concat(n.map((e=>t.replace(/\\&/g,e))))),[]).join(\",\")}function P(e){return 0===e.indexOf(\"@media\")}function z(e){return 0===e.indexOf(\"@keyframes\")}function A(e,t){var n;let o=t.rules,i=t.mediaQuery,r=t.globalSelector,s={};return r&&(e=r),null==(n=Object.keys(o))||n.forEach((t=>{if(function(e){return 0===e.indexOf(\"@global\")}(t)){const n=t,a=(t=t.substring(8)).indexOf(\"&\");let l;-1!=a?(l=T(e,t),r=t.substring(0,a-1).trim()):l=t,E(s,A(l,{mediaQuery:i,rules:o[n],globalSelector:l}))}else if(function(e){let t=[\":\",\".\",\"[\",\">\",\" \"],n=!1,o=e.charAt(0);for(let i=0;i<t.length;i++)if(o===t[i]){n=!0;break}return n||e.indexOf(\"&\")>=0}(t))E(s,A(T(e,t),{rules:o[t],mediaQuery:i}));else if(P(t))E(s,A(e,{mediaQuery:(h=i,p=t,h?\"@media \"+h.substring(6)+\" and \"+p.substring(6):p),rules:o[t]}));else{var n,a,l,c,d,u;if(i)null!==(n=s[i])&&void 0!==n||(s[i]={}),null!==(c=(a=s[i])[l=e])&&void 0!==c||(a[l]={}),s[i][e][t]=o[t];else if(z(t))s[t]=o[t];else null!==(u=s[d=e])&&void 0!==u||(s[d]={}),s[e][t]=o[t]}var h,p})),s}function O(e){let t=[];for(const n in e)if(Object.hasOwnProperty.call(e,n)){const o=e[n];w(o)?t.push(n+\"{\"+O(o)+\"}\"):t.push(n+\":\"+o)}return/^\\d%/.test(t[0])?t.join(\" \"):t.join(\";\")}function C(e){let t=[];for(const n in e)if(Object.hasOwnProperty.call(e,n)){const o=e[n];if(P(n))t.push(n+\"{\"+C(o)+\"}\");else if(z(n))t.push(n+\"{\"+O(o)+\"}\");else{const e=Object.entries(o).map((e=>e[0]+\":\"+e[1])).join(\";\");t.push(n+\"{\"+e+\"}\")}}return t}function M(e,t){return C(A(t,{rules:e}))}(e=>{function t(t){if(!(0,e.isBrowser)())return null;let n=document.createElement(\"style\");n.setAttribute(\"data-\"+t,\"\"),n.appendChild(document.createTextNode(\"\")),(document.head||document.getElementsByTagName(\"head\")[0]).appendChild(n);for(let e=0;e<document.styleSheets.length;e++)if(document.styleSheets[e].ownerNode===n)return document.styleSheets.item(e);return null}e.create=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\";const o=-1!==e.indexOf(\"#\"),i=-1!==e.indexOf(\".\"),r=o?e.split(\"#\"):i?e.split(\".\"):[e],s=r[0],a=r[1],l=document.createElement(s);return o&&(l.id=a),i&&l.classList.add(a),n&&(l.innerHTML=n),Object.keys(t).forEach((e=>{const n=t[e];\"video\"!==s&&\"audio\"!==s||\"boolean\"!=typeof n?void 0!==n&&l.setAttribute(e,\"\"+n):n&&l.setAttribute(e,\"\")})),l},e.render=(e,t)=>t.appendChild(e),e.isBrowser=()=>Boolean(\"undefined\"!=typeof globalThis&&globalThis.document&&globalThis.document.documentElement),e.createSheet=t;const n=(()=>{const e=Object.create({});return t=>{const n=\"object\"==typeof t?JSON.stringify(t):t;return e[n]||(e[n]=\"css-\"+b(n)),e[n]}})();e.createCss=e=>{let t=e.sheet,o=e.ssrData;return function(){for(var e,i=arguments.length,r=new Array(i),s=0;s<i;s++)r[s]=arguments[s];const a=Boolean(r[0]&&r[0].length&&r[0].raw);let l=\"\";if(a){let e=r[0];l+=e[0];for(let t=1;t<r.length;t++)l+=\"string\"!=typeof r[t]?\"\":r[t],l+=e[t]}else l=\"string\"==typeof r[0]?r[0]:JSON.stringify(r[0]);const c=n(l);if(t)for(let n=0;n<t.cssRules.length;n++)if((null==(e=t.cssRules[n])?void 0:e.selectorText)==\".\"+c)return c;let d=[\".\"+c+\"{\"+l+\"}\"];return a||\"object\"!=typeof r[0]||(d=M(r[0],\".\"+c)),t?d.forEach((e=>{t.insertRule(e,t.cssRules.length)})):o=o.concat(d),c}},e.createStyled=()=>{const n=[],o=t(\"oplayer\");return{css:(0,e.createCss)({sheet:o,ssrData:n}),getCssValue:()=>n}};var o=(0,e.createStyled)();e.css=o.css,e.getCssValue=o.getCssValue,e.cls=e=>\"css-\"+b(e)})($||($={}));const F=$,j=/(iPad)/gi.test(null==(l=globalThis.navigator)?void 0:l.userAgent)||/Macintosh/i.test(null==(c=globalThis.navigator)?void 0:c.userAgent)&&Boolean(null==(d=globalThis.navigator)?void 0:d.maxTouchPoints)&&(null==(u=globalThis.navigator)?void 0:u.maxTouchPoints)>=1,B=/iPhone/gi.test(null==(h=globalThis.navigator)?void 0:h.userAgent),R=/^((?!chrome|android).)*safari/i.test(null==(p=globalThis.navigator)?void 0:p.userAgent),H=B||j,q=/Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone/i.test(null==(g=globalThis.navigator)?void 0:g.userAgent)||H,I=/mqqbrowser/i.test(null==(m=globalThis.navigator)?void 0:m.userAgent)&&!/ qq/i.test(null==(v=globalThis.navigator)?void 0:v.userAgent),D=(e,t,n)=>{var o;const i=document.createElement(\"script\");i.src=e,i.onload=t,i.onerror=n;const r=document.getElementsByTagName(\"script\")[0];null==(o=null==r?void 0:r.parentNode)||o.insertBefore(i,r)},N={},V=e=>void 0===e,_=[\"abort\",\"canplay\",\"canplaythrough\",\"durationchange\",\"emptied\",\"ended\",\"error\",\"loadeddata\",\"loadedmetadata\",\"loadstart\",\"pause\",\"play\",\"playing\",\"progress\",\"ratechange\",\"seeked\",\"seeking\",\"stalled\",\"suspend\",\"timeupdate\",\"volumechange\",\"waiting\",\"encrypted\",\"waitingforkey\",\"enterpictureinpicture\",\"leavepictureinpicture\"],U=[\"contextmenu\"];class X{constructor(){this.events=Object.create(null)}on(e,t){this.events[e]||(this.events[e]=[]),this.events[e].push(t)}onAny(e,t){e.forEach((e=>this.on(e,t)))}once(e,t){const n=n=>{t({type:e,payload:n.payload})};n.raw=t,this.on(e,n)}off(e,t){if(this.events[e])for(let n=0;n<this.events[e].length;n++){const o=this.events[e][n];o!=t&&t!=o.raw||this.events[e].splice(n,1)}}offAny(e){this.events[e]=[]}offAll(){this.events=Object.create(null)}emit(e,t){var n,o;const i=[];null==(n=this.events[e])||n.forEach((n=>{n({type:e,payload:t}),n.raw&&i.push(n)})),null==(o=this.events[\"*\"])||o.forEach((n=>{n({type:e,payload:t}),n.raw&&i.push(n)})),i.forEach((t=>{this.off(e,t)}))}}const W={Play:\"播放\",Pause:\"暂停\",Loop:\"循环播放\",Volume:\"音量\",\"Volume: %s\":\"音量：%s\",Mute:\"静音\",Speed:\"播放速度\",LIVE:\"直播\",Language:\"语言\",Screenshot:\"截图\",Subtitle:\"字幕\",Quality:\"画质\",Fullscreen:\"全屏\",Settings:\"设置\",\"Picture in Picture\":\"画中画\",Danmaku:\"弹幕\",Display:\"显示\",Opacity:\"透明度\",FontSize:\"字体大小\",\"Display Area\":\"显示区域\",Off:\"关闭\",Auto:\"自动\",Default:\"默认\",Normal:\"正常\",\"%ss\":\"%s秒\",Close:\"关闭\",\"Can be closed after %ss\":\"%s秒后可关闭广告\"},Y={Play:\"پخش\",Next:\"بعدی\",Previous:\"قبلی\",Pause:\"توقف\",Loop:\"تکرار\",Volume:\"حجم صدا\",\"Volume: %s\":\"حجم صدا: %s\",Mute:\"بی‌صدا کردن\",Speed:\"سرعت\",LIVE:\"زنده\",WebFullscreen:\"تمام صفحه وب\",Chromecast:\"کروم کاست\",AirPlay:\"ایر پلی\",Playlist:\"پلی‌لیست\",Heatmap:\"نقشهٔ حرارتی\",Language:\"زبان\",Screenshot:\"عکس صفحه\",Subtitle:\"زیرنویس\",Quality:\"کیفیت\",Fullscreen:\"تمام صفحه\",Settings:\"تنظیمات\",\"Picture in Picture\":\"تصویر در تصویر\",Danmaku:\"دانماکو\",Display:\"نمایش\",Opacity:\"شفافیت\",FontSize:\"اندازه فونت\",\"Display Area\":\"ناحیه نمایش\",Off:\"خاموش\",Auto:\"خودکار\",Default:\"پیش‌فرض\",Normal:\"عادی\",\"%ss\":\"%s ثانیه\",Close:\"بستن\",\"Can be closed after %ss\":\"قابل بستن پس از %s ثانیه\"},Q={Play:\"پلې‌کول\",Next:\"بل\",Previous:\"مخکېنی\",Pause:\"تم کول\",Loop:\"تکرار\",Volume:\"غږ\",\"Volume: %s\":\"غږ: %s\",Mute:\"غلی کول\",Speed:\"چټکتیا\",LIVE:\"ژوندی\",WebFullscreen:\"د تمام صفحه وب\",Chromecast:\"کروم کاسټ\",AirPlay:\"ایر پلی\",Playlist:\"پلې‌لسټ\",Heatmap:\"د ډېرو کتلو نقشه\",Language:\"ژبه\",Screenshot:\"سکرین شاټ\",Subtitle:\"لاندې لیک\",Quality:\"کیفیت\",Fullscreen:\"پوره پرده\",\"\":\"د متن ډیکوډر ملاتړ نه لري\",Settings:\"ترتیبات\",\"Picture in Picture\":\"انځور په انځور\",Danmaku:\"دانماکو\",Display:\"ښکاره کول\",Opacity:\"روڼوالی\",FontSize:\"د خط اندازه\",\"Display Area\":\"د ښودلو ساحه\",Off:\"بند\",Auto:\"خودکار\",Default:\"پېل شوی\",Normal:\"عادي\",\"%ss\":\"%s ثانیه\",Close:\"بندول\",\"Can be closed after %ss\":\"د %s ثانیو وروسته تړل کېدای شي\"};class K{constructor(e){this.languages={zh:W,\"zh-CN\":W,fa:Y,pa:Q,en:Object.keys(W).reduce(((e,t)=>(e[t]=t,e)),{})},this.lang=\"auto\"===e?navigator.language:e,this.languages[this.lang]||navigator.languages.some((e=>{if(this.languages[e])return this.lang=e,!0;if(-1!==e.indexOf(\"-\")){const t=e.split(\"-\")[0];if(t&&this.languages[t])return this.lang=t,!0}return!1})),this.languages[this.lang]||(this.lang=\"en\")}get(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];const i=this.languages[this.lang][e];if(null==i)return e;let r=0;return i.replace(/%s/gi,(()=>{var e;return null!==(e=n[r++])&&void 0!==e?e:\"\"}))}update(e){E(this.languages,e)}}const J={autoplay:!1,muted:!1,loop:!1,volume:1,preload:\"metadata\",playbackRate:1,playsinline:!0,lang:\"auto\",source:{},videoAttr:{},isLive:!1,autopause:!0,isNativeUI:()=>I},G=class e{constructor(e,t){if(this.plugins=[],this.context={},this.listeners=Object.create(null),this.hasError=!1,this.isSourceChanging=!1,this.container=\"string\"==typeof e?document.querySelector(e):e,!this.container)throw new Error((\"string\"==typeof e?e:\"Element\")+\"does not exist\");this.options=Object.assign({},J,\"string\"==typeof t?{source:{src:t}}:t),this.locales=new K(this.options.lang),this.eventEmitter=new X}static make(t,n){return new e(t,n)}use(e){return e.forEach((e=>{this.plugins.push(e)})),this}create(){return this.render(),this.initEvent(),this.plugins.forEach((e=>this.applyPlugin(e,!0))),this.options.source.src&&this.load(this.options.source),e.players.push(this),this}initEvent(){this.listeners.error=e=>{this.$video.error&&(this.hasError=!0,this.eventEmitter.emit(\"error\",e))},this.$video.addEventListener(\"error\",(e=>this.listeners.error(e)));const e=(e,t)=>{this.eventEmitter.emit(e,t)};[[this.$video,[\"fullscreenchange\",\"webkitbeginfullscreen\",\"webkitendfullscreen\"],[\"fullscreenerror\",\"webkitfullscreenerror\",\"mozfullscreenerror\"]],[this.$root,[\"fullscreenchange\",\"webkitfullscreenchange\"],[\"fullscreenerror\",\"webkitfullscreenerror\",\"mozfullscreenerror\"]]].forEach((t=>{const n=t[0];t.slice(1).forEach((t=>{const o=t[0];this.listeners[o]=e,t.forEach((e=>{n.addEventListener(e,(e=>{this.listeners[o](o,e)}),{passive:!0})}))}))})),[[this.$video,_],[this.$root,U]].forEach((t=>{let n=t[0];t[1].forEach((t=>{this.listeners[t]||(this.listeners[t]=e,n.addEventListener(t,(e=>{var n;null==(n=this.listeners)||n[t](t,e)}),{passive:!0}))}))}))}render(){this.$video=F.create(\"video.\"+F.css(\"\\n        width: 100%;\\n        height: 100%;\\n        display: block;\\n        position: relative;\\n      \"),Object.assign({autoplay:this.options.autoplay,loop:this.options.loop,playsinline:this.options.playsinline,\"webkit-playsinline\":this.options.playsinline,\"x5-playsinline\":this.options.playsinline,preload:this.options.preload,poster:this.options.source.poster},this.options.videoAttr));const e=this.options,t=e.muted,n=e.volume,o=e.playbackRate;t&&this.mute(),this.$video.volume=n,setTimeout((()=>{this.$root&&this.setPlaybackRate(o)})),this.$root=F.create(\"div.\"+F.css(\"\\n        position: relative;\\n        width: 100%;\\n        height: 100%;\\n        overflow: hidden;\\n        background-color: #000;\\n      \")),F.render(this.$video,this.$root),F.render(this.$root,this.container)}async load(e){var t;await(null==(t=this.loader)?void 0:t.destroy()),this.loader=void 0;for(const n of this.plugins)if(n.load){const t=await n.load(this,e);if(0!=t&&!this.loader){this.loader=t,this.emit(\"loaderchange\",t);break}}return this.loader||(this.$video.src=e.src),e}applyPlugin(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const n=e.name,o=e.key;if(this.context[e.key||e.name])throw new Error(\"duplicate plugin\");t||this.plugins.push(e);const i=e.apply(this);i&&(this.context[o||n]=i)}on(e,t){return\"string\"==typeof e?this.eventEmitter.on(e,t):Array.isArray(e)?this.eventEmitter.onAny(e,t):\"function\"==typeof e&&this.eventEmitter.on(\"*\",e),this}once(e,t){this.eventEmitter.once(e,t)}off(e,t){this.eventEmitter.off(e,t)}emit(e,t){this.eventEmitter.emit(e,t)}setPoster(e){this.$video.poster=e}play(){if((this.$video.src||this.$video.currentSrc)&&!this.isSourceChanging){if(this.options.autopause)for(let t=0;t<e.players.length;t++){const n=e.players[t];n!=this&&n.pause()}return this.$video.play()}}pause(){return this.$video.pause()}togglePlay(){return this.isPlaying?this.pause():this.play()}mute(){this.$video.muted=!0}unmute(){this.$video.muted=!1}toggleMute(){this.isMuted?this.unmute():this.mute()}setVolume(e){this.$video.volume=e>1?1:e<0?0:e,this.$video.volume>0&&this.isMuted&&this.unmute()}setPlaybackRate(e){this.$video.playbackRate=e}seek(e){this.$video.currentTime=e}setLoop(e){this.$video.loop=e}async enterFullscreen(){this.isInPip&&await this.exitPip(),this._requestFullscreen?this._requestFullscreen.call(this.$root,{navigationUI:\"hide\"}):this.$video.webkitEnterFullscreen()}exitFullscreen(){return this._exitFullscreen.call(document)}get isFullscreenEnabled(){return document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled||this.$video.webkitEnterFullscreen}get isFullScreen(){return Boolean((document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement)===this.$root||this.$video.webkitDisplayingFullscreen)}toggleFullScreen(){return this.isFullScreen?this.exitFullscreen():this.enterFullscreen()}get isPipEnabled(){return document.pictureInPictureEnabled}enterPip(){return this.$video.requestPictureInPicture()}exitPip(){return!!this.isInPip&&document.exitPictureInPicture()}get isInPip(){return document.pictureInPictureElement==this.$video}togglePip(){return this.isInPip?this.exitPip():this.enterPip()}changeQuality(e){return this._loader(e,{keepPlaying:!0,keepTime:!0,preEvent:\"videoqualitychange\",event:\"videoqualitychanged\",brokenEvent:\"qualitychangeerror\"})}changeSource(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return this._loader(e,{keepPlaying:t,preEvent:\"videosourcechange\",event:\"videosourcechanged\",brokenEvent:\"sourcechangeerror\"})}_loader(e,t){return new Promise(((n,o)=>{if(this.isSourceChanging)return o(Error(\"Previous Source is Changing.\"));const i=this.isPlaying,r=this.currentTime,s=this.volume,a=this.playbackRate;this.pause(),this.hasError=!1,this.isSourceChanging=!0,this.emit(t.preEvent,e);const l=t.keepPlaying,c=t.keepTime,d=\"none\"==this.options.preload,u=d?\"loadstart\":\"loadedmetadata\",h=l&&i;let p;const g=n=>{this.$root&&(this.off(u,v),this.emit(t.brokenEvent,{source:p||e,error:n}),\"videosourcechanged\"==t.event?this.isSourceChanging=!1:this.load(this.options.source).then(m).finally((()=>{this.isSourceChanging=!1})),o(n))},m=()=>{s!=this.volume&&this.setVolume(s),a!=this.playbackRate&&this.setPlaybackRate(a),d&&c&&this.$video.load(),c&&!this.options.isLive&&this.seek(r),h&&!this.isPlaying&&this.$video.play(),Object.assign(this.options.source,p)},v=()=>{this.$root&&(this.off(\"error\",g),m(),this.isSourceChanging=!1,this.emit(t.event,p),n())};return(e instanceof Promise?e:Promise.resolve(e)).then((e=>{if(!e.src)throw new Error(\"Empty Source\");return p=e,this.$video.poster=e.poster||\"\",this.once(\"error\",g),this.once(u,v),e})).then((e=>this.load(e))).catch(g)}))}destroy(){e.players.splice(e.players.indexOf(this),1);const t=this.eventEmitter,n=this.loader,o=this.plugins,i=this.container,r=this.$root,s=this.$video,a=this.isPlaying,l=this.isFullScreen,c=this.isInPip;t.emit(\"destroy\"),t.offAll(),null==n||n.destroy(),o.forEach((e=>{var t;return!e.load&&(null==(t=e.destroy)?void 0:t.call(e))})),a&&this.pause(),l&&this.exitFullscreen(),c&&this.exitPip(),s.src&&URL.revokeObjectURL(s.src),i.removeChild(r),this.eventEmitter=this.locales=this.options=this.listeners=this.context=this.plugins=this.container=this.$root=this.$video=this.loader=void 0}get isNativeUI(){return this.options.isNativeUI()}get state(){return this.$video.readyState}get isPlaying(){return!this.$video.paused}get isMuted(){return this.$video.muted}get isEnded(){return this.$video.ended}get isLoop(){return this.$video.loop}get isAutoPlay(){return this.$video.autoplay}get duration(){return this.$video.duration}get buffered(){return this.$video.buffered}get currentTime(){return this.$video.currentTime}get volume(){return this.$video.volume}get playbackRate(){return this.$video.playbackRate}get _requestFullscreen(){return HTMLElement.prototype.requestFullscreen||HTMLElement.prototype.webkitRequestFullscreen||HTMLElement.prototype.mozRequestFullScreen||HTMLElement.prototype.msRequestFullscreen}get _exitFullscreen(){return Document.prototype.exitFullscreen||Document.prototype.webkitExitFullscreen||Document.prototype.cancelFullScreen||Document.prototype.mozCancelFullScreen||Document.prototype.msExitFullscreen}static get version(){return\"1.2.38-beta.2\"}};G.players=[];let Z=G;const ee=Object.freeze(Object.defineProperty({__proto__:null,get $(){return $},Player:Z,default:Z,isIOS:H,isMobile:q,isObject:w,isPlainObject:function(e){if(\"object\"!=typeof e||null===e)return!1;let t=e;for(;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t},isQQBrowser:I,isSafari:R,isUndefined:V,isiPad:j,isiPhone:B,loadSDK:function(e,t,n){let o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:()=>!0,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:D;const r=e=>V(window[e])?window.exports&&window.exports[e]?window.exports[e]:window.module&&window.module.exports&&window.module.exports[e]?window.module.exports[e]:void 0:window[e],s=r(t);return s&&o(s)?Promise.resolve(s):new Promise(((o,s)=>{if(!V(N[e]))return void N[e].push({resolve:o,reject:s});N[e]=[{resolve:o,reject:s}];const a=t=>{var n;null==(n=N[e])||n.forEach((e=>e.resolve(t)))};if(!V(n)){const e=window[n];window[n]=function(){V(e)||e.apply(void 0,arguments),a(r(t))}}i(e,(()=>{V(n)&&a(r(t))}),(t=>{var n;null==(n=N[e])||n.forEach((e=>{e.reject(t)})),delete N[e]}))}))},loadScript:D,mergeDeep:E},Symbol.toStringTag,{value:\"Module\"})),te=$.cls(\"loading\"),ne=$.cls(\"playing\"),oe=$.cls(\"focused\"),ie=$.cls(\"fullscreen\"),re=$.cls(\"settingShown\"),se=$.css(\"display:none\"),ae=\"data-ctrl-hidden\",le=$.css({[\".\"+ne]:{cursor:\"none\"}}),ce=$.cls(\"error\"),de=$.css(e||(e=f([\"\\n  z-index: 99 !important;\\n  position: fixed !important;\\n  left: 0;\\n  right: 0;\\n  top: 0;\\n  bottom: 0;\"]))),ue=$.css({background:\"none\",border:\"none\",cursor:\"pointer\",padding:0,outline:\"none\",font:\"inherit\",color:\"inherit\",fill:\"#fff\",\"line-height\":\"inherit\",\"text-align\":\"inherit\",width:\"100%\",\"-webkit-tap-highlight-color\":\"transparent\",\"user-select\":\"none\"}),he=$.css({\"& > *:nth-child(1)\":{display:\"none\"}}),pe=$.css({\"& > *:nth-child(2)\":{display:\"none\"}}),ge=q?\"\":$.css({position:\"relative\",\"&:hover\":{\"&::after\":{opacity:1,transform:\"translateX(-50%) scale(1)\"},\"&:not([data-tooltip-pos]):last-child::after\":{right:0,left:\"auto\",transform:\"translateY(0) scale(1)\"},\"&[data-tooltip-pos=down]::after\":{transform:\"translateX(-50%) scale(1)\"},\"&[data-tooltip-pos=down]:last-child::after\":{right:0,transform:\"translateY(0) scale(1)\"}},\"&::after\":{position:\"absolute\",content:\"attr(aria-label)\",bottom:\"100%\",left:\"50%\",\"margin-bottom\":\"0.5em\",\"white-space\":\"nowrap\",background:\"var(--shadow-background-color)\",transform:\"translate(-50%, 10px) scale(.8)\",\"transform-origin\":\"50% 100%\",opacity:0,padding:\"6px 8px\",\"border-radius\":\"2px\",transition:\"transform .2s ease .1s,opacity .2s ease .1s\",\"pointer-events\":\"none\",\"font-size\":\"0.75em\"},\"&[data-tooltip-pos=down]::after\":{top:\"100%\",bottom:\"auto\",\"margin-top\":\"0.5em\",transform:\"translate(-50%, -10px) scale(.8)\"},\"&[data-tooltip-pos=down]:last-child::after\":{right:0,top:\"100%\",bottom:\"unset\",left:\"auto\",\"margin-top\":\"0.5em\",transform:\"translateY(-10px) scale(.8)\",\"transform-origin\":\"100% 0\"},\"&:not([data-tooltip-pos]):last-child::after\":{right:0,left:\"auto\",transform:\"translateY(10px) scale(.8)\",\"transform-origin\":\"100% 100%\"}}),me={play:'<svg viewBox=\"0 0 1024 1024\"><path  d=\"M245.76 785.203V238.797c0-50.442 34.918-69.182 77.967-42.046l422.196 266.117c43.11 27.157 43.069 71.128 0 98.284L323.727 827.249c-43.11 27.177-77.967 8.315-77.967-42.046z\" /></svg>',pause:'<svg viewBox=\"0 0 1024 1024\"><path  d=\"M327.68 184.32a81.92 81.92 0 0 1 81.92 81.92v491.52a81.92 81.92 0 1 1-163.84 0V266.24a81.92 81.92 0 0 1 81.92-81.92z m368.64 0a81.92 81.92 0 0 1 81.92 81.92v491.52a81.92 81.92 0 1 1-163.84 0V266.24a81.92 81.92 0 0 1 81.92-81.92z\" /></svg>',volume:['<svg viewBox=\"0 0 1024 1024\"><path d=\"M128 426.666667v170.666666c0 23.466667 19.2 42.666667 42.666667 42.666667h128l140.373333 140.373333c26.88 26.88 72.96 7.68 72.96-30.293333V273.493333c0-37.973333-46.08-57.173333-72.96-30.293333L298.666667 384H170.666667c-23.466667 0-42.666667 19.2-42.666667 42.666667z m576 85.333333A192 192 0 0 0 597.333333 340.053333v343.466667c63.146667-31.146667 106.666667-96 106.666667-171.52zM597.333333 189.866667v8.533333c0 16.213333 10.666667 30.293333 25.6 36.266667C733.013333 278.613333 810.666667 386.56 810.666667 512s-77.653333 233.386667-187.733334 277.333333c-15.36 5.973333-25.6 20.053333-25.6 36.266667v8.533333c0 26.88 26.88 45.653333 51.626667 36.266667C793.6 815.36 896 675.84 896 512s-102.4-303.36-247.04-358.4c-24.746667-9.813333-51.626667 9.386667-51.626667 36.266667z\"></path></svg>','<svg viewBox=\"0 0 1024 1024\"><path d=\"M154.88 154.88a42.496 42.496 0 0 0 0 60.16L311.04 371.2 298.666667 384H170.666667c-23.466667 0-42.666667 19.2-42.666667 42.666667v170.666666c0 23.466667 19.2 42.666667 42.666667 42.666667h128l140.373333 140.373333c26.88 26.88 72.96 7.68 72.96-30.293333v-177.92l178.346667 178.346667c-20.906667 15.786667-43.52 29.013333-68.266667 38.826666-15.36 6.4-24.746667 22.613333-24.746667 39.253334 0 30.72 31.146667 50.346667 59.306667 38.826666 34.133333-14.08 66.133333-32.853333 94.72-55.893333l57.173333 57.173333a42.496 42.496 0 1 0 60.16-60.16L215.466667 154.88c-16.64-16.64-43.52-16.64-60.586667 0zM810.666667 512c0 34.986667-6.4 68.693333-17.493334 99.84l65.28 65.28c23.893333-49.92 37.546667-105.813333 37.546667-165.12 0-163.413333-102.4-303.36-246.613333-358.4-25.173333-9.813333-52.053333 9.813333-52.053334 36.693333v8.106667c0 16.213333 10.666667 30.293333 26.026667 36.266667C733.013333 279.04 810.666667 386.56 810.666667 512z m-371.626667-268.373333l-7.253333 7.253333L512 331.093333V273.493333c0-37.973333-46.08-56.746667-72.96-29.866666zM704 512A192 192 0 0 0 597.333333 340.053333v76.373334l105.813334 105.813333c0.426667-3.413333 0.853333-6.826667 0.853333-10.24z\"></path></svg>'],fullscreen:['<svg viewBox=\"-113 -113 1250 1250\"><path d=\"M0 232.732444A232.732444 232.732444 0 0 1 232.732444 0h558.535112A232.732444 232.732444 0 0 1 1024 232.732444v558.535112A232.732444 232.732444 0 0 1 791.267556 1024H232.732444A232.732444 232.732444 0 0 1 0 791.267556V232.732444z m232.732444-139.662222a139.662222 139.662222 0 0 0-139.662222 139.662222v558.535112a139.662222 139.662222 0 0 0 139.662222 139.662222h558.535112a139.662222 139.662222 0 0 0 139.662222-139.662222V232.732444a139.662222 139.662222 0 0 0-139.662222-139.662222H232.732444z\"></path><path d=\"M549.575111 245.845333c0-25.799111 20.935111-46.734222 46.734222-46.734222h116.821334A140.202667 140.202667 0 0 1 853.333333 339.313778v116.821333a46.734222 46.734222 0 0 1-93.468444 0v-116.821333c0-25.827556-20.906667-46.734222-46.734222-46.734222h-116.821334a46.734222 46.734222 0 0 1-46.734222-46.734223zM245.845333 549.546667c25.799111 0 46.734222 20.935111 46.734223 46.734222v116.821333c0 25.827556 20.906667 46.734222 46.734222 46.734222h116.821333a46.734222 46.734222 0 0 1 0 93.468445h-116.821333A140.202667 140.202667 0 0 1 199.111111 713.130667v-116.821334c0-25.799111 20.935111-46.734222 46.734222-46.734222z\"></path></svg>','<svg viewBox=\"-113 -113 1250 1250\"><path d=\"M0.739556 233.130667a232.391111 232.391111 0 0 1 232.391111-232.391111h557.738666a232.391111 232.391111 0 0 1 232.391111 232.391111v557.738666a232.391111 232.391111 0 0 1-232.391111 232.391111H233.130667a232.391111 232.391111 0 0 1-232.391111-232.391111V233.130667z m232.391111-139.434667a139.434667 139.434667 0 0 0-139.434667 139.434667v557.738666a139.434667 139.434667 0 0 0 139.434667 139.434667h557.738666a139.434667 139.434667 0 0 0 139.434667-139.434667V233.130667a139.434667 139.434667 0 0 0-139.434667-139.434667H233.130667z\"></path><path d=\"M601.088 186.652444c25.685333 0 46.506667 20.792889 46.506667 46.478223v96.796444c0 25.685333 20.792889 46.478222 46.478222 46.478222h96.796444a46.478222 46.478222 0 1 1 0 92.984889h-96.796444a139.434667 139.434667 0 0 1-139.463111-139.463111V233.130667c0-25.685333 20.821333-46.478222 46.478222-46.478223z m-414.435556 414.435556c0-25.656889 20.792889-46.478222 46.478223-46.478222h96.796444a139.434667 139.434667 0 0 1 139.463111 139.463111v96.796444a46.478222 46.478222 0 0 1-92.984889 0v-96.796444c0-25.685333-20.792889-46.478222-46.478222-46.478222H233.130667a46.478222 46.478222 0 0 1-46.478223-46.506667z\"></path></svg>'],pip:['<svg viewBox=\"0 0 1024 1024\"><path d=\"M768 213.333333H256a85.333333 85.333333 0 0 0-85.333333 85.333334v426.666666a85.333333 85.333333 0 0 0 85.333333 85.333334h170.666667a42.666667 42.666667 0 1 1 0 85.333333H256a170.666667 170.666667 0 0 1-170.666667-170.666667V298.666667a170.666667 170.666667 0 0 1 170.666667-170.666667h512a170.666667 170.666667 0 0 1 170.666667 170.666667v128a42.666667 42.666667 0 1 1-85.333334 0V298.666667a85.333333 85.333333 0 0 0-85.333333-85.333334z m-128 341.333334a128 128 0 0 0-128 128v85.333333a128 128 0 0 0 128 128h170.666667a128 128 0 0 0 128-128v-85.333333a128 128 0 0 0-128-128h-170.666667z\"></path></svg>','<svg viewBox=\"0 0 1024 1024\"><path d=\"m768,213.33333l-512,0a85.33333,85.33333 0 0 0 -85.33333,85.33334l0,426.66666a85.33333,85.33333 0 0 0 85.33333,85.33334l170.66667,0a42.66667,42.66667 0 1 1 0,85.33333l-170.66667,0a170.66667,170.66667 0 0 1 -170.66667,-170.66667l0,-426.66666a170.66667,170.66667 0 0 1 170.66667,-170.66667l512,0a170.66667,170.66667 0 0 1 170.66667,170.66667l0,128a42.66667,42.66667 0 1 1 -85.33334,0l0,-128a85.33333,85.33333 0 0 0 -85.33333,-85.33334zm-128,341.33334a128,128 0 0 0 -128,128l0,85.33333a128,128 0 0 0 128,128l170.66667,0a128,128 0 0 0 128,-128l0,-85.33333a128,128 0 0 0 -128,-128l-170.66667,0z\"></path><g stroke=\"null\"><g stroke=\"null\" transform=\"matrix(0.6896517266997474,0,0,0.6896517266997474,-10241.200782450309,-10001.206060939305) \"><rect stroke=\"null\" x=\"15122.523407\" y=\"14826.656681\" width=\"582\" height=\"402\" fill=\"none\"></rect></g><g stroke=\"null\" transform=\"matrix(0.6896517266997474,0,0,0.6896517266997474,-10241.200782450309,-10001.206060939305) \"><path stroke=\"null\" d=\"m15503.523407,14924.856681l-161.8,0c-66.2,0 -120,53.8 -120,120l0,161.8c0,22.1 17.9,40 40,40s40,-17.9 40,-40l0,-144.4l169.8,169.8c7.8,7.8 18,11.7 28.3,11.7c10.2,0 20.5,-3.9 28.3,-11.7c15.6,-15.6 15.6,-40.9 0,-56.6l-170.7,-170.6l146.1,0c22.1,0 40,-17.9 40,-40s-17.9,-40 -40,-40z\"></path></g></g></svg>'],setting:'<svg viewBox=\"0 0 1024 1024\" style=\"transform: scale(1.1);\"><path d=\"M0 0h1024v1024H0z\" fill-opacity=\"0\"></path><path d=\"M501.333333 127.573333a21.333333 21.333333 0 0 1 21.333334 0l316.928 182.954667a21.333333 21.333333 0 0 1 10.666666 18.474667v365.994666a21.333333 21.333333 0 0 1-10.666666 18.474667L522.666667 896.426667a21.333333 21.333333 0 0 1-21.333334 0l-316.928-182.954667a21.333333 21.333333 0 0 1-10.666666-18.474667V328.96a21.333333 21.333333 0 0 1 10.666666-18.474667zM512 219.946667L259.029333 365.952v292.053333L512 804.010667l252.928-146.005334V365.952L512 219.946667zM512 426.666667a85.333333 85.333333 0 1 1 0 170.666666 85.333333 85.333333 0 0 1 0-170.666666z\"></path></svg>\\n',screenshot:'<svg viewBox=\"0 0 1024 1024\"><path d=\"M412.245333 757.333333a42.666667 42.666667 0 0 1-56.490666-64l356.48-314.794666a42.666667 42.666667 0 0 1 56.746666 0.256l112.896 101.461333a42.666667 42.666667 0 1 1-57.088 63.488L740.266667 467.626667l-328.021334 289.706666zM810.666667 213.333333h-128a42.666667 42.666667 0 0 1 0-85.333333h170.666666a42.666667 42.666667 0 0 1 42.666667 42.666667v170.666666a42.666667 42.666667 0 0 1-85.333333 0V213.333333zM213.333333 213.333333v128a42.666667 42.666667 0 1 1-85.333333 0V170.666667a42.666667 42.666667 0 0 1 42.666667-42.666667h170.666666a42.666667 42.666667 0 1 1 0 85.333333H213.333333z m597.333334 597.333334v-128a42.666667 42.666667 0 0 1 85.333333 0v170.666666a42.666667 42.666667 0 0 1-42.666667 42.666667h-170.666666a42.666667 42.666667 0 0 1 0-85.333333h128zM213.333333 810.666667h128a42.666667 42.666667 0 0 1 0 85.333333H170.666667a42.666667 42.666667 0 0 1-42.666667-42.666667v-170.666666a42.666667 42.666667 0 0 1 85.333333 0v128z m170.666667-298.666667a128 128 0 1 1 0-256 128 128 0 0 1 0 256z m0-85.333333a42.666667 42.666667 0 1 0 0-85.333334 42.666667 42.666667 0 0 0 0 85.333334z\"></path></svg>',playbackRate:'<svg viewBox=\"0 0 1024 1024\"><path d=\"M512 951.04a435.2 435.2 0 1 1 435.2-435.2 435.2 435.2 0 0 1-435.2 435.2z m0-819.2a384 384 0 1 0 384 384A384 384 0 0 0 512 132.096z\"></path><path d=\"M468.992 493.824l-130.048-75.008a20.992 20.992 0 0 0-31.232 18.176v150.016a20.992 20.992 0 0 0 31.232 18.176l130.048-75.008a20.992 20.992 0 0 0 0-36.352zM684.8 493.824l-129.536-75.008a21.248 21.248 0 0 0-31.744 18.432v149.504a21.248 21.248 0 0 0 31.744 18.432l129.536-75.008a20.992 20.992 0 0 0 0-36.352z\"></path></svg>',subtitle:'<svg viewBox=\"0 0 1024 1024\" version=\"1.1\"><path d=\"M800 170.666667A138.666667 138.666667 0 0 1 938.666667 309.333333v405.546667a138.666667 138.666667 0 0 1-138.666667 138.666667H224A138.666667 138.666667 0 0 1 85.333333 714.88V309.333333a138.666667 138.666667 0 0 1 130.816-138.453333L224 170.666667h576z m0 64H224l-6.144 0.256A74.666667 74.666667 0 0 0 149.333333 309.333333v405.546667c0 41.216 33.450667 74.666667 74.666667 74.666667h576a74.666667 74.666667 0 0 0 74.666667-74.666667V309.333333a74.666667 74.666667 0 0 0-74.666667-74.666666zM234.666667 512c0-134.229333 115.754667-203.733333 218.538666-145.109333A32 32 0 0 1 421.461333 422.4C361.856 388.437333 298.666667 426.410667 298.666667 512c0 85.546667 63.317333 123.562667 122.88 89.728a32 32 0 0 1 31.573333 55.637333C350.549333 715.733333 234.666667 646.101333 234.666667 512z m320 0c0-134.229333 115.754667-203.733333 218.538666-145.109333a32 32 0 0 1-31.744 55.552C681.856 388.437333 618.666667 426.410667 618.666667 512c0 85.546667 63.317333 123.562667 122.88 89.728a32 32 0 0 1 31.573333 55.637333C670.549333 715.733333 554.666667 646.101333 554.666667 512z\"></path></svg>',loop:'<svg viewBox=\"0 0 32 32\"><g><path d=\"m16 2a13.9 13.9 0 0 0 -9 3.32v-2.32a1 1 0 0 0 -2 0v5a1 1 0 0 0 1 1h5a1 1 0 0 0 0-2h-2.89a11.87 11.87 0 0 1 7.89-3 12 12 0 1 1 -11.67 9.23 1 1 0 1 0 -1.94-.46 13.72 13.72 0 0 0 -.39 3.23 14 14 0 1 0 14-14z\"/><path d=\"m14 21.2a2 2 0 0 0 1.06-.31l5.11-3.19a2 2 0 0 0 0-3.4l-5.11-3.19a2 2 0 0 0 -3.06 1.69v6.4a2 2 0 0 0 2 2zm0-8.4 5.11 3.2-5.11 3.2z\"/></g></svg>',quality:'<svg viewBox=\"0 0 32 32\"><g><path d=\"m16 2a14 14 0 1 0 14 14 14 14 0 0 0 -14-14zm0 26a12 12 0 1 1 12-12 12 12 0 0 1 -12 12z\"/><path d=\"m14.5 11a1 1 0 0 0 -1 1v3h-2v-3a1 1 0 0 0 -2 0v8a1 1 0 0 0 2 0v-3h2v3a1 1 0 0 0 2 0v-8a1 1 0 0 0 -1-1z\"/><path d=\"m19.5 11h-2a1 1 0 0 0 -1 1v8a1 1 0 0 0 1 1h2a3 3 0 0 0 3-3v-4a3 3 0 0 0 -3-3zm1 7a1 1 0 0 1 -1 1h-1v-6h1a1 1 0 0 1 1 1z\"/></g></svg>',lang:'<svg viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333C277.333333 85.333333 85.333333 277.333333 85.333333 512s192 426.666667 426.666667 426.666667 426.666667-192 426.666667-426.666667S746.666667 85.333333 512 85.333333z m294.4 256H682.666667c-12.8-55.466667-34.133333-102.4-59.733334-153.6 76.8 29.866667 145.066667 81.066667 183.466667 153.6zM512 170.666667c34.133333 51.2 64 106.666667 81.066667 170.666666h-162.133334c17.066667-59.733333 46.933333-119.466667 81.066667-170.666666zM183.466667 597.333333c-8.533333-25.6-12.8-55.466667-12.8-85.333333s4.266667-59.733333 12.8-85.333333h145.066666c-4.266667 29.866667-4.266667 55.466667-4.266666 85.333333s4.266667 55.466667 4.266666 85.333333H183.466667z m34.133333 85.333334H341.333333c12.8 55.466667 34.133333 102.4 59.733334 153.6-76.8-29.866667-145.066667-81.066667-183.466667-153.6zM341.333333 341.333333H217.6c42.666667-72.533333 106.666667-123.733333 183.466667-153.6C375.466667 238.933333 354.133333 285.866667 341.333333 341.333333z m170.666667 512c-34.133333-51.2-64-106.666667-81.066667-170.666666h162.133334c-17.066667 59.733333-46.933333 119.466667-81.066667 170.666666z m98.133333-256H413.866667c-4.266667-29.866667-8.533333-55.466667-8.533334-85.333333s4.266667-55.466667 8.533334-85.333333h200.533333c4.266667 29.866667 8.533333 55.466667 8.533333 85.333333s-8.533333 55.466667-12.8 85.333333z m12.8 238.933334c25.6-46.933333 46.933333-98.133333 59.733334-153.6h123.733333c-38.4 72.533333-106.666667 123.733333-183.466667 153.6z m76.8-238.933334c4.266667-29.866667 4.266667-55.466667 4.266667-85.333333s-4.266667-55.466667-4.266667-85.333333h145.066667c8.533333 25.6 12.8 55.466667 12.8 85.333333s-4.266667 59.733333-12.8 85.333333h-145.066667z\"></path></svg>',progressIndicator:null,loadingIndicator:null,previous:null,next:null,chromecast:null,airplay:null,danmaku:null,playlist:null};var ve,fe;(fe=ve||(ve={})).setupIcons=e=>{for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(me[t]=e[t]);return me},fe.get=e=>me[e];const be=e=>{const t=()=>e.$root.classList.add(te),n=()=>{e.isSourceChanging||e.$root.classList.remove(te)};\"none\"!=e.$video.preload&&t(),e.on(\"loadstart\",(()=>{\"none\"==e.$video.preload&&n()})),e.on([\"seeking\",\"videoqualitychange\",\"videosourcechange\"],t),e.on([\"canplaythrough\",\"playing\",\"pause\",\"seeked\",\"error\"],n),e.on(e.options.autoplay||R?\"loadedmetadata\":\"canplay\",(()=>e.$root.classList.remove(te))),e.on([\"waiting\",\"playing\"],(o=>{\"waiting\"==o.type&&t();const i=e.currentTime,r=()=>{i!==e.currentTime?(n(),e.off(\"timeupdate\",r)):t()};e.on(\"timeupdate\",r)}))},ye=(e,t)=>{(e=>{e.on(\"play\",(()=>{e.$root.classList.add(ne)})),e.on([\"pause\",\"videosourcechange\"],(()=>{e.$root.classList.remove(ne)}))})(e),be(e),(e=>{e.on(\"fullscreenchange\",(t=>{if(t.payload.isWeb)e.$root.classList.toggle(de);else{if(!e._requestFullscreen)return;e.$root.classList.toggle(ie)}}))})(e),q||((e,t)=>{function n(t){let n=t.target;n&&(e.$root.contains(n)||e.$root==n)?e.$root.classList.add(oe):e.$root.classList.remove(oe)}t&&e.$root.classList.add(oe),document.addEventListener(\"click\",n),document.addEventListener(\"contextmenu\",n),e.on(\"destroy\",(()=>{document.removeEventListener(\"click\",n),document.removeEventListener(\"contextmenu\",n)}))})(e,t.autoFocus)};function ke(e,t,n){return Math.min(Math.max(e,t),n)}function xe(e){return e<10?\"0\"+e:\"\"+e}function we(e){if(!isFinite(e))return\"--:--\";const t=Math.floor(e/3600),n=Math.floor(e%3600/60),o=Math.floor(e%3600%60);return(t>0?xe(t)+\":\":\"\")+xe(n)+\":\"+xe(o)}const Ee=e=>{if((e=>e.$root.classList.contains(te))(e)||isNaN(e.duration))return void e.emit(\"notice\",{text:e.locales.get(\"Please wait for loading to complete\")});const t=(e=>{var t;try{const n=e.$video,o=e.$root,i=e.context.ui,r=document.createElement(\"canvas\"),s=n.videoWidth,a=n.videoHeight;r.width=s,r.height=a,r.getContext(\"2d\").drawImage(n,0,0,s,a);const l=(null==(t=i.$watermark)?void 0:t.style)||{},c=l.top,d=l.left,u=l.right,h=l.bottom;if(i.$watermark&&[c,d,u,h].filter((e=>null!=e)).length>1){const e=i.$watermark,t=e.offsetLeft,n=e.offsetTop,a=e.offsetWidth,l=e.offsetHeight,p=i.$watermark.getBoundingClientRect(),g=p.width,m=p.height;let v=0,f=0;d?v=t:u&&(v=s-(o.clientWidth-t-a)-a),c?f=n:h&&(f=s-(o.clientHeight-n-l)-l),r.getContext(\"2d\").drawImage(i.$watermark,v,f,g,m)}return r.toDataURL(\"image/png\")}catch(n){return n}})(e);if(t instanceof Error)e.emit(\"notice\",{text:t.message});else{!function(e,t){const n=document.createElement(\"a\");n.href=e,n.download=t,n.click()}(t,(e.options.source.title||\"OPlayer-ScreenShot\")+\"-\"+we(e.currentTime).replace(/:/g,\"-\")+\".png\")}},$e=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1500,n=null;const o=()=>n&&clearTimeout(n);return{callee:()=>{o(),n=setTimeout((()=>{e()}),t)},clear:o}};function Le(e,t){return e.classList.add(t),e}function Se(e,t){return e.classList.remove(t),e}function Te(e,t){return e.classList.contains(t)}const Pe={dragStart:q?\"touchstart\":\"mousedown\",dragMove:q?\"touchmove\":\"mousemove\",dragEnd:q?\"touchend\":\"mouseup\"},ze={ArrowUp:e=>{const t=100*e.volume+10;e.setVolume(t/100),e.emit(\"notice\",{text:e.locales.get(\"Volume: %s\",~~(100*e.volume)+\"%\")})},ArrowDown:e=>{const t=100*e.volume-10;e.setVolume(t/100),e.emit(\"notice\",{text:e.locales.get(\"Volume: %s\",~~(100*e.volume)+\"%\")})},ArrowLeft:(e,t)=>{var n,o;if(e.options.isLive||e.hasError)return;e.currentTime-((null==(n=t.theme.progress)?void 0:n.backward)||5)<0?e.seek(0):e.seek(e.currentTime-((null==(o=t.theme.progress)?void 0:o.forward)||5)),e.emit(\"notice\",{text:we(e.currentTime)+\" / \"+we(e.duration)})},ArrowRight:e=>{e.options.isLive||e.hasError||(e.seek(e.currentTime+5),e.emit(\"notice\",{text:we(e.currentTime)+\" / \"+we(e.duration)}))},\" \":e=>e.togglePlay(),K:e=>e.togglePlay(),Escape:e=>{e.isFullScreen?e.exitFullscreen():e.$root.classList.contains(de)&&e.emit(\"fullscreenchange\",{isWeb:!0})},F:e=>e.toggleFullScreen(),W:e=>e.emit(\"fullscreenchange\",{isWeb:!0}),S:Ee,M:e=>e.isMuted?e.unmute():e.mute()};function Ae(e){var t,n;const o=e.player,i=e.config;function r(e){var t,n,r;if(\"INPUT\"==(null==(t=document.activeElement)?void 0:t.tagName)||\"TEXTAREA\"==(null==(n=document.activeElement)?void 0:n.tagName)||(null==(r=document.activeElement)?void 0:r.getAttribute(\"contenteditable\"))||i.keyboard.focused&&!(e=>e.$root.classList.contains(oe))(o)||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)return;const s=e.key.toLocaleUpperCase();ze[s]&&(e.preventDefault(),ze[s](o,i))}(!q||(null==(t=i.keyboard)?void 0:t.focused)||(null==(n=i.keyboard)?void 0:n.global))&&(e.keyboard={register:function(e){for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(ze[t]=e[t])},unregister:function(e){e.forEach((e=>{delete ze[e]}))}},document.addEventListener(\"keydown\",r),o.on(\"destroy\",(()=>{document.removeEventListener(\"keydown\",r)})))}const Oe=\"speed\";function Ce(e){var t;const n=e.player,o=e.config.theme,i=e.$mask,r=null==(t=o.controller)?void 0:t.slideToSeek;q&&!n.options.isLive&&r&&\"none\"!=r&&n.once(\"loadedmetadata\",(()=>{let e,t=0,o=0,s=0,a=0;const l=n.$root.getBoundingClientRect();function c(e){if(0==t&&0==o)return;const i=e.changedTouches[0],r=i.clientX,s=i.clientY,c=r-t,d=o-s;if(Math.abs(c)<2&&Math.abs(d)<2)return;const u=function(e,t){return 180*Math.atan2(t,e)/Math.PI}(c,d);(u>=-45&&u<45||u>=135&&u<=180||u>=-180&&u<-135)&&(e.preventDefault(),a=60*c/l.width,n.emit(\"notice\",{text:we(ke(n.currentTime+a,0,n.duration))+\" / \"+we(n.duration),pos:\"top\"}))}function d(){0==t&&0==o||(\"long-touch\"==r&&s<1e3&&(e&&clearInterval(e),i.removeEventListener(\"touchmove\",c)),Math.abs(a)>=1&&n.seek(ke(n.currentTime+a,0,n.duration)),t=o=a=s=0)}\"always\"==r&&(i.addEventListener(\"touchstart\",(e=>{if(Te(n.$root,re))return;const i=e.changedTouches[0],r=i.clientX,s=i.clientY;t=r,o=s})),i.addEventListener(\"touchmove\",c),i.addEventListener(\"touchend\",d)),\"long-touch\"==r&&i.addEventListener(\"touchstart\",(r=>{if(Te(n.$root,re))return;const a=r.changedTouches[0],l=a.clientX,u=a.clientY;t=l,o=u,e=window.setInterval((()=>{s+=100,s>=1e3&&(clearInterval(e),n.emit(\"notice\",{text:\"slid left or right to seek\",pos:\"top\"}),i.addEventListener(\"touchmove\",c))}),100),i.addEventListener(\"touchend\",d,{once:!0})}))}))}const Me=$.css(t||(t=f([\"\\n  font-variant-numeric: tabular-nums;\\n  font-size: 0.875em;\\n\"]))),Fe=$.css(\"width:0.5em;height:0.5em;background-color:var(--primary-color);border-radius:50%;margin-right:0.5em\"),je=$.css(\"\\n    position: absolute;\\n    top: 10px;\\n    right: 50%;\\n    border-radius: 2px;\\n    box-sizing: border-box;\\n    transform: translate(50%, -100%);\\n    transition: opacity 0.2s ease, top 0.2s ease;\\n    font-size: 0.875em;\\n\"),Be=$.css(\"\\n    top: calc(100% - 10px);\\n    right: 50%;\\n    transform: translateX(50%);\\n\"),Re=$.css({position:\"relative\",display:\"flex\",[\"& .\"+je]:{visibility:\"hidden\",opacity:0,\"background-color\":\"var(--shadow-background-color)\"}}),He=$.css({\"&:hover\":{\"padding-top\":\"0.5em\",\"margin-top\":\"-0.5em\",[\"& .\"+je]:{visibility:\"visible\",opacity:1,top:0}},\"&[data-dropdown-pos=top]:hover\":{\"padding-bottom\":\"0.5em\",\"margin-bottom\":\"-0.5em\",[\"& .\"+je]:{top:\"100%\"}}}),qe=$.css({padding:\"0 0.5em\",\"min-width\":\"6em\",display:\"block\",height:\"2.4em\",\"line-height\":\"2.4em\",cursor:\"pointer\",\"text-align\":\"center\",\"word-break\":\"keep-all\",\"&:nth-last-child(1)\":{\"margin-bottom\":\"0px\"},\"& *\":{\"pointer-events\":\"none\"},\"&[aria-checked=true]\":{color:\"var(--primary-color)\"},\"&:hover\":{\"background-color\":\"rgba(255, 255, 255, 0.1)\"}}),Ie=$.cls(\"textIcon\"),De=$.css({display:\"flex\",\"align-items\":\"center\",[\"& > .\"+ue+\":last-child\"+(q?\", & >  .\"+ue+'[aria-label=\"Play\"], & >  .'+ue+'[aria-label=\"Pause\"]':\"\")]:{\"margin-right\":0}}),Ne=$.css({color:\"#fff\",height:\"2.375em\",display:\"flex\",\"box-sizing\":\"border-box\",\"justify-content\":\"space-between\",\"align-items\":\"center\",\"padding-bottom\":q?0:\"0.25em\",[\"& .\"+ue+\".\"+Ie]:{width:\"auto\",\"min-width\":\"2em\",\"font-size\":\"0.875em\",padding:\"0 4px\",\"border-radius\":\"2px\"},[\"& .\"+ue]:Object.assign({width:\"2em\",height:q?\"auto\":\"2em\",\"margin-right\":\"0.5em\",\"justify-content\":\"center\",\"align-items\":\"center\",display:\"inline-flex\",\"& > *\":{height:\"1.5em\",width:\"1.5em\",\"pointer-events\":\"none\",transition:\"transform .2s ease-in-out\"}},q?{\"&:active > *\":{transform:\"scale(.9)\"}}:{\"&:hover\":{\"background-color\":\"rgb(255 255 255 / .2)\"}})}),Ve=$.css({flex:1,height:\"100%\",\"padding-left\":\"0.5em\",\"> div\":{height:\"100%\",display:\"flex\",\"align-items\":\"center\"}}),_e=$.css(\"display: block;\"),Ue=$.css(\"min-width: 15.5em;\"),Xe=$.css(\"min-width: 10.5em;\"),We=$.css(\"\\n  display: none;\\n  width: 1.4em;\\n  height: 1.4em;\\n\"),Ye=$.css(\"\\n  width: 2em;\\n  height: 2em;\\n  margin: 0 -10px 0 -5px;\\n\"),Qe=$.css(\"\\n  width: 2em;\\n  height: 2em;\\n  transform: rotate(180deg);\\n  margin-left: -10px;\\n\"),Ke=$.css({position:\"absolute\",cursor:\"pointer\",top:\"0\",left:\"0\",right:\"0\",bottom:\"0\",\"background-color\":\"#ccc\",transition:\".3s\",\"border-radius\":\"34px\",\"&:before\":{position:\"absolute\",content:'\"\"',height:\"1em\",width:\"1em\",left:\"0.25em\",bottom:\"0.1875em\",\"background-color\":\"white\",transition:\".3s\",\"border-radius\":\"50%\"}}),Je=$.css(\"\\n  position: relative;\\n  width: 2.5em;\\n  height: 1.375em;\\n\"),Ge=$.css(\"\\n  white-space: nowrap;\\n  color: rgba(255, 255, 255, 0.7);\\n  font-size: 0.8em;\\n\"),Ze=$.css({height:\"2.4em\",cursor:\"pointer\",color:\"#fff\",\"justify-content\":\"space-between\",\"align-items\":\"center\",padding:\"0 0.75em\",\"line-height\":\"1\",display:\"flex\",overflow:\"hidden\",\"&:not([aria-label=slider]) > *\":{\"pointer-events\":\"none\"},\"&:hover\":{\"background-color\":\"rgba(255, 255, 255, 0.1)\"},\"&[aria-checked='true']\":{[\"& .\"+We]:{display:\"block\"},\"&[data-index]\":{\"background-color\":\"rgba(255, 255, 255, 0.1)\"},[\"& .\"+Ke]:{\"background-color\":\"var(--primary-color)\",\"&:before\":{transform:\"translateX(1em)\"}}}}),et=$.css({display:\"flex\",\"align-items\":\"center\",\"margin-right\":\"10px\",\"& > svg\":{width:\"1.7em\",height:\"1.7em\",\"margin-right\":\"0.5em\"}}),tt=$.css(\"\\n  display: flex;\\n  align-items: center;\\n  justify-content: flex-end;\\n\"),nt=$.css({width:\"100%\",display:\"flex\",\"align-items\":\"center\",\"border-bottom\":\"1px solid rgb(255 255 255 / 10%)\"}),ot=$.css({\"-webkit-appearance\":\"none\",width:\"90%\",height:\"0.4em\",outline:\"none\",\"border-radius\":\"34px\",background:\"rgb(204, 204, 204)\",margin:\"0\",cursor:\"pointer\",position:\"relative\",\"&::-webkit-slider-thumb\":{\"-webkit-appearance\":\"none\",appearance:\"none\",background:\"#fff\",height:\"1em\",width:\"1em\",\"border-radius\":\"50%\",border:\"none\"},\"&:hover::before\":{visibility:\"visible\"},\"::before\":{position:\"absolute\",left:\"-0.3em\",top:\"50%\",transform:\"translate(-100%, -50%)\",content:\"attr(value)\",color:\"rgba(255, 255, 255, 0.7)\",visibility:\"hidden\",\"font-size\":\"0.8em\"}}),it=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Ye;return\"<svg \"+(e?'class=\"'+e+'\"':\"\")+' viewBox=\"0 0 32 32\"><path d=\"m 12.59,20.34 4.58,-4.59 -4.58,-4.59 1.41,-1.41 6,6 -6,6 z\" fill=\"#fff\"></path></svg>'},rt=function(e){return'<div class=\"'+et+'\">\\n      '+(arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\")+\"\\n      <span>\"+e+\"</span>\\n    </div>\\n    <div class=\"+tt+'>\\n      <span role=\"label\" class='+Ge+\"></span>\\n      \"+it()+\"\\n    </div>\\n\"};function st(e){let t=e.type,n=e.key,o=e.name,i=e.icon,r=e.default,s=e.index,a=e.max,l=e.min,c=e.step,d=e.hasChildren,u=$.create(\"div.\"+Ze,{\"data-key\":n,role:\"option\"==t?\"menuitemradio\":\"menuitem\",\"aria-haspopup\":!!d&&\"menu\",\"aria-label\":t||\"menuitem\"});const h={$row:u,$label:void 0};switch(t){case\"switcher\":u.innerHTML=function(e){return'<div class=\"'+et+'\">\\n    '+(arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\")+\"\\n    <span>\"+e+\"</span>\\n  </div>\\n  <div class=\"+tt+\">\\n    <label class=\"+Je+\">\\n      <span class=\"+Ke+\"></span>\\n    </label>\\n  </div>\\n\"}(o,i),u.setAttribute(\"aria-checked\",r||!1);break;case\"selector\":u.innerHTML=rt(o,i),h.$label=u.querySelector('span[role=\"label\"]');break;case\"back\":u.innerHTML=(e=>'<div class=\"'+nt+'\">\\n      '+it(Qe)+\"\\n      <span>\"+e+\"</span>\\n    </div>\\n\")(o);break;case\"slider\":u.innerHTML=(e=>{let t=e.name,n=e.icon,o=void 0===n?\"\":n,i=e.max,r=void 0===i?1:i,s=e.min,a=void 0===s?0:s,l=e.value,c=void 0===l?0:l,d=e.step;return'<div class=\"'+et+'\">\\n    '+o+\"\\n    <span>\"+t+\"</span>\\n  </div>\\n  <div class=\"+tt+'>\\n   <input type=\"range\" min=\"'+a+'\" max=\"'+r+'\" step=\"'+(void 0===d?1:d)+'\" value=\"'+c+'\" class=\"'+ot+'\" />\\n  </div>'})({name:o,max:a,min:l,icon:i,value:r,step:c});break;case\"option\":u.innerHTML=function(e){return'<div class=\"'+et+'\">\\n      '+(arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\")+\"\\n      <span>\"+e+\"</span>\\n    </div>\\n    <svg class=\"+We+' viewBox=\"0 0 24 24\">\\n      <path d=\"M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z\" fill=\"#fff\"></path>\\n    </svg>\\n'}(o,i),u.setAttribute(\"aria-checked\",r||!1),\"number\"==typeof s&&u.setAttribute(\"data-index\",s.toString());break;default:u.innerHTML=d?rt(o,i):function(e){return'<div class=\"'+et+'\">\\n    '+(arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\")+\"\\n    <span>\"+e+\"</span>\\n  </div>\\n\"}(o,i)}return h}function at(e,t,n){let o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(!n||0==n.length)return;const i=o.key,r=o.target,s=o.parent,a=o.isSelectorOptionsPanel,l=o.name;let c={},d=i||\"root\";t[0]&&\"root\"==d?(c=t[0],d=t[0].key):(c.$ref=$.create(\"div.\"+(t[0]&&a?Xe:Ue),{\"data-key\":d,role:\"menu\"}),c.key=d,t.push(c)),c.parent=s;const u=\"root\"==c.key;if(!u){const e=st({name:l,type:\"back\"}).$row;e.addEventListener(\"click\",(()=>{var e;c.$ref.classList.remove(_e),null==(e=c.parent)||e.$ref.classList.add(_e)})),$.render(e,c.$ref)}for(let h=0;h<n.length;h++){const i=n[h],s=i.name,l=i.type,d=i.key,p=i.children,g=i.icon,m=i.default,v=i.onChange,f=i.max,b=i.min,y=i.step,k=i.value,x=st(Object.assign({name:s,type:a?\"option\":l,key:d,icon:g,default:m,max:f,min:b,step:y,hasChildren:Boolean(p)},!u&&a&&{index:h})),w=x.$row,E=x.$label;if($.render(w,c.$ref),$.render(c.$ref,r),p){const n=\"selector\"==l&&p.every((e=>!Boolean(e.type)||\"option\"==e.type)),o=at(e,t,p,{key:d||s,target:r,parent:c,isSelectorOptionsPanel:n,name:s,parenOnChange:v});if(w.addEventListener(\"click\",(()=>{c.$ref.classList.remove(_e),o.$ref.classList.add(_e)})),n){const t=p.find((e=>e.default));t&&(E.innerText=t.name),o.select=(t,n)=>{var i;if(-1==t)return void(null==(i=o.$ref.querySelector(\"[aria-checked=true]\"))||i.setAttribute(\"aria-checked\",\"false\"));const r=o.$ref.querySelectorAll(\"[aria-checked]\");if(\"true\"!=r.item(t).getAttribute(\"aria-checked\")){r.forEach((e=>e.setAttribute(\"aria-checked\",\"false\"))),r.item(t).setAttribute(\"aria-checked\",\"true\");const o=p[t];E.innerText=o.name,n&&(null==v||v(o,{index:t,player:e}))}},o.$ref.addEventListener(\"click\",(e=>{const t=e.target;t.hasAttribute(\"data-index\")&&(o.select(+t.getAttribute(\"data-index\"),!0),c.$ref.classList.add(_e),o.$ref.classList.remove(_e))}))}}else if(\"switcher\"==l)w.select=function(e){const t=\"true\"==this.getAttribute(\"aria-checked\");this.setAttribute(\"aria-checked\",\"\"+!t),e&&(null==v||v(!t))},w.addEventListener(\"click\",(()=>w.select(!0)));else if(\"slider\"==l){const e=w.querySelector(\"input\");e.oninput=function(e){e.target.setAttribute(\"value\",e.target.value)},e.onchange=function(e){null==v||v(e.target.value)}}else(\"option\"==l||null==l&&!a)&&w.addEventListener(\"click\",(()=>{var e;return null==(e=v||o.parenOnChange)?void 0:e(k)}))}return c}function lt(e){var t,n;const o=e.player,i=e.$root,r=e.config;if(!1===r.settings)return;const s=null==(t=r.theme.controller)?void 0:t.setting,a=r.settings||[],l=(null==(n=r.theme.controller)?void 0:n.header)&&(\"top\"==s||q&&\"auto\"==s),c=$.create(\"div.\"+(e=>$.css({\"z-index\":\"8\",\"max-height\":\"75%\",\"border-radius\":\"2px\",display:\"block\",position:\"absolute\",right:\"1em\",[e]:\"top\"==e?\"var(--control-bar-height)\":\"2.5em\",overflow:\"auto\",\"background-color\":\"var(--shadow-background-color)\",fill:\"#fff\",\"&::-webkit-scrollbar\":{width:\"2px\"},\"&::-webkit-scrollbar-thumb\":{background:\"var(--primary-color)\"},\"& > div\":{display:\"none\",\"font-size\":\"0.875em\"},[\"& > div.\"+_e]:{display:\"block\"}}))(l?\"top\":\"bottom\"),{\"aria-label\":\"Setting\"});let d=[],u=!1;const h={loop:{name:o.locales.get(\"Loop\"),type:\"switcher\",key:\"loop\",icon:ve.get(\"loop\"),default:o.isLoop,onChange:e=>o.setLoop(e)}};function p(e){var t,n;u&&(null==(n=null==(t=d[0])?void 0:t.$ref.querySelector(\"[data-key=\"+e+\"]\"))||n.remove(),d=d.filter((t=>t.key!==e||(t.$ref.remove(),t=null,!1))))}function g(t){var n;t.length<1||(u||(u=!0,$.render(c,i),function(){const t=$.create(\"button\",{class:ue+\" \"+ge,\"aria-label\":o.locales.get(\"Settings\"),\"data-tooltip-pos\":\"top\"==s?\"down\":\"\"},\"\"+ve.get(\"setting\"));t.addEventListener(\"click\",(e=>{e.stopPropagation(),m()}));const n=[r.pictureInPicture&&o.isPipEnabled,r.fullscreen].filter(Boolean).length;if(l){const n=e.$controllerBar.lastElementChild;n.insertBefore(t,n.children[n.children.length])}else{const o=e.$controllerBottom.lastElementChild;o.insertBefore(t,o.children[o.children.length-n])}}(),null==(n=e.keyboard)||n.register({c:m})),at(o,d,t,{target:c}))}function m(){function e(t){c.contains(t.target)||(o.$root.classList.remove(re),d.forEach((e=>e.$ref.classList.remove(_e))),document.removeEventListener(\"click\",e))}o.$root.classList.add(re),d[0].$ref.classList.add(_e),setTimeout((()=>{document.addEventListener(\"click\",e)}))}g(a.map((e=>\"string\"==typeof e?h[e]:e))),e.setting={register:function(e){g((Array.isArray(e)?e:[e]).map((e=>{const t=d.find((t=>t.key==e.key));if(!t)return e;p(t.key)})).filter(Boolean))},unregister:p,updateLabel:function(e,t){if(!u)return;const n=c.querySelector('[data-key=\"'+e+'\"] span[role=\"label\"]');n&&(n.innerText=t)},select:function(e,t){var n;let o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(u)if(\"number\"==typeof t)for(let i=0;i<d.length;i++){const n=d[i];if(n.key==e){n.select(t,o);break}}else null==(n=c.querySelector('[data-key=\"'+e+'\"][aria-checked]'))||n.select(o)}}}const ct=$.css({position:\"absolute\",top:0,left:0,right:0,\"z-index\":7,padding:\"0.5em 0.5em 0\",transition:\"transform 0.3s ease\",height:\"var(--control-bar-height)\",color:\"#fff\",\"&::before\":{position:\"absolute\",content:\"''\",width:\"100%\",display:\"block\",top:0,left:0,bottom:\"-1em\",\"z-index\":-1,transition:\"opacity 0.3s ease\",\"pointer-events\":\"none\",\"background-image\":\"linear-gradient(rgba(0, 0, 0, .3), transparent)\"},\"& > div:nth-child(1)\":{overflow:\"hidden\",flex:\"1 1 0\",\"margin-right\":\"0.5em\"},[\"& > div:nth-child(2) .\"+Re+\":last-child .\"+je]:{right:\"max(50%,3em)\"},[\"@global .\"+le+\" &\"]:{transform:\"translateY(calc(-100%))\",\"&::before\":{opacity:0}}}),dt=$.css(\"width: 2.5em;height: 2.5em;margin:0 -10px;transform: rotate(180deg);\"),ut=$.css(\"flex:1;font-size:1em;margin: 0 0.25em;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;\"),ht=$.css(n||(n=f([\"\\n  width: 2.65em;\\n  display: flex;\\n  height: 7.65em;\\n  box-sizing: border-box;\\n  flex-direction: column;\\n\"]))),pt=$.css(\"\\n  width: 100%;\\n  text-align: center;\\n  height: 28px;\\n  line-height: 28px;\\n  margin-bottom: 2px;\\n  font-size: 0.75em;\\n\"),gt=$.css(\"\\n  position: relative;\\n  display: flex;\\n  justify-content: center;\\n  flex: 1;\\n  cursor: pointer;\\n  padding: 5px 0 14px;\\n\"),mt=$.css(\"\\n  height: 100%;\\n  width: 4px;\\n  position: relative;\\n\"),vt=$.css(\"\\n  width: 4px;\\n  height: 100%;\\n  overflow: hidden;\\n  border-radius: 2px;\\n  background: rgba(255, 255, 255, 0.3);\\n\"),ft=$.css(\"\\n  height: 100%;\\n  background-color: var(--primary-color);\\n  transform-origin: 0 100%;\\n\"),bt=$.css(o||(o=f([\"\\n  position:absolute;\\n  bottom: 0;\\n  top: auto;\\n  left: -4px;\\n  width: 12px;\\n  height: 12px;\\n  border-radius: 50%;\\n  background-color: var(--primary-color);\\n  vertical-align: middle;\\n  pointer-events: none;\\n  \"]))),yt=(e,t)=>{const n=$.create(\"div.\"+ht,{},\"<div class=\"+pt+\">100</div>\\n\\n    <div class=\"+gt+\">\\n        <div class=\"+mt+\">\\n          <div class=\"+vt+\">\\n            <div class=\"+ft+\"></div>\\n          </div>\\n\\n          <div class=\"+bt+\"></div>\\n        <div>\\n      </div>\"),o=n.querySelector(\".\"+gt),i=n.querySelector(\".\"+bt),r=n.querySelector(\".\"+ft),s=n.querySelector(\".\"+pt),a=t=>{t.preventDefault(),e.setVolume(l((e=>{const t=o.getBoundingClientRect(),n=(t.bottom-(e.clientY||e.changedTouches[0].clientY))/t.height;return n>=1?1:n<=0?0:n})(t)))},l=e=>(s.innerText=\"\"+~~(100*e),r.style.transform=\"scaleY(\"+e+\")\",i.style.bottom=\"calc(\"+~~(100*e)+\"% - 6px)\",e);l(e.volume),e.on(\"volumechange\",(()=>{l(e.isMuted?0:e.volume)})),o.addEventListener(Pe.dragStart,(e=>{a(e),document.addEventListener(Pe.dragMove,a,{passive:!1}),document.addEventListener(Pe.dragEnd,(()=>{document.removeEventListener(Pe.dragMove,a)}),{once:!0})})),$.render(n,t)},kt=$.css(\"\\n  display: none;\\n  bottom: 15px;\\n  position: absolute;\\n  left: 50%;\\n  padding: 6px 8px;\\n  background-color: var(--shadow-background-color);\\n  color: #fff;\\n  border-radius: 2px;\\n  white-space: nowrap;\\n  word-break: nowrap;\\n  transform: translateX(-50%);\"),xt=$.css({position:\"absolute\",width:\"0.8em\",height:\"0.33em\",\"background-color\":\"var(--highlight-color)\",transform:\"translateX(-3px)\",transition:\"all 0.2s\",[\"&:hover > .\"+kt]:{display:\"block\"}});const wt=$.css(\"\\n  position: absolute;\\n  left: 0;\\n  bottom: 12px;\\n  pointer-events: none;\\n  transform: translateX(-50%);\\n  background-position-y: center;\\n  border-radius: 2px;\\n  display: none;\"),Et=$.css(\"\\n  position: absolute;\\n  left: 0;\\n  bottom: 12px;\\n  pointer-events: none;\\n  border-radius: 2px;\\n  display: none;\"),$t={width:160,height:90};const Lt=$.css({\"background-color\":\"hsla(0, 0%, 100%, 0.4)\"}),St=$.css({\"background-color\":\"var(--primary-color)\"}),Tt=$.css({\"pointer-events\":\"none\",position:\"relative\",\"& > *\":{display:\"block\",position:\"absolute\",width:\"1.4em\",height:\"1.4em\",top:\"0\",left:\"0\",margin:\"-0.535em 0 0 -0.7em\",transform:q?\"none\":\"scale(0)\",transition:\"transform 0.3s ease\",\"z-index\":\"1\"},\"& > *:not(svg)\":{width:\"1em\",height:\"1em\",margin:\"-0.335em 0 0 -0.5em\",\"border-radius\":\"50%\",\"background-color\":\"#fff\"}}),Pt=$.css({position:\"absolute\",left:\"0\",\"border-radius\":\"2px\",padding:\"6px 8px\",\"background-color\":\"var(--shadow-background-color)\",color:\"#fff\",\"z-index\":\"2\",\"pointer-events\":\"none\",transform:\"translateX(-50%)\",display:\"none\",bottom:\"15px\"}),zt=$.css(\"/* progressDragging */\"),At=$.css(Object.assign({position:\"relative\",\"box-sizing\":\"border-box\",padding:\"0.5em\",cursor:\"pointer\",width:\"100%\",\"font-size\":\"0.75em\",transition:\"padding 0.3s ease\",[\"&.\"+zt+\" .\"+Pt+\", &.\"+zt+\" .\"+wt+\", &.\"+zt+\" .\"+Et]:{display:\"block\"}},q?{[\"@global .\"+le+\" .\"+Tt+\" > *\"]:{transform:\"scale(0)\"}}:{[\"&.\"+zt+\" .\"+Tt+\" > *, &:hover .\"+Tt+\" > *\"]:{transform:\"scale(1)\"}})),Ot=$.css({position:\"relative\",height:\"0.33em\",width:\"100%\",\"background-color\":\"hsla(0, 0%, 100%, 0.2)\",[\"& .\"+Lt+\", & .\"+St]:{position:\"absolute\",left:\"0\",top:\"0\",bottom:\"0\",\"pointer-events\":\"none\"}}),Ct=(e,t)=>{var n;const o=e.player,i=e.config;if(o.options.isLive)return;const r=e.$progress=$.create(\"div.\"+At,{},\"<div class=\"+Ot+'>\\n      <div class=\"'+Pt+'\">00:00</div>\\n      <div class=\"'+Lt+'\" style=\"width:0%\"></div>\\n      <div class=\"'+St+'\" style=\"width:0%\"></div>\\n      <div class=\"'+Tt+'\" style=\"transform: translateX(0%);\">\\n        '+(ve.get(\"progressIndicator\")||\"<span />\")+\"\\n      </div>\\n  </div>\"),s=r.firstElementChild;(null==(n=i.thumbnails)?void 0:n.isVTT)?console.warn(\"vtt thumbnails support by @oplayer/pluins\"):function(e,t){const n=e.config.thumbnails,o=e.player;let i,r=!1;const s=$.render($.create(\"div.\"+wt),t);function a(e){if(r&&e){const n=[i.width/2,t.clientWidth],o=n[0],r=n[1],a=o/r,l=(r-o)/r;if(s.style.left=100*(e<a?a:e>l?l:e)+\"%\",Array.isArray(i.src)){const t=i.number*e,n=Math.ceil(t/(i.x*i.y))-1,o=t%i.number,r=Math.floor(o/i.x),a=Math.ceil(o%i.x);s.style.backgroundImage=\"url(\"+i.src[n]+\")\",s.style.backgroundPosition=-a+\"00% \"+-r+\"00%\"}else{const t=Math.floor(e*i.number);s.style.backgroundPositionX=\"-\"+t+\"00%\"}}else r=!0,s.style.width=i.width+\"px\",s.style.height=i.height+\"px\",Array.isArray(i.src)||(s.style.backgroundImage=\"url(\"+i.src+\")\")}function l(t){r=!1,i=Object.assign({},$t,t),i.y&&!Array.isArray(i.src)&&(i.src=[i.src]),e.progressHoverCallback.push(a)}(null==n?void 0:n.src)&&l(n),o.on(\"videosourcechange\",(()=>{r=!1,s.style.backgroundImage=\"none\",e.progressHoverCallback.splice(e.progressHoverCallback.findIndex((e=>e==a)),1)})),e.changThumbnails=l}(e,s),e.vttThumbnailsCls=Et,function(e,t){const n=e.player,o=e.config.highlight;let i=[];function r(e){const t=$.create(\"div.\"+xt,{},'<span class=\"'+kt+'\">'+e.text+\"</san>\");return t.style.left=e.left+\"%\",t}function s(e,n){i.forEach((e=>e.remove()));for(let o=0;o<e.length;o++){const s=e[o],a=r({left:s.time/n*100,text:s.text});i.push(a),$.render(a,t)}}function a(e){n.duration!==1/0&&n.duration>0?s(e,n.duration):n.once(\"loadedmetadata\",(function(){s(e,n.duration)}))}t.style.setProperty(\"--highlight-color\",(null==o?void 0:o.color)||\"#FFF\"),(null==o?void 0:o.source)&&a(o.source),n.on(\"videosourcechange\",(()=>{i.forEach((e=>e.remove())),i=[]})),e.changHighlightSource=function(e){a(e)}}(e,s);const a=r.querySelector(\".\"+Lt),l=r.querySelector(\".\"+St),c=r.querySelector(\".\"+Tt),d=r.querySelector(\".\"+Pt);let u=!1;const h=e=>{const t=r.getBoundingClientRect(),n=((e.clientX||e.changedTouches[0].clientX)-t.left)/t.width;return n>=1?1:n<=0?0:n},p=e=>{const t=h(e),n=100*t;return l.style.width=n+\"%\",c.style.transform=\"translateX(\"+n+\"%)\",d.innerText=we(o.duration*t),d.style.left=n+\"%\",t};r.addEventListener(Pe.dragStart,(t=>{u=!0,r.classList.add(zt);const n=p(t);function i(t){t.preventDefault();const n=p(t);e.progressHoverCallback.forEach((e=>e(n)))}e.progressHoverCallback.forEach((e=>e(n))),document.addEventListener(Pe.dragMove,i,{passive:!1}),document.addEventListener(Pe.dragEnd,(e=>{r.classList.remove(zt),u=!1,document.removeEventListener(Pe.dragMove,i),isNaN(o.duration)||o.seek(h(e)*o.duration)}),{once:!0})})),q||(r.addEventListener(\"mouseenter\",(()=>{u||e.progressHoverCallback.forEach((e=>e()))})),r.addEventListener(\"mousemove\",(t=>{if(u)return;r.classList.add(zt),t.target.classList.contains(xt)?d.style.display=\"none\":d.removeAttribute(\"style\");const n=h(t);d.innerText=we(o.duration*n),d.style.left=100*n+\"%\",e.progressHoverCallback.forEach((e=>e(n)))}),{passive:!1}),r.addEventListener(\"mouseleave\",(()=>{u||r.classList.remove(zt)}))),o.on([\"timeupdate\",\"seeking\"],(()=>{if(u)return;const e=o.currentTime/o.duration*100||0;l.style.width=e+\"%\",c.style.transform=\"translateX(\"+e+\"%)\"})),o.on(\"progress\",(()=>{const e=o.buffered.length?o.buffered.end(o.buffered.length-1)/o.duration*100:0;a.style.width=e+\"%\"})),o.on(\"videosourcechange\",(()=>{a.style.width=\"0%\",l.style.width=\"0%\",c.style.transform=\"translateX(0%)\"})),$.render(r,t)},Mt=$.css({position:\"absolute\",left:0,right:0,bottom:0,\"z-index\":7,padding:\"0 0.5em\",transition:\"transform 0.3s ease, padding 0.3s ease\",\"min-height\":\"var(--control-bar-height)\",\"&::before\":{position:\"absolute\",content:\"''\",width:\"100%\",display:\"block\",bottom:0,left:0,\"z-index\":-1,top:\"-1em\",transition:\"opacity 0.3s ease\",\"pointer-events\":\"none\",\"background-image\":\"linear-gradient(transparent, rgba(0, 0, 0, .3))\"},[\"@global .\"+le+\" &\"]:{\"pointer-events\":\"none\",transform:\"translateY(calc(100% - 0.55em))\",padding:0,\"&::before\":{opacity:0}},[\"@global .\"+le+\" .\"+At]:{\"padding-left\":0,\"padding-right\":0}}),Ft=(e,t)=>{var n,o,i;const r=e.player,s=e.config,a=$.render($.create(\"div.\"+Mt),t);(null==(n=s.theme.progress)?void 0:n.mini)&&!r.options.isLive||$.css({[\"@global .\"+le+\" .\"+Mt]:{transform:\"translateY(100%)\"}});const l=[r.locales.get(\"Play\"),r.locales.get(\"Pause\"),r.locales.get(\"Screenshot\"),r.locales.get(\"Picture in Picture\"),r.locales.get(r.isFullscreenEnabled?\"Fullscreen\":\"WebFullscreen\"),r.locales.get(\"Previous\"),r.locales.get(\"Next\")],c=l[0],d=l[1],u=l[2],h=l[3],p=l[4],g=l[5],m=l[6],v=ve.get(\"previous\")||\"\",f=ve.get(\"next\")||\"\",b=e.$controllerBottom=$.create(\"div.\"+Ne,{},'<div class=\"'+De+'\">\\n\\n    '+(v&&'<button class=\"'+ue+\" \"+ge+'\" aria-label=\"'+g+'\" >'+v+\"</button>\")+'\\n\\n      <button\\n        class=\"'+ue+\" \"+(r.isPlaying?he:pe)+\" \"+ge+'\"\\n        aria-label=\"'+c+'\"\\n      >\\n        '+ve.get(\"play\")+\"\\n        \"+ve.get(\"pause\")+\"\\n      </button>\\n\\n      \"+(f&&'<button class=\"'+ue+\" \"+ge+'\" aria-label=\"'+m+'\">'+f+\"</button>\")+\"\\n\\n      \"+(r.options.isLive?'<span class=\"'+Fe+'\"></span>':\"\")+\"\\n\\n      <span class=\"+Me+\">\"+(r.options.isLive||\"none\"==r.$video.preload?\"00:00\":\"00:00 / --:--\")+'</span>\\n    </div>\\n\\n    <div class=\"'+Ve+'\"></div>\\n\\n    <div class=\"'+De+'\">\\n      <div class=\"'+Re+\" \"+He+'\">\\n        <button class=\"'+ue+\" \"+(r.isMuted?he:pe)+'\" aria-label=\"Volume\">\\n            '+ve.get(\"volume\")[0]+\"\\n            \"+ve.get(\"volume\")[1]+\"\\n        </button>\\n        \"+(H?\"\":\"<div class=\"+je+\"></div>\")+\"\\n      </div>\\n\\n      \"+(s.screenshot?'<button class=\"'+ue+\" \"+ge+'\" aria-label=\"'+u+'\">\\n              '+ve.get(\"screenshot\")+\"\\n            </button>\":\"\")+\"\\n\\n      \"+(s.pictureInPicture&&r.isPipEnabled?'<button\\n              class=\"'+ue+\" \"+ge+\" \"+(r.isInPip?he:pe)+'\"\\n              aria-label=\"'+h+'\">\\n                '+ve.get(\"pip\")[0]+\"\\n                \"+ve.get(\"pip\")[1]+\"\\n            </button>\":\"\")+\"\\n\\n      \"+(s.fullscreen?'<button class=\"'+ue+\" \"+pe+\" \"+ge+'\" aria-label=\"'+p+'\">\\n                '+ve.get(\"fullscreen\")[0]+\"\\n                \"+ve.get(\"fullscreen\")[1]+\"\\n              </button>\":\"\")+\"\\n    </div>\");\"auto\"==(null==(o=s.theme.progress)?void 0:o.position)&&q||\"center\"==(null==(i=s.theme.progress)?void 0:i.position)?Ct(e,b.querySelector(\".\"+Ve)):Ct(e,a);const y=b.querySelector(\"button[aria-label=Volume]\");H||yt(r,y.nextElementSibling);const k=b.querySelector(\"button[aria-label=\"+c+\"]\"),x=b.querySelector(\".\"+Me),w=b.querySelector('button[aria-label=\"'+p+'\"]'),E=b.querySelector('button[aria-label=\"'+h+'\"]'),L=(e,t)=>{e.classList.add(t?he:pe),e.classList.remove(t?pe:he)};s.fullscreen&&r.on(\"fullscreenchange\",(()=>setTimeout((()=>{L(w,(e=>e.$root.classList.contains(ie)||e.$root.classList.contains(de))(r))})))),s.pictureInPicture&&r.on([\"enterpictureinpicture\",\"leavepictureinpicture\"],(()=>L(E,r.isInPip))),r.on([\"play\",\"pause\",\"videosourcechange\"],(()=>{k.setAttribute(\"aria-label\",r.isPlaying?d:c),L(k,r.isPlaying)})),r.on(\"volumechange\",(()=>L(y,r.isMuted))),r.on([\"durationchange\",\"timeupdate\",\"seeking\",\"seeked\"],(()=>{x.innerText=we(r.currentTime)+\" \"+(r.options.isLive?\"\":\"/ \"+we(r.duration))})),r.on(\"videosourcechange\",(()=>{x.innerText=r.options.isLive||\"none\"==r.$video.preload?\"00:00\":\"00:00 / --:--\"})),b.addEventListener(\"click\",(e=>{switch(e.target.getAttribute(\"aria-label\")){case c:case d:return r.togglePlay();case\"Volume\":if(q&&!H)return;r.isMuted?r.unmute():r.mute();break;case h:return r.togglePip();case p:return void((e=>e.$root.classList.contains(de))(r)||!r.isFullscreenEnabled?r.emit(\"fullscreenchange\",{isWeb:!0}):r.toggleFullScreen());case u:Ee(r);break;case m:r.emit(\"next\");break;case g:r.emit(\"previous\")}})),$.render(b,a)},jt=e=>{const t=e.player,n=e.config,o=e.$root,i=$.create(\"div\");((e,t)=>{var n,o,i;const r=e.player,s=null==(n=e.config.theme.controller)?void 0:n.header;if(!s)return;const a=null==s?void 0:s.back,l=a&&q,c=e.$controllerBar=$.create(\"div\",{class:ct+\" \"+Ne},'<div class=\"'+De+'\">\\n    '+(l?\"<span role='button' class=\\\"\"+dt+\" \"+(\"fullscreen\"==a?se:\"\")+'\">'+it(\"\")+\"</span>\":\"\")+\"\\n      <h2 class='\"+ut+\"'>\"+((null==(i=null==(o=r.options)?void 0:o.source)?void 0:i.title)||\"\")+'</h2>\\n    </div>\\n    <div class=\"'+De+'\"></div>'),d=c.querySelector(\".\"+ut);if(l){const e=d.previousElementSibling;e.addEventListener(\"click\",(e=>{r.isFullScreen&&r.exitFullscreen(),r.emit(\"backward\",e)})),\"fullscreen\"==a&&r.on(\"fullscreenchange\",(()=>{r.isFullScreen?e.classList.remove(se):e.classList.add(se)}))}r.on(\"videosourcechange\",(e=>{let t=e.payload;t.then||(d.innerText=t.title||\"\")})),r.on(\"sourcechangeerror\",(e=>{var t,n;let o=e.payload;(null==(t=o.source)?void 0:t.title)||(d.innerText=(null==(n=o.e)?void 0:n.message)||\"ERROR\")})),r.on(\"videosourcechanged\",(e=>{let t=e.payload;d.innerText=t.title||\"\"})),$.render(c,t)})(e,i),Ft(e,i);const r=n.theme.controller||{},s=r.display,a=r.displayBehavior;\"played\"==s&&(Le(i,se),t.once(\"play\",(()=>{Se(i,se)})));const l=()=>{var e;!t.isPlaying&&!q||Te(t.$root,le)||Te(t.$root,re)||Te(t.$root,ce)||t.$root.contains(document.activeElement)&&\"INPUT\"==(null==(e=document.activeElement)?void 0:e.tagName)||(Le(t.$root,le),t.$root.setAttribute(ae,\"true\"),t.emit(\"controlshidden\",!1))},c=$e(l,2e3),d=c.callee,u=c.clear,h=()=>{u(),Te(t.$root,le)&&(Se(t.$root,le),t.$root.setAttribute(ae,\"false\"),t.emit(\"controlsshown\",!0))};\"none\"!=a&&(t.on(\"play\",d),t.on([\"pause\",\"videosourcechange\"],h),t.on(\"destroy\",u)),q||(t.$root.addEventListener(\"mousemove\",(e=>{h(),i.contains(e.target)||d()})),\"delay\"==a&&t.$root.addEventListener(\"mouseleave\",d),\"hover\"==a&&t.$root.addEventListener(\"mouseleave\",l)),e.toggleController=function(){Te(i,se)?t.play():Te(t.$root,le)?h():l()},$.render(i,o)},Bt={opacity:0,\"pointer-events\":\"none\"},Rt=$.css(Object.assign({transition:\"opacity 100ms linear\",position:\"absolute\",top:0,bottom:0,left:0,right:0,margin:\"auto\",fill:\"#fff\",width:\"3em\",height:\"3em\",\"z-index\":\"7\",\"& > button\":{width:\"100%\",height:\"100%\",\"border-radius\":\"100%\",background:\"var(--primary-color)\",opacity:.9,padding:\"1em\",transition:\"transform .2s ease-in-out\",\"&:active\":{transform:\"scale(.85)\"},\"& > *\":{position:\"relative\",width:\"1.5em\",height:\"1.5em\",left:\"-0.2em\",top:\"-0.25em\"}},[\"@global .\"+ne+\" &\"]:Bt,[\"@global .\"+te+\" &\"]:Bt,[\"@global .\"+ce+\" &\"]:Bt},q&&{[\"@global .\"+le+\" &\"]:Bt})),Ht=(e,t)=>{const n=$.create(\"div.\"+Rt,{},'<button aria-label=\"Play\" class=\"'+ue+'\" type=\"button\">\\n      '+ve.get(\"play\")+\"\\n    </button>\");return $.render(n,t).addEventListener(\"click\",(()=>e.play())),n},qt=$.css(\"\\n  display: none;\\n  position: absolute;\\n  top: 0;\\n  bottom: 0;\\n  left: 0;\\n  right: 0;\\n  color: #fff;\\n  background: #000;\\n  z-index: 7;\\n  align-items: center;\\n  padding: 0 10px;\\n  word-break: break-all;\\n  justify-content: center;\\n  text-align: center;\\n\"),It=$.css(\"display: flex;\"),Dt={1:\"MEDIA_ERR_ABORTED\",2:\"MEDIA_ERR_NETWORK\",3:\"MEDIA_ERR_DECODE\",4:\"MEDIA_ERR_SRC_NOT_SUPPORTED\"},Nt=(e,t,n)=>{const o=$.render($.create(\"div.\"+qt,{\"aria-label\":\"Error Overlay\"}),t);function i(t){var n;let i=\"\";if(t instanceof Event){const e=null==(n=t.target)?void 0:n.error;if(!e||!e.message&&\"number\"!=typeof e.code)return;i=e.message||Dt[e.code]}else i=t.message;o.innerText=i||\"UNKNOWN_ERROR\",e.$root.classList.add(ce),Le(o,It)}return e.on([\"videosourcechange\",\"videoqualitychange\",\"loadedmetadata\"],(function(){Se(o,It),e.$root.classList.remove(ce),o.innerText=\"\"})),e.on(\"error\",(e=>(e=>{n.errorBuilder?n.errorBuilder(e,o,(e=>i(e))):i(e)})(e.payload))),i},Vt=$.css({position:\"absolute\",top:\"0\",bottom:\"0\",left:\"0\",right:\"0\",display:\"none\",\"align-items\":\"center\",\"justify-content\":\"center\",[\"@global .\"+te+\" &\"]:{display:\"flex\"}}),_t=$.css({position:\"relative\",overflow:\"hidden\",width:\"20%\",height:\"4px\",\"border-radius\":\"4px\",\"&::before,&::after\":{display:\"block\",content:\"''\",position:\"absolute\",height:\"100%\",width:\"100%\",\"background-color\":\"var(--primary-color)\",\"border-radius\":\"4px\"},\"&::before\":{opacity:\"0.4\"},\"&::after\":{animation:\"indeterminate 1.3s infinite linear\",\"transform-origin\":\"0% 50%\"},\"@keyframes indeterminate\":{\"0%\":{transform:\"translateX(0) scaleX(0)\"},\"10%\":{transform:\"translateX(0) scaleX(0.2)\"},\"40%\":{transform:\"translateX(0) scaleX(0.7)\"},\"60%\":{transform:\"translateX(60%) scaleX(0.4)\"},\"100%\":{transform:\"translateX(100%) scaleX(0.2)\"}}}),Ut=(e,t)=>{const n=$.create(\"div.\"+Vt,{\"aria-label\":\"Loading\"},\"\"+(ve.get(\"loadingIndicator\")||'<div class=\"'+_t+'\"></div>'));$.render(n,t)},Xt=$.css({width:\"100%\",height:\"100%\",position:\"absolute\",top:\"0\",left:\"0\",right:\"0\",bottom:\"0\",[\"@global .\"+re+\" &\"]:{\"z-index\":\"8\"}}),Wt=e=>{const t=\"true\"==e.getAttribute(\"aria-checked\");e.setAttribute(\"aria-checked\",\"\"+!t),((e,t)=>{var n=[],o=e.parentNode.children;for(let i=0,r=o.length;i<r;i++)o[i]!==e&&(null==t||t(o[i]),n.push(o[i]))})(e,(e=>e.setAttribute(\"aria-checked\",\"\"+t)))},Yt=$.css({position:\"absolute\",display:\"none\",top:\"0.625em\",left:\"0.625em\",right:\"0.625em\",\"z-index\":9,\"margin-top\":\"var(--control-bar-height)\",transition:\"margin 0.2s\",[\"@global .\"+le+\" &\"]:{\"margin-top\":0}}),Qt=$.css(\"\\n  -moz-user-select: all;\\n  -webkit-user-select: all;\\n  -ms-user-select: all;\\n  user-select: all;\\n  color: #fff;\\n  background-color: var(--shadow-background-color);\\n  border-radius: 2px;\\n  padding: 5px 10px;\\n  font-size: 0.875em;\\n\"),Kt=$.css(i||(i=f([\"\\n  text-align: center;\\n\"]))),Jt=$.css(r||(r=f([\"\\n  text-align: right;\\n\"]))),Gt=$.css(s||(s=f([\"\\n  bottom: 6em;\\n  top: initial;\\n\"]))),Zt={center:$.css(a||(a=f([\"\\n  top: 50%;\\n  text-align: center;\\n  transform: translateY(-50%);\\n\"]))),left:\"\",\"top-left\":\"\",top:Kt,\"top-center\":Kt,\"top-right\":Jt,right:Jt,bottom:Gt,\"left-bottom\":Gt},en=$.css(\"display:block;\");function tn(e){return URL.createObjectURL(new Blob([e],{type:\"text/vtt\"}))}const nn=\"Subtitle\";class on{constructor(e,t,n,o){this.player=e,this.setting=t,this.el=n,this.isShow=!1,this.update=()=>{let e=\"\";const t=this.$track.track.activeCues;if(null==t?void 0:t.length)for(let n=0;n<t.length;n++){const o=t[n];o&&(e+=o.text.replace(/\\\\h/g,\"&nbsp;\").split(/\\r?\\n/).map((e=>\"<p><span>\"+e+\"</span></p>\")).join(\"\"))}this.$dom.innerHTML=e},window.TextDecoder?(this.options=Object.assign({source:[]},o),this.createContainer(),this.changeSource(this.options.source),this.player.on([\"destroy\",\"videosourcechange\"],this.destroy.bind(this)),this.player.on(\"videoqualitychang\",(()=>{this.isShow&&this.hide()})),this.player.on(\"videoqualitychanged\",this.fetchSubtitle.bind(this))):e.emit(\"notice\",{text:e.locales.get(\"TextDecoder not supported\")})}changeSource(e){var t;null==(t=this.setting)||t.unregister(nn),this.processDefault(e),this.loadSetting(),this.currentSubtitle&&(this.player.isSourceChanging||isNaN(this.player.duration)||this.player.duration<1?this.player.once(\"loadedmetadata\",this.fetchSubtitle.bind(this)):this.fetchSubtitle())}createContainer(){const e=this.el,t=this.options,n=t.color,o=t.shadow,i=t.fontSize,r=t.bottom,s=t.fontFamily,a=t.background,l=t.marginBottom;this.$dom=$.create(\"div.\"+$.css(Object.assign({left:\"2%\",right:\"2%\",\"text-align\":\"center\",\"pointer-events\":\"none\",position:\"absolute\",\"line-height\":\"1.5\",\"font-family\":s||\"inherit\",color:n||\"#fff\",\"text-shadow\":o||\"1px 0 1px #000, 0 1px 1px #000, -1px 0 1px #000, 0 -1px 1px #000, 1px 1px 1px #000, -1px -1px 1px #000, 1px -1px 1px #000, -1px 1px 1px #000\",bottom:r||\"2%\",\"font-size\":(i||(q?16:20))/16+\"em\",\"& > p\":{margin:0,\"& span\":{\"white-space\":\"pre-wrap\",background:a?\"rgba(8, 8, 8, 0.75)\":\"inherit\",padding:\"0 0.25em\"}}},!q&&{\"margin-bottom\":l||\"2.2em\",transition:\"margin 0.3s\",[\"@global .\"+le+\" &\"]:{\"margin-bottom\":0}})),{\"aria-label\":\"Subtitle\"}),$.render(this.$dom,e)}createTrack(){const e=this.player.$video;if(this.$track=$.render($.create(\"track\",{default:!0,kind:\"metadata\",id:\"primary\"}),e),!this.player._requestFullscreen){const t=(this.$iosTrack=$.create(\"track\",{default:!1,kind:\"captions\",id:\"__Orz__\"})).track;$.render(this.$iosTrack,e),t.mode=\"hidden\",this.player.on(\"fullscreenchange\",(e=>{e.payload.isWeb||setTimeout((()=>{const e=this.player.isFullScreen&&this.isShow;t.mode=e?\"showing\":\"hidden\"}))}))}}changeOffset(e){e&&[this.$track,this.$iosTrack].forEach((t=>{if(!t)return;const n=t.track.cues,o=this.player.duration;Array.from(n||[]).forEach((t=>{t.startTime=ke(t.startTime+e,0,o),t.endTime=ke(t.endTime+e,0,o)}))}))}processDefault(e){this.options.source=e,this.currentSubtitle=e.find((e=>e.default))}show(){this.isShow=!0,this.$track.addEventListener(\"cuechange\",this.update)}hide(){const e=this.$track,t=this.$dom;this.isShow=!1,t.innerHTML=\"\",e.removeEventListener(\"cuechange\",this.update)}fetchSubtitle(){var e;if(!this.currentSubtitle)return;this.$track||this.createTrack();const t=this.currentSubtitle,n=this.player,o=this.$track,i=this.$iosTrack,r=this.options,s=t.src,a=t.encoding,l=t.type,c=void 0===l?\"auto\":l,d=t.offset;return Promise.resolve(null==(e=r.onChange)?void 0:e.call(r,t)).then((e=>null==e?fetch(s).then((e=>e.arrayBuffer())).then((e=>new TextDecoder(a).decode(e))):e)).then((e=>{var t,n;if(!e)throw new Error(\"Empty Subtitle\");switch(\"auto\"==c?null==(t=/srt|ass|vtt(#|\\?|$)/i.exec(s))?void 0:t[0]:c){case\"srt\":return tn(\"WEBVTT \\r\\n\\r\\n\".concat((n=e,n.replace(/(\\d\\d:\\d\\d:\\d\\d)[,.](\\d+)/g,((e,t,n)=>{let o=n.slice(0,3);return 1===n.length&&(o=n+\"00\"),2===n.length&&(o=n+\"0\"),t+\",\"+o}))).replace(/\\{\\\\([ibu])\\}/g,\"</$1>\").replace(/\\{\\\\([ibu])1\\}/g,\"<$1>\").replace(/\\{([ibu])\\}/g,\"<$1>\").replace(/\\{\\/([ibu])\\}/g,\"</$1>\").replace(/(\\d\\d:\\d\\d:\\d\\d),(\\d\\d\\d)/g,\"$1.$2\").replace(/{[\\s\\S]*?}/g,\"\").concat(\"\\r\\n\\r\\n\")));case\"ass\":return tn(function(e){const t=new RegExp(\"Dialogue:\\\\s\\\\d+,(\\\\d+:\\\\d\\\\d:\\\\d\\\\d.\\\\d\\\\d),(\\\\d+:\\\\d\\\\d:\\\\d\\\\d.\\\\d\\\\d),([^,]*),([^,]*),(?:[^,]*,){4}(.*)$\",\"i\");return\"WEBVTT\\r\\n\\r\\n\"+e.split(/\\r?\\n/).map((e=>{const n=e.match(t);return n&&n[1]&&n[2]&&n[5]?{start:n[1],end:n[2],text:(o=n[5].replace(/{[\\s\\S]*?}/g,\"\").replace(/\\\\N/g,\"\\r\\n\").replace(/\\\\n/g,\" \").replace(/\\\\h/g,\"&nbsp;\"),o.replace(/[&<>'\"]/g,(e=>({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",\"'\":\"&#39;\",'\"':\"&quot;\"}[e]||e))))}:null;var o})).filter((e=>null!=e)).map(((e,t)=>t+1+\"\\r\\n0\"+e.start+\"0 --\\x3e 0\"+e.end+\"0\\r\\n\"+e.text)).join(\"\\r\\n\\r\\n\")}(e));case\"vtt\":return tn(e);default:return s}})).then((e=>{o.src&&URL.revokeObjectURL(o.src),(null==i?void 0:i.src)&&URL.revokeObjectURL(i.src),this.$track.addEventListener(\"load\",(()=>{this.changeOffset(d),this.show()}),{once:!0}),o.src=e,i&&(i.src=e)})).catch((e=>{n.emit(\"notice\",{text:\"Subtitle\"+e.message})}))}loadSetting(){if(!this.setting)return;const e=this.options.source;e.length&&this.setting.register({name:this.player.locales.get(\"Subtitle\"),type:\"selector\",icon:ve.get(\"subtitle\"),key:nn,onChange:e=>{var t;let n=e.value;n?n.src==(null==(t=this.currentSubtitle)?void 0:t.src)?this.show():(this.currentSubtitle=n,this.$dom.innerHTML=\"\",this.fetchSubtitle()):this.hide()},children:[{name:this.player.locales.get(\"OFF\"),default:!this.currentSubtitle}].concat(null==e?void 0:e.map((e=>{var t;return{name:e.name,default:(null==(t=this.currentSubtitle)?void 0:t.src)==e.src,value:e}})))})}destroy(){var e;const t=this.$dom,n=this.$track,o=this.$iosTrack;null==n||n.removeEventListener(\"cuechange\",this.update),null==(e=this.setting)||e.unregister(nn),(null==n?void 0:n.src)&&URL.revokeObjectURL(n.src),(null==o?void 0:o.src)&&URL.revokeObjectURL(o.src),null==n||n.remove(),null==o||o.remove(),t.innerHTML=\"\",this.isShow=!1,this.$track=this.$iosTrack=void 0}}const rn={theme:{primaryColor:\"#6668ab\",progress:{position:\"top\",mini:!0},controller:{setting:\"auto\",display:\"always\",coverButton:!0,displayBehavior:\"hover\"}},fullscreen:!0,autoFocus:!0,forceLandscapeOnFullscreen:!0,settings:[\"loop\"],keyboard:{focused:!0},speeds:[\"2.0\",\"1.5\",\"1.25\",\"1.0\",\"0.75\",\"0.5\"]};class sn{constructor(e){var t;this.key=\"ui\",this.version=\"1.3.4-beta.2\",this.name=\"oplayer-theme-ui\",this.keyboard={},this.setting={},this.menu={},this.progressHoverCallback=[],this.config=E({},rn,e),(null==(t=this.config.keyboard)?void 0:t.global)&&(this.config.keyboard.focused=!1)}apply(e){var t;const n=this.config;this.player=e;const o=this.$root=$.create(\"div.\"+(e=>{var t;return $.css(Object.assign({\"--primary-color\":\"\"+e.theme.primaryColor,\"--shadow-background-color\":\"rgba(28 ,28 ,28 , .9)\",\"--control-bar-height\":(null==(t=e.theme.controller)?void 0:t.display)?\"2.5em\":0,position:\"absolute\",top:\"0\",left:\"0\",width:\"100%\",height:\"100%\",\"line-height\":1,\"font-size\":q?\"16px\":\"18px\",\"&, & > *\":{\"-webkit-tap-highlight-color\":\"rgba(0, 0, 0, 0)\"},\"& [hidden]\":{display:\"none\"}},{[\"@global .\"+de+\" &\"]:{\"font-size\":q?\"18px\":\"22px\"},[\"@global .\"+ie+\" &\"]:{\"font-size\":q?\"18px\":\"22px\"}}))})(n));return((e,t)=>{const n=t.theme.watermark;if(!n)return;const o=e.$watermark=document.createElement(\"img\");o.setAttribute(\"alt\",\"watermark\");for(const i in n.style)o.style[i]=n.style[i];for(const i in n.attrs)o.setAttribute(i,n.attrs[i]);o.src=n.src,e.$root.appendChild(o)})(this,n),e.isNativeUI?(be(e),Ht(e,o),Ut(0,o),void $.render(o,e.$root)):(this.icons=ve.setupIcons(n.icons),ye(e,n),Ae(this),Nt(e,o,n),(e=>{const t=e.player,n=e.$root,o=$.create(\"div.\"+Yt,{\"aria-label\":\"Notice\"},'<span class=\"'+Qt+'\"></span>'),i=o.querySelector(\".\"+Qt),r=$e((()=>Se(o,en)),2e3).callee;function s(e,t){i.innerHTML=e,o.className=Yt+\" \"+en+\" \"+Zt[t||\"left\"],r()}t.on(\"notice\",(e=>{let t=e.payload;return s(t.text,t.pos)})),e.notice=s,$.render(o,n)})(this),Ut(0,o),(null==(t=n.theme.controller)?void 0:t.coverButton)&&(this.$coverButton=Ht(e,o)),jt(this),(e=>{const t=e.player,n=e.$root,o=e.$mask=$.create(\"div.\"+Xt);let i,r=0;o.addEventListener(\"click\",(()=>{Te(t.$root,re)||(q?e.toggleController():(0==r&&t.togglePlay(),i&&clearTimeout(i),i=window.setTimeout((()=>{2==r&&(t.togglePlay(),t.toggleFullScreen()),r=0}),200)),r+=1)})),$.render(o,n)})(this),lt(this),(e=>{var t;const n=e.config.menu,o=[],i=null==(t=e.$controllerBar)?void 0:t.lastElementChild,r=e.$controllerBottom.lastElementChild,s=[i,r].filter(Boolean);function a(t){var n,i;const r=t.target,s=r.getAttribute(\"aria-label\"),a=o.find((e=>e.name==s));a&&\"true\"!=r.getAttribute(\"aria-checked\")&&(\"SPAN\"==r.tagName.toUpperCase()?(Wt(r),null==(n=a.onChange)||n.call(a,a.children[+r.getAttribute(\"data-index\")],r.parentElement.previousElementSibling,e.player)):\"BUTTON\"==r.tagName.toUpperCase()&&(null==(i=a.onClick)||i.call(a,r,e.player)))}function l(e){const t=o.find((t=>t.name==e.name));t&&c(t.name);const n=e.name,a=e.icon,l=e.children,d=\"top\"==e.position&&2==s.length;let u=\"\";const h='\\n    <button\\n      aria-label=\"'+n+'\"\\n      '+(d?'data-tooltip-pos=\"down\"':\"\")+'\\n      class=\"'+ue+\" \"+(a?\"\":Ie)+\" \"+(e.children?\"\":ge)+'\"\\n      type=\"button\"\\n    >'+(a||n)+\"</button>\";u=e.children?'\\n      <div class=\"'+Re+\" \"+He+'\" data-dropdown-pos=\"'+e.position+'\" aria-label=\"'+n+'\">\\n        '+h+\"\\n        <div class='\"+je+\" \"+(d?Be:\"\")+\"' role='menu'>\\n          \"+l.map(((e,t)=>'<span\\n                  role=\"menuitemradio\"\\n                  aria-haspopup=\"false\"\\n                  aria-label=\"'+n+'\"\\n                  class=\"'+qe+'\"\\n                  aria-checked=\"'+Boolean(e.default)+'\"\\n                  data-index=\"'+t+'\"\\n                >'+e.name+\"</span>\")).join(\"\")+\"\\n          </div>\\n      </div>\":h,d?i.insertAdjacentHTML(\"afterbegin\",u):r.insertAdjacentHTML(\"afterbegin\",u),o.push(e)}function c(e){s.forEach((t=>{var n,o;null==(n=t.querySelector(\"button[aria-label='\"+e+\"']\"))||n.remove(),null==(o=t.querySelector(\"div[aria-label='\"+e+\"]'\"))||o.remove()}))}s.forEach((e=>{e.addEventListener(\"click\",a)})),n&&n.forEach(l),e.menu={register:function(e){(Array.isArray(e)?e:[e]).forEach(l)},unregister:c,select:function(e,t){let n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];s.forEach((o=>{const i=o.querySelector(\".\"+je+\" > span[aria-label='\"+e+\"']:nth-child(\"+(t+1)+\")\");i&&(Wt(i),n&&i.click())}))}}})(this),function(e){const t=e.player,n=e.$root,o=e.config.subtitle,i=e.setting;e.subtitle=new on(t,i,n,o)}(this),function(e){const t=e.player,n=e.config.speeds,o=e.setting;(null==n?void 0:n.length)&&o&&(o.register({key:Oe,type:\"selector\",name:t.locales.get(\"Speed\"),icon:ve.get(\"playbackRate\"),children:n.map((e=>({name:1==+e?t.locales.get(\"Normal\"):e+\"x\",value:+e,default:t.playbackRate==+e}))),onChange:e=>{let n=e.value;return t.setPlaybackRate(n)}}),t.on(\"ratechange\",(()=>{const e=t.playbackRate,i=n.findIndex((t=>+t==e));-1==i?o.updateLabel(Oe,e+\"x\"):o.select(Oe,i,!1)})))}(this),Ce(this),function(e,t){t.forceLandscapeOnFullscreen&&!H&&q&&e.on(\"fullscreenchange\",(t=>{var n,o,i,r;!t.payload.isWeb&&e._requestFullscreen&&(e.isFullScreen?null==(o=null==(n=globalThis.screen.orientation)?void 0:n.lock)||o.call(n,\"landscape\"):null==(r=null==(i=globalThis.screen.orientation)?void 0:i.unlock)||r.call(i))}))}(e,n),$.render(o,e.$root),this)}destroy(){}}return globalThis.window&&(globalThis.window.OUI=function(e){return new sn(e)}),Object.assign(Z,ee),Z}));\n"
  },
  {
    "path": "patches/@oplayer-torrent-npm-1.2.25-beta.2-6efddccea2.patch",
    "content": "diff --git a/dist/index.es.js b/dist/index.es.js\nindex 8f1ac84be65e4dde278503ec9a04e15c7c6ad715..6a428ec3d6563c54ad687645039d76b128cec353 100644\n--- a/dist/index.es.js\n+++ b/dist/index.es.js\n@@ -23,7 +23,7 @@ const _TorrentPlugin = class _TorrentPlugin {\n     if (!matcher(source))\n       return false;\n     if (!_TorrentPlugin.library) {\n-      _TorrentPlugin.library = globalThis.WebTorrent || (library ? await loadSDK(library, \"WebTorrent\") : (await import(\"webtorrent/webtorrent.min.js\")).default);\n+      _TorrentPlugin.library = globalThis.WebTorrent || (typeof library === \"string\" ? await loadSDK(library, \"WebTorrent\") : library?.default) || {};\n     }\n     const webtorrent = _TorrentPlugin.library;\n     if (!webtorrent.WEBRTC_SUPPORT)\ndiff --git a/dist/index.min.js b/dist/index.min.js\nindex 88c45ee23559bb75d516bf4937a94eb34a97b490..e50b68277076e64dafc42ded917fd78ca528715e 100644\n--- a/dist/index.min.js\n+++ b/dist/index.min.js\n@@ -5,4 +5,4 @@\n  * author: shiyiya\n  * homepage: https://github.com/shiyiya/oplayer\n  */\n-!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t(require(\"@oplayer/core\")):\"function\"==typeof define&&define.amd?define([\"@oplayer/core\"],t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).OTorrent=t(e.OPlayer)}(this,(function(e){\"use strict\";const t=class t{constructor(e){this.options=e,this.key=\"torrent\",this.name=\"oplayer-plugin-torrent\",this.version=\"1.2.25-beta.2\"}apply(e){return this.player=e,this}async load(n,r){let o=n.$video;const i=this.options,a=i.config,s=void 0===a?{}:a,l=i.matcher,c=void 0===l?t.defaultMatcher:l,d=i.library;if(!c(r))return!1;t.library||(t.library=globalThis.WebTorrent||(d?await e.loadSDK(d,\"WebTorrent\"):(await import(\"webtorrent/webtorrent.min.js\")).default));const h=t.library;if(!h.WEBRTC_SUPPORT)return!1;const u=this.instance=new h(s),p=[];return u.add(r.src,(e=>{var t;if(e.files.forEach((e=>{e.name.endsWith(\".mp4\")?p.push(e):e.name.startsWith(\"poster\")&&e.getBlobURL(((e,t)=>{!e&&t&&(o.poster=t)}))})),!p.length)throw new Error(\"media not found\");this.player.on(\"loadedmetadata\",(e=>{this.instance&&setTimeout((()=>{this.player.emit(\"canplay\",e)}))})),p[0].renderTo(o,{controls:!1}),null==(t=this.player.context.ui)||t.menu.register({name:\"Torrent\",position:\"top\",children:p.map(((e,t)=>({name:e.name,default:0==t,value:e}))),onChange(e,t){let n=e.value,r=e.name;t.innerText=r,n.renderTo(o,{controls:!1})}})})),this}async unload(){this.instance&&await this.instance.destroy()}async destroy(){await this.unload()}};t.defaultMatcher=e=>/magnet:?[^\\\"]+/.test(e.src)||/.*\\.torrent/.test(e.src);let n=t;return function(){return new n(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{})}}));\n+!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t(require(\"@oplayer/core\")):\"function\"==typeof define&&define.amd?define([\"@oplayer/core\"],t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).OTorrent=t(e.OPlayer)}(this,(function(e){\"use strict\";const t=class t{constructor(e){this.options=e,this.key=\"torrent\",this.name=\"oplayer-plugin-torrent\",this.version=\"1.2.25-beta.2\"}apply(e){return this.player=e,this}async load(n,r){let o=n.$video;const i=this.options,a=i.config,s=void 0===a?{}:a,l=i.matcher,c=void 0===l?t.defaultMatcher:l,d=i.library;if(!c(r))return!1;t.library||(t.library=globalThis.WebTorrent||((typeof d)===\"string\"?await e.loadSDK(d,\"WebTorrent\"):d?.default)||{});const h=t.library;if(!h.WEBRTC_SUPPORT)return!1;const u=this.instance=new h(s),p=[];return u.add(r.src,(e=>{var t;if(e.files.forEach((e=>{e.name.endsWith(\".mp4\")?p.push(e):e.name.startsWith(\"poster\")&&e.getBlobURL(((e,t)=>{!e&&t&&(o.poster=t)}))})),!p.length)throw new Error(\"media not found\");this.player.on(\"loadedmetadata\",(e=>{this.instance&&setTimeout((()=>{this.player.emit(\"canplay\",e)}))})),p[0].renderTo(o,{controls:!1}),null==(t=this.player.context.ui)||t.menu.register({name:\"Torrent\",position:\"top\",children:p.map(((e,t)=>({name:e.name,default:0==t,value:e}))),onChange(e,t){let n=e.value,r=e.name;t.innerText=r,n.renderTo(o,{controls:!1})}})})),this}async unload(){this.instance&&await this.instance.destroy()}async destroy(){await this.unload()}};t.defaultMatcher=e=>/magnet:?[^\\\"]+/.test(e.src)||/.*\\.torrent/.test(e.src);let n=t;return function(){return new n(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{})}}));\ndiff --git a/src/index.ts b/src/index.ts\nindex 39d377f975bb03ffc0ee5662cbd3984cd537149d..050d2f7445b725b27675bcf72337bc98cb9ffa57 100644\n--- a/src/index.ts\n+++ b/src/index.ts\n@@ -40,9 +40,10 @@ class TorrentPlugin implements PlayerPlugin {\n     if (!TorrentPlugin.library) {\n       TorrentPlugin.library =\n         (globalThis as any).WebTorrent ||\n-        (library\n+        (typeof library === 'string'\n           ? await loadSDK(library, 'WebTorrent')\n-          : (await import('webtorrent/webtorrent.min.js')).default)\n+          : library?.default)\n+        || {}\n     }\n \n     const webtorrent = TorrentPlugin.library\n"
  },
  {
    "path": "patches/artplayer@5.4.0.patch",
    "content": "diff --git a/dist/artplayer.js b/dist/artplayer.js\nindex 623b028e09a2c1c7cc53126f30edf038b9cb6764..6d39060964d47c87937538842ae86ebd3942dd28 100644\n--- a/dist/artplayer.js\n+++ b/dist/artplayer.js\n@@ -4,4 +4,4 @@\n  * (c) 2017-2026 Harvey Zhao\n  * Released under the MIT License.\n  */\n-!function(t,e){\"object\"===typeof exports&&\"undefined\"!==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?(t.Artplayer=e(),define(function(){return t.Artplayer})):(t=\"undefined\"!==typeof globalThis?globalThis:t||self).Artplayer=e()}(this,function(){\"use strict\";function t(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,\"default\")?t.default:t}var e,r={exports:{}};var a=(e||(e=1,r.exports=function(){function t(e){return(t=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t})(e)}var e=Object.prototype.toString,r=function(r){if(void 0===r)return\"undefined\";if(null===r)return\"null\";var o=t(r);if(\"boolean\"===o)return\"boolean\";if(\"string\"===o)return\"string\";if(\"number\"===o)return\"number\";if(\"symbol\"===o)return\"symbol\";if(\"function\"===o)return\"GeneratorFunction\"===a(r)?\"generatorfunction\":\"function\";if(function(t){return Array.isArray?Array.isArray(t):t instanceof Array}(r))return\"array\";if(function(t){return!(!t.constructor||\"function\"!=typeof t.constructor.isBuffer)&&t.constructor.isBuffer(t)}(r))return\"buffer\";if(function(t){try{if(\"number\"==typeof t.length&&\"function\"==typeof t.callee)return!0}catch(e){if(-1!==e.message.indexOf(\"callee\"))return!0}return!1}(r))return\"arguments\";if(function(t){return t instanceof Date||\"function\"==typeof t.toDateString&&\"function\"==typeof t.getDate&&\"function\"==typeof t.setDate}(r))return\"date\";if(function(t){return t instanceof Error||\"string\"==typeof t.message&&t.constructor&&\"number\"==typeof t.constructor.stackTraceLimit}(r))return\"error\";if(function(t){return t instanceof RegExp||\"string\"==typeof t.flags&&\"boolean\"==typeof t.ignoreCase&&\"boolean\"==typeof t.multiline&&\"boolean\"==typeof t.global}(r))return\"regexp\";switch(a(r)){case\"Symbol\":return\"symbol\";case\"Promise\":return\"promise\";case\"WeakMap\":return\"weakmap\";case\"WeakSet\":return\"weakset\";case\"Map\":return\"map\";case\"Set\":return\"set\";case\"Int8Array\":return\"int8array\";case\"Uint8Array\":return\"uint8array\";case\"Uint8ClampedArray\":return\"uint8clampedarray\";case\"Int16Array\":return\"int16array\";case\"Uint16Array\":return\"uint16array\";case\"Int32Array\":return\"int32array\";case\"Uint32Array\":return\"uint32array\";case\"Float32Array\":return\"float32array\";case\"Float64Array\":return\"float64array\"}if(function(t){return\"function\"==typeof t.throw&&\"function\"==typeof t.return&&\"function\"==typeof t.next}(r))return\"generator\";switch(o=e.call(r)){case\"[object Object]\":return\"object\";case\"[object Map Iterator]\":return\"mapiterator\";case\"[object Set Iterator]\":return\"setiterator\";case\"[object String Iterator]\":return\"stringiterator\";case\"[object Array Iterator]\":return\"arrayiterator\"}return o.slice(8,-1).toLowerCase().replace(/\\s/g,\"\")};function a(t){return t.constructor?t.constructor.name:null}function o(t,e){var a=2<arguments.length&&void 0!==arguments[2]?arguments[2]:[\"option\"];return n(t,e,a),i(t,e,a),function(t,e,a){var s=r(e),l=r(t);if(\"object\"===s){if(\"object\"!==l)throw new Error(\"[Type Error]: '\".concat(a.join(\".\"),\"' require 'object' type, but got '\").concat(l,\"'\"));Object.keys(e).forEach(function(r){var s=t[r],l=e[r],c=a.slice();c.push(r),n(s,l,c),i(s,l,c),o(s,l,c)})}if(\"array\"===s){if(\"array\"!==l)throw new Error(\"[Type Error]: '\".concat(a.join(\".\"),\"' require 'array' type, but got '\").concat(l,\"'\"));t.forEach(function(r,s){var l=t[s],c=e[s]||e[0],d=a.slice();d.push(s),n(l,c,d),i(l,c,d),o(l,c,d)})}}(t,e,a),t}function n(t,e,a){if(\"string\"===r(e)){var o=r(t);if(\"?\"===e[0]&&(e=e.slice(1)+\"|undefined\"),!(-1<e.indexOf(\"|\")?e.split(\"|\").map(function(t){return t.toLowerCase().trim()}).filter(Boolean).some(function(t){return o===t}):e.toLowerCase().trim()===o))throw new Error(\"[Type Error]: '\".concat(a.join(\".\"),\"' require '\").concat(e,\"' type, but got '\").concat(o,\"'\"))}}function i(t,e,a){if(\"function\"===r(e)){var o=e(t,r(t),a);if(!0!==o){var n=r(o);throw\"string\"===n?new Error(o):\"error\"===n?o:new Error(\"[Validator Error]: The scheme for '\".concat(a.join(\".\"),\"' validator require return true, but got '\").concat(o,\"'\"))}}}return o.kindOf=r,o}()),r.exports);const o=t(a),n=\"5.4.0\",i={properties:[\"audioTracks\",\"autoplay\",\"buffered\",\"controller\",\"controls\",\"crossOrigin\",\"currentSrc\",\"currentTime\",\"defaultMuted\",\"defaultPlaybackRate\",\"duration\",\"ended\",\"error\",\"loop\",\"mediaGroup\",\"muted\",\"networkState\",\"paused\",\"playbackRate\",\"played\",\"preload\",\"readyState\",\"seekable\",\"seeking\",\"src\",\"startDate\",\"textTracks\",\"videoTracks\",\"volume\"],methods:[\"addTextTrack\",\"canPlayType\",\"load\",\"play\",\"pause\"],events:[\"abort\",\"canplay\",\"canplaythrough\",\"durationchange\",\"emptied\",\"ended\",\"error\",\"loadeddata\",\"loadedmetadata\",\"loadstart\",\"pause\",\"play\",\"playing\",\"progress\",\"ratechange\",\"seeked\",\"seeking\",\"stalled\",\"suspend\",\"timeupdate\",\"volumechange\",\"waiting\"],prototypes:[\"width\",\"height\",\"videoWidth\",\"videoHeight\",\"poster\",\"webkitDecodedFrameCount\",\"webkitDroppedFrameCount\",\"playsInline\",\"webkitSupportsFullscreen\",\"webkitDisplayingFullscreen\",\"onenterpictureinpicture\",\"onleavepictureinpicture\",\"disablePictureInPicture\",\"cancelVideoFrameCallback\",\"requestVideoFrameCallback\",\"getVideoPlaybackQuality\",\"requestPictureInPicture\",\"webkitEnterFullScreen\",\"webkitEnterFullscreen\",\"webkitExitFullScreen\",\"webkitExitFullscreen\"]},s=globalThis?.CUSTOM_USER_AGENT??(\"undefined\"!==typeof navigator?navigator.userAgent:\"\"),l=/^(?:(?!chrome|android).)*safari/i.test(s),c=/iPad|iPhone|iPod/i.test(s)&&!window.MSStream,d=c||s.includes(\"Macintosh\")&&navigator.maxTouchPoints>=1,p=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(s)||d,h=\"undefined\"!==typeof window&&\"undefined\"!==typeof document;function u(t,e=document){return e.querySelector(t)}function m(t,e=document){return Array.from(e.querySelectorAll(t))}function f(t,e){return t.classList.add(e)}function g(t,e){return t.classList.remove(e)}function v(t,e){return t.classList.contains(e)}function y(t,e){return e instanceof Element?t.appendChild(e):t.insertAdjacentHTML(\"beforeend\",String(e)),t.lastElementChild||t.lastChild}function b(t){return t.parentNode.removeChild(t)}function w(t,e,r){return t.style[e]=r,t}function x(t,e){for(const r in e)w(t,r,e[r]);return t}function k(t){return Array.from(t.parentElement.children).filter(e=>e!==t)}function $(t,e){k(t).forEach(t=>g(t,e)),f(t,e)}function T(t,e,r=\"top\"){p||(t.setAttribute(\"aria-label\",e),f(t,\"hint--rounded\"),f(t,`hint--${r}`))}function E(t,e=0){const r=t.getBoundingClientRect(),a=window.innerHeight||document.documentElement.clientHeight,o=window.innerWidth||document.documentElement.clientWidth,n=r.top-e<=a&&r.top+r.height+e>=0,i=r.left-e<=o+e&&r.left+r.width+e>=0;return n&&i}function C(t,e){return R(t).includes(e)}function z(t,e){return e.parentNode.replaceChild(t,e),t}function L(t){return document.createElement(t)}function S(t=\"\",e=\"\"){const r=L(\"i\");return f(r,\"art-icon\"),f(r,`art-icon-${t}`),y(r,e),r}function M(t,e){let r=document.getElementById(t);r||(r=document.createElement(\"style\"),r.id=t,\"loading\"===document.readyState?document.addEventListener(\"DOMContentLoaded\",()=>{document.head.appendChild(r)}):(document.head||document.documentElement).appendChild(r)),r.textContent=e}function I(){const t=document.createElement(\"div\");return t.style.display=\"flex\",\"flex\"===t.style.display}function P(t){return t.getBoundingClientRect()}function A(t,e){return new Promise((r,a)=>{const o=new Image;o.onload=function(){if(e&&1!==e){const n=document.createElement(\"canvas\"),i=n.getContext(\"2d\");n.width=o.width*e,n.height=o.height*e,i.drawImage(o,0,0,n.width,n.height),n.toBlob(e=>{const o=URL.createObjectURL(e),n=new Image;n.onload=function(){r(n)},n.onerror=function(){URL.revokeObjectURL(o),a(new Error(`Image load failed: ${t}`))},n.src=o})}else r(o)},o.onerror=function(){a(new Error(`Image load failed: ${t}`))},o.src=t})}function R(t){if(t.composedPath)return t.composedPath();const e=[];let r=t.target;for(;r;)e.push(r),r=r.parentNode;return e.includes(window)||void 0===window||e.push(window),e}class O extends Error{constructor(t,e){super(t),\"function\"===typeof Error.captureStackTrace&&Error.captureStackTrace(this,e||this.constructor),this.name=\"ArtPlayerError\"}}function _(t,e){if(!t)throw new O(e);return t}function V(t){return t.includes(\"?\")?V(t.split(\"?\")[0]):t.includes(\"#\")?V(t.split(\"#\")[0]):t.trim().toLowerCase().split(\".\").pop()}function Y(t,e){const r=document.createElement(\"a\");r.style.display=\"none\",r.href=t,r.download=e,document.body.appendChild(r),r.click(),document.body.removeChild(r)}function D(t,e,r){return Math.max(Math.min(t,Math.max(e,r)),Math.min(e,r))}function N(t){return t.charAt(0).toUpperCase()+t.slice(1)}function F(t){if(!t)return\"00:00\";const e=Math.floor(t/3600),r=Math.floor((t-3600*e)/60),a=Math.floor(t-3600*e-60*r);return(e>0?[e,r,a]:[r,a]).map(t=>t<10?`0${t}`:String(t)).join(\":\")}function B(t){return t.replace(/[&<>'\"]/g,t=>({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",\"'\":\"&#39;\",'\"':\"&quot;\"}[t]||t))}const H=Object.defineProperty,{hasOwnProperty:W}=Object.prototype;function j(t,e){return W.call(t,e)}function U(t,e){return Object.getOwnPropertyDescriptor(t,e)}function q(...t){const e=t=>t&&\"object\"===typeof t&&!Array.isArray(t);return t.reduce((t,r)=>(Object.keys(r).forEach(a=>{const o=t[a],n=r[a];Array.isArray(o)&&Array.isArray(n)?t[a]=o.concat(...n):e(o)&&e(n)?t[a]=q(o,n):t[a]=n}),t),{})}function X(t){return\"WEBVTT \\r\\n\\r\\n\".concat((e=t,e.replace(/(\\d\\d:\\d\\d:\\d\\d)[,.](\\d+)/g,(t,e,r)=>{let a=r.slice(0,3);return 1===r.length&&(a=`${r}00`),2===r.length&&(a=`${r}0`),`${e},${a}`})).replace(/\\{\\\\([ibu])\\}/g,\"</$1>\").replace(/\\{\\\\([ibu])1\\}/g,\"<$1>\").replace(/\\{([ibu])\\}/g,\"<$1>\").replace(/\\{\\/([ibu])\\}/g,\"</$1>\").replace(/(\\d\\d:\\d\\d:\\d\\d),(\\d\\d\\d)/g,\"$1.$2\").replace(/\\{[\\s\\S]*?\\}/g,\"\").concat(\"\\r\\n\\r\\n\"));var e}function G(t){return URL.createObjectURL(new Blob([t],{type:\"text/vtt\"}))}function K(t){const e=new RegExp(\"Dialogue:\\\\s\\\\d,(\\\\d+:\\\\d\\\\d:\\\\d\\\\d.\\\\d\\\\d),(\\\\d+:\\\\d\\\\d:\\\\d\\\\d.\\\\d\\\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\\\s\\\\S]*)$\",\"i\");function r(t=\"\"){return t.split(/[:.]/).map((t,e,r)=>{if(e===r.length-1){if(1===t.length)return`.${t}00`;if(2===t.length)return`.${t}0`}else if(1===t.length)return(0===e?\"0\":\":0\")+t;return 0===e?t:e===r.length-1?`.${t}`:`:${t}`}).join(\"\")}return`WEBVTT\\n\\n${t.split(/\\r?\\n/).map(t=>{const a=t.match(e);return a?{start:r(a[1].trim()),end:r(a[2].trim()),text:a[5].replace(/\\{[\\s\\S]*?\\}/g,\"\").replace(/(\\\\N)/g,\"\\n\").trim().split(/\\r?\\n/).map(t=>t.trim()).join(\"\\n\")}:null}).filter(t=>t).map((t,e)=>t?`${e+1}\\n${t.start} --\\x3e ${t.end}\\n${t.text}`:\"\").filter(t=>t.trim()).join(\"\\n\\n\")}`}function Z(t=0){return new Promise(e=>setTimeout(e,t))}function J(t,e){let r;return function(...a){clearTimeout(r),r=setTimeout(()=>(r=null,t.apply(this,a)),e)}}function Q(t,e){let r=!1;return function(...a){r||(t.apply(this,a),r=!0,setTimeout(()=>{r=!1},e))}}const tt=Object.freeze(Object.defineProperty({__proto__:null,ArtPlayerError:O,addClass:f,append:y,assToVtt:K,capitalize:N,clamp:D,createElement:L,debounce:J,def:H,download:Y,errorHandle:_,escape:B,get:U,getComposedPath:R,getExt:V,getIcon:S,getRect:P,getStyle:function(t,e,r=!0){const a=window.getComputedStyle(t,null).getPropertyValue(e);return r?Number.parseFloat(a):a},has:j,hasClass:v,includeFromEvent:C,inverseClass:$,isBrowser:h,isIOS:c,isIOS13:d,isInViewport:E,isMobile:p,isSafari:l,loadImg:A,mergeDeep:q,query:u,queryAll:m,remove:b,removeClass:g,replaceElement:z,secondToTime:F,setStyle:w,setStyleText:M,setStyles:x,siblings:k,sleep:Z,srtToVtt:X,supportsFlex:I,throttle:Q,tooltip:T,unescape:function(t){const e={\"&amp;\":\"&\",\"&lt;\":\"<\",\"&gt;\":\">\",\"&#39;\":\"'\",\"&quot;\":'\"'},r=new RegExp(`(${Object.keys(e).join(\"|\")})`,\"g\");return t.replace(r,t=>e[t]||t)},userAgent:s,vttToBlob:G},Symbol.toStringTag,{value:\"Module\"})),et=\"array\",rt=\"boolean\",at=\"string\",ot=\"number\",nt=\"object\",it=\"function\";function st(t,e,r){return _(e===at||e===ot||t instanceof Element,`${r.join(\".\")} require '${at}' or 'Element' type`)}const lt={html:st,disable:`?${rt}`,name:`?${at}`,index:`?${ot}`,style:`?${nt}`,click:`?${it}`,mounted:`?${it}`,tooltip:`?${at}|${ot}`,width:`?${ot}`,selector:`?${et}`,onSelect:`?${it}`,switch:`?${rt}`,onSwitch:`?${it}`,range:`?${et}`,onRange:`?${it}`,onChange:`?${it}`},ct={id:at,container:st,url:at,poster:at,type:at,theme:at,lang:at,volume:ot,isLive:rt,muted:rt,autoplay:rt,autoSize:rt,autoMini:rt,loop:rt,flip:rt,playbackRate:rt,aspectRatio:rt,screenshot:rt,setting:rt,hotkey:rt,pip:rt,mutex:rt,backdrop:rt,fullscreen:rt,fullscreenWeb:rt,subtitleOffset:rt,miniProgressBar:rt,useSSR:rt,playsInline:rt,lock:rt,gesture:rt,fastForward:rt,autoPlayback:rt,autoOrientation:rt,airplay:rt,proxy:`?${it}`,plugins:[it],layers:[lt],contextmenu:[lt],settings:[lt],controls:[{...lt,position:(t,e,r)=>{const a=[\"top\",\"left\",\"right\"];return _(a.includes(t),`${r.join(\".\")} only accept ${a.toString()} as parameters`)}}],quality:[{default:`?${rt}`,html:at,url:at}],highlight:[{time:ot,text:at}],thumbnails:{url:at,number:ot,column:ot,width:ot,height:ot,scale:ot},subtitle:{url:at,name:at,type:at,style:nt,escape:rt,encoding:at,onVttLoad:it},moreVideoAttr:nt,i18n:nt,icons:nt,cssVar:nt,customType:nt};class dt{constructor(t){this.id=0,this.art=t,this.cache=new Map,this.add=this.add.bind(this),this.remove=this.remove.bind(this),this.update=this.update.bind(this)}get show(){return v(this.art.template.$player,`art-${this.name}-show`)}set show(t){const{$player:e}=this.art.template,r=`art-${this.name}-show`;t?f(e,r):g(e,r),this.art.emit(this.name,t)}toggle(){this.show=!this.show}add(t){const e=\"function\"===typeof t?t(this.art):t;if(e.html=e.html||\"\",o(e,lt),!this.$parent||!this.name||e.disable)return;const r=e.name||`${this.name}${this.id}`;_(!this.cache.has(r),`Can't add an existing [${r}] to the [${this.name}]`),this.id+=1;const a=L(\"div\");f(a,`art-${this.name}`),f(a,`art-${this.name}-${r}`);const n=Array.from(this.$parent.children);a.dataset.index=e.index||this.id;const i=n.find(t=>Number(t.dataset.index)>=Number(a.dataset.index));i?i.insertAdjacentElement(\"beforebegin\",a):y(this.$parent,a),e.html&&y(a,e.html),e.style&&x(a,e.style),e.tooltip&&T(a,e.tooltip);const s=[];if(e.click){const t=this.art.events.proxy(a,\"click\",t=>{t.preventDefault(),e.click.call(this.art,this,t)});s.push(t)}return e.selector&&[\"left\",\"right\"].includes(e.position)&&this.selector(e,a,s),this[r]=a,this.cache.set(r,{$ref:a,events:s,option:e}),e.mounted&&e.mounted.call(this.art,a),a}remove(t){_(this.cache.has(t),`Can't find [${t}] from the [${this.name}]`);const e=this.cache.get(t);e.option.beforeUnmount&&e.option.beforeUnmount.call(this.art,e.$ref);for(const r of e.events)this.art.events.remove(r);this.cache.delete(t),delete this[t],b(e.$ref)}update(t){if(this.cache.has(t.name)){const e=this.cache.get(t.name);t=Object.assign(e.option,t),this.remove(t.name)}return this.add(t)}}class pt extends dt{constructor(t){super(t),this.name=\"contextmenu\",this.$parent=t.template.$contextmenu,p||this.init()}init(){const{option:t,proxy:e,template:{$player:r,$contextmenu:a}}=this.art;t.playbackRate&&this.add(function(t){return e=>{const{i18n:r,constructor:{PLAYBACK_RATE:a}}=e,o=a.map(t=>`<span data-value=\"${t}\">${1===t?r.get(\"Normal\"):t.toFixed(1)}</span>`).join(\"\");return{...t,html:`${r.get(\"Play Speed\")}: ${o}`,click:(t,r)=>{const{value:a}=r.target.dataset;a&&(e.playbackRate=Number(a),t.show=!1)},mounted:t=>{const r=u('[data-value=\"1\"]',t);r&&$(r,\"art-current\"),e.on(\"video:ratechange\",()=>{const r=m(\"span\",t).find(t=>Number(t.dataset.value)===e.playbackRate);r&&$(r,\"art-current\")})}}}}({name:\"playbackRate\",index:10})),t.aspectRatio&&this.add(function(t){return e=>{const{i18n:r,constructor:{ASPECT_RATIO:a}}=e,o=a.map(t=>`<span data-value=\"${t}\">${\"default\"===t?r.get(\"Default\"):t}</span>`).join(\"\");return{...t,html:`${r.get(\"Aspect Ratio\")}: ${o}`,click:(t,r)=>{const{value:a}=r.target.dataset;a&&(e.aspectRatio=a,t.show=!1)},mounted:t=>{const r=u('[data-value=\"default\"]',t);r&&$(r,\"art-current\"),e.on(\"aspectRatio\",e=>{const r=m(\"span\",t).find(t=>t.dataset.value===e);r&&$(r,\"art-current\")})}}}}({name:\"aspectRatio\",index:20})),t.flip&&this.add(function(t){return e=>{const{i18n:r,constructor:{FLIP:a}}=e,o=a.map(t=>`<span data-value=\"${t}\">${r.get(N(t))}</span>`).join(\"\");return{...t,html:`${r.get(\"Video Flip\")}: ${o}`,click:(t,r)=>{const{value:a}=r.target.dataset;a&&(e.flip=a.toLowerCase(),t.show=!1)},mounted:t=>{const r=u('[data-value=\"normal\"]',t);r&&$(r,\"art-current\"),e.on(\"flip\",e=>{const r=m(\"span\",t).find(t=>t.dataset.value===e);r&&$(r,\"art-current\")})}}}}({name:\"flip\",index:30})),this.add(function(t){return e=>({...t,html:e.i18n.get(\"Video Info\"),click:t=>{e.info.show=!0,t.show=!1}})}({name:\"info\",index:40})),this.add(function(t){const e=h?location.href:\"\";return{...t,html:`<a href=\"https://artplayer.org?ref=${encodeURIComponent(e)}\" target=\"_blank\" style=\"width:100%;\">ArtPlayer ${n}</a>`}}({name:\"version\",index:50})),this.add(function(t){return e=>({...t,html:e.i18n.get(\"Close\"),click:t=>{t.show=!1}})}({name:\"close\",index:60}));for(let o=0;o<t.contextmenu.length;o++)this.add(t.contextmenu[o]);e(r,\"contextmenu\",t=>{if(!this.art.constructor.CONTEXTMENU)return;t.preventDefault(),this.show=!0;const e=t.clientX,o=t.clientY,{height:n,width:i,left:s,top:l}=P(r),{height:c,width:d}=P(a);let p=e-s,h=o-l;e+d>s+i&&(p=i-d),o+c>l+n&&(h=n-c),x(a,{top:`${h}px`,left:`${p}px`})}),e(r,\"click\",t=>{C(t,a)||(this.show=!1)}),this.art.on(\"blur\",()=>{this.show=!1})}}function ht(t,e){const{$progress:r}=t.template,{left:a}=P(r),o=D((p?e.touches[0].clientX:e.clientX)-a,0,r.clientWidth),n=o/r.clientWidth*t.duration;return{second:n,time:F(n),width:o,percentage:D(o/r.clientWidth,0,1)}}function ut(t,e){if(t.isRotate){const r=e.touches[0].clientY/t.height,a=r*t.duration;t.emit(\"setBar\",\"played\",r,e),t.seek=a}else{const{second:r,percentage:a}=ht(t,e);t.emit(\"setBar\",\"played\",a,e),t.seek=r}}function mt(t){return e=>{const{icons:r,option:a,proxy:o}=e,{$player:n,$progress:i}=e.template;return{...t,html:'\\n                <div class=\"art-control-progress-inner\">\\n                    <div class=\"art-progress-hover\"></div>\\n                    <div class=\"art-progress-loaded\"></div>\\n                    <div class=\"art-progress-played\"></div>\\n                    <div class=\"art-progress-highlight\"></div>\\n                    <div class=\"art-progress-indicator\"></div>\\n                    <div class=\"art-progress-tip\">00:00</div>\\n                </div>\\n            ',mounted:t=>{let s=null,l=!1;const c=u(\".art-progress-hover\",t),d=u(\".art-progress-loaded\",t),h=u(\".art-progress-played\",t),m=u(\".art-progress-highlight\",t),v=u(\".art-progress-indicator\",t),b=u(\".art-progress-tip\",t);function x(r,a){const{width:o,time:n}=a||ht(e,r);b.textContent=n||\"00:00\";const i=b.clientWidth;o<=i/2?w(b,\"left\",0):o>t.clientWidth-i/2?w(b,\"left\",t.clientWidth-i+\"px\"):w(b,\"left\",o-i/2+\"px\")}r.indicator?y(v,r.indicator):w(v,\"backgroundColor\",\"var(--art-theme)\"),e.on(\"setBar\",function(r,a,o){const i=\"played\"===r&&o&&p;if(\"loaded\"===r&&w(d,\"width\",100*a+\"%\"),\"hover\"===r&&(w(c,\"width\",100*a+\"%\"),C(o,m)?function(r){const{width:a}=ht(e,r),{text:o}=r.target.dataset;b.textContent=o;const n=b.clientWidth;a<=n/2?w(b,\"left\",0):a>t.clientWidth-n/2?w(b,\"left\",t.clientWidth-n+\"px\"):w(b,\"left\",a-n/2+\"px\")}(o):x(o),0===a?g(n,\"art-progress-hover\"):f(n,\"art-progress-hover\")),\"played\"===r&&(w(h,\"width\",100*a+\"%\"),w(v,\"left\",100*a+\"%\")),i){f(n,\"art-progress-hover\");x(o,{width:t.clientWidth*a,time:F(a*e.duration)}),clearTimeout(s),s=setTimeout(()=>{g(n,\"art-progress-hover\")},500)}}),e.on(\"video:loadedmetadata\",function(){m.textContent=\"\";for(let t=0;t<a.highlight.length;t++){const r=a.highlight[t],o=D(r.time,0,e.duration)/e.duration*100,n=`<span data-text=\"${r.text}\" data-time=\"${r.time}\" style=\"left: ${o}%\"></span>`;y(m,n)}}),e.constructor.USE_RAF?e.on(\"raf\",()=>{e.emit(\"setBar\",\"played\",e.played),e.emit(\"setBar\",\"loaded\",e.loaded)}):(e.on(\"video:timeupdate\",()=>{e.emit(\"setBar\",\"played\",e.played)}),e.on(\"video:progress\",()=>{e.emit(\"setBar\",\"loaded\",e.loaded)}),e.on(\"video:ended\",()=>{e.emit(\"setBar\",\"played\",1)})),e.emit(\"setBar\",\"loaded\",e.loaded||0),p||(o(i,\"click\",t=>{t.target!==v&&ut(e,t)}),o(i,\"mousemove\",t=>{const{percentage:r}=ht(e,t);e.emit(\"setBar\",\"hover\",r,t)}),o(i,\"mouseleave\",t=>{e.emit(\"setBar\",\"hover\",0,t)}),o(i,\"mousedown\",t=>{l=0===t.button}),e.on(\"document:mousemove\",t=>{if(l){const{second:r,percentage:a}=ht(e,t);e.emit(\"setBar\",\"played\",a,t),e.seek=r}}),e.on(\"document:mouseup\",()=>{l&&(l=!1)}))}}}}class ft extends dt{constructor(t){super(t),this.isHover=!1,this.name=\"control\",this.timer=Date.now();const{constructor:e}=t,{$player:r,$bottom:a}=this.art.template;t.on(\"mousemove\",()=>{p||(this.show=!0)}),t.on(\"click\",()=>{p?this.toggle():this.show=!0}),t.on(\"document:mousemove\",t=>{this.isHover=C(t,a)}),t.on(\"video:timeupdate\",()=>{!t.setting.show&&!this.isHover&&!t.isInput&&t.playing&&this.show&&Date.now()-this.timer>=e.CONTROL_HIDE_TIME&&(this.show=!1)}),t.on(\"control\",t=>{t?(g(r,\"art-hide-cursor\"),f(r,\"art-hover\"),this.timer=Date.now()):(f(r,\"art-hide-cursor\"),g(r,\"art-hover\"))}),this.init()}init(){const{option:t}=this.art;t.isLive||this.add(mt({name:\"progress\",position:\"top\",index:10})),this.add({name:\"thumbnails\",position:\"top\",index:20}),this.add(function(t){return e=>({...t,mounted:t=>{const{proxy:r,icons:a,i18n:o}=e,n=y(t,a.play),i=y(t,a.pause);function s(){w(n,\"display\",\"flex\"),w(i,\"display\",\"none\")}function l(){w(n,\"display\",\"none\"),w(i,\"display\",\"flex\")}T(n,o.get(\"Play\")),T(i,o.get(\"Pause\")),r(n,\"click\",()=>{e.play()}),r(i,\"click\",()=>{e.pause()}),e.playing?l():s(),e.on(\"video:playing\",()=>{l()}),e.on(\"video:pause\",()=>{s()})}})}({name:\"playAndPause\",position:\"left\",index:10})),this.add(function(t){return e=>({...t,mounted:t=>{const{proxy:r,icons:a}=e,o=y(t,a.volume),n=y(t,a.volumeClose),i=y(t,'<div class=\"art-volume-panel\"></div>'),s=y(i,'<div class=\"art-volume-inner\"></div>'),l=y(s,'<div class=\"art-volume-val\"></div>'),c=y(s,'<div class=\"art-volume-slider\"></div>'),d=y(c,'<div class=\"art-volume-handle\"></div>'),h=y(d,'<div class=\"art-volume-loaded\"></div>'),u=y(c,'<div class=\"art-volume-indicator\"></div>');function m(t){const{top:e,height:r}=P(c);return 1-(t.clientY-e)/r}function f(){if(e.muted||0===e.volume)w(o,\"display\",\"none\"),w(n,\"display\",\"flex\"),w(u,\"top\",\"100%\"),w(h,\"top\",\"100%\"),l.textContent=0;else{const t=100*e.volume;w(o,\"display\",\"flex\"),w(n,\"display\",\"none\"),w(u,\"top\",100-t+\"%\"),w(h,\"top\",100-t+\"%\"),l.textContent=Math.floor(t)}}if(f(),e.on(\"video:volumechange\",f),r(o,\"click\",()=>{e.muted=!0}),r(n,\"click\",()=>{e.muted=!1}),p)w(i,\"display\",\"none\");else{let t=!1;r(c,\"mousedown\",r=>{t=0===r.button,e.volume=m(r)}),e.on(\"document:mousemove\",r=>{t&&(e.muted=!1,e.volume=m(r))}),e.on(\"document:mouseup\",()=>{t&&(t=!1)})}}})}({name:\"volume\",position:\"left\",index:20})),t.isLive||this.add(function(t){return e=>({...t,style:p?{fontSize:\"12px\",padding:\"0 5px\"}:{cursor:\"auto\",padding:\"0 10px\"},mounted:t=>{function r(){const r=`${F(e.currentTime)} / ${F(e.duration)}`;r!==t.textContent&&(t.textContent=r)}r();const a=[\"video:loadedmetadata\",\"video:timeupdate\",\"video:progress\"];for(let o=0;o<a.length;o++)e.on(a[o],r)}})}({name:\"time\",position:\"left\",index:30})),t.quality.length&&Z().then(()=>{this.art.quality=t.quality}),t.screenshot&&!p&&this.add(function(t){return e=>({...t,tooltip:e.i18n.get(\"Screenshot\"),mounted:t=>{const{proxy:r,icons:a}=e;y(t,a.screenshot),r(t,\"click\",()=>{e.screenshot()})}})}({name:\"screenshot\",position:\"right\",index:20})),t.setting&&this.add(function(t){return e=>({...t,tooltip:e.i18n.get(\"Show Setting\"),mounted:t=>{const{proxy:r,icons:a,i18n:o}=e;y(t,a.setting),r(t,\"click\",()=>{e.setting.toggle(),e.setting.resize()}),e.on(\"setting\",e=>{T(t,o.get(e?\"Hide Setting\":\"Show Setting\"))})}})}({name:\"setting\",position:\"right\",index:30})),t.pip&&this.add(function(t){return e=>({...t,tooltip:e.i18n.get(\"PIP Mode\"),mounted:t=>{const{proxy:r,icons:a,i18n:o}=e;y(t,a.pip),r(t,\"click\",()=>{e.pip=!e.pip}),e.on(\"pip\",e=>{T(t,o.get(e?\"Exit PIP Mode\":\"PIP Mode\"))})}})}({name:\"pip\",position:\"right\",index:40})),t.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add(function(t){return e=>({...t,tooltip:e.i18n.get(\"AirPlay\"),mounted:t=>{const{proxy:r,icons:a}=e;y(t,a.airplay),r(t,\"click\",()=>e.airplay())}})}({name:\"airplay\",position:\"right\",index:50})),t.fullscreenWeb&&this.add(function(t){return e=>({...t,tooltip:e.i18n.get(\"Web Fullscreen\"),mounted:t=>{const{proxy:r,icons:a,i18n:o}=e,n=y(t,a.fullscreenWebOn),i=y(t,a.fullscreenWebOff);w(i,\"display\",\"none\"),r(t,\"click\",()=>{e.fullscreenWeb=!e.fullscreenWeb}),e.on(\"fullscreenWeb\",e=>{e?(T(t,o.get(\"Exit Web Fullscreen\")),w(n,\"display\",\"none\"),w(i,\"display\",\"inline-flex\")):(T(t,o.get(\"Web Fullscreen\")),w(n,\"display\",\"inline-flex\"),w(i,\"display\",\"none\"))})}})}({name:\"fullscreenWeb\",position:\"right\",index:60})),t.fullscreen&&this.add(function(t){return e=>({...t,tooltip:e.i18n.get(\"Fullscreen\"),mounted:t=>{const{proxy:r,icons:a,i18n:o}=e,n=y(t,a.fullscreenOn),i=y(t,a.fullscreenOff);w(i,\"display\",\"none\"),r(t,\"click\",()=>{e.fullscreen=!e.fullscreen}),e.on(\"fullscreen\",e=>{e?(T(t,o.get(\"Exit Fullscreen\")),w(n,\"display\",\"none\"),w(i,\"display\",\"inline-flex\")):(T(t,o.get(\"Fullscreen\")),w(n,\"display\",\"inline-flex\"),w(i,\"display\",\"none\"))})}})}({name:\"fullscreen\",position:\"right\",index:70}));for(let e=0;e<t.controls.length;e++)this.add(t.controls[e])}add(t){const e=\"function\"===typeof t?t(this.art):t,{$progress:r,$controlsLeft:a,$controlsRight:o}=this.art.template;switch(e.position){case\"top\":this.$parent=r;break;case\"left\":this.$parent=a;break;case\"right\":this.$parent=o;break;default:_(!1,\"Control option.position must one of 'top', 'left', 'right'\")}super.add(e)}check(t){if(t){t.$control_value.innerHTML=t.html;for(let e=0;e<t.$control_option.length;e++){const r=t.$control_option[e];r.default=r===t,r.default&&$(r.$control_item,\"art-current\")}}}selector(t,e,r){const{proxy:a}=this.art.events;f(e,\"art-control-selector\");const o=L(\"div\");f(o,\"art-selector-value\"),y(o,t.html),e.textContent=\"\",y(e,o);const n=L(\"div\");f(n,\"art-selector-list\"),y(e,n);for(let s=0;s<t.selector.length;s++){const e=t.selector[s],r=L(\"div\");f(r,\"art-selector-item\"),e.default&&f(r,\"art-current\"),r.dataset.index=s,r.dataset.value=e.value,r.innerHTML=e.html,y(n,r),H(e,\"$control_option\",{get:()=>t.selector}),H(e,\"$control_item\",{get:()=>r}),H(e,\"$control_value\",{get:()=>o})}const i=a(n,\"click\",async e=>{const r=R(e),a=t.selector.find(t=>t.$control_item===r.find(e=>t.$control_item===e));this.check(a),t.onSelect&&(o.innerHTML=await t.onSelect.call(this.art,a,a.$control_item,e))});r.push(i)}}function gt(t,e,r,a){const o=e-a,n=r-t;let i=0;if(Math.abs(n)<2&&Math.abs(o)<2)return i;const s=function(t,e){return 180*Math.atan2(e,t)/Math.PI}(n,o);return s>=-45&&s<45?i=4:s>=45&&s<135?i=1:s>=-135&&s<-45?i=2:(s>=135&&s<=180||s>=-180&&s<-135)&&(i=3),i}class vt{constructor(t){this.destroyEvents=new Set,this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),function(t,e){const{constructor:r,template:{$player:a,$video:o}}=t;function n(e){C(e,a)?(t.isInput=\"INPUT\"===e.target.tagName,t.isFocus=!0,t.emit(\"focus\",e)):(t.isInput=!1,t.isFocus=!1,t.emit(\"blur\",e))}t.on(\"document:click\",n),t.on(\"document:contextmenu\",n);let i=[];e.proxy(o,\"click\",e=>{const a=Date.now();i.push(a);const{MOBILE_CLICK_PLAY:o,DBCLICK_TIME:n,MOBILE_DBCLICK_PLAY:s,DBCLICK_FULLSCREEN:l}=r,c=i.filter(t=>a-t<=n);switch(c.length){case 1:t.emit(\"click\",e),p?!t.isLock&&o&&t.toggle():t.toggle(),i=c;break;case 2:t.emit(\"dblclick\",e),p?!t.isLock&&s&&t.toggle():l&&(t.fullscreen=!t.fullscreen),i=[];break;default:i=[]}})}(t,this),function(t,e){const{$player:r}=t.template;e.hover(r,e=>{f(r,\"art-hover\"),t.emit(\"hover\",!0,e)},e=>{g(r,\"art-hover\"),t.emit(\"hover\",!1,e)})}(t,this),function(t,e){const{$player:r}=t.template;e.proxy(r,\"mousemove\",e=>{t.emit(\"mousemove\",e)})}(t,this),function(t,e){const{option:r,constructor:a}=t;t.on(\"resize\",()=>{const{aspectRatio:e,notice:a}=t;\"standard\"===t.state&&r.autoSize&&t.autoSize(),t.aspectRatio=e,a.show=\"\"});const o=J(()=>t.emit(\"resize\"),a.RESIZE_TIME);t.on(\"window:orientationchange\",()=>o()),t.on(\"window:resize\",()=>o()),screen&&screen.orientation&&screen.orientation.onchange&&e.proxy(screen.orientation,\"change\",()=>o())}(t,this),function(t,e){if(p&&!t.option.isLive){const{$video:r,$progress:a}=t.template;let o=null,n=!1,i=0,s=0,l=0;const c=e=>{if(1===e.touches.length&&!t.isLock){o===a&&ut(t,e),n=!0;const{pageX:r,pageY:c}=e.touches[0];i=r,s=c,l=t.currentTime}},d=e=>{if(1===e.touches.length&&n&&t.duration){const{pageX:a,pageY:n}=e.touches[0],c=gt(i,s,a,n),d=[3,4].includes(c),p=[1,2].includes(c);if(d&&!t.isRotate||p&&t.isRotate){const c=D((a-i)/t.width,-1,1),d=D((n-s)/t.height,-1,1),p=t.isRotate?d:c,h=o===r?t.constructor.TOUCH_MOVE_RATIO:1,u=D(l+t.duration*p*h,0,t.duration);t.seek=u,t.emit(\"setBar\",\"played\",D(u/t.duration,0,1),e),t.notice.show=`${F(u)} / ${F(t.duration)}`}}},p=()=>{n&&(i=0,s=0,l=0,n=!1,o=null)};t.option.gesture&&(e.proxy(r,\"touchstart\",t=>{o=r,c(t)}),e.proxy(r,\"touchmove\",d)),e.proxy(a,\"touchstart\",t=>{o=a,c(t)}),e.proxy(a,\"touchmove\",d),t.on(\"document:touchend\",p)}}(t,this),function(t){const{option:e,constructor:r,template:{$container:a}}=t,o=Q(()=>{t.emit(\"view\",E(a,r.SCROLL_GAP))},r.SCROLL_TIME);t.on(\"window:scroll\",()=>o()),t.on(\"view\",r=>{e.autoMini&&(t.mini=!r)})}(t),function(t,e){const r=[\"click\",\"mouseup\",\"keydown\",\"touchend\",\"touchmove\",\"mousemove\",\"pointerup\",\"contextmenu\",\"pointermove\",\"visibilitychange\",\"webkitfullscreenchange\"],a=[\"resize\",\"scroll\",\"orientationchange\"],o=[];function n(n={}){for(let t=0;t<o.length;t++)e.remove(o[t]);o.length=0;const{$player:i}=t.template;r.forEach(r=>{const a=n.document||i.ownerDocument||document,s=e.proxy(a,r,e=>{t.emit(`document:${r}`,e)});o.push(s)}),a.forEach(r=>{const a=n.window||i.ownerDocument?.defaultView||window,s=e.proxy(a,r,e=>{t.emit(`window:${r}`,e)});o.push(s)})}n(),e.bindGlobalEvents=n}(t,this),function(t){if(t.constructor.USE_RAF){let e=null;!function r(){t.playing&&t.emit(\"raf\"),t.isDestroy||(e=requestAnimationFrame(r))}(),t.on(\"destroy\",()=>{cancelAnimationFrame(e)})}}(t)}proxy(t,e,r,a={}){if(Array.isArray(e))return e.map(e=>this.proxy(t,e,r,a));t.addEventListener(e,r,a);const o=()=>t.removeEventListener(e,r,a);return this.destroyEvents.add(o),o}hover(t,e,r){e&&this.proxy(t,\"mouseenter\",e),r&&this.proxy(t,\"mouseleave\",r)}remove(t){if(this.destroyEvents.has(t))try{t()}catch(e){console.warn(\"Failed to remove event listener:\",e)}finally{this.destroyEvents.delete(t)}}destroy(){for(const e of this.destroyEvents)try{e()}catch(t){console.warn(\"Failed to destroy event listener:\",t)}this.destroyEvents.clear()}}class yt{constructor(t){this.art=t,this.keys={},p||this.init()}init(){const{constructor:t}=this.art;this.art.option.hotkey&&(this.add(\"Escape\",()=>{this.art.fullscreenWeb&&(this.art.fullscreenWeb=!1)}),this.add(\"Space\",()=>{this.art.toggle()}),this.add(\"ArrowLeft\",()=>{this.art.backward=t.SEEK_STEP}),this.add(\"ArrowUp\",()=>{this.art.volume+=t.VOLUME_STEP}),this.add(\"ArrowRight\",()=>{this.art.forward=t.SEEK_STEP}),this.add(\"ArrowDown\",()=>{this.art.volume-=t.VOLUME_STEP})),this.art.on(\"document:keydown\",t=>{if(this.art.isFocus){const e=document.activeElement.tagName.toUpperCase(),r=document.activeElement.getAttribute(\"contenteditable\");if(\"INPUT\"!==e&&\"TEXTAREA\"!==e&&\"\"!==r&&\"true\"!==r&&!t.altKey&&!t.ctrlKey&&!t.metaKey&&!t.shiftKey){const e=this.keys[t.code];if(e){t.preventDefault();for(let r=0;r<e.length;r++)e[r].call(this.art,t);this.art.emit(\"hotkey\",t)}}}this.art.emit(\"keydown\",t)})}add(t,e){return this.keys[t]?this.keys[t].includes(e)||this.keys[t].push(e):this.keys[t]=[e],this}remove(t,e){if(this.keys[t]){const r=this.keys[t].indexOf(e);-1!==r&&this.keys[t].splice(r,1),0===this.keys[t].length&&delete this.keys[t]}return this}}const bt={\"Video Info\":\"\\u7edf\\u8ba1\\u4fe1\\u606f\",Close:\"\\u5173\\u95ed\",\"Video Load Failed\":\"\\u52a0\\u8f7d\\u5931\\u8d25\",Volume:\"\\u97f3\\u91cf\",Play:\"\\u64ad\\u653e\",Pause:\"\\u6682\\u505c\",Rate:\"\\u901f\\u5ea6\",Mute:\"\\u9759\\u97f3\",\"Video Flip\":\"\\u753b\\u9762\\u7ffb\\u8f6c\",Horizontal:\"\\u6c34\\u5e73\",Vertical:\"\\u5782\\u76f4\",Reconnect:\"\\u91cd\\u65b0\\u8fde\\u63a5\",\"Show Setting\":\"\\u663e\\u793a\\u8bbe\\u7f6e\",\"Hide Setting\":\"\\u9690\\u85cf\\u8bbe\\u7f6e\",Screenshot:\"\\u622a\\u56fe\",\"Play Speed\":\"\\u64ad\\u653e\\u901f\\u5ea6\",\"Aspect Ratio\":\"\\u753b\\u9762\\u6bd4\\u4f8b\",Default:\"\\u9ed8\\u8ba4\",Normal:\"\\u6b63\\u5e38\",Open:\"\\u6253\\u5f00\",\"Switch Video\":\"\\u5207\\u6362\",\"Switch Subtitle\":\"\\u5207\\u6362\\u5b57\\u5e55\",Fullscreen:\"\\u5168\\u5c4f\",\"Exit Fullscreen\":\"\\u9000\\u51fa\\u5168\\u5c4f\",\"Web Fullscreen\":\"\\u7f51\\u9875\\u5168\\u5c4f\",\"Exit Web Fullscreen\":\"\\u9000\\u51fa\\u7f51\\u9875\\u5168\\u5c4f\",\"Mini Player\":\"\\u8ff7\\u4f60\\u64ad\\u653e\\u5668\",\"PIP Mode\":\"\\u5f00\\u542f\\u753b\\u4e2d\\u753b\",\"Exit PIP Mode\":\"\\u9000\\u51fa\\u753b\\u4e2d\\u753b\",\"PIP Not Supported\":\"\\u4e0d\\u652f\\u6301\\u753b\\u4e2d\\u753b\",\"Fullscreen Not Supported\":\"\\u4e0d\\u652f\\u6301\\u5168\\u5c4f\",\"Subtitle Offset\":\"\\u5b57\\u5e55\\u504f\\u79fb\",\"Last Seen\":\"\\u4e0a\\u6b21\\u770b\\u5230\",\"Jump Play\":\"\\u8df3\\u8f6c\\u64ad\\u653e\",AirPlay:\"\\u9694\\u7a7a\\u64ad\\u653e\",\"AirPlay Not Available\":\"\\u9694\\u7a7a\\u64ad\\u653e\\u4e0d\\u53ef\\u7528\"};\"undefined\"!==typeof window&&(window[\"artplayer-i18n-zh-cn\"]=bt);class wt{constructor(t){this.art=t,this.languages={\"zh-cn\":bt},this.language={},this.update(t.option.i18n)}init(){const t=this.art.option.lang.toLowerCase();this.language=this.languages[t]||{}}get(t){return this.language[t]||t}update(t){this.languages=q(this.languages,t),this.init()}}class xt{constructor(t){const e={loading:'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"50px\" height=\"50px\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid\" class=\"uil-default\">\\n  <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill=\"none\" class=\"bk\"/>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(0 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-1s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(30 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.9166666666666666s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(60 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.8333333333333334s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(90 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.75s\" repeatCount=\"indefinite\"/></rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(120 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.6666666666666666s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(150 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.5833333333333334s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(180 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.5s\" repeatCount=\"indefinite\"/></rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(210 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.4166666666666667s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(240 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.3333333333333333s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(270 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.25s\" repeatCount=\"indefinite\"/></rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(300 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.16666666666666666s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(330 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.08333333333333333s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n</svg>',state:'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\" viewBox=\"0 0 24 24\">\\n<path d=\"M9.5 9.325v5.35q0 .575.525.875t1.025-.05l4.15-2.65q.475-.3.475-.85t-.475-.85L11.05 8.5q-.5-.35-1.025-.05t-.525.875ZM12 22q-2.075 0-3.9-.788t-3.175-2.137q-1.35-1.35-2.137-3.175T2 12q0-2.075.788-3.9t2.137-3.175q1.35-1.35 3.175-2.137T12 2q2.075 0 3.9.788t3.175 2.137q1.35 1.35 2.138 3.175T22 12q0 2.075-.788 3.9t-2.137 3.175q-1.35 1.35-3.175 2.138T12 22Z\"/>\\n</svg>\\n',play:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n  <path d=\"M17.982 9.275L8.06 3.27A2.013 2.013 0 0 0 5 4.994v12.011a2.017 2.017 0 0 0 3.06 1.725l9.922-6.005a2.017 2.017 0 0 0 0-3.45z\"></path>\\n</svg>',pause:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n    <path d=\"M7 3a2 2 0 0 0-2 2v12a2 2 0 1 0 4 0V5a2 2 0 0 0-2-2zM15 3a2 2 0 0 0-2 2v12a2 2 0 1 0 4 0V5a2 2 0 0 0-2-2z\"></path>\\n</svg>',check:'<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 24 24\" style=\"width: 100%; height: 100%;\">\\n<path d=\"M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z\" />\\n</svg>',volume:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n    <path d=\"M10.188 4.65L6 8H5a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h1l4.188 3.35a.5.5 0 0 0 .812-.39V5.04a.498.498 0 0 0-.812-.39zM14.446 3.778a1 1 0 0 0-.862 1.804 6.002 6.002 0 0 1-.007 10.838 1 1 0 0 0 .86 1.806A8.001 8.001 0 0 0 19 11a8.001 8.001 0 0 0-4.554-7.222z\"></path>\\n    <path d=\"M15 11a3.998 3.998 0 0 0-2-3.465v6.93A3.998 3.998 0 0 0 15 11z\"></path>\\n</svg>',volumeClose:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n    <path d=\"M15 11a3.998 3.998 0 0 0-2-3.465v2.636l1.865 1.865A4.02 4.02 0 0 0 15 11z\"></path>\\n    <path d=\"M13.583 5.583A5.998 5.998 0 0 1 17 11a6 6 0 0 1-.585 2.587l1.477 1.477a8.001 8.001 0 0 0-3.446-11.286 1 1 0 0 0-.863 1.805zM18.778 18.778l-2.121-2.121-1.414-1.414-1.415-1.415L13 13l-2-2-3.889-3.889-3.889-3.889a.999.999 0 1 0-1.414 1.414L5.172 8H5a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h1l4.188 3.35a.5.5 0 0 0 .812-.39v-3.131l2.587 2.587-.01.005a1 1 0 0 0 .86 1.806c.215-.102.424-.214.627-.333l2.3 2.3a1.001 1.001 0 0 0 1.414-1.416zM11 5.04a.5.5 0 0 0-.813-.39L8.682 5.854 11 8.172V5.04z\"></path>\\n</svg>',screenshot:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 50 50\">\\n\\t<path d=\"M 19.402344 6 C 17.019531 6 14.96875 7.679688 14.5 10.011719 L 14.097656 12 L 9 12 C 6.238281 12 4 14.238281 4 17 L 4 38 C 4 40.761719 6.238281 43 9 43 L 41 43 C 43.761719 43 46 40.761719 46 38 L 46 17 C 46 14.238281 43.761719 12 41 12 L 35.902344 12 L 35.5 10.011719 C 35.03125 7.679688 32.980469 6 30.597656 6 Z M 25 17 C 30.519531 17 35 21.480469 35 27 C 35 32.519531 30.519531 37 25 37 C 19.480469 37 15 32.519531 15 27 C 15 21.480469 19.480469 17 25 17 Z M 25 19 C 20.589844 19 17 22.589844 17 27 C 17 31.410156 20.589844 35 25 35 C 29.410156 35 33 31.410156 33 27 C 33 22.589844 29.410156 19 25 19 Z \"/>\\n</svg>\\n',setting:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n    <circle cx=\"11\" cy=\"11\" r=\"2\"></circle>\\n    <path d=\"M19.164 8.861L17.6 8.6a6.978 6.978 0 0 0-1.186-2.099l.574-1.533a1 1 0 0 0-.436-1.217l-1.997-1.153a1.001 1.001 0 0 0-1.272.23l-1.008 1.225a7.04 7.04 0 0 0-2.55.001L8.716 2.829a1 1 0 0 0-1.272-.23L5.447 3.751a1 1 0 0 0-.436 1.217l.574 1.533A6.997 6.997 0 0 0 4.4 8.6l-1.564.261A.999.999 0 0 0 2 9.847v2.306c0 .489.353.906.836.986l1.613.269a7 7 0 0 0 1.228 2.075l-.558 1.487a1 1 0 0 0 .436 1.217l1.997 1.153c.423.244.961.147 1.272-.23l1.04-1.263a7.089 7.089 0 0 0 2.272 0l1.04 1.263a1 1 0 0 0 1.272.23l1.997-1.153a1 1 0 0 0 .436-1.217l-.557-1.487c.521-.61.94-1.31 1.228-2.075l1.613-.269a.999.999 0 0 0 .835-.986V9.847a.999.999 0 0 0-.836-.986zM11 15a4 4 0 1 1 0-8 4 4 0 0 1 0 8z\"></path>\\n</svg>',pip:'<svg viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\">\\n<path d=\"M844.8 219.648h-665.6c-6.144 0-10.24 4.608-10.24 10.752v563.2c0 5.632 4.096 10.24 10.24 10.24h256v92.16h-256a102.4 102.4 0 0 1-102.4-102.4v-563.2c0-56.832 45.568-102.4 102.4-102.4h665.6a102.4 102.4 0 0 1 102.4 102.4v204.8h-92.16v-204.8c0-6.144-4.608-10.752-10.24-10.752zM614.4 588.8c-28.672 0-51.2 22.528-51.2 51.2v204.8c0 28.16 22.528 51.2 51.2 51.2h281.6c28.16 0 51.2-23.04 51.2-51.2v-204.8c0-28.672-23.04-51.2-51.2-51.2H614.4z\"></path>\\n</svg>',arrowLeft:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" version=\"1.1\" viewBox=\"0 0 32 32\">\\n    <path d=\"M 19.41,20.09 14.83,15.5 19.41,10.91 18,9.5 l -6,6 6,6 z\" />\\n</svg>',arrowRight:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" version=\"1.1\" viewBox=\"0 0 32 32\">\\n    <path d=\"m 12.59,20.34 4.58,-4.59 -4.58,-4.59 1.41,-1.41 6,6 -6,6 z\" />\\n</svg>',playbackRate:'<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\"><path d=\"M10,8v8l6-4L10,8L10,8z M6.3,5L5.7,4.2C7.2,3,9,2.2,11,2l0.1,1C9.3,3.2,7.7,3.9,6.3,5z            M5,6.3L4.2,5.7C3,7.2,2.2,9,2,11 l1,.1C3.2,9.3,3.9,7.7,5,6.3z            M5,17.7c-1.1-1.4-1.8-3.1-2-4.8L2,13c0.2,2,1,3.8,2.2,5.4L5,17.7z            M11.1,21c-1.8-0.2-3.4-0.9-4.8-2 l-0.6,.8C7.2,21,9,21.8,11,22L11.1,21z            M22,12c0-5.2-3.9-9.4-9-10l-0.1,1c4.6,.5,8.1,4.3,8.1,9s-3.5,8.5-8.1,9l0.1,1 C18.2,21.5,22,17.2,22,12z\" data-darkreader-inline-fill=\"\" style=\"--darkreader-inline-fill:#a8a6a4;\"></path></svg>',aspectRatio:'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 88 88\" preserveAspectRatio=\"xMidYMid meet\" style=\"width: 100%; height: 100%; transform: translate3d(0px, 0px, 0px);\"><defs><clipPath id=\"__lottie_element_216\"><rect width=\"88\" height=\"88\" x=\"0\" y=\"0\"></rect></clipPath></defs><g clip-path=\"url(#__lottie_element_216)\"><g transform=\"matrix(1,0,0,1,44,44)\" opacity=\"1\" style=\"display: block;\"><g opacity=\"1\" transform=\"matrix(1,0,0,1,0,0)\"><path fill-opacity=\"1\" d=\" M12.437999725341797,-12.70199966430664 C12.437999725341797,-12.70199966430664 9.618000030517578,-9.881999969482422 9.618000030517578,-9.881999969482422 C8.82800006866455,-9.092000007629395 8.82800006866455,-7.831999778747559 9.618000030517578,-7.052000045776367 C9.618000030517578,-7.052000045776367 16.687999725341797,0.017999999225139618 16.687999725341797,0.017999999225139618 C16.687999725341797,0.017999999225139618 9.618000030517578,7.0879998207092285 9.618000030517578,7.0879998207092285 C8.82800006866455,7.877999782562256 8.82800006866455,9.137999534606934 9.618000030517578,9.918000221252441 C9.618000030517578,9.918000221252441 12.437999725341797,12.748000144958496 12.437999725341797,12.748000144958496 C13.227999687194824,13.527999877929688 14.48799991607666,13.527999877929688 15.267999649047852,12.748000144958496 C15.267999649047852,12.748000144958496 26.58799934387207,1.437999963760376 26.58799934387207,1.437999963760376 C27.368000030517578,0.6579999923706055 27.368000030517578,-0.6119999885559082 26.58799934387207,-1.3919999599456787 C26.58799934387207,-1.3919999599456787 15.267999649047852,-12.70199966430664 15.267999649047852,-12.70199966430664 C14.48799991607666,-13.491999626159668 13.227999687194824,-13.491999626159668 12.437999725341797,-12.70199966430664z M-12.442000389099121,-12.70199966430664 C-13.182000160217285,-13.442000389099121 -14.362000465393066,-13.482000350952148 -15.142000198364258,-12.821999549865723 C-15.142000198364258,-12.821999549865723 -15.272000312805176,-12.70199966430664 -15.272000312805176,-12.70199966430664 C-15.272000312805176,-12.70199966430664 -26.582000732421875,-1.3919999599456787 -26.582000732421875,-1.3919999599456787 C-27.32200050354004,-0.6520000100135803 -27.36199951171875,0.5180000066757202 -26.70199966430664,1.3079999685287476 C-26.70199966430664,1.3079999685287476 -26.582000732421875,1.437999963760376 -26.582000732421875,1.437999963760376 C-26.582000732421875,1.437999963760376 -15.272000312805176,12.748000144958496 -15.272000312805176,12.748000144958496 C-14.531999588012695,13.48799991607666 -13.362000465393066,13.527999877929688 -12.571999549865723,12.868000030517578 C-12.571999549865723,12.868000030517578 -12.442000389099121,12.748000144958496 -12.442000389099121,12.748000144958496 C-12.442000389099121,12.748000144958496 -9.612000465393066,9.918000221252441 -9.612000465393066,9.918000221252441 C-8.871999740600586,9.178000450134277 -8.831999778747559,8.008000373840332 -9.501999855041504,7.2179999351501465 C-9.501999855041504,7.2179999351501465 -9.612000465393066,7.0879998207092285 -9.612000465393066,7.0879998207092285 C-9.612000465393066,7.0879998207092285 -16.68199920654297,0.017999999225139618 -16.68199920654297,0.017999999225139618 C-16.68199920654297,0.017999999225139618 -9.612000465393066,-7.052000045776367 -9.612000465393066,-7.052000045776367 C-8.871999740600586,-7.791999816894531 -8.831999778747559,-8.961999893188477 -9.501999855041504,-9.751999855041504 C-9.501999855041504,-9.751999855041504 -9.612000465393066,-9.881999969482422 -9.612000465393066,-9.881999969482422 C-9.612000465393066,-9.881999969482422 -12.442000389099121,-12.70199966430664 -12.442000389099121,-12.70199966430664z M28,-28 C32.41999816894531,-28 36,-24.420000076293945 36,-20 C36,-20 36,20 36,20 C36,24.420000076293945 32.41999816894531,28 28,28 C28,28 -28,28 -28,28 C-32.41999816894531,28 -36,24.420000076293945 -36,20 C-36,20 -36,-20 -36,-20 C-36,-24.420000076293945 -32.41999816894531,-28 -28,-28 C-28,-28 28,-28 28,-28z\" data-darkreader-inline-fill=\"\" style=\"--darkreader-inline-fill:#a8a6a4;\"></path></g></g></g></svg>',config:'<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\"><path d=\"M15,17h6v1h-6V17z M11,17H3v1h8v2h1v-2v-1v-2h-1V17z M14,8h1V6V5V3h-1v2H3v1h11V8z            M18,5v1h3V5H18z M6,14h1v-2v-1V9H6v2H3v1 h3V14z M10,12h11v-1H10V12z\" data-darkreader-inline-fill=\"\" style=\"--darkreader-inline-fill:#a8a6a4;\"></path></svg>',lock:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1650612139149\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\">\\n<path d=\"M298.666667 426.666667V341.333333a213.333333 213.333333 0 1 1 426.666666 0v85.333334h42.666667a85.333333 85.333333 0 0 1 85.333333 85.333333v256a85.333333 85.333333 0 0 1-85.333333 85.333333H256a85.333333 85.333333 0 0 1-85.333333-85.333333v-256a85.333333 85.333333 0 0 1 85.333333-85.333333h42.666667z m213.333333-213.333334a128 128 0 0 0-128 128v85.333334h256V341.333333a128 128 0 0 0-128-128z\"></path>\\n</svg>\\n',flip:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1652445277062\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"24\" height=\"24\">\\n<path d=\"M554.666667 810.666667v85.333333h-85.333334v-85.333333h85.333334zM170.666667 178.005333a42.666667 42.666667 0 0 1 34.986666 18.218667l203.904 291.328a42.666667 42.666667 0 0 1 0 48.896l-203.946666 291.328A42.666667 42.666667 0 0 1 128 803.328V220.672a42.666667 42.666667 0 0 1 42.666667-42.666667z m682.666666 0a42.666667 42.666667 0 0 1 42.368 37.717334l0.298667 4.949333v582.656a42.666667 42.666667 0 0 1-74.24 28.629333l-3.413333-4.181333-203.904-291.328a42.666667 42.666667 0 0 1-3.029334-43.861333l3.029334-5.034667 203.946666-291.328A42.666667 42.666667 0 0 1 853.333333 178.005333zM554.666667 640v85.333333h-85.333334v-85.333333h85.333334zM196.266667 319.104V716.8L335.957333 512 196.309333 319.104zM554.666667 469.333333v85.333334h-85.333334v-85.333334h85.333334z m0-170.666666v85.333333h-85.333334V298.666667h85.333334z m0-170.666667v85.333333h-85.333334V128h85.333334z\">\\n</path>\\n</svg>\\n',unlock:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1650612464266\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\"><path d=\"M666.752 194.517333L617.386667 268.629333A128 128 0 0 0 384 341.333333l0.042667 85.333334h384a85.333333 85.333333 0 0 1 85.333333 85.333333v256a85.333333 85.333333 0 0 1-85.333333 85.333333H256a85.333333 85.333333 0 0 1-85.333333-85.333333v-256a85.333333 85.333333 0 0 1 85.333333-85.333333h42.666667V341.333333a213.333333 213.333333 0 0 1 368.085333-146.816z\"></path></svg>\\n',fullscreenOff:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"22\" height=\"22\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n<path d=\"M768 298.666667h170.666667v85.333333h-256V128h85.333333v170.666667zM341.333333 384H85.333333V298.666667h170.666667V128h85.333333v256z m426.666667 341.333333v170.666667h-85.333333v-256h256v85.333333h-170.666667zM341.333333 640v256H256v-170.666667H85.333333v-85.333333h256z\" />\\n</svg>\\n',fullscreenOn:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"22\" height=\"22\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n<path d=\"M625.777778 256h142.222222V398.222222h113.777778V142.222222H625.777778v113.777778zM256 398.222222V256H398.222222v-113.777778H142.222222V398.222222h113.777778zM768 625.777778v142.222222H625.777778v113.777778h256V625.777778h-113.777778zM398.222222 768H256V625.777778h-113.777778v256H398.222222v-113.777778z\" />\\n</svg>\\n',fullscreenWebOff:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"18\" height=\"18\" viewBox=\"0 0 1152 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n<path d=\"M1075.2 0H76.8A76.8 76.8 0 0 0 0 76.8v870.4A76.8 76.8 0 0 0 76.8 1024h998.4a76.8 76.8 0 0 0 76.8-76.8V76.8A76.8 76.8 0 0 0 1075.2 0zM1024 128v768H128V128h896zM896 512a64 64 0 0 1 7.488 127.552L896 640h-128v128a64 64 0 0 1-56.512 63.552L704 832a64 64 0 0 1-63.552-56.512L640 768V582.592c0-34.496 25.024-66.112 61.632-70.208L709.632 512H896zM256 512a64 64 0 0 1-7.488-127.552L256 384h128V256a64 64 0 0 1 56.512-63.552L448 192a64 64 0 0 1 63.552 56.512L512 256v185.408c0 34.432-25.024 66.112-61.632 70.144L442.368 512H256z\" />\\n</svg>\\n',fullscreenWebOn:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"18\" height=\"18\" viewBox=\"0 0 1152 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n<path d=\"M1075.2 0H76.8A76.8 76.8 0 0 0 0 76.8v870.4A76.8 76.8 0 0 0 76.8 1024h998.4a76.8 76.8 0 0 0 76.8-76.8V76.8A76.8 76.8 0 0 0 1075.2 0zM1024 128v768H128V128h896zM448 192a64 64 0 0 1 7.488 127.552L448 320H320v128a64 64 0 0 1-56.512 63.552L256 512a64 64 0 0 1-63.552-56.512L192 448V262.592c0-34.432 25.024-66.112 61.632-70.144L261.632 192H448zM704 832a64 64 0 0 1-7.488-127.552L704 704h128V576a64 64 0 0 1 56.512-63.552L896 512a64 64 0 0 1 63.552 56.512L960 576v185.408c0 34.496-25.024 66.112-61.632 70.208l-8 0.384H704z\" />\\n</svg>\\n',switchOn:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"26\" height=\"26\" viewBox=\"0 0 1664 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n    <path fill=\"#648FFC\" d=\"M1152 0H512a512 512 0 0 0 0 1024h640a512 512 0 0 0 0-1024z m0 960a448 448 0 1 1 448-448 448 448 0 0 1-448 448z\"  />\\n</svg>',switchOff:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"26\" height=\"26\" viewBox=\"0 0 1740 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n    <path d=\"M511.8976 1024h670.5152c282.4192-0.4096 511.1808-229.4784 511.1808-511.8976 0-282.4192-228.7616-511.488-511.1808-511.8976H511.8976C229.4784 0.6144 0.7168 229.6832 0.7168 512.1024c0 282.4192 228.7616 511.488 511.1808 511.8976zM511.3344 48.64A464.5888 464.5888 0 1 1 48.0256 513.024 463.872 463.872 0 0 1 511.3344 48.4352V48.64z\" />\\n</svg>\\n',error:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1652850026663\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2749\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"50\" height=\"50\">\\n<path d=\"M593.8176 168.5504l356.00384 595.21024c26.15296 43.74528 10.73152 99.7376-34.44736 125.05088-14.39744 8.06912-30.72 12.30848-47.37024 12.30848H155.97568C103.75168 901.12 61.44 860.16 61.44 809.61536c0-16.09728 4.38272-31.92832 12.71808-45.8752L430.16192 168.5504c26.17344-43.7248 84.00896-58.65472 129.20832-33.34144a93.0816 93.0816 0 0 1 34.44736 33.34144zM512 819.2a61.44 61.44 0 1 0 0-122.88 61.44 61.44 0 0 0 0 122.88z m0-512a72.31488 72.31488 0 0 0-71.76192 81.3056l25.72288 205.7216a46.40768 46.40768 0 0 0 92.07808 0l25.72288-205.74208A72.31488 72.31488 0 0 0 512 307.2z\" p-id=\"2750\">\\n</path>\\n</svg>',close:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1655876154826\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"22\" height=\"22\">\\n<path d=\"M571.733333 512l268.8-268.8c17.066667-17.066667 17.066667-42.666667 0-59.733333-17.066667-17.066667-42.666667-17.066667-59.733333 0L512 452.266667 243.2 183.466667c-17.066667-17.066667-42.666667-17.066667-59.733333 0-17.066667 17.066667-17.066667 42.666667 0 59.733333L452.266667 512 183.466667 780.8c-17.066667 17.066667-17.066667 42.666667 0 59.733333 8.533333 8.533333 19.2 12.8 29.866666 12.8s21.333333-4.266667 29.866667-12.8L512 571.733333l268.8 268.8c8.533333 8.533333 19.2 12.8 29.866667 12.8s21.333333-4.266667 29.866666-12.8c17.066667-17.066667 17.066667-42.666667 0-59.733333L571.733333 512z\" p-id=\"2131\">\\n</path>\\n</svg>',airplay:'<svg width=\"18px\" height=\"18px\" viewBox=\"0 0 18 18\" xmlns=\"http://www.w3.org/2000/svg\">\\n    <g>\\n        <path d=\"M16,1 L2,1 C1.447,1 1,1.447 1,2 L1,12 C1,12.553 1.447,13 2,13 L5,13 L5,11 L3,11 L3,3 L15,3 L15,11 L13,11 L13,13 L16,13 C16.553,13 17,12.553 17,12 L17,2 C17,1.447 16.553,1 16,1 L16,1 Z\"></path>\\n        <polygon points=\"4 17 14 17 9 11\"></polygon>\\n    </g>\\n</svg>\\n',...t.option.icons};for(const r in e)H(this,r,{get:()=>S(r,e[r])})}}class kt extends dt{constructor(t){super(t),this.name=\"info\",p||this.init()}init(){const{proxy:t,constructor:e,template:{$infoPanel:r,$infoClose:a,$video:o}}=this.art;t(a,\"click\",()=>{this.show=!1});let n=null;const i=m(\"[data-video]\",r)||[];this.art.on(\"destroy\",()=>clearTimeout(n)),function t(){for(let e=0;e<i.length;e++){const t=i[e],r=o[t.dataset.video],a=\"number\"===typeof r?r.toFixed(2):r;t.textContent!==a&&(t.textContent=a)}n=setTimeout(t,e.INFO_LOOP_TIME)}()}}class $t extends dt{constructor(t){super(t);const{option:e,template:{$layer:r}}=t;this.name=\"layer\",this.$parent=r;for(let a=0;a<e.layers.length;a++)this.add(e.layers[a])}}class Tt extends dt{constructor(t){super(t),this.name=\"loading\",y(t.template.$loading,t.icons.loading)}}class Et extends dt{constructor(t){super(t),this.name=\"mask\";const{template:e,icons:r,events:a}=t,o=y(e.$state,r.state),n=y(e.$state,r.error);w(n,\"display\",\"none\"),t.on(\"destroy\",()=>{w(o,\"display\",\"none\"),w(n,\"display\",null)}),a.proxy(e.$state,\"click\",()=>t.play())}}class Ct{constructor(t){this.art=t,this.timer=null,t.on(\"destroy\",()=>this.destroy())}destroy(){this.timer&&(clearTimeout(this.timer),this.timer=null)}set show(t){const{constructor:e,template:{$player:r,$noticeInner:a}}=this.art;t?(a.textContent=t instanceof Error?t.message.trim():t,f(r,\"art-notice-show\"),clearTimeout(this.timer),this.timer=setTimeout(()=>{a.textContent=\"\",g(r,\"art-notice-show\")},e.NOTICE_TIME)):g(r,\"art-notice-show\")}get show(){const{template:{$player:t}}=this.art;return t.classList.contains(\"art-notice-show\")}}const zt=[[\"requestFullscreen\",\"exitFullscreen\",\"fullscreenElement\",\"fullscreenEnabled\",\"fullscreenchange\",\"fullscreenerror\"],[\"webkitRequestFullscreen\",\"webkitExitFullscreen\",\"webkitFullscreenElement\",\"webkitFullscreenEnabled\",\"webkitfullscreenchange\",\"webkitfullscreenerror\"],[\"webkitRequestFullScreen\",\"webkitCancelFullScreen\",\"webkitCurrentFullScreenElement\",\"webkitCancelFullScreen\",\"webkitfullscreenchange\",\"webkitfullscreenerror\"],[\"mozRequestFullScreen\",\"mozCancelFullScreen\",\"mozFullScreenElement\",\"mozFullScreenEnabled\",\"mozfullscreenchange\",\"mozfullscreenerror\"],[\"msRequestFullscreen\",\"msExitFullscreen\",\"msFullscreenElement\",\"msFullscreenEnabled\",\"MSFullscreenChange\",\"MSFullscreenError\"]],Lt=(()=>{if(\"undefined\"===typeof document)return!1;const t=zt[0],e={};for(const r of zt){if(r[1]in document){for(const[a,o]of r.entries())e[t[a]]=o;return e}}return!1})(),St={change:Lt.fullscreenchange,error:Lt.fullscreenerror},Mt={request:(t=document.documentElement,e)=>new Promise((r,a)=>{const o=()=>{Mt.off(\"change\",o),r()};Mt.on(\"change\",o);const n=t[Lt.requestFullscreen](e);n instanceof Promise&&n.then(o).catch(a)}),exit:()=>new Promise((t,e)=>{if(!Mt.isFullscreen)return void t();const r=()=>{Mt.off(\"change\",r),t()};Mt.on(\"change\",r);const a=document[Lt.exitFullscreen]();a instanceof Promise&&a.then(r).catch(e)}),toggle:(t,e)=>Mt.isFullscreen?Mt.exit():Mt.request(t,e),onchange(t){Mt.on(\"change\",t)},onerror(t){Mt.on(\"error\",t)},on(t,e){const r=St[t];r&&document.addEventListener(r,e,!1)},off(t,e){const r=St[t];r&&document.removeEventListener(r,e,!1)},raw:Lt};function It(t){const{i18n:e,notice:r,template:{$video:a,$player:o}}=t;t.once(\"video:loadedmetadata\",()=>{var n;Mt.isEnabled?(n=t,Mt.on(\"change\",()=>{n.emit(\"fullscreen\",Mt.isFullscreen),Mt.isFullscreen?(n.state=\"fullscreen\",f(o,\"art-fullscreen\")):g(o,\"art-fullscreen\"),n.emit(\"resize\")}),Mt.on(\"error\",t=>{n.emit(\"fullscreenError\",t)}),H(n,\"fullscreen\",{get:()=>Mt.isFullscreen,async set(t){t?await Mt.request(o):await Mt.exit()}})):a.webkitSupportsFullscreen?(t=>{t.on(\"document:webkitfullscreenchange\",()=>{t.emit(\"fullscreen\",t.fullscreen),t.emit(\"resize\")}),H(t,\"fullscreen\",{get:()=>document.fullscreenElement===a,set(e){e?(t.state=\"fullscreen\",a.webkitEnterFullscreen()):a.webkitExitFullscreen()}})})(t):H(t,\"fullscreen\",{get:()=>!1,set(){r.show=e.get(\"Fullscreen Not Supported\")}}),H(t,\"fullscreen\",U(t,\"fullscreen\"))})}function Pt(t){const{icons:e,proxy:r,storage:a,template:{$player:o,$video:n}}=t;let i=!1,s=0,l=0;function c(){const{$mini:e}=t.template;e&&(g(o,\"art-mini\"),w(e,\"display\",\"none\"),o.prepend(n),t.emit(\"mini\",!1))}function d(e,r){t.playing?(w(e,\"display\",\"none\"),w(r,\"display\",\"flex\")):(w(e,\"display\",\"flex\"),w(r,\"display\",\"none\"))}function p(){const{$mini:e}=t.template,r=P(e),o=window.innerHeight-r.height-50,n=window.innerWidth-r.width-50;a.set(\"top\",o),a.set(\"left\",n),w(e,\"top\",`${o}px`),w(e,\"left\",`${n}px`)}H(t,\"mini\",{get:()=>v(o,\"art-mini\"),set(h){if(h){t.state=\"mini\",f(o,\"art-mini\");const h=function(){const{$mini:o}=t.template;if(o)return y(o,n),w(o,\"display\",\"flex\");{const o=L(\"div\");f(o,\"art-mini-popup\"),y(document.body,o),t.template.$mini=o,y(o,n);const p=y(o,'<div class=\"art-mini-close\"></div>');y(p,e.close),r(p,\"click\",c);const h=y(o,'<div class=\"art-mini-state\"></div>'),u=y(h,e.play),m=y(h,e.pause);return r(u,\"click\",()=>t.play()),r(m,\"click\",()=>t.pause()),d(u,m),t.on(\"video:playing\",()=>d(u,m)),t.on(\"video:pause\",()=>d(u,m)),t.on(\"video:timeupdate\",()=>d(u,m)),r(o,\"mousedown\",t=>{i=0===t.button,s=t.pageX,l=t.pageY}),t.on(\"document:mousemove\",t=>{if(i){f(o,\"art-mini-dragging\");const e=t.pageX-s,r=t.pageY-l;w(o,\"transform\",`translate(${e}px, ${r}px)`)}}),t.on(\"document:mouseup\",()=>{if(i){i=!1,g(o,\"art-mini-dragging\");const t=P(o);a.set(\"left\",t.left),a.set(\"top\",t.top),w(o,\"left\",`${t.left}px`),w(o,\"top\",`${t.top}px`),w(o,\"transform\",null)}}),o}}(),u=a.get(\"top\"),m=a.get(\"left\");\"number\"===typeof u&&\"number\"===typeof m?(w(h,\"top\",`${u}px`),w(h,\"left\",`${m}px`),E(h)||p()):p(),t.emit(\"mini\",!0)}else c()}})}function At(t){const{i18n:e,notice:r,template:{$video:a}}=t;document.pictureInPictureEnabled?function(t){const{template:{$video:e},proxy:r,notice:a}=t;e.disablePictureInPicture=!1,H(t,\"pip\",{get:()=>document.pictureInPictureElement,set(r){r?(t.state=\"pip\",e.requestPictureInPicture().catch(t=>{throw a.show=t,t})):document.exitPictureInPicture().catch(t=>{throw a.show=t,t})}}),r(e,\"enterpictureinpicture\",()=>{t.emit(\"pip\",!0)}),r(e,\"leavepictureinpicture\",()=>{t.emit(\"pip\",!1)})}(t):a.webkitSupportsPresentationMode?function(t){const{$video:e}=t.template;e.webkitSetPresentationMode(\"inline\"),H(t,\"pip\",{get:()=>\"picture-in-picture\"===e.webkitPresentationMode,set(r){r?(t.state=\"pip\",e.webkitSetPresentationMode(\"picture-in-picture\"),t.emit(\"pip\",!0)):(e.webkitSetPresentationMode(\"inline\"),t.emit(\"pip\",!1))}})}(t):H(t,\"pip\",{get:()=>!1,set(){r.show=e.get(\"PIP Not Supported\")}})}function Rt(t){const{option:e,template:{$progress:r,$video:a}}=t;let o=null,n=!1,i=null;t.on(\"setBar\",async(o,s,l)=>{const c=t.controls?.thumbnails,{url:d,scale:h}=e.thumbnails;if(!c||!d)return;if(\"hover\"===o||\"played\"===o&&l&&p){if(i||n||(n=!0,i=await A(d,h),n=!1),!i)return;const o=r.clientWidth*s;o>0&&o<r.clientWidth&&function(o){const n=t.controls?.thumbnails;if(!n)return;const{number:s,column:l,width:c,height:d,scale:p}=e.thumbnails,h=c*p||i.naturalWidth/l,u=d*p||h/(a.videoWidth/a.videoHeight),m=r.clientWidth/s,f=Math.floor(o/m),g=Math.ceil(f/l)-1,v=f%l||l-1;w(n,\"backgroundImage\",`url(${i.src})`),w(n,\"height\",`${u}px`),w(n,\"width\",`${h}px`),w(n,\"backgroundPosition\",`-${v*h}px -${g*u}px`),o<=h/2?w(n,\"left\",0):o>r.clientWidth-h/2?w(n,\"left\",r.clientWidth-h+\"px\"):w(n,\"left\",o-h/2+\"px\")}(o)}}),H(t,\"thumbnails\",{get:()=>t.option.thumbnails,set(e){e.url&&!t.option.isLive&&(t.option.thumbnails=e,clearTimeout(o),o=null,n=!1,i=null)}})}Object.defineProperties(Mt,{isFullscreen:{get:()=>Boolean(document[Lt.fullscreenElement])},element:{enumerable:!0,get:()=>document[Lt.fullscreenElement]},isEnabled:{enumerable:!0,get:()=>Boolean(document[Lt.fullscreenEnabled])}});class Ot{constructor(t){!function(t){const{option:e,template:{$video:r}}=t;H(t,\"url\",{get:()=>r.src,async set(a){if(a){const o=t.url,n=e.type||V(a),i=e.customType[n];n&&i?(await Z(),t.loading.show=!0,i.call(t,r,a,t)):(URL.revokeObjectURL(o),r.src=a),o!==t.url&&(t.option.url=a,t.isReady&&o&&t.once(\"video:canplay\",()=>{t.emit(\"restart\",a)}))}else await Z(),t.loading.show=!0}})}(t),function(t){const{template:{$video:e}}=t;H(t,\"attr\",{value(t,r){if(void 0===r)return e[t];e[t]=r}})}(t),function(t){const{i18n:e,notice:r,option:a,constructor:{instances:o},template:{$video:n}}=t;H(t,\"play\",{async value(){const i=await n.play();if(r.show=e.get(\"Play\"),t.emit(\"play\"),a.mutex)for(let e=0;e<o.length;e++){const r=o[e];r!==t&&r.pause()}return i}})}(t),function(t){const{template:{$video:e},i18n:r,notice:a}=t;H(t,\"pause\",{value(){const o=e.pause();return a.show=r.get(\"Pause\"),t.emit(\"pause\"),o}})}(t),function(t){H(t,\"toggle\",{value:()=>t.playing?t.pause():t.play()})}(t),function(t){const{notice:e}=t;H(t,\"seek\",{set(r){t.currentTime=r,t.duration&&(e.show=`${F(t.currentTime)} / ${F(t.duration)}`),t.emit(\"seek\",t.currentTime,r)}}),H(t,\"forward\",{set(e){t.seek=t.currentTime+e}}),H(t,\"backward\",{set(e){t.seek=t.currentTime-e}})}(t),function(t){const{template:{$video:e},i18n:r,notice:a,storage:o}=t;H(t,\"volume\",{get:()=>e.volume||0,set:t=>{e.volume=D(t,0,1),a.show=`${r.get(\"Volume\")}: ${Number.parseInt(100*e.volume,10)}`,0!==e.volume&&o.set(\"volume\",e.volume)}}),H(t,\"muted\",{get:()=>e.muted,set:r=>{e.muted=r,t.emit(\"muted\",r)}})}(t),function(t){const{$video:e}=t.template;H(t,\"currentTime\",{get:()=>e.currentTime||0,set:r=>{r=Number.parseFloat(r),Number.isNaN(r)||(e.currentTime=D(r,0,t.duration))}})}(t),function(t){H(t,\"duration\",{get:()=>{const{duration:e}=t.template.$video;return e===1/0?0:e||0}})}(t),function(t){function e(e,r){return new Promise((a,o)=>{if(e===t.url)return void a();const{playing:n,aspectRatio:i,playbackRate:s}=t;t.pause(),t.url=e,t.notice.show=\"\";const l={error:e=>{t.off(\"video:canplay\",l.canplay),t.off(\"video:loadedmetadata\",l.metadata),o(e)},metadata:()=>{t.currentTime=r},canplay:async()=>{t.off(\"video:error\",l.error),t.playbackRate=s,t.aspectRatio=i,n&&await t.play(),t.notice.show=\"\",a()}};t.once(\"video:error\",l.error),t.once(\"video:loadedmetadata\",l.metadata),t.once(\"video:canplay\",l.canplay)})}H(t,\"switchQuality\",{value:r=>e(r,t.currentTime)}),H(t,\"switchUrl\",{value:t=>e(t,0)}),H(t,\"switch\",{set:t.switchUrl})}(t),function(t){const{template:{$video:e},i18n:r,notice:a}=t;H(t,\"playbackRate\",{get:()=>e.playbackRate,set(o){if(o){if(o===e.playbackRate)return;e.playbackRate=o,a.show=`${r.get(\"Rate\")}: ${1===o?r.get(\"Normal\"):`${o}x`}`}else t.playbackRate=1}})}(t),function(t){const{i18n:e,notice:r,template:{$video:a,$player:o}}=t;H(t,\"aspectRatio\",{get:()=>o.dataset.aspectRatio||\"default\",set(n){if(n||(n=\"default\"),\"default\"===n)w(a,\"width\",null),w(a,\"height\",null),w(a,\"margin\",null),delete o.dataset.aspectRatio;else{const t=n.split(\":\").map(Number),{clientWidth:e,clientHeight:r}=o,i=e/r,s=t[0]/t[1];i>s?(w(a,\"width\",s*r+\"px\"),w(a,\"height\",\"100%\"),w(a,\"margin\",\"0 auto\")):(w(a,\"width\",\"100%\"),w(a,\"height\",e/s+\"px\"),w(a,\"margin\",\"auto 0\")),o.dataset.aspectRatio=n}r.show=`${e.get(\"Aspect Ratio\")}: ${\"default\"===n?e.get(\"Default\"):n}`,t.emit(\"aspectRatio\",n)}})}(t),function(t){const{notice:e,template:{$video:r}}=t,a=L(\"canvas\");H(t,\"getDataURL\",{value:()=>new Promise((t,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext(\"2d\").drawImage(r,0,0),t(a.toDataURL(\"image/png\"))}catch(n){e.show=n,o(n)}})}),H(t,\"getBlobUrl\",{value:()=>new Promise((t,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext(\"2d\").drawImage(r,0,0),a.toBlob(e=>{t(URL.createObjectURL(e))})}catch(n){e.show=n,o(n)}})}),H(t,\"screenshot\",{value:async e=>{const a=await t.getDataURL();return Y(a,`${e||`artplayer_${F(r.currentTime)}`}.png`),t.emit(\"screenshot\",a),a}})}(t),It(t),function(t){const{constructor:e,template:{$container:r,$player:a}}=t;let o=\"\";H(t,\"fullscreenWeb\",{get:()=>v(a,\"art-fullscreen-web\"),set(n){n?(o=a.style.cssText,e.FULLSCREEN_WEB_IN_BODY&&y(document.body,a),t.state=\"fullscreenWeb\",w(a,\"width\",\"100%\"),w(a,\"height\",\"100%\"),f(a,\"art-fullscreen-web\"),t.emit(\"fullscreenWeb\",!0)):(e.FULLSCREEN_WEB_IN_BODY&&y(r,a),o&&(a.style.cssText=o,o=\"\"),g(a,\"art-fullscreen-web\"),t.emit(\"fullscreenWeb\",!1)),t.emit(\"resize\")}})}(t),At(t),function(t){const{$video:e}=t.template;H(t,\"loaded\",{get:()=>t.loadedTime/e.duration}),H(t,\"loadedTime\",{get:()=>e.buffered.length?e.buffered.end(e.buffered.length-1):0})}(t),function(t){H(t,\"played\",{get:()=>t.currentTime/t.duration})}(t),function(t){const{$video:e}=t.template;H(t,\"playing\",{get:()=>\"boolean\"===typeof e.playing?e.playing:!!(e.currentTime>0&&!e.paused&&!e.ended&&e.readyState>2)})}(t),function(t){const{$container:e,$player:r,$video:a}=t.template;H(t,\"autoSize\",{value(){const{videoWidth:o,videoHeight:n}=a,{width:i,height:s}=P(e),l=o/n;if(i/s>l)w(r,\"width\",s*l/i*100+\"%\"),w(r,\"height\",\"100%\");else{const t=i/l/s*100;w(r,\"width\",\"100%\"),w(r,\"height\",`${t}%`)}t.emit(\"autoSize\",{width:t.width,height:t.height})}})}(t),function(t){H(t,\"rect\",{get:()=>P(t.template.$player)});const e=[\"bottom\",\"height\",\"left\",\"right\",\"top\",\"width\"];for(let r=0;r<e.length;r++){const a=e[r];H(t,a,{get:()=>t.rect[a]})}H(t,\"x\",{get:()=>t.left+window.pageXOffset}),H(t,\"y\",{get:()=>t.top+window.pageYOffset})}(t),function(t){const{template:{$player:e},i18n:r,notice:a}=t;H(t,\"flip\",{get:()=>e.dataset.flip||\"normal\",set(o){o||(o=\"normal\"),\"normal\"===o?delete e.dataset.flip:e.dataset.flip=o,a.show=`${r.get(\"Video Flip\")}: ${r.get(N(o))}`,t.emit(\"flip\",o)}})}(t),Pt(t),function(t){const{template:{$poster:e}}=t;H(t,\"poster\",{get:()=>{try{return e.style.backgroundImage.match(/\"(.*)\"/)[1]}catch{return\"\"}},set(t){w(e,\"backgroundImage\",`url(${t})`)}})}(t),function(t){const{template:{$container:e,$video:r}}=t;H(t,\"autoHeight\",{value(){const{clientWidth:a}=e,{videoHeight:o,videoWidth:n}=r,i=o*(a/n);w(e,\"height\",`${i}px`),t.emit(\"autoHeight\",i)}})}(t),function(t){const{$player:e}=t.template;H(t,\"cssVar\",{value:(t,r)=>r?e.style.setProperty(t,r):getComputedStyle(e).getPropertyValue(t)})}(t),function(t){H(t,\"theme\",{get:()=>t.cssVar(\"--art-theme\"),set(e){t.cssVar(\"--art-theme\",e)}})}(t),function(t){H(t,\"type\",{get:()=>t.option.type,set(e){t.option.type=e}})}(t),function(t){const e=[\"mini\",\"pip\",\"fullscreen\",\"fullscreenWeb\"];H(t,\"state\",{get:()=>e.find(e=>t[e])||\"standard\",set(r){for(let a=0;a<e.length;a++){const o=e[a];o!==r&&t[o]&&(t[o]=!1)}}})}(t),function(t){const{notice:e,i18n:r,template:a}=t;H(t,\"subtitleOffset\",{get:()=>a.$track?.offset||0,set(o){const{cues:n}=t.subtitle;if(!a.$track||0===n.length)return;const i=D(o,-10,10);a.$track.offset=i;for(let e=0;e<n.length;e++){const r=n[e];r.originalStartTime=r.originalStartTime??r.startTime,r.originalEndTime=r.originalEndTime??r.endTime,r.startTime=D(r.originalStartTime+i,0,t.duration),r.endTime=D(r.originalEndTime+i,0,t.duration)}t.subtitle.update(),e.show=`${r.get(\"Subtitle Offset\")}: ${o}s`,t.emit(\"subtitleOffset\",o)}})}(t),function(t){const{i18n:e,notice:r,proxy:a,template:{$video:o}}=t;let n=!0;window.WebKitPlaybackTargetAvailabilityEvent&&o.webkitShowPlaybackTargetPicker?a(o,\"webkitplaybacktargetavailabilitychanged\",t=>{switch(t.availability){case\"available\":n=!0;break;case\"not-available\":n=!1}}):n=!1,H(t,\"airplay\",{value(){n?(o.webkitShowPlaybackTargetPicker(),t.emit(\"airplay\")):r.show=e.get(\"AirPlay Not Available\")}})}(t),function(t){H(t,\"quality\",{set(e){const{controls:r,notice:a,i18n:o}=t,n=e.find(t=>t.default)||e[0];r.update({name:\"quality\",position:\"right\",index:10,style:{marginRight:\"10px\"},html:n?.html||\"\",selector:e,onSelect:async e=>(await t.switchQuality(e.url),a.show=`${o.get(\"Switch Video\")}: ${e.html}`,e.html)})}})}(t),Rt(t),function(t){const{i18n:e,notice:r,option:a,constructor:o,proxy:n,template:{$player:s,$video:l,$poster:c}}=t;let d=0;for(let p=0;p<i.events.length;p++)n(l,i.events[p],e=>{t.emit(`video:${e.type}`,e)});t.on(\"video:canplay\",()=>{d=0,t.loading.show=!1}),t.once(\"video:canplay\",()=>{t.loading.show=!1,t.controls.show=!0,t.mask.show=!0,t.isReady=!0,t.emit(\"ready\")}),t.on(\"video:ended\",()=>{a.loop?(t.seek=0,t.play(),t.controls.show=!1,t.mask.show=!1):(t.controls.show=!0,t.mask.show=!0)}),t.on(\"video:error\",async n=>{d<o.RECONNECT_TIME_MAX?(await Z(o.RECONNECT_SLEEP_TIME),d+=1,t.url=a.url,r.show=`${e.get(\"Reconnect\")}: ${d}`,t.emit(\"error\",n,d)):(t.mask.show=!0,t.loading.show=!1,t.controls.show=!0,f(s,\"art-error\"),await Z(o.RECONNECT_SLEEP_TIME),r.show=e.get(\"Video Load Failed\"))}),t.on(\"video:loadedmetadata\",()=>{t.emit(\"resize\"),p&&(t.loading.show=!1,t.controls.show=!0,t.mask.show=!0)}),t.on(\"video:loadstart\",()=>{t.loading.show=!0,t.mask.show=!1,t.controls.show=!0}),t.on(\"video:pause\",()=>{t.controls.show=!0,t.mask.show=!0}),t.on(\"video:play\",()=>{t.mask.show=!1,w(c,\"display\",\"none\")}),t.on(\"video:playing\",()=>{t.mask.show=!1}),t.on(\"video:progress\",()=>{t.playing&&(t.loading.show=!1)}),t.on(\"video:seeked\",()=>{t.loading.show=!1,t.mask.show=!0}),t.on(\"video:seeking\",()=>{t.loading.show=!0,t.mask.show=!1}),t.on(\"video:timeupdate\",()=>{t.mask.show=!1}),t.on(\"video:waiting\",()=>{t.loading.show=!0,t.mask.show=!1})}(t),function(t){const{option:e,storage:r,template:{$video:a,$poster:o}}=t;for(const i in e.moreVideoAttr)t.attr(i,e.moreVideoAttr[i]);e.muted&&(t.muted=e.muted),e.volume&&(a.volume=D(e.volume,0,1));const n=r.get(\"volume\");\"number\"===typeof n&&(a.volume=D(n,0,1)),e.poster&&w(o,\"backgroundImage\",`url(${e.poster})`),e.autoplay&&(a.autoplay=e.autoplay),e.playsInline&&(a.playsInline=!0,a[\"webkit-playsinline\"]=!0),e.theme&&(e.cssVar[\"--art-theme\"]=e.theme);for(const i in e.cssVar)t.cssVar(i,e.cssVar[i]);t.url=e.url}(t)}}function _t(t){const{notice:e,constructor:r,template:{$player:a,$video:o}}=t,n=\"art-auto-orientation\",i=\"art-auto-orientation-fullscreen\";let s=!1;function l(){const{videoWidth:t,videoHeight:e}=o,r=document.documentElement.clientWidth,a=document.documentElement.clientHeight;return t>e&&r<a||t<e&&r>a}return t.on(\"fullscreenWeb\",e=>{if(e){if(l()){const e=Number(r.AUTO_ORIENTATION_TIME??0);setTimeout(()=>{t.fullscreenWeb&&!v(a,n)&&function(){const e=document.documentElement.clientWidth,r=document.documentElement.clientHeight;w(a,\"width\",`${r}px`),w(a,\"height\",`${e}px`),w(a,\"transform-origin\",\"0 0\"),w(a,\"transform\",`rotate(90deg) translate(0, -${e}px)`),f(a,n),t.isRotate=!0,t.emit(\"resize\")}()},e)}}else v(a,n)&&(w(a,\"width\",\"\"),w(a,\"height\",\"\"),w(a,\"transform-origin\",\"\"),w(a,\"transform\",\"\"),g(a,n),t.isRotate=!1,t.emit(\"resize\"))}),t.on(\"fullscreen\",async t=>{const r=!!screen?.orientation?.lock;if(t){if(r&&l())try{const t=screen.orientation.type.startsWith(\"portrait\")?\"landscape\":\"portrait\";await screen.orientation.lock(t),s=!0,f(a,i)}catch(o){s=!1,e.show=o}}else if(v(a,i)&&g(a,i),r&&s){try{screen.orientation.unlock()}catch{}s=!1}}),{name:\"autoOrientation\",get state(){return v(a,n)}}}function Vt(t){const{i18n:e,icons:r,storage:a,constructor:o,proxy:n,template:{$poster:i}}=t,s=t.layers.add({name:\"auto-playback\",html:'\\n            <div class=\"art-auto-playback-close\"></div>\\n            <div class=\"art-auto-playback-last\"></div>\\n            <div class=\"art-auto-playback-jump\"></div>\\n        '}),l=u(\".art-auto-playback-last\",s),c=u(\".art-auto-playback-jump\",s),d=u(\".art-auto-playback-close\",s);y(d,r.close);let p=null;function h(){const r=(a.get(\"times\")||{})[t.option.id||t.option.url];clearTimeout(p),w(s,\"display\",\"none\"),r&&r>=o.AUTO_PLAYBACK_MIN&&(w(s,\"display\",\"flex\"),l.textContent=`${e.get(\"Last Seen\")} ${F(r)}`,c.textContent=e.get(\"Jump Play\"),n(d,\"click\",()=>{w(s,\"display\",\"none\")}),n(c,\"click\",()=>{t.seek=r,t.play(),w(i,\"display\",\"none\"),w(s,\"display\",\"none\")}),t.once(\"video:timeupdate\",()=>{p=setTimeout(()=>{w(s,\"display\",\"none\")},o.AUTO_PLAYBACK_TIMEOUT)}))}return t.on(\"video:timeupdate\",()=>{if(t.playing){const e=a.get(\"times\")||{},r=Object.keys(e);r.length>o.AUTO_PLAYBACK_MAX&&delete e[r[0]],e[t.option.id||t.option.url]=t.currentTime,a.set(\"times\",e)}}),t.on(\"ready\",h),t.on(\"restart\",h),{name:\"auto-playback\",get times(){return a.get(\"times\")||{}},clear:()=>a.del(\"times\"),delete(t){const e=a.get(\"times\")||{};return delete e[t],a.set(\"times\",e),e}}}function Yt(t){const{constructor:e,proxy:r,template:{$player:a,$video:o}}=t;let n=null,i=!1,s=1;const l=()=>{clearTimeout(n),i&&(i=!1,t.playbackRate=s,g(a,\"art-fast-forward\"))};return r(o,\"touchstart\",r=>{1===r.touches.length&&t.playing&&!t.isLock&&(n=setTimeout(()=>{i=!0,s=t.playbackRate,t.playbackRate=e.FAST_FORWARD_VALUE,f(a,\"art-fast-forward\")},e.FAST_FORWARD_TIME))}),t.on(\"document:touchmove\",l),t.on(\"document:touchend\",l),{name:\"fastForward\",get state(){return v(a,\"art-fast-forward\")}}}function Dt(t){const{layers:e,icons:r,template:{$player:a}}=t;function o(){return v(a,\"art-lock\")}function n(){f(a,\"art-lock\"),t.isLock=!0,t.emit(\"lock\",!0)}function i(){g(a,\"art-lock\"),t.isLock=!1,t.emit(\"lock\",!1)}return e.add({name:\"lock\",mounted(e){const a=y(e,r.lock),o=y(e,r.unlock);w(a,\"display\",\"none\"),t.on(\"lock\",t=>{t?(w(a,\"display\",\"inline-flex\"),w(o,\"display\",\"none\")):(w(a,\"display\",\"none\"),w(o,\"display\",\"inline-flex\"))})},click(){o()?i():n()}}),{name:\"lock\",get state(){return o()},set state(t){t?n():i()}}}function Nt(t){return t.on(\"control\",e=>{e?g(t.template.$player,\"art-mini-progress-bar\"):f(t.template.$player,\"art-mini-progress-bar\")}),{name:\"mini-progress-bar\"}}class Ft{constructor(t){this.art=t,this.id=0;const{option:e}=t;e.miniProgressBar&&!e.isLive&&this.add(Nt),e.lock&&p&&this.add(Dt),e.autoPlayback&&!e.isLive&&this.add(Vt),e.autoOrientation&&p&&this.add(_t),e.fastForward&&p&&!e.isLive&&this.add(Yt);for(let r=0;r<e.plugins.length;r++)this.add(e.plugins[r])}add(t){this.id+=1;const e=t.call(this.art,this.art);return e instanceof Promise?e.then(e=>this.next(t,e)):this.next(t,e)}next(t,e){const r=e&&e.name||t.name||`plugin${this.id}`;return _(!j(this,r),`Cannot add a plugin that already has the same name: ${r}`),H(this,r,{value:e}),this}}class Bt extends dt{constructor(t){super(t);const{option:e,controls:r,template:{$setting:a}}=t;this.name=\"setting\",this.$parent=a,this.id=0,this.active=null,this.cache=new Map,this.option=[...this.builtin,...e.settings],e.setting&&(this.format(),this.render(),t.on(\"blur\",()=>{this.show&&(this.show=!1,this.render())}),t.on(\"focus\",t=>{const e=C(t,r.setting),a=C(t,this.$parent);!this.show||e||a||(this.show=!1,this.render())}),t.on(\"resize\",()=>this.resize()))}get builtin(){const t=[],{option:e}=this.art;return e.playbackRate&&t.push(function(t){const{i18n:e,icons:r,constructor:{SETTING_ITEM_WIDTH:a,PLAYBACK_RATE:o}}=t;function n(t){return 1===t?e.get(\"Normal\"):t.toFixed(1)}function i(){const e=t.setting.find(`playback-rate-${t.playbackRate}`);t.setting.check(e)}return{width:a,name:\"playback-rate\",html:e.get(\"Play Speed\"),tooltip:n(t.playbackRate),icon:r.playbackRate,selector:o.map(e=>({value:e,name:`playback-rate-${e}`,default:e===t.playbackRate,html:n(e)})),onSelect:e=>(t.playbackRate=e.value,e.html),mounted:()=>{i(),t.on(\"video:ratechange\",()=>i())}}}(this.art)),e.aspectRatio&&t.push(function(t){const{i18n:e,icons:r,constructor:{SETTING_ITEM_WIDTH:a,ASPECT_RATIO:o}}=t;function n(t){return\"default\"===t?e.get(\"Default\"):t}function i(){const e=t.setting.find(`aspect-ratio-${t.aspectRatio}`);t.setting.check(e)}return{width:a,name:\"aspect-ratio\",html:e.get(\"Aspect Ratio\"),icon:r.aspectRatio,tooltip:n(t.aspectRatio),selector:o.map(e=>({value:e,name:`aspect-ratio-${e}`,default:e===t.aspectRatio,html:n(e)})),onSelect:e=>(t.aspectRatio=e.value,e.html),mounted:()=>{i(),t.on(\"aspectRatio\",()=>i())}}}(this.art)),e.flip&&t.push(function(t){const{i18n:e,icons:r,constructor:{SETTING_ITEM_WIDTH:a,FLIP:o}}=t;function n(t){return e.get(N(t))}function i(){const e=t.setting.find(`flip-${t.flip}`);t.setting.check(e)}return{width:a,name:\"flip\",html:e.get(\"Video Flip\"),tooltip:n(t.flip),icon:r.flip,selector:o.map(e=>({value:e,name:`flip-${e}`,default:e===t.flip,html:n(e)})),onSelect:e=>(t.flip=e.value,e.html),mounted:()=>{i(),t.on(\"flip\",()=>i())}}}(this.art)),e.subtitleOffset&&t.push(function(t){const{i18n:e,icons:r,constructor:a}=t;return{width:a.SETTING_ITEM_WIDTH,name:\"subtitle-offset\",html:e.get(\"Subtitle Offset\"),icon:r.subtitle,tooltip:\"0s\",range:[0,-10,10,.1],onChange:e=>(t.subtitleOffset=e.range[0],`${e.range[0]}s`),mounted:(e,r)=>{t.on(\"subtitleOffset\",t=>{r.$range.value=t,r.tooltip=`${t}s`})}}}(this.art)),t}traverse(t,e=this.option){for(let r=0;r<e.length;r++){const a=e[r];t(a),a.selector?.length&&this.traverse(t,a.selector)}}check(t){t&&(t.$parent.tooltip=t.html,this.traverse(e=>{e.default=e===t,e.default&&e.$item&&$(e.$item,\"art-current\")},t.$option),this.render(t.$parents))}format(t=this.option,e,r,a=[]){for(let o=0;o<t.length;o++){const n=t[o];if(n?.name?(_(!a.includes(n.name),`The [${n.name}] already exists in [setting]`),a.push(n.name)):n.name=\"setting-\"+this.id++,!n.$formatted){H(n,\"$parent\",{get:()=>e}),H(n,\"$parents\",{get:()=>r}),H(n,\"$option\",{get:()=>t});const a=[];H(n,\"$events\",{get:()=>a}),H(n,\"$formatted\",{get:()=>!0})}this.format(n.selector||[],n,t,a)}this.option=t}find(t=\"\"){let e=null;return this.traverse(r=>{r.name===t&&(e=r)}),e}resize(){const{controls:t,constructor:{SETTING_WIDTH:e,SETTING_ITEM_HEIGHT:r},template:{$player:a,$setting:o}}=this.art;if(t.setting&&this.show){const n=this.active[0]?.$parent?.width||e,{left:i,width:s}=P(t.setting),{left:l,width:c}=P(a),d=i-l+s/2-n/2;if(w(o,\"height\",`${this.active===this.option?this.active.length*r:(this.active.length+1)*r}px`),w(o,\"width\",`${n}px`),this.art.isRotate||p)return;d+n>c?(w(o,\"left\",null),w(o,\"right\",null)):(w(o,\"left\",`${d}px`),w(o,\"right\",\"auto\"))}}inactivate(t){for(let e=0;e<t.$events.length;e++)this.art.events.remove(t.$events[e]);t.$events.length=0}remove(t){const e=this.find(t);_(e,`Can't find [${t}] in the [setting]`);const r=e.$option.indexOf(e);e.$option.splice(r,1),this.inactivate(e),e.$item&&b(e.$item),this.render()}update(t){const e=this.find(t.name);return e?(this.inactivate(e),Object.assign(e,t),this.format(),this.createItem(e,!0),this.render(),e):this.add(t)}add(t,e=this.option){return e.push(t),this.format(),this.createItem(t),this.render(),t}createHeader(t){if(!this.cache.has(t.$option))return;const e=this.cache.get(t.$option),{proxy:r,icons:{arrowLeft:a},constructor:{SETTING_ITEM_HEIGHT:o}}=this.art,n=L(\"div\");w(n,\"height\",`${o}px`),f(n,\"art-setting-item\"),f(n,\"art-setting-item-back\");const i=y(n,'<div class=\"art-setting-item-left\"></div>'),s=L(\"div\");f(s,\"art-setting-item-left-icon\"),y(s,a),y(i,s),y(i,t.$parent.html);const l=r(n,\"click\",()=>this.render(t.$parents));t.$parent.$events.push(l),y(e,n)}createItem(t,e=!1){if(!this.cache.has(t.$option))return;const r=this.cache.get(t.$option),a=t.$item;let o=\"selector\";j(t,\"switch\")&&(o=\"switch\"),j(t,\"range\")&&(o=\"range\"),j(t,\"onClick\")&&(o=\"button\");const{icons:n,proxy:i,constructor:s}=this.art,l=L(\"div\");f(l,\"art-setting-item\"),w(l,\"height\",`${s.SETTING_ITEM_HEIGHT}px`),l.dataset.name=t.name||\"\",l.dataset.value=t.value||\"\";const c=y(l,'<div class=\"art-setting-item-left\"></div>'),d=y(l,'<div class=\"art-setting-item-right\"></div>'),p=L(\"div\");switch(f(p,\"art-setting-item-left-icon\"),o){case\"button\":case\"switch\":case\"range\":y(p,t.icon||n.config);break;case\"selector\":t.selector?.length?y(p,t.icon||n.config):y(p,n.check)}y(c,p),H(t,\"$icon\",{configurable:!0,get:()=>p}),H(t,\"icon\",{configurable:!0,get:()=>p.innerHTML,set(t){p.innerHTML=\"\",y(p,t)}});const h=L(\"div\");f(h,\"art-setting-item-left-text\"),y(h,t.html||\"\"),y(c,h),H(t,\"$html\",{configurable:!0,get:()=>h}),H(t,\"html\",{configurable:!0,get:()=>h.innerHTML,set(t){h.innerHTML=\"\",y(h,t)}});const u=L(\"div\");switch(f(u,\"art-setting-item-right-tooltip\"),y(u,t.tooltip||\"\"),y(d,u),H(t,\"$tooltip\",{configurable:!0,get:()=>u}),H(t,\"tooltip\",{configurable:!0,get:()=>u.innerHTML,set(t){u.innerHTML=\"\",y(u,t)}}),o){case\"switch\":{const e=L(\"div\");f(e,\"art-setting-item-right-icon\");const r=y(e,n.switchOn),a=y(e,n.switchOff);w(t.switch?a:r,\"display\",\"none\"),y(d,e),H(t,\"$switch\",{configurable:!0,get:()=>e});let o=t.switch;H(t,\"switch\",{configurable:!0,get:()=>o,set(t){o=t,t?(w(a,\"display\",\"none\"),w(r,\"display\",null)):(w(a,\"display\",null),w(r,\"display\",\"none\"))}});break}case\"range\":{const e=L(\"div\");f(e,\"art-setting-item-right-icon\");const r=y(e,'<input type=\"range\">');r.value=t.range[0],r.min=t.range[1],r.max=t.range[2],r.step=t.range[3],f(r,\"art-setting-range\"),y(d,e),H(t,\"$range\",{configurable:!0,get:()=>r});let a=[...t.range];H(t,\"range\",{configurable:!0,get:()=>a,set(t){a=[...t],r.value=t[0],r.min=t[1],r.max=t[2],r.step=t[3]}})}break;case\"selector\":if(t.selector?.length){const t=L(\"div\");f(t,\"art-setting-item-right-icon\"),y(t,n.arrowRight),y(d,t)}}switch(o){case\"switch\":if(t.onSwitch){const e=i(l,\"click\",async e=>{t.switch=await t.onSwitch.call(this.art,t,l,e)});t.$events.push(e)}break;case\"range\":if(t.$range){if(t.onRange){const e=i(t.$range,\"change\",async e=>{t.range[0]=t.$range.valueAsNumber,t.tooltip=await t.onRange.call(this.art,t,l,e)});t.$events.push(e)}if(t.onChange){const e=i(t.$range,\"input\",async e=>{t.range[0]=t.$range.valueAsNumber,t.tooltip=await t.onChange.call(this.art,t,l,e)});t.$events.push(e)}}break;case\"selector\":{const e=i(l,\"click\",async e=>{t.selector?.length?this.render(t.selector):(this.check(t),t.$parent.onSelect&&(t.$parent.tooltip=await t.$parent.onSelect.call(this.art,t,l,e)))});t.$events.push(e),t.default&&f(l,\"art-current\")}break;case\"button\":if(t.onClick){const e=i(l,\"click\",async e=>{t.tooltip=await t.onClick.call(this.art,t,l,e)});t.$events.push(e)}}H(t,\"$item\",{configurable:!0,get:()=>l}),e?z(l,a):y(r,l),t.mounted&&setTimeout(()=>t.mounted.call(this.art,t.$item,t),0)}render(t=this.option){if(this.active=t,this.cache.has(t)){$(this.cache.get(t),\"art-current\")}else{const e=L(\"div\");this.cache.set(t,e),f(e,\"art-setting-panel\"),y(this.$parent,e),$(e,\"art-current\"),t[0]?.$parent&&this.createHeader(t[0]);for(let r=0;r<t.length;r++)this.createItem(t[r])}this.resize()}}class Ht{constructor(){this.name=\"artplayer_settings\",this.settings={}}get(t){try{const e=JSON.parse(window.localStorage.getItem(this.name))||{};return t?e[t]:e}catch{return t?this.settings[t]:this.settings}}set(t,e){try{const r=Object.assign({},this.get(),{[t]:e});window.localStorage.setItem(this.name,JSON.stringify(r))}catch{this.settings[t]=e}}del(t){try{const e=this.get();delete e[t],window.localStorage.setItem(this.name,JSON.stringify(e))}catch{delete this.settings[t]}}clear(){try{window.localStorage.removeItem(this.name)}catch{this.settings={}}}}const Wt='.art-video-player{--art-theme: #f00;--art-font-color: #fff;--art-background-color: #000;--art-text-shadow-color: rgba(0, 0, 0, .5);--art-transition-duration: .2s;--art-padding: 10px;--art-border-radius: 3px;--art-progress-height: 6px;--art-progress-color: rgba(255, 255, 255, .25);--art-progress-top-gap: 10px;--art-hover-color: rgba(255, 255, 255, .25);--art-loaded-color: rgba(255, 255, 255, .25);--art-state-size: 80px;--art-state-opacity: .8;--art-bottom-height: 100px;--art-bottom-offset: 20px;--art-bottom-gap: 5px;--art-highlight-width: 8px;--art-highlight-color: rgba(255, 255, 255, .5);--art-control-height: 46px;--art-control-opacity: .75;--art-control-icon-size: 36px;--art-control-icon-scale: 1.1;--art-volume-height: 120px;--art-volume-handle-size: 14px;--art-lock-size: 36px;--art-indicator-scale: 0;--art-indicator-size: 16px;--art-fullscreen-web-index: 9999;--art-settings-icon-size: 24px;--art-settings-max-height: 300px;--art-selector-max-height: 300px;--art-contextmenus-min-width: 250px;--art-subtitle-font-size: 20px;--art-subtitle-gap: 5px;--art-subtitle-bottom: 15px;--art-subtitle-border: #000;--art-widget-background: rgba(0, 0, 0, .85);--art-tip-background: rgba(0, 0, 0, .7);--art-scrollbar-size: 4px;--art-scrollbar-background: rgba(255, 255, 255, .25);--art-scrollbar-background-hover: rgba(255, 255, 255, .5);--art-mini-progress-height: 2px}.art-bg-cover{background-position:center center;background-repeat:no-repeat;background-size:cover}.art-bottom-gradient{background-image:linear-gradient(to top,#000,rgba(0,0,0,.4),transparent);background-repeat:repeat-x;background-position:center bottom}.art-backdrop-filter{-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px);background-color:#000000bf!important}.art-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.art-video-player{position:relative;margin:0 auto;width:100%;height:100%;outline:0;zoom:1;padding:0;text-align:left;direction:ltr;font-size:14px;line-height:1.3;user-select:none;box-sizing:border-box;color:var(--art-font-color);background-color:var(--art-background-color);text-shadow:0 0 2px var(--art-text-shadow-color);font-family:PingFang SC,Helvetica Neue,Microsoft YaHei,Roboto,Arial,sans-serif;-webkit-tap-highlight-color:rgba(0,0,0,0);-ms-touch-action:manipulation;touch-action:manipulation;-ms-high-contrast-adjust:none}.art-video-player *,.art-video-player *:before,.art-video-player *:after{box-sizing:border-box}.art-video-player ::-webkit-scrollbar{width:var(--art-scrollbar-size);height:var(--art-scrollbar-size)}.art-video-player ::-webkit-scrollbar-thumb{background-color:var(--art-scrollbar-background)}.art-video-player ::-webkit-scrollbar-thumb:hover{background-color:var(--art-scrollbar-background-hover)}.art-video-player img{max-width:100%;vertical-align:top}.art-video-player svg{fill:var(--art-font-color)}.art-video-player a{color:var(--art-font-color);text-decoration:none}.art-icon{line-height:1;display:flex;justify-content:center;align-items:center}.art-video-player.art-backdrop .art-contextmenus,.art-video-player.art-backdrop .art-info,.art-video-player.art-backdrop .art-settings,.art-video-player.art-backdrop .art-layer-auto-playback,.art-video-player.art-backdrop .art-selector-list,.art-video-player.art-backdrop .art-volume-inner{-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px);background-color:#000000bf!important}.art-video{position:absolute;inset:0;z-index:10;width:100%;height:100%}.art-poster{position:absolute;inset:0;z-index:11;width:100%;height:100%;background-position:center center;background-repeat:no-repeat;background-size:cover;pointer-events:none}.art-video-player .art-subtitle{display:none;justify-content:center;align-items:center;flex-direction:column;position:absolute;z-index:20;width:100%;padding:0 5%;text-align:center;pointer-events:none;gap:var(--art-subtitle-gap);bottom:var(--art-subtitle-bottom);font-size:var(--art-subtitle-font-size);transition:bottom var(--art-transition-duration) ease;text-shadow:var(--art-subtitle-border) 1px 0 1px,var(--art-subtitle-border) 0 1px 1px,var(--art-subtitle-border) -1px 0 1px,var(--art-subtitle-border) 0 -1px 1px,var(--art-subtitle-border) 1px 1px 1px,var(--art-subtitle-border) -1px -1px 1px,var(--art-subtitle-border) 1px -1px 1px,var(--art-subtitle-border) -1px 1px 1px}.art-video-player.art-subtitle-show .art-subtitle{display:flex}.art-video-player.art-control-show .art-subtitle{bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}.art-danmuku{position:absolute;inset:0;z-index:30;width:100%;height:100%;pointer-events:none;overflow:hidden}.art-video-player .art-layers{position:absolute;inset:0;z-index:40;width:100%;height:100%;display:none;pointer-events:none}.art-video-player .art-layers .art-layer{pointer-events:auto}.art-video-player.art-layer-show .art-layers{display:flex}.art-video-player .art-mask{display:flex;justify-content:center;align-items:center;position:absolute;inset:0;z-index:50;width:100%;height:100%;pointer-events:none}.art-video-player .art-mask .art-state{display:flex;justify-content:center;align-items:center;opacity:0;transform:scale(2);width:var(--art-state-size);height:var(--art-state-size);transition:all var(--art-transition-duration) ease}.art-video-player.art-mask-show .art-state{pointer-events:auto;opacity:var(--art-state-opacity);transform:scale(1)}.art-video-player.art-loading-show .art-state{display:none}.art-video-player .art-loading{display:none;justify-content:center;align-items:center;position:absolute;inset:0;z-index:70;width:100%;height:100%;pointer-events:none}.art-video-player.art-loading-show .art-loading{display:flex}.art-video-player.art-loading-show .art-mask{display:none}.art-video-player .art-bottom{position:absolute;inset:0;z-index:60;width:100%;height:100%;display:flex;flex-direction:column;justify-content:flex-end;opacity:0;overflow:hidden;pointer-events:none;padding:0 var(--art-padding);transition:all var(--art-transition-duration) ease;background-size:100% var(--art-bottom-height);background-image:linear-gradient(to top,#000,rgba(0,0,0,.4),transparent);background-repeat:repeat-x;background-position:center bottom}.art-video-player .art-bottom .art-controls,.art-video-player .art-bottom .art-progress{transform:translateY(var(--art-bottom-offset));transition:transform var(--art-transition-duration) ease}.art-video-player.art-control-show .art-bottom,.art-video-player.art-hover .art-bottom{opacity:1}.art-video-player.art-control-show .art-bottom .art-controls,.art-video-player.art-hover .art-bottom .art-controls,.art-video-player.art-control-show .art-bottom .art-progress,.art-video-player.art-hover .art-bottom .art-progress{transform:translateY(0)}.art-bottom .art-progress{position:relative;z-index:0;cursor:pointer;pointer-events:auto;padding-top:var(--art-progress-top-gap);padding-bottom:var(--art-bottom-gap)}.art-bottom .art-progress .art-control-progress{position:relative;display:flex;justify-content:center;align-items:center;height:var(--art-progress-height)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner{display:flex;align-items:center;position:relative;height:50%;width:100%;transition:height var(--art-transition-duration) ease;background-color:var(--art-progress-color)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-hover{position:absolute;inset:0;z-index:0;width:100%;height:100%;width:0%;background-color:var(--art-hover-color)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-loaded{position:absolute;inset:0;z-index:10;width:100%;height:100%;width:0%;background-color:var(--art-loaded-color)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-played{position:absolute;inset:0;z-index:20;width:100%;height:100%;width:0%;background-color:var(--art-theme)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight{position:absolute;inset:0;z-index:30;width:100%;height:100%;pointer-events:none}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight span{position:absolute;inset:0 auto 0 0;z-index:0;width:100%;height:100%;pointer-events:auto;width:var(--art-highlight-width)!important;transform:translate(calc(var(--art-highlight-width) / -2));background-color:var(--art-highlight-color)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{display:flex;justify-content:center;align-items:center;position:absolute;z-index:40;left:0;border-radius:50%;width:var(--art-indicator-size);height:var(--art-indicator-size);transform:scale(var(--art-indicator-scale));margin-left:calc(var(--art-indicator-size) / -2);transition:transform var(--art-transition-duration) ease}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator .art-icon{width:100%;height:100%;pointer-events:none}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:hover{transform:scale(1.2)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:active{transform:scale(1)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip{transform-origin:bottom center;transform:scale(.5);opacity:0;position:absolute;z-index:50;top:-25px;left:0;padding:3px 5px;line-height:1;font-size:12px;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);transition:transform var(--art-transition-duration) ease,opacity var(--art-transition-duration) ease}.art-bottom .art-progress .art-control-thumbnails{transform-origin:bottom center;transform:scale(.5);opacity:0;position:absolute;bottom:calc(var(--art-bottom-gap) + 10px);left:0;border-radius:var(--art-border-radius);pointer-events:none;background-color:var(--art-widget-background);transition:transform var(--art-transition-duration) ease,opacity var(--art-transition-duration) ease;box-shadow:0 1px 3px #0003,0 1px 2px -1px #0003}.art-bottom .art-progress:hover .art-control-progress .art-control-progress-inner{height:100%}.art-bottom:hover .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{transform:scale(1)}.art-progress-hover .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip,.art-progress-hover .art-bottom .art-progress .art-control-thumbnails{transform:scale(1);opacity:1}.art-video-player .art-controls{position:relative;z-index:10;pointer-events:auto;display:flex;align-items:center;justify-content:space-between;height:var(--art-control-height)}.art-video-player .art-controls .art-controls-left,.art-video-player .art-controls .art-controls-right{display:flex;height:100%}.art-video-player .art-controls .art-controls-center{display:none;justify-content:center;align-items:center;flex:1;height:100%;padding:0 10px}.art-video-player .art-controls .art-controls-right{justify-content:flex-end}.art-video-player .art-controls .art-control{display:flex;justify-content:center;align-items:center;flex-shrink:0;cursor:pointer;white-space:nowrap;opacity:var(--art-control-opacity);min-height:var(--art-control-height);min-width:var(--art-control-height);transition:opacity var(--art-transition-duration) ease}.art-video-player .art-controls .art-control .art-icon{height:var(--art-control-icon-size);width:var(--art-control-icon-size);transform:scale(var(--art-control-icon-scale));transition:transform var(--art-transition-duration) ease}.art-video-player .art-controls .art-control .art-icon:active{transform:scale(calc(var(--art-control-icon-scale) * .8))}.art-video-player .art-controls .art-control:hover{opacity:1}.art-control-volume{position:relative}.art-control-volume .art-volume-panel{display:flex;justify-content:center;align-items:center;position:absolute;left:0;right:0;padding:0 5px;font-size:12px;text-align:center;cursor:default;opacity:0;transform:translateY(10px);pointer-events:none;bottom:var(--art-control-height);width:var(--art-control-height);height:var(--art-volume-height);transition:all var(--art-transition-duration) ease}.art-control-volume .art-volume-panel .art-volume-inner{display:flex;flex-direction:column;align-items:center;gap:10px;height:100%;width:100%;padding:10px 0 12px;border-radius:var(--art-border-radius);background-color:var(--art-widget-background)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider{flex:1;width:100%;display:flex;cursor:pointer;position:relative;justify-content:center}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle{position:relative;display:flex;justify-content:center;width:2px;border-radius:var(--art-border-radius);overflow:hidden;background-color:#ffffff40}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle .art-volume-loaded{position:absolute;inset:0;z-index:0;width:100%;height:100%;background-color:var(--art-theme)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-indicator{position:absolute;width:var(--art-volume-handle-size);height:var(--art-volume-handle-size);margin-top:calc(var(--art-volume-handle-size) / -2);flex-shrink:0;transform:scale(1);border-radius:100%;background-color:var(--art-theme);transition:transform var(--art-transition-duration) ease}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider:active .art-volume-indicator{transform:scale(.9)}.art-control-volume:hover .art-volume-panel{opacity:1;transform:translateY(0);pointer-events:auto}.art-video-player .art-notice{display:none;position:absolute;inset:0 0 auto;z-index:80;width:100%;height:100%;height:auto;padding:var(--art-padding);pointer-events:none}.art-video-player .art-notice .art-notice-inner{display:inline-flex;padding:5px;line-height:1;border-radius:var(--art-border-radius);background-color:var(--art-tip-background)}.art-video-player.art-notice-show .art-notice{display:flex}.art-video-player .art-contextmenus{display:none;flex-direction:column;position:absolute;z-index:120;padding:5px 0;border-radius:var(--art-border-radius);font-size:12px;background-color:var(--art-widget-background);min-width:var(--art-contextmenus-min-width)}.art-video-player .art-contextmenus .art-contextmenu{cursor:pointer;display:flex;padding:10px 15px;border-bottom:1px solid rgba(255,255,255,.1)}.art-video-player .art-contextmenus .art-contextmenu span{padding:0 8px}.art-video-player .art-contextmenus .art-contextmenu span:hover,.art-video-player .art-contextmenus .art-contextmenu span.art-current{color:var(--art-theme)}.art-video-player .art-contextmenus .art-contextmenu:hover{background-color:#ffffff1a}.art-video-player .art-contextmenus .art-contextmenu:last-child{border-bottom:none}.art-video-player.art-contextmenu-show .art-contextmenus{display:flex}.art-video-player .art-settings{display:none;flex-direction:column;position:absolute;z-index:90;left:auto;overflow-y:auto;overflow-x:hidden;border-radius:var(--art-border-radius);max-height:var(--art-settings-max-height);right:var(--art-padding);bottom:var(--art-control-height);transition:all var(--art-transition-duration) ease;background-color:var(--art-widget-background)}.art-video-player .art-settings .art-setting-panel{display:none;flex-direction:column}.art-video-player .art-settings .art-setting-panel.art-current{display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item{display:flex;justify-content:space-between;align-items:center;padding:0 5px;cursor:pointer;overflow:hidden;transition:background-color var(--art-transition-duration) ease}.art-video-player .art-settings .art-setting-panel .art-setting-item:hover{background-color:#ffffff1a}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current{color:var(--art-theme)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-icon-check{visibility:hidden;height:15px}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current .art-icon-check{visibility:visible}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left{display:flex;justify-content:center;align-items:center;flex-shrink:0;gap:5px}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left .art-setting-item-left-icon{display:flex;justify-content:center;align-items:center;height:var(--art-settings-icon-size);width:var(--art-settings-icon-size)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right{display:flex;justify-content:center;align-items:center;gap:5px;font-size:12px}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-tooltip{white-space:nowrap;color:#ffffff80}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-icon{display:flex;justify-content:center;align-items:center;min-width:32px;height:24px}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-range{height:3px;width:80px;outline:none;appearance:none;background-color:#fff3}.art-video-player .art-settings .art-setting-panel .art-setting-item-back{border-bottom:1px solid rgba(255,255,255,.1)}.art-video-player.art-setting-show .art-settings{display:flex}.art-video-player .art-info{display:none;position:absolute;left:var(--art-padding);top:var(--art-padding);z-index:100;padding:10px;font-size:12px;border-radius:var(--art-border-radius);background-color:var(--art-widget-background)}.art-video-player .art-info .art-info-panel{display:flex;flex-direction:column;gap:5px}.art-video-player .art-info .art-info-panel .art-info-item{display:flex;align-items:center;gap:5px}.art-video-player .art-info .art-info-panel .art-info-item .art-info-title{width:100px;text-align:right}.art-video-player .art-info .art-info-panel .art-info-item .art-info-content{width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;user-select:all}.art-video-player .art-info .art-info-close{position:absolute;top:5px;right:5px;cursor:pointer}.art-video-player.art-info-show .art-info{display:flex}.art-hide-cursor *{cursor:none!important}.art-video-player[data-aspect-ratio]{overflow:hidden}.art-video-player[data-aspect-ratio] .art-video{object-fit:fill;box-sizing:content-box}.art-fullscreen{--art-progress-height: 8px;--art-indicator-size: 20px;--art-control-height: 60px;--art-control-icon-scale: 1.3}.art-fullscreen-web{--art-progress-height: 8px;--art-indicator-size: 20px;--art-control-height: 60px;--art-control-icon-scale: 1.3;position:fixed;inset:0;z-index:var(--art-fullscreen-web-index);width:100%;height:100%}.art-mini-popup{position:fixed;z-index:9999;width:320px;height:180px;background:#000;border-radius:var(--art-border-radius);cursor:move;user-select:none;overflow:hidden;transition:opacity .2s ease;box-shadow:0 0 5px #00000080}.art-mini-popup svg{fill:#fff}.art-mini-popup .art-video{pointer-events:none}.art-mini-popup .art-mini-close{position:absolute;z-index:20;right:10px;top:10px;cursor:pointer;opacity:0;transition:opacity .2s ease}.art-mini-popup .art-mini-state{position:absolute;inset:0;z-index:30;width:100%;height:100%;display:flex;justify-content:center;align-items:center;pointer-events:none;opacity:0;transition:opacity .2s ease;background-color:#00000040}.art-mini-popup .art-mini-state .art-icon{opacity:.75;cursor:pointer;transform:scale(3);pointer-events:auto;transition:transform .2s ease}.art-mini-popup .art-mini-state .art-icon:active{transform:scale(2.5)}.art-mini-popup.art-mini-dragging{opacity:.9}.art-mini-popup:hover .art-mini-close,.art-mini-popup:hover .art-mini-state{opacity:1}.art-video-player[data-flip=horizontal] .art-video{transform:scaleX(-1)}.art-video-player[data-flip=vertical] .art-video{transform:scaleY(-1)}.art-video-player .art-layer-lock{display:none;justify-content:center;align-items:center;position:absolute;top:50%;border-radius:50%;transform:translateY(-50%);height:var(--art-lock-size);width:var(--art-lock-size);left:var(--art-padding);background-color:var(--art-tip-background)}.art-video-player .art-layer-auto-playback{display:none;gap:10px;align-items:center;position:absolute;border-radius:var(--art-border-radius);padding:10px;line-height:1;left:var(--art-padding);bottom:calc(var(--art-control-height) + var(--art-bottom-gap) + 10px);background-color:var(--art-widget-background)}.art-video-player .art-layer-auto-playback .art-auto-playback-close{display:flex;justify-content:center;align-items:center;cursor:pointer}.art-video-player .art-layer-auto-playback .art-auto-playback-close svg{width:15px;height:15px;fill:var(--art-theme)}.art-video-player .art-layer-auto-playback .art-auto-playback-jump{color:var(--art-theme);cursor:pointer}.art-video-player.art-lock .art-subtitle{bottom:var(--art-subtitle-bottom)!important}.art-video-player.art-mini-progress-bar .art-bottom,.art-video-player.art-lock .art-bottom{opacity:1;padding:0;background-image:none}.art-video-player.art-mini-progress-bar .art-bottom .art-controls,.art-video-player.art-lock .art-bottom .art-controls,.art-video-player.art-mini-progress-bar .art-bottom .art-progress,.art-video-player.art-lock .art-bottom .art-progress{transform:translateY(calc(var(--art-control-height) + var(--art-bottom-gap) + var(--art-progress-height) / 4))}.art-video-player.art-mini-progress-bar .art-bottom .art-progress-indicator,.art-video-player.art-lock .art-bottom .art-progress-indicator{display:none!important}.art-video-player.art-control-show .art-layer-lock{display:flex}.art-control-selector{position:relative;display:flex;justify-content:center}.art-control-selector .art-selector-list{display:flex;flex-direction:column;align-items:center;text-align:center;position:absolute;border-radius:var(--art-border-radius);overflow-y:auto;overflow-x:hidden;opacity:0;transform:translateY(10px);pointer-events:none;bottom:var(--art-control-height);max-height:var(--art-selector-max-height);background-color:var(--art-widget-background);transition:all var(--art-transition-duration) ease}.art-control-selector .art-selector-list .art-selector-item{display:flex;justify-content:center;align-items:center;width:100%;padding:10px 15px;flex-shrink:0;line-height:1}.art-control-selector .art-selector-list .art-selector-item:hover{background-color:#ffffff1a}.art-control-selector .art-selector-list .art-selector-item:hover,.art-control-selector .art-selector-list .art-selector-item.art-current{color:var(--art-theme)}.art-control-selector:hover .art-selector-list{opacity:1;transform:translateY(0);pointer-events:auto}.art-video-player [class*=hint--]{position:relative;display:inline-block;font-style:normal}.art-video-player [class*=hint--]:before,.art-video-player [class*=hint--]:after{position:absolute;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translateZ(0);visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;-webkit-transition:.3s ease;-moz-transition:.3s ease;transition:.3s ease;-webkit-transition-delay:0ms;-moz-transition-delay:0ms;transition-delay:0ms}.art-video-player [class*=hint--]:hover:before,.art-video-player [class*=hint--]:hover:after{visibility:visible;opacity:1}.art-video-player [class*=hint--]:hover:before,.art-video-player [class*=hint--]:hover:after{-webkit-transition-delay:.1s;-moz-transition-delay:.1s;transition-delay:.1s}.art-video-player [class*=hint--]:before{content:\"\";position:absolute;background:transparent;border:6px solid transparent;z-index:1000001}.art-video-player [class*=hint--]:after{background:#000;color:#fff;padding:8px 10px;font-size:12px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;line-height:12px;white-space:nowrap}.art-video-player [class*=hint--][aria-label]:after{content:attr(aria-label)}.art-video-player [class*=hint--][data-hint]:after{content:attr(data-hint)}.art-video-player [aria-label=\"\"]:before,.art-video-player [aria-label=\"\"]:after,.art-video-player [data-hint=\"\"]:before,.art-video-player [data-hint=\"\"]:after{display:none!important}.art-video-player .hint--top-left:before{border-top-color:#000}.art-video-player .hint--top-right:before{border-top-color:#000}.art-video-player .hint--top:before{border-top-color:#000}.art-video-player .hint--bottom-left:before{border-bottom-color:#000}.art-video-player .hint--bottom-right:before{border-bottom-color:#000}.art-video-player .hint--bottom:before{border-bottom-color:#000}.art-video-player .hint--left:before{border-left-color:#000}.art-video-player .hint--right:before{border-right-color:#000}.art-video-player .hint--top:before{margin-bottom:-11px}.art-video-player .hint--top:before,.art-video-player .hint--top:after{bottom:100%;left:50%}.art-video-player .hint--top:before{left:calc(50% - 6px)}.art-video-player .hint--top:after{-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);transform:translate(-50%)}.art-video-player .hint--top:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-moz-transform:translateX(-50%) translateY(-8px);transform:translate(-50%) translateY(-8px)}.art-video-player .hint--bottom:before{margin-top:-11px}.art-video-player .hint--bottom:before,.art-video-player .hint--bottom:after{top:100%;left:50%}.art-video-player .hint--bottom:before{left:calc(50% - 6px)}.art-video-player .hint--bottom:after{-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);transform:translate(-50%)}.art-video-player .hint--bottom:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-moz-transform:translateX(-50%) translateY(8px);transform:translate(-50%) translateY(8px)}.art-video-player .hint--right:before{margin-left:-11px;margin-bottom:-6px}.art-video-player .hint--right:after{margin-bottom:-14px}.art-video-player .hint--right:before,.art-video-player .hint--right:after{left:100%;bottom:50%}.art-video-player .hint--right:hover:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translate(8px)}.art-video-player .hint--right:hover:after{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translate(8px)}.art-video-player .hint--left:before{margin-right:-11px;margin-bottom:-6px}.art-video-player .hint--left:after{margin-bottom:-14px}.art-video-player .hint--left:before,.art-video-player .hint--left:after{right:100%;bottom:50%}.art-video-player .hint--left:hover:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translate(-8px)}.art-video-player .hint--left:hover:after{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translate(-8px)}.art-video-player .hint--top-left:before{margin-bottom:-11px}.art-video-player .hint--top-left:before,.art-video-player .hint--top-left:after{bottom:100%;left:50%}.art-video-player .hint--top-left:before{left:calc(50% - 6px)}.art-video-player .hint--top-left:after{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);transform:translate(-100%)}.art-video-player .hint--top-left:after{margin-left:12px}.art-video-player .hint--top-left:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--top-left:hover:after{-webkit-transform:translateX(-100%) translateY(-8px);-moz-transform:translateX(-100%) translateY(-8px);transform:translate(-100%) translateY(-8px)}.art-video-player .hint--top-right:before{margin-bottom:-11px}.art-video-player .hint--top-right:before,.art-video-player .hint--top-right:after{bottom:100%;left:50%}.art-video-player .hint--top-right:before{left:calc(50% - 6px)}.art-video-player .hint--top-right:after{-webkit-transform:translateX(0);-moz-transform:translateX(0);transform:translate(0)}.art-video-player .hint--top-right:after{margin-left:-12px}.art-video-player .hint--top-right:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--top-right:hover:after{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--bottom-left:before{margin-top:-11px}.art-video-player .hint--bottom-left:before,.art-video-player .hint--bottom-left:after{top:100%;left:50%}.art-video-player .hint--bottom-left:before{left:calc(50% - 6px)}.art-video-player .hint--bottom-left:after{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);transform:translate(-100%)}.art-video-player .hint--bottom-left:after{margin-left:12px}.art-video-player .hint--bottom-left:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--bottom-left:hover:after{-webkit-transform:translateX(-100%) translateY(8px);-moz-transform:translateX(-100%) translateY(8px);transform:translate(-100%) translateY(8px)}.art-video-player .hint--bottom-right:before{margin-top:-11px}.art-video-player .hint--bottom-right:before,.art-video-player .hint--bottom-right:after{top:100%;left:50%}.art-video-player .hint--bottom-right:before{left:calc(50% - 6px)}.art-video-player .hint--bottom-right:after{-webkit-transform:translateX(0);-moz-transform:translateX(0);transform:translate(0)}.art-video-player .hint--bottom-right:after{margin-left:-12px}.art-video-player .hint--bottom-right:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--bottom-right:hover:after{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--small:after,.art-video-player .hint--medium:after,.art-video-player .hint--large:after{white-space:normal;line-height:1.4em;word-wrap:break-word}.art-video-player .hint--small:after{width:80px}.art-video-player .hint--medium:after{width:150px}.art-video-player .hint--large:after{width:300px}.art-video-player [class*=hint--]:after{text-shadow:0 -1px 0px black;box-shadow:4px 4px 8px #0000004d}.art-video-player .hint--error:after{background-color:#b34e4d;text-shadow:0 -1px 0px #592726}.art-video-player .hint--error.hint--top-left:before{border-top-color:#b34e4d}.art-video-player .hint--error.hint--top-right:before{border-top-color:#b34e4d}.art-video-player .hint--error.hint--top:before{border-top-color:#b34e4d}.art-video-player .hint--error.hint--bottom-left:before{border-bottom-color:#b34e4d}.art-video-player .hint--error.hint--bottom-right:before{border-bottom-color:#b34e4d}.art-video-player .hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.art-video-player .hint--error.hint--left:before{border-left-color:#b34e4d}.art-video-player .hint--error.hint--right:before{border-right-color:#b34e4d}.art-video-player .hint--warning:after{background-color:#c09854;text-shadow:0 -1px 0px #6c5328}.art-video-player .hint--warning.hint--top-left:before{border-top-color:#c09854}.art-video-player .hint--warning.hint--top-right:before{border-top-color:#c09854}.art-video-player .hint--warning.hint--top:before{border-top-color:#c09854}.art-video-player .hint--warning.hint--bottom-left:before{border-bottom-color:#c09854}.art-video-player .hint--warning.hint--bottom-right:before{border-bottom-color:#c09854}.art-video-player .hint--warning.hint--bottom:before{border-bottom-color:#c09854}.art-video-player .hint--warning.hint--left:before{border-left-color:#c09854}.art-video-player .hint--warning.hint--right:before{border-right-color:#c09854}.art-video-player .hint--info:after{background-color:#3986ac;text-shadow:0 -1px 0px #1a3c4d}.art-video-player .hint--info.hint--top-left:before{border-top-color:#3986ac}.art-video-player .hint--info.hint--top-right:before{border-top-color:#3986ac}.art-video-player .hint--info.hint--top:before{border-top-color:#3986ac}.art-video-player .hint--info.hint--bottom-left:before{border-bottom-color:#3986ac}.art-video-player .hint--info.hint--bottom-right:before{border-bottom-color:#3986ac}.art-video-player .hint--info.hint--bottom:before{border-bottom-color:#3986ac}.art-video-player .hint--info.hint--left:before{border-left-color:#3986ac}.art-video-player .hint--info.hint--right:before{border-right-color:#3986ac}.art-video-player .hint--success:after{background-color:#458746;text-shadow:0 -1px 0px #1a321a}.art-video-player .hint--success.hint--top-left:before{border-top-color:#458746}.art-video-player .hint--success.hint--top-right:before{border-top-color:#458746}.art-video-player .hint--success.hint--top:before{border-top-color:#458746}.art-video-player .hint--success.hint--bottom-left:before{border-bottom-color:#458746}.art-video-player .hint--success.hint--bottom-right:before{border-bottom-color:#458746}.art-video-player .hint--success.hint--bottom:before{border-bottom-color:#458746}.art-video-player .hint--success.hint--left:before{border-left-color:#458746}.art-video-player .hint--success.hint--right:before{border-right-color:#458746}.art-video-player .hint--always:after,.art-video-player .hint--always:before{opacity:1;visibility:visible}.art-video-player .hint--always.hint--top:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--always.hint--top:after{-webkit-transform:translateX(-50%) translateY(-8px);-moz-transform:translateX(-50%) translateY(-8px);transform:translate(-50%) translateY(-8px)}.art-video-player .hint--always.hint--top-left:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--always.hint--top-left:after{-webkit-transform:translateX(-100%) translateY(-8px);-moz-transform:translateX(-100%) translateY(-8px);transform:translate(-100%) translateY(-8px)}.art-video-player .hint--always.hint--top-right:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--always.hint--top-right:after{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--always.hint--bottom:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--always.hint--bottom:after{-webkit-transform:translateX(-50%) translateY(8px);-moz-transform:translateX(-50%) translateY(8px);transform:translate(-50%) translateY(8px)}.art-video-player .hint--always.hint--bottom-left:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--always.hint--bottom-left:after{-webkit-transform:translateX(-100%) translateY(8px);-moz-transform:translateX(-100%) translateY(8px);transform:translate(-100%) translateY(8px)}.art-video-player .hint--always.hint--bottom-right:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--always.hint--bottom-right:after{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--always.hint--left:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translate(-8px)}.art-video-player .hint--always.hint--left:after{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translate(-8px)}.art-video-player .hint--always.hint--right:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translate(8px)}.art-video-player .hint--always.hint--right:after{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translate(8px)}.art-video-player .hint--rounded:after{border-radius:4px}.art-video-player .hint--no-animate:before,.art-video-player .hint--no-animate:after{-webkit-transition-duration:0ms;-moz-transition-duration:0ms;transition-duration:0ms}.art-video-player .hint--bounce:before,.art-video-player .hint--bounce:after{-webkit-transition:opacity .3s ease,visibility .3s ease,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s ease,visibility .3s ease,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s ease,visibility .3s ease,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.art-video-player .hint--no-shadow:before,.art-video-player .hint--no-shadow:after{text-shadow:initial;box-shadow:initial}.art-video-player .hint--no-arrow:before{display:none}.art-video-player.art-mobile{--art-bottom-gap: 10px;--art-control-height: 38px;--art-control-icon-scale: 1;--art-state-size: 60px;--art-settings-max-height: 180px;--art-selector-max-height: 180px;--art-indicator-scale: 1;--art-control-opacity: 1}.art-video-player.art-mobile .art-controls-left{margin-left:calc(var(--art-padding) / -1)}.art-video-player.art-mobile .art-controls-right{margin-right:calc(var(--art-padding) / -1)}';class jt extends dt{constructor(t){super(t),this.name=\"subtitle\",this.option=null,this.destroyEvent=()=>null,this.init(t.option.subtitle);let e=!1;t.on(\"video:timeupdate\",()=>{if(!this.url)return;const t=this.art.template.$video.webkitDisplayingFullscreen;\"boolean\"===typeof t&&t!==e&&(e=t,this.createTrack(t?\"subtitles\":\"metadata\",this.url))})}get url(){return this.art.template.$track.src}set url(t){this.switch(t)}get textTrack(){return this.art.template.$video?.textTracks?.[0]}get activeCues(){return this.textTrack?Array.from(this.textTrack.activeCues):[]}get cues(){return this.textTrack?Array.from(this.textTrack.cues):[]}style(t,e){const{$subtitle:r}=this.art.template;return\"object\"===typeof t?x(r,t):w(r,t,e)}update(){const{option:{subtitle:t},template:{$subtitle:e}}=this.art;e.innerHTML=\"\",this.activeCues.length&&(this.art.emit(\"subtitleBeforeUpdate\",this.activeCues),e.innerHTML=this.activeCues.map((e,r)=>e.text.split(/\\r?\\n/).filter(t=>t.trim()).map(e=>`<div class=\"art-subtitle-line\" data-group=\"${r}\">\\n                                ${t.escape?B(e):e}\\n                            </div>`).join(\"\")).join(\"\"),this.art.emit(\"subtitleAfterUpdate\",this.activeCues))}async switch(t,e={}){const{i18n:r,notice:a,option:o}=this.art,n={...o.subtitle,...e,url:t},i=await this.init(n);return e.name&&(a.show=`${r.get(\"Switch Subtitle\")}: ${e.name}`),i}createTrack(t,e){const{template:r,proxy:a,option:o}=this.art,{$video:n,$track:i}=r,s=L(\"track\");s.default=!0,s.kind=t,s.src=e,s.label=o.subtitle.name||\"Artplayer\",s.track.mode=\"hidden\",s.onload=()=>{this.art.emit(\"subtitleLoad\",this.cues,this.option)},this.art.events.remove(this.destroyEvent),i.onload=null,b(i),y(n,s),r.$track=s,this.destroyEvent=a(this.textTrack,\"cuechange\",()=>this.update())}async init(t){const{notice:e,template:{$subtitle:r}}=this.art;return this.textTrack?(o(t,ct.subtitle),t.url?(this.option=t,this.style(t.style),fetch(t.url).then(t=>t.arrayBuffer()).then(e=>{const r=new TextDecoder(t.encoding).decode(e);switch(t.type||V(t.url)){case\"srt\":{const e=X(r);return G(t.onVttLoad(e))}case\"ass\":{const e=K(r);return G(t.onVttLoad(e))}case\"vtt\":return G(t.onVttLoad(r));default:return t.url}}).then(t=>(r.innerHTML=\"\",this.url===t||(URL.revokeObjectURL(this.url),this.createTrack(\"metadata\",t)),t)).catch(t=>{throw r.innerHTML=\"\",e.show=t,t})):void 0):null}}class Ut{constructor(t){this.art=t;const{option:e,constructor:r}=t;e.container instanceof Element?this.$container=e.container:(this.$container=u(e.container),_(this.$container,`No container element found by ${e.container}`)),_(I(),\"The current browser does not support flex layout\");const a=this.$container.tagName.toLowerCase();_(\"div\"===a,`Unsupported container element type, only support 'div' but got '${a}'`),_(r.instances.every(t=>t.template.$container!==this.$container),\"Cannot mount multiple instances on the same dom element\"),this.query=this.query.bind(this),this.$container.dataset.artId=t.id,this.init()}static get html(){return`\\n          <div class=\"art-video-player art-subtitle-show art-layer-show art-control-show art-mask-show\">\\n            <video class=\"art-video\">\\n              <track default kind=\"metadata\" src=\"\"></track>\\n            </video>\\n            <div class=\"art-poster\"></div>\\n            <div class=\"art-subtitle\"></div>\\n            <div class=\"art-danmuku\"></div>\\n            <div class=\"art-layers\"></div>\\n            <div class=\"art-mask\">\\n              <div class=\"art-state\"></div>\\n            </div>\\n            <div class=\"art-bottom\">\\n              <div class=\"art-progress\"></div>\\n              <div class=\"art-controls\">\\n                <div class=\"art-controls-left\"></div>\\n                <div class=\"art-controls-center\"></div>\\n                <div class=\"art-controls-right\"></div>\\n              </div>\\n            </div>\\n            <div class=\"art-loading\"></div>\\n            <div class=\"art-notice\">\\n              <div class=\"art-notice-inner\"></div>\\n            </div>\\n            <div class=\"art-settings\"></div>\\n            <div class=\"art-info\">\\n              <div class=\"art-info-panel\">\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Player version:</div>\\n                  <div class=\"art-info-content\">${n}</div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video url:</div>\\n                  <div class=\"art-info-content\" data-video=\"currentSrc\"></div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video volume:</div>\\n                  <div class=\"art-info-content\" data-video=\"volume\"></div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video time:</div>\\n                  <div class=\"art-info-content\" data-video=\"currentTime\"></div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video duration:</div>\\n                  <div class=\"art-info-content\" data-video=\"duration\"></div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video resolution:</div>\\n                  <div class=\"art-info-content\">\\n                    <span data-video=\"videoWidth\"></span> x <span data-video=\"videoHeight\"></span>\\n                  </div>\\n                </div>\\n              </div>\\n              <div class=\"art-info-close\">[x]</div>\\n            </div>\\n            <div class=\"art-contextmenus\"></div>\\n          </div>\\n        `}query(t){return u(t,this.$container)}init(){const{option:t}=this.art;if(t.useSSR||(this.$container.innerHTML=Ut.html),this.$player=this.query(\".art-video-player\"),this.$video=this.query(\".art-video\"),this.$track=this.query(\"track\"),this.$poster=this.query(\".art-poster\"),this.$subtitle=this.query(\".art-subtitle\"),this.$danmuku=this.query(\".art-danmuku\"),this.$bottom=this.query(\".art-bottom\"),this.$progress=this.query(\".art-progress\"),this.$controls=this.query(\".art-controls\"),this.$controlsLeft=this.query(\".art-controls-left\"),this.$controlsCenter=this.query(\".art-controls-center\"),this.$controlsRight=this.query(\".art-controls-right\"),this.$layer=this.query(\".art-layers\"),this.$loading=this.query(\".art-loading\"),this.$notice=this.query(\".art-notice\"),this.$noticeInner=this.query(\".art-notice-inner\"),this.$mask=this.query(\".art-mask\"),this.$state=this.query(\".art-state\"),this.$setting=this.query(\".art-settings\"),this.$info=this.query(\".art-info\"),this.$infoPanel=this.query(\".art-info-panel\"),this.$infoClose=this.query(\".art-info-close\"),this.$contextmenu=this.query(\".art-contextmenus\"),t.proxy){const e=t.proxy.call(this.art,this.art);_(e instanceof HTMLVideoElement||e instanceof HTMLCanvasElement,\"Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'\"),z(e,this.$video),e.className=\"art-video\",this.$video=e}t.backdrop&&f(this.$player,\"art-backdrop\"),p&&f(this.$player,\"art-mobile\")}destroy(t){t?this.$container.innerHTML=\"\":f(this.$player,\"art-destroy\")}}class qt{on(t,e,r){const a=this.e||(this.e={});return(a[t]||(a[t]=[])).push({fn:e,ctx:r}),this}once(t,e,r){const a=this;function o(...n){a.off(t,o),e.apply(r,n)}return o._=e,this.on(t,o,r)}emit(t,...e){const r=((this.e||(this.e={}))[t]||[]).slice();for(let a=0;a<r.length;a+=1)r[a].fn.apply(r[a].ctx,e);return this}off(t,e){const r=this.e||(this.e={}),a=r[t],o=[];if(a&&e)for(let n=0,i=a.length;n<i;n+=1)a[n].fn!==e&&a[n].fn._!==e&&o.push(a[n]);return o.length?r[t]=o:delete r[t],this}}let Xt=0;const Gt=[];class Kt extends qt{constructor(t,e){if(super(),!h)throw new Error(\"Artplayer can only be used in the browser environment\");this.id=++Xt;const r=q(Kt.option,t);if(r.container=t.container,this.option=o(r,ct),this.isLock=!1,this.isReady=!1,this.isFocus=!1,this.isInput=!1,this.isRotate=!1,this.isDestroy=!1,this.template=new Ut(this),this.events=new vt(this),this.storage=new Ht(this),this.icons=new xt(this),this.i18n=new wt(this),this.notice=new Ct(this),this.player=new Ot(this),this.layers=new $t(this),this.controls=new ft(this),this.contextmenu=new pt(this),this.subtitle=new jt(this),this.info=new kt(this),this.loading=new Tt(this),this.hotkey=new yt(this),this.mask=new Et(this),this.setting=new Bt(this),this.plugins=new Ft(this),\"function\"===typeof e&&this.on(\"ready\",()=>e.call(this,this)),Kt.DEBUG){const t=t=>console.log(`[ART.${this.id}] -> ${t}`);t(`Version@${Kt.version}`);for(let e=0;e<i.events.length;e++)this.on(`video:${i.events[e]}`,e=>t(`Event@${e.type}`))}Gt.push(this)}static get instances(){return Gt}static get version(){return n}static get config(){return i}static get utils(){return tt}static get scheme(){return ct}static get Emitter(){return qt}static get validator(){return o}static get kindOf(){return o.kindOf}static get html(){return Ut.html}static get option(){return{id:\"\",container:\"#artplayer\",url:\"\",poster:\"\",type:\"\",theme:\"#f00\",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,gesture:!0,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,proxy:void 0,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:\"\",number:60,column:10,width:0,height:0,scale:1},subtitle:{url:\"\",type:\"\",style:{},name:\"\",escape:!0,encoding:\"utf-8\",onVttLoad:t=>t},moreVideoAttr:{controls:!1,preload:l?\"auto\":\"metadata\"},i18n:{},icons:{},cssVar:{},customType:{},lang:navigator?.language.toLowerCase()}}get proxy(){return this.events.proxy}get query(){return this.template.query}get video(){return this.template.$video}reset(){this.video.removeAttribute(\"src\"),this.video.load()}destroy(t=!0){Kt.REMOVE_SRC_WHEN_DESTROY&&this.reset(),this.events.destroy(),this.template.destroy(t),Gt.splice(Gt.indexOf(this),1),this.isDestroy=!0,this.emit(\"destroy\")}}return Kt.STYLE=Wt,Kt.DEBUG=!1,Kt.CONTEXTMENU=!0,Kt.NOTICE_TIME=2e3,Kt.SETTING_WIDTH=250,Kt.SETTING_ITEM_WIDTH=200,Kt.SETTING_ITEM_HEIGHT=35,Kt.RESIZE_TIME=200,Kt.SCROLL_TIME=200,Kt.SCROLL_GAP=50,Kt.AUTO_PLAYBACK_MAX=10,Kt.AUTO_PLAYBACK_MIN=5,Kt.AUTO_PLAYBACK_TIMEOUT=3e3,Kt.RECONNECT_TIME_MAX=5,Kt.RECONNECT_SLEEP_TIME=1e3,Kt.CONTROL_HIDE_TIME=3e3,Kt.DBCLICK_TIME=300,Kt.DBCLICK_FULLSCREEN=!0,Kt.MOBILE_DBCLICK_PLAY=!0,Kt.MOBILE_CLICK_PLAY=!1,Kt.AUTO_ORIENTATION_TIME=200,Kt.INFO_LOOP_TIME=1e3,Kt.FAST_FORWARD_VALUE=3,Kt.FAST_FORWARD_TIME=1e3,Kt.TOUCH_MOVE_RATIO=.5,Kt.VOLUME_STEP=.1,Kt.SEEK_STEP=5,Kt.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],Kt.ASPECT_RATIO=[\"default\",\"4:3\",\"16:9\"],Kt.FLIP=[\"normal\",\"horizontal\",\"vertical\"],Kt.FULLSCREEN_WEB_IN_BODY=!0,Kt.LOG_VERSION=!0,Kt.USE_RAF=!1,Kt.REMOVE_SRC_WHEN_DESTROY=!0,h&&(M(\"artplayer-style\",Wt),setTimeout(()=>{Kt.LOG_VERSION&&console.log(`%c ArtPlayer %c ${Kt.version} %c https://artplayer.org`,\"color: #fff; background: #5f5f5f\",\"color: #fff; background: #4bc729\",\"\")},100)),Kt});\n+!function(t,e){\"object\"===typeof exports&&\"undefined\"!==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?(t.Artplayer=e(),define(function(){return t.Artplayer})):(t=\"undefined\"!==typeof globalThis?globalThis:t||self).Artplayer=e()}(this,function(){\"use strict\";function t(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,\"default\")?t.default:t}var e,r={exports:{}};var a=(e||(e=1,r.exports=function(){function t(e){return(t=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t})(e)}var e=Object.prototype.toString,r=function(r){if(void 0===r)return\"undefined\";if(null===r)return\"null\";var o=t(r);if(\"boolean\"===o)return\"boolean\";if(\"string\"===o)return\"string\";if(\"number\"===o)return\"number\";if(\"symbol\"===o)return\"symbol\";if(\"function\"===o)return\"GeneratorFunction\"===a(r)?\"generatorfunction\":\"function\";if(function(t){return Array.isArray?Array.isArray(t):t instanceof Array}(r))return\"array\";if(function(t){return!(!t.constructor||\"function\"!=typeof t.constructor.isBuffer)&&t.constructor.isBuffer(t)}(r))return\"buffer\";if(function(t){try{if(\"number\"==typeof t.length&&\"function\"==typeof t.callee)return!0}catch(e){if(-1!==e.message.indexOf(\"callee\"))return!0}return!1}(r))return\"arguments\";if(function(t){return t instanceof Date||\"function\"==typeof t.toDateString&&\"function\"==typeof t.getDate&&\"function\"==typeof t.setDate}(r))return\"date\";if(function(t){return t instanceof Error||\"string\"==typeof t.message&&t.constructor&&\"number\"==typeof t.constructor.stackTraceLimit}(r))return\"error\";if(function(t){return t instanceof RegExp||\"string\"==typeof t.flags&&\"boolean\"==typeof t.ignoreCase&&\"boolean\"==typeof t.multiline&&\"boolean\"==typeof t.global}(r))return\"regexp\";switch(a(r)){case\"Symbol\":return\"symbol\";case\"Promise\":return\"promise\";case\"WeakMap\":return\"weakmap\";case\"WeakSet\":return\"weakset\";case\"Map\":return\"map\";case\"Set\":return\"set\";case\"Int8Array\":return\"int8array\";case\"Uint8Array\":return\"uint8array\";case\"Uint8ClampedArray\":return\"uint8clampedarray\";case\"Int16Array\":return\"int16array\";case\"Uint16Array\":return\"uint16array\";case\"Int32Array\":return\"int32array\";case\"Uint32Array\":return\"uint32array\";case\"Float32Array\":return\"float32array\";case\"Float64Array\":return\"float64array\"}if(function(t){return\"function\"==typeof t.throw&&\"function\"==typeof t.return&&\"function\"==typeof t.next}(r))return\"generator\";switch(o=e.call(r)){case\"[object Object]\":return\"object\";case\"[object Map Iterator]\":return\"mapiterator\";case\"[object Set Iterator]\":return\"setiterator\";case\"[object String Iterator]\":return\"stringiterator\";case\"[object Array Iterator]\":return\"arrayiterator\"}return o.slice(8,-1).toLowerCase().replace(/\\s/g,\"\")};function a(t){return t.constructor?t.constructor.name:null}function o(t,e){var a=2<arguments.length&&void 0!==arguments[2]?arguments[2]:[\"option\"];return n(t,e,a),i(t,e,a),function(t,e,a){var s=r(e),l=r(t);if(\"object\"===s){if(\"object\"!==l)throw new Error(\"[Type Error]: '\".concat(a.join(\".\"),\"' require 'object' type, but got '\").concat(l,\"'\"));Object.keys(e).forEach(function(r){var s=t[r],l=e[r],c=a.slice();c.push(r),n(s,l,c),i(s,l,c),o(s,l,c)})}if(\"array\"===s){if(\"array\"!==l)throw new Error(\"[Type Error]: '\".concat(a.join(\".\"),\"' require 'array' type, but got '\").concat(l,\"'\"));t.forEach(function(r,s){var l=t[s],c=e[s]||e[0],d=a.slice();d.push(s),n(l,c,d),i(l,c,d),o(l,c,d)})}}(t,e,a),t}function n(t,e,a){if(\"string\"===r(e)){var o=r(t);if(\"?\"===e[0]&&(e=e.slice(1)+\"|undefined\"),!(-1<e.indexOf(\"|\")?e.split(\"|\").map(function(t){return t.toLowerCase().trim()}).filter(Boolean).some(function(t){return o===t}):e.toLowerCase().trim()===o))throw new Error(\"[Type Error]: '\".concat(a.join(\".\"),\"' require '\").concat(e,\"' type, but got '\").concat(o,\"'\"))}}function i(t,e,a){if(\"function\"===r(e)){var o=e(t,r(t),a);if(!0!==o){var n=r(o);throw\"string\"===n?new Error(o):\"error\"===n?o:new Error(\"[Validator Error]: The scheme for '\".concat(a.join(\".\"),\"' validator require return true, but got '\").concat(o,\"'\"))}}}return o.kindOf=r,o}()),r.exports);const o=t(a),n=\"5.4.0\",i={properties:[\"audioTracks\",\"autoplay\",\"buffered\",\"controller\",\"controls\",\"crossOrigin\",\"currentSrc\",\"currentTime\",\"defaultMuted\",\"defaultPlaybackRate\",\"duration\",\"ended\",\"error\",\"loop\",\"mediaGroup\",\"muted\",\"networkState\",\"paused\",\"playbackRate\",\"played\",\"preload\",\"readyState\",\"seekable\",\"seeking\",\"src\",\"startDate\",\"textTracks\",\"videoTracks\",\"volume\"],methods:[\"addTextTrack\",\"canPlayType\",\"load\",\"play\",\"pause\"],events:[\"abort\",\"canplay\",\"canplaythrough\",\"durationchange\",\"emptied\",\"ended\",\"error\",\"loadeddata\",\"loadedmetadata\",\"loadstart\",\"pause\",\"play\",\"playing\",\"progress\",\"ratechange\",\"seeked\",\"seeking\",\"stalled\",\"suspend\",\"timeupdate\",\"volumechange\",\"waiting\"],prototypes:[\"width\",\"height\",\"videoWidth\",\"videoHeight\",\"poster\",\"webkitDecodedFrameCount\",\"webkitDroppedFrameCount\",\"playsInline\",\"webkitSupportsFullscreen\",\"webkitDisplayingFullscreen\",\"onenterpictureinpicture\",\"onleavepictureinpicture\",\"disablePictureInPicture\",\"cancelVideoFrameCallback\",\"requestVideoFrameCallback\",\"getVideoPlaybackQuality\",\"requestPictureInPicture\",\"webkitEnterFullScreen\",\"webkitEnterFullscreen\",\"webkitExitFullScreen\",\"webkitExitFullscreen\"]},s=globalThis?.CUSTOM_USER_AGENT??(\"undefined\"!==typeof navigator?navigator.userAgent:\"\"),l=/^(?:(?!chrome|android).)*safari/i.test(s),c=/iPad|iPhone|iPod/i.test(s)&&!window.MSStream,d=c||s.includes(\"Macintosh\")&&navigator.maxTouchPoints>=1,p=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(s)||d,h=\"undefined\"!==typeof window&&\"undefined\"!==typeof document;function u(t,e=document){return e.querySelector(t)}function m(t,e=document){return Array.from(e.querySelectorAll(t))}function f(t,e){return t.classList.add(e)}function g(t,e){return t.classList.remove(e)}function v(t,e){return t.classList.contains(e)}function y(t,e){return e instanceof Element?t.appendChild(e):t.insertAdjacentHTML(\"beforeend\",String(e)),t.lastElementChild||t.lastChild}function b(t){return t.parentNode.removeChild(t)}function w(t,e,r){return t.style[e]=r,t}function x(t,e){for(const r in e)w(t,r,e[r]);return t}function k(t){return Array.from(t.parentElement.children).filter(e=>e!==t)}function $(t,e){k(t).forEach(t=>g(t,e)),f(t,e)}function T(t,e,r=\"top\"){p||(t.setAttribute(\"aria-label\",e),f(t,\"hint--rounded\"),f(t,`hint--${r}`))}function E(t,e=0){const r=t.getBoundingClientRect(),a=window.innerHeight||document.documentElement.clientHeight,o=window.innerWidth||document.documentElement.clientWidth,n=r.top-e<=a&&r.top+r.height+e>=0,i=r.left-e<=o+e&&r.left+r.width+e>=0;return n&&i}function C(t,e){return R(t).includes(e)}function z(t,e){return e.parentNode.replaceChild(t,e),t}function L(t){return document.createElement(t)}function S(t=\"\",e=\"\"){const r=L(\"i\");return f(r,\"art-icon\"),f(r,`art-icon-${t}`),y(r,e),r}function M(t,e){let r=document.getElementById(t);r||(r=document.createElement(\"style\"),r.id=t,\"loading\"===document.readyState?document.addEventListener(\"DOMContentLoaded\",()=>{document.head.appendChild(r)}):(document.head||document.documentElement).appendChild(r)),r.textContent=e}function I(){const t=document.createElement(\"div\");return t.style.display=\"flex\",\"flex\"===t.style.display}function P(t){return t.getBoundingClientRect()}function A(t,e){return new Promise((r,a)=>{const o=new Image;o.onload=function(){if(e&&1!==e){const n=document.createElement(\"canvas\"),i=n.getContext(\"2d\");n.width=o.width*e,n.height=o.height*e,i.drawImage(o,0,0,n.width,n.height),n.toBlob(e=>{const o=URL.createObjectURL(e),n=new Image;n.onload=function(){r(n)},n.onerror=function(){URL.revokeObjectURL(o),a(new Error(`Image load failed: ${t}`))},n.src=o})}else r(o)},o.onerror=function(){a(new Error(`Image load failed: ${t}`))},o.src=t})}function R(t){if(t.composedPath)return t.composedPath();const e=[];let r=t.target;for(;r;)e.push(r),r=r.parentNode;return e.includes(window)||void 0===window||e.push(window),e}class O extends Error{constructor(t,e){super(t),\"function\"===typeof Error.captureStackTrace&&Error.captureStackTrace(this,e||this.constructor),this.name=\"ArtPlayerError\"}}function _(t,e){if(!t)throw new O(e);return t}function V(t){return t.includes(\"?\")?V(t.split(\"?\")[0]):t.includes(\"#\")?V(t.split(\"#\")[0]):t.trim().toLowerCase().split(\".\").pop()}function Y(t,e){const r=document.createElement(\"a\");r.style.display=\"none\",r.href=t,r.download=e,document.body.appendChild(r),r.click(),document.body.removeChild(r)}function D(t,e,r){return Math.max(Math.min(t,Math.max(e,r)),Math.min(e,r))}function N(t){return t.charAt(0).toUpperCase()+t.slice(1)}function F(t){if(!t)return\"00:00\";const e=Math.floor(t/3600),r=Math.floor((t-3600*e)/60),a=Math.floor(t-3600*e-60*r);return(e>0?[e,r,a]:[r,a]).map(t=>t<10?`0${t}`:String(t)).join(\":\")}function B(t){return t.replace(/[&<>'\"]/g,t=>({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",\"'\":\"&#39;\",'\"':\"&quot;\"}[t]||t))}const H=Object.defineProperty,{hasOwnProperty:W}=Object.prototype;function j(t,e){return W.call(t,e)}function U(t,e){return Object.getOwnPropertyDescriptor(t,e)}function q(...t){const e=t=>t&&\"object\"===typeof t&&!Array.isArray(t);return t.reduce((t,r)=>(Object.keys(r).forEach(a=>{const o=t[a],n=r[a];Array.isArray(o)&&Array.isArray(n)?t[a]=o.concat(...n):e(o)&&e(n)?t[a]=q(o,n):t[a]=n}),t),{})}function X(t){return\"WEBVTT \\r\\n\\r\\n\".concat((e=t,e.replace(/(\\d\\d:\\d\\d:\\d\\d)[,.](\\d+)/g,(t,e,r)=>{let a=r.slice(0,3);return 1===r.length&&(a=`${r}00`),2===r.length&&(a=`${r}0`),`${e},${a}`})).replace(/\\{\\\\([ibu])\\}/g,\"</$1>\").replace(/\\{\\\\([ibu])1\\}/g,\"<$1>\").replace(/\\{([ibu])\\}/g,\"<$1>\").replace(/\\{\\/([ibu])\\}/g,\"</$1>\").replace(/(\\d\\d:\\d\\d:\\d\\d),(\\d\\d\\d)/g,\"$1.$2\").replace(/\\{[\\s\\S]*?\\}/g,\"\").concat(\"\\r\\n\\r\\n\"));var e}function G(t){return URL.createObjectURL(new Blob([t],{type:\"text/vtt\"}))}function K(t){const e=new RegExp(\"Dialogue:\\\\s\\\\d,(\\\\d+:\\\\d\\\\d:\\\\d\\\\d.\\\\d\\\\d),(\\\\d+:\\\\d\\\\d:\\\\d\\\\d.\\\\d\\\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\\\s\\\\S]*)$\",\"i\");function r(t=\"\"){return t.split(/[:.]/).map((t,e,r)=>{if(e===r.length-1){if(1===t.length)return`.${t}00`;if(2===t.length)return`.${t}0`}else if(1===t.length)return(0===e?\"0\":\":0\")+t;return 0===e?t:e===r.length-1?`.${t}`:`:${t}`}).join(\"\")}return`WEBVTT\\n\\n${t.split(/\\r?\\n/).map(t=>{const a=t.match(e);return a?{start:r(a[1].trim()),end:r(a[2].trim()),text:a[5].replace(/\\{[\\s\\S]*?\\}/g,\"\").replace(/(\\\\N)/g,\"\\n\").trim().split(/\\r?\\n/).map(t=>t.trim()).join(\"\\n\")}:null}).filter(t=>t).map((t,e)=>t?`${e+1}\\n${t.start} --\\x3e ${t.end}\\n${t.text}`:\"\").filter(t=>t.trim()).join(\"\\n\\n\")}`}function Z(t=0){return new Promise(e=>setTimeout(e,t))}function J(t,e){let r;return function(...a){clearTimeout(r),r=setTimeout(()=>(r=null,t.apply(this,a)),e)}}function Q(t,e){let r=!1;return function(...a){r||(t.apply(this,a),r=!0,setTimeout(()=>{r=!1},e))}}const tt=Object.freeze(Object.defineProperty({__proto__:null,ArtPlayerError:O,addClass:f,append:y,assToVtt:K,capitalize:N,clamp:D,createElement:L,debounce:J,def:H,download:Y,errorHandle:_,escape:B,get:U,getComposedPath:R,getExt:V,getIcon:S,getRect:P,getStyle:function(t,e,r=!0){const a=window.getComputedStyle(t,null).getPropertyValue(e);return r?Number.parseFloat(a):a},has:j,hasClass:v,includeFromEvent:C,inverseClass:$,isBrowser:h,isIOS:c,isIOS13:d,isInViewport:E,isMobile:p,isSafari:l,loadImg:A,mergeDeep:q,query:u,queryAll:m,remove:b,removeClass:g,replaceElement:z,secondToTime:F,setStyle:w,setStyleText:M,setStyles:x,siblings:k,sleep:Z,srtToVtt:X,supportsFlex:I,throttle:Q,tooltip:T,unescape:function(t){const e={\"&amp;\":\"&\",\"&lt;\":\"<\",\"&gt;\":\">\",\"&#39;\":\"'\",\"&quot;\":'\"'},r=new RegExp(`(${Object.keys(e).join(\"|\")})`,\"g\");return t.replace(r,t=>e[t]||t)},userAgent:s,vttToBlob:G},Symbol.toStringTag,{value:\"Module\"})),et=\"array\",rt=\"boolean\",at=\"string\",ot=\"number\",nt=\"object\",it=\"function\";function st(t,e,r){return _(e===at||e===ot||t instanceof Element,`${r.join(\".\")} require '${at}' or 'Element' type`)}const lt={html:st,disable:`?${rt}`,name:`?${at}`,index:`?${ot}`,style:`?${nt}`,click:`?${it}`,mounted:`?${it}`,tooltip:`?${at}|${ot}`,width:`?${ot}`,selector:`?${et}`,onSelect:`?${it}`,switch:`?${rt}`,onSwitch:`?${it}`,range:`?${et}`,onRange:`?${it}`,onChange:`?${it}`},ct={id:at,container:st,url:at,poster:at,type:at,theme:at,lang:at,volume:ot,isLive:rt,muted:rt,autoplay:rt,autoSize:rt,autoMini:rt,loop:rt,flip:rt,playbackRate:rt,aspectRatio:rt,screenshot:rt,setting:rt,hotkey:rt,pip:rt,mutex:rt,backdrop:rt,fullscreen:rt,fullscreenWeb:rt,subtitleOffset:rt,miniProgressBar:rt,useSSR:rt,playsInline:rt,lock:rt,gesture:rt,fastForward:rt,autoPlayback:rt,autoOrientation:rt,airplay:rt,proxy:`?${it}`,plugins:[it],layers:[lt],contextmenu:[lt],settings:[lt],controls:[{...lt,position:(t,e,r)=>{const a=[\"top\",\"left\",\"right\"];return _(a.includes(t),`${r.join(\".\")} only accept ${a.toString()} as parameters`)}}],quality:[{default:`?${rt}`,html:at,url:at}],highlight:[{time:ot,text:at}],thumbnails:{url:at,number:ot,column:ot,width:ot,height:ot,scale:ot},subtitle:{url:at,name:at,type:at,style:nt,escape:rt,encoding:at,onVttLoad:it},moreVideoAttr:nt,i18n:nt,icons:nt,cssVar:nt,customType:nt};class dt{constructor(t){this.id=0,this.art=t,this.cache=new Map,this.add=this.add.bind(this),this.remove=this.remove.bind(this),this.update=this.update.bind(this)}get show(){return v(this.art.template.$player,`art-${this.name}-show`)}set show(t){const{$player:e}=this.art.template,r=`art-${this.name}-show`;t?f(e,r):g(e,r),this.art.emit(this.name,t)}toggle(){this.show=!this.show}add(t){const e=\"function\"===typeof t?t(this.art):t;if(e.html=e.html||\"\",o(e,lt),!this.$parent||!this.name||e.disable)return;const r=e.name||`${this.name}${this.id}`;_(!this.cache.has(r),`Can't add an existing [${r}] to the [${this.name}]`),this.id+=1;const a=L(\"div\");f(a,`art-${this.name}`),f(a,`art-${this.name}-${r}`);const n=Array.from(this.$parent.children);a.dataset.index=e.index||this.id;const i=n.find(t=>Number(t.dataset.index)>=Number(a.dataset.index));i?i.insertAdjacentElement(\"beforebegin\",a):y(this.$parent,a),e.html&&y(a,e.html),e.style&&x(a,e.style),e.tooltip&&T(a,e.tooltip);const s=[];if(e.click){const t=this.art.events.proxy(a,\"click\",t=>{t.preventDefault(),e.click.call(this.art,this,t)});s.push(t)}return e.selector&&[\"left\",\"right\"].includes(e.position)&&this.selector(e,a,s),this[r]=a,this.cache.set(r,{$ref:a,events:s,option:e}),e.mounted&&e.mounted.call(this.art,a),a}remove(t){_(this.cache.has(t),`Can't find [${t}] from the [${this.name}]`);const e=this.cache.get(t);e.option.beforeUnmount&&e.option.beforeUnmount.call(this.art,e.$ref);for(const r of e.events)this.art.events.remove(r);this.cache.delete(t),delete this[t],b(e.$ref)}update(t){if(this.cache.has(t.name)){const e=this.cache.get(t.name);t=Object.assign(e.option,t),this.remove(t.name)}return this.add(t)}}class pt extends dt{constructor(t){super(t),this.name=\"contextmenu\",this.$parent=t.template.$contextmenu,p||this.init()}init(){const{option:t,proxy:e,template:{$player:r,$contextmenu:a}}=this.art;t.playbackRate&&this.add(function(t){return e=>{const{i18n:r,constructor:{PLAYBACK_RATE:a}}=e,o=a.map(t=>`<span data-value=\"${t}\">${1===t?r.get(\"Normal\"):t.toFixed(1)}</span>`).join(\"\");return{...t,html:`${r.get(\"Play Speed\")}: ${o}`,click:(t,r)=>{const{value:a}=r.target.dataset;a&&(e.playbackRate=Number(a),t.show=!1)},mounted:t=>{const r=u('[data-value=\"1\"]',t);r&&$(r,\"art-current\"),e.on(\"video:ratechange\",()=>{const r=m(\"span\",t).find(t=>Number(t.dataset.value)===e.playbackRate);r&&$(r,\"art-current\")})}}}}({name:\"playbackRate\",index:10})),t.aspectRatio&&this.add(function(t){return e=>{const{i18n:r,constructor:{ASPECT_RATIO:a}}=e,o=a.map(t=>`<span data-value=\"${t}\">${\"default\"===t?r.get(\"Default\"):t}</span>`).join(\"\");return{...t,html:`${r.get(\"Aspect Ratio\")}: ${o}`,click:(t,r)=>{const{value:a}=r.target.dataset;a&&(e.aspectRatio=a,t.show=!1)},mounted:t=>{const r=u('[data-value=\"default\"]',t);r&&$(r,\"art-current\"),e.on(\"aspectRatio\",e=>{const r=m(\"span\",t).find(t=>t.dataset.value===e);r&&$(r,\"art-current\")})}}}}({name:\"aspectRatio\",index:20})),t.flip&&this.add(function(t){return e=>{const{i18n:r,constructor:{FLIP:a}}=e,o=a.map(t=>`<span data-value=\"${t}\">${r.get(N(t))}</span>`).join(\"\");return{...t,html:`${r.get(\"Video Flip\")}: ${o}`,click:(t,r)=>{const{value:a}=r.target.dataset;a&&(e.flip=a.toLowerCase(),t.show=!1)},mounted:t=>{const r=u('[data-value=\"normal\"]',t);r&&$(r,\"art-current\"),e.on(\"flip\",e=>{const r=m(\"span\",t).find(t=>t.dataset.value===e);r&&$(r,\"art-current\")})}}}}({name:\"flip\",index:30})),this.add(function(t){return e=>({...t,html:e.i18n.get(\"Video Info\"),click:t=>{e.info.show=!0,t.show=!1}})}({name:\"info\",index:40})),this.add(function(t){const e=h?location.href:\"\";return{...t,html:`<a href=\"https://artplayer.org?ref=${encodeURIComponent(e)}\" target=\"_blank\" style=\"width:100%;\">ArtPlayer ${n}</a>`}}({name:\"version\",index:50})),this.add(function(t){return e=>({...t,html:e.i18n.get(\"Close\"),click:t=>{t.show=!1}})}({name:\"close\",index:60}));for(let o=0;o<t.contextmenu.length;o++)this.add(t.contextmenu[o]);e(r,\"contextmenu\",t=>{if(!this.art.constructor.CONTEXTMENU)return;t.preventDefault(),this.show=!0;const e=t.clientX,o=t.clientY,{height:n,width:i,left:s,top:l}=P(r),{height:c,width:d}=P(a);let p=e-s,h=o-l;e+d>s+i&&(p=i-d),o+c>l+n&&(h=n-c),x(a,{top:`${h}px`,left:`${p}px`})}),e(r,\"click\",t=>{C(t,a)||(this.show=!1)}),this.art.on(\"blur\",()=>{this.show=!1})}}function ht(t,e){const{$progress:r}=t.template,{left:a}=P(r),o=D((p?e.touches[0].clientX:e.clientX)-a,0,r.clientWidth),n=o/r.clientWidth*t.duration;return{second:n,time:F(n),width:o,percentage:D(o/r.clientWidth,0,1)}}function ut(t,e){if(t.isRotate){const r=e.touches[0].clientY/t.height,a=r*t.duration;t.emit(\"setBar\",\"played\",r,e),t.seek=a}else{const{second:r,percentage:a}=ht(t,e);t.emit(\"setBar\",\"played\",a,e),t.seek=r}}function mt(t){return e=>{const{icons:r,option:a,proxy:o}=e,{$player:n,$progress:i}=e.template;return{...t,html:'\\n                <div class=\"art-control-progress-inner\">\\n                    <div class=\"art-progress-hover\"></div>\\n                    <div class=\"art-progress-loaded\"></div>\\n                    <div class=\"art-progress-played\"></div>\\n                    <div class=\"art-progress-highlight\"></div>\\n                    <div class=\"art-progress-indicator\"></div>\\n                    <div class=\"art-progress-tip\">00:00</div>\\n                </div>\\n            ',mounted:t=>{let s=null,l=!1;const c=u(\".art-progress-hover\",t),d=u(\".art-progress-loaded\",t),h=u(\".art-progress-played\",t),m=u(\".art-progress-highlight\",t),v=u(\".art-progress-indicator\",t),b=u(\".art-progress-tip\",t);function x(r,a){const{width:o,time:n}=a||ht(e,r);b.textContent=n||\"00:00\";const i=b.clientWidth;o<=i/2?w(b,\"left\",0):o>t.clientWidth-i/2?w(b,\"left\",t.clientWidth-i+\"px\"):w(b,\"left\",o-i/2+\"px\")}r.indicator?y(v,r.indicator):w(v,\"backgroundColor\",\"var(--art-theme)\"),e.on(\"setBar\",function(r,a,o){const i=\"played\"===r&&o&&p;if(\"loaded\"===r&&w(d,\"width\",100*a+\"%\"),\"hover\"===r&&(w(c,\"width\",100*a+\"%\"),C(o,m)?function(r){const{width:a}=ht(e,r),{text:o}=r.target.dataset;b.textContent=o;const n=b.clientWidth;a<=n/2?w(b,\"left\",0):a>t.clientWidth-n/2?w(b,\"left\",t.clientWidth-n+\"px\"):w(b,\"left\",a-n/2+\"px\")}(o):x(o),0===a?g(n,\"art-progress-hover\"):f(n,\"art-progress-hover\")),\"played\"===r&&(w(h,\"width\",100*a+\"%\"),w(v,\"left\",100*a+\"%\")),i){f(n,\"art-progress-hover\");x(o,{width:t.clientWidth*a,time:F(a*e.duration)}),clearTimeout(s),s=setTimeout(()=>{g(n,\"art-progress-hover\")},500)}}),e.on(\"video:loadedmetadata\",function(){m.textContent=\"\";for(let t=0;t<a.highlight.length;t++){const r=a.highlight[t],o=D(r.time,0,e.duration)/e.duration*100,n=`<span data-text=\"${r.text}\" data-time=\"${r.time}\" style=\"left: ${o}%\"></span>`;y(m,n)}}),e.constructor.USE_RAF?e.on(\"raf\",()=>{e.emit(\"setBar\",\"played\",e.played),e.emit(\"setBar\",\"loaded\",e.loaded)}):(e.on(\"video:timeupdate\",()=>{e.emit(\"setBar\",\"played\",e.played)}),e.on(\"video:progress\",()=>{e.emit(\"setBar\",\"loaded\",e.loaded)}),e.on(\"video:ended\",()=>{e.emit(\"setBar\",\"played\",1)})),e.emit(\"setBar\",\"loaded\",e.loaded||0),p||(o(i,\"click\",t=>{t.target!==v&&ut(e,t)}),o(i,\"mousemove\",t=>{const{percentage:r}=ht(e,t);e.emit(\"setBar\",\"hover\",r,t)}),o(i,\"mouseleave\",t=>{e.emit(\"setBar\",\"hover\",0,t)}),o(i,\"mousedown\",t=>{l=0===t.button}),e.on(\"document:mousemove\",t=>{if(l){const{second:r,percentage:a}=ht(e,t);e.emit(\"setBar\",\"played\",a,t),e.seek=r}}),e.on(\"document:mouseup\",()=>{l&&(l=!1)}))}}}}class ft extends dt{constructor(t){super(t),this.isHover=!1,this.name=\"control\",this.timer=Date.now();const{constructor:e}=t,{$player:r,$bottom:a}=this.art.template;t.on(\"mousemove\",()=>{p||(this.show=!0)}),t.on(\"click\",()=>{p?this.toggle():this.show=!0}),t.on(\"document:mousemove\",t=>{this.isHover=C(t,a)}),t.on(\"video:timeupdate\",()=>{!t.setting.show&&!this.isHover&&!t.isInput&&t.playing&&this.show&&Date.now()-this.timer>=e.CONTROL_HIDE_TIME&&(this.show=!1)}),t.on(\"control\",t=>{t?(g(r,\"art-hide-cursor\"),f(r,\"art-hover\"),this.timer=Date.now()):(f(r,\"art-hide-cursor\"),g(r,\"art-hover\"))}),this.init()}init(){const{option:t}=this.art;t.isLive||this.add(mt({name:\"progress\",position:\"top\",index:10})),this.add({name:\"thumbnails\",position:\"top\",index:20}),this.add(function(t){return e=>({...t,mounted:t=>{const{proxy:r,icons:a,i18n:o}=e,n=y(t,a.play),i=y(t,a.pause);function s(){w(n,\"display\",\"flex\"),w(i,\"display\",\"none\")}function l(){w(n,\"display\",\"none\"),w(i,\"display\",\"flex\")}T(n,o.get(\"Play\")),T(i,o.get(\"Pause\")),r(n,\"click\",()=>{e.play()}),r(i,\"click\",()=>{e.pause()}),e.playing?l():s(),e.on(\"video:playing\",()=>{l()}),e.on(\"video:pause\",()=>{s()})}})}({name:\"playAndPause\",position:\"left\",index:10})),this.add(function(t){return e=>({...t,mounted:t=>{const{proxy:r,icons:a}=e,o=y(t,a.volume),n=y(t,a.volumeClose),i=y(t,'<div class=\"art-volume-panel\"></div>'),s=y(i,'<div class=\"art-volume-inner\"></div>'),l=y(s,'<div class=\"art-volume-val\"></div>'),c=y(s,'<div class=\"art-volume-slider\"></div>'),d=y(c,'<div class=\"art-volume-handle\"></div>'),h=y(d,'<div class=\"art-volume-loaded\"></div>'),u=y(c,'<div class=\"art-volume-indicator\"></div>');function m(t){const{top:e,height:r}=P(c);return 1-(t.clientY-e)/r}function f(){if(e.muted||0===e.volume)w(o,\"display\",\"none\"),w(n,\"display\",\"flex\"),w(u,\"top\",\"100%\"),w(h,\"top\",\"100%\"),l.textContent=0;else{const t=100*e.volume;w(o,\"display\",\"flex\"),w(n,\"display\",\"none\"),w(u,\"top\",100-t+\"%\"),w(h,\"top\",100-t+\"%\"),l.textContent=Math.floor(t)}}if(f(),e.on(\"video:volumechange\",f),r(o,\"click\",()=>{e.muted=!0}),r(n,\"click\",()=>{e.muted=!1}),p)w(i,\"display\",\"none\");else{let t=!1;r(c,\"mousedown\",r=>{t=0===r.button,e.volume=m(r)}),e.on(\"document:mousemove\",r=>{t&&(e.muted=!1,e.volume=m(r))}),e.on(\"document:mouseup\",()=>{t&&(t=!1)})}}})}({name:\"volume\",position:\"left\",index:20})),t.isLive||this.add(function(t){return e=>({...t,style:p?{fontSize:\"12px\",padding:\"0 5px\"}:{cursor:\"auto\",padding:\"0 10px\"},mounted:t=>{function r(){const r=`${F(e.currentTime)} / ${F(e.duration)}`;r!==t.textContent&&(t.textContent=r)}r();const a=[\"video:loadedmetadata\",\"video:timeupdate\",\"video:progress\"];for(let o=0;o<a.length;o++)e.on(a[o],r)}})}({name:\"time\",position:\"left\",index:30})),t.quality.length&&Z().then(()=>{this.art.quality=t.quality}),t.screenshot&&!p&&this.add(function(t){return e=>({...t,tooltip:e.i18n.get(\"Screenshot\"),mounted:t=>{const{proxy:r,icons:a}=e;y(t,a.screenshot),r(t,\"click\",()=>{e.screenshot()})}})}({name:\"screenshot\",position:\"right\",index:20})),t.setting&&this.add(function(t){return e=>({...t,tooltip:e.i18n.get(\"Show Setting\"),mounted:t=>{const{proxy:r,icons:a,i18n:o}=e;y(t,a.setting),r(t,\"click\",()=>{e.setting.toggle(),e.setting.resize()}),e.on(\"setting\",e=>{T(t,o.get(e?\"Hide Setting\":\"Show Setting\"))})}})}({name:\"setting\",position:\"right\",index:30})),t.pip&&this.add(function(t){return e=>({...t,tooltip:e.i18n.get(\"PIP Mode\"),mounted:t=>{const{proxy:r,icons:a,i18n:o}=e;y(t,a.pip),r(t,\"click\",()=>{e.pip=!e.pip}),e.on(\"pip\",e=>{T(t,o.get(e?\"Exit PIP Mode\":\"PIP Mode\"))})}})}({name:\"pip\",position:\"right\",index:40})),t.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add(function(t){return e=>({...t,tooltip:e.i18n.get(\"AirPlay\"),mounted:t=>{const{proxy:r,icons:a}=e;y(t,a.airplay),r(t,\"click\",()=>e.airplay())}})}({name:\"airplay\",position:\"right\",index:50})),t.fullscreenWeb&&this.add(function(t){return e=>({...t,tooltip:e.i18n.get(\"Web Fullscreen\"),mounted:t=>{const{proxy:r,icons:a,i18n:o}=e,n=y(t,a.fullscreenWebOn),i=y(t,a.fullscreenWebOff);w(i,\"display\",\"none\"),r(t,\"click\",()=>{e.fullscreenWeb=!e.fullscreenWeb}),e.on(\"fullscreenWeb\",e=>{e?(T(t,o.get(\"Exit Web Fullscreen\")),w(n,\"display\",\"none\"),w(i,\"display\",\"inline-flex\")):(T(t,o.get(\"Web Fullscreen\")),w(n,\"display\",\"inline-flex\"),w(i,\"display\",\"none\"))})}})}({name:\"fullscreenWeb\",position:\"right\",index:60})),t.fullscreen&&this.add(function(t){return e=>({...t,tooltip:e.i18n.get(\"Fullscreen\"),mounted:t=>{const{proxy:r,icons:a,i18n:o}=e,n=y(t,a.fullscreenOn),i=y(t,a.fullscreenOff);w(i,\"display\",\"none\"),r(t,\"click\",()=>{e.fullscreen=!e.fullscreen}),e.on(\"fullscreen\",e=>{e?(T(t,o.get(\"Exit Fullscreen\")),w(n,\"display\",\"none\"),w(i,\"display\",\"inline-flex\")):(T(t,o.get(\"Fullscreen\")),w(n,\"display\",\"inline-flex\"),w(i,\"display\",\"none\"))})}})}({name:\"fullscreen\",position:\"right\",index:70}));for(let e=0;e<t.controls.length;e++)this.add(t.controls[e])}add(t){const e=\"function\"===typeof t?t(this.art):t,{$progress:r,$controlsLeft:a,$controlsRight:o}=this.art.template;switch(e.position){case\"top\":this.$parent=r;break;case\"left\":this.$parent=a;break;case\"right\":this.$parent=o;break;default:_(!1,\"Control option.position must one of 'top', 'left', 'right'\")}super.add(e)}check(t){if(t){t.$control_value.innerHTML=t.html;for(let e=0;e<t.$control_option.length;e++){const r=t.$control_option[e];r.default=r===t,r.default&&$(r.$control_item,\"art-current\")}}}selector(t,e,r){const{proxy:a}=this.art.events;f(e,\"art-control-selector\");const o=L(\"div\");f(o,\"art-selector-value\"),y(o,t.html),e.textContent=\"\",y(e,o);const n=L(\"div\");f(n,\"art-selector-list\"),y(e,n);for(let s=0;s<t.selector.length;s++){const e=t.selector[s],r=L(\"div\");f(r,\"art-selector-item\"),e.default&&f(r,\"art-current\"),r.dataset.index=s,r.dataset.value=e.value,r.innerHTML=e.html,y(n,r),H(e,\"$control_option\",{get:()=>t.selector}),H(e,\"$control_item\",{get:()=>r}),H(e,\"$control_value\",{get:()=>o})}const i=a(n,\"click\",async e=>{const r=R(e),a=t.selector.find(t=>t.$control_item===r.find(e=>t.$control_item===e));this.check(a),t.onSelect&&(o.innerHTML=await t.onSelect.call(this.art,a,a.$control_item,e))});r.push(i)}}function gt(t,e,r,a){const o=e-a,n=r-t;let i=0;if(Math.abs(n)<2&&Math.abs(o)<2)return i;const s=function(t,e){return 180*Math.atan2(e,t)/Math.PI}(n,o);return s>=-45&&s<45?i=4:s>=45&&s<135?i=1:s>=-135&&s<-45?i=2:(s>=135&&s<=180||s>=-180&&s<-135)&&(i=3),i}class vt{constructor(t){this.destroyEvents=new Set,this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),function(t,e){const{constructor:r,template:{$player:a,$video:o}}=t;function n(e){C(e,a)?(t.isInput=\"INPUT\"===e.target.tagName,t.isFocus=!0,t.emit(\"focus\",e)):(t.isInput=!1,t.isFocus=!1,t.emit(\"blur\",e))}t.on(\"document:click\",n),t.on(\"document:contextmenu\",n);let i=[];e.proxy(o,\"click\",e=>{const a=Date.now();i.push(a);const{MOBILE_CLICK_PLAY:o,DBCLICK_TIME:n,MOBILE_DBCLICK_PLAY:s,DBCLICK_FULLSCREEN:l}=r,c=i.filter(t=>a-t<=n);switch(c.length){case 1:t.emit(\"click\",e),p?!t.isLock&&o&&t.toggle():t.toggle(),i=c;break;case 2:t.emit(\"dblclick\",e),p?!t.isLock&&s&&t.toggle():l&&(t.fullscreen=!t.fullscreen),i=[];break;default:i=[]}})}(t,this),function(t,e){const{$player:r}=t.template;e.hover(r,e=>{f(r,\"art-hover\"),t.emit(\"hover\",!0,e)},e=>{g(r,\"art-hover\"),t.emit(\"hover\",!1,e)})}(t,this),function(t,e){const{$player:r}=t.template;e.proxy(r,\"mousemove\",e=>{t.emit(\"mousemove\",e)})}(t,this),function(t,e){const{option:r,constructor:a}=t;t.on(\"resize\",()=>{const{aspectRatio:e,notice:a}=t;\"standard\"===t.state&&r.autoSize&&t.autoSize(),t.aspectRatio=e,a.show=\"\"});const o=J(()=>t.emit(\"resize\"),a.RESIZE_TIME);t.on(\"window:orientationchange\",()=>o()),t.on(\"window:resize\",()=>o()),screen&&screen.orientation&&screen.orientation.onchange&&e.proxy(screen.orientation,\"change\",()=>o())}(t,this),function(t,e){if(p&&!t.option.isLive){const{$video:r,$progress:a}=t.template;let o=null,n=!1,i=0,s=0,l=0;const c=e=>{if(1===e.touches.length&&!t.isLock){o===a&&ut(t,e),n=!0;const{pageX:r,pageY:c}=e.touches[0];i=r,s=c,l=t.currentTime}},d=e=>{if(1===e.touches.length&&n&&t.duration){const{pageX:a,pageY:n}=e.touches[0],c=gt(i,s,a,n),d=[3,4].includes(c),p=[1,2].includes(c);if(d&&!t.isRotate||p&&t.isRotate){const c=D((a-i)/t.width,-1,1),d=D((n-s)/t.height,-1,1),p=t.isRotate?d:c,h=o===r?t.constructor.TOUCH_MOVE_RATIO:1,u=D(l+t.duration*p*h,0,t.duration);t.seek=u,t.emit(\"setBar\",\"played\",D(u/t.duration,0,1),e),t.notice.show=`${F(u)} / ${F(t.duration)}`}}},p=()=>{n&&(i=0,s=0,l=0,n=!1,o=null)};t.option.gesture&&(e.proxy(r,\"touchstart\",t=>{o=r,c(t)}),e.proxy(r,\"touchmove\",d)),e.proxy(a,\"touchstart\",t=>{o=a,c(t)}),e.proxy(a,\"touchmove\",d),t.on(\"document:touchend\",p)}}(t,this),function(t){const{option:e,constructor:r,template:{$container:a}}=t,o=Q(()=>{t.emit(\"view\",E(a,r.SCROLL_GAP))},r.SCROLL_TIME);t.on(\"window:scroll\",()=>o()),t.on(\"view\",r=>{e.autoMini&&(t.mini=!r)})}(t),function(t,e){const r=[\"click\",\"mouseup\",\"keydown\",\"touchend\",\"touchmove\",\"mousemove\",\"pointerup\",\"contextmenu\",\"pointermove\",\"visibilitychange\",\"webkitfullscreenchange\"],a=[\"resize\",\"scroll\",\"orientationchange\"],o=[];function n(n={}){for(let t=0;t<o.length;t++)e.remove(o[t]);o.length=0;const{$player:i}=t.template;r.forEach(r=>{const a=n.document||i.ownerDocument||document,s=e.proxy(a,r,e=>{t.emit(`document:${r}`,e)});o.push(s)}),a.forEach(r=>{const a=n.window||i.ownerDocument?.defaultView||window,s=e.proxy(a,r,e=>{t.emit(`window:${r}`,e)});o.push(s)})}n(),e.bindGlobalEvents=n}(t,this),function(t){if(t.constructor.USE_RAF){let e=null;!function r(){t.playing&&t.emit(\"raf\"),t.isDestroy||(e=requestAnimationFrame(r))}(),t.on(\"destroy\",()=>{cancelAnimationFrame(e)})}}(t)}proxy(t,e,r,a={}){if(Array.isArray(e))return e.map(e=>this.proxy(t,e,r,a));t.addEventListener(e,r,a);const o=()=>t.removeEventListener(e,r,a);return this.destroyEvents.add(o),o}hover(t,e,r){e&&this.proxy(t,\"mouseenter\",e),r&&this.proxy(t,\"mouseleave\",r)}remove(t){if(this.destroyEvents.has(t))try{t()}catch(e){console.warn(\"Failed to remove event listener:\",e)}finally{this.destroyEvents.delete(t)}}destroy(){for(const e of this.destroyEvents)try{e()}catch(t){console.warn(\"Failed to destroy event listener:\",t)}this.destroyEvents.clear()}}class yt{constructor(t){this.art=t,this.keys={},p||this.init()}init(){const{constructor:t}=this.art;this.art.option.hotkey&&(this.add(\"Escape\",()=>{this.art.fullscreenWeb&&(this.art.fullscreenWeb=!1)}),this.add(\"Space\",()=>{this.art.toggle()}),this.add(\"ArrowLeft\",()=>{this.art.backward=t.SEEK_STEP}),this.add(\"ArrowUp\",()=>{this.art.volume+=t.VOLUME_STEP}),this.add(\"ArrowRight\",()=>{this.art.forward=t.SEEK_STEP}),this.add(\"ArrowDown\",()=>{this.art.volume-=t.VOLUME_STEP})),this.art.on(\"document:keydown\",t=>{if(this.art.isFocus){const e=document.activeElement.tagName.toUpperCase(),r=document.activeElement.getAttribute(\"contenteditable\");if(\"INPUT\"!==e&&\"TEXTAREA\"!==e&&\"\"!==r&&\"true\"!==r&&!t.altKey&&!t.ctrlKey&&!t.metaKey&&!t.shiftKey){const e=this.keys[t.code];if(e){t.preventDefault();for(let r=0;r<e.length;r++)e[r].call(this.art,t);this.art.emit(\"hotkey\",t)}}}this.art.emit(\"keydown\",t)})}add(t,e){return this.keys[t]?this.keys[t].includes(e)||this.keys[t].push(e):this.keys[t]=[e],this}remove(t,e){if(this.keys[t]){const r=this.keys[t].indexOf(e);-1!==r&&this.keys[t].splice(r,1),0===this.keys[t].length&&delete this.keys[t]}return this}}const bt={\"Video Info\":\"\\u7edf\\u8ba1\\u4fe1\\u606f\",Close:\"\\u5173\\u95ed\",\"Video Load Failed\":\"\\u52a0\\u8f7d\\u5931\\u8d25\",Volume:\"\\u97f3\\u91cf\",Play:\"\\u64ad\\u653e\",Pause:\"\\u6682\\u505c\",Rate:\"\\u901f\\u5ea6\",Mute:\"\\u9759\\u97f3\",\"Video Flip\":\"\\u753b\\u9762\\u7ffb\\u8f6c\",Horizontal:\"\\u6c34\\u5e73\",Vertical:\"\\u5782\\u76f4\",Reconnect:\"\\u91cd\\u65b0\\u8fde\\u63a5\",\"Show Setting\":\"\\u663e\\u793a\\u8bbe\\u7f6e\",\"Hide Setting\":\"\\u9690\\u85cf\\u8bbe\\u7f6e\",Screenshot:\"\\u622a\\u56fe\",\"Play Speed\":\"\\u64ad\\u653e\\u901f\\u5ea6\",\"Aspect Ratio\":\"\\u753b\\u9762\\u6bd4\\u4f8b\",Default:\"\\u9ed8\\u8ba4\",Normal:\"\\u6b63\\u5e38\",Open:\"\\u6253\\u5f00\",\"Switch Video\":\"\\u5207\\u6362\",\"Switch Subtitle\":\"\\u5207\\u6362\\u5b57\\u5e55\",Fullscreen:\"\\u5168\\u5c4f\",\"Exit Fullscreen\":\"\\u9000\\u51fa\\u5168\\u5c4f\",\"Web Fullscreen\":\"\\u7f51\\u9875\\u5168\\u5c4f\",\"Exit Web Fullscreen\":\"\\u9000\\u51fa\\u7f51\\u9875\\u5168\\u5c4f\",\"Mini Player\":\"\\u8ff7\\u4f60\\u64ad\\u653e\\u5668\",\"PIP Mode\":\"\\u5f00\\u542f\\u753b\\u4e2d\\u753b\",\"Exit PIP Mode\":\"\\u9000\\u51fa\\u753b\\u4e2d\\u753b\",\"PIP Not Supported\":\"\\u4e0d\\u652f\\u6301\\u753b\\u4e2d\\u753b\",\"Fullscreen Not Supported\":\"\\u4e0d\\u652f\\u6301\\u5168\\u5c4f\",\"Subtitle Offset\":\"\\u5b57\\u5e55\\u504f\\u79fb\",\"Last Seen\":\"\\u4e0a\\u6b21\\u770b\\u5230\",\"Jump Play\":\"\\u8df3\\u8f6c\\u64ad\\u653e\",AirPlay:\"\\u9694\\u7a7a\\u64ad\\u653e\",\"AirPlay Not Available\":\"\\u9694\\u7a7a\\u64ad\\u653e\\u4e0d\\u53ef\\u7528\"};\"undefined\"!==typeof window&&(window[\"artplayer-i18n-zh-cn\"]=bt);class wt{constructor(t){this.art=t,this.languages={\"zh-cn\":bt},this.language={},this.update(t.option.i18n)}init(){const t=this.art.option.lang.toLowerCase();this.language=this.languages[t]||{}}get(t){return this.language[t]||t}update(t){this.languages=q(this.languages,t),this.init()}}class xt{constructor(t){const e={loading:'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"50px\" height=\"50px\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid\" class=\"uil-default\">\\n  <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill=\"none\" class=\"bk\"/>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(0 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-1s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(30 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.9166666666666666s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(60 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.8333333333333334s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(90 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.75s\" repeatCount=\"indefinite\"/></rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(120 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.6666666666666666s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(150 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.5833333333333334s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(180 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.5s\" repeatCount=\"indefinite\"/></rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(210 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.4166666666666667s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(240 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.3333333333333333s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(270 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.25s\" repeatCount=\"indefinite\"/></rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(300 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.16666666666666666s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(330 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.08333333333333333s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n</svg>',state:'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\" viewBox=\"0 0 24 24\">\\n<path d=\"M9.5 9.325v5.35q0 .575.525.875t1.025-.05l4.15-2.65q.475-.3.475-.85t-.475-.85L11.05 8.5q-.5-.35-1.025-.05t-.525.875ZM12 22q-2.075 0-3.9-.788t-3.175-2.137q-1.35-1.35-2.137-3.175T2 12q0-2.075.788-3.9t2.137-3.175q1.35-1.35 3.175-2.137T12 2q2.075 0 3.9.788t3.175 2.137q1.35 1.35 2.138 3.175T22 12q0 2.075-.788 3.9t-2.137 3.175q-1.35 1.35-3.175 2.138T12 22Z\"/>\\n</svg>\\n',play:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n  <path d=\"M17.982 9.275L8.06 3.27A2.013 2.013 0 0 0 5 4.994v12.011a2.017 2.017 0 0 0 3.06 1.725l9.922-6.005a2.017 2.017 0 0 0 0-3.45z\"></path>\\n</svg>',pause:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n    <path d=\"M7 3a2 2 0 0 0-2 2v12a2 2 0 1 0 4 0V5a2 2 0 0 0-2-2zM15 3a2 2 0 0 0-2 2v12a2 2 0 1 0 4 0V5a2 2 0 0 0-2-2z\"></path>\\n</svg>',check:'<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 24 24\" style=\"width: 100%; height: 100%;\">\\n<path d=\"M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z\" />\\n</svg>',volume:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n    <path d=\"M10.188 4.65L6 8H5a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h1l4.188 3.35a.5.5 0 0 0 .812-.39V5.04a.498.498 0 0 0-.812-.39zM14.446 3.778a1 1 0 0 0-.862 1.804 6.002 6.002 0 0 1-.007 10.838 1 1 0 0 0 .86 1.806A8.001 8.001 0 0 0 19 11a8.001 8.001 0 0 0-4.554-7.222z\"></path>\\n    <path d=\"M15 11a3.998 3.998 0 0 0-2-3.465v6.93A3.998 3.998 0 0 0 15 11z\"></path>\\n</svg>',volumeClose:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n    <path d=\"M15 11a3.998 3.998 0 0 0-2-3.465v2.636l1.865 1.865A4.02 4.02 0 0 0 15 11z\"></path>\\n    <path d=\"M13.583 5.583A5.998 5.998 0 0 1 17 11a6 6 0 0 1-.585 2.587l1.477 1.477a8.001 8.001 0 0 0-3.446-11.286 1 1 0 0 0-.863 1.805zM18.778 18.778l-2.121-2.121-1.414-1.414-1.415-1.415L13 13l-2-2-3.889-3.889-3.889-3.889a.999.999 0 1 0-1.414 1.414L5.172 8H5a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h1l4.188 3.35a.5.5 0 0 0 .812-.39v-3.131l2.587 2.587-.01.005a1 1 0 0 0 .86 1.806c.215-.102.424-.214.627-.333l2.3 2.3a1.001 1.001 0 0 0 1.414-1.416zM11 5.04a.5.5 0 0 0-.813-.39L8.682 5.854 11 8.172V5.04z\"></path>\\n</svg>',screenshot:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 50 50\">\\n\\t<path d=\"M 19.402344 6 C 17.019531 6 14.96875 7.679688 14.5 10.011719 L 14.097656 12 L 9 12 C 6.238281 12 4 14.238281 4 17 L 4 38 C 4 40.761719 6.238281 43 9 43 L 41 43 C 43.761719 43 46 40.761719 46 38 L 46 17 C 46 14.238281 43.761719 12 41 12 L 35.902344 12 L 35.5 10.011719 C 35.03125 7.679688 32.980469 6 30.597656 6 Z M 25 17 C 30.519531 17 35 21.480469 35 27 C 35 32.519531 30.519531 37 25 37 C 19.480469 37 15 32.519531 15 27 C 15 21.480469 19.480469 17 25 17 Z M 25 19 C 20.589844 19 17 22.589844 17 27 C 17 31.410156 20.589844 35 25 35 C 29.410156 35 33 31.410156 33 27 C 33 22.589844 29.410156 19 25 19 Z \"/>\\n</svg>\\n',setting:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n    <circle cx=\"11\" cy=\"11\" r=\"2\"></circle>\\n    <path d=\"M19.164 8.861L17.6 8.6a6.978 6.978 0 0 0-1.186-2.099l.574-1.533a1 1 0 0 0-.436-1.217l-1.997-1.153a1.001 1.001 0 0 0-1.272.23l-1.008 1.225a7.04 7.04 0 0 0-2.55.001L8.716 2.829a1 1 0 0 0-1.272-.23L5.447 3.751a1 1 0 0 0-.436 1.217l.574 1.533A6.997 6.997 0 0 0 4.4 8.6l-1.564.261A.999.999 0 0 0 2 9.847v2.306c0 .489.353.906.836.986l1.613.269a7 7 0 0 0 1.228 2.075l-.558 1.487a1 1 0 0 0 .436 1.217l1.997 1.153c.423.244.961.147 1.272-.23l1.04-1.263a7.089 7.089 0 0 0 2.272 0l1.04 1.263a1 1 0 0 0 1.272.23l1.997-1.153a1 1 0 0 0 .436-1.217l-.557-1.487c.521-.61.94-1.31 1.228-2.075l1.613-.269a.999.999 0 0 0 .835-.986V9.847a.999.999 0 0 0-.836-.986zM11 15a4 4 0 1 1 0-8 4 4 0 0 1 0 8z\"></path>\\n</svg>',pip:'<svg viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\">\\n<path d=\"M844.8 219.648h-665.6c-6.144 0-10.24 4.608-10.24 10.752v563.2c0 5.632 4.096 10.24 10.24 10.24h256v92.16h-256a102.4 102.4 0 0 1-102.4-102.4v-563.2c0-56.832 45.568-102.4 102.4-102.4h665.6a102.4 102.4 0 0 1 102.4 102.4v204.8h-92.16v-204.8c0-6.144-4.608-10.752-10.24-10.752zM614.4 588.8c-28.672 0-51.2 22.528-51.2 51.2v204.8c0 28.16 22.528 51.2 51.2 51.2h281.6c28.16 0 51.2-23.04 51.2-51.2v-204.8c0-28.672-23.04-51.2-51.2-51.2H614.4z\"></path>\\n</svg>',arrowLeft:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" version=\"1.1\" viewBox=\"0 0 32 32\">\\n    <path d=\"M 19.41,20.09 14.83,15.5 19.41,10.91 18,9.5 l -6,6 6,6 z\" />\\n</svg>',arrowRight:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" version=\"1.1\" viewBox=\"0 0 32 32\">\\n    <path d=\"m 12.59,20.34 4.58,-4.59 -4.58,-4.59 1.41,-1.41 6,6 -6,6 z\" />\\n</svg>',playbackRate:'<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\"><path d=\"M10,8v8l6-4L10,8L10,8z M6.3,5L5.7,4.2C7.2,3,9,2.2,11,2l0.1,1C9.3,3.2,7.7,3.9,6.3,5z            M5,6.3L4.2,5.7C3,7.2,2.2,9,2,11 l1,.1C3.2,9.3,3.9,7.7,5,6.3z            M5,17.7c-1.1-1.4-1.8-3.1-2-4.8L2,13c0.2,2,1,3.8,2.2,5.4L5,17.7z            M11.1,21c-1.8-0.2-3.4-0.9-4.8-2 l-0.6,.8C7.2,21,9,21.8,11,22L11.1,21z            M22,12c0-5.2-3.9-9.4-9-10l-0.1,1c4.6,.5,8.1,4.3,8.1,9s-3.5,8.5-8.1,9l0.1,1 C18.2,21.5,22,17.2,22,12z\" data-darkreader-inline-fill=\"\" style=\"--darkreader-inline-fill:#a8a6a4;\"></path></svg>',aspectRatio:'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 88 88\" preserveAspectRatio=\"xMidYMid meet\" style=\"width: 100%; height: 100%; transform: translate3d(0px, 0px, 0px);\"><defs><clipPath id=\"__lottie_element_216\"><rect width=\"88\" height=\"88\" x=\"0\" y=\"0\"></rect></clipPath></defs><g clip-path=\"url(#__lottie_element_216)\"><g transform=\"matrix(1,0,0,1,44,44)\" opacity=\"1\" style=\"display: block;\"><g opacity=\"1\" transform=\"matrix(1,0,0,1,0,0)\"><path fill-opacity=\"1\" d=\" M12.437999725341797,-12.70199966430664 C12.437999725341797,-12.70199966430664 9.618000030517578,-9.881999969482422 9.618000030517578,-9.881999969482422 C8.82800006866455,-9.092000007629395 8.82800006866455,-7.831999778747559 9.618000030517578,-7.052000045776367 C9.618000030517578,-7.052000045776367 16.687999725341797,0.017999999225139618 16.687999725341797,0.017999999225139618 C16.687999725341797,0.017999999225139618 9.618000030517578,7.0879998207092285 9.618000030517578,7.0879998207092285 C8.82800006866455,7.877999782562256 8.82800006866455,9.137999534606934 9.618000030517578,9.918000221252441 C9.618000030517578,9.918000221252441 12.437999725341797,12.748000144958496 12.437999725341797,12.748000144958496 C13.227999687194824,13.527999877929688 14.48799991607666,13.527999877929688 15.267999649047852,12.748000144958496 C15.267999649047852,12.748000144958496 26.58799934387207,1.437999963760376 26.58799934387207,1.437999963760376 C27.368000030517578,0.6579999923706055 27.368000030517578,-0.6119999885559082 26.58799934387207,-1.3919999599456787 C26.58799934387207,-1.3919999599456787 15.267999649047852,-12.70199966430664 15.267999649047852,-12.70199966430664 C14.48799991607666,-13.491999626159668 13.227999687194824,-13.491999626159668 12.437999725341797,-12.70199966430664z M-12.442000389099121,-12.70199966430664 C-13.182000160217285,-13.442000389099121 -14.362000465393066,-13.482000350952148 -15.142000198364258,-12.821999549865723 C-15.142000198364258,-12.821999549865723 -15.272000312805176,-12.70199966430664 -15.272000312805176,-12.70199966430664 C-15.272000312805176,-12.70199966430664 -26.582000732421875,-1.3919999599456787 -26.582000732421875,-1.3919999599456787 C-27.32200050354004,-0.6520000100135803 -27.36199951171875,0.5180000066757202 -26.70199966430664,1.3079999685287476 C-26.70199966430664,1.3079999685287476 -26.582000732421875,1.437999963760376 -26.582000732421875,1.437999963760376 C-26.582000732421875,1.437999963760376 -15.272000312805176,12.748000144958496 -15.272000312805176,12.748000144958496 C-14.531999588012695,13.48799991607666 -13.362000465393066,13.527999877929688 -12.571999549865723,12.868000030517578 C-12.571999549865723,12.868000030517578 -12.442000389099121,12.748000144958496 -12.442000389099121,12.748000144958496 C-12.442000389099121,12.748000144958496 -9.612000465393066,9.918000221252441 -9.612000465393066,9.918000221252441 C-8.871999740600586,9.178000450134277 -8.831999778747559,8.008000373840332 -9.501999855041504,7.2179999351501465 C-9.501999855041504,7.2179999351501465 -9.612000465393066,7.0879998207092285 -9.612000465393066,7.0879998207092285 C-9.612000465393066,7.0879998207092285 -16.68199920654297,0.017999999225139618 -16.68199920654297,0.017999999225139618 C-16.68199920654297,0.017999999225139618 -9.612000465393066,-7.052000045776367 -9.612000465393066,-7.052000045776367 C-8.871999740600586,-7.791999816894531 -8.831999778747559,-8.961999893188477 -9.501999855041504,-9.751999855041504 C-9.501999855041504,-9.751999855041504 -9.612000465393066,-9.881999969482422 -9.612000465393066,-9.881999969482422 C-9.612000465393066,-9.881999969482422 -12.442000389099121,-12.70199966430664 -12.442000389099121,-12.70199966430664z M28,-28 C32.41999816894531,-28 36,-24.420000076293945 36,-20 C36,-20 36,20 36,20 C36,24.420000076293945 32.41999816894531,28 28,28 C28,28 -28,28 -28,28 C-32.41999816894531,28 -36,24.420000076293945 -36,20 C-36,20 -36,-20 -36,-20 C-36,-24.420000076293945 -32.41999816894531,-28 -28,-28 C-28,-28 28,-28 28,-28z\" data-darkreader-inline-fill=\"\" style=\"--darkreader-inline-fill:#a8a6a4;\"></path></g></g></g></svg>',config:'<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\"><path d=\"M15,17h6v1h-6V17z M11,17H3v1h8v2h1v-2v-1v-2h-1V17z M14,8h1V6V5V3h-1v2H3v1h11V8z            M18,5v1h3V5H18z M6,14h1v-2v-1V9H6v2H3v1 h3V14z M10,12h11v-1H10V12z\" data-darkreader-inline-fill=\"\" style=\"--darkreader-inline-fill:#a8a6a4;\"></path></svg>',lock:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1650612139149\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\">\\n<path d=\"M298.666667 426.666667V341.333333a213.333333 213.333333 0 1 1 426.666666 0v85.333334h42.666667a85.333333 85.333333 0 0 1 85.333333 85.333333v256a85.333333 85.333333 0 0 1-85.333333 85.333333H256a85.333333 85.333333 0 0 1-85.333333-85.333333v-256a85.333333 85.333333 0 0 1 85.333333-85.333333h42.666667z m213.333333-213.333334a128 128 0 0 0-128 128v85.333334h256V341.333333a128 128 0 0 0-128-128z\"></path>\\n</svg>\\n',flip:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1652445277062\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"24\" height=\"24\">\\n<path d=\"M554.666667 810.666667v85.333333h-85.333334v-85.333333h85.333334zM170.666667 178.005333a42.666667 42.666667 0 0 1 34.986666 18.218667l203.904 291.328a42.666667 42.666667 0 0 1 0 48.896l-203.946666 291.328A42.666667 42.666667 0 0 1 128 803.328V220.672a42.666667 42.666667 0 0 1 42.666667-42.666667z m682.666666 0a42.666667 42.666667 0 0 1 42.368 37.717334l0.298667 4.949333v582.656a42.666667 42.666667 0 0 1-74.24 28.629333l-3.413333-4.181333-203.904-291.328a42.666667 42.666667 0 0 1-3.029334-43.861333l3.029334-5.034667 203.946666-291.328A42.666667 42.666667 0 0 1 853.333333 178.005333zM554.666667 640v85.333333h-85.333334v-85.333333h85.333334zM196.266667 319.104V716.8L335.957333 512 196.309333 319.104zM554.666667 469.333333v85.333334h-85.333334v-85.333334h85.333334z m0-170.666666v85.333333h-85.333334V298.666667h85.333334z m0-170.666667v85.333333h-85.333334V128h85.333334z\">\\n</path>\\n</svg>\\n',unlock:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1650612464266\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\"><path d=\"M666.752 194.517333L617.386667 268.629333A128 128 0 0 0 384 341.333333l0.042667 85.333334h384a85.333333 85.333333 0 0 1 85.333333 85.333333v256a85.333333 85.333333 0 0 1-85.333333 85.333333H256a85.333333 85.333333 0 0 1-85.333333-85.333333v-256a85.333333 85.333333 0 0 1 85.333333-85.333333h42.666667V341.333333a213.333333 213.333333 0 0 1 368.085333-146.816z\"></path></svg>\\n',fullscreenOff:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"22\" height=\"22\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n<path d=\"M768 298.666667h170.666667v85.333333h-256V128h85.333333v170.666667zM341.333333 384H85.333333V298.666667h170.666667V128h85.333333v256z m426.666667 341.333333v170.666667h-85.333333v-256h256v85.333333h-170.666667zM341.333333 640v256H256v-170.666667H85.333333v-85.333333h256z\" />\\n</svg>\\n',fullscreenOn:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"22\" height=\"22\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n<path d=\"M625.777778 256h142.222222V398.222222h113.777778V142.222222H625.777778v113.777778zM256 398.222222V256H398.222222v-113.777778H142.222222V398.222222h113.777778zM768 625.777778v142.222222H625.777778v113.777778h256V625.777778h-113.777778zM398.222222 768H256V625.777778h-113.777778v256H398.222222v-113.777778z\" />\\n</svg>\\n',fullscreenWebOff:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"18\" height=\"18\" viewBox=\"0 0 1152 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n<path d=\"M1075.2 0H76.8A76.8 76.8 0 0 0 0 76.8v870.4A76.8 76.8 0 0 0 76.8 1024h998.4a76.8 76.8 0 0 0 76.8-76.8V76.8A76.8 76.8 0 0 0 1075.2 0zM1024 128v768H128V128h896zM896 512a64 64 0 0 1 7.488 127.552L896 640h-128v128a64 64 0 0 1-56.512 63.552L704 832a64 64 0 0 1-63.552-56.512L640 768V582.592c0-34.496 25.024-66.112 61.632-70.208L709.632 512H896zM256 512a64 64 0 0 1-7.488-127.552L256 384h128V256a64 64 0 0 1 56.512-63.552L448 192a64 64 0 0 1 63.552 56.512L512 256v185.408c0 34.432-25.024 66.112-61.632 70.144L442.368 512H256z\" />\\n</svg>\\n',fullscreenWebOn:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"18\" height=\"18\" viewBox=\"0 0 1152 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n<path d=\"M1075.2 0H76.8A76.8 76.8 0 0 0 0 76.8v870.4A76.8 76.8 0 0 0 76.8 1024h998.4a76.8 76.8 0 0 0 76.8-76.8V76.8A76.8 76.8 0 0 0 1075.2 0zM1024 128v768H128V128h896zM448 192a64 64 0 0 1 7.488 127.552L448 320H320v128a64 64 0 0 1-56.512 63.552L256 512a64 64 0 0 1-63.552-56.512L192 448V262.592c0-34.432 25.024-66.112 61.632-70.144L261.632 192H448zM704 832a64 64 0 0 1-7.488-127.552L704 704h128V576a64 64 0 0 1 56.512-63.552L896 512a64 64 0 0 1 63.552 56.512L960 576v185.408c0 34.496-25.024 66.112-61.632 70.208l-8 0.384H704z\" />\\n</svg>\\n',switchOn:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"26\" height=\"26\" viewBox=\"0 0 1664 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n    <path fill=\"#648FFC\" d=\"M1152 0H512a512 512 0 0 0 0 1024h640a512 512 0 0 0 0-1024z m0 960a448 448 0 1 1 448-448 448 448 0 0 1-448 448z\"  />\\n</svg>',switchOff:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"26\" height=\"26\" viewBox=\"0 0 1740 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n    <path d=\"M511.8976 1024h670.5152c282.4192-0.4096 511.1808-229.4784 511.1808-511.8976 0-282.4192-228.7616-511.488-511.1808-511.8976H511.8976C229.4784 0.6144 0.7168 229.6832 0.7168 512.1024c0 282.4192 228.7616 511.488 511.1808 511.8976zM511.3344 48.64A464.5888 464.5888 0 1 1 48.0256 513.024 463.872 463.872 0 0 1 511.3344 48.4352V48.64z\" />\\n</svg>\\n',error:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1652850026663\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2749\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"50\" height=\"50\">\\n<path d=\"M593.8176 168.5504l356.00384 595.21024c26.15296 43.74528 10.73152 99.7376-34.44736 125.05088-14.39744 8.06912-30.72 12.30848-47.37024 12.30848H155.97568C103.75168 901.12 61.44 860.16 61.44 809.61536c0-16.09728 4.38272-31.92832 12.71808-45.8752L430.16192 168.5504c26.17344-43.7248 84.00896-58.65472 129.20832-33.34144a93.0816 93.0816 0 0 1 34.44736 33.34144zM512 819.2a61.44 61.44 0 1 0 0-122.88 61.44 61.44 0 0 0 0 122.88z m0-512a72.31488 72.31488 0 0 0-71.76192 81.3056l25.72288 205.7216a46.40768 46.40768 0 0 0 92.07808 0l25.72288-205.74208A72.31488 72.31488 0 0 0 512 307.2z\" p-id=\"2750\">\\n</path>\\n</svg>',close:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1655876154826\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"22\" height=\"22\">\\n<path d=\"M571.733333 512l268.8-268.8c17.066667-17.066667 17.066667-42.666667 0-59.733333-17.066667-17.066667-42.666667-17.066667-59.733333 0L512 452.266667 243.2 183.466667c-17.066667-17.066667-42.666667-17.066667-59.733333 0-17.066667 17.066667-17.066667 42.666667 0 59.733333L452.266667 512 183.466667 780.8c-17.066667 17.066667-17.066667 42.666667 0 59.733333 8.533333 8.533333 19.2 12.8 29.866666 12.8s21.333333-4.266667 29.866667-12.8L512 571.733333l268.8 268.8c8.533333 8.533333 19.2 12.8 29.866667 12.8s21.333333-4.266667 29.866666-12.8c17.066667-17.066667 17.066667-42.666667 0-59.733333L571.733333 512z\" p-id=\"2131\">\\n</path>\\n</svg>',airplay:'<svg width=\"18px\" height=\"18px\" viewBox=\"0 0 18 18\" xmlns=\"http://www.w3.org/2000/svg\">\\n    <g>\\n        <path d=\"M16,1 L2,1 C1.447,1 1,1.447 1,2 L1,12 C1,12.553 1.447,13 2,13 L5,13 L5,11 L3,11 L3,3 L15,3 L15,11 L13,11 L13,13 L16,13 C16.553,13 17,12.553 17,12 L17,2 C17,1.447 16.553,1 16,1 L16,1 Z\"></path>\\n        <polygon points=\"4 17 14 17 9 11\"></polygon>\\n    </g>\\n</svg>\\n',...t.option.icons};for(const r in e)H(this,r,{get:()=>S(r,e[r])})}}class kt extends dt{constructor(t){super(t),this.name=\"info\",p||this.init()}init(){const{proxy:t,constructor:e,template:{$infoPanel:r,$infoClose:a,$video:o}}=this.art;t(a,\"click\",()=>{this.show=!1});let n=null;const i=m(\"[data-video]\",r)||[];this.art.on(\"destroy\",()=>clearTimeout(n)),function t(){for(let e=0;e<i.length;e++){const t=i[e],r=o[t.dataset.video],a=\"number\"===typeof r?r.toFixed(2):r;t.textContent!==a&&(t.textContent=a)}n=setTimeout(t,e.INFO_LOOP_TIME)}()}}class $t extends dt{constructor(t){super(t);const{option:e,template:{$layer:r}}=t;this.name=\"layer\",this.$parent=r;for(let a=0;a<e.layers.length;a++)this.add(e.layers[a])}}class Tt extends dt{constructor(t){super(t),this.name=\"loading\",y(t.template.$loading,t.icons.loading)}}class Et extends dt{constructor(t){super(t),this.name=\"mask\";const{template:e,icons:r,events:a}=t,o=y(e.$state,r.state),n=y(e.$state,r.error);w(n,\"display\",\"none\"),t.on(\"destroy\",()=>{w(o,\"display\",\"none\"),w(n,\"display\",null)}),a.proxy(e.$state,\"click\",()=>t.play())}}class Ct{constructor(t){this.art=t,this.timer=null,t.on(\"destroy\",()=>this.destroy())}destroy(){this.timer&&(clearTimeout(this.timer),this.timer=null)}set show(t){const{constructor:e,template:{$player:r,$noticeInner:a}}=this.art;t?(a.textContent=t instanceof Error?t.message.trim():t,f(r,\"art-notice-show\"),clearTimeout(this.timer),this.timer=setTimeout(()=>{a.textContent=\"\",g(r,\"art-notice-show\")},e.NOTICE_TIME)):g(r,\"art-notice-show\")}get show(){const{template:{$player:t}}=this.art;return t.classList.contains(\"art-notice-show\")}}const zt=[[\"requestFullscreen\",\"exitFullscreen\",\"fullscreenElement\",\"fullscreenEnabled\",\"fullscreenchange\",\"fullscreenerror\"],[\"webkitRequestFullscreen\",\"webkitExitFullscreen\",\"webkitFullscreenElement\",\"webkitFullscreenEnabled\",\"webkitfullscreenchange\",\"webkitfullscreenerror\"],[\"webkitRequestFullScreen\",\"webkitCancelFullScreen\",\"webkitCurrentFullScreenElement\",\"webkitCancelFullScreen\",\"webkitfullscreenchange\",\"webkitfullscreenerror\"],[\"mozRequestFullScreen\",\"mozCancelFullScreen\",\"mozFullScreenElement\",\"mozFullScreenEnabled\",\"mozfullscreenchange\",\"mozfullscreenerror\"],[\"msRequestFullscreen\",\"msExitFullscreen\",\"msFullscreenElement\",\"msFullscreenEnabled\",\"MSFullscreenChange\",\"MSFullscreenError\"]],Lt=(()=>{if(\"undefined\"===typeof document)return!1;const t=zt[0],e={};for(const r of zt){if(r[1]in document){for(const[a,o]of r.entries())e[t[a]]=o;return e}}return!1})(),St={change:Lt.fullscreenchange,error:Lt.fullscreenerror},Mt={request:(t=document.documentElement,e)=>new Promise((r,a)=>{const o=()=>{Mt.off(\"change\",o),r()};Mt.on(\"change\",o);const n=t[Lt.requestFullscreen](e);n instanceof Promise&&n.then(o).catch(a)}),exit:()=>new Promise((t,e)=>{if(!Mt.isFullscreen)return void t();const r=()=>{Mt.off(\"change\",r),t()};Mt.on(\"change\",r);const a=document[Lt.exitFullscreen]();a instanceof Promise&&a.then(r).catch(e)}),toggle:(t,e)=>Mt.isFullscreen?Mt.exit():Mt.request(t,e),onchange(t){Mt.on(\"change\",t)},onerror(t){Mt.on(\"error\",t)},on(t,e){const r=St[t];r&&document.addEventListener(r,e,!1)},off(t,e){const r=St[t];r&&document.removeEventListener(r,e,!1)},raw:Lt};function It(t){const{i18n:e,notice:r,template:{$video:a,$player:o}}=t;t.once(\"video:loadedmetadata\",()=>{var n;Mt.isEnabled?(n=t,Mt.on(\"change\",()=>{n.emit(\"fullscreen\",Mt.isFullscreen),Mt.isFullscreen?(n.state=\"fullscreen\",f(o,\"art-fullscreen\")):g(o,\"art-fullscreen\"),n.emit(\"resize\")}),Mt.on(\"error\",t=>{n.emit(\"fullscreenError\",t)}),H(n,\"fullscreen\",{get:()=>Mt.isFullscreen,async set(t){t?await Mt.request(o):await Mt.exit()}})):a.webkitSupportsFullscreen?(t=>{t.on(\"document:webkitfullscreenchange\",()=>{t.emit(\"fullscreen\",t.fullscreen),t.emit(\"resize\")}),H(t,\"fullscreen\",{get:()=>document.fullscreenElement===a,set(e){e?(t.state=\"fullscreen\",a.webkitEnterFullscreen()):a.webkitExitFullscreen()}})})(t):H(t,\"fullscreen\",{get:()=>!1,set(){r.show=e.get(\"Fullscreen Not Supported\")}}),H(t,\"fullscreen\",U(t,\"fullscreen\"))})}function Pt(t){const{icons:e,proxy:r,storage:a,template:{$player:o,$video:n}}=t;let i=!1,s=0,l=0;function c(){const{$mini:e}=t.template;e&&(g(o,\"art-mini\"),w(e,\"display\",\"none\"),o.prepend(n),t.emit(\"mini\",!1))}function d(e,r){t.playing?(w(e,\"display\",\"none\"),w(r,\"display\",\"flex\")):(w(e,\"display\",\"flex\"),w(r,\"display\",\"none\"))}function p(){const{$mini:e}=t.template,r=P(e),o=window.innerHeight-r.height-50,n=window.innerWidth-r.width-50;a.set(\"top\",o),a.set(\"left\",n),w(e,\"top\",`${o}px`),w(e,\"left\",`${n}px`)}H(t,\"mini\",{get:()=>v(o,\"art-mini\"),set(h){if(h){t.state=\"mini\",f(o,\"art-mini\");const h=function(){const{$mini:o}=t.template;if(o)return y(o,n),w(o,\"display\",\"flex\");{const o=L(\"div\");f(o,\"art-mini-popup\"),y(document.body,o),t.template.$mini=o,y(o,n);const p=y(o,'<div class=\"art-mini-close\"></div>');y(p,e.close),r(p,\"click\",c);const h=y(o,'<div class=\"art-mini-state\"></div>'),u=y(h,e.play),m=y(h,e.pause);return r(u,\"click\",()=>t.play()),r(m,\"click\",()=>t.pause()),d(u,m),t.on(\"video:playing\",()=>d(u,m)),t.on(\"video:pause\",()=>d(u,m)),t.on(\"video:timeupdate\",()=>d(u,m)),r(o,\"mousedown\",t=>{i=0===t.button,s=t.pageX,l=t.pageY}),t.on(\"document:mousemove\",t=>{if(i){f(o,\"art-mini-dragging\");const e=t.pageX-s,r=t.pageY-l;w(o,\"transform\",`translate(${e}px, ${r}px)`)}}),t.on(\"document:mouseup\",()=>{if(i){i=!1,g(o,\"art-mini-dragging\");const t=P(o);a.set(\"left\",t.left),a.set(\"top\",t.top),w(o,\"left\",`${t.left}px`),w(o,\"top\",`${t.top}px`),w(o,\"transform\",null)}}),o}}(),u=a.get(\"top\"),m=a.get(\"left\");\"number\"===typeof u&&\"number\"===typeof m?(w(h,\"top\",`${u}px`),w(h,\"left\",`${m}px`),E(h)||p()):p(),t.emit(\"mini\",!0)}else c()}})}function At(t){const{i18n:e,notice:r,template:{$video:a}}=t;document.pictureInPictureEnabled?function(t){const{template:{$video:e},proxy:r,notice:a}=t;e.disablePictureInPicture=!1,H(t,\"pip\",{get:()=>document.pictureInPictureElement,set(r){r?(t.state=\"pip\",e.requestPictureInPicture().catch(t=>{throw a.show=t,t})):document.exitPictureInPicture().catch(t=>{throw a.show=t,t})}}),r(e,\"enterpictureinpicture\",()=>{t.emit(\"pip\",!0)}),r(e,\"leavepictureinpicture\",()=>{t.emit(\"pip\",!1)})}(t):a.webkitSupportsPresentationMode?function(t){const{$video:e}=t.template;e.webkitSetPresentationMode(\"inline\"),H(t,\"pip\",{get:()=>\"picture-in-picture\"===e.webkitPresentationMode,set(r){r?(t.state=\"pip\",e.webkitSetPresentationMode(\"picture-in-picture\"),t.emit(\"pip\",!0)):(e.webkitSetPresentationMode(\"inline\"),t.emit(\"pip\",!1))}})}(t):H(t,\"pip\",{get:()=>!1,set(){r.show=e.get(\"PIP Not Supported\")}})}function Rt(t){const{option:e,template:{$progress:r,$video:a}}=t;let o=null,n=!1,i=null;t.on(\"setBar\",async(o,s,l)=>{const c=t.controls?.thumbnails,{url:d,scale:h}=e.thumbnails;if(!c||!d)return;if(\"hover\"===o||\"played\"===o&&l&&p){if(i||n||(n=!0,i=await A(d,h),n=!1),!i)return;const o=r.clientWidth*s;o>0&&o<r.clientWidth&&function(o){const n=t.controls?.thumbnails;if(!n)return;const{number:s,column:l,width:c,height:d,scale:p}=e.thumbnails,h=c*p||i.naturalWidth/l,u=d*p||h/(a.videoWidth/a.videoHeight),m=r.clientWidth/s,f=Math.floor(o/m),g=Math.ceil(f/l)-1,v=f%l||l-1;w(n,\"backgroundImage\",`url(${i.src})`),w(n,\"height\",`${u}px`),w(n,\"width\",`${h}px`),w(n,\"backgroundPosition\",`-${v*h}px -${g*u}px`),o<=h/2?w(n,\"left\",0):o>r.clientWidth-h/2?w(n,\"left\",r.clientWidth-h+\"px\"):w(n,\"left\",o-h/2+\"px\")}(o)}}),H(t,\"thumbnails\",{get:()=>t.option.thumbnails,set(e){e.url&&!t.option.isLive&&(t.option.thumbnails=e,clearTimeout(o),o=null,n=!1,i=null)}})}Object.defineProperties(Mt,{isFullscreen:{get:()=>Boolean(document[Lt.fullscreenElement])},element:{enumerable:!0,get:()=>document[Lt.fullscreenElement]},isEnabled:{enumerable:!0,get:()=>Boolean(document[Lt.fullscreenEnabled])}});class Ot{constructor(t){!function(t){const{option:e,template:{$video:r}}=t;H(t,\"url\",{get:()=>r.src,async set(a){if(a){const o=t.url,n=e.type||V(a),i=e.customType[n];n&&i?(await Z(),t.loading.show=!0,i.call(t,r,a,t)):(URL.revokeObjectURL(o),r.src=a),o!==t.url&&(t.option.url=a,t.isReady&&o&&t.once(\"video:canplay\",()=>{t.emit(\"restart\",a)}))}else await Z(),t.loading.show=!0}})}(t),function(t){const{template:{$video:e}}=t;H(t,\"attr\",{value(t,r){if(void 0===r)return e[t];e[t]=r}})}(t),function(t){const{i18n:e,notice:r,option:a,constructor:{instances:o},template:{$video:n}}=t;H(t,\"play\",{async value(){const i=await n.play();if(r.show=e.get(\"Play\"),t.emit(\"play\"),a.mutex)for(let e=0;e<o.length;e++){const r=o[e];r!==t&&r.pause()}return i}})}(t),function(t){const{template:{$video:e},i18n:r,notice:a}=t;H(t,\"pause\",{value(){const o=e.pause();return a.show=r.get(\"Pause\"),t.emit(\"pause\"),o}})}(t),function(t){H(t,\"toggle\",{value:()=>t.playing?t.pause():t.play()})}(t),function(t){const{notice:e}=t;H(t,\"seek\",{set(r){t.currentTime=r,t.duration&&(e.show=`${F(t.currentTime)} / ${F(t.duration)}`),t.emit(\"seek\",t.currentTime,r)}}),H(t,\"forward\",{set(e){t.seek=t.currentTime+e}}),H(t,\"backward\",{set(e){t.seek=t.currentTime-e}})}(t),function(t){const{template:{$video:e},i18n:r,notice:a,storage:o}=t;H(t,\"volume\",{get:()=>e.volume||0,set:t=>{e.volume=D(t,0,1),a.show=`${r.get(\"Volume\")}: ${Number.parseInt(100*e.volume,10)}`,0!==e.volume&&o.set(\"volume\",e.volume)}}),H(t,\"muted\",{get:()=>e.muted,set:r=>{e.muted=r,t.emit(\"muted\",r)}})}(t),function(t){const{$video:e}=t.template;H(t,\"currentTime\",{get:()=>e.currentTime||0,set:r=>{r=Number.parseFloat(r),Number.isNaN(r)||(e.currentTime=D(r,0,t.duration))}})}(t),function(t){H(t,\"duration\",{get:()=>{const{duration:e}=t.template.$video;return e===1/0?0:e||0}})}(t),function(t){function e(e,r){return new Promise((a,o)=>{if(e===t.url)return void a();const{playing:n,aspectRatio:i,playbackRate:s}=t;t.pause(),t.url=e,t.notice.show=\"\";const l={error:e=>{t.off(\"video:canplay\",l.canplay),t.off(\"video:loadedmetadata\",l.metadata),o(e)},metadata:()=>{t.currentTime=r},canplay:async()=>{t.off(\"video:error\",l.error),t.playbackRate=s,t.aspectRatio=i,n&&await t.play(),t.notice.show=\"\",a()}};t.once(\"video:error\",l.error),t.once(\"video:loadedmetadata\",l.metadata),t.once(\"video:canplay\",l.canplay)})}H(t,\"switchQuality\",{value:r=>e(r,t.currentTime)}),H(t,\"switchUrl\",{value:t=>e(t,0)}),H(t,\"switch\",{set:t.switchUrl})}(t),function(t){const{template:{$video:e},i18n:r,notice:a}=t;H(t,\"playbackRate\",{get:()=>e.playbackRate,set(o){if(o){if(o===e.playbackRate)return;e.playbackRate=o,a.show=`${r.get(\"Rate\")}: ${1===o?r.get(\"Normal\"):`${o}x`}`}else t.playbackRate=1}})}(t),function(t){const{i18n:e,notice:r,template:{$video:a,$player:o}}=t;H(t,\"aspectRatio\",{get:()=>o.dataset.aspectRatio||\"default\",set(n){if(n||(n=\"default\"),\"default\"===n)w(a,\"width\",null),w(a,\"height\",null),w(a,\"margin\",null),delete o.dataset.aspectRatio;else{const t=n.split(\":\").map(Number),{clientWidth:e,clientHeight:r}=o,i=e/r,s=t[0]/t[1];i>s?(w(a,\"width\",s*r+\"px\"),w(a,\"height\",\"100%\"),w(a,\"margin\",\"0 auto\")):(w(a,\"width\",\"100%\"),w(a,\"height\",e/s+\"px\"),w(a,\"margin\",\"auto 0\")),o.dataset.aspectRatio=n}r.show=`${e.get(\"Aspect Ratio\")}: ${\"default\"===n?e.get(\"Default\"):n}`,t.emit(\"aspectRatio\",n)}})}(t),function(t){const{notice:e,template:{$video:r}}=t,a=L(\"canvas\");H(t,\"getDataURL\",{value:()=>new Promise((t,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext(\"2d\").drawImage(r,0,0),t(a.toDataURL(\"image/png\"))}catch(n){e.show=n,o(n)}})}),H(t,\"getBlobUrl\",{value:()=>new Promise((t,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext(\"2d\").drawImage(r,0,0),a.toBlob(e=>{t(URL.createObjectURL(e))})}catch(n){e.show=n,o(n)}})}),H(t,\"screenshot\",{value:async e=>{const a=await t.getDataURL();return Y(a,`${e||`artplayer_${F(r.currentTime)}`}.png`),t.emit(\"screenshot\",a),a}})}(t),It(t),function(t){const{constructor:e,template:{$container:r,$player:a}}=t;let o=\"\";H(t,\"fullscreenWeb\",{get:()=>v(a,\"art-fullscreen-web\"),set(n){n?(o=a.style.cssText,e.FULLSCREEN_WEB_IN_BODY&&y(document.body,a),t.state=\"fullscreenWeb\",w(a,\"width\",\"100%\"),w(a,\"height\",\"100%\"),f(a,\"art-fullscreen-web\"),t.emit(\"fullscreenWeb\",!0)):(e.FULLSCREEN_WEB_IN_BODY&&y(r,a),o&&(a.style.cssText=o,o=\"\"),g(a,\"art-fullscreen-web\"),t.emit(\"fullscreenWeb\",!1)),t.emit(\"resize\")}})}(t),At(t),function(t){const{$video:e}=t.template;H(t,\"loaded\",{get:()=>t.loadedTime/e.duration}),H(t,\"loadedTime\",{get:()=>e.buffered.length?e.buffered.end(e.buffered.length-1):0})}(t),function(t){H(t,\"played\",{get:()=>t.currentTime/t.duration})}(t),function(t){const{$video:e}=t.template;H(t,\"playing\",{get:()=>\"boolean\"===typeof e.playing?e.playing:!!(e.currentTime>0&&!e.paused&&!e.ended&&e.readyState>2)})}(t),function(t){const{$container:e,$player:r,$video:a}=t.template;H(t,\"autoSize\",{value(){const{videoWidth:o,videoHeight:n}=a,{width:i,height:s}=P(e),l=o/n;if(i/s>l)w(r,\"width\",s*l/i*100+\"%\"),w(r,\"height\",\"100%\");else{const t=i/l/s*100;w(r,\"width\",\"100%\"),w(r,\"height\",`${t}%`)}t.emit(\"autoSize\",{width:t.width,height:t.height})}})}(t),function(t){H(t,\"rect\",{get:()=>P(t.template.$player)});const e=[\"bottom\",\"height\",\"left\",\"right\",\"top\",\"width\"];for(let r=0;r<e.length;r++){const a=e[r];H(t,a,{get:()=>t.rect[a]})}H(t,\"x\",{get:()=>t.left+window.pageXOffset}),H(t,\"y\",{get:()=>t.top+window.pageYOffset})}(t),function(t){const{template:{$player:e},i18n:r,notice:a}=t;H(t,\"flip\",{get:()=>e.dataset.flip||\"normal\",set(o){o||(o=\"normal\"),\"normal\"===o?delete e.dataset.flip:e.dataset.flip=o,a.show=`${r.get(\"Video Flip\")}: ${r.get(N(o))}`,t.emit(\"flip\",o)}})}(t),Pt(t),function(t){const{template:{$poster:e}}=t;H(t,\"poster\",{get:()=>{try{return e.style.backgroundImage.match(/\"(.*)\"/)[1]}catch{return\"\"}},set(t){w(e,\"backgroundImage\",`url(${t})`)}})}(t),function(t){const{template:{$container:e,$video:r}}=t;H(t,\"autoHeight\",{value(){const{clientWidth:a}=e,{videoHeight:o,videoWidth:n}=r,i=o*(a/n);w(e,\"height\",`${i}px`),t.emit(\"autoHeight\",i)}})}(t),function(t){const{$player:e}=t.template;H(t,\"cssVar\",{value:(t,r)=>r?e.style.setProperty(t,r):getComputedStyle(e).getPropertyValue(t)})}(t),function(t){H(t,\"theme\",{get:()=>t.cssVar(\"--art-theme\"),set(e){t.cssVar(\"--art-theme\",e)}})}(t),function(t){H(t,\"type\",{get:()=>t.option.type,set(e){t.option.type=e}})}(t),function(t){const e=[\"mini\",\"pip\",\"fullscreen\",\"fullscreenWeb\"];H(t,\"state\",{get:()=>e.find(e=>t[e])||\"standard\",set(r){for(let a=0;a<e.length;a++){const o=e[a];o!==r&&t[o]&&(t[o]=!1)}}})}(t),function(t){const{notice:e,i18n:r,template:a}=t;H(t,\"subtitleOffset\",{get:()=>a.$track?.offset||0,set(o){const{cues:n}=t.subtitle;if(!a.$track||0===n.length)return;const i=D(o,-10,10);a.$track.offset=i;for(let e=0;e<n.length;e++){const r=n[e];r.originalStartTime=r.originalStartTime??r.startTime,r.originalEndTime=r.originalEndTime??r.endTime,r.startTime=D(r.originalStartTime+i,0,t.duration),r.endTime=D(r.originalEndTime+i,0,t.duration)}t.subtitle.update(),e.show=`${r.get(\"Subtitle Offset\")}: ${o}s`,t.emit(\"subtitleOffset\",o)}})}(t),function(t){const{i18n:e,notice:r,proxy:a,template:{$video:o}}=t;let n=!0;window.WebKitPlaybackTargetAvailabilityEvent&&o.webkitShowPlaybackTargetPicker?a(o,\"webkitplaybacktargetavailabilitychanged\",t=>{switch(t.availability){case\"available\":n=!0;break;case\"not-available\":n=!1}}):n=!1,H(t,\"airplay\",{value(){n?(o.webkitShowPlaybackTargetPicker(),t.emit(\"airplay\")):r.show=e.get(\"AirPlay Not Available\")}})}(t),function(t){H(t,\"quality\",{set(e){const{controls:r,notice:a,i18n:o}=t,n=e.find(t=>t.default)||e[0];r.update({name:\"quality\",position:\"right\",index:10,style:{marginRight:\"10px\"},html:n?.html||\"\",selector:e,onSelect:async e=>(await t.switchQuality(e.url),a.show=`${o.get(\"Switch Video\")}: ${e.html}`,e.html)})}})}(t),Rt(t),function(t){const{i18n:e,notice:r,option:a,constructor:o,proxy:n,template:{$player:s,$video:l,$poster:c}}=t;let d=0;for(let p=0;p<i.events.length;p++)n(l,i.events[p],e=>{t.emit(`video:${e.type}`,e)});t.on(\"video:canplay\",()=>{d=0,t.loading.show=!1}),t.once(\"video:canplay\",()=>{t.loading.show=!1,t.controls.show=!0,t.mask.show=!0,t.isReady=!0,t.emit(\"ready\")}),t.on(\"video:ended\",()=>{a.loop?(t.seek=0,t.play(),t.controls.show=!1,t.mask.show=!1):(t.controls.show=!0,t.mask.show=!0)}),t.on(\"video:error\",async n=>{d<o.RECONNECT_TIME_MAX?(await Z(o.RECONNECT_SLEEP_TIME),d+=1,t.url=a.url,r.show=`${e.get(\"Reconnect\")}: ${d}`,t.emit(\"error\",n,d)):(t.mask.show=!0,t.loading.show=!1,t.controls.show=!0,f(s,\"art-error\"),await Z(o.RECONNECT_SLEEP_TIME),r.show=e.get(\"Video Load Failed\"))}),t.on(\"video:loadedmetadata\",()=>{t.emit(\"resize\"),p&&(t.loading.show=!1,t.controls.show=!0,t.mask.show=!0)}),t.on(\"video:loadstart\",()=>{t.loading.show=!0,t.mask.show=!1,t.controls.show=!0}),t.on(\"video:pause\",()=>{t.controls.show=!0,t.mask.show=!0}),t.on(\"video:play\",()=>{t.mask.show=!1,w(c,\"display\",\"none\")}),t.on(\"video:playing\",()=>{t.mask.show=!1}),t.on(\"video:progress\",()=>{t.playing&&(t.loading.show=!1)}),t.on(\"video:seeked\",()=>{t.loading.show=!1,t.mask.show=!0}),t.on(\"video:seeking\",()=>{t.loading.show=!0,t.mask.show=!1}),t.on(\"video:timeupdate\",()=>{t.mask.show=!1}),t.on(\"video:waiting\",()=>{t.loading.show=!0,t.mask.show=!1})}(t),function(t){const{option:e,storage:r,template:{$video:a,$poster:o}}=t;for(const i in e.moreVideoAttr)t.attr(i,e.moreVideoAttr[i]);e.muted&&(t.muted=e.muted),e.volume&&(a.volume=D(e.volume,0,1));const n=r.get(\"volume\");\"number\"===typeof n&&(a.volume=D(n,0,1)),e.poster&&w(o,\"backgroundImage\",`url(${e.poster})`),e.autoplay&&(a.autoplay=e.autoplay),e.playsInline&&(a.playsInline=!0,a[\"webkit-playsinline\"]=!0),e.theme&&(e.cssVar[\"--art-theme\"]=e.theme);for(const i in e.cssVar)t.cssVar(i,e.cssVar[i]);t.url=e.url}(t)}}function _t(t){const{notice:e,constructor:r,template:{$player:a,$video:o}}=t,n=\"art-auto-orientation\",i=\"art-auto-orientation-fullscreen\";let s=!1;function l(){const{videoWidth:t,videoHeight:e}=o,r=document.documentElement.clientWidth,a=document.documentElement.clientHeight;return t>e&&r<a||t<e&&r>a}return t.on(\"fullscreenWeb\",e=>{if(e){if(l()){const e=Number(r.AUTO_ORIENTATION_TIME??0);setTimeout(()=>{t.fullscreenWeb&&!v(a,n)&&function(){const e=document.documentElement.clientWidth,r=document.documentElement.clientHeight;w(a,\"width\",`${r}px`),w(a,\"height\",`${e}px`),w(a,\"transform-origin\",\"0 0\"),w(a,\"transform\",`rotate(90deg) translate(0, -${e}px)`),f(a,n),t.isRotate=!0,t.emit(\"resize\")}()},e)}}else v(a,n)&&(w(a,\"width\",\"\"),w(a,\"height\",\"\"),w(a,\"transform-origin\",\"\"),w(a,\"transform\",\"\"),g(a,n),t.isRotate=!1,t.emit(\"resize\"))}),t.on(\"fullscreen\",async t=>{const r=!!screen?.orientation?.lock;if(t){if(r&&l())try{const t=screen.orientation.type.startsWith(\"portrait\")?\"landscape\":\"portrait\";await screen.orientation.lock(t),s=!0,f(a,i)}catch(o){s=!1,e.show=o}}else if(v(a,i)&&g(a,i),r&&s){try{screen.orientation.unlock()}catch{}s=!1}}),{name:\"autoOrientation\",get state(){return v(a,n)}}}function Vt(t){const{i18n:e,icons:r,storage:a,constructor:o,proxy:n,template:{$poster:i}}=t,s=t.layers.add({name:\"auto-playback\",html:'\\n            <div class=\"art-auto-playback-close\"></div>\\n            <div class=\"art-auto-playback-last\"></div>\\n            <div class=\"art-auto-playback-jump\"></div>\\n        '}),l=u(\".art-auto-playback-last\",s),c=u(\".art-auto-playback-jump\",s),d=u(\".art-auto-playback-close\",s);y(d,r.close);let p=null;function h(){const r=(a.get(\"times\")||{})[t.option.id||t.option.url];clearTimeout(p),w(s,\"display\",\"none\"),r&&r>=o.AUTO_PLAYBACK_MIN&&(w(s,\"display\",\"flex\"),l.textContent=`${e.get(\"Last Seen\")} ${F(r)}`,c.textContent=e.get(\"Jump Play\"),n(d,\"click\",()=>{w(s,\"display\",\"none\")}),n(c,\"click\",()=>{t.seek=r,t.play(),w(i,\"display\",\"none\"),w(s,\"display\",\"none\")}),t.once(\"video:timeupdate\",()=>{p=setTimeout(()=>{w(s,\"display\",\"none\")},o.AUTO_PLAYBACK_TIMEOUT)}))}return t.on(\"video:timeupdate\",()=>{if(t.playing){const e=a.get(\"times\")||{},r=Object.keys(e);r.length>o.AUTO_PLAYBACK_MAX&&delete e[r[0]],e[t.option.id||t.option.url]=t.currentTime,a.set(\"times\",e)}}),t.on(\"ready\",h),t.on(\"restart\",h),{name:\"auto-playback\",get times(){return a.get(\"times\")||{}},clear:()=>a.del(\"times\"),delete(t){const e=a.get(\"times\")||{};return delete e[t],a.set(\"times\",e),e}}}function Yt(t){const{constructor:e,proxy:r,template:{$player:a,$video:o}}=t;let n=null,i=!1,s=1;const l=()=>{clearTimeout(n),i&&(i=!1,t.playbackRate=s,g(a,\"art-fast-forward\"))};return r(o,\"touchstart\",r=>{1===r.touches.length&&t.playing&&!t.isLock&&(n=setTimeout(()=>{i=!0,s=t.playbackRate,t.playbackRate=e.FAST_FORWARD_VALUE,f(a,\"art-fast-forward\")},e.FAST_FORWARD_TIME))}),t.on(\"document:touchmove\",l),t.on(\"document:touchend\",l),{name:\"fastForward\",get state(){return v(a,\"art-fast-forward\")}}}function Dt(t){const{layers:e,icons:r,template:{$player:a}}=t;function o(){return v(a,\"art-lock\")}function n(){f(a,\"art-lock\"),t.isLock=!0,t.emit(\"lock\",!0)}function i(){g(a,\"art-lock\"),t.isLock=!1,t.emit(\"lock\",!1)}return e.add({name:\"lock\",mounted(e){const a=y(e,r.lock),o=y(e,r.unlock);w(a,\"display\",\"none\"),t.on(\"lock\",t=>{t?(w(a,\"display\",\"inline-flex\"),w(o,\"display\",\"none\")):(w(a,\"display\",\"none\"),w(o,\"display\",\"inline-flex\"))})},click(){o()?i():n()}}),{name:\"lock\",get state(){return o()},set state(t){t?n():i()}}}function Nt(t){return t.on(\"control\",e=>{e?g(t.template.$player,\"art-mini-progress-bar\"):f(t.template.$player,\"art-mini-progress-bar\")}),{name:\"mini-progress-bar\"}}class Ft{constructor(t){this.art=t,this.id=0;const{option:e}=t;e.miniProgressBar&&!e.isLive&&this.add(Nt),e.lock&&p&&this.add(Dt),e.autoPlayback&&!e.isLive&&this.add(Vt),e.autoOrientation&&p&&this.add(_t),e.fastForward&&p&&!e.isLive&&this.add(Yt);for(let r=0;r<e.plugins.length;r++)this.add(e.plugins[r])}add(t){this.id+=1;const e=t.call(this.art,this.art);return e instanceof Promise?e.then(e=>this.next(t,e)):this.next(t,e)}next(t,e){const r=e&&e.name||t.name||`plugin${this.id}`;return _(!j(this,r),`Cannot add a plugin that already has the same name: ${r}`),H(this,r,{value:e}),this}}class Bt extends dt{constructor(t){super(t);const{option:e,controls:r,template:{$setting:a}}=t;this.name=\"setting\",this.$parent=a,this.id=0,this.active=null,this.cache=new Map,this.option=[...this.builtin,...e.settings],e.setting&&(this.format(),this.render(),t.on(\"blur\",()=>{this.show&&(this.show=!1,this.render())}),t.on(\"focus\",t=>{const e=C(t,r.setting),a=C(t,this.$parent);!this.show||e||a||(this.show=!1,this.render())}),t.on(\"resize\",()=>this.resize()))}get builtin(){const t=[],{option:e}=this.art;return e.playbackRate&&t.push(function(t){const{i18n:e,icons:r,constructor:{SETTING_ITEM_WIDTH:a,PLAYBACK_RATE:o}}=t;function n(t){return 1===t?e.get(\"Normal\"):t.toFixed(1)}function i(){const e=t.setting.find(`playback-rate-${t.playbackRate}`);t.setting.check(e)}return{width:a,name:\"playback-rate\",html:e.get(\"Play Speed\"),tooltip:n(t.playbackRate),icon:r.playbackRate,selector:o.map(e=>({value:e,name:`playback-rate-${e}`,default:e===t.playbackRate,html:n(e)})),onSelect:e=>(t.playbackRate=e.value,e.html),mounted:()=>{i(),t.on(\"video:ratechange\",()=>i())}}}(this.art)),e.aspectRatio&&t.push(function(t){const{i18n:e,icons:r,constructor:{SETTING_ITEM_WIDTH:a,ASPECT_RATIO:o}}=t;function n(t){return\"default\"===t?e.get(\"Default\"):t}function i(){const e=t.setting.find(`aspect-ratio-${t.aspectRatio}`);t.setting.check(e)}return{width:a,name:\"aspect-ratio\",html:e.get(\"Aspect Ratio\"),icon:r.aspectRatio,tooltip:n(t.aspectRatio),selector:o.map(e=>({value:e,name:`aspect-ratio-${e}`,default:e===t.aspectRatio,html:n(e)})),onSelect:e=>(t.aspectRatio=e.value,e.html),mounted:()=>{i(),t.on(\"aspectRatio\",()=>i())}}}(this.art)),e.flip&&t.push(function(t){const{i18n:e,icons:r,constructor:{SETTING_ITEM_WIDTH:a,FLIP:o}}=t;function n(t){return e.get(N(t))}function i(){const e=t.setting.find(`flip-${t.flip}`);t.setting.check(e)}return{width:a,name:\"flip\",html:e.get(\"Video Flip\"),tooltip:n(t.flip),icon:r.flip,selector:o.map(e=>({value:e,name:`flip-${e}`,default:e===t.flip,html:n(e)})),onSelect:e=>(t.flip=e.value,e.html),mounted:()=>{i(),t.on(\"flip\",()=>i())}}}(this.art)),e.subtitleOffset&&t.push(function(t){const{i18n:e,icons:r,constructor:a}=t;return{width:a.SETTING_ITEM_WIDTH,name:\"subtitle-offset\",html:e.get(\"Subtitle Offset\"),icon:r.subtitle,tooltip:\"0s\",range:[0,-10,10,.1],onChange:e=>(t.subtitleOffset=e.range[0],`${e.range[0]}s`),mounted:(e,r)=>{t.on(\"subtitleOffset\",t=>{r.$range.value=t,r.tooltip=`${t}s`})}}}(this.art)),t}traverse(t,e=this.option){for(let r=0;r<e.length;r++){const a=e[r];t(a),a.selector?.length&&this.traverse(t,a.selector)}}check(t){t&&(t.$parent.tooltip=t.html,this.traverse(e=>{e.default=e===t,e.default&&e.$item&&$(e.$item,\"art-current\")},t.$option),this.render(t.$parents))}format(t=this.option,e,r,a=[]){for(let o=0;o<t.length;o++){const n=t[o];if(n?.name?(_(!a.includes(n.name),`The [${n.name}] already exists in [setting]`),a.push(n.name)):n.name=\"setting-\"+this.id++,!n.$formatted){H(n,\"$parent\",{get:()=>e}),H(n,\"$parents\",{get:()=>r}),H(n,\"$option\",{get:()=>t});const a=[];H(n,\"$events\",{get:()=>a}),H(n,\"$formatted\",{get:()=>!0})}this.format(n.selector||[],n,t,a)}this.option=t}find(t=\"\"){let e=null;return this.traverse(r=>{r.name===t&&(e=r)}),e}resize(){const{controls:t,constructor:{SETTING_WIDTH:e,SETTING_ITEM_HEIGHT:r},template:{$player:a,$setting:o}}=this.art;if(t.setting&&this.show){const n=this.active[0]?.$parent?.width||e,{left:i,width:s}=P(t.setting),{left:l,width:c}=P(a),d=i-l+s/2-n/2;if(w(o,\"height\",`${this.active===this.option?this.active.length*r:(this.active.length+1)*r}px`),w(o,\"width\",`${n}px`),this.art.isRotate||p)return;d+n>c?(w(o,\"left\",null),w(o,\"right\",null)):(w(o,\"left\",`${d}px`),w(o,\"right\",\"auto\"))}}inactivate(t){for(let e=0;e<t.$events.length;e++)this.art.events.remove(t.$events[e]);t.$events.length=0}remove(t){const e=this.find(t);_(e,`Can't find [${t}] in the [setting]`);const r=e.$option.indexOf(e);e.$option.splice(r,1),this.inactivate(e),e.$item&&b(e.$item),this.render()}update(t){const e=this.find(t.name);return e?(this.inactivate(e),Object.assign(e,t),this.format(),this.createItem(e,!0),this.render(),e):this.add(t)}add(t,e=this.option){return e.push(t),this.format(),this.createItem(t),this.render(),t}createHeader(t){if(!this.cache.has(t.$option))return;const e=this.cache.get(t.$option),{proxy:r,icons:{arrowLeft:a},constructor:{SETTING_ITEM_HEIGHT:o}}=this.art,n=L(\"div\");w(n,\"height\",`${o}px`),f(n,\"art-setting-item\"),f(n,\"art-setting-item-back\");const i=y(n,'<div class=\"art-setting-item-left\"></div>'),s=L(\"div\");f(s,\"art-setting-item-left-icon\"),y(s,a),y(i,s),y(i,t.$parent.html);const l=r(n,\"click\",()=>this.render(t.$parents));t.$parent.$events.push(l),y(e,n)}createItem(t,e=!1){if(!this.cache.has(t.$option))return;const r=this.cache.get(t.$option),a=t.$item;let o=\"selector\";j(t,\"switch\")&&(o=\"switch\"),j(t,\"range\")&&(o=\"range\"),j(t,\"onClick\")&&(o=\"button\");const{icons:n,proxy:i,constructor:s}=this.art,l=L(\"div\");f(l,\"art-setting-item\"),w(l,\"height\",`${s.SETTING_ITEM_HEIGHT}px`),l.dataset.name=t.name||\"\",l.dataset.value=t.value||\"\";const c=y(l,'<div class=\"art-setting-item-left\"></div>'),d=y(l,'<div class=\"art-setting-item-right\"></div>'),p=L(\"div\");switch(f(p,\"art-setting-item-left-icon\"),o){case\"button\":case\"switch\":case\"range\":y(p,t.icon||n.config);break;case\"selector\":t.selector?.length?y(p,t.icon||n.config):y(p,n.check)}y(c,p),H(t,\"$icon\",{configurable:!0,get:()=>p}),H(t,\"icon\",{configurable:!0,get:()=>p.innerHTML,set(t){p.innerHTML=\"\",y(p,t)}});const h=L(\"div\");f(h,\"art-setting-item-left-text\"),y(h,t.html||\"\"),y(c,h),H(t,\"$html\",{configurable:!0,get:()=>h}),H(t,\"html\",{configurable:!0,get:()=>h.innerHTML,set(t){h.innerHTML=\"\",y(h,t)}});const u=L(\"div\");switch(f(u,\"art-setting-item-right-tooltip\"),y(u,t.tooltip||\"\"),y(d,u),H(t,\"$tooltip\",{configurable:!0,get:()=>u}),H(t,\"tooltip\",{configurable:!0,get:()=>u.innerHTML,set(t){u.innerHTML=\"\",y(u,t)}}),o){case\"switch\":{const e=L(\"div\");f(e,\"art-setting-item-right-icon\");const r=y(e,n.switchOn),a=y(e,n.switchOff);w(t.switch?a:r,\"display\",\"none\"),y(d,e),H(t,\"$switch\",{configurable:!0,get:()=>e});let o=t.switch;H(t,\"switch\",{configurable:!0,get:()=>o,set(t){o=t,t?(w(a,\"display\",\"none\"),w(r,\"display\",null)):(w(a,\"display\",null),w(r,\"display\",\"none\"))}});break}case\"range\":{const e=L(\"div\");f(e,\"art-setting-item-right-icon\");const r=y(e,'<input type=\"range\">');r.value=t.range[0],r.min=t.range[1],r.max=t.range[2],r.step=t.range[3],f(r,\"art-setting-range\"),y(d,e),H(t,\"$range\",{configurable:!0,get:()=>r});let a=[...t.range];H(t,\"range\",{configurable:!0,get:()=>a,set(t){a=[...t],r.value=t[0],r.min=t[1],r.max=t[2],r.step=t[3]}})}break;case\"selector\":if(t.selector?.length){const t=L(\"div\");f(t,\"art-setting-item-right-icon\"),y(t,n.arrowRight),y(d,t)}}switch(o){case\"switch\":if(t.onSwitch){const e=i(l,\"click\",async e=>{t.switch=await t.onSwitch.call(this.art,t,l,e)});t.$events.push(e)}break;case\"range\":if(t.$range){if(t.onRange){const e=i(t.$range,\"change\",async e=>{t.range[0]=t.$range.valueAsNumber,t.tooltip=await t.onRange.call(this.art,t,l,e)});t.$events.push(e)}if(t.onChange){const e=i(t.$range,\"input\",async e=>{t.range[0]=t.$range.valueAsNumber,t.tooltip=await t.onChange.call(this.art,t,l,e)});t.$events.push(e)}}break;case\"selector\":{const e=i(l,\"click\",async e=>{t.selector?.length?this.render(t.selector):(this.check(t),t.$parent.onSelect&&(t.$parent.tooltip=await t.$parent.onSelect.call(this.art,t,l,e)))});t.$events.push(e),t.default&&f(l,\"art-current\")}break;case\"button\":if(t.onClick){const e=i(l,\"click\",async e=>{t.tooltip=await t.onClick.call(this.art,t,l,e)});t.$events.push(e)}}H(t,\"$item\",{configurable:!0,get:()=>l}),e?z(l,a):y(r,l),t.mounted&&setTimeout(()=>t.mounted.call(this.art,t.$item,t),0)}render(t=this.option){if(this.active=t,this.cache.has(t)){$(this.cache.get(t),\"art-current\")}else{const e=L(\"div\");this.cache.set(t,e),f(e,\"art-setting-panel\"),y(this.$parent,e),$(e,\"art-current\"),t[0]?.$parent&&this.createHeader(t[0]);for(let r=0;r<t.length;r++)this.createItem(t[r])}this.resize()}}class Ht{constructor(){this.name=\"artplayer_settings\",this.settings={}}get(t){try{const e=JSON.parse(window.localStorage.getItem(this.name))||{};return t?e[t]:e}catch{return t?this.settings[t]:this.settings}}set(t,e){try{const r=Object.assign({},this.get(),{[t]:e});window.localStorage.setItem(this.name,JSON.stringify(r))}catch{this.settings[t]=e}}del(t){try{const e=this.get();delete e[t],window.localStorage.setItem(this.name,JSON.stringify(e))}catch{delete this.settings[t]}}clear(){try{window.localStorage.removeItem(this.name)}catch{this.settings={}}}}const Wt='.art-video-player{--art-theme: #f00;--art-font-color: #fff;--art-background-color: #000;--art-text-shadow-color: rgba(0, 0, 0, .5);--art-transition-duration: .2s;--art-padding: 10px;--art-border-radius: 3px;--art-progress-height: 6px;--art-progress-color: rgba(255, 255, 255, .25);--art-progress-top-gap: 10px;--art-hover-color: rgba(255, 255, 255, .25);--art-loaded-color: rgba(255, 255, 255, .25);--art-state-size: 80px;--art-state-opacity: .8;--art-bottom-height: 100px;--art-bottom-offset: 20px;--art-bottom-gap: 5px;--art-highlight-width: 8px;--art-highlight-color: rgba(255, 255, 255, .5);--art-control-height: 46px;--art-control-opacity: .75;--art-control-icon-size: 36px;--art-control-icon-scale: 1.1;--art-volume-height: 120px;--art-volume-handle-size: 14px;--art-lock-size: 36px;--art-indicator-scale: 0;--art-indicator-size: 16px;--art-fullscreen-web-index: 9999;--art-settings-icon-size: 24px;--art-settings-max-height: 300px;--art-selector-max-height: 300px;--art-contextmenus-min-width: 250px;--art-subtitle-font-size: 20px;--art-subtitle-gap: 5px;--art-subtitle-bottom: 15px;--art-subtitle-border: #000;--art-widget-background: rgba(0, 0, 0, .85);--art-tip-background: rgba(0, 0, 0, .7);--art-scrollbar-size: 4px;--art-scrollbar-background: rgba(255, 255, 255, .25);--art-scrollbar-background-hover: rgba(255, 255, 255, .5);--art-mini-progress-height: 2px}.art-bg-cover{background-position:center center;background-repeat:no-repeat;background-size:cover}.art-bottom-gradient{background-image:linear-gradient(to top,#000,rgba(0,0,0,.4),transparent);background-repeat:repeat-x;background-position:center bottom}.art-backdrop-filter{-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px);background-color:#000000bf!important}.art-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.art-video-player{position:relative;margin:0 auto;width:100%;height:100%;outline:0;zoom:1;padding:0;text-align:left;direction:ltr;font-size:14px;line-height:1.3;user-select:none;box-sizing:border-box;color:var(--art-font-color);background-color:var(--art-background-color);text-shadow:0 0 2px var(--art-text-shadow-color);font-family:PingFang SC,Helvetica Neue,Microsoft YaHei,Roboto,Arial,sans-serif;-webkit-tap-highlight-color:rgba(0,0,0,0);-ms-touch-action:manipulation;touch-action:manipulation;-ms-high-contrast-adjust:none}.art-video-player *,.art-video-player *:before,.art-video-player *:after{box-sizing:border-box}.art-video-player ::-webkit-scrollbar{width:var(--art-scrollbar-size);height:var(--art-scrollbar-size)}.art-video-player ::-webkit-scrollbar-thumb{background-color:var(--art-scrollbar-background)}.art-video-player ::-webkit-scrollbar-thumb:hover{background-color:var(--art-scrollbar-background-hover)}.art-video-player img{max-width:100%;vertical-align:top}.art-video-player svg{fill:var(--art-font-color)}.art-video-player a{color:var(--art-font-color);text-decoration:none}.art-icon{line-height:1;display:flex;justify-content:center;align-items:center}.art-video-player.art-backdrop .art-contextmenus,.art-video-player.art-backdrop .art-info,.art-video-player.art-backdrop .art-settings,.art-video-player.art-backdrop .art-layer-auto-playback,.art-video-player.art-backdrop .art-selector-list,.art-video-player.art-backdrop .art-volume-inner{-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px);background-color:#000000bf!important}.art-video{position:absolute;inset:0;z-index:10;width:100%;height:100%}.art-poster{position:absolute;inset:0;z-index:11;width:100%;height:100%;background-position:center center;background-repeat:no-repeat;background-size:cover;pointer-events:none}.art-video-player .art-subtitle{display:none;justify-content:center;align-items:center;flex-direction:column;position:absolute;z-index:20;width:100%;padding:0 5%;text-align:center;pointer-events:none;gap:var(--art-subtitle-gap);bottom:var(--art-subtitle-bottom);font-size:var(--art-subtitle-font-size);transition:bottom var(--art-transition-duration) ease;text-shadow:var(--art-subtitle-border) 1px 0 1px,var(--art-subtitle-border) 0 1px 1px,var(--art-subtitle-border) -1px 0 1px,var(--art-subtitle-border) 0 -1px 1px,var(--art-subtitle-border) 1px 1px 1px,var(--art-subtitle-border) -1px -1px 1px,var(--art-subtitle-border) 1px -1px 1px,var(--art-subtitle-border) -1px 1px 1px}.art-video-player.art-subtitle-show .art-subtitle{display:flex}.art-video-player.art-control-show .art-subtitle{bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}.art-danmuku{position:absolute;inset:0;z-index:30;width:100%;height:100%;pointer-events:none;overflow:hidden}.art-video-player .art-layers{position:absolute;inset:0;z-index:40;width:100%;height:100%;display:none;pointer-events:none}.art-video-player .art-layers .art-layer{pointer-events:auto}.art-video-player.art-layer-show .art-layers{display:flex}.art-video-player .art-mask{display:flex;justify-content:center;align-items:center;position:absolute;inset:0;z-index:50;width:100%;height:100%;pointer-events:none}.art-video-player .art-mask .art-state{display:flex;justify-content:center;align-items:center;opacity:0;transform:scale(2);width:var(--art-state-size);height:var(--art-state-size);transition:all var(--art-transition-duration) ease}.art-video-player.art-mask-show .art-state{pointer-events:auto;opacity:var(--art-state-opacity);transform:scale(1)}.art-video-player.art-loading-show .art-state{display:none}.art-video-player .art-loading{display:none;justify-content:center;align-items:center;position:absolute;inset:0;z-index:70;width:100%;height:100%;pointer-events:none}.art-video-player.art-loading-show .art-loading{display:flex}.art-video-player.art-loading-show .art-mask{display:none}.art-video-player .art-bottom{position:absolute;inset:0;z-index:60;width:100%;height:100%;display:flex;flex-direction:column;justify-content:flex-end;opacity:0;overflow:hidden;pointer-events:none;padding:0 var(--art-padding);transition:all var(--art-transition-duration) ease;background-size:100% var(--art-bottom-height);background-image:linear-gradient(to top,#000,rgba(0,0,0,.4),transparent);background-repeat:repeat-x;background-position:center bottom}.art-video-player .art-bottom .art-controls,.art-video-player .art-bottom .art-progress{transform:translateY(var(--art-bottom-offset));transition:transform var(--art-transition-duration) ease}.art-video-player.art-control-show .art-bottom,.art-video-player.art-hover .art-bottom{opacity:1}.art-video-player.art-control-show .art-bottom .art-controls,.art-video-player.art-hover .art-bottom .art-controls,.art-video-player.art-control-show .art-bottom .art-progress,.art-video-player.art-hover .art-bottom .art-progress{transform:translateY(0)}.art-bottom .art-progress{position:relative;z-index:0;cursor:pointer;pointer-events:auto;padding-top:var(--art-progress-top-gap);padding-bottom:var(--art-bottom-gap)}.art-bottom .art-progress .art-control-progress{position:relative;display:flex;justify-content:center;align-items:center;height:var(--art-progress-height)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner{display:flex;align-items:center;position:relative;height:50%;width:100%;transition:height var(--art-transition-duration) ease;background-color:var(--art-progress-color)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-hover{position:absolute;inset:0;z-index:0;width:100%;height:100%;width:0%;background-color:var(--art-hover-color)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-loaded{position:absolute;inset:0;z-index:10;width:100%;height:100%;width:0%;background-color:var(--art-loaded-color)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-played{position:absolute;inset:0;z-index:20;width:100%;height:100%;width:0%;background-color:var(--art-theme)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight{position:absolute;inset:0;z-index:30;width:100%;height:100%;pointer-events:none}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight span{position:absolute;inset:0 auto 0 0;z-index:0;width:100%;height:100%;pointer-events:auto;width:var(--art-highlight-width)!important;transform:translate(calc(var(--art-highlight-width) / -2));background-color:var(--art-highlight-color)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{display:flex;justify-content:center;align-items:center;position:absolute;z-index:40;left:0;border-radius:50%;width:var(--art-indicator-size);height:var(--art-indicator-size);transform:scale(var(--art-indicator-scale));margin-left:calc(var(--art-indicator-size) / -2);transition:transform var(--art-transition-duration) ease}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator .art-icon{width:100%;height:100%;pointer-events:none}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:hover{transform:scale(1.2)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:active{transform:scale(1)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip{transform-origin:bottom center;transform:scale(.5);opacity:0;position:absolute;z-index:50;top:-25px;left:0;padding:3px 5px;line-height:1;font-size:12px;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);transition:transform var(--art-transition-duration) ease,opacity var(--art-transition-duration) ease}.art-bottom .art-progress .art-control-thumbnails{transform-origin:bottom center;transform:scale(.5);opacity:0;position:absolute;bottom:calc(var(--art-bottom-gap) + 10px);left:0;border-radius:var(--art-border-radius);pointer-events:none;background-color:var(--art-widget-background);transition:transform var(--art-transition-duration) ease,opacity var(--art-transition-duration) ease;box-shadow:0 1px 3px #0003,0 1px 2px -1px #0003}.art-bottom .art-progress:hover .art-control-progress .art-control-progress-inner{height:100%}.art-bottom:hover .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{transform:scale(1)}.art-progress-hover .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip,.art-progress-hover .art-bottom .art-progress .art-control-thumbnails{transform:scale(1);opacity:1}.art-video-player .art-controls{position:relative;z-index:10;pointer-events:auto;display:flex;align-items:center;justify-content:space-between;height:var(--art-control-height)}.art-video-player .art-controls .art-controls-left,.art-video-player .art-controls .art-controls-right{display:flex;height:100%}.art-video-player .art-controls .art-controls-center{display:none;justify-content:center;align-items:center;flex:1;height:100%;padding:0 10px}.art-video-player .art-controls .art-controls-right{justify-content:flex-end}.art-video-player .art-controls .art-control{display:flex;justify-content:center;align-items:center;flex-shrink:0;cursor:pointer;white-space:nowrap;opacity:var(--art-control-opacity);min-height:var(--art-control-height);min-width:var(--art-control-height);transition:opacity var(--art-transition-duration) ease}.art-video-player .art-controls .art-control .art-icon{height:var(--art-control-icon-size);width:var(--art-control-icon-size);transform:scale(var(--art-control-icon-scale));transition:transform var(--art-transition-duration) ease}.art-video-player .art-controls .art-control .art-icon:active{transform:scale(calc(var(--art-control-icon-scale) * .8))}.art-video-player .art-controls .art-control:hover{opacity:1}.art-control-volume{position:relative}.art-control-volume .art-volume-panel{display:flex;justify-content:center;align-items:center;position:absolute;left:0;right:0;padding:0 5px;font-size:12px;text-align:center;cursor:default;opacity:0;transform:translateY(10px);pointer-events:none;bottom:var(--art-control-height);width:var(--art-control-height);height:var(--art-volume-height);transition:all var(--art-transition-duration) ease}.art-control-volume .art-volume-panel .art-volume-inner{display:flex;flex-direction:column;align-items:center;gap:10px;height:100%;width:100%;padding:10px 0 12px;border-radius:var(--art-border-radius);background-color:var(--art-widget-background)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider{flex:1;width:100%;display:flex;cursor:pointer;position:relative;justify-content:center}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle{position:relative;display:flex;justify-content:center;width:2px;border-radius:var(--art-border-radius);overflow:hidden;background-color:#ffffff40}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle .art-volume-loaded{position:absolute;inset:0;z-index:0;width:100%;height:100%;background-color:var(--art-theme)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-indicator{position:absolute;width:var(--art-volume-handle-size);height:var(--art-volume-handle-size);margin-top:calc(var(--art-volume-handle-size) / -2);flex-shrink:0;transform:scale(1);border-radius:100%;background-color:var(--art-theme);transition:transform var(--art-transition-duration) ease}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider:active .art-volume-indicator{transform:scale(.9)}.art-control-volume:hover .art-volume-panel{opacity:1;transform:translateY(0);pointer-events:auto}.art-video-player .art-notice{display:none;position:absolute;inset:0 0 auto;z-index:80;width:100%;height:100%;height:auto;padding:var(--art-padding);pointer-events:none}.art-video-player .art-notice .art-notice-inner{display:inline-flex;padding:5px;line-height:1;border-radius:var(--art-border-radius);background-color:var(--art-tip-background)}.art-video-player.art-notice-show .art-notice{display:flex}.art-video-player .art-contextmenus{display:none;flex-direction:column;position:absolute;z-index:120;padding:5px 0;border-radius:var(--art-border-radius);font-size:12px;background-color:var(--art-widget-background);min-width:var(--art-contextmenus-min-width)}.art-video-player .art-contextmenus .art-contextmenu{cursor:pointer;display:flex;padding:10px 15px;border-bottom:1px solid rgba(255,255,255,.1)}.art-video-player .art-contextmenus .art-contextmenu span{padding:0 8px}.art-video-player .art-contextmenus .art-contextmenu span:hover,.art-video-player .art-contextmenus .art-contextmenu span.art-current{color:var(--art-theme)}.art-video-player .art-contextmenus .art-contextmenu:hover{background-color:#ffffff1a}.art-video-player .art-contextmenus .art-contextmenu:last-child{border-bottom:none}.art-video-player.art-contextmenu-show .art-contextmenus{display:flex}.art-video-player .art-settings{display:none;flex-direction:column;position:absolute;z-index:90;left:auto;overflow-y:auto;overflow-x:hidden;border-radius:var(--art-border-radius);max-height:var(--art-settings-max-height);right:var(--art-padding);bottom:var(--art-control-height);transition:all var(--art-transition-duration) ease;background-color:var(--art-widget-background)}.art-video-player .art-settings .art-setting-panel{display:none;flex-direction:column}.art-video-player .art-settings .art-setting-panel.art-current{display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item{display:flex;justify-content:space-between;align-items:center;padding:0 5px;cursor:pointer;overflow:hidden;transition:background-color var(--art-transition-duration) ease}.art-video-player .art-settings .art-setting-panel .art-setting-item:hover{background-color:#ffffff1a}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current{color:var(--art-theme)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-icon-check{visibility:hidden;height:15px}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current .art-icon-check{visibility:visible}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left{display:flex;justify-content:center;align-items:center;flex-shrink:0;gap:5px}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left .art-setting-item-left-icon{display:flex;justify-content:center;align-items:center;height:var(--art-settings-icon-size);width:var(--art-settings-icon-size)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right{display:flex;justify-content:center;align-items:center;gap:5px;font-size:12px}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-tooltip{white-space:nowrap;color:#ffffff80}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-icon{display:flex;justify-content:center;align-items:center;min-width:32px;height:24px}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-range{height:3px;width:80px;outline:none;appearance:none;background-color:#fff3}.art-video-player .art-settings .art-setting-panel .art-setting-item-back{border-bottom:1px solid rgba(255,255,255,.1)}.art-video-player.art-setting-show .art-settings{display:flex}.art-video-player .art-info{display:none;position:absolute;left:var(--art-padding);top:var(--art-padding);z-index:100;padding:10px;font-size:12px;border-radius:var(--art-border-radius);background-color:var(--art-widget-background)}.art-video-player .art-info .art-info-panel{display:flex;flex-direction:column;gap:5px}.art-video-player .art-info .art-info-panel .art-info-item{display:flex;align-items:center;gap:5px}.art-video-player .art-info .art-info-panel .art-info-item .art-info-title{width:100px;text-align:right}.art-video-player .art-info .art-info-panel .art-info-item .art-info-content{width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;user-select:all}.art-video-player .art-info .art-info-close{position:absolute;top:5px;right:5px;cursor:pointer}.art-video-player.art-info-show .art-info{display:flex}.art-hide-cursor *{cursor:none!important}.art-video-player[data-aspect-ratio]{overflow:hidden}.art-video-player[data-aspect-ratio] .art-video{object-fit:fill;box-sizing:content-box}.art-fullscreen{--art-progress-height: 8px;--art-indicator-size: 20px;--art-control-height: 60px;--art-control-icon-scale: 1.3}.art-fullscreen-web{--art-progress-height: 8px;--art-indicator-size: 20px;--art-control-height: 60px;--art-control-icon-scale: 1.3;position:fixed;inset:0;z-index:var(--art-fullscreen-web-index);width:100%;height:100%}.art-mini-popup{position:fixed;z-index:9999;width:320px;height:180px;background:#000;border-radius:var(--art-border-radius);cursor:move;user-select:none;overflow:hidden;transition:opacity .2s ease;box-shadow:0 0 5px #00000080}.art-mini-popup svg{fill:#fff}.art-mini-popup .art-video{pointer-events:none}.art-mini-popup .art-mini-close{position:absolute;z-index:20;right:10px;top:10px;cursor:pointer;opacity:0;transition:opacity .2s ease}.art-mini-popup .art-mini-state{position:absolute;inset:0;z-index:30;width:100%;height:100%;display:flex;justify-content:center;align-items:center;pointer-events:none;opacity:0;transition:opacity .2s ease;background-color:#00000040}.art-mini-popup .art-mini-state .art-icon{opacity:.75;cursor:pointer;transform:scale(3);pointer-events:auto;transition:transform .2s ease}.art-mini-popup .art-mini-state .art-icon:active{transform:scale(2.5)}.art-mini-popup.art-mini-dragging{opacity:.9}.art-mini-popup:hover .art-mini-close,.art-mini-popup:hover .art-mini-state{opacity:1}.art-video-player[data-flip=horizontal] .art-video{transform:scaleX(-1)}.art-video-player[data-flip=vertical] .art-video{transform:scaleY(-1)}.art-video-player .art-layer-lock{display:none;justify-content:center;align-items:center;position:absolute;top:50%;border-radius:50%;transform:translateY(-50%);height:var(--art-lock-size);width:var(--art-lock-size);left:var(--art-padding);background-color:var(--art-tip-background)}.art-video-player .art-layer-auto-playback{display:none;gap:10px;align-items:center;position:absolute;border-radius:var(--art-border-radius);padding:10px;line-height:1;left:var(--art-padding);bottom:calc(var(--art-control-height) + var(--art-bottom-gap) + 10px);background-color:var(--art-widget-background)}.art-video-player .art-layer-auto-playback .art-auto-playback-close{display:flex;justify-content:center;align-items:center;cursor:pointer}.art-video-player .art-layer-auto-playback .art-auto-playback-close svg{width:15px;height:15px;fill:var(--art-theme)}.art-video-player .art-layer-auto-playback .art-auto-playback-jump{color:var(--art-theme);cursor:pointer}.art-video-player.art-lock .art-subtitle{bottom:var(--art-subtitle-bottom)!important}.art-video-player.art-mini-progress-bar .art-bottom,.art-video-player.art-lock .art-bottom{opacity:1;padding:0;background-image:none}.art-video-player.art-mini-progress-bar .art-bottom .art-controls,.art-video-player.art-lock .art-bottom .art-controls,.art-video-player.art-mini-progress-bar .art-bottom .art-progress,.art-video-player.art-lock .art-bottom .art-progress{transform:translateY(calc(var(--art-control-height) + var(--art-bottom-gap) + var(--art-progress-height) / 4))}.art-video-player.art-mini-progress-bar .art-bottom .art-progress-indicator,.art-video-player.art-lock .art-bottom .art-progress-indicator{display:none!important}.art-video-player.art-control-show .art-layer-lock{display:flex}.art-control-selector{position:relative;display:flex;justify-content:center}.art-control-selector .art-selector-list{display:flex;flex-direction:column;align-items:center;text-align:center;position:absolute;border-radius:var(--art-border-radius);overflow-y:auto;overflow-x:hidden;opacity:0;transform:translateY(10px);pointer-events:none;bottom:var(--art-control-height);max-height:var(--art-selector-max-height);background-color:var(--art-widget-background);transition:all var(--art-transition-duration) ease}.art-control-selector .art-selector-list .art-selector-item{display:flex;justify-content:center;align-items:center;width:100%;padding:10px 15px;flex-shrink:0;line-height:1}.art-control-selector .art-selector-list .art-selector-item:hover{background-color:#ffffff1a}.art-control-selector .art-selector-list .art-selector-item:hover,.art-control-selector .art-selector-list .art-selector-item.art-current{color:var(--art-theme)}.art-control-selector:hover .art-selector-list{opacity:1;transform:translateY(0);pointer-events:auto}.art-video-player [class*=hint--]{position:relative;display:inline-block;font-style:normal}.art-video-player [class*=hint--]:before,.art-video-player [class*=hint--]:after{position:absolute;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translateZ(0);visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;-webkit-transition:.3s ease;-moz-transition:.3s ease;transition:.3s ease;-webkit-transition-delay:0ms;-moz-transition-delay:0ms;transition-delay:0ms}.art-video-player [class*=hint--]:hover:before,.art-video-player [class*=hint--]:hover:after{visibility:visible;opacity:1}.art-video-player [class*=hint--]:hover:before,.art-video-player [class*=hint--]:hover:after{-webkit-transition-delay:.1s;-moz-transition-delay:.1s;transition-delay:.1s}.art-video-player [class*=hint--]:before{content:\"\";position:absolute;background:transparent;border:6px solid transparent;z-index:1000001}.art-video-player [class*=hint--]:after{background:#000;color:#fff;padding:8px 10px;font-size:12px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;line-height:12px;white-space:nowrap}.art-video-player [class*=hint--][aria-label]:after{content:attr(aria-label)}.art-video-player [class*=hint--][data-hint]:after{content:attr(data-hint)}.art-video-player [aria-label=\"\"]:before,.art-video-player [aria-label=\"\"]:after,.art-video-player [data-hint=\"\"]:before,.art-video-player [data-hint=\"\"]:after{display:none!important}.art-video-player .hint--top-left:before{border-top-color:#000}.art-video-player .hint--top-right:before{border-top-color:#000}.art-video-player .hint--top:before{border-top-color:#000}.art-video-player .hint--bottom-left:before{border-bottom-color:#000}.art-video-player .hint--bottom-right:before{border-bottom-color:#000}.art-video-player .hint--bottom:before{border-bottom-color:#000}.art-video-player .hint--left:before{border-left-color:#000}.art-video-player .hint--right:before{border-right-color:#000}.art-video-player .hint--top:before{margin-bottom:-11px}.art-video-player .hint--top:before,.art-video-player .hint--top:after{bottom:100%;left:50%}.art-video-player .hint--top:before{left:calc(50% - 6px)}.art-video-player .hint--top:after{-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);transform:translate(-50%)}.art-video-player .hint--top:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-moz-transform:translateX(-50%) translateY(-8px);transform:translate(-50%) translateY(-8px)}.art-video-player .hint--bottom:before{margin-top:-11px}.art-video-player .hint--bottom:before,.art-video-player .hint--bottom:after{top:100%;left:50%}.art-video-player .hint--bottom:before{left:calc(50% - 6px)}.art-video-player .hint--bottom:after{-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);transform:translate(-50%)}.art-video-player .hint--bottom:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-moz-transform:translateX(-50%) translateY(8px);transform:translate(-50%) translateY(8px)}.art-video-player .hint--right:before{margin-left:-11px;margin-bottom:-6px}.art-video-player .hint--right:after{margin-bottom:-14px}.art-video-player .hint--right:before,.art-video-player .hint--right:after{left:100%;bottom:50%}.art-video-player .hint--right:hover:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translate(8px)}.art-video-player .hint--right:hover:after{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translate(8px)}.art-video-player .hint--left:before{margin-right:-11px;margin-bottom:-6px}.art-video-player .hint--left:after{margin-bottom:-14px}.art-video-player .hint--left:before,.art-video-player .hint--left:after{right:100%;bottom:50%}.art-video-player .hint--left:hover:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translate(-8px)}.art-video-player .hint--left:hover:after{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translate(-8px)}.art-video-player .hint--top-left:before{margin-bottom:-11px}.art-video-player .hint--top-left:before,.art-video-player .hint--top-left:after{bottom:100%;left:50%}.art-video-player .hint--top-left:before{left:calc(50% - 6px)}.art-video-player .hint--top-left:after{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);transform:translate(-100%)}.art-video-player .hint--top-left:after{margin-left:12px}.art-video-player .hint--top-left:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--top-left:hover:after{-webkit-transform:translateX(-100%) translateY(-8px);-moz-transform:translateX(-100%) translateY(-8px);transform:translate(-100%) translateY(-8px)}.art-video-player .hint--top-right:before{margin-bottom:-11px}.art-video-player .hint--top-right:before,.art-video-player .hint--top-right:after{bottom:100%;left:50%}.art-video-player .hint--top-right:before{left:calc(50% - 6px)}.art-video-player .hint--top-right:after{-webkit-transform:translateX(0);-moz-transform:translateX(0);transform:translate(0)}.art-video-player .hint--top-right:after{margin-left:-12px}.art-video-player .hint--top-right:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--top-right:hover:after{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--bottom-left:before{margin-top:-11px}.art-video-player .hint--bottom-left:before,.art-video-player .hint--bottom-left:after{top:100%;left:50%}.art-video-player .hint--bottom-left:before{left:calc(50% - 6px)}.art-video-player .hint--bottom-left:after{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);transform:translate(-100%)}.art-video-player .hint--bottom-left:after{margin-left:12px}.art-video-player .hint--bottom-left:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--bottom-left:hover:after{-webkit-transform:translateX(-100%) translateY(8px);-moz-transform:translateX(-100%) translateY(8px);transform:translate(-100%) translateY(8px)}.art-video-player .hint--bottom-right:before{margin-top:-11px}.art-video-player .hint--bottom-right:before,.art-video-player .hint--bottom-right:after{top:100%;left:50%}.art-video-player .hint--bottom-right:before{left:calc(50% - 6px)}.art-video-player .hint--bottom-right:after{-webkit-transform:translateX(0);-moz-transform:translateX(0);transform:translate(0)}.art-video-player .hint--bottom-right:after{margin-left:-12px}.art-video-player .hint--bottom-right:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--bottom-right:hover:after{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--small:after,.art-video-player .hint--medium:after,.art-video-player .hint--large:after{white-space:normal;line-height:1.4em;word-wrap:break-word}.art-video-player .hint--small:after{width:80px}.art-video-player .hint--medium:after{width:150px}.art-video-player .hint--large:after{width:300px}.art-video-player [class*=hint--]:after{text-shadow:0 -1px 0px black;box-shadow:4px 4px 8px #0000004d}.art-video-player .hint--error:after{background-color:#b34e4d;text-shadow:0 -1px 0px #592726}.art-video-player .hint--error.hint--top-left:before{border-top-color:#b34e4d}.art-video-player .hint--error.hint--top-right:before{border-top-color:#b34e4d}.art-video-player .hint--error.hint--top:before{border-top-color:#b34e4d}.art-video-player .hint--error.hint--bottom-left:before{border-bottom-color:#b34e4d}.art-video-player .hint--error.hint--bottom-right:before{border-bottom-color:#b34e4d}.art-video-player .hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.art-video-player .hint--error.hint--left:before{border-left-color:#b34e4d}.art-video-player .hint--error.hint--right:before{border-right-color:#b34e4d}.art-video-player .hint--warning:after{background-color:#c09854;text-shadow:0 -1px 0px #6c5328}.art-video-player .hint--warning.hint--top-left:before{border-top-color:#c09854}.art-video-player .hint--warning.hint--top-right:before{border-top-color:#c09854}.art-video-player .hint--warning.hint--top:before{border-top-color:#c09854}.art-video-player .hint--warning.hint--bottom-left:before{border-bottom-color:#c09854}.art-video-player .hint--warning.hint--bottom-right:before{border-bottom-color:#c09854}.art-video-player .hint--warning.hint--bottom:before{border-bottom-color:#c09854}.art-video-player .hint--warning.hint--left:before{border-left-color:#c09854}.art-video-player .hint--warning.hint--right:before{border-right-color:#c09854}.art-video-player .hint--info:after{background-color:#3986ac;text-shadow:0 -1px 0px #1a3c4d}.art-video-player .hint--info.hint--top-left:before{border-top-color:#3986ac}.art-video-player .hint--info.hint--top-right:before{border-top-color:#3986ac}.art-video-player .hint--info.hint--top:before{border-top-color:#3986ac}.art-video-player .hint--info.hint--bottom-left:before{border-bottom-color:#3986ac}.art-video-player .hint--info.hint--bottom-right:before{border-bottom-color:#3986ac}.art-video-player .hint--info.hint--bottom:before{border-bottom-color:#3986ac}.art-video-player .hint--info.hint--left:before{border-left-color:#3986ac}.art-video-player .hint--info.hint--right:before{border-right-color:#3986ac}.art-video-player .hint--success:after{background-color:#458746;text-shadow:0 -1px 0px #1a321a}.art-video-player .hint--success.hint--top-left:before{border-top-color:#458746}.art-video-player .hint--success.hint--top-right:before{border-top-color:#458746}.art-video-player .hint--success.hint--top:before{border-top-color:#458746}.art-video-player .hint--success.hint--bottom-left:before{border-bottom-color:#458746}.art-video-player .hint--success.hint--bottom-right:before{border-bottom-color:#458746}.art-video-player .hint--success.hint--bottom:before{border-bottom-color:#458746}.art-video-player .hint--success.hint--left:before{border-left-color:#458746}.art-video-player .hint--success.hint--right:before{border-right-color:#458746}.art-video-player .hint--always:after,.art-video-player .hint--always:before{opacity:1;visibility:visible}.art-video-player .hint--always.hint--top:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--always.hint--top:after{-webkit-transform:translateX(-50%) translateY(-8px);-moz-transform:translateX(-50%) translateY(-8px);transform:translate(-50%) translateY(-8px)}.art-video-player .hint--always.hint--top-left:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--always.hint--top-left:after{-webkit-transform:translateX(-100%) translateY(-8px);-moz-transform:translateX(-100%) translateY(-8px);transform:translate(-100%) translateY(-8px)}.art-video-player .hint--always.hint--top-right:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--always.hint--top-right:after{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--always.hint--bottom:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--always.hint--bottom:after{-webkit-transform:translateX(-50%) translateY(8px);-moz-transform:translateX(-50%) translateY(8px);transform:translate(-50%) translateY(8px)}.art-video-player .hint--always.hint--bottom-left:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--always.hint--bottom-left:after{-webkit-transform:translateX(-100%) translateY(8px);-moz-transform:translateX(-100%) translateY(8px);transform:translate(-100%) translateY(8px)}.art-video-player .hint--always.hint--bottom-right:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--always.hint--bottom-right:after{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--always.hint--left:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translate(-8px)}.art-video-player .hint--always.hint--left:after{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translate(-8px)}.art-video-player .hint--always.hint--right:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translate(8px)}.art-video-player .hint--always.hint--right:after{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translate(8px)}.art-video-player .hint--rounded:after{border-radius:4px}.art-video-player .hint--no-animate:before,.art-video-player .hint--no-animate:after{-webkit-transition-duration:0ms;-moz-transition-duration:0ms;transition-duration:0ms}.art-video-player .hint--bounce:before,.art-video-player .hint--bounce:after{-webkit-transition:opacity .3s ease,visibility .3s ease,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s ease,visibility .3s ease,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s ease,visibility .3s ease,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.art-video-player .hint--no-shadow:before,.art-video-player .hint--no-shadow:after{text-shadow:initial;box-shadow:initial}.art-video-player .hint--no-arrow:before{display:none}.art-video-player.art-mobile{--art-bottom-gap: 10px;--art-control-height: 38px;--art-control-icon-scale: 1;--art-state-size: 60px;--art-settings-max-height: 180px;--art-selector-max-height: 180px;--art-indicator-scale: 1;--art-control-opacity: 1}.art-video-player.art-mobile .art-controls-left{margin-left:calc(var(--art-padding) / -1)}.art-video-player.art-mobile .art-controls-right{margin-right:calc(var(--art-padding) / -1)}';class jt extends dt{constructor(t){super(t),this.name=\"subtitle\",this.option=null,this.destroyEvent=()=>null,this.init(t.option.subtitle);let e=!1;t.on(\"video:timeupdate\",()=>{if(!this.url)return;const t=this.art.template.$video.webkitDisplayingFullscreen;\"boolean\"===typeof t&&t!==e&&(e=t,this.createTrack(t?\"subtitles\":\"metadata\",this.url))})}get url(){return this.art.template.$track.src}set url(t){this.switch(t)}get textTrack(){return this.art.template.$video?.textTracks?.[0]}get activeCues(){return this.textTrack?Array.from(this.textTrack.activeCues):[]}get cues(){return this.textTrack?Array.from(this.textTrack.cues):[]}style(t,e){const{$subtitle:r}=this.art.template;return\"object\"===typeof t?x(r,t):w(r,t,e)}update(){const{option:{subtitle:t},template:{$subtitle:e}}=this.art;e.innerHTML=\"\",this.activeCues.length&&(this.art.emit(\"subtitleBeforeUpdate\",this.activeCues),e.innerHTML=this.activeCues.map((e,r)=>e.text.split(/\\r?\\n/).filter(t=>t.trim()).map(e=>`<div class=\"art-subtitle-line\" data-group=\"${r}\">\\n                                ${t.escape?B(e):e}\\n                            </div>`).join(\"\")).join(\"\"),this.art.emit(\"subtitleAfterUpdate\",this.activeCues))}async switch(t,e={}){const{i18n:r,notice:a,option:o}=this.art,n={...o.subtitle,...e,url:t},i=await this.init(n);return e.name&&(a.show=`${r.get(\"Switch Subtitle\")}: ${e.name}`),i}createTrack(t,e){const{template:r,proxy:a,option:o}=this.art,{$video:n,$track:i}=r,s=L(\"track\");s.default=!0,s.kind=t,s.src=e,s.label=o.subtitle.name||\"Artplayer\",s.track.mode=\"hidden\",s.onload=()=>{this.art.emit(\"subtitleLoad\",this.cues,this.option)},this.art.events.remove(this.destroyEvent),i.onload=null,b(i),y(n,s),r.$track=s,this.destroyEvent=a(this.textTrack,\"cuechange\",()=>this.update())}async init(t){const{notice:e,template:{$subtitle:r}}=this.art;return this.textTrack?(o(t,ct.subtitle),t.url?(this.option=t,this.style(t.style),fetch(t.url).then(t=>t.arrayBuffer()).then(e=>{const r=new TextDecoder(t.encoding).decode(e);switch(t.type||V(t.url)){case\"srt\":{const e=X(r);return G(t.onVttLoad(e))}case\"ass\":{const e=K(r);return G(t.onVttLoad(e))}case\"vtt\":return G(t.onVttLoad(r));default:return t.url}}).then(t=>(r.innerHTML=\"\",this.url===t||(URL.revokeObjectURL(this.url),this.createTrack(\"metadata\",t)),t)).catch(t=>{throw r.innerHTML=\"\",e.show=t,t})):void 0):null}}class Ut{constructor(t){this.art=t;const{option:e,constructor:r}=t;e.container instanceof Element?this.$container=e.container:(this.$container=u(e.container),_(this.$container,`No container element found by ${e.container}`)),_(I(),\"The current browser does not support flex layout\");const a=this.$container.tagName.toLowerCase();_(\"div\"===a,`Unsupported container element type, only support 'div' but got '${a}'`),_(r.instances.every(t=>t.template.$container!==this.$container),\"Cannot mount multiple instances on the same dom element\"),this.query=this.query.bind(this),this.$container.dataset.artId=t.id,this.init()}static get html(){return`\\n          <div class=\"art-video-player art-subtitle-show art-layer-show art-control-show art-mask-show\">\\n            <video class=\"art-video\">\\n              <track default kind=\"metadata\" src=\"\"></track>\\n            </video>\\n            <div class=\"art-poster\"></div>\\n            <div class=\"art-subtitle\"></div>\\n            <div class=\"art-danmuku\"></div>\\n            <div class=\"art-layers\"></div>\\n            <div class=\"art-mask\">\\n              <div class=\"art-state\"></div>\\n            </div>\\n            <div class=\"art-bottom\">\\n              <div class=\"art-progress\"></div>\\n              <div class=\"art-controls\">\\n                <div class=\"art-controls-left\"></div>\\n                <div class=\"art-controls-center\"></div>\\n                <div class=\"art-controls-right\"></div>\\n              </div>\\n            </div>\\n            <div class=\"art-loading\"></div>\\n            <div class=\"art-notice\">\\n              <div class=\"art-notice-inner\"></div>\\n            </div>\\n            <div class=\"art-settings\"></div>\\n            <div class=\"art-info\">\\n              <div class=\"art-info-panel\">\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Player version:</div>\\n                  <div class=\"art-info-content\">${n}</div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video url:</div>\\n                  <div class=\"art-info-content\" data-video=\"currentSrc\"></div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video volume:</div>\\n                  <div class=\"art-info-content\" data-video=\"volume\"></div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video time:</div>\\n                  <div class=\"art-info-content\" data-video=\"currentTime\"></div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video duration:</div>\\n                  <div class=\"art-info-content\" data-video=\"duration\"></div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video resolution:</div>\\n                  <div class=\"art-info-content\">\\n                    <span data-video=\"videoWidth\"></span> x <span data-video=\"videoHeight\"></span>\\n                  </div>\\n                </div>\\n              </div>\\n              <div class=\"art-info-close\">[x]</div>\\n            </div>\\n            <div class=\"art-contextmenus\"></div>\\n          </div>\\n        `}query(t){return u(t,this.$container)}init(){const{option:t}=this.art;if(t.useSSR||(this.$container.innerHTML=Ut.html),this.$player=this.query(\".art-video-player\"),this.$video=this.query(\".art-video\"),this.$track=this.query(\"track\"),this.$poster=this.query(\".art-poster\"),this.$subtitle=this.query(\".art-subtitle\"),this.$danmuku=this.query(\".art-danmuku\"),this.$bottom=this.query(\".art-bottom\"),this.$progress=this.query(\".art-progress\"),this.$controls=this.query(\".art-controls\"),this.$controlsLeft=this.query(\".art-controls-left\"),this.$controlsCenter=this.query(\".art-controls-center\"),this.$controlsRight=this.query(\".art-controls-right\"),this.$layer=this.query(\".art-layers\"),this.$loading=this.query(\".art-loading\"),this.$notice=this.query(\".art-notice\"),this.$noticeInner=this.query(\".art-notice-inner\"),this.$mask=this.query(\".art-mask\"),this.$state=this.query(\".art-state\"),this.$setting=this.query(\".art-settings\"),this.$info=this.query(\".art-info\"),this.$infoPanel=this.query(\".art-info-panel\"),this.$infoClose=this.query(\".art-info-close\"),this.$contextmenu=this.query(\".art-contextmenus\"),t.proxy){const e=t.proxy.call(this.art,this.art);_(e instanceof HTMLVideoElement||e instanceof HTMLCanvasElement,\"Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'\"),z(e,this.$video),e.className=\"art-video\",this.$video=e}t.backdrop&&f(this.$player,\"art-backdrop\"),p&&f(this.$player,\"art-mobile\")}destroy(t){t?this.$container.innerHTML=\"\":f(this.$player,\"art-destroy\")}}class qt{on(t,e,r){const a=this.e||(this.e={});return(a[t]||(a[t]=[])).push({fn:e,ctx:r}),this}once(t,e,r){const a=this;function o(...n){a.off(t,o),e.apply(r,n)}return o._=e,this.on(t,o,r)}emit(t,...e){const r=((this.e||(this.e={}))[t]||[]).slice();for(let a=0;a<r.length;a+=1)r[a].fn.apply(r[a].ctx,e);return this}off(t,e){const r=this.e||(this.e={}),a=r[t],o=[];if(a&&e)for(let n=0,i=a.length;n<i;n+=1)a[n].fn!==e&&a[n].fn._!==e&&o.push(a[n]);return o.length?r[t]=o:delete r[t],this}}let Xt=0;const Gt=[];class Kt extends qt{constructor(t,e){if(super(),!h)throw new Error(\"Artplayer can only be used in the browser environment\");this.id=++Xt;const r=q(Kt.option,t);if(r.container=t.container,this.option=o(r,ct),this.isLock=!1,this.isReady=!1,this.isFocus=!1,this.isInput=!1,this.isRotate=!1,this.isDestroy=!1,this.template=new Ut(this),this.events=new vt(this),this.storage=new Ht(this),this.icons=new xt(this),this.i18n=new wt(this),this.notice=new Ct(this),this.player=new Ot(this),this.layers=new $t(this),this.controls=new ft(this),this.contextmenu=new pt(this),this.subtitle=new jt(this),this.info=new kt(this),this.loading=new Tt(this),this.hotkey=new yt(this),this.mask=new Et(this),this.setting=new Bt(this),this.plugins=new Ft(this),\"function\"===typeof e&&this.on(\"ready\",()=>e.call(this,this)),Kt.DEBUG){const t=t=>console.log(`[ART.${this.id}] -> ${t}`);t(`Version@${Kt.version}`);for(let e=0;e<i.events.length;e++)this.on(`video:${i.events[e]}`,e=>t(`Event@${e.type}`))}Gt.push(this)}static get instances(){return Gt}static get version(){return n}static get config(){return i}static get utils(){return tt}static get scheme(){return ct}static get Emitter(){return qt}static get validator(){return o}static get kindOf(){return o.kindOf}static get html(){return Ut.html}static get option(){return{id:\"\",container:\"#artplayer\",url:\"\",poster:\"\",type:\"\",theme:\"#f00\",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,gesture:!0,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,proxy:void 0,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:\"\",number:60,column:10,width:0,height:0,scale:1},subtitle:{url:\"\",type:\"\",style:{},name:\"\",escape:!0,encoding:\"utf-8\",onVttLoad:t=>t},moreVideoAttr:{controls:!1,preload:l?\"auto\":\"metadata\"},i18n:{},icons:{},cssVar:{},customType:{},lang:navigator?.language.toLowerCase()}}get proxy(){return this.events.proxy}get query(){return this.template.query}get video(){return this.template.$video}reset(){this.video.removeAttribute(\"src\"),this.video.load()}destroy(t=!0){Kt.REMOVE_SRC_WHEN_DESTROY&&this.reset(),this.events.destroy(),this.template.destroy(t),Gt.splice(Gt.indexOf(this),1),this.isDestroy=!0,this.emit(\"destroy\")}}return Kt.STYLE=Wt,Kt.DEBUG=!1,Kt.CONTEXTMENU=!0,Kt.NOTICE_TIME=2e3,Kt.SETTING_WIDTH=250,Kt.SETTING_ITEM_WIDTH=200,Kt.SETTING_ITEM_HEIGHT=35,Kt.RESIZE_TIME=200,Kt.SCROLL_TIME=200,Kt.SCROLL_GAP=50,Kt.AUTO_PLAYBACK_MAX=10,Kt.AUTO_PLAYBACK_MIN=5,Kt.AUTO_PLAYBACK_TIMEOUT=3e3,Kt.RECONNECT_TIME_MAX=5,Kt.RECONNECT_SLEEP_TIME=1e3,Kt.CONTROL_HIDE_TIME=3e3,Kt.DBCLICK_TIME=300,Kt.DBCLICK_FULLSCREEN=!0,Kt.MOBILE_DBCLICK_PLAY=!0,Kt.MOBILE_CLICK_PLAY=!1,Kt.AUTO_ORIENTATION_TIME=200,Kt.INFO_LOOP_TIME=1e3,Kt.FAST_FORWARD_VALUE=3,Kt.FAST_FORWARD_TIME=1e3,Kt.TOUCH_MOVE_RATIO=.5,Kt.VOLUME_STEP=.1,Kt.SEEK_STEP=5,Kt.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],Kt.ASPECT_RATIO=[\"default\",\"4:3\",\"16:9\"],Kt.FLIP=[\"normal\",\"horizontal\",\"vertical\"],Kt.FULLSCREEN_WEB_IN_BODY=!0,Kt.LOG_VERSION=!0,Kt.USE_RAF=!1,Kt.REMOVE_SRC_WHEN_DESTROY=!0,h&&(M(\"artplayer-style\",Wt)),Kt});\ndiff --git a/dist/artplayer.legacy.js b/dist/artplayer.legacy.js\nindex fca0a796ebd8fa6b36f1a0e482038a17e42f915a..ecc1a0c1db93894bbbef588eb933348e731d49ca 100644\n--- a/dist/artplayer.legacy.js\n+++ b/dist/artplayer.legacy.js\n@@ -4,4 +4,4 @@\n  * (c) 2017-2026 Harvey Zhao\n  * Released under the MIT License.\n  */\n-!function(t,e){\"object\"===typeof exports&&\"undefined\"!==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?(t.Artplayer=e(),define(function(){return t.Artplayer})):(t=\"undefined\"!==typeof globalThis?globalThis:t||self).Artplayer=e()}(this,function(){\"use strict\";var t,e=Object.defineProperty,r=Object.defineProperties,o=Object.getOwnPropertyDescriptors,a=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable,s=(t,r,o)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[r]=o,l=(t,e)=>{for(var r in e||(e={}))n.call(e,r)&&s(t,r,e[r]);if(a)for(var r of a(e))i.call(e,r)&&s(t,r,e[r]);return t},c=(t,e)=>r(t,o(e)),d=(t,e,r)=>new Promise((o,a)=>{var n=t=>{try{s(r.next(t))}catch(e){a(e)}},i=t=>{try{s(r.throw(t))}catch(e){a(e)}},s=t=>t.done?o(t.value):Promise.resolve(t.value).then(n,i);s((r=r.apply(t,e)).next())});function p(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,\"default\")?t.default:t}var h,u={exports:{}};var m=(h||(h=1,u.exports=function(){function t(e){return(t=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t})(e)}var e=Object.prototype.toString,r=function(r){if(void 0===r)return\"undefined\";if(null===r)return\"null\";var a=t(r);if(\"boolean\"===a)return\"boolean\";if(\"string\"===a)return\"string\";if(\"number\"===a)return\"number\";if(\"symbol\"===a)return\"symbol\";if(\"function\"===a)return\"GeneratorFunction\"===o(r)?\"generatorfunction\":\"function\";if(function(t){return Array.isArray?Array.isArray(t):t instanceof Array}(r))return\"array\";if(function(t){return!(!t.constructor||\"function\"!=typeof t.constructor.isBuffer)&&t.constructor.isBuffer(t)}(r))return\"buffer\";if(function(t){try{if(\"number\"==typeof t.length&&\"function\"==typeof t.callee)return!0}catch(e){if(-1!==e.message.indexOf(\"callee\"))return!0}return!1}(r))return\"arguments\";if(function(t){return t instanceof Date||\"function\"==typeof t.toDateString&&\"function\"==typeof t.getDate&&\"function\"==typeof t.setDate}(r))return\"date\";if(function(t){return t instanceof Error||\"string\"==typeof t.message&&t.constructor&&\"number\"==typeof t.constructor.stackTraceLimit}(r))return\"error\";if(function(t){return t instanceof RegExp||\"string\"==typeof t.flags&&\"boolean\"==typeof t.ignoreCase&&\"boolean\"==typeof t.multiline&&\"boolean\"==typeof t.global}(r))return\"regexp\";switch(o(r)){case\"Symbol\":return\"symbol\";case\"Promise\":return\"promise\";case\"WeakMap\":return\"weakmap\";case\"WeakSet\":return\"weakset\";case\"Map\":return\"map\";case\"Set\":return\"set\";case\"Int8Array\":return\"int8array\";case\"Uint8Array\":return\"uint8array\";case\"Uint8ClampedArray\":return\"uint8clampedarray\";case\"Int16Array\":return\"int16array\";case\"Uint16Array\":return\"uint16array\";case\"Int32Array\":return\"int32array\";case\"Uint32Array\":return\"uint32array\";case\"Float32Array\":return\"float32array\";case\"Float64Array\":return\"float64array\"}if(function(t){return\"function\"==typeof t.throw&&\"function\"==typeof t.return&&\"function\"==typeof t.next}(r))return\"generator\";switch(a=e.call(r)){case\"[object Object]\":return\"object\";case\"[object Map Iterator]\":return\"mapiterator\";case\"[object Set Iterator]\":return\"setiterator\";case\"[object String Iterator]\":return\"stringiterator\";case\"[object Array Iterator]\":return\"arrayiterator\"}return a.slice(8,-1).toLowerCase().replace(/\\s/g,\"\")};function o(t){return t.constructor?t.constructor.name:null}function a(t,e){var o=2<arguments.length&&void 0!==arguments[2]?arguments[2]:[\"option\"];return n(t,e,o),i(t,e,o),function(t,e,o){var s=r(e),l=r(t);if(\"object\"===s){if(\"object\"!==l)throw new Error(\"[Type Error]: '\".concat(o.join(\".\"),\"' require 'object' type, but got '\").concat(l,\"'\"));Object.keys(e).forEach(function(r){var s=t[r],l=e[r],c=o.slice();c.push(r),n(s,l,c),i(s,l,c),a(s,l,c)})}if(\"array\"===s){if(\"array\"!==l)throw new Error(\"[Type Error]: '\".concat(o.join(\".\"),\"' require 'array' type, but got '\").concat(l,\"'\"));t.forEach(function(r,s){var l=t[s],c=e[s]||e[0],d=o.slice();d.push(s),n(l,c,d),i(l,c,d),a(l,c,d)})}}(t,e,o),t}function n(t,e,o){if(\"string\"===r(e)){var a=r(t);if(\"?\"===e[0]&&(e=e.slice(1)+\"|undefined\"),!(-1<e.indexOf(\"|\")?e.split(\"|\").map(function(t){return t.toLowerCase().trim()}).filter(Boolean).some(function(t){return a===t}):e.toLowerCase().trim()===a))throw new Error(\"[Type Error]: '\".concat(o.join(\".\"),\"' require '\").concat(e,\"' type, but got '\").concat(a,\"'\"))}}function i(t,e,o){if(\"function\"===r(e)){var a=e(t,r(t),o);if(!0!==a){var n=r(a);throw\"string\"===n?new Error(a):\"error\"===n?a:new Error(\"[Validator Error]: The scheme for '\".concat(o.join(\".\"),\"' validator require return true, but got '\").concat(a,\"'\"))}}}return a.kindOf=r,a}()),u.exports);const f=p(m),g=\"5.4.0\",v={properties:[\"audioTracks\",\"autoplay\",\"buffered\",\"controller\",\"controls\",\"crossOrigin\",\"currentSrc\",\"currentTime\",\"defaultMuted\",\"defaultPlaybackRate\",\"duration\",\"ended\",\"error\",\"loop\",\"mediaGroup\",\"muted\",\"networkState\",\"paused\",\"playbackRate\",\"played\",\"preload\",\"readyState\",\"seekable\",\"seeking\",\"src\",\"startDate\",\"textTracks\",\"videoTracks\",\"volume\"],methods:[\"addTextTrack\",\"canPlayType\",\"load\",\"play\",\"pause\"],events:[\"abort\",\"canplay\",\"canplaythrough\",\"durationchange\",\"emptied\",\"ended\",\"error\",\"loadeddata\",\"loadedmetadata\",\"loadstart\",\"pause\",\"play\",\"playing\",\"progress\",\"ratechange\",\"seeked\",\"seeking\",\"stalled\",\"suspend\",\"timeupdate\",\"volumechange\",\"waiting\"],prototypes:[\"width\",\"height\",\"videoWidth\",\"videoHeight\",\"poster\",\"webkitDecodedFrameCount\",\"webkitDroppedFrameCount\",\"playsInline\",\"webkitSupportsFullscreen\",\"webkitDisplayingFullscreen\",\"onenterpictureinpicture\",\"onleavepictureinpicture\",\"disablePictureInPicture\",\"cancelVideoFrameCallback\",\"requestVideoFrameCallback\",\"getVideoPlaybackQuality\",\"requestPictureInPicture\",\"webkitEnterFullScreen\",\"webkitEnterFullscreen\",\"webkitExitFullScreen\",\"webkitExitFullscreen\"]},y=null!=(t=null==globalThis?void 0:globalThis.CUSTOM_USER_AGENT)?t:\"undefined\"!==typeof navigator?navigator.userAgent:\"\",b=/^(?:(?!chrome|android).)*safari/i.test(y),w=/iPad|iPhone|iPod/i.test(y)&&!window.MSStream,x=w||y.includes(\"Macintosh\")&&navigator.maxTouchPoints>=1,k=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(y)||x,$=\"undefined\"!==typeof window&&\"undefined\"!==typeof document;function T(t,e=document){return e.querySelector(t)}function E(t,e=document){return Array.from(e.querySelectorAll(t))}function C(t,e){return t.classList.add(e)}function z(t,e){return t.classList.remove(e)}function L(t,e){return t.classList.contains(e)}function S(t,e){return e instanceof Element?t.appendChild(e):t.insertAdjacentHTML(\"beforeend\",String(e)),t.lastElementChild||t.lastChild}function M(t){return t.parentNode.removeChild(t)}function I(t,e,r){return t.style[e]=r,t}function P(t,e){for(const r in e)I(t,r,e[r]);return t}function A(t){return Array.from(t.parentElement.children).filter(e=>e!==t)}function O(t,e){A(t).forEach(t=>z(t,e)),C(t,e)}function R(t,e,r=\"top\"){k||(t.setAttribute(\"aria-label\",e),C(t,\"hint--rounded\"),C(t,`hint--${r}`))}function _(t,e=0){const r=t.getBoundingClientRect(),o=window.innerHeight||document.documentElement.clientHeight,a=window.innerWidth||document.documentElement.clientWidth,n=r.top-e<=o&&r.top+r.height+e>=0,i=r.left-e<=a+e&&r.left+r.width+e>=0;return n&&i}function V(t,e){return j(t).includes(e)}function Y(t,e){return e.parentNode.replaceChild(t,e),t}function D(t){return document.createElement(t)}function N(t=\"\",e=\"\"){const r=D(\"i\");return C(r,\"art-icon\"),C(r,`art-icon-${t}`),S(r,e),r}function F(t,e){let r=document.getElementById(t);r||(r=document.createElement(\"style\"),r.id=t,\"loading\"===document.readyState?document.addEventListener(\"DOMContentLoaded\",()=>{document.head.appendChild(r)}):(document.head||document.documentElement).appendChild(r)),r.textContent=e}function B(){const t=document.createElement(\"div\");return t.style.display=\"flex\",\"flex\"===t.style.display}function H(t){return t.getBoundingClientRect()}function W(t,e){return new Promise((r,o)=>{const a=new Image;a.onload=function(){if(e&&1!==e){const n=document.createElement(\"canvas\"),i=n.getContext(\"2d\");n.width=a.width*e,n.height=a.height*e,i.drawImage(a,0,0,n.width,n.height),n.toBlob(e=>{const a=URL.createObjectURL(e),n=new Image;n.onload=function(){r(n)},n.onerror=function(){URL.revokeObjectURL(a),o(new Error(`Image load failed: ${t}`))},n.src=a})}else r(a)},a.onerror=function(){o(new Error(`Image load failed: ${t}`))},a.src=t})}function j(t){if(t.composedPath)return t.composedPath();const e=[];let r=t.target;for(;r;)e.push(r),r=r.parentNode;return e.includes(window)||void 0===window||e.push(window),e}class U extends Error{constructor(t,e){super(t),\"function\"===typeof Error.captureStackTrace&&Error.captureStackTrace(this,e||this.constructor),this.name=\"ArtPlayerError\"}}function q(t,e){if(!t)throw new U(e);return t}function X(t){return t.includes(\"?\")?X(t.split(\"?\")[0]):t.includes(\"#\")?X(t.split(\"#\")[0]):t.trim().toLowerCase().split(\".\").pop()}function G(t,e){const r=document.createElement(\"a\");r.style.display=\"none\",r.href=t,r.download=e,document.body.appendChild(r),r.click(),document.body.removeChild(r)}function K(t,e,r){return Math.max(Math.min(t,Math.max(e,r)),Math.min(e,r))}function Z(t){return t.charAt(0).toUpperCase()+t.slice(1)}function J(t){if(!t)return\"00:00\";const e=Math.floor(t/3600),r=Math.floor((t-3600*e)/60),o=Math.floor(t-3600*e-60*r);return(e>0?[e,r,o]:[r,o]).map(t=>t<10?`0${t}`:String(t)).join(\":\")}function Q(t){return t.replace(/[&<>'\"]/g,t=>({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",\"'\":\"&#39;\",'\"':\"&quot;\"}[t]||t))}const tt=Object.defineProperty,{hasOwnProperty:et}=Object.prototype;function rt(t,e){return et.call(t,e)}function ot(t,e){return Object.getOwnPropertyDescriptor(t,e)}function at(...t){const e=t=>t&&\"object\"===typeof t&&!Array.isArray(t);return t.reduce((t,r)=>(Object.keys(r).forEach(o=>{const a=t[o],n=r[o];Array.isArray(a)&&Array.isArray(n)?t[o]=a.concat(...n):e(a)&&e(n)?t[o]=at(a,n):t[o]=n}),t),{})}function nt(t){return\"WEBVTT \\r\\n\\r\\n\".concat((e=t,e.replace(/(\\d\\d:\\d\\d:\\d\\d)[,.](\\d+)/g,(t,e,r)=>{let o=r.slice(0,3);return 1===r.length&&(o=`${r}00`),2===r.length&&(o=`${r}0`),`${e},${o}`})).replace(/\\{\\\\([ibu])\\}/g,\"</$1>\").replace(/\\{\\\\([ibu])1\\}/g,\"<$1>\").replace(/\\{([ibu])\\}/g,\"<$1>\").replace(/\\{\\/([ibu])\\}/g,\"</$1>\").replace(/(\\d\\d:\\d\\d:\\d\\d),(\\d\\d\\d)/g,\"$1.$2\").replace(/\\{[\\s\\S]*?\\}/g,\"\").concat(\"\\r\\n\\r\\n\"));var e}function it(t){return URL.createObjectURL(new Blob([t],{type:\"text/vtt\"}))}function st(t){const e=new RegExp(\"Dialogue:\\\\s\\\\d,(\\\\d+:\\\\d\\\\d:\\\\d\\\\d.\\\\d\\\\d),(\\\\d+:\\\\d\\\\d:\\\\d\\\\d.\\\\d\\\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\\\s\\\\S]*)$\",\"i\");function r(t=\"\"){return t.split(/[:.]/).map((t,e,r)=>{if(e===r.length-1){if(1===t.length)return`.${t}00`;if(2===t.length)return`.${t}0`}else if(1===t.length)return(0===e?\"0\":\":0\")+t;return 0===e?t:e===r.length-1?`.${t}`:`:${t}`}).join(\"\")}return`WEBVTT\\n\\n${t.split(/\\r?\\n/).map(t=>{const o=t.match(e);return o?{start:r(o[1].trim()),end:r(o[2].trim()),text:o[5].replace(/\\{[\\s\\S]*?\\}/g,\"\").replace(/(\\\\N)/g,\"\\n\").trim().split(/\\r?\\n/).map(t=>t.trim()).join(\"\\n\")}:null}).filter(t=>t).map((t,e)=>t?`${e+1}\\n${t.start} --\\x3e ${t.end}\\n${t.text}`:\"\").filter(t=>t.trim()).join(\"\\n\\n\")}`}function lt(t=0){return new Promise(e=>setTimeout(e,t))}function ct(t,e){let r;return function(...o){clearTimeout(r),r=setTimeout(()=>(r=null,t.apply(this,o)),e)}}function dt(t,e){let r=!1;return function(...o){r||(t.apply(this,o),r=!0,setTimeout(()=>{r=!1},e))}}const pt=Object.freeze(Object.defineProperty({__proto__:null,ArtPlayerError:U,addClass:C,append:S,assToVtt:st,capitalize:Z,clamp:K,createElement:D,debounce:ct,def:tt,download:G,errorHandle:q,escape:Q,get:ot,getComposedPath:j,getExt:X,getIcon:N,getRect:H,getStyle:function(t,e,r=!0){const o=window.getComputedStyle(t,null).getPropertyValue(e);return r?Number.parseFloat(o):o},has:rt,hasClass:L,includeFromEvent:V,inverseClass:O,isBrowser:$,isIOS:w,isIOS13:x,isInViewport:_,isMobile:k,isSafari:b,loadImg:W,mergeDeep:at,query:T,queryAll:E,remove:M,removeClass:z,replaceElement:Y,secondToTime:J,setStyle:I,setStyleText:F,setStyles:P,siblings:A,sleep:lt,srtToVtt:nt,supportsFlex:B,throttle:dt,tooltip:R,unescape:function(t){const e={\"&amp;\":\"&\",\"&lt;\":\"<\",\"&gt;\":\">\",\"&#39;\":\"'\",\"&quot;\":'\"'},r=new RegExp(`(${Object.keys(e).join(\"|\")})`,\"g\");return t.replace(r,t=>e[t]||t)},userAgent:y,vttToBlob:it},Symbol.toStringTag,{value:\"Module\"})),ht=\"array\",ut=\"boolean\",mt=\"string\",ft=\"number\",gt=\"object\",vt=\"function\";function yt(t,e,r){return q(e===mt||e===ft||t instanceof Element,`${r.join(\".\")} require '${mt}' or 'Element' type`)}const bt={html:yt,disable:`?${ut}`,name:`?${mt}`,index:`?${ft}`,style:`?${gt}`,click:`?${vt}`,mounted:`?${vt}`,tooltip:`?${mt}|${ft}`,width:`?${ft}`,selector:`?${ht}`,onSelect:`?${vt}`,switch:`?${ut}`,onSwitch:`?${vt}`,range:`?${ht}`,onRange:`?${vt}`,onChange:`?${vt}`},wt={id:mt,container:yt,url:mt,poster:mt,type:mt,theme:mt,lang:mt,volume:ft,isLive:ut,muted:ut,autoplay:ut,autoSize:ut,autoMini:ut,loop:ut,flip:ut,playbackRate:ut,aspectRatio:ut,screenshot:ut,setting:ut,hotkey:ut,pip:ut,mutex:ut,backdrop:ut,fullscreen:ut,fullscreenWeb:ut,subtitleOffset:ut,miniProgressBar:ut,useSSR:ut,playsInline:ut,lock:ut,gesture:ut,fastForward:ut,autoPlayback:ut,autoOrientation:ut,airplay:ut,proxy:`?${vt}`,plugins:[vt],layers:[bt],contextmenu:[bt],settings:[bt],controls:[c(l({},bt),{position:(t,e,r)=>{const o=[\"top\",\"left\",\"right\"];return q(o.includes(t),`${r.join(\".\")} only accept ${o.toString()} as parameters`)}})],quality:[{default:`?${ut}`,html:mt,url:mt}],highlight:[{time:ft,text:mt}],thumbnails:{url:mt,number:ft,column:ft,width:ft,height:ft,scale:ft},subtitle:{url:mt,name:mt,type:mt,style:gt,escape:ut,encoding:mt,onVttLoad:vt},moreVideoAttr:gt,i18n:gt,icons:gt,cssVar:gt,customType:gt};class xt{constructor(t){this.id=0,this.art=t,this.cache=new Map,this.add=this.add.bind(this),this.remove=this.remove.bind(this),this.update=this.update.bind(this)}get show(){return L(this.art.template.$player,`art-${this.name}-show`)}set show(t){const{$player:e}=this.art.template,r=`art-${this.name}-show`;t?C(e,r):z(e,r),this.art.emit(this.name,t)}toggle(){this.show=!this.show}add(t){const e=\"function\"===typeof t?t(this.art):t;if(e.html=e.html||\"\",f(e,bt),!this.$parent||!this.name||e.disable)return;const r=e.name||`${this.name}${this.id}`;q(!this.cache.has(r),`Can't add an existing [${r}] to the [${this.name}]`),this.id+=1;const o=D(\"div\");C(o,`art-${this.name}`),C(o,`art-${this.name}-${r}`);const a=Array.from(this.$parent.children);o.dataset.index=e.index||this.id;const n=a.find(t=>Number(t.dataset.index)>=Number(o.dataset.index));n?n.insertAdjacentElement(\"beforebegin\",o):S(this.$parent,o),e.html&&S(o,e.html),e.style&&P(o,e.style),e.tooltip&&R(o,e.tooltip);const i=[];if(e.click){const t=this.art.events.proxy(o,\"click\",t=>{t.preventDefault(),e.click.call(this.art,this,t)});i.push(t)}return e.selector&&[\"left\",\"right\"].includes(e.position)&&this.selector(e,o,i),this[r]=o,this.cache.set(r,{$ref:o,events:i,option:e}),e.mounted&&e.mounted.call(this.art,o),o}remove(t){q(this.cache.has(t),`Can't find [${t}] from the [${this.name}]`);const e=this.cache.get(t);e.option.beforeUnmount&&e.option.beforeUnmount.call(this.art,e.$ref);for(const r of e.events)this.art.events.remove(r);this.cache.delete(t),delete this[t],M(e.$ref)}update(t){if(this.cache.has(t.name)){const e=this.cache.get(t.name);t=Object.assign(e.option,t),this.remove(t.name)}return this.add(t)}}class kt extends xt{constructor(t){super(t),this.name=\"contextmenu\",this.$parent=t.template.$contextmenu,k||this.init()}init(){const{option:t,proxy:e,template:{$player:r,$contextmenu:o}}=this.art;t.playbackRate&&this.add(function(t){return e=>{const{i18n:r,constructor:{PLAYBACK_RATE:o}}=e,a=o.map(t=>`<span data-value=\"${t}\">${1===t?r.get(\"Normal\"):t.toFixed(1)}</span>`).join(\"\");return c(l({},t),{html:`${r.get(\"Play Speed\")}: ${a}`,click:(t,r)=>{const{value:o}=r.target.dataset;o&&(e.playbackRate=Number(o),t.show=!1)},mounted:t=>{const r=T('[data-value=\"1\"]',t);r&&O(r,\"art-current\"),e.on(\"video:ratechange\",()=>{const r=E(\"span\",t).find(t=>Number(t.dataset.value)===e.playbackRate);r&&O(r,\"art-current\")})}})}}({name:\"playbackRate\",index:10})),t.aspectRatio&&this.add(function(t){return e=>{const{i18n:r,constructor:{ASPECT_RATIO:o}}=e,a=o.map(t=>`<span data-value=\"${t}\">${\"default\"===t?r.get(\"Default\"):t}</span>`).join(\"\");return c(l({},t),{html:`${r.get(\"Aspect Ratio\")}: ${a}`,click:(t,r)=>{const{value:o}=r.target.dataset;o&&(e.aspectRatio=o,t.show=!1)},mounted:t=>{const r=T('[data-value=\"default\"]',t);r&&O(r,\"art-current\"),e.on(\"aspectRatio\",e=>{const r=E(\"span\",t).find(t=>t.dataset.value===e);r&&O(r,\"art-current\")})}})}}({name:\"aspectRatio\",index:20})),t.flip&&this.add(function(t){return e=>{const{i18n:r,constructor:{FLIP:o}}=e,a=o.map(t=>`<span data-value=\"${t}\">${r.get(Z(t))}</span>`).join(\"\");return c(l({},t),{html:`${r.get(\"Video Flip\")}: ${a}`,click:(t,r)=>{const{value:o}=r.target.dataset;o&&(e.flip=o.toLowerCase(),t.show=!1)},mounted:t=>{const r=T('[data-value=\"normal\"]',t);r&&O(r,\"art-current\"),e.on(\"flip\",e=>{const r=E(\"span\",t).find(t=>t.dataset.value===e);r&&O(r,\"art-current\")})}})}}({name:\"flip\",index:30})),this.add(function(t){return e=>c(l({},t),{html:e.i18n.get(\"Video Info\"),click:t=>{e.info.show=!0,t.show=!1}})}({name:\"info\",index:40})),this.add(function(t){const e=$?location.href:\"\";return c(l({},t),{html:`<a href=\"https://artplayer.org?ref=${encodeURIComponent(e)}\" target=\"_blank\" style=\"width:100%;\">ArtPlayer ${g}</a>`})}({name:\"version\",index:50})),this.add(function(t){return e=>c(l({},t),{html:e.i18n.get(\"Close\"),click:t=>{t.show=!1}})}({name:\"close\",index:60}));for(let a=0;a<t.contextmenu.length;a++)this.add(t.contextmenu[a]);e(r,\"contextmenu\",t=>{if(!this.art.constructor.CONTEXTMENU)return;t.preventDefault(),this.show=!0;const e=t.clientX,a=t.clientY,{height:n,width:i,left:s,top:l}=H(r),{height:c,width:d}=H(o);let p=e-s,h=a-l;e+d>s+i&&(p=i-d),a+c>l+n&&(h=n-c),P(o,{top:`${h}px`,left:`${p}px`})}),e(r,\"click\",t=>{V(t,o)||(this.show=!1)}),this.art.on(\"blur\",()=>{this.show=!1})}}function $t(t,e){const{$progress:r}=t.template,{left:o}=H(r),a=K((k?e.touches[0].clientX:e.clientX)-o,0,r.clientWidth),n=a/r.clientWidth*t.duration;return{second:n,time:J(n),width:a,percentage:K(a/r.clientWidth,0,1)}}function Tt(t,e){if(t.isRotate){const r=e.touches[0].clientY/t.height,o=r*t.duration;t.emit(\"setBar\",\"played\",r,e),t.seek=o}else{const{second:r,percentage:o}=$t(t,e);t.emit(\"setBar\",\"played\",o,e),t.seek=r}}function Et(t){return e=>{const{icons:r,option:o,proxy:a}=e,{$player:n,$progress:i}=e.template;return c(l({},t),{html:'\\n                <div class=\"art-control-progress-inner\">\\n                    <div class=\"art-progress-hover\"></div>\\n                    <div class=\"art-progress-loaded\"></div>\\n                    <div class=\"art-progress-played\"></div>\\n                    <div class=\"art-progress-highlight\"></div>\\n                    <div class=\"art-progress-indicator\"></div>\\n                    <div class=\"art-progress-tip\">00:00</div>\\n                </div>\\n            ',mounted:t=>{let s=null,l=!1;const c=T(\".art-progress-hover\",t),d=T(\".art-progress-loaded\",t),p=T(\".art-progress-played\",t),h=T(\".art-progress-highlight\",t),u=T(\".art-progress-indicator\",t),m=T(\".art-progress-tip\",t);function f(r,o){const{width:a,time:n}=o||$t(e,r);m.textContent=n||\"00:00\";const i=m.clientWidth;a<=i/2?I(m,\"left\",0):a>t.clientWidth-i/2?I(m,\"left\",t.clientWidth-i+\"px\"):I(m,\"left\",a-i/2+\"px\")}r.indicator?S(u,r.indicator):I(u,\"backgroundColor\",\"var(--art-theme)\"),e.on(\"setBar\",function(r,o,a){const i=\"played\"===r&&a&&k;if(\"loaded\"===r&&I(d,\"width\",100*o+\"%\"),\"hover\"===r&&(I(c,\"width\",100*o+\"%\"),V(a,h)?function(r){const{width:o}=$t(e,r),{text:a}=r.target.dataset;m.textContent=a;const n=m.clientWidth;o<=n/2?I(m,\"left\",0):o>t.clientWidth-n/2?I(m,\"left\",t.clientWidth-n+\"px\"):I(m,\"left\",o-n/2+\"px\")}(a):f(a),0===o?z(n,\"art-progress-hover\"):C(n,\"art-progress-hover\")),\"played\"===r&&(I(p,\"width\",100*o+\"%\"),I(u,\"left\",100*o+\"%\")),i){C(n,\"art-progress-hover\");f(a,{width:t.clientWidth*o,time:J(o*e.duration)}),clearTimeout(s),s=setTimeout(()=>{z(n,\"art-progress-hover\")},500)}}),e.on(\"video:loadedmetadata\",function(){h.textContent=\"\";for(let t=0;t<o.highlight.length;t++){const r=o.highlight[t],a=K(r.time,0,e.duration)/e.duration*100,n=`<span data-text=\"${r.text}\" data-time=\"${r.time}\" style=\"left: ${a}%\"></span>`;S(h,n)}}),e.constructor.USE_RAF?e.on(\"raf\",()=>{e.emit(\"setBar\",\"played\",e.played),e.emit(\"setBar\",\"loaded\",e.loaded)}):(e.on(\"video:timeupdate\",()=>{e.emit(\"setBar\",\"played\",e.played)}),e.on(\"video:progress\",()=>{e.emit(\"setBar\",\"loaded\",e.loaded)}),e.on(\"video:ended\",()=>{e.emit(\"setBar\",\"played\",1)})),e.emit(\"setBar\",\"loaded\",e.loaded||0),k||(a(i,\"click\",t=>{t.target!==u&&Tt(e,t)}),a(i,\"mousemove\",t=>{const{percentage:r}=$t(e,t);e.emit(\"setBar\",\"hover\",r,t)}),a(i,\"mouseleave\",t=>{e.emit(\"setBar\",\"hover\",0,t)}),a(i,\"mousedown\",t=>{l=0===t.button}),e.on(\"document:mousemove\",t=>{if(l){const{second:r,percentage:o}=$t(e,t);e.emit(\"setBar\",\"played\",o,t),e.seek=r}}),e.on(\"document:mouseup\",()=>{l&&(l=!1)}))}})}}class Ct extends xt{constructor(t){super(t),this.isHover=!1,this.name=\"control\",this.timer=Date.now();const{constructor:e}=t,{$player:r,$bottom:o}=this.art.template;t.on(\"mousemove\",()=>{k||(this.show=!0)}),t.on(\"click\",()=>{k?this.toggle():this.show=!0}),t.on(\"document:mousemove\",t=>{this.isHover=V(t,o)}),t.on(\"video:timeupdate\",()=>{!t.setting.show&&!this.isHover&&!t.isInput&&t.playing&&this.show&&Date.now()-this.timer>=e.CONTROL_HIDE_TIME&&(this.show=!1)}),t.on(\"control\",t=>{t?(z(r,\"art-hide-cursor\"),C(r,\"art-hover\"),this.timer=Date.now()):(C(r,\"art-hide-cursor\"),z(r,\"art-hover\"))}),this.init()}init(){const{option:t}=this.art;t.isLive||this.add(Et({name:\"progress\",position:\"top\",index:10})),this.add({name:\"thumbnails\",position:\"top\",index:20}),this.add(function(t){return e=>c(l({},t),{mounted:t=>{const{proxy:r,icons:o,i18n:a}=e,n=S(t,o.play),i=S(t,o.pause);function s(){I(n,\"display\",\"flex\"),I(i,\"display\",\"none\")}function l(){I(n,\"display\",\"none\"),I(i,\"display\",\"flex\")}R(n,a.get(\"Play\")),R(i,a.get(\"Pause\")),r(n,\"click\",()=>{e.play()}),r(i,\"click\",()=>{e.pause()}),e.playing?l():s(),e.on(\"video:playing\",()=>{l()}),e.on(\"video:pause\",()=>{s()})}})}({name:\"playAndPause\",position:\"left\",index:10})),this.add(function(t){return e=>c(l({},t),{mounted:t=>{const{proxy:r,icons:o}=e,a=S(t,o.volume),n=S(t,o.volumeClose),i=S(t,'<div class=\"art-volume-panel\"></div>'),s=S(i,'<div class=\"art-volume-inner\"></div>'),l=S(s,'<div class=\"art-volume-val\"></div>'),c=S(s,'<div class=\"art-volume-slider\"></div>'),d=S(c,'<div class=\"art-volume-handle\"></div>'),p=S(d,'<div class=\"art-volume-loaded\"></div>'),h=S(c,'<div class=\"art-volume-indicator\"></div>');function u(t){const{top:e,height:r}=H(c);return 1-(t.clientY-e)/r}function m(){if(e.muted||0===e.volume)I(a,\"display\",\"none\"),I(n,\"display\",\"flex\"),I(h,\"top\",\"100%\"),I(p,\"top\",\"100%\"),l.textContent=0;else{const t=100*e.volume;I(a,\"display\",\"flex\"),I(n,\"display\",\"none\"),I(h,\"top\",100-t+\"%\"),I(p,\"top\",100-t+\"%\"),l.textContent=Math.floor(t)}}if(m(),e.on(\"video:volumechange\",m),r(a,\"click\",()=>{e.muted=!0}),r(n,\"click\",()=>{e.muted=!1}),k)I(i,\"display\",\"none\");else{let t=!1;r(c,\"mousedown\",r=>{t=0===r.button,e.volume=u(r)}),e.on(\"document:mousemove\",r=>{t&&(e.muted=!1,e.volume=u(r))}),e.on(\"document:mouseup\",()=>{t&&(t=!1)})}}})}({name:\"volume\",position:\"left\",index:20})),t.isLive||this.add(function(t){return e=>c(l({},t),{style:k?{fontSize:\"12px\",padding:\"0 5px\"}:{cursor:\"auto\",padding:\"0 10px\"},mounted:t=>{function r(){const r=`${J(e.currentTime)} / ${J(e.duration)}`;r!==t.textContent&&(t.textContent=r)}r();const o=[\"video:loadedmetadata\",\"video:timeupdate\",\"video:progress\"];for(let a=0;a<o.length;a++)e.on(o[a],r)}})}({name:\"time\",position:\"left\",index:30})),t.quality.length&&lt().then(()=>{this.art.quality=t.quality}),t.screenshot&&!k&&this.add(function(t){return e=>c(l({},t),{tooltip:e.i18n.get(\"Screenshot\"),mounted:t=>{const{proxy:r,icons:o}=e;S(t,o.screenshot),r(t,\"click\",()=>{e.screenshot()})}})}({name:\"screenshot\",position:\"right\",index:20})),t.setting&&this.add(function(t){return e=>c(l({},t),{tooltip:e.i18n.get(\"Show Setting\"),mounted:t=>{const{proxy:r,icons:o,i18n:a}=e;S(t,o.setting),r(t,\"click\",()=>{e.setting.toggle(),e.setting.resize()}),e.on(\"setting\",e=>{R(t,a.get(e?\"Hide Setting\":\"Show Setting\"))})}})}({name:\"setting\",position:\"right\",index:30})),t.pip&&this.add(function(t){return e=>c(l({},t),{tooltip:e.i18n.get(\"PIP Mode\"),mounted:t=>{const{proxy:r,icons:o,i18n:a}=e;S(t,o.pip),r(t,\"click\",()=>{e.pip=!e.pip}),e.on(\"pip\",e=>{R(t,a.get(e?\"Exit PIP Mode\":\"PIP Mode\"))})}})}({name:\"pip\",position:\"right\",index:40})),t.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add(function(t){return e=>c(l({},t),{tooltip:e.i18n.get(\"AirPlay\"),mounted:t=>{const{proxy:r,icons:o}=e;S(t,o.airplay),r(t,\"click\",()=>e.airplay())}})}({name:\"airplay\",position:\"right\",index:50})),t.fullscreenWeb&&this.add(function(t){return e=>c(l({},t),{tooltip:e.i18n.get(\"Web Fullscreen\"),mounted:t=>{const{proxy:r,icons:o,i18n:a}=e,n=S(t,o.fullscreenWebOn),i=S(t,o.fullscreenWebOff);I(i,\"display\",\"none\"),r(t,\"click\",()=>{e.fullscreenWeb=!e.fullscreenWeb}),e.on(\"fullscreenWeb\",e=>{e?(R(t,a.get(\"Exit Web Fullscreen\")),I(n,\"display\",\"none\"),I(i,\"display\",\"inline-flex\")):(R(t,a.get(\"Web Fullscreen\")),I(n,\"display\",\"inline-flex\"),I(i,\"display\",\"none\"))})}})}({name:\"fullscreenWeb\",position:\"right\",index:60})),t.fullscreen&&this.add(function(t){return e=>c(l({},t),{tooltip:e.i18n.get(\"Fullscreen\"),mounted:t=>{const{proxy:r,icons:o,i18n:a}=e,n=S(t,o.fullscreenOn),i=S(t,o.fullscreenOff);I(i,\"display\",\"none\"),r(t,\"click\",()=>{e.fullscreen=!e.fullscreen}),e.on(\"fullscreen\",e=>{e?(R(t,a.get(\"Exit Fullscreen\")),I(n,\"display\",\"none\"),I(i,\"display\",\"inline-flex\")):(R(t,a.get(\"Fullscreen\")),I(n,\"display\",\"inline-flex\"),I(i,\"display\",\"none\"))})}})}({name:\"fullscreen\",position:\"right\",index:70}));for(let e=0;e<t.controls.length;e++)this.add(t.controls[e])}add(t){const e=\"function\"===typeof t?t(this.art):t,{$progress:r,$controlsLeft:o,$controlsRight:a}=this.art.template;switch(e.position){case\"top\":this.$parent=r;break;case\"left\":this.$parent=o;break;case\"right\":this.$parent=a;break;default:q(!1,\"Control option.position must one of 'top', 'left', 'right'\")}super.add(e)}check(t){if(t){t.$control_value.innerHTML=t.html;for(let e=0;e<t.$control_option.length;e++){const r=t.$control_option[e];r.default=r===t,r.default&&O(r.$control_item,\"art-current\")}}}selector(t,e,r){const{proxy:o}=this.art.events;C(e,\"art-control-selector\");const a=D(\"div\");C(a,\"art-selector-value\"),S(a,t.html),e.textContent=\"\",S(e,a);const n=D(\"div\");C(n,\"art-selector-list\"),S(e,n);for(let s=0;s<t.selector.length;s++){const e=t.selector[s],r=D(\"div\");C(r,\"art-selector-item\"),e.default&&C(r,\"art-current\"),r.dataset.index=s,r.dataset.value=e.value,r.innerHTML=e.html,S(n,r),tt(e,\"$control_option\",{get:()=>t.selector}),tt(e,\"$control_item\",{get:()=>r}),tt(e,\"$control_value\",{get:()=>a})}const i=o(n,\"click\",e=>d(this,null,function*(){const r=j(e),o=t.selector.find(t=>t.$control_item===r.find(e=>t.$control_item===e));this.check(o),t.onSelect&&(a.innerHTML=yield t.onSelect.call(this.art,o,o.$control_item,e))}));r.push(i)}}function zt(t,e,r,o){const a=e-o,n=r-t;let i=0;if(Math.abs(n)<2&&Math.abs(a)<2)return i;const s=function(t,e){return 180*Math.atan2(e,t)/Math.PI}(n,a);return s>=-45&&s<45?i=4:s>=45&&s<135?i=1:s>=-135&&s<-45?i=2:(s>=135&&s<=180||s>=-180&&s<-135)&&(i=3),i}class Lt{constructor(t){this.destroyEvents=new Set,this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),function(t,e){const{constructor:r,template:{$player:o,$video:a}}=t;function n(e){V(e,o)?(t.isInput=\"INPUT\"===e.target.tagName,t.isFocus=!0,t.emit(\"focus\",e)):(t.isInput=!1,t.isFocus=!1,t.emit(\"blur\",e))}t.on(\"document:click\",n),t.on(\"document:contextmenu\",n);let i=[];e.proxy(a,\"click\",e=>{const o=Date.now();i.push(o);const{MOBILE_CLICK_PLAY:a,DBCLICK_TIME:n,MOBILE_DBCLICK_PLAY:s,DBCLICK_FULLSCREEN:l}=r,c=i.filter(t=>o-t<=n);switch(c.length){case 1:t.emit(\"click\",e),k?!t.isLock&&a&&t.toggle():t.toggle(),i=c;break;case 2:t.emit(\"dblclick\",e),k?!t.isLock&&s&&t.toggle():l&&(t.fullscreen=!t.fullscreen),i=[];break;default:i=[]}})}(t,this),function(t,e){const{$player:r}=t.template;e.hover(r,e=>{C(r,\"art-hover\"),t.emit(\"hover\",!0,e)},e=>{z(r,\"art-hover\"),t.emit(\"hover\",!1,e)})}(t,this),function(t,e){const{$player:r}=t.template;e.proxy(r,\"mousemove\",e=>{t.emit(\"mousemove\",e)})}(t,this),function(t,e){const{option:r,constructor:o}=t;t.on(\"resize\",()=>{const{aspectRatio:e,notice:o}=t;\"standard\"===t.state&&r.autoSize&&t.autoSize(),t.aspectRatio=e,o.show=\"\"});const a=ct(()=>t.emit(\"resize\"),o.RESIZE_TIME);t.on(\"window:orientationchange\",()=>a()),t.on(\"window:resize\",()=>a()),screen&&screen.orientation&&screen.orientation.onchange&&e.proxy(screen.orientation,\"change\",()=>a())}(t,this),function(t,e){if(k&&!t.option.isLive){const{$video:r,$progress:o}=t.template;let a=null,n=!1,i=0,s=0,l=0;const c=e=>{if(1===e.touches.length&&!t.isLock){a===o&&Tt(t,e),n=!0;const{pageX:r,pageY:c}=e.touches[0];i=r,s=c,l=t.currentTime}},d=e=>{if(1===e.touches.length&&n&&t.duration){const{pageX:o,pageY:n}=e.touches[0],c=zt(i,s,o,n),d=[3,4].includes(c),p=[1,2].includes(c);if(d&&!t.isRotate||p&&t.isRotate){const c=K((o-i)/t.width,-1,1),d=K((n-s)/t.height,-1,1),p=t.isRotate?d:c,h=a===r?t.constructor.TOUCH_MOVE_RATIO:1,u=K(l+t.duration*p*h,0,t.duration);t.seek=u,t.emit(\"setBar\",\"played\",K(u/t.duration,0,1),e),t.notice.show=`${J(u)} / ${J(t.duration)}`}}},p=()=>{n&&(i=0,s=0,l=0,n=!1,a=null)};t.option.gesture&&(e.proxy(r,\"touchstart\",t=>{a=r,c(t)}),e.proxy(r,\"touchmove\",d)),e.proxy(o,\"touchstart\",t=>{a=o,c(t)}),e.proxy(o,\"touchmove\",d),t.on(\"document:touchend\",p)}}(t,this),function(t){const{option:e,constructor:r,template:{$container:o}}=t,a=dt(()=>{t.emit(\"view\",_(o,r.SCROLL_GAP))},r.SCROLL_TIME);t.on(\"window:scroll\",()=>a()),t.on(\"view\",r=>{e.autoMini&&(t.mini=!r)})}(t),function(t,e){const r=[\"click\",\"mouseup\",\"keydown\",\"touchend\",\"touchmove\",\"mousemove\",\"pointerup\",\"contextmenu\",\"pointermove\",\"visibilitychange\",\"webkitfullscreenchange\"],o=[\"resize\",\"scroll\",\"orientationchange\"],a=[];function n(n={}){for(let t=0;t<a.length;t++)e.remove(a[t]);a.length=0;const{$player:i}=t.template;r.forEach(r=>{const o=n.document||i.ownerDocument||document,s=e.proxy(o,r,e=>{t.emit(`document:${r}`,e)});a.push(s)}),o.forEach(r=>{var o;const s=n.window||(null==(o=i.ownerDocument)?void 0:o.defaultView)||window,l=e.proxy(s,r,e=>{t.emit(`window:${r}`,e)});a.push(l)})}n(),e.bindGlobalEvents=n}(t,this),function(t){if(t.constructor.USE_RAF){let e=null;!function r(){t.playing&&t.emit(\"raf\"),t.isDestroy||(e=requestAnimationFrame(r))}(),t.on(\"destroy\",()=>{cancelAnimationFrame(e)})}}(t)}proxy(t,e,r,o={}){if(Array.isArray(e))return e.map(e=>this.proxy(t,e,r,o));t.addEventListener(e,r,o);const a=()=>t.removeEventListener(e,r,o);return this.destroyEvents.add(a),a}hover(t,e,r){e&&this.proxy(t,\"mouseenter\",e),r&&this.proxy(t,\"mouseleave\",r)}remove(t){if(this.destroyEvents.has(t))try{t()}catch(e){console.warn(\"Failed to remove event listener:\",e)}finally{this.destroyEvents.delete(t)}}destroy(){for(const e of this.destroyEvents)try{e()}catch(t){console.warn(\"Failed to destroy event listener:\",t)}this.destroyEvents.clear()}}class St{constructor(t){this.art=t,this.keys={},k||this.init()}init(){const{constructor:t}=this.art;this.art.option.hotkey&&(this.add(\"Escape\",()=>{this.art.fullscreenWeb&&(this.art.fullscreenWeb=!1)}),this.add(\"Space\",()=>{this.art.toggle()}),this.add(\"ArrowLeft\",()=>{this.art.backward=t.SEEK_STEP}),this.add(\"ArrowUp\",()=>{this.art.volume+=t.VOLUME_STEP}),this.add(\"ArrowRight\",()=>{this.art.forward=t.SEEK_STEP}),this.add(\"ArrowDown\",()=>{this.art.volume-=t.VOLUME_STEP})),this.art.on(\"document:keydown\",t=>{if(this.art.isFocus){const e=document.activeElement.tagName.toUpperCase(),r=document.activeElement.getAttribute(\"contenteditable\");if(\"INPUT\"!==e&&\"TEXTAREA\"!==e&&\"\"!==r&&\"true\"!==r&&!t.altKey&&!t.ctrlKey&&!t.metaKey&&!t.shiftKey){const e=this.keys[t.code];if(e){t.preventDefault();for(let r=0;r<e.length;r++)e[r].call(this.art,t);this.art.emit(\"hotkey\",t)}}}this.art.emit(\"keydown\",t)})}add(t,e){return this.keys[t]?this.keys[t].includes(e)||this.keys[t].push(e):this.keys[t]=[e],this}remove(t,e){if(this.keys[t]){const r=this.keys[t].indexOf(e);-1!==r&&this.keys[t].splice(r,1),0===this.keys[t].length&&delete this.keys[t]}return this}}const Mt={\"Video Info\":\"\\u7edf\\u8ba1\\u4fe1\\u606f\",Close:\"\\u5173\\u95ed\",\"Video Load Failed\":\"\\u52a0\\u8f7d\\u5931\\u8d25\",Volume:\"\\u97f3\\u91cf\",Play:\"\\u64ad\\u653e\",Pause:\"\\u6682\\u505c\",Rate:\"\\u901f\\u5ea6\",Mute:\"\\u9759\\u97f3\",\"Video Flip\":\"\\u753b\\u9762\\u7ffb\\u8f6c\",Horizontal:\"\\u6c34\\u5e73\",Vertical:\"\\u5782\\u76f4\",Reconnect:\"\\u91cd\\u65b0\\u8fde\\u63a5\",\"Show Setting\":\"\\u663e\\u793a\\u8bbe\\u7f6e\",\"Hide Setting\":\"\\u9690\\u85cf\\u8bbe\\u7f6e\",Screenshot:\"\\u622a\\u56fe\",\"Play Speed\":\"\\u64ad\\u653e\\u901f\\u5ea6\",\"Aspect Ratio\":\"\\u753b\\u9762\\u6bd4\\u4f8b\",Default:\"\\u9ed8\\u8ba4\",Normal:\"\\u6b63\\u5e38\",Open:\"\\u6253\\u5f00\",\"Switch Video\":\"\\u5207\\u6362\",\"Switch Subtitle\":\"\\u5207\\u6362\\u5b57\\u5e55\",Fullscreen:\"\\u5168\\u5c4f\",\"Exit Fullscreen\":\"\\u9000\\u51fa\\u5168\\u5c4f\",\"Web Fullscreen\":\"\\u7f51\\u9875\\u5168\\u5c4f\",\"Exit Web Fullscreen\":\"\\u9000\\u51fa\\u7f51\\u9875\\u5168\\u5c4f\",\"Mini Player\":\"\\u8ff7\\u4f60\\u64ad\\u653e\\u5668\",\"PIP Mode\":\"\\u5f00\\u542f\\u753b\\u4e2d\\u753b\",\"Exit PIP Mode\":\"\\u9000\\u51fa\\u753b\\u4e2d\\u753b\",\"PIP Not Supported\":\"\\u4e0d\\u652f\\u6301\\u753b\\u4e2d\\u753b\",\"Fullscreen Not Supported\":\"\\u4e0d\\u652f\\u6301\\u5168\\u5c4f\",\"Subtitle Offset\":\"\\u5b57\\u5e55\\u504f\\u79fb\",\"Last Seen\":\"\\u4e0a\\u6b21\\u770b\\u5230\",\"Jump Play\":\"\\u8df3\\u8f6c\\u64ad\\u653e\",AirPlay:\"\\u9694\\u7a7a\\u64ad\\u653e\",\"AirPlay Not Available\":\"\\u9694\\u7a7a\\u64ad\\u653e\\u4e0d\\u53ef\\u7528\"};\"undefined\"!==typeof window&&(window[\"artplayer-i18n-zh-cn\"]=Mt);class It{constructor(t){this.art=t,this.languages={\"zh-cn\":Mt},this.language={},this.update(t.option.i18n)}init(){const t=this.art.option.lang.toLowerCase();this.language=this.languages[t]||{}}get(t){return this.language[t]||t}update(t){this.languages=at(this.languages,t),this.init()}}class Pt{constructor(t){const e=l({loading:'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"50px\" height=\"50px\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid\" class=\"uil-default\">\\n  <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill=\"none\" class=\"bk\"/>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(0 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-1s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(30 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.9166666666666666s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(60 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.8333333333333334s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(90 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.75s\" repeatCount=\"indefinite\"/></rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(120 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.6666666666666666s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(150 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.5833333333333334s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(180 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.5s\" repeatCount=\"indefinite\"/></rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(210 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.4166666666666667s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(240 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.3333333333333333s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(270 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.25s\" repeatCount=\"indefinite\"/></rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(300 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.16666666666666666s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(330 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.08333333333333333s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n</svg>',state:'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\" viewBox=\"0 0 24 24\">\\n<path d=\"M9.5 9.325v5.35q0 .575.525.875t1.025-.05l4.15-2.65q.475-.3.475-.85t-.475-.85L11.05 8.5q-.5-.35-1.025-.05t-.525.875ZM12 22q-2.075 0-3.9-.788t-3.175-2.137q-1.35-1.35-2.137-3.175T2 12q0-2.075.788-3.9t2.137-3.175q1.35-1.35 3.175-2.137T12 2q2.075 0 3.9.788t3.175 2.137q1.35 1.35 2.138 3.175T22 12q0 2.075-.788 3.9t-2.137 3.175q-1.35 1.35-3.175 2.138T12 22Z\"/>\\n</svg>\\n',play:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n  <path d=\"M17.982 9.275L8.06 3.27A2.013 2.013 0 0 0 5 4.994v12.011a2.017 2.017 0 0 0 3.06 1.725l9.922-6.005a2.017 2.017 0 0 0 0-3.45z\"></path>\\n</svg>',pause:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n    <path d=\"M7 3a2 2 0 0 0-2 2v12a2 2 0 1 0 4 0V5a2 2 0 0 0-2-2zM15 3a2 2 0 0 0-2 2v12a2 2 0 1 0 4 0V5a2 2 0 0 0-2-2z\"></path>\\n</svg>',check:'<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 24 24\" style=\"width: 100%; height: 100%;\">\\n<path d=\"M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z\" />\\n</svg>',volume:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n    <path d=\"M10.188 4.65L6 8H5a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h1l4.188 3.35a.5.5 0 0 0 .812-.39V5.04a.498.498 0 0 0-.812-.39zM14.446 3.778a1 1 0 0 0-.862 1.804 6.002 6.002 0 0 1-.007 10.838 1 1 0 0 0 .86 1.806A8.001 8.001 0 0 0 19 11a8.001 8.001 0 0 0-4.554-7.222z\"></path>\\n    <path d=\"M15 11a3.998 3.998 0 0 0-2-3.465v6.93A3.998 3.998 0 0 0 15 11z\"></path>\\n</svg>',volumeClose:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n    <path d=\"M15 11a3.998 3.998 0 0 0-2-3.465v2.636l1.865 1.865A4.02 4.02 0 0 0 15 11z\"></path>\\n    <path d=\"M13.583 5.583A5.998 5.998 0 0 1 17 11a6 6 0 0 1-.585 2.587l1.477 1.477a8.001 8.001 0 0 0-3.446-11.286 1 1 0 0 0-.863 1.805zM18.778 18.778l-2.121-2.121-1.414-1.414-1.415-1.415L13 13l-2-2-3.889-3.889-3.889-3.889a.999.999 0 1 0-1.414 1.414L5.172 8H5a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h1l4.188 3.35a.5.5 0 0 0 .812-.39v-3.131l2.587 2.587-.01.005a1 1 0 0 0 .86 1.806c.215-.102.424-.214.627-.333l2.3 2.3a1.001 1.001 0 0 0 1.414-1.416zM11 5.04a.5.5 0 0 0-.813-.39L8.682 5.854 11 8.172V5.04z\"></path>\\n</svg>',screenshot:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 50 50\">\\n\\t<path d=\"M 19.402344 6 C 17.019531 6 14.96875 7.679688 14.5 10.011719 L 14.097656 12 L 9 12 C 6.238281 12 4 14.238281 4 17 L 4 38 C 4 40.761719 6.238281 43 9 43 L 41 43 C 43.761719 43 46 40.761719 46 38 L 46 17 C 46 14.238281 43.761719 12 41 12 L 35.902344 12 L 35.5 10.011719 C 35.03125 7.679688 32.980469 6 30.597656 6 Z M 25 17 C 30.519531 17 35 21.480469 35 27 C 35 32.519531 30.519531 37 25 37 C 19.480469 37 15 32.519531 15 27 C 15 21.480469 19.480469 17 25 17 Z M 25 19 C 20.589844 19 17 22.589844 17 27 C 17 31.410156 20.589844 35 25 35 C 29.410156 35 33 31.410156 33 27 C 33 22.589844 29.410156 19 25 19 Z \"/>\\n</svg>\\n',setting:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n    <circle cx=\"11\" cy=\"11\" r=\"2\"></circle>\\n    <path d=\"M19.164 8.861L17.6 8.6a6.978 6.978 0 0 0-1.186-2.099l.574-1.533a1 1 0 0 0-.436-1.217l-1.997-1.153a1.001 1.001 0 0 0-1.272.23l-1.008 1.225a7.04 7.04 0 0 0-2.55.001L8.716 2.829a1 1 0 0 0-1.272-.23L5.447 3.751a1 1 0 0 0-.436 1.217l.574 1.533A6.997 6.997 0 0 0 4.4 8.6l-1.564.261A.999.999 0 0 0 2 9.847v2.306c0 .489.353.906.836.986l1.613.269a7 7 0 0 0 1.228 2.075l-.558 1.487a1 1 0 0 0 .436 1.217l1.997 1.153c.423.244.961.147 1.272-.23l1.04-1.263a7.089 7.089 0 0 0 2.272 0l1.04 1.263a1 1 0 0 0 1.272.23l1.997-1.153a1 1 0 0 0 .436-1.217l-.557-1.487c.521-.61.94-1.31 1.228-2.075l1.613-.269a.999.999 0 0 0 .835-.986V9.847a.999.999 0 0 0-.836-.986zM11 15a4 4 0 1 1 0-8 4 4 0 0 1 0 8z\"></path>\\n</svg>',pip:'<svg viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\">\\n<path d=\"M844.8 219.648h-665.6c-6.144 0-10.24 4.608-10.24 10.752v563.2c0 5.632 4.096 10.24 10.24 10.24h256v92.16h-256a102.4 102.4 0 0 1-102.4-102.4v-563.2c0-56.832 45.568-102.4 102.4-102.4h665.6a102.4 102.4 0 0 1 102.4 102.4v204.8h-92.16v-204.8c0-6.144-4.608-10.752-10.24-10.752zM614.4 588.8c-28.672 0-51.2 22.528-51.2 51.2v204.8c0 28.16 22.528 51.2 51.2 51.2h281.6c28.16 0 51.2-23.04 51.2-51.2v-204.8c0-28.672-23.04-51.2-51.2-51.2H614.4z\"></path>\\n</svg>',arrowLeft:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" version=\"1.1\" viewBox=\"0 0 32 32\">\\n    <path d=\"M 19.41,20.09 14.83,15.5 19.41,10.91 18,9.5 l -6,6 6,6 z\" />\\n</svg>',arrowRight:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" version=\"1.1\" viewBox=\"0 0 32 32\">\\n    <path d=\"m 12.59,20.34 4.58,-4.59 -4.58,-4.59 1.41,-1.41 6,6 -6,6 z\" />\\n</svg>',playbackRate:'<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\"><path d=\"M10,8v8l6-4L10,8L10,8z M6.3,5L5.7,4.2C7.2,3,9,2.2,11,2l0.1,1C9.3,3.2,7.7,3.9,6.3,5z            M5,6.3L4.2,5.7C3,7.2,2.2,9,2,11 l1,.1C3.2,9.3,3.9,7.7,5,6.3z            M5,17.7c-1.1-1.4-1.8-3.1-2-4.8L2,13c0.2,2,1,3.8,2.2,5.4L5,17.7z            M11.1,21c-1.8-0.2-3.4-0.9-4.8-2 l-0.6,.8C7.2,21,9,21.8,11,22L11.1,21z            M22,12c0-5.2-3.9-9.4-9-10l-0.1,1c4.6,.5,8.1,4.3,8.1,9s-3.5,8.5-8.1,9l0.1,1 C18.2,21.5,22,17.2,22,12z\" data-darkreader-inline-fill=\"\" style=\"--darkreader-inline-fill:#a8a6a4;\"></path></svg>',aspectRatio:'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 88 88\" preserveAspectRatio=\"xMidYMid meet\" style=\"width: 100%; height: 100%; transform: translate3d(0px, 0px, 0px);\"><defs><clipPath id=\"__lottie_element_216\"><rect width=\"88\" height=\"88\" x=\"0\" y=\"0\"></rect></clipPath></defs><g clip-path=\"url(#__lottie_element_216)\"><g transform=\"matrix(1,0,0,1,44,44)\" opacity=\"1\" style=\"display: block;\"><g opacity=\"1\" transform=\"matrix(1,0,0,1,0,0)\"><path fill-opacity=\"1\" d=\" M12.437999725341797,-12.70199966430664 C12.437999725341797,-12.70199966430664 9.618000030517578,-9.881999969482422 9.618000030517578,-9.881999969482422 C8.82800006866455,-9.092000007629395 8.82800006866455,-7.831999778747559 9.618000030517578,-7.052000045776367 C9.618000030517578,-7.052000045776367 16.687999725341797,0.017999999225139618 16.687999725341797,0.017999999225139618 C16.687999725341797,0.017999999225139618 9.618000030517578,7.0879998207092285 9.618000030517578,7.0879998207092285 C8.82800006866455,7.877999782562256 8.82800006866455,9.137999534606934 9.618000030517578,9.918000221252441 C9.618000030517578,9.918000221252441 12.437999725341797,12.748000144958496 12.437999725341797,12.748000144958496 C13.227999687194824,13.527999877929688 14.48799991607666,13.527999877929688 15.267999649047852,12.748000144958496 C15.267999649047852,12.748000144958496 26.58799934387207,1.437999963760376 26.58799934387207,1.437999963760376 C27.368000030517578,0.6579999923706055 27.368000030517578,-0.6119999885559082 26.58799934387207,-1.3919999599456787 C26.58799934387207,-1.3919999599456787 15.267999649047852,-12.70199966430664 15.267999649047852,-12.70199966430664 C14.48799991607666,-13.491999626159668 13.227999687194824,-13.491999626159668 12.437999725341797,-12.70199966430664z M-12.442000389099121,-12.70199966430664 C-13.182000160217285,-13.442000389099121 -14.362000465393066,-13.482000350952148 -15.142000198364258,-12.821999549865723 C-15.142000198364258,-12.821999549865723 -15.272000312805176,-12.70199966430664 -15.272000312805176,-12.70199966430664 C-15.272000312805176,-12.70199966430664 -26.582000732421875,-1.3919999599456787 -26.582000732421875,-1.3919999599456787 C-27.32200050354004,-0.6520000100135803 -27.36199951171875,0.5180000066757202 -26.70199966430664,1.3079999685287476 C-26.70199966430664,1.3079999685287476 -26.582000732421875,1.437999963760376 -26.582000732421875,1.437999963760376 C-26.582000732421875,1.437999963760376 -15.272000312805176,12.748000144958496 -15.272000312805176,12.748000144958496 C-14.531999588012695,13.48799991607666 -13.362000465393066,13.527999877929688 -12.571999549865723,12.868000030517578 C-12.571999549865723,12.868000030517578 -12.442000389099121,12.748000144958496 -12.442000389099121,12.748000144958496 C-12.442000389099121,12.748000144958496 -9.612000465393066,9.918000221252441 -9.612000465393066,9.918000221252441 C-8.871999740600586,9.178000450134277 -8.831999778747559,8.008000373840332 -9.501999855041504,7.2179999351501465 C-9.501999855041504,7.2179999351501465 -9.612000465393066,7.0879998207092285 -9.612000465393066,7.0879998207092285 C-9.612000465393066,7.0879998207092285 -16.68199920654297,0.017999999225139618 -16.68199920654297,0.017999999225139618 C-16.68199920654297,0.017999999225139618 -9.612000465393066,-7.052000045776367 -9.612000465393066,-7.052000045776367 C-8.871999740600586,-7.791999816894531 -8.831999778747559,-8.961999893188477 -9.501999855041504,-9.751999855041504 C-9.501999855041504,-9.751999855041504 -9.612000465393066,-9.881999969482422 -9.612000465393066,-9.881999969482422 C-9.612000465393066,-9.881999969482422 -12.442000389099121,-12.70199966430664 -12.442000389099121,-12.70199966430664z M28,-28 C32.41999816894531,-28 36,-24.420000076293945 36,-20 C36,-20 36,20 36,20 C36,24.420000076293945 32.41999816894531,28 28,28 C28,28 -28,28 -28,28 C-32.41999816894531,28 -36,24.420000076293945 -36,20 C-36,20 -36,-20 -36,-20 C-36,-24.420000076293945 -32.41999816894531,-28 -28,-28 C-28,-28 28,-28 28,-28z\" data-darkreader-inline-fill=\"\" style=\"--darkreader-inline-fill:#a8a6a4;\"></path></g></g></g></svg>',config:'<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\"><path d=\"M15,17h6v1h-6V17z M11,17H3v1h8v2h1v-2v-1v-2h-1V17z M14,8h1V6V5V3h-1v2H3v1h11V8z            M18,5v1h3V5H18z M6,14h1v-2v-1V9H6v2H3v1 h3V14z M10,12h11v-1H10V12z\" data-darkreader-inline-fill=\"\" style=\"--darkreader-inline-fill:#a8a6a4;\"></path></svg>',lock:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1650612139149\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\">\\n<path d=\"M298.666667 426.666667V341.333333a213.333333 213.333333 0 1 1 426.666666 0v85.333334h42.666667a85.333333 85.333333 0 0 1 85.333333 85.333333v256a85.333333 85.333333 0 0 1-85.333333 85.333333H256a85.333333 85.333333 0 0 1-85.333333-85.333333v-256a85.333333 85.333333 0 0 1 85.333333-85.333333h42.666667z m213.333333-213.333334a128 128 0 0 0-128 128v85.333334h256V341.333333a128 128 0 0 0-128-128z\"></path>\\n</svg>\\n',flip:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1652445277062\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"24\" height=\"24\">\\n<path d=\"M554.666667 810.666667v85.333333h-85.333334v-85.333333h85.333334zM170.666667 178.005333a42.666667 42.666667 0 0 1 34.986666 18.218667l203.904 291.328a42.666667 42.666667 0 0 1 0 48.896l-203.946666 291.328A42.666667 42.666667 0 0 1 128 803.328V220.672a42.666667 42.666667 0 0 1 42.666667-42.666667z m682.666666 0a42.666667 42.666667 0 0 1 42.368 37.717334l0.298667 4.949333v582.656a42.666667 42.666667 0 0 1-74.24 28.629333l-3.413333-4.181333-203.904-291.328a42.666667 42.666667 0 0 1-3.029334-43.861333l3.029334-5.034667 203.946666-291.328A42.666667 42.666667 0 0 1 853.333333 178.005333zM554.666667 640v85.333333h-85.333334v-85.333333h85.333334zM196.266667 319.104V716.8L335.957333 512 196.309333 319.104zM554.666667 469.333333v85.333334h-85.333334v-85.333334h85.333334z m0-170.666666v85.333333h-85.333334V298.666667h85.333334z m0-170.666667v85.333333h-85.333334V128h85.333334z\">\\n</path>\\n</svg>\\n',unlock:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1650612464266\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\"><path d=\"M666.752 194.517333L617.386667 268.629333A128 128 0 0 0 384 341.333333l0.042667 85.333334h384a85.333333 85.333333 0 0 1 85.333333 85.333333v256a85.333333 85.333333 0 0 1-85.333333 85.333333H256a85.333333 85.333333 0 0 1-85.333333-85.333333v-256a85.333333 85.333333 0 0 1 85.333333-85.333333h42.666667V341.333333a213.333333 213.333333 0 0 1 368.085333-146.816z\"></path></svg>\\n',fullscreenOff:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"22\" height=\"22\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n<path d=\"M768 298.666667h170.666667v85.333333h-256V128h85.333333v170.666667zM341.333333 384H85.333333V298.666667h170.666667V128h85.333333v256z m426.666667 341.333333v170.666667h-85.333333v-256h256v85.333333h-170.666667zM341.333333 640v256H256v-170.666667H85.333333v-85.333333h256z\" />\\n</svg>\\n',fullscreenOn:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"22\" height=\"22\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n<path d=\"M625.777778 256h142.222222V398.222222h113.777778V142.222222H625.777778v113.777778zM256 398.222222V256H398.222222v-113.777778H142.222222V398.222222h113.777778zM768 625.777778v142.222222H625.777778v113.777778h256V625.777778h-113.777778zM398.222222 768H256V625.777778h-113.777778v256H398.222222v-113.777778z\" />\\n</svg>\\n',fullscreenWebOff:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"18\" height=\"18\" viewBox=\"0 0 1152 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n<path d=\"M1075.2 0H76.8A76.8 76.8 0 0 0 0 76.8v870.4A76.8 76.8 0 0 0 76.8 1024h998.4a76.8 76.8 0 0 0 76.8-76.8V76.8A76.8 76.8 0 0 0 1075.2 0zM1024 128v768H128V128h896zM896 512a64 64 0 0 1 7.488 127.552L896 640h-128v128a64 64 0 0 1-56.512 63.552L704 832a64 64 0 0 1-63.552-56.512L640 768V582.592c0-34.496 25.024-66.112 61.632-70.208L709.632 512H896zM256 512a64 64 0 0 1-7.488-127.552L256 384h128V256a64 64 0 0 1 56.512-63.552L448 192a64 64 0 0 1 63.552 56.512L512 256v185.408c0 34.432-25.024 66.112-61.632 70.144L442.368 512H256z\" />\\n</svg>\\n',fullscreenWebOn:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"18\" height=\"18\" viewBox=\"0 0 1152 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n<path d=\"M1075.2 0H76.8A76.8 76.8 0 0 0 0 76.8v870.4A76.8 76.8 0 0 0 76.8 1024h998.4a76.8 76.8 0 0 0 76.8-76.8V76.8A76.8 76.8 0 0 0 1075.2 0zM1024 128v768H128V128h896zM448 192a64 64 0 0 1 7.488 127.552L448 320H320v128a64 64 0 0 1-56.512 63.552L256 512a64 64 0 0 1-63.552-56.512L192 448V262.592c0-34.432 25.024-66.112 61.632-70.144L261.632 192H448zM704 832a64 64 0 0 1-7.488-127.552L704 704h128V576a64 64 0 0 1 56.512-63.552L896 512a64 64 0 0 1 63.552 56.512L960 576v185.408c0 34.496-25.024 66.112-61.632 70.208l-8 0.384H704z\" />\\n</svg>\\n',switchOn:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"26\" height=\"26\" viewBox=\"0 0 1664 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n    <path fill=\"#648FFC\" d=\"M1152 0H512a512 512 0 0 0 0 1024h640a512 512 0 0 0 0-1024z m0 960a448 448 0 1 1 448-448 448 448 0 0 1-448 448z\"  />\\n</svg>',switchOff:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"26\" height=\"26\" viewBox=\"0 0 1740 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n    <path d=\"M511.8976 1024h670.5152c282.4192-0.4096 511.1808-229.4784 511.1808-511.8976 0-282.4192-228.7616-511.488-511.1808-511.8976H511.8976C229.4784 0.6144 0.7168 229.6832 0.7168 512.1024c0 282.4192 228.7616 511.488 511.1808 511.8976zM511.3344 48.64A464.5888 464.5888 0 1 1 48.0256 513.024 463.872 463.872 0 0 1 511.3344 48.4352V48.64z\" />\\n</svg>\\n',error:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1652850026663\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2749\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"50\" height=\"50\">\\n<path d=\"M593.8176 168.5504l356.00384 595.21024c26.15296 43.74528 10.73152 99.7376-34.44736 125.05088-14.39744 8.06912-30.72 12.30848-47.37024 12.30848H155.97568C103.75168 901.12 61.44 860.16 61.44 809.61536c0-16.09728 4.38272-31.92832 12.71808-45.8752L430.16192 168.5504c26.17344-43.7248 84.00896-58.65472 129.20832-33.34144a93.0816 93.0816 0 0 1 34.44736 33.34144zM512 819.2a61.44 61.44 0 1 0 0-122.88 61.44 61.44 0 0 0 0 122.88z m0-512a72.31488 72.31488 0 0 0-71.76192 81.3056l25.72288 205.7216a46.40768 46.40768 0 0 0 92.07808 0l25.72288-205.74208A72.31488 72.31488 0 0 0 512 307.2z\" p-id=\"2750\">\\n</path>\\n</svg>',close:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1655876154826\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"22\" height=\"22\">\\n<path d=\"M571.733333 512l268.8-268.8c17.066667-17.066667 17.066667-42.666667 0-59.733333-17.066667-17.066667-42.666667-17.066667-59.733333 0L512 452.266667 243.2 183.466667c-17.066667-17.066667-42.666667-17.066667-59.733333 0-17.066667 17.066667-17.066667 42.666667 0 59.733333L452.266667 512 183.466667 780.8c-17.066667 17.066667-17.066667 42.666667 0 59.733333 8.533333 8.533333 19.2 12.8 29.866666 12.8s21.333333-4.266667 29.866667-12.8L512 571.733333l268.8 268.8c8.533333 8.533333 19.2 12.8 29.866667 12.8s21.333333-4.266667 29.866666-12.8c17.066667-17.066667 17.066667-42.666667 0-59.733333L571.733333 512z\" p-id=\"2131\">\\n</path>\\n</svg>',airplay:'<svg width=\"18px\" height=\"18px\" viewBox=\"0 0 18 18\" xmlns=\"http://www.w3.org/2000/svg\">\\n    <g>\\n        <path d=\"M16,1 L2,1 C1.447,1 1,1.447 1,2 L1,12 C1,12.553 1.447,13 2,13 L5,13 L5,11 L3,11 L3,3 L15,3 L15,11 L13,11 L13,13 L16,13 C16.553,13 17,12.553 17,12 L17,2 C17,1.447 16.553,1 16,1 L16,1 Z\"></path>\\n        <polygon points=\"4 17 14 17 9 11\"></polygon>\\n    </g>\\n</svg>\\n'},t.option.icons);for(const r in e)tt(this,r,{get:()=>N(r,e[r])})}}class At extends xt{constructor(t){super(t),this.name=\"info\",k||this.init()}init(){const{proxy:t,constructor:e,template:{$infoPanel:r,$infoClose:o,$video:a}}=this.art;t(o,\"click\",()=>{this.show=!1});let n=null;const i=E(\"[data-video]\",r)||[];this.art.on(\"destroy\",()=>clearTimeout(n)),function t(){for(let e=0;e<i.length;e++){const t=i[e],r=a[t.dataset.video],o=\"number\"===typeof r?r.toFixed(2):r;t.textContent!==o&&(t.textContent=o)}n=setTimeout(t,e.INFO_LOOP_TIME)}()}}class Ot extends xt{constructor(t){super(t);const{option:e,template:{$layer:r}}=t;this.name=\"layer\",this.$parent=r;for(let o=0;o<e.layers.length;o++)this.add(e.layers[o])}}class Rt extends xt{constructor(t){super(t),this.name=\"loading\",S(t.template.$loading,t.icons.loading)}}class _t extends xt{constructor(t){super(t),this.name=\"mask\";const{template:e,icons:r,events:o}=t,a=S(e.$state,r.state),n=S(e.$state,r.error);I(n,\"display\",\"none\"),t.on(\"destroy\",()=>{I(a,\"display\",\"none\"),I(n,\"display\",null)}),o.proxy(e.$state,\"click\",()=>t.play())}}class Vt{constructor(t){this.art=t,this.timer=null,t.on(\"destroy\",()=>this.destroy())}destroy(){this.timer&&(clearTimeout(this.timer),this.timer=null)}set show(t){const{constructor:e,template:{$player:r,$noticeInner:o}}=this.art;t?(o.textContent=t instanceof Error?t.message.trim():t,C(r,\"art-notice-show\"),clearTimeout(this.timer),this.timer=setTimeout(()=>{o.textContent=\"\",z(r,\"art-notice-show\")},e.NOTICE_TIME)):z(r,\"art-notice-show\")}get show(){const{template:{$player:t}}=this.art;return t.classList.contains(\"art-notice-show\")}}const Yt=[[\"requestFullscreen\",\"exitFullscreen\",\"fullscreenElement\",\"fullscreenEnabled\",\"fullscreenchange\",\"fullscreenerror\"],[\"webkitRequestFullscreen\",\"webkitExitFullscreen\",\"webkitFullscreenElement\",\"webkitFullscreenEnabled\",\"webkitfullscreenchange\",\"webkitfullscreenerror\"],[\"webkitRequestFullScreen\",\"webkitCancelFullScreen\",\"webkitCurrentFullScreenElement\",\"webkitCancelFullScreen\",\"webkitfullscreenchange\",\"webkitfullscreenerror\"],[\"mozRequestFullScreen\",\"mozCancelFullScreen\",\"mozFullScreenElement\",\"mozFullScreenEnabled\",\"mozfullscreenchange\",\"mozfullscreenerror\"],[\"msRequestFullscreen\",\"msExitFullscreen\",\"msFullscreenElement\",\"msFullscreenEnabled\",\"MSFullscreenChange\",\"MSFullscreenError\"]],Dt=(()=>{if(\"undefined\"===typeof document)return!1;const t=Yt[0],e={};for(const r of Yt){if(r[1]in document){for(const[o,a]of r.entries())e[t[o]]=a;return e}}return!1})(),Nt={change:Dt.fullscreenchange,error:Dt.fullscreenerror},Ft={request:(t=document.documentElement,e)=>new Promise((r,o)=>{const a=()=>{Ft.off(\"change\",a),r()};Ft.on(\"change\",a);const n=t[Dt.requestFullscreen](e);n instanceof Promise&&n.then(a).catch(o)}),exit:()=>new Promise((t,e)=>{if(!Ft.isFullscreen)return void t();const r=()=>{Ft.off(\"change\",r),t()};Ft.on(\"change\",r);const o=document[Dt.exitFullscreen]();o instanceof Promise&&o.then(r).catch(e)}),toggle:(t,e)=>Ft.isFullscreen?Ft.exit():Ft.request(t,e),onchange(t){Ft.on(\"change\",t)},onerror(t){Ft.on(\"error\",t)},on(t,e){const r=Nt[t];r&&document.addEventListener(r,e,!1)},off(t,e){const r=Nt[t];r&&document.removeEventListener(r,e,!1)},raw:Dt};function Bt(t){const{i18n:e,notice:r,template:{$video:o,$player:a}}=t,n=t=>{Ft.on(\"change\",()=>{t.emit(\"fullscreen\",Ft.isFullscreen),Ft.isFullscreen?(t.state=\"fullscreen\",C(a,\"art-fullscreen\")):z(a,\"art-fullscreen\"),t.emit(\"resize\")}),Ft.on(\"error\",e=>{t.emit(\"fullscreenError\",e)}),tt(t,\"fullscreen\",{get:()=>Ft.isFullscreen,set(t){return d(this,null,function*(){t?yield Ft.request(a):yield Ft.exit()})}})};t.once(\"video:loadedmetadata\",()=>{var a;Ft.isEnabled?n(t):o.webkitSupportsFullscreen?((a=t).on(\"document:webkitfullscreenchange\",()=>{a.emit(\"fullscreen\",a.fullscreen),a.emit(\"resize\")}),tt(a,\"fullscreen\",{get:()=>document.fullscreenElement===o,set(t){t?(a.state=\"fullscreen\",o.webkitEnterFullscreen()):o.webkitExitFullscreen()}})):tt(t,\"fullscreen\",{get:()=>!1,set(){r.show=e.get(\"Fullscreen Not Supported\")}}),tt(t,\"fullscreen\",ot(t,\"fullscreen\"))})}function Ht(t){const{icons:e,proxy:r,storage:o,template:{$player:a,$video:n}}=t;let i=!1,s=0,l=0;function c(){const{$mini:e}=t.template;e&&(z(a,\"art-mini\"),I(e,\"display\",\"none\"),a.prepend(n),t.emit(\"mini\",!1))}function d(e,r){t.playing?(I(e,\"display\",\"none\"),I(r,\"display\",\"flex\")):(I(e,\"display\",\"flex\"),I(r,\"display\",\"none\"))}function p(){const{$mini:e}=t.template,r=H(e),a=window.innerHeight-r.height-50,n=window.innerWidth-r.width-50;o.set(\"top\",a),o.set(\"left\",n),I(e,\"top\",`${a}px`),I(e,\"left\",`${n}px`)}tt(t,\"mini\",{get:()=>L(a,\"art-mini\"),set(h){if(h){t.state=\"mini\",C(a,\"art-mini\");const h=function(){const{$mini:a}=t.template;if(a)return S(a,n),I(a,\"display\",\"flex\");{const a=D(\"div\");C(a,\"art-mini-popup\"),S(document.body,a),t.template.$mini=a,S(a,n);const p=S(a,'<div class=\"art-mini-close\"></div>');S(p,e.close),r(p,\"click\",c);const h=S(a,'<div class=\"art-mini-state\"></div>'),u=S(h,e.play),m=S(h,e.pause);return r(u,\"click\",()=>t.play()),r(m,\"click\",()=>t.pause()),d(u,m),t.on(\"video:playing\",()=>d(u,m)),t.on(\"video:pause\",()=>d(u,m)),t.on(\"video:timeupdate\",()=>d(u,m)),r(a,\"mousedown\",t=>{i=0===t.button,s=t.pageX,l=t.pageY}),t.on(\"document:mousemove\",t=>{if(i){C(a,\"art-mini-dragging\");const e=t.pageX-s,r=t.pageY-l;I(a,\"transform\",`translate(${e}px, ${r}px)`)}}),t.on(\"document:mouseup\",()=>{if(i){i=!1,z(a,\"art-mini-dragging\");const t=H(a);o.set(\"left\",t.left),o.set(\"top\",t.top),I(a,\"left\",`${t.left}px`),I(a,\"top\",`${t.top}px`),I(a,\"transform\",null)}}),a}}(),u=o.get(\"top\"),m=o.get(\"left\");\"number\"===typeof u&&\"number\"===typeof m?(I(h,\"top\",`${u}px`),I(h,\"left\",`${m}px`),_(h)||p()):p(),t.emit(\"mini\",!0)}else c()}})}function Wt(t){const{i18n:e,notice:r,template:{$video:o}}=t;document.pictureInPictureEnabled?function(t){const{template:{$video:e},proxy:r,notice:o}=t;e.disablePictureInPicture=!1,tt(t,\"pip\",{get:()=>document.pictureInPictureElement,set(r){r?(t.state=\"pip\",e.requestPictureInPicture().catch(t=>{throw o.show=t,t})):document.exitPictureInPicture().catch(t=>{throw o.show=t,t})}}),r(e,\"enterpictureinpicture\",()=>{t.emit(\"pip\",!0)}),r(e,\"leavepictureinpicture\",()=>{t.emit(\"pip\",!1)})}(t):o.webkitSupportsPresentationMode?function(t){const{$video:e}=t.template;e.webkitSetPresentationMode(\"inline\"),tt(t,\"pip\",{get:()=>\"picture-in-picture\"===e.webkitPresentationMode,set(r){r?(t.state=\"pip\",e.webkitSetPresentationMode(\"picture-in-picture\"),t.emit(\"pip\",!0)):(e.webkitSetPresentationMode(\"inline\"),t.emit(\"pip\",!1))}})}(t):tt(t,\"pip\",{get:()=>!1,set(){r.show=e.get(\"PIP Not Supported\")}})}function jt(t){const{option:e,template:{$progress:r,$video:o}}=t;let a=null,n=!1,i=null;t.on(\"setBar\",(a,s,l)=>d(null,null,function*(){var c;const d=null==(c=t.controls)?void 0:c.thumbnails,{url:p,scale:h}=e.thumbnails;if(!d||!p)return;if(\"hover\"===a||\"played\"===a&&l&&k){if(i||n||(n=!0,i=yield W(p,h),n=!1),!i)return;const a=r.clientWidth*s;a>0&&a<r.clientWidth&&function(a){var n;const s=null==(n=t.controls)?void 0:n.thumbnails;if(!s)return;const{number:l,column:c,width:d,height:p,scale:h}=e.thumbnails,u=d*h||i.naturalWidth/c,m=p*h||u/(o.videoWidth/o.videoHeight),f=r.clientWidth/l,g=Math.floor(a/f),v=Math.ceil(g/c)-1,y=g%c||c-1;I(s,\"backgroundImage\",`url(${i.src})`),I(s,\"height\",`${m}px`),I(s,\"width\",`${u}px`),I(s,\"backgroundPosition\",`-${y*u}px -${v*m}px`),a<=u/2?I(s,\"left\",0):a>r.clientWidth-u/2?I(s,\"left\",r.clientWidth-u+\"px\"):I(s,\"left\",a-u/2+\"px\")}(a)}})),tt(t,\"thumbnails\",{get:()=>t.option.thumbnails,set(e){e.url&&!t.option.isLive&&(t.option.thumbnails=e,clearTimeout(a),a=null,n=!1,i=null)}})}Object.defineProperties(Ft,{isFullscreen:{get:()=>Boolean(document[Dt.fullscreenElement])},element:{enumerable:!0,get:()=>document[Dt.fullscreenElement]},isEnabled:{enumerable:!0,get:()=>Boolean(document[Dt.fullscreenEnabled])}});class Ut{constructor(t){!function(t){const{option:e,template:{$video:r}}=t;tt(t,\"url\",{get:()=>r.src,set(o){return d(this,null,function*(){if(o){const a=t.url,n=e.type||X(o),i=e.customType[n];n&&i?(yield lt(),t.loading.show=!0,i.call(t,r,o,t)):(URL.revokeObjectURL(a),r.src=o),a!==t.url&&(t.option.url=o,t.isReady&&a&&t.once(\"video:canplay\",()=>{t.emit(\"restart\",o)}))}else yield lt(),t.loading.show=!0})}})}(t),function(t){const{template:{$video:e}}=t;tt(t,\"attr\",{value(t,r){if(void 0===r)return e[t];e[t]=r}})}(t),function(t){const{i18n:e,notice:r,option:o,constructor:{instances:a},template:{$video:n}}=t;tt(t,\"play\",{value(){return d(this,null,function*(){const i=yield n.play();if(r.show=e.get(\"Play\"),t.emit(\"play\"),o.mutex)for(let e=0;e<a.length;e++){const r=a[e];r!==t&&r.pause()}return i})}})}(t),function(t){const{template:{$video:e},i18n:r,notice:o}=t;tt(t,\"pause\",{value(){const a=e.pause();return o.show=r.get(\"Pause\"),t.emit(\"pause\"),a}})}(t),function(t){tt(t,\"toggle\",{value:()=>t.playing?t.pause():t.play()})}(t),function(t){const{notice:e}=t;tt(t,\"seek\",{set(r){t.currentTime=r,t.duration&&(e.show=`${J(t.currentTime)} / ${J(t.duration)}`),t.emit(\"seek\",t.currentTime,r)}}),tt(t,\"forward\",{set(e){t.seek=t.currentTime+e}}),tt(t,\"backward\",{set(e){t.seek=t.currentTime-e}})}(t),function(t){const{template:{$video:e},i18n:r,notice:o,storage:a}=t;tt(t,\"volume\",{get:()=>e.volume||0,set:t=>{e.volume=K(t,0,1),o.show=`${r.get(\"Volume\")}: ${Number.parseInt(100*e.volume,10)}`,0!==e.volume&&a.set(\"volume\",e.volume)}}),tt(t,\"muted\",{get:()=>e.muted,set:r=>{e.muted=r,t.emit(\"muted\",r)}})}(t),function(t){const{$video:e}=t.template;tt(t,\"currentTime\",{get:()=>e.currentTime||0,set:r=>{r=Number.parseFloat(r),Number.isNaN(r)||(e.currentTime=K(r,0,t.duration))}})}(t),function(t){tt(t,\"duration\",{get:()=>{const{duration:e}=t.template.$video;return e===1/0?0:e||0}})}(t),function(t){function e(e,r){return new Promise((o,a)=>{if(e===t.url)return void o();const{playing:n,aspectRatio:i,playbackRate:s}=t;t.pause(),t.url=e,t.notice.show=\"\";const l={error:e=>{t.off(\"video:canplay\",l.canplay),t.off(\"video:loadedmetadata\",l.metadata),a(e)},metadata:()=>{t.currentTime=r},canplay:()=>d(null,null,function*(){t.off(\"video:error\",l.error),t.playbackRate=s,t.aspectRatio=i,n&&(yield t.play()),t.notice.show=\"\",o()})};t.once(\"video:error\",l.error),t.once(\"video:loadedmetadata\",l.metadata),t.once(\"video:canplay\",l.canplay)})}tt(t,\"switchQuality\",{value:r=>e(r,t.currentTime)}),tt(t,\"switchUrl\",{value:t=>e(t,0)}),tt(t,\"switch\",{set:t.switchUrl})}(t),function(t){const{template:{$video:e},i18n:r,notice:o}=t;tt(t,\"playbackRate\",{get:()=>e.playbackRate,set(a){if(a){if(a===e.playbackRate)return;e.playbackRate=a,o.show=`${r.get(\"Rate\")}: ${1===a?r.get(\"Normal\"):`${a}x`}`}else t.playbackRate=1}})}(t),function(t){const{i18n:e,notice:r,template:{$video:o,$player:a}}=t;tt(t,\"aspectRatio\",{get:()=>a.dataset.aspectRatio||\"default\",set(n){if(n||(n=\"default\"),\"default\"===n)I(o,\"width\",null),I(o,\"height\",null),I(o,\"margin\",null),delete a.dataset.aspectRatio;else{const t=n.split(\":\").map(Number),{clientWidth:e,clientHeight:r}=a,i=e/r,s=t[0]/t[1];i>s?(I(o,\"width\",s*r+\"px\"),I(o,\"height\",\"100%\"),I(o,\"margin\",\"0 auto\")):(I(o,\"width\",\"100%\"),I(o,\"height\",e/s+\"px\"),I(o,\"margin\",\"auto 0\")),a.dataset.aspectRatio=n}r.show=`${e.get(\"Aspect Ratio\")}: ${\"default\"===n?e.get(\"Default\"):n}`,t.emit(\"aspectRatio\",n)}})}(t),function(t){const{notice:e,template:{$video:r}}=t,o=D(\"canvas\");tt(t,\"getDataURL\",{value:()=>new Promise((t,a)=>{try{o.width=r.videoWidth,o.height=r.videoHeight,o.getContext(\"2d\").drawImage(r,0,0),t(o.toDataURL(\"image/png\"))}catch(n){e.show=n,a(n)}})}),tt(t,\"getBlobUrl\",{value:()=>new Promise((t,a)=>{try{o.width=r.videoWidth,o.height=r.videoHeight,o.getContext(\"2d\").drawImage(r,0,0),o.toBlob(e=>{t(URL.createObjectURL(e))})}catch(n){e.show=n,a(n)}})}),tt(t,\"screenshot\",{value:e=>d(null,null,function*(){const o=yield t.getDataURL();return G(o,`${e||`artplayer_${J(r.currentTime)}`}.png`),t.emit(\"screenshot\",o),o})})}(t),Bt(t),function(t){const{constructor:e,template:{$container:r,$player:o}}=t;let a=\"\";tt(t,\"fullscreenWeb\",{get:()=>L(o,\"art-fullscreen-web\"),set(n){n?(a=o.style.cssText,e.FULLSCREEN_WEB_IN_BODY&&S(document.body,o),t.state=\"fullscreenWeb\",I(o,\"width\",\"100%\"),I(o,\"height\",\"100%\"),C(o,\"art-fullscreen-web\"),t.emit(\"fullscreenWeb\",!0)):(e.FULLSCREEN_WEB_IN_BODY&&S(r,o),a&&(o.style.cssText=a,a=\"\"),z(o,\"art-fullscreen-web\"),t.emit(\"fullscreenWeb\",!1)),t.emit(\"resize\")}})}(t),Wt(t),function(t){const{$video:e}=t.template;tt(t,\"loaded\",{get:()=>t.loadedTime/e.duration}),tt(t,\"loadedTime\",{get:()=>e.buffered.length?e.buffered.end(e.buffered.length-1):0})}(t),function(t){tt(t,\"played\",{get:()=>t.currentTime/t.duration})}(t),function(t){const{$video:e}=t.template;tt(t,\"playing\",{get:()=>\"boolean\"===typeof e.playing?e.playing:!!(e.currentTime>0&&!e.paused&&!e.ended&&e.readyState>2)})}(t),function(t){const{$container:e,$player:r,$video:o}=t.template;tt(t,\"autoSize\",{value(){const{videoWidth:a,videoHeight:n}=o,{width:i,height:s}=H(e),l=a/n;if(i/s>l)I(r,\"width\",s*l/i*100+\"%\"),I(r,\"height\",\"100%\");else{const t=i/l/s*100;I(r,\"width\",\"100%\"),I(r,\"height\",`${t}%`)}t.emit(\"autoSize\",{width:t.width,height:t.height})}})}(t),function(t){tt(t,\"rect\",{get:()=>H(t.template.$player)});const e=[\"bottom\",\"height\",\"left\",\"right\",\"top\",\"width\"];for(let r=0;r<e.length;r++){const o=e[r];tt(t,o,{get:()=>t.rect[o]})}tt(t,\"x\",{get:()=>t.left+window.pageXOffset}),tt(t,\"y\",{get:()=>t.top+window.pageYOffset})}(t),function(t){const{template:{$player:e},i18n:r,notice:o}=t;tt(t,\"flip\",{get:()=>e.dataset.flip||\"normal\",set(a){a||(a=\"normal\"),\"normal\"===a?delete e.dataset.flip:e.dataset.flip=a,o.show=`${r.get(\"Video Flip\")}: ${r.get(Z(a))}`,t.emit(\"flip\",a)}})}(t),Ht(t),function(t){const{template:{$poster:e}}=t;tt(t,\"poster\",{get:()=>{try{return e.style.backgroundImage.match(/\"(.*)\"/)[1]}catch(t){return\"\"}},set(t){I(e,\"backgroundImage\",`url(${t})`)}})}(t),function(t){const{template:{$container:e,$video:r}}=t;tt(t,\"autoHeight\",{value(){const{clientWidth:o}=e,{videoHeight:a,videoWidth:n}=r,i=a*(o/n);I(e,\"height\",`${i}px`),t.emit(\"autoHeight\",i)}})}(t),function(t){const{$player:e}=t.template;tt(t,\"cssVar\",{value:(t,r)=>r?e.style.setProperty(t,r):getComputedStyle(e).getPropertyValue(t)})}(t),function(t){tt(t,\"theme\",{get:()=>t.cssVar(\"--art-theme\"),set(e){t.cssVar(\"--art-theme\",e)}})}(t),function(t){tt(t,\"type\",{get:()=>t.option.type,set(e){t.option.type=e}})}(t),function(t){const e=[\"mini\",\"pip\",\"fullscreen\",\"fullscreenWeb\"];tt(t,\"state\",{get:()=>e.find(e=>t[e])||\"standard\",set(r){for(let o=0;o<e.length;o++){const a=e[o];a!==r&&t[a]&&(t[a]=!1)}}})}(t),function(t){const{notice:e,i18n:r,template:o}=t;tt(t,\"subtitleOffset\",{get(){var t;return(null==(t=o.$track)?void 0:t.offset)||0},set(a){var n,i;const{cues:s}=t.subtitle;if(!o.$track||0===s.length)return;const l=K(a,-10,10);o.$track.offset=l;for(let e=0;e<s.length;e++){const r=s[e];r.originalStartTime=null!=(n=r.originalStartTime)?n:r.startTime,r.originalEndTime=null!=(i=r.originalEndTime)?i:r.endTime,r.startTime=K(r.originalStartTime+l,0,t.duration),r.endTime=K(r.originalEndTime+l,0,t.duration)}t.subtitle.update(),e.show=`${r.get(\"Subtitle Offset\")}: ${a}s`,t.emit(\"subtitleOffset\",a)}})}(t),function(t){const{i18n:e,notice:r,proxy:o,template:{$video:a}}=t;let n=!0;window.WebKitPlaybackTargetAvailabilityEvent&&a.webkitShowPlaybackTargetPicker?o(a,\"webkitplaybacktargetavailabilitychanged\",t=>{switch(t.availability){case\"available\":n=!0;break;case\"not-available\":n=!1}}):n=!1,tt(t,\"airplay\",{value(){n?(a.webkitShowPlaybackTargetPicker(),t.emit(\"airplay\")):r.show=e.get(\"AirPlay Not Available\")}})}(t),function(t){tt(t,\"quality\",{set(e){const{controls:r,notice:o,i18n:a}=t,n=e.find(t=>t.default)||e[0];r.update({name:\"quality\",position:\"right\",index:10,style:{marginRight:\"10px\"},html:(null==n?void 0:n.html)||\"\",selector:e,onSelect(e){return d(this,null,function*(){return yield t.switchQuality(e.url),o.show=`${a.get(\"Switch Video\")}: ${e.html}`,e.html})}})}})}(t),jt(t),function(t){const{i18n:e,notice:r,option:o,constructor:a,proxy:n,template:{$player:i,$video:s,$poster:l}}=t;let c=0;for(let d=0;d<v.events.length;d++)n(s,v.events[d],e=>{t.emit(`video:${e.type}`,e)});t.on(\"video:canplay\",()=>{c=0,t.loading.show=!1}),t.once(\"video:canplay\",()=>{t.loading.show=!1,t.controls.show=!0,t.mask.show=!0,t.isReady=!0,t.emit(\"ready\")}),t.on(\"video:ended\",()=>{o.loop?(t.seek=0,t.play(),t.controls.show=!1,t.mask.show=!1):(t.controls.show=!0,t.mask.show=!0)}),t.on(\"video:error\",n=>d(null,null,function*(){c<a.RECONNECT_TIME_MAX?(yield lt(a.RECONNECT_SLEEP_TIME),c+=1,t.url=o.url,r.show=`${e.get(\"Reconnect\")}: ${c}`,t.emit(\"error\",n,c)):(t.mask.show=!0,t.loading.show=!1,t.controls.show=!0,C(i,\"art-error\"),yield lt(a.RECONNECT_SLEEP_TIME),r.show=e.get(\"Video Load Failed\"))})),t.on(\"video:loadedmetadata\",()=>{t.emit(\"resize\"),k&&(t.loading.show=!1,t.controls.show=!0,t.mask.show=!0)}),t.on(\"video:loadstart\",()=>{t.loading.show=!0,t.mask.show=!1,t.controls.show=!0}),t.on(\"video:pause\",()=>{t.controls.show=!0,t.mask.show=!0}),t.on(\"video:play\",()=>{t.mask.show=!1,I(l,\"display\",\"none\")}),t.on(\"video:playing\",()=>{t.mask.show=!1}),t.on(\"video:progress\",()=>{t.playing&&(t.loading.show=!1)}),t.on(\"video:seeked\",()=>{t.loading.show=!1,t.mask.show=!0}),t.on(\"video:seeking\",()=>{t.loading.show=!0,t.mask.show=!1}),t.on(\"video:timeupdate\",()=>{t.mask.show=!1}),t.on(\"video:waiting\",()=>{t.loading.show=!0,t.mask.show=!1})}(t),function(t){const{option:e,storage:r,template:{$video:o,$poster:a}}=t;for(const i in e.moreVideoAttr)t.attr(i,e.moreVideoAttr[i]);e.muted&&(t.muted=e.muted),e.volume&&(o.volume=K(e.volume,0,1));const n=r.get(\"volume\");\"number\"===typeof n&&(o.volume=K(n,0,1)),e.poster&&I(a,\"backgroundImage\",`url(${e.poster})`),e.autoplay&&(o.autoplay=e.autoplay),e.playsInline&&(o.playsInline=!0,o[\"webkit-playsinline\"]=!0),e.theme&&(e.cssVar[\"--art-theme\"]=e.theme);for(const i in e.cssVar)t.cssVar(i,e.cssVar[i]);t.url=e.url}(t)}}function qt(t){const{notice:e,constructor:r,template:{$player:o,$video:a}}=t,n=\"art-auto-orientation\",i=\"art-auto-orientation-fullscreen\";let s=!1;function l(){const{videoWidth:t,videoHeight:e}=a,r=document.documentElement.clientWidth,o=document.documentElement.clientHeight;return t>e&&r<o||t<e&&r>o}return t.on(\"fullscreenWeb\",e=>{var a;if(e){if(l()){const e=Number(null!=(a=r.AUTO_ORIENTATION_TIME)?a:0);setTimeout(()=>{t.fullscreenWeb&&!L(o,n)&&function(){const e=document.documentElement.clientWidth,r=document.documentElement.clientHeight;I(o,\"width\",`${r}px`),I(o,\"height\",`${e}px`),I(o,\"transform-origin\",\"0 0\"),I(o,\"transform\",`rotate(90deg) translate(0, -${e}px)`),C(o,n),t.isRotate=!0,t.emit(\"resize\")}()},e)}}else L(o,n)&&(I(o,\"width\",\"\"),I(o,\"height\",\"\"),I(o,\"transform-origin\",\"\"),I(o,\"transform\",\"\"),z(o,n),t.isRotate=!1,t.emit(\"resize\"))}),t.on(\"fullscreen\",t=>d(null,null,function*(){var r;const a=!!(null==(r=null==screen?void 0:screen.orientation)?void 0:r.lock);if(t){if(a&&l())try{const t=screen.orientation.type.startsWith(\"portrait\")?\"landscape\":\"portrait\";yield screen.orientation.lock(t),s=!0,C(o,i)}catch(n){s=!1,e.show=n}}else if(L(o,i)&&z(o,i),a&&s){try{screen.orientation.unlock()}catch(c){}s=!1}})),{name:\"autoOrientation\",get state(){return L(o,n)}}}function Xt(t){const{i18n:e,icons:r,storage:o,constructor:a,proxy:n,template:{$poster:i}}=t,s=t.layers.add({name:\"auto-playback\",html:'\\n            <div class=\"art-auto-playback-close\"></div>\\n            <div class=\"art-auto-playback-last\"></div>\\n            <div class=\"art-auto-playback-jump\"></div>\\n        '}),l=T(\".art-auto-playback-last\",s),c=T(\".art-auto-playback-jump\",s),d=T(\".art-auto-playback-close\",s);S(d,r.close);let p=null;function h(){const r=(o.get(\"times\")||{})[t.option.id||t.option.url];clearTimeout(p),I(s,\"display\",\"none\"),r&&r>=a.AUTO_PLAYBACK_MIN&&(I(s,\"display\",\"flex\"),l.textContent=`${e.get(\"Last Seen\")} ${J(r)}`,c.textContent=e.get(\"Jump Play\"),n(d,\"click\",()=>{I(s,\"display\",\"none\")}),n(c,\"click\",()=>{t.seek=r,t.play(),I(i,\"display\",\"none\"),I(s,\"display\",\"none\")}),t.once(\"video:timeupdate\",()=>{p=setTimeout(()=>{I(s,\"display\",\"none\")},a.AUTO_PLAYBACK_TIMEOUT)}))}return t.on(\"video:timeupdate\",()=>{if(t.playing){const e=o.get(\"times\")||{},r=Object.keys(e);r.length>a.AUTO_PLAYBACK_MAX&&delete e[r[0]],e[t.option.id||t.option.url]=t.currentTime,o.set(\"times\",e)}}),t.on(\"ready\",h),t.on(\"restart\",h),{name:\"auto-playback\",get times(){return o.get(\"times\")||{}},clear:()=>o.del(\"times\"),delete(t){const e=o.get(\"times\")||{};return delete e[t],o.set(\"times\",e),e}}}function Gt(t){const{constructor:e,proxy:r,template:{$player:o,$video:a}}=t;let n=null,i=!1,s=1;const l=()=>{clearTimeout(n),i&&(i=!1,t.playbackRate=s,z(o,\"art-fast-forward\"))};return r(a,\"touchstart\",r=>{1===r.touches.length&&t.playing&&!t.isLock&&(n=setTimeout(()=>{i=!0,s=t.playbackRate,t.playbackRate=e.FAST_FORWARD_VALUE,C(o,\"art-fast-forward\")},e.FAST_FORWARD_TIME))}),t.on(\"document:touchmove\",l),t.on(\"document:touchend\",l),{name:\"fastForward\",get state(){return L(o,\"art-fast-forward\")}}}function Kt(t){const{layers:e,icons:r,template:{$player:o}}=t;function a(){return L(o,\"art-lock\")}function n(){C(o,\"art-lock\"),t.isLock=!0,t.emit(\"lock\",!0)}function i(){z(o,\"art-lock\"),t.isLock=!1,t.emit(\"lock\",!1)}return e.add({name:\"lock\",mounted(e){const o=S(e,r.lock),a=S(e,r.unlock);I(o,\"display\",\"none\"),t.on(\"lock\",t=>{t?(I(o,\"display\",\"inline-flex\"),I(a,\"display\",\"none\")):(I(o,\"display\",\"none\"),I(a,\"display\",\"inline-flex\"))})},click(){a()?i():n()}}),{name:\"lock\",get state(){return a()},set state(t){t?n():i()}}}function Zt(t){return t.on(\"control\",e=>{e?z(t.template.$player,\"art-mini-progress-bar\"):C(t.template.$player,\"art-mini-progress-bar\")}),{name:\"mini-progress-bar\"}}class Jt{constructor(t){this.art=t,this.id=0;const{option:e}=t;e.miniProgressBar&&!e.isLive&&this.add(Zt),e.lock&&k&&this.add(Kt),e.autoPlayback&&!e.isLive&&this.add(Xt),e.autoOrientation&&k&&this.add(qt),e.fastForward&&k&&!e.isLive&&this.add(Gt);for(let r=0;r<e.plugins.length;r++)this.add(e.plugins[r])}add(t){this.id+=1;const e=t.call(this.art,this.art);return e instanceof Promise?e.then(e=>this.next(t,e)):this.next(t,e)}next(t,e){const r=e&&e.name||t.name||`plugin${this.id}`;return q(!rt(this,r),`Cannot add a plugin that already has the same name: ${r}`),tt(this,r,{value:e}),this}}class Qt extends xt{constructor(t){super(t);const{option:e,controls:r,template:{$setting:o}}=t;this.name=\"setting\",this.$parent=o,this.id=0,this.active=null,this.cache=new Map,this.option=[...this.builtin,...e.settings],e.setting&&(this.format(),this.render(),t.on(\"blur\",()=>{this.show&&(this.show=!1,this.render())}),t.on(\"focus\",t=>{const e=V(t,r.setting),o=V(t,this.$parent);!this.show||e||o||(this.show=!1,this.render())}),t.on(\"resize\",()=>this.resize()))}get builtin(){const t=[],{option:e}=this.art;return e.playbackRate&&t.push(function(t){const{i18n:e,icons:r,constructor:{SETTING_ITEM_WIDTH:o,PLAYBACK_RATE:a}}=t;function n(t){return 1===t?e.get(\"Normal\"):t.toFixed(1)}function i(){const e=t.setting.find(`playback-rate-${t.playbackRate}`);t.setting.check(e)}return{width:o,name:\"playback-rate\",html:e.get(\"Play Speed\"),tooltip:n(t.playbackRate),icon:r.playbackRate,selector:a.map(e=>({value:e,name:`playback-rate-${e}`,default:e===t.playbackRate,html:n(e)})),onSelect:e=>(t.playbackRate=e.value,e.html),mounted:()=>{i(),t.on(\"video:ratechange\",()=>i())}}}(this.art)),e.aspectRatio&&t.push(function(t){const{i18n:e,icons:r,constructor:{SETTING_ITEM_WIDTH:o,ASPECT_RATIO:a}}=t;function n(t){return\"default\"===t?e.get(\"Default\"):t}function i(){const e=t.setting.find(`aspect-ratio-${t.aspectRatio}`);t.setting.check(e)}return{width:o,name:\"aspect-ratio\",html:e.get(\"Aspect Ratio\"),icon:r.aspectRatio,tooltip:n(t.aspectRatio),selector:a.map(e=>({value:e,name:`aspect-ratio-${e}`,default:e===t.aspectRatio,html:n(e)})),onSelect:e=>(t.aspectRatio=e.value,e.html),mounted:()=>{i(),t.on(\"aspectRatio\",()=>i())}}}(this.art)),e.flip&&t.push(function(t){const{i18n:e,icons:r,constructor:{SETTING_ITEM_WIDTH:o,FLIP:a}}=t;function n(t){return e.get(Z(t))}function i(){const e=t.setting.find(`flip-${t.flip}`);t.setting.check(e)}return{width:o,name:\"flip\",html:e.get(\"Video Flip\"),tooltip:n(t.flip),icon:r.flip,selector:a.map(e=>({value:e,name:`flip-${e}`,default:e===t.flip,html:n(e)})),onSelect:e=>(t.flip=e.value,e.html),mounted:()=>{i(),t.on(\"flip\",()=>i())}}}(this.art)),e.subtitleOffset&&t.push(function(t){const{i18n:e,icons:r,constructor:o}=t;return{width:o.SETTING_ITEM_WIDTH,name:\"subtitle-offset\",html:e.get(\"Subtitle Offset\"),icon:r.subtitle,tooltip:\"0s\",range:[0,-10,10,.1],onChange:e=>(t.subtitleOffset=e.range[0],`${e.range[0]}s`),mounted:(e,r)=>{t.on(\"subtitleOffset\",t=>{r.$range.value=t,r.tooltip=`${t}s`})}}}(this.art)),t}traverse(t,e=this.option){var r;for(let o=0;o<e.length;o++){const a=e[o];t(a),(null==(r=a.selector)?void 0:r.length)&&this.traverse(t,a.selector)}}check(t){t&&(t.$parent.tooltip=t.html,this.traverse(e=>{e.default=e===t,e.default&&e.$item&&O(e.$item,\"art-current\")},t.$option),this.render(t.$parents))}format(t=this.option,e,r,o=[]){for(let a=0;a<t.length;a++){const n=t[a];if((null==n?void 0:n.name)?(q(!o.includes(n.name),`The [${n.name}] already exists in [setting]`),o.push(n.name)):n.name=\"setting-\"+this.id++,!n.$formatted){tt(n,\"$parent\",{get:()=>e}),tt(n,\"$parents\",{get:()=>r}),tt(n,\"$option\",{get:()=>t});const o=[];tt(n,\"$events\",{get:()=>o}),tt(n,\"$formatted\",{get:()=>!0})}this.format(n.selector||[],n,t,o)}this.option=t}find(t=\"\"){let e=null;return this.traverse(r=>{r.name===t&&(e=r)}),e}resize(){var t,e;const{controls:r,constructor:{SETTING_WIDTH:o,SETTING_ITEM_HEIGHT:a},template:{$player:n,$setting:i}}=this.art;if(r.setting&&this.show){const s=(null==(e=null==(t=this.active[0])?void 0:t.$parent)?void 0:e.width)||o,{left:l,width:c}=H(r.setting),{left:d,width:p}=H(n),h=l-d+c/2-s/2;if(I(i,\"height\",`${this.active===this.option?this.active.length*a:(this.active.length+1)*a}px`),I(i,\"width\",`${s}px`),this.art.isRotate||k)return;h+s>p?(I(i,\"left\",null),I(i,\"right\",null)):(I(i,\"left\",`${h}px`),I(i,\"right\",\"auto\"))}}inactivate(t){for(let e=0;e<t.$events.length;e++)this.art.events.remove(t.$events[e]);t.$events.length=0}remove(t){const e=this.find(t);q(e,`Can't find [${t}] in the [setting]`);const r=e.$option.indexOf(e);e.$option.splice(r,1),this.inactivate(e),e.$item&&M(e.$item),this.render()}update(t){const e=this.find(t.name);return e?(this.inactivate(e),Object.assign(e,t),this.format(),this.createItem(e,!0),this.render(),e):this.add(t)}add(t,e=this.option){return e.push(t),this.format(),this.createItem(t),this.render(),t}createHeader(t){if(!this.cache.has(t.$option))return;const e=this.cache.get(t.$option),{proxy:r,icons:{arrowLeft:o},constructor:{SETTING_ITEM_HEIGHT:a}}=this.art,n=D(\"div\");I(n,\"height\",`${a}px`),C(n,\"art-setting-item\"),C(n,\"art-setting-item-back\");const i=S(n,'<div class=\"art-setting-item-left\"></div>'),s=D(\"div\");C(s,\"art-setting-item-left-icon\"),S(s,o),S(i,s),S(i,t.$parent.html);const l=r(n,\"click\",()=>this.render(t.$parents));t.$parent.$events.push(l),S(e,n)}createItem(t,e=!1){var r,o;if(!this.cache.has(t.$option))return;const a=this.cache.get(t.$option),n=t.$item;let i=\"selector\";rt(t,\"switch\")&&(i=\"switch\"),rt(t,\"range\")&&(i=\"range\"),rt(t,\"onClick\")&&(i=\"button\");const{icons:s,proxy:l,constructor:c}=this.art,p=D(\"div\");C(p,\"art-setting-item\"),I(p,\"height\",`${c.SETTING_ITEM_HEIGHT}px`),p.dataset.name=t.name||\"\",p.dataset.value=t.value||\"\";const h=S(p,'<div class=\"art-setting-item-left\"></div>'),u=S(p,'<div class=\"art-setting-item-right\"></div>'),m=D(\"div\");switch(C(m,\"art-setting-item-left-icon\"),i){case\"button\":case\"switch\":case\"range\":S(m,t.icon||s.config);break;case\"selector\":(null==(r=t.selector)?void 0:r.length)?S(m,t.icon||s.config):S(m,s.check)}S(h,m),tt(t,\"$icon\",{configurable:!0,get:()=>m}),tt(t,\"icon\",{configurable:!0,get:()=>m.innerHTML,set(t){m.innerHTML=\"\",S(m,t)}});const f=D(\"div\");C(f,\"art-setting-item-left-text\"),S(f,t.html||\"\"),S(h,f),tt(t,\"$html\",{configurable:!0,get:()=>f}),tt(t,\"html\",{configurable:!0,get:()=>f.innerHTML,set(t){f.innerHTML=\"\",S(f,t)}});const g=D(\"div\");switch(C(g,\"art-setting-item-right-tooltip\"),S(g,t.tooltip||\"\"),S(u,g),tt(t,\"$tooltip\",{configurable:!0,get:()=>g}),tt(t,\"tooltip\",{configurable:!0,get:()=>g.innerHTML,set(t){g.innerHTML=\"\",S(g,t)}}),i){case\"switch\":{const e=D(\"div\");C(e,\"art-setting-item-right-icon\");const r=S(e,s.switchOn),o=S(e,s.switchOff);I(t.switch?o:r,\"display\",\"none\"),S(u,e),tt(t,\"$switch\",{configurable:!0,get:()=>e});let a=t.switch;tt(t,\"switch\",{configurable:!0,get:()=>a,set(t){a=t,t?(I(o,\"display\",\"none\"),I(r,\"display\",null)):(I(o,\"display\",null),I(r,\"display\",\"none\"))}});break}case\"range\":{const e=D(\"div\");C(e,\"art-setting-item-right-icon\");const r=S(e,'<input type=\"range\">');r.value=t.range[0],r.min=t.range[1],r.max=t.range[2],r.step=t.range[3],C(r,\"art-setting-range\"),S(u,e),tt(t,\"$range\",{configurable:!0,get:()=>r});let o=[...t.range];tt(t,\"range\",{configurable:!0,get:()=>o,set(t){o=[...t],r.value=t[0],r.min=t[1],r.max=t[2],r.step=t[3]}})}break;case\"selector\":if(null==(o=t.selector)?void 0:o.length){const t=D(\"div\");C(t,\"art-setting-item-right-icon\"),S(t,s.arrowRight),S(u,t)}}switch(i){case\"switch\":if(t.onSwitch){const e=l(p,\"click\",e=>d(this,null,function*(){t.switch=yield t.onSwitch.call(this.art,t,p,e)}));t.$events.push(e)}break;case\"range\":if(t.$range){if(t.onRange){const e=l(t.$range,\"change\",e=>d(this,null,function*(){t.range[0]=t.$range.valueAsNumber,t.tooltip=yield t.onRange.call(this.art,t,p,e)}));t.$events.push(e)}if(t.onChange){const e=l(t.$range,\"input\",e=>d(this,null,function*(){t.range[0]=t.$range.valueAsNumber,t.tooltip=yield t.onChange.call(this.art,t,p,e)}));t.$events.push(e)}}break;case\"selector\":{const e=l(p,\"click\",e=>d(this,null,function*(){var r;(null==(r=t.selector)?void 0:r.length)?this.render(t.selector):(this.check(t),t.$parent.onSelect&&(t.$parent.tooltip=yield t.$parent.onSelect.call(this.art,t,p,e)))}));t.$events.push(e),t.default&&C(p,\"art-current\")}break;case\"button\":if(t.onClick){const e=l(p,\"click\",e=>d(this,null,function*(){t.tooltip=yield t.onClick.call(this.art,t,p,e)}));t.$events.push(e)}}tt(t,\"$item\",{configurable:!0,get:()=>p}),e?Y(p,n):S(a,p),t.mounted&&setTimeout(()=>t.mounted.call(this.art,t.$item,t),0)}render(t=this.option){var e;if(this.active=t,this.cache.has(t)){O(this.cache.get(t),\"art-current\")}else{const r=D(\"div\");this.cache.set(t,r),C(r,\"art-setting-panel\"),S(this.$parent,r),O(r,\"art-current\"),(null==(e=t[0])?void 0:e.$parent)&&this.createHeader(t[0]);for(let e=0;e<t.length;e++)this.createItem(t[e])}this.resize()}}class te{constructor(){this.name=\"artplayer_settings\",this.settings={}}get(t){try{const e=JSON.parse(window.localStorage.getItem(this.name))||{};return t?e[t]:e}catch(e){return t?this.settings[t]:this.settings}}set(t,e){try{const r=Object.assign({},this.get(),{[t]:e});window.localStorage.setItem(this.name,JSON.stringify(r))}catch(r){this.settings[t]=e}}del(t){try{const e=this.get();delete e[t],window.localStorage.setItem(this.name,JSON.stringify(e))}catch(e){delete this.settings[t]}}clear(){try{window.localStorage.removeItem(this.name)}catch(t){this.settings={}}}}const ee='.art-video-player{--art-theme: #f00;--art-font-color: #fff;--art-background-color: #000;--art-text-shadow-color: rgba(0, 0, 0, .5);--art-transition-duration: .2s;--art-padding: 10px;--art-border-radius: 3px;--art-progress-height: 6px;--art-progress-color: rgba(255, 255, 255, .25);--art-progress-top-gap: 10px;--art-hover-color: rgba(255, 255, 255, .25);--art-loaded-color: rgba(255, 255, 255, .25);--art-state-size: 80px;--art-state-opacity: .8;--art-bottom-height: 100px;--art-bottom-offset: 20px;--art-bottom-gap: 5px;--art-highlight-width: 8px;--art-highlight-color: rgba(255, 255, 255, .5);--art-control-height: 46px;--art-control-opacity: .75;--art-control-icon-size: 36px;--art-control-icon-scale: 1.1;--art-volume-height: 120px;--art-volume-handle-size: 14px;--art-lock-size: 36px;--art-indicator-scale: 0;--art-indicator-size: 16px;--art-fullscreen-web-index: 9999;--art-settings-icon-size: 24px;--art-settings-max-height: 300px;--art-selector-max-height: 300px;--art-contextmenus-min-width: 250px;--art-subtitle-font-size: 20px;--art-subtitle-gap: 5px;--art-subtitle-bottom: 15px;--art-subtitle-border: #000;--art-widget-background: rgba(0, 0, 0, .85);--art-tip-background: rgba(0, 0, 0, .7);--art-scrollbar-size: 4px;--art-scrollbar-background: rgba(255, 255, 255, .25);--art-scrollbar-background-hover: rgba(255, 255, 255, .5);--art-mini-progress-height: 2px}.art-bg-cover{background-position:center center;background-repeat:no-repeat;background-size:cover}.art-bottom-gradient{background-image:linear-gradient(to top,#000,rgba(0,0,0,.4),transparent);background-repeat:repeat-x;background-position:center bottom}.art-backdrop-filter{-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px);background-color:#000000bf!important}.art-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.art-video-player{position:relative;margin:0 auto;width:100%;height:100%;outline:0;zoom:1;padding:0;text-align:left;direction:ltr;font-size:14px;line-height:1.3;user-select:none;box-sizing:border-box;color:var(--art-font-color);background-color:var(--art-background-color);text-shadow:0 0 2px var(--art-text-shadow-color);font-family:PingFang SC,Helvetica Neue,Microsoft YaHei,Roboto,Arial,sans-serif;-webkit-tap-highlight-color:rgba(0,0,0,0);-ms-touch-action:manipulation;touch-action:manipulation;-ms-high-contrast-adjust:none}.art-video-player *,.art-video-player *:before,.art-video-player *:after{box-sizing:border-box}.art-video-player ::-webkit-scrollbar{width:var(--art-scrollbar-size);height:var(--art-scrollbar-size)}.art-video-player ::-webkit-scrollbar-thumb{background-color:var(--art-scrollbar-background)}.art-video-player ::-webkit-scrollbar-thumb:hover{background-color:var(--art-scrollbar-background-hover)}.art-video-player img{max-width:100%;vertical-align:top}.art-video-player svg{fill:var(--art-font-color)}.art-video-player a{color:var(--art-font-color);text-decoration:none}.art-icon{line-height:1;display:flex;justify-content:center;align-items:center}.art-video-player.art-backdrop .art-contextmenus,.art-video-player.art-backdrop .art-info,.art-video-player.art-backdrop .art-settings,.art-video-player.art-backdrop .art-layer-auto-playback,.art-video-player.art-backdrop .art-selector-list,.art-video-player.art-backdrop .art-volume-inner{-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px);background-color:#000000bf!important}.art-video{position:absolute;inset:0;z-index:10;width:100%;height:100%}.art-poster{position:absolute;inset:0;z-index:11;width:100%;height:100%;background-position:center center;background-repeat:no-repeat;background-size:cover;pointer-events:none}.art-video-player .art-subtitle{display:none;justify-content:center;align-items:center;flex-direction:column;position:absolute;z-index:20;width:100%;padding:0 5%;text-align:center;pointer-events:none;gap:var(--art-subtitle-gap);bottom:var(--art-subtitle-bottom);font-size:var(--art-subtitle-font-size);transition:bottom var(--art-transition-duration) ease;text-shadow:var(--art-subtitle-border) 1px 0 1px,var(--art-subtitle-border) 0 1px 1px,var(--art-subtitle-border) -1px 0 1px,var(--art-subtitle-border) 0 -1px 1px,var(--art-subtitle-border) 1px 1px 1px,var(--art-subtitle-border) -1px -1px 1px,var(--art-subtitle-border) 1px -1px 1px,var(--art-subtitle-border) -1px 1px 1px}.art-video-player.art-subtitle-show .art-subtitle{display:flex}.art-video-player.art-control-show .art-subtitle{bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}.art-danmuku{position:absolute;inset:0;z-index:30;width:100%;height:100%;pointer-events:none;overflow:hidden}.art-video-player .art-layers{position:absolute;inset:0;z-index:40;width:100%;height:100%;display:none;pointer-events:none}.art-video-player .art-layers .art-layer{pointer-events:auto}.art-video-player.art-layer-show .art-layers{display:flex}.art-video-player .art-mask{display:flex;justify-content:center;align-items:center;position:absolute;inset:0;z-index:50;width:100%;height:100%;pointer-events:none}.art-video-player .art-mask .art-state{display:flex;justify-content:center;align-items:center;opacity:0;transform:scale(2);width:var(--art-state-size);height:var(--art-state-size);transition:all var(--art-transition-duration) ease}.art-video-player.art-mask-show .art-state{pointer-events:auto;opacity:var(--art-state-opacity);transform:scale(1)}.art-video-player.art-loading-show .art-state{display:none}.art-video-player .art-loading{display:none;justify-content:center;align-items:center;position:absolute;inset:0;z-index:70;width:100%;height:100%;pointer-events:none}.art-video-player.art-loading-show .art-loading{display:flex}.art-video-player.art-loading-show .art-mask{display:none}.art-video-player .art-bottom{position:absolute;inset:0;z-index:60;width:100%;height:100%;display:flex;flex-direction:column;justify-content:flex-end;opacity:0;overflow:hidden;pointer-events:none;padding:0 var(--art-padding);transition:all var(--art-transition-duration) ease;background-size:100% var(--art-bottom-height);background-image:linear-gradient(to top,#000,rgba(0,0,0,.4),transparent);background-repeat:repeat-x;background-position:center bottom}.art-video-player .art-bottom .art-controls,.art-video-player .art-bottom .art-progress{transform:translateY(var(--art-bottom-offset));transition:transform var(--art-transition-duration) ease}.art-video-player.art-control-show .art-bottom,.art-video-player.art-hover .art-bottom{opacity:1}.art-video-player.art-control-show .art-bottom .art-controls,.art-video-player.art-hover .art-bottom .art-controls,.art-video-player.art-control-show .art-bottom .art-progress,.art-video-player.art-hover .art-bottom .art-progress{transform:translateY(0)}.art-bottom .art-progress{position:relative;z-index:0;cursor:pointer;pointer-events:auto;padding-top:var(--art-progress-top-gap);padding-bottom:var(--art-bottom-gap)}.art-bottom .art-progress .art-control-progress{position:relative;display:flex;justify-content:center;align-items:center;height:var(--art-progress-height)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner{display:flex;align-items:center;position:relative;height:50%;width:100%;transition:height var(--art-transition-duration) ease;background-color:var(--art-progress-color)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-hover{position:absolute;inset:0;z-index:0;width:100%;height:100%;width:0%;background-color:var(--art-hover-color)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-loaded{position:absolute;inset:0;z-index:10;width:100%;height:100%;width:0%;background-color:var(--art-loaded-color)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-played{position:absolute;inset:0;z-index:20;width:100%;height:100%;width:0%;background-color:var(--art-theme)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight{position:absolute;inset:0;z-index:30;width:100%;height:100%;pointer-events:none}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight span{position:absolute;inset:0 auto 0 0;z-index:0;width:100%;height:100%;pointer-events:auto;width:var(--art-highlight-width)!important;transform:translate(calc(var(--art-highlight-width) / -2));background-color:var(--art-highlight-color)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{display:flex;justify-content:center;align-items:center;position:absolute;z-index:40;left:0;border-radius:50%;width:var(--art-indicator-size);height:var(--art-indicator-size);transform:scale(var(--art-indicator-scale));margin-left:calc(var(--art-indicator-size) / -2);transition:transform var(--art-transition-duration) ease}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator .art-icon{width:100%;height:100%;pointer-events:none}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:hover{transform:scale(1.2)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:active{transform:scale(1)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip{transform-origin:bottom center;transform:scale(.5);opacity:0;position:absolute;z-index:50;top:-25px;left:0;padding:3px 5px;line-height:1;font-size:12px;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);transition:transform var(--art-transition-duration) ease,opacity var(--art-transition-duration) ease}.art-bottom .art-progress .art-control-thumbnails{transform-origin:bottom center;transform:scale(.5);opacity:0;position:absolute;bottom:calc(var(--art-bottom-gap) + 10px);left:0;border-radius:var(--art-border-radius);pointer-events:none;background-color:var(--art-widget-background);transition:transform var(--art-transition-duration) ease,opacity var(--art-transition-duration) ease;box-shadow:0 1px 3px #0003,0 1px 2px -1px #0003}.art-bottom .art-progress:hover .art-control-progress .art-control-progress-inner{height:100%}.art-bottom:hover .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{transform:scale(1)}.art-progress-hover .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip,.art-progress-hover .art-bottom .art-progress .art-control-thumbnails{transform:scale(1);opacity:1}.art-video-player .art-controls{position:relative;z-index:10;pointer-events:auto;display:flex;align-items:center;justify-content:space-between;height:var(--art-control-height)}.art-video-player .art-controls .art-controls-left,.art-video-player .art-controls .art-controls-right{display:flex;height:100%}.art-video-player .art-controls .art-controls-center{display:none;justify-content:center;align-items:center;flex:1;height:100%;padding:0 10px}.art-video-player .art-controls .art-controls-right{justify-content:flex-end}.art-video-player .art-controls .art-control{display:flex;justify-content:center;align-items:center;flex-shrink:0;cursor:pointer;white-space:nowrap;opacity:var(--art-control-opacity);min-height:var(--art-control-height);min-width:var(--art-control-height);transition:opacity var(--art-transition-duration) ease}.art-video-player .art-controls .art-control .art-icon{height:var(--art-control-icon-size);width:var(--art-control-icon-size);transform:scale(var(--art-control-icon-scale));transition:transform var(--art-transition-duration) ease}.art-video-player .art-controls .art-control .art-icon:active{transform:scale(calc(var(--art-control-icon-scale) * .8))}.art-video-player .art-controls .art-control:hover{opacity:1}.art-control-volume{position:relative}.art-control-volume .art-volume-panel{display:flex;justify-content:center;align-items:center;position:absolute;left:0;right:0;padding:0 5px;font-size:12px;text-align:center;cursor:default;opacity:0;transform:translateY(10px);pointer-events:none;bottom:var(--art-control-height);width:var(--art-control-height);height:var(--art-volume-height);transition:all var(--art-transition-duration) ease}.art-control-volume .art-volume-panel .art-volume-inner{display:flex;flex-direction:column;align-items:center;gap:10px;height:100%;width:100%;padding:10px 0 12px;border-radius:var(--art-border-radius);background-color:var(--art-widget-background)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider{flex:1;width:100%;display:flex;cursor:pointer;position:relative;justify-content:center}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle{position:relative;display:flex;justify-content:center;width:2px;border-radius:var(--art-border-radius);overflow:hidden;background-color:#ffffff40}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle .art-volume-loaded{position:absolute;inset:0;z-index:0;width:100%;height:100%;background-color:var(--art-theme)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-indicator{position:absolute;width:var(--art-volume-handle-size);height:var(--art-volume-handle-size);margin-top:calc(var(--art-volume-handle-size) / -2);flex-shrink:0;transform:scale(1);border-radius:100%;background-color:var(--art-theme);transition:transform var(--art-transition-duration) ease}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider:active .art-volume-indicator{transform:scale(.9)}.art-control-volume:hover .art-volume-panel{opacity:1;transform:translateY(0);pointer-events:auto}.art-video-player .art-notice{display:none;position:absolute;inset:0 0 auto;z-index:80;width:100%;height:100%;height:auto;padding:var(--art-padding);pointer-events:none}.art-video-player .art-notice .art-notice-inner{display:inline-flex;padding:5px;line-height:1;border-radius:var(--art-border-radius);background-color:var(--art-tip-background)}.art-video-player.art-notice-show .art-notice{display:flex}.art-video-player .art-contextmenus{display:none;flex-direction:column;position:absolute;z-index:120;padding:5px 0;border-radius:var(--art-border-radius);font-size:12px;background-color:var(--art-widget-background);min-width:var(--art-contextmenus-min-width)}.art-video-player .art-contextmenus .art-contextmenu{cursor:pointer;display:flex;padding:10px 15px;border-bottom:1px solid rgba(255,255,255,.1)}.art-video-player .art-contextmenus .art-contextmenu span{padding:0 8px}.art-video-player .art-contextmenus .art-contextmenu span:hover,.art-video-player .art-contextmenus .art-contextmenu span.art-current{color:var(--art-theme)}.art-video-player .art-contextmenus .art-contextmenu:hover{background-color:#ffffff1a}.art-video-player .art-contextmenus .art-contextmenu:last-child{border-bottom:none}.art-video-player.art-contextmenu-show .art-contextmenus{display:flex}.art-video-player .art-settings{display:none;flex-direction:column;position:absolute;z-index:90;left:auto;overflow-y:auto;overflow-x:hidden;border-radius:var(--art-border-radius);max-height:var(--art-settings-max-height);right:var(--art-padding);bottom:var(--art-control-height);transition:all var(--art-transition-duration) ease;background-color:var(--art-widget-background)}.art-video-player .art-settings .art-setting-panel{display:none;flex-direction:column}.art-video-player .art-settings .art-setting-panel.art-current{display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item{display:flex;justify-content:space-between;align-items:center;padding:0 5px;cursor:pointer;overflow:hidden;transition:background-color var(--art-transition-duration) ease}.art-video-player .art-settings .art-setting-panel .art-setting-item:hover{background-color:#ffffff1a}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current{color:var(--art-theme)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-icon-check{visibility:hidden;height:15px}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current .art-icon-check{visibility:visible}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left{display:flex;justify-content:center;align-items:center;flex-shrink:0;gap:5px}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left .art-setting-item-left-icon{display:flex;justify-content:center;align-items:center;height:var(--art-settings-icon-size);width:var(--art-settings-icon-size)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right{display:flex;justify-content:center;align-items:center;gap:5px;font-size:12px}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-tooltip{white-space:nowrap;color:#ffffff80}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-icon{display:flex;justify-content:center;align-items:center;min-width:32px;height:24px}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-range{height:3px;width:80px;outline:none;appearance:none;background-color:#fff3}.art-video-player .art-settings .art-setting-panel .art-setting-item-back{border-bottom:1px solid rgba(255,255,255,.1)}.art-video-player.art-setting-show .art-settings{display:flex}.art-video-player .art-info{display:none;position:absolute;left:var(--art-padding);top:var(--art-padding);z-index:100;padding:10px;font-size:12px;border-radius:var(--art-border-radius);background-color:var(--art-widget-background)}.art-video-player .art-info .art-info-panel{display:flex;flex-direction:column;gap:5px}.art-video-player .art-info .art-info-panel .art-info-item{display:flex;align-items:center;gap:5px}.art-video-player .art-info .art-info-panel .art-info-item .art-info-title{width:100px;text-align:right}.art-video-player .art-info .art-info-panel .art-info-item .art-info-content{width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;user-select:all}.art-video-player .art-info .art-info-close{position:absolute;top:5px;right:5px;cursor:pointer}.art-video-player.art-info-show .art-info{display:flex}.art-hide-cursor *{cursor:none!important}.art-video-player[data-aspect-ratio]{overflow:hidden}.art-video-player[data-aspect-ratio] .art-video{object-fit:fill;box-sizing:content-box}.art-fullscreen{--art-progress-height: 8px;--art-indicator-size: 20px;--art-control-height: 60px;--art-control-icon-scale: 1.3}.art-fullscreen-web{--art-progress-height: 8px;--art-indicator-size: 20px;--art-control-height: 60px;--art-control-icon-scale: 1.3;position:fixed;inset:0;z-index:var(--art-fullscreen-web-index);width:100%;height:100%}.art-mini-popup{position:fixed;z-index:9999;width:320px;height:180px;background:#000;border-radius:var(--art-border-radius);cursor:move;user-select:none;overflow:hidden;transition:opacity .2s ease;box-shadow:0 0 5px #00000080}.art-mini-popup svg{fill:#fff}.art-mini-popup .art-video{pointer-events:none}.art-mini-popup .art-mini-close{position:absolute;z-index:20;right:10px;top:10px;cursor:pointer;opacity:0;transition:opacity .2s ease}.art-mini-popup .art-mini-state{position:absolute;inset:0;z-index:30;width:100%;height:100%;display:flex;justify-content:center;align-items:center;pointer-events:none;opacity:0;transition:opacity .2s ease;background-color:#00000040}.art-mini-popup .art-mini-state .art-icon{opacity:.75;cursor:pointer;transform:scale(3);pointer-events:auto;transition:transform .2s ease}.art-mini-popup .art-mini-state .art-icon:active{transform:scale(2.5)}.art-mini-popup.art-mini-dragging{opacity:.9}.art-mini-popup:hover .art-mini-close,.art-mini-popup:hover .art-mini-state{opacity:1}.art-video-player[data-flip=horizontal] .art-video{transform:scaleX(-1)}.art-video-player[data-flip=vertical] .art-video{transform:scaleY(-1)}.art-video-player .art-layer-lock{display:none;justify-content:center;align-items:center;position:absolute;top:50%;border-radius:50%;transform:translateY(-50%);height:var(--art-lock-size);width:var(--art-lock-size);left:var(--art-padding);background-color:var(--art-tip-background)}.art-video-player .art-layer-auto-playback{display:none;gap:10px;align-items:center;position:absolute;border-radius:var(--art-border-radius);padding:10px;line-height:1;left:var(--art-padding);bottom:calc(var(--art-control-height) + var(--art-bottom-gap) + 10px);background-color:var(--art-widget-background)}.art-video-player .art-layer-auto-playback .art-auto-playback-close{display:flex;justify-content:center;align-items:center;cursor:pointer}.art-video-player .art-layer-auto-playback .art-auto-playback-close svg{width:15px;height:15px;fill:var(--art-theme)}.art-video-player .art-layer-auto-playback .art-auto-playback-jump{color:var(--art-theme);cursor:pointer}.art-video-player.art-lock .art-subtitle{bottom:var(--art-subtitle-bottom)!important}.art-video-player.art-mini-progress-bar .art-bottom,.art-video-player.art-lock .art-bottom{opacity:1;padding:0;background-image:none}.art-video-player.art-mini-progress-bar .art-bottom .art-controls,.art-video-player.art-lock .art-bottom .art-controls,.art-video-player.art-mini-progress-bar .art-bottom .art-progress,.art-video-player.art-lock .art-bottom .art-progress{transform:translateY(calc(var(--art-control-height) + var(--art-bottom-gap) + var(--art-progress-height) / 4))}.art-video-player.art-mini-progress-bar .art-bottom .art-progress-indicator,.art-video-player.art-lock .art-bottom .art-progress-indicator{display:none!important}.art-video-player.art-control-show .art-layer-lock{display:flex}.art-control-selector{position:relative;display:flex;justify-content:center}.art-control-selector .art-selector-list{display:flex;flex-direction:column;align-items:center;text-align:center;position:absolute;border-radius:var(--art-border-radius);overflow-y:auto;overflow-x:hidden;opacity:0;transform:translateY(10px);pointer-events:none;bottom:var(--art-control-height);max-height:var(--art-selector-max-height);background-color:var(--art-widget-background);transition:all var(--art-transition-duration) ease}.art-control-selector .art-selector-list .art-selector-item{display:flex;justify-content:center;align-items:center;width:100%;padding:10px 15px;flex-shrink:0;line-height:1}.art-control-selector .art-selector-list .art-selector-item:hover{background-color:#ffffff1a}.art-control-selector .art-selector-list .art-selector-item:hover,.art-control-selector .art-selector-list .art-selector-item.art-current{color:var(--art-theme)}.art-control-selector:hover .art-selector-list{opacity:1;transform:translateY(0);pointer-events:auto}.art-video-player [class*=hint--]{position:relative;display:inline-block;font-style:normal}.art-video-player [class*=hint--]:before,.art-video-player [class*=hint--]:after{position:absolute;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translateZ(0);visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;-webkit-transition:.3s ease;-moz-transition:.3s ease;transition:.3s ease;-webkit-transition-delay:0ms;-moz-transition-delay:0ms;transition-delay:0ms}.art-video-player [class*=hint--]:hover:before,.art-video-player [class*=hint--]:hover:after{visibility:visible;opacity:1}.art-video-player [class*=hint--]:hover:before,.art-video-player [class*=hint--]:hover:after{-webkit-transition-delay:.1s;-moz-transition-delay:.1s;transition-delay:.1s}.art-video-player [class*=hint--]:before{content:\"\";position:absolute;background:transparent;border:6px solid transparent;z-index:1000001}.art-video-player [class*=hint--]:after{background:#000;color:#fff;padding:8px 10px;font-size:12px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;line-height:12px;white-space:nowrap}.art-video-player [class*=hint--][aria-label]:after{content:attr(aria-label)}.art-video-player [class*=hint--][data-hint]:after{content:attr(data-hint)}.art-video-player [aria-label=\"\"]:before,.art-video-player [aria-label=\"\"]:after,.art-video-player [data-hint=\"\"]:before,.art-video-player [data-hint=\"\"]:after{display:none!important}.art-video-player .hint--top-left:before{border-top-color:#000}.art-video-player .hint--top-right:before{border-top-color:#000}.art-video-player .hint--top:before{border-top-color:#000}.art-video-player .hint--bottom-left:before{border-bottom-color:#000}.art-video-player .hint--bottom-right:before{border-bottom-color:#000}.art-video-player .hint--bottom:before{border-bottom-color:#000}.art-video-player .hint--left:before{border-left-color:#000}.art-video-player .hint--right:before{border-right-color:#000}.art-video-player .hint--top:before{margin-bottom:-11px}.art-video-player .hint--top:before,.art-video-player .hint--top:after{bottom:100%;left:50%}.art-video-player .hint--top:before{left:calc(50% - 6px)}.art-video-player .hint--top:after{-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);transform:translate(-50%)}.art-video-player .hint--top:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-moz-transform:translateX(-50%) translateY(-8px);transform:translate(-50%) translateY(-8px)}.art-video-player .hint--bottom:before{margin-top:-11px}.art-video-player .hint--bottom:before,.art-video-player .hint--bottom:after{top:100%;left:50%}.art-video-player .hint--bottom:before{left:calc(50% - 6px)}.art-video-player .hint--bottom:after{-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);transform:translate(-50%)}.art-video-player .hint--bottom:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-moz-transform:translateX(-50%) translateY(8px);transform:translate(-50%) translateY(8px)}.art-video-player .hint--right:before{margin-left:-11px;margin-bottom:-6px}.art-video-player .hint--right:after{margin-bottom:-14px}.art-video-player .hint--right:before,.art-video-player .hint--right:after{left:100%;bottom:50%}.art-video-player .hint--right:hover:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translate(8px)}.art-video-player .hint--right:hover:after{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translate(8px)}.art-video-player .hint--left:before{margin-right:-11px;margin-bottom:-6px}.art-video-player .hint--left:after{margin-bottom:-14px}.art-video-player .hint--left:before,.art-video-player .hint--left:after{right:100%;bottom:50%}.art-video-player .hint--left:hover:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translate(-8px)}.art-video-player .hint--left:hover:after{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translate(-8px)}.art-video-player .hint--top-left:before{margin-bottom:-11px}.art-video-player .hint--top-left:before,.art-video-player .hint--top-left:after{bottom:100%;left:50%}.art-video-player .hint--top-left:before{left:calc(50% - 6px)}.art-video-player .hint--top-left:after{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);transform:translate(-100%)}.art-video-player .hint--top-left:after{margin-left:12px}.art-video-player .hint--top-left:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--top-left:hover:after{-webkit-transform:translateX(-100%) translateY(-8px);-moz-transform:translateX(-100%) translateY(-8px);transform:translate(-100%) translateY(-8px)}.art-video-player .hint--top-right:before{margin-bottom:-11px}.art-video-player .hint--top-right:before,.art-video-player .hint--top-right:after{bottom:100%;left:50%}.art-video-player .hint--top-right:before{left:calc(50% - 6px)}.art-video-player .hint--top-right:after{-webkit-transform:translateX(0);-moz-transform:translateX(0);transform:translate(0)}.art-video-player .hint--top-right:after{margin-left:-12px}.art-video-player .hint--top-right:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--top-right:hover:after{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--bottom-left:before{margin-top:-11px}.art-video-player .hint--bottom-left:before,.art-video-player .hint--bottom-left:after{top:100%;left:50%}.art-video-player .hint--bottom-left:before{left:calc(50% - 6px)}.art-video-player .hint--bottom-left:after{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);transform:translate(-100%)}.art-video-player .hint--bottom-left:after{margin-left:12px}.art-video-player .hint--bottom-left:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--bottom-left:hover:after{-webkit-transform:translateX(-100%) translateY(8px);-moz-transform:translateX(-100%) translateY(8px);transform:translate(-100%) translateY(8px)}.art-video-player .hint--bottom-right:before{margin-top:-11px}.art-video-player .hint--bottom-right:before,.art-video-player .hint--bottom-right:after{top:100%;left:50%}.art-video-player .hint--bottom-right:before{left:calc(50% - 6px)}.art-video-player .hint--bottom-right:after{-webkit-transform:translateX(0);-moz-transform:translateX(0);transform:translate(0)}.art-video-player .hint--bottom-right:after{margin-left:-12px}.art-video-player .hint--bottom-right:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--bottom-right:hover:after{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--small:after,.art-video-player .hint--medium:after,.art-video-player .hint--large:after{white-space:normal;line-height:1.4em;word-wrap:break-word}.art-video-player .hint--small:after{width:80px}.art-video-player .hint--medium:after{width:150px}.art-video-player .hint--large:after{width:300px}.art-video-player [class*=hint--]:after{text-shadow:0 -1px 0px black;box-shadow:4px 4px 8px #0000004d}.art-video-player .hint--error:after{background-color:#b34e4d;text-shadow:0 -1px 0px #592726}.art-video-player .hint--error.hint--top-left:before{border-top-color:#b34e4d}.art-video-player .hint--error.hint--top-right:before{border-top-color:#b34e4d}.art-video-player .hint--error.hint--top:before{border-top-color:#b34e4d}.art-video-player .hint--error.hint--bottom-left:before{border-bottom-color:#b34e4d}.art-video-player .hint--error.hint--bottom-right:before{border-bottom-color:#b34e4d}.art-video-player .hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.art-video-player .hint--error.hint--left:before{border-left-color:#b34e4d}.art-video-player .hint--error.hint--right:before{border-right-color:#b34e4d}.art-video-player .hint--warning:after{background-color:#c09854;text-shadow:0 -1px 0px #6c5328}.art-video-player .hint--warning.hint--top-left:before{border-top-color:#c09854}.art-video-player .hint--warning.hint--top-right:before{border-top-color:#c09854}.art-video-player .hint--warning.hint--top:before{border-top-color:#c09854}.art-video-player .hint--warning.hint--bottom-left:before{border-bottom-color:#c09854}.art-video-player .hint--warning.hint--bottom-right:before{border-bottom-color:#c09854}.art-video-player .hint--warning.hint--bottom:before{border-bottom-color:#c09854}.art-video-player .hint--warning.hint--left:before{border-left-color:#c09854}.art-video-player .hint--warning.hint--right:before{border-right-color:#c09854}.art-video-player .hint--info:after{background-color:#3986ac;text-shadow:0 -1px 0px #1a3c4d}.art-video-player .hint--info.hint--top-left:before{border-top-color:#3986ac}.art-video-player .hint--info.hint--top-right:before{border-top-color:#3986ac}.art-video-player .hint--info.hint--top:before{border-top-color:#3986ac}.art-video-player .hint--info.hint--bottom-left:before{border-bottom-color:#3986ac}.art-video-player .hint--info.hint--bottom-right:before{border-bottom-color:#3986ac}.art-video-player .hint--info.hint--bottom:before{border-bottom-color:#3986ac}.art-video-player .hint--info.hint--left:before{border-left-color:#3986ac}.art-video-player .hint--info.hint--right:before{border-right-color:#3986ac}.art-video-player .hint--success:after{background-color:#458746;text-shadow:0 -1px 0px #1a321a}.art-video-player .hint--success.hint--top-left:before{border-top-color:#458746}.art-video-player .hint--success.hint--top-right:before{border-top-color:#458746}.art-video-player .hint--success.hint--top:before{border-top-color:#458746}.art-video-player .hint--success.hint--bottom-left:before{border-bottom-color:#458746}.art-video-player .hint--success.hint--bottom-right:before{border-bottom-color:#458746}.art-video-player .hint--success.hint--bottom:before{border-bottom-color:#458746}.art-video-player .hint--success.hint--left:before{border-left-color:#458746}.art-video-player .hint--success.hint--right:before{border-right-color:#458746}.art-video-player .hint--always:after,.art-video-player .hint--always:before{opacity:1;visibility:visible}.art-video-player .hint--always.hint--top:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--always.hint--top:after{-webkit-transform:translateX(-50%) translateY(-8px);-moz-transform:translateX(-50%) translateY(-8px);transform:translate(-50%) translateY(-8px)}.art-video-player .hint--always.hint--top-left:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--always.hint--top-left:after{-webkit-transform:translateX(-100%) translateY(-8px);-moz-transform:translateX(-100%) translateY(-8px);transform:translate(-100%) translateY(-8px)}.art-video-player .hint--always.hint--top-right:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--always.hint--top-right:after{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--always.hint--bottom:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--always.hint--bottom:after{-webkit-transform:translateX(-50%) translateY(8px);-moz-transform:translateX(-50%) translateY(8px);transform:translate(-50%) translateY(8px)}.art-video-player .hint--always.hint--bottom-left:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--always.hint--bottom-left:after{-webkit-transform:translateX(-100%) translateY(8px);-moz-transform:translateX(-100%) translateY(8px);transform:translate(-100%) translateY(8px)}.art-video-player .hint--always.hint--bottom-right:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--always.hint--bottom-right:after{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--always.hint--left:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translate(-8px)}.art-video-player .hint--always.hint--left:after{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translate(-8px)}.art-video-player .hint--always.hint--right:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translate(8px)}.art-video-player .hint--always.hint--right:after{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translate(8px)}.art-video-player .hint--rounded:after{border-radius:4px}.art-video-player .hint--no-animate:before,.art-video-player .hint--no-animate:after{-webkit-transition-duration:0ms;-moz-transition-duration:0ms;transition-duration:0ms}.art-video-player .hint--bounce:before,.art-video-player .hint--bounce:after{-webkit-transition:opacity .3s ease,visibility .3s ease,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s ease,visibility .3s ease,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s ease,visibility .3s ease,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.art-video-player .hint--no-shadow:before,.art-video-player .hint--no-shadow:after{text-shadow:initial;box-shadow:initial}.art-video-player .hint--no-arrow:before{display:none}.art-video-player.art-mobile{--art-bottom-gap: 10px;--art-control-height: 38px;--art-control-icon-scale: 1;--art-state-size: 60px;--art-settings-max-height: 180px;--art-selector-max-height: 180px;--art-indicator-scale: 1;--art-control-opacity: 1}.art-video-player.art-mobile .art-controls-left{margin-left:calc(var(--art-padding) / -1)}.art-video-player.art-mobile .art-controls-right{margin-right:calc(var(--art-padding) / -1)}';class re extends xt{constructor(t){super(t),this.name=\"subtitle\",this.option=null,this.destroyEvent=()=>null,this.init(t.option.subtitle);let e=!1;t.on(\"video:timeupdate\",()=>{if(!this.url)return;const t=this.art.template.$video.webkitDisplayingFullscreen;\"boolean\"===typeof t&&t!==e&&(e=t,this.createTrack(t?\"subtitles\":\"metadata\",this.url))})}get url(){return this.art.template.$track.src}set url(t){this.switch(t)}get textTrack(){var t,e;return null==(e=null==(t=this.art.template.$video)?void 0:t.textTracks)?void 0:e[0]}get activeCues(){return this.textTrack?Array.from(this.textTrack.activeCues):[]}get cues(){return this.textTrack?Array.from(this.textTrack.cues):[]}style(t,e){const{$subtitle:r}=this.art.template;return\"object\"===typeof t?P(r,t):I(r,t,e)}update(){const{option:{subtitle:t},template:{$subtitle:e}}=this.art;e.innerHTML=\"\",this.activeCues.length&&(this.art.emit(\"subtitleBeforeUpdate\",this.activeCues),e.innerHTML=this.activeCues.map((e,r)=>e.text.split(/\\r?\\n/).filter(t=>t.trim()).map(e=>`<div class=\"art-subtitle-line\" data-group=\"${r}\">\\n                                ${t.escape?Q(e):e}\\n                            </div>`).join(\"\")).join(\"\"),this.art.emit(\"subtitleAfterUpdate\",this.activeCues))}switch(t){return d(this,arguments,function*(t,e={}){const{i18n:r,notice:o,option:a}=this.art,n=c(l(l({},a.subtitle),e),{url:t}),i=yield this.init(n);return e.name&&(o.show=`${r.get(\"Switch Subtitle\")}: ${e.name}`),i})}createTrack(t,e){const{template:r,proxy:o,option:a}=this.art,{$video:n,$track:i}=r,s=D(\"track\");s.default=!0,s.kind=t,s.src=e,s.label=a.subtitle.name||\"Artplayer\",s.track.mode=\"hidden\",s.onload=()=>{this.art.emit(\"subtitleLoad\",this.cues,this.option)},this.art.events.remove(this.destroyEvent),i.onload=null,M(i),S(n,s),r.$track=s,this.destroyEvent=o(this.textTrack,\"cuechange\",()=>this.update())}init(t){return d(this,null,function*(){const{notice:e,template:{$subtitle:r}}=this.art;return this.textTrack?(f(t,wt.subtitle),t.url?(this.option=t,this.style(t.style),fetch(t.url).then(t=>t.arrayBuffer()).then(e=>{const r=new TextDecoder(t.encoding).decode(e);switch(t.type||X(t.url)){case\"srt\":{const e=nt(r);return it(t.onVttLoad(e))}case\"ass\":{const e=st(r);return it(t.onVttLoad(e))}case\"vtt\":return it(t.onVttLoad(r));default:return t.url}}).then(t=>(r.innerHTML=\"\",this.url===t||(URL.revokeObjectURL(this.url),this.createTrack(\"metadata\",t)),t)).catch(t=>{throw r.innerHTML=\"\",e.show=t,t})):void 0):null})}}class oe{constructor(t){this.art=t;const{option:e,constructor:r}=t;e.container instanceof Element?this.$container=e.container:(this.$container=T(e.container),q(this.$container,`No container element found by ${e.container}`)),q(B(),\"The current browser does not support flex layout\");const o=this.$container.tagName.toLowerCase();q(\"div\"===o,`Unsupported container element type, only support 'div' but got '${o}'`),q(r.instances.every(t=>t.template.$container!==this.$container),\"Cannot mount multiple instances on the same dom element\"),this.query=this.query.bind(this),this.$container.dataset.artId=t.id,this.init()}static get html(){return`\\n          <div class=\"art-video-player art-subtitle-show art-layer-show art-control-show art-mask-show\">\\n            <video class=\"art-video\">\\n              <track default kind=\"metadata\" src=\"\"></track>\\n            </video>\\n            <div class=\"art-poster\"></div>\\n            <div class=\"art-subtitle\"></div>\\n            <div class=\"art-danmuku\"></div>\\n            <div class=\"art-layers\"></div>\\n            <div class=\"art-mask\">\\n              <div class=\"art-state\"></div>\\n            </div>\\n            <div class=\"art-bottom\">\\n              <div class=\"art-progress\"></div>\\n              <div class=\"art-controls\">\\n                <div class=\"art-controls-left\"></div>\\n                <div class=\"art-controls-center\"></div>\\n                <div class=\"art-controls-right\"></div>\\n              </div>\\n            </div>\\n            <div class=\"art-loading\"></div>\\n            <div class=\"art-notice\">\\n              <div class=\"art-notice-inner\"></div>\\n            </div>\\n            <div class=\"art-settings\"></div>\\n            <div class=\"art-info\">\\n              <div class=\"art-info-panel\">\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Player version:</div>\\n                  <div class=\"art-info-content\">${g}</div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video url:</div>\\n                  <div class=\"art-info-content\" data-video=\"currentSrc\"></div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video volume:</div>\\n                  <div class=\"art-info-content\" data-video=\"volume\"></div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video time:</div>\\n                  <div class=\"art-info-content\" data-video=\"currentTime\"></div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video duration:</div>\\n                  <div class=\"art-info-content\" data-video=\"duration\"></div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video resolution:</div>\\n                  <div class=\"art-info-content\">\\n                    <span data-video=\"videoWidth\"></span> x <span data-video=\"videoHeight\"></span>\\n                  </div>\\n                </div>\\n              </div>\\n              <div class=\"art-info-close\">[x]</div>\\n            </div>\\n            <div class=\"art-contextmenus\"></div>\\n          </div>\\n        `}query(t){return T(t,this.$container)}init(){const{option:t}=this.art;if(t.useSSR||(this.$container.innerHTML=oe.html),this.$player=this.query(\".art-video-player\"),this.$video=this.query(\".art-video\"),this.$track=this.query(\"track\"),this.$poster=this.query(\".art-poster\"),this.$subtitle=this.query(\".art-subtitle\"),this.$danmuku=this.query(\".art-danmuku\"),this.$bottom=this.query(\".art-bottom\"),this.$progress=this.query(\".art-progress\"),this.$controls=this.query(\".art-controls\"),this.$controlsLeft=this.query(\".art-controls-left\"),this.$controlsCenter=this.query(\".art-controls-center\"),this.$controlsRight=this.query(\".art-controls-right\"),this.$layer=this.query(\".art-layers\"),this.$loading=this.query(\".art-loading\"),this.$notice=this.query(\".art-notice\"),this.$noticeInner=this.query(\".art-notice-inner\"),this.$mask=this.query(\".art-mask\"),this.$state=this.query(\".art-state\"),this.$setting=this.query(\".art-settings\"),this.$info=this.query(\".art-info\"),this.$infoPanel=this.query(\".art-info-panel\"),this.$infoClose=this.query(\".art-info-close\"),this.$contextmenu=this.query(\".art-contextmenus\"),t.proxy){const e=t.proxy.call(this.art,this.art);q(e instanceof HTMLVideoElement||e instanceof HTMLCanvasElement,\"Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'\"),Y(e,this.$video),e.className=\"art-video\",this.$video=e}t.backdrop&&C(this.$player,\"art-backdrop\"),k&&C(this.$player,\"art-mobile\")}destroy(t){t?this.$container.innerHTML=\"\":C(this.$player,\"art-destroy\")}}class ae{on(t,e,r){const o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:r}),this}once(t,e,r){const o=this;function a(...n){o.off(t,a),e.apply(r,n)}return a._=e,this.on(t,a,r)}emit(t,...e){const r=((this.e||(this.e={}))[t]||[]).slice();for(let o=0;o<r.length;o+=1)r[o].fn.apply(r[o].ctx,e);return this}off(t,e){const r=this.e||(this.e={}),o=r[t],a=[];if(o&&e)for(let n=0,i=o.length;n<i;n+=1)o[n].fn!==e&&o[n].fn._!==e&&a.push(o[n]);return a.length?r[t]=a:delete r[t],this}}let ne=0;const ie=[];class se extends ae{constructor(t,e){if(super(),!$)throw new Error(\"Artplayer can only be used in the browser environment\");this.id=++ne;const r=at(se.option,t);if(r.container=t.container,this.option=f(r,wt),this.isLock=!1,this.isReady=!1,this.isFocus=!1,this.isInput=!1,this.isRotate=!1,this.isDestroy=!1,this.template=new oe(this),this.events=new Lt(this),this.storage=new te(this),this.icons=new Pt(this),this.i18n=new It(this),this.notice=new Vt(this),this.player=new Ut(this),this.layers=new Ot(this),this.controls=new Ct(this),this.contextmenu=new kt(this),this.subtitle=new re(this),this.info=new At(this),this.loading=new Rt(this),this.hotkey=new St(this),this.mask=new _t(this),this.setting=new Qt(this),this.plugins=new Jt(this),\"function\"===typeof e&&this.on(\"ready\",()=>e.call(this,this)),se.DEBUG){const t=t=>console.log(`[ART.${this.id}] -> ${t}`);t(`Version@${se.version}`);for(let e=0;e<v.events.length;e++)this.on(`video:${v.events[e]}`,e=>t(`Event@${e.type}`))}ie.push(this)}static get instances(){return ie}static get version(){return g}static get config(){return v}static get utils(){return pt}static get scheme(){return wt}static get Emitter(){return ae}static get validator(){return f}static get kindOf(){return f.kindOf}static get html(){return oe.html}static get option(){return{id:\"\",container:\"#artplayer\",url:\"\",poster:\"\",type:\"\",theme:\"#f00\",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,gesture:!0,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,proxy:void 0,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:\"\",number:60,column:10,width:0,height:0,scale:1},subtitle:{url:\"\",type:\"\",style:{},name:\"\",escape:!0,encoding:\"utf-8\",onVttLoad:t=>t},moreVideoAttr:{controls:!1,preload:b?\"auto\":\"metadata\"},i18n:{},icons:{},cssVar:{},customType:{},lang:null==navigator?void 0:navigator.language.toLowerCase()}}get proxy(){return this.events.proxy}get query(){return this.template.query}get video(){return this.template.$video}reset(){this.video.removeAttribute(\"src\"),this.video.load()}destroy(t=!0){se.REMOVE_SRC_WHEN_DESTROY&&this.reset(),this.events.destroy(),this.template.destroy(t),ie.splice(ie.indexOf(this),1),this.isDestroy=!0,this.emit(\"destroy\")}}return se.STYLE=ee,se.DEBUG=!1,se.CONTEXTMENU=!0,se.NOTICE_TIME=2e3,se.SETTING_WIDTH=250,se.SETTING_ITEM_WIDTH=200,se.SETTING_ITEM_HEIGHT=35,se.RESIZE_TIME=200,se.SCROLL_TIME=200,se.SCROLL_GAP=50,se.AUTO_PLAYBACK_MAX=10,se.AUTO_PLAYBACK_MIN=5,se.AUTO_PLAYBACK_TIMEOUT=3e3,se.RECONNECT_TIME_MAX=5,se.RECONNECT_SLEEP_TIME=1e3,se.CONTROL_HIDE_TIME=3e3,se.DBCLICK_TIME=300,se.DBCLICK_FULLSCREEN=!0,se.MOBILE_DBCLICK_PLAY=!0,se.MOBILE_CLICK_PLAY=!1,se.AUTO_ORIENTATION_TIME=200,se.INFO_LOOP_TIME=1e3,se.FAST_FORWARD_VALUE=3,se.FAST_FORWARD_TIME=1e3,se.TOUCH_MOVE_RATIO=.5,se.VOLUME_STEP=.1,se.SEEK_STEP=5,se.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],se.ASPECT_RATIO=[\"default\",\"4:3\",\"16:9\"],se.FLIP=[\"normal\",\"horizontal\",\"vertical\"],se.FULLSCREEN_WEB_IN_BODY=!0,se.LOG_VERSION=!0,se.USE_RAF=!1,se.REMOVE_SRC_WHEN_DESTROY=!0,$&&(F(\"artplayer-style\",ee),setTimeout(()=>{se.LOG_VERSION&&console.log(`%c ArtPlayer %c ${se.version} %c https://artplayer.org`,\"color: #fff; background: #5f5f5f\",\"color: #fff; background: #4bc729\",\"\")},100)),se});\n+!function(t,e){\"object\"===typeof exports&&\"undefined\"!==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?(t.Artplayer=e(),define(function(){return t.Artplayer})):(t=\"undefined\"!==typeof globalThis?globalThis:t||self).Artplayer=e()}(this,function(){\"use strict\";var t,e=Object.defineProperty,r=Object.defineProperties,o=Object.getOwnPropertyDescriptors,a=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable,s=(t,r,o)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[r]=o,l=(t,e)=>{for(var r in e||(e={}))n.call(e,r)&&s(t,r,e[r]);if(a)for(var r of a(e))i.call(e,r)&&s(t,r,e[r]);return t},c=(t,e)=>r(t,o(e)),d=(t,e,r)=>new Promise((o,a)=>{var n=t=>{try{s(r.next(t))}catch(e){a(e)}},i=t=>{try{s(r.throw(t))}catch(e){a(e)}},s=t=>t.done?o(t.value):Promise.resolve(t.value).then(n,i);s((r=r.apply(t,e)).next())});function p(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,\"default\")?t.default:t}var h,u={exports:{}};var m=(h||(h=1,u.exports=function(){function t(e){return(t=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t})(e)}var e=Object.prototype.toString,r=function(r){if(void 0===r)return\"undefined\";if(null===r)return\"null\";var a=t(r);if(\"boolean\"===a)return\"boolean\";if(\"string\"===a)return\"string\";if(\"number\"===a)return\"number\";if(\"symbol\"===a)return\"symbol\";if(\"function\"===a)return\"GeneratorFunction\"===o(r)?\"generatorfunction\":\"function\";if(function(t){return Array.isArray?Array.isArray(t):t instanceof Array}(r))return\"array\";if(function(t){return!(!t.constructor||\"function\"!=typeof t.constructor.isBuffer)&&t.constructor.isBuffer(t)}(r))return\"buffer\";if(function(t){try{if(\"number\"==typeof t.length&&\"function\"==typeof t.callee)return!0}catch(e){if(-1!==e.message.indexOf(\"callee\"))return!0}return!1}(r))return\"arguments\";if(function(t){return t instanceof Date||\"function\"==typeof t.toDateString&&\"function\"==typeof t.getDate&&\"function\"==typeof t.setDate}(r))return\"date\";if(function(t){return t instanceof Error||\"string\"==typeof t.message&&t.constructor&&\"number\"==typeof t.constructor.stackTraceLimit}(r))return\"error\";if(function(t){return t instanceof RegExp||\"string\"==typeof t.flags&&\"boolean\"==typeof t.ignoreCase&&\"boolean\"==typeof t.multiline&&\"boolean\"==typeof t.global}(r))return\"regexp\";switch(o(r)){case\"Symbol\":return\"symbol\";case\"Promise\":return\"promise\";case\"WeakMap\":return\"weakmap\";case\"WeakSet\":return\"weakset\";case\"Map\":return\"map\";case\"Set\":return\"set\";case\"Int8Array\":return\"int8array\";case\"Uint8Array\":return\"uint8array\";case\"Uint8ClampedArray\":return\"uint8clampedarray\";case\"Int16Array\":return\"int16array\";case\"Uint16Array\":return\"uint16array\";case\"Int32Array\":return\"int32array\";case\"Uint32Array\":return\"uint32array\";case\"Float32Array\":return\"float32array\";case\"Float64Array\":return\"float64array\"}if(function(t){return\"function\"==typeof t.throw&&\"function\"==typeof t.return&&\"function\"==typeof t.next}(r))return\"generator\";switch(a=e.call(r)){case\"[object Object]\":return\"object\";case\"[object Map Iterator]\":return\"mapiterator\";case\"[object Set Iterator]\":return\"setiterator\";case\"[object String Iterator]\":return\"stringiterator\";case\"[object Array Iterator]\":return\"arrayiterator\"}return a.slice(8,-1).toLowerCase().replace(/\\s/g,\"\")};function o(t){return t.constructor?t.constructor.name:null}function a(t,e){var o=2<arguments.length&&void 0!==arguments[2]?arguments[2]:[\"option\"];return n(t,e,o),i(t,e,o),function(t,e,o){var s=r(e),l=r(t);if(\"object\"===s){if(\"object\"!==l)throw new Error(\"[Type Error]: '\".concat(o.join(\".\"),\"' require 'object' type, but got '\").concat(l,\"'\"));Object.keys(e).forEach(function(r){var s=t[r],l=e[r],c=o.slice();c.push(r),n(s,l,c),i(s,l,c),a(s,l,c)})}if(\"array\"===s){if(\"array\"!==l)throw new Error(\"[Type Error]: '\".concat(o.join(\".\"),\"' require 'array' type, but got '\").concat(l,\"'\"));t.forEach(function(r,s){var l=t[s],c=e[s]||e[0],d=o.slice();d.push(s),n(l,c,d),i(l,c,d),a(l,c,d)})}}(t,e,o),t}function n(t,e,o){if(\"string\"===r(e)){var a=r(t);if(\"?\"===e[0]&&(e=e.slice(1)+\"|undefined\"),!(-1<e.indexOf(\"|\")?e.split(\"|\").map(function(t){return t.toLowerCase().trim()}).filter(Boolean).some(function(t){return a===t}):e.toLowerCase().trim()===a))throw new Error(\"[Type Error]: '\".concat(o.join(\".\"),\"' require '\").concat(e,\"' type, but got '\").concat(a,\"'\"))}}function i(t,e,o){if(\"function\"===r(e)){var a=e(t,r(t),o);if(!0!==a){var n=r(a);throw\"string\"===n?new Error(a):\"error\"===n?a:new Error(\"[Validator Error]: The scheme for '\".concat(o.join(\".\"),\"' validator require return true, but got '\").concat(a,\"'\"))}}}return a.kindOf=r,a}()),u.exports);const f=p(m),g=\"5.4.0\",v={properties:[\"audioTracks\",\"autoplay\",\"buffered\",\"controller\",\"controls\",\"crossOrigin\",\"currentSrc\",\"currentTime\",\"defaultMuted\",\"defaultPlaybackRate\",\"duration\",\"ended\",\"error\",\"loop\",\"mediaGroup\",\"muted\",\"networkState\",\"paused\",\"playbackRate\",\"played\",\"preload\",\"readyState\",\"seekable\",\"seeking\",\"src\",\"startDate\",\"textTracks\",\"videoTracks\",\"volume\"],methods:[\"addTextTrack\",\"canPlayType\",\"load\",\"play\",\"pause\"],events:[\"abort\",\"canplay\",\"canplaythrough\",\"durationchange\",\"emptied\",\"ended\",\"error\",\"loadeddata\",\"loadedmetadata\",\"loadstart\",\"pause\",\"play\",\"playing\",\"progress\",\"ratechange\",\"seeked\",\"seeking\",\"stalled\",\"suspend\",\"timeupdate\",\"volumechange\",\"waiting\"],prototypes:[\"width\",\"height\",\"videoWidth\",\"videoHeight\",\"poster\",\"webkitDecodedFrameCount\",\"webkitDroppedFrameCount\",\"playsInline\",\"webkitSupportsFullscreen\",\"webkitDisplayingFullscreen\",\"onenterpictureinpicture\",\"onleavepictureinpicture\",\"disablePictureInPicture\",\"cancelVideoFrameCallback\",\"requestVideoFrameCallback\",\"getVideoPlaybackQuality\",\"requestPictureInPicture\",\"webkitEnterFullScreen\",\"webkitEnterFullscreen\",\"webkitExitFullScreen\",\"webkitExitFullscreen\"]},y=null!=(t=null==globalThis?void 0:globalThis.CUSTOM_USER_AGENT)?t:\"undefined\"!==typeof navigator?navigator.userAgent:\"\",b=/^(?:(?!chrome|android).)*safari/i.test(y),w=/iPad|iPhone|iPod/i.test(y)&&!window.MSStream,x=w||y.includes(\"Macintosh\")&&navigator.maxTouchPoints>=1,k=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(y)||x,$=\"undefined\"!==typeof window&&\"undefined\"!==typeof document;function T(t,e=document){return e.querySelector(t)}function E(t,e=document){return Array.from(e.querySelectorAll(t))}function C(t,e){return t.classList.add(e)}function z(t,e){return t.classList.remove(e)}function L(t,e){return t.classList.contains(e)}function S(t,e){return e instanceof Element?t.appendChild(e):t.insertAdjacentHTML(\"beforeend\",String(e)),t.lastElementChild||t.lastChild}function M(t){return t.parentNode.removeChild(t)}function I(t,e,r){return t.style[e]=r,t}function P(t,e){for(const r in e)I(t,r,e[r]);return t}function A(t){return Array.from(t.parentElement.children).filter(e=>e!==t)}function O(t,e){A(t).forEach(t=>z(t,e)),C(t,e)}function R(t,e,r=\"top\"){k||(t.setAttribute(\"aria-label\",e),C(t,\"hint--rounded\"),C(t,`hint--${r}`))}function _(t,e=0){const r=t.getBoundingClientRect(),o=window.innerHeight||document.documentElement.clientHeight,a=window.innerWidth||document.documentElement.clientWidth,n=r.top-e<=o&&r.top+r.height+e>=0,i=r.left-e<=a+e&&r.left+r.width+e>=0;return n&&i}function V(t,e){return j(t).includes(e)}function Y(t,e){return e.parentNode.replaceChild(t,e),t}function D(t){return document.createElement(t)}function N(t=\"\",e=\"\"){const r=D(\"i\");return C(r,\"art-icon\"),C(r,`art-icon-${t}`),S(r,e),r}function F(t,e){let r=document.getElementById(t);r||(r=document.createElement(\"style\"),r.id=t,\"loading\"===document.readyState?document.addEventListener(\"DOMContentLoaded\",()=>{document.head.appendChild(r)}):(document.head||document.documentElement).appendChild(r)),r.textContent=e}function B(){const t=document.createElement(\"div\");return t.style.display=\"flex\",\"flex\"===t.style.display}function H(t){return t.getBoundingClientRect()}function W(t,e){return new Promise((r,o)=>{const a=new Image;a.onload=function(){if(e&&1!==e){const n=document.createElement(\"canvas\"),i=n.getContext(\"2d\");n.width=a.width*e,n.height=a.height*e,i.drawImage(a,0,0,n.width,n.height),n.toBlob(e=>{const a=URL.createObjectURL(e),n=new Image;n.onload=function(){r(n)},n.onerror=function(){URL.revokeObjectURL(a),o(new Error(`Image load failed: ${t}`))},n.src=a})}else r(a)},a.onerror=function(){o(new Error(`Image load failed: ${t}`))},a.src=t})}function j(t){if(t.composedPath)return t.composedPath();const e=[];let r=t.target;for(;r;)e.push(r),r=r.parentNode;return e.includes(window)||void 0===window||e.push(window),e}class U extends Error{constructor(t,e){super(t),\"function\"===typeof Error.captureStackTrace&&Error.captureStackTrace(this,e||this.constructor),this.name=\"ArtPlayerError\"}}function q(t,e){if(!t)throw new U(e);return t}function X(t){return t.includes(\"?\")?X(t.split(\"?\")[0]):t.includes(\"#\")?X(t.split(\"#\")[0]):t.trim().toLowerCase().split(\".\").pop()}function G(t,e){const r=document.createElement(\"a\");r.style.display=\"none\",r.href=t,r.download=e,document.body.appendChild(r),r.click(),document.body.removeChild(r)}function K(t,e,r){return Math.max(Math.min(t,Math.max(e,r)),Math.min(e,r))}function Z(t){return t.charAt(0).toUpperCase()+t.slice(1)}function J(t){if(!t)return\"00:00\";const e=Math.floor(t/3600),r=Math.floor((t-3600*e)/60),o=Math.floor(t-3600*e-60*r);return(e>0?[e,r,o]:[r,o]).map(t=>t<10?`0${t}`:String(t)).join(\":\")}function Q(t){return t.replace(/[&<>'\"]/g,t=>({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",\"'\":\"&#39;\",'\"':\"&quot;\"}[t]||t))}const tt=Object.defineProperty,{hasOwnProperty:et}=Object.prototype;function rt(t,e){return et.call(t,e)}function ot(t,e){return Object.getOwnPropertyDescriptor(t,e)}function at(...t){const e=t=>t&&\"object\"===typeof t&&!Array.isArray(t);return t.reduce((t,r)=>(Object.keys(r).forEach(o=>{const a=t[o],n=r[o];Array.isArray(a)&&Array.isArray(n)?t[o]=a.concat(...n):e(a)&&e(n)?t[o]=at(a,n):t[o]=n}),t),{})}function nt(t){return\"WEBVTT \\r\\n\\r\\n\".concat((e=t,e.replace(/(\\d\\d:\\d\\d:\\d\\d)[,.](\\d+)/g,(t,e,r)=>{let o=r.slice(0,3);return 1===r.length&&(o=`${r}00`),2===r.length&&(o=`${r}0`),`${e},${o}`})).replace(/\\{\\\\([ibu])\\}/g,\"</$1>\").replace(/\\{\\\\([ibu])1\\}/g,\"<$1>\").replace(/\\{([ibu])\\}/g,\"<$1>\").replace(/\\{\\/([ibu])\\}/g,\"</$1>\").replace(/(\\d\\d:\\d\\d:\\d\\d),(\\d\\d\\d)/g,\"$1.$2\").replace(/\\{[\\s\\S]*?\\}/g,\"\").concat(\"\\r\\n\\r\\n\"));var e}function it(t){return URL.createObjectURL(new Blob([t],{type:\"text/vtt\"}))}function st(t){const e=new RegExp(\"Dialogue:\\\\s\\\\d,(\\\\d+:\\\\d\\\\d:\\\\d\\\\d.\\\\d\\\\d),(\\\\d+:\\\\d\\\\d:\\\\d\\\\d.\\\\d\\\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\\\s\\\\S]*)$\",\"i\");function r(t=\"\"){return t.split(/[:.]/).map((t,e,r)=>{if(e===r.length-1){if(1===t.length)return`.${t}00`;if(2===t.length)return`.${t}0`}else if(1===t.length)return(0===e?\"0\":\":0\")+t;return 0===e?t:e===r.length-1?`.${t}`:`:${t}`}).join(\"\")}return`WEBVTT\\n\\n${t.split(/\\r?\\n/).map(t=>{const o=t.match(e);return o?{start:r(o[1].trim()),end:r(o[2].trim()),text:o[5].replace(/\\{[\\s\\S]*?\\}/g,\"\").replace(/(\\\\N)/g,\"\\n\").trim().split(/\\r?\\n/).map(t=>t.trim()).join(\"\\n\")}:null}).filter(t=>t).map((t,e)=>t?`${e+1}\\n${t.start} --\\x3e ${t.end}\\n${t.text}`:\"\").filter(t=>t.trim()).join(\"\\n\\n\")}`}function lt(t=0){return new Promise(e=>setTimeout(e,t))}function ct(t,e){let r;return function(...o){clearTimeout(r),r=setTimeout(()=>(r=null,t.apply(this,o)),e)}}function dt(t,e){let r=!1;return function(...o){r||(t.apply(this,o),r=!0,setTimeout(()=>{r=!1},e))}}const pt=Object.freeze(Object.defineProperty({__proto__:null,ArtPlayerError:U,addClass:C,append:S,assToVtt:st,capitalize:Z,clamp:K,createElement:D,debounce:ct,def:tt,download:G,errorHandle:q,escape:Q,get:ot,getComposedPath:j,getExt:X,getIcon:N,getRect:H,getStyle:function(t,e,r=!0){const o=window.getComputedStyle(t,null).getPropertyValue(e);return r?Number.parseFloat(o):o},has:rt,hasClass:L,includeFromEvent:V,inverseClass:O,isBrowser:$,isIOS:w,isIOS13:x,isInViewport:_,isMobile:k,isSafari:b,loadImg:W,mergeDeep:at,query:T,queryAll:E,remove:M,removeClass:z,replaceElement:Y,secondToTime:J,setStyle:I,setStyleText:F,setStyles:P,siblings:A,sleep:lt,srtToVtt:nt,supportsFlex:B,throttle:dt,tooltip:R,unescape:function(t){const e={\"&amp;\":\"&\",\"&lt;\":\"<\",\"&gt;\":\">\",\"&#39;\":\"'\",\"&quot;\":'\"'},r=new RegExp(`(${Object.keys(e).join(\"|\")})`,\"g\");return t.replace(r,t=>e[t]||t)},userAgent:y,vttToBlob:it},Symbol.toStringTag,{value:\"Module\"})),ht=\"array\",ut=\"boolean\",mt=\"string\",ft=\"number\",gt=\"object\",vt=\"function\";function yt(t,e,r){return q(e===mt||e===ft||t instanceof Element,`${r.join(\".\")} require '${mt}' or 'Element' type`)}const bt={html:yt,disable:`?${ut}`,name:`?${mt}`,index:`?${ft}`,style:`?${gt}`,click:`?${vt}`,mounted:`?${vt}`,tooltip:`?${mt}|${ft}`,width:`?${ft}`,selector:`?${ht}`,onSelect:`?${vt}`,switch:`?${ut}`,onSwitch:`?${vt}`,range:`?${ht}`,onRange:`?${vt}`,onChange:`?${vt}`},wt={id:mt,container:yt,url:mt,poster:mt,type:mt,theme:mt,lang:mt,volume:ft,isLive:ut,muted:ut,autoplay:ut,autoSize:ut,autoMini:ut,loop:ut,flip:ut,playbackRate:ut,aspectRatio:ut,screenshot:ut,setting:ut,hotkey:ut,pip:ut,mutex:ut,backdrop:ut,fullscreen:ut,fullscreenWeb:ut,subtitleOffset:ut,miniProgressBar:ut,useSSR:ut,playsInline:ut,lock:ut,gesture:ut,fastForward:ut,autoPlayback:ut,autoOrientation:ut,airplay:ut,proxy:`?${vt}`,plugins:[vt],layers:[bt],contextmenu:[bt],settings:[bt],controls:[c(l({},bt),{position:(t,e,r)=>{const o=[\"top\",\"left\",\"right\"];return q(o.includes(t),`${r.join(\".\")} only accept ${o.toString()} as parameters`)}})],quality:[{default:`?${ut}`,html:mt,url:mt}],highlight:[{time:ft,text:mt}],thumbnails:{url:mt,number:ft,column:ft,width:ft,height:ft,scale:ft},subtitle:{url:mt,name:mt,type:mt,style:gt,escape:ut,encoding:mt,onVttLoad:vt},moreVideoAttr:gt,i18n:gt,icons:gt,cssVar:gt,customType:gt};class xt{constructor(t){this.id=0,this.art=t,this.cache=new Map,this.add=this.add.bind(this),this.remove=this.remove.bind(this),this.update=this.update.bind(this)}get show(){return L(this.art.template.$player,`art-${this.name}-show`)}set show(t){const{$player:e}=this.art.template,r=`art-${this.name}-show`;t?C(e,r):z(e,r),this.art.emit(this.name,t)}toggle(){this.show=!this.show}add(t){const e=\"function\"===typeof t?t(this.art):t;if(e.html=e.html||\"\",f(e,bt),!this.$parent||!this.name||e.disable)return;const r=e.name||`${this.name}${this.id}`;q(!this.cache.has(r),`Can't add an existing [${r}] to the [${this.name}]`),this.id+=1;const o=D(\"div\");C(o,`art-${this.name}`),C(o,`art-${this.name}-${r}`);const a=Array.from(this.$parent.children);o.dataset.index=e.index||this.id;const n=a.find(t=>Number(t.dataset.index)>=Number(o.dataset.index));n?n.insertAdjacentElement(\"beforebegin\",o):S(this.$parent,o),e.html&&S(o,e.html),e.style&&P(o,e.style),e.tooltip&&R(o,e.tooltip);const i=[];if(e.click){const t=this.art.events.proxy(o,\"click\",t=>{t.preventDefault(),e.click.call(this.art,this,t)});i.push(t)}return e.selector&&[\"left\",\"right\"].includes(e.position)&&this.selector(e,o,i),this[r]=o,this.cache.set(r,{$ref:o,events:i,option:e}),e.mounted&&e.mounted.call(this.art,o),o}remove(t){q(this.cache.has(t),`Can't find [${t}] from the [${this.name}]`);const e=this.cache.get(t);e.option.beforeUnmount&&e.option.beforeUnmount.call(this.art,e.$ref);for(const r of e.events)this.art.events.remove(r);this.cache.delete(t),delete this[t],M(e.$ref)}update(t){if(this.cache.has(t.name)){const e=this.cache.get(t.name);t=Object.assign(e.option,t),this.remove(t.name)}return this.add(t)}}class kt extends xt{constructor(t){super(t),this.name=\"contextmenu\",this.$parent=t.template.$contextmenu,k||this.init()}init(){const{option:t,proxy:e,template:{$player:r,$contextmenu:o}}=this.art;t.playbackRate&&this.add(function(t){return e=>{const{i18n:r,constructor:{PLAYBACK_RATE:o}}=e,a=o.map(t=>`<span data-value=\"${t}\">${1===t?r.get(\"Normal\"):t.toFixed(1)}</span>`).join(\"\");return c(l({},t),{html:`${r.get(\"Play Speed\")}: ${a}`,click:(t,r)=>{const{value:o}=r.target.dataset;o&&(e.playbackRate=Number(o),t.show=!1)},mounted:t=>{const r=T('[data-value=\"1\"]',t);r&&O(r,\"art-current\"),e.on(\"video:ratechange\",()=>{const r=E(\"span\",t).find(t=>Number(t.dataset.value)===e.playbackRate);r&&O(r,\"art-current\")})}})}}({name:\"playbackRate\",index:10})),t.aspectRatio&&this.add(function(t){return e=>{const{i18n:r,constructor:{ASPECT_RATIO:o}}=e,a=o.map(t=>`<span data-value=\"${t}\">${\"default\"===t?r.get(\"Default\"):t}</span>`).join(\"\");return c(l({},t),{html:`${r.get(\"Aspect Ratio\")}: ${a}`,click:(t,r)=>{const{value:o}=r.target.dataset;o&&(e.aspectRatio=o,t.show=!1)},mounted:t=>{const r=T('[data-value=\"default\"]',t);r&&O(r,\"art-current\"),e.on(\"aspectRatio\",e=>{const r=E(\"span\",t).find(t=>t.dataset.value===e);r&&O(r,\"art-current\")})}})}}({name:\"aspectRatio\",index:20})),t.flip&&this.add(function(t){return e=>{const{i18n:r,constructor:{FLIP:o}}=e,a=o.map(t=>`<span data-value=\"${t}\">${r.get(Z(t))}</span>`).join(\"\");return c(l({},t),{html:`${r.get(\"Video Flip\")}: ${a}`,click:(t,r)=>{const{value:o}=r.target.dataset;o&&(e.flip=o.toLowerCase(),t.show=!1)},mounted:t=>{const r=T('[data-value=\"normal\"]',t);r&&O(r,\"art-current\"),e.on(\"flip\",e=>{const r=E(\"span\",t).find(t=>t.dataset.value===e);r&&O(r,\"art-current\")})}})}}({name:\"flip\",index:30})),this.add(function(t){return e=>c(l({},t),{html:e.i18n.get(\"Video Info\"),click:t=>{e.info.show=!0,t.show=!1}})}({name:\"info\",index:40})),this.add(function(t){const e=$?location.href:\"\";return c(l({},t),{html:`<a href=\"https://artplayer.org?ref=${encodeURIComponent(e)}\" target=\"_blank\" style=\"width:100%;\">ArtPlayer ${g}</a>`})}({name:\"version\",index:50})),this.add(function(t){return e=>c(l({},t),{html:e.i18n.get(\"Close\"),click:t=>{t.show=!1}})}({name:\"close\",index:60}));for(let a=0;a<t.contextmenu.length;a++)this.add(t.contextmenu[a]);e(r,\"contextmenu\",t=>{if(!this.art.constructor.CONTEXTMENU)return;t.preventDefault(),this.show=!0;const e=t.clientX,a=t.clientY,{height:n,width:i,left:s,top:l}=H(r),{height:c,width:d}=H(o);let p=e-s,h=a-l;e+d>s+i&&(p=i-d),a+c>l+n&&(h=n-c),P(o,{top:`${h}px`,left:`${p}px`})}),e(r,\"click\",t=>{V(t,o)||(this.show=!1)}),this.art.on(\"blur\",()=>{this.show=!1})}}function $t(t,e){const{$progress:r}=t.template,{left:o}=H(r),a=K((k?e.touches[0].clientX:e.clientX)-o,0,r.clientWidth),n=a/r.clientWidth*t.duration;return{second:n,time:J(n),width:a,percentage:K(a/r.clientWidth,0,1)}}function Tt(t,e){if(t.isRotate){const r=e.touches[0].clientY/t.height,o=r*t.duration;t.emit(\"setBar\",\"played\",r,e),t.seek=o}else{const{second:r,percentage:o}=$t(t,e);t.emit(\"setBar\",\"played\",o,e),t.seek=r}}function Et(t){return e=>{const{icons:r,option:o,proxy:a}=e,{$player:n,$progress:i}=e.template;return c(l({},t),{html:'\\n                <div class=\"art-control-progress-inner\">\\n                    <div class=\"art-progress-hover\"></div>\\n                    <div class=\"art-progress-loaded\"></div>\\n                    <div class=\"art-progress-played\"></div>\\n                    <div class=\"art-progress-highlight\"></div>\\n                    <div class=\"art-progress-indicator\"></div>\\n                    <div class=\"art-progress-tip\">00:00</div>\\n                </div>\\n            ',mounted:t=>{let s=null,l=!1;const c=T(\".art-progress-hover\",t),d=T(\".art-progress-loaded\",t),p=T(\".art-progress-played\",t),h=T(\".art-progress-highlight\",t),u=T(\".art-progress-indicator\",t),m=T(\".art-progress-tip\",t);function f(r,o){const{width:a,time:n}=o||$t(e,r);m.textContent=n||\"00:00\";const i=m.clientWidth;a<=i/2?I(m,\"left\",0):a>t.clientWidth-i/2?I(m,\"left\",t.clientWidth-i+\"px\"):I(m,\"left\",a-i/2+\"px\")}r.indicator?S(u,r.indicator):I(u,\"backgroundColor\",\"var(--art-theme)\"),e.on(\"setBar\",function(r,o,a){const i=\"played\"===r&&a&&k;if(\"loaded\"===r&&I(d,\"width\",100*o+\"%\"),\"hover\"===r&&(I(c,\"width\",100*o+\"%\"),V(a,h)?function(r){const{width:o}=$t(e,r),{text:a}=r.target.dataset;m.textContent=a;const n=m.clientWidth;o<=n/2?I(m,\"left\",0):o>t.clientWidth-n/2?I(m,\"left\",t.clientWidth-n+\"px\"):I(m,\"left\",o-n/2+\"px\")}(a):f(a),0===o?z(n,\"art-progress-hover\"):C(n,\"art-progress-hover\")),\"played\"===r&&(I(p,\"width\",100*o+\"%\"),I(u,\"left\",100*o+\"%\")),i){C(n,\"art-progress-hover\");f(a,{width:t.clientWidth*o,time:J(o*e.duration)}),clearTimeout(s),s=setTimeout(()=>{z(n,\"art-progress-hover\")},500)}}),e.on(\"video:loadedmetadata\",function(){h.textContent=\"\";for(let t=0;t<o.highlight.length;t++){const r=o.highlight[t],a=K(r.time,0,e.duration)/e.duration*100,n=`<span data-text=\"${r.text}\" data-time=\"${r.time}\" style=\"left: ${a}%\"></span>`;S(h,n)}}),e.constructor.USE_RAF?e.on(\"raf\",()=>{e.emit(\"setBar\",\"played\",e.played),e.emit(\"setBar\",\"loaded\",e.loaded)}):(e.on(\"video:timeupdate\",()=>{e.emit(\"setBar\",\"played\",e.played)}),e.on(\"video:progress\",()=>{e.emit(\"setBar\",\"loaded\",e.loaded)}),e.on(\"video:ended\",()=>{e.emit(\"setBar\",\"played\",1)})),e.emit(\"setBar\",\"loaded\",e.loaded||0),k||(a(i,\"click\",t=>{t.target!==u&&Tt(e,t)}),a(i,\"mousemove\",t=>{const{percentage:r}=$t(e,t);e.emit(\"setBar\",\"hover\",r,t)}),a(i,\"mouseleave\",t=>{e.emit(\"setBar\",\"hover\",0,t)}),a(i,\"mousedown\",t=>{l=0===t.button}),e.on(\"document:mousemove\",t=>{if(l){const{second:r,percentage:o}=$t(e,t);e.emit(\"setBar\",\"played\",o,t),e.seek=r}}),e.on(\"document:mouseup\",()=>{l&&(l=!1)}))}})}}class Ct extends xt{constructor(t){super(t),this.isHover=!1,this.name=\"control\",this.timer=Date.now();const{constructor:e}=t,{$player:r,$bottom:o}=this.art.template;t.on(\"mousemove\",()=>{k||(this.show=!0)}),t.on(\"click\",()=>{k?this.toggle():this.show=!0}),t.on(\"document:mousemove\",t=>{this.isHover=V(t,o)}),t.on(\"video:timeupdate\",()=>{!t.setting.show&&!this.isHover&&!t.isInput&&t.playing&&this.show&&Date.now()-this.timer>=e.CONTROL_HIDE_TIME&&(this.show=!1)}),t.on(\"control\",t=>{t?(z(r,\"art-hide-cursor\"),C(r,\"art-hover\"),this.timer=Date.now()):(C(r,\"art-hide-cursor\"),z(r,\"art-hover\"))}),this.init()}init(){const{option:t}=this.art;t.isLive||this.add(Et({name:\"progress\",position:\"top\",index:10})),this.add({name:\"thumbnails\",position:\"top\",index:20}),this.add(function(t){return e=>c(l({},t),{mounted:t=>{const{proxy:r,icons:o,i18n:a}=e,n=S(t,o.play),i=S(t,o.pause);function s(){I(n,\"display\",\"flex\"),I(i,\"display\",\"none\")}function l(){I(n,\"display\",\"none\"),I(i,\"display\",\"flex\")}R(n,a.get(\"Play\")),R(i,a.get(\"Pause\")),r(n,\"click\",()=>{e.play()}),r(i,\"click\",()=>{e.pause()}),e.playing?l():s(),e.on(\"video:playing\",()=>{l()}),e.on(\"video:pause\",()=>{s()})}})}({name:\"playAndPause\",position:\"left\",index:10})),this.add(function(t){return e=>c(l({},t),{mounted:t=>{const{proxy:r,icons:o}=e,a=S(t,o.volume),n=S(t,o.volumeClose),i=S(t,'<div class=\"art-volume-panel\"></div>'),s=S(i,'<div class=\"art-volume-inner\"></div>'),l=S(s,'<div class=\"art-volume-val\"></div>'),c=S(s,'<div class=\"art-volume-slider\"></div>'),d=S(c,'<div class=\"art-volume-handle\"></div>'),p=S(d,'<div class=\"art-volume-loaded\"></div>'),h=S(c,'<div class=\"art-volume-indicator\"></div>');function u(t){const{top:e,height:r}=H(c);return 1-(t.clientY-e)/r}function m(){if(e.muted||0===e.volume)I(a,\"display\",\"none\"),I(n,\"display\",\"flex\"),I(h,\"top\",\"100%\"),I(p,\"top\",\"100%\"),l.textContent=0;else{const t=100*e.volume;I(a,\"display\",\"flex\"),I(n,\"display\",\"none\"),I(h,\"top\",100-t+\"%\"),I(p,\"top\",100-t+\"%\"),l.textContent=Math.floor(t)}}if(m(),e.on(\"video:volumechange\",m),r(a,\"click\",()=>{e.muted=!0}),r(n,\"click\",()=>{e.muted=!1}),k)I(i,\"display\",\"none\");else{let t=!1;r(c,\"mousedown\",r=>{t=0===r.button,e.volume=u(r)}),e.on(\"document:mousemove\",r=>{t&&(e.muted=!1,e.volume=u(r))}),e.on(\"document:mouseup\",()=>{t&&(t=!1)})}}})}({name:\"volume\",position:\"left\",index:20})),t.isLive||this.add(function(t){return e=>c(l({},t),{style:k?{fontSize:\"12px\",padding:\"0 5px\"}:{cursor:\"auto\",padding:\"0 10px\"},mounted:t=>{function r(){const r=`${J(e.currentTime)} / ${J(e.duration)}`;r!==t.textContent&&(t.textContent=r)}r();const o=[\"video:loadedmetadata\",\"video:timeupdate\",\"video:progress\"];for(let a=0;a<o.length;a++)e.on(o[a],r)}})}({name:\"time\",position:\"left\",index:30})),t.quality.length&&lt().then(()=>{this.art.quality=t.quality}),t.screenshot&&!k&&this.add(function(t){return e=>c(l({},t),{tooltip:e.i18n.get(\"Screenshot\"),mounted:t=>{const{proxy:r,icons:o}=e;S(t,o.screenshot),r(t,\"click\",()=>{e.screenshot()})}})}({name:\"screenshot\",position:\"right\",index:20})),t.setting&&this.add(function(t){return e=>c(l({},t),{tooltip:e.i18n.get(\"Show Setting\"),mounted:t=>{const{proxy:r,icons:o,i18n:a}=e;S(t,o.setting),r(t,\"click\",()=>{e.setting.toggle(),e.setting.resize()}),e.on(\"setting\",e=>{R(t,a.get(e?\"Hide Setting\":\"Show Setting\"))})}})}({name:\"setting\",position:\"right\",index:30})),t.pip&&this.add(function(t){return e=>c(l({},t),{tooltip:e.i18n.get(\"PIP Mode\"),mounted:t=>{const{proxy:r,icons:o,i18n:a}=e;S(t,o.pip),r(t,\"click\",()=>{e.pip=!e.pip}),e.on(\"pip\",e=>{R(t,a.get(e?\"Exit PIP Mode\":\"PIP Mode\"))})}})}({name:\"pip\",position:\"right\",index:40})),t.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add(function(t){return e=>c(l({},t),{tooltip:e.i18n.get(\"AirPlay\"),mounted:t=>{const{proxy:r,icons:o}=e;S(t,o.airplay),r(t,\"click\",()=>e.airplay())}})}({name:\"airplay\",position:\"right\",index:50})),t.fullscreenWeb&&this.add(function(t){return e=>c(l({},t),{tooltip:e.i18n.get(\"Web Fullscreen\"),mounted:t=>{const{proxy:r,icons:o,i18n:a}=e,n=S(t,o.fullscreenWebOn),i=S(t,o.fullscreenWebOff);I(i,\"display\",\"none\"),r(t,\"click\",()=>{e.fullscreenWeb=!e.fullscreenWeb}),e.on(\"fullscreenWeb\",e=>{e?(R(t,a.get(\"Exit Web Fullscreen\")),I(n,\"display\",\"none\"),I(i,\"display\",\"inline-flex\")):(R(t,a.get(\"Web Fullscreen\")),I(n,\"display\",\"inline-flex\"),I(i,\"display\",\"none\"))})}})}({name:\"fullscreenWeb\",position:\"right\",index:60})),t.fullscreen&&this.add(function(t){return e=>c(l({},t),{tooltip:e.i18n.get(\"Fullscreen\"),mounted:t=>{const{proxy:r,icons:o,i18n:a}=e,n=S(t,o.fullscreenOn),i=S(t,o.fullscreenOff);I(i,\"display\",\"none\"),r(t,\"click\",()=>{e.fullscreen=!e.fullscreen}),e.on(\"fullscreen\",e=>{e?(R(t,a.get(\"Exit Fullscreen\")),I(n,\"display\",\"none\"),I(i,\"display\",\"inline-flex\")):(R(t,a.get(\"Fullscreen\")),I(n,\"display\",\"inline-flex\"),I(i,\"display\",\"none\"))})}})}({name:\"fullscreen\",position:\"right\",index:70}));for(let e=0;e<t.controls.length;e++)this.add(t.controls[e])}add(t){const e=\"function\"===typeof t?t(this.art):t,{$progress:r,$controlsLeft:o,$controlsRight:a}=this.art.template;switch(e.position){case\"top\":this.$parent=r;break;case\"left\":this.$parent=o;break;case\"right\":this.$parent=a;break;default:q(!1,\"Control option.position must one of 'top', 'left', 'right'\")}super.add(e)}check(t){if(t){t.$control_value.innerHTML=t.html;for(let e=0;e<t.$control_option.length;e++){const r=t.$control_option[e];r.default=r===t,r.default&&O(r.$control_item,\"art-current\")}}}selector(t,e,r){const{proxy:o}=this.art.events;C(e,\"art-control-selector\");const a=D(\"div\");C(a,\"art-selector-value\"),S(a,t.html),e.textContent=\"\",S(e,a);const n=D(\"div\");C(n,\"art-selector-list\"),S(e,n);for(let s=0;s<t.selector.length;s++){const e=t.selector[s],r=D(\"div\");C(r,\"art-selector-item\"),e.default&&C(r,\"art-current\"),r.dataset.index=s,r.dataset.value=e.value,r.innerHTML=e.html,S(n,r),tt(e,\"$control_option\",{get:()=>t.selector}),tt(e,\"$control_item\",{get:()=>r}),tt(e,\"$control_value\",{get:()=>a})}const i=o(n,\"click\",e=>d(this,null,function*(){const r=j(e),o=t.selector.find(t=>t.$control_item===r.find(e=>t.$control_item===e));this.check(o),t.onSelect&&(a.innerHTML=yield t.onSelect.call(this.art,o,o.$control_item,e))}));r.push(i)}}function zt(t,e,r,o){const a=e-o,n=r-t;let i=0;if(Math.abs(n)<2&&Math.abs(a)<2)return i;const s=function(t,e){return 180*Math.atan2(e,t)/Math.PI}(n,a);return s>=-45&&s<45?i=4:s>=45&&s<135?i=1:s>=-135&&s<-45?i=2:(s>=135&&s<=180||s>=-180&&s<-135)&&(i=3),i}class Lt{constructor(t){this.destroyEvents=new Set,this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),function(t,e){const{constructor:r,template:{$player:o,$video:a}}=t;function n(e){V(e,o)?(t.isInput=\"INPUT\"===e.target.tagName,t.isFocus=!0,t.emit(\"focus\",e)):(t.isInput=!1,t.isFocus=!1,t.emit(\"blur\",e))}t.on(\"document:click\",n),t.on(\"document:contextmenu\",n);let i=[];e.proxy(a,\"click\",e=>{const o=Date.now();i.push(o);const{MOBILE_CLICK_PLAY:a,DBCLICK_TIME:n,MOBILE_DBCLICK_PLAY:s,DBCLICK_FULLSCREEN:l}=r,c=i.filter(t=>o-t<=n);switch(c.length){case 1:t.emit(\"click\",e),k?!t.isLock&&a&&t.toggle():t.toggle(),i=c;break;case 2:t.emit(\"dblclick\",e),k?!t.isLock&&s&&t.toggle():l&&(t.fullscreen=!t.fullscreen),i=[];break;default:i=[]}})}(t,this),function(t,e){const{$player:r}=t.template;e.hover(r,e=>{C(r,\"art-hover\"),t.emit(\"hover\",!0,e)},e=>{z(r,\"art-hover\"),t.emit(\"hover\",!1,e)})}(t,this),function(t,e){const{$player:r}=t.template;e.proxy(r,\"mousemove\",e=>{t.emit(\"mousemove\",e)})}(t,this),function(t,e){const{option:r,constructor:o}=t;t.on(\"resize\",()=>{const{aspectRatio:e,notice:o}=t;\"standard\"===t.state&&r.autoSize&&t.autoSize(),t.aspectRatio=e,o.show=\"\"});const a=ct(()=>t.emit(\"resize\"),o.RESIZE_TIME);t.on(\"window:orientationchange\",()=>a()),t.on(\"window:resize\",()=>a()),screen&&screen.orientation&&screen.orientation.onchange&&e.proxy(screen.orientation,\"change\",()=>a())}(t,this),function(t,e){if(k&&!t.option.isLive){const{$video:r,$progress:o}=t.template;let a=null,n=!1,i=0,s=0,l=0;const c=e=>{if(1===e.touches.length&&!t.isLock){a===o&&Tt(t,e),n=!0;const{pageX:r,pageY:c}=e.touches[0];i=r,s=c,l=t.currentTime}},d=e=>{if(1===e.touches.length&&n&&t.duration){const{pageX:o,pageY:n}=e.touches[0],c=zt(i,s,o,n),d=[3,4].includes(c),p=[1,2].includes(c);if(d&&!t.isRotate||p&&t.isRotate){const c=K((o-i)/t.width,-1,1),d=K((n-s)/t.height,-1,1),p=t.isRotate?d:c,h=a===r?t.constructor.TOUCH_MOVE_RATIO:1,u=K(l+t.duration*p*h,0,t.duration);t.seek=u,t.emit(\"setBar\",\"played\",K(u/t.duration,0,1),e),t.notice.show=`${J(u)} / ${J(t.duration)}`}}},p=()=>{n&&(i=0,s=0,l=0,n=!1,a=null)};t.option.gesture&&(e.proxy(r,\"touchstart\",t=>{a=r,c(t)}),e.proxy(r,\"touchmove\",d)),e.proxy(o,\"touchstart\",t=>{a=o,c(t)}),e.proxy(o,\"touchmove\",d),t.on(\"document:touchend\",p)}}(t,this),function(t){const{option:e,constructor:r,template:{$container:o}}=t,a=dt(()=>{t.emit(\"view\",_(o,r.SCROLL_GAP))},r.SCROLL_TIME);t.on(\"window:scroll\",()=>a()),t.on(\"view\",r=>{e.autoMini&&(t.mini=!r)})}(t),function(t,e){const r=[\"click\",\"mouseup\",\"keydown\",\"touchend\",\"touchmove\",\"mousemove\",\"pointerup\",\"contextmenu\",\"pointermove\",\"visibilitychange\",\"webkitfullscreenchange\"],o=[\"resize\",\"scroll\",\"orientationchange\"],a=[];function n(n={}){for(let t=0;t<a.length;t++)e.remove(a[t]);a.length=0;const{$player:i}=t.template;r.forEach(r=>{const o=n.document||i.ownerDocument||document,s=e.proxy(o,r,e=>{t.emit(`document:${r}`,e)});a.push(s)}),o.forEach(r=>{var o;const s=n.window||(null==(o=i.ownerDocument)?void 0:o.defaultView)||window,l=e.proxy(s,r,e=>{t.emit(`window:${r}`,e)});a.push(l)})}n(),e.bindGlobalEvents=n}(t,this),function(t){if(t.constructor.USE_RAF){let e=null;!function r(){t.playing&&t.emit(\"raf\"),t.isDestroy||(e=requestAnimationFrame(r))}(),t.on(\"destroy\",()=>{cancelAnimationFrame(e)})}}(t)}proxy(t,e,r,o={}){if(Array.isArray(e))return e.map(e=>this.proxy(t,e,r,o));t.addEventListener(e,r,o);const a=()=>t.removeEventListener(e,r,o);return this.destroyEvents.add(a),a}hover(t,e,r){e&&this.proxy(t,\"mouseenter\",e),r&&this.proxy(t,\"mouseleave\",r)}remove(t){if(this.destroyEvents.has(t))try{t()}catch(e){console.warn(\"Failed to remove event listener:\",e)}finally{this.destroyEvents.delete(t)}}destroy(){for(const e of this.destroyEvents)try{e()}catch(t){console.warn(\"Failed to destroy event listener:\",t)}this.destroyEvents.clear()}}class St{constructor(t){this.art=t,this.keys={},k||this.init()}init(){const{constructor:t}=this.art;this.art.option.hotkey&&(this.add(\"Escape\",()=>{this.art.fullscreenWeb&&(this.art.fullscreenWeb=!1)}),this.add(\"Space\",()=>{this.art.toggle()}),this.add(\"ArrowLeft\",()=>{this.art.backward=t.SEEK_STEP}),this.add(\"ArrowUp\",()=>{this.art.volume+=t.VOLUME_STEP}),this.add(\"ArrowRight\",()=>{this.art.forward=t.SEEK_STEP}),this.add(\"ArrowDown\",()=>{this.art.volume-=t.VOLUME_STEP})),this.art.on(\"document:keydown\",t=>{if(this.art.isFocus){const e=document.activeElement.tagName.toUpperCase(),r=document.activeElement.getAttribute(\"contenteditable\");if(\"INPUT\"!==e&&\"TEXTAREA\"!==e&&\"\"!==r&&\"true\"!==r&&!t.altKey&&!t.ctrlKey&&!t.metaKey&&!t.shiftKey){const e=this.keys[t.code];if(e){t.preventDefault();for(let r=0;r<e.length;r++)e[r].call(this.art,t);this.art.emit(\"hotkey\",t)}}}this.art.emit(\"keydown\",t)})}add(t,e){return this.keys[t]?this.keys[t].includes(e)||this.keys[t].push(e):this.keys[t]=[e],this}remove(t,e){if(this.keys[t]){const r=this.keys[t].indexOf(e);-1!==r&&this.keys[t].splice(r,1),0===this.keys[t].length&&delete this.keys[t]}return this}}const Mt={\"Video Info\":\"\\u7edf\\u8ba1\\u4fe1\\u606f\",Close:\"\\u5173\\u95ed\",\"Video Load Failed\":\"\\u52a0\\u8f7d\\u5931\\u8d25\",Volume:\"\\u97f3\\u91cf\",Play:\"\\u64ad\\u653e\",Pause:\"\\u6682\\u505c\",Rate:\"\\u901f\\u5ea6\",Mute:\"\\u9759\\u97f3\",\"Video Flip\":\"\\u753b\\u9762\\u7ffb\\u8f6c\",Horizontal:\"\\u6c34\\u5e73\",Vertical:\"\\u5782\\u76f4\",Reconnect:\"\\u91cd\\u65b0\\u8fde\\u63a5\",\"Show Setting\":\"\\u663e\\u793a\\u8bbe\\u7f6e\",\"Hide Setting\":\"\\u9690\\u85cf\\u8bbe\\u7f6e\",Screenshot:\"\\u622a\\u56fe\",\"Play Speed\":\"\\u64ad\\u653e\\u901f\\u5ea6\",\"Aspect Ratio\":\"\\u753b\\u9762\\u6bd4\\u4f8b\",Default:\"\\u9ed8\\u8ba4\",Normal:\"\\u6b63\\u5e38\",Open:\"\\u6253\\u5f00\",\"Switch Video\":\"\\u5207\\u6362\",\"Switch Subtitle\":\"\\u5207\\u6362\\u5b57\\u5e55\",Fullscreen:\"\\u5168\\u5c4f\",\"Exit Fullscreen\":\"\\u9000\\u51fa\\u5168\\u5c4f\",\"Web Fullscreen\":\"\\u7f51\\u9875\\u5168\\u5c4f\",\"Exit Web Fullscreen\":\"\\u9000\\u51fa\\u7f51\\u9875\\u5168\\u5c4f\",\"Mini Player\":\"\\u8ff7\\u4f60\\u64ad\\u653e\\u5668\",\"PIP Mode\":\"\\u5f00\\u542f\\u753b\\u4e2d\\u753b\",\"Exit PIP Mode\":\"\\u9000\\u51fa\\u753b\\u4e2d\\u753b\",\"PIP Not Supported\":\"\\u4e0d\\u652f\\u6301\\u753b\\u4e2d\\u753b\",\"Fullscreen Not Supported\":\"\\u4e0d\\u652f\\u6301\\u5168\\u5c4f\",\"Subtitle Offset\":\"\\u5b57\\u5e55\\u504f\\u79fb\",\"Last Seen\":\"\\u4e0a\\u6b21\\u770b\\u5230\",\"Jump Play\":\"\\u8df3\\u8f6c\\u64ad\\u653e\",AirPlay:\"\\u9694\\u7a7a\\u64ad\\u653e\",\"AirPlay Not Available\":\"\\u9694\\u7a7a\\u64ad\\u653e\\u4e0d\\u53ef\\u7528\"};\"undefined\"!==typeof window&&(window[\"artplayer-i18n-zh-cn\"]=Mt);class It{constructor(t){this.art=t,this.languages={\"zh-cn\":Mt},this.language={},this.update(t.option.i18n)}init(){const t=this.art.option.lang.toLowerCase();this.language=this.languages[t]||{}}get(t){return this.language[t]||t}update(t){this.languages=at(this.languages,t),this.init()}}class Pt{constructor(t){const e=l({loading:'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"50px\" height=\"50px\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid\" class=\"uil-default\">\\n  <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill=\"none\" class=\"bk\"/>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(0 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-1s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(30 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.9166666666666666s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(60 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.8333333333333334s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(90 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.75s\" repeatCount=\"indefinite\"/></rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(120 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.6666666666666666s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(150 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.5833333333333334s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(180 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.5s\" repeatCount=\"indefinite\"/></rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(210 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.4166666666666667s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(240 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.3333333333333333s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(270 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.25s\" repeatCount=\"indefinite\"/></rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(300 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.16666666666666666s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n  <rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" transform=\"rotate(330 50 50) translate(0 -30)\">\\n    <animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.08333333333333333s\" repeatCount=\"indefinite\"/>\\n  </rect>\\n</svg>',state:'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\" viewBox=\"0 0 24 24\">\\n<path d=\"M9.5 9.325v5.35q0 .575.525.875t1.025-.05l4.15-2.65q.475-.3.475-.85t-.475-.85L11.05 8.5q-.5-.35-1.025-.05t-.525.875ZM12 22q-2.075 0-3.9-.788t-3.175-2.137q-1.35-1.35-2.137-3.175T2 12q0-2.075.788-3.9t2.137-3.175q1.35-1.35 3.175-2.137T12 2q2.075 0 3.9.788t3.175 2.137q1.35 1.35 2.138 3.175T22 12q0 2.075-.788 3.9t-2.137 3.175q-1.35 1.35-3.175 2.138T12 22Z\"/>\\n</svg>\\n',play:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n  <path d=\"M17.982 9.275L8.06 3.27A2.013 2.013 0 0 0 5 4.994v12.011a2.017 2.017 0 0 0 3.06 1.725l9.922-6.005a2.017 2.017 0 0 0 0-3.45z\"></path>\\n</svg>',pause:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n    <path d=\"M7 3a2 2 0 0 0-2 2v12a2 2 0 1 0 4 0V5a2 2 0 0 0-2-2zM15 3a2 2 0 0 0-2 2v12a2 2 0 1 0 4 0V5a2 2 0 0 0-2-2z\"></path>\\n</svg>',check:'<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 24 24\" style=\"width: 100%; height: 100%;\">\\n<path d=\"M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z\" />\\n</svg>',volume:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n    <path d=\"M10.188 4.65L6 8H5a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h1l4.188 3.35a.5.5 0 0 0 .812-.39V5.04a.498.498 0 0 0-.812-.39zM14.446 3.778a1 1 0 0 0-.862 1.804 6.002 6.002 0 0 1-.007 10.838 1 1 0 0 0 .86 1.806A8.001 8.001 0 0 0 19 11a8.001 8.001 0 0 0-4.554-7.222z\"></path>\\n    <path d=\"M15 11a3.998 3.998 0 0 0-2-3.465v6.93A3.998 3.998 0 0 0 15 11z\"></path>\\n</svg>',volumeClose:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n    <path d=\"M15 11a3.998 3.998 0 0 0-2-3.465v2.636l1.865 1.865A4.02 4.02 0 0 0 15 11z\"></path>\\n    <path d=\"M13.583 5.583A5.998 5.998 0 0 1 17 11a6 6 0 0 1-.585 2.587l1.477 1.477a8.001 8.001 0 0 0-3.446-11.286 1 1 0 0 0-.863 1.805zM18.778 18.778l-2.121-2.121-1.414-1.414-1.415-1.415L13 13l-2-2-3.889-3.889-3.889-3.889a.999.999 0 1 0-1.414 1.414L5.172 8H5a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h1l4.188 3.35a.5.5 0 0 0 .812-.39v-3.131l2.587 2.587-.01.005a1 1 0 0 0 .86 1.806c.215-.102.424-.214.627-.333l2.3 2.3a1.001 1.001 0 0 0 1.414-1.416zM11 5.04a.5.5 0 0 0-.813-.39L8.682 5.854 11 8.172V5.04z\"></path>\\n</svg>',screenshot:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 50 50\">\\n\\t<path d=\"M 19.402344 6 C 17.019531 6 14.96875 7.679688 14.5 10.011719 L 14.097656 12 L 9 12 C 6.238281 12 4 14.238281 4 17 L 4 38 C 4 40.761719 6.238281 43 9 43 L 41 43 C 43.761719 43 46 40.761719 46 38 L 46 17 C 46 14.238281 43.761719 12 41 12 L 35.902344 12 L 35.5 10.011719 C 35.03125 7.679688 32.980469 6 30.597656 6 Z M 25 17 C 30.519531 17 35 21.480469 35 27 C 35 32.519531 30.519531 37 25 37 C 19.480469 37 15 32.519531 15 27 C 15 21.480469 19.480469 17 25 17 Z M 25 19 C 20.589844 19 17 22.589844 17 27 C 17 31.410156 20.589844 35 25 35 C 29.410156 35 33 31.410156 33 27 C 33 22.589844 29.410156 19 25 19 Z \"/>\\n</svg>\\n',setting:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\">\\n    <circle cx=\"11\" cy=\"11\" r=\"2\"></circle>\\n    <path d=\"M19.164 8.861L17.6 8.6a6.978 6.978 0 0 0-1.186-2.099l.574-1.533a1 1 0 0 0-.436-1.217l-1.997-1.153a1.001 1.001 0 0 0-1.272.23l-1.008 1.225a7.04 7.04 0 0 0-2.55.001L8.716 2.829a1 1 0 0 0-1.272-.23L5.447 3.751a1 1 0 0 0-.436 1.217l.574 1.533A6.997 6.997 0 0 0 4.4 8.6l-1.564.261A.999.999 0 0 0 2 9.847v2.306c0 .489.353.906.836.986l1.613.269a7 7 0 0 0 1.228 2.075l-.558 1.487a1 1 0 0 0 .436 1.217l1.997 1.153c.423.244.961.147 1.272-.23l1.04-1.263a7.089 7.089 0 0 0 2.272 0l1.04 1.263a1 1 0 0 0 1.272.23l1.997-1.153a1 1 0 0 0 .436-1.217l-.557-1.487c.521-.61.94-1.31 1.228-2.075l1.613-.269a.999.999 0 0 0 .835-.986V9.847a.999.999 0 0 0-.836-.986zM11 15a4 4 0 1 1 0-8 4 4 0 0 1 0 8z\"></path>\\n</svg>',pip:'<svg viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\">\\n<path d=\"M844.8 219.648h-665.6c-6.144 0-10.24 4.608-10.24 10.752v563.2c0 5.632 4.096 10.24 10.24 10.24h256v92.16h-256a102.4 102.4 0 0 1-102.4-102.4v-563.2c0-56.832 45.568-102.4 102.4-102.4h665.6a102.4 102.4 0 0 1 102.4 102.4v204.8h-92.16v-204.8c0-6.144-4.608-10.752-10.24-10.752zM614.4 588.8c-28.672 0-51.2 22.528-51.2 51.2v204.8c0 28.16 22.528 51.2 51.2 51.2h281.6c28.16 0 51.2-23.04 51.2-51.2v-204.8c0-28.672-23.04-51.2-51.2-51.2H614.4z\"></path>\\n</svg>',arrowLeft:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" version=\"1.1\" viewBox=\"0 0 32 32\">\\n    <path d=\"M 19.41,20.09 14.83,15.5 19.41,10.91 18,9.5 l -6,6 6,6 z\" />\\n</svg>',arrowRight:'<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" version=\"1.1\" viewBox=\"0 0 32 32\">\\n    <path d=\"m 12.59,20.34 4.58,-4.59 -4.58,-4.59 1.41,-1.41 6,6 -6,6 z\" />\\n</svg>',playbackRate:'<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\"><path d=\"M10,8v8l6-4L10,8L10,8z M6.3,5L5.7,4.2C7.2,3,9,2.2,11,2l0.1,1C9.3,3.2,7.7,3.9,6.3,5z            M5,6.3L4.2,5.7C3,7.2,2.2,9,2,11 l1,.1C3.2,9.3,3.9,7.7,5,6.3z            M5,17.7c-1.1-1.4-1.8-3.1-2-4.8L2,13c0.2,2,1,3.8,2.2,5.4L5,17.7z            M11.1,21c-1.8-0.2-3.4-0.9-4.8-2 l-0.6,.8C7.2,21,9,21.8,11,22L11.1,21z            M22,12c0-5.2-3.9-9.4-9-10l-0.1,1c4.6,.5,8.1,4.3,8.1,9s-3.5,8.5-8.1,9l0.1,1 C18.2,21.5,22,17.2,22,12z\" data-darkreader-inline-fill=\"\" style=\"--darkreader-inline-fill:#a8a6a4;\"></path></svg>',aspectRatio:'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 88 88\" preserveAspectRatio=\"xMidYMid meet\" style=\"width: 100%; height: 100%; transform: translate3d(0px, 0px, 0px);\"><defs><clipPath id=\"__lottie_element_216\"><rect width=\"88\" height=\"88\" x=\"0\" y=\"0\"></rect></clipPath></defs><g clip-path=\"url(#__lottie_element_216)\"><g transform=\"matrix(1,0,0,1,44,44)\" opacity=\"1\" style=\"display: block;\"><g opacity=\"1\" transform=\"matrix(1,0,0,1,0,0)\"><path fill-opacity=\"1\" d=\" M12.437999725341797,-12.70199966430664 C12.437999725341797,-12.70199966430664 9.618000030517578,-9.881999969482422 9.618000030517578,-9.881999969482422 C8.82800006866455,-9.092000007629395 8.82800006866455,-7.831999778747559 9.618000030517578,-7.052000045776367 C9.618000030517578,-7.052000045776367 16.687999725341797,0.017999999225139618 16.687999725341797,0.017999999225139618 C16.687999725341797,0.017999999225139618 9.618000030517578,7.0879998207092285 9.618000030517578,7.0879998207092285 C8.82800006866455,7.877999782562256 8.82800006866455,9.137999534606934 9.618000030517578,9.918000221252441 C9.618000030517578,9.918000221252441 12.437999725341797,12.748000144958496 12.437999725341797,12.748000144958496 C13.227999687194824,13.527999877929688 14.48799991607666,13.527999877929688 15.267999649047852,12.748000144958496 C15.267999649047852,12.748000144958496 26.58799934387207,1.437999963760376 26.58799934387207,1.437999963760376 C27.368000030517578,0.6579999923706055 27.368000030517578,-0.6119999885559082 26.58799934387207,-1.3919999599456787 C26.58799934387207,-1.3919999599456787 15.267999649047852,-12.70199966430664 15.267999649047852,-12.70199966430664 C14.48799991607666,-13.491999626159668 13.227999687194824,-13.491999626159668 12.437999725341797,-12.70199966430664z M-12.442000389099121,-12.70199966430664 C-13.182000160217285,-13.442000389099121 -14.362000465393066,-13.482000350952148 -15.142000198364258,-12.821999549865723 C-15.142000198364258,-12.821999549865723 -15.272000312805176,-12.70199966430664 -15.272000312805176,-12.70199966430664 C-15.272000312805176,-12.70199966430664 -26.582000732421875,-1.3919999599456787 -26.582000732421875,-1.3919999599456787 C-27.32200050354004,-0.6520000100135803 -27.36199951171875,0.5180000066757202 -26.70199966430664,1.3079999685287476 C-26.70199966430664,1.3079999685287476 -26.582000732421875,1.437999963760376 -26.582000732421875,1.437999963760376 C-26.582000732421875,1.437999963760376 -15.272000312805176,12.748000144958496 -15.272000312805176,12.748000144958496 C-14.531999588012695,13.48799991607666 -13.362000465393066,13.527999877929688 -12.571999549865723,12.868000030517578 C-12.571999549865723,12.868000030517578 -12.442000389099121,12.748000144958496 -12.442000389099121,12.748000144958496 C-12.442000389099121,12.748000144958496 -9.612000465393066,9.918000221252441 -9.612000465393066,9.918000221252441 C-8.871999740600586,9.178000450134277 -8.831999778747559,8.008000373840332 -9.501999855041504,7.2179999351501465 C-9.501999855041504,7.2179999351501465 -9.612000465393066,7.0879998207092285 -9.612000465393066,7.0879998207092285 C-9.612000465393066,7.0879998207092285 -16.68199920654297,0.017999999225139618 -16.68199920654297,0.017999999225139618 C-16.68199920654297,0.017999999225139618 -9.612000465393066,-7.052000045776367 -9.612000465393066,-7.052000045776367 C-8.871999740600586,-7.791999816894531 -8.831999778747559,-8.961999893188477 -9.501999855041504,-9.751999855041504 C-9.501999855041504,-9.751999855041504 -9.612000465393066,-9.881999969482422 -9.612000465393066,-9.881999969482422 C-9.612000465393066,-9.881999969482422 -12.442000389099121,-12.70199966430664 -12.442000389099121,-12.70199966430664z M28,-28 C32.41999816894531,-28 36,-24.420000076293945 36,-20 C36,-20 36,20 36,20 C36,24.420000076293945 32.41999816894531,28 28,28 C28,28 -28,28 -28,28 C-32.41999816894531,28 -36,24.420000076293945 -36,20 C-36,20 -36,-20 -36,-20 C-36,-24.420000076293945 -32.41999816894531,-28 -28,-28 C-28,-28 28,-28 28,-28z\" data-darkreader-inline-fill=\"\" style=\"--darkreader-inline-fill:#a8a6a4;\"></path></g></g></g></svg>',config:'<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\"><path d=\"M15,17h6v1h-6V17z M11,17H3v1h8v2h1v-2v-1v-2h-1V17z M14,8h1V6V5V3h-1v2H3v1h11V8z            M18,5v1h3V5H18z M6,14h1v-2v-1V9H6v2H3v1 h3V14z M10,12h11v-1H10V12z\" data-darkreader-inline-fill=\"\" style=\"--darkreader-inline-fill:#a8a6a4;\"></path></svg>',lock:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1650612139149\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\">\\n<path d=\"M298.666667 426.666667V341.333333a213.333333 213.333333 0 1 1 426.666666 0v85.333334h42.666667a85.333333 85.333333 0 0 1 85.333333 85.333333v256a85.333333 85.333333 0 0 1-85.333333 85.333333H256a85.333333 85.333333 0 0 1-85.333333-85.333333v-256a85.333333 85.333333 0 0 1 85.333333-85.333333h42.666667z m213.333333-213.333334a128 128 0 0 0-128 128v85.333334h256V341.333333a128 128 0 0 0-128-128z\"></path>\\n</svg>\\n',flip:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1652445277062\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"24\" height=\"24\">\\n<path d=\"M554.666667 810.666667v85.333333h-85.333334v-85.333333h85.333334zM170.666667 178.005333a42.666667 42.666667 0 0 1 34.986666 18.218667l203.904 291.328a42.666667 42.666667 0 0 1 0 48.896l-203.946666 291.328A42.666667 42.666667 0 0 1 128 803.328V220.672a42.666667 42.666667 0 0 1 42.666667-42.666667z m682.666666 0a42.666667 42.666667 0 0 1 42.368 37.717334l0.298667 4.949333v582.656a42.666667 42.666667 0 0 1-74.24 28.629333l-3.413333-4.181333-203.904-291.328a42.666667 42.666667 0 0 1-3.029334-43.861333l3.029334-5.034667 203.946666-291.328A42.666667 42.666667 0 0 1 853.333333 178.005333zM554.666667 640v85.333333h-85.333334v-85.333333h85.333334zM196.266667 319.104V716.8L335.957333 512 196.309333 319.104zM554.666667 469.333333v85.333334h-85.333334v-85.333334h85.333334z m0-170.666666v85.333333h-85.333334V298.666667h85.333334z m0-170.666667v85.333333h-85.333334V128h85.333334z\">\\n</path>\\n</svg>\\n',unlock:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1650612464266\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\"><path d=\"M666.752 194.517333L617.386667 268.629333A128 128 0 0 0 384 341.333333l0.042667 85.333334h384a85.333333 85.333333 0 0 1 85.333333 85.333333v256a85.333333 85.333333 0 0 1-85.333333 85.333333H256a85.333333 85.333333 0 0 1-85.333333-85.333333v-256a85.333333 85.333333 0 0 1 85.333333-85.333333h42.666667V341.333333a213.333333 213.333333 0 0 1 368.085333-146.816z\"></path></svg>\\n',fullscreenOff:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"22\" height=\"22\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n<path d=\"M768 298.666667h170.666667v85.333333h-256V128h85.333333v170.666667zM341.333333 384H85.333333V298.666667h170.666667V128h85.333333v256z m426.666667 341.333333v170.666667h-85.333333v-256h256v85.333333h-170.666667zM341.333333 640v256H256v-170.666667H85.333333v-85.333333h256z\" />\\n</svg>\\n',fullscreenOn:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"22\" height=\"22\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n<path d=\"M625.777778 256h142.222222V398.222222h113.777778V142.222222H625.777778v113.777778zM256 398.222222V256H398.222222v-113.777778H142.222222V398.222222h113.777778zM768 625.777778v142.222222H625.777778v113.777778h256V625.777778h-113.777778zM398.222222 768H256V625.777778h-113.777778v256H398.222222v-113.777778z\" />\\n</svg>\\n',fullscreenWebOff:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"18\" height=\"18\" viewBox=\"0 0 1152 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n<path d=\"M1075.2 0H76.8A76.8 76.8 0 0 0 0 76.8v870.4A76.8 76.8 0 0 0 76.8 1024h998.4a76.8 76.8 0 0 0 76.8-76.8V76.8A76.8 76.8 0 0 0 1075.2 0zM1024 128v768H128V128h896zM896 512a64 64 0 0 1 7.488 127.552L896 640h-128v128a64 64 0 0 1-56.512 63.552L704 832a64 64 0 0 1-63.552-56.512L640 768V582.592c0-34.496 25.024-66.112 61.632-70.208L709.632 512H896zM256 512a64 64 0 0 1-7.488-127.552L256 384h128V256a64 64 0 0 1 56.512-63.552L448 192a64 64 0 0 1 63.552 56.512L512 256v185.408c0 34.432-25.024 66.112-61.632 70.144L442.368 512H256z\" />\\n</svg>\\n',fullscreenWebOn:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"18\" height=\"18\" viewBox=\"0 0 1152 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n<path d=\"M1075.2 0H76.8A76.8 76.8 0 0 0 0 76.8v870.4A76.8 76.8 0 0 0 76.8 1024h998.4a76.8 76.8 0 0 0 76.8-76.8V76.8A76.8 76.8 0 0 0 1075.2 0zM1024 128v768H128V128h896zM448 192a64 64 0 0 1 7.488 127.552L448 320H320v128a64 64 0 0 1-56.512 63.552L256 512a64 64 0 0 1-63.552-56.512L192 448V262.592c0-34.432 25.024-66.112 61.632-70.144L261.632 192H448zM704 832a64 64 0 0 1-7.488-127.552L704 704h128V576a64 64 0 0 1 56.512-63.552L896 512a64 64 0 0 1 63.552 56.512L960 576v185.408c0 34.496-25.024 66.112-61.632 70.208l-8 0.384H704z\" />\\n</svg>\\n',switchOn:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"26\" height=\"26\" viewBox=\"0 0 1664 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n    <path fill=\"#648FFC\" d=\"M1152 0H512a512 512 0 0 0 0 1024h640a512 512 0 0 0 0-1024z m0 960a448 448 0 1 1 448-448 448 448 0 0 1-448 448z\"  />\\n</svg>',switchOff:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg class=\"icon\" width=\"26\" height=\"26\" viewBox=\"0 0 1740 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\\n    <path d=\"M511.8976 1024h670.5152c282.4192-0.4096 511.1808-229.4784 511.1808-511.8976 0-282.4192-228.7616-511.488-511.1808-511.8976H511.8976C229.4784 0.6144 0.7168 229.6832 0.7168 512.1024c0 282.4192 228.7616 511.488 511.1808 511.8976zM511.3344 48.64A464.5888 464.5888 0 1 1 48.0256 513.024 463.872 463.872 0 0 1 511.3344 48.4352V48.64z\" />\\n</svg>\\n',error:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1652850026663\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2749\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"50\" height=\"50\">\\n<path d=\"M593.8176 168.5504l356.00384 595.21024c26.15296 43.74528 10.73152 99.7376-34.44736 125.05088-14.39744 8.06912-30.72 12.30848-47.37024 12.30848H155.97568C103.75168 901.12 61.44 860.16 61.44 809.61536c0-16.09728 4.38272-31.92832 12.71808-45.8752L430.16192 168.5504c26.17344-43.7248 84.00896-58.65472 129.20832-33.34144a93.0816 93.0816 0 0 1 34.44736 33.34144zM512 819.2a61.44 61.44 0 1 0 0-122.88 61.44 61.44 0 0 0 0 122.88z m0-512a72.31488 72.31488 0 0 0-71.76192 81.3056l25.72288 205.7216a46.40768 46.40768 0 0 0 92.07808 0l25.72288-205.74208A72.31488 72.31488 0 0 0 512 307.2z\" p-id=\"2750\">\\n</path>\\n</svg>',close:'<?xml version=\"1.0\" standalone=\"no\"?>\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg t=\"1655876154826\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"22\" height=\"22\">\\n<path d=\"M571.733333 512l268.8-268.8c17.066667-17.066667 17.066667-42.666667 0-59.733333-17.066667-17.066667-42.666667-17.066667-59.733333 0L512 452.266667 243.2 183.466667c-17.066667-17.066667-42.666667-17.066667-59.733333 0-17.066667 17.066667-17.066667 42.666667 0 59.733333L452.266667 512 183.466667 780.8c-17.066667 17.066667-17.066667 42.666667 0 59.733333 8.533333 8.533333 19.2 12.8 29.866666 12.8s21.333333-4.266667 29.866667-12.8L512 571.733333l268.8 268.8c8.533333 8.533333 19.2 12.8 29.866667 12.8s21.333333-4.266667 29.866666-12.8c17.066667-17.066667 17.066667-42.666667 0-59.733333L571.733333 512z\" p-id=\"2131\">\\n</path>\\n</svg>',airplay:'<svg width=\"18px\" height=\"18px\" viewBox=\"0 0 18 18\" xmlns=\"http://www.w3.org/2000/svg\">\\n    <g>\\n        <path d=\"M16,1 L2,1 C1.447,1 1,1.447 1,2 L1,12 C1,12.553 1.447,13 2,13 L5,13 L5,11 L3,11 L3,3 L15,3 L15,11 L13,11 L13,13 L16,13 C16.553,13 17,12.553 17,12 L17,2 C17,1.447 16.553,1 16,1 L16,1 Z\"></path>\\n        <polygon points=\"4 17 14 17 9 11\"></polygon>\\n    </g>\\n</svg>\\n'},t.option.icons);for(const r in e)tt(this,r,{get:()=>N(r,e[r])})}}class At extends xt{constructor(t){super(t),this.name=\"info\",k||this.init()}init(){const{proxy:t,constructor:e,template:{$infoPanel:r,$infoClose:o,$video:a}}=this.art;t(o,\"click\",()=>{this.show=!1});let n=null;const i=E(\"[data-video]\",r)||[];this.art.on(\"destroy\",()=>clearTimeout(n)),function t(){for(let e=0;e<i.length;e++){const t=i[e],r=a[t.dataset.video],o=\"number\"===typeof r?r.toFixed(2):r;t.textContent!==o&&(t.textContent=o)}n=setTimeout(t,e.INFO_LOOP_TIME)}()}}class Ot extends xt{constructor(t){super(t);const{option:e,template:{$layer:r}}=t;this.name=\"layer\",this.$parent=r;for(let o=0;o<e.layers.length;o++)this.add(e.layers[o])}}class Rt extends xt{constructor(t){super(t),this.name=\"loading\",S(t.template.$loading,t.icons.loading)}}class _t extends xt{constructor(t){super(t),this.name=\"mask\";const{template:e,icons:r,events:o}=t,a=S(e.$state,r.state),n=S(e.$state,r.error);I(n,\"display\",\"none\"),t.on(\"destroy\",()=>{I(a,\"display\",\"none\"),I(n,\"display\",null)}),o.proxy(e.$state,\"click\",()=>t.play())}}class Vt{constructor(t){this.art=t,this.timer=null,t.on(\"destroy\",()=>this.destroy())}destroy(){this.timer&&(clearTimeout(this.timer),this.timer=null)}set show(t){const{constructor:e,template:{$player:r,$noticeInner:o}}=this.art;t?(o.textContent=t instanceof Error?t.message.trim():t,C(r,\"art-notice-show\"),clearTimeout(this.timer),this.timer=setTimeout(()=>{o.textContent=\"\",z(r,\"art-notice-show\")},e.NOTICE_TIME)):z(r,\"art-notice-show\")}get show(){const{template:{$player:t}}=this.art;return t.classList.contains(\"art-notice-show\")}}const Yt=[[\"requestFullscreen\",\"exitFullscreen\",\"fullscreenElement\",\"fullscreenEnabled\",\"fullscreenchange\",\"fullscreenerror\"],[\"webkitRequestFullscreen\",\"webkitExitFullscreen\",\"webkitFullscreenElement\",\"webkitFullscreenEnabled\",\"webkitfullscreenchange\",\"webkitfullscreenerror\"],[\"webkitRequestFullScreen\",\"webkitCancelFullScreen\",\"webkitCurrentFullScreenElement\",\"webkitCancelFullScreen\",\"webkitfullscreenchange\",\"webkitfullscreenerror\"],[\"mozRequestFullScreen\",\"mozCancelFullScreen\",\"mozFullScreenElement\",\"mozFullScreenEnabled\",\"mozfullscreenchange\",\"mozfullscreenerror\"],[\"msRequestFullscreen\",\"msExitFullscreen\",\"msFullscreenElement\",\"msFullscreenEnabled\",\"MSFullscreenChange\",\"MSFullscreenError\"]],Dt=(()=>{if(\"undefined\"===typeof document)return!1;const t=Yt[0],e={};for(const r of Yt){if(r[1]in document){for(const[o,a]of r.entries())e[t[o]]=a;return e}}return!1})(),Nt={change:Dt.fullscreenchange,error:Dt.fullscreenerror},Ft={request:(t=document.documentElement,e)=>new Promise((r,o)=>{const a=()=>{Ft.off(\"change\",a),r()};Ft.on(\"change\",a);const n=t[Dt.requestFullscreen](e);n instanceof Promise&&n.then(a).catch(o)}),exit:()=>new Promise((t,e)=>{if(!Ft.isFullscreen)return void t();const r=()=>{Ft.off(\"change\",r),t()};Ft.on(\"change\",r);const o=document[Dt.exitFullscreen]();o instanceof Promise&&o.then(r).catch(e)}),toggle:(t,e)=>Ft.isFullscreen?Ft.exit():Ft.request(t,e),onchange(t){Ft.on(\"change\",t)},onerror(t){Ft.on(\"error\",t)},on(t,e){const r=Nt[t];r&&document.addEventListener(r,e,!1)},off(t,e){const r=Nt[t];r&&document.removeEventListener(r,e,!1)},raw:Dt};function Bt(t){const{i18n:e,notice:r,template:{$video:o,$player:a}}=t,n=t=>{Ft.on(\"change\",()=>{t.emit(\"fullscreen\",Ft.isFullscreen),Ft.isFullscreen?(t.state=\"fullscreen\",C(a,\"art-fullscreen\")):z(a,\"art-fullscreen\"),t.emit(\"resize\")}),Ft.on(\"error\",e=>{t.emit(\"fullscreenError\",e)}),tt(t,\"fullscreen\",{get:()=>Ft.isFullscreen,set(t){return d(this,null,function*(){t?yield Ft.request(a):yield Ft.exit()})}})};t.once(\"video:loadedmetadata\",()=>{var a;Ft.isEnabled?n(t):o.webkitSupportsFullscreen?((a=t).on(\"document:webkitfullscreenchange\",()=>{a.emit(\"fullscreen\",a.fullscreen),a.emit(\"resize\")}),tt(a,\"fullscreen\",{get:()=>document.fullscreenElement===o,set(t){t?(a.state=\"fullscreen\",o.webkitEnterFullscreen()):o.webkitExitFullscreen()}})):tt(t,\"fullscreen\",{get:()=>!1,set(){r.show=e.get(\"Fullscreen Not Supported\")}}),tt(t,\"fullscreen\",ot(t,\"fullscreen\"))})}function Ht(t){const{icons:e,proxy:r,storage:o,template:{$player:a,$video:n}}=t;let i=!1,s=0,l=0;function c(){const{$mini:e}=t.template;e&&(z(a,\"art-mini\"),I(e,\"display\",\"none\"),a.prepend(n),t.emit(\"mini\",!1))}function d(e,r){t.playing?(I(e,\"display\",\"none\"),I(r,\"display\",\"flex\")):(I(e,\"display\",\"flex\"),I(r,\"display\",\"none\"))}function p(){const{$mini:e}=t.template,r=H(e),a=window.innerHeight-r.height-50,n=window.innerWidth-r.width-50;o.set(\"top\",a),o.set(\"left\",n),I(e,\"top\",`${a}px`),I(e,\"left\",`${n}px`)}tt(t,\"mini\",{get:()=>L(a,\"art-mini\"),set(h){if(h){t.state=\"mini\",C(a,\"art-mini\");const h=function(){const{$mini:a}=t.template;if(a)return S(a,n),I(a,\"display\",\"flex\");{const a=D(\"div\");C(a,\"art-mini-popup\"),S(document.body,a),t.template.$mini=a,S(a,n);const p=S(a,'<div class=\"art-mini-close\"></div>');S(p,e.close),r(p,\"click\",c);const h=S(a,'<div class=\"art-mini-state\"></div>'),u=S(h,e.play),m=S(h,e.pause);return r(u,\"click\",()=>t.play()),r(m,\"click\",()=>t.pause()),d(u,m),t.on(\"video:playing\",()=>d(u,m)),t.on(\"video:pause\",()=>d(u,m)),t.on(\"video:timeupdate\",()=>d(u,m)),r(a,\"mousedown\",t=>{i=0===t.button,s=t.pageX,l=t.pageY}),t.on(\"document:mousemove\",t=>{if(i){C(a,\"art-mini-dragging\");const e=t.pageX-s,r=t.pageY-l;I(a,\"transform\",`translate(${e}px, ${r}px)`)}}),t.on(\"document:mouseup\",()=>{if(i){i=!1,z(a,\"art-mini-dragging\");const t=H(a);o.set(\"left\",t.left),o.set(\"top\",t.top),I(a,\"left\",`${t.left}px`),I(a,\"top\",`${t.top}px`),I(a,\"transform\",null)}}),a}}(),u=o.get(\"top\"),m=o.get(\"left\");\"number\"===typeof u&&\"number\"===typeof m?(I(h,\"top\",`${u}px`),I(h,\"left\",`${m}px`),_(h)||p()):p(),t.emit(\"mini\",!0)}else c()}})}function Wt(t){const{i18n:e,notice:r,template:{$video:o}}=t;document.pictureInPictureEnabled?function(t){const{template:{$video:e},proxy:r,notice:o}=t;e.disablePictureInPicture=!1,tt(t,\"pip\",{get:()=>document.pictureInPictureElement,set(r){r?(t.state=\"pip\",e.requestPictureInPicture().catch(t=>{throw o.show=t,t})):document.exitPictureInPicture().catch(t=>{throw o.show=t,t})}}),r(e,\"enterpictureinpicture\",()=>{t.emit(\"pip\",!0)}),r(e,\"leavepictureinpicture\",()=>{t.emit(\"pip\",!1)})}(t):o.webkitSupportsPresentationMode?function(t){const{$video:e}=t.template;e.webkitSetPresentationMode(\"inline\"),tt(t,\"pip\",{get:()=>\"picture-in-picture\"===e.webkitPresentationMode,set(r){r?(t.state=\"pip\",e.webkitSetPresentationMode(\"picture-in-picture\"),t.emit(\"pip\",!0)):(e.webkitSetPresentationMode(\"inline\"),t.emit(\"pip\",!1))}})}(t):tt(t,\"pip\",{get:()=>!1,set(){r.show=e.get(\"PIP Not Supported\")}})}function jt(t){const{option:e,template:{$progress:r,$video:o}}=t;let a=null,n=!1,i=null;t.on(\"setBar\",(a,s,l)=>d(null,null,function*(){var c;const d=null==(c=t.controls)?void 0:c.thumbnails,{url:p,scale:h}=e.thumbnails;if(!d||!p)return;if(\"hover\"===a||\"played\"===a&&l&&k){if(i||n||(n=!0,i=yield W(p,h),n=!1),!i)return;const a=r.clientWidth*s;a>0&&a<r.clientWidth&&function(a){var n;const s=null==(n=t.controls)?void 0:n.thumbnails;if(!s)return;const{number:l,column:c,width:d,height:p,scale:h}=e.thumbnails,u=d*h||i.naturalWidth/c,m=p*h||u/(o.videoWidth/o.videoHeight),f=r.clientWidth/l,g=Math.floor(a/f),v=Math.ceil(g/c)-1,y=g%c||c-1;I(s,\"backgroundImage\",`url(${i.src})`),I(s,\"height\",`${m}px`),I(s,\"width\",`${u}px`),I(s,\"backgroundPosition\",`-${y*u}px -${v*m}px`),a<=u/2?I(s,\"left\",0):a>r.clientWidth-u/2?I(s,\"left\",r.clientWidth-u+\"px\"):I(s,\"left\",a-u/2+\"px\")}(a)}})),tt(t,\"thumbnails\",{get:()=>t.option.thumbnails,set(e){e.url&&!t.option.isLive&&(t.option.thumbnails=e,clearTimeout(a),a=null,n=!1,i=null)}})}Object.defineProperties(Ft,{isFullscreen:{get:()=>Boolean(document[Dt.fullscreenElement])},element:{enumerable:!0,get:()=>document[Dt.fullscreenElement]},isEnabled:{enumerable:!0,get:()=>Boolean(document[Dt.fullscreenEnabled])}});class Ut{constructor(t){!function(t){const{option:e,template:{$video:r}}=t;tt(t,\"url\",{get:()=>r.src,set(o){return d(this,null,function*(){if(o){const a=t.url,n=e.type||X(o),i=e.customType[n];n&&i?(yield lt(),t.loading.show=!0,i.call(t,r,o,t)):(URL.revokeObjectURL(a),r.src=o),a!==t.url&&(t.option.url=o,t.isReady&&a&&t.once(\"video:canplay\",()=>{t.emit(\"restart\",o)}))}else yield lt(),t.loading.show=!0})}})}(t),function(t){const{template:{$video:e}}=t;tt(t,\"attr\",{value(t,r){if(void 0===r)return e[t];e[t]=r}})}(t),function(t){const{i18n:e,notice:r,option:o,constructor:{instances:a},template:{$video:n}}=t;tt(t,\"play\",{value(){return d(this,null,function*(){const i=yield n.play();if(r.show=e.get(\"Play\"),t.emit(\"play\"),o.mutex)for(let e=0;e<a.length;e++){const r=a[e];r!==t&&r.pause()}return i})}})}(t),function(t){const{template:{$video:e},i18n:r,notice:o}=t;tt(t,\"pause\",{value(){const a=e.pause();return o.show=r.get(\"Pause\"),t.emit(\"pause\"),a}})}(t),function(t){tt(t,\"toggle\",{value:()=>t.playing?t.pause():t.play()})}(t),function(t){const{notice:e}=t;tt(t,\"seek\",{set(r){t.currentTime=r,t.duration&&(e.show=`${J(t.currentTime)} / ${J(t.duration)}`),t.emit(\"seek\",t.currentTime,r)}}),tt(t,\"forward\",{set(e){t.seek=t.currentTime+e}}),tt(t,\"backward\",{set(e){t.seek=t.currentTime-e}})}(t),function(t){const{template:{$video:e},i18n:r,notice:o,storage:a}=t;tt(t,\"volume\",{get:()=>e.volume||0,set:t=>{e.volume=K(t,0,1),o.show=`${r.get(\"Volume\")}: ${Number.parseInt(100*e.volume,10)}`,0!==e.volume&&a.set(\"volume\",e.volume)}}),tt(t,\"muted\",{get:()=>e.muted,set:r=>{e.muted=r,t.emit(\"muted\",r)}})}(t),function(t){const{$video:e}=t.template;tt(t,\"currentTime\",{get:()=>e.currentTime||0,set:r=>{r=Number.parseFloat(r),Number.isNaN(r)||(e.currentTime=K(r,0,t.duration))}})}(t),function(t){tt(t,\"duration\",{get:()=>{const{duration:e}=t.template.$video;return e===1/0?0:e||0}})}(t),function(t){function e(e,r){return new Promise((o,a)=>{if(e===t.url)return void o();const{playing:n,aspectRatio:i,playbackRate:s}=t;t.pause(),t.url=e,t.notice.show=\"\";const l={error:e=>{t.off(\"video:canplay\",l.canplay),t.off(\"video:loadedmetadata\",l.metadata),a(e)},metadata:()=>{t.currentTime=r},canplay:()=>d(null,null,function*(){t.off(\"video:error\",l.error),t.playbackRate=s,t.aspectRatio=i,n&&(yield t.play()),t.notice.show=\"\",o()})};t.once(\"video:error\",l.error),t.once(\"video:loadedmetadata\",l.metadata),t.once(\"video:canplay\",l.canplay)})}tt(t,\"switchQuality\",{value:r=>e(r,t.currentTime)}),tt(t,\"switchUrl\",{value:t=>e(t,0)}),tt(t,\"switch\",{set:t.switchUrl})}(t),function(t){const{template:{$video:e},i18n:r,notice:o}=t;tt(t,\"playbackRate\",{get:()=>e.playbackRate,set(a){if(a){if(a===e.playbackRate)return;e.playbackRate=a,o.show=`${r.get(\"Rate\")}: ${1===a?r.get(\"Normal\"):`${a}x`}`}else t.playbackRate=1}})}(t),function(t){const{i18n:e,notice:r,template:{$video:o,$player:a}}=t;tt(t,\"aspectRatio\",{get:()=>a.dataset.aspectRatio||\"default\",set(n){if(n||(n=\"default\"),\"default\"===n)I(o,\"width\",null),I(o,\"height\",null),I(o,\"margin\",null),delete a.dataset.aspectRatio;else{const t=n.split(\":\").map(Number),{clientWidth:e,clientHeight:r}=a,i=e/r,s=t[0]/t[1];i>s?(I(o,\"width\",s*r+\"px\"),I(o,\"height\",\"100%\"),I(o,\"margin\",\"0 auto\")):(I(o,\"width\",\"100%\"),I(o,\"height\",e/s+\"px\"),I(o,\"margin\",\"auto 0\")),a.dataset.aspectRatio=n}r.show=`${e.get(\"Aspect Ratio\")}: ${\"default\"===n?e.get(\"Default\"):n}`,t.emit(\"aspectRatio\",n)}})}(t),function(t){const{notice:e,template:{$video:r}}=t,o=D(\"canvas\");tt(t,\"getDataURL\",{value:()=>new Promise((t,a)=>{try{o.width=r.videoWidth,o.height=r.videoHeight,o.getContext(\"2d\").drawImage(r,0,0),t(o.toDataURL(\"image/png\"))}catch(n){e.show=n,a(n)}})}),tt(t,\"getBlobUrl\",{value:()=>new Promise((t,a)=>{try{o.width=r.videoWidth,o.height=r.videoHeight,o.getContext(\"2d\").drawImage(r,0,0),o.toBlob(e=>{t(URL.createObjectURL(e))})}catch(n){e.show=n,a(n)}})}),tt(t,\"screenshot\",{value:e=>d(null,null,function*(){const o=yield t.getDataURL();return G(o,`${e||`artplayer_${J(r.currentTime)}`}.png`),t.emit(\"screenshot\",o),o})})}(t),Bt(t),function(t){const{constructor:e,template:{$container:r,$player:o}}=t;let a=\"\";tt(t,\"fullscreenWeb\",{get:()=>L(o,\"art-fullscreen-web\"),set(n){n?(a=o.style.cssText,e.FULLSCREEN_WEB_IN_BODY&&S(document.body,o),t.state=\"fullscreenWeb\",I(o,\"width\",\"100%\"),I(o,\"height\",\"100%\"),C(o,\"art-fullscreen-web\"),t.emit(\"fullscreenWeb\",!0)):(e.FULLSCREEN_WEB_IN_BODY&&S(r,o),a&&(o.style.cssText=a,a=\"\"),z(o,\"art-fullscreen-web\"),t.emit(\"fullscreenWeb\",!1)),t.emit(\"resize\")}})}(t),Wt(t),function(t){const{$video:e}=t.template;tt(t,\"loaded\",{get:()=>t.loadedTime/e.duration}),tt(t,\"loadedTime\",{get:()=>e.buffered.length?e.buffered.end(e.buffered.length-1):0})}(t),function(t){tt(t,\"played\",{get:()=>t.currentTime/t.duration})}(t),function(t){const{$video:e}=t.template;tt(t,\"playing\",{get:()=>\"boolean\"===typeof e.playing?e.playing:!!(e.currentTime>0&&!e.paused&&!e.ended&&e.readyState>2)})}(t),function(t){const{$container:e,$player:r,$video:o}=t.template;tt(t,\"autoSize\",{value(){const{videoWidth:a,videoHeight:n}=o,{width:i,height:s}=H(e),l=a/n;if(i/s>l)I(r,\"width\",s*l/i*100+\"%\"),I(r,\"height\",\"100%\");else{const t=i/l/s*100;I(r,\"width\",\"100%\"),I(r,\"height\",`${t}%`)}t.emit(\"autoSize\",{width:t.width,height:t.height})}})}(t),function(t){tt(t,\"rect\",{get:()=>H(t.template.$player)});const e=[\"bottom\",\"height\",\"left\",\"right\",\"top\",\"width\"];for(let r=0;r<e.length;r++){const o=e[r];tt(t,o,{get:()=>t.rect[o]})}tt(t,\"x\",{get:()=>t.left+window.pageXOffset}),tt(t,\"y\",{get:()=>t.top+window.pageYOffset})}(t),function(t){const{template:{$player:e},i18n:r,notice:o}=t;tt(t,\"flip\",{get:()=>e.dataset.flip||\"normal\",set(a){a||(a=\"normal\"),\"normal\"===a?delete e.dataset.flip:e.dataset.flip=a,o.show=`${r.get(\"Video Flip\")}: ${r.get(Z(a))}`,t.emit(\"flip\",a)}})}(t),Ht(t),function(t){const{template:{$poster:e}}=t;tt(t,\"poster\",{get:()=>{try{return e.style.backgroundImage.match(/\"(.*)\"/)[1]}catch(t){return\"\"}},set(t){I(e,\"backgroundImage\",`url(${t})`)}})}(t),function(t){const{template:{$container:e,$video:r}}=t;tt(t,\"autoHeight\",{value(){const{clientWidth:o}=e,{videoHeight:a,videoWidth:n}=r,i=a*(o/n);I(e,\"height\",`${i}px`),t.emit(\"autoHeight\",i)}})}(t),function(t){const{$player:e}=t.template;tt(t,\"cssVar\",{value:(t,r)=>r?e.style.setProperty(t,r):getComputedStyle(e).getPropertyValue(t)})}(t),function(t){tt(t,\"theme\",{get:()=>t.cssVar(\"--art-theme\"),set(e){t.cssVar(\"--art-theme\",e)}})}(t),function(t){tt(t,\"type\",{get:()=>t.option.type,set(e){t.option.type=e}})}(t),function(t){const e=[\"mini\",\"pip\",\"fullscreen\",\"fullscreenWeb\"];tt(t,\"state\",{get:()=>e.find(e=>t[e])||\"standard\",set(r){for(let o=0;o<e.length;o++){const a=e[o];a!==r&&t[a]&&(t[a]=!1)}}})}(t),function(t){const{notice:e,i18n:r,template:o}=t;tt(t,\"subtitleOffset\",{get(){var t;return(null==(t=o.$track)?void 0:t.offset)||0},set(a){var n,i;const{cues:s}=t.subtitle;if(!o.$track||0===s.length)return;const l=K(a,-10,10);o.$track.offset=l;for(let e=0;e<s.length;e++){const r=s[e];r.originalStartTime=null!=(n=r.originalStartTime)?n:r.startTime,r.originalEndTime=null!=(i=r.originalEndTime)?i:r.endTime,r.startTime=K(r.originalStartTime+l,0,t.duration),r.endTime=K(r.originalEndTime+l,0,t.duration)}t.subtitle.update(),e.show=`${r.get(\"Subtitle Offset\")}: ${a}s`,t.emit(\"subtitleOffset\",a)}})}(t),function(t){const{i18n:e,notice:r,proxy:o,template:{$video:a}}=t;let n=!0;window.WebKitPlaybackTargetAvailabilityEvent&&a.webkitShowPlaybackTargetPicker?o(a,\"webkitplaybacktargetavailabilitychanged\",t=>{switch(t.availability){case\"available\":n=!0;break;case\"not-available\":n=!1}}):n=!1,tt(t,\"airplay\",{value(){n?(a.webkitShowPlaybackTargetPicker(),t.emit(\"airplay\")):r.show=e.get(\"AirPlay Not Available\")}})}(t),function(t){tt(t,\"quality\",{set(e){const{controls:r,notice:o,i18n:a}=t,n=e.find(t=>t.default)||e[0];r.update({name:\"quality\",position:\"right\",index:10,style:{marginRight:\"10px\"},html:(null==n?void 0:n.html)||\"\",selector:e,onSelect(e){return d(this,null,function*(){return yield t.switchQuality(e.url),o.show=`${a.get(\"Switch Video\")}: ${e.html}`,e.html})}})}})}(t),jt(t),function(t){const{i18n:e,notice:r,option:o,constructor:a,proxy:n,template:{$player:i,$video:s,$poster:l}}=t;let c=0;for(let d=0;d<v.events.length;d++)n(s,v.events[d],e=>{t.emit(`video:${e.type}`,e)});t.on(\"video:canplay\",()=>{c=0,t.loading.show=!1}),t.once(\"video:canplay\",()=>{t.loading.show=!1,t.controls.show=!0,t.mask.show=!0,t.isReady=!0,t.emit(\"ready\")}),t.on(\"video:ended\",()=>{o.loop?(t.seek=0,t.play(),t.controls.show=!1,t.mask.show=!1):(t.controls.show=!0,t.mask.show=!0)}),t.on(\"video:error\",n=>d(null,null,function*(){c<a.RECONNECT_TIME_MAX?(yield lt(a.RECONNECT_SLEEP_TIME),c+=1,t.url=o.url,r.show=`${e.get(\"Reconnect\")}: ${c}`,t.emit(\"error\",n,c)):(t.mask.show=!0,t.loading.show=!1,t.controls.show=!0,C(i,\"art-error\"),yield lt(a.RECONNECT_SLEEP_TIME),r.show=e.get(\"Video Load Failed\"))})),t.on(\"video:loadedmetadata\",()=>{t.emit(\"resize\"),k&&(t.loading.show=!1,t.controls.show=!0,t.mask.show=!0)}),t.on(\"video:loadstart\",()=>{t.loading.show=!0,t.mask.show=!1,t.controls.show=!0}),t.on(\"video:pause\",()=>{t.controls.show=!0,t.mask.show=!0}),t.on(\"video:play\",()=>{t.mask.show=!1,I(l,\"display\",\"none\")}),t.on(\"video:playing\",()=>{t.mask.show=!1}),t.on(\"video:progress\",()=>{t.playing&&(t.loading.show=!1)}),t.on(\"video:seeked\",()=>{t.loading.show=!1,t.mask.show=!0}),t.on(\"video:seeking\",()=>{t.loading.show=!0,t.mask.show=!1}),t.on(\"video:timeupdate\",()=>{t.mask.show=!1}),t.on(\"video:waiting\",()=>{t.loading.show=!0,t.mask.show=!1})}(t),function(t){const{option:e,storage:r,template:{$video:o,$poster:a}}=t;for(const i in e.moreVideoAttr)t.attr(i,e.moreVideoAttr[i]);e.muted&&(t.muted=e.muted),e.volume&&(o.volume=K(e.volume,0,1));const n=r.get(\"volume\");\"number\"===typeof n&&(o.volume=K(n,0,1)),e.poster&&I(a,\"backgroundImage\",`url(${e.poster})`),e.autoplay&&(o.autoplay=e.autoplay),e.playsInline&&(o.playsInline=!0,o[\"webkit-playsinline\"]=!0),e.theme&&(e.cssVar[\"--art-theme\"]=e.theme);for(const i in e.cssVar)t.cssVar(i,e.cssVar[i]);t.url=e.url}(t)}}function qt(t){const{notice:e,constructor:r,template:{$player:o,$video:a}}=t,n=\"art-auto-orientation\",i=\"art-auto-orientation-fullscreen\";let s=!1;function l(){const{videoWidth:t,videoHeight:e}=a,r=document.documentElement.clientWidth,o=document.documentElement.clientHeight;return t>e&&r<o||t<e&&r>o}return t.on(\"fullscreenWeb\",e=>{var a;if(e){if(l()){const e=Number(null!=(a=r.AUTO_ORIENTATION_TIME)?a:0);setTimeout(()=>{t.fullscreenWeb&&!L(o,n)&&function(){const e=document.documentElement.clientWidth,r=document.documentElement.clientHeight;I(o,\"width\",`${r}px`),I(o,\"height\",`${e}px`),I(o,\"transform-origin\",\"0 0\"),I(o,\"transform\",`rotate(90deg) translate(0, -${e}px)`),C(o,n),t.isRotate=!0,t.emit(\"resize\")}()},e)}}else L(o,n)&&(I(o,\"width\",\"\"),I(o,\"height\",\"\"),I(o,\"transform-origin\",\"\"),I(o,\"transform\",\"\"),z(o,n),t.isRotate=!1,t.emit(\"resize\"))}),t.on(\"fullscreen\",t=>d(null,null,function*(){var r;const a=!!(null==(r=null==screen?void 0:screen.orientation)?void 0:r.lock);if(t){if(a&&l())try{const t=screen.orientation.type.startsWith(\"portrait\")?\"landscape\":\"portrait\";yield screen.orientation.lock(t),s=!0,C(o,i)}catch(n){s=!1,e.show=n}}else if(L(o,i)&&z(o,i),a&&s){try{screen.orientation.unlock()}catch(c){}s=!1}})),{name:\"autoOrientation\",get state(){return L(o,n)}}}function Xt(t){const{i18n:e,icons:r,storage:o,constructor:a,proxy:n,template:{$poster:i}}=t,s=t.layers.add({name:\"auto-playback\",html:'\\n            <div class=\"art-auto-playback-close\"></div>\\n            <div class=\"art-auto-playback-last\"></div>\\n            <div class=\"art-auto-playback-jump\"></div>\\n        '}),l=T(\".art-auto-playback-last\",s),c=T(\".art-auto-playback-jump\",s),d=T(\".art-auto-playback-close\",s);S(d,r.close);let p=null;function h(){const r=(o.get(\"times\")||{})[t.option.id||t.option.url];clearTimeout(p),I(s,\"display\",\"none\"),r&&r>=a.AUTO_PLAYBACK_MIN&&(I(s,\"display\",\"flex\"),l.textContent=`${e.get(\"Last Seen\")} ${J(r)}`,c.textContent=e.get(\"Jump Play\"),n(d,\"click\",()=>{I(s,\"display\",\"none\")}),n(c,\"click\",()=>{t.seek=r,t.play(),I(i,\"display\",\"none\"),I(s,\"display\",\"none\")}),t.once(\"video:timeupdate\",()=>{p=setTimeout(()=>{I(s,\"display\",\"none\")},a.AUTO_PLAYBACK_TIMEOUT)}))}return t.on(\"video:timeupdate\",()=>{if(t.playing){const e=o.get(\"times\")||{},r=Object.keys(e);r.length>a.AUTO_PLAYBACK_MAX&&delete e[r[0]],e[t.option.id||t.option.url]=t.currentTime,o.set(\"times\",e)}}),t.on(\"ready\",h),t.on(\"restart\",h),{name:\"auto-playback\",get times(){return o.get(\"times\")||{}},clear:()=>o.del(\"times\"),delete(t){const e=o.get(\"times\")||{};return delete e[t],o.set(\"times\",e),e}}}function Gt(t){const{constructor:e,proxy:r,template:{$player:o,$video:a}}=t;let n=null,i=!1,s=1;const l=()=>{clearTimeout(n),i&&(i=!1,t.playbackRate=s,z(o,\"art-fast-forward\"))};return r(a,\"touchstart\",r=>{1===r.touches.length&&t.playing&&!t.isLock&&(n=setTimeout(()=>{i=!0,s=t.playbackRate,t.playbackRate=e.FAST_FORWARD_VALUE,C(o,\"art-fast-forward\")},e.FAST_FORWARD_TIME))}),t.on(\"document:touchmove\",l),t.on(\"document:touchend\",l),{name:\"fastForward\",get state(){return L(o,\"art-fast-forward\")}}}function Kt(t){const{layers:e,icons:r,template:{$player:o}}=t;function a(){return L(o,\"art-lock\")}function n(){C(o,\"art-lock\"),t.isLock=!0,t.emit(\"lock\",!0)}function i(){z(o,\"art-lock\"),t.isLock=!1,t.emit(\"lock\",!1)}return e.add({name:\"lock\",mounted(e){const o=S(e,r.lock),a=S(e,r.unlock);I(o,\"display\",\"none\"),t.on(\"lock\",t=>{t?(I(o,\"display\",\"inline-flex\"),I(a,\"display\",\"none\")):(I(o,\"display\",\"none\"),I(a,\"display\",\"inline-flex\"))})},click(){a()?i():n()}}),{name:\"lock\",get state(){return a()},set state(t){t?n():i()}}}function Zt(t){return t.on(\"control\",e=>{e?z(t.template.$player,\"art-mini-progress-bar\"):C(t.template.$player,\"art-mini-progress-bar\")}),{name:\"mini-progress-bar\"}}class Jt{constructor(t){this.art=t,this.id=0;const{option:e}=t;e.miniProgressBar&&!e.isLive&&this.add(Zt),e.lock&&k&&this.add(Kt),e.autoPlayback&&!e.isLive&&this.add(Xt),e.autoOrientation&&k&&this.add(qt),e.fastForward&&k&&!e.isLive&&this.add(Gt);for(let r=0;r<e.plugins.length;r++)this.add(e.plugins[r])}add(t){this.id+=1;const e=t.call(this.art,this.art);return e instanceof Promise?e.then(e=>this.next(t,e)):this.next(t,e)}next(t,e){const r=e&&e.name||t.name||`plugin${this.id}`;return q(!rt(this,r),`Cannot add a plugin that already has the same name: ${r}`),tt(this,r,{value:e}),this}}class Qt extends xt{constructor(t){super(t);const{option:e,controls:r,template:{$setting:o}}=t;this.name=\"setting\",this.$parent=o,this.id=0,this.active=null,this.cache=new Map,this.option=[...this.builtin,...e.settings],e.setting&&(this.format(),this.render(),t.on(\"blur\",()=>{this.show&&(this.show=!1,this.render())}),t.on(\"focus\",t=>{const e=V(t,r.setting),o=V(t,this.$parent);!this.show||e||o||(this.show=!1,this.render())}),t.on(\"resize\",()=>this.resize()))}get builtin(){const t=[],{option:e}=this.art;return e.playbackRate&&t.push(function(t){const{i18n:e,icons:r,constructor:{SETTING_ITEM_WIDTH:o,PLAYBACK_RATE:a}}=t;function n(t){return 1===t?e.get(\"Normal\"):t.toFixed(1)}function i(){const e=t.setting.find(`playback-rate-${t.playbackRate}`);t.setting.check(e)}return{width:o,name:\"playback-rate\",html:e.get(\"Play Speed\"),tooltip:n(t.playbackRate),icon:r.playbackRate,selector:a.map(e=>({value:e,name:`playback-rate-${e}`,default:e===t.playbackRate,html:n(e)})),onSelect:e=>(t.playbackRate=e.value,e.html),mounted:()=>{i(),t.on(\"video:ratechange\",()=>i())}}}(this.art)),e.aspectRatio&&t.push(function(t){const{i18n:e,icons:r,constructor:{SETTING_ITEM_WIDTH:o,ASPECT_RATIO:a}}=t;function n(t){return\"default\"===t?e.get(\"Default\"):t}function i(){const e=t.setting.find(`aspect-ratio-${t.aspectRatio}`);t.setting.check(e)}return{width:o,name:\"aspect-ratio\",html:e.get(\"Aspect Ratio\"),icon:r.aspectRatio,tooltip:n(t.aspectRatio),selector:a.map(e=>({value:e,name:`aspect-ratio-${e}`,default:e===t.aspectRatio,html:n(e)})),onSelect:e=>(t.aspectRatio=e.value,e.html),mounted:()=>{i(),t.on(\"aspectRatio\",()=>i())}}}(this.art)),e.flip&&t.push(function(t){const{i18n:e,icons:r,constructor:{SETTING_ITEM_WIDTH:o,FLIP:a}}=t;function n(t){return e.get(Z(t))}function i(){const e=t.setting.find(`flip-${t.flip}`);t.setting.check(e)}return{width:o,name:\"flip\",html:e.get(\"Video Flip\"),tooltip:n(t.flip),icon:r.flip,selector:a.map(e=>({value:e,name:`flip-${e}`,default:e===t.flip,html:n(e)})),onSelect:e=>(t.flip=e.value,e.html),mounted:()=>{i(),t.on(\"flip\",()=>i())}}}(this.art)),e.subtitleOffset&&t.push(function(t){const{i18n:e,icons:r,constructor:o}=t;return{width:o.SETTING_ITEM_WIDTH,name:\"subtitle-offset\",html:e.get(\"Subtitle Offset\"),icon:r.subtitle,tooltip:\"0s\",range:[0,-10,10,.1],onChange:e=>(t.subtitleOffset=e.range[0],`${e.range[0]}s`),mounted:(e,r)=>{t.on(\"subtitleOffset\",t=>{r.$range.value=t,r.tooltip=`${t}s`})}}}(this.art)),t}traverse(t,e=this.option){var r;for(let o=0;o<e.length;o++){const a=e[o];t(a),(null==(r=a.selector)?void 0:r.length)&&this.traverse(t,a.selector)}}check(t){t&&(t.$parent.tooltip=t.html,this.traverse(e=>{e.default=e===t,e.default&&e.$item&&O(e.$item,\"art-current\")},t.$option),this.render(t.$parents))}format(t=this.option,e,r,o=[]){for(let a=0;a<t.length;a++){const n=t[a];if((null==n?void 0:n.name)?(q(!o.includes(n.name),`The [${n.name}] already exists in [setting]`),o.push(n.name)):n.name=\"setting-\"+this.id++,!n.$formatted){tt(n,\"$parent\",{get:()=>e}),tt(n,\"$parents\",{get:()=>r}),tt(n,\"$option\",{get:()=>t});const o=[];tt(n,\"$events\",{get:()=>o}),tt(n,\"$formatted\",{get:()=>!0})}this.format(n.selector||[],n,t,o)}this.option=t}find(t=\"\"){let e=null;return this.traverse(r=>{r.name===t&&(e=r)}),e}resize(){var t,e;const{controls:r,constructor:{SETTING_WIDTH:o,SETTING_ITEM_HEIGHT:a},template:{$player:n,$setting:i}}=this.art;if(r.setting&&this.show){const s=(null==(e=null==(t=this.active[0])?void 0:t.$parent)?void 0:e.width)||o,{left:l,width:c}=H(r.setting),{left:d,width:p}=H(n),h=l-d+c/2-s/2;if(I(i,\"height\",`${this.active===this.option?this.active.length*a:(this.active.length+1)*a}px`),I(i,\"width\",`${s}px`),this.art.isRotate||k)return;h+s>p?(I(i,\"left\",null),I(i,\"right\",null)):(I(i,\"left\",`${h}px`),I(i,\"right\",\"auto\"))}}inactivate(t){for(let e=0;e<t.$events.length;e++)this.art.events.remove(t.$events[e]);t.$events.length=0}remove(t){const e=this.find(t);q(e,`Can't find [${t}] in the [setting]`);const r=e.$option.indexOf(e);e.$option.splice(r,1),this.inactivate(e),e.$item&&M(e.$item),this.render()}update(t){const e=this.find(t.name);return e?(this.inactivate(e),Object.assign(e,t),this.format(),this.createItem(e,!0),this.render(),e):this.add(t)}add(t,e=this.option){return e.push(t),this.format(),this.createItem(t),this.render(),t}createHeader(t){if(!this.cache.has(t.$option))return;const e=this.cache.get(t.$option),{proxy:r,icons:{arrowLeft:o},constructor:{SETTING_ITEM_HEIGHT:a}}=this.art,n=D(\"div\");I(n,\"height\",`${a}px`),C(n,\"art-setting-item\"),C(n,\"art-setting-item-back\");const i=S(n,'<div class=\"art-setting-item-left\"></div>'),s=D(\"div\");C(s,\"art-setting-item-left-icon\"),S(s,o),S(i,s),S(i,t.$parent.html);const l=r(n,\"click\",()=>this.render(t.$parents));t.$parent.$events.push(l),S(e,n)}createItem(t,e=!1){var r,o;if(!this.cache.has(t.$option))return;const a=this.cache.get(t.$option),n=t.$item;let i=\"selector\";rt(t,\"switch\")&&(i=\"switch\"),rt(t,\"range\")&&(i=\"range\"),rt(t,\"onClick\")&&(i=\"button\");const{icons:s,proxy:l,constructor:c}=this.art,p=D(\"div\");C(p,\"art-setting-item\"),I(p,\"height\",`${c.SETTING_ITEM_HEIGHT}px`),p.dataset.name=t.name||\"\",p.dataset.value=t.value||\"\";const h=S(p,'<div class=\"art-setting-item-left\"></div>'),u=S(p,'<div class=\"art-setting-item-right\"></div>'),m=D(\"div\");switch(C(m,\"art-setting-item-left-icon\"),i){case\"button\":case\"switch\":case\"range\":S(m,t.icon||s.config);break;case\"selector\":(null==(r=t.selector)?void 0:r.length)?S(m,t.icon||s.config):S(m,s.check)}S(h,m),tt(t,\"$icon\",{configurable:!0,get:()=>m}),tt(t,\"icon\",{configurable:!0,get:()=>m.innerHTML,set(t){m.innerHTML=\"\",S(m,t)}});const f=D(\"div\");C(f,\"art-setting-item-left-text\"),S(f,t.html||\"\"),S(h,f),tt(t,\"$html\",{configurable:!0,get:()=>f}),tt(t,\"html\",{configurable:!0,get:()=>f.innerHTML,set(t){f.innerHTML=\"\",S(f,t)}});const g=D(\"div\");switch(C(g,\"art-setting-item-right-tooltip\"),S(g,t.tooltip||\"\"),S(u,g),tt(t,\"$tooltip\",{configurable:!0,get:()=>g}),tt(t,\"tooltip\",{configurable:!0,get:()=>g.innerHTML,set(t){g.innerHTML=\"\",S(g,t)}}),i){case\"switch\":{const e=D(\"div\");C(e,\"art-setting-item-right-icon\");const r=S(e,s.switchOn),o=S(e,s.switchOff);I(t.switch?o:r,\"display\",\"none\"),S(u,e),tt(t,\"$switch\",{configurable:!0,get:()=>e});let a=t.switch;tt(t,\"switch\",{configurable:!0,get:()=>a,set(t){a=t,t?(I(o,\"display\",\"none\"),I(r,\"display\",null)):(I(o,\"display\",null),I(r,\"display\",\"none\"))}});break}case\"range\":{const e=D(\"div\");C(e,\"art-setting-item-right-icon\");const r=S(e,'<input type=\"range\">');r.value=t.range[0],r.min=t.range[1],r.max=t.range[2],r.step=t.range[3],C(r,\"art-setting-range\"),S(u,e),tt(t,\"$range\",{configurable:!0,get:()=>r});let o=[...t.range];tt(t,\"range\",{configurable:!0,get:()=>o,set(t){o=[...t],r.value=t[0],r.min=t[1],r.max=t[2],r.step=t[3]}})}break;case\"selector\":if(null==(o=t.selector)?void 0:o.length){const t=D(\"div\");C(t,\"art-setting-item-right-icon\"),S(t,s.arrowRight),S(u,t)}}switch(i){case\"switch\":if(t.onSwitch){const e=l(p,\"click\",e=>d(this,null,function*(){t.switch=yield t.onSwitch.call(this.art,t,p,e)}));t.$events.push(e)}break;case\"range\":if(t.$range){if(t.onRange){const e=l(t.$range,\"change\",e=>d(this,null,function*(){t.range[0]=t.$range.valueAsNumber,t.tooltip=yield t.onRange.call(this.art,t,p,e)}));t.$events.push(e)}if(t.onChange){const e=l(t.$range,\"input\",e=>d(this,null,function*(){t.range[0]=t.$range.valueAsNumber,t.tooltip=yield t.onChange.call(this.art,t,p,e)}));t.$events.push(e)}}break;case\"selector\":{const e=l(p,\"click\",e=>d(this,null,function*(){var r;(null==(r=t.selector)?void 0:r.length)?this.render(t.selector):(this.check(t),t.$parent.onSelect&&(t.$parent.tooltip=yield t.$parent.onSelect.call(this.art,t,p,e)))}));t.$events.push(e),t.default&&C(p,\"art-current\")}break;case\"button\":if(t.onClick){const e=l(p,\"click\",e=>d(this,null,function*(){t.tooltip=yield t.onClick.call(this.art,t,p,e)}));t.$events.push(e)}}tt(t,\"$item\",{configurable:!0,get:()=>p}),e?Y(p,n):S(a,p),t.mounted&&setTimeout(()=>t.mounted.call(this.art,t.$item,t),0)}render(t=this.option){var e;if(this.active=t,this.cache.has(t)){O(this.cache.get(t),\"art-current\")}else{const r=D(\"div\");this.cache.set(t,r),C(r,\"art-setting-panel\"),S(this.$parent,r),O(r,\"art-current\"),(null==(e=t[0])?void 0:e.$parent)&&this.createHeader(t[0]);for(let e=0;e<t.length;e++)this.createItem(t[e])}this.resize()}}class te{constructor(){this.name=\"artplayer_settings\",this.settings={}}get(t){try{const e=JSON.parse(window.localStorage.getItem(this.name))||{};return t?e[t]:e}catch(e){return t?this.settings[t]:this.settings}}set(t,e){try{const r=Object.assign({},this.get(),{[t]:e});window.localStorage.setItem(this.name,JSON.stringify(r))}catch(r){this.settings[t]=e}}del(t){try{const e=this.get();delete e[t],window.localStorage.setItem(this.name,JSON.stringify(e))}catch(e){delete this.settings[t]}}clear(){try{window.localStorage.removeItem(this.name)}catch(t){this.settings={}}}}const ee='.art-video-player{--art-theme: #f00;--art-font-color: #fff;--art-background-color: #000;--art-text-shadow-color: rgba(0, 0, 0, .5);--art-transition-duration: .2s;--art-padding: 10px;--art-border-radius: 3px;--art-progress-height: 6px;--art-progress-color: rgba(255, 255, 255, .25);--art-progress-top-gap: 10px;--art-hover-color: rgba(255, 255, 255, .25);--art-loaded-color: rgba(255, 255, 255, .25);--art-state-size: 80px;--art-state-opacity: .8;--art-bottom-height: 100px;--art-bottom-offset: 20px;--art-bottom-gap: 5px;--art-highlight-width: 8px;--art-highlight-color: rgba(255, 255, 255, .5);--art-control-height: 46px;--art-control-opacity: .75;--art-control-icon-size: 36px;--art-control-icon-scale: 1.1;--art-volume-height: 120px;--art-volume-handle-size: 14px;--art-lock-size: 36px;--art-indicator-scale: 0;--art-indicator-size: 16px;--art-fullscreen-web-index: 9999;--art-settings-icon-size: 24px;--art-settings-max-height: 300px;--art-selector-max-height: 300px;--art-contextmenus-min-width: 250px;--art-subtitle-font-size: 20px;--art-subtitle-gap: 5px;--art-subtitle-bottom: 15px;--art-subtitle-border: #000;--art-widget-background: rgba(0, 0, 0, .85);--art-tip-background: rgba(0, 0, 0, .7);--art-scrollbar-size: 4px;--art-scrollbar-background: rgba(255, 255, 255, .25);--art-scrollbar-background-hover: rgba(255, 255, 255, .5);--art-mini-progress-height: 2px}.art-bg-cover{background-position:center center;background-repeat:no-repeat;background-size:cover}.art-bottom-gradient{background-image:linear-gradient(to top,#000,rgba(0,0,0,.4),transparent);background-repeat:repeat-x;background-position:center bottom}.art-backdrop-filter{-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px);background-color:#000000bf!important}.art-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.art-video-player{position:relative;margin:0 auto;width:100%;height:100%;outline:0;zoom:1;padding:0;text-align:left;direction:ltr;font-size:14px;line-height:1.3;user-select:none;box-sizing:border-box;color:var(--art-font-color);background-color:var(--art-background-color);text-shadow:0 0 2px var(--art-text-shadow-color);font-family:PingFang SC,Helvetica Neue,Microsoft YaHei,Roboto,Arial,sans-serif;-webkit-tap-highlight-color:rgba(0,0,0,0);-ms-touch-action:manipulation;touch-action:manipulation;-ms-high-contrast-adjust:none}.art-video-player *,.art-video-player *:before,.art-video-player *:after{box-sizing:border-box}.art-video-player ::-webkit-scrollbar{width:var(--art-scrollbar-size);height:var(--art-scrollbar-size)}.art-video-player ::-webkit-scrollbar-thumb{background-color:var(--art-scrollbar-background)}.art-video-player ::-webkit-scrollbar-thumb:hover{background-color:var(--art-scrollbar-background-hover)}.art-video-player img{max-width:100%;vertical-align:top}.art-video-player svg{fill:var(--art-font-color)}.art-video-player a{color:var(--art-font-color);text-decoration:none}.art-icon{line-height:1;display:flex;justify-content:center;align-items:center}.art-video-player.art-backdrop .art-contextmenus,.art-video-player.art-backdrop .art-info,.art-video-player.art-backdrop .art-settings,.art-video-player.art-backdrop .art-layer-auto-playback,.art-video-player.art-backdrop .art-selector-list,.art-video-player.art-backdrop .art-volume-inner{-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px);background-color:#000000bf!important}.art-video{position:absolute;inset:0;z-index:10;width:100%;height:100%}.art-poster{position:absolute;inset:0;z-index:11;width:100%;height:100%;background-position:center center;background-repeat:no-repeat;background-size:cover;pointer-events:none}.art-video-player .art-subtitle{display:none;justify-content:center;align-items:center;flex-direction:column;position:absolute;z-index:20;width:100%;padding:0 5%;text-align:center;pointer-events:none;gap:var(--art-subtitle-gap);bottom:var(--art-subtitle-bottom);font-size:var(--art-subtitle-font-size);transition:bottom var(--art-transition-duration) ease;text-shadow:var(--art-subtitle-border) 1px 0 1px,var(--art-subtitle-border) 0 1px 1px,var(--art-subtitle-border) -1px 0 1px,var(--art-subtitle-border) 0 -1px 1px,var(--art-subtitle-border) 1px 1px 1px,var(--art-subtitle-border) -1px -1px 1px,var(--art-subtitle-border) 1px -1px 1px,var(--art-subtitle-border) -1px 1px 1px}.art-video-player.art-subtitle-show .art-subtitle{display:flex}.art-video-player.art-control-show .art-subtitle{bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}.art-danmuku{position:absolute;inset:0;z-index:30;width:100%;height:100%;pointer-events:none;overflow:hidden}.art-video-player .art-layers{position:absolute;inset:0;z-index:40;width:100%;height:100%;display:none;pointer-events:none}.art-video-player .art-layers .art-layer{pointer-events:auto}.art-video-player.art-layer-show .art-layers{display:flex}.art-video-player .art-mask{display:flex;justify-content:center;align-items:center;position:absolute;inset:0;z-index:50;width:100%;height:100%;pointer-events:none}.art-video-player .art-mask .art-state{display:flex;justify-content:center;align-items:center;opacity:0;transform:scale(2);width:var(--art-state-size);height:var(--art-state-size);transition:all var(--art-transition-duration) ease}.art-video-player.art-mask-show .art-state{pointer-events:auto;opacity:var(--art-state-opacity);transform:scale(1)}.art-video-player.art-loading-show .art-state{display:none}.art-video-player .art-loading{display:none;justify-content:center;align-items:center;position:absolute;inset:0;z-index:70;width:100%;height:100%;pointer-events:none}.art-video-player.art-loading-show .art-loading{display:flex}.art-video-player.art-loading-show .art-mask{display:none}.art-video-player .art-bottom{position:absolute;inset:0;z-index:60;width:100%;height:100%;display:flex;flex-direction:column;justify-content:flex-end;opacity:0;overflow:hidden;pointer-events:none;padding:0 var(--art-padding);transition:all var(--art-transition-duration) ease;background-size:100% var(--art-bottom-height);background-image:linear-gradient(to top,#000,rgba(0,0,0,.4),transparent);background-repeat:repeat-x;background-position:center bottom}.art-video-player .art-bottom .art-controls,.art-video-player .art-bottom .art-progress{transform:translateY(var(--art-bottom-offset));transition:transform var(--art-transition-duration) ease}.art-video-player.art-control-show .art-bottom,.art-video-player.art-hover .art-bottom{opacity:1}.art-video-player.art-control-show .art-bottom .art-controls,.art-video-player.art-hover .art-bottom .art-controls,.art-video-player.art-control-show .art-bottom .art-progress,.art-video-player.art-hover .art-bottom .art-progress{transform:translateY(0)}.art-bottom .art-progress{position:relative;z-index:0;cursor:pointer;pointer-events:auto;padding-top:var(--art-progress-top-gap);padding-bottom:var(--art-bottom-gap)}.art-bottom .art-progress .art-control-progress{position:relative;display:flex;justify-content:center;align-items:center;height:var(--art-progress-height)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner{display:flex;align-items:center;position:relative;height:50%;width:100%;transition:height var(--art-transition-duration) ease;background-color:var(--art-progress-color)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-hover{position:absolute;inset:0;z-index:0;width:100%;height:100%;width:0%;background-color:var(--art-hover-color)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-loaded{position:absolute;inset:0;z-index:10;width:100%;height:100%;width:0%;background-color:var(--art-loaded-color)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-played{position:absolute;inset:0;z-index:20;width:100%;height:100%;width:0%;background-color:var(--art-theme)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight{position:absolute;inset:0;z-index:30;width:100%;height:100%;pointer-events:none}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight span{position:absolute;inset:0 auto 0 0;z-index:0;width:100%;height:100%;pointer-events:auto;width:var(--art-highlight-width)!important;transform:translate(calc(var(--art-highlight-width) / -2));background-color:var(--art-highlight-color)}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{display:flex;justify-content:center;align-items:center;position:absolute;z-index:40;left:0;border-radius:50%;width:var(--art-indicator-size);height:var(--art-indicator-size);transform:scale(var(--art-indicator-scale));margin-left:calc(var(--art-indicator-size) / -2);transition:transform var(--art-transition-duration) ease}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator .art-icon{width:100%;height:100%;pointer-events:none}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:hover{transform:scale(1.2)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:active{transform:scale(1)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip{transform-origin:bottom center;transform:scale(.5);opacity:0;position:absolute;z-index:50;top:-25px;left:0;padding:3px 5px;line-height:1;font-size:12px;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);transition:transform var(--art-transition-duration) ease,opacity var(--art-transition-duration) ease}.art-bottom .art-progress .art-control-thumbnails{transform-origin:bottom center;transform:scale(.5);opacity:0;position:absolute;bottom:calc(var(--art-bottom-gap) + 10px);left:0;border-radius:var(--art-border-radius);pointer-events:none;background-color:var(--art-widget-background);transition:transform var(--art-transition-duration) ease,opacity var(--art-transition-duration) ease;box-shadow:0 1px 3px #0003,0 1px 2px -1px #0003}.art-bottom .art-progress:hover .art-control-progress .art-control-progress-inner{height:100%}.art-bottom:hover .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{transform:scale(1)}.art-progress-hover .art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip,.art-progress-hover .art-bottom .art-progress .art-control-thumbnails{transform:scale(1);opacity:1}.art-video-player .art-controls{position:relative;z-index:10;pointer-events:auto;display:flex;align-items:center;justify-content:space-between;height:var(--art-control-height)}.art-video-player .art-controls .art-controls-left,.art-video-player .art-controls .art-controls-right{display:flex;height:100%}.art-video-player .art-controls .art-controls-center{display:none;justify-content:center;align-items:center;flex:1;height:100%;padding:0 10px}.art-video-player .art-controls .art-controls-right{justify-content:flex-end}.art-video-player .art-controls .art-control{display:flex;justify-content:center;align-items:center;flex-shrink:0;cursor:pointer;white-space:nowrap;opacity:var(--art-control-opacity);min-height:var(--art-control-height);min-width:var(--art-control-height);transition:opacity var(--art-transition-duration) ease}.art-video-player .art-controls .art-control .art-icon{height:var(--art-control-icon-size);width:var(--art-control-icon-size);transform:scale(var(--art-control-icon-scale));transition:transform var(--art-transition-duration) ease}.art-video-player .art-controls .art-control .art-icon:active{transform:scale(calc(var(--art-control-icon-scale) * .8))}.art-video-player .art-controls .art-control:hover{opacity:1}.art-control-volume{position:relative}.art-control-volume .art-volume-panel{display:flex;justify-content:center;align-items:center;position:absolute;left:0;right:0;padding:0 5px;font-size:12px;text-align:center;cursor:default;opacity:0;transform:translateY(10px);pointer-events:none;bottom:var(--art-control-height);width:var(--art-control-height);height:var(--art-volume-height);transition:all var(--art-transition-duration) ease}.art-control-volume .art-volume-panel .art-volume-inner{display:flex;flex-direction:column;align-items:center;gap:10px;height:100%;width:100%;padding:10px 0 12px;border-radius:var(--art-border-radius);background-color:var(--art-widget-background)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider{flex:1;width:100%;display:flex;cursor:pointer;position:relative;justify-content:center}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle{position:relative;display:flex;justify-content:center;width:2px;border-radius:var(--art-border-radius);overflow:hidden;background-color:#ffffff40}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle .art-volume-loaded{position:absolute;inset:0;z-index:0;width:100%;height:100%;background-color:var(--art-theme)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-indicator{position:absolute;width:var(--art-volume-handle-size);height:var(--art-volume-handle-size);margin-top:calc(var(--art-volume-handle-size) / -2);flex-shrink:0;transform:scale(1);border-radius:100%;background-color:var(--art-theme);transition:transform var(--art-transition-duration) ease}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider:active .art-volume-indicator{transform:scale(.9)}.art-control-volume:hover .art-volume-panel{opacity:1;transform:translateY(0);pointer-events:auto}.art-video-player .art-notice{display:none;position:absolute;inset:0 0 auto;z-index:80;width:100%;height:100%;height:auto;padding:var(--art-padding);pointer-events:none}.art-video-player .art-notice .art-notice-inner{display:inline-flex;padding:5px;line-height:1;border-radius:var(--art-border-radius);background-color:var(--art-tip-background)}.art-video-player.art-notice-show .art-notice{display:flex}.art-video-player .art-contextmenus{display:none;flex-direction:column;position:absolute;z-index:120;padding:5px 0;border-radius:var(--art-border-radius);font-size:12px;background-color:var(--art-widget-background);min-width:var(--art-contextmenus-min-width)}.art-video-player .art-contextmenus .art-contextmenu{cursor:pointer;display:flex;padding:10px 15px;border-bottom:1px solid rgba(255,255,255,.1)}.art-video-player .art-contextmenus .art-contextmenu span{padding:0 8px}.art-video-player .art-contextmenus .art-contextmenu span:hover,.art-video-player .art-contextmenus .art-contextmenu span.art-current{color:var(--art-theme)}.art-video-player .art-contextmenus .art-contextmenu:hover{background-color:#ffffff1a}.art-video-player .art-contextmenus .art-contextmenu:last-child{border-bottom:none}.art-video-player.art-contextmenu-show .art-contextmenus{display:flex}.art-video-player .art-settings{display:none;flex-direction:column;position:absolute;z-index:90;left:auto;overflow-y:auto;overflow-x:hidden;border-radius:var(--art-border-radius);max-height:var(--art-settings-max-height);right:var(--art-padding);bottom:var(--art-control-height);transition:all var(--art-transition-duration) ease;background-color:var(--art-widget-background)}.art-video-player .art-settings .art-setting-panel{display:none;flex-direction:column}.art-video-player .art-settings .art-setting-panel.art-current{display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item{display:flex;justify-content:space-between;align-items:center;padding:0 5px;cursor:pointer;overflow:hidden;transition:background-color var(--art-transition-duration) ease}.art-video-player .art-settings .art-setting-panel .art-setting-item:hover{background-color:#ffffff1a}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current{color:var(--art-theme)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-icon-check{visibility:hidden;height:15px}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current .art-icon-check{visibility:visible}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left{display:flex;justify-content:center;align-items:center;flex-shrink:0;gap:5px}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left .art-setting-item-left-icon{display:flex;justify-content:center;align-items:center;height:var(--art-settings-icon-size);width:var(--art-settings-icon-size)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right{display:flex;justify-content:center;align-items:center;gap:5px;font-size:12px}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-tooltip{white-space:nowrap;color:#ffffff80}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-icon{display:flex;justify-content:center;align-items:center;min-width:32px;height:24px}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-range{height:3px;width:80px;outline:none;appearance:none;background-color:#fff3}.art-video-player .art-settings .art-setting-panel .art-setting-item-back{border-bottom:1px solid rgba(255,255,255,.1)}.art-video-player.art-setting-show .art-settings{display:flex}.art-video-player .art-info{display:none;position:absolute;left:var(--art-padding);top:var(--art-padding);z-index:100;padding:10px;font-size:12px;border-radius:var(--art-border-radius);background-color:var(--art-widget-background)}.art-video-player .art-info .art-info-panel{display:flex;flex-direction:column;gap:5px}.art-video-player .art-info .art-info-panel .art-info-item{display:flex;align-items:center;gap:5px}.art-video-player .art-info .art-info-panel .art-info-item .art-info-title{width:100px;text-align:right}.art-video-player .art-info .art-info-panel .art-info-item .art-info-content{width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;user-select:all}.art-video-player .art-info .art-info-close{position:absolute;top:5px;right:5px;cursor:pointer}.art-video-player.art-info-show .art-info{display:flex}.art-hide-cursor *{cursor:none!important}.art-video-player[data-aspect-ratio]{overflow:hidden}.art-video-player[data-aspect-ratio] .art-video{object-fit:fill;box-sizing:content-box}.art-fullscreen{--art-progress-height: 8px;--art-indicator-size: 20px;--art-control-height: 60px;--art-control-icon-scale: 1.3}.art-fullscreen-web{--art-progress-height: 8px;--art-indicator-size: 20px;--art-control-height: 60px;--art-control-icon-scale: 1.3;position:fixed;inset:0;z-index:var(--art-fullscreen-web-index);width:100%;height:100%}.art-mini-popup{position:fixed;z-index:9999;width:320px;height:180px;background:#000;border-radius:var(--art-border-radius);cursor:move;user-select:none;overflow:hidden;transition:opacity .2s ease;box-shadow:0 0 5px #00000080}.art-mini-popup svg{fill:#fff}.art-mini-popup .art-video{pointer-events:none}.art-mini-popup .art-mini-close{position:absolute;z-index:20;right:10px;top:10px;cursor:pointer;opacity:0;transition:opacity .2s ease}.art-mini-popup .art-mini-state{position:absolute;inset:0;z-index:30;width:100%;height:100%;display:flex;justify-content:center;align-items:center;pointer-events:none;opacity:0;transition:opacity .2s ease;background-color:#00000040}.art-mini-popup .art-mini-state .art-icon{opacity:.75;cursor:pointer;transform:scale(3);pointer-events:auto;transition:transform .2s ease}.art-mini-popup .art-mini-state .art-icon:active{transform:scale(2.5)}.art-mini-popup.art-mini-dragging{opacity:.9}.art-mini-popup:hover .art-mini-close,.art-mini-popup:hover .art-mini-state{opacity:1}.art-video-player[data-flip=horizontal] .art-video{transform:scaleX(-1)}.art-video-player[data-flip=vertical] .art-video{transform:scaleY(-1)}.art-video-player .art-layer-lock{display:none;justify-content:center;align-items:center;position:absolute;top:50%;border-radius:50%;transform:translateY(-50%);height:var(--art-lock-size);width:var(--art-lock-size);left:var(--art-padding);background-color:var(--art-tip-background)}.art-video-player .art-layer-auto-playback{display:none;gap:10px;align-items:center;position:absolute;border-radius:var(--art-border-radius);padding:10px;line-height:1;left:var(--art-padding);bottom:calc(var(--art-control-height) + var(--art-bottom-gap) + 10px);background-color:var(--art-widget-background)}.art-video-player .art-layer-auto-playback .art-auto-playback-close{display:flex;justify-content:center;align-items:center;cursor:pointer}.art-video-player .art-layer-auto-playback .art-auto-playback-close svg{width:15px;height:15px;fill:var(--art-theme)}.art-video-player .art-layer-auto-playback .art-auto-playback-jump{color:var(--art-theme);cursor:pointer}.art-video-player.art-lock .art-subtitle{bottom:var(--art-subtitle-bottom)!important}.art-video-player.art-mini-progress-bar .art-bottom,.art-video-player.art-lock .art-bottom{opacity:1;padding:0;background-image:none}.art-video-player.art-mini-progress-bar .art-bottom .art-controls,.art-video-player.art-lock .art-bottom .art-controls,.art-video-player.art-mini-progress-bar .art-bottom .art-progress,.art-video-player.art-lock .art-bottom .art-progress{transform:translateY(calc(var(--art-control-height) + var(--art-bottom-gap) + var(--art-progress-height) / 4))}.art-video-player.art-mini-progress-bar .art-bottom .art-progress-indicator,.art-video-player.art-lock .art-bottom .art-progress-indicator{display:none!important}.art-video-player.art-control-show .art-layer-lock{display:flex}.art-control-selector{position:relative;display:flex;justify-content:center}.art-control-selector .art-selector-list{display:flex;flex-direction:column;align-items:center;text-align:center;position:absolute;border-radius:var(--art-border-radius);overflow-y:auto;overflow-x:hidden;opacity:0;transform:translateY(10px);pointer-events:none;bottom:var(--art-control-height);max-height:var(--art-selector-max-height);background-color:var(--art-widget-background);transition:all var(--art-transition-duration) ease}.art-control-selector .art-selector-list .art-selector-item{display:flex;justify-content:center;align-items:center;width:100%;padding:10px 15px;flex-shrink:0;line-height:1}.art-control-selector .art-selector-list .art-selector-item:hover{background-color:#ffffff1a}.art-control-selector .art-selector-list .art-selector-item:hover,.art-control-selector .art-selector-list .art-selector-item.art-current{color:var(--art-theme)}.art-control-selector:hover .art-selector-list{opacity:1;transform:translateY(0);pointer-events:auto}.art-video-player [class*=hint--]{position:relative;display:inline-block;font-style:normal}.art-video-player [class*=hint--]:before,.art-video-player [class*=hint--]:after{position:absolute;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translateZ(0);visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;-webkit-transition:.3s ease;-moz-transition:.3s ease;transition:.3s ease;-webkit-transition-delay:0ms;-moz-transition-delay:0ms;transition-delay:0ms}.art-video-player [class*=hint--]:hover:before,.art-video-player [class*=hint--]:hover:after{visibility:visible;opacity:1}.art-video-player [class*=hint--]:hover:before,.art-video-player [class*=hint--]:hover:after{-webkit-transition-delay:.1s;-moz-transition-delay:.1s;transition-delay:.1s}.art-video-player [class*=hint--]:before{content:\"\";position:absolute;background:transparent;border:6px solid transparent;z-index:1000001}.art-video-player [class*=hint--]:after{background:#000;color:#fff;padding:8px 10px;font-size:12px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;line-height:12px;white-space:nowrap}.art-video-player [class*=hint--][aria-label]:after{content:attr(aria-label)}.art-video-player [class*=hint--][data-hint]:after{content:attr(data-hint)}.art-video-player [aria-label=\"\"]:before,.art-video-player [aria-label=\"\"]:after,.art-video-player [data-hint=\"\"]:before,.art-video-player [data-hint=\"\"]:after{display:none!important}.art-video-player .hint--top-left:before{border-top-color:#000}.art-video-player .hint--top-right:before{border-top-color:#000}.art-video-player .hint--top:before{border-top-color:#000}.art-video-player .hint--bottom-left:before{border-bottom-color:#000}.art-video-player .hint--bottom-right:before{border-bottom-color:#000}.art-video-player .hint--bottom:before{border-bottom-color:#000}.art-video-player .hint--left:before{border-left-color:#000}.art-video-player .hint--right:before{border-right-color:#000}.art-video-player .hint--top:before{margin-bottom:-11px}.art-video-player .hint--top:before,.art-video-player .hint--top:after{bottom:100%;left:50%}.art-video-player .hint--top:before{left:calc(50% - 6px)}.art-video-player .hint--top:after{-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);transform:translate(-50%)}.art-video-player .hint--top:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-moz-transform:translateX(-50%) translateY(-8px);transform:translate(-50%) translateY(-8px)}.art-video-player .hint--bottom:before{margin-top:-11px}.art-video-player .hint--bottom:before,.art-video-player .hint--bottom:after{top:100%;left:50%}.art-video-player .hint--bottom:before{left:calc(50% - 6px)}.art-video-player .hint--bottom:after{-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);transform:translate(-50%)}.art-video-player .hint--bottom:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-moz-transform:translateX(-50%) translateY(8px);transform:translate(-50%) translateY(8px)}.art-video-player .hint--right:before{margin-left:-11px;margin-bottom:-6px}.art-video-player .hint--right:after{margin-bottom:-14px}.art-video-player .hint--right:before,.art-video-player .hint--right:after{left:100%;bottom:50%}.art-video-player .hint--right:hover:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translate(8px)}.art-video-player .hint--right:hover:after{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translate(8px)}.art-video-player .hint--left:before{margin-right:-11px;margin-bottom:-6px}.art-video-player .hint--left:after{margin-bottom:-14px}.art-video-player .hint--left:before,.art-video-player .hint--left:after{right:100%;bottom:50%}.art-video-player .hint--left:hover:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translate(-8px)}.art-video-player .hint--left:hover:after{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translate(-8px)}.art-video-player .hint--top-left:before{margin-bottom:-11px}.art-video-player .hint--top-left:before,.art-video-player .hint--top-left:after{bottom:100%;left:50%}.art-video-player .hint--top-left:before{left:calc(50% - 6px)}.art-video-player .hint--top-left:after{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);transform:translate(-100%)}.art-video-player .hint--top-left:after{margin-left:12px}.art-video-player .hint--top-left:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--top-left:hover:after{-webkit-transform:translateX(-100%) translateY(-8px);-moz-transform:translateX(-100%) translateY(-8px);transform:translate(-100%) translateY(-8px)}.art-video-player .hint--top-right:before{margin-bottom:-11px}.art-video-player .hint--top-right:before,.art-video-player .hint--top-right:after{bottom:100%;left:50%}.art-video-player .hint--top-right:before{left:calc(50% - 6px)}.art-video-player .hint--top-right:after{-webkit-transform:translateX(0);-moz-transform:translateX(0);transform:translate(0)}.art-video-player .hint--top-right:after{margin-left:-12px}.art-video-player .hint--top-right:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--top-right:hover:after{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--bottom-left:before{margin-top:-11px}.art-video-player .hint--bottom-left:before,.art-video-player .hint--bottom-left:after{top:100%;left:50%}.art-video-player .hint--bottom-left:before{left:calc(50% - 6px)}.art-video-player .hint--bottom-left:after{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);transform:translate(-100%)}.art-video-player .hint--bottom-left:after{margin-left:12px}.art-video-player .hint--bottom-left:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--bottom-left:hover:after{-webkit-transform:translateX(-100%) translateY(8px);-moz-transform:translateX(-100%) translateY(8px);transform:translate(-100%) translateY(8px)}.art-video-player .hint--bottom-right:before{margin-top:-11px}.art-video-player .hint--bottom-right:before,.art-video-player .hint--bottom-right:after{top:100%;left:50%}.art-video-player .hint--bottom-right:before{left:calc(50% - 6px)}.art-video-player .hint--bottom-right:after{-webkit-transform:translateX(0);-moz-transform:translateX(0);transform:translate(0)}.art-video-player .hint--bottom-right:after{margin-left:-12px}.art-video-player .hint--bottom-right:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--bottom-right:hover:after{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--small:after,.art-video-player .hint--medium:after,.art-video-player .hint--large:after{white-space:normal;line-height:1.4em;word-wrap:break-word}.art-video-player .hint--small:after{width:80px}.art-video-player .hint--medium:after{width:150px}.art-video-player .hint--large:after{width:300px}.art-video-player [class*=hint--]:after{text-shadow:0 -1px 0px black;box-shadow:4px 4px 8px #0000004d}.art-video-player .hint--error:after{background-color:#b34e4d;text-shadow:0 -1px 0px #592726}.art-video-player .hint--error.hint--top-left:before{border-top-color:#b34e4d}.art-video-player .hint--error.hint--top-right:before{border-top-color:#b34e4d}.art-video-player .hint--error.hint--top:before{border-top-color:#b34e4d}.art-video-player .hint--error.hint--bottom-left:before{border-bottom-color:#b34e4d}.art-video-player .hint--error.hint--bottom-right:before{border-bottom-color:#b34e4d}.art-video-player .hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.art-video-player .hint--error.hint--left:before{border-left-color:#b34e4d}.art-video-player .hint--error.hint--right:before{border-right-color:#b34e4d}.art-video-player .hint--warning:after{background-color:#c09854;text-shadow:0 -1px 0px #6c5328}.art-video-player .hint--warning.hint--top-left:before{border-top-color:#c09854}.art-video-player .hint--warning.hint--top-right:before{border-top-color:#c09854}.art-video-player .hint--warning.hint--top:before{border-top-color:#c09854}.art-video-player .hint--warning.hint--bottom-left:before{border-bottom-color:#c09854}.art-video-player .hint--warning.hint--bottom-right:before{border-bottom-color:#c09854}.art-video-player .hint--warning.hint--bottom:before{border-bottom-color:#c09854}.art-video-player .hint--warning.hint--left:before{border-left-color:#c09854}.art-video-player .hint--warning.hint--right:before{border-right-color:#c09854}.art-video-player .hint--info:after{background-color:#3986ac;text-shadow:0 -1px 0px #1a3c4d}.art-video-player .hint--info.hint--top-left:before{border-top-color:#3986ac}.art-video-player .hint--info.hint--top-right:before{border-top-color:#3986ac}.art-video-player .hint--info.hint--top:before{border-top-color:#3986ac}.art-video-player .hint--info.hint--bottom-left:before{border-bottom-color:#3986ac}.art-video-player .hint--info.hint--bottom-right:before{border-bottom-color:#3986ac}.art-video-player .hint--info.hint--bottom:before{border-bottom-color:#3986ac}.art-video-player .hint--info.hint--left:before{border-left-color:#3986ac}.art-video-player .hint--info.hint--right:before{border-right-color:#3986ac}.art-video-player .hint--success:after{background-color:#458746;text-shadow:0 -1px 0px #1a321a}.art-video-player .hint--success.hint--top-left:before{border-top-color:#458746}.art-video-player .hint--success.hint--top-right:before{border-top-color:#458746}.art-video-player .hint--success.hint--top:before{border-top-color:#458746}.art-video-player .hint--success.hint--bottom-left:before{border-bottom-color:#458746}.art-video-player .hint--success.hint--bottom-right:before{border-bottom-color:#458746}.art-video-player .hint--success.hint--bottom:before{border-bottom-color:#458746}.art-video-player .hint--success.hint--left:before{border-left-color:#458746}.art-video-player .hint--success.hint--right:before{border-right-color:#458746}.art-video-player .hint--always:after,.art-video-player .hint--always:before{opacity:1;visibility:visible}.art-video-player .hint--always.hint--top:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--always.hint--top:after{-webkit-transform:translateX(-50%) translateY(-8px);-moz-transform:translateX(-50%) translateY(-8px);transform:translate(-50%) translateY(-8px)}.art-video-player .hint--always.hint--top-left:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--always.hint--top-left:after{-webkit-transform:translateX(-100%) translateY(-8px);-moz-transform:translateX(-100%) translateY(-8px);transform:translate(-100%) translateY(-8px)}.art-video-player .hint--always.hint--top-right:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--always.hint--top-right:after{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.art-video-player .hint--always.hint--bottom:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--always.hint--bottom:after{-webkit-transform:translateX(-50%) translateY(8px);-moz-transform:translateX(-50%) translateY(8px);transform:translate(-50%) translateY(8px)}.art-video-player .hint--always.hint--bottom-left:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--always.hint--bottom-left:after{-webkit-transform:translateX(-100%) translateY(8px);-moz-transform:translateX(-100%) translateY(8px);transform:translate(-100%) translateY(8px)}.art-video-player .hint--always.hint--bottom-right:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--always.hint--bottom-right:after{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.art-video-player .hint--always.hint--left:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translate(-8px)}.art-video-player .hint--always.hint--left:after{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translate(-8px)}.art-video-player .hint--always.hint--right:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translate(8px)}.art-video-player .hint--always.hint--right:after{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translate(8px)}.art-video-player .hint--rounded:after{border-radius:4px}.art-video-player .hint--no-animate:before,.art-video-player .hint--no-animate:after{-webkit-transition-duration:0ms;-moz-transition-duration:0ms;transition-duration:0ms}.art-video-player .hint--bounce:before,.art-video-player .hint--bounce:after{-webkit-transition:opacity .3s ease,visibility .3s ease,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s ease,visibility .3s ease,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s ease,visibility .3s ease,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.art-video-player .hint--no-shadow:before,.art-video-player .hint--no-shadow:after{text-shadow:initial;box-shadow:initial}.art-video-player .hint--no-arrow:before{display:none}.art-video-player.art-mobile{--art-bottom-gap: 10px;--art-control-height: 38px;--art-control-icon-scale: 1;--art-state-size: 60px;--art-settings-max-height: 180px;--art-selector-max-height: 180px;--art-indicator-scale: 1;--art-control-opacity: 1}.art-video-player.art-mobile .art-controls-left{margin-left:calc(var(--art-padding) / -1)}.art-video-player.art-mobile .art-controls-right{margin-right:calc(var(--art-padding) / -1)}';class re extends xt{constructor(t){super(t),this.name=\"subtitle\",this.option=null,this.destroyEvent=()=>null,this.init(t.option.subtitle);let e=!1;t.on(\"video:timeupdate\",()=>{if(!this.url)return;const t=this.art.template.$video.webkitDisplayingFullscreen;\"boolean\"===typeof t&&t!==e&&(e=t,this.createTrack(t?\"subtitles\":\"metadata\",this.url))})}get url(){return this.art.template.$track.src}set url(t){this.switch(t)}get textTrack(){var t,e;return null==(e=null==(t=this.art.template.$video)?void 0:t.textTracks)?void 0:e[0]}get activeCues(){return this.textTrack?Array.from(this.textTrack.activeCues):[]}get cues(){return this.textTrack?Array.from(this.textTrack.cues):[]}style(t,e){const{$subtitle:r}=this.art.template;return\"object\"===typeof t?P(r,t):I(r,t,e)}update(){const{option:{subtitle:t},template:{$subtitle:e}}=this.art;e.innerHTML=\"\",this.activeCues.length&&(this.art.emit(\"subtitleBeforeUpdate\",this.activeCues),e.innerHTML=this.activeCues.map((e,r)=>e.text.split(/\\r?\\n/).filter(t=>t.trim()).map(e=>`<div class=\"art-subtitle-line\" data-group=\"${r}\">\\n                                ${t.escape?Q(e):e}\\n                            </div>`).join(\"\")).join(\"\"),this.art.emit(\"subtitleAfterUpdate\",this.activeCues))}switch(t){return d(this,arguments,function*(t,e={}){const{i18n:r,notice:o,option:a}=this.art,n=c(l(l({},a.subtitle),e),{url:t}),i=yield this.init(n);return e.name&&(o.show=`${r.get(\"Switch Subtitle\")}: ${e.name}`),i})}createTrack(t,e){const{template:r,proxy:o,option:a}=this.art,{$video:n,$track:i}=r,s=D(\"track\");s.default=!0,s.kind=t,s.src=e,s.label=a.subtitle.name||\"Artplayer\",s.track.mode=\"hidden\",s.onload=()=>{this.art.emit(\"subtitleLoad\",this.cues,this.option)},this.art.events.remove(this.destroyEvent),i.onload=null,M(i),S(n,s),r.$track=s,this.destroyEvent=o(this.textTrack,\"cuechange\",()=>this.update())}init(t){return d(this,null,function*(){const{notice:e,template:{$subtitle:r}}=this.art;return this.textTrack?(f(t,wt.subtitle),t.url?(this.option=t,this.style(t.style),fetch(t.url).then(t=>t.arrayBuffer()).then(e=>{const r=new TextDecoder(t.encoding).decode(e);switch(t.type||X(t.url)){case\"srt\":{const e=nt(r);return it(t.onVttLoad(e))}case\"ass\":{const e=st(r);return it(t.onVttLoad(e))}case\"vtt\":return it(t.onVttLoad(r));default:return t.url}}).then(t=>(r.innerHTML=\"\",this.url===t||(URL.revokeObjectURL(this.url),this.createTrack(\"metadata\",t)),t)).catch(t=>{throw r.innerHTML=\"\",e.show=t,t})):void 0):null})}}class oe{constructor(t){this.art=t;const{option:e,constructor:r}=t;e.container instanceof Element?this.$container=e.container:(this.$container=T(e.container),q(this.$container,`No container element found by ${e.container}`)),q(B(),\"The current browser does not support flex layout\");const o=this.$container.tagName.toLowerCase();q(\"div\"===o,`Unsupported container element type, only support 'div' but got '${o}'`),q(r.instances.every(t=>t.template.$container!==this.$container),\"Cannot mount multiple instances on the same dom element\"),this.query=this.query.bind(this),this.$container.dataset.artId=t.id,this.init()}static get html(){return`\\n          <div class=\"art-video-player art-subtitle-show art-layer-show art-control-show art-mask-show\">\\n            <video class=\"art-video\">\\n              <track default kind=\"metadata\" src=\"\"></track>\\n            </video>\\n            <div class=\"art-poster\"></div>\\n            <div class=\"art-subtitle\"></div>\\n            <div class=\"art-danmuku\"></div>\\n            <div class=\"art-layers\"></div>\\n            <div class=\"art-mask\">\\n              <div class=\"art-state\"></div>\\n            </div>\\n            <div class=\"art-bottom\">\\n              <div class=\"art-progress\"></div>\\n              <div class=\"art-controls\">\\n                <div class=\"art-controls-left\"></div>\\n                <div class=\"art-controls-center\"></div>\\n                <div class=\"art-controls-right\"></div>\\n              </div>\\n            </div>\\n            <div class=\"art-loading\"></div>\\n            <div class=\"art-notice\">\\n              <div class=\"art-notice-inner\"></div>\\n            </div>\\n            <div class=\"art-settings\"></div>\\n            <div class=\"art-info\">\\n              <div class=\"art-info-panel\">\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Player version:</div>\\n                  <div class=\"art-info-content\">${g}</div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video url:</div>\\n                  <div class=\"art-info-content\" data-video=\"currentSrc\"></div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video volume:</div>\\n                  <div class=\"art-info-content\" data-video=\"volume\"></div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video time:</div>\\n                  <div class=\"art-info-content\" data-video=\"currentTime\"></div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video duration:</div>\\n                  <div class=\"art-info-content\" data-video=\"duration\"></div>\\n                </div>\\n                <div class=\"art-info-item\">\\n                  <div class=\"art-info-title\">Video resolution:</div>\\n                  <div class=\"art-info-content\">\\n                    <span data-video=\"videoWidth\"></span> x <span data-video=\"videoHeight\"></span>\\n                  </div>\\n                </div>\\n              </div>\\n              <div class=\"art-info-close\">[x]</div>\\n            </div>\\n            <div class=\"art-contextmenus\"></div>\\n          </div>\\n        `}query(t){return T(t,this.$container)}init(){const{option:t}=this.art;if(t.useSSR||(this.$container.innerHTML=oe.html),this.$player=this.query(\".art-video-player\"),this.$video=this.query(\".art-video\"),this.$track=this.query(\"track\"),this.$poster=this.query(\".art-poster\"),this.$subtitle=this.query(\".art-subtitle\"),this.$danmuku=this.query(\".art-danmuku\"),this.$bottom=this.query(\".art-bottom\"),this.$progress=this.query(\".art-progress\"),this.$controls=this.query(\".art-controls\"),this.$controlsLeft=this.query(\".art-controls-left\"),this.$controlsCenter=this.query(\".art-controls-center\"),this.$controlsRight=this.query(\".art-controls-right\"),this.$layer=this.query(\".art-layers\"),this.$loading=this.query(\".art-loading\"),this.$notice=this.query(\".art-notice\"),this.$noticeInner=this.query(\".art-notice-inner\"),this.$mask=this.query(\".art-mask\"),this.$state=this.query(\".art-state\"),this.$setting=this.query(\".art-settings\"),this.$info=this.query(\".art-info\"),this.$infoPanel=this.query(\".art-info-panel\"),this.$infoClose=this.query(\".art-info-close\"),this.$contextmenu=this.query(\".art-contextmenus\"),t.proxy){const e=t.proxy.call(this.art,this.art);q(e instanceof HTMLVideoElement||e instanceof HTMLCanvasElement,\"Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'\"),Y(e,this.$video),e.className=\"art-video\",this.$video=e}t.backdrop&&C(this.$player,\"art-backdrop\"),k&&C(this.$player,\"art-mobile\")}destroy(t){t?this.$container.innerHTML=\"\":C(this.$player,\"art-destroy\")}}class ae{on(t,e,r){const o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:r}),this}once(t,e,r){const o=this;function a(...n){o.off(t,a),e.apply(r,n)}return a._=e,this.on(t,a,r)}emit(t,...e){const r=((this.e||(this.e={}))[t]||[]).slice();for(let o=0;o<r.length;o+=1)r[o].fn.apply(r[o].ctx,e);return this}off(t,e){const r=this.e||(this.e={}),o=r[t],a=[];if(o&&e)for(let n=0,i=o.length;n<i;n+=1)o[n].fn!==e&&o[n].fn._!==e&&a.push(o[n]);return a.length?r[t]=a:delete r[t],this}}let ne=0;const ie=[];class se extends ae{constructor(t,e){if(super(),!$)throw new Error(\"Artplayer can only be used in the browser environment\");this.id=++ne;const r=at(se.option,t);if(r.container=t.container,this.option=f(r,wt),this.isLock=!1,this.isReady=!1,this.isFocus=!1,this.isInput=!1,this.isRotate=!1,this.isDestroy=!1,this.template=new oe(this),this.events=new Lt(this),this.storage=new te(this),this.icons=new Pt(this),this.i18n=new It(this),this.notice=new Vt(this),this.player=new Ut(this),this.layers=new Ot(this),this.controls=new Ct(this),this.contextmenu=new kt(this),this.subtitle=new re(this),this.info=new At(this),this.loading=new Rt(this),this.hotkey=new St(this),this.mask=new _t(this),this.setting=new Qt(this),this.plugins=new Jt(this),\"function\"===typeof e&&this.on(\"ready\",()=>e.call(this,this)),se.DEBUG){const t=t=>console.log(`[ART.${this.id}] -> ${t}`);t(`Version@${se.version}`);for(let e=0;e<v.events.length;e++)this.on(`video:${v.events[e]}`,e=>t(`Event@${e.type}`))}ie.push(this)}static get instances(){return ie}static get version(){return g}static get config(){return v}static get utils(){return pt}static get scheme(){return wt}static get Emitter(){return ae}static get validator(){return f}static get kindOf(){return f.kindOf}static get html(){return oe.html}static get option(){return{id:\"\",container:\"#artplayer\",url:\"\",poster:\"\",type:\"\",theme:\"#f00\",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,gesture:!0,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,proxy:void 0,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:\"\",number:60,column:10,width:0,height:0,scale:1},subtitle:{url:\"\",type:\"\",style:{},name:\"\",escape:!0,encoding:\"utf-8\",onVttLoad:t=>t},moreVideoAttr:{controls:!1,preload:b?\"auto\":\"metadata\"},i18n:{},icons:{},cssVar:{},customType:{},lang:null==navigator?void 0:navigator.language.toLowerCase()}}get proxy(){return this.events.proxy}get query(){return this.template.query}get video(){return this.template.$video}reset(){this.video.removeAttribute(\"src\"),this.video.load()}destroy(t=!0){se.REMOVE_SRC_WHEN_DESTROY&&this.reset(),this.events.destroy(),this.template.destroy(t),ie.splice(ie.indexOf(this),1),this.isDestroy=!0,this.emit(\"destroy\")}}return se.STYLE=ee,se.DEBUG=!1,se.CONTEXTMENU=!0,se.NOTICE_TIME=2e3,se.SETTING_WIDTH=250,se.SETTING_ITEM_WIDTH=200,se.SETTING_ITEM_HEIGHT=35,se.RESIZE_TIME=200,se.SCROLL_TIME=200,se.SCROLL_GAP=50,se.AUTO_PLAYBACK_MAX=10,se.AUTO_PLAYBACK_MIN=5,se.AUTO_PLAYBACK_TIMEOUT=3e3,se.RECONNECT_TIME_MAX=5,se.RECONNECT_SLEEP_TIME=1e3,se.CONTROL_HIDE_TIME=3e3,se.DBCLICK_TIME=300,se.DBCLICK_FULLSCREEN=!0,se.MOBILE_DBCLICK_PLAY=!0,se.MOBILE_CLICK_PLAY=!1,se.AUTO_ORIENTATION_TIME=200,se.INFO_LOOP_TIME=1e3,se.FAST_FORWARD_VALUE=3,se.FAST_FORWARD_TIME=1e3,se.TOUCH_MOVE_RATIO=.5,se.VOLUME_STEP=.1,se.SEEK_STEP=5,se.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],se.ASPECT_RATIO=[\"default\",\"4:3\",\"16:9\"],se.FLIP=[\"normal\",\"horizontal\",\"vertical\"],se.FULLSCREEN_WEB_IN_BODY=!0,se.LOG_VERSION=!0,se.USE_RAF=!1,se.REMOVE_SRC_WHEN_DESTROY=!0,$&&(F(\"artplayer-style\",ee)),se});\ndiff --git a/dist/artplayer.mjs b/dist/artplayer.mjs\nindex 24305d13a99657c908df49b5d1ade096083e2502..a71ace2597096b73b3643700642c0a861c0fda72 100644\n--- a/dist/artplayer.mjs\n+++ b/dist/artplayer.mjs\n@@ -4996,16 +4996,6 @@ Artplayer.USE_RAF = false;\n Artplayer.REMOVE_SRC_WHEN_DESTROY = true;\n if (isBrowser) {\n   setStyleText(\"artplayer-style\", style);\n-  setTimeout(() => {\n-    if (Artplayer.LOG_VERSION) {\n-      console.log(\n-        `%c ArtPlayer %c ${Artplayer.version} %c https://artplayer.org`,\n-        \"color: #fff; background: #5f5f5f\",\n-        \"color: #fff; background: #4bc729\",\n-        \"\"\n-      );\n-    }\n-  }, 100);\n }\n export {\n   Artplayer as default\n"
  },
  {
    "path": "patches/atomically-npm-1.7.0-e742e5293b.patch",
    "content": "diff --git a/dist/utils/temp.js b/dist/utils/temp.js\nindex c0844f640f7927ff87edda13f7c853d10ebb8dd0..3ca3d29e0f4ee700c43ebde47002883955b664b3 100644\n--- a/dist/utils/temp.js\n+++ b/dist/utils/temp.js\n@@ -2,6 +2,7 @@\n /* IMPORT */\n Object.defineProperty(exports, \"__esModule\", { value: true });\n const path = require(\"path\");\n+const process = require(\"process\");\n const consts_1 = require(\"../consts\");\n const fs_1 = require(\"./fs\");\n /* TEMP */\n"
  },
  {
    "path": "patches/dplayer@1.32.7.patch",
    "content": "diff --git a/dist/DPlayer.min.js b/dist/DPlayer.min.js\nindex e88af993f345e0fc0f7c6b1f8084582352d416cf..d78fbbcfe5b9cd6f21408fd3f0e7a18284795a3e 100644\n--- a/dist/DPlayer.min.js\n+++ b/dist/DPlayer.min.js\n@@ -1,3 +1,3 @@\n !function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(\"DPlayer\",[],t):\"object\"==typeof exports?exports.DPlayer=t():e.DPlayer=t()}(globalThis,()=>(()=>{var e={1:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 32 32\"><path d=\"M27.128 0.38h-22.553c-2.336 0-4.229 1.825-4.229 4.076v16.273c0 2.251 1.893 4.076 4.229 4.076h4.229v-2.685h8.403l-8.784 8.072 1.566 1.44 7.429-6.827h9.71c2.335 0 4.229-1.825 4.229-4.076v-16.273c0-2.252-1.894-4.076-4.229-4.076zM28.538 19.403c0 1.5-1.262 2.717-2.819 2.717h-8.36l-0.076-0.070-0.076 0.070h-11.223c-1.557 0-2.819-1.217-2.819-2.717v-13.589c0-1.501 1.262-2.718 2.819-2.718h19.734c1.557 0 2.819-0.141 2.819 1.359v14.947zM9.206 10.557c-1.222 0-2.215 0.911-2.215 2.036s0.992 2.035 2.215 2.035c1.224 0 2.216-0.911 2.216-2.035s-0.992-2.036-2.216-2.036zM22.496 10.557c-1.224 0-2.215 0.911-2.215 2.036s0.991 2.035 2.215 2.035c1.224 0 2.215-0.911 2.215-2.035s-0.991-2.036-2.215-2.036zM15.852 10.557c-1.224 0-2.215 0.911-2.215 2.036s0.991 2.035 2.215 2.035c1.222 0 2.215-0.911 2.215-2.035s-0.992-2.036-2.215-2.036z\"></path></svg>'},28:e=>{e.exports='<svg viewBox=\"0 0 288 288\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M288 90v96c0 20-16 36-36 36h-10c-16 0-16-24 0-24h10c7 0 12-5 12-12V90c0-7-5-12-12-12H36c-7 0-12 5-12 12v96c0 7 5 12 12 12h10c16 0 16 24 0 24H36c-20 0-36-16-36-36V90c0-20 16-36 36-36h216c20 0 36 16 36 36zm-120 62l48 68c14 20 1 38-20 38H92c-21 0-34-18-20-38l48-68c13-18 35-18 48 0z\"></path></svg>'},30:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 32 32\"><path d=\"M26.667 5.333h-21.333c-0 0-0.001 0-0.001 0-1.472 0-2.666 1.194-2.666 2.666 0 0 0 0.001 0 0.001v-0 16c0 0 0 0.001 0 0.001 0 1.472 1.194 2.666 2.666 2.666 0 0 0.001 0 0.001 0h21.333c0 0 0.001 0 0.001 0 1.472 0 2.666-1.194 2.666-2.666 0-0 0-0.001 0-0.001v0-16c0-0 0-0.001 0-0.001 0-1.472-1.194-2.666-2.666-2.666-0 0-0.001 0-0.001 0h0zM5.333 16h5.333v2.667h-5.333v-2.667zM18.667 24h-13.333v-2.667h13.333v2.667zM26.667 24h-5.333v-2.667h5.333v2.667zM26.667 18.667h-13.333v-2.667h13.333v2.667z\"></path></svg>'},32:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 17 32\"><path d=\"M14.080 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048zM2.88 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048z\"></path></svg>'},34:e=>{\"use strict\";e.exports=function(e){var t=e[1],i=e[3];if(!i)return t;if(\"function\"==typeof btoa){var n=btoa(unescape(encodeURIComponent(JSON.stringify(i)))),a=\"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(n),r=\"/*# \".concat(a,\" */\");return[t].concat([r]).join(\"\\n\")}return[t].join(\"\\n\")}},56:(e,t,i)=>{\"use strict\";e.exports=function(e){var t=i.nc;t&&e.setAttribute(\"nonce\",t)}},72:e=>{\"use strict\";var t=[];function i(e){for(var i=-1,n=0;n<t.length;n++)if(t[n].identifier===e){i=n;break}return i}function n(e,n){for(var r={},o=[],s=0;s<e.length;s++){var l=e[s],d=n.base?l[0]+n.base:l[0],p=r[d]||0,c=\"\".concat(d,\" \").concat(p);r[d]=p+1;var h=i(c),u={css:l[1],media:l[2],sourceMap:l[3],supports:l[4],layer:l[5]};if(-1!==h)t[h].references++,t[h].updater(u);else{var f=a(u,n);n.byIndex=s,t.splice(s,0,{identifier:c,updater:f,references:1})}o.push(c)}return o}function a(e,t){var i=t.domAPI(t);i.update(e);return function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap&&t.supports===e.supports&&t.layer===e.layer)return;i.update(e=t)}else i.remove()}}e.exports=function(e,a){var r=n(e=e||[],a=a||{});return function(e){e=e||[];for(var o=0;o<r.length;o++){var s=i(r[o]);t[s].references--}for(var l=n(e,a),d=0;d<r.length;d++){var p=i(r[d]);0===t[p].references&&(t[p].updater(),t.splice(p,1))}r=l}}},105:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 32 32\" style=\"transform: scale(-1,1)\"><path d=\"M22 16l-10.105-10.6-1.895 1.987 8.211 8.613-8.211 8.612 1.895 1.988 8.211-8.613z\"></path></svg>'},113:e=>{\"use strict\";e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},122:e=>{\"use strict\";e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var i=\"\",n=void 0!==t[5];return t[4]&&(i+=\"@supports (\".concat(t[4],\") {\")),t[2]&&(i+=\"@media \".concat(t[2],\" {\")),n&&(i+=\"@layer\".concat(t[5].length>0?\" \".concat(t[5]):\"\",\" {\")),i+=e(t),n&&(i+=\"}\"),t[2]&&(i+=\"}\"),t[4]&&(i+=\"}\"),i}).join(\"\")},t.i=function(e,i,n,a,r){\"string\"==typeof e&&(e=[[null,e,void 0]]);var o={};if(n)for(var s=0;s<this.length;s++){var l=this[s][0];null!=l&&(o[l]=!0)}for(var d=0;d<e.length;d++){var p=[].concat(e[d]);n&&o[p[0]]||(void 0!==r&&(void 0===p[5]||(p[1]=\"@layer\".concat(p[5].length>0?\" \".concat(p[5]):\"\",\" {\").concat(p[1],\"}\")),p[5]=r),i&&(p[2]?(p[1]=\"@media \".concat(p[2],\" {\").concat(p[1],\"}\"),p[2]=i):p[2]=i),a&&(p[4]?(p[1]=\"@supports (\".concat(p[4],\") {\").concat(p[1],\"}\"),p[4]=a):p[4]=\"\".concat(a)),t.push(p))}},t}},137:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 32 32\"><path d=\"M19.357 2.88c1.749 0 3.366 0.316 4.851 0.946 1.485 0.632 2.768 1.474 3.845 2.533s1.922 2.279 2.532 3.661c0.611 1.383 0.915 2.829 0.915 4.334 0 1.425-0.304 2.847-0.915 4.271-0.611 1.425-1.587 2.767-2.928 4.028-0.855 0.813-1.811 1.607-2.869 2.38s-2.136 1.465-3.233 2.075c-1.099 0.61-2.198 1.098-3.296 1.465-1.098 0.366-2.115 0.549-3.051 0.549-1.343 0-2.441-0.438-3.296-1.311-0.854-0.876-1.281-2.41-1.281-4.608 0-0.366 0.020-0.773 0.060-1.221s0.062-0.895 0.062-1.343c0-0.773-0.183-1.353-0.55-1.738-0.366-0.387-0.793-0.58-1.281-0.58-0.652 0-1.21 0.295-1.678 0.886s-0.926 1.23-1.373 1.921c-0.447 0.693-0.905 1.334-1.372 1.923s-1.028 0.886-1.679 0.886c-0.529 0-1.048-0.427-1.556-1.282s-0.763-2.259-0.763-4.212c0-2.197 0.529-4.241 1.587-6.133s2.462-3.529 4.21-4.912c1.75-1.383 3.762-2.471 6.041-3.264 2.277-0.796 4.617-1.212 7.018-1.253zM7.334 15.817c0.569 0 1.047-0.204 1.434-0.611s0.579-0.875 0.579-1.404c0-0.569-0.193-1.047-0.579-1.434s-0.864-0.579-1.434-0.579c-0.529 0-0.987 0.193-1.373 0.579s-0.58 0.864-0.58 1.434c0 0.53 0.194 0.998 0.58 1.404 0.388 0.407 0.845 0.611 1.373 0.611zM12.216 11.79c0.691 0 1.292-0.254 1.8-0.763s0.762-1.107 0.762-1.8c0-0.732-0.255-1.343-0.762-1.831-0.509-0.489-1.109-0.732-1.8-0.732-0.732 0-1.342 0.244-1.831 0.732-0.488 0.488-0.732 1.098-0.732 1.831 0 0.693 0.244 1.292 0.732 1.8s1.099 0.763 1.831 0.763zM16.366 25.947c0.692 0 1.282-0.214 1.77-0.64s0.732-0.987 0.732-1.678-0.244-1.261-0.732-1.709c-0.489-0.448-1.078-0.671-1.77-0.671-0.65 0-1.21 0.223-1.678 0.671s-0.702 1.018-0.702 1.709c0 0.692 0.234 1.25 0.702 1.678s1.027 0.64 1.678 0.64zM19.113 9.592c0.651 0 1.129-0.203 1.433-0.611 0.305-0.406 0.459-0.874 0.459-1.404 0-0.488-0.154-0.947-0.459-1.373-0.304-0.427-0.782-0.641-1.433-0.641-0.529 0-1.008 0.193-1.434 0.58s-0.64 0.865-0.64 1.434c0 0.571 0.213 1.049 0.64 1.434 0.427 0.389 0.905 0.581 1.434 0.581zM24.848 12.826c0.57 0 1.067-0.213 1.495-0.64 0.427-0.427 0.64-0.947 0.64-1.556 0-0.57-0.214-1.068-0.64-1.495-0.428-0.427-0.927-0.64-1.495-0.64-0.611 0-1.129 0.213-1.555 0.64-0.428 0.427-0.642 0.926-0.642 1.495 0 0.611 0.213 1.129 0.642 1.556s0.947 0.64 1.555 0.64z\"></path></svg>'},143:(e,t,i)=>{\"use strict\";e.exports=i(845)},149:function(e){e.exports=function(){\"use strict\";var e={9306:function(e,t,i){var n=i(4901),a=i(6823),r=TypeError;e.exports=function(e){if(n(e))return e;throw new r(a(e)+\" is not a function\")}},5548:function(e,t,i){var n=i(3517),a=i(6823),r=TypeError;e.exports=function(e){if(n(e))return e;throw new r(a(e)+\" is not a constructor\")}},3506:function(e,t,i){var n=i(3925),a=String,r=TypeError;e.exports=function(e){if(n(e))return e;throw new r(\"Can't set \"+a(e)+\" as a prototype\")}},6469:function(e,t,i){var n=i(8227),a=i(2360),r=i(4913).f,o=n(\"unscopables\"),s=Array.prototype;void 0===s[o]&&r(s,o,{configurable:!0,value:a(null)}),e.exports=function(e){s[o][e]=!0}},7829:function(e,t,i){var n=i(8183).charAt;e.exports=function(e,t,i){return t+(i?n(e,t).length:1)}},679:function(e,t,i){var n=i(1625),a=TypeError;e.exports=function(e,t){if(n(t,e))return e;throw new a(\"Incorrect invocation\")}},8551:function(e,t,i){var n=i(34),a=String,r=TypeError;e.exports=function(e){if(n(e))return e;throw new r(a(e)+\" is not an object\")}},7811:function(e){e.exports=\"undefined\"!=typeof ArrayBuffer&&\"undefined\"!=typeof DataView},5652:function(e,t,i){var n=i(9039);e.exports=n(function(){if(\"function\"==typeof ArrayBuffer){var e=new ArrayBuffer(8);Object.isExtensible(e)&&Object.defineProperty(e,\"a\",{value:8})}})},4644:function(e,t,i){var n,a,r,o=i(7811),s=i(3724),l=i(4576),d=i(4901),p=i(34),c=i(9297),h=i(6955),u=i(6823),f=i(6699),A=i(6840),y=i(2106),m=i(1625),b=i(2787),g=i(2967),v=i(8227),C=i(3392),x=i(1181),w=x.enforce,k=x.get,_=l.Int8Array,S=_&&_.prototype,T=l.Uint8ClampedArray,B=T&&T.prototype,E=_&&b(_),I=S&&b(S),F=Object.prototype,R=l.TypeError,O=v(\"toStringTag\"),D=C(\"TYPED_ARRAY_TAG\"),M=\"TypedArrayConstructor\",L=o&&!!g&&\"Opera\"!==h(l.opera),P=!1,z={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},G={BigInt64Array:8,BigUint64Array:8},q=function(e){var t=b(e);if(p(t)){var i=k(t);return i&&c(i,M)?i[M]:q(t)}},j=function(e){if(!p(e))return!1;var t=h(e);return c(z,t)||c(G,t)};for(n in z)(r=(a=l[n])&&a.prototype)?w(r)[M]=a:L=!1;for(n in G)(r=(a=l[n])&&a.prototype)&&(w(r)[M]=a);if((!L||!d(E)||E===Function.prototype)&&(E=function(){throw new R(\"Incorrect invocation\")},L))for(n in z)l[n]&&g(l[n],E);if((!L||!I||I===F)&&(I=E.prototype,L))for(n in z)l[n]&&g(l[n].prototype,I);if(L&&b(B)!==I&&g(B,I),s&&!c(I,O))for(n in P=!0,y(I,O,{configurable:!0,get:function(){return p(this)?this[D]:void 0}}),z)l[n]&&f(l[n],D,n);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:L,TYPED_ARRAY_TAG:P&&D,aTypedArray:function(e){if(j(e))return e;throw new R(\"Target is not a typed array\")},aTypedArrayConstructor:function(e){if(d(e)&&(!g||m(E,e)))return e;throw new R(u(e)+\" is not a typed array constructor\")},exportTypedArrayMethod:function(e,t,i,n){if(s){if(i)for(var a in z){var r=l[a];if(r&&c(r.prototype,e))try{delete r.prototype[e]}catch(i){try{r.prototype[e]=t}catch(e){}}}I[e]&&!i||A(I,e,i?t:L&&S[e]||t,n)}},exportTypedArrayStaticMethod:function(e,t,i){var n,a;if(s){if(g){if(i)for(n in z)if((a=l[n])&&c(a,e))try{delete a[e]}catch(e){}if(E[e]&&!i)return;try{return A(E,e,i?t:L&&E[e]||t)}catch(e){}}for(n in z)!(a=l[n])||a[e]&&!i||A(a,e,t)}},getTypedArrayConstructor:q,isView:function(e){if(!p(e))return!1;var t=h(e);return\"DataView\"===t||c(z,t)||c(G,t)},isTypedArray:j,TypedArray:E,TypedArrayPrototype:I}},6346:function(e,t,i){var n=i(4576),a=i(9504),r=i(3724),o=i(7811),s=i(350),l=i(6699),d=i(2106),p=i(6279),c=i(9039),h=i(679),u=i(1291),f=i(8014),A=i(7696),y=i(5617),m=i(8490),b=i(2787),g=i(2967),v=i(4373),C=i(7680),x=i(3167),w=i(7740),k=i(687),_=i(1181),S=s.PROPER,T=s.CONFIGURABLE,B=\"ArrayBuffer\",E=\"DataView\",I=\"prototype\",F=\"Wrong index\",R=_.getterFor(B),O=_.getterFor(E),D=_.set,M=n[B],L=M,P=L&&L[I],z=n[E],G=z&&z[I],q=Object.prototype,j=n.Array,U=n.RangeError,H=a(v),N=a([].reverse),W=m.pack,J=m.unpack,V=function(e){return[255&e]},K=function(e){return[255&e,e>>8&255]},X=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},Y=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},$=function(e){return W(y(e),23,4)},Q=function(e){return W(e,52,8)},Z=function(e,t,i){d(e[I],t,{configurable:!0,get:function(){return i(this)[t]}})},ee=function(e,t,i,n){var a=O(e),r=A(i),o=!!n;if(r+t>a.byteLength)throw new U(F);var s=a.bytes,l=r+a.byteOffset,d=C(s,l,l+t);return o?d:N(d)},te=function(e,t,i,n,a,r){var o=O(e),s=A(i),l=n(+a),d=!!r;if(s+t>o.byteLength)throw new U(F);for(var p=o.bytes,c=s+o.byteOffset,h=0;h<t;h++)p[c+h]=l[d?h:t-h-1]};if(o){var ie=S&&M.name!==B;c(function(){M(1)})&&c(function(){new M(-1)})&&!c(function(){return new M,new M(1.5),new M(NaN),1!==M.length||ie&&!T})?ie&&T&&l(M,\"name\",B):((L=function(e){return h(this,P),x(new M(A(e)),this,L)})[I]=P,P.constructor=L,w(L,M)),g&&b(G)!==q&&g(G,q);var ne=new z(new L(2)),ae=a(G.setInt8);ne.setInt8(0,2147483648),ne.setInt8(1,2147483649),!ne.getInt8(0)&&ne.getInt8(1)||p(G,{setInt8:function(e,t){ae(this,e,t<<24>>24)},setUint8:function(e,t){ae(this,e,t<<24>>24)}},{unsafe:!0})}else P=(L=function(e){h(this,P);var t=A(e);D(this,{type:B,bytes:H(j(t),0),byteLength:t}),r||(this.byteLength=t,this.detached=!1)})[I],G=(z=function(e,t,i){h(this,G),h(e,P);var n=R(e),a=n.byteLength,o=u(t);if(o<0||o>a)throw new U(\"Wrong offset\");if(o+(i=void 0===i?a-o:f(i))>a)throw new U(\"Wrong length\");D(this,{type:E,buffer:e,byteLength:i,byteOffset:o,bytes:n.bytes}),r||(this.buffer=e,this.byteLength=i,this.byteOffset=o)})[I],r&&(Z(L,\"byteLength\",R),Z(z,\"buffer\",O),Z(z,\"byteLength\",O),Z(z,\"byteOffset\",O)),p(G,{getInt8:function(e){return ee(this,1,e)[0]<<24>>24},getUint8:function(e){return ee(this,1,e)[0]},getInt16:function(e){var t=ee(this,2,e,arguments.length>1&&arguments[1]);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=ee(this,2,e,arguments.length>1&&arguments[1]);return t[1]<<8|t[0]},getInt32:function(e){return Y(ee(this,4,e,arguments.length>1&&arguments[1]))},getUint32:function(e){return Y(ee(this,4,e,arguments.length>1&&arguments[1]))>>>0},getFloat32:function(e){return J(ee(this,4,e,arguments.length>1&&arguments[1]),23)},getFloat64:function(e){return J(ee(this,8,e,arguments.length>1&&arguments[1]),52)},setInt8:function(e,t){te(this,1,e,V,t)},setUint8:function(e,t){te(this,1,e,V,t)},setInt16:function(e,t){te(this,2,e,K,t,arguments.length>2&&arguments[2])},setUint16:function(e,t){te(this,2,e,K,t,arguments.length>2&&arguments[2])},setInt32:function(e,t){te(this,4,e,X,t,arguments.length>2&&arguments[2])},setUint32:function(e,t){te(this,4,e,X,t,arguments.length>2&&arguments[2])},setFloat32:function(e,t){te(this,4,e,$,t,arguments.length>2&&arguments[2])},setFloat64:function(e,t){te(this,8,e,Q,t,arguments.length>2&&arguments[2])}});k(L,B),k(z,E),e.exports={ArrayBuffer:L,DataView:z}},7029:function(e,t,i){var n=i(8981),a=i(5610),r=i(6198),o=i(4606),s=Math.min;e.exports=[].copyWithin||function(e,t){var i=n(this),l=r(i),d=a(e,l),p=a(t,l),c=arguments.length>2?arguments[2]:void 0,h=s((void 0===c?l:a(c,l))-p,l-d),u=1;for(p<d&&d<p+h&&(u=-1,p+=h-1,d+=h-1);h-- >0;)p in i?i[d]=i[p]:o(i,d),d+=u,p+=u;return i}},4373:function(e,t,i){var n=i(8981),a=i(5610),r=i(6198);e.exports=function(e){for(var t=n(this),i=r(t),o=arguments.length,s=a(o>1?arguments[1]:void 0,i),l=o>2?arguments[2]:void 0,d=void 0===l?i:a(l,i);d>s;)t[s++]=e;return t}},235:function(e,t,i){var n=i(9213).forEach,a=i(4598)(\"forEach\");e.exports=a?[].forEach:function(e){return n(this,e,arguments.length>1?arguments[1]:void 0)}},5370:function(e,t,i){var n=i(6198);e.exports=function(e,t,i){for(var a=0,r=arguments.length>2?i:n(t),o=new e(r);r>a;)o[a]=t[a++];return o}},7916:function(e,t,i){var n=i(6080),a=i(9565),r=i(8981),o=i(6319),s=i(4209),l=i(3517),d=i(6198),p=i(4659),c=i(81),h=i(851),u=Array;e.exports=function(e){var t=r(e),i=l(this),f=arguments.length,A=f>1?arguments[1]:void 0,y=void 0!==A;y&&(A=n(A,f>2?arguments[2]:void 0));var m,b,g,v,C,x,w=h(t),k=0;if(!w||this===u&&s(w))for(m=d(t),b=i?new this(m):u(m);m>k;k++)x=y?A(t[k],k):t[k],p(b,k,x);else for(b=i?new this:[],C=(v=c(t,w)).next;!(g=a(C,v)).done;k++)x=y?o(v,A,[g.value,k],!0):g.value,p(b,k,x);return b.length=k,b}},9617:function(e,t,i){var n=i(5397),a=i(5610),r=i(6198),o=function(e){return function(t,i,o){var s=n(t),l=r(s);if(0===l)return!e&&-1;var d,p=a(o,l);if(e&&i!=i){for(;l>p;)if((d=s[p++])!=d)return!0}else for(;l>p;p++)if((e||p in s)&&s[p]===i)return e||p||0;return!e&&-1}};e.exports={includes:o(!0),indexOf:o(!1)}},9213:function(e,t,i){var n=i(6080),a=i(9504),r=i(7055),o=i(8981),s=i(6198),l=i(1469),d=a([].push),p=function(e){var t=1===e,i=2===e,a=3===e,p=4===e,c=6===e,h=7===e,u=5===e||c;return function(f,A,y,m){for(var b,g,v=o(f),C=r(v),x=s(C),w=n(A,y),k=0,_=m||l,S=t?_(f,x):i||h?_(f,0):void 0;x>k;k++)if((u||k in C)&&(g=w(b=C[k],k,v),e))if(t)S[k]=g;else if(g)switch(e){case 3:return!0;case 5:return b;case 6:return k;case 2:d(S,b)}else switch(e){case 4:return!1;case 7:d(S,b)}return c?-1:a||p?p:S}};e.exports={forEach:p(0),map:p(1),filter:p(2),some:p(3),every:p(4),find:p(5),findIndex:p(6),filterReject:p(7)}},8379:function(e,t,i){var n=i(8745),a=i(5397),r=i(1291),o=i(6198),s=i(4598),l=Math.min,d=[].lastIndexOf,p=!!d&&1/[1].lastIndexOf(1,-0)<0,c=s(\"lastIndexOf\"),h=p||!c;e.exports=h?function(e){if(p)return n(d,this,arguments)||0;var t=a(this),i=o(t);if(0===i)return-1;var s=i-1;for(arguments.length>1&&(s=l(s,r(arguments[1]))),s<0&&(s=i+s);s>=0;s--)if(s in t&&t[s]===e)return s||0;return-1}:d},597:function(e,t,i){var n=i(9039),a=i(8227),r=i(9519),o=a(\"species\");e.exports=function(e){return r>=51||!n(function(){var t=[];return(t.constructor={})[o]=function(){return{foo:1}},1!==t[e](Boolean).foo})}},4598:function(e,t,i){var n=i(9039);e.exports=function(e,t){var i=[][e];return!!i&&n(function(){i.call(null,t||function(){return 1},1)})}},926:function(e,t,i){var n=i(9306),a=i(8981),r=i(7055),o=i(6198),s=TypeError,l=\"Reduce of empty array with no initial value\",d=function(e){return function(t,i,d,p){var c=a(t),h=r(c),u=o(c);if(n(i),0===u&&d<2)throw new s(l);var f=e?u-1:0,A=e?-1:1;if(d<2)for(;;){if(f in h){p=h[f],f+=A;break}if(f+=A,e?f<0:u<=f)throw new s(l)}for(;e?f>=0:u>f;f+=A)f in h&&(p=i(p,h[f],f,c));return p}};e.exports={left:d(!1),right:d(!0)}},4527:function(e,t,i){var n=i(3724),a=i(4376),r=TypeError,o=Object.getOwnPropertyDescriptor,s=n&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],\"length\",{writable:!1}).length=1}catch(e){return e instanceof TypeError}}();e.exports=s?function(e,t){if(a(e)&&!o(e,\"length\").writable)throw new r(\"Cannot set read only .length\");return e.length=t}:function(e,t){return e.length=t}},7680:function(e,t,i){var n=i(9504);e.exports=n([].slice)},4488:function(e,t,i){var n=i(7680),a=Math.floor,r=function(e,t){var i=e.length;if(i<8)for(var o,s,l=1;l<i;){for(s=l,o=e[l];s&&t(e[s-1],o)>0;)e[s]=e[--s];s!==l++&&(e[s]=o)}else for(var d=a(i/2),p=r(n(e,0,d),t),c=r(n(e,d),t),h=p.length,u=c.length,f=0,A=0;f<h||A<u;)e[f+A]=f<h&&A<u?t(p[f],c[A])<=0?p[f++]:c[A++]:f<h?p[f++]:c[A++];return e};e.exports=r},7433:function(e,t,i){var n=i(4376),a=i(3517),r=i(34),o=i(8227)(\"species\"),s=Array;e.exports=function(e){var t;return n(e)&&(t=e.constructor,(a(t)&&(t===s||n(t.prototype))||r(t)&&null===(t=t[o]))&&(t=void 0)),void 0===t?s:t}},1469:function(e,t,i){var n=i(7433);e.exports=function(e,t){return new(n(e))(0===t?0:t)}},6319:function(e,t,i){var n=i(8551),a=i(1920);e.exports=function(e,t,i,r){try{return r?t(n(i)[0],i[1]):t(i)}catch(t){a(e,\"throw\",t)}}},4428:function(e,t,i){var n=i(8227)(\"iterator\"),a=!1;try{var r=0,o={next:function(){return{done:!!r++}},return:function(){a=!0}};o[n]=function(){return this},Array.from(o,function(){throw 2})}catch(e){}e.exports=function(e,t){try{if(!t&&!a)return!1}catch(e){return!1}var i=!1;try{var r={};r[n]=function(){return{next:function(){return{done:i=!0}}}},e(r)}catch(e){}return i}},2195:function(e,t,i){var n=i(9504),a=n({}.toString),r=n(\"\".slice);e.exports=function(e){return r(a(e),8,-1)}},6955:function(e,t,i){var n=i(2140),a=i(4901),r=i(2195),o=i(8227)(\"toStringTag\"),s=Object,l=\"Arguments\"===r(function(){return arguments}());e.exports=n?r:function(e){var t,i,n;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(i=function(e,t){try{return e[t]}catch(e){}}(t=s(e),o))?i:l?r(t):\"Object\"===(n=r(t))&&a(t.callee)?\"Arguments\":n}},6938:function(e,t,i){var n=i(2360),a=i(2106),r=i(6279),o=i(6080),s=i(679),l=i(4117),d=i(2652),p=i(1088),c=i(2529),h=i(7633),u=i(3724),f=i(3451).fastKey,A=i(1181),y=A.set,m=A.getterFor;e.exports={getConstructor:function(e,t,i,p){var c=e(function(e,a){s(e,h),y(e,{type:t,index:n(null),first:null,last:null,size:0}),u||(e.size=0),l(a)||d(a,e[p],{that:e,AS_ENTRIES:i})}),h=c.prototype,A=m(t),b=function(e,t,i){var n,a,r=A(e),o=g(e,t);return o?o.value=i:(r.last=o={index:a=f(t,!0),key:t,value:i,previous:n=r.last,next:null,removed:!1},r.first||(r.first=o),n&&(n.next=o),u?r.size++:e.size++,\"F\"!==a&&(r.index[a]=o)),e},g=function(e,t){var i,n=A(e),a=f(t);if(\"F\"!==a)return n.index[a];for(i=n.first;i;i=i.next)if(i.key===t)return i};return r(h,{clear:function(){for(var e=A(this),t=e.first;t;)t.removed=!0,t.previous&&(t.previous=t.previous.next=null),t=t.next;e.first=e.last=null,e.index=n(null),u?e.size=0:this.size=0},delete:function(e){var t=this,i=A(t),n=g(t,e);if(n){var a=n.next,r=n.previous;delete i.index[n.index],n.removed=!0,r&&(r.next=a),a&&(a.previous=r),i.first===n&&(i.first=a),i.last===n&&(i.last=r),u?i.size--:t.size--}return!!n},forEach:function(e){for(var t,i=A(this),n=o(e,arguments.length>1?arguments[1]:void 0);t=t?t.next:i.first;)for(n(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!g(this,e)}}),r(h,i?{get:function(e){var t=g(this,e);return t&&t.value},set:function(e,t){return b(this,0===e?0:e,t)}}:{add:function(e){return b(this,e=0===e?0:e,e)}}),u&&a(h,\"size\",{configurable:!0,get:function(){return A(this).size}}),c},setStrong:function(e,t,i){var n=t+\" Iterator\",a=m(t),r=m(n);p(e,t,function(e,t){y(this,{type:n,target:e,state:a(e),kind:t,last:null})},function(){for(var e=r(this),t=e.kind,i=e.last;i&&i.removed;)i=i.previous;return e.target&&(e.last=i=i?i.next:e.state.first)?c(\"keys\"===t?i.key:\"values\"===t?i.value:[i.key,i.value],!1):(e.target=null,c(void 0,!0))},i?\"entries\":\"values\",!i,!0),h(t)}}},6468:function(e,t,i){var n=i(6518),a=i(4576),r=i(9504),o=i(2796),s=i(6840),l=i(3451),d=i(2652),p=i(679),c=i(4901),h=i(4117),u=i(34),f=i(9039),A=i(4428),y=i(687),m=i(3167);e.exports=function(e,t,i){var b=-1!==e.indexOf(\"Map\"),g=-1!==e.indexOf(\"Weak\"),v=b?\"set\":\"add\",C=a[e],x=C&&C.prototype,w=C,k={},_=function(e){var t=r(x[e]);s(x,e,\"add\"===e?function(e){return t(this,0===e?0:e),this}:\"delete\"===e?function(e){return!(g&&!u(e))&&t(this,0===e?0:e)}:\"get\"===e?function(e){return g&&!u(e)?void 0:t(this,0===e?0:e)}:\"has\"===e?function(e){return!(g&&!u(e))&&t(this,0===e?0:e)}:function(e,i){return t(this,0===e?0:e,i),this})};if(o(e,!c(C)||!(g||x.forEach&&!f(function(){(new C).entries().next()}))))w=i.getConstructor(t,e,b,v),l.enable();else if(o(e,!0)){var S=new w,T=S[v](g?{}:-0,1)!==S,B=f(function(){S.has(1)}),E=A(function(e){new C(e)}),I=!g&&f(function(){for(var e=new C,t=5;t--;)e[v](t,t);return!e.has(-0)});E||((w=t(function(e,t){p(e,x);var i=m(new C,e,w);return h(t)||d(t,i[v],{that:i,AS_ENTRIES:b}),i})).prototype=x,x.constructor=w),(B||I)&&(_(\"delete\"),_(\"has\"),b&&_(\"get\")),(I||T)&&_(v),g&&x.clear&&delete x.clear}return k[e]=w,n({global:!0,constructor:!0,forced:w!==C},k),y(w,e),g||i.setStrong(w,e,b),w}},7740:function(e,t,i){var n=i(9297),a=i(5031),r=i(7347),o=i(4913);e.exports=function(e,t,i){for(var s=a(t),l=o.f,d=r.f,p=0;p<s.length;p++){var c=s[p];n(e,c)||i&&n(i,c)||l(e,c,d(t,c))}}},1436:function(e,t,i){var n=i(8227)(\"match\");e.exports=function(e){var t=/./;try{\"/./\"[e](t)}catch(i){try{return t[n]=!1,\"/./\"[e](t)}catch(e){}}return!1}},2211:function(e,t,i){var n=i(9039);e.exports=!n(function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})},2529:function(e){e.exports=function(e,t){return{value:e,done:t}}},6699:function(e,t,i){var n=i(3724),a=i(4913),r=i(6980);e.exports=n?function(e,t,i){return a.f(e,t,r(1,i))}:function(e,t,i){return e[t]=i,e}},6980:function(e){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},4659:function(e,t,i){var n=i(3724),a=i(4913),r=i(6980);e.exports=function(e,t,i){n?a.f(e,t,r(0,i)):e[t]=i}},3640:function(e,t,i){var n=i(8551),a=i(4270),r=TypeError;e.exports=function(e){if(n(this),\"string\"===e||\"default\"===e)e=\"string\";else if(\"number\"!==e)throw new r(\"Incorrect hint\");return a(this,e)}},2106:function(e,t,i){var n=i(283),a=i(4913);e.exports=function(e,t,i){return i.get&&n(i.get,t,{getter:!0}),i.set&&n(i.set,t,{setter:!0}),a.f(e,t,i)}},6840:function(e,t,i){var n=i(4901),a=i(4913),r=i(283),o=i(9433);e.exports=function(e,t,i,s){s||(s={});var l=s.enumerable,d=void 0!==s.name?s.name:t;if(n(i)&&r(i,d,s),s.global)l?e[t]=i:o(t,i);else{try{s.unsafe?e[t]&&(l=!0):delete e[t]}catch(e){}l?e[t]=i:a.f(e,t,{value:i,enumerable:!1,configurable:!s.nonConfigurable,writable:!s.nonWritable})}return e}},6279:function(e,t,i){var n=i(6840);e.exports=function(e,t,i){for(var a in t)n(e,a,t[a],i);return e}},9433:function(e,t,i){var n=i(4576),a=Object.defineProperty;e.exports=function(e,t){try{a(n,e,{value:t,configurable:!0,writable:!0})}catch(i){n[e]=t}return t}},4606:function(e,t,i){var n=i(6823),a=TypeError;e.exports=function(e,t){if(!delete e[t])throw new a(\"Cannot delete property \"+n(t)+\" of \"+n(e))}},3724:function(e,t,i){var n=i(9039);e.exports=!n(function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]})},4055:function(e,t,i){var n=i(4576),a=i(34),r=n.document,o=a(r)&&a(r.createElement);e.exports=function(e){return o?r.createElement(e):{}}},6837:function(e){var t=TypeError;e.exports=function(e){if(e>9007199254740991)throw t(\"Maximum allowed index exceeded\");return e}},7400:function(e){e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},9296:function(e,t,i){var n=i(4055)(\"span\").classList,a=n&&n.constructor&&n.constructor.prototype;e.exports=a===Object.prototype?void 0:a},8727:function(e){e.exports=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"]},3709:function(e,t,i){var n=i(2839).match(/firefox\\/(\\d+)/i);e.exports=!!n&&+n[1]},3763:function(e,t,i){var n=i(2839);e.exports=/MSIE|Trident/.test(n)},2839:function(e,t,i){var n=i(4576).navigator,a=n&&n.userAgent;e.exports=a?String(a):\"\"},9519:function(e,t,i){var n,a,r=i(4576),o=i(2839),s=r.process,l=r.Deno,d=s&&s.versions||l&&l.version,p=d&&d.v8;p&&(a=(n=p.split(\".\"))[0]>0&&n[0]<4?1:+(n[0]+n[1])),!a&&o&&(!(n=o.match(/Edge\\/(\\d+)/))||n[1]>=74)&&(n=o.match(/Chrome\\/(\\d+)/))&&(a=+n[1]),e.exports=a},3607:function(e,t,i){var n=i(2839).match(/AppleWebKit\\/(\\d+)\\./);e.exports=!!n&&+n[1]},6518:function(e,t,i){var n=i(4576),a=i(7347).f,r=i(6699),o=i(6840),s=i(9433),l=i(7740),d=i(2796);e.exports=function(e,t){var i,p,c,h,u,f=e.target,A=e.global,y=e.stat;if(i=A?n:y?n[f]||s(f,{}):n[f]&&n[f].prototype)for(p in t){if(h=t[p],c=e.dontCallGetSet?(u=a(i,p))&&u.value:i[p],!d(A?p:f+(y?\".\":\"#\")+p,e.forced)&&void 0!==c){if(typeof h==typeof c)continue;l(h,c)}(e.sham||c&&c.sham)&&r(h,\"sham\",!0),o(i,p,h,e)}}},9039:function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},9228:function(e,t,i){i(7495);var n=i(9565),a=i(6840),r=i(7323),o=i(9039),s=i(8227),l=i(6699),d=s(\"species\"),p=RegExp.prototype;e.exports=function(e,t,i,c){var h=s(e),u=!o(function(){var t={};return t[h]=function(){return 7},7!==\"\"[e](t)}),f=u&&!o(function(){var t=!1,i=/a/;return\"split\"===e&&((i={}).constructor={},i.constructor[d]=function(){return i},i.flags=\"\",i[h]=/./[h]),i.exec=function(){return t=!0,null},i[h](\"\"),!t});if(!u||!f||i){var A=/./[h],y=t(h,\"\"[e],function(e,t,i,a,o){var s=t.exec;return s===r||s===p.exec?u&&!o?{done:!0,value:n(A,t,i,a)}:{done:!0,value:n(e,i,t,a)}:{done:!1}});a(String.prototype,e,y[0]),a(p,h,y[1])}c&&l(p[h],\"sham\",!0)}},2744:function(e,t,i){var n=i(9039);e.exports=!n(function(){return Object.isExtensible(Object.preventExtensions({}))})},8745:function(e,t,i){var n=i(616),a=Function.prototype,r=a.apply,o=a.call;e.exports=\"object\"==typeof Reflect&&Reflect.apply||(n?o.bind(r):function(){return o.apply(r,arguments)})},6080:function(e,t,i){var n=i(7476),a=i(9306),r=i(616),o=n(n.bind);e.exports=function(e,t){return a(e),void 0===t?e:r?o(e,t):function(){return e.apply(t,arguments)}}},616:function(e,t,i){var n=i(9039);e.exports=!n(function(){var e=function(){}.bind();return\"function\"!=typeof e||e.hasOwnProperty(\"prototype\")})},566:function(e,t,i){var n=i(9504),a=i(9306),r=i(34),o=i(9297),s=i(7680),l=i(616),d=Function,p=n([].concat),c=n([].join),h={};e.exports=l?d.bind:function(e){var t=a(this),i=t.prototype,n=s(arguments,1),l=function(){var i=p(n,s(arguments));return this instanceof l?function(e,t,i){if(!o(h,t)){for(var n=[],a=0;a<t;a++)n[a]=\"a[\"+a+\"]\";h[t]=d(\"C,a\",\"return new C(\"+c(n,\",\")+\")\")}return h[t](e,i)}(t,i.length,i):t.apply(e,i)};return r(i)&&(l.prototype=i),l}},9565:function(e,t,i){var n=i(616),a=Function.prototype.call;e.exports=n?a.bind(a):function(){return a.apply(a,arguments)}},350:function(e,t,i){var n=i(3724),a=i(9297),r=Function.prototype,o=n&&Object.getOwnPropertyDescriptor,s=a(r,\"name\"),l=s&&\"something\"===function(){}.name,d=s&&(!n||n&&o(r,\"name\").configurable);e.exports={EXISTS:s,PROPER:l,CONFIGURABLE:d}},6706:function(e,t,i){var n=i(9504),a=i(9306);e.exports=function(e,t,i){try{return n(a(Object.getOwnPropertyDescriptor(e,t)[i]))}catch(e){}}},7476:function(e,t,i){var n=i(2195),a=i(9504);e.exports=function(e){if(\"Function\"===n(e))return a(e)}},9504:function(e,t,i){var n=i(616),a=Function.prototype,r=a.call,o=n&&a.bind.bind(r,r);e.exports=n?o:function(e){return function(){return r.apply(e,arguments)}}},7751:function(e,t,i){var n=i(4576),a=i(4901);e.exports=function(e,t){return arguments.length<2?(i=n[e],a(i)?i:void 0):n[e]&&n[e][t];var i}},851:function(e,t,i){var n=i(6955),a=i(5966),r=i(4117),o=i(6269),s=i(8227)(\"iterator\");e.exports=function(e){if(!r(e))return a(e,s)||a(e,\"@@iterator\")||o[n(e)]}},81:function(e,t,i){var n=i(9565),a=i(9306),r=i(8551),o=i(6823),s=i(851),l=TypeError;e.exports=function(e,t){var i=arguments.length<2?s(e):t;if(a(i))return r(n(i,e));throw new l(o(e)+\" is not iterable\")}},6933:function(e,t,i){var n=i(9504),a=i(4376),r=i(4901),o=i(2195),s=i(655),l=n([].push);e.exports=function(e){if(r(e))return e;if(a(e)){for(var t=e.length,i=[],n=0;n<t;n++){var d=e[n];\"string\"==typeof d?l(i,d):\"number\"!=typeof d&&\"Number\"!==o(d)&&\"String\"!==o(d)||l(i,s(d))}var p=i.length,c=!0;return function(e,t){if(c)return c=!1,t;if(a(this))return t;for(var n=0;n<p;n++)if(i[n]===e)return t}}}},5966:function(e,t,i){var n=i(9306),a=i(4117);e.exports=function(e,t){var i=e[t];return a(i)?void 0:n(i)}},2478:function(e,t,i){var n=i(9504),a=i(8981),r=Math.floor,o=n(\"\".charAt),s=n(\"\".replace),l=n(\"\".slice),d=/\\$([$&'`]|\\d{1,2}|<[^>]*>)/g,p=/\\$([$&'`]|\\d{1,2})/g;e.exports=function(e,t,i,n,c,h){var u=i+e.length,f=n.length,A=p;return void 0!==c&&(c=a(c),A=d),s(h,A,function(a,s){var d;switch(o(s,0)){case\"$\":return\"$\";case\"&\":return e;case\"`\":return l(t,0,i);case\"'\":return l(t,u);case\"<\":d=c[l(s,1,-1)];break;default:var p=+s;if(0===p)return a;if(p>f){var h=r(p/10);return 0===h?a:h<=f?void 0===n[h-1]?o(s,1):n[h-1]+o(s,1):a}d=n[p-1]}return void 0===d?\"\":d})}},4576:function(e,t,i){var n=function(e){return e&&e.Math===Math&&e};e.exports=n(\"object\"==typeof globalThis&&globalThis)||n(\"object\"==typeof window&&window)||n(\"object\"==typeof self&&self)||n(\"object\"==typeof i.g&&i.g)||n(\"object\"==typeof this&&this)||function(){return this}()||Function(\"return this\")()},9297:function(e,t,i){var n=i(9504),a=i(8981),r=n({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return r(a(e),t)}},421:function(e){e.exports={}},397:function(e,t,i){var n=i(7751);e.exports=n(\"document\",\"documentElement\")},5917:function(e,t,i){var n=i(3724),a=i(9039),r=i(4055);e.exports=!n&&!a(function(){return 7!==Object.defineProperty(r(\"div\"),\"a\",{get:function(){return 7}}).a})},8490:function(e){var t=Array,i=Math.abs,n=Math.pow,a=Math.floor,r=Math.log,o=Math.LN2;e.exports={pack:function(e,s,l){var d,p,c,h=t(l),u=8*l-s-1,f=(1<<u)-1,A=f>>1,y=23===s?n(2,-24)-n(2,-77):0,m=e<0||0===e&&1/e<0?1:0,b=0;for((e=i(e))!=e||e===1/0?(p=e!=e?1:0,d=f):(d=a(r(e)/o),e*(c=n(2,-d))<1&&(d--,c*=2),(e+=d+A>=1?y/c:y*n(2,1-A))*c>=2&&(d++,c/=2),d+A>=f?(p=0,d=f):d+A>=1?(p=(e*c-1)*n(2,s),d+=A):(p=e*n(2,A-1)*n(2,s),d=0));s>=8;)h[b++]=255&p,p/=256,s-=8;for(d=d<<s|p,u+=s;u>0;)h[b++]=255&d,d/=256,u-=8;return h[b-1]|=128*m,h},unpack:function(e,t){var i,a=e.length,r=8*a-t-1,o=(1<<r)-1,s=o>>1,l=r-7,d=a-1,p=e[d--],c=127&p;for(p>>=7;l>0;)c=256*c+e[d--],l-=8;for(i=c&(1<<-l)-1,c>>=-l,l+=t;l>0;)i=256*i+e[d--],l-=8;if(0===c)c=1-s;else{if(c===o)return i?NaN:p?-1/0:1/0;i+=n(2,t),c-=s}return(p?-1:1)*i*n(2,c-t)}}},7055:function(e,t,i){var n=i(9504),a=i(9039),r=i(2195),o=Object,s=n(\"\".split);e.exports=a(function(){return!o(\"z\").propertyIsEnumerable(0)})?function(e){return\"String\"===r(e)?s(e,\"\"):o(e)}:o},3167:function(e,t,i){var n=i(4901),a=i(34),r=i(2967);e.exports=function(e,t,i){var o,s;return r&&n(o=t.constructor)&&o!==i&&a(s=o.prototype)&&s!==i.prototype&&r(e,s),e}},3706:function(e,t,i){var n=i(9504),a=i(4901),r=i(7629),o=n(Function.toString);a(r.inspectSource)||(r.inspectSource=function(e){return o(e)}),e.exports=r.inspectSource},3451:function(e,t,i){var n=i(6518),a=i(9504),r=i(421),o=i(34),s=i(9297),l=i(4913).f,d=i(8480),p=i(298),c=i(4124),h=i(3392),u=i(2744),f=!1,A=h(\"meta\"),y=0,m=function(e){l(e,A,{value:{objectID:\"O\"+y++,weakData:{}}})},b=e.exports={enable:function(){b.enable=function(){},f=!0;var e=d.f,t=a([].splice),i={};i[A]=1,e(i).length&&(d.f=function(i){for(var n=e(i),a=0,r=n.length;a<r;a++)if(n[a]===A){t(n,a,1);break}return n},n({target:\"Object\",stat:!0,forced:!0},{getOwnPropertyNames:p.f}))},fastKey:function(e,t){if(!o(e))return\"symbol\"==typeof e?e:(\"string\"==typeof e?\"S\":\"P\")+e;if(!s(e,A)){if(!c(e))return\"F\";if(!t)return\"E\";m(e)}return e[A].objectID},getWeakData:function(e,t){if(!s(e,A)){if(!c(e))return!0;if(!t)return!1;m(e)}return e[A].weakData},onFreeze:function(e){return u&&f&&c(e)&&!s(e,A)&&m(e),e}};r[A]=!0},1181:function(e,t,i){var n,a,r,o=i(8622),s=i(4576),l=i(34),d=i(6699),p=i(9297),c=i(7629),h=i(6119),u=i(421),f=\"Object already initialized\",A=s.TypeError,y=s.WeakMap;if(o||c.state){var m=c.state||(c.state=new y);m.get=m.get,m.has=m.has,m.set=m.set,n=function(e,t){if(m.has(e))throw new A(f);return t.facade=e,m.set(e,t),t},a=function(e){return m.get(e)||{}},r=function(e){return m.has(e)}}else{var b=h(\"state\");u[b]=!0,n=function(e,t){if(p(e,b))throw new A(f);return t.facade=e,d(e,b,t),t},a=function(e){return p(e,b)?e[b]:{}},r=function(e){return p(e,b)}}e.exports={set:n,get:a,has:r,enforce:function(e){return r(e)?a(e):n(e,{})},getterFor:function(e){return function(t){var i;if(!l(t)||(i=a(t)).type!==e)throw new A(\"Incompatible receiver, \"+e+\" required\");return i}}}},4209:function(e,t,i){var n=i(8227),a=i(6269),r=n(\"iterator\"),o=Array.prototype;e.exports=function(e){return void 0!==e&&(a.Array===e||o[r]===e)}},4376:function(e,t,i){var n=i(2195);e.exports=Array.isArray||function(e){return\"Array\"===n(e)}},1108:function(e,t,i){var n=i(6955);e.exports=function(e){var t=n(e);return\"BigInt64Array\"===t||\"BigUint64Array\"===t}},4901:function(e){var t=\"object\"==typeof document&&document.all;e.exports=void 0===t&&void 0!==t?function(e){return\"function\"==typeof e||e===t}:function(e){return\"function\"==typeof e}},3517:function(e,t,i){var n=i(9504),a=i(9039),r=i(4901),o=i(6955),s=i(7751),l=i(3706),d=function(){},p=s(\"Reflect\",\"construct\"),c=/^\\s*(?:class|function)\\b/,h=n(c.exec),u=!c.test(d),f=function(e){if(!r(e))return!1;try{return p(d,[],e),!0}catch(e){return!1}},A=function(e){if(!r(e))return!1;switch(o(e)){case\"AsyncFunction\":case\"GeneratorFunction\":case\"AsyncGeneratorFunction\":return!1}try{return u||!!h(c,l(e))}catch(e){return!0}};A.sham=!0,e.exports=!p||a(function(){var e;return f(f.call)||!f(Object)||!f(function(){e=!0})||e})?A:f},2796:function(e,t,i){var n=i(9039),a=i(4901),r=/#|\\.prototype\\./,o=function(e,t){var i=l[s(e)];return i===p||i!==d&&(a(t)?n(t):!!t)},s=o.normalize=function(e){return String(e).replace(r,\".\").toLowerCase()},l=o.data={},d=o.NATIVE=\"N\",p=o.POLYFILL=\"P\";e.exports=o},2087:function(e,t,i){var n=i(34),a=Math.floor;e.exports=Number.isInteger||function(e){return!n(e)&&isFinite(e)&&a(e)===e}},4117:function(e){e.exports=function(e){return null==e}},34:function(e,t,i){var n=i(4901);e.exports=function(e){return\"object\"==typeof e?null!==e:n(e)}},3925:function(e,t,i){var n=i(34);e.exports=function(e){return n(e)||null===e}},6395:function(e){e.exports=!1},788:function(e,t,i){var n=i(34),a=i(2195),r=i(8227)(\"match\");e.exports=function(e){var t;return n(e)&&(void 0!==(t=e[r])?!!t:\"RegExp\"===a(e))}},757:function(e,t,i){var n=i(7751),a=i(4901),r=i(1625),o=i(7040),s=Object;e.exports=o?function(e){return\"symbol\"==typeof e}:function(e){var t=n(\"Symbol\");return a(t)&&r(t.prototype,s(e))}},2652:function(e,t,i){var n=i(6080),a=i(9565),r=i(8551),o=i(6823),s=i(4209),l=i(6198),d=i(1625),p=i(81),c=i(851),h=i(1920),u=TypeError,f=function(e,t){this.stopped=e,this.result=t},A=f.prototype;e.exports=function(e,t,i){var y,m,b,g,v,C,x,w=i&&i.that,k=!(!i||!i.AS_ENTRIES),_=!(!i||!i.IS_RECORD),S=!(!i||!i.IS_ITERATOR),T=!(!i||!i.INTERRUPTED),B=n(t,w),E=function(e){return y&&h(y,\"normal\",e),new f(!0,e)},I=function(e){return k?(r(e),T?B(e[0],e[1],E):B(e[0],e[1])):T?B(e,E):B(e)};if(_)y=e.iterator;else if(S)y=e;else{if(!(m=c(e)))throw new u(o(e)+\" is not iterable\");if(s(m)){for(b=0,g=l(e);g>b;b++)if((v=I(e[b]))&&d(A,v))return v;return new f(!1)}y=p(e,m)}for(C=_?e.next:y.next;!(x=a(C,y)).done;){try{v=I(x.value)}catch(e){h(y,\"throw\",e)}if(\"object\"==typeof v&&v&&d(A,v))return v}return new f(!1)}},1920:function(e,t,i){var n=i(9565),a=i(8551),r=i(5966);e.exports=function(e,t,i){var o,s;a(e);try{if(!(o=r(e,\"return\"))){if(\"throw\"===t)throw i;return i}o=n(o,e)}catch(e){s=!0,o=e}if(\"throw\"===t)throw i;if(s)throw o;return a(o),i}},3994:function(e,t,i){var n=i(7657).IteratorPrototype,a=i(2360),r=i(6980),o=i(687),s=i(6269),l=function(){return this};e.exports=function(e,t,i,d){var p=t+\" Iterator\";return e.prototype=a(n,{next:r(+!d,i)}),o(e,p,!1,!0),s[p]=l,e}},1088:function(e,t,i){var n=i(6518),a=i(9565),r=i(6395),o=i(350),s=i(4901),l=i(3994),d=i(2787),p=i(2967),c=i(687),h=i(6699),u=i(6840),f=i(8227),A=i(6269),y=i(7657),m=o.PROPER,b=o.CONFIGURABLE,g=y.IteratorPrototype,v=y.BUGGY_SAFARI_ITERATORS,C=f(\"iterator\"),x=\"keys\",w=\"values\",k=\"entries\",_=function(){return this};e.exports=function(e,t,i,o,f,y,S){l(i,t,o);var T,B,E,I=function(e){if(e===f&&M)return M;if(!v&&e&&e in O)return O[e];switch(e){case x:case w:case k:return function(){return new i(this,e)}}return function(){return new i(this)}},F=t+\" Iterator\",R=!1,O=e.prototype,D=O[C]||O[\"@@iterator\"]||f&&O[f],M=!v&&D||I(f),L=\"Array\"===t&&O.entries||D;if(L&&(T=d(L.call(new e)))!==Object.prototype&&T.next&&(r||d(T)===g||(p?p(T,g):s(T[C])||u(T,C,_)),c(T,F,!0,!0),r&&(A[F]=_)),m&&f===w&&D&&D.name!==w&&(!r&&b?h(O,\"name\",w):(R=!0,M=function(){return a(D,this)})),f)if(B={values:I(w),keys:y?M:I(x),entries:I(k)},S)for(E in B)(v||R||!(E in O))&&u(O,E,B[E]);else n({target:t,proto:!0,forced:v||R},B);return r&&!S||O[C]===M||u(O,C,M,{name:f}),A[t]=M,B}},7657:function(e,t,i){var n,a,r,o=i(9039),s=i(4901),l=i(34),d=i(2360),p=i(2787),c=i(6840),h=i(8227),u=i(6395),f=h(\"iterator\"),A=!1;[].keys&&(\"next\"in(r=[].keys())?(a=p(p(r)))!==Object.prototype&&(n=a):A=!0),!l(n)||o(function(){var e={};return n[f].call(e)!==e})?n={}:u&&(n=d(n)),s(n[f])||c(n,f,function(){return this}),e.exports={IteratorPrototype:n,BUGGY_SAFARI_ITERATORS:A}},6269:function(e){e.exports={}},6198:function(e,t,i){var n=i(8014);e.exports=function(e){return n(e.length)}},283:function(e,t,i){var n=i(9504),a=i(9039),r=i(4901),o=i(9297),s=i(3724),l=i(350).CONFIGURABLE,d=i(3706),p=i(1181),c=p.enforce,h=p.get,u=String,f=Object.defineProperty,A=n(\"\".slice),y=n(\"\".replace),m=n([].join),b=s&&!a(function(){return 8!==f(function(){},\"length\",{value:8}).length}),g=String(String).split(\"String\"),v=e.exports=function(e,t,i){\"Symbol(\"===A(u(t),0,7)&&(t=\"[\"+y(u(t),/^Symbol\\(([^)]*)\\).*$/,\"$1\")+\"]\"),i&&i.getter&&(t=\"get \"+t),i&&i.setter&&(t=\"set \"+t),(!o(e,\"name\")||l&&e.name!==t)&&(s?f(e,\"name\",{value:t,configurable:!0}):e.name=t),b&&i&&o(i,\"arity\")&&e.length!==i.arity&&f(e,\"length\",{value:i.arity});try{i&&o(i,\"constructor\")&&i.constructor?s&&f(e,\"prototype\",{writable:!1}):e.prototype&&(e.prototype=void 0)}catch(e){}var n=c(e);return o(n,\"source\")||(n.source=m(g,\"string\"==typeof t?t:\"\")),e};Function.prototype.toString=v(function(){return r(this)&&h(this).source||d(this)},\"toString\")},3164:function(e,t,i){var n=i(7782),a=Math.abs,r=2220446049250313e-31,o=1/r;e.exports=function(e,t,i,s){var l=+e,d=a(l),p=n(l);if(d<s)return p*function(e){return e+o-o}(d/s/t)*s*t;var c=(1+t/r)*d,h=c-(c-d);return h>i||h!=h?p*(1/0):p*h}},5617:function(e,t,i){var n=i(3164);e.exports=Math.fround||function(e){return n(e,1.1920928955078125e-7,34028234663852886e22,11754943508222875e-54)}},7782:function(e){e.exports=Math.sign||function(e){var t=+e;return 0===t||t!=t?t:t<0?-1:1}},741:function(e){var t=Math.ceil,i=Math.floor;e.exports=Math.trunc||function(e){var n=+e;return(n>0?i:t)(n)}},5749:function(e,t,i){var n=i(788),a=TypeError;e.exports=function(e){if(n(e))throw new a(\"The method doesn't accept regular expressions\");return e}},360:function(e,t,i){var n=i(4576).isFinite;e.exports=Number.isFinite||function(e){return\"number\"==typeof e&&n(e)}},2703:function(e,t,i){var n=i(4576),a=i(9039),r=i(9504),o=i(655),s=i(3802).trim,l=i(7452),d=n.parseInt,p=n.Symbol,c=p&&p.iterator,h=/^[+-]?0x/i,u=r(h.exec),f=8!==d(l+\"08\")||22!==d(l+\"0x16\")||c&&!a(function(){d(Object(c))});e.exports=f?function(e,t){var i=s(o(e));return d(i,t>>>0||(u(h,i)?16:10))}:d},2360:function(e,t,i){var n,a=i(8551),r=i(6801),o=i(8727),s=i(421),l=i(397),d=i(4055),p=i(6119),c=\"prototype\",h=\"script\",u=p(\"IE_PROTO\"),f=function(){},A=function(e){return\"<\"+h+\">\"+e+\"</\"+h+\">\"},y=function(e){e.write(A(\"\")),e.close();var t=e.parentWindow.Object;return e=null,t},m=function(){try{n=new ActiveXObject(\"htmlfile\")}catch(e){}var e,t,i;m=\"undefined\"!=typeof document?document.domain&&n?y(n):(t=d(\"iframe\"),i=\"java\"+h+\":\",t.style.display=\"none\",l.appendChild(t),t.src=String(i),(e=t.contentWindow.document).open(),e.write(A(\"document.F=Object\")),e.close(),e.F):y(n);for(var a=o.length;a--;)delete m[c][o[a]];return m()};s[u]=!0,e.exports=Object.create||function(e,t){var i;return null!==e?(f[c]=a(e),i=new f,f[c]=null,i[u]=e):i=m(),void 0===t?i:r.f(i,t)}},6801:function(e,t,i){var n=i(3724),a=i(8686),r=i(4913),o=i(8551),s=i(5397),l=i(1072);t.f=n&&!a?Object.defineProperties:function(e,t){o(e);for(var i,n=s(t),a=l(t),d=a.length,p=0;d>p;)r.f(e,i=a[p++],n[i]);return e}},4913:function(e,t,i){var n=i(3724),a=i(5917),r=i(8686),o=i(8551),s=i(6969),l=TypeError,d=Object.defineProperty,p=Object.getOwnPropertyDescriptor,c=\"enumerable\",h=\"configurable\",u=\"writable\";t.f=n?r?function(e,t,i){if(o(e),t=s(t),o(i),\"function\"==typeof e&&\"prototype\"===t&&\"value\"in i&&u in i&&!i[u]){var n=p(e,t);n&&n[u]&&(e[t]=i.value,i={configurable:h in i?i[h]:n[h],enumerable:c in i?i[c]:n[c],writable:!1})}return d(e,t,i)}:d:function(e,t,i){if(o(e),t=s(t),o(i),a)try{return d(e,t,i)}catch(e){}if(\"get\"in i||\"set\"in i)throw new l(\"Accessors not supported\");return\"value\"in i&&(e[t]=i.value),e}},7347:function(e,t,i){var n=i(3724),a=i(9565),r=i(8773),o=i(6980),s=i(5397),l=i(6969),d=i(9297),p=i(5917),c=Object.getOwnPropertyDescriptor;t.f=n?c:function(e,t){if(e=s(e),t=l(t),p)try{return c(e,t)}catch(e){}if(d(e,t))return o(!a(r.f,e,t),e[t])}},298:function(e,t,i){var n=i(2195),a=i(5397),r=i(8480).f,o=i(7680),s=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return s&&\"Window\"===n(e)?function(e){try{return r(e)}catch(e){return o(s)}}(e):r(a(e))}},8480:function(e,t,i){var n=i(1828),a=i(8727).concat(\"length\",\"prototype\");t.f=Object.getOwnPropertyNames||function(e){return n(e,a)}},3717:function(e,t){t.f=Object.getOwnPropertySymbols},2787:function(e,t,i){var n=i(9297),a=i(4901),r=i(8981),o=i(6119),s=i(2211),l=o(\"IE_PROTO\"),d=Object,p=d.prototype;e.exports=s?d.getPrototypeOf:function(e){var t=r(e);if(n(t,l))return t[l];var i=t.constructor;return a(i)&&t instanceof i?i.prototype:t instanceof d?p:null}},4124:function(e,t,i){var n=i(9039),a=i(34),r=i(2195),o=i(5652),s=Object.isExtensible,l=n(function(){s(1)});e.exports=l||o?function(e){return!!a(e)&&(!o||\"ArrayBuffer\"!==r(e))&&(!s||s(e))}:s},1625:function(e,t,i){var n=i(9504);e.exports=n({}.isPrototypeOf)},1828:function(e,t,i){var n=i(9504),a=i(9297),r=i(5397),o=i(9617).indexOf,s=i(421),l=n([].push);e.exports=function(e,t){var i,n=r(e),d=0,p=[];for(i in n)!a(s,i)&&a(n,i)&&l(p,i);for(;t.length>d;)a(n,i=t[d++])&&(~o(p,i)||l(p,i));return p}},1072:function(e,t,i){var n=i(1828),a=i(8727);e.exports=Object.keys||function(e){return n(e,a)}},8773:function(e,t){var i={}.propertyIsEnumerable,n=Object.getOwnPropertyDescriptor,a=n&&!i.call({1:2},1);t.f=a?function(e){var t=n(this,e);return!!t&&t.enumerable}:i},2967:function(e,t,i){var n=i(6706),a=i(34),r=i(7750),o=i(3506);e.exports=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var e,t=!1,i={};try{(e=n(Object.prototype,\"__proto__\",\"set\"))(i,[]),t=i instanceof Array}catch(e){}return function(i,n){return r(i),o(n),a(i)?(t?e(i,n):i.__proto__=n,i):i}}():void 0)},2357:function(e,t,i){var n=i(3724),a=i(9039),r=i(9504),o=i(2787),s=i(1072),l=i(5397),d=r(i(8773).f),p=r([].push),c=n&&a(function(){var e=Object.create(null);return e[2]=2,!d(e,2)}),h=function(e){return function(t){for(var i,a=l(t),r=s(a),h=c&&null===o(a),u=r.length,f=0,A=[];u>f;)i=r[f++],n&&!(h?i in a:d(a,i))||p(A,e?[i,a[i]]:a[i]);return A}};e.exports={entries:h(!0),values:h(!1)}},3179:function(e,t,i){var n=i(2140),a=i(6955);e.exports=n?{}.toString:function(){return\"[object \"+a(this)+\"]\"}},4270:function(e,t,i){var n=i(9565),a=i(4901),r=i(34),o=TypeError;e.exports=function(e,t){var i,s;if(\"string\"===t&&a(i=e.toString)&&!r(s=n(i,e)))return s;if(a(i=e.valueOf)&&!r(s=n(i,e)))return s;if(\"string\"!==t&&a(i=e.toString)&&!r(s=n(i,e)))return s;throw new o(\"Can't convert object to primitive value\")}},5031:function(e,t,i){var n=i(7751),a=i(9504),r=i(8480),o=i(3717),s=i(8551),l=a([].concat);e.exports=n(\"Reflect\",\"ownKeys\")||function(e){var t=r.f(s(e)),i=o.f;return i?l(t,i(e)):t}},9167:function(e,t,i){var n=i(4576);e.exports=n},6682:function(e,t,i){var n=i(9565),a=i(8551),r=i(4901),o=i(2195),s=i(7323),l=TypeError;e.exports=function(e,t){var i=e.exec;if(r(i)){var d=n(i,e,t);return null!==d&&a(d),d}if(\"RegExp\"===o(e))return n(s,e,t);throw new l(\"RegExp#exec called on incompatible receiver\")}},7323:function(e,t,i){var n,a,r=i(9565),o=i(9504),s=i(655),l=i(7979),d=i(8429),p=i(5745),c=i(2360),h=i(1181).get,u=i(3635),f=i(8814),A=p(\"native-string-replace\",String.prototype.replace),y=RegExp.prototype.exec,m=y,b=o(\"\".charAt),g=o(\"\".indexOf),v=o(\"\".replace),C=o(\"\".slice),x=(a=/b*/g,r(y,n=/a/,\"a\"),r(y,a,\"a\"),0!==n.lastIndex||0!==a.lastIndex),w=d.BROKEN_CARET,k=void 0!==/()??/.exec(\"\")[1];(x||k||w||u||f)&&(m=function(e){var t,i,n,a,o,d,p,u=this,f=h(u),_=s(e),S=f.raw;if(S)return S.lastIndex=u.lastIndex,t=r(m,S,_),u.lastIndex=S.lastIndex,t;var T=f.groups,B=w&&u.sticky,E=r(l,u),I=u.source,F=0,R=_;if(B&&(E=v(E,\"y\",\"\"),-1===g(E,\"g\")&&(E+=\"g\"),R=C(_,u.lastIndex),u.lastIndex>0&&(!u.multiline||u.multiline&&\"\\n\"!==b(_,u.lastIndex-1))&&(I=\"(?: \"+I+\")\",R=\" \"+R,F++),i=new RegExp(\"^(?:\"+I+\")\",E)),k&&(i=new RegExp(\"^\"+I+\"$(?!\\\\s)\",E)),x&&(n=u.lastIndex),a=r(y,B?i:u,R),B?a?(a.input=C(a.input,F),a[0]=C(a[0],F),a.index=u.lastIndex,u.lastIndex+=a[0].length):u.lastIndex=0:x&&a&&(u.lastIndex=u.global?a.index+a[0].length:n),k&&a&&a.length>1&&r(A,a[0],i,function(){for(o=1;o<arguments.length-2;o++)void 0===arguments[o]&&(a[o]=void 0)}),a&&T)for(a.groups=d=c(null),o=0;o<T.length;o++)d[(p=T[o])[0]]=a[p[1]];return a}),e.exports=m},7979:function(e,t,i){var n=i(8551);e.exports=function(){var e=n(this),t=\"\";return e.hasIndices&&(t+=\"d\"),e.global&&(t+=\"g\"),e.ignoreCase&&(t+=\"i\"),e.multiline&&(t+=\"m\"),e.dotAll&&(t+=\"s\"),e.unicode&&(t+=\"u\"),e.unicodeSets&&(t+=\"v\"),e.sticky&&(t+=\"y\"),t}},1034:function(e,t,i){var n=i(9565),a=i(9297),r=i(1625),o=i(7979),s=RegExp.prototype;e.exports=function(e){var t=e.flags;return void 0!==t||\"flags\"in s||a(e,\"flags\")||!r(s,e)?t:n(o,e)}},8429:function(e,t,i){var n=i(9039),a=i(4576).RegExp,r=n(function(){var e=a(\"a\",\"y\");return e.lastIndex=2,null!==e.exec(\"abcd\")}),o=r||n(function(){return!a(\"a\",\"y\").sticky}),s=r||n(function(){var e=a(\"^r\",\"gy\");return e.lastIndex=2,null!==e.exec(\"str\")});e.exports={BROKEN_CARET:s,MISSED_STICKY:o,UNSUPPORTED_Y:r}},3635:function(e,t,i){var n=i(9039),a=i(4576).RegExp;e.exports=n(function(){var e=a(\".\",\"s\");return!(e.dotAll&&e.test(\"\\n\")&&\"s\"===e.flags)})},8814:function(e,t,i){var n=i(9039),a=i(4576).RegExp;e.exports=n(function(){var e=a(\"(?<a>b)\",\"g\");return\"b\"!==e.exec(\"b\").groups.a||\"bc\"!==\"b\".replace(e,\"$<a>c\")})},7750:function(e,t,i){var n=i(4117),a=TypeError;e.exports=function(e){if(n(e))throw new a(\"Can't call method on \"+e);return e}},7633:function(e,t,i){var n=i(7751),a=i(2106),r=i(8227),o=i(3724),s=r(\"species\");e.exports=function(e){var t=n(e);o&&t&&!t[s]&&a(t,s,{configurable:!0,get:function(){return this}})}},687:function(e,t,i){var n=i(4913).f,a=i(9297),r=i(8227)(\"toStringTag\");e.exports=function(e,t,i){e&&!i&&(e=e.prototype),e&&!a(e,r)&&n(e,r,{configurable:!0,value:t})}},6119:function(e,t,i){var n=i(5745),a=i(3392),r=n(\"keys\");e.exports=function(e){return r[e]||(r[e]=a(e))}},7629:function(e,t,i){var n=i(6395),a=i(4576),r=i(9433),o=\"__core-js_shared__\",s=e.exports=a[o]||r(o,{});(s.versions||(s.versions=[])).push({version:\"3.38.1\",mode:n?\"pure\":\"global\",copyright:\"© 2014-2024 Denis Pushkarev (zloirock.ru)\",license:\"https://github.com/zloirock/core-js/blob/v3.38.1/LICENSE\",source:\"https://github.com/zloirock/core-js\"})},5745:function(e,t,i){var n=i(7629);e.exports=function(e,t){return n[e]||(n[e]=t||{})}},2293:function(e,t,i){var n=i(8551),a=i(5548),r=i(4117),o=i(8227)(\"species\");e.exports=function(e,t){var i,s=n(e).constructor;return void 0===s||r(i=n(s)[o])?t:a(i)}},8183:function(e,t,i){var n=i(9504),a=i(1291),r=i(655),o=i(7750),s=n(\"\".charAt),l=n(\"\".charCodeAt),d=n(\"\".slice),p=function(e){return function(t,i){var n,p,c=r(o(t)),h=a(i),u=c.length;return h<0||h>=u?e?\"\":void 0:(n=l(c,h))<55296||n>56319||h+1===u||(p=l(c,h+1))<56320||p>57343?e?s(c,h):n:e?d(c,h,h+2):p-56320+(n-55296<<10)+65536}};e.exports={codeAt:p(!1),charAt:p(!0)}},3063:function(e,t,i){var n=i(2839);e.exports=/Version\\/10(?:\\.\\d+){1,2}(?: [\\w./]+)?(?: Mobile\\/\\w+)? Safari\\//.test(n)},533:function(e,t,i){var n=i(9504),a=i(8014),r=i(655),o=i(2333),s=i(7750),l=n(o),d=n(\"\".slice),p=Math.ceil,c=function(e){return function(t,i,n){var o,c,h=r(s(t)),u=a(i),f=h.length,A=void 0===n?\" \":r(n);return u<=f||\"\"===A?h:((c=l(A,p((o=u-f)/A.length))).length>o&&(c=d(c,0,o)),e?h+c:c+h)}};e.exports={start:c(!1),end:c(!0)}},2333:function(e,t,i){var n=i(1291),a=i(655),r=i(7750),o=RangeError;e.exports=function(e){var t=a(r(this)),i=\"\",s=n(e);if(s<0||s===1/0)throw new o(\"Wrong number of repetitions\");for(;s>0;(s>>>=1)&&(t+=t))1&s&&(i+=t);return i}},3802:function(e,t,i){var n=i(9504),a=i(7750),r=i(655),o=i(7452),s=n(\"\".replace),l=RegExp(\"^[\"+o+\"]+\"),d=RegExp(\"(^|[^\"+o+\"])[\"+o+\"]+$\"),p=function(e){return function(t){var i=r(a(t));return 1&e&&(i=s(i,l,\"\")),2&e&&(i=s(i,d,\"$1\")),i}};e.exports={start:p(1),end:p(2),trim:p(3)}},4495:function(e,t,i){var n=i(9519),a=i(9039),r=i(4576).String;e.exports=!!Object.getOwnPropertySymbols&&!a(function(){var e=Symbol(\"symbol detection\");return!r(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&n&&n<41})},8242:function(e,t,i){var n=i(9565),a=i(7751),r=i(8227),o=i(6840);e.exports=function(){var e=a(\"Symbol\"),t=e&&e.prototype,i=t&&t.valueOf,s=r(\"toPrimitive\");t&&!t[s]&&o(t,s,function(e){return n(i,this)},{arity:1})}},1296:function(e,t,i){var n=i(4495);e.exports=n&&!!Symbol.for&&!!Symbol.keyFor},1240:function(e,t,i){var n=i(9504);e.exports=n(1..valueOf)},5610:function(e,t,i){var n=i(1291),a=Math.max,r=Math.min;e.exports=function(e,t){var i=n(e);return i<0?a(i+t,0):r(i,t)}},5854:function(e,t,i){var n=i(2777),a=TypeError;e.exports=function(e){var t=n(e,\"number\");if(\"number\"==typeof t)throw new a(\"Can't convert number to bigint\");return BigInt(t)}},7696:function(e,t,i){var n=i(1291),a=i(8014),r=RangeError;e.exports=function(e){if(void 0===e)return 0;var t=n(e),i=a(t);if(t!==i)throw new r(\"Wrong length or index\");return i}},5397:function(e,t,i){var n=i(7055),a=i(7750);e.exports=function(e){return n(a(e))}},1291:function(e,t,i){var n=i(741);e.exports=function(e){var t=+e;return t!=t||0===t?0:n(t)}},8014:function(e,t,i){var n=i(1291),a=Math.min;e.exports=function(e){var t=n(e);return t>0?a(t,9007199254740991):0}},8981:function(e,t,i){var n=i(7750),a=Object;e.exports=function(e){return a(n(e))}},8229:function(e,t,i){var n=i(9590),a=RangeError;e.exports=function(e,t){var i=n(e);if(i%t)throw new a(\"Wrong offset\");return i}},9590:function(e,t,i){var n=i(1291),a=RangeError;e.exports=function(e){var t=n(e);if(t<0)throw new a(\"The argument can't be less than 0\");return t}},2777:function(e,t,i){var n=i(9565),a=i(34),r=i(757),o=i(5966),s=i(4270),l=i(8227),d=TypeError,p=l(\"toPrimitive\");e.exports=function(e,t){if(!a(e)||r(e))return e;var i,l=o(e,p);if(l){if(void 0===t&&(t=\"default\"),i=n(l,e,t),!a(i)||r(i))return i;throw new d(\"Can't convert object to primitive value\")}return void 0===t&&(t=\"number\"),s(e,t)}},6969:function(e,t,i){var n=i(2777),a=i(757);e.exports=function(e){var t=n(e,\"string\");return a(t)?t:t+\"\"}},2140:function(e,t,i){var n={};n[i(8227)(\"toStringTag\")]=\"z\",e.exports=\"[object z]\"===String(n)},655:function(e,t,i){var n=i(6955),a=String;e.exports=function(e){if(\"Symbol\"===n(e))throw new TypeError(\"Cannot convert a Symbol value to a string\");return a(e)}},8319:function(e){var t=Math.round;e.exports=function(e){var i=t(e);return i<0?0:i>255?255:255&i}},6823:function(e){var t=String;e.exports=function(e){try{return t(e)}catch(e){return\"Object\"}}},5823:function(e,t,i){var n=i(6518),a=i(4576),r=i(9565),o=i(3724),s=i(2805),l=i(4644),d=i(6346),p=i(679),c=i(6980),h=i(6699),u=i(2087),f=i(8014),A=i(7696),y=i(8229),m=i(8319),b=i(6969),g=i(9297),v=i(6955),C=i(34),x=i(757),w=i(2360),k=i(1625),_=i(2967),S=i(8480).f,T=i(3251),B=i(9213).forEach,E=i(7633),I=i(2106),F=i(4913),R=i(7347),O=i(5370),D=i(1181),M=i(3167),L=D.get,P=D.set,z=D.enforce,G=F.f,q=R.f,j=a.RangeError,U=d.ArrayBuffer,H=U.prototype,N=d.DataView,W=l.NATIVE_ARRAY_BUFFER_VIEWS,J=l.TYPED_ARRAY_TAG,V=l.TypedArray,K=l.TypedArrayPrototype,X=l.isTypedArray,Y=\"BYTES_PER_ELEMENT\",$=\"Wrong length\",Q=function(e,t){I(e,t,{configurable:!0,get:function(){return L(this)[t]}})},Z=function(e){var t;return k(H,e)||\"ArrayBuffer\"===(t=v(e))||\"SharedArrayBuffer\"===t},ee=function(e,t){return X(e)&&!x(t)&&t in e&&u(+t)&&t>=0},te=function(e,t){return t=b(t),ee(e,t)?c(2,e[t]):q(e,t)},ie=function(e,t,i){return t=b(t),!(ee(e,t)&&C(i)&&g(i,\"value\"))||g(i,\"get\")||g(i,\"set\")||i.configurable||g(i,\"writable\")&&!i.writable||g(i,\"enumerable\")&&!i.enumerable?G(e,t,i):(e[t]=i.value,e)};o?(W||(R.f=te,F.f=ie,Q(K,\"buffer\"),Q(K,\"byteOffset\"),Q(K,\"byteLength\"),Q(K,\"length\")),n({target:\"Object\",stat:!0,forced:!W},{getOwnPropertyDescriptor:te,defineProperty:ie}),e.exports=function(e,t,i){var o=e.match(/\\d+/)[0]/8,l=e+(i?\"Clamped\":\"\")+\"Array\",d=\"get\"+e,c=\"set\"+e,u=a[l],b=u,g=b&&b.prototype,v={},x=function(e,t){G(e,t,{get:function(){return function(e,t){var i=L(e);return i.view[d](t*o+i.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,n){var a=L(e);a.view[c](t*o+a.byteOffset,i?m(n):n,!0)}(this,t,e)},enumerable:!0})};W?s&&(b=t(function(e,t,i,n){return p(e,g),M(C(t)?Z(t)?void 0!==n?new u(t,y(i,o),n):void 0!==i?new u(t,y(i,o)):new u(t):X(t)?O(b,t):r(T,b,t):new u(A(t)),e,b)}),_&&_(b,V),B(S(u),function(e){e in b||h(b,e,u[e])}),b.prototype=g):(b=t(function(e,t,i,n){p(e,g);var a,s,l,d=0,c=0;if(C(t)){if(!Z(t))return X(t)?O(b,t):r(T,b,t);a=t,c=y(i,o);var h=t.byteLength;if(void 0===n){if(h%o)throw new j($);if((s=h-c)<0)throw new j($)}else if((s=f(n)*o)+c>h)throw new j($);l=s/o}else l=A(t),a=new U(s=l*o);for(P(e,{buffer:a,byteOffset:c,byteLength:s,length:l,view:new N(a)});d<l;)x(e,d++)}),_&&_(b,V),g=b.prototype=w(K)),g.constructor!==b&&h(g,\"constructor\",b),z(g).TypedArrayConstructor=b,J&&h(g,J,l);var k=b!==u;v[l]=b,n({global:!0,constructor:!0,forced:k,sham:!W},v),Y in b||h(b,Y,o),Y in g||h(g,Y,o),E(l)}):e.exports=function(){}},2805:function(e,t,i){var n=i(4576),a=i(9039),r=i(4428),o=i(4644).NATIVE_ARRAY_BUFFER_VIEWS,s=n.ArrayBuffer,l=n.Int8Array;e.exports=!o||!a(function(){l(1)})||!a(function(){new l(-1)})||!r(function(e){new l,new l(null),new l(1.5),new l(e)},!0)||a(function(){return 1!==new l(new s(2),1,void 0).length})},6357:function(e,t,i){var n=i(5370),a=i(1412);e.exports=function(e,t){return n(a(e),t)}},3251:function(e,t,i){var n=i(6080),a=i(9565),r=i(5548),o=i(8981),s=i(6198),l=i(81),d=i(851),p=i(4209),c=i(1108),h=i(4644).aTypedArrayConstructor,u=i(5854);e.exports=function(e){var t,i,f,A,y,m,b,g,v=r(this),C=o(e),x=arguments.length,w=x>1?arguments[1]:void 0,k=void 0!==w,_=d(C);if(_&&!p(_))for(g=(b=l(C,_)).next,C=[];!(m=a(g,b)).done;)C.push(m.value);for(k&&x>2&&(w=n(w,arguments[2])),i=s(C),f=new(h(v))(i),A=c(f),t=0;i>t;t++)y=k?w(C[t],t):C[t],f[t]=A?u(y):+y;return f}},1412:function(e,t,i){var n=i(4644),a=i(2293),r=n.aTypedArrayConstructor,o=n.getTypedArrayConstructor;e.exports=function(e){return r(a(e,o(e)))}},3392:function(e,t,i){var n=i(9504),a=0,r=Math.random(),o=n(1..toString);e.exports=function(e){return\"Symbol(\"+(void 0===e?\"\":e)+\")_\"+o(++a+r,36)}},7040:function(e,t,i){var n=i(4495);e.exports=n&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator},8686:function(e,t,i){var n=i(3724),a=i(9039);e.exports=n&&a(function(){return 42!==Object.defineProperty(function(){},\"prototype\",{value:42,writable:!1}).prototype})},8622:function(e,t,i){var n=i(4576),a=i(4901),r=n.WeakMap;e.exports=a(r)&&/native code/.test(String(r))},511:function(e,t,i){var n=i(9167),a=i(9297),r=i(1951),o=i(4913).f;e.exports=function(e){var t=n.Symbol||(n.Symbol={});a(t,e)||o(t,e,{value:r.f(e)})}},1951:function(e,t,i){var n=i(8227);t.f=n},8227:function(e,t,i){var n=i(4576),a=i(5745),r=i(9297),o=i(3392),s=i(4495),l=i(7040),d=n.Symbol,p=a(\"wks\"),c=l?d.for||d:d&&d.withoutSetter||o;e.exports=function(e){return r(p,e)||(p[e]=s&&r(d,e)?d[e]:c(\"Symbol.\"+e)),p[e]}},7452:function(e){e.exports=\"\\t\\n\\v\\f\\r                　\\u2028\\u2029\\ufeff\"},4743:function(e,t,i){var n=i(6518),a=i(4576),r=i(6346),o=i(7633),s=\"ArrayBuffer\",l=r[s];n({global:!0,constructor:!0,forced:a[s]!==l},{ArrayBuffer:l}),o(s)},1745:function(e,t,i){var n=i(6518),a=i(7476),r=i(9039),o=i(6346),s=i(8551),l=i(5610),d=i(8014),p=i(2293),c=o.ArrayBuffer,h=o.DataView,u=h.prototype,f=a(c.prototype.slice),A=a(u.getUint8),y=a(u.setUint8);n({target:\"ArrayBuffer\",proto:!0,unsafe:!0,forced:r(function(){return!new c(2).slice(1,void 0).byteLength})},{slice:function(e,t){if(f&&void 0===t)return f(s(this),e);for(var i=s(this).byteLength,n=l(e,i),a=l(void 0===t?i:t,i),r=new(p(this,c))(d(a-n)),o=new h(this),u=new h(r),m=0;n<a;)y(u,m++,A(o,n++));return r}})},8706:function(e,t,i){var n=i(6518),a=i(9039),r=i(4376),o=i(34),s=i(8981),l=i(6198),d=i(6837),p=i(4659),c=i(1469),h=i(597),u=i(8227),f=i(9519),A=u(\"isConcatSpreadable\"),y=f>=51||!a(function(){var e=[];return e[A]=!1,e.concat()[0]!==e}),m=function(e){if(!o(e))return!1;var t=e[A];return void 0!==t?!!t:r(e)};n({target:\"Array\",proto:!0,arity:1,forced:!y||!h(\"concat\")},{concat:function(e){var t,i,n,a,r,o=s(this),h=c(o,0),u=0;for(t=-1,n=arguments.length;t<n;t++)if(m(r=-1===t?o:arguments[t]))for(a=l(r),d(u+a),i=0;i<a;i++,u++)i in r&&p(h,u,r[i]);else d(u+1),p(h,u++,r);return h.length=u,h}})},3771:function(e,t,i){var n=i(6518),a=i(4373),r=i(6469);n({target:\"Array\",proto:!0},{fill:a}),r(\"fill\")},2008:function(e,t,i){var n=i(6518),a=i(9213).filter;n({target:\"Array\",proto:!0,forced:!i(597)(\"filter\")},{filter:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}})},8980:function(e,t,i){var n=i(6518),a=i(9213).findIndex,r=i(6469),o=\"findIndex\",s=!0;o in[]&&Array(1)[o](function(){s=!1}),n({target:\"Array\",proto:!0,forced:s},{findIndex:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}}),r(o)},113:function(e,t,i){var n=i(6518),a=i(9213).find,r=i(6469),o=\"find\",s=!0;o in[]&&Array(1)[o](function(){s=!1}),n({target:\"Array\",proto:!0,forced:s},{find:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}}),r(o)},3418:function(e,t,i){var n=i(6518),a=i(7916);n({target:\"Array\",stat:!0,forced:!i(4428)(function(e){Array.from(e)})},{from:a})},4423:function(e,t,i){var n=i(6518),a=i(9617).includes,r=i(9039),o=i(6469);n({target:\"Array\",proto:!0,forced:r(function(){return!Array(1).includes()})},{includes:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}}),o(\"includes\")},3792:function(e,t,i){var n=i(5397),a=i(6469),r=i(6269),o=i(1181),s=i(4913).f,l=i(1088),d=i(2529),p=i(6395),c=i(3724),h=\"Array Iterator\",u=o.set,f=o.getterFor(h);e.exports=l(Array,\"Array\",function(e,t){u(this,{type:h,target:n(e),index:0,kind:t})},function(){var e=f(this),t=e.target,i=e.index++;if(!t||i>=t.length)return e.target=null,d(void 0,!0);switch(e.kind){case\"keys\":return d(i,!1);case\"values\":return d(t[i],!1)}return d([i,t[i]],!1)},\"values\");var A=r.Arguments=r.Array;if(a(\"keys\"),a(\"values\"),a(\"entries\"),!p&&c&&\"values\"!==A.name)try{s(A,\"name\",{value:\"values\"})}catch(e){}},4782:function(e,t,i){var n=i(6518),a=i(4376),r=i(3517),o=i(34),s=i(5610),l=i(6198),d=i(5397),p=i(4659),c=i(8227),h=i(597),u=i(7680),f=h(\"slice\"),A=c(\"species\"),y=Array,m=Math.max;n({target:\"Array\",proto:!0,forced:!f},{slice:function(e,t){var i,n,c,h=d(this),f=l(h),b=s(e,f),g=s(void 0===t?f:t,f);if(a(h)&&(i=h.constructor,(r(i)&&(i===y||a(i.prototype))||o(i)&&null===(i=i[A]))&&(i=void 0),i===y||void 0===i))return u(h,b,g);for(n=new(void 0===i?y:i)(m(g-b,0)),c=0;b<g;b++,c++)b in h&&p(n,c,h[b]);return n.length=c,n}})},6910:function(e,t,i){var n=i(6518),a=i(9504),r=i(9306),o=i(8981),s=i(6198),l=i(4606),d=i(655),p=i(9039),c=i(4488),h=i(4598),u=i(3709),f=i(3763),A=i(9519),y=i(3607),m=[],b=a(m.sort),g=a(m.push),v=p(function(){m.sort(void 0)}),C=p(function(){m.sort(null)}),x=h(\"sort\"),w=!p(function(){if(A)return A<70;if(!(u&&u>3)){if(f)return!0;if(y)return y<603;var e,t,i,n,a=\"\";for(e=65;e<76;e++){switch(t=String.fromCharCode(e),e){case 66:case 69:case 70:case 72:i=3;break;case 68:case 71:i=4;break;default:i=2}for(n=0;n<47;n++)m.push({k:t+n,v:i})}for(m.sort(function(e,t){return t.v-e.v}),n=0;n<m.length;n++)t=m[n].k.charAt(0),a.charAt(a.length-1)!==t&&(a+=t);return\"DGBEFHACIJK\"!==a}});n({target:\"Array\",proto:!0,forced:v||!C||!x||!w},{sort:function(e){void 0!==e&&r(e);var t=o(this);if(w)return void 0===e?b(t):b(t,e);var i,n,a=[],p=s(t);for(n=0;n<p;n++)n in t&&g(a,t[n]);for(c(a,function(e){return function(t,i){return void 0===i?-1:void 0===t?1:void 0!==e?+e(t,i)||0:d(t)>d(i)?1:-1}}(e)),i=s(a),n=0;n<i;)t[n]=a[n++];for(;n<p;)l(t,n++);return t}})},4554:function(e,t,i){var n=i(6518),a=i(8981),r=i(5610),o=i(1291),s=i(6198),l=i(4527),d=i(6837),p=i(1469),c=i(4659),h=i(4606),u=i(597)(\"splice\"),f=Math.max,A=Math.min;n({target:\"Array\",proto:!0,forced:!u},{splice:function(e,t){var i,n,u,y,m,b,g=a(this),v=s(g),C=r(e,v),x=arguments.length;for(0===x?i=n=0:1===x?(i=0,n=v-C):(i=x-2,n=A(f(o(t),0),v-C)),d(v+i-n),u=p(g,n),y=0;y<n;y++)(m=C+y)in g&&c(u,y,g[m]);if(u.length=n,i<n){for(y=C;y<v-n;y++)b=y+i,(m=y+n)in g?g[b]=g[m]:h(g,b);for(y=v;y>v-n+i;y--)h(g,y-1)}else if(i>n)for(y=v-n;y>C;y--)b=y+i-1,(m=y+n-1)in g?g[b]=g[m]:h(g,b);for(y=0;y<i;y++)g[y+C]=arguments[y+2];return l(g,v-n+i),u}})},9572:function(e,t,i){var n=i(9297),a=i(6840),r=i(3640),o=i(8227)(\"toPrimitive\"),s=Date.prototype;n(s,o)||a(s,o,r)},2010:function(e,t,i){var n=i(3724),a=i(350).EXISTS,r=i(9504),o=i(2106),s=Function.prototype,l=r(s.toString),d=/function\\b(?:\\s|\\/\\*[\\S\\s]*?\\*\\/|\\/\\/[^\\n\\r]*[\\n\\r]+)*([^\\s(/]*)/,p=r(d.exec);n&&!a&&o(s,\"name\",{configurable:!0,get:function(){try{return p(d,l(this))[1]}catch(e){return\"\"}}})},3110:function(e,t,i){var n=i(6518),a=i(7751),r=i(8745),o=i(9565),s=i(9504),l=i(9039),d=i(4901),p=i(757),c=i(7680),h=i(6933),u=i(4495),f=String,A=a(\"JSON\",\"stringify\"),y=s(/./.exec),m=s(\"\".charAt),b=s(\"\".charCodeAt),g=s(\"\".replace),v=s(1..toString),C=/[\\uD800-\\uDFFF]/g,x=/^[\\uD800-\\uDBFF]$/,w=/^[\\uDC00-\\uDFFF]$/,k=!u||l(function(){var e=a(\"Symbol\")(\"stringify detection\");return\"[null]\"!==A([e])||\"{}\"!==A({a:e})||\"{}\"!==A(Object(e))}),_=l(function(){return'\"\\\\udf06\\\\ud834\"'!==A(\"\\udf06\\ud834\")||'\"\\\\udead\"'!==A(\"\\udead\")}),S=function(e,t){var i=c(arguments),n=h(t);if(d(n)||void 0!==e&&!p(e))return i[1]=function(e,t){if(d(n)&&(t=o(n,this,f(e),t)),!p(t))return t},r(A,null,i)},T=function(e,t,i){var n=m(i,t-1),a=m(i,t+1);return y(x,e)&&!y(w,a)||y(w,e)&&!y(x,n)?\"\\\\u\"+v(b(e,0),16):e};A&&n({target:\"JSON\",stat:!0,arity:3,forced:k||_},{stringify:function(e,t,i){var n=c(arguments),a=r(k?S:A,null,n);return _&&\"string\"==typeof a?g(a,C,T):a}})},8523:function(e,t,i){i(6468)(\"Map\",function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},i(6938))},6033:function(e,t,i){i(8523)},2892:function(e,t,i){var n=i(6518),a=i(6395),r=i(3724),o=i(4576),s=i(9167),l=i(9504),d=i(2796),p=i(9297),c=i(3167),h=i(1625),u=i(757),f=i(2777),A=i(9039),y=i(8480).f,m=i(7347).f,b=i(4913).f,g=i(1240),v=i(3802).trim,C=\"Number\",x=o[C],w=s[C],k=x.prototype,_=o.TypeError,S=l(\"\".slice),T=l(\"\".charCodeAt),B=d(C,!x(\" 0o1\")||!x(\"0b1\")||x(\"+0x1\")),E=function(e){var t,i=arguments.length<1?0:x(function(e){var t=f(e,\"number\");return\"bigint\"==typeof t?t:function(e){var t,i,n,a,r,o,s,l,d=f(e,\"number\");if(u(d))throw new _(\"Cannot convert a Symbol value to a number\");if(\"string\"==typeof d&&d.length>2)if(d=v(d),43===(t=T(d,0))||45===t){if(88===(i=T(d,2))||120===i)return NaN}else if(48===t){switch(T(d,1)){case 66:case 98:n=2,a=49;break;case 79:case 111:n=8,a=55;break;default:return+d}for(o=(r=S(d,2)).length,s=0;s<o;s++)if((l=T(r,s))<48||l>a)return NaN;return parseInt(r,n)}return+d}(t)}(e));return h(k,t=this)&&A(function(){g(t)})?c(Object(i),this,E):i};E.prototype=k,B&&!a&&(k.constructor=E),n({global:!0,constructor:!0,wrap:!0,forced:B},{Number:E});var I=function(e,t){for(var i,n=r?y(t):\"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,fromString,range\".split(\",\"),a=0;n.length>a;a++)p(t,i=n[a])&&!p(e,i)&&b(e,i,m(t,i))};a&&w&&I(s[C],w),(B||a)&&I(s[C],x)},5428:function(e,t,i){i(6518)({target:\"Number\",stat:!0},{isFinite:i(360)})},4601:function(e,t,i){i(6518)({target:\"Number\",stat:!0,nonConfigurable:!0,nonWritable:!0},{MAX_SAFE_INTEGER:9007199254740991})},5843:function(e,t,i){var n=i(6518),a=i(2703);n({target:\"Number\",stat:!0,forced:Number.parseInt!==a},{parseInt:a})},5506:function(e,t,i){var n=i(6518),a=i(2357).entries;n({target:\"Object\",stat:!0},{entries:function(e){return a(e)}})},3851:function(e,t,i){var n=i(6518),a=i(9039),r=i(5397),o=i(7347).f,s=i(3724);n({target:\"Object\",stat:!0,forced:!s||a(function(){o(1)}),sham:!s},{getOwnPropertyDescriptor:function(e,t){return o(r(e),t)}})},1278:function(e,t,i){var n=i(6518),a=i(3724),r=i(5031),o=i(5397),s=i(7347),l=i(4659);n({target:\"Object\",stat:!0,sham:!a},{getOwnPropertyDescriptors:function(e){for(var t,i,n=o(e),a=s.f,d=r(n),p={},c=0;d.length>c;)void 0!==(i=a(n,t=d[c++]))&&l(p,t,i);return p}})},9773:function(e,t,i){var n=i(6518),a=i(4495),r=i(9039),o=i(3717),s=i(8981);n({target:\"Object\",stat:!0,forced:!a||r(function(){o.f(1)})},{getOwnPropertySymbols:function(e){var t=o.f;return t?t(s(e)):[]}})},875:function(e,t,i){var n=i(6518),a=i(9039),r=i(8981),o=i(2787),s=i(2211);n({target:\"Object\",stat:!0,forced:a(function(){o(1)}),sham:!s},{getPrototypeOf:function(e){return o(r(e))}})},9432:function(e,t,i){var n=i(6518),a=i(8981),r=i(1072);n({target:\"Object\",stat:!0,forced:i(9039)(function(){r(1)})},{keys:function(e){return r(a(e))}})},287:function(e,t,i){i(6518)({target:\"Object\",stat:!0},{setPrototypeOf:i(2967)})},6099:function(e,t,i){var n=i(2140),a=i(6840),r=i(3179);n||a(Object.prototype,\"toString\",r,{unsafe:!0})},825:function(e,t,i){var n=i(6518),a=i(7751),r=i(8745),o=i(566),s=i(5548),l=i(8551),d=i(34),p=i(2360),c=i(9039),h=a(\"Reflect\",\"construct\"),u=Object.prototype,f=[].push,A=c(function(){function e(){}return!(h(function(){},[],e)instanceof e)}),y=!c(function(){h(function(){})}),m=A||y;n({target:\"Reflect\",stat:!0,forced:m,sham:m},{construct:function(e,t){s(e),l(t);var i=arguments.length<3?e:s(arguments[2]);if(y&&!A)return h(e,t,i);if(e===i){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var n=[null];return r(f,n,t),new(r(o,e,n))}var a=i.prototype,c=p(d(a)?a:u),m=r(e,c,t);return d(m)?m:c}})},7495:function(e,t,i){var n=i(6518),a=i(7323);n({target:\"RegExp\",proto:!0,forced:/./.exec!==a},{exec:a})},8781:function(e,t,i){var n=i(350).PROPER,a=i(6840),r=i(8551),o=i(655),s=i(9039),l=i(1034),d=\"toString\",p=RegExp.prototype,c=p[d],h=s(function(){return\"/a/b\"!==c.call({source:\"a\",flags:\"b\"})}),u=n&&c.name!==d;(h||u)&&a(p,d,function(){var e=r(this);return\"/\"+o(e.source)+\"/\"+o(l(e))},{unsafe:!0})},2405:function(e,t,i){i(6468)(\"Set\",function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},i(6938))},1415:function(e,t,i){i(2405)},1699:function(e,t,i){var n=i(6518),a=i(9504),r=i(5749),o=i(7750),s=i(655),l=i(1436),d=a(\"\".indexOf);n({target:\"String\",proto:!0,forced:!l(\"includes\")},{includes:function(e){return!!~d(s(o(this)),s(r(e)),arguments.length>1?arguments[1]:void 0)}})},7764:function(e,t,i){var n=i(8183).charAt,a=i(655),r=i(1181),o=i(1088),s=i(2529),l=\"String Iterator\",d=r.set,p=r.getterFor(l);o(String,\"String\",function(e){d(this,{type:l,string:a(e),index:0})},function(){var e,t=p(this),i=t.string,a=t.index;return a>=i.length?s(void 0,!0):(e=n(i,a),t.index+=e.length,s(e,!1))})},8156:function(e,t,i){var n=i(6518),a=i(533).start;n({target:\"String\",proto:!0,forced:i(3063)},{padStart:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}})},5440:function(e,t,i){var n=i(8745),a=i(9565),r=i(9504),o=i(9228),s=i(9039),l=i(8551),d=i(4901),p=i(4117),c=i(1291),h=i(8014),u=i(655),f=i(7750),A=i(7829),y=i(5966),m=i(2478),b=i(6682),g=i(8227)(\"replace\"),v=Math.max,C=Math.min,x=r([].concat),w=r([].push),k=r(\"\".indexOf),_=r(\"\".slice),S=\"$0\"===\"a\".replace(/./,\"$0\"),T=!!/./[g]&&\"\"===/./[g](\"a\",\"$0\");o(\"replace\",function(e,t,i){var r=T?\"$\":\"$0\";return[function(e,i){var n=f(this),r=p(e)?void 0:y(e,g);return r?a(r,e,n,i):a(t,u(n),e,i)},function(e,a){var o=l(this),s=u(e);if(\"string\"==typeof a&&-1===k(a,r)&&-1===k(a,\"$<\")){var p=i(t,o,s,a);if(p.done)return p.value}var f=d(a);f||(a=u(a));var y,g=o.global;g&&(y=o.unicode,o.lastIndex=0);for(var S,T=[];null!==(S=b(o,s))&&(w(T,S),g);)\"\"===u(S[0])&&(o.lastIndex=A(s,h(o.lastIndex),y));for(var B,E=\"\",I=0,F=0;F<T.length;F++){for(var R,O=u((S=T[F])[0]),D=v(C(c(S.index),s.length),0),M=[],L=1;L<S.length;L++)w(M,void 0===(B=S[L])?B:String(B));var P=S.groups;if(f){var z=x([O],M,D,s);void 0!==P&&w(z,P),R=u(n(a,void 0,z))}else R=m(O,s,D,M,P,a);D>=I&&(E+=_(s,I,D)+R,I=D+O.length)}return E+_(s,I)}]},!!s(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:\"7\"},e},\"7\"!==\"\".replace(e,\"$<a>\")})||!S||T)},6761:function(e,t,i){var n=i(6518),a=i(4576),r=i(9565),o=i(9504),s=i(6395),l=i(3724),d=i(4495),p=i(9039),c=i(9297),h=i(1625),u=i(8551),f=i(5397),A=i(6969),y=i(655),m=i(6980),b=i(2360),g=i(1072),v=i(8480),C=i(298),x=i(3717),w=i(7347),k=i(4913),_=i(6801),S=i(8773),T=i(6840),B=i(2106),E=i(5745),I=i(6119),F=i(421),R=i(3392),O=i(8227),D=i(1951),M=i(511),L=i(8242),P=i(687),z=i(1181),G=i(9213).forEach,q=I(\"hidden\"),j=\"Symbol\",U=\"prototype\",H=z.set,N=z.getterFor(j),W=Object[U],J=a.Symbol,V=J&&J[U],K=a.RangeError,X=a.TypeError,Y=a.QObject,$=w.f,Q=k.f,Z=C.f,ee=S.f,te=o([].push),ie=E(\"symbols\"),ne=E(\"op-symbols\"),ae=E(\"wks\"),re=!Y||!Y[U]||!Y[U].findChild,oe=function(e,t,i){var n=$(W,t);n&&delete W[t],Q(e,t,i),n&&e!==W&&Q(W,t,n)},se=l&&p(function(){return 7!==b(Q({},\"a\",{get:function(){return Q(this,\"a\",{value:7}).a}})).a})?oe:Q,le=function(e,t){var i=ie[e]=b(V);return H(i,{type:j,tag:e,description:t}),l||(i.description=t),i},de=function(e,t,i){e===W&&de(ne,t,i),u(e);var n=A(t);return u(i),c(ie,n)?(i.enumerable?(c(e,q)&&e[q][n]&&(e[q][n]=!1),i=b(i,{enumerable:m(0,!1)})):(c(e,q)||Q(e,q,m(1,b(null))),e[q][n]=!0),se(e,n,i)):Q(e,n,i)},pe=function(e,t){u(e);var i=f(t),n=g(i).concat(fe(i));return G(n,function(t){l&&!r(ce,i,t)||de(e,t,i[t])}),e},ce=function(e){var t=A(e),i=r(ee,this,t);return!(this===W&&c(ie,t)&&!c(ne,t))&&(!(i||!c(this,t)||!c(ie,t)||c(this,q)&&this[q][t])||i)},he=function(e,t){var i=f(e),n=A(t);if(i!==W||!c(ie,n)||c(ne,n)){var a=$(i,n);return!a||!c(ie,n)||c(i,q)&&i[q][n]||(a.enumerable=!0),a}},ue=function(e){var t=Z(f(e)),i=[];return G(t,function(e){c(ie,e)||c(F,e)||te(i,e)}),i},fe=function(e){var t=e===W,i=Z(t?ne:f(e)),n=[];return G(i,function(e){!c(ie,e)||t&&!c(W,e)||te(n,ie[e])}),n};d||(J=function(){if(h(V,this))throw new X(\"Symbol is not a constructor\");var e=arguments.length&&void 0!==arguments[0]?y(arguments[0]):void 0,t=R(e),i=function(e){var n=void 0===this?a:this;n===W&&r(i,ne,e),c(n,q)&&c(n[q],t)&&(n[q][t]=!1);var o=m(1,e);try{se(n,t,o)}catch(e){if(!(e instanceof K))throw e;oe(n,t,o)}};return l&&re&&se(W,t,{configurable:!0,set:i}),le(t,e)},T(V=J[U],\"toString\",function(){return N(this).tag}),T(J,\"withoutSetter\",function(e){return le(R(e),e)}),S.f=ce,k.f=de,_.f=pe,w.f=he,v.f=C.f=ue,x.f=fe,D.f=function(e){return le(O(e),e)},l&&(B(V,\"description\",{configurable:!0,get:function(){return N(this).description}}),s||T(W,\"propertyIsEnumerable\",ce,{unsafe:!0}))),n({global:!0,constructor:!0,wrap:!0,forced:!d,sham:!d},{Symbol:J}),G(g(ae),function(e){M(e)}),n({target:j,stat:!0,forced:!d},{useSetter:function(){re=!0},useSimple:function(){re=!1}}),n({target:\"Object\",stat:!0,forced:!d,sham:!l},{create:function(e,t){return void 0===t?b(e):pe(b(e),t)},defineProperty:de,defineProperties:pe,getOwnPropertyDescriptor:he}),n({target:\"Object\",stat:!0,forced:!d},{getOwnPropertyNames:ue}),L(),P(J,j),F[q]=!0},9463:function(e,t,i){var n=i(6518),a=i(3724),r=i(4576),o=i(9504),s=i(9297),l=i(4901),d=i(1625),p=i(655),c=i(2106),h=i(7740),u=r.Symbol,f=u&&u.prototype;if(a&&l(u)&&(!(\"description\"in f)||void 0!==u().description)){var A={},y=function(){var e=arguments.length<1||void 0===arguments[0]?void 0:p(arguments[0]),t=d(f,this)?new u(e):void 0===e?u():u(e);return\"\"===e&&(A[t]=!0),t};h(y,u),y.prototype=f,f.constructor=y;var m=\"Symbol(description detection)\"===String(u(\"description detection\")),b=o(f.valueOf),g=o(f.toString),v=/^Symbol\\((.*)\\)[^)]+$/,C=o(\"\".replace),x=o(\"\".slice);c(f,\"description\",{configurable:!0,get:function(){var e=b(this);if(s(A,e))return\"\";var t=g(e),i=m?x(t,7,-1):C(t,v,\"$1\");return\"\"===i?void 0:i}}),n({global:!0,constructor:!0,forced:!0},{Symbol:y})}},1510:function(e,t,i){var n=i(6518),a=i(7751),r=i(9297),o=i(655),s=i(5745),l=i(1296),d=s(\"string-to-symbol-registry\"),p=s(\"symbol-to-string-registry\");n({target:\"Symbol\",stat:!0,forced:!l},{for:function(e){var t=o(e);if(r(d,t))return d[t];var i=a(\"Symbol\")(t);return d[t]=i,p[i]=t,i}})},2259:function(e,t,i){i(511)(\"iterator\")},2675:function(e,t,i){i(6761),i(1510),i(7812),i(3110),i(9773)},7812:function(e,t,i){var n=i(6518),a=i(9297),r=i(757),o=i(6823),s=i(5745),l=i(1296),d=s(\"symbol-to-string-registry\");n({target:\"Symbol\",stat:!0,forced:!l},{keyFor:function(e){if(!r(e))throw new TypeError(o(e)+\" is not a symbol\");if(a(d,e))return d[e]}})},5700:function(e,t,i){var n=i(511),a=i(8242);n(\"toPrimitive\"),a()},1630:function(e,t,i){var n=i(9504),a=i(4644),r=n(i(7029)),o=a.aTypedArray;(0,a.exportTypedArrayMethod)(\"copyWithin\",function(e,t){return r(o(this),e,t,arguments.length>2?arguments[2]:void 0)})},2170:function(e,t,i){var n=i(4644),a=i(9213).every,r=n.aTypedArray;(0,n.exportTypedArrayMethod)(\"every\",function(e){return a(r(this),e,arguments.length>1?arguments[1]:void 0)})},5044:function(e,t,i){var n=i(4644),a=i(4373),r=i(5854),o=i(6955),s=i(9565),l=i(9504),d=i(9039),p=n.aTypedArray,c=n.exportTypedArrayMethod,h=l(\"\".slice);c(\"fill\",function(e){var t=arguments.length;p(this);var i=\"Big\"===h(o(this),0,3)?r(e):+e;return s(a,this,i,t>1?arguments[1]:void 0,t>2?arguments[2]:void 0)},d(function(){var e=0;return new Int8Array(2).fill({valueOf:function(){return e++}}),1!==e}))},9539:function(e,t,i){var n=i(4644),a=i(9213).filter,r=i(6357),o=n.aTypedArray;(0,n.exportTypedArrayMethod)(\"filter\",function(e){var t=a(o(this),e,arguments.length>1?arguments[1]:void 0);return r(this,t)})},9955:function(e,t,i){var n=i(4644),a=i(9213).findIndex,r=n.aTypedArray;(0,n.exportTypedArrayMethod)(\"findIndex\",function(e){return a(r(this),e,arguments.length>1?arguments[1]:void 0)})},1694:function(e,t,i){var n=i(4644),a=i(9213).find,r=n.aTypedArray;(0,n.exportTypedArrayMethod)(\"find\",function(e){return a(r(this),e,arguments.length>1?arguments[1]:void 0)})},3206:function(e,t,i){var n=i(4644),a=i(9213).forEach,r=n.aTypedArray;(0,n.exportTypedArrayMethod)(\"forEach\",function(e){a(r(this),e,arguments.length>1?arguments[1]:void 0)})},4496:function(e,t,i){var n=i(4644),a=i(9617).includes,r=n.aTypedArray;(0,n.exportTypedArrayMethod)(\"includes\",function(e){return a(r(this),e,arguments.length>1?arguments[1]:void 0)})},6651:function(e,t,i){var n=i(4644),a=i(9617).indexOf,r=n.aTypedArray;(0,n.exportTypedArrayMethod)(\"indexOf\",function(e){return a(r(this),e,arguments.length>1?arguments[1]:void 0)})},2887:function(e,t,i){var n=i(4576),a=i(9039),r=i(9504),o=i(4644),s=i(3792),l=i(8227)(\"iterator\"),d=n.Uint8Array,p=r(s.values),c=r(s.keys),h=r(s.entries),u=o.aTypedArray,f=o.exportTypedArrayMethod,A=d&&d.prototype,y=!a(function(){A[l].call([1])}),m=!!A&&A.values&&A[l]===A.values&&\"values\"===A.values.name,b=function(){return p(u(this))};f(\"entries\",function(){return h(u(this))},y),f(\"keys\",function(){return c(u(this))},y),f(\"values\",b,y||!m,{name:\"values\"}),f(l,b,y||!m,{name:\"values\"})},9369:function(e,t,i){var n=i(4644),a=i(9504),r=n.aTypedArray,o=n.exportTypedArrayMethod,s=a([].join);o(\"join\",function(e){return s(r(this),e)})},6812:function(e,t,i){var n=i(4644),a=i(8745),r=i(8379),o=n.aTypedArray;(0,n.exportTypedArrayMethod)(\"lastIndexOf\",function(e){var t=arguments.length;return a(r,o(this),t>1?[e,arguments[1]]:[e])})},8995:function(e,t,i){var n=i(4644),a=i(9213).map,r=i(1412),o=n.aTypedArray;(0,n.exportTypedArrayMethod)(\"map\",function(e){return a(o(this),e,arguments.length>1?arguments[1]:void 0,function(e,t){return new(r(e))(t)})})},6072:function(e,t,i){var n=i(4644),a=i(926).right,r=n.aTypedArray;(0,n.exportTypedArrayMethod)(\"reduceRight\",function(e){var t=arguments.length;return a(r(this),e,t,t>1?arguments[1]:void 0)})},1575:function(e,t,i){var n=i(4644),a=i(926).left,r=n.aTypedArray;(0,n.exportTypedArrayMethod)(\"reduce\",function(e){var t=arguments.length;return a(r(this),e,t,t>1?arguments[1]:void 0)})},8747:function(e,t,i){var n=i(4644),a=n.aTypedArray,r=n.exportTypedArrayMethod,o=Math.floor;r(\"reverse\",function(){for(var e,t=this,i=a(t).length,n=o(i/2),r=0;r<n;)e=t[r],t[r++]=t[--i],t[i]=e;return t})},8845:function(e,t,i){var n=i(4576),a=i(9565),r=i(4644),o=i(6198),s=i(8229),l=i(8981),d=i(9039),p=n.RangeError,c=n.Int8Array,h=c&&c.prototype,u=h&&h.set,f=r.aTypedArray,A=r.exportTypedArrayMethod,y=!d(function(){var e=new Uint8ClampedArray(2);return a(u,e,{length:1,0:3},1),3!==e[1]}),m=y&&r.NATIVE_ARRAY_BUFFER_VIEWS&&d(function(){var e=new c(2);return e.set(1),e.set(\"2\",1),0!==e[0]||2!==e[1]});A(\"set\",function(e){f(this);var t=s(arguments.length>1?arguments[1]:void 0,1),i=l(e);if(y)return a(u,this,i,t);var n=this.length,r=o(i),d=0;if(r+t>n)throw new p(\"Wrong length\");for(;d<r;)this[t+d]=i[d++]},!y||m)},9423:function(e,t,i){var n=i(4644),a=i(1412),r=i(9039),o=i(7680),s=n.aTypedArray;(0,n.exportTypedArrayMethod)(\"slice\",function(e,t){for(var i=o(s(this),e,t),n=a(this),r=0,l=i.length,d=new n(l);l>r;)d[r]=i[r++];return d},r(function(){new Int8Array(1).slice()}))},7301:function(e,t,i){var n=i(4644),a=i(9213).some,r=n.aTypedArray;(0,n.exportTypedArrayMethod)(\"some\",function(e){return a(r(this),e,arguments.length>1?arguments[1]:void 0)})},373:function(e,t,i){var n=i(4576),a=i(7476),r=i(9039),o=i(9306),s=i(4488),l=i(4644),d=i(3709),p=i(3763),c=i(9519),h=i(3607),u=l.aTypedArray,f=l.exportTypedArrayMethod,A=n.Uint16Array,y=A&&a(A.prototype.sort),m=!(!y||r(function(){y(new A(2),null)})&&r(function(){y(new A(2),{})})),b=!!y&&!r(function(){if(c)return c<74;if(d)return d<67;if(p)return!0;if(h)return h<602;var e,t,i=new A(516),n=Array(516);for(e=0;e<516;e++)t=e%4,i[e]=515-e,n[e]=e-2*t+3;for(y(i,function(e,t){return(e/4|0)-(t/4|0)}),e=0;e<516;e++)if(i[e]!==n[e])return!0});f(\"sort\",function(e){return void 0!==e&&o(e),b?y(this,e):s(u(this),function(e){return function(t,i){return void 0!==e?+e(t,i)||0:i!=i?-1:t!=t?1:0===t&&0===i?1/t>0&&1/i<0?1:-1:t>i}}(e))},!b||m)},6614:function(e,t,i){var n=i(4644),a=i(8014),r=i(5610),o=i(1412),s=n.aTypedArray;(0,n.exportTypedArrayMethod)(\"subarray\",function(e,t){var i=s(this),n=i.length,l=r(e,n);return new(o(i))(i.buffer,i.byteOffset+l*i.BYTES_PER_ELEMENT,a((void 0===t?n:r(t,n))-l))})},1405:function(e,t,i){var n=i(4576),a=i(8745),r=i(4644),o=i(9039),s=i(7680),l=n.Int8Array,d=r.aTypedArray,p=r.exportTypedArrayMethod,c=[].toLocaleString,h=!!l&&o(function(){c.call(new l(1))});p(\"toLocaleString\",function(){return a(c,h?s(d(this)):d(this),s(arguments))},o(function(){return[1,2].toLocaleString()!==new l([1,2]).toLocaleString()})||!o(function(){l.prototype.toLocaleString.call([1,2])}))},3684:function(e,t,i){var n=i(4644).exportTypedArrayMethod,a=i(9039),r=i(4576),o=i(9504),s=r.Uint8Array,l=s&&s.prototype||{},d=[].toString,p=o([].join);a(function(){d.call({})})&&(d=function(){return p(this)});var c=l.toString!==d;n(\"toString\",d,c)},1489:function(e,t,i){i(5823)(\"Uint8\",function(e){return function(t,i,n){return e(this,t,i,n)}})},3500:function(e,t,i){var n=i(4576),a=i(7400),r=i(9296),o=i(235),s=i(6699),l=function(e){if(e&&e.forEach!==o)try{s(e,\"forEach\",o)}catch(t){e.forEach=o}};for(var d in a)a[d]&&l(n[d]&&n[d].prototype);l(r)},2953:function(e,t,i){var n=i(4576),a=i(7400),r=i(9296),o=i(3792),s=i(6699),l=i(687),d=i(8227)(\"iterator\"),p=o.values,c=function(e,t){if(e){if(e[d]!==p)try{s(e,d,p)}catch(t){e[d]=p}if(l(e,t,!0),a[t])for(var i in o)if(e[i]!==o[i])try{s(e,i,o[i])}catch(t){e[i]=o[i]}}};for(var h in a)c(n[h]&&n[h].prototype,h);c(r,\"DOMTokenList\")}},t={};function i(n){var a=t[n];if(void 0!==a)return a.exports;var r=t[n]={exports:{}};return e[n].call(r.exports,r,r.exports,i),r.exports}i.d=function(e,t){for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.g=function(){if(\"object\"==typeof globalThis)return globalThis;try{return this||new Function(\"return this\")()}catch(e){if(\"object\"==typeof window)return window}}(),i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})};var n={};i.r(n),i.d(n,{CanvasProvider:function(){return R},CanvasRenderer:function(){return se},HTMLProvider:function(){return Ee},HTMLRenderer:function(){return Le},SVGProvider:function(){return ye},SVGRenderer:function(){return we}}),i(2675),i(9463),i(2259),i(5700),i(8706),i(2008),i(3792),i(4782),i(4743),i(1745),i(9572),i(2892),i(5428),i(4601),i(5843),i(3851),i(1278),i(9432),i(6099),i(8781),i(7764),i(1489),i(1630),i(2170),i(5044),i(9539),i(1694),i(9955),i(3206),i(4496),i(6651),i(2887),i(9369),i(6812),i(8995),i(1575),i(6072),i(8747),i(8845),i(9423),i(7301),i(373),i(6614),i(1405),i(3684),i(3500),i(2953),i(3771),i(3418),i(4423),i(2010),i(6033),i(5506),i(7495),i(1699),i(8156),i(5440);var a=new Map([[0,{bytes:2,alphabet:0}],[1,{bytes:1,alphabet:1}],[2,{bytes:1,alphabet:2}],[3,{bytes:1,alphabet:3}],[4,{bytes:1,alphabet:4}],[5,{bytes:1,alphabet:5}],[6,{bytes:1,alphabet:6}],[7,{bytes:1,alphabet:7}],[8,{bytes:1,alphabet:8}],[9,{bytes:1,alphabet:9}],[10,{bytes:1,alphabet:10}],[11,{bytes:1,alphabet:11}],[12,{bytes:2,alphabet:12}],[13,{bytes:2,alphabet:13}],[14,{bytes:2,alphabet:14}]]),r=new Map([[66,{bytes:2,alphabet:0}],[74,{bytes:1,alphabet:1}],[48,{bytes:1,alphabet:2}],[49,{bytes:1,alphabet:3}],[50,{bytes:1,alphabet:4}],[51,{bytes:1,alphabet:5}],[52,{bytes:1,alphabet:6}],[53,{bytes:1,alphabet:7}],[54,{bytes:1,alphabet:8}],[55,{bytes:1,alphabet:9}],[56,{bytes:1,alphabet:10}],[73,{bytes:1,alphabet:11}],[57,{bytes:2,alphabet:12}],[58,{bytes:2,alphabet:13}],[59,{bytes:2,alphabet:14}]]),o=new Map([[15,{bytes:2,alphabet:15}],[16,{bytes:1,alphabet:16}],[17,{bytes:1,alphabet:17}],[18,{bytes:1,alphabet:18}],[19,{bytes:1,alphabet:19}],[20,{bytes:1,alphabet:20}],[21,{bytes:1,alphabet:21}],[22,{bytes:1,alphabet:22}],[23,{bytes:1,alphabet:23}],[24,{bytes:1,alphabet:24}],[25,{bytes:1,alphabet:25}],[26,{bytes:1,alphabet:26}],[27,{bytes:1,alphabet:27}],[28,{bytes:1,alphabet:28}],[29,{bytes:1,alphabet:29}],[30,{bytes:1,alphabet:30}],[31,{bytes:1,alphabet:31}]]),s=new Map([[64,{bytes:2,alphabet:15}],[65,{bytes:1,alphabet:16}],[66,{bytes:1,alphabet:17}],[67,{bytes:1,alphabet:18}],[68,{bytes:1,alphabet:19}],[69,{bytes:1,alphabet:20}],[70,{bytes:1,alphabet:21}],[71,{bytes:1,alphabet:22}],[72,{bytes:1,alphabet:23}],[73,{bytes:1,alphabet:24}],[74,{bytes:1,alphabet:25}],[75,{bytes:1,alphabet:26}],[76,{bytes:1,alphabet:27}],[77,{bytes:1,alphabet:28}],[78,{bytes:1,alphabet:29}],[79,{bytes:1,alphabet:30}],[112,{bytes:1,alphabet:31}]]),l=[[\"#000000FF\",\"#FF0000FF\",\"#00FF00FF\",\"#FFFF00FF\",\"#0000FFFF\",\"#FF00FFFF\",\"#00FFFFFF\",\"#FFFFFFFF\",\"#00000000\",\"#AA0000FF\",\"#00AA00FF\",\"#AAAA00FF\",\"#0000AAFF\",\"#AA00AAFF\",\"#00AAAAFF\",\"#AAAAAAFF\"],[\"#000055FF\",\"#005500FF\",\"#005555FF\",\"#0055AAFF\",\"#0055FFFF\",\"#00AA55FF\",\"#00AAFFFF\",\"#00FF55FF\",\"#00FFAAFF\",\"#550000FF\",\"#550055FF\",\"#5500AAFF\",\"#5500FFFF\",\"#555500FF\",\"#555555FF\",\"#5555AAFF\"],[\"#5555FFFF\",\"#55AA00FF\",\"#55AA55FF\",\"#55AAAAFF\",\"#55AAFFFF\",\"#55FF00FF\",\"#55FF55FF\",\"#55FFAAFF\",\"#55FFFFFF\",\"#AA0055FF\",\"#AA00FFFF\",\"#AA5500FF\",\"#AA5555FF\",\"#AA55AAFF\",\"#AA55FFFF\",\"#AAAA55FF\"],[\"#AAAAFFFF\",\"#AAFF00FF\",\"#AAFF55FF\",\"#AAFFAAFF\",\"#AAFFFFFF\",\"#FF0055FF\",\"#FF00AAFF\",\"#FF5500FF\",\"#FF5555FF\",\"#FF55AAFF\",\"#FF55FFFF\",\"#FFAA00FF\",\"#FFAA55FF\",\"#FFAAAAFF\",\"#FFAAFFFF\",\"#FFFF55FF\"],[\"#FFFFAAFF\",\"#00000080\",\"#FF000080\",\"#00FF0080\",\"#FFFF0080\",\"#0000FF80\",\"#FF00FF80\",\"#00FFFF80\",\"#FFFFFF80\",\"#AA000080\",\"#00AA0080\",\"#AAAA0080\",\"#0000AA80\",\"#AA00AA80\",\"#00AAAA80\",\"#AAAAAA80\"],[\"#00005580\",\"#00550080\",\"#00555580\",\"#0055AA80\",\"#0055FF80\",\"#00AA5580\",\"#00AAFF80\",\"#00FF5580\",\"#00FFAA80\",\"#55000080\",\"#55005580\",\"#5500AA80\",\"#5500FF80\",\"#55550080\",\"#55555580\",\"#5555AA80\"],[\"#5555FF80\",\"#55AA0080\",\"#55AA5580\",\"#55AAAA80\",\"#55AAFF80\",\"#55FF0080\",\"#55FF5580\",\"#55FFAA80\",\"#55FFFF80\",\"#AA005580\",\"#AA00FF80\",\"#AA550080\",\"#AA555580\",\"#AA55AA80\",\"#AA55FF80\",\"#AAAA5580\"],[\"#AAAAFF80\",\"#AAFF0080\",\"#AAFF5580\",\"#AAFFAA80\",\"#AAFFFF80\",\"#FF005580\",\"#FF00AA80\",\"#FF550080\",\"#FF555580\",\"#FF55AA80\",\"#FF55FF80\",\"#FFAA0080\",\"#FFAA5580\",\"#FFAAAA80\",\"#FFAAFF80\",\"#FFFF5580\"]],d=[\"　\",\"、\",\"。\",\"，\",\"．\",\"・\",\"：\",\"；\",\"？\",\"！\",\"゛\",\"゜\",\"´\",\"｀\",\"¨\",\"＾\",\"￣\",\"＿\",\"ヽ\",\"ヾ\",\"ゝ\",\"ゞ\",\"〃\",\"仝\",\"々\",\"〆\",\"〇\",\"ー\",\"―\",\"‐\",\"／\",\"＼\",\"〜\",\"‖\",\"｜\",\"…\",\"‥\",\"‘\",\"’\",\"“\",\"”\",\"（\",\"）\",\"〔\",\"〕\",\"［\",\"］\",\"｛\",\"｝\",\"〈\",\"〉\",\"《\",\"》\",\"「\",\"」\",\"『\",\"』\",\"【\",\"】\",\"＋\",\"−\",\"±\",\"×\",\"÷\",\"＝\",\"≠\",\"＜\",\"＞\",\"≦\",\"≧\",\"∞\",\"∴\",\"♂\",\"♀\",\"°\",\"′\",\"″\",\"℃\",\"￥\",\"＄\",\"¢\",\"£\",\"％\",\"＃\",\"＆\",\"＊\",\"＠\",\"§\",\"☆\",\"★\",\"○\",\"●\",\"◎\",\"◇\",\"◆\",\"□\",\"■\",\"△\",\"▲\",\"▽\",\"▼\",\"※\",\"〒\",\"→\",\"←\",\"↑\",\"↓\",\"〓\",\"＇\",\"＂\",\"－\",\"～\",\"〳\",\"〴\",\"〵\",\"〻\",\"〼\",\"ヿ\",\"ゟ\",\"∈\",\"∋\",\"⊆\",\"⊇\",\"⊂\",\"⊃\",\"∪\",\"∩\",\"⊄\",\"⊅\",\"⊊\",\"⊋\",\"∉\",\"∅\",\"⌅\",\"⌆\",\"∧\",\"∨\",\"¬\",\"⇒\",\"⇔\",\"∀\",\"∃\",\"⊕\",\"⊖\",\"⊗\",\"∥\",\"∦\",\"⦅\",\"⦆\",\"〘\",\"〙\",\"〖\",\"〗\",\"∠\",\"⊥\",\"⌒\",\"∂\",\"∇\",\"≡\",\"≒\",\"≪\",\"≫\",\"√\",\"∽\",\"∝\",\"∵\",\"∫\",\"∬\",\"≢\",\"≃\",\"≅\",\"≈\",\"≶\",\"≷\",\"↔\",\"Å\",\"‰\",\"♯\",\"♭\",\"♪\",\"†\",\"‡\",\"¶\",\"♮\",\"♫\",\"♬\",\"♩\",\"◯\",\"▷\",\"▶\",\"◁\",\"◀\",\"↗\",\"↘\",\"↖\",\"↙\",\"⇄\",\"⇨\",\"⇦\",\"⇧\",\"⇩\",\"⤴\",\"⤵\",\"０\",\"１\",\"２\",\"３\",\"４\",\"５\",\"６\",\"７\",\"８\",\"９\",\"⦿\",\"◉\",\"〽\",\"﹆\",\"﹅\",\"◦\",\"•\",\"Ａ\",\"Ｂ\",\"Ｃ\",\"Ｄ\",\"Ｅ\",\"Ｆ\",\"Ｇ\",\"Ｈ\",\"Ｉ\",\"Ｊ\",\"Ｋ\",\"Ｌ\",\"Ｍ\",\"Ｎ\",\"Ｏ\",\"Ｐ\",\"Ｑ\",\"Ｒ\",\"Ｓ\",\"Ｔ\",\"Ｕ\",\"Ｖ\",\"Ｗ\",\"Ｘ\",\"Ｙ\",\"Ｚ\",\"∓\",\"ℵ\",\"ℏ\",\"㏋\",\"ℓ\",\"℧\",\"ａ\",\"ｂ\",\"ｃ\",\"ｄ\",\"ｅ\",\"ｆ\",\"ｇ\",\"ｈ\",\"ｉ\",\"ｊ\",\"ｋ\",\"ｌ\",\"ｍ\",\"ｎ\",\"ｏ\",\"ｐ\",\"ｑ\",\"ｒ\",\"ｓ\",\"ｔ\",\"ｕ\",\"ｖ\",\"ｗ\",\"ｘ\",\"ｙ\",\"ｚ\",\"゠\",\"–\",\"⧺\",\"⧻\",\"ぁ\",\"あ\",\"ぃ\",\"い\",\"ぅ\",\"う\",\"ぇ\",\"え\",\"ぉ\",\"お\",\"か\",\"が\",\"き\",\"ぎ\",\"く\",\"ぐ\",\"け\",\"げ\",\"こ\",\"ご\",\"さ\",\"ざ\",\"し\",\"じ\",\"す\",\"ず\",\"せ\",\"ぜ\",\"そ\",\"ぞ\",\"た\",\"だ\",\"ち\",\"ぢ\",\"っ\",\"つ\",\"づ\",\"て\",\"で\",\"と\",\"ど\",\"な\",\"に\",\"ぬ\",\"ね\",\"の\",\"は\",\"ば\",\"ぱ\",\"ひ\",\"び\",\"ぴ\",\"ふ\",\"ぶ\",\"ぷ\",\"へ\",\"べ\",\"ぺ\",\"ほ\",\"ぼ\",\"ぽ\",\"ま\",\"み\",\"む\",\"め\",\"も\",\"ゃ\",\"や\",\"ゅ\",\"ゆ\",\"ょ\",\"よ\",\"ら\",\"り\",\"る\",\"れ\",\"ろ\",\"ゎ\",\"わ\",\"ゐ\",\"ゑ\",\"を\",\"ん\",\"ゔ\",\"ゕ\",\"ゖ\",\"か゚\",\"き゚\",\"く゚\",\"け゚\",\"こ゚\",\"\",\"\",\"\",\"ァ\",\"ア\",\"ィ\",\"イ\",\"ゥ\",\"ウ\",\"ェ\",\"エ\",\"ォ\",\"オ\",\"カ\",\"ガ\",\"キ\",\"ギ\",\"ク\",\"グ\",\"ケ\",\"ゲ\",\"コ\",\"ゴ\",\"サ\",\"ザ\",\"シ\",\"ジ\",\"ス\",\"ズ\",\"セ\",\"ゼ\",\"ソ\",\"ゾ\",\"タ\",\"ダ\",\"チ\",\"ヂ\",\"ッ\",\"ツ\",\"ヅ\",\"テ\",\"デ\",\"ト\",\"ド\",\"ナ\",\"ニ\",\"ヌ\",\"ネ\",\"ノ\",\"ハ\",\"バ\",\"パ\",\"ヒ\",\"ビ\",\"ピ\",\"フ\",\"ブ\",\"プ\",\"ヘ\",\"ベ\",\"ペ\",\"ホ\",\"ボ\",\"ポ\",\"マ\",\"ミ\",\"ム\",\"メ\",\"モ\",\"ャ\",\"ヤ\",\"ュ\",\"ユ\",\"ョ\",\"ヨ\",\"ラ\",\"リ\",\"ル\",\"レ\",\"ロ\",\"ヮ\",\"ワ\",\"ヰ\",\"ヱ\",\"ヲ\",\"ン\",\"ヴ\",\"ヵ\",\"ヶ\",\"カ゚\",\"キ゚\",\"ク゚\",\"ケ゚\",\"コ゚\",\"セ゚\",\"ツ゚\",\"ト゚\",\"Α\",\"Β\",\"Γ\",\"Δ\",\"Ε\",\"Ζ\",\"Η\",\"Θ\",\"Ι\",\"Κ\",\"Λ\",\"Μ\",\"Ν\",\"Ξ\",\"Ο\",\"Π\",\"Ρ\",\"Σ\",\"Τ\",\"Υ\",\"Φ\",\"Χ\",\"Ψ\",\"Ω\",\"♤\",\"♠\",\"♢\",\"♦\",\"♡\",\"♥\",\"♧\",\"♣\",\"α\",\"β\",\"γ\",\"δ\",\"ε\",\"ζ\",\"η\",\"θ\",\"ι\",\"κ\",\"λ\",\"μ\",\"ν\",\"ξ\",\"ο\",\"π\",\"ρ\",\"σ\",\"τ\",\"υ\",\"φ\",\"χ\",\"ψ\",\"ω\",\"ς\",\"⓵\",\"⓶\",\"⓷\",\"⓸\",\"⓹\",\"⓺\",\"⓻\",\"⓼\",\"⓽\",\"⓾\",\"☖\",\"☗\",\"〠\",\"☎\",\"☀\",\"☁\",\"☂\",\"☃\",\"♨\",\"▱\",\"ㇰ\",\"ㇱ\",\"ㇲ\",\"ㇳ\",\"ㇴ\",\"ㇵ\",\"ㇶ\",\"ㇷ\",\"ㇸ\",\"ㇹ\",\"ㇷ゚\",\"ㇺ\",\"ㇻ\",\"ㇼ\",\"ㇽ\",\"ㇾ\",\"ㇿ\",\"А\",\"Б\",\"В\",\"Г\",\"Д\",\"Е\",\"Ё\",\"Ж\",\"З\",\"И\",\"Й\",\"К\",\"Л\",\"М\",\"Н\",\"О\",\"П\",\"Р\",\"С\",\"Т\",\"У\",\"Ф\",\"Х\",\"Ц\",\"Ч\",\"Ш\",\"Щ\",\"Ъ\",\"Ы\",\"Ь\",\"Э\",\"Ю\",\"Я\",\"⎾\",\"⎿\",\"⏀\",\"⏁\",\"⏂\",\"⏃\",\"⏄\",\"⏅\",\"⏆\",\"⏇\",\"⏈\",\"⏉\",\"⏊\",\"⏋\",\"⏌\",\"а\",\"б\",\"в\",\"г\",\"д\",\"е\",\"ё\",\"ж\",\"з\",\"и\",\"й\",\"к\",\"л\",\"м\",\"н\",\"о\",\"п\",\"р\",\"с\",\"т\",\"у\",\"ф\",\"х\",\"ц\",\"ч\",\"ш\",\"щ\",\"ъ\",\"ы\",\"ь\",\"э\",\"ю\",\"я\",\"ヷ\",\"ヸ\",\"ヹ\",\"ヺ\",\"⋚\",\"⋛\",\"⅓\",\"⅔\",\"⅕\",\"✓\",\"⌘\",\"␣\",\"⏎\",\"─\",\"│\",\"┌\",\"┐\",\"┘\",\"└\",\"├\",\"┬\",\"┤\",\"┴\",\"┼\",\"━\",\"┃\",\"┏\",\"┓\",\"┛\",\"┗\",\"┣\",\"┳\",\"┫\",\"┻\",\"╋\",\"┠\",\"┯\",\"┨\",\"┷\",\"┿\",\"┝\",\"┰\",\"┥\",\"┸\",\"╂\",\"㉑\",\"㉒\",\"㉓\",\"㉔\",\"㉕\",\"㉖\",\"㉗\",\"㉘\",\"㉙\",\"㉚\",\"㉛\",\"㉜\",\"㉝\",\"㉞\",\"㉟\",\"㊱\",\"㊲\",\"㊳\",\"㊴\",\"㊵\",\"㊶\",\"㊷\",\"㊸\",\"㊹\",\"㊺\",\"㊻\",\"㊼\",\"㊽\",\"㊾\",\"㊿\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"◐\",\"◑\",\"◒\",\"◓\",\"‼\",\"⁇\",\"⁈\",\"⁉\",\"Ǎ\",\"ǎ\",\"ǐ\",\"Ḿ\",\"ḿ\",\"Ǹ\",\"ǹ\",\"Ǒ\",\"ǒ\",\"ǔ\",\"ǖ\",\"ǘ\",\"ǚ\",\"ǜ\",\"\",\"\",\"€\",\" \",\"¡\",\"¤\",\"¦\",\"©\",\"ª\",\"«\",\"­\",\"®\",\"¯\",\"²\",\"³\",\"·\",\"¸\",\"¹\",\"º\",\"»\",\"¼\",\"½\",\"¾\",\"¿\",\"À\",\"Á\",\"Â\",\"Ã\",\"Ä\",\"Å\",\"Æ\",\"Ç\",\"È\",\"É\",\"Ê\",\"Ë\",\"Ì\",\"Í\",\"Î\",\"Ï\",\"Ð\",\"Ñ\",\"Ò\",\"Ó\",\"Ô\",\"Õ\",\"Ö\",\"Ø\",\"Ù\",\"Ú\",\"Û\",\"Ü\",\"Ý\",\"Þ\",\"ß\",\"à\",\"á\",\"â\",\"ã\",\"ä\",\"å\",\"æ\",\"ç\",\"è\",\"é\",\"ê\",\"ë\",\"ì\",\"í\",\"î\",\"ï\",\"ð\",\"ñ\",\"ò\",\"ó\",\"ô\",\"õ\",\"ö\",\"ø\",\"ù\",\"ú\",\"û\",\"ü\",\"ý\",\"þ\",\"ÿ\",\"Ā\",\"Ī\",\"Ū\",\"Ē\",\"Ō\",\"ā\",\"ī\",\"ū\",\"ē\",\"ō\",\"Ą\",\"˘\",\"Ł\",\"Ľ\",\"Ś\",\"Š\",\"Ş\",\"Ť\",\"Ź\",\"Ž\",\"Ż\",\"ą\",\"˛\",\"ł\",\"ľ\",\"ś\",\"ˇ\",\"š\",\"ş\",\"ť\",\"ź\",\"˝\",\"ž\",\"ż\",\"Ŕ\",\"Ă\",\"Ĺ\",\"Ć\",\"Č\",\"Ę\",\"Ě\",\"Ď\",\"Ń\",\"Ň\",\"Ő\",\"Ř\",\"Ů\",\"Ű\",\"Ţ\",\"ŕ\",\"ă\",\"ĺ\",\"ć\",\"č\",\"ę\",\"ě\",\"ď\",\"đ\",\"ń\",\"ň\",\"ő\",\"ř\",\"ů\",\"ű\",\"ţ\",\"˙\",\"Ĉ\",\"Ĝ\",\"Ĥ\",\"Ĵ\",\"Ŝ\",\"Ŭ\",\"ĉ\",\"ĝ\",\"ĥ\",\"ĵ\",\"ŝ\",\"ŭ\",\"ɱ\",\"ʋ\",\"ɾ\",\"ʃ\",\"ʒ\",\"ɬ\",\"ɮ\",\"ɹ\",\"ʈ\",\"ɖ\",\"ɳ\",\"ɽ\",\"ʂ\",\"ʐ\",\"ɻ\",\"ɭ\",\"ɟ\",\"ɲ\",\"ʝ\",\"ʎ\",\"ɡ\",\"ŋ\",\"ɰ\",\"ʁ\",\"ħ\",\"ʕ\",\"ʔ\",\"ɦ\",\"ʘ\",\"ǂ\",\"ɓ\",\"ɗ\",\"ʄ\",\"ɠ\",\"Ɠ\",\"œ\",\"Œ\",\"ɨ\",\"ʉ\",\"ɘ\",\"ɵ\",\"ə\",\"ɜ\",\"ɞ\",\"ɐ\",\"ɯ\",\"ʊ\",\"ɤ\",\"ʌ\",\"ɔ\",\"ɑ\",\"ɒ\",\"ʍ\",\"ɥ\",\"ʢ\",\"ʡ\",\"ɕ\",\"ʑ\",\"ɺ\",\"ɧ\",\"ɚ\",\"æ̀\",\"ǽ\",\"ὰ\",\"ά\",\"ɔ̀\",\"ɔ́\",\"ʌ̀\",\"ʌ́\",\"ə̀\",\"ə́\",\"ɚ̀\",\"ɚ́\",\"ὲ\",\"έ\",\"͡\",\"ˈ\",\"ˌ\",\"ː\",\"ˑ\",\"̆\",\"‿\",\"̋\",\"́\",\"̄\",\"̀\",\"̏\",\"̌\",\"̂\",\"˥\",\"˦\",\"˧\",\"˨\",\"˩\",\"˩˥\",\"˥˩\",\"̥\",\"̬\",\"̹\",\"̜\",\"̟\",\"̠\",\"̈\",\"̽\",\"̩\",\"̯\",\"˞\",\"̤\",\"̰\",\"̼\",\"̴\",\"̝\",\"̞\",\"̘\",\"̙\",\"̪\",\"̺\",\"̻\",\"̃\",\"̚\",\"❶\",\"❷\",\"❸\",\"❹\",\"❺\",\"❻\",\"❼\",\"❽\",\"❾\",\"❿\",\"⓫\",\"⓬\",\"⓭\",\"⓮\",\"⓯\",\"⓰\",\"⓱\",\"⓲\",\"⓳\",\"⓴\",\"ⅰ\",\"ⅱ\",\"ⅲ\",\"ⅳ\",\"ⅴ\",\"ⅵ\",\"ⅶ\",\"ⅷ\",\"ⅸ\",\"ⅹ\",\"ⅺ\",\"ⅻ\",\"ⓐ\",\"ⓑ\",\"ⓒ\",\"ⓓ\",\"ⓔ\",\"ⓕ\",\"ⓖ\",\"ⓗ\",\"ⓘ\",\"ⓙ\",\"ⓚ\",\"ⓛ\",\"ⓜ\",\"ⓝ\",\"ⓞ\",\"ⓟ\",\"ⓠ\",\"ⓡ\",\"ⓢ\",\"ⓣ\",\"ⓤ\",\"ⓥ\",\"ⓦ\",\"ⓧ\",\"ⓨ\",\"ⓩ\",\"㋐\",\"㋑\",\"㋒\",\"㋓\",\"㋔\",\"㋕\",\"㋖\",\"㋗\",\"㋘\",\"㋙\",\"㋚\",\"㋛\",\"㋜\",\"㋝\",\"㋞\",\"㋟\",\"㋠\",\"㋡\",\"㋢\",\"㋣\",\"㋺\",\"㋩\",\"㋥\",\"㋭\",\"㋬\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"⁑\",\"⁂\",\"①\",\"②\",\"③\",\"④\",\"⑤\",\"⑥\",\"⑦\",\"⑧\",\"⑨\",\"⑩\",\"⑪\",\"⑫\",\"⑬\",\"⑭\",\"⑮\",\"⑯\",\"⑰\",\"⑱\",\"⑲\",\"⑳\",\"Ⅰ\",\"Ⅱ\",\"Ⅲ\",\"Ⅳ\",\"Ⅴ\",\"Ⅵ\",\"Ⅶ\",\"Ⅷ\",\"Ⅸ\",\"Ⅹ\",\"Ⅺ\",\"㍉\",\"㌔\",\"㌢\",\"㍍\",\"㌘\",\"㌧\",\"㌃\",\"㌶\",\"㍑\",\"㍗\",\"㌍\",\"㌦\",\"㌣\",\"㌫\",\"㍊\",\"㌻\",\"㎜\",\"㎝\",\"㎞\",\"㎎\",\"㎏\",\"㏄\",\"㎡\",\"Ⅻ\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"㍻\",\"〝\",\"〟\",\"№\",\"㏍\",\"℡\",\"㊤\",\"㊥\",\"㊦\",\"㊧\",\"㊨\",\"㈱\",\"㈲\",\"㈹\",\"㍾\",\"㍽\",\"㍼\",\"\",\"\",\"\",\"∮\",\"\",\"\",\"\",\"\",\"∟\",\"⊿\",\"\",\"\",\"\",\"❖\",\"☞\",\"俱\",\"𠀋\",\"㐂\",\"丨\",\"丯\",\"丰\",\"亍\",\"仡\",\"份\",\"仿\",\"伃\",\"伋\",\"你\",\"佈\",\"佉\",\"佖\",\"佟\",\"佪\",\"佬\",\"佾\",\"侊\",\"侔\",\"侗\",\"侮\",\"俉\",\"俠\",\"倁\",\"倂\",\"倎\",\"倘\",\"倧\",\"倮\",\"偀\",\"倻\",\"偁\",\"傔\",\"僌\",\"僲\",\"僐\",\"僦\",\"僧\",\"儆\",\"儃\",\"儋\",\"儞\",\"儵\",\"兊\",\"免\",\"兕\",\"兗\",\"㒵\",\"冝\",\"凃\",\"凊\",\"凞\",\"凢\",\"凮\",\"刁\",\"㓛\",\"刓\",\"刕\",\"剉\",\"剗\",\"剡\",\"劓\",\"勈\",\"勉\",\"勌\",\"勐\",\"勖\",\"勛\",\"勤\",\"勰\",\"勻\",\"匀\",\"匇\",\"匜\",\"卑\",\"卡\",\"卣\",\"卽\",\"厓\",\"厝\",\"厲\",\"吒\",\"吧\",\"呍\",\"咜\",\"呫\",\"呴\",\"呿\",\"咈\",\"咖\",\"咡\",\"咩\",\"哆\",\"哿\",\"唎\",\"唫\",\"唵\",\"啐\",\"啞\",\"喁\",\"喆\",\"喎\",\"喝\",\"喭\",\"嗎\",\"嘆\",\"嘈\",\"嘎\",\"嘻\",\"噉\",\"噶\",\"噦\",\"器\",\"噯\",\"噱\",\"噲\",\"嚙\",\"嚞\",\"嚩\",\"嚬\",\"嚳\",\"囉\",\"囊\",\"圊\",\"𡈽\",\"圡\",\"圯\",\"圳\",\"圴\",\"坰\",\"坷\",\"坼\",\"垜\",\"﨏\",\"𡌛\",\"垸\",\"埇\",\"埈\",\"埏\",\"埤\",\"埭\",\"埵\",\"埶\",\"埿\",\"堉\",\"塚\",\"塡\",\"塤\",\"塀\",\"塼\",\"墉\",\"增\",\"墨\",\"墩\",\"𡑮\",\"壒\",\"壎\",\"壔\",\"壚\",\"壠\",\"壩\",\"夌\",\"虁\",\"奝\",\"奭\",\"妋\",\"妒\",\"妤\",\"姃\",\"姒\",\"姝\",\"娓\",\"娣\",\"婧\",\"婭\",\"婷\",\"婾\",\"媄\",\"媞\",\"媧\",\"嫄\",\"𡢽\",\"嬙\",\"嬥\",\"剝\",\"亜\",\"唖\",\"娃\",\"阿\",\"哀\",\"愛\",\"挨\",\"姶\",\"逢\",\"葵\",\"茜\",\"穐\",\"悪\",\"握\",\"渥\",\"旭\",\"葦\",\"芦\",\"鯵\",\"梓\",\"圧\",\"斡\",\"扱\",\"宛\",\"姐\",\"虻\",\"飴\",\"絢\",\"綾\",\"鮎\",\"或\",\"粟\",\"袷\",\"安\",\"庵\",\"按\",\"暗\",\"案\",\"闇\",\"鞍\",\"杏\",\"以\",\"伊\",\"位\",\"依\",\"偉\",\"囲\",\"夷\",\"委\",\"威\",\"尉\",\"惟\",\"意\",\"慰\",\"易\",\"椅\",\"為\",\"畏\",\"異\",\"移\",\"維\",\"緯\",\"胃\",\"萎\",\"衣\",\"謂\",\"違\",\"遺\",\"医\",\"井\",\"亥\",\"域\",\"育\",\"郁\",\"磯\",\"一\",\"壱\",\"溢\",\"逸\",\"稲\",\"茨\",\"芋\",\"鰯\",\"允\",\"印\",\"咽\",\"員\",\"因\",\"姻\",\"引\",\"飲\",\"淫\",\"胤\",\"蔭\",\"院\",\"陰\",\"隠\",\"韻\",\"吋\",\"右\",\"宇\",\"烏\",\"羽\",\"迂\",\"雨\",\"卯\",\"鵜\",\"窺\",\"丑\",\"碓\",\"臼\",\"渦\",\"嘘\",\"唄\",\"欝\",\"蔚\",\"鰻\",\"姥\",\"厩\",\"浦\",\"瓜\",\"閏\",\"噂\",\"云\",\"運\",\"雲\",\"荏\",\"餌\",\"叡\",\"営\",\"嬰\",\"影\",\"映\",\"曳\",\"栄\",\"永\",\"泳\",\"洩\",\"瑛\",\"盈\",\"穎\",\"頴\",\"英\",\"衛\",\"詠\",\"鋭\",\"液\",\"疫\",\"益\",\"駅\",\"悦\",\"謁\",\"越\",\"閲\",\"榎\",\"厭\",\"円\",\"園\",\"堰\",\"奄\",\"宴\",\"延\",\"怨\",\"掩\",\"援\",\"沿\",\"演\",\"炎\",\"焔\",\"煙\",\"燕\",\"猿\",\"縁\",\"艶\",\"苑\",\"薗\",\"遠\",\"鉛\",\"鴛\",\"塩\",\"於\",\"汚\",\"甥\",\"凹\",\"央\",\"奥\",\"往\",\"応\",\"押\",\"旺\",\"横\",\"欧\",\"殴\",\"王\",\"翁\",\"襖\",\"鴬\",\"鴎\",\"黄\",\"岡\",\"沖\",\"荻\",\"億\",\"屋\",\"憶\",\"臆\",\"桶\",\"牡\",\"乙\",\"俺\",\"卸\",\"恩\",\"温\",\"穏\",\"音\",\"下\",\"化\",\"仮\",\"何\",\"伽\",\"価\",\"佳\",\"加\",\"可\",\"嘉\",\"夏\",\"嫁\",\"家\",\"寡\",\"科\",\"暇\",\"果\",\"架\",\"歌\",\"河\",\"火\",\"珂\",\"禍\",\"禾\",\"稼\",\"箇\",\"花\",\"苛\",\"茄\",\"荷\",\"華\",\"菓\",\"蝦\",\"課\",\"嘩\",\"貨\",\"迦\",\"過\",\"霞\",\"蚊\",\"俄\",\"峨\",\"我\",\"牙\",\"画\",\"臥\",\"芽\",\"蛾\",\"賀\",\"雅\",\"餓\",\"駕\",\"介\",\"会\",\"解\",\"回\",\"塊\",\"壊\",\"廻\",\"快\",\"怪\",\"悔\",\"恢\",\"懐\",\"戒\",\"拐\",\"改\",\"魁\",\"晦\",\"械\",\"海\",\"灰\",\"界\",\"皆\",\"絵\",\"芥\",\"蟹\",\"開\",\"階\",\"貝\",\"凱\",\"劾\",\"外\",\"咳\",\"害\",\"崖\",\"慨\",\"概\",\"涯\",\"碍\",\"蓋\",\"街\",\"該\",\"鎧\",\"骸\",\"浬\",\"馨\",\"蛙\",\"垣\",\"柿\",\"蛎\",\"鈎\",\"劃\",\"嚇\",\"各\",\"廓\",\"拡\",\"撹\",\"格\",\"核\",\"殻\",\"獲\",\"確\",\"穫\",\"覚\",\"角\",\"赫\",\"較\",\"郭\",\"閣\",\"隔\",\"革\",\"学\",\"岳\",\"楽\",\"額\",\"顎\",\"掛\",\"笠\",\"樫\",\"橿\",\"梶\",\"鰍\",\"潟\",\"割\",\"喝\",\"恰\",\"括\",\"活\",\"渇\",\"滑\",\"葛\",\"褐\",\"轄\",\"且\",\"鰹\",\"叶\",\"椛\",\"樺\",\"鞄\",\"株\",\"兜\",\"竃\",\"蒲\",\"釜\",\"鎌\",\"噛\",\"鴨\",\"栢\",\"茅\",\"萱\",\"粥\",\"刈\",\"苅\",\"瓦\",\"乾\",\"侃\",\"冠\",\"寒\",\"刊\",\"勘\",\"勧\",\"巻\",\"喚\",\"堪\",\"姦\",\"完\",\"官\",\"寛\",\"干\",\"幹\",\"患\",\"感\",\"慣\",\"憾\",\"換\",\"敢\",\"柑\",\"桓\",\"棺\",\"款\",\"歓\",\"汗\",\"漢\",\"澗\",\"潅\",\"環\",\"甘\",\"監\",\"看\",\"竿\",\"管\",\"簡\",\"緩\",\"缶\",\"翰\",\"肝\",\"艦\",\"莞\",\"観\",\"諌\",\"貫\",\"還\",\"鑑\",\"間\",\"閑\",\"関\",\"陥\",\"韓\",\"館\",\"舘\",\"丸\",\"含\",\"岸\",\"巌\",\"玩\",\"癌\",\"眼\",\"岩\",\"翫\",\"贋\",\"雁\",\"頑\",\"顔\",\"願\",\"企\",\"伎\",\"危\",\"喜\",\"器\",\"基\",\"奇\",\"嬉\",\"寄\",\"岐\",\"希\",\"幾\",\"忌\",\"揮\",\"机\",\"旗\",\"既\",\"期\",\"棋\",\"棄\",\"機\",\"帰\",\"毅\",\"気\",\"汽\",\"畿\",\"祈\",\"季\",\"稀\",\"紀\",\"徽\",\"規\",\"記\",\"貴\",\"起\",\"軌\",\"輝\",\"飢\",\"騎\",\"鬼\",\"亀\",\"偽\",\"儀\",\"妓\",\"宜\",\"戯\",\"技\",\"擬\",\"欺\",\"犠\",\"疑\",\"祇\",\"義\",\"蟻\",\"誼\",\"議\",\"掬\",\"菊\",\"鞠\",\"吉\",\"吃\",\"喫\",\"桔\",\"橘\",\"詰\",\"砧\",\"杵\",\"黍\",\"却\",\"客\",\"脚\",\"虐\",\"逆\",\"丘\",\"久\",\"仇\",\"休\",\"及\",\"吸\",\"宮\",\"弓\",\"急\",\"救\",\"朽\",\"求\",\"汲\",\"泣\",\"灸\",\"球\",\"究\",\"窮\",\"笈\",\"級\",\"糾\",\"給\",\"旧\",\"牛\",\"去\",\"居\",\"巨\",\"拒\",\"拠\",\"挙\",\"渠\",\"虚\",\"許\",\"距\",\"鋸\",\"漁\",\"禦\",\"魚\",\"亨\",\"享\",\"京\",\"供\",\"侠\",\"僑\",\"兇\",\"競\",\"共\",\"凶\",\"協\",\"匡\",\"卿\",\"叫\",\"喬\",\"境\",\"峡\",\"強\",\"彊\",\"怯\",\"恐\",\"恭\",\"挟\",\"教\",\"橋\",\"況\",\"狂\",\"狭\",\"矯\",\"胸\",\"脅\",\"興\",\"蕎\",\"郷\",\"鏡\",\"響\",\"饗\",\"驚\",\"仰\",\"凝\",\"尭\",\"暁\",\"業\",\"局\",\"曲\",\"極\",\"玉\",\"桐\",\"粁\",\"僅\",\"勤\",\"均\",\"巾\",\"錦\",\"斤\",\"欣\",\"欽\",\"琴\",\"禁\",\"禽\",\"筋\",\"緊\",\"芹\",\"菌\",\"衿\",\"襟\",\"謹\",\"近\",\"金\",\"吟\",\"銀\",\"九\",\"倶\",\"句\",\"区\",\"狗\",\"玖\",\"矩\",\"苦\",\"躯\",\"駆\",\"駈\",\"駒\",\"具\",\"愚\",\"虞\",\"喰\",\"空\",\"偶\",\"寓\",\"遇\",\"隅\",\"串\",\"櫛\",\"釧\",\"屑\",\"屈\",\"掘\",\"窟\",\"沓\",\"靴\",\"轡\",\"窪\",\"熊\",\"隈\",\"粂\",\"栗\",\"繰\",\"桑\",\"鍬\",\"勲\",\"君\",\"薫\",\"訓\",\"群\",\"軍\",\"郡\",\"卦\",\"袈\",\"祁\",\"係\",\"傾\",\"刑\",\"兄\",\"啓\",\"圭\",\"珪\",\"型\",\"契\",\"形\",\"径\",\"恵\",\"慶\",\"慧\",\"憩\",\"掲\",\"携\",\"敬\",\"景\",\"桂\",\"渓\",\"畦\",\"稽\",\"系\",\"経\",\"継\",\"繋\",\"罫\",\"茎\",\"荊\",\"蛍\",\"計\",\"詣\",\"警\",\"軽\",\"頚\",\"鶏\",\"芸\",\"迎\",\"鯨\",\"劇\",\"戟\",\"撃\",\"激\",\"隙\",\"桁\",\"傑\",\"欠\",\"決\",\"潔\",\"穴\",\"結\",\"血\",\"訣\",\"月\",\"件\",\"倹\",\"倦\",\"健\",\"兼\",\"券\",\"剣\",\"喧\",\"圏\",\"堅\",\"嫌\",\"建\",\"憲\",\"懸\",\"拳\",\"捲\",\"検\",\"権\",\"牽\",\"犬\",\"献\",\"研\",\"硯\",\"絹\",\"県\",\"肩\",\"見\",\"謙\",\"賢\",\"軒\",\"遣\",\"鍵\",\"険\",\"顕\",\"験\",\"鹸\",\"元\",\"原\",\"厳\",\"幻\",\"弦\",\"減\",\"源\",\"玄\",\"現\",\"絃\",\"舷\",\"言\",\"諺\",\"限\",\"乎\",\"個\",\"古\",\"呼\",\"固\",\"姑\",\"孤\",\"己\",\"庫\",\"弧\",\"戸\",\"故\",\"枯\",\"湖\",\"狐\",\"糊\",\"袴\",\"股\",\"胡\",\"菰\",\"虎\",\"誇\",\"跨\",\"鈷\",\"雇\",\"顧\",\"鼓\",\"五\",\"互\",\"伍\",\"午\",\"呉\",\"吾\",\"娯\",\"後\",\"御\",\"悟\",\"梧\",\"檎\",\"瑚\",\"碁\",\"語\",\"誤\",\"護\",\"醐\",\"乞\",\"鯉\",\"交\",\"佼\",\"侯\",\"候\",\"倖\",\"光\",\"公\",\"功\",\"効\",\"勾\",\"厚\",\"口\",\"向\",\"后\",\"喉\",\"坑\",\"垢\",\"好\",\"孔\",\"孝\",\"宏\",\"工\",\"巧\",\"巷\",\"幸\",\"広\",\"庚\",\"康\",\"弘\",\"恒\",\"慌\",\"抗\",\"拘\",\"控\",\"攻\",\"昂\",\"晃\",\"更\",\"杭\",\"校\",\"梗\",\"構\",\"江\",\"洪\",\"浩\",\"港\",\"溝\",\"甲\",\"皇\",\"硬\",\"稿\",\"糠\",\"紅\",\"紘\",\"絞\",\"綱\",\"耕\",\"考\",\"肯\",\"肱\",\"腔\",\"膏\",\"航\",\"荒\",\"行\",\"衡\",\"講\",\"貢\",\"購\",\"郊\",\"酵\",\"鉱\",\"砿\",\"鋼\",\"閤\",\"降\",\"項\",\"香\",\"高\",\"鴻\",\"剛\",\"劫\",\"号\",\"合\",\"壕\",\"拷\",\"濠\",\"豪\",\"轟\",\"麹\",\"克\",\"刻\",\"告\",\"国\",\"穀\",\"酷\",\"鵠\",\"黒\",\"獄\",\"漉\",\"腰\",\"甑\",\"忽\",\"惚\",\"骨\",\"狛\",\"込\",\"此\",\"頃\",\"今\",\"困\",\"坤\",\"墾\",\"婚\",\"恨\",\"懇\",\"昏\",\"昆\",\"根\",\"梱\",\"混\",\"痕\",\"紺\",\"艮\",\"魂\",\"些\",\"佐\",\"叉\",\"唆\",\"嵯\",\"左\",\"差\",\"査\",\"沙\",\"瑳\",\"砂\",\"詐\",\"鎖\",\"裟\",\"坐\",\"座\",\"挫\",\"債\",\"催\",\"再\",\"最\",\"哉\",\"塞\",\"妻\",\"宰\",\"彩\",\"才\",\"採\",\"栽\",\"歳\",\"済\",\"災\",\"采\",\"犀\",\"砕\",\"砦\",\"祭\",\"斎\",\"細\",\"菜\",\"裁\",\"載\",\"際\",\"剤\",\"在\",\"材\",\"罪\",\"財\",\"冴\",\"坂\",\"阪\",\"堺\",\"榊\",\"肴\",\"咲\",\"崎\",\"埼\",\"碕\",\"鷺\",\"作\",\"削\",\"咋\",\"搾\",\"昨\",\"朔\",\"柵\",\"窄\",\"策\",\"索\",\"錯\",\"桜\",\"鮭\",\"笹\",\"匙\",\"冊\",\"刷\",\"察\",\"拶\",\"撮\",\"擦\",\"札\",\"殺\",\"薩\",\"雑\",\"皐\",\"鯖\",\"捌\",\"錆\",\"鮫\",\"皿\",\"晒\",\"三\",\"傘\",\"参\",\"山\",\"惨\",\"撒\",\"散\",\"桟\",\"燦\",\"珊\",\"産\",\"算\",\"纂\",\"蚕\",\"讃\",\"賛\",\"酸\",\"餐\",\"斬\",\"暫\",\"残\",\"仕\",\"仔\",\"伺\",\"使\",\"刺\",\"司\",\"史\",\"嗣\",\"四\",\"士\",\"始\",\"姉\",\"姿\",\"子\",\"屍\",\"市\",\"師\",\"志\",\"思\",\"指\",\"支\",\"孜\",\"斯\",\"施\",\"旨\",\"枝\",\"止\",\"死\",\"氏\",\"獅\",\"祉\",\"私\",\"糸\",\"紙\",\"紫\",\"肢\",\"脂\",\"至\",\"視\",\"詞\",\"詩\",\"試\",\"誌\",\"諮\",\"資\",\"賜\",\"雌\",\"飼\",\"歯\",\"事\",\"似\",\"侍\",\"児\",\"字\",\"寺\",\"慈\",\"持\",\"時\",\"次\",\"滋\",\"治\",\"爾\",\"璽\",\"痔\",\"磁\",\"示\",\"而\",\"耳\",\"自\",\"蒔\",\"辞\",\"汐\",\"鹿\",\"式\",\"識\",\"鴫\",\"竺\",\"軸\",\"宍\",\"雫\",\"七\",\"叱\",\"執\",\"失\",\"嫉\",\"室\",\"悉\",\"湿\",\"漆\",\"疾\",\"質\",\"実\",\"蔀\",\"篠\",\"偲\",\"柴\",\"芝\",\"屡\",\"蕊\",\"縞\",\"舎\",\"写\",\"射\",\"捨\",\"赦\",\"斜\",\"煮\",\"社\",\"紗\",\"者\",\"謝\",\"車\",\"遮\",\"蛇\",\"邪\",\"借\",\"勺\",\"尺\",\"杓\",\"灼\",\"爵\",\"酌\",\"釈\",\"錫\",\"若\",\"寂\",\"弱\",\"惹\",\"主\",\"取\",\"守\",\"手\",\"朱\",\"殊\",\"狩\",\"珠\",\"種\",\"腫\",\"趣\",\"酒\",\"首\",\"儒\",\"受\",\"呪\",\"寿\",\"授\",\"樹\",\"綬\",\"需\",\"囚\",\"収\",\"周\",\"宗\",\"就\",\"州\",\"修\",\"愁\",\"拾\",\"洲\",\"秀\",\"秋\",\"終\",\"繍\",\"習\",\"臭\",\"舟\",\"蒐\",\"衆\",\"襲\",\"讐\",\"蹴\",\"輯\",\"週\",\"酋\",\"酬\",\"集\",\"醜\",\"什\",\"住\",\"充\",\"十\",\"従\",\"戎\",\"柔\",\"汁\",\"渋\",\"獣\",\"縦\",\"重\",\"銃\",\"叔\",\"夙\",\"宿\",\"淑\",\"祝\",\"縮\",\"粛\",\"塾\",\"熟\",\"出\",\"術\",\"述\",\"俊\",\"峻\",\"春\",\"瞬\",\"竣\",\"舜\",\"駿\",\"准\",\"循\",\"旬\",\"楯\",\"殉\",\"淳\",\"準\",\"潤\",\"盾\",\"純\",\"巡\",\"遵\",\"醇\",\"順\",\"処\",\"初\",\"所\",\"暑\",\"曙\",\"渚\",\"庶\",\"緒\",\"署\",\"書\",\"薯\",\"藷\",\"諸\",\"助\",\"叙\",\"女\",\"序\",\"徐\",\"恕\",\"鋤\",\"除\",\"傷\",\"償\",\"勝\",\"匠\",\"升\",\"召\",\"哨\",\"商\",\"唱\",\"嘗\",\"奨\",\"妾\",\"娼\",\"宵\",\"将\",\"小\",\"少\",\"尚\",\"庄\",\"床\",\"廠\",\"彰\",\"承\",\"抄\",\"招\",\"掌\",\"捷\",\"昇\",\"昌\",\"昭\",\"晶\",\"松\",\"梢\",\"樟\",\"樵\",\"沼\",\"消\",\"渉\",\"湘\",\"焼\",\"焦\",\"照\",\"症\",\"省\",\"硝\",\"礁\",\"祥\",\"称\",\"章\",\"笑\",\"粧\",\"紹\",\"肖\",\"菖\",\"蒋\",\"蕉\",\"衝\",\"裳\",\"訟\",\"証\",\"詔\",\"詳\",\"象\",\"賞\",\"醤\",\"鉦\",\"鍾\",\"鐘\",\"障\",\"鞘\",\"上\",\"丈\",\"丞\",\"乗\",\"冗\",\"剰\",\"城\",\"場\",\"壌\",\"嬢\",\"常\",\"情\",\"擾\",\"条\",\"杖\",\"浄\",\"状\",\"畳\",\"穣\",\"蒸\",\"譲\",\"醸\",\"錠\",\"嘱\",\"埴\",\"飾\",\"拭\",\"植\",\"殖\",\"燭\",\"織\",\"職\",\"色\",\"触\",\"食\",\"蝕\",\"辱\",\"尻\",\"伸\",\"信\",\"侵\",\"唇\",\"娠\",\"寝\",\"審\",\"心\",\"慎\",\"振\",\"新\",\"晋\",\"森\",\"榛\",\"浸\",\"深\",\"申\",\"疹\",\"真\",\"神\",\"秦\",\"紳\",\"臣\",\"芯\",\"薪\",\"親\",\"診\",\"身\",\"辛\",\"進\",\"針\",\"震\",\"人\",\"仁\",\"刃\",\"塵\",\"壬\",\"尋\",\"甚\",\"尽\",\"腎\",\"訊\",\"迅\",\"陣\",\"靭\",\"笥\",\"諏\",\"須\",\"酢\",\"図\",\"厨\",\"逗\",\"吹\",\"垂\",\"帥\",\"推\",\"水\",\"炊\",\"睡\",\"粋\",\"翠\",\"衰\",\"遂\",\"酔\",\"錐\",\"錘\",\"随\",\"瑞\",\"髄\",\"崇\",\"嵩\",\"数\",\"枢\",\"趨\",\"雛\",\"据\",\"杉\",\"椙\",\"菅\",\"頗\",\"雀\",\"裾\",\"澄\",\"摺\",\"寸\",\"世\",\"瀬\",\"畝\",\"是\",\"凄\",\"制\",\"勢\",\"姓\",\"征\",\"性\",\"成\",\"政\",\"整\",\"星\",\"晴\",\"棲\",\"栖\",\"正\",\"清\",\"牲\",\"生\",\"盛\",\"精\",\"聖\",\"声\",\"製\",\"西\",\"誠\",\"誓\",\"請\",\"逝\",\"醒\",\"青\",\"静\",\"斉\",\"税\",\"脆\",\"隻\",\"席\",\"惜\",\"戚\",\"斥\",\"昔\",\"析\",\"石\",\"積\",\"籍\",\"績\",\"脊\",\"責\",\"赤\",\"跡\",\"蹟\",\"碩\",\"切\",\"拙\",\"接\",\"摂\",\"折\",\"設\",\"窃\",\"節\",\"説\",\"雪\",\"絶\",\"舌\",\"蝉\",\"仙\",\"先\",\"千\",\"占\",\"宣\",\"専\",\"尖\",\"川\",\"戦\",\"扇\",\"撰\",\"栓\",\"栴\",\"泉\",\"浅\",\"洗\",\"染\",\"潜\",\"煎\",\"煽\",\"旋\",\"穿\",\"箭\",\"線\",\"繊\",\"羨\",\"腺\",\"舛\",\"船\",\"薦\",\"詮\",\"賎\",\"践\",\"選\",\"遷\",\"銭\",\"銑\",\"閃\",\"鮮\",\"前\",\"善\",\"漸\",\"然\",\"全\",\"禅\",\"繕\",\"膳\",\"糎\",\"噌\",\"塑\",\"岨\",\"措\",\"曾\",\"曽\",\"楚\",\"狙\",\"疏\",\"疎\",\"礎\",\"祖\",\"租\",\"粗\",\"素\",\"組\",\"蘇\",\"訴\",\"阻\",\"遡\",\"鼠\",\"僧\",\"創\",\"双\",\"叢\",\"倉\",\"喪\",\"壮\",\"奏\",\"爽\",\"宋\",\"層\",\"匝\",\"惣\",\"想\",\"捜\",\"掃\",\"挿\",\"掻\",\"操\",\"早\",\"曹\",\"巣\",\"槍\",\"槽\",\"漕\",\"燥\",\"争\",\"痩\",\"相\",\"窓\",\"糟\",\"総\",\"綜\",\"聡\",\"草\",\"荘\",\"葬\",\"蒼\",\"藻\",\"装\",\"走\",\"送\",\"遭\",\"鎗\",\"霜\",\"騒\",\"像\",\"増\",\"憎\",\"臓\",\"蔵\",\"贈\",\"造\",\"促\",\"側\",\"則\",\"即\",\"息\",\"捉\",\"束\",\"測\",\"足\",\"速\",\"俗\",\"属\",\"賊\",\"族\",\"続\",\"卒\",\"袖\",\"其\",\"揃\",\"存\",\"孫\",\"尊\",\"損\",\"村\",\"遜\",\"他\",\"多\",\"太\",\"汰\",\"詑\",\"唾\",\"堕\",\"妥\",\"惰\",\"打\",\"柁\",\"舵\",\"楕\",\"陀\",\"駄\",\"騨\",\"体\",\"堆\",\"対\",\"耐\",\"岱\",\"帯\",\"待\",\"怠\",\"態\",\"戴\",\"替\",\"泰\",\"滞\",\"胎\",\"腿\",\"苔\",\"袋\",\"貸\",\"退\",\"逮\",\"隊\",\"黛\",\"鯛\",\"代\",\"台\",\"大\",\"第\",\"醍\",\"題\",\"鷹\",\"滝\",\"瀧\",\"卓\",\"啄\",\"宅\",\"托\",\"択\",\"拓\",\"沢\",\"濯\",\"琢\",\"託\",\"鐸\",\"濁\",\"諾\",\"茸\",\"凧\",\"蛸\",\"只\",\"叩\",\"但\",\"達\",\"辰\",\"奪\",\"脱\",\"巽\",\"竪\",\"辿\",\"棚\",\"谷\",\"狸\",\"鱈\",\"樽\",\"誰\",\"丹\",\"単\",\"嘆\",\"坦\",\"担\",\"探\",\"旦\",\"歎\",\"淡\",\"湛\",\"炭\",\"短\",\"端\",\"箪\",\"綻\",\"耽\",\"胆\",\"蛋\",\"誕\",\"鍛\",\"団\",\"壇\",\"弾\",\"断\",\"暖\",\"檀\",\"段\",\"男\",\"談\",\"値\",\"知\",\"地\",\"弛\",\"恥\",\"智\",\"池\",\"痴\",\"稚\",\"置\",\"致\",\"蜘\",\"遅\",\"馳\",\"築\",\"畜\",\"竹\",\"筑\",\"蓄\",\"逐\",\"秩\",\"窒\",\"茶\",\"嫡\",\"着\",\"中\",\"仲\",\"宙\",\"忠\",\"抽\",\"昼\",\"柱\",\"注\",\"虫\",\"衷\",\"註\",\"酎\",\"鋳\",\"駐\",\"樗\",\"瀦\",\"猪\",\"苧\",\"著\",\"貯\",\"丁\",\"兆\",\"凋\",\"喋\",\"寵\",\"帖\",\"帳\",\"庁\",\"弔\",\"張\",\"彫\",\"徴\",\"懲\",\"挑\",\"暢\",\"朝\",\"潮\",\"牒\",\"町\",\"眺\",\"聴\",\"脹\",\"腸\",\"蝶\",\"調\",\"諜\",\"超\",\"跳\",\"銚\",\"長\",\"頂\",\"鳥\",\"勅\",\"捗\",\"直\",\"朕\",\"沈\",\"珍\",\"賃\",\"鎮\",\"陳\",\"津\",\"墜\",\"椎\",\"槌\",\"追\",\"鎚\",\"痛\",\"通\",\"塚\",\"栂\",\"掴\",\"槻\",\"佃\",\"漬\",\"柘\",\"辻\",\"蔦\",\"綴\",\"鍔\",\"椿\",\"潰\",\"坪\",\"壷\",\"嬬\",\"紬\",\"爪\",\"吊\",\"釣\",\"鶴\",\"亭\",\"低\",\"停\",\"偵\",\"剃\",\"貞\",\"呈\",\"堤\",\"定\",\"帝\",\"底\",\"庭\",\"廷\",\"弟\",\"悌\",\"抵\",\"挺\",\"提\",\"梯\",\"汀\",\"碇\",\"禎\",\"程\",\"締\",\"艇\",\"訂\",\"諦\",\"蹄\",\"逓\",\"邸\",\"鄭\",\"釘\",\"鼎\",\"泥\",\"摘\",\"擢\",\"敵\",\"滴\",\"的\",\"笛\",\"適\",\"鏑\",\"溺\",\"哲\",\"徹\",\"撤\",\"轍\",\"迭\",\"鉄\",\"典\",\"填\",\"天\",\"展\",\"店\",\"添\",\"纏\",\"甜\",\"貼\",\"転\",\"顛\",\"点\",\"伝\",\"殿\",\"澱\",\"田\",\"電\",\"兎\",\"吐\",\"堵\",\"塗\",\"妬\",\"屠\",\"徒\",\"斗\",\"杜\",\"渡\",\"登\",\"菟\",\"賭\",\"途\",\"都\",\"鍍\",\"砥\",\"砺\",\"努\",\"度\",\"土\",\"奴\",\"怒\",\"倒\",\"党\",\"冬\",\"凍\",\"刀\",\"唐\",\"塔\",\"塘\",\"套\",\"宕\",\"島\",\"嶋\",\"悼\",\"投\",\"搭\",\"東\",\"桃\",\"梼\",\"棟\",\"盗\",\"淘\",\"湯\",\"涛\",\"灯\",\"燈\",\"当\",\"痘\",\"祷\",\"等\",\"答\",\"筒\",\"糖\",\"統\",\"到\",\"董\",\"蕩\",\"藤\",\"討\",\"謄\",\"豆\",\"踏\",\"逃\",\"透\",\"鐙\",\"陶\",\"頭\",\"騰\",\"闘\",\"働\",\"動\",\"同\",\"堂\",\"導\",\"憧\",\"撞\",\"洞\",\"瞳\",\"童\",\"胴\",\"萄\",\"道\",\"銅\",\"峠\",\"鴇\",\"匿\",\"得\",\"徳\",\"涜\",\"特\",\"督\",\"禿\",\"篤\",\"毒\",\"独\",\"読\",\"栃\",\"橡\",\"凸\",\"突\",\"椴\",\"届\",\"鳶\",\"苫\",\"寅\",\"酉\",\"瀞\",\"噸\",\"屯\",\"惇\",\"敦\",\"沌\",\"豚\",\"遁\",\"頓\",\"呑\",\"曇\",\"鈍\",\"奈\",\"那\",\"内\",\"乍\",\"凪\",\"薙\",\"謎\",\"灘\",\"捺\",\"鍋\",\"楢\",\"馴\",\"縄\",\"畷\",\"南\",\"楠\",\"軟\",\"難\",\"汝\",\"二\",\"尼\",\"弐\",\"迩\",\"匂\",\"賑\",\"肉\",\"虹\",\"廿\",\"日\",\"乳\",\"入\",\"如\",\"尿\",\"韮\",\"任\",\"妊\",\"忍\",\"認\",\"濡\",\"禰\",\"祢\",\"寧\",\"葱\",\"猫\",\"熱\",\"年\",\"念\",\"捻\",\"撚\",\"燃\",\"粘\",\"乃\",\"廼\",\"之\",\"埜\",\"嚢\",\"悩\",\"濃\",\"納\",\"能\",\"脳\",\"膿\",\"農\",\"覗\",\"蚤\",\"巴\",\"把\",\"播\",\"覇\",\"杷\",\"波\",\"派\",\"琶\",\"破\",\"婆\",\"罵\",\"芭\",\"馬\",\"俳\",\"廃\",\"拝\",\"排\",\"敗\",\"杯\",\"盃\",\"牌\",\"背\",\"肺\",\"輩\",\"配\",\"倍\",\"培\",\"媒\",\"梅\",\"楳\",\"煤\",\"狽\",\"買\",\"売\",\"賠\",\"陪\",\"這\",\"蝿\",\"秤\",\"矧\",\"萩\",\"伯\",\"剥\",\"博\",\"拍\",\"柏\",\"泊\",\"白\",\"箔\",\"粕\",\"舶\",\"薄\",\"迫\",\"曝\",\"漠\",\"爆\",\"縛\",\"莫\",\"駁\",\"麦\",\"函\",\"箱\",\"硲\",\"箸\",\"肇\",\"筈\",\"櫨\",\"幡\",\"肌\",\"畑\",\"畠\",\"八\",\"鉢\",\"溌\",\"発\",\"醗\",\"髪\",\"伐\",\"罰\",\"抜\",\"筏\",\"閥\",\"鳩\",\"噺\",\"塙\",\"蛤\",\"隼\",\"伴\",\"判\",\"半\",\"反\",\"叛\",\"帆\",\"搬\",\"斑\",\"板\",\"氾\",\"汎\",\"版\",\"犯\",\"班\",\"畔\",\"繁\",\"般\",\"藩\",\"販\",\"範\",\"釆\",\"煩\",\"頒\",\"飯\",\"挽\",\"晩\",\"番\",\"盤\",\"磐\",\"蕃\",\"蛮\",\"匪\",\"卑\",\"否\",\"妃\",\"庇\",\"彼\",\"悲\",\"扉\",\"批\",\"披\",\"斐\",\"比\",\"泌\",\"疲\",\"皮\",\"碑\",\"秘\",\"緋\",\"罷\",\"肥\",\"被\",\"誹\",\"費\",\"避\",\"非\",\"飛\",\"樋\",\"簸\",\"備\",\"尾\",\"微\",\"枇\",\"毘\",\"琵\",\"眉\",\"美\",\"鼻\",\"柊\",\"稗\",\"匹\",\"疋\",\"髭\",\"彦\",\"膝\",\"菱\",\"肘\",\"弼\",\"必\",\"畢\",\"筆\",\"逼\",\"桧\",\"姫\",\"媛\",\"紐\",\"百\",\"謬\",\"俵\",\"彪\",\"標\",\"氷\",\"漂\",\"瓢\",\"票\",\"表\",\"評\",\"豹\",\"廟\",\"描\",\"病\",\"秒\",\"苗\",\"錨\",\"鋲\",\"蒜\",\"蛭\",\"鰭\",\"品\",\"彬\",\"斌\",\"浜\",\"瀕\",\"貧\",\"賓\",\"頻\",\"敏\",\"瓶\",\"不\",\"付\",\"埠\",\"夫\",\"婦\",\"富\",\"冨\",\"布\",\"府\",\"怖\",\"扶\",\"敷\",\"斧\",\"普\",\"浮\",\"父\",\"符\",\"腐\",\"膚\",\"芙\",\"譜\",\"負\",\"賦\",\"赴\",\"阜\",\"附\",\"侮\",\"撫\",\"武\",\"舞\",\"葡\",\"蕪\",\"部\",\"封\",\"楓\",\"風\",\"葺\",\"蕗\",\"伏\",\"副\",\"復\",\"幅\",\"服\",\"福\",\"腹\",\"複\",\"覆\",\"淵\",\"弗\",\"払\",\"沸\",\"仏\",\"物\",\"鮒\",\"分\",\"吻\",\"噴\",\"墳\",\"憤\",\"扮\",\"焚\",\"奮\",\"粉\",\"糞\",\"紛\",\"雰\",\"文\",\"聞\",\"丙\",\"併\",\"兵\",\"塀\",\"幣\",\"平\",\"弊\",\"柄\",\"並\",\"蔽\",\"閉\",\"陛\",\"米\",\"頁\",\"僻\",\"壁\",\"癖\",\"碧\",\"別\",\"瞥\",\"蔑\",\"箆\",\"偏\",\"変\",\"片\",\"篇\",\"編\",\"辺\",\"返\",\"遍\",\"便\",\"勉\",\"娩\",\"弁\",\"鞭\",\"保\",\"舗\",\"鋪\",\"圃\",\"捕\",\"歩\",\"甫\",\"補\",\"輔\",\"穂\",\"募\",\"墓\",\"慕\",\"戊\",\"暮\",\"母\",\"簿\",\"菩\",\"倣\",\"俸\",\"包\",\"呆\",\"報\",\"奉\",\"宝\",\"峰\",\"峯\",\"崩\",\"庖\",\"抱\",\"捧\",\"放\",\"方\",\"朋\",\"法\",\"泡\",\"烹\",\"砲\",\"縫\",\"胞\",\"芳\",\"萌\",\"蓬\",\"蜂\",\"褒\",\"訪\",\"豊\",\"邦\",\"鋒\",\"飽\",\"鳳\",\"鵬\",\"乏\",\"亡\",\"傍\",\"剖\",\"坊\",\"妨\",\"帽\",\"忘\",\"忙\",\"房\",\"暴\",\"望\",\"某\",\"棒\",\"冒\",\"紡\",\"肪\",\"膨\",\"謀\",\"貌\",\"貿\",\"鉾\",\"防\",\"吠\",\"頬\",\"北\",\"僕\",\"卜\",\"墨\",\"撲\",\"朴\",\"牧\",\"睦\",\"穆\",\"釦\",\"勃\",\"没\",\"殆\",\"堀\",\"幌\",\"奔\",\"本\",\"翻\",\"凡\",\"盆\",\"摩\",\"磨\",\"魔\",\"麻\",\"埋\",\"妹\",\"昧\",\"枚\",\"毎\",\"哩\",\"槙\",\"幕\",\"膜\",\"枕\",\"鮪\",\"柾\",\"鱒\",\"桝\",\"亦\",\"俣\",\"又\",\"抹\",\"末\",\"沫\",\"迄\",\"侭\",\"繭\",\"麿\",\"万\",\"慢\",\"満\",\"漫\",\"蔓\",\"味\",\"未\",\"魅\",\"巳\",\"箕\",\"岬\",\"密\",\"蜜\",\"湊\",\"蓑\",\"稔\",\"脈\",\"妙\",\"粍\",\"民\",\"眠\",\"務\",\"夢\",\"無\",\"牟\",\"矛\",\"霧\",\"鵡\",\"椋\",\"婿\",\"娘\",\"冥\",\"名\",\"命\",\"明\",\"盟\",\"迷\",\"銘\",\"鳴\",\"姪\",\"牝\",\"滅\",\"免\",\"棉\",\"綿\",\"緬\",\"面\",\"麺\",\"摸\",\"模\",\"茂\",\"妄\",\"孟\",\"毛\",\"猛\",\"盲\",\"網\",\"耗\",\"蒙\",\"儲\",\"木\",\"黙\",\"目\",\"杢\",\"勿\",\"餅\",\"尤\",\"戻\",\"籾\",\"貰\",\"問\",\"悶\",\"紋\",\"門\",\"匁\",\"也\",\"冶\",\"夜\",\"爺\",\"耶\",\"野\",\"弥\",\"矢\",\"厄\",\"役\",\"約\",\"薬\",\"訳\",\"躍\",\"靖\",\"柳\",\"薮\",\"鑓\",\"愉\",\"愈\",\"油\",\"癒\",\"諭\",\"輸\",\"唯\",\"佑\",\"優\",\"勇\",\"友\",\"宥\",\"幽\",\"悠\",\"憂\",\"揖\",\"有\",\"柚\",\"湧\",\"涌\",\"猶\",\"猷\",\"由\",\"祐\",\"裕\",\"誘\",\"遊\",\"邑\",\"郵\",\"雄\",\"融\",\"夕\",\"予\",\"余\",\"与\",\"誉\",\"輿\",\"預\",\"傭\",\"幼\",\"妖\",\"容\",\"庸\",\"揚\",\"揺\",\"擁\",\"曜\",\"楊\",\"様\",\"洋\",\"溶\",\"熔\",\"用\",\"窯\",\"羊\",\"耀\",\"葉\",\"蓉\",\"要\",\"謡\",\"踊\",\"遥\",\"陽\",\"養\",\"慾\",\"抑\",\"欲\",\"沃\",\"浴\",\"翌\",\"翼\",\"淀\",\"羅\",\"螺\",\"裸\",\"来\",\"莱\",\"頼\",\"雷\",\"洛\",\"絡\",\"落\",\"酪\",\"乱\",\"卵\",\"嵐\",\"欄\",\"濫\",\"藍\",\"蘭\",\"覧\",\"利\",\"吏\",\"履\",\"李\",\"梨\",\"理\",\"璃\",\"痢\",\"裏\",\"裡\",\"里\",\"離\",\"陸\",\"律\",\"率\",\"立\",\"葎\",\"掠\",\"略\",\"劉\",\"流\",\"溜\",\"琉\",\"留\",\"硫\",\"粒\",\"隆\",\"竜\",\"龍\",\"侶\",\"慮\",\"旅\",\"虜\",\"了\",\"亮\",\"僚\",\"両\",\"凌\",\"寮\",\"料\",\"梁\",\"涼\",\"猟\",\"療\",\"瞭\",\"稜\",\"糧\",\"良\",\"諒\",\"遼\",\"量\",\"陵\",\"領\",\"力\",\"緑\",\"倫\",\"厘\",\"林\",\"淋\",\"燐\",\"琳\",\"臨\",\"輪\",\"隣\",\"鱗\",\"麟\",\"瑠\",\"塁\",\"涙\",\"累\",\"類\",\"令\",\"伶\",\"例\",\"冷\",\"励\",\"嶺\",\"怜\",\"玲\",\"礼\",\"苓\",\"鈴\",\"隷\",\"零\",\"霊\",\"麗\",\"齢\",\"暦\",\"歴\",\"列\",\"劣\",\"烈\",\"裂\",\"廉\",\"恋\",\"憐\",\"漣\",\"煉\",\"簾\",\"練\",\"聯\",\"蓮\",\"連\",\"錬\",\"呂\",\"魯\",\"櫓\",\"炉\",\"賂\",\"路\",\"露\",\"労\",\"婁\",\"廊\",\"弄\",\"朗\",\"楼\",\"榔\",\"浪\",\"漏\",\"牢\",\"狼\",\"篭\",\"老\",\"聾\",\"蝋\",\"郎\",\"六\",\"麓\",\"禄\",\"肋\",\"録\",\"論\",\"倭\",\"和\",\"話\",\"歪\",\"賄\",\"脇\",\"惑\",\"枠\",\"鷲\",\"亙\",\"亘\",\"鰐\",\"詫\",\"藁\",\"蕨\",\"椀\",\"湾\",\"碗\",\"腕\",\"𠮟\",\"孁\",\"孖\",\"孽\",\"宓\",\"寘\",\"寬\",\"尒\",\"尞\",\"尣\",\"尫\",\"㞍\",\"屢\",\"層\",\"屮\",\"𡚴\",\"屺\",\"岏\",\"岟\",\"岣\",\"岪\",\"岺\",\"峋\",\"峐\",\"峒\",\"峴\",\"𡸴\",\"㟢\",\"崍\",\"崧\",\"﨑\",\"嵆\",\"嵇\",\"嵓\",\"嵊\",\"嵭\",\"嶁\",\"嶠\",\"嶤\",\"嶧\",\"嶸\",\"巋\",\"吞\",\"弌\",\"丐\",\"丕\",\"个\",\"丱\",\"丶\",\"丼\",\"丿\",\"乂\",\"乖\",\"乘\",\"亂\",\"亅\",\"豫\",\"亊\",\"舒\",\"弍\",\"于\",\"亞\",\"亟\",\"亠\",\"亢\",\"亰\",\"亳\",\"亶\",\"从\",\"仍\",\"仄\",\"仆\",\"仂\",\"仗\",\"仞\",\"仭\",\"仟\",\"价\",\"伉\",\"佚\",\"估\",\"佛\",\"佝\",\"佗\",\"佇\",\"佶\",\"侈\",\"侏\",\"侘\",\"佻\",\"佩\",\"佰\",\"侑\",\"佯\",\"來\",\"侖\",\"儘\",\"俔\",\"俟\",\"俎\",\"俘\",\"俛\",\"俑\",\"俚\",\"俐\",\"俤\",\"俥\",\"倚\",\"倨\",\"倔\",\"倪\",\"倥\",\"倅\",\"伜\",\"俶\",\"倡\",\"倩\",\"倬\",\"俾\",\"俯\",\"們\",\"倆\",\"偃\",\"假\",\"會\",\"偕\",\"偐\",\"偈\",\"做\",\"偖\",\"偬\",\"偸\",\"傀\",\"傚\",\"傅\",\"傴\",\"傲\",\"僉\",\"僊\",\"傳\",\"僂\",\"僖\",\"僞\",\"僥\",\"僭\",\"僣\",\"僮\",\"價\",\"僵\",\"儉\",\"儁\",\"儂\",\"儖\",\"儕\",\"儔\",\"儚\",\"儡\",\"儺\",\"儷\",\"儼\",\"儻\",\"儿\",\"兀\",\"兒\",\"兌\",\"兔\",\"兢\",\"竸\",\"兩\",\"兪\",\"兮\",\"冀\",\"冂\",\"囘\",\"册\",\"冉\",\"冏\",\"冑\",\"冓\",\"冕\",\"冖\",\"冤\",\"冦\",\"冢\",\"冩\",\"冪\",\"冫\",\"决\",\"冱\",\"冲\",\"冰\",\"况\",\"冽\",\"凅\",\"凉\",\"凛\",\"几\",\"處\",\"凩\",\"凭\",\"凰\",\"凵\",\"凾\",\"刄\",\"刋\",\"刔\",\"刎\",\"刧\",\"刪\",\"刮\",\"刳\",\"刹\",\"剏\",\"剄\",\"剋\",\"剌\",\"剞\",\"剔\",\"剪\",\"剴\",\"剩\",\"剳\",\"剿\",\"剽\",\"劍\",\"劔\",\"劒\",\"剱\",\"劈\",\"劑\",\"辨\",\"辧\",\"劬\",\"劭\",\"劼\",\"劵\",\"勁\",\"勍\",\"勗\",\"勞\",\"勣\",\"勦\",\"飭\",\"勠\",\"勳\",\"勵\",\"勸\",\"勹\",\"匆\",\"匈\",\"甸\",\"匍\",\"匐\",\"匏\",\"匕\",\"匚\",\"匣\",\"匯\",\"匱\",\"匳\",\"匸\",\"區\",\"卆\",\"卅\",\"丗\",\"卉\",\"卍\",\"凖\",\"卞\",\"卩\",\"卮\",\"夘\",\"卻\",\"卷\",\"厂\",\"厖\",\"厠\",\"厦\",\"厥\",\"厮\",\"厰\",\"厶\",\"參\",\"簒\",\"雙\",\"叟\",\"曼\",\"燮\",\"叮\",\"叨\",\"叭\",\"叺\",\"吁\",\"吽\",\"呀\",\"听\",\"吭\",\"吼\",\"吮\",\"吶\",\"吩\",\"吝\",\"呎\",\"咏\",\"呵\",\"咎\",\"呟\",\"呱\",\"呷\",\"呰\",\"咒\",\"呻\",\"咀\",\"呶\",\"咄\",\"咐\",\"咆\",\"哇\",\"咢\",\"咸\",\"咥\",\"咬\",\"哄\",\"哈\",\"咨\",\"咫\",\"哂\",\"咤\",\"咾\",\"咼\",\"哘\",\"哥\",\"哦\",\"唏\",\"唔\",\"哽\",\"哮\",\"哭\",\"哺\",\"哢\",\"唹\",\"啀\",\"啣\",\"啌\",\"售\",\"啜\",\"啅\",\"啖\",\"啗\",\"唸\",\"唳\",\"啝\",\"喙\",\"喀\",\"咯\",\"喊\",\"喟\",\"啻\",\"啾\",\"喘\",\"喞\",\"單\",\"啼\",\"喃\",\"喩\",\"喇\",\"喨\",\"嗚\",\"嗅\",\"嗟\",\"嗄\",\"嗜\",\"嗤\",\"嗔\",\"嘔\",\"嗷\",\"嘖\",\"嗾\",\"嗽\",\"嘛\",\"嗹\",\"噎\",\"噐\",\"營\",\"嘴\",\"嘶\",\"嘲\",\"嘸\",\"噫\",\"噤\",\"嘯\",\"噬\",\"噪\",\"嚆\",\"嚀\",\"嚊\",\"嚠\",\"嚔\",\"嚏\",\"嚥\",\"嚮\",\"嚶\",\"嚴\",\"囂\",\"嚼\",\"囁\",\"囃\",\"囀\",\"囈\",\"囎\",\"囑\",\"囓\",\"囗\",\"囮\",\"囹\",\"圀\",\"囿\",\"圄\",\"圉\",\"圈\",\"國\",\"圍\",\"圓\",\"團\",\"圖\",\"嗇\",\"圜\",\"圦\",\"圷\",\"圸\",\"坎\",\"圻\",\"址\",\"坏\",\"坩\",\"埀\",\"垈\",\"坡\",\"坿\",\"垉\",\"垓\",\"垠\",\"垳\",\"垤\",\"垪\",\"垰\",\"埃\",\"埆\",\"埔\",\"埒\",\"埓\",\"堊\",\"埖\",\"埣\",\"堋\",\"堙\",\"堝\",\"塲\",\"堡\",\"塢\",\"塋\",\"塰\",\"毀\",\"塒\",\"堽\",\"塹\",\"墅\",\"墹\",\"墟\",\"墫\",\"墺\",\"壞\",\"墻\",\"墸\",\"墮\",\"壅\",\"壓\",\"壑\",\"壗\",\"壙\",\"壘\",\"壥\",\"壜\",\"壤\",\"壟\",\"壯\",\"壺\",\"壹\",\"壻\",\"壼\",\"壽\",\"夂\",\"夊\",\"夐\",\"夛\",\"梦\",\"夥\",\"夬\",\"夭\",\"夲\",\"夸\",\"夾\",\"竒\",\"奕\",\"奐\",\"奎\",\"奚\",\"奘\",\"奢\",\"奠\",\"奧\",\"奬\",\"奩\",\"奸\",\"妁\",\"妝\",\"佞\",\"侫\",\"妣\",\"妲\",\"姆\",\"姨\",\"姜\",\"妍\",\"姙\",\"姚\",\"娥\",\"娟\",\"娑\",\"娜\",\"娉\",\"娚\",\"婀\",\"婬\",\"婉\",\"娵\",\"娶\",\"婢\",\"婪\",\"媚\",\"媼\",\"媾\",\"嫋\",\"嫂\",\"媽\",\"嫣\",\"嫗\",\"嫦\",\"嫩\",\"嫖\",\"嫺\",\"嫻\",\"嬌\",\"嬋\",\"嬖\",\"嬲\",\"嫐\",\"嬪\",\"嬶\",\"嬾\",\"孃\",\"孅\",\"孀\",\"孑\",\"孕\",\"孚\",\"孛\",\"孥\",\"孩\",\"孰\",\"孳\",\"孵\",\"學\",\"斈\",\"孺\",\"宀\",\"它\",\"宦\",\"宸\",\"寃\",\"寇\",\"寉\",\"寔\",\"寐\",\"寤\",\"實\",\"寢\",\"寞\",\"寥\",\"寫\",\"寰\",\"寶\",\"寳\",\"尅\",\"將\",\"專\",\"對\",\"尓\",\"尠\",\"尢\",\"尨\",\"尸\",\"尹\",\"屁\",\"屆\",\"屎\",\"屓\",\"屐\",\"屏\",\"孱\",\"屬\",\"屮\",\"乢\",\"屶\",\"屹\",\"岌\",\"岑\",\"岔\",\"妛\",\"岫\",\"岻\",\"岶\",\"岼\",\"岷\",\"峅\",\"岾\",\"峇\",\"峙\",\"峩\",\"峽\",\"峺\",\"峭\",\"嶌\",\"峪\",\"崋\",\"崕\",\"崗\",\"嵜\",\"崟\",\"崛\",\"崑\",\"崔\",\"崢\",\"崚\",\"崙\",\"崘\",\"嵌\",\"嵒\",\"嵎\",\"嵋\",\"嵬\",\"嵳\",\"嵶\",\"嶇\",\"嶄\",\"嶂\",\"嶢\",\"嶝\",\"嶬\",\"嶮\",\"嶽\",\"嶐\",\"嶷\",\"嶼\",\"巉\",\"巍\",\"巓\",\"巒\",\"巖\",\"巛\",\"巫\",\"已\",\"巵\",\"帋\",\"帚\",\"帙\",\"帑\",\"帛\",\"帶\",\"帷\",\"幄\",\"幃\",\"幀\",\"幎\",\"幗\",\"幔\",\"幟\",\"幢\",\"幤\",\"幇\",\"幵\",\"并\",\"幺\",\"麼\",\"广\",\"庠\",\"廁\",\"廂\",\"廈\",\"廐\",\"廏\",\"廖\",\"廣\",\"廝\",\"廚\",\"廛\",\"廢\",\"廡\",\"廨\",\"廩\",\"廬\",\"廱\",\"廳\",\"廰\",\"廴\",\"廸\",\"廾\",\"弃\",\"弉\",\"彝\",\"彜\",\"弋\",\"弑\",\"弖\",\"弩\",\"弭\",\"弸\",\"彁\",\"彈\",\"彌\",\"彎\",\"弯\",\"彑\",\"彖\",\"彗\",\"彙\",\"彡\",\"彭\",\"彳\",\"彷\",\"徃\",\"徂\",\"彿\",\"徊\",\"很\",\"徑\",\"徇\",\"從\",\"徙\",\"徘\",\"徠\",\"徨\",\"徭\",\"徼\",\"忖\",\"忻\",\"忤\",\"忸\",\"忱\",\"忝\",\"悳\",\"忿\",\"怡\",\"恠\",\"怙\",\"怐\",\"怩\",\"怎\",\"怱\",\"怛\",\"怕\",\"怫\",\"怦\",\"怏\",\"怺\",\"恚\",\"恁\",\"恪\",\"恷\",\"恟\",\"恊\",\"恆\",\"恍\",\"恣\",\"恃\",\"恤\",\"恂\",\"恬\",\"恫\",\"恙\",\"悁\",\"悍\",\"惧\",\"悃\",\"悚\",\"悄\",\"悛\",\"悖\",\"悗\",\"悒\",\"悧\",\"悋\",\"惡\",\"悸\",\"惠\",\"惓\",\"悴\",\"忰\",\"悽\",\"惆\",\"悵\",\"惘\",\"慍\",\"愕\",\"愆\",\"惶\",\"惷\",\"愀\",\"惴\",\"惺\",\"愃\",\"愡\",\"惻\",\"惱\",\"愍\",\"愎\",\"慇\",\"愾\",\"愨\",\"愧\",\"慊\",\"愿\",\"愼\",\"愬\",\"愴\",\"愽\",\"慂\",\"慄\",\"慳\",\"慷\",\"慘\",\"慙\",\"慚\",\"慫\",\"慴\",\"慯\",\"慥\",\"慱\",\"慟\",\"慝\",\"慓\",\"慵\",\"憙\",\"憖\",\"憇\",\"憬\",\"憔\",\"憚\",\"憊\",\"憑\",\"憫\",\"憮\",\"懌\",\"懊\",\"應\",\"懷\",\"懈\",\"懃\",\"懆\",\"憺\",\"懋\",\"罹\",\"懍\",\"懦\",\"懣\",\"懶\",\"懺\",\"懴\",\"懿\",\"懽\",\"懼\",\"懾\",\"戀\",\"戈\",\"戉\",\"戍\",\"戌\",\"戔\",\"戛\",\"戞\",\"戡\",\"截\",\"戮\",\"戰\",\"戲\",\"戳\",\"扁\",\"扎\",\"扞\",\"扣\",\"扛\",\"扠\",\"扨\",\"扼\",\"抂\",\"抉\",\"找\",\"抒\",\"抓\",\"抖\",\"拔\",\"抃\",\"抔\",\"拗\",\"拑\",\"抻\",\"拏\",\"拿\",\"拆\",\"擔\",\"拈\",\"拜\",\"拌\",\"拊\",\"拂\",\"拇\",\"抛\",\"拉\",\"挌\",\"拮\",\"拱\",\"挧\",\"挂\",\"挈\",\"拯\",\"拵\",\"捐\",\"挾\",\"捍\",\"搜\",\"捏\",\"掖\",\"掎\",\"掀\",\"掫\",\"捶\",\"掣\",\"掏\",\"掉\",\"掟\",\"掵\",\"捫\",\"捩\",\"掾\",\"揩\",\"揀\",\"揆\",\"揣\",\"揉\",\"插\",\"揶\",\"揄\",\"搖\",\"搴\",\"搆\",\"搓\",\"搦\",\"搶\",\"攝\",\"搗\",\"搨\",\"搏\",\"摧\",\"摯\",\"摶\",\"摎\",\"攪\",\"撕\",\"撓\",\"撥\",\"撩\",\"撈\",\"撼\",\"據\",\"擒\",\"擅\",\"擇\",\"撻\",\"擘\",\"擂\",\"擱\",\"擧\",\"舉\",\"擠\",\"擡\",\"抬\",\"擣\",\"擯\",\"攬\",\"擶\",\"擴\",\"擲\",\"擺\",\"攀\",\"擽\",\"攘\",\"攜\",\"攅\",\"攤\",\"攣\",\"攫\",\"攴\",\"攵\",\"攷\",\"收\",\"攸\",\"畋\",\"效\",\"敖\",\"敕\",\"敍\",\"敘\",\"敞\",\"敝\",\"敲\",\"數\",\"斂\",\"斃\",\"變\",\"斛\",\"斟\",\"斫\",\"斷\",\"旃\",\"旆\",\"旁\",\"旄\",\"旌\",\"旒\",\"旛\",\"旙\",\"无\",\"旡\",\"旱\",\"杲\",\"昊\",\"昃\",\"旻\",\"杳\",\"昵\",\"昶\",\"昴\",\"昜\",\"晏\",\"晄\",\"晉\",\"晁\",\"晞\",\"晝\",\"晤\",\"晧\",\"晨\",\"晟\",\"晢\",\"晰\",\"暃\",\"暈\",\"暎\",\"暉\",\"暄\",\"暘\",\"暝\",\"曁\",\"暹\",\"曉\",\"暾\",\"暼\",\"曄\",\"暸\",\"曖\",\"曚\",\"曠\",\"昿\",\"曦\",\"曩\",\"曰\",\"曵\",\"曷\",\"朏\",\"朖\",\"朞\",\"朦\",\"朧\",\"霸\",\"朮\",\"朿\",\"朶\",\"杁\",\"朸\",\"朷\",\"杆\",\"杞\",\"杠\",\"杙\",\"杣\",\"杤\",\"枉\",\"杰\",\"枩\",\"杼\",\"杪\",\"枌\",\"枋\",\"枦\",\"枡\",\"枅\",\"枷\",\"柯\",\"枴\",\"柬\",\"枳\",\"柩\",\"枸\",\"柤\",\"柞\",\"柝\",\"柢\",\"柮\",\"枹\",\"柎\",\"柆\",\"柧\",\"檜\",\"栞\",\"框\",\"栩\",\"桀\",\"桍\",\"栲\",\"桎\",\"梳\",\"栫\",\"桙\",\"档\",\"桷\",\"桿\",\"梟\",\"梏\",\"梭\",\"梔\",\"條\",\"梛\",\"梃\",\"檮\",\"梹\",\"桴\",\"梵\",\"梠\",\"梺\",\"椏\",\"梍\",\"桾\",\"椁\",\"棊\",\"椈\",\"棘\",\"椢\",\"椦\",\"棡\",\"椌\",\"棍\",\"棔\",\"棧\",\"棕\",\"椶\",\"椒\",\"椄\",\"棗\",\"棣\",\"椥\",\"棹\",\"棠\",\"棯\",\"椨\",\"椪\",\"椚\",\"椣\",\"椡\",\"棆\",\"楹\",\"楷\",\"楜\",\"楸\",\"楫\",\"楔\",\"楾\",\"楮\",\"椹\",\"楴\",\"椽\",\"楙\",\"椰\",\"楡\",\"楞\",\"楝\",\"榁\",\"楪\",\"榲\",\"榮\",\"槐\",\"榿\",\"槁\",\"槓\",\"榾\",\"槎\",\"寨\",\"槊\",\"槝\",\"榻\",\"槃\",\"榧\",\"樮\",\"榑\",\"榠\",\"榜\",\"榕\",\"榴\",\"槞\",\"槨\",\"樂\",\"樛\",\"槿\",\"權\",\"槹\",\"槲\",\"槧\",\"樅\",\"榱\",\"樞\",\"槭\",\"樔\",\"槫\",\"樊\",\"樒\",\"櫁\",\"樣\",\"樓\",\"橄\",\"樌\",\"橲\",\"樶\",\"橸\",\"橇\",\"橢\",\"橙\",\"橦\",\"橈\",\"樸\",\"樢\",\"檐\",\"檍\",\"檠\",\"檄\",\"檢\",\"檣\",\"檗\",\"蘗\",\"檻\",\"櫃\",\"櫂\",\"檸\",\"檳\",\"檬\",\"櫞\",\"櫑\",\"櫟\",\"檪\",\"櫚\",\"櫪\",\"櫻\",\"欅\",\"蘖\",\"櫺\",\"欒\",\"欖\",\"鬱\",\"欟\",\"欸\",\"欷\",\"盜\",\"欹\",\"飮\",\"歇\",\"歃\",\"歉\",\"歐\",\"歙\",\"歔\",\"歛\",\"歟\",\"歡\",\"歸\",\"歹\",\"歿\",\"殀\",\"殄\",\"殃\",\"殍\",\"殘\",\"殕\",\"殞\",\"殤\",\"殪\",\"殫\",\"殯\",\"殲\",\"殱\",\"殳\",\"殷\",\"殼\",\"毆\",\"毋\",\"毓\",\"毟\",\"毬\",\"毫\",\"毳\",\"毯\",\"麾\",\"氈\",\"氓\",\"气\",\"氛\",\"氤\",\"氣\",\"汞\",\"汕\",\"汢\",\"汪\",\"沂\",\"沍\",\"沚\",\"沁\",\"沛\",\"汾\",\"汨\",\"汳\",\"沒\",\"沐\",\"泄\",\"泱\",\"泓\",\"沽\",\"泗\",\"泅\",\"泝\",\"沮\",\"沱\",\"沾\",\"沺\",\"泛\",\"泯\",\"泙\",\"泪\",\"洟\",\"衍\",\"洶\",\"洫\",\"洽\",\"洸\",\"洙\",\"洵\",\"洳\",\"洒\",\"洌\",\"浣\",\"涓\",\"浤\",\"浚\",\"浹\",\"浙\",\"涎\",\"涕\",\"濤\",\"涅\",\"淹\",\"渕\",\"渊\",\"涵\",\"淇\",\"淦\",\"涸\",\"淆\",\"淬\",\"淞\",\"淌\",\"淨\",\"淒\",\"淅\",\"淺\",\"淙\",\"淤\",\"淕\",\"淪\",\"淮\",\"渭\",\"湮\",\"渮\",\"渙\",\"湲\",\"湟\",\"渾\",\"渣\",\"湫\",\"渫\",\"湶\",\"湍\",\"渟\",\"湃\",\"渺\",\"湎\",\"渤\",\"滿\",\"渝\",\"游\",\"溂\",\"溪\",\"溘\",\"滉\",\"溷\",\"滓\",\"溽\",\"溯\",\"滄\",\"溲\",\"滔\",\"滕\",\"溏\",\"溥\",\"滂\",\"溟\",\"潁\",\"漑\",\"灌\",\"滬\",\"滸\",\"滾\",\"漿\",\"滲\",\"漱\",\"滯\",\"漲\",\"滌\",\"漾\",\"漓\",\"滷\",\"澆\",\"潺\",\"潸\",\"澁\",\"澀\",\"潯\",\"潛\",\"濳\",\"潭\",\"澂\",\"潼\",\"潘\",\"澎\",\"澑\",\"濂\",\"潦\",\"澳\",\"澣\",\"澡\",\"澤\",\"澹\",\"濆\",\"澪\",\"濟\",\"濕\",\"濬\",\"濔\",\"濘\",\"濱\",\"濮\",\"濛\",\"瀉\",\"瀋\",\"濺\",\"瀑\",\"瀁\",\"瀏\",\"濾\",\"瀛\",\"瀚\",\"潴\",\"瀝\",\"瀘\",\"瀟\",\"瀰\",\"瀾\",\"瀲\",\"灑\",\"灣\",\"炙\",\"炒\",\"炯\",\"烱\",\"炬\",\"炸\",\"炳\",\"炮\",\"烟\",\"烋\",\"烝\",\"烙\",\"焉\",\"烽\",\"焜\",\"焙\",\"煥\",\"煕\",\"熈\",\"煦\",\"煢\",\"煌\",\"煖\",\"煬\",\"熏\",\"燻\",\"熄\",\"熕\",\"熨\",\"熬\",\"燗\",\"熹\",\"熾\",\"燒\",\"燉\",\"燔\",\"燎\",\"燠\",\"燬\",\"燧\",\"燵\",\"燼\",\"燹\",\"燿\",\"爍\",\"爐\",\"爛\",\"爨\",\"爭\",\"爬\",\"爰\",\"爲\",\"爻\",\"爼\",\"爿\",\"牀\",\"牆\",\"牋\",\"牘\",\"牴\",\"牾\",\"犂\",\"犁\",\"犇\",\"犒\",\"犖\",\"犢\",\"犧\",\"犹\",\"犲\",\"狃\",\"狆\",\"狄\",\"狎\",\"狒\",\"狢\",\"狠\",\"狡\",\"狹\",\"狷\",\"倏\",\"猗\",\"猊\",\"猜\",\"猖\",\"猝\",\"猴\",\"猯\",\"猩\",\"猥\",\"猾\",\"獎\",\"獏\",\"默\",\"獗\",\"獪\",\"獨\",\"獰\",\"獸\",\"獵\",\"獻\",\"獺\",\"珈\",\"玳\",\"珎\",\"玻\",\"珀\",\"珥\",\"珮\",\"珞\",\"璢\",\"琅\",\"瑯\",\"琥\",\"珸\",\"琲\",\"琺\",\"瑕\",\"琿\",\"瑟\",\"瑙\",\"瑁\",\"瑜\",\"瑩\",\"瑰\",\"瑣\",\"瑪\",\"瑶\",\"瑾\",\"璋\",\"璞\",\"璧\",\"瓊\",\"瓏\",\"瓔\",\"珱\",\"瓠\",\"瓣\",\"瓧\",\"瓩\",\"瓮\",\"瓲\",\"瓰\",\"瓱\",\"瓸\",\"瓷\",\"甄\",\"甃\",\"甅\",\"甌\",\"甎\",\"甍\",\"甕\",\"甓\",\"甞\",\"甦\",\"甬\",\"甼\",\"畄\",\"畍\",\"畊\",\"畉\",\"畛\",\"畆\",\"畚\",\"畩\",\"畤\",\"畧\",\"畫\",\"畭\",\"畸\",\"當\",\"疆\",\"疇\",\"畴\",\"疊\",\"疉\",\"疂\",\"疔\",\"疚\",\"疝\",\"疥\",\"疣\",\"痂\",\"疳\",\"痃\",\"疵\",\"疽\",\"疸\",\"疼\",\"疱\",\"痍\",\"痊\",\"痒\",\"痙\",\"痣\",\"痞\",\"痾\",\"痿\",\"痼\",\"瘁\",\"痰\",\"痺\",\"痲\",\"痳\",\"瘋\",\"瘍\",\"瘉\",\"瘟\",\"瘧\",\"瘠\",\"瘡\",\"瘢\",\"瘤\",\"瘴\",\"瘰\",\"瘻\",\"癇\",\"癈\",\"癆\",\"癜\",\"癘\",\"癡\",\"癢\",\"癨\",\"癩\",\"癪\",\"癧\",\"癬\",\"癰\",\"癲\",\"癶\",\"癸\",\"發\",\"皀\",\"皃\",\"皈\",\"皋\",\"皎\",\"皖\",\"皓\",\"皙\",\"皚\",\"皰\",\"皴\",\"皸\",\"皹\",\"皺\",\"盂\",\"盍\",\"盖\",\"盒\",\"盞\",\"盡\",\"盥\",\"盧\",\"盪\",\"蘯\",\"盻\",\"眈\",\"眇\",\"眄\",\"眩\",\"眤\",\"眞\",\"眥\",\"眦\",\"眛\",\"眷\",\"眸\",\"睇\",\"睚\",\"睨\",\"睫\",\"睛\",\"睥\",\"睿\",\"睾\",\"睹\",\"瞎\",\"瞋\",\"瞑\",\"瞠\",\"瞞\",\"瞰\",\"瞶\",\"瞹\",\"瞿\",\"瞼\",\"瞽\",\"瞻\",\"矇\",\"矍\",\"矗\",\"矚\",\"矜\",\"矣\",\"矮\",\"矼\",\"砌\",\"砒\",\"礦\",\"砠\",\"礪\",\"硅\",\"碎\",\"硴\",\"碆\",\"硼\",\"碚\",\"碌\",\"碣\",\"碵\",\"碪\",\"碯\",\"磑\",\"磆\",\"磋\",\"磔\",\"碾\",\"碼\",\"磅\",\"磊\",\"磬\",\"磧\",\"磚\",\"磽\",\"磴\",\"礇\",\"礒\",\"礑\",\"礙\",\"礬\",\"礫\",\"祀\",\"祠\",\"祗\",\"祟\",\"祚\",\"祕\",\"祓\",\"祺\",\"祿\",\"禊\",\"禝\",\"禧\",\"齋\",\"禪\",\"禮\",\"禳\",\"禹\",\"禺\",\"秉\",\"秕\",\"秧\",\"秬\",\"秡\",\"秣\",\"稈\",\"稍\",\"稘\",\"稙\",\"稠\",\"稟\",\"禀\",\"稱\",\"稻\",\"稾\",\"稷\",\"穃\",\"穗\",\"穉\",\"穡\",\"穢\",\"穩\",\"龝\",\"穰\",\"穹\",\"穽\",\"窈\",\"窗\",\"窕\",\"窘\",\"窖\",\"窩\",\"竈\",\"窰\",\"窶\",\"竅\",\"竄\",\"窿\",\"邃\",\"竇\",\"竊\",\"竍\",\"竏\",\"竕\",\"竓\",\"站\",\"竚\",\"竝\",\"竡\",\"竢\",\"竦\",\"竭\",\"竰\",\"笂\",\"笏\",\"笊\",\"笆\",\"笳\",\"笘\",\"笙\",\"笞\",\"笵\",\"笨\",\"笶\",\"筐\",\"筺\",\"笄\",\"筍\",\"笋\",\"筌\",\"筅\",\"筵\",\"筥\",\"筴\",\"筧\",\"筰\",\"筱\",\"筬\",\"筮\",\"箝\",\"箘\",\"箟\",\"箍\",\"箜\",\"箚\",\"箋\",\"箒\",\"箏\",\"筝\",\"箙\",\"篋\",\"篁\",\"篌\",\"篏\",\"箴\",\"篆\",\"篝\",\"篩\",\"簑\",\"簔\",\"篦\",\"篥\",\"籠\",\"簀\",\"簇\",\"簓\",\"篳\",\"篷\",\"簗\",\"簍\",\"篶\",\"簣\",\"簧\",\"簪\",\"簟\",\"簷\",\"簫\",\"簽\",\"籌\",\"籃\",\"籔\",\"籏\",\"籀\",\"籐\",\"籘\",\"籟\",\"籤\",\"籖\",\"籥\",\"籬\",\"籵\",\"粃\",\"粐\",\"粤\",\"粭\",\"粢\",\"粫\",\"粡\",\"粨\",\"粳\",\"粲\",\"粱\",\"粮\",\"粹\",\"粽\",\"糀\",\"糅\",\"糂\",\"糘\",\"糒\",\"糜\",\"糢\",\"鬻\",\"糯\",\"糲\",\"糴\",\"糶\",\"糺\",\"紆\",\"紂\",\"紜\",\"紕\",\"紊\",\"絅\",\"絋\",\"紮\",\"紲\",\"紿\",\"紵\",\"絆\",\"絳\",\"絖\",\"絎\",\"絲\",\"絨\",\"絮\",\"絏\",\"絣\",\"經\",\"綉\",\"絛\",\"綏\",\"絽\",\"綛\",\"綺\",\"綮\",\"綣\",\"綵\",\"緇\",\"綽\",\"綫\",\"總\",\"綢\",\"綯\",\"緜\",\"綸\",\"綟\",\"綰\",\"緘\",\"緝\",\"緤\",\"緞\",\"緻\",\"緲\",\"緡\",\"縅\",\"縊\",\"縣\",\"縡\",\"縒\",\"縱\",\"縟\",\"縉\",\"縋\",\"縢\",\"繆\",\"繦\",\"縻\",\"縵\",\"縹\",\"繃\",\"縷\",\"縲\",\"縺\",\"繧\",\"繝\",\"繖\",\"繞\",\"繙\",\"繚\",\"繹\",\"繪\",\"繩\",\"繼\",\"繻\",\"纃\",\"緕\",\"繽\",\"辮\",\"繿\",\"纈\",\"纉\",\"續\",\"纒\",\"纐\",\"纓\",\"纔\",\"纖\",\"纎\",\"纛\",\"纜\",\"缸\",\"缺\",\"罅\",\"罌\",\"罍\",\"罎\",\"罐\",\"网\",\"罕\",\"罔\",\"罘\",\"罟\",\"罠\",\"罨\",\"罩\",\"罧\",\"罸\",\"羂\",\"羆\",\"羃\",\"羈\",\"羇\",\"羌\",\"羔\",\"羞\",\"羝\",\"羚\",\"羣\",\"羯\",\"羲\",\"羹\",\"羮\",\"羶\",\"羸\",\"譱\",\"翅\",\"翆\",\"翊\",\"翕\",\"翔\",\"翡\",\"翦\",\"翩\",\"翳\",\"翹\",\"飜\",\"耆\",\"耄\",\"耋\",\"耒\",\"耘\",\"耙\",\"耜\",\"耡\",\"耨\",\"耿\",\"耻\",\"聊\",\"聆\",\"聒\",\"聘\",\"聚\",\"聟\",\"聢\",\"聨\",\"聳\",\"聲\",\"聰\",\"聶\",\"聹\",\"聽\",\"聿\",\"肄\",\"肆\",\"肅\",\"肛\",\"肓\",\"肚\",\"肭\",\"冐\",\"肬\",\"胛\",\"胥\",\"胙\",\"胝\",\"胄\",\"胚\",\"胖\",\"脉\",\"胯\",\"胱\",\"脛\",\"脩\",\"脣\",\"脯\",\"腋\",\"隋\",\"腆\",\"脾\",\"腓\",\"腑\",\"胼\",\"腱\",\"腮\",\"腥\",\"腦\",\"腴\",\"膃\",\"膈\",\"膊\",\"膀\",\"膂\",\"膠\",\"膕\",\"膤\",\"膣\",\"腟\",\"膓\",\"膩\",\"膰\",\"膵\",\"膾\",\"膸\",\"膽\",\"臀\",\"臂\",\"膺\",\"臉\",\"臍\",\"臑\",\"臙\",\"臘\",\"臈\",\"臚\",\"臟\",\"臠\",\"臧\",\"臺\",\"臻\",\"臾\",\"舁\",\"舂\",\"舅\",\"與\",\"舊\",\"舍\",\"舐\",\"舖\",\"舩\",\"舫\",\"舸\",\"舳\",\"艀\",\"艙\",\"艘\",\"艝\",\"艚\",\"艟\",\"艤\",\"艢\",\"艨\",\"艪\",\"艫\",\"舮\",\"艱\",\"艷\",\"艸\",\"艾\",\"芍\",\"芒\",\"芫\",\"芟\",\"芻\",\"芬\",\"苡\",\"苣\",\"苟\",\"苒\",\"苴\",\"苳\",\"苺\",\"莓\",\"范\",\"苻\",\"苹\",\"苞\",\"茆\",\"苜\",\"茉\",\"苙\",\"茵\",\"茴\",\"茖\",\"茲\",\"茱\",\"荀\",\"茹\",\"荐\",\"荅\",\"茯\",\"茫\",\"茗\",\"茘\",\"莅\",\"莚\",\"莪\",\"莟\",\"莢\",\"莖\",\"茣\",\"莎\",\"莇\",\"莊\",\"荼\",\"莵\",\"荳\",\"荵\",\"莠\",\"莉\",\"莨\",\"菴\",\"萓\",\"菫\",\"菎\",\"菽\",\"萃\",\"菘\",\"萋\",\"菁\",\"菷\",\"萇\",\"菠\",\"菲\",\"萍\",\"萢\",\"萠\",\"莽\",\"萸\",\"蔆\",\"菻\",\"葭\",\"萪\",\"萼\",\"蕚\",\"蒄\",\"葷\",\"葫\",\"蒭\",\"葮\",\"蒂\",\"葩\",\"葆\",\"萬\",\"葯\",\"葹\",\"萵\",\"蓊\",\"葢\",\"蒹\",\"蒿\",\"蒟\",\"蓙\",\"蓍\",\"蒻\",\"蓚\",\"蓐\",\"蓁\",\"蓆\",\"蓖\",\"蒡\",\"蔡\",\"蓿\",\"蓴\",\"蔗\",\"蔘\",\"蔬\",\"蔟\",\"蔕\",\"蔔\",\"蓼\",\"蕀\",\"蕣\",\"蕘\",\"蕈\",\"蕁\",\"蘂\",\"蕋\",\"蕕\",\"薀\",\"薤\",\"薈\",\"薑\",\"薊\",\"薨\",\"蕭\",\"薔\",\"薛\",\"藪\",\"薇\",\"薜\",\"蕷\",\"蕾\",\"薐\",\"藉\",\"薺\",\"藏\",\"薹\",\"藐\",\"藕\",\"藝\",\"藥\",\"藜\",\"藹\",\"蘊\",\"蘓\",\"蘋\",\"藾\",\"藺\",\"蘆\",\"蘢\",\"蘚\",\"蘰\",\"蘿\",\"虍\",\"乕\",\"虔\",\"號\",\"虧\",\"虱\",\"蚓\",\"蚣\",\"蚩\",\"蚪\",\"蚋\",\"蚌\",\"蚶\",\"蚯\",\"蛄\",\"蛆\",\"蚰\",\"蛉\",\"蠣\",\"蚫\",\"蛔\",\"蛞\",\"蛩\",\"蛬\",\"蛟\",\"蛛\",\"蛯\",\"蜒\",\"蜆\",\"蜈\",\"蜀\",\"蜃\",\"蛻\",\"蜑\",\"蜉\",\"蜍\",\"蛹\",\"蜊\",\"蜴\",\"蜿\",\"蜷\",\"蜻\",\"蜥\",\"蜩\",\"蜚\",\"蝠\",\"蝟\",\"蝸\",\"蝌\",\"蝎\",\"蝴\",\"蝗\",\"蝨\",\"蝮\",\"蝙\",\"蝓\",\"蝣\",\"蝪\",\"蠅\",\"螢\",\"螟\",\"螂\",\"螯\",\"蟋\",\"螽\",\"蟀\",\"蟐\",\"雖\",\"螫\",\"蟄\",\"螳\",\"蟇\",\"蟆\",\"螻\",\"蟯\",\"蟲\",\"蟠\",\"蠏\",\"蠍\",\"蟾\",\"蟶\",\"蟷\",\"蠎\",\"蟒\",\"蠑\",\"蠖\",\"蠕\",\"蠢\",\"蠡\",\"蠱\",\"蠶\",\"蠹\",\"蠧\",\"蠻\",\"衄\",\"衂\",\"衒\",\"衙\",\"衞\",\"衢\",\"衫\",\"袁\",\"衾\",\"袞\",\"衵\",\"衽\",\"袵\",\"衲\",\"袂\",\"袗\",\"袒\",\"袮\",\"袙\",\"袢\",\"袍\",\"袤\",\"袰\",\"袿\",\"袱\",\"裃\",\"裄\",\"裔\",\"裘\",\"裙\",\"裝\",\"裹\",\"褂\",\"裼\",\"裴\",\"裨\",\"裲\",\"褄\",\"褌\",\"褊\",\"褓\",\"襃\",\"褞\",\"褥\",\"褪\",\"褫\",\"襁\",\"襄\",\"褻\",\"褶\",\"褸\",\"襌\",\"褝\",\"襠\",\"襞\",\"襦\",\"襤\",\"襭\",\"襪\",\"襯\",\"襴\",\"襷\",\"襾\",\"覃\",\"覈\",\"覊\",\"覓\",\"覘\",\"覡\",\"覩\",\"覦\",\"覬\",\"覯\",\"覲\",\"覺\",\"覽\",\"覿\",\"觀\",\"觚\",\"觜\",\"觝\",\"觧\",\"觴\",\"觸\",\"訃\",\"訖\",\"訐\",\"訌\",\"訛\",\"訝\",\"訥\",\"訶\",\"詁\",\"詛\",\"詒\",\"詆\",\"詈\",\"詼\",\"詭\",\"詬\",\"詢\",\"誅\",\"誂\",\"誄\",\"誨\",\"誡\",\"誑\",\"誥\",\"誦\",\"誚\",\"誣\",\"諄\",\"諍\",\"諂\",\"諚\",\"諫\",\"諳\",\"諧\",\"諤\",\"諱\",\"謔\",\"諠\",\"諢\",\"諷\",\"諞\",\"諛\",\"謌\",\"謇\",\"謚\",\"諡\",\"謖\",\"謐\",\"謗\",\"謠\",\"謳\",\"鞫\",\"謦\",\"謫\",\"謾\",\"謨\",\"譁\",\"譌\",\"譏\",\"譎\",\"證\",\"譖\",\"譛\",\"譚\",\"譫\",\"譟\",\"譬\",\"譯\",\"譴\",\"譽\",\"讀\",\"讌\",\"讎\",\"讒\",\"讓\",\"讖\",\"讙\",\"讚\",\"谺\",\"豁\",\"谿\",\"豈\",\"豌\",\"豎\",\"豐\",\"豕\",\"豢\",\"豬\",\"豸\",\"豺\",\"貂\",\"貉\",\"貅\",\"貊\",\"貍\",\"貎\",\"貔\",\"豼\",\"貘\",\"戝\",\"貭\",\"貪\",\"貽\",\"貲\",\"貳\",\"貮\",\"貶\",\"賈\",\"賁\",\"賤\",\"賣\",\"賚\",\"賽\",\"賺\",\"賻\",\"贄\",\"贅\",\"贊\",\"贇\",\"贏\",\"贍\",\"贐\",\"齎\",\"贓\",\"賍\",\"贔\",\"贖\",\"赧\",\"赭\",\"赱\",\"赳\",\"趁\",\"趙\",\"跂\",\"趾\",\"趺\",\"跏\",\"跚\",\"跖\",\"跌\",\"跛\",\"跋\",\"跪\",\"跫\",\"跟\",\"跣\",\"跼\",\"踈\",\"踉\",\"跿\",\"踝\",\"踞\",\"踐\",\"踟\",\"蹂\",\"踵\",\"踰\",\"踴\",\"蹊\",\"蹇\",\"蹉\",\"蹌\",\"蹐\",\"蹈\",\"蹙\",\"蹤\",\"蹠\",\"踪\",\"蹣\",\"蹕\",\"蹶\",\"蹲\",\"蹼\",\"躁\",\"躇\",\"躅\",\"躄\",\"躋\",\"躊\",\"躓\",\"躑\",\"躔\",\"躙\",\"躪\",\"躡\",\"躬\",\"躰\",\"軆\",\"躱\",\"躾\",\"軅\",\"軈\",\"軋\",\"軛\",\"軣\",\"軼\",\"軻\",\"軫\",\"軾\",\"輊\",\"輅\",\"輕\",\"輒\",\"輙\",\"輓\",\"輜\",\"輟\",\"輛\",\"輌\",\"輦\",\"輳\",\"輻\",\"輹\",\"轅\",\"轂\",\"輾\",\"轌\",\"轉\",\"轆\",\"轎\",\"轗\",\"轜\",\"轢\",\"轣\",\"轤\",\"辜\",\"辟\",\"辣\",\"辭\",\"辯\",\"辷\",\"迚\",\"迥\",\"迢\",\"迪\",\"迯\",\"邇\",\"迴\",\"逅\",\"迹\",\"迺\",\"逑\",\"逕\",\"逡\",\"逍\",\"逞\",\"逖\",\"逋\",\"逧\",\"逶\",\"逵\",\"逹\",\"迸\",\"遏\",\"遐\",\"遑\",\"遒\",\"逎\",\"遉\",\"逾\",\"遖\",\"遘\",\"遞\",\"遨\",\"遯\",\"遶\",\"隨\",\"遲\",\"邂\",\"遽\",\"邁\",\"邀\",\"邊\",\"邉\",\"邏\",\"邨\",\"邯\",\"邱\",\"邵\",\"郢\",\"郤\",\"扈\",\"郛\",\"鄂\",\"鄒\",\"鄙\",\"鄲\",\"鄰\",\"酊\",\"酖\",\"酘\",\"酣\",\"酥\",\"酩\",\"酳\",\"酲\",\"醋\",\"醉\",\"醂\",\"醢\",\"醫\",\"醯\",\"醪\",\"醵\",\"醴\",\"醺\",\"釀\",\"釁\",\"釉\",\"釋\",\"釐\",\"釖\",\"釟\",\"釡\",\"釛\",\"釼\",\"釵\",\"釶\",\"鈞\",\"釿\",\"鈔\",\"鈬\",\"鈕\",\"鈑\",\"鉞\",\"鉗\",\"鉅\",\"鉉\",\"鉤\",\"鉈\",\"銕\",\"鈿\",\"鉋\",\"鉐\",\"銜\",\"銖\",\"銓\",\"銛\",\"鉚\",\"鋏\",\"銹\",\"銷\",\"鋩\",\"錏\",\"鋺\",\"鍄\",\"錮\",\"錙\",\"錢\",\"錚\",\"錣\",\"錺\",\"錵\",\"錻\",\"鍜\",\"鍠\",\"鍼\",\"鍮\",\"鍖\",\"鎰\",\"鎬\",\"鎭\",\"鎔\",\"鎹\",\"鏖\",\"鏗\",\"鏨\",\"鏥\",\"鏘\",\"鏃\",\"鏝\",\"鏐\",\"鏈\",\"鏤\",\"鐚\",\"鐔\",\"鐓\",\"鐃\",\"鐇\",\"鐐\",\"鐶\",\"鐫\",\"鐵\",\"鐡\",\"鐺\",\"鑁\",\"鑒\",\"鑄\",\"鑛\",\"鑠\",\"鑢\",\"鑞\",\"鑪\",\"鈩\",\"鑰\",\"鑵\",\"鑷\",\"鑽\",\"鑚\",\"鑼\",\"鑾\",\"钁\",\"鑿\",\"閂\",\"閇\",\"閊\",\"閔\",\"閖\",\"閘\",\"閙\",\"閠\",\"閨\",\"閧\",\"閭\",\"閼\",\"閻\",\"閹\",\"閾\",\"闊\",\"濶\",\"闃\",\"闍\",\"闌\",\"闕\",\"闔\",\"闖\",\"關\",\"闡\",\"闥\",\"闢\",\"阡\",\"阨\",\"阮\",\"阯\",\"陂\",\"陌\",\"陏\",\"陋\",\"陷\",\"陜\",\"陞\",\"陝\",\"陟\",\"陦\",\"陲\",\"陬\",\"隍\",\"隘\",\"隕\",\"隗\",\"險\",\"隧\",\"隱\",\"隲\",\"隰\",\"隴\",\"隶\",\"隸\",\"隹\",\"雎\",\"雋\",\"雉\",\"雍\",\"襍\",\"雜\",\"霍\",\"雕\",\"雹\",\"霄\",\"霆\",\"霈\",\"霓\",\"霎\",\"霑\",\"霏\",\"霖\",\"霙\",\"霤\",\"霪\",\"霰\",\"霹\",\"霽\",\"霾\",\"靄\",\"靆\",\"靈\",\"靂\",\"靉\",\"靜\",\"靠\",\"靤\",\"靦\",\"靨\",\"勒\",\"靫\",\"靱\",\"靹\",\"鞅\",\"靼\",\"鞁\",\"靺\",\"鞆\",\"鞋\",\"鞏\",\"鞐\",\"鞜\",\"鞨\",\"鞦\",\"鞣\",\"鞳\",\"鞴\",\"韃\",\"韆\",\"韈\",\"韋\",\"韜\",\"韭\",\"齏\",\"韲\",\"竟\",\"韶\",\"韵\",\"頏\",\"頌\",\"頸\",\"頤\",\"頡\",\"頷\",\"頽\",\"顆\",\"顏\",\"顋\",\"顫\",\"顯\",\"顰\",\"顱\",\"顴\",\"顳\",\"颪\",\"颯\",\"颱\",\"颶\",\"飄\",\"飃\",\"飆\",\"飩\",\"飫\",\"餃\",\"餉\",\"餒\",\"餔\",\"餘\",\"餡\",\"餝\",\"餞\",\"餤\",\"餠\",\"餬\",\"餮\",\"餽\",\"餾\",\"饂\",\"饉\",\"饅\",\"饐\",\"饋\",\"饑\",\"饒\",\"饌\",\"饕\",\"馗\",\"馘\",\"馥\",\"馭\",\"馮\",\"馼\",\"駟\",\"駛\",\"駝\",\"駘\",\"駑\",\"駭\",\"駮\",\"駱\",\"駲\",\"駻\",\"駸\",\"騁\",\"騏\",\"騅\",\"駢\",\"騙\",\"騫\",\"騷\",\"驅\",\"驂\",\"驀\",\"驃\",\"騾\",\"驕\",\"驍\",\"驛\",\"驗\",\"驟\",\"驢\",\"驥\",\"驤\",\"驩\",\"驫\",\"驪\",\"骭\",\"骰\",\"骼\",\"髀\",\"髏\",\"髑\",\"髓\",\"體\",\"髞\",\"髟\",\"髢\",\"髣\",\"髦\",\"髯\",\"髫\",\"髮\",\"髴\",\"髱\",\"髷\",\"髻\",\"鬆\",\"鬘\",\"鬚\",\"鬟\",\"鬢\",\"鬣\",\"鬥\",\"鬧\",\"鬨\",\"鬩\",\"鬪\",\"鬮\",\"鬯\",\"鬲\",\"魄\",\"魃\",\"魏\",\"魍\",\"魎\",\"魑\",\"魘\",\"魴\",\"鮓\",\"鮃\",\"鮑\",\"鮖\",\"鮗\",\"鮟\",\"鮠\",\"鮨\",\"鮴\",\"鯀\",\"鯊\",\"鮹\",\"鯆\",\"鯏\",\"鯑\",\"鯒\",\"鯣\",\"鯢\",\"鯤\",\"鯔\",\"鯡\",\"鰺\",\"鯲\",\"鯱\",\"鯰\",\"鰕\",\"鰔\",\"鰉\",\"鰓\",\"鰌\",\"鰆\",\"鰈\",\"鰒\",\"鰊\",\"鰄\",\"鰮\",\"鰛\",\"鰥\",\"鰤\",\"鰡\",\"鰰\",\"鱇\",\"鰲\",\"鱆\",\"鰾\",\"鱚\",\"鱠\",\"鱧\",\"鱶\",\"鱸\",\"鳧\",\"鳬\",\"鳰\",\"鴉\",\"鴈\",\"鳫\",\"鴃\",\"鴆\",\"鴪\",\"鴦\",\"鶯\",\"鴣\",\"鴟\",\"鵄\",\"鴕\",\"鴒\",\"鵁\",\"鴿\",\"鴾\",\"鵆\",\"鵈\",\"鵝\",\"鵞\",\"鵤\",\"鵑\",\"鵐\",\"鵙\",\"鵲\",\"鶉\",\"鶇\",\"鶫\",\"鵯\",\"鵺\",\"鶚\",\"鶤\",\"鶩\",\"鶲\",\"鷄\",\"鷁\",\"鶻\",\"鶸\",\"鶺\",\"鷆\",\"鷏\",\"鷂\",\"鷙\",\"鷓\",\"鷸\",\"鷦\",\"鷭\",\"鷯\",\"鷽\",\"鸚\",\"鸛\",\"鸞\",\"鹵\",\"鹹\",\"鹽\",\"麁\",\"麈\",\"麋\",\"麌\",\"麒\",\"麕\",\"麑\",\"麝\",\"麥\",\"麩\",\"麸\",\"麪\",\"麭\",\"靡\",\"黌\",\"黎\",\"黏\",\"黐\",\"黔\",\"黜\",\"點\",\"黝\",\"黠\",\"黥\",\"黨\",\"黯\",\"黴\",\"黶\",\"黷\",\"黹\",\"黻\",\"黼\",\"黽\",\"鼇\",\"鼈\",\"皷\",\"鼕\",\"鼡\",\"鼬\",\"鼾\",\"齊\",\"齒\",\"齔\",\"齣\",\"齟\",\"齠\",\"齡\",\"齦\",\"齧\",\"齬\",\"齪\",\"齷\",\"齲\",\"齶\",\"龕\",\"龜\",\"龠\",\"堯\",\"槇\",\"遙\",\"瑤\",\"凜\",\"熙\",\"噓\",\"巢\",\"帔\",\"帘\",\"幘\",\"幞\",\"庾\",\"廊\",\"廋\",\"廹\",\"开\",\"异\",\"弇\",\"弝\",\"弣\",\"弴\",\"弶\",\"弽\",\"彀\",\"彅\",\"彔\",\"彘\",\"彤\",\"彧\",\"彽\",\"徉\",\"徜\",\"徧\",\"徯\",\"徵\",\"德\",\"忉\",\"忞\",\"忡\",\"忩\",\"怍\",\"怔\",\"怘\",\"怳\",\"怵\",\"恇\",\"悔\",\"悝\",\"悞\",\"惋\",\"惔\",\"惕\",\"惝\",\"惸\",\"愜\",\"愫\",\"愰\",\"愷\",\"慨\",\"憍\",\"憎\",\"憼\",\"憹\",\"懲\",\"戢\",\"戾\",\"扃\",\"扖\",\"扚\",\"扯\",\"抅\",\"拄\",\"拖\",\"拼\",\"挊\",\"挘\",\"挹\",\"捃\",\"捥\",\"捼\",\"揥\",\"揭\",\"揵\",\"搐\",\"搔\",\"搢\",\"摹\",\"摑\",\"摠\",\"摭\",\"擎\",\"撾\",\"撿\",\"㐂\",\"𠅘\",\"份\",\"仿\",\"侚\",\"俉\",\"傜\",\"儞\",\"冼\",\"㔟\",\"匇\",\"卡\",\"卬\",\"詹\",\"𠮷\",\"呍\",\"咖\",\"咜\",\"咩\",\"唎\",\"啊\",\"噲\",\"囤\",\"圳\",\"圴\",\"塚\",\"墀\",\"姤\",\"娣\",\"婕\",\"寬\",\"﨑\",\"㟢\",\"庬\",\"弴\",\"彅\",\"德\",\"怗\",\"恵\",\"愰\",\"昤\",\"曈\",\"曙\",\"曺\",\"曻\",\"桒\",\"鿄\",\"椑\",\"椻\",\"橅\",\"檑\",\"櫛\",\"𣏌\",\"𣏾\",\"𣗄\",\"毱\",\"泠\",\"洮\",\"海\",\"涿\",\"淊\",\"淸\",\"渚\",\"潞\",\"濹\",\"灤\",\"𤋮\",\"𤋮\",\"煇\",\"燁\",\"爀\",\"玟\",\"玨\",\"珉\",\"珖\",\"琛\",\"琡\",\"琢\",\"琦\",\"琪\",\"琬\",\"琹\",\"瑋\",\"㻚\",\"畵\",\"疁\",\"睲\",\"䂓\",\"磈\",\"磠\",\"祇\",\"禮\",\"鿆\",\"䄃\",\"鿅\",\"秚\",\"稞\",\"筿\",\"簱\",\"䉤\",\"綋\",\"羡\",\"脘\",\"脺\",\"舘\",\"芮\",\"葛\",\"蓜\",\"蓬\",\"蕙\",\"藎\",\"蝕\",\"蟬\",\"蠋\",\"裵\",\"角\",\"諶\",\"跎\",\"辻\",\"迶\",\"郝\",\"鄧\",\"鄭\",\"醲\",\"鈳\",\"銈\",\"錡\",\"鍈\",\"閒\",\"雞\",\"餃\",\"饀\",\"髙\",\"鯖\",\"鷗\",\"麴\",\"麵\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"⛌\",\"⛍\",\"❗\",\"⛏\",\"⛐\",\"⛑\",\"\",\"⛒\",\"⛕\",\"⛓\",\"⛔\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"⛖\",\"⛗\",\"⛘\",\"⛙\",\"⛚\",\"⛛\",\"⛜\",\"⛝\",\"⛞\",\"⛟\",\"⛠\",\"⛡\",\"⭕\",\"㉈\",\"㉉\",\"㉊\",\"㉋\",\"㉌\",\"㉍\",\"㉎\",\"㉏\",\"\",\"\",\"\",\"\",\"⒑\",\"⒒\",\"⒓\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"⬛\",\"⬤\",\"\",\"\",\"\",\"\",\"\",\"⚿\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"㊙\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"⛣\",\"⭖\",\"⭗\",\"⭘\",\"⭙\",\"☓\",\"㊋\",\"〒\",\"⛨\",\"㉆\",\"㉅\",\"⛩\",\"࿖\",\"⛪\",\"⛫\",\"⛬\",\"♨\",\"⛭\",\"⛮\",\"⛯\",\"⚓\",\"✈\",\"⛰\",\"⛱\",\"⛲\",\"⛳\",\"⛴\",\"⛵\",\"\",\"Ⓓ\",\"Ⓢ\",\"⛶\",\"\",\"\",\"\",\"\",\"\",\"⛷\",\"⛸\",\"⛹\",\"⛺\",\"\",\"☎\",\"⛻\",\"⛼\",\"⛽\",\"⛾\",\"\",\"⛿\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"➡\",\"⬅\",\"⬆\",\"⬇\",\"⬯\",\"⬮\",\"年\",\"月\",\"日\",\"円\",\"㎡\",\"㎥\",\"㎝\",\"㎠\",\"㎤\",\"\",\"⒈\",\"⒉\",\"⒊\",\"⒋\",\"⒌\",\"⒍\",\"⒎\",\"⒏\",\"⒐\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"㈳\",\"㈶\",\"㈲\",\"㈱\",\"㈹\",\"㉄\",\"▶\",\"◀\",\"〖\",\"〗\",\"⟐\",\"²\",\"³\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"㉇\",\"\",\"\",\"℻\",\"\",\"\",\"\",\"㈪\",\"㈫\",\"㈬\",\"㈭\",\"㈮\",\"㈯\",\"㈰\",\"㈷\",\"㍾\",\"㍽\",\"㍼\",\"㍻\",\"№\",\"℡\",\"〶\",\"⚾\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"ℓ\",\"㎏\",\"㎐\",\"㏊\",\"㎞\",\"㎢\",\"㍱\",\"\",\"\",\"½\",\"↉\",\"⅓\",\"⅔\",\"¼\",\"¾\",\"⅕\",\"⅖\",\"⅗\",\"⅘\",\"⅙\",\"⅚\",\"⅐\",\"⅛\",\"⅑\",\"⅒\",\"☀\",\"☁\",\"☂\",\"⛄\",\"☖\",\"☗\",\"⛉\",\"⛊\",\"♦\",\"♥\",\"♣\",\"♠\",\"⛋\",\"⨀\",\"‼\",\"⁉\",\"⛅\",\"☔\",\"⛆\",\"☃\",\"⛇\",\"⚡\",\"⛈\",\"\",\"⚞\",\"⚟\",\"♬\",\"☎\",\"\",\"\",\"\",\"Ⅰ\",\"Ⅱ\",\"Ⅲ\",\"Ⅳ\",\"Ⅴ\",\"Ⅵ\",\"Ⅶ\",\"Ⅷ\",\"Ⅸ\",\"Ⅹ\",\"Ⅺ\",\"Ⅻ\",\"⑰\",\"⑱\",\"⑲\",\"⑳\",\"⑴\",\"⑵\",\"⑶\",\"⑷\",\"⑸\",\"⑹\",\"⑺\",\"⑻\",\"⑼\",\"⑽\",\"⑾\",\"⑿\",\"㉑\",\"㉒\",\"㉓\",\"㉔\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"㉕\",\"㉖\",\"㉗\",\"㉘\",\"㉙\",\"㉚\",\"①\",\"②\",\"③\",\"④\",\"⑤\",\"⑥\",\"⑦\",\"⑧\",\"⑨\",\"⑩\",\"⑪\",\"⑫\",\"⑬\",\"⑭\",\"⑮\",\"⑯\",\"❶\",\"❷\",\"❸\",\"❹\",\"❺\",\"❻\",\"❼\",\"❽\",\"❾\",\"❿\",\"⓫\",\"⓬\",\"㉛\",\"\"],p=[\"㐂\",\"\",\"份\",\"仿\",\"侚\",\"俉\",\"傜\",\"儞\",\"冼\",\"㔟\",\"匇\",\"卡\",\"卬\",\"詹\",\"\",\"呍\",\"咖\",\"咜\",\"咩\",\"唎\",\"啊\",\"噲\",\"囤\",\"圳\",\"圴\",\"塚\",\"墀\",\"姤\",\"娣\",\"婕\",\"寬\",\"﨑\",\"㟢\",\"庬\",\"弴\",\"彅\",\"德\",\"怗\",\"恵\",\"愰\",\"昤\",\"曈\",\"曙\",\"曺\",\"曻\",\"桒\",\"鿄\",\"椑\",\"椻\",\"橅\",\"檑\",\"櫛\",\"\",\"\",\"\",\"毱\",\"泠\",\"洮\",\"海\",\"涿\",\"淊\",\"淸\",\"渚\",\"潞\",\"濹\",\"灤\",\"𤋮\",\"\",\"煇\",\"燁\",\"爀\",\"玟\",\"玨\",\"珉\",\"珖\",\"琛\",\"琡\",\"琢\",\"琦\",\"琪\",\"琬\",\"琹\",\"瑋\",\"㻚\",\"畵\",\"疁\",\"睲\",\"䂓\",\"磈\",\"磠\",\"祇\",\"禮\",\"鿆\",\"䄃\",\"鿅\",\"秚\",\"稞\",\"筿\",\"簱\",\"䉤\",\"綋\",\"羡\",\"脘\",\"脺\",\"舘\",\"芮\",\"葛\",\"蓜\",\"蓬\",\"蕙\",\"藎\",\"蝕\",\"蟬\",\"蠋\",\"裵\",\"角\",\"諶\",\"跎\",\"辻\",\"迶\",\"郝\",\"鄧\",\"鄭\",\"醲\",\"鈳\",\"銈\",\"錡\",\"鍈\",\"閒\",\"雞\",\"餃\",\"饀\",\"髙\",\"鯖\",\"鷗\",\"麴\",\"麵\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"⛌\",\"⛍\",\"❗\",\"⛏\",\"⛐\",\"⛑\",\"\",\"⛒\",\"⛕\",\"⛓\",\"⛔\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"⛖\",\"⛗\",\"⛘\",\"⛙\",\"⛚\",\"⛛\",\"⛜\",\"⛝\",\"⛞\",\"⛟\",\"⛠\",\"⛡\",\"⭕\",\"㉈\",\"㉉\",\"㉊\",\"㉋\",\"㉌\",\"㉍\",\"㉎\",\"㉏\",\"\",\"\",\"\",\"\",\"⒑\",\"⒒\",\"⒓\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"⬛\",\"⬤\",\"\",\"\",\"\",\"\",\"\",\"⚿\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"㊙\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"⛣\",\"⭖\",\"⭗\",\"⭘\",\"⭙\",\"☓\",\"㊋\",\"〒\",\"⛨\",\"㉆\",\"㉅\",\"⛩\",\"࿖\",\"⛪\",\"⛫\",\"⛬\",\"♨\",\"⛭\",\"⛮\",\"⛯\",\"⚓\",\"✈\",\"⛰\",\"⛱\",\"⛲\",\"⛳\",\"⛴\",\"⛵\",\"\",\"Ⓓ\",\"Ⓢ\",\"⛶\",\"\",\"\",\"\",\"\",\"\",\"⛷\",\"⛸\",\"⛹\",\"⛺\",\"\",\"☎\",\"⛻\",\"⛼\",\"⛽\",\"⛾\",\"\",\"⛿\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"➡\",\"⬅\",\"⬆\",\"⬇\",\"⬯\",\"⬮\",\"年\",\"月\",\"日\",\"円\",\"㎡\",\"㎥\",\"㎝\",\"㎠\",\"㎤\",\"\",\"⒈\",\"⒉\",\"⒊\",\"⒋\",\"⒌\",\"⒍\",\"⒎\",\"⒏\",\"⒐\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"㈳\",\"㈶\",\"㈲\",\"㈱\",\"㈹\",\"㉄\",\"▶\",\"◀\",\"〖\",\"〗\",\"⟐\",\"²\",\"³\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"㉇\",\"\",\"\",\"℻\",\"\",\"\",\"\",\"㈪\",\"㈫\",\"㈬\",\"㈭\",\"㈮\",\"㈯\",\"㈰\",\"㈷\",\"㍾\",\"㍽\",\"㍼\",\"㍻\",\"№\",\"℡\",\"〶\",\"⚾\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"ℓ\",\"㎏\",\"㎐\",\"㏊\",\"㎞\",\"㎢\",\"㍱\",\"\",\"\",\"½\",\"↉\",\"⅓\",\"⅔\",\"¼\",\"¾\",\"⅕\",\"⅖\",\"⅗\",\"⅘\",\"⅙\",\"⅚\",\"⅐\",\"⅛\",\"⅑\",\"⅒\",\"☀\",\"☁\",\"☂\",\"⛄\",\"☖\",\"☗\",\"⛉\",\"⛊\",\"♦\",\"♥\",\"♣\",\"♠\",\"⛋\",\"⨀\",\"‼\",\"⁉\",\"⛅\",\"☔\",\"⛆\",\"☃\",\"⛇\",\"⚡\",\"⛈\",\"\",\"⚞\",\"⚟\",\"♬\",\"☎\",\"\",\"\",\"\",\"Ⅰ\",\"Ⅱ\",\"Ⅲ\",\"Ⅳ\",\"Ⅴ\",\"Ⅵ\",\"Ⅶ\",\"Ⅷ\",\"Ⅸ\",\"Ⅹ\",\"Ⅺ\",\"Ⅻ\",\"⑰\",\"⑱\",\"⑲\",\"⑳\",\"⑴\",\"⑵\",\"⑶\",\"⑷\",\"⑸\",\"⑹\",\"⑺\",\"⑻\",\"⑼\",\"⑽\",\"⑾\",\"⑿\",\"㉑\",\"㉒\",\"㉓\",\"㉔\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"㉕\",\"㉖\",\"㉗\",\"㉘\",\"㉙\",\"㉚\",\"①\",\"②\",\"③\",\"④\",\"⑤\",\"⑥\",\"⑦\",\"⑧\",\"⑨\",\"⑩\",\"⑪\",\"⑫\",\"⑬\",\"⑭\",\"⑮\",\"⑯\",\"❶\",\"❷\",\"❸\",\"❹\",\"❺\",\"❻\",\"❼\",\"❽\",\"❾\",\"❿\",\"⓫\",\"⓬\",\"㉛\",\"\"],c=[\"㐂\",\"𠅘\",\"份\",\"仿\",\"侚\",\"俉\",\"傜\",\"儞\",\"冼\",\"㔟\",\"匇\",\"卡\",\"卬\",\"詹\",\"𠮷\",\"呍\",\"咖\",\"咜\",\"咩\",\"唎\",\"啊\",\"噲\",\"囤\",\"圳\",\"圴\",\"塚\",\"墀\",\"姤\",\"娣\",\"婕\",\"寬\",\"﨑\",\"㟢\",\"庬\",\"弴\",\"彅\",\"德\",\"怗\",\"恵\",\"愰\",\"昤\",\"曈\",\"曙\",\"曺\",\"曻\",\"桒\",\"鿄\",\"椑\",\"椻\",\"橅\",\"檑\",\"櫛\",\"𣏌\",\"𣏾\",\"𣗄\",\"毱\",\"泠\",\"洮\",\"海\",\"涿\",\"淊\",\"淸\",\"渚\",\"潞\",\"濹\",\"灤\",\"𤋮\",\"𤋮\",\"煇\",\"燁\",\"爀\",\"玟\",\"玨\",\"珉\",\"珖\",\"琛\",\"琡\",\"琢\",\"琦\",\"琪\",\"琬\",\"琹\",\"瑋\",\"㻚\",\"畵\",\"疁\",\"睲\",\"䂓\",\"磈\",\"磠\",\"祇\",\"禮\",\"鿆\",\"䄃\",\"鿅\",\"秚\",\"稞\",\"筿\",\"簱\",\"䉤\",\"綋\",\"羡\",\"脘\",\"脺\",\"舘\",\"芮\",\"葛\",\"蓜\",\"蓬\",\"蕙\",\"藎\",\"蝕\",\"蟬\",\"蠋\",\"裵\",\"角\",\"諶\",\"跎\",\"辻\",\"迶\",\"郝\",\"鄧\",\"鄭\",\"醲\",\"鈳\",\"銈\",\"錡\",\"鍈\",\"閒\",\"雞\",\"餃\",\"饀\",\"髙\",\"鯖\",\"鷗\",\"麴\",\"麵\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"⛌\",\"⛍\",\"❗\",\"⛏\",\"⛐\",\"⛑\",\"\",\"⛒\",\"⛕\",\"⛓\",\"⛔\",\"\",\"\",\"\",\"\",\"🅿\",\"🆊\",\"\",\"\",\"⛖\",\"⛗\",\"⛘\",\"⛙\",\"⛚\",\"⛛\",\"⛜\",\"⛝\",\"⛞\",\"⛟\",\"⛠\",\"⛡\",\"⭕\",\"㉈\",\"㉉\",\"㉊\",\"㉋\",\"㉌\",\"㉍\",\"㉎\",\"㉏\",\"\",\"\",\"\",\"\",\"⒑\",\"⒒\",\"⒓\",\"🅊\",\"🅌\",\"🄿\",\"🅆\",\"🅋\",\"🈐\",\"🈑\",\"🈒\",\"🈓\",\"🅂\",\"🈔\",\"🈕\",\"🈖\",\"🅍\",\"🄱\",\"🄽\",\"⬛\",\"⬤\",\"🈗\",\"🈘\",\"🈙\",\"🈚\",\"🈛\",\"⚿\",\"🈜\",\"🈝\",\"🈞\",\"🈟\",\"🈠\",\"🈡\",\"🈢\",\"🈣\",\"🈤\",\"🈥\",\"🅎\",\"㊙\",\"🈀\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"⛣\",\"⭖\",\"⭗\",\"⭘\",\"⭙\",\"☓\",\"㊋\",\"〒\",\"⛨\",\"㉆\",\"㉅\",\"⛩\",\"࿖\",\"⛪\",\"⛫\",\"⛬\",\"♨\",\"⛭\",\"⛮\",\"⛯\",\"⚓\",\"✈\",\"⛰\",\"⛱\",\"⛲\",\"⛳\",\"⛴\",\"⛵\",\"🅗\",\"Ⓓ\",\"Ⓢ\",\"⛶\",\"🅟\",\"🆋\",\"🆍\",\"🆌\",\"🅹\",\"⛷\",\"⛸\",\"⛹\",\"⛺\",\"🅻\",\"☎\",\"⛻\",\"⛼\",\"⛽\",\"⛾\",\"🅼\",\"⛿\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"➡\",\"⬅\",\"⬆\",\"⬇\",\"⬯\",\"⬮\",\"年\",\"月\",\"日\",\"円\",\"㎡\",\"㎥\",\"㎝\",\"㎠\",\"㎤\",\"🄀\",\"⒈\",\"⒉\",\"⒊\",\"⒋\",\"⒌\",\"⒍\",\"⒎\",\"⒏\",\"⒐\",\"\",\"\",\"\",\"\",\"\",\"\",\"🄁\",\"🄂\",\"🄃\",\"🄄\",\"🄅\",\"🄆\",\"🄇\",\"🄈\",\"🄉\",\"🄊\",\"㈳\",\"㈶\",\"㈲\",\"㈱\",\"㈹\",\"㉄\",\"▶\",\"◀\",\"〖\",\"〗\",\"⟐\",\"²\",\"³\",\"🄭\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"🄬\",\"🄫\",\"㉇\",\"🆐\",\"🈦\",\"℻\",\"\",\"\",\"\",\"㈪\",\"㈫\",\"㈬\",\"㈭\",\"㈮\",\"㈯\",\"㈰\",\"㈷\",\"㍾\",\"㍽\",\"㍼\",\"㍻\",\"№\",\"℡\",\"〶\",\"⚾\",\"🉀\",\"🉁\",\"🉂\",\"🉃\",\"🉄\",\"🉅\",\"🉆\",\"🉇\",\"🉈\",\"🄪\",\"🈧\",\"🈨\",\"🈩\",\"🈔\",\"🈪\",\"🈫\",\"🈬\",\"🈭\",\"🈮\",\"🈯\",\"🈰\",\"🈱\",\"ℓ\",\"㎏\",\"㎐\",\"㏊\",\"㎞\",\"㎢\",\"㍱\",\"\",\"\",\"½\",\"↉\",\"⅓\",\"⅔\",\"¼\",\"¾\",\"⅕\",\"⅖\",\"⅗\",\"⅘\",\"⅙\",\"⅚\",\"⅐\",\"⅛\",\"⅑\",\"⅒\",\"☀\",\"☁\",\"☂\",\"⛄\",\"☖\",\"☗\",\"⛉\",\"⛊\",\"♦\",\"♥\",\"♣\",\"♠\",\"⛋\",\"⨀\",\"‼\",\"⁉\",\"⛅\",\"☔\",\"⛆\",\"☃\",\"⛇\",\"⚡\",\"⛈\",\"\",\"⚞\",\"⚟\",\"♬\",\"☎\",\"\",\"\",\"\",\"Ⅰ\",\"Ⅱ\",\"Ⅲ\",\"Ⅳ\",\"Ⅴ\",\"Ⅵ\",\"Ⅶ\",\"Ⅷ\",\"Ⅸ\",\"Ⅹ\",\"Ⅺ\",\"Ⅻ\",\"⑰\",\"⑱\",\"⑲\",\"⑳\",\"⑴\",\"⑵\",\"⑶\",\"⑷\",\"⑸\",\"⑹\",\"⑺\",\"⑻\",\"⑼\",\"⑽\",\"⑾\",\"⑿\",\"㉑\",\"㉒\",\"㉓\",\"㉔\",\"🄐\",\"🄑\",\"🄒\",\"🄓\",\"🄔\",\"🄕\",\"🄖\",\"🄗\",\"🄘\",\"🄙\",\"🄚\",\"🄛\",\"🄜\",\"🄝\",\"🄞\",\"🄟\",\"🄠\",\"🄡\",\"🄢\",\"🄣\",\"🄤\",\"🄥\",\"🄦\",\"🄧\",\"🄨\",\"🄩\",\"㉕\",\"㉖\",\"㉗\",\"㉘\",\"㉙\",\"㉚\",\"①\",\"②\",\"③\",\"④\",\"⑤\",\"⑥\",\"⑦\",\"⑧\",\"⑨\",\"⑩\",\"⑪\",\"⑫\",\"⑬\",\"⑭\",\"⑮\",\"⑯\",\"❶\",\"❷\",\"❸\",\"❹\",\"❺\",\"❻\",\"❼\",\"❽\",\"❾\",\"❿\",\"⓫\",\"⓬\",\"㉛\",\"\"],h=[\"！\",\"＂\",\"＃\",\"＄\",\"％\",\"＆\",\"＇\",\"（\",\"）\",\"＊\",\"＋\",\"，\",\"－\",\"．\",\"／\",\"０\",\"１\",\"２\",\"３\",\"４\",\"５\",\"６\",\"７\",\"８\",\"９\",\"：\",\"；\",\"＜\",\"＝\",\"＞\",\"？\",\"＠\",\"Ａ\",\"Ｂ\",\"Ｃ\",\"Ｄ\",\"Ｅ\",\"Ｆ\",\"Ｇ\",\"Ｈ\",\"Ｉ\",\"Ｊ\",\"Ｋ\",\"Ｌ\",\"Ｍ\",\"Ｎ\",\"Ｏ\",\"Ｐ\",\"Ｑ\",\"Ｒ\",\"Ｓ\",\"Ｔ\",\"Ｕ\",\"Ｖ\",\"Ｗ\",\"Ｘ\",\"Ｙ\",\"Ｚ\",\"［\",\"￥\",\"］\",\"＾\",\"＿\",\"｀\",\"ａ\",\"ｂ\",\"ｃ\",\"ｄ\",\"ｅ\",\"ｆ\",\"ｇ\",\"ｈ\",\"ｉ\",\"ｊ\",\"ｋ\",\"ｌ\",\"ｍ\",\"ｎ\",\"ｏ\",\"ｐ\",\"ｑ\",\"ｒ\",\"ｓ\",\"ｔ\",\"ｕ\",\"ｖ\",\"ｗ\",\"ｘ\",\"ｙ\",\"ｚ\",\"｛\",\"｜\",\"｝\",\"～\"],u=[\"ぁ\",\"あ\",\"ぃ\",\"い\",\"ぅ\",\"う\",\"ぇ\",\"え\",\"ぉ\",\"お\",\"か\",\"が\",\"き\",\"ぎ\",\"く\",\"ぐ\",\"け\",\"げ\",\"こ\",\"ご\",\"さ\",\"ざ\",\"し\",\"じ\",\"す\",\"ず\",\"せ\",\"ぜ\",\"そ\",\"ぞ\",\"た\",\"だ\",\"ち\",\"ぢ\",\"っ\",\"つ\",\"づ\",\"て\",\"で\",\"と\",\"ど\",\"な\",\"に\",\"ぬ\",\"ね\",\"の\",\"は\",\"ば\",\"ぱ\",\"ひ\",\"び\",\"ぴ\",\"ふ\",\"ぶ\",\"ぷ\",\"へ\",\"べ\",\"ぺ\",\"ほ\",\"ぼ\",\"ぽ\",\"ま\",\"み\",\"む\",\"め\",\"も\",\"ゃ\",\"や\",\"ゅ\",\"ゆ\",\"ょ\",\"よ\",\"ら\",\"り\",\"る\",\"れ\",\"ろ\",\"ゎ\",\"わ\",\"ゐ\",\"ゑ\",\"を\",\"ん\",\"\",\"\",\"\",\"ゝ\",\"ゞ\",\"ー\",\"。\",\"「\",\"」\",\"、\",\"・\"],f=[\"ァ\",\"ア\",\"ィ\",\"イ\",\"ゥ\",\"ウ\",\"ェ\",\"エ\",\"ォ\",\"オ\",\"カ\",\"ガ\",\"キ\",\"ギ\",\"ク\",\"グ\",\"ケ\",\"ゲ\",\"コ\",\"ゴ\",\"サ\",\"ザ\",\"シ\",\"ジ\",\"ス\",\"ズ\",\"セ\",\"ゼ\",\"ソ\",\"ゾ\",\"タ\",\"ダ\",\"チ\",\"ヂ\",\"ッ\",\"ツ\",\"ヅ\",\"テ\",\"デ\",\"ト\",\"ド\",\"ナ\",\"ニ\",\"ヌ\",\"ネ\",\"ノ\",\"ハ\",\"バ\",\"パ\",\"ヒ\",\"ビ\",\"ピ\",\"フ\",\"ブ\",\"プ\",\"ヘ\",\"ベ\",\"ペ\",\"ホ\",\"ボ\",\"ポ\",\"マ\",\"ミ\",\"ム\",\"メ\",\"モ\",\"ャ\",\"ヤ\",\"ュ\",\"ユ\",\"ョ\",\"ヨ\",\"ラ\",\"リ\",\"ル\",\"レ\",\"ロ\",\"ヮ\",\"ワ\",\"ヰ\",\"ヱ\",\"ヲ\",\"ン\",\"ヴ\",\"ヵ\",\"ヶ\",\"ヽ\",\"ヾ\",\"ー\",\"。\",\"「\",\"」\",\"、\",\"・\"],A=new Map([[\"022b6f43e2a414fd68f172da202bac9a\",\"⚞\"],[\"94fb7be756372db6b62e3e0a119083d5\",\"⚞\"],[\"12aecdea283e4d07f88b9f2b740e4f86\",\"⚟\"],[\"1a563501affbf7f5baec350a108d5505\",\"⚟\"],[\"556971570f40044fa4520df3289a1cf2\",\"⚟\"],[\"65b042886a563a771aa389b12af7bca7\",\"⚟\"],[\"bbda644d17efd3c020635ee3d90968a5\",\"｟\"],[\"5063561406195ca45f5992e3f7ad77d2\",\"｟\"],[\"9d15c0395a4738936af34308acf2d032\",\"｟\"],[\"2a063edc4770b3403f060b38166a0d4d\",\"｟\"],[\"54479aa90145b4713134b78d4fb98aa5\",\"｟\"],[\"12a2c7156da32fc972b5a451bb87b813\",\"｟\"],[\"c8d428ead557285b0b7088388b22519c\",\"｟\"],[\"7160f7419cba7acdacd23cbeb4834dbe\",\"｟\"],[\"3c49616fb9bf0b9052b30e118f8857ea\",\"｟\"],[\"71c94bb6d963e47443eac448a09d22ce\",\"｟\"],[\"7ec2179107ba4c58abb6ef92e7781365\",\"｟\"],[\"2eb49bd25d7eeada006afc0864350da4\",\"｟\"],[\"a341ee7fe8a368c9737a3341f016ac70\",\"｟\"],[\"f47048d669ac8d84eeb62477e8420f89\",\"｟\"],[\"38566b372f4c5a1aead4efa20decd079\",\"｠\"],[\"d84fc83615b75802ed422eda4ba39465\",\"｠\"],[\"5bb8b7731d9473ebd7c842334dfa24f2\",\"｠\"],[\"9ffa7e00cfc7e807a161ada460b8060c\",\"｠\"],[\"a58dc0e1271b03a5981b57a83271afa7\",\"｠\"],[\"e67210b0da0161d36b79e8c9be6a9d0c\",\"｠\"],[\"08de4be9569ebd6ac01709f552ae8a65\",\"｠\"],[\"e214599903c94c532684bdf54b62df61\",\"｠\"],[\"2a83209f8a7489081890c277397df425\",\"｠\"],[\"0294d50cea5197c8c4646d2cace3e78d\",\"｠\"],[\"0b808509e4d89a2b9d02252ca85f2e34\",\"｠\"],[\"2a74d4ad7292c858dc2bb559de67f2d9\",\"｠\"],[\"8c810b8cbe6159e837a88575bb4e6033\",\"｠\"],[\"dc66317cd6fff4f4221069a20f321fce\",\"｠\"],[\"563e1633d226c10ef4ec80638997e4a9\",\"『\"],[\"0993d5cdf910f481eeefa19e4f09d77c\",\"『\"],[\"7b80a8345c16e2d4f8ff2691e245c2b1\",\"『\"],[\"016669fa94786f9581342d47f317c02c\",\"『\"],[\"01d3eb52ab29f0eecc62ff74224fffd4\",\"『\"],[\"089aa1d87915ef8ad3c43982ac657c8c\",\"『\"],[\"30e8cb69cda3ad84e87943c4351c24b7\",\"『\"],[\"385927959c2621acf57f8d40140924f8\",\"『\"],[\"2c256506f406bac4c214318f196ad5db\",\"『\"],[\"2d3912e10113e5c7bef33df3249af4a7\",\"『\"],[\"8b6444be18f269ac615643b26f9e3041\",\"『\"],[\"9c8c1ff659b439f73c65cf4766ab2f14\",\"『\"],[\"e4caa1628ad6878f14be986761e06aaa\",\"『\"],[\"e702912587801d73d58cdb30e48debed\",\"』\"],[\"d70bb2b097f44c1ddefb93bf92bbb5cd\",\"』\"],[\"f2b927267947a75b891403f95db72005\",\"』\"],[\"4ec38a1d8d22e4df6c359f00f7ad8662\",\"』\"],[\"55c9ea9aa8eb630e5ecb793b2f85c927\",\"』\"],[\"70376e1ea05a3438a19c062ad49a7960\",\"』\"],[\"8fe7cb78ca24d1973419eecf99252a88\",\"』\"],[\"9ee59c7d2c202e0214836a0138f59e24\",\"』\"],[\"b56aaf7fc68c5e206ccbc2ee1442b3af\",\"』\"],[\"ba37f6b56d8fc8980c8236de9894fa61\",\"』\"],[\"cc9fde9238a2bf78fd1c13f65b098e77\",\"』\"],[\"f02e3e84dcd71c5d3bab2b7b4b99bd7e\",\"』\"],[\"f686e0b742abe806fccbd4d9b3fcc4cd\",\"』\"],[\"37f6ecf37a0a3ef8dff083ccc8754f81\",\"♬\"],[\"3336f18e849144658f212bd9399bec5f\",\"♬\"],[\"93efdc18683d8ecacb0a920d5f2fffb3\",\"♬\"],[\"9b8325b71aa6a000d24f88c4d7ec730d\",\"♬\"],[\"ab791ef796e6b5d66f13ed9aea3e8ab2\",\"♬\"],[\"6eb29f1917caea1cadf94f5496a4c374\",\"↱\"],[\"583134b86e7d90960f64c5b863196978\",\"➡\"],[\"4ba716a88c003ca0a069392be3b63951\",\"➡\"],[\"4e0fbe47e3ba0fd5949bda53f11b16a5\",\"➡\"],[\"61ec226a927ee80fffa12db219a43233\",\"➡\"],[\"8e5b873ac8e1bf84246b281b3548c2ff\",\"↴\"],[\"a78d9b65f46654601ce0145622164b47\",\"↴\"],[\"5d01e6804b9aaec0c276f77306888c54\",\"↴\"],[\"6168af1e81b6497fccb6b8d3226a8016\",\"↴\"],[\"4360c0b7364802b680f5a65fa415bdd6\",\"↗\"],[\"4dab788480bb9ac50d2454b58438e407\",\"↗\"],[\"bfb2d58ab8c469d2b8b5c42d81e4e3b7\",\"↗\"],[\"4c503a0873195bfe8d71c9d55669781b\",\"→\"],[\"caf36eff2cf3580cd66c5cd021ee4c09\",\"→\"],[\"f00be20caf0aaef3a6fbec90a0e71852\",\"Ⅰ\"],[\"e660e1e23a6ddc9a5d2e0e1ef7ac5b86\",\"Ⅱ\"],[\"a62583f621fb5405add08e8f0beb6db4\",\"Ⅱ\"],[\"0e761ebb18b9870383725b3712f5c8d4\",\"Ⅱ\"],[\"1f65debfbf9df96de52c6f80922b012b\",\"Ⅱ\"],[\"5c13facf2da9f38922a9419061771ed0\",\"Ⅱ\"],[\"75a65cc3171c4c7ca0141042846ab91a\",\"Ⅱ\"],[\"eae94a6301787ff7bf77786ae4424601\",\"Ⅱ\"],[\"f1add7809e18e064e4609783211c9815\",\"Ⅲ\"],[\"a7ee6f7f63d348e2b8fb7ee9503f3c5c\",\"♡\"],[\"9c8cfb5e9349b06f0939605638896f4e\",\"♥\"],[\"45ce7d6d5c779136d32d3e60e13e10cd\",\"⅕\"],[\"51f5fe58aaf460263b766e990fdbe979\",\"⅕\"],[\"db40b0a65939e462396822d5ab3c6d9c\",\"⅕\"],[\"d9e3a48d5a7c6ba6f8db18f56cf91f92\",\"⅛\"],[\"86586bcdf8f14883f846849e93ca274c\",\"⅜\"],[\"9d81f46e134081d56bc92f69eebfabd9\",\"⅒\"],[\"18dddb04a4fe9b3f5c7b79e68fb8ab4b\",\"⅒\"],[\"eff8659a150859b7b69682a023b283c1\",\"⅒\"],[\"6e5ccf08b2bc815b0923df83cf9fafa1\",\"㎠\"],[\"8a77e56517a074d3d2ba426b84a07bf4\",\"㎠\"],[\"2c381a0eab014487d50f6f8bae8f0b71\",\"㎢\"],[\"9d1a36a1bec1cd2b0b0765f93c1e4f3c\",\"㎢\"],[\"e03eb00c54de790d8cc9997527fde905\",\"㎢\"],[\"3bce2a06a6a8557082543a6c90a42fe0\",\"〽\"],[\"4898c7d9fe3a8a6f9859b0e6f85a4327\",\"〽\"],[\"98ab18764756c8ca7608e17f562b21ce\",\"〽\"],[\"3037aad230d8cdae3df6e0ebedc0db79\",\"⁉\"],[\"66e3474e6cbd8e817ba0a1f8920bf4e7\",\"⁉\"],[\"4360dd96063ce1a9660cc8437e8238e3\",\"⁈\"],[\"6ce68b7e389c5169309ee956ed0c98a8\",\"⁈\"],[\"737a19289d25d963e255f3692ded6536\",\"⁈\"],[\"14b18199bbc3f4bf65b72e316bc41d3c\",\"！\"],[\"6bf58c146b692aeb403ed1f7618a060a\",\"！\"],[\"7f12b67caaf7c8c5075b444bb2a16c70\",\"！\"],[\"bfd55f4031ad80cb7401d65937b1d5d9\",\"〜\"],[\"4a61f6f7da9e6c8e373f4112cbd453cf\",\"〜\"],[\"882ded8f0bb4cdfa4ce28a0b64056d2a\",\"〜\"],[\"7726ffbf3a6e953affe6353c24ffb085\",\"〜\"],[\"0e290ec6542b5d52c972775e3d7cfeaf\",\"－\"],[\"420f1d27972d7cc83929307fbbb6dd50\",\"－\"],[\"4aa0e459273a2fe3012d7b3d2e14e07e\",\"－\"],[\"030b487ae68da1f4da98046f4fed390f\",\"一\"],[\"21699fa18fd14735a312512dfea2bff4\",\"一\"],[\"559fc240f4efe5a1e64714ce09217a3e\",\"一\"],[\"b7352c3f33a77bc9d3fbf693efbb8095\",\"一\"],[\"fcdb30a244fb6aad5255ee2d32fdf7fc\",\"一\"],[\"15a0a0fb33aacd4ce730a9503c46df5f\",\"㊙\"],[\"9dad4982bd65fbf21525261a7efdf669\",\"㊙\"],[\"c3e68e6d08d5429e28ffd6592acf4519\",\"ゔ\"],[\"f022cfe594d6f6930d7a5b994e1a0b71\",\"凜\"],[\"407057c7b7b1a91d058d572d9a9d3aa5\",\"凜\"],[\"fc85b0622183795f89111219dfbc6281\",\"凜\"],[\"9707099e5828d97eb12ff2e6ba438558\",\"凜\"],[\"987c829b62eb31f467165827766c410d\",\"凜\"],[\"58371bb195aaa7a468c5c508351ac383\",\"凜\"],[\"32324012ed7274a15002b66ed1e464f8\",\"蜻\"],[\"0ffb731db8d4a6b711f97bbb08ed8819\",\"蜻\"],[\"d90aae9a752e9b61662a9cafa837961f\",\"祓\"],[\"23d6c6f231ac5d51f4cdaaaa26701956\",\"祓\"],[\"81cbedabd8f88d4494255b0631820dfd\",\"祓\"],[\"4185f93a5571e49433ca9c13ae588f96\",\"魎\"],[\"9ab74d6e8bda8723614017a7fce587fe\",\"魎\"],[\"e96a39a050b694e5f8aadb111420b698\",\"𠮷\"],[\"08c5eb5fac4f1d362b946689eb2e4edf\",\"𠮷\"],[\"2cef7e443c22f5835658e67749ae52d1\",\"𠮷\"],[\"4ab0dd1578c8c5fa25f45938ff0f8575\",\"𠮷\"],[\"4c392bb90a1f62796f8fba2c19b4a7de\",\"𠮷\"],[\"43856fd7c04a779e571fe24c47f02a6c\",\"髙\"],[\"265efc2a174c73ea229f9ffefa703f32\",\"髙\"],[\"5a7af09cce6b3005355e1c6c82df8858\",\"髙\"],[\"808e9b858294184933f8bf45d6291572\",\"髙\"],[\"27f0c69a76bf571d6dc25db389d20779\",\"髙\"],[\"46fb250f60436fd5f33808343893ca12\",\"髙\"],[\"8a8c4c67a6094d4dc6039e5fe931159c\",\"髙\"],[\"9257f3792fcfcd21b85524d5f86f624e\",\"髙\"],[\"d502a276d6f311449597ee9e576d9217\",\"髙\"],[\"eaa49075e50fbe1fa4b7f593dfd95620\",\"髙\"],[\"c01d2bafce469da1abbb612fdb16c1e3\",\"元\"],[\"e1ce03321fdb4eaca026a49a43e521a5\",\"元\"],[\"0cfa6c95283a90eff3733db1ac80f58a\",\"元\"],[\"52c1ad5b834821dc6b85ec27bdea1f76\",\"元\"],[\"ad088cffd260c1fccb655cae17b14803\",\"元\"],[\"a9ee52eaa5b4cc32d1891d540bfe93cc\",\"塚\"],[\"a00182f1de36aaee28cac80a3c89d067\",\"塚\"],[\"b03d44ca831a0c995116056ce23f82c5\",\"塚\"],[\"2d6b7d3b5ca6c02d94c5b48661045b7a\",\"﨑\"],[\"f5c6e02e235abd23a87f48ed6a64cdcc\",\"﨑\"],[\"e9a3b055bda7b9ae70bde4003a4c5885\",\"﨑\"],[\"cb17df533b4ebd698a038defeddecf8a\",\"﨑\"],[\"0ea39c05c35f96d5b5a48e9815974132\",\"﨑\"],[\"3f642f3778827e651c8b82a4e9f06fd3\",\"﨑\"],[\"447d8358f482a4e1d9495902ebe269b1\",\"﨑\"],[\"ca59a20f1e0ee55b74db34697f961385\",\"﨑\"],[\"d2eae5651260b39c4239bcf00c8a76c5\",\"﨑\"],[\"f55eb365a9ded45d1e620f83d9f9de26\",\"﨑\"],[\"2b385c2642704e44347f2f4db147c8fa\",\"葛\"],[\"5c3a8c3a891386a771ff8f00a239b4ba\",\"葛\"],[\"e8caa78518e2d690af54e2206c9538f8\",\"彅\"],[\"2e8659ae5e220240c5f8a97147d09df6\",\"彅\"],[\"7592e633260537c1dfa7e5af1000752a\",\"彅\"],[\"a57d3f7684c28d2a901fe6020145de32\",\"彅\"],[\"da3ab2d5da4d69c7d312c7d819e45856\",\"彅\"],[\"918e84ed41c2157aa5f5bbf9aa60514c\",\"塡\"],[\"b1e889986beb3a6518d8c2ea53547b7c\",\"塡\"],[\"d449ab392afa98c27eb817c40e2eb7ce\",\"塡\"],[\"e7158075f2976c353e4cf9247aae3abc\",\"遁\"],[\"f1a6fbb17f041cc15148163da34f541f\",\"遁\"],[\"a1779a3aaf215916fd0d8fbbb5bf5925\",\"蟬\"],[\"a3c09b57be535c0f5618d72f95884c50\",\"蟬\"],[\"4b9401a9f9a58c7d0f9c86120aa2dd23\",\"鏢\"],[\"fe00b640a48dd341573cafa94afeafa2\",\"鏢\"],[\"f4e1d8b42e3c49ea7c896049186d74bd\",\"蟜\"],[\"640130a634bd2a0f4347f933a8c5d6d6\",\"蟜\"],[\"62985aeebaec69314f03ff9d3080ada2\",\"鷗\"],[\"1bd027207977c585c5889a1e24cae94e\",\"鷗\"],[\"5c8022286d3bc941c12e9bbc475255dd\",\"鷗\"],[\"e4a837fe20dfa091e03afe4857e2482e\",\"剝\"],[\"bf2cccb40b985fe3af04281944beac1a\",\"剝\"],[\"d5451a035c4e516e5ccb9372cd533d81\",\"剝\"],[\"e13ae32f28d840df74a88432df9b122e\",\"剝\"],[\"41637d181cd99088e2120a4ec6fc18aa\",\"嬴\"],[\"de63abb1aaa44e6ab8a11470103377d5\",\"嬴\"],[\"3d32b12254e01c701c195412cb8ef37c\",\"嬴\"],[\"f67bc6318ccf43e7902df9a6f9622932\",\"嬴\"],[\"d4ce6847d78fc2f8241088b5c0be795c\",\"嬴\"],[\"c472e6ade04610e67904aca1b1fa1468\",\"麃\"],[\"db3d060943fbf888eb2fa7fd87340cba\",\"麃\"],[\"509cff0edcba46d5db30b2f2f45c49c9\",\"瘣\"],[\"4862270872e35184aab420c4d38169ad\",\"瘣\"],[\"def4d364d00d0f78577987eaebd42aef\",\"齕\"],[\"3cc113a87b49ce231a7b2ffbca4c1e18\",\"齕\"],[\"03dddff25be65f7c284ef8addb8a0a8b\",\"驁\"],[\"52aa815a5a57aff03085d31acd5afbc4\",\"驁\"],[\"4f0431c4c63a6a362646758e62521df8\",\"煖\"],[\"dbf1ab17c746c48d474b3730064ba6f2\",\"煖\"],[\"790c6b4da6a88f7f4fdb6fdab77fe045\",\"煖\"],[\"4d7ae77f2bbf9c8af03d49d466f74058\",\"煖\"],[\"0335ba124be8a9e0c501f4051ac5fcf5\",\"龐\"],[\"01d7892b430fd4362c8917ad921199b2\",\"龐\"],[\"e866fd7e605c8b7c8bf718c45a5438cf\",\"龐\"],[\"5df7d88e1e15018b3bce73e765ef72d6\",\"槌\"],[\"48478e1f69ea50c6f7709d47f15b4007\",\"槌\"],[\"4d7d276f23c92f94056b292e295ebd78\",\"神\"],[\"87d2b97034cf680cd86bc7fe7c500d93\",\"神\"],[\"f6300abbfcd6bd0db3abd41041499aaa\",\"邂\"],[\"26c476496eb73e15285527ab7c635f0b\",\"邂\"],[\"be33b9008a58bab485e17de9b2ab2626\",\"逅\"],[\"3a9b8b576fe8efca2dedc957732afa37\",\"逅\"],[\"b798637262a0c1a29c8de602d4b688c6\",\"逅\"],[\"a3785fd94f13646623554b180d08ac77\",\"德\"],[\"1f81885b0996be70410e5aa3e4aab3c6\",\"德\"],[\"88425dfcbd96fcb6d77ebb76f834d986\",\"德\"],[\"9f993f913cd0614a3a965d74e0f4c8d1\",\"德\"],[\"a8bb5f2f83d975edfc951a1e461befdc\",\"德\"],[\"cd2eadbb87d0aadf1d1cd71fed0ab02f\",\"德\"],[\"d22feeb00ace0a632e1a780682f937e8\",\"德\"],[\"c9f2fda15b722253c625aebe73f4b1d9\",\"辻\"],[\"04556b37bff1ccc2f3b395232e104934\",\"辻\"],[\"117bacaeb67e3508d23a650b98f3c143\",\"辻\"],[\"211d70374c1787c4bc62df15794a4692\",\"辻\"],[\"7ba50856c59d1de19cc9c88caaced915\",\"辻\"],[\"0d627ebf7693b13645336a88813fb7e3\",\"祀\"],[\"2c3c032660b20a485575c2d8c7d47956\",\"祀\"],[\"1aaec04e53f2978bdf0a127c01b34e9a\",\"遼\"],[\"e2c3bf09b755b0d59a8a25cba6dda273\",\"遼\"],[\"fb13879ba2f93a8b0a28b2cd5358d1ee\",\"遼\"],[\"20eff1fff8d986496b949efa604ec402\",\"誾\"],[\"8742940fcbdbd65aeff1566c1889ece7\",\"誾\"],[\"23e6ef0ecc7bbe8e9465b0b40e901c0d\",\"厓\"],[\"5a69785acb47d746fd1ae98bd511db81\",\"厓\"],[\"392b8afa18046fc06398b32a42641889\",\"你\"],[\"7ff2c821d31ef0ca7e9c430f3e659d46\",\"你\"],[\"44d8b7aacbfc1fc4c32d6526ab8012ee\",\"祠\"],[\"c9486b883ab870fc02e7a1f189454f49\",\"祠\"],[\"62e7447a02f797cf287a7a758d66563b\",\"擲\"],[\"7d767d2518431dd61e631941dea6bb5e\",\"擲\"],[\"914fa35485d5016adc8b799b0cb5e978\",\"口\"],[\"d50802fc331261feed1a140f3b70c4b3\",\"口\"],[\"eeff4833bdfc34b1cbfe6a9d98f38cb5\",\"口\"],[\"a6d6aaeaf5505676111390a52fa6be51\",\"暲\"],[\"bc534a1accc68d8876e9d47ad8d4b489\",\"暲\"],[\"b5e8cb114ccad281bcb4d86768d509df\",\"銈\"],[\"d2c0ab0242ae4ad8a08bffa71613a1a7\",\"銈\"],[\"f09031463933b2892be7ebbc501269d0\",\"蕙\"],[\"f1378529fe66a7f655031d7f5b8c4eb5\",\"蕙\"],[\"6b696a5ae7634c454aaa7dd833fdfaf9\",\"眷\"],[\"5012d099f110e5e7c0df78528686ae07\",\"榮\"],[\"bf27e95238dd789b05e38d56dc41cbf7\",\"嵓\"],[\"1d2eafa6be36dc6152cb1917cd2ac486\",\"氏\"],[\"8b1bd5636f709dfd6a95da9f463729c3\",\"柀\"],[\"0b49a77f459cf3783c5bac37a80518c5\",\"份\"],[\"8d1ba0e24b619cb4d377ddb7adb3e6fa\",\"喼\"],[\"dab4c329f3c540192f758a2e0008d275\",\"鎚\"],[\"5b6c90ad3012bfbbc2450b5ab930484d\",\"翟\"],[\"7eb78d5654f8335d0b1cf4cf78872097\",\"鄭\"],[\"c3852ea003683f2866abd56140fb5d84\",\"錆\"],[\"a78b8a79d8a32c925776c82955d168cc\",\"郭\"],[\"b6e773b060fdd575bc965369d509f4e0\",\"煉\"],[\"6d981a3b846347e2b3c9ca4d13794834\",\"桒\"],[\"d0ed8ffbc229f84dd796cdd6de36d2e4\",\"䃯\"],[\"d9aff359058ab474d552ce52e5a71ec8\",\"卿\"],[\"5417381484172c1607d7ca60765b62d2\",\"蝕\"],[\"b309cd2c649ce3ef6ea0ad2f5fc655cc\",\"這\"],[\"2a349ac3d6b94a8a64d904083fdd5c02\",\"辿\"],[\"0632283bfd909ef205b1f950e2b00f16\",\"靑\"],[\"d91c5a40619510b21610f523f9434269\",\"淸\"],[\"8dc47c6e65beb788da7ed9efd59f0934\",\"買\"],[\"e28d4c57d97fbe4a0d67aec2cc92e7c8\",\"捥\"],[\"9374173a2e4b7f1dcac75eccd5ee7e7f\",\"榊\"]]),y=(i(1415),new Set([\"⛌\",\"⛍\",\"❗\",\"⛏\",\"⛐\",\"⛑\",\"⛒\",\"⛕\",\"⛓\",\"⛔\",\"\",\"\",\"⛖\",\"⛗\",\"⛘\",\"⛙\",\"⛚\",\"⛛\",\"⛜\",\"⛝\",\"⛞\",\"⛟\",\"⛠\",\"⛡\",\"⭕\",\"㉈\",\"㉉\",\"㉊\",\"㉋\",\"㉌\",\"㉍\",\"㉎\",\"㉏\",\"⒑\",\"⒒\",\"⒓\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"⬛\",\"⬤\",\"\",\"\",\"\",\"\",\"\",\"⚿\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"㊙\",\"\",\"⛣\",\"⭖\",\"⭗\",\"⭘\",\"⭙\",\"☓\",\"㊋\",\"〒\",\"⛨\",\"㉆\",\"㉅\",\"⛩\",\"࿖\",\"⛪\",\"⛫\",\"⛬\",\"♨\",\"⛭\",\"⛮\",\"⛯\",\"⚓\",\"✈\",\"⛰\",\"⛱\",\"⛲\",\"⛳\",\"⛴\",\"⛵\",\"\",\"Ⓓ\",\"Ⓢ\",\"⛶\",\"\",\"\",\"\",\"\",\"\",\"⛷\",\"⛸\",\"⛹\",\"⛺\",\"\",\"☎\",\"⛻\",\"⛼\",\"⛽\",\"⛾\",\"\",\"⛿\",\"➡\",\"⬅\",\"⬆\",\"⬇\",\"⬯\",\"⬮\",\"\",\"\",\"\",\"\",\"㎡\",\"㎥\",\"㎝\",\"㎠\",\"㎤\",\"\",\"⒈\",\"⒉\",\"⒊\",\"⒋\",\"⒌\",\"⒍\",\"⒎\",\"⒏\",\"⒐\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"㈳\",\"㈶\",\"㈲\",\"㈱\",\"㈹\",\"㉄\",\"▶\",\"◀\",\"〖\",\"〗\",\"⟐\",\"²\",\"³\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"㉇\",\"\",\"\",\"℻\",\"㈪\",\"㈫\",\"㈬\",\"㈭\",\"㈮\",\"㈯\",\"㈰\",\"㈷\",\"㍾\",\"㍽\",\"㍼\",\"㍻\",\"№\",\"℡\",\"〶\",\"⚾\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"ℓ\",\"㎏\",\"㎐\",\"㏊\",\"㎞\",\"㎢\",\"㍱\",\"½\",\"↉\",\"⅓\",\"⅔\",\"¼\",\"¾\",\"⅕\",\"⅖\",\"⅗\",\"⅘\",\"⅙\",\"⅚\",\"⅐\",\"⅛\",\"⅑\",\"⅒\",\"☀\",\"☁\",\"☂\",\"⛄\",\"☖\",\"☗\",\"⛉\",\"⛊\",\"♦\",\"♥\",\"♣\",\"♠\",\"⛋\",\"⨀\",\"‼\",\"⁉\",\"⛅\",\"☔\",\"⛆\",\"☃\",\"⛇\",\"⚡\",\"⛈\",\"⚞\",\"⚟\",\"♬\",\"\",\"Ⅰ\",\"Ⅱ\",\"Ⅲ\",\"Ⅳ\",\"Ⅴ\",\"Ⅵ\",\"Ⅶ\",\"Ⅷ\",\"Ⅸ\",\"Ⅹ\",\"Ⅺ\",\"Ⅻ\",\"⑰\",\"⑱\",\"⑲\",\"⑳\",\"⑴\",\"⑵\",\"⑶\",\"⑷\",\"⑸\",\"⑹\",\"⑺\",\"⑻\",\"⑼\",\"⑽\",\"⑾\",\"⑿\",\"㉑\",\"㉒\",\"㉓\",\"㉔\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"㉕\",\"㉖\",\"㉗\",\"㉘\",\"㉙\",\"㉚\",\"①\",\"②\",\"③\",\"④\",\"⑤\",\"⑥\",\"⑦\",\"⑧\",\"⑨\",\"⑩\",\"⑪\",\"⑫\",\"⑬\",\"⑭\",\"⑮\",\"⑯\",\"❶\",\"❷\",\"❸\",\"❹\",\"❺\",\"❻\",\"❼\",\"❽\",\"❾\",\"❿\",\"⓫\",\"⓬\",\"㉛\",\"☎\",\"⛌\",\"⛍\",\"❗\",\"⛏\",\"⛐\",\"⛑\",\"⛒\",\"⛕\",\"⛓\",\"⛔\",\"🅿\",\"🆊\",\"⛖\",\"⛗\",\"⛘\",\"⛙\",\"⛚\",\"⛛\",\"⛜\",\"⛝\",\"⛞\",\"⛟\",\"⛠\",\"⛡\",\"⭕\",\"㉈\",\"㉉\",\"㉊\",\"㉋\",\"㉌\",\"㉍\",\"㉎\",\"㉏\",\"⒑\",\"⒒\",\"⒓\",\"🅊\",\"🅌\",\"🄿\",\"🅆\",\"🅋\",\"🈐\",\"🈑\",\"🈒\",\"🈓\",\"🅂\",\"🈔\",\"🈕\",\"🈖\",\"🅍\",\"🄱\",\"🄽\",\"⬛\",\"⬤\",\"🈗\",\"🈘\",\"🈙\",\"🈚\",\"🈛\",\"⚿\",\"🈜\",\"🈝\",\"🈞\",\"🈟\",\"🈠\",\"🈡\",\"🈢\",\"🈣\",\"🈤\",\"🈥\",\"🅎\",\"㊙\",\"🈀\",\"⛣\",\"⭖\",\"⭗\",\"⭘\",\"⭙\",\"☓\",\"㊋\",\"⛨\",\"㉆\",\"㉅\",\"⛩\",\"࿖\",\"⛪\",\"⛫\",\"⛬\",\"⛭\",\"⛮\",\"⛯\",\"⚓\",\"✈\",\"⛰\",\"⛱\",\"⛲\",\"⛳\",\"⛴\",\"⛵\",\"🅗\",\"Ⓓ\",\"Ⓢ\",\"⛶\",\"🅟\",\"🆋\",\"🆍\",\"🆌\",\"🅹\",\"⛷\",\"⛸\",\"⛹\",\"⛺\",\"🅻\",\"⛻\",\"⛼\",\"⛽\",\"⛾\",\"🅼\",\"⛿\",\"➡\",\"⬅\",\"⬆\",\"⬇\",\"⬯\",\"⬮\",\"㎥\",\"㎠\",\"㎤\",\"🄀\",\"⒈\",\"⒉\",\"⒊\",\"⒋\",\"⒌\",\"⒍\",\"⒎\",\"⒏\",\"⒐\",\"🄁\",\"🄂\",\"🄃\",\"🄄\",\"🄅\",\"🄆\",\"🄇\",\"🄈\",\"🄉\",\"🄊\",\"㈳\",\"㈶\",\"㉄\",\"⟐\",\"🄭\",\"🄬\",\"🄫\",\"㉇\",\"🆐\",\"🈦\",\"℻\",\"㈪\",\"㈫\",\"㈬\",\"㈭\",\"㈮\",\"㈯\",\"㈰\",\"㈷\",\"〶\",\"⚾\",\"🉀\",\"🉁\",\"🉂\",\"🉃\",\"🉄\",\"🉅\",\"🉆\",\"🉇\",\"🉈\",\"🄪\",\"🈧\",\"🈨\",\"🈩\",\"🈔\",\"🈪\",\"🈫\",\"🈬\",\"🈭\",\"🈮\",\"🈯\",\"🈰\",\"🈱\",\"㎐\",\"㏊\",\"㎢\",\"㍱\",\"↉\",\"⅖\",\"⅗\",\"⅘\",\"⅙\",\"⅚\",\"⅐\",\"⅛\",\"⅑\",\"⅒\",\"⛄\",\"⛉\",\"⛊\",\"⛋\",\"⨀\",\"⛅\",\"☔\",\"⛆\",\"⛇\",\"⚡\",\"⛈\",\"⚞\",\"⚟\",\"⑴\",\"⑵\",\"⑶\",\"⑷\",\"⑸\",\"⑹\",\"⑺\",\"⑻\",\"⑼\",\"⑽\",\"⑾\",\"⑿\",\"🄐\",\"🄑\",\"🄒\",\"🄓\",\"🄔\",\"🄕\",\"🄖\",\"🄗\",\"🄘\",\"🄙\",\"🄚\",\"🄛\",\"🄜\",\"🄝\",\"🄞\",\"🄟\",\"🄠\",\"🄡\",\"🄢\",\"🄣\",\"🄤\",\"🄥\",\"🄦\",\"🄧\",\"🄨\",\"🄩\"])),m=[0,4129,8258,12387,16516,20645,24774,28903,33032,37161,41290,45419,49548,53677,57806,61935,4657,528,12915,8786,21173,17044,29431,25302,37689,33560,45947,41818,54205,50076,62463,58334,9314,13379,1056,5121,25830,29895,17572,21637,42346,46411,34088,38153,58862,62927,50604,54669,13907,9842,5649,1584,30423,26358,22165,18100,46939,42874,38681,34616,63455,59390,55197,51132,18628,22757,26758,30887,2112,6241,10242,14371,51660,55789,59790,63919,35144,39273,43274,47403,23285,19156,31415,27286,6769,2640,14899,10770,56317,52188,64447,60318,39801,35672,47931,43802,27814,31879,19684,23749,11298,15363,3168,7233,60846,64911,52716,56781,44330,48395,36200,40265,32407,28342,24277,20212,15891,11826,7761,3696,65439,61374,57309,53244,48923,44858,40793,36728,37256,33193,45514,41451,53516,49453,61774,57711,4224,161,12482,8419,20484,16421,28742,24679,33721,37784,41979,46042,49981,54044,58239,62302,689,4752,8947,13010,16949,21012,25207,29270,46570,42443,38312,34185,62830,58703,54572,50445,13538,9411,5280,1153,29798,25671,21540,17413,42971,47098,34713,38840,59231,63358,50973,55100,9939,14066,1681,5808,26199,30326,17941,22068,55628,51565,63758,59695,39368,35305,47498,43435,22596,18533,30726,26663,6336,2273,14466,10403,52093,56156,60223,64286,35833,39896,43963,48026,19061,23124,27191,31254,2801,6864,10931,14994,64814,60687,56684,52557,48554,44427,40424,36297,31782,27655,23652,19525,15522,11395,7392,3265,61215,65342,53085,57212,44955,49082,36825,40952,28183,32310,20053,24180,11923,16050,3793,7920],b=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2?arguments[2]:void 0;null==i&&(i=e.length);for(var n=0,a=t;a<i;a++)n=65535&(n<<8^m[255&(n>>8^e[a])]);return n},g=function(e,t,i,n,a,r,o,s){return 0|((l=t+e(i,n,a)+r+o|0)<<(d=s)|l>>>32-d)+i;var l,d},v=function(e,t,i){return e&t|~e&i},C=function(e,t,i){return e&i|t&~i},x=function(e,t,i){return e^t^i},w=function(e,t,i){return t^(e|~i)},k=function(e){var t=15&e;return\"\".concat(((240&e)>>4).toString(16)).concat(t.toString(16))},_=function(e){var t=64*Math.floor((e.byteLength+8)/64+1),i=new Uint8Array(t);i.set(new Uint8Array(e),0);var n=new DataView(i.buffer);n.setUint8(e.byteLength,128),n.setUint32(t-8,8*e.byteLength%Math.pow(2,32),!0),n.setUint32(t-4,8*e.byteLength/Math.pow(2,32),!0);for(var a=1732584193,r=-271733879,o=-1732584194,s=271733878,l=0;l<t;l+=64){var d=a,p=r,c=o,h=s;a=g(v,a,r,o,s,n.getUint32(l+0,!0),3614090360,7),s=g(v,s,a,r,o,n.getUint32(l+4,!0),3905402710,12),o=g(v,o,s,a,r,n.getUint32(l+8,!0),606105819,17),r=g(v,r,o,s,a,n.getUint32(l+12,!0),3250441966,22),a=g(v,a,r,o,s,n.getUint32(l+16,!0),4118548399,7),s=g(v,s,a,r,o,n.getUint32(l+20,!0),1200080426,12),o=g(v,o,s,a,r,n.getUint32(l+24,!0),2821735955,17),r=g(v,r,o,s,a,n.getUint32(l+28,!0),4249261313,22),a=g(v,a,r,o,s,n.getUint32(l+32,!0),1770035416,7),s=g(v,s,a,r,o,n.getUint32(l+36,!0),2336552879,12),o=g(v,o,s,a,r,n.getUint32(l+40,!0),4294925233,17),r=g(v,r,o,s,a,n.getUint32(l+44,!0),2304563134,22),a=g(v,a,r,o,s,n.getUint32(l+48,!0),1804603682,7),s=g(v,s,a,r,o,n.getUint32(l+52,!0),4254626195,12),o=g(v,o,s,a,r,n.getUint32(l+56,!0),2792965006,17),r=g(v,r,o,s,a,n.getUint32(l+60,!0),1236535329,22),a=g(C,a,r,o,s,n.getUint32(l+4,!0),4129170786,5),s=g(C,s,a,r,o,n.getUint32(l+24,!0),3225465664,9),o=g(C,o,s,a,r,n.getUint32(l+44,!0),643717713,14),r=g(C,r,o,s,a,n.getUint32(l+0,!0),3921069994,20),a=g(C,a,r,o,s,n.getUint32(l+20,!0),3593408605,5),s=g(C,s,a,r,o,n.getUint32(l+40,!0),38016083,9),o=g(C,o,s,a,r,n.getUint32(l+60,!0),3634488961,14),r=g(C,r,o,s,a,n.getUint32(l+16,!0),3889429448,20),a=g(C,a,r,o,s,n.getUint32(l+36,!0),568446438,5),s=g(C,s,a,r,o,n.getUint32(l+56,!0),3275163606,9),o=g(C,o,s,a,r,n.getUint32(l+12,!0),4107603335,14),r=g(C,r,o,s,a,n.getUint32(l+32,!0),1163531501,20),a=g(C,a,r,o,s,n.getUint32(l+52,!0),2850285829,5),s=g(C,s,a,r,o,n.getUint32(l+8,!0),4243563512,9),o=g(C,o,s,a,r,n.getUint32(l+28,!0),1735328473,14),r=g(C,r,o,s,a,n.getUint32(l+48,!0),2368359562,20),a=g(x,a,r,o,s,n.getUint32(l+20,!0),4294588738,4),s=g(x,s,a,r,o,n.getUint32(l+32,!0),2272392833,11),o=g(x,o,s,a,r,n.getUint32(l+44,!0),1839030562,16),r=g(x,r,o,s,a,n.getUint32(l+56,!0),4259657740,23),a=g(x,a,r,o,s,n.getUint32(l+4,!0),2763975236,4),s=g(x,s,a,r,o,n.getUint32(l+16,!0),1272893353,11),o=g(x,o,s,a,r,n.getUint32(l+28,!0),4139469664,16),r=g(x,r,o,s,a,n.getUint32(l+40,!0),3200236656,23),a=g(x,a,r,o,s,n.getUint32(l+52,!0),681279174,4),s=g(x,s,a,r,o,n.getUint32(l+0,!0),3936430074,11),o=g(x,o,s,a,r,n.getUint32(l+12,!0),3572445317,16),r=g(x,r,o,s,a,n.getUint32(l+24,!0),76029189,23),a=g(x,a,r,o,s,n.getUint32(l+36,!0),3654602809,4),s=g(x,s,a,r,o,n.getUint32(l+48,!0),3873151461,11),o=g(x,o,s,a,r,n.getUint32(l+60,!0),530742520,16),r=g(x,r,o,s,a,n.getUint32(l+8,!0),3299628645,23),a=g(w,a,r,o,s,n.getUint32(l+0,!0),4096336452,6),s=g(w,s,a,r,o,n.getUint32(l+28,!0),1126891415,10),o=g(w,o,s,a,r,n.getUint32(l+56,!0),2878612391,15),r=g(w,r,o,s,a,n.getUint32(l+20,!0),4237533241,21),a=g(w,a,r,o,s,n.getUint32(l+48,!0),1700485571,6),s=g(w,s,a,r,o,n.getUint32(l+12,!0),2399980690,10),o=g(w,o,s,a,r,n.getUint32(l+40,!0),4293915773,15),r=g(w,r,o,s,a,n.getUint32(l+4,!0),2240044497,21),a=g(w,a,r,o,s,n.getUint32(l+32,!0),1873313359,6),s=g(w,s,a,r,o,n.getUint32(l+60,!0),4264355552,10),o=g(w,o,s,a,r,n.getUint32(l+24,!0),2734768916,15),r=g(w,r,o,s,a,n.getUint32(l+52,!0),1309151649,21),a=g(w,a,r,o,s,n.getUint32(l+16,!0),4149444226,6),s=g(w,s,a,r,o,n.getUint32(l+44,!0),3174756917,10),o=g(w,o,s,a,r,n.getUint32(l+8,!0),718787259,15),r=g(w,r,o,s,a,n.getUint32(l+36,!0),3951481745,21),a=d+a|0,r=p+r|0,o=c+o|0,s=h+s|0}var u=\"\";return u+=k((255&a)>>>0),u+=k((65280&a)>>>8),u+=k((16711680&a)>>>16),u+=k((4278190080&a)>>>24),u+=k((255&r)>>>0),u+=k((65280&r)>>>8),u+=k((16711680&r)>>>16),u+=k((4278190080&r)>>>24),u+=k((255&o)>>>0),u+=k((65280&o)>>>8),u+=k((16711680&o)>>>16),u+=k((4278190080&o)>>>24),u+=k((255&s)>>>0),u+=k((65280&s)>>>8),(u+=k((16711680&s)>>>16))+k((4278190080&s)>>>24)};function S(e){return S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},S(e)}function T(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var i=null==e?null:\"undefined\"!=typeof Symbol&&e[Symbol.iterator]||e[\"@@iterator\"];if(null!=i){var n,a,r,o,s=[],l=!0,d=!1;try{if(r=(i=i.call(e)).next,0===t){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=r.call(i)).done)&&(s.push(n.value),s.length!==t);l=!0);}catch(e){d=!0,a=e}finally{try{if(!l&&null!=i.return&&(o=i.return(),Object(o)!==o))return}finally{if(d)throw a}}return s}}(e,t)||function(e,t){if(e){if(\"string\"==typeof e)return B(e,t);var i={}.toString.call(e).slice(8,-1);return\"Object\"===i&&e.constructor&&(i=e.constructor.name),\"Map\"===i||\"Set\"===i?Array.from(e):\"Arguments\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?B(e,t):void 0}}(e,t)||function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}function B(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,n=Array(t);i<t;i++)n[i]=e[i];return n}function E(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,I(n.key),n)}}function I(e){var t=function(e){if(\"object\"!=S(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,\"string\");if(\"object\"!=S(i))return i;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==S(t)?t:t+\"\"}var F=null,R=function(){function e(t,i){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.option_canvas=null,this.render_canvas=null,this.render_text=\"\",this.GL=0,this.GR=2,this.G_BACK=[a.get(0),a.get(1),a.get(2),o.get(31)],this.DRCS_mapping=new Map([[15,new Map],[16,new Map],[17,new Map],[18,new Map],[19,new Map],[20,new Map],[21,new Map],[22,new Map],[23,new Map],[24,new Map],[25,new Map],[26,new Map],[27,new Map],[28,new Map],[29,new Map],[30,new Map]]),this.purpose_width=1920,this.purpose_height=1080,this.swf_x=1920,this.swf_y=1080,this.sdf_x=1920,this.sdf_y=1080,this.sdp_x=0,this.sdp_y=0,this.ssm_x=72,this.ssm_y=72,this.shs=8,this.svs=48,this.text_size_x=1,this.text_size_y=1,this.position_x=-1,this.position_y=-1,this.pallet=0,this.fg_color=l[this.pallet][7],this.bg_color=l[this.pallet][8],this.force_bg_color=null,this.hlc=0,this.stl=!1,this.orn=null,this.force_orn=null,this.non_spacing=\"\",this.timeElapsed=0,this.endTime=null,this.rendered=!1,this.PRA=null,this.normalFont=\"sans-serif\",this.gaijiFont=this.normalFont,this.drcsReplacement=!1,this.drcsReplaceMapping=new Map,this.useStroke=!1,this.usePUA=!1,this.pes=t,this.startTime=i}return t=e,n=[{key:\"setEmbeddedGlyph\",value:function(e){F=e}},{key:\"detect\",value:function(e,t){var i,n,a=null!==(i=null==t?void 0:t.data_identifier)&&void 0!==i?i:128,r=null!==(n=null==t?void 0:t.data_group_id)&&void 0!==n?n:1;if(e.length<=0)return!1;if(e[0]!==a)return!1;if(e.length<=2)return!1;var o=3+(15&e[2]);return!(e.length<=o||(15&(252&e[o+0])>>2)!==r||(b(e,o),0))}},{key:\"getRGBAColorCode\",value:function(e){if(null==e)return null;var t=document.createElement(\"canvas\");t.width=t.height=1;var i=t.getContext(\"2d\");if(!i)return null;i.fillStyle=e,i.fillRect(0,0,t.width,t.height);var n=T(i.getImageData(0,0,1,1).data,4),a=n[0],r=n[1],o=n[2],s=n[3],l=\"#\".concat(a.toString(16).toUpperCase().padStart(2,\"0\")).concat(r.toString(16).toUpperCase().padStart(2,\"0\")).concat(o.toString(16).toUpperCase().padStart(2,\"0\")).concat(s.toString(16).toUpperCase().padStart(2,\"0\"));return t.width=t.height=0,l}},{key:\"fillAlphaColorCode\",value:function(e){if(null==e)return\"\";var t=Number.parseInt(e.substring(1,3),16),i=Number.parseInt(e.substring(3,5),16),n=Number.parseInt(e.substring(5,7),16);return\"#\".concat(t.toString(16).toUpperCase().padStart(2,\"0\")).concat(i.toString(16).toUpperCase().padStart(2,\"0\")).concat(n.toString(16).toUpperCase().padStart(2,\"0\"),\"FF\")}},{key:\"getRGBAfromColorCode\",value:function(e){if(null==e)return\"\";var t=Number.parseInt(e.substring(1,3),16),i=Number.parseInt(e.substring(3,5),16),n=Number.parseInt(e.substring(5,7),16),a=Number.parseInt(e.substring(7,9),16);return\"rgba(\".concat(t,\", \").concat(i,\", \").concat(n,\", \").concat(a/255,\")\")}}],(i=[{key:\"initialize\",value:function(){this.render_canvas=null,this.option_canvas=null,this.render_text=\"\",this.GL=0,this.GR=2,this.G_BACK=[a.get(0),a.get(1),a.get(2),o.get(31)],this.DRCS_mapping=new Map([[15,new Map],[16,new Map],[17,new Map],[18,new Map],[19,new Map],[20,new Map],[21,new Map],[22,new Map],[23,new Map],[24,new Map],[25,new Map],[26,new Map],[27,new Map],[28,new Map],[29,new Map],[30,new Map]]),this.purpose_width=1920,this.purpose_height=1080,this.swf_x=1920,this.swf_y=1080,this.sdf_x=1920,this.sdf_y=1080,this.sdp_x=0,this.sdp_y=0,this.ssm_x=72,this.ssm_y=72,this.shs=8,this.svs=48,this.text_size_x=1,this.text_size_y=1,this.position_x=-1,this.position_y=-1,this.pallet=0,this.fg_color=l[this.pallet][7],this.bg_color=l[this.pallet][8],this.force_bg_color=null,this.hlc=0,this.stl=!1,this.orn=null,this.force_orn=null,this.non_spacing=\"\",this.timeElapsed=0,this.endTime=null,this.rendered=!1,this.PRA=null,this.normalFont=\"sans-serif\",this.gaijiFont=this.normalFont,this.drcsReplacement=!1,this.drcsReplaceMapping=new Map,this.useStroke=!1,this.usePUA=!1}},{key:\"width\",value:function(){return Math.floor((this.shs+this.ssm_x)*this.text_size_x)}},{key:\"height\",value:function(){return Math.floor((this.svs+this.ssm_y)*this.text_size_y)}},{key:\"width_magnification\",value:function(){return Math.ceil(this.purpose_width/this.swf_x)}},{key:\"height_magnification\",value:function(){return Math.ceil(this.purpose_height/this.swf_y)}},{key:\"canvas_width\",value:function(){return this.swf_x*this.width_magnification()}},{key:\"canvas_height\",value:function(){return this.swf_y*this.height_magnification()}},{key:\"move_absolute_dot\",value:function(e,t){this.position_x=e,this.position_y=t}},{key:\"move_absolute_pos\",value:function(e,t){this.position_x=this.sdp_x+e*this.width(),this.position_y=this.sdp_y+(t+1)*this.height()}},{key:\"move_relative_pos\",value:function(e,t){for((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs));e<0;)this.position_x-=this.width(),e++,this.position_x<this.sdp_x&&(this.position_x=this.sdp_x+this.sdf_x-this.width(),t--);for(;e>0;)this.position_x+=this.width(),e--,this.position_x>=this.sdp_x+this.sdf_x&&(this.position_x=this.sdp_x,t++);for(;t<0;)this.position_y-=this.height(),t++;for(;t>0;)this.position_y+=this.height(),t--}},{key:\"move_newline\",value:function(){(this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),this.position_x=this.sdp_x,this.position_y=this.position_y+this.height()}},{key:\"render\",value:function(t){var i,n,a,r,o,s,l,d,p,c,h,u,f,y,m;this.initialize(),this.option_canvas=null!==(i=null==t?void 0:t.canvas)&&void 0!==i?i:null,this.force_orn=null!==(n=\"boolean\"==typeof(null==t?void 0:t.forceStrokeColor)?null==t?void 0:t.forceStrokeColor:e.getRGBAColorCode(null==t?void 0:t.forceStrokeColor))&&void 0!==n?n:null,this.force_bg_color=null!==(a=e.getRGBAColorCode(null==t?void 0:t.forceBackgroundColor))&&void 0!==a?a:null,this.purpose_width=null!==(r=null!==(o=null==t?void 0:t.width)&&void 0!==o?o:null==t||null===(s=t.canvas)||void 0===s?void 0:s.width)&&void 0!==r?r:this.purpose_width,this.purpose_height=null!==(l=null!==(d=null==t?void 0:t.height)&&void 0!==d?d:null==t||null===(p=t.canvas)||void 0===p?void 0:p.height)&&void 0!==l?l:this.purpose_height,this.normalFont=null!==(c=null==t?void 0:t.normalFont)&&void 0!==c?c:\"sans-serif\",this.gaijiFont=null!==(h=null==t?void 0:t.gaijiFont)&&void 0!==h?h:this.normalFont,this.drcsReplacement=null!==(u=null==t?void 0:t.drcsReplacement)&&void 0!==u&&u,this.drcsReplaceMapping=new Map(A);for(var b,g=Object.entries(null!==(b=null==t?void 0:t.drcsReplaceMapping)&&void 0!==b?b:{}),v=0;v<g.length;v++){var C=g[v];this.drcsReplaceMapping.set(C[0],C[1])}if(this.useStroke=null!==(f=null==t?void 0:t.useStroke)&&void 0!==f&&f,this.usePUA=null!==(y=null==t?void 0:t.usePUA)&&void 0!==y&&y,!e.detect(this.pes,t))return null;for(var x=3+(15&this.pes[2]),w=(this.pes[x+0],(this.pes[x+3]<<8)+this.pes[x+4]),k=x+9;k<x+(5+w);){this.pes[k+0];var _=this.pes[k+1],S=this.pes[k+2]<<16|this.pes[k+3]<<8|this.pes[k+4];32===_?this.parseText(k+5,k+5+S):48==_?this.parseDRCS(1,k+5,k+5+S):49==_&&this.parseDRCS(2,k+5,k+5+S),k+=5+S}if(this.option_canvas){var T=this.option_canvas.getContext(\"2d\");if(T&&(T.clearRect(0,0,this.option_canvas.width,this.option_canvas.height),this.render_canvas))if(null!=t&&t.keepAspectRatio){var B=this.option_canvas.width/this.swf_x,E=this.option_canvas.height/this.swf_y,I=Math.min(B,E),F=this.swf_x*I,R=this.swf_y*I,O=(this.option_canvas.width-F)/2,D=(this.option_canvas.height-R)/2;T.drawImage(this.render_canvas,0,0,this.render_canvas.width,this.render_canvas.height,O,D,F,R)}else T.drawImage(this.render_canvas,0,0,this.render_canvas.width,this.render_canvas.height,0,0,this.option_canvas.width,this.option_canvas.height)}return this.render_canvas&&(this.render_canvas.width=this.render_canvas.height=0,this.render_canvas=null),this.option_canvas=null,{startTime:this.startTime,endTime:null!==(m=this.endTime)&&void 0!==m?m:Number.POSITIVE_INFINITY,rendered:this.rendered,textContent:this.rendered?this.render_text:null,PRA:this.PRA}}},{key:\"parseText\",value:function(e,t){for(;e<t;)if(32<this.pes[e]&&this.pes[e]<127){var i=0,n=this.G_BACK[this.GL];if(!n)return;for(var o=0;o<n.bytes;o++)i<<=8,i|=127&this.pes[e+o];this.renderCharacter(i,n),e+=n.bytes}else if(160<this.pes[e]&&this.pes[e]<255){var d=0,p=this.G_BACK[this.GR];if(!p)return;for(var c=0;c<p.bytes;c++)d<<=8,d|=127&this.pes[e+c];this.renderCharacter(d,p),e+=p.bytes}else if(0===this.pes[e])e+=1;else if(7===this.pes[e])e+=1;else if(8===this.pes[e])this.move_relative_pos(-1,0),e+=1;else if(9===this.pes[e])this.move_relative_pos(1,0),e+=1;else if(10===this.pes[e])this.move_relative_pos(0,1),e+=1;else if(11===this.pes[e])this.move_relative_pos(0,-1),e+=1;else if(12===this.pes[e])null!=this.startTime&&this.timeElapsed>0&&(this.endTime=this.startTime+this.timeElapsed),e+=1;else if(13===this.pes[e])this.move_newline(),e+=1;else if(14===this.pes[e])this.GL=1,e+=1;else if(15===this.pes[e])this.GL=0,e+=1;else if(22===this.pes[e]){var h=63&this.pes[e+1];this.move_relative_pos(h,0),e+=2}else if(24===this.pes[e])e+=1;else if(25===this.pes[e]){var u=0,f=this.G_BACK[2];if(!f)return;for(var A=0;A<f.bytes;A++)u<<=8,u|=127&this.pes[e+1+A];this.renderCharacter(u,f),e+=1+f.bytes}else if(27===this.pes[e])if(110===this.pes[e+1])this.GL=2,e+=2;else if(111==this.pes[e+1])this.GL=3,e+=2;else if(126==this.pes[e+1])this.GR=1,e+=2;else if(125==this.pes[e+1])this.GR=2,e+=2;else if(124==this.pes[e+1])this.GR=3,e+=2;else if(40<=this.pes[e+1]&&this.pes[e+1]<=43){var y=this.pes[e+1]-40;32===this.pes[e+2]?(this.G_BACK[y]=s.get(this.pes[e+3]),e+=4):(this.G_BACK[y]=r.get(this.pes[e+2]),e+=3)}else{if(36!==this.pes[e+1])return;if(40<=this.pes[e+2]&&this.pes[e+2]<=43){var m=this.pes[e+2]-40;32===this.pes[e+3]?(this.G_BACK[m]=s.get(this.pes[e+4]),e+=5):(this.G_BACK[m]=r.get(this.pes[e+3]),e+=4)}else this.G_BACK[0]=r.get(this.pes[e+2]),e+=3}else if(28===this.pes[e]){var b=63&this.pes[e+1],g=63&this.pes[e+2];this.move_absolute_pos(g,b),e+=3}else if(29===this.pes[e]){var v=0,C=this.G_BACK[3];if(!C)return;for(var x=0;x<C.bytes;x++)v<<=8,v|=127&this.pes[e+1+x];this.renderCharacter(v,C),e+=1+C.bytes}else if(30===this.pes[e])e+=1;else if(31===this.pes[e])e+=1;else if(32===this.pes[e]){var w=a.get(0);if(!w)return;this.renderCharacter(8481,w),e+=1}else if(127===this.pes[e])e+=1;else if(128===this.pes[e])this.fg_color=l[this.pallet][0],e+=1;else if(129===this.pes[e])this.fg_color=l[this.pallet][1],e+=1;else if(130===this.pes[e])this.fg_color=l[this.pallet][2],e+=1;else if(131===this.pes[e])this.fg_color=l[this.pallet][3],e+=1;else if(132===this.pes[e])this.fg_color=l[this.pallet][4],e+=1;else if(133===this.pes[e])this.fg_color=l[this.pallet][5],e+=1;else if(134===this.pes[e])this.fg_color=l[this.pallet][6],e+=1;else if(135===this.pes[e])this.fg_color=l[this.pallet][7],e+=1;else if(136===this.pes[e])this.text_size_x=.5,this.text_size_y=.5,e+=1;else if(137===this.pes[e])this.text_size_x=.5,this.text_size_y=1,e+=1;else if(138===this.pes[e])this.text_size_x=1,this.text_size_y=1,e+=1;else{if(139===this.pes[e])return;if(144===this.pes[e]){var k=this.pes[e+1];if(32==k){var _=15&this.pes[e+2];this.pallet=_,e+=3}else{var S=15&k;64==(112&k)?this.fg_color=l[this.pallet][S]:80==(112&k)&&(this.bg_color=l[this.pallet][S]),e+=2}}else if(145===this.pes[e])e+=2;else{if(146===this.pes[e])return;if(147===this.pes[e])return;if(148===this.pes[e])return;if(149===this.pes[e])return;if(151===this.pes[e])this.hlc=15&this.pes[e+1],e+=2;else{if(152===this.pes[e])return;if(153===this.pes[e])this.stl=!1,e+=1;else if(154===this.pes[e])this.stl=!0,e+=1;else if(155===this.pes[e]){for(var T=e,B=-1,E=-1;T+1<t;)if(T+=1,32===this.pes[T])B<0&&(B=T);else if(59===this.pes[T])B<0&&E<0&&(E=T);else{if(66===this.pes[T])break;if(83===this.pes[T]){var I=e+1,F=0;if(E>=0||B<0)return;for(;I<B;)F*=10,F+=15&this.pes[I],I++;if(5===F)this.swf_x=3840,this.swf_y=2160;else if(7===F)this.swf_x=1920,this.swf_y=1080;else{if(9!=F)return;this.swf_x=1440,this.swf_y=960}break}if(84===this.pes[T])break;if(86===this.pes[T]){for(var R=e+1,O=0,D=0;R<E;)O*=10,O+=15&this.pes[R],R++;for(R++;R<B;)D*=10,D+=15&this.pes[R],R++;this.sdf_x=2*O,this.sdf_y=2*D;break}if(87===this.pes[T]){for(var M=e+1,L=0,P=0;M<E;)L*=10,L+=15&this.pes[M],M++;for(M++;M<B;)P*=10,P+=15&this.pes[M],M++;this.ssm_x=2*L,this.ssm_y=2*P;break}if(88===this.pes[T]){for(var z=e+1,G=0;z<B;)G*=10,G+=15&this.pes[z],z++;this.shs=2*G;break}if(89===this.pes[T]){for(var q=e+1,j=0;q<B;)j*=10,j+=15&this.pes[q],q++;this.svs=2*j;break}if(91===this.pes[T])break;if(92===this.pes[T])break;if(93===this.pes[T])break;if(94===this.pes[T])break;if(95===this.pes[T]){for(var U=e+1,H=0,N=0;U<E;)H*=10,H+=15&this.pes[U],U++;for(U++;U<B;)N*=10,N+=15&this.pes[U],U++;this.sdp_x=2*H,this.sdp_y=2*N;break}if(97===this.pes[T]){for(var W=e+1,J=0,V=0;W<E;)J*=10,J+=15&this.pes[W],W++;for(W++;W<B;)V*=10,V+=15&this.pes[W],W++;this.move_absolute_dot(2*J,2*V);break}if(98===this.pes[T])break;if(99===this.pes[T]){var K=this.pes[e+1];if(48==K)this.orn=null;else if(49==K){var X=10*(15&this.pes[e+3])+(15&this.pes[e+4]),Y=10*(15&this.pes[e+5])+(15&this.pes[e+6]);this.orn=l[X][Y]}break}if(100===this.pes[T])break;if(101===this.pes[T])break;if(102===this.pes[T])break;if(103===this.pes[T])break;if(104===this.pes[T]){for(var $=e+1,Q=0;$<B;)Q*=10,Q+=15&this.pes[$],$++;this.PRA=Q;break}if(105===this.pes[T])break;if(106===this.pes[T])break;if(110===this.pes[T])break;if(111===this.pes[T])break}e=T+1}else{if(157!==this.pes[e])return;if(32!=this.pes[e+1])return void this.pes[e+1];var Z=63&this.pes[e+2];this.timeElapsed+=Z/10,e+=3}}}}}},{key:\"parseDRCS\",value:function(e,t,i){for(this.pes[t+0],t+=1;t<i;){var n=this.pes[t+0]<<8|this.pes[t+1],a=this.pes[t+2];t+=3;for(var r=0;r<a;r++){this.pes[t+0];var o=15&this.pes[t+0];if(0===o||1===o){var l=this.pes[t+1]+2,d=this.pes[t+2],p=this.pes[t+3],c=l.toString(2).length-l.toString(2).replace(/0*$/,\"\").length,h=Math.floor(d*p*c/8),u=new Uint8Array(Array.prototype.slice.call(this.pes,t+4,t+4+h));if(1===e){var f,A,y=64+((3840&n)>>8),m=127&n,b=null===(f=s.get(y))||void 0===f?void 0:f.alphabet;b&&(null===(A=this.DRCS_mapping.get(b))||void 0===A||A.set(m,u))}else{var g,v=32639&n;null===(g=this.DRCS_mapping.get(15))||void 0===g||g.set(v,u)}t+=4+h}}}}},{key:\"renderCharacter\",value:function(t,i){var n;if((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),this.option_canvas){this.option_canvas&&!this.render_canvas&&(this.render_canvas=document.createElement(\"canvas\"),this.render_canvas.width=this.canvas_width(),this.render_canvas.height=this.canvas_height());var r=null===(n=this.render_canvas)||void 0===n?void 0:n.getContext(\"2d\");if(r){if(0===i.alphabet){var s=((65280&t)>>8)-33,l=(255&t)-33;if(0===s&&12<=l&&l<=17)return void(this.non_spacing=[\"́\",\"̀\",\"̈\",\"̂\",\"̅\",\"̲\"][l-12]);if(1===s&&93===l)return void(this.non_spacing+=\"⃝\")}var A;if(31!==i.alphabet&&(this.rendered=!0,r.fillStyle=e.getRGBAfromColorCode(null!==(A=this.force_bg_color)&&void 0!==A?A:this.bg_color),r.fillRect(this.position_x*this.width_magnification(),(this.position_y-this.height())*this.height_magnification(),this.width()*this.width_magnification(),this.height()*this.height_magnification()),1&this.hlc&&(r.fillStyle=e.getRGBAfromColorCode(this.fg_color),r.fillRect(this.position_x*this.width_magnification(),(this.position_y-1)*this.height_magnification(),this.width()*this.width_magnification(),1*this.height_magnification())),2&this.hlc&&(r.fillStyle=e.getRGBAfromColorCode(this.fg_color),r.fillRect((this.position_x+this.width()-1)*this.width_magnification(),(this.position_y-this.height())*this.height_magnification(),1*this.width_magnification(),this.height()*this.height_magnification())),4&this.hlc&&(r.fillStyle=e.getRGBAfromColorCode(this.fg_color),r.fillRect(this.position_x*this.width_magnification(),(this.position_y-this.height())*this.height_magnification(),this.width()*this.width_magnification(),1*this.height_magnification())),8&this.hlc&&(r.fillStyle=e.getRGBAfromColorCode(this.fg_color),r.fillRect(this.position_x*this.width_magnification(),(this.position_y-this.height())*this.height_magnification(),1*this.width_magnification(),this.height()*this.height_magnification())),this.stl&&(r.fillStyle=e.getRGBAfromColorCode(this.fg_color),r.fillRect(this.position_x*this.width_magnification(),(this.position_y-1)*this.height_magnification(),this.width()*this.width_magnification(),1*this.height_magnification()))),0===i.alphabet){var y=94*(((65280&t)>>8)-33)+((255&t)-33),m=7896;if(y<m){var b=d[y];this.renderFont(b)}else if(this.usePUA){var g=p[y-m];this.renderFont(g)}else{var v=c[y-m];this.renderFont(v)}this.move_relative_pos(1,0)}else if(1===i.alphabet){var C=h[t-33];this.renderFont(C),this.move_relative_pos(1,0)}else if(2===i.alphabet){var x=u[t-33];this.renderFont(x),this.move_relative_pos(1,0)}else if(3===i.alphabet){var w=f[t-33];this.renderFont(w),this.move_relative_pos(1,0)}else{if(31===i.alphabet)return void(96===t?(this.G_BACK=[a.get(0),a.get(1),a.get(2),o.get(31)],this.GL=0,this.GR=2):97===t?(this.G_BACK=[a.get(0),a.get(3),a.get(2),o.get(31)],this.GL=0,this.GR=2):98===t?(this.G_BACK=[a.get(0),o.get(16),a.get(2),o.get(31)],this.GL=0,this.GR=2):99===t?(this.G_BACK=[a.get(4),a.get(6),a.get(7),o.get(31)],this.GL=0,this.GR=2):100===t?(this.G_BACK=[a.get(4),a.get(5),a.get(7),o.get(31)],this.GL=0,this.GR=2):101===t?(this.G_BACK=[a.get(4),o.get(16),a.get(7),o.get(31)],this.GL=0,this.GR=2):102===t?(this.G_BACK=[o.get(16),o.get(17),o.get(18),o.get(31)],this.GL=0,this.GR=2):103===t?(this.G_BACK=[o.get(19),o.get(20),o.get(21),o.get(31)],this.GL=0,this.GR=2):104===t?(this.G_BACK=[o.get(22),o.get(23),o.get(24),o.get(31)],this.GL=0,this.GR=2):105===t?(this.G_BACK=[o.get(25),o.get(26),o.get(27),o.get(31)],this.GL=0,this.GR=2):106===t?(this.G_BACK=[o.get(28),o.get(29),o.get(30),o.get(31)],this.GL=0,this.GR=2):107===t?(this.G_BACK=[a.get(0),o.get(17),a.get(2),o.get(31)],this.GL=0,this.GR=2):108===t?(this.G_BACK=[a.get(0),o.get(18),a.get(2),o.get(31)],this.GL=0,this.GR=2):109===t?(this.G_BACK=[a.get(0),o.get(19),a.get(2),o.get(31)],this.GL=0,this.GR=2):110===t?(this.G_BACK=[a.get(3),a.get(2),a.get(1),o.get(31)],this.GL=0,this.GR=2):111===t&&(this.G_BACK=[a.get(1),a.get(4),o.get(16),o.get(31)],this.GL=0,this.GR=2));var k,S=null===(k=this.DRCS_mapping.get(i.alphabet))||void 0===k?void 0:k.get(32639&t);if(!S)return;var T=_(S.buffer);if(this.drcsReplacement&&this.drcsReplaceMapping.has(T.toLowerCase()))this.renderFont(this.drcsReplaceMapping.get(T.toLowerCase()));else if(this.drcsReplacement&&this.drcsReplaceMapping.has(T.toUpperCase()))this.renderFont(this.drcsReplaceMapping.get(T.toUpperCase()));else{var B=Math.floor(this.ssm_x*this.text_size_x/2),E=Math.floor(this.ssm_y*this.text_size_y/2),I=Math.floor(8*S.length/(B*E)),F=this.getOrnColorCode();if(F&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color)){r.fillStyle=e.getRGBAfromColorCode(F);for(var R=-2*this.height_magnification();R<=2*this.height_magnification();R++)for(var O=-2*this.width_magnification();O<=2*this.width_magnification();O++)for(var D=0;D<E;D++)for(var M=0;M<B;M++){for(var L=0,P=0;P<I;P++){var z=7-((D*B+M)*I+P)%8;L*=2,L+=(S[Math.floor(((D*B+M)*I+P)/8)]&1<<z)>>z}L>0&&r.fillRect((this.position_x-0+Math.floor(this.shs*this.text_size_x/2)+2*M)*this.width_magnification()+2*O,(this.position_y-this.height()+Math.floor(this.svs*this.text_size_y/2)+2*D)*this.height_magnification()+2*R,2*this.width_magnification(),2*this.height_magnification())}}r.fillStyle=e.getRGBAfromColorCode(this.fg_color);for(var G=0;G<E;G++)for(var q=0;q<B;q++){for(var j=0,U=0;U<I;U++){var H=7-((G*B+q)*I+U)%8;j*=2,j+=(S[Math.floor(((G*B+q)*I+U)/8)]&1<<H)>>H}j>0&&r.fillRect((this.position_x-0+Math.floor(this.shs*this.text_size_x/2)+2*q)*this.width_magnification(),(this.position_y-this.height()+Math.floor(this.svs*this.text_size_y/2)+2*G)*this.height_magnification(),2*this.width_magnification(),2*this.height_magnification())}}this.move_relative_pos(1,0)}}}}},{key:\"renderFont\",value:function(t){var i;if(t+=this.non_spacing,this.non_spacing=\"\",.5===this.text_size_x&&.5===this.text_size_y&&(u.includes(t)||f.includes(t))||(this.render_text+=t),this.render_canvas)if(null!=F&&F.has(t)){var n=F.get(t),a=n.viewBox,r=n.path;this.renderPath(a,r)}else{var o=y.has(t);o&&(t+=\"︎\");var s=null===(i=this.render_canvas)||void 0===i?void 0:i.getContext(\"2d\");if(s){var l=(this.position_x+this.width()/2)*this.width_magnification(),d=(this.position_y-this.height()/2)*this.height_magnification();s.translate(l,d),s.scale(this.text_size_x*this.width_magnification(),this.text_size_y*this.height_magnification());var p=this.getOrnColorCode();if(p&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color))if(this.useStroke)s.font=\"\".concat(this.ssm_x,\"px \").concat(o?this.gaijiFont:this.normalFont),s.strokeStyle=e.getRGBAfromColorCode(p),s.lineJoin=\"round\",s.textBaseline=\"middle\",s.textAlign=\"center\",s.lineWidth=8,s.strokeText(t,0,0);else{s.setTransform(1,0,0,1,0,0),s.translate(l,d),s.scale(this.text_size_x,this.text_size_y*this.height_magnification()/this.width_magnification());for(var c=-4*this.width_magnification();c<=4*this.width_magnification();c++)for(var h=-4*this.width_magnification();h<=4*this.width_magnification();h++)s.font=\"\".concat(this.ssm_x*this.width_magnification(),\"px \").concat(o?this.gaijiFont:this.normalFont),s.fillStyle=e.getRGBAfromColorCode(p),s.textBaseline=\"middle\",s.textAlign=\"center\",s.fillText(t,0+h,0+c);s.setTransform(1,0,0,1,0,0),s.translate(l,d),s.scale(this.text_size_x*this.width_magnification(),this.text_size_y*this.height_magnification())}s.font=\"\".concat(this.ssm_x,\"px \").concat(o?this.gaijiFont:this.normalFont),s.fillStyle=e.getRGBAfromColorCode(this.fg_color),s.textBaseline=\"middle\",s.textAlign=\"center\",s.fillText(t,0,0),s.setTransform(1,0,0,1,0,0)}}}},{key:\"renderPath\",value:function(t,i){var n;if(this.render_canvas){var a=null===(n=this.render_canvas)||void 0===n?void 0:n.getContext(\"2d\");if(a){var r=(this.position_x+this.shs/2)*this.width_magnification(),o=(this.position_y-this.height()+this.svs/2)*this.height_magnification();a.translate(r,o);var s=T(t,4),l=s[0],d=s[1],p=s[2]-l,c=s[3]-d;a.scale(this.ssm_y/p,this.ssm_y/c),a.translate(l,d);var h=this.getOrnColorCode();if(h&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color))if(this.useStroke)a.strokeStyle=e.getRGBAfromColorCode(h),a.lineJoin=\"round\",a.lineWidth=4*Math.max(p/this.ssm_y,c/this.ssm_y)*2,a.stroke(new Path2D(i));else for(var u=-4*this.width_magnification();u<=4*this.width_magnification();u++)for(var f=-4*this.width_magnification();f<=4*this.width_magnification();f++)a.translate(f,u),a.fillStyle=e.getRGBAfromColorCode(h),a.fill(new Path2D(i)),a.translate(-f,-u);a.fillStyle=e.getRGBAfromColorCode(this.fg_color),a.fill(new Path2D(i)),a.setTransform(1,0,0,1,0,0)}}}},{key:\"getOrnColorCode\",value:function(){return!0===this.force_orn?e.fillAlphaColorCode(this.bg_color):!1===this.force_orn?this.orn:null!==(t=this.force_orn)&&void 0!==t?t:this.orn;var t}}])&&E(t.prototype,i),n&&E(t,n),Object.defineProperty(t,\"prototype\",{writable:!1}),t;var t,i,n}();function O(e){return O=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},O(e)}function D(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,n=Array(t);i<t;i++)n[i]=e[i];return n}function M(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function L(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,z(n.key),n)}}function P(e,t,i){return t&&L(e.prototype,t),i&&L(e,i),Object.defineProperty(e,\"prototype\",{writable:!1}),e}function z(e){var t=function(e){if(\"object\"!=O(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,\"string\");if(\"object\"!=O(i))return i;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==O(t)?t:t+\"\"}function G(e){var t=\"function\"==typeof Map?new Map:void 0;return G=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf(\"[native code]\")}catch(t){return\"function\"==typeof e}}(e))return e;if(\"function\"!=typeof e)throw new TypeError(\"Super expression must either be null or a function\");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,i)}function i(){return q(e,arguments,H(this).constructor)}return i.prototype=Object.create(e.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),U(i,e)},G(e)}function q(e,t,i){if(j())return Reflect.construct.apply(null,arguments);var n=[null];n.push.apply(n,t);var a=new(e.bind.apply(e,n));return i&&U(a,i.prototype),a}function j(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(j=function(){return!!e})()}function U(e,t){return U=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},U(e,t)}function H(e){return H=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},H(e)}i(113),i(8980),i(6910),i(4554),i(875),i(287),i(825);var N=function(e){function t(){return M(this,t),e=this,n=arguments,i=H(i=t),function(e,t){if(t&&(\"object\"==O(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e)}(e,j()?Reflect.construct(i,n||[],H(e).constructor):i.apply(e,n));var e,i,n}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&U(e,t)}(t,e),P(t,[{key:\"addCue\",value:function(e){this.push(e)}},{key:\"removeCue\",value:function(e){var t=this.findIndex(function(t){return t===e});t<0||this.splice(t,1)}},{key:\"getCueById\",value:function(e){var t;return null!==(t=this.find(function(t){return t.id===e}))&&void 0!==t?t:null}}])}(G(Array)),W=P(function e(t){M(this,e),this.all=new N,this.active=new N,this.polling_handler=this.polling.bind(this),this.polling_id=null,this.cues=this.all,this.oncuechange=null,this.id=\"\",this.kind=\"metadata\",this.label=\"\",this.language=\"ja-JP\",this.mode=\"hidden\",this.inBandMetadataTrackDispatchType=\"\",this.sourceBuffer=null,this.listeners=[],this.media=t},[{key:\"startPolling\",value:function(){this.polling_id=window.requestAnimationFrame(this.polling_handler)}},{key:\"stopPolling\",value:function(){null!=this.polling_id&&(window.cancelAnimationFrame(this.polling_id),this.polling_id=null)}},{key:\"polling\",value:function(){var e=this.active,t=this.activeCues;if(e.length!==t.length){var i=null;try{i=new CustomEvent(\"cuechange\")}catch(e){(i=document.createEvent(\"CustomEvent\")).initCustomEvent(\"cuechange\",!1,!1,{})}null!=i&&(this.dispatchEvent(i),this.oncuechange&&this.oncuechange.call(this,i))}else for(var n=0;n<t.length;n++)if(e[n]!==t[n]){var a=null;try{a=new CustomEvent(\"cuechange\")}catch(e){(a=document.createEvent(\"CustomEvent\")).initCustomEvent(\"cuechange\",!1,!1,{})}if(null!=a){this.dispatchEvent(a),this.oncuechange&&this.oncuechange.call(this,a);break}}this.polling_id=window.requestAnimationFrame(this.polling_handler)}},{key:\"activeCues\",get:function(){var e,t=this,i=q(N,function(e){if(Array.isArray(e))return D(e)}(e=this.all.filter(function(e){return e.startTime<=t.media.currentTime&&t.media.currentTime<=e.endTime}))||function(e){if(\"undefined\"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e[\"@@iterator\"])return Array.from(e)}(e)||function(e,t){if(e){if(\"string\"==typeof e)return D(e,t);var i={}.toString.call(e).slice(8,-1);return\"Object\"===i&&e.constructor&&(i=e.constructor.name),\"Map\"===i||\"Set\"===i?Array.from(e):\"Arguments\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?D(e,t):void 0}}(e)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}());return i.sort(function(e,t){return e.startTime===t.startTime?-(e.endTime-t.endTime):e.startTime-t.startTime}),this.active=i,this.active}},{key:\"getCueById\",value:function(e){return this.all.getCueById(e)}},{key:\"addCue\",value:function(e){this.all.addCue(e)}},{key:\"removeCue\",value:function(e){this.all.removeCue(e)}},{key:\"addEventListener\",value:function(e,t){this.listeners.push(t)}},{key:\"removeEventListener\",value:function(e,t){var i=this.listeners.findIndex(function(e){return e===t});i<0||this.listeners.splice(i,1)}},{key:\"dispatchEvent\",value:function(e){var t=this;return\"cuechange\"!==e.type||this.listeners.forEach(function(i){return i.call(t,e)}),!0}}]);function J(e){return J=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},J(e)}function V(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,K(n.key),n)}}function K(e){var t=function(e){if(\"object\"!=J(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,\"string\");if(\"object\"!=J(i))return i;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==J(t)?t:t+\"\"}var X=function(){return e=function e(t,i){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.id=\"\",this.pauseOnExit=!1,this.onenter=null,this.onexit=null,this.track=null,this.startTime=t,this.endTime=i},(t=[{key:\"addEventListener\",value:function(e,t,i){}},{key:\"removeEventListener\",value:function(e,t,i){}},{key:\"dispatchEvent\",value:function(e){return!1}}])&&V(e.prototype,t),Object.defineProperty(e,\"prototype\",{writable:!1}),e;var e,t}();function Y(e,t,i){for(var n=0,a=t;a<i;a++)n<<=7,n|=127&e[a];return n}function $(e,t,i){for(var n=\"\",a=t;a<i;a++)n+=\"%\".concat(e[a].toString(16).padStart(2,\"0\"));return n}function Q(e,t,i){if(window.TextDecoder){var n=new TextDecoder(\"utf-8\"),a=new Uint8Array(Array.prototype.slice.call(e,t,i));return n.decode(a)}return window.decodeURIComponent($(e,t,i))}function Z(e,t,i){if(window.TextDecoder){var n=new TextDecoder(\"iso-8859-1\"),a=new Uint8Array(Array.prototype.slice.call(e,t,i));return n.decode(a)}return window.unescape($(e,t,i))}function ee(e){for(var t=window.atob(e),i=new Uint8Array(t.length),n=0;n<t.length;n++)i[n]=t.charCodeAt(n);return i}function te(e){return te=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},te(e)}function ie(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),i.push.apply(i,n)}return i}function ne(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?ie(Object(i),!0).forEach(function(t){ae(e,t,i[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):ie(Object(i)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))})}return e}function ae(e,t,i){return(t=oe(t))in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function re(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,oe(n.key),n)}}function oe(e){var t=function(e){if(\"object\"!=te(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,\"string\");if(\"object\"!=te(i))return i;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==te(t)?t:t+\"\"}var se=function(){return e=function e(t){var i,n,a,r,o;!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.media=null,this.id3Track=null,this.b24Track=null,this.subtitleElement=null,this.viewCanvas=null,this.rawCanvas=null,this.textContent=null,this.resizeObserver=null,this.mutationObserver=null,this.prevCurrentTime=null,this.highResTimeupdatePollingId=null,this.isShowing=!0,this.isOnSeeking=!1,this.onB24CueChangeDrawed=!1,this.onID3AddtrackHandler=this.onID3Addtrack.bind(this),this.onID3CueChangeHandler=this.onID3CueChange.bind(this),this.onB24CueChangeHandler=this.onB24CueChange.bind(this),this.onHighResTimeupdateHandler=this.onHighResTimeupdate.bind(this),this.onTimeupdateHandler=this.onTimeupdate.bind(this),this.onCanplayHandler=this.onCanplay.bind(this),this.onPlayHandler=this.onPlay.bind(this),this.onPauseHandler=this.onPause.bind(this),this.onSeekingHandler=this.onSeeking.bind(this),this.onSeekedHandler=this.onSeeked.bind(this),this.onResizeHandler=this.onResize.bind(this),this.data_identifier=null!==(i=null==t?void 0:t.data_identifier)&&void 0!==i?i:128,this.data_group_id=null!==(n=null==t?void 0:t.data_group_id)&&void 0!==n?n:1,this.rendererOption=ne(ne({},t),{},{data_identifier:this.data_identifier,data_group_id:this.data_group_id,keepAspectRatio:null===(a=null==t?void 0:t.keepAspectRatio)||void 0===a||a,enableAutoInBandMetadataTextTrackDetection:null===(r=null==t?void 0:t.enableAutoInBandMetadataTextTrackDetection)||void 0===r||r,useStroke:null===(o=null==t?void 0:t.useStroke)||void 0===o||o})},(t=[{key:\"attachMedia\",value:function(e,t){var i;this.detachMedia(),this.media=e,this.subtitleElement=null!=t?t:e.parentElement,this.media.addEventListener(\"canplay\",this.onCanplayHandler),null!==(i=this.rendererOption)&&void 0!==i&&i.useHighResTimeupdate?(this.media.addEventListener(\"play\",this.onPlayHandler),this.media.addEventListener(\"pause\",this.onPauseHandler)):this.media.addEventListener(\"timeupdate\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.setupTrack(),this.setupCanvas()}},{key:\"detachMedia\",value:function(){var e,t,i,n;this.cleanupCanvas(),this.cleanupTrack(),null===(e=this.media)||void 0===e||e.removeEventListener(\"canplay\",this.onCanplayHandler),null===(t=this.media)||void 0===t||t.removeEventListener(\"play\",this.onPlayHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\"pause\",this.onPauseHandler),this.onPause(),null===(n=this.media)||void 0===n||n.removeEventListener(\"timeupdate\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.media=this.subtitleElement=null}},{key:\"dispose\",value:function(){this.detachMedia()}},{key:\"getViewCanvas\",value:function(){return this.viewCanvas}},{key:\"getRawCanvas\",value:function(){return this.rawCanvas}},{key:\"getTextContent\",value:function(){return this.textContent}},{key:\"refresh\",value:function(){this.onResize()}},{key:\"show\",value:function(){this.isShowing=!0,this.onResize()}},{key:\"hide\",value:function(){if(this.isShowing=!1,this.viewCanvas){var e=this.viewCanvas.getContext(\"2d\");e&&e.clearRect(0,0,this.viewCanvas.width,this.viewCanvas.height)}if(this.rawCanvas){var t=this.rawCanvas.getContext(\"2d\");t&&t.clearRect(0,0,this.rawCanvas.width,this.rawCanvas.height)}}},{key:\"isPresent\",value:function(){return this.onB24CueChangeDrawed}},{key:\"pushRawData\",value:function(e,t){var i=new R(t,e).render(ne(ne({},this.rendererOption),{},{width:void 0,height:void 0}));if(null==i)return!1;var n=Number.isFinite(i.endTime)?i.endTime:Number.MAX_SAFE_INTEGER;return this.addB24Cue(e,n,t)}},{key:\"pushBase64Data\",value:function(e,t){var i=ee(t);return this.pushRawData(e,i)}},{key:\"pushData\",value:function(e,t,i){return this.pushRawData(i,t)}},{key:\"pushID3v2PRIVData\",value:function(e,t,i){return\"aribb24.js\"===t&&this.pushRawData(e,i)}},{key:\"pushID3v2TXXXData\",value:function(e,t,i){return\"aribb24.js\"===t&&this.pushBase64Data(e,i)}},{key:\"pushID3v2Data\",value:function(e,t){for(var i=!1,n=0;n<t.length;){var a=n;if(n+3>t.length)break;if(73!==t[n+0]||68!==t[n+1]||51!==t[n+2]){if(0===n){n+=5;continue}break}if((n+=6)+4>t.length)break;var r=Y(t,n+0,n+4);n+=4;var o=a+3+2+1+4+r;if(o>t.length)break;for(var s=n;s<o;){var l=s;if(s+4>t.length)break;var d=Z(t,s+0,s+4);if((s+=4)+4>t.length)break;var p=Y(t,s+0,s+4);s+=6;var c=l+4+4+2+p;if(c>t.length)break;if(\"PRIV\"===d){for(var h=s,u=c;0!==t[s]&&s<c;)s++;var f=Z(t,h,s),A=new Uint8Array(Array.prototype.slice.call(t,s+1,u));this.pushID3v2PRIVData(e,f,A)&&(i=!0)}else if(\"TXXX\"===d){var y=t[s+0],m=s+1;if(3===y){for(;0!==t[s]&&s<c;)s++;for(var b=s,g=s+=1;0!==t[s]&&s<c;)s++;var v=s,C=Q(t,m,b),x=Q(t,g,v);this.pushID3v2TXXXData(e,C,x)&&(i=!0)}else if(0===y){for(;0!==t[s]&&s<c;)s++;for(var w=s,k=s+=1;0!==t[s]&&s<c;)s++;var _=s,S=Z(t,m,w),T=Z(t,k,_);this.pushID3v2TXXXData(e,S,T)&&(i=!0)}}s=c}(n=a+3+2+1+4+r)+3>t.length||51===t[n+0]&&68===t[n+1]&&73===t[n+2]&&(n+=10)}return i}},{key:\"setInBandMetadataTextTrack\",value:function(e){var t;null===(t=this.id3Track)||void 0===t||t.removeEventListener(\"cuechange\",this.onID3CueChangeHandler),this.id3Track=e,this.id3Track.mode=\"hidden\",this.id3Track.addEventListener(\"cuechange\",this.onID3CueChangeHandler)}},{key:\"pushID3v2Cue\",value:function(e){if(!this.id3Track)return!1;var t=e.startTime,i=e;if(\"15260DFFFF49443320FF49443320000F\"===this.id3Track.inBandMetadataTrackDispatchType)return this.pushID3v2Data(t,new Uint8Array(i.data));if(\"com.apple.streaming\"===this.id3Track.inBandMetadataTrackDispatchType){if(\"PRIV\"===i.value.key)return this.pushID3v2PRIVData(t,i.value.info,new Uint8Array(i.value.data));if(\"TXXX\"===i.value.key)return this.pushID3v2TXXXData(t,i.value.info,i.value.data)}else if(\"id3\"===this.id3Track.label){if(\"PRIV\"===i.value.key)return this.pushID3v2PRIVData(t,i.value.info,new Uint8Array(i.value.data));if(\"TXXX\"===i.value.key)return this.pushID3v2TXXXData(t,i.value.info,i.value.data)}else if(\"Timed Metadata\"===this.id3Track.label){if(\"PRIV\"===i.frame.key)return this.pushID3v2PRIVData(t,i.frame.owner,new Uint8Array(i.frame.data));if(\"TXXX\"===i.frame.key)return this.pushID3v2TXXXData(t,i.frame.description,i.frame.data)}return!1}},{key:\"onID3CueChange\",value:function(){this.id3Track&&(this.isOnSeeking||this.onTimeupdate())}},{key:\"addB24Cue\",value:function(e,t,i){var n;if(!this.b24Track)return!1;if(!R.detect(i,this.rendererOption))return!1;var a=new(null!==(n=window.VTTCue)&&void 0!==n?n:window.TextTrackCue)(e,t,\"\");if(a.data=i,window.VTTCue)this.b24Track.addCue(a);else if(window.TextTrackCue){var r;if(Array.prototype.some.call(null!==(r=this.b24Track.cues)&&void 0!==r?r:[],function(t){return t.startTime===e}))return!1;if(this.b24Track.cues){for(var o=[],s=this.b24Track.cues.length-1;s>=0;s--)this.b24Track.cues[s].startTime>=e&&(o.push(this.b24Track.cues[s]),this.b24Track.removeCue(this.b24Track.cues[s]));this.b24Track.addCue(a);for(var l=o.length-1;l>=0;l--)this.b24Track.addCue(o[l])}}return!0}},{key:\"onB24CueChange\",value:function(){if(this.media&&this.b24Track){if(this.viewCanvas){var e=this.viewCanvas.getContext(\"2d\");e&&e.clearRect(0,0,this.viewCanvas.width,this.viewCanvas.height)}if(this.rawCanvas){var t=this.rawCanvas.getContext(\"2d\");t&&t.clearRect(0,0,this.rawCanvas.width,this.rawCanvas.height)}if(this.b24Track.activeCues&&this.b24Track.activeCues.length>0){var i=this.b24Track.activeCues[this.b24Track.activeCues.length-1];if(i.startTime<=this.media.currentTime&&this.media.currentTime<=i.endTime&&!this.isOnSeeking){var n=new R(i.data,i.startTime),a=!1;if(this.isShowing&&this.viewCanvas){var r,o,s,l,d,p,c,h,u=n.render(ne(ne({},this.rendererOption),{},{canvas:this.viewCanvas,width:null!==(r=null===(o=this.rendererOption)||void 0===o?void 0:o.width)&&void 0!==r?r:this.viewCanvas.width,height:null!==(s=null===(l=this.rendererOption)||void 0===l?void 0:l.height)&&void 0!==s?s:this.viewCanvas.height}));null!=(null==u?void 0:u.PRA)&&(null===(c=this.rendererOption)||void 0===c||null===(h=c.PRACallback)||void 0===h||h.call(c,u.PRA)),a=null!==(d=null==u?void 0:u.rendered)&&void 0!==d&&d,this.textContent=null!==(p=null==u?void 0:u.textContent)&&void 0!==p?p:null}this.isShowing&&this.rawCanvas&&n.render(ne(ne({},this.rendererOption),{},{canvas:this.rawCanvas,width:this.rawCanvas.width,height:this.rawCanvas.height,keepAspectRatio:!0})),this.onB24CueChangeDrawed=a}else this.onB24CueChangeDrawed=!1,this.textContent=null;for(var f=this.b24Track.activeCues.length-2;f>=0;f--){var A=this.b24Track.activeCues[f];A.endTime=Math.min(A.endTime,i.startTime),A.startTime===A.endTime&&this.b24Track.removeCue(A)}}else this.onB24CueChangeDrawed=!1,this.textContent=null}else this.onB24CueChangeDrawed=!1}},{key:\"onHighResTimeupdate\",value:function(){this.onTimeupdate(),this.highResTimeupdatePollingId=window.requestAnimationFrame(this.onHighResTimeupdateHandler)}},{key:\"onTimeupdate\",value:function(){if(this.media)if(null!=this.prevCurrentTime)if(this.id3Track&&this.id3Track.cues&&0!==this.id3Track.cues.length)if(this.isOnSeeking)this.prevCurrentTime=this.media.currentTime;else if(Math.abs(this.media.currentTime-this.prevCurrentTime)>1)this.prevCurrentTime=this.media.currentTime;else{for(var e,t,i=new X(Number.NEGATIVE_INFINITY,this.id3Track.cues[0].startTime),n=[i],a=0;a<this.id3Track.cues.length;a++)n.push(this.id3Track.cues[a]);for(var r=0,o=n.length;r+1<o;){var s=this.prevCurrentTime,l=Math.floor((r+o)/2);s<n[l].startTime?o=l:r=l}e=r;for(var d=0,p=n.length;d+1<p;){var c=this.media.currentTime,h=Math.floor((d+p)/2);c<n[h].startTime?p=h:d=h}if(t=d,null!==e&&null!==t&&e!==t){if(e<t)for(var u=t;u>e;u--){var f=n[u];if(f!==i&&this.pushID3v2Cue(f))break}else for(var A=e;A<t;A++){var y=n[A];if(y!==i&&this.pushID3v2Cue(y))break}this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime;else this.prevCurrentTime=this.media.currentTime}},{key:\"onCanplay\",value:function(){this.id3Track&&(this.id3Track.mode=\"hidden\"),this.b24Track&&(this.b24Track.mode=\"hidden\"),null!=this.media&&null==this.prevCurrentTime&&(this.prevCurrentTime=this.media.currentTime-Number.MIN_VALUE)}},{key:\"onPlay\",value:function(){null==this.highResTimeupdatePollingId&&this.onHighResTimeupdate()}},{key:\"onPause\",value:function(){null!=this.highResTimeupdatePollingId&&(window.cancelAnimationFrame(this.highResTimeupdatePollingId),this.highResTimeupdatePollingId=null)}},{key:\"onSeeking\",value:function(){this.isOnSeeking=!0,this.onB24CueChange()}},{key:\"onSeeked\",value:function(){this.isOnSeeking=!1}},{key:\"onResize\",value:function(){if(this.media){var e=window.getComputedStyle(this.media),t=Number.parseInt(e.width)*window.devicePixelRatio,i=Number.parseInt(e.height)*window.devicePixelRatio,n=this.media.videoWidth,a=this.media.videoHeight;if(this.viewCanvas&&(this.viewCanvas.width=Math.round(t),this.viewCanvas.height=Math.round(i)),this.rawCanvas&&(this.rawCanvas.width=n,this.rawCanvas.height=a),this.b24Track){if(this.viewCanvas){var r=this.viewCanvas.getContext(\"2d\");r&&r.clearRect(0,0,this.viewCanvas.width,this.viewCanvas.height)}if(this.rawCanvas){var o=this.rawCanvas.getContext(\"2d\");o&&o.clearRect(0,0,this.rawCanvas.width,this.rawCanvas.height)}if(this.onB24CueChangeDrawed&&this.b24Track.activeCues&&this.b24Track.activeCues.length>0){var s=this.b24Track.activeCues[this.b24Track.activeCues.length-1];if(s.startTime<=this.media.currentTime&&this.media.currentTime<=s.endTime&&!this.isOnSeeking){var l,d,p,c,h=new R(s.data,s.startTime);this.isShowing&&this.viewCanvas&&h.render(ne(ne({},this.rendererOption),{},{canvas:this.viewCanvas,width:null!==(l=null===(d=this.rendererOption)||void 0===d?void 0:d.width)&&void 0!==l?l:this.viewCanvas.width,height:null!==(p=null===(c=this.rendererOption)||void 0===c?void 0:c.height)&&void 0!==p?p:this.viewCanvas.height})),this.isShowing&&this.rawCanvas&&h.render(ne(ne({},this.rendererOption),{},{canvas:this.rawCanvas,width:this.rawCanvas.width,height:this.rawCanvas.height,keepAspectRatio:!0}))}}}}}},{key:\"onID3Addtrack\",value:function(e){if(this.media){var t=e.track;\"metadata\"===t.kind&&(\"15260DFFFF49443320FF49443320000F\"!==t.inBandMetadataTrackDispatchType&&\"com.apple.streaming\"!==t.inBandMetadataTrackDispatchType&&\"id3\"!==t.label||this.setInBandMetadataTextTrack(t))}}},{key:\"setupTrack\",value:function(){var e,t;if(this.media){if(null!==(e=this.rendererOption)&&void 0!==e&&e.useHighResTextTrack)this.b24Track=new W(this.media),this.b24Track.startPolling();else{for(var i=\"ARIB B24 Japanese (data_identifier=0x\".concat(this.data_identifier.toString(16),\", data_group_id=\").concat(this.data_group_id,\")\"),n=0;n<this.media.textTracks.length;n++){var a=this.media.textTracks[n];if(a.label===i){this.b24Track=a;break}}this.b24Track||(this.b24Track=this.media.addTextTrack(\"metadata\",i,\"ja\"),this.b24Track.mode=\"hidden\")}if(this.b24Track.addEventListener(\"cuechange\",this.onB24CueChangeHandler),null!==(t=this.rendererOption)&&void 0!==t&&t.enableAutoInBandMetadataTextTrackDetection){for(var r=0;r<this.media.textTracks.length;r++){var o=this.media.textTracks[r];if(\"metadata\"===o.kind&&(\"15260DFFFF49443320FF49443320000F\"===o.inBandMetadataTrackDispatchType||\"com.apple.streaming\"===o.inBandMetadataTrackDispatchType||\"id3\"===o.label)){this.setInBandMetadataTextTrack(o);break}}this.media.textTracks.addEventListener(\"addtrack\",this.onID3AddtrackHandler)}this.media.addEventListener(\"seeking\",this.onSeekingHandler),this.media.addEventListener(\"seeked\",this.onSeekedHandler)}}},{key:\"setupCanvas\",value:function(){var e,t=this;this.media&&this.subtitleElement&&(this.viewCanvas=document.createElement(\"canvas\"),this.viewCanvas.style.position=\"absolute\",this.viewCanvas.style.top=this.viewCanvas.style.left=\"0\",this.viewCanvas.style.pointerEvents=\"none\",this.viewCanvas.style.width=\"100%\",this.viewCanvas.style.height=\"100%\",null!==(e=this.rendererOption)&&void 0!==e&&e.enableRawCanvas&&(this.rawCanvas=document.createElement(\"canvas\")),this.onResize(),this.subtitleElement.appendChild(this.viewCanvas),this.media.addEventListener(\"resize\",this.onResizeHandler),window.ResizeObserver?(this.resizeObserver=new ResizeObserver(function(){t.onResize()}),this.resizeObserver.observe(this.media)):(window.addEventListener(\"resize\",this.onResizeHandler),window.MutationObserver&&(this.mutationObserver=new MutationObserver(function(){t.onResize()}),this.mutationObserver.observe(this.media,{attributes:!0,attributeFilter:[\"class\",\"style\"]}))))}},{key:\"cleanupTrack\",value:function(){var e,t,i,n,a,r;if(this.b24Track)if(null!==(r=this.rendererOption)&&void 0!==r&&r.useHighResTextTrack)this.b24Track.stopPolling();else if(this.b24Track.cues)for(var o=this.b24Track.cues.length-1;o>=0;o--)this.b24Track.removeCue(this.b24Track.cues[o]);null===(e=this.b24Track)||void 0===e||e.removeEventListener(\"cuechange\",this.onB24CueChangeHandler),null===(t=this.id3Track)||void 0===t||t.removeEventListener(\"cuechange\",this.onID3CueChangeHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\"seeking\",this.onSeekingHandler),null===(n=this.media)||void 0===n||n.removeEventListener(\"seeked\",this.onSeekedHandler),null===(a=this.media)||void 0===a||a.textTracks.removeEventListener(\"addtrack\",this.onID3AddtrackHandler),this.b24Track=this.id3Track=null}},{key:\"cleanupCanvas\",value:function(){var e;window.removeEventListener(\"resize\",this.onResizeHandler),null===(e=this.media)||void 0===e||e.removeEventListener(\"resize\",this.onResizeHandler),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.mutationObserver&&(this.mutationObserver.disconnect(),this.mutationObserver=null),this.viewCanvas&&this.subtitleElement&&this.subtitleElement.removeChild(this.viewCanvas),this.viewCanvas&&(this.viewCanvas.width=this.viewCanvas.height=0),this.rawCanvas&&(this.rawCanvas.width=this.rawCanvas.height=0),this.viewCanvas=this.rawCanvas=null}}])&&re(e.prototype,t),Object.defineProperty(e,\"prototype\",{writable:!1}),e;var e,t}();function le(e,t,i){for(var n=-1,a=t;a<i;a++){n^=e[a];for(var r=0;r<8;r++)1&n?n=n>>>1^3988292384:n>>>=1}return~n}function de(e){return de=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},de(e)}function pe(e){return function(e){if(Array.isArray(e))return he(e)}(e)||function(e){if(\"undefined\"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e[\"@@iterator\"])return Array.from(e)}(e)||ce(e)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}function ce(e,t){if(e){if(\"string\"==typeof e)return he(e,t);var i={}.toString.call(e).slice(8,-1);return\"Object\"===i&&e.constructor&&(i=e.constructor.name),\"Map\"===i||\"Set\"===i?Array.from(e):\"Arguments\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?he(e,t):void 0}}function he(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,n=Array(t);i<t;i++)n[i]=e[i];return n}function ue(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,fe(n.key),n)}}function fe(e){var t=function(e){if(\"object\"!=de(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,\"string\");if(\"object\"!=de(i))return i;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==de(t)?t:t+\"\"}var Ae=null,ye=function(){function e(t,i){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.text=\"\",this.svg=null,this.groups=new Map,this.GL=0,this.GR=2,this.G_BACK=[a.get(0),a.get(1),a.get(2),o.get(31)],this.DRCS_mapping=new Map([[15,new Map],[16,new Map],[17,new Map],[18,new Map],[19,new Map],[20,new Map],[21,new Map],[22,new Map],[23,new Map],[24,new Map],[25,new Map],[26,new Map],[27,new Map],[28,new Map],[29,new Map],[30,new Map]]),this.swf_x=1920,this.swf_y=1080,this.sdf_x=1920,this.sdf_y=1080,this.sdp_x=0,this.sdp_y=0,this.ssm_x=72,this.ssm_y=72,this.shs=8,this.svs=48,this.text_size_x=1,this.text_size_y=1,this.text_type=\"NSZ\",this.position_x=-1,this.position_y=-1,this.pallet=0,this.fg_color=l[this.pallet][7],this.bg_color=l[this.pallet][8],this.force_bg_color=null,this.hlc=0,this.prev_hlc=0,this.stl=!1,this.orn=null,this.force_orn=null,this.flc=15,this.non_spacing=\"\",this.timeElapsed=0,this.endTime=null,this.rendered=!1,this.PRA=null,this.normalFont=\"monospace\",this.gaijiFont=this.normalFont,this.drcsReplacement=!1,this.drcsReplaceMapping=new Map,this.usePUA=!1,this.pes=t,this.startTime=i}return t=e,i=[{key:\"width\",value:function(){return Math.floor((this.shs+this.ssm_x)*this.text_size_x)}},{key:\"height\",value:function(){return Math.floor((this.svs+this.ssm_y)*this.text_size_y)}},{key:\"move_absolute_dot\",value:function(e,t){this.position_x=e,this.position_y=t}},{key:\"move_absolute_pos\",value:function(e,t){this.position_x=this.sdp_x+e*this.width(),this.position_y=this.sdp_y+(t+1)*this.height()}},{key:\"move_relative_pos\",value:function(e,t){for((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs));e<0;)this.position_x-=this.width(),e++,this.position_x<this.sdp_x&&(this.position_x=this.sdp_x+this.sdf_x-this.width(),t--);for(;e>0;)this.position_x+=this.width(),e--,this.position_x>=this.sdp_x+this.sdf_x&&(this.position_x=this.sdp_x,t++);for(;t<0;)this.position_y-=this.height(),t++;for(;t>0;)this.position_y+=this.height(),t--}},{key:\"move_newline\",value:function(){(this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),this.position_x=this.sdp_x,this.position_y=this.position_y+this.height()}},{key:\"render\",value:function(t){var i,n,a,r,o,s,l,d;this.svg=null!==(i=null==t?void 0:t.svg)&&void 0!==i?i:null,this.force_orn=null!==(n=\"boolean\"==typeof(null==t?void 0:t.forceStrokeColor)?null==t?void 0:t.forceStrokeColor:e.getRGBAColorCode(null==t?void 0:t.forceStrokeColor))&&void 0!==n?n:null,this.force_bg_color=null!==(a=e.getRGBAColorCode(null==t?void 0:t.forceBackgroundColor))&&void 0!==a?a:null,this.normalFont=null!==(r=null==t?void 0:t.normalFont)&&void 0!==r?r:this.normalFont,this.gaijiFont=null!==(o=null==t?void 0:t.gaijiFont)&&void 0!==o?o:this.normalFont,this.drcsReplacement=null!==(s=null==t?void 0:t.drcsReplacement)&&void 0!==s&&s,this.drcsReplaceMapping=new Map(A);for(var p,c=Object.entries(null!==(p=null==t?void 0:t.drcsReplaceMapping)&&void 0!==p?p:{}),h=0;h<c.length;h++){var u=c[h];this.drcsReplaceMapping.set(u[0],u[1])}if(this.usePUA=null!==(l=null==t?void 0:t.usePUA)&&void 0!==l&&l,!e.detect(this.pes,t))return null;if(this.svg)for(;this.svg.firstChild;)this.svg.removeChild(this.svg.firstChild);for(var f=3+(15&this.pes[2]),y=(this.pes[f+0],(this.pes[f+3]<<8)+this.pes[f+4]),m=f+9;m<f+(5+y);){this.pes[m+0];var b=this.pes[m+1],g=this.pes[m+2]<<16|this.pes[m+3]<<8|this.pes[m+4];32===b?this.parseText(m+5,m+5+g):48==b?this.parseDRCS(1,m+5,m+5+g):49==b?this.parseDRCS(2,m+5,m+5+g):53==b&&this.parseBitmap(m+5,m+5+g),m+=5+g}return{startTime:this.startTime,endTime:null!==(d=this.endTime)&&void 0!==d?d:Number.POSITIVE_INFINITY,rendered:this.rendered,textContent:this.rendered?this.text:null,PRA:this.PRA}}},{key:\"parseText\",value:function(e,t){for(;e<t;)if(32<this.pes[e]&&this.pes[e]<127){var i=0,n=this.G_BACK[this.GL];if(!n)return;for(var o=0;o<n.bytes;o++)i<<=8,i|=127&this.pes[e+o];this.renderCharacter(i,n),e+=n.bytes}else if(160<this.pes[e]&&this.pes[e]<255){var d=0,p=this.G_BACK[this.GR];if(!p)return;for(var c=0;c<p.bytes;c++)d<<=8,d|=127&this.pes[e+c];this.renderCharacter(d,p),e+=p.bytes}else if(0===this.pes[e])e+=1;else if(7===this.pes[e])e+=1;else if(8===this.pes[e])this.move_relative_pos(-1,0),e+=1;else if(9===this.pes[e])this.move_relative_pos(1,0),e+=1;else if(10===this.pes[e])this.move_relative_pos(0,1),e+=1;else if(11===this.pes[e])this.move_relative_pos(0,-1),e+=1;else if(12===this.pes[e])null!=this.startTime&&this.timeElapsed>0&&(this.endTime=this.startTime+this.timeElapsed),e+=1;else if(13===this.pes[e])this.move_newline(),e+=1;else if(14===this.pes[e])this.GL=1,e+=1;else if(15===this.pes[e])this.GL=0,e+=1;else if(22===this.pes[e]){var h=63&this.pes[e+1];this.move_relative_pos(h,0),e+=2}else if(24===this.pes[e])e+=1;else if(25===this.pes[e]){var u=0,f=this.G_BACK[2];if(!f)return;for(var A=0;A<f.bytes;A++)u<<=8,u|=127&this.pes[e+1+A];this.renderCharacter(u,f),e+=1+f.bytes}else if(27===this.pes[e])if(110===this.pes[e+1])this.GL=2,e+=2;else if(111==this.pes[e+1])this.GL=3,e+=2;else if(126==this.pes[e+1])this.GR=1,e+=2;else if(125==this.pes[e+1])this.GR=2,e+=2;else if(124==this.pes[e+1])this.GR=3,e+=2;else if(40<=this.pes[e+1]&&this.pes[e+1]<=43){var y=this.pes[e+1]-40;32===this.pes[e+2]?(this.G_BACK[y]=s.get(this.pes[e+3]),e+=4):(this.G_BACK[y]=r.get(this.pes[e+2]),e+=3)}else{if(36!==this.pes[e+1])return;if(40<=this.pes[e+2]&&this.pes[e+2]<=43){var m=this.pes[e+2]-40;32===this.pes[e+3]?(this.G_BACK[m]=s.get(this.pes[e+4]),e+=5):(this.G_BACK[m]=r.get(this.pes[e+3]),e+=4)}else this.G_BACK[0]=r.get(this.pes[e+2]),e+=3}else if(28===this.pes[e]){var b=63&this.pes[e+1],g=63&this.pes[e+2];this.move_absolute_pos(g,b),e+=3}else if(29===this.pes[e]){var v=0,C=this.G_BACK[3];if(!C)return;for(var x=0;x<C.bytes;x++)v<<=8,v|=127&this.pes[e+1+x];this.renderCharacter(v,C),e+=1+C.bytes}else if(30===this.pes[e])e+=1;else if(31===this.pes[e])e+=1;else if(32===this.pes[e]){var w=a.get(0);if(!w)return;this.renderCharacter(8481,w),e+=1}else if(127===this.pes[e])e+=1;else if(128===this.pes[e])this.fg_color=l[this.pallet][0],e+=1;else if(129===this.pes[e])this.fg_color=l[this.pallet][1],e+=1;else if(130===this.pes[e])this.fg_color=l[this.pallet][2],e+=1;else if(131===this.pes[e])this.fg_color=l[this.pallet][3],e+=1;else if(132===this.pes[e])this.fg_color=l[this.pallet][4],e+=1;else if(133===this.pes[e])this.fg_color=l[this.pallet][5],e+=1;else if(134===this.pes[e])this.fg_color=l[this.pallet][6],e+=1;else if(135===this.pes[e])this.fg_color=l[this.pallet][7],e+=1;else if(136===this.pes[e])this.text_size_x=.5,this.text_size_y=.5,this.text_type=\"SSZ\",e+=1;else if(137===this.pes[e])this.text_size_x=.5,this.text_size_y=1,this.text_type=\"MSZ\",e+=1;else if(138===this.pes[e])this.text_size_x=1,this.text_size_y=1,this.text_type=\"NSZ\",e+=1;else{if(139===this.pes[e])return;if(144===this.pes[e]){var k=this.pes[e+1];if(32==k){var _=15&this.pes[e+2];this.pallet=_,e+=3}else{var S=15&k;64==(112&k)?this.fg_color=l[this.pallet][S]:80==(112&k)&&(this.bg_color=l[this.pallet][S]),e+=2}}else if(145===this.pes[e]){var T=15&this.pes[e+1];this.flc=T,e+=2}else{if(146===this.pes[e])return;if(147===this.pes[e])return;if(148===this.pes[e])return;if(149===this.pes[e])return;if(151===this.pes[e])this.prev_hlc=this.hlc,this.hlc=15&this.pes[e+1],e+=2;else{if(152===this.pes[e])return;if(153===this.pes[e])this.stl=!1,e+=1;else if(154===this.pes[e])this.stl=!0,e+=1;else if(155===this.pes[e]){for(var B=e,E=-1,I=-1;B+1<t;)if(B+=1,32===this.pes[B])E<0&&(E=B);else if(59===this.pes[B])E<0&&I<0&&(I=B);else{if(66===this.pes[B])break;if(83===this.pes[B]){var F=e+1,R=0;if(I>=0||E<0)return;for(;F<E;)R*=10,R+=15&this.pes[F],F++;if(5===R)this.swf_x=3840,this.swf_y=2160;else if(7===R)this.swf_x=1920,this.swf_y=1080;else{if(9!=R)return;this.swf_x=1440,this.swf_y=960}break}if(84===this.pes[B])break;if(86===this.pes[B]){for(var O=e+1,D=0,M=0;O<I;)D*=10,D+=15&this.pes[O],O++;for(O++;O<E;)M*=10,M+=15&this.pes[O],O++;this.sdf_x=2*D,this.sdf_y=2*M;break}if(87===this.pes[B]){for(var L=e+1,P=0,z=0;L<I;)P*=10,P+=15&this.pes[L],L++;for(L++;L<E;)z*=10,z+=15&this.pes[L],L++;this.ssm_x=2*P,this.ssm_y=2*z;break}if(88===this.pes[B]){for(var G=e+1,q=0;G<E;)q*=10,q+=15&this.pes[G],G++;this.shs=2*q;break}if(89===this.pes[B]){for(var j=e+1,U=0;j<E;)U*=10,U+=15&this.pes[j],j++;this.svs=2*U;break}if(91===this.pes[B])break;if(92===this.pes[B])break;if(93===this.pes[B])break;if(94===this.pes[B])break;if(95===this.pes[B]){for(var H=e+1,N=0,W=0;H<I;)N*=10,N+=15&this.pes[H],H++;for(H++;H<E;)W*=10,W+=15&this.pes[H],H++;this.sdp_x=2*N,this.sdp_y=2*W;break}if(97===this.pes[B]){for(var J=e+1,V=0,K=0;J<I;)V*=10,V+=15&this.pes[J],J++;for(J++;J<E;)K*=10,K+=15&this.pes[J],J++;this.move_absolute_dot(2*V,2*K);break}if(98===this.pes[B])break;if(99===this.pes[B]){var X=this.pes[e+1];if(48==X)this.orn=null;else if(49==X){var Y=10*(15&this.pes[e+3])+(15&this.pes[e+4]),$=10*(15&this.pes[e+5])+(15&this.pes[e+6]);this.orn=l[Y][$]}break}if(100===this.pes[B])break;if(101===this.pes[B])break;if(102===this.pes[B])break;if(103===this.pes[B])break;if(104===this.pes[B]){for(var Q=e+1,Z=0;Q<E;)Z*=10,Z+=15&this.pes[Q],Q++;this.PRA=Z;break}if(105===this.pes[B])break;if(106===this.pes[B])break;if(110===this.pes[B])break;if(111===this.pes[B])break}e=B+1}else{if(157!==this.pes[e])return;if(32!=this.pes[e+1])return void this.pes[e+1];var ee=63&this.pes[e+2];this.timeElapsed+=ee/10,e+=3}}}}}},{key:\"parseDRCS\",value:function(e,t,i){for(this.pes[t+0],t+=1;t<i;){var n=this.pes[t+0]<<8|this.pes[t+1],a=this.pes[t+2];t+=3;for(var r=0;r<a;r++){this.pes[t+0];var o=15&this.pes[t+0];if(0===o||1===o){var l=this.pes[t+1]+2,d=this.pes[t+2],p=this.pes[t+3],c=l.toString(2).length-l.toString(2).replace(/0*$/,\"\").length,h=Math.floor(d*p*c/8),u=new Uint8Array(Array.prototype.slice.call(this.pes,t+4,t+4+h));if(1===e){var f,A,y=64+((3840&n)>>8),m=127&n,b=null===(f=s.get(y))||void 0===f?void 0:f.alphabet;b&&(null===(A=this.DRCS_mapping.get(b))||void 0===A||A.set(m,u))}else{var g,v=32639&n;null===(g=this.DRCS_mapping.get(15))||void 0===g||g.set(v,u)}t+=4+h}}}}},{key:\"renderCharacter\",value:function(t,i){if((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),null!==this.svg){if(0===i.alphabet){var n=((65280&t)>>8)-33,r=(255&t)-33;if(0===n&&12<=r&&r<=17)return void(this.non_spacing=[\"́\",\"̀\",\"̈\",\"̂\",\"̅\",\"̲\"][r-12]);if(1===n&&93===r)return void(this.non_spacing+=\"⃝\")}if(31!==i.alphabet){this.rendered||this.svg.setAttribute(\"viewBox\",\"0 0 \".concat(this.swf_x,\" \").concat(this.swf_y)),this.rendered=!0;var s=this.force_bg_color||this.bg_color,l=e.getAlphaFromColorCode(s);if(!this.groups.has(l)){var A=document.createElementNS(\"http://www.w3.org/2000/svg\",\"g\");A.setAttribute(\"opacity\",\"\".concat(l/255)),this.groups.set(l,A),this.svg.appendChild(A)}var y=this.groups.get(l),m=document.createElementNS(\"http://www.w3.org/2000/svg\",\"rect\");if(m.setAttribute(\"shape-rendering\",\"crispEdges\"),m.setAttribute(\"x\",\"\".concat(this.position_x)),m.setAttribute(\"y\",\"\".concat(this.position_y-this.height())),m.setAttribute(\"width\",\"\".concat(this.width()+1)),m.setAttribute(\"height\",\"\".concat(this.height()+1)),m.setAttribute(\"fill\",\"\".concat(e.getRGBfromColorCode(s))),y.appendChild(m),1&this.hlc){var b=document.createElementNS(\"http://www.w3.org/2000/svg\",\"line\");b.setAttribute(\"shape-rendering\",\"crispEdges\"),b.setAttribute(\"x1\",\"\".concat(this.position_x)),b.setAttribute(\"y1\",\"\".concat(this.position_y-1)),b.setAttribute(\"x2\",\"\".concat(this.position_x+this.width())),b.setAttribute(\"y2\",\"\".concat(this.position_y-1)),b.setAttribute(\"stroke\",\"\".concat(e.getRGBAfromColorCode(this.fg_color))),b.setAttribute(\"stroke-width\",\"\".concat(2)),this.svg.appendChild(b)}if(2&this.hlc){var g=document.createElementNS(\"http://www.w3.org/2000/svg\",\"line\");g.setAttribute(\"shape-rendering\",\"crispEdges\"),g.setAttribute(\"x1\",\"\".concat(this.position_x+this.width()-1)),g.setAttribute(\"y1\",\"\".concat(this.position_y-this.height())),g.setAttribute(\"x2\",\"\".concat(this.position_x+this.width()-1)),g.setAttribute(\"y2\",\"\".concat(this.position_y)),g.setAttribute(\"stroke\",\"\".concat(e.getRGBAfromColorCode(this.fg_color))),g.setAttribute(\"stroke-width\",\"\".concat(2)),this.svg.appendChild(g)}if(4&this.hlc){var v=document.createElementNS(\"http://www.w3.org/2000/svg\",\"line\");v.setAttribute(\"shape-rendering\",\"crispEdges\"),v.setAttribute(\"x1\",\"\".concat(this.position_x)),v.setAttribute(\"y1\",\"\".concat(this.position_y-this.height()+1)),v.setAttribute(\"x2\",\"\".concat(this.position_x+this.width())),v.setAttribute(\"y2\",\"\".concat(this.position_y-this.height()+1)),v.setAttribute(\"stroke\",\"\".concat(e.getRGBAfromColorCode(this.fg_color))),v.setAttribute(\"stroke-width\",\"\".concat(2)),this.svg.appendChild(v)}if(8&this.hlc){var C=document.createElementNS(\"http://www.w3.org/2000/svg\",\"line\");C.setAttribute(\"shape-rendering\",\"crispEdges\"),C.setAttribute(\"x1\",\"\".concat(this.position_x+1)),C.setAttribute(\"y1\",\"\".concat(this.position_y-this.height())),C.setAttribute(\"x2\",\"\".concat(this.position_x+1)),C.setAttribute(\"y2\",\"\".concat(this.position_y)),C.setAttribute(\"stroke\",\"\".concat(e.getRGBAfromColorCode(this.fg_color))),C.setAttribute(\"stroke-width\",\"\".concat(2)),this.svg.appendChild(C)}if(this.stl){var x=document.createElementNS(\"http://www.w3.org/2000/svg\",\"line\");x.setAttribute(\"shape-rendering\",\"crispEdges\"),x.setAttribute(\"x1\",\"\".concat(this.position_x)),x.setAttribute(\"y1\",\"\".concat(this.position_y-1)),x.setAttribute(\"x2\",\"\".concat(this.position_x+this.width())),x.setAttribute(\"y2\",\"\".concat(this.position_y-1)),x.setAttribute(\"stroke\",\"\".concat(e.getRGBAfromColorCode(this.fg_color))),x.setAttribute(\"stroke-width\",\"\".concat(2)),this.svg.appendChild(x)}}if(0===i.alphabet){var w=94*(((65280&t)>>8)-33)+((255&t)-33),k=7896;if(w<k){var S=d[w];this.renderFont(S)}else if(this.usePUA){var T=p[w-k];this.renderFont(T)}else{var B=c[w-k];this.renderFont(B)}this.move_relative_pos(1,0)}else if(1===i.alphabet){var E=h[t-33];this.renderFont(E),this.move_relative_pos(1,0)}else if(2===i.alphabet){var I=u[t-33];this.renderFont(I),this.move_relative_pos(1,0)}else if(3===i.alphabet){var F=f[t-33];this.renderFont(F),this.move_relative_pos(1,0)}else{if(31===i.alphabet)return void(96===t?(this.G_BACK=[a.get(0),a.get(1),a.get(2),o.get(31)],this.GL=0,this.GR=2):97===t?(this.G_BACK=[a.get(0),a.get(3),a.get(2),o.get(31)],this.GL=0,this.GR=2):98===t?(this.G_BACK=[a.get(0),o.get(16),a.get(2),o.get(31)],this.GL=0,this.GR=2):99===t?(this.G_BACK=[a.get(4),a.get(6),a.get(7),o.get(31)],this.GL=0,this.GR=2):100===t?(this.G_BACK=[a.get(4),a.get(5),a.get(7),o.get(31)],this.GL=0,this.GR=2):101===t?(this.G_BACK=[a.get(4),o.get(16),a.get(7),o.get(31)],this.GL=0,this.GR=2):102===t?(this.G_BACK=[o.get(16),o.get(17),o.get(18),o.get(31)],this.GL=0,this.GR=2):103===t?(this.G_BACK=[o.get(19),o.get(20),o.get(21),o.get(31)],this.GL=0,this.GR=2):104===t?(this.G_BACK=[o.get(22),o.get(23),o.get(24),o.get(31)],this.GL=0,this.GR=2):105===t?(this.G_BACK=[o.get(25),o.get(26),o.get(27),o.get(31)],this.GL=0,this.GR=2):106===t?(this.G_BACK=[o.get(28),o.get(29),o.get(30),o.get(31)],this.GL=0,this.GR=2):107===t?(this.G_BACK=[a.get(0),o.get(17),a.get(2),o.get(31)],this.GL=0,this.GR=2):108===t?(this.G_BACK=[a.get(0),o.get(18),a.get(2),o.get(31)],this.GL=0,this.GR=2):109===t?(this.G_BACK=[a.get(0),o.get(19),a.get(2),o.get(31)],this.GL=0,this.GR=2):110===t?(this.G_BACK=[a.get(3),a.get(2),a.get(1),o.get(31)],this.GL=0,this.GR=2):111===t&&(this.G_BACK=[a.get(1),a.get(4),o.get(16),o.get(31)],this.GL=0,this.GR=2));var R,O=null===(R=this.DRCS_mapping.get(i.alphabet))||void 0===R?void 0:R.get(32639&t);if(!O)return;var D=_(O.buffer);if(this.drcsReplacement&&this.drcsReplaceMapping.has(D.toLowerCase()))this.renderFont(this.drcsReplaceMapping.get(D.toLowerCase()));else if(this.drcsReplacement&&this.drcsReplaceMapping.has(D.toUpperCase()))this.renderFont(this.drcsReplaceMapping.get(D.toUpperCase()));else{var M=document.createElement(\"canvas\"),L=Math.floor(this.ssm_x*this.text_size_x/2),P=Math.floor(this.ssm_y*this.text_size_y/2),z=Math.floor(8*O.length/(L*P));M.width=2*(L+4),M.height=2*(P+4);var G=M.getContext(\"2d\");if(!G)return;var q=this.getOrnColorCode();if(q&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color)){G.fillStyle=e.getRGBAfromColorCode(q);for(var j=-2;j<=2;j++)for(var U=-2;U<=2;U++)for(var H=0;H<P;H++)for(var N=0;N<L;N++){for(var W=0,J=0;J<z;J++){var V=7-((H*L+N)*z+J)%8;W*=2,W+=(O[Math.floor(((H*L+N)*z+J)/8)]&1<<V)>>V}W>0&&G.fillRect(2*(2+N+U),2*(2+H+j),2,2)}}G.fillStyle=e.getRGBAfromColorCode(this.fg_color);for(var K=0;K<P;K++)for(var X=0;X<L;X++){for(var Y=0,$=0;$<z;$++){var Q=7-((K*L+X)*z+$)%8;Y*=2,Y+=(O[Math.floor(((K*L+X)*z+$)/8)]&1<<Q)>>Q}Y>0&&G.fillRect(2*(2+X),2*(2+K),2,2)}var Z=document.createElementNS(\"http://www.w3.org/2000/svg\",\"image\");if(Z.setAttribute(\"href\",M.toDataURL()),Z.setAttribute(\"x\",\"\".concat(this.position_x+Math.floor(this.shs*this.text_size_x/2)-4)),Z.setAttribute(\"y\",\"\".concat(this.position_y+Math.floor(this.svs*this.text_size_y/2)-this.height()-4)),Z.setAttribute(\"width\",\"\".concat(M.width/2*2)),Z.setAttribute(\"height\",\"\".concat(M.height/2*2)),0===this.flc){var ee=document.createElementNS(\"http://www.w3.org/2000/svg\",\"animate\");ee.setAttribute(\"attributeName\",\"opacity\"),ee.setAttribute(\"values\",\"1;0\"),ee.setAttribute(\"dur\",\"1s\"),ee.setAttribute(\"calcMode\",\"discrete\"),ee.setAttribute(\"repeatCount\",\"indefinite\"),Z.appendChild(ee)}else if(7===this.flc){var te=document.createElementNS(\"http://www.w3.org/2000/svg\",\"animate\");te.setAttribute(\"attributeName\",\"opacity\"),te.setAttribute(\"values\",\"0;1\"),te.setAttribute(\"dur\",\"1s\"),te.setAttribute(\"calcMode\",\"discrete\"),te.setAttribute(\"repeatCount\",\"indefinite\"),Z.appendChild(te)}this.svg.appendChild(Z)}this.move_relative_pos(1,0)}}}},{key:\"renderFont\",value:function(t){var i,n;t+=this.non_spacing,this.non_spacing=\"\",.5===this.text_size_x&&.5===this.text_size_y&&(u.includes(t)||f.includes(t))||(this.text+=t);var a=y.has(t),r=a?this.gaijiFont:this.normalFont;if(null!=Ae&&null!==(i=Ae)&&void 0!==i&&i.has(t)){var o=Ae.get(t),s=o.viewBox,l=o.path;this.renderPath(s,l)}else{a&&(t+=\"︎\");var d=document.createElementNS(\"http://www.w3.org/2000/svg\",\"text\");if(d.setAttribute(\"x\",\"0\"),d.setAttribute(\"y\",\"0\"),d.setAttribute(\"transform\",\"scale(\".concat(this.text_size_x,\" \").concat(this.text_size_y,\") translate(\").concat((this.position_x+this.width()/2)/this.text_size_x,\" \").concat((this.position_y-this.height()/2)/this.text_size_y,\")\")),d.setAttribute(\"transform-origin\",\"0 0\"),d.setAttribute(\"font-size\",\"\".concat(this.ssm_x)),d.setAttribute(\"font-family\",r),d.setAttribute(\"dominant-baseline\",\"central\"),d.setAttribute(\"text-anchor\",\"middle\"),d.setAttribute(\"fill\",e.getRGBAfromColorCode(this.fg_color)),d.setAttribute(\"paint-order\",\"stroke\"),d.setAttribute(\"stroke-linejoin\",\"round\"),d.setAttribute(\"stroke-width\",this.getOrnColorCode()?\"\".concat(8):\"0\"),d.setAttribute(\"stroke\",this.getOrnColorCode()?e.getRGBAfromColorCode(this.getOrnColorCode()):\"transparent\"),d.appendChild(document.createTextNode(t)),0===this.flc){var p=document.createElementNS(\"http://www.w3.org/2000/svg\",\"animate\");p.setAttribute(\"attributeName\",\"opacity\"),p.setAttribute(\"values\",\"1;0\"),p.setAttribute(\"dur\",\"1s\"),p.setAttribute(\"calcMode\",\"discrete\"),p.setAttribute(\"repeatCount\",\"indefinite\"),d.appendChild(p)}else if(7===this.flc){var c=document.createElementNS(\"http://www.w3.org/2000/svg\",\"animate\");c.setAttribute(\"attributeName\",\"opacity\"),c.setAttribute(\"values\",\"0;1\"),c.setAttribute(\"dur\",\"1s\"),c.setAttribute(\"calcMode\",\"discrete\"),c.setAttribute(\"repeatCount\",\"indefinite\"),d.appendChild(c)}null===(n=this.svg)||void 0===n||n.appendChild(d)}}},{key:\"renderPath\",value:function(t,i){var n;document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\").setAttribute(\"viewBox\",\"\".concat(t[0],\" \").concat(t[1],\" \").concat(t[2],\" \").concat(t[3]));var a=this.ssm_x*this.text_size_x/(t[2]-t[0]),r=this.ssm_y*this.text_size_y/(t[3]-t[1]),o=this.shs*this.text_size_x/2,s=this.svs*this.text_size_y/2,l=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");if(l.setAttribute(\"d\",i),l.setAttribute(\"x\",\"0\"),l.setAttribute(\"y\",\"0\"),l.setAttribute(\"transform\",\"scale(\".concat(a,\" \").concat(r,\") translate(\").concat((this.position_x+o)/a,\" \").concat((this.position_y+s-this.height())/r,\")\")),l.setAttribute(\"transform-origin\",\"0 0\"),l.setAttribute(\"fill\",e.getRGBAfromColorCode(this.fg_color)),l.setAttribute(\"paint-order\",\"stroke\"),l.setAttribute(\"stroke-linejoin\",\"round\"),l.setAttribute(\"stroke-width\",this.getOrnColorCode()?\"\".concat(4/Math.min(a,r)):\"0\"),l.setAttribute(\"stroke\",this.getOrnColorCode()?e.getRGBAfromColorCode(this.getOrnColorCode()):\"transparent\"),0===this.flc){var d=document.createElementNS(\"http://www.w3.org/2000/svg\",\"animate\");d.setAttribute(\"attributeName\",\"opacity\"),d.setAttribute(\"values\",\"1;0\"),d.setAttribute(\"dur\",\"1s\"),d.setAttribute(\"calcMode\",\"discrete\"),d.setAttribute(\"repeatCount\",\"indefinite\"),l.appendChild(d)}else if(7===this.flc){var p=document.createElementNS(\"http://www.w3.org/2000/svg\",\"animate\");p.setAttribute(\"attributeName\",\"opacity\"),p.setAttribute(\"values\",\"0;1\"),p.setAttribute(\"dur\",\"1s\"),p.setAttribute(\"calcMode\",\"discrete\"),p.setAttribute(\"repeatCount\",\"indefinite\"),l.appendChild(p)}null===(n=this.svg)||void 0===n||n.appendChild(l)}},{key:\"parseBitmap\",value:function(e,t){if(null!==this.svg){this.rendered||this.svg.setAttribute(\"viewBox\",\"0 0 \".concat(this.swf_x,\" \").concat(this.swf_y)),this.rendered=!0;var i=this.pes[e]<<8|this.pes[e+1];e+=2;var n=this.pes[e]<<8|this.pes[e+1];e+=2;var a=this.pes[e];e+=1;var r=new Set(this.pes.subarray(e,e+a));if(!((e+=a)+33>t)){var o=this.pes.subarray(e,e+33),s=this.pes.subarray(e+33,t),d=new Uint8Array(o.byteLength+s.byteLength+396+140),p=new DataView(d.buffer);d.set(o,0),d.set(s,569);for(var c=0;c<8;c++)for(var h=0;h<16;h++)if(!r.has(16*c+h)){var u=l[c][h],f=Number.parseInt(u.substring(1,3),16),A=Number.parseInt(u.substring(3,5),16),y=Number.parseInt(u.substring(5,7),16),m=Number.parseInt(u.substring(7,9),16);d[41+3*(16*c+h)]=f,d[41+3*(16*c+h)+1]=A,d[41+3*(16*c+h)+2]=y,d[437+(16*c+h)]=m}p.setInt32(33,384,!1),d[37]=\"P\".charCodeAt(0),d[38]=\"L\".charCodeAt(0),d[39]=\"T\".charCodeAt(0),d[40]=\"E\".charCodeAt(0),p.setInt32(429,128,!1),d[433]=\"t\".charCodeAt(0),d[434]=\"R\".charCodeAt(0),d[435]=\"N\".charCodeAt(0),d[436]=\"S\".charCodeAt(0),p.setInt32(425,le(d,37,425),!1),p.setInt32(565,le(d,433,565),!1);var b=p.getInt32(16,!1),g=p.getInt32(20,!1),v=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");v.setAttribute(\"x\",\"\".concat(this.sdp_x)),v.setAttribute(\"y\",\"\".concat(this.sdp_y)),v.setAttribute(\"width\",\"\".concat(this.sdf_x)),v.setAttribute(\"height\",\"\".concat(this.sdf_y)),v.setAttribute(\"viewBox\",\"0 0 \".concat(this.sdf_x,\" \").concat(this.sdf_y));var C=document.createElementNS(\"http://www.w3.org/2000/svg\",\"image\");if(C.setAttribute(\"href\",\"data:image/png;base64,\"+window.btoa(String.fromCharCode.apply(String,pe(d)))),C.setAttribute(\"x\",\"\".concat(2*i)),C.setAttribute(\"y\",\"\".concat(2*n)),C.setAttribute(\"width\",\"\".concat(2*b)),C.setAttribute(\"height\",\"\".concat(2*g)),v.appendChild(C),r.size>0){for(var x=0;x<8;x++)for(var w=0;w<16;w++)if(r.has(16*x+w)){var k=l[x][w],_=Number.parseInt(k.substring(1,3),16),S=Number.parseInt(k.substring(3,5),16),T=Number.parseInt(k.substring(5,7),16),B=Number.parseInt(k.substring(7,9),16);d[41+3*(16*x+w)]=_,d[41+3*(16*x+w)+1]=S,d[41+3*(16*x+w)+2]=T,d[437+(16*x+w)]=B}else d[437+(16*x+w)]=0;p.setInt32(425,le(d,37,425),!1),p.setInt32(565,le(d,433,565),!1);var E=document.createElementNS(\"http://www.w3.org/2000/svg\",\"image\");E.setAttribute(\"href\",\"data:image/png;base64,\"+window.btoa(String.fromCharCode.apply(String,pe(d)))),E.setAttribute(\"x\",\"\".concat(2*i)),E.setAttribute(\"y\",\"\".concat(2*n)),E.setAttribute(\"width\",\"\".concat(2*b)),E.setAttribute(\"height\",\"\".concat(2*g));var I=document.createElementNS(\"http://www.w3.org/2000/svg\",\"animate\");I.setAttribute(\"attributeName\",\"opacity\"),I.setAttribute(\"values\",\"1;0\"),I.setAttribute(\"dur\",\"1s\"),I.setAttribute(\"calcMode\",\"discrete\"),I.setAttribute(\"repeatCount\",\"indefinite\"),E.appendChild(I),v.appendChild(E)}this.svg.appendChild(v)}}}},{key:\"getOrnColorCode\",value:function(){return!0===this.force_orn?e.fillAlphaColorCode(this.bg_color):!1===this.force_orn?this.orn:null!==(t=this.force_orn)&&void 0!==t?t:this.orn;var t}}],n=[{key:\"setEmbeddedGlyph\",value:function(e){Ae=e}},{key:\"detect\",value:function(e,t){var i,n,a=null!==(i=null==t?void 0:t.data_identifier)&&void 0!==i?i:128,r=null!==(n=null==t?void 0:t.data_group_id)&&void 0!==n?n:1;if(e.length<=0)return!1;if(e[0]!==a)return!1;if(e.length<=2)return!1;var o=3+(15&e[2]);return!(e.length<=o||(15&(252&e[o+0])>>2)!==r||(b(e,o),0))}},{key:\"getRGBAColorCode\",value:function(e){if(null==e)return null;var t=document.createElement(\"canvas\");t.width=t.height=1;var i=t.getContext(\"2d\");if(!i)return null;i.fillStyle=e,i.fillRect(0,0,t.width,t.height);var n=function(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var i=null==e?null:\"undefined\"!=typeof Symbol&&e[Symbol.iterator]||e[\"@@iterator\"];if(null!=i){var n,a,r,o,s=[],l=!0,d=!1;try{if(r=(i=i.call(e)).next,0===t){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=r.call(i)).done)&&(s.push(n.value),s.length!==t);l=!0);}catch(e){d=!0,a=e}finally{try{if(!l&&null!=i.return&&(o=i.return(),Object(o)!==o))return}finally{if(d)throw a}}return s}}(e,t)||ce(e,t)||function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}(i.getImageData(0,0,1,1).data,4),a=n[0],r=n[1],o=n[2],s=n[3],l=\"#\".concat(a.toString(16).toUpperCase().padStart(2,\"0\")).concat(r.toString(16).toUpperCase().padStart(2,\"0\")).concat(o.toString(16).toUpperCase().padStart(2,\"0\")).concat(s.toString(16).toUpperCase().padStart(2,\"0\"));return t.width=t.height=0,l}},{key:\"fillAlphaColorCode\",value:function(e){if(null==e)return\"\";var t=Number.parseInt(e.substring(1,3),16),i=Number.parseInt(e.substring(3,5),16),n=Number.parseInt(e.substring(5,7),16);return\"#\".concat(t.toString(16).toUpperCase().padStart(2,\"0\")).concat(i.toString(16).toUpperCase().padStart(2,\"0\")).concat(n.toString(16).toUpperCase().padStart(2,\"0\"),\"FF\")}},{key:\"getRGBAfromColorCode\",value:function(e){if(null==e)return\"\";var t=Number.parseInt(e.substring(1,3),16),i=Number.parseInt(e.substring(3,5),16),n=Number.parseInt(e.substring(5,7),16),a=Number.parseInt(e.substring(7,9),16);return\"rgba(\".concat(t,\", \").concat(i,\", \").concat(n,\", \").concat(a/255,\")\")}},{key:\"getRGBfromColorCode\",value:function(e){if(null==e)return\"\";var t=Number.parseInt(e.substring(1,3),16),i=Number.parseInt(e.substring(3,5),16),n=Number.parseInt(e.substring(5,7),16);return\"rgb(\".concat(t,\", \").concat(i,\", \").concat(n,\")\")}},{key:\"getAlphaFromColorCode\",value:function(e){return null==e?Number.NaN:Number.parseInt(e.substring(7,9),16)}}],i&&ue(t.prototype,i),n&&ue(t,n),Object.defineProperty(t,\"prototype\",{writable:!1}),t;var t,i,n}();function me(e){return me=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},me(e)}function be(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),i.push.apply(i,n)}return i}function ge(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?be(Object(i),!0).forEach(function(t){ve(e,t,i[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):be(Object(i)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))})}return e}function ve(e,t,i){return(t=xe(t))in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function Ce(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,xe(n.key),n)}}function xe(e){var t=function(e){if(\"object\"!=me(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,\"string\");if(\"object\"!=me(i))return i;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==me(t)?t:t+\"\"}var we=function(){return e=function e(t){var i,n,a,r;!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.media=null,this.id3Track=null,this.b24Track=null,this.subtitleElement=null,this.svg=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\"),this.textContent=null,this.prevCurrentTime=null,this.highResTimeupdatePollingId=null,this.isShowing=!0,this.isOnSeeking=!1,this.onB24CueChangeDrawed=!1,this.onID3AddtrackHandler=this.onID3Addtrack.bind(this),this.onID3CueChangeHandler=this.onID3CueChange.bind(this),this.onB24CueChangeHandler=this.onB24CueChange.bind(this),this.onHighResTimeupdateHandler=this.onHighResTimeupdate.bind(this),this.onTimeupdateHandler=this.onTimeupdate.bind(this),this.onCanplayHandler=this.onCanplay.bind(this),this.onPlayHandler=this.onPlay.bind(this),this.onPauseHandler=this.onPause.bind(this),this.onPauseAnimationHandler=this.onPauseAnimation.bind(this),this.onResumeAnimationHandler=this.onResumeAnimation.bind(this),this.onSeekingHandler=this.onSeeking.bind(this),this.onSeekedHandler=this.onSeeked.bind(this),this.data_identifier=null!==(i=null==t?void 0:t.data_identifier)&&void 0!==i?i:128,this.data_group_id=null!==(n=null==t?void 0:t.data_group_id)&&void 0!==n?n:1,this.rendererOption=ge(ge({},t),{},{data_identifier:this.data_identifier,data_group_id:this.data_group_id,keepAspectRatio:null===(a=null==t?void 0:t.keepAspectRatio)||void 0===a||a,enableAutoInBandMetadataTextTrackDetection:null===(r=null==t?void 0:t.enableAutoInBandMetadataTextTrackDetection)||void 0===r||r})},(t=[{key:\"attachMedia\",value:function(e,t){var i;this.detachMedia(),this.media=e,this.subtitleElement=null!=t?t:e.parentElement,this.media.addEventListener(\"canplay\",this.onCanplayHandler),this.media.addEventListener(\"play\",this.onResumeAnimationHandler),this.media.addEventListener(\"pause\",this.onPauseAnimationHandler),null!==(i=this.rendererOption)&&void 0!==i&&i.useHighResTimeupdate?(this.media.addEventListener(\"play\",this.onPlayHandler),this.media.addEventListener(\"pause\",this.onPauseHandler)):this.media.addEventListener(\"timeupdate\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.setupTrack(),this.setupSVG()}},{key:\"detachMedia\",value:function(){var e,t,i,n,a,r;this.cleanupSVG(),this.cleanupTrack(),null===(e=this.media)||void 0===e||e.removeEventListener(\"canplay\",this.onCanplayHandler),null===(t=this.media)||void 0===t||t.removeEventListener(\"play\",this.onPlayHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\"pause\",this.onPauseHandler),null===(n=this.media)||void 0===n||n.removeEventListener(\"play\",this.onResumeAnimationHandler),null===(a=this.media)||void 0===a||a.removeEventListener(\"pause\",this.onPauseAnimationHandler),this.onPause(),null===(r=this.media)||void 0===r||r.removeEventListener(\"timeupdate\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.media=this.subtitleElement=null}},{key:\"dispose\",value:function(){this.detachMedia()}},{key:\"getSVG\",value:function(){return this.svg}},{key:\"getTextContent\",value:function(){return this.textContent}},{key:\"show\",value:function(){this.isShowing=!0,this.svg.style.visibility=\"visible\"}},{key:\"hide\",value:function(){this.isShowing=!1,this.svg.style.visibility=\"hidden\"}},{key:\"isPresent\",value:function(){return this.onB24CueChangeDrawed}},{key:\"pushRawData\",value:function(e,t){var i=new ye(t,e).render(ge({},this.rendererOption));if(null==i)return!1;var n=Number.isFinite(i.endTime)?i.endTime:Number.MAX_SAFE_INTEGER;return this.addB24Cue(e,n,t)}},{key:\"pushBase64Data\",value:function(e,t){var i=ee(t);return this.pushRawData(e,i)}},{key:\"pushData\",value:function(e,t,i){return this.pushRawData(i,t)}},{key:\"pushID3v2PRIVData\",value:function(e,t,i){return\"aribb24.js\"===t&&this.pushRawData(e,i)}},{key:\"pushID3v2TXXXData\",value:function(e,t,i){return\"aribb24.js\"===t&&this.pushBase64Data(e,i)}},{key:\"pushID3v2Data\",value:function(e,t){for(var i=!1,n=0;n<t.length;){var a=n;if(n+3>t.length)break;if(73!==t[n+0]||68!==t[n+1]||51!==t[n+2]){if(0===n){n+=5;continue}break}if((n+=6)+4>t.length)break;var r=Y(t,n+0,n+4);n+=4;var o=a+3+2+1+4+r;if(o>t.length)break;for(var s=n;s<o;){var l=s;if(s+4>t.length)break;var d=Z(t,s+0,s+4);if((s+=4)+4>t.length)break;var p=Y(t,s+0,s+4);s+=6;var c=l+4+4+2+p;if(c>t.length)break;if(\"PRIV\"===d){for(var h=s,u=c;0!==t[s]&&s<c;)s++;var f=Z(t,h,s),A=new Uint8Array(Array.prototype.slice.call(t,s+1,u));this.pushID3v2PRIVData(e,f,A)&&(i=!0)}else if(\"TXXX\"===d){var y=t[s+0],m=s+1;if(3===y){for(;0!==t[s]&&s<c;)s++;for(var b=s,g=s+=1;0!==t[s]&&s<c;)s++;var v=s,C=Q(t,m,b),x=Q(t,g,v);this.pushID3v2TXXXData(e,C,x)&&(i=!0)}else if(0===y){for(;0!==t[s]&&s<c;)s++;for(var w=s,k=s+=1;0!==t[s]&&s<c;)s++;var _=s,S=Z(t,m,w),T=Z(t,k,_);this.pushID3v2TXXXData(e,S,T)&&(i=!0)}}s=c}(n=a+3+2+1+4+r)+3>t.length||51===t[n+0]&&68===t[n+1]&&73===t[n+2]&&(n+=10)}return i}},{key:\"setInBandMetadataTextTrack\",value:function(e){var t;null===(t=this.id3Track)||void 0===t||t.removeEventListener(\"cuechange\",this.onID3CueChangeHandler),this.id3Track=e,this.id3Track.mode=\"hidden\",this.id3Track.addEventListener(\"cuechange\",this.onID3CueChangeHandler)}},{key:\"pushID3v2Cue\",value:function(e){if(!this.id3Track)return!1;var t=e.startTime,i=e;if(\"15260DFFFF49443320FF49443320000F\"===this.id3Track.inBandMetadataTrackDispatchType)return this.pushID3v2Data(t,new Uint8Array(i.data));if(\"com.apple.streaming\"===this.id3Track.inBandMetadataTrackDispatchType){if(\"PRIV\"===i.value.key)return this.pushID3v2PRIVData(t,i.value.info,new Uint8Array(i.value.data));if(\"TXXX\"===i.value.key)return this.pushID3v2TXXXData(t,i.value.info,i.value.data)}else if(\"id3\"===this.id3Track.label){if(\"PRIV\"===i.value.key)return this.pushID3v2PRIVData(t,i.value.info,new Uint8Array(i.value.data));if(\"TXXX\"===i.value.key)return this.pushID3v2TXXXData(t,i.value.info,i.value.data)}else if(\"Timed Metadata\"===this.id3Track.label){if(\"PRIV\"===i.frame.key)return this.pushID3v2PRIVData(t,i.frame.owner,new Uint8Array(i.frame.data));if(\"TXXX\"===i.frame.key)return this.pushID3v2TXXXData(t,i.frame.description,i.frame.data)}return!1}},{key:\"onID3CueChange\",value:function(){this.id3Track&&(this.isOnSeeking||this.onTimeupdate())}},{key:\"addB24Cue\",value:function(e,t,i){var n;if(!this.b24Track)return!1;if(!ye.detect(i,this.rendererOption))return!1;var a=new(null!==(n=window.VTTCue)&&void 0!==n?n:window.TextTrackCue)(e,t,\"\");if(a.data=i,window.VTTCue)this.b24Track.addCue(a);else if(window.TextTrackCue){var r;if(Array.prototype.some.call(null!==(r=this.b24Track.cues)&&void 0!==r?r:[],function(t){return t.startTime===e}))return!1;if(this.b24Track.cues){for(var o=[],s=this.b24Track.cues.length-1;s>=0;s--)this.b24Track.cues[s].startTime>=e&&(o.push(this.b24Track.cues[s]),this.b24Track.removeCue(this.b24Track.cues[s]));this.b24Track.addCue(a);for(var l=o.length-1;l>=0;l--)this.b24Track.addCue(o[l])}}return!0}},{key:\"onB24CueChange\",value:function(){if(this.media&&this.b24Track){for(;this.svg.firstChild;)this.svg.removeChild(this.svg.firstChild);if(this.b24Track.activeCues&&this.b24Track.activeCues.length>0){var e=this.b24Track.activeCues[this.b24Track.activeCues.length-1];if(e.startTime<=this.media.currentTime&&this.media.currentTime<=e.endTime&&!this.isOnSeeking){var t=new ye(e.data,e.startTime);if(this.isShowing){var i,n,a,r=t.render(ge(ge({},this.rendererOption),{},{svg:this.svg}));null!=(null==r?void 0:r.PRA)&&(null===(n=this.rendererOption)||void 0===n||null===(a=n.PRACallback)||void 0===a||a.call(n,r.PRA)),null==r||r.rendered,this.textContent=null!==(i=null==r?void 0:r.textContent)&&void 0!==i?i:null}this.onB24CueChangeDrawed=!0}else this.onB24CueChangeDrawed=!1,this.textContent=null;for(var o=this.b24Track.activeCues.length-2;o>=0;o--){var s=this.b24Track.activeCues[o];s.endTime=Math.min(s.endTime,e.startTime),s.startTime===s.endTime&&this.b24Track.removeCue(s)}}else this.onB24CueChangeDrawed=!1,this.textContent=null}else this.onB24CueChangeDrawed=!1}},{key:\"onHighResTimeupdate\",value:function(){this.onTimeupdate(),this.highResTimeupdatePollingId=window.requestAnimationFrame(this.onHighResTimeupdateHandler)}},{key:\"onTimeupdate\",value:function(){if(this.media)if(null!=this.prevCurrentTime)if(this.id3Track&&this.id3Track.cues&&0!==this.id3Track.cues.length)if(this.isOnSeeking)this.prevCurrentTime=this.media.currentTime;else if(Math.abs(this.media.currentTime-this.prevCurrentTime)>1)this.prevCurrentTime=this.media.currentTime;else{for(var e,t,i=new X(Number.NEGATIVE_INFINITY,this.id3Track.cues[0].startTime),n=[i],a=0;a<this.id3Track.cues.length;a++)n.push(this.id3Track.cues[a]);for(var r=0,o=n.length;r+1<o;){var s=this.prevCurrentTime,l=Math.floor((r+o)/2);s<n[l].startTime?o=l:r=l}e=r;for(var d=0,p=n.length;d+1<p;){var c=this.media.currentTime,h=Math.floor((d+p)/2);c<n[h].startTime?p=h:d=h}if(t=d,null!==e&&null!==t&&e!==t){if(e<t)for(var u=t;u>e;u--){var f=n[u];if(f!==i&&this.pushID3v2Cue(f))break}else for(var A=e;A<t;A++){var y=n[A];if(y!==i&&this.pushID3v2Cue(y))break}this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime;else this.prevCurrentTime=this.media.currentTime}},{key:\"onCanplay\",value:function(){this.id3Track&&(this.id3Track.mode=\"hidden\"),this.b24Track&&(this.b24Track.mode=\"hidden\"),null!=this.media&&null==this.prevCurrentTime&&(this.prevCurrentTime=this.media.currentTime-Number.MIN_VALUE)}},{key:\"onPlay\",value:function(){null==this.highResTimeupdatePollingId&&this.onHighResTimeupdate()}},{key:\"onPause\",value:function(){null!=this.highResTimeupdatePollingId&&(window.cancelAnimationFrame(this.highResTimeupdatePollingId),this.highResTimeupdatePollingId=null)}},{key:\"onPauseAnimation\",value:function(){this.svg.pauseAnimations()}},{key:\"onResumeAnimation\",value:function(){this.svg.unpauseAnimations()}},{key:\"onSeeking\",value:function(){this.isOnSeeking=!0,this.onB24CueChange()}},{key:\"onSeeked\",value:function(){this.isOnSeeking=!1}},{key:\"onID3Addtrack\",value:function(e){if(this.media){var t=e.track;\"metadata\"===t.kind&&(\"15260DFFFF49443320FF49443320000F\"!==t.inBandMetadataTrackDispatchType&&\"com.apple.streaming\"!==t.inBandMetadataTrackDispatchType&&\"id3\"!==t.label||this.setInBandMetadataTextTrack(t))}}},{key:\"setupTrack\",value:function(){var e,t;if(this.media){if(null!==(e=this.rendererOption)&&void 0!==e&&e.useHighResTextTrack)this.b24Track=new W(this.media),this.b24Track.startPolling();else{for(var i=\"ARIB B24 Japanese SVG (data_identifier=0x\".concat(this.data_identifier.toString(16),\", data_group_id=\").concat(this.data_group_id,\")\"),n=0;n<this.media.textTracks.length;n++){var a=this.media.textTracks[n];if(a.label===i){this.b24Track=a;break}}this.b24Track||(this.b24Track=this.media.addTextTrack(\"metadata\",i,\"ja\"),this.b24Track.mode=\"hidden\")}if(this.b24Track.addEventListener(\"cuechange\",this.onB24CueChangeHandler),null!==(t=this.rendererOption)&&void 0!==t&&t.enableAutoInBandMetadataTextTrackDetection){for(var r=0;r<this.media.textTracks.length;r++){var o=this.media.textTracks[r];if(\"metadata\"===o.kind&&(\"15260DFFFF49443320FF49443320000F\"===o.inBandMetadataTrackDispatchType||\"com.apple.streaming\"===o.inBandMetadataTrackDispatchType||\"id3\"===o.label)){this.setInBandMetadataTextTrack(o);break}}this.media.textTracks.addEventListener(\"addtrack\",this.onID3AddtrackHandler)}this.media.addEventListener(\"seeking\",this.onSeekingHandler),this.media.addEventListener(\"seeked\",this.onSeekedHandler)}}},{key:\"setupSVG\",value:function(){this.media&&this.subtitleElement&&(this.svg.style.position=\"absolute\",this.svg.style.top=this.svg.style.left=\"0\",this.svg.style.pointerEvents=\"none\",this.svg.style.width=\"100%\",this.svg.style.height=\"100%\",this.subtitleElement.appendChild(this.svg))}},{key:\"cleanupTrack\",value:function(){var e,t,i,n,a,r;if(this.b24Track)if(null!==(r=this.rendererOption)&&void 0!==r&&r.useHighResTextTrack)this.b24Track.stopPolling();else if(this.b24Track.cues)for(var o=this.b24Track.cues.length-1;o>=0;o--)this.b24Track.removeCue(this.b24Track.cues[o]);null===(e=this.b24Track)||void 0===e||e.removeEventListener(\"cuechange\",this.onB24CueChangeHandler),null===(t=this.id3Track)||void 0===t||t.removeEventListener(\"cuechange\",this.onID3CueChangeHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\"seeking\",this.onSeekingHandler),null===(n=this.media)||void 0===n||n.removeEventListener(\"seeked\",this.onSeekedHandler),null===(a=this.media)||void 0===a||a.textTracks.removeEventListener(\"addtrack\",this.onID3AddtrackHandler),this.b24Track=this.id3Track=null}},{key:\"cleanupSVG\",value:function(){for(;this.svg.firstChild;)this.svg.removeChild(this.svg.firstChild)}}])&&Ce(e.prototype,t),Object.defineProperty(e,\"prototype\",{writable:!1}),e;var e,t}();function ke(e){return ke=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},ke(e)}function _e(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,n=Array(t);i<t;i++)n[i]=e[i];return n}function Se(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,Te(n.key),n)}}function Te(e){var t=function(e){if(\"object\"!=ke(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,\"string\");if(\"object\"!=ke(i))return i;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==ke(t)?t:t+\"\"}var Be=null,Ee=function(){function e(t,i){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.text=\"\",this.table=null,this.cells=null,this.GL=0,this.GR=2,this.G_BACK=[a.get(0),a.get(1),a.get(2),o.get(31)],this.DRCS_mapping=new Map([[15,new Map],[16,new Map],[17,new Map],[18,new Map],[19,new Map],[20,new Map],[21,new Map],[22,new Map],[23,new Map],[24,new Map],[25,new Map],[26,new Map],[27,new Map],[28,new Map],[29,new Map],[30,new Map]]),this.swf_x=1920,this.swf_y=1080,this.sdf_x=1920,this.sdf_y=1080,this.sdp_x=0,this.sdp_y=0,this.ssm_x=72,this.ssm_y=72,this.shs=8,this.svs=48,this.text_size_x=1,this.text_size_y=1,this.text_type=\"NSZ\",this.position_x=-1,this.position_y=-1,this.pallet=0,this.fg_color=l[this.pallet][7],this.bg_color=l[this.pallet][8],this.force_bg_color=null,this.hlc=0,this.prev_hlc=0,this.stl=!1,this.orn=null,this.force_orn=null,this.flc=15,this.non_spacing=\"\",this.timeElapsed=0,this.endTime=null,this.rendered=!1,this.PRA=null,this.normalFont=\"monospace\",this.gaijiFont=this.normalFont,this.drcsReplacement=!1,this.drcsReplaceMapping=new Map,this.usePUA=!1,this.pes=t,this.startTime=i}return t=e,n=[{key:\"setEmbeddedGlyph\",value:function(e){Be=e}},{key:\"detect\",value:function(e,t){var i,n,a=null!==(i=null==t?void 0:t.data_identifier)&&void 0!==i?i:128,r=null!==(n=null==t?void 0:t.data_group_id)&&void 0!==n?n:1;if(e.length<=0)return!1;if(e[0]!==a)return!1;if(e.length<=2)return!1;var o=3+(15&e[2]);return!(e.length<=o||(15&(252&e[o+0])>>2)!==r||(b(e,o),0))}},{key:\"getRGBAColorCode\",value:function(e){if(null==e)return null;var t=document.createElement(\"canvas\");t.width=t.height=1;var i=t.getContext(\"2d\");if(!i)return null;i.fillStyle=e,i.fillRect(0,0,t.width,t.height);var n=function(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var i=null==e?null:\"undefined\"!=typeof Symbol&&e[Symbol.iterator]||e[\"@@iterator\"];if(null!=i){var n,a,r,o,s=[],l=!0,d=!1;try{if(r=(i=i.call(e)).next,0===t){if(Object(i)!==i)return;l=!1}else for(;!(l=(n=r.call(i)).done)&&(s.push(n.value),s.length!==t);l=!0);}catch(e){d=!0,a=e}finally{try{if(!l&&null!=i.return&&(o=i.return(),Object(o)!==o))return}finally{if(d)throw a}}return s}}(e,t)||function(e,t){if(e){if(\"string\"==typeof e)return _e(e,t);var i={}.toString.call(e).slice(8,-1);return\"Object\"===i&&e.constructor&&(i=e.constructor.name),\"Map\"===i||\"Set\"===i?Array.from(e):\"Arguments\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?_e(e,t):void 0}}(e,t)||function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}(i.getImageData(0,0,1,1).data,4),a=n[0],r=n[1],o=n[2],s=n[3],l=\"#\".concat(a.toString(16).toUpperCase().padStart(2,\"0\")).concat(r.toString(16).toUpperCase().padStart(2,\"0\")).concat(o.toString(16).toUpperCase().padStart(2,\"0\")).concat(s.toString(16).toUpperCase().padStart(2,\"0\"));return t.width=t.height=0,l}},{key:\"fillAlphaColorCode\",value:function(e){if(null==e)return\"\";var t=Number.parseInt(e.substring(1,3),16),i=Number.parseInt(e.substring(3,5),16),n=Number.parseInt(e.substring(5,7),16);return\"#\".concat(t.toString(16).toUpperCase().padStart(2,\"0\")).concat(i.toString(16).toUpperCase().padStart(2,\"0\")).concat(n.toString(16).toUpperCase().padStart(2,\"0\"),\"FF\")}},{key:\"getRGBAfromColorCode\",value:function(e){if(null==e)return\"\";var t=Number.parseInt(e.substring(1,3),16),i=Number.parseInt(e.substring(3,5),16),n=Number.parseInt(e.substring(5,7),16),a=Number.parseInt(e.substring(7,9),16);return\"rgba(\".concat(t,\", \").concat(i,\", \").concat(n,\", \").concat(a/255,\")\")}}],(i=[{key:\"width\",value:function(){return Math.floor((this.shs+this.ssm_x)*this.text_size_x)}},{key:\"height\",value:function(){return Math.floor((this.svs+this.ssm_y)*this.text_size_y)}},{key:\"move_absolute_dot\",value:function(e,t){this.position_x=e,this.position_y=t}},{key:\"move_absolute_pos\",value:function(e,t){this.position_x=this.sdp_x+e*this.width(),this.position_y=this.sdp_y+(t+1)*this.height()}},{key:\"move_relative_pos\",value:function(e,t){for((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs));e<0;)this.position_x-=this.width(),e++,this.position_x<this.sdp_x&&(this.position_x=this.sdp_x+this.sdf_x-this.width(),t--);for(;e>0;)this.position_x+=this.width(),e--,this.position_x>=this.sdp_x+this.sdf_x&&(this.position_x=this.sdp_x,t++);for(;t<0;)this.position_y-=this.height(),t++;for(;t>0;)this.position_y+=this.height(),t--}},{key:\"move_newline\",value:function(){(this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),this.position_x=this.sdp_x,this.position_y=this.position_y+this.height()}},{key:\"render\",value:function(t){var i,n,a,r,o,s,l,d;this.table=null!==(i=null==t?void 0:t.table)&&void 0!==i?i:null,this.force_orn=null!==(n=\"boolean\"==typeof(null==t?void 0:t.forceStrokeColor)?null==t?void 0:t.forceStrokeColor:e.getRGBAColorCode(null==t?void 0:t.forceStrokeColor))&&void 0!==n?n:null,this.force_bg_color=null!==(a=e.getRGBAColorCode(null==t?void 0:t.forceBackgroundColor))&&void 0!==a?a:null,this.normalFont=null!==(r=null==t?void 0:t.normalFont)&&void 0!==r?r:this.normalFont,this.gaijiFont=null!==(o=null==t?void 0:t.gaijiFont)&&void 0!==o?o:this.normalFont,this.drcsReplacement=null!==(s=null==t?void 0:t.drcsReplacement)&&void 0!==s&&s,this.drcsReplaceMapping=new Map(A);for(var p,c=Object.entries(null!==(p=null==t?void 0:t.drcsReplaceMapping)&&void 0!==p?p:{}),h=0;h<c.length;h++){var u=c[h];this.drcsReplaceMapping.set(u[0],u[1])}if(this.usePUA=null!==(l=null==t?void 0:t.usePUA)&&void 0!==l&&l,!e.detect(this.pes,t))return null;if(this.table)for(;this.table.firstChild;)this.table.removeChild(this.table.firstChild);for(var f=3+(15&this.pes[2]),y=(this.pes[f+0],(this.pes[f+3]<<8)+this.pes[f+4]),m=f+9;m<f+(5+y);){this.pes[m+0];var b=this.pes[m+1],g=this.pes[m+2]<<16|this.pes[m+3]<<8|this.pes[m+4];32===b?this.parseText(m+5,m+5+g):48==b?this.parseDRCS(1,m+5,m+5+g):49==b&&this.parseDRCS(2,m+5,m+5+g),m+=5+g}return{startTime:this.startTime,endTime:null!==(d=this.endTime)&&void 0!==d?d:Number.POSITIVE_INFINITY,rendered:this.rendered,textContent:this.rendered?this.text:null,PRA:this.PRA}}},{key:\"parseText\",value:function(e,t){for(;e<t;)if(32<this.pes[e]&&this.pes[e]<127){var i=0,n=this.G_BACK[this.GL];if(!n)return;for(var o=0;o<n.bytes;o++)i<<=8,i|=127&this.pes[e+o];this.renderCharacter(i,n),e+=n.bytes}else if(160<this.pes[e]&&this.pes[e]<255){var d=0,p=this.G_BACK[this.GR];if(!p)return;for(var c=0;c<p.bytes;c++)d<<=8,d|=127&this.pes[e+c];this.renderCharacter(d,p),e+=p.bytes}else if(0===this.pes[e])e+=1;else if(7===this.pes[e])e+=1;else if(8===this.pes[e])this.move_relative_pos(-1,0),e+=1;else if(9===this.pes[e])this.move_relative_pos(1,0),e+=1;else if(10===this.pes[e])this.move_relative_pos(0,1),e+=1;else if(11===this.pes[e])this.move_relative_pos(0,-1),e+=1;else if(12===this.pes[e])null!=this.startTime&&this.timeElapsed>0&&(this.endTime=this.startTime+this.timeElapsed),e+=1;else if(13===this.pes[e])this.move_newline(),e+=1;else if(14===this.pes[e])this.GL=1,e+=1;else if(15===this.pes[e])this.GL=0,e+=1;else if(22===this.pes[e]){var h=63&this.pes[e+1];this.move_relative_pos(h,0),e+=2}else if(24===this.pes[e])e+=1;else if(25===this.pes[e]){var u=0,f=this.G_BACK[2];if(!f)return;for(var A=0;A<f.bytes;A++)u<<=8,u|=127&this.pes[e+1+A];this.renderCharacter(u,f),e+=1+f.bytes}else if(27===this.pes[e])if(110===this.pes[e+1])this.GL=2,e+=2;else if(111==this.pes[e+1])this.GL=3,e+=2;else if(126==this.pes[e+1])this.GR=1,e+=2;else if(125==this.pes[e+1])this.GR=2,e+=2;else if(124==this.pes[e+1])this.GR=3,e+=2;else if(40<=this.pes[e+1]&&this.pes[e+1]<=43){var y=this.pes[e+1]-40;32===this.pes[e+2]?(this.G_BACK[y]=s.get(this.pes[e+3]),e+=4):(this.G_BACK[y]=r.get(this.pes[e+2]),e+=3)}else{if(36!==this.pes[e+1])return;if(40<=this.pes[e+2]&&this.pes[e+2]<=43){var m=this.pes[e+2]-40;32===this.pes[e+3]?(this.G_BACK[m]=s.get(this.pes[e+4]),e+=5):(this.G_BACK[m]=r.get(this.pes[e+3]),e+=4)}else this.G_BACK[0]=r.get(this.pes[e+2]),e+=3}else if(28===this.pes[e]){var b=63&this.pes[e+1],g=63&this.pes[e+2];this.move_absolute_pos(g,b),e+=3}else if(29===this.pes[e]){var v=0,C=this.G_BACK[3];if(!C)return;for(var x=0;x<C.bytes;x++)v<<=8,v|=127&this.pes[e+1+x];this.renderCharacter(v,C),e+=1+C.bytes}else if(30===this.pes[e])e+=1;else if(31===this.pes[e])e+=1;else if(32===this.pes[e]){var w=a.get(0);if(!w)return;this.renderCharacter(8481,w),e+=1}else if(127===this.pes[e])e+=1;else if(128===this.pes[e])this.fg_color=l[this.pallet][0],e+=1;else if(129===this.pes[e])this.fg_color=l[this.pallet][1],e+=1;else if(130===this.pes[e])this.fg_color=l[this.pallet][2],e+=1;else if(131===this.pes[e])this.fg_color=l[this.pallet][3],e+=1;else if(132===this.pes[e])this.fg_color=l[this.pallet][4],e+=1;else if(133===this.pes[e])this.fg_color=l[this.pallet][5],e+=1;else if(134===this.pes[e])this.fg_color=l[this.pallet][6],e+=1;else if(135===this.pes[e])this.fg_color=l[this.pallet][7],e+=1;else if(136===this.pes[e])this.text_size_x=.5,this.text_size_y=.5,this.text_type=\"SSZ\",e+=1;else if(137===this.pes[e])this.text_size_x=.5,this.text_size_y=1,this.text_type=\"MSZ\",e+=1;else if(138===this.pes[e])this.text_size_x=1,this.text_size_y=1,this.text_type=\"NSZ\",e+=1;else{if(139===this.pes[e])return;if(144===this.pes[e]){var k=this.pes[e+1];if(32==k){var _=15&this.pes[e+2];this.pallet=_,e+=3}else{var S=15&k;64==(112&k)?this.fg_color=l[this.pallet][S]:80==(112&k)&&(this.bg_color=l[this.pallet][S]),e+=2}}else if(145===this.pes[e]){var T=15&this.pes[e];this.flc=T,e+=2}else{if(146===this.pes[e])return;if(147===this.pes[e])return;if(148===this.pes[e])return;if(149===this.pes[e])return;if(151===this.pes[e])this.prev_hlc=this.hlc,this.hlc=15&this.pes[e+1],e+=2;else{if(152===this.pes[e])return;if(153===this.pes[e])this.stl=!1,e+=1;else if(154===this.pes[e])this.stl=!0,e+=1;else if(155===this.pes[e]){for(var B=e+1;66!==this.pes[B];){if(83===this.pes[B]){for(var E=e+1,I=0;59!=this.pes[E]&&32!=this.pes[E];)I*=10,I+=15&this.pes[E],E++;if(32!==this.pes[E])return;if(5===I)this.swf_x=3840,this.swf_y=2160;else if(7===I)this.swf_x=1920,this.swf_y=1080;else{if(9!=I)return;this.swf_x=1440,this.swf_y=960}break}if(84===this.pes[B])break;if(86===this.pes[B]){for(var F=e+1,R=0,O=0;59!=this.pes[F];)R*=10,R+=15&this.pes[F],F++;for(F++;32!=this.pes[F];)O*=10,O+=15&this.pes[F],F++;this.sdf_x=2*R,this.sdf_y=2*O;break}if(87===this.pes[B]){for(var D=e+1,M=0,L=0;59!=this.pes[D];)M*=10,M+=15&this.pes[D],D++;for(D++;32!=this.pes[D];)L*=10,L+=15&this.pes[D],D++;this.ssm_x=2*M,this.ssm_y=2*L;break}if(88===this.pes[B]){for(var P=e+1,z=0;32!=this.pes[P];)z*=10,z+=15&this.pes[P],P++;this.shs=2*z;break}if(89===this.pes[B]){for(var G=e+1,q=0;32!=this.pes[G];)q*=10,q+=15&this.pes[G],G++;this.svs=2*q;break}if(91===this.pes[B])break;if(92===this.pes[B])break;if(93===this.pes[B])break;if(94===this.pes[B])break;if(95===this.pes[B]){for(var j=e+1,U=0,H=0;59!=this.pes[j];)U*=10,U+=15&this.pes[j],j++;for(j++;32!=this.pes[j];)H*=10,H+=15&this.pes[j],j++;this.sdp_x=2*U,this.sdp_y=2*H;break}if(97===this.pes[B]){for(var N=e+1,W=0,J=0;59!=this.pes[N];)W*=10,W+=15&this.pes[N],N++;for(N++;32!=this.pes[N];)J*=10,J+=15&this.pes[N],N++;this.move_absolute_dot(2*W,2*J);break}if(98===this.pes[B])break;if(99===this.pes[B]){var V=this.pes[e+1];if(48==V)this.orn=null;else if(49==V){var K=10*(15&this.pes[e+3])+(15&this.pes[e+4]),X=10*(15&this.pes[e+5])+(15&this.pes[e+6]);this.orn=l[K][X]}break}if(100===this.pes[B])break;if(101===this.pes[B])break;if(102===this.pes[B])break;if(103===this.pes[B])break;if(104===this.pes[B]){for(var Y=e+1,$=0;32!=this.pes[Y];)$*=10,$+=15&this.pes[Y],Y++;this.PRA=$;break}if(105===this.pes[B])break;if(106===this.pes[B])break;if(110===this.pes[B])break;if(111===this.pes[B])break;B+=1}e=B+1}else{if(157!==this.pes[e])return;if(32!=this.pes[e+1])return void this.pes[e+1];var Q=63&this.pes[e+2];this.timeElapsed+=Q/10,e+=3}}}}}},{key:\"parseDRCS\",value:function(e,t,i){for(this.pes[t+0],t+=1;t<i;){var n=this.pes[t+0]<<8|this.pes[t+1],a=this.pes[t+2];t+=3;for(var r=0;r<a;r++){this.pes[t+0];var o=15&this.pes[t+0];if(0===o||1===o){var l=this.pes[t+1]+2,d=this.pes[t+2],p=this.pes[t+3],c=l.toString(2).length-l.toString(2).replace(/0*$/,\"\").length,h=Math.floor(d*p*c/8),u=new Uint8Array(Array.prototype.slice.call(this.pes,t+4,t+4+h));if(1===e){var f,A,y=64+((3840&n)>>8),m=127&n,b=null===(f=s.get(y))||void 0===f?void 0:f.alphabet;b&&(null===(A=this.DRCS_mapping.get(b))||void 0===A||A.set(m,u))}else{var g,v=32639&n;null===(g=this.DRCS_mapping.get(15))||void 0===g||g.set(v,u)}t+=4+h}}}}},{key:\"renderCharacter\",value:function(t,i){if((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),0===i.alphabet){var n=((65280&t)>>8)-33,r=(255&t)-33;if(0===n&&12<=r&&r<=17)return void(this.non_spacing=[\"́\",\"̀\",\"̈\",\"̂\",\"̅\",\"̲\"][r-12]);if(1===n&&93===r)return void(this.non_spacing+=\"⃝\")}if(null!==this.table){if(null===this.cells){this.table.parentElement&&(this.table.parentElement.style.position=\"absolute\",this.table.parentElement.style.width=\"\".concat(this.swf_x,\"px\"),this.table.parentElement.style.height=\"\".concat(this.swf_y,\"px\")),this.table.style.willChange=\"transform\",this.table.style.position=\"absolute\",this.table.style.left=\"\".concat(this.sdp_x,\"px\"),this.table.style.top=\"\".concat(this.sdp_y,\"px\"),this.table.style.width=\"\".concat(this.sdf_x,\"px\"),this.table.style.height=\"\".concat(this.sdf_y,\"px\"),this.table.style.boxSizing=\"border-box\",this.table.style.border=\"none\",this.table.style.borderCollapse=\"collapse\";for(var s=[],l=0,A=0;l<this.sdf_y;l+=Math.floor((this.ssm_y+this.svs)/2),A+=1){var y=document.createElement(\"tr\");s.push([]),y.style.position=\"relative\",y.style.height=\"\".concat(Math.floor((this.ssm_y+this.svs)/2),\"px\"),y.style.width=\"100%\",y.style.boxSizing=\"border-box\",y.style.border=\"none\";for(var m=0;m<this.sdf_x;m+=Math.floor((this.ssm_x+this.shs)/2)){var b=document.createElement(\"td\");b.style.height=\"\".concat(Math.floor((this.ssm_y+this.svs)/2),\"px\"),b.style.width=\"\".concat(Math.floor((this.ssm_x+this.shs)/2),\"px\"),b.style.padding=\"0px\",b.style.boxSizing=\"border-box\",b.style.border=\"none\",y.appendChild(b),s[A].push(b)}this.table.appendChild(y)}this.cells=s}if(31!==i.alphabet&&(this.rendered=!0),0===i.alphabet){var g=94*(((65280&t)>>8)-33)+((255&t)-33),v=7896;if(g<v){var C=d[g];this.renderFont(C)}else if(this.usePUA){var x=p[g-v];this.renderFont(x)}else{var w=c[g-v];this.renderFont(w)}this.move_relative_pos(1,0)}else if(1===i.alphabet){var k=h[t-33];this.renderFont(k),this.move_relative_pos(1,0)}else if(2===i.alphabet){var S=u[t-33];this.renderFont(S),this.move_relative_pos(1,0)}else if(3===i.alphabet){var T=f[t-33];this.renderFont(T),this.move_relative_pos(1,0)}else{if(31===i.alphabet)return void(96===t?(this.G_BACK=[a.get(0),a.get(1),a.get(2),o.get(31)],this.GL=0,this.GR=2):97===t?(this.G_BACK=[a.get(0),a.get(3),a.get(2),o.get(31)],this.GL=0,this.GR=2):98===t?(this.G_BACK=[a.get(0),o.get(16),a.get(2),o.get(31)],this.GL=0,this.GR=2):99===t?(this.G_BACK=[a.get(4),a.get(6),a.get(7),o.get(31)],this.GL=0,this.GR=2):100===t?(this.G_BACK=[a.get(4),a.get(5),a.get(7),o.get(31)],this.GL=0,this.GR=2):101===t?(this.G_BACK=[a.get(4),o.get(16),a.get(7),o.get(31)],this.GL=0,this.GR=2):102===t?(this.G_BACK=[o.get(16),o.get(17),o.get(18),o.get(31)],this.GL=0,this.GR=2):103===t?(this.G_BACK=[o.get(19),o.get(20),o.get(21),o.get(31)],this.GL=0,this.GR=2):104===t?(this.G_BACK=[o.get(22),o.get(23),o.get(24),o.get(31)],this.GL=0,this.GR=2):105===t?(this.G_BACK=[o.get(25),o.get(26),o.get(27),o.get(31)],this.GL=0,this.GR=2):106===t?(this.G_BACK=[o.get(28),o.get(29),o.get(30),o.get(31)],this.GL=0,this.GR=2):107===t?(this.G_BACK=[a.get(0),o.get(17),a.get(2),o.get(31)],this.GL=0,this.GR=2):108===t?(this.G_BACK=[a.get(0),o.get(18),a.get(2),o.get(31)],this.GL=0,this.GR=2):109===t?(this.G_BACK=[a.get(0),o.get(19),a.get(2),o.get(31)],this.GL=0,this.GR=2):110===t?(this.G_BACK=[a.get(3),a.get(2),a.get(1),o.get(31)],this.GL=0,this.GR=2):111===t&&(this.G_BACK=[a.get(1),a.get(4),o.get(16),o.get(31)],this.GL=0,this.GR=2));var B,E=null===(B=this.DRCS_mapping.get(i.alphabet))||void 0===B?void 0:B.get(32639&t);if(!E)return;var I=_(E.buffer);if(this.drcsReplacement&&this.drcsReplaceMapping.has(I.toLowerCase()))this.renderFont(this.drcsReplaceMapping.get(I.toLowerCase()));else if(this.drcsReplacement&&this.drcsReplaceMapping.has(I.toUpperCase()))this.renderFont(this.drcsReplaceMapping.get(I.toUpperCase()));else{var F=document.createElement(\"canvas\"),R=Math.floor(this.ssm_x/2),O=Math.floor(this.ssm_y/2),D=Math.floor(8*E.length/(R*O));F.width=R+4/this.text_size_x,F.height=O+4/this.text_size_y,F.style.width=\"\".concat(this.ssm_x+4/this.text_size_x*2,\"px\"),F.style.height=\"\".concat(this.ssm_y+4/this.text_size_y*2,\"px\");var M=F.getContext(\"2d\");if(!M)return;var L=this.getOrnColorCode();if(L&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color)){M.fillStyle=e.getRGBAfromColorCode(L);for(var P=-2/this.text_size_y;P<=2/this.text_size_y;P++)for(var z=-2/this.text_size_x;z<=2/this.text_size_x;z++)for(var G=0;G<O;G++)for(var q=0;q<R;q++){for(var j=0,U=0;U<D;U++){var H=7-((G*R+q)*D+U)%8;j*=2,j+=(E[Math.floor(((G*R+q)*D+U)/8)]&1<<H)>>H}j>0&&M.fillRect(2/this.text_size_x+q+z,2/this.text_size_y+G+P,1,1)}}M.fillStyle=e.getRGBAfromColorCode(this.fg_color);for(var N=0;N<O;N++)for(var W=0;W<R;W++){for(var J=0,V=0;V<D;V++){var K=7-((N*R+W)*D+V)%8;J*=2,J+=(E[Math.floor(((N*R+W)*D+V)/8)]&1<<K)>>K}J>0&&M.fillRect(2/this.text_size_x+W,2/this.text_size_y+N,1,1)}for(var X=Math.floor(2*this.text_size_x),Y=Math.floor(2*this.text_size_y),$=Math.round((this.position_x-this.sdp_x)/(this.ssm_x+this.shs)*2),Q=Math.round((this.position_y-this.height()-this.sdp_y)/(this.ssm_y+this.svs)*2),Z=0;Z<Y;Z++)for(var ee=0;ee<X;ee++){var te=this.cells[Q+Z][$+ee];if(0===Z&&0===ee){var ie;te.setAttribute(\"rowspan\",\"\".concat(Y)),te.setAttribute(\"colspan\",\"\".concat(X)),te.style.textAlign=\"center\",te.style.verticalAlign=\"top\";var ne=document.createElement(\"div\");ne.appendChild(F),ne.style.display=\"flex\",ne.style.alignItems=\"center\",ne.style.justifyContent=\"middle\",ne.style.width=\"\".concat(this.ssm_x+this.shs,\"px\"),ne.style.height=\"\".concat(this.ssm_y+this.svs,\"px\"),ne.style.lineHeight=\"\".concat(this.height(),\"px\"),ne.style.fontSize=\"\".concat(this.ssm_x,\"px\"),ne.style.transform=\"scale(\".concat(this.text_size_x,\", \").concat(this.text_size_y,\")\"),ne.style.transformOrigin=\"0 0\",ne.style.marginRight=\"-\".concat(this.ssm_x+this.shs-this.width(),\"px\"),ne.style.marginBottom=\"-\".concat(this.ssm_y+this.svs-this.height(),\"px\"),ne.style.color=e.getRGBAfromColorCode(this.fg_color),1&this.hlc&&(te.style.borderBottom=\"1px solid \".concat(e.getRGBAColorCode(this.fg_color))),2&this.hlc&&(te.style.borderRight=\"1px solid \".concat(e.getRGBAColorCode(this.fg_color))),4&this.hlc&&(te.style.borderTop=\"1px solid \".concat(e.getRGBAColorCode(this.fg_color))),8&this.hlc&&(te.style.borderLeft=\"1px solid \".concat(e.getRGBAColorCode(this.fg_color))),this.stl&&(te.style.borderBottom=\"1px solid \".concat(e.getRGBAColorCode(this.fg_color))),te.style.backgroundColor=e.getRGBAfromColorCode(null!==(ie=this.force_bg_color)&&void 0!==ie?ie:this.bg_color),te.appendChild(ne)}else null!=te.parentNode&&te.parentNode.removeChild(te)}}this.move_relative_pos(1,0)}}}},{key:\"renderFont\",value:function(t){var i;if(t+=this.non_spacing,this.non_spacing=\"\",.5===this.text_size_x&&.5===this.text_size_y&&(u.includes(t)||f.includes(t))||(this.text+=t),null!==this.cells){var n=y.has(t),a=n?this.gaijiFont:this.normalFont;if(null!=Be&&null!==(i=Be)&&void 0!==i&&i.has(t)){var r=Be.get(t),o=r.viewBox,s=r.path;this.renderPath(o,s)}else{n&&(t+=\"︎\");for(var l=Math.floor(2*this.text_size_x),d=Math.floor(2*this.text_size_y),p=Math.round((this.position_x-this.sdp_x)/(this.ssm_x+this.shs)*2),c=Math.round((this.position_y-this.height()-this.sdp_y)/(this.ssm_y+this.svs)*2),h=0;h<d;h++)for(var A=0;A<l;A++){var m=this.cells[c+h][p+A];if(0===h&&0===A){var b;m.setAttribute(\"rowspan\",\"\".concat(d)),m.setAttribute(\"colspan\",\"\".concat(l)),m.style.textAlign=\"center\",m.style.verticalAlign=\"top\";var g=document.createElement(\"div\");g.textContent=t,g.style.display=\"flex\",g.style.alignItems=\"center\",g.style.justifyContent=\"middle\",g.style.width=\"\".concat(this.ssm_x+this.shs,\"px\"),g.style.height=\"\".concat(this.ssm_y+this.svs,\"px\"),g.style.fontFamily=\"\".concat(a),g.style.lineHeight=\"\".concat(this.height(),\"px\"),g.style.fontSize=\"\".concat(this.ssm_x,\"px\"),g.style.transform=\"scale(\".concat(this.text_size_x,\", \").concat(this.text_size_y,\")\"),g.style.transformOrigin=\"0 0\",g.style.marginRight=\"-\".concat(this.ssm_x+this.shs-this.width(),\"px\"),g.style.marginBottom=\"-\".concat(this.ssm_y+this.svs-this.height(),\"px\"),g.style.color=e.getRGBAfromColorCode(this.fg_color);var v=this.getOrnColorCode();if(v&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color)){for(var C=\"\",x=!0,w=-4;w<=4;w++)for(var k=-4;k<=4;k++)0===w&&0===k||(C+=\"\".concat(x?\"\":\",\").concat(k,\"px \").concat(w,\"px 0 \").concat(e.getRGBAfromColorCode(v)),x=!1);g.style.textShadow=C}1&this.hlc&&(m.style.borderBottom=\"1px solid \".concat(e.getRGBAColorCode(this.fg_color))),2&this.hlc&&(m.style.borderRight=\"1px solid \".concat(e.getRGBAColorCode(this.fg_color))),4&this.hlc&&(m.style.borderTop=\"1px solid \".concat(e.getRGBAColorCode(this.fg_color))),8&this.hlc&&(m.style.borderLeft=\"1px solid \".concat(e.getRGBAColorCode(this.fg_color))),this.stl&&(m.style.borderBottom=\"1px solid \".concat(e.getRGBAColorCode(this.fg_color))),m.style.backgroundColor=e.getRGBAfromColorCode(null!==(b=this.force_bg_color)&&void 0!==b?b:this.bg_color),m.appendChild(g)}else null!=m.parentNode&&m.parentNode.removeChild(m)}}}}},{key:\"renderPath\",value:function(t,i){if(null!==this.cells){var n=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");n.setAttribute(\"viewBox\",\"\".concat(t[0],\" \").concat(t[1],\" \").concat(t[2],\" \").concat(t[3])),n.style.width=\"\".concat(this.ssm_x+this.shs,\"px\"),n.style.height=\"\".concat(this.ssm_y,\"px\");var a=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");a.setAttribute(\"d\",i),a.setAttribute(\"fill\",\"\".concat(e.getRGBAfromColorCode(this.fg_color)));var r=this.getOrnColorCode();if(!r||this.force_orn&&!0!==this.force_orn&&this.force_orn===this.fg_color)a.setAttribute(\"stroke\",\"transparent\");else{var o=4*Math.max((t[2]-t[0])/this.ssm_x,(t[3]-t[1])/this.ssm_y);a.setAttribute(\"stroke\",\"\".concat(e.getRGBAfromColorCode(r))),a.setAttribute(\"stroke-width\",\"\".concat(o))}n.appendChild(a);for(var s=Math.floor(2*this.text_size_x),l=Math.floor(2*this.text_size_y),d=Math.round((this.position_x-this.sdp_x)/(this.ssm_x+this.shs)*2),p=Math.round((this.position_y-this.height()-this.sdp_y)/(this.ssm_y+this.svs)*2),c=0;c<l;c++)for(var h=0;h<s;h++){var u=this.cells[p+c][d+h];if(0===c&&0===h){var f;u.setAttribute(\"rowspan\",\"\".concat(l)),u.setAttribute(\"colspan\",\"\".concat(s)),u.style.textAlign=\"center\",u.style.verticalAlign=\"top\";var A=document.createElement(\"div\");A.appendChild(n),A.style.display=\"flex\",A.style.alignItems=\"center\",A.style.justifyContent=\"middle\",A.style.width=\"\".concat(this.ssm_x+this.shs,\"px\"),A.style.height=\"\".concat(this.ssm_y+this.svs,\"px\"),A.style.lineHeight=\"\".concat(this.height(),\"px\"),A.style.fontSize=\"\".concat(this.ssm_x,\"px\"),A.style.transform=\"scale(\".concat(this.text_size_x,\", \").concat(this.text_size_y,\")\"),A.style.transformOrigin=\"0 0\",A.style.marginRight=\"-\".concat(this.ssm_x+this.shs-this.width(),\"px\"),A.style.marginBottom=\"-\".concat(this.ssm_y+this.svs-this.height(),\"px\"),A.style.color=e.getRGBAfromColorCode(this.fg_color),1&this.hlc&&(u.style.borderBottom=\"1px solid \".concat(e.getRGBAColorCode(this.fg_color))),2&this.hlc&&(u.style.borderRight=\"1px solid \".concat(e.getRGBAColorCode(this.fg_color))),4&this.hlc&&(u.style.borderTop=\"1px solid \".concat(e.getRGBAColorCode(this.fg_color))),8&this.hlc&&(u.style.borderLeft=\"1px solid \".concat(e.getRGBAColorCode(this.fg_color))),this.stl&&(u.style.borderBottom=\"1px solid \".concat(e.getRGBAColorCode(this.fg_color))),u.style.backgroundColor=e.getRGBAfromColorCode(null!==(f=this.force_bg_color)&&void 0!==f?f:this.bg_color),u.appendChild(A)}else null!=u.parentNode&&u.parentNode.removeChild(u)}}}},{key:\"getOrnColorCode\",value:function(){return!0===this.force_orn?e.fillAlphaColorCode(this.bg_color):!1===this.force_orn?this.orn:null!==(t=this.force_orn)&&void 0!==t?t:this.orn;var t}}])&&Se(t.prototype,i),n&&Se(t,n),Object.defineProperty(t,\"prototype\",{writable:!1}),t;var t,i,n}();function Ie(e){return Ie=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Ie(e)}function Fe(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),i.push.apply(i,n)}return i}function Re(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?Fe(Object(i),!0).forEach(function(t){Oe(e,t,i[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):Fe(Object(i)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))})}return e}function Oe(e,t,i){return(t=Me(t))in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function De(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,Me(n.key),n)}}function Me(e){var t=function(e){if(\"object\"!=Ie(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,\"string\");if(\"object\"!=Ie(i))return i;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e);return\"symbol\"==Ie(t)?t:t+\"\"}var Le=function(){return e=function e(t){var i,n,a,r,o;!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.media=null,this.id3Track=null,this.b24Track=null,this.subtitleElement=null,this.table=null,this.textContent=null,this.wrapper=null,this.resizeObserver=null,this.mutationObserver=null,this.prevCurrentTime=null,this.highResTimeupdatePollingId=null,this.isShowing=!0,this.isOnSeeking=!1,this.onB24CueChangeDrawed=!1,this.onID3AddtrackHandler=this.onID3Addtrack.bind(this),this.onID3CueChangeHandler=this.onID3CueChange.bind(this),this.onB24CueChangeHandler=this.onB24CueChange.bind(this),this.onHighResTimeupdateHandler=this.onHighResTimeupdate.bind(this),this.onTimeupdateHandler=this.onTimeupdate.bind(this),this.onCanplayHandler=this.onCanplay.bind(this),this.onPlayHandler=this.onPlay.bind(this),this.onPauseHandler=this.onPause.bind(this),this.onSeekingHandler=this.onSeeking.bind(this),this.onSeekedHandler=this.onSeeked.bind(this),this.onResizeHandler=this.onResize.bind(this),this.data_identifier=null!==(i=null==t?void 0:t.data_identifier)&&void 0!==i?i:128,this.data_group_id=null!==(n=null==t?void 0:t.data_group_id)&&void 0!==n?n:1,this.rendererOption=Re(Re({},t),{},{data_identifier:this.data_identifier,data_group_id:this.data_group_id,keepAspectRatio:null===(a=null==t?void 0:t.keepAspectRatio)||void 0===a||a,enableAutoInBandMetadataTextTrackDetection:null===(r=null==t?void 0:t.enableAutoInBandMetadataTextTrackDetection)||void 0===r||r,useStroke:null===(o=null==t?void 0:t.useStroke)||void 0===o||o})},(t=[{key:\"attachMedia\",value:function(e,t){var i;this.detachMedia(),this.media=e,this.subtitleElement=null!=t?t:e.parentElement,this.media.addEventListener(\"canplay\",this.onCanplayHandler),null!==(i=this.rendererOption)&&void 0!==i&&i.useHighResTimeupdate?(this.media.addEventListener(\"play\",this.onPlayHandler),this.media.addEventListener(\"pause\",this.onPauseHandler)):this.media.addEventListener(\"timeupdate\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.setupTrack(),this.setupTable()}},{key:\"detachMedia\",value:function(){var e,t,i,n;this.cleanupTable(),this.cleanupTrack(),null===(e=this.media)||void 0===e||e.removeEventListener(\"canplay\",this.onCanplayHandler),null===(t=this.media)||void 0===t||t.removeEventListener(\"play\",this.onPlayHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\"pause\",this.onPauseHandler),this.onPause(),null===(n=this.media)||void 0===n||n.removeEventListener(\"timeupdate\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.media=this.subtitleElement=null}},{key:\"dispose\",value:function(){this.detachMedia()}},{key:\"getTextContent\",value:function(){return this.textContent}},{key:\"refresh\",value:function(){this.onResize()}},{key:\"show\",value:function(){this.isShowing=!0,this.table&&(this.table.style.visibility=\"visible\")}},{key:\"hide\",value:function(){this.isShowing=!1,this.table&&(this.table.style.visibility=\"hidden\")}},{key:\"isPresent\",value:function(){return this.onB24CueChangeDrawed}},{key:\"pushRawData\",value:function(e,t){var i=new Ee(t,e).render(this.rendererOption);if(null==i)return!1;var n=Number.isFinite(i.endTime)?i.endTime:Number.MAX_SAFE_INTEGER;return this.addB24Cue(e,n,t)}},{key:\"pushBase64Data\",value:function(e,t){var i=ee(t);return this.pushRawData(e,i)}},{key:\"pushData\",value:function(e,t,i){return this.pushRawData(i,t)}},{key:\"pushID3v2PRIVData\",value:function(e,t,i){return\"aribb24.js\"===t&&this.pushRawData(e,i)}},{key:\"pushID3v2TXXXData\",value:function(e,t,i){return\"aribb24.js\"===t&&this.pushBase64Data(e,i)}},{key:\"pushID3v2Data\",value:function(e,t){for(var i=!1,n=0;n<t.length;){var a=n;if(n+3>t.length)break;if(73!==t[n+0]||68!==t[n+1]||51!==t[n+2]){if(0===n){n+=5;continue}break}if((n+=6)+4>t.length)break;var r=Y(t,n+0,n+4);n+=4;var o=a+3+2+1+4+r;if(o>t.length)break;for(var s=n;s<o;){var l=s;if(s+4>t.length)break;var d=Z(t,s+0,s+4);if((s+=4)+4>t.length)break;var p=Y(t,s+0,s+4);s+=6;var c=l+4+4+2+p;if(c>t.length)break;if(\"PRIV\"===d){for(var h=s,u=c;0!==t[s]&&s<c;)s++;var f=Z(t,h,s),A=new Uint8Array(Array.prototype.slice.call(t,s+1,u));this.pushID3v2PRIVData(e,f,A)&&(i=!0)}else if(\"TXXX\"===d){var y=t[s+0],m=s+1;if(3===y){for(;0!==t[s]&&s<c;)s++;for(var b=s,g=s+=1;0!==t[s]&&s<c;)s++;var v=s,C=Q(t,m,b),x=Q(t,g,v);this.pushID3v2TXXXData(e,C,x)&&(i=!0)}else if(0===y){for(;0!==t[s]&&s<c;)s++;for(var w=s,k=s+=1;0!==t[s]&&s<c;)s++;var _=s,S=Z(t,m,w),T=Z(t,k,_);this.pushID3v2TXXXData(e,S,T)&&(i=!0)}}s=c}(n=a+3+2+1+4+r)+3>t.length||51===t[n+0]&&68===t[n+1]&&73===t[n+2]&&(n+=10)}return i}},{key:\"setInBandMetadataTextTrack\",value:function(e){var t;null===(t=this.id3Track)||void 0===t||t.removeEventListener(\"cuechange\",this.onID3CueChangeHandler),this.id3Track=e,this.id3Track.mode=\"hidden\",this.id3Track.addEventListener(\"cuechange\",this.onID3CueChangeHandler)}},{key:\"pushID3v2Cue\",value:function(e){if(!this.id3Track)return!1;var t=e.startTime,i=e;if(\"15260DFFFF49443320FF49443320000F\"===this.id3Track.inBandMetadataTrackDispatchType)return this.pushID3v2Data(t,new Uint8Array(i.data));if(\"com.apple.streaming\"===this.id3Track.inBandMetadataTrackDispatchType){if(\"PRIV\"===i.value.key)return this.pushID3v2PRIVData(t,i.value.info,new Uint8Array(i.value.data));if(\"TXXX\"===i.value.key)return this.pushID3v2TXXXData(t,i.value.info,i.value.data)}else if(\"id3\"===this.id3Track.label){if(\"PRIV\"===i.value.key)return this.pushID3v2PRIVData(t,i.value.info,new Uint8Array(i.value.data));if(\"TXXX\"===i.value.key)return this.pushID3v2TXXXData(t,i.value.info,i.value.data)}else if(\"Timed Metadata\"===this.id3Track.label){if(\"PRIV\"===i.frame.key)return this.pushID3v2PRIVData(t,i.frame.owner,new Uint8Array(i.frame.data));if(\"TXXX\"===i.frame.key)return this.pushID3v2TXXXData(t,i.frame.description,i.frame.data)}return!1}},{key:\"onID3CueChange\",value:function(){this.id3Track&&(this.isOnSeeking||this.onTimeupdate())}},{key:\"addB24Cue\",value:function(e,t,i){var n;if(!this.b24Track)return!1;if(!Ee.detect(i,this.rendererOption))return!1;var a=new(null!==(n=window.VTTCue)&&void 0!==n?n:window.TextTrackCue)(e,t,\"\");if(a.data=i,window.VTTCue)this.b24Track.addCue(a);else if(window.TextTrackCue){var r;if(Array.prototype.some.call(null!==(r=this.b24Track.cues)&&void 0!==r?r:[],function(t){return t.startTime===e}))return!1;if(this.b24Track.cues){for(var o=[],s=this.b24Track.cues.length-1;s>=0;s--)this.b24Track.cues[s].startTime>=e&&(o.push(this.b24Track.cues[s]),this.b24Track.removeCue(this.b24Track.cues[s]));this.b24Track.addCue(a);for(var l=o.length-1;l>=0;l--)this.b24Track.addCue(o[l])}}return!0}},{key:\"onB24CueChange\",value:function(){if(this.media&&this.b24Track){if(this.table)for(;this.table.firstChild;)this.table.removeChild(this.table.firstChild);if(this.b24Track.activeCues&&this.b24Track.activeCues.length>0){var e=this.b24Track.activeCues[this.b24Track.activeCues.length-1];if(e.startTime<=this.media.currentTime&&this.media.currentTime<=e.endTime&&!this.isOnSeeking){var t,i,n,a,r,o=new Ee(e.data,e.startTime).render(Re(Re({},this.rendererOption),{},{table:null!==(t=this.table)&&void 0!==t?t:void 0}));null!=(null==o?void 0:o.PRA)&&(null===(a=this.rendererOption)||void 0===a||null===(r=a.PRACallback)||void 0===r||r.call(a,o.PRA)),null!=o&&o.rendered&&this.onResize(),this.onB24CueChangeDrawed=null!==(i=null==o?void 0:o.rendered)&&void 0!==i&&i,this.textContent=null!==(n=null==o?void 0:o.textContent)&&void 0!==n?n:null}else this.onB24CueChangeDrawed=!1,this.textContent=null;for(var s=this.b24Track.activeCues.length-2;s>=0;s--){var l=this.b24Track.activeCues[s];l.endTime=Math.min(l.endTime,e.startTime),l.startTime===l.endTime&&this.b24Track.removeCue(l)}}else this.onB24CueChangeDrawed=!1,this.textContent=null}else this.onB24CueChangeDrawed=!1}},{key:\"onHighResTimeupdate\",value:function(){this.onTimeupdate(),this.highResTimeupdatePollingId=window.requestAnimationFrame(this.onHighResTimeupdateHandler)}},{key:\"onTimeupdate\",value:function(){if(this.media)if(null!=this.prevCurrentTime)if(this.id3Track&&this.id3Track.cues&&0!==this.id3Track.cues.length)if(this.isOnSeeking)this.prevCurrentTime=this.media.currentTime;else if(Math.abs(this.media.currentTime-this.prevCurrentTime)>1)this.prevCurrentTime=this.media.currentTime;else{for(var e,t,i=new X(Number.NEGATIVE_INFINITY,this.id3Track.cues[0].startTime),n=[i],a=0;a<this.id3Track.cues.length;a++)n.push(this.id3Track.cues[a]);for(var r=0,o=n.length;r+1<o;){var s=this.prevCurrentTime,l=Math.floor((r+o)/2);s<n[l].startTime?o=l:r=l}e=r;for(var d=0,p=n.length;d+1<p;){var c=this.media.currentTime,h=Math.floor((d+p)/2);c<n[h].startTime?p=h:d=h}if(t=d,null!==e&&null!==t&&e!==t){if(e<t)for(var u=t;u>e;u--){var f=n[u];if(f!==i&&this.pushID3v2Cue(f))break}else for(var A=e;A<t;A++){var y=n[A];if(y!==i&&this.pushID3v2Cue(y))break}this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime;else this.prevCurrentTime=this.media.currentTime}},{key:\"onCanplay\",value:function(){this.id3Track&&(this.id3Track.mode=\"hidden\"),this.b24Track&&(this.b24Track.mode=\"hidden\"),null!=this.media&&null==this.prevCurrentTime&&(this.prevCurrentTime=this.media.currentTime-Number.MIN_VALUE)}},{key:\"onPlay\",value:function(){null==this.highResTimeupdatePollingId&&this.onHighResTimeupdate()}},{key:\"onPause\",value:function(){null!=this.highResTimeupdatePollingId&&(window.cancelAnimationFrame(this.highResTimeupdatePollingId),this.highResTimeupdatePollingId=null)}},{key:\"onSeeking\",value:function(){this.isOnSeeking=!0,this.onB24CueChange()}},{key:\"onSeeked\",value:function(){this.isOnSeeking=!1}},{key:\"onResize\",value:function(){var e;if(this.media&&this.wrapper){var t=window.getComputedStyle(this.media),i=Number.parseInt(t.width),n=Number.parseInt(t.height),a=this.wrapper.offsetWidth,r=this.wrapper.offsetHeight,o=i/a,s=n/r;if(null!==(e=this.rendererOption)&&void 0!==e&&e.keepAspectRatio){var l=Math.min(o,s);this.wrapper.style.top=\"\".concat((n-r*l)/2,\"px\"),this.wrapper.style.left=\"\".concat((i-a*l)/2,\"px\"),this.wrapper.style.transform=\"scale(\".concat(l,\")\"),this.wrapper.style.transformOrigin=\"0 0\"}else this.wrapper.style.top=\"0px\",this.wrapper.style.left=\"0px\",this.wrapper.style.transform=\"scale(\".concat(o,\", \").concat(s,\")\"),this.wrapper.style.transformOrigin=\"0 0\"}}},{key:\"onID3Addtrack\",value:function(e){if(this.media){var t=e.track;\"metadata\"===t.kind&&(\"15260DFFFF49443320FF49443320000F\"!==t.inBandMetadataTrackDispatchType&&\"com.apple.streaming\"!==t.inBandMetadataTrackDispatchType&&\"id3\"!==t.label||this.setInBandMetadataTextTrack(t))}}},{key:\"setupTrack\",value:function(){var e,t;if(this.media){if(null!==(e=this.rendererOption)&&void 0!==e&&e.useHighResTextTrack)this.b24Track=new W(this.media),this.b24Track.startPolling();else{for(var i=\"ARIB B24 Japanese (data_identifier=0x\".concat(this.data_identifier.toString(16),\", data_group_id=\").concat(this.data_group_id,\")\"),n=0;n<this.media.textTracks.length;n++){var a=this.media.textTracks[n];if(a.label===i){this.b24Track=a;break}}this.b24Track||(this.b24Track=this.media.addTextTrack(\"metadata\",i,\"ja\"),this.b24Track.mode=\"hidden\")}if(this.b24Track.addEventListener(\"cuechange\",this.onB24CueChangeHandler),null!==(t=this.rendererOption)&&void 0!==t&&t.enableAutoInBandMetadataTextTrackDetection){for(var r=0;r<this.media.textTracks.length;r++){var o=this.media.textTracks[r];if(\"metadata\"===o.kind&&(\"15260DFFFF49443320FF49443320000F\"===o.inBandMetadataTrackDispatchType||\"com.apple.streaming\"===o.inBandMetadataTrackDispatchType||\"id3\"===o.label)){this.setInBandMetadataTextTrack(o);break}}this.media.textTracks.addEventListener(\"addtrack\",this.onID3AddtrackHandler)}this.media.addEventListener(\"seeking\",this.onSeekingHandler),this.media.addEventListener(\"seeked\",this.onSeekedHandler)}}},{key:\"setupTable\",value:function(){var e=this;this.media&&this.subtitleElement&&(this.wrapper=document.createElement(\"div\"),this.table=document.createElement(\"table\"),this.wrapper.style.pointerEvents=\"none\",this.wrapper.appendChild(this.table),this.subtitleElement.appendChild(this.wrapper),this.media.addEventListener(\"resize\",this.onResizeHandler),window.ResizeObserver?(this.resizeObserver=new ResizeObserver(function(){e.onResize()}),this.resizeObserver.observe(this.media)):(window.addEventListener(\"resize\",this.onResizeHandler),window.MutationObserver&&(this.mutationObserver=new MutationObserver(function(){e.onResize()}),this.mutationObserver.observe(this.media,{attributes:!0,attributeFilter:[\"class\",\"style\"]}))))}},{key:\"cleanupTrack\",value:function(){var e,t,i,n,a,r;if(this.b24Track)if(null!==(r=this.rendererOption)&&void 0!==r&&r.useHighResTextTrack)this.b24Track.stopPolling();else if(this.b24Track.cues)for(var o=this.b24Track.cues.length-1;o>=0;o--)this.b24Track.removeCue(this.b24Track.cues[o]);null===(e=this.b24Track)||void 0===e||e.removeEventListener(\"cuechange\",this.onB24CueChangeHandler),null===(t=this.id3Track)||void 0===t||t.removeEventListener(\"cuechange\",this.onID3CueChangeHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\"seeking\",this.onSeekingHandler),null===(n=this.media)||void 0===n||n.removeEventListener(\"seeked\",this.onSeekedHandler),null===(a=this.media)||void 0===a||a.textTracks.removeEventListener(\"addtrack\",this.onID3AddtrackHandler),this.b24Track=this.id3Track=null}},{key:\"cleanupTable\",value:function(){var e;window.removeEventListener(\"resize\",this.onResizeHandler),null===(e=this.media)||void 0===e||e.removeEventListener(\"resize\",this.onResizeHandler),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.mutationObserver&&(this.mutationObserver.disconnect(),this.mutationObserver=null),this.table&&this.wrapper&&this.wrapper.removeChild(this.table),this.wrapper&&this.subtitleElement&&this.subtitleElement.removeChild(this.wrapper),this.wrapper=this.table=null}}])&&De(e.prototype,t),Object.defineProperty(e,\"prototype\",{writable:!1}),e;var e,t}();return n}()},165:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 32 32\"><path d=\"M27.090 0.131h-22.731c-2.354 0-4.262 1.839-4.262 4.109v16.401c0 2.269 1.908 4.109 4.262 4.109h4.262v-2.706h8.469l-8.853 8.135 1.579 1.451 7.487-6.88h9.787c2.353 0 4.262-1.84 4.262-4.109v-16.401c0-2.27-1.909-4.109-4.262-4.109v0zM28.511 19.304c0 1.512-1.272 2.738-2.841 2.738h-8.425l-0.076-0.070-0.076 0.070h-11.311c-1.569 0-2.841-1.226-2.841-2.738v-13.696c0-1.513 1.272-2.739 2.841-2.739h19.889c1.569 0 2.841-0.142 2.841 1.37v15.064z\"></path></svg>'},177:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 512 512\"><path d=\"M11.5 280.6l192 160c20.6 17.2 52.5 2.8 52.5-24.6V96c0-27.4-31.9-41.8-52.5-24.6l-192 160c-15.3 12.8-15.3 36.4 0 49.2zm256 0l192 160c20.6 17.2 52.5 2.8 52.5-24.6V96c0-27.4-31.9-41.8-52.5-24.6l-192 160c-15.3 12.8-15.3 36.4 0 49.2z\"></path></svg>'},194:(e,t,i)=>{var n=i(143);e.exports=function(e){\"use strict\";var t=\"\",i=(e=e||{}).enableSubtitle,a=e.subtitle,r=e.current,o=e.airplay,s=e.pic,l=n.$escape,d=e.crossOrigin,p=e.screenshot,c=e.preload,h=e.url;i=a&&\"webvtt\"===a.type;return t+='\\n<video\\n    class=\"dplayer-video ',r&&(t+=\"dplayer-video-current\"),t+='\"\\n    webkit-playsinline\\n    ',o&&(t+=' x-webkit-airplay=\"allow\" '),t+=\"\\n    playsinline\\n    \",s&&(t+='poster=\"',t+=l(s),t+='\"'),t+=\"\\n    \",(null!==d||p||i)&&(t+='crossorigin=\"',t+=l(d||\"anonymous\"),t+='\"'),t+=\"\\n    \",c&&(t+='preload=\"',t+=l(c),t+='\"'),t+=\"\\n    \",h&&(t+='src=\"',t+=l(h),t+='\"'),t+=\"\\n    >\\n    \",i&&(t+='\\n    <track kind=\"metadata\" default src=\"',t+=l(a.url),t+='\"></track>\\n    '),t+=\"\\n</video>\\n\"}},204:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 21 32\"><path d=\"M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8z\"></path></svg>'},278:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 21 32\"><path d=\"M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528zM25.152 16q0 2.72-1.536 5.056t-4 3.36q-0.256 0.096-0.448 0.096-0.48 0-0.832-0.352t-0.32-0.8q0-0.704 0.672-1.056 1.024-0.512 1.376-0.8 1.312-0.96 2.048-2.4t0.736-3.104-0.736-3.104-2.048-2.4q-0.352-0.288-1.376-0.8-0.672-0.352-0.672-1.056 0-0.448 0.32-0.8t0.8-0.352q0.224 0 0.48 0.096 2.496 1.056 4 3.36t1.536 5.056z\"></path></svg>'},416:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 16 32\"><path d=\"M15.552 15.168q0.448 0.32 0.448 0.832 0 0.448-0.448 0.768l-13.696 8.512q-0.768 0.512-1.312 0.192t-0.544-1.28v-16.448q0-0.96 0.544-1.28t1.312 0.192z\"></path></svg>'},420:(e,t,i)=>{\"use strict\";i.d(t,{A:()=>d});var n=i(34),a=i.n(n),r=i(122),o=i.n(r),s=i(880),l=o()(a());l.i(s.A),l.push([e.id,'@keyframes my-face{2%{transform:translateY(1.5px) rotate(1.5deg)}4%{transform:translateY(-1.5px) rotate(-.5deg)}6%{transform:translateY(1.5px) rotate(-1.5deg)}8%{transform:translateY(-1.5px) rotate(-1.5deg)}10%{transform:translateY(2.5px) rotate(1.5deg)}12%{transform:translateY(-.5px) rotate(1.5deg)}14%{transform:translateY(-1.5px) rotate(1.5deg)}16%{transform:translateY(-.5px) rotate(-1.5deg)}18%{transform:translateY(.5px) rotate(-1.5deg)}20%{transform:translateY(-1.5px) rotate(2.5deg)}22%{transform:translateY(.5px) rotate(-1.5deg)}24%{transform:translateY(1.5px) rotate(1.5deg)}26%{transform:translateY(.5px) rotate(.5deg)}28%{transform:translateY(.5px) rotate(1.5deg)}30%{transform:translateY(-.5px) rotate(2.5deg)}32%{transform:translateY(1.5px) rotate(-.5deg)}34%{transform:translateY(1.5px) rotate(-.5deg)}36%{transform:translateY(-1.5px) rotate(2.5deg)}38%{transform:translateY(1.5px) rotate(-1.5deg)}40%{transform:translateY(-.5px) rotate(2.5deg)}42%{transform:translateY(2.5px) rotate(-1.5deg)}44%{transform:translateY(1.5px) rotate(.5deg)}46%{transform:translateY(-1.5px) rotate(2.5deg)}48%{transform:translateY(-.5px) rotate(.5deg)}50%{transform:translateY(.5px) rotate(.5deg)}52%{transform:translateY(2.5px) rotate(2.5deg)}54%{transform:translateY(-1.5px) rotate(1.5deg)}56%{transform:translateY(2.5px) rotate(2.5deg)}58%{transform:translateY(.5px) rotate(2.5deg)}60%{transform:translateY(2.5px) rotate(2.5deg)}62%{transform:translateY(-.5px) rotate(2.5deg)}64%{transform:translateY(-.5px) rotate(1.5deg)}66%{transform:translateY(1.5px) rotate(-.5deg)}68%{transform:translateY(-1.5px) rotate(-.5deg)}70%{transform:translateY(1.5px) rotate(.5deg)}72%{transform:translateY(2.5px) rotate(1.5deg)}74%{transform:translateY(-.5px) rotate(.5deg)}76%{transform:translateY(-.5px) rotate(2.5deg)}78%{transform:translateY(-.5px) rotate(1.5deg)}80%{transform:translateY(1.5px) rotate(1.5deg)}82%{transform:translateY(-.5px) rotate(.5deg)}84%{transform:translateY(1.5px) rotate(2.5deg)}86%{transform:translateY(-1.5px) rotate(-1.5deg)}88%{transform:translateY(-.5px) rotate(2.5deg)}90%{transform:translateY(2.5px) rotate(-.5deg)}92%{transform:translateY(.5px) rotate(-.5deg)}94%{transform:translateY(2.5px) rotate(.5deg)}96%{transform:translateY(-.5px) rotate(1.5deg)}98%{transform:translateY(-1.5px) rotate(-.5deg)}0%,to{transform:translate(0) rotate(0deg)}}.dplayer{line-height:1;overflow:hidden;position:relative;user-select:none;-webkit-user-select:none}.dplayer *{box-sizing:initial}.dplayer svg{height:100%;width:100%}.dplayer svg circle,.dplayer svg path{fill:#fff}.dplayer.dplayer-fulled,.dplayer.dplayer-fulled-browser{background:#000;height:100%!important;left:0;margin:0;padding:0;position:fixed;top:0;transform:translate(0);width:100%!important;z-index:100000}.dplayer.dplayer-live .dplayer-bar-wrap,.dplayer.dplayer-live .dplayer-time,.dplayer.dplayer-no-audio-switching .dplayer-setting-box .dplayer-setting-audio,.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-comment,.dplayer.dplayer-no-danmaku .dplayer-danmaku,.dplayer.dplayer-no-danmaku .dplayer-setting-box .dplayer-setting-danmaku,.dplayer.dplayer-no-danmaku .dplayer-setting-box .dplayer-setting-danunlimit,.dplayer.dplayer-no-danmaku .dplayer-setting-box .dplayer-setting-showdan{display:none}.dplayer.dplayer-live .dplayer-notice{bottom:56px}.dplayer.dplayer-live .dplayer-setting-loop,.dplayer.dplayer-live .dplayer-setting-speed{display:none}.dplayer.dplayer-live .dplayer-controller .dplayer-icons .dplayer-setting-box{height:auto;overflow-y:hidden}.dplayer.dplayer-live .dplayer-mobile-icon-backward,.dplayer.dplayer-live .dplayer-mobile-icon-forward{display:none}.dplayer.dplayer-live .dplayer-comment-setting-box,.dplayer.dplayer-live .dplayer-setting-box{bottom:58px;max-height:calc(100% - 66px)}.dplayer.dplayer-live.dplayer-mobile .dplayer-comment-setting-box,.dplayer.dplayer-live.dplayer-mobile .dplayer-setting-box{bottom:52px;max-height:calc(100% - 60px)}.dplayer.dplayer-narrow .dplayer-danmaku{font-size:18px}.dplayer.dplayer-narrow .dplayer-icon{margin:0 -3px}.dplayer.dplayer-playing .dplayer-danmaku .dplayer-danmaku-move{animation-play-state:running}.dplayer.dplayer-playing .dplayer-controller,.dplayer.dplayer-playing .dplayer-controller-mask{opacity:0}.dplayer.dplayer-playing:hover .dplayer-controller,.dplayer.dplayer-playing:hover .dplayer-controller-mask{opacity:1}.dplayer.dplayer-loading .dplayer-bezel .dplayer-loading-icon{display:block}.dplayer.dplayer-loading .dplayer-danmaku,.dplayer.dplayer-loading .dplayer-danmaku-move,.dplayer.dplayer-paused .dplayer-danmaku,.dplayer.dplayer-paused .dplayer-danmaku-move{animation-play-state:paused}.dplayer.dplayer-show-controller .dplayer-controller,.dplayer.dplayer-show-controller .dplayer-controller-mask{opacity:1}.dplayer.dplayer-fulled{height:100%!important;left:0;position:fixed!important;top:0;width:100%!important;z-index:100000}.dplayer.dplayer-fulled.dplayer-hide-controller{cursor:none}.dplayer.dplayer-fulled.dplayer-hide-controller .dplayer-controller,.dplayer.dplayer-fulled.dplayer-hide-controller .dplayer-controller-mask{opacity:0!important}.dplayer.dplayer-fulled-browser.dplayer-hide-controller{cursor:none}.dplayer.dplayer-fulled-browser.dplayer-hide-controller .dplayer-controller,.dplayer.dplayer-fulled-browser.dplayer-hide-controller .dplayer-controller-mask{opacity:0!important}.dplayer.dplayer-mobile .dplayer-controller{height:44px}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons{padding-bottom:3px;padding-top:3px}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-airplay-icon,.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-play-icon,.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-volume{display:none}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-full .dplayer-full-in-icon,.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-full .dplayer-pip-icon{display:inline-block;position:static}.dplayer.dplayer-mobile .dplayer-controller-mask{background:linear-gradient(#0000008c 78%,#000c);height:100%}.dplayer.dplayer-mobile.dplayer-playing .dplayer-controller,.dplayer.dplayer-mobile.dplayer-playing .dplayer-controller-mask{opacity:1}.dplayer.dplayer-mobile.dplayer-hide-controller .dplayer-controller-mask{opacity:0}.dplayer.dplayer-mobile.dplayer-hide-controller .dplayer-controller{opacity:0;transform:translateY(100%)}.dplayer.dplayer-mobile .dplayer-bar-wrap{bottom:35px}.dplayer.dplayer-mobile .dplayer-bar-wrap .dplayer-bar-time{display:none}.dplayer.dplayer-mobile .dplayer-comment-setting-box,.dplayer.dplayer-mobile .dplayer-setting-box{bottom:58px;max-height:calc(100% - 66px)}.dplayer.dplayer-mobile.dplayer-hide-controller .dplayer-mobile-icon-wrap{opacity:0;visibility:hidden}.dplayer.dplayer-mobile .dplayer-mobile-icon-wrap{opacity:.7;visibility:visible}.dplayer-web-fullscreen-fix{left:0;margin:0;padding:0;position:fixed;top:0}.dplayer [aria-label]{--balloon-font-size:11.5px}.dplayer [aria-label]:before{display:none}.dplayer [aria-label]:after{background:#111111b3!important;font-family:inherit!important;padding:.3em .8em!important}.dplayer [aria-label][data-balloon-pos=up]:after{margin-bottom:0!important}.dplayer-bezel{bottom:0;color:#fff;font-size:22px;left:0;pointer-events:none;position:absolute;right:0;top:0}.dplayer-bezel .dplayer-bezel-icon{background:#00000080;border-radius:50%;box-sizing:border-box;height:52px;left:50%;margin:-26px 0 0 -26px;opacity:0;padding:12px;pointer-events:none;position:absolute;top:50%;width:52px;will-change:transform}.dplayer-bezel .dplayer-bezel-icon.dplayer-bezel-transition{animation:bezel-hide .5s linear}@keyframes bezel-hide{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(2)}}.dplayer-bezel .dplayer-danloading{animation:my-face 5s ease-in-out infinite;font-size:14px;line-height:14px;margin-top:-7px;position:absolute;text-align:center;top:50%;width:100%}.dplayer-bezel .dplayer-loading-icon{display:none;height:36px;left:50%;margin:-18px 0 0 -18px;pointer-events:none;position:absolute;top:50%;width:36px}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-hide{display:none}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot{animation:dplayer-loading-dot-fade .8s ease infinite;opacity:0;transform-origin:4px 4px;will-change:transform}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-7{animation-delay:.7s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-6{animation-delay:.6s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-5{animation-delay:.5s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-4{animation-delay:.4s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-3{animation-delay:.3s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-2{animation-delay:.2s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-1{animation-delay:.1s}@keyframes dplayer-loading-dot-fade{0%{opacity:.7;transform:scale(1.2)}50%{opacity:.25;transform:scale(.9)}to{opacity:.25;transform:scale(.85)}}.dplayer-controller-mask{background:linear-gradient(#0000 15%,#000000b3);height:98px;width:100%}.dplayer-controller,.dplayer-controller-mask{bottom:0;position:absolute;transition:all .3s ease}.dplayer-controller{height:50px;left:0;padding:0 20px;right:0;user-select:none;-webkit-user-select:none}.dplayer-controller.dplayer-controller-comment .dplayer-icons{display:none}.dplayer-controller.dplayer-controller-comment .dplayer-icons.dplayer-comment-box{display:block}.dplayer-controller .dplayer-bar-wrap{-webkit-tap-highlight-color:rgba(0,0,0,0);bottom:41px;cursor:pointer;height:3px;padding:10px 0;position:absolute;width:calc(100% - 40px)}.dplayer-controller .dplayer-bar-wrap:after{content:var(--thumbnail-url);height:0;overflow:hidden;position:absolute;width:0;z-index:-1}.dplayer-controller .dplayer-bar-wrap:hover .dplayer-bar .dplayer-played .dplayer-thumb{transform:scale(1)}.dplayer-controller .dplayer-bar-wrap:hover .dplayer-highlight{display:block;height:40%;top:4px;transform:translateX(-4px);width:8px}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight{background-color:#fff;border-radius:6px;height:20%;position:absolute;text-align:center;top:5px;transform:translateX(-3px);transition:all .2s ease-in-out;width:6px;z-index:12}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover .dplayer-highlight-text{display:block}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover~.dplayer-bar-preview,.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover~.dplayer-bar-time{opacity:0}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight .dplayer-highlight-text{background-color:#0000009e;border-radius:4px;color:#fff;display:none;font-size:12px;left:50%;padding:5px 8px;position:absolute;top:-24px;transform:translateX(-50%);white-space:nowrap}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-preview{aspect-ratio:16/9;background:#131313;background-image:var(--thumbnail-url);background-repeat:no-repeat;background-size:16000px 100%;border-radius:6px;box-shadow:0 0 5px 0 #0000004d;display:none;image-rendering:-webkit-optimize-contrast;image-rendering:crisp-edges;pointer-events:none;position:absolute}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time{word-wrap:normal;background-color:#1f1f1fd9;border-radius:4px;color:#fff;font-size:12px;left:0;opacity:1;padding:6.5px 7px;pointer-events:none;position:absolute;text-align:center;top:-22px;transition:opacity .1s ease-in-out;word-break:normal;z-index:2}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time.hidden{opacity:0}.dplayer-controller .dplayer-bar-wrap .dplayer-bar{background:#fff3;cursor:pointer;height:4px;position:relative;width:100%}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-loaded{background:#fff;transition:all .5s ease}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-loaded,.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played{bottom:0;height:4px;left:0;position:absolute;top:0;will-change:width}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played .dplayer-thumb{border-radius:50%;cursor:pointer;height:11px;margin-right:-10px;margin-top:-4px;position:absolute;right:5px;top:0;transform:scale(0);transition:all .3s ease-in-out;width:11px}.dplayer-controller .dplayer-icons{-webkit-tap-highlight-color:rgba(0,0,0,0);bottom:0;height:38px;padding-bottom:6px;padding-top:6px;position:absolute}.dplayer-controller .dplayer-icons.dplayer-comment-box{bottom:0;color:#fff;display:none;height:38px;left:20px;position:absolute;right:20px;transition:all .3s ease-in-out;z-index:2}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-icon{padding:7px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-icon{left:0;position:absolute;top:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-send-icon{position:absolute;right:0;top:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-send-icon[aria-label]:after{left:14%}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input{background:none;border:none;border-radius:4px;box-sizing:border-box;color:#fff;font-family:inherit;font-size:14px;height:100%;line-height:18px;margin:0;outline:none;padding:8px 0;text-align:center;width:100%}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::placeholder{color:#fff;opacity:.8}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-moz-focus-inner{border:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-ms-clear{display:none}@media(max-width:350px){.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box{padding:9px 10px 15px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-title{font-size:12px;line-height:24px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input{font-size:12px}}.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon{padding:7px}@media(max-width:500px){.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon{padding-top:6px}}@media(max-width:350px){.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon{padding-top:7px}}.dplayer-controller .dplayer-icons.dplayer-icons-right{right:20px}.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon{padding:8px}@media(max-width:500px){.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon{padding:7px;width:38px}}@media(max-width:350px){.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon{padding:5px;width:31px}}.dplayer-controller .dplayer-icons .dplayer-time{color:#eee;font-family:inherit;font-size:13px;line-height:38px;text-shadow:0 0 2px #00000080;vertical-align:middle}@media(max-width:350px){.dplayer-controller .dplayer-icons .dplayer-time{font-size:12px}}.dplayer-controller .dplayer-icons .dplayer-live-badge{align-items:center;color:#eee;cursor:pointer;display:inline-flex;font-family:inherit;font-size:13px;height:100%;line-height:18px;text-shadow:0 0 2px #00000080;vertical-align:middle}.dplayer-controller .dplayer-icons .dplayer-live-dot{border-radius:6px;content:\"\";display:inline-block;height:6px;margin-right:5px;vertical-align:4%;width:6px}.dplayer-controller .dplayer-icons .dplayer-icon{background-color:#0000;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;height:100%;line-height:18px;outline:none;vertical-align:middle;width:40px}.dplayer-controller .dplayer-icons .dplayer-icon .dplayer-icon-content{opacity:.8;transition:all .2s ease-in-out}.dplayer-controller .dplayer-icons .dplayer-icon:hover .dplayer-icon-content{opacity:1}.dplayer-controller .dplayer-icons .dplayer-icon::-moz-focus-inner{border:0}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon{padding:10.5px 9.5px 8px}@media(max-width:500px){.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon{padding:9px 9px 8px}}@media(max-width:350px){.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon{padding:6.5px 6.5px 6px}}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-volume-icon{width:43px}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-full-icon[aria-label]:after{left:1%}@media(max-width:350px){.dplayer-controller .dplayer-icons .dplayer-icon{width:35px}}.dplayer-controller .dplayer-icons .dplayer-volume{cursor:pointer;display:inline-block;height:100%;position:relative}.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar{width:45px}.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{transform:scale(1)}.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar{width:45px}.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{transform:scale(1)}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap{display:inline-block;height:100%;margin:0 10px 0 -5px;vertical-align:middle}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar{background:#fff;height:4px;position:relative;top:17px;transition:all .3s ease-in-out;width:0}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner{bottom:0;height:100%;left:0;position:absolute;transition:all .1s ease;will-change:width}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{border-radius:50%;cursor:pointer;height:11px;margin-right:-10px;margin-top:-4px;position:absolute;right:5px;top:0;transform:scale(0);transition:all .3s ease-in-out;width:11px}.dplayer-controller .dplayer-icons .dplayer-setting,.dplayer-controller .dplayer-icons .dplayer-subtitle-btn{display:inline-block;height:100%}.dplayer-controller .dplayer-icons .dplayer-full{display:inline-block;height:100%;position:relative}.dplayer-controller .dplayer-icons .dplayer-comment{display:inline-block;height:100%}.dplayer-mobile-icon-wrap{align-items:center;display:flex;height:50px;justify-content:space-evenly;left:50%;opacity:0;pointer-events:none;position:absolute;top:50%;transform:translate(-50%,-50%);transition:all .28s ease;visibility:hidden;width:100%}.dplayer-mobile-icon-wrap .dplayer-mobile-icon{-webkit-tap-highlight-color:rgba(0,0,0,0);background-color:#0000;border:none;box-sizing:border-box;cursor:pointer;filter:drop-shadow(0 0 7px rgba(0,0,0,.5));height:50px;outline:none;pointer-events:auto;width:50px}.dplayer-mobile-icon-wrap .dplayer-mobile-icon-backward,.dplayer-mobile-icon-wrap .dplayer-mobile-icon-forward{padding:12px}.dplayer-setting-box{-webkit-tap-highlight-color:rgba(0,0,0,0);background:#1c1c1ce6;border-radius:7px;bottom:64px;box-sizing:border-box;display:flex;height:calc(100% - 72px);opacity:0;overflow-x:hidden;overflow-y:hidden;position:absolute;right:20px;transition:all .25s ease;visibility:hidden;width:210px;z-index:2}.dplayer-setting-box>div{overflow-x:hidden}.dplayer-setting-box>div.dplayer-setting-origin-panel{display:block}.dplayer-setting-box.dplayer-setting-box-open{opacity:1;visibility:visible}.dplayer-setting-box.dplayer-setting-box-quality{clip-path:inset(calc(100% - 30px*var(--quality-length) - 54px) 0 0 round 7px)!important}.dplayer-setting-box.dplayer-setting-box-quality .dplayer-setting-origin-panel{transform:translateX(-100%)}.dplayer-setting-box.dplayer-setting-box-quality .dplayer-setting-quality-panel{display:block;transform:translateX(0)}.dplayer-setting-box.dplayer-setting-box-speed{clip-path:inset(calc(100% - 30px*var(--speed-length) - 54px) 0 0 round 7px)!important}.dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-origin-panel{transform:translateX(-100%)}.dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-speed-panel{display:block;transform:translateX(0)}.dplayer-setting-box.dplayer-setting-box-audio{clip-path:inset(calc(100% - 114px) 0 0 round 7px)!important}.dplayer-setting-box.dplayer-setting-box-audio .dplayer-setting-origin-panel{transform:translateX(-100%)}.dplayer-setting-box.dplayer-setting-box-audio .dplayer-setting-audio-panel{display:block;transform:translateX(0)}.dplayer-setting-box .dplayer-label{color:#eee;display:inline-block;font-size:13px;vertical-align:middle;white-space:nowrap}.dplayer-setting-box .dplayer-label-value{color:#e0e0e0;display:inline-block;font-size:12px;margin-left:auto;margin-right:23px;vertical-align:middle;white-space:nowrap}.dplayer-setting-box .dplayer-toggle{font-size:0;height:20px;position:absolute;right:7px;text-align:center;top:5px;vertical-align:middle;width:20px}.dplayer-setting-box .dplayer-toggle input{display:none;max-height:0;max-width:0}.dplayer-setting-box .dplayer-toggle input+label{border:1px solid #dfdfdf;border-radius:10px;box-shadow:inset 0 0 0 0 #dfdfdf;box-sizing:border-box;cursor:pointer;display:inline-block;height:20px;position:relative;right:15px;transition:.25s ease;width:32px}.dplayer-setting-box .dplayer-toggle input+label:before{border-radius:15px;content:\"\";display:block;height:19px;left:-.5px;position:absolute;top:-.5px;transition:.25s ease;width:19px}.dplayer-setting-box .dplayer-toggle input+label:after{background:#fff;border-radius:15px;box-shadow:0 1px 3px #0006;content:\"\";display:block;height:18.1px;left:0;position:absolute;top:-.1px;transition:.25s ease;width:18.1px}.dplayer-setting-box .dplayer-toggle input:checked+label{border-color:var(--theme-color)}.dplayer-setting-box .dplayer-toggle input:checked+label:before{background:var(--theme-color);width:31px}.dplayer-setting-box .dplayer-toggle input:checked+label:after{left:12px}.dplayer-setting-box .dplayer-setting-audio-panel,.dplayer-setting-box .dplayer-setting-origin-panel,.dplayer-setting-box .dplayer-setting-quality-panel,.dplayer-setting-box .dplayer-setting-speed-panel{bottom:0;box-sizing:border-box;max-height:100%;overflow-y:auto;padding:7px 0;position:absolute;scrollbar-width:thin;transition:transform .25s ease;width:100%}.dplayer-setting-box .dplayer-setting-audio-panel::-webkit-scrollbar,.dplayer-setting-box .dplayer-setting-origin-panel::-webkit-scrollbar,.dplayer-setting-box .dplayer-setting-quality-panel::-webkit-scrollbar,.dplayer-setting-box .dplayer-setting-speed-panel::-webkit-scrollbar{width:6px}.dplayer-setting-box .dplayer-setting-audio-panel::-webkit-scrollbar-thumb,.dplayer-setting-box .dplayer-setting-origin-panel::-webkit-scrollbar-thumb,.dplayer-setting-box .dplayer-setting-quality-panel::-webkit-scrollbar-thumb,.dplayer-setting-box .dplayer-setting-speed-panel::-webkit-scrollbar-thumb{background:#ffffff26}.dplayer-setting-box .dplayer-setting-origin-panel{transform:translateX(0)}.dplayer-setting-box .dplayer-setting-audio-panel,.dplayer-setting-box .dplayer-setting-quality-panel,.dplayer-setting-box .dplayer-setting-speed-panel{transform:translateX(100%)}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-header,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-header,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-header{align-items:center;border-bottom:2px solid #ffffff26;box-sizing:border-box;cursor:pointer;display:flex;height:33px;margin-bottom:7px;padding-bottom:5px;padding-left:5px}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item{padding:5px}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item .dplayer-toggle{visibility:hidden}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item.dplayer-setting-speed-current .dplayer-toggle{visibility:visible}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-toggle{display:inline-block;margin-right:6px;position:static;width:22px}.dplayer-setting-box .dplayer-setting-audio-item,.dplayer-setting-box .dplayer-setting-item,.dplayer-setting-box .dplayer-setting-quality-item,.dplayer-setting-box .dplayer-setting-speed-item{align-items:center;box-sizing:border-box;cursor:pointer;display:flex;height:30px;padding:5px 10px;position:relative}.dplayer-setting-box .dplayer-setting-audio-item:hover,.dplayer-setting-box .dplayer-setting-item:hover,.dplayer-setting-box .dplayer-setting-quality-item:hover,.dplayer-setting-box .dplayer-setting-speed-item:hover{background-color:#ffffff1a}.dplayer-setting-box .dplayer-setting-danmaku{padding:5px 0}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-label{display:inline;padding:0 10px}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-label-value{font-size:12.5px;margin-right:18px}.dplayer-setting-box .dplayer-setting-danmaku:hover .dplayer-label,.dplayer-setting-box .dplayer-setting-danmaku:hover .dplayer-label-value{display:none}.dplayer-setting-box .dplayer-setting-danmaku:hover .dplayer-danmaku-bar-wrap{display:inline-block}.dplayer-setting-box .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-label,.dplayer-setting-box .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-label-value{display:none}.dplayer-setting-box .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-danmaku-bar-wrap{display:inline-block}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap{box-sizing:border-box;display:none;height:100%;padding:0 10px;vertical-align:middle;width:100%}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar{background:#fff;height:3px;position:relative;top:8.5px;transition:all .3s ease-in-out;width:100%}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner{bottom:0;height:100%;left:0;position:absolute;transition:all .05s ease;will-change:width}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner .dplayer-thumb{border-radius:50%;cursor:pointer;height:11px;margin-right:-10px;margin-top:-4px;position:absolute;right:5px;top:0;transition:all .3s ease-in-out;width:11px}.dplayer-comment-setting-box{-webkit-tap-highlight-color:rgba(0,0,0,0);background:#1c1c1ce6;border-radius:7px;bottom:64px;box-sizing:border-box;clip-path:inset(0 0 0 round 7px);font-size:14px;left:20px;max-height:calc(100% - 72px);opacity:0;overflow-y:auto;padding:10px 10px 16px;position:absolute;scrollbar-width:thin;transition:all .25s ease;visibility:hidden;width:255px;z-index:2}.dplayer-comment-setting-box::-webkit-scrollbar{width:6px}.dplayer-comment-setting-box::-webkit-scrollbar-thumb{background:#ffffff26}.dplayer-comment-setting-box.dplayer-comment-setting-open{opacity:1;visibility:visible}.dplayer-comment-setting-box input[type=radio]{display:none}.dplayer-comment-setting-box label{cursor:pointer}.dplayer-comment-setting-box .dplayer-comment-setting-title{color:#fff;font-size:13px;line-height:30px}.dplayer-comment-setting-box .dplayer-comment-setting-size,.dplayer-comment-setting-box .dplayer-comment-setting-type{font-size:0}.dplayer-comment-setting-box .dplayer-comment-setting-size.dplayer-comment-setting-size,.dplayer-comment-setting-box .dplayer-comment-setting-type.dplayer-comment-setting-size{margin-top:8px}.dplayer-comment-setting-box .dplayer-comment-setting-size .dplayer-comment-setting-title,.dplayer-comment-setting-box .dplayer-comment-setting-type .dplayer-comment-setting-title{margin-bottom:6px}.dplayer-comment-setting-box .dplayer-comment-setting-size label:nth-child(2) span,.dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(2) span{border-radius:4px 0 0 4px}.dplayer-comment-setting-box .dplayer-comment-setting-size label:nth-child(4) span,.dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(4) span{border-radius:0 4px 4px 0}.dplayer-comment-setting-box .dplayer-comment-setting-size span,.dplayer-comment-setting-box .dplayer-comment-setting-type span{border:1px solid #fff;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-size:12px;line-height:16px;margin-right:-1px;padding:4px 6px;text-align:center;width:33.6%}.dplayer-comment-setting-box .dplayer-comment-setting-size input:checked+span,.dplayer-comment-setting-box .dplayer-comment-setting-type input:checked+span{background:#e4e4e6;color:#1c1c1c}.dplayer-comment-setting-box .dplayer-comment-setting-color{font-size:0}.dplayer-comment-setting-box .dplayer-comment-setting-color .dplayer-comment-setting-color-list{display:flex;justify-content:space-between;padding:4px 0}.dplayer-comment-setting-box .dplayer-comment-setting-color .dplayer-comment-setting-color-list label{display:inline-block;font-size:0;padding:6px 0}.dplayer-comment-setting-box .dplayer-comment-setting-color .dplayer-comment-setting-color-list span{border-radius:50%;box-sizing:border-box;cursor:pointer;display:inline-block;height:22px;width:22px}.dplayer-comment-setting-box .dplayer-comment-setting-color .dplayer-comment-setting-color-list span:hover{animation:my-face 5s ease-in-out infinite}.dplayer-danmaku{aspect-ratio:16/9;bottom:0;color:#fff;font-family:inherit;font-size:29px;left:0;margin:auto;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0}.dplayer-danmaku .dplayer-danmaku-item{cursor:default;display:inline-block;font-size:var(--dplayer-danmaku-font-size);font-weight:700;opacity:var(--dplayer-danmaku-opacity);pointer-events:none;text-shadow:1.2px 1.2px 4px #000000e6;user-select:none;-webkit-user-select:none;white-space:nowrap}.dplayer-danmaku .dplayer-danmaku-item--demo{position:absolute;visibility:hidden}.dplayer-danmaku .dplayer-danmaku-item span{box-decoration-break:clone;-webkit-box-decoration-break:clone}.dplayer-danmaku .dplayer-danmaku-item.dplayer-danmaku-size-big{font-size:calc(var(--dplayer-danmaku-font-size)*1.25)}.dplayer-danmaku .dplayer-danmaku-item.dplayer-danmaku-size-small{font-size:calc(var(--dplayer-danmaku-font-size)*.8)}.dplayer-danmaku .dplayer-danmaku-right{position:absolute;right:0;transform:translateX(100%)}.dplayer-danmaku .dplayer-danmaku-right.dplayer-danmaku-move{animation-name:danmaku;animation-play-state:paused;animation-timing-function:linear}@keyframes danmaku{0%{transform:translateX(100%)}}.dplayer-danmaku .dplayer-danmaku-bottom,.dplayer-danmaku .dplayer-danmaku-top{left:50%;position:absolute;transform:translateX(-50%);visibility:hidden}.dplayer-danmaku .dplayer-danmaku-bottom.dplayer-danmaku-move,.dplayer-danmaku .dplayer-danmaku-top.dplayer-danmaku-move{animation-name:danmaku-center;animation-play-state:paused;animation-timing-function:linear}@keyframes danmaku-center{0%{visibility:visible}to{visibility:visible}}.dplayer-logo{left:20px;max-height:50px;max-width:50px;pointer-events:none;position:absolute;top:20px}.dplayer-logo img{background:none;max-height:100%;max-width:100%}.dplayer-menu{background:#1c1c1cd9;border-radius:2px;display:none;overflow:hidden;padding:5px 0;position:absolute;width:170px;z-index:3}.dplayer-menu.dplayer-menu-show{display:block}.dplayer-menu .dplayer-menu-item{box-sizing:border-box;cursor:pointer;height:30px}.dplayer-menu .dplayer-menu-item:hover{background-color:#ffffff1a}.dplayer-menu .dplayer-menu-item a{box-sizing:border-box;color:#eee;display:inline-block;font-size:13px;line-height:30px;overflow:hidden;padding:0 10px;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap;width:100%}.dplayer-menu .dplayer-menu-item a:hover{text-decoration:none}.dplayer-notice{background:#1c1c1ce6;border-radius:4px;bottom:68px;color:#fff;font-size:14px;left:20px;line-height:1.6;margin-right:20px;opacity:0;overflow:hidden;padding:12px 18px;pointer-events:none;position:absolute;transition:all .3s ease-in-out,color 0s}@media(max-width:500px){.dplayer-notice{bottom:auto!important;top:10px}}.dplayer-subtitle{bottom:40px;color:#fff;font-size:20px;left:5%;position:absolute;text-align:center;text-shadow:.5px .5px .5px #00000080;width:90%}.dplayer-subtitle.dplayer-subtitle-hide{display:none}.dplayer-mask{bottom:0;display:none;left:0;position:absolute;right:0;top:0;z-index:1}.dplayer-mask.dplayer-mask-show{display:block}.dplayer-video-wrap{align-items:center;background:#000;display:flex;font-size:0;height:100%;justify-content:center;position:relative;width:100%}.dplayer-video-wrap .dplayer-video-wrap-aspect{aspect-ratio:16/9;max-height:100%;max-width:100%;overflow:hidden;position:relative}.dplayer-video-wrap .dplayer-video-wrap-aspect .dplayer-video{display:none;max-height:100%;max-width:100%;width:99999px}.dplayer-video-wrap .dplayer-video-wrap-aspect .dplayer-video-current{display:block}.dplayer-video-wrap .dplayer-video-wrap-aspect .dplayer-video-prepare{display:none}.dplayer-info-panel{background:#1c1c1ccc;border-radius:2px;color:#fff;font-size:12px;left:10px;padding:10px;position:absolute;top:10px;width:450px}.dplayer-info-panel-hide{display:none}.dplayer-info-panel .dplayer-info-panel-close{cursor:pointer;position:absolute;right:10px;top:10px}.dplayer-info-panel .dplayer-info-panel-item>span{display:inline-block;line-height:15px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.dplayer-info-panel .dplayer-info-panel-item-title{margin-right:10px;text-align:right;width:100px}.dplayer-info-panel .dplayer-info-panel-item-data{width:320px}',\"\",{version:3,sources:[\"webpack://./src/css/balloon.scss\",\"webpack://./src/css/global.scss\",\"webpack://./src/css/player.scss\",\"webpack://./src/css/bezel.scss\",\"webpack://./src/css/controller.scss\",\"webpack://./src/css/danmaku.scss\",\"webpack://./src/css/logo.scss\",\"webpack://./src/css/menu.scss\",\"webpack://./src/css/notice.scss\",\"webpack://./src/css/subtitle.scss\",\"webpack://./src/css/video.scss\",\"webpack://./src/css/info-panel.scss\"],names:[],mappings:\"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\",sourcesContent:[\"@import '../../node_modules/balloon-css/balloon.css';\\n\\n.dplayer [aria-label] {\\n    --balloon-font-size: 11.5px;\\n}\\n\\n.dplayer [aria-label]:before {\\n    display: none;\\n}\\n\\n.dplayer [aria-label]:after {\\n    padding: .3em .8em !important;\\n    background: rgba(17, 17, 17, 0.7) !important;\\n    font-family: inherit !important;\\n}\\n\\n.dplayer [aria-label][data-balloon-pos=\\\"up\\\"]:after {\\n    margin-bottom: 0 !important;\\n}\\n\",\"@keyframes my-face {\\n    2% {\\n        transform: translate(0, 1.5px) rotate(1.5deg);\\n    }\\n    4% {\\n        transform: translate(0, -1.5px) rotate(-0.5deg);\\n    }\\n    6% {\\n        transform: translate(0, 1.5px) rotate(-1.5deg);\\n    }\\n    8% {\\n        transform: translate(0, -1.5px) rotate(-1.5deg);\\n    }\\n    10% {\\n        transform: translate(0, 2.5px) rotate(1.5deg);\\n    }\\n    12% {\\n        transform: translate(0, -0.5px) rotate(1.5deg);\\n    }\\n    14% {\\n        transform: translate(0, -1.5px) rotate(1.5deg);\\n    }\\n    16% {\\n        transform: translate(0, -0.5px) rotate(-1.5deg);\\n    }\\n    18% {\\n        transform: translate(0, 0.5px) rotate(-1.5deg);\\n    }\\n    20% {\\n        transform: translate(0, -1.5px) rotate(2.5deg);\\n    }\\n    22% {\\n        transform: translate(0, 0.5px) rotate(-1.5deg);\\n    }\\n    24% {\\n        transform: translate(0, 1.5px) rotate(1.5deg);\\n    }\\n    26% {\\n        transform: translate(0, 0.5px) rotate(0.5deg);\\n    }\\n    28% {\\n        transform: translate(0, 0.5px) rotate(1.5deg);\\n    }\\n    30% {\\n        transform: translate(0, -0.5px) rotate(2.5deg);\\n    }\\n    32% {\\n        transform: translate(0, 1.5px) rotate(-0.5deg);\\n    }\\n    34% {\\n        transform: translate(0, 1.5px) rotate(-0.5deg);\\n    }\\n    36% {\\n        transform: translate(0, -1.5px) rotate(2.5deg);\\n    }\\n    38% {\\n        transform: translate(0, 1.5px) rotate(-1.5deg);\\n    }\\n    40% {\\n        transform: translate(0, -0.5px) rotate(2.5deg);\\n    }\\n    42% {\\n        transform: translate(0, 2.5px) rotate(-1.5deg);\\n    }\\n    44% {\\n        transform: translate(0, 1.5px) rotate(0.5deg);\\n    }\\n    46% {\\n        transform: translate(0, -1.5px) rotate(2.5deg);\\n    }\\n    48% {\\n        transform: translate(0, -0.5px) rotate(0.5deg);\\n    }\\n    50% {\\n        transform: translate(0, 0.5px) rotate(0.5deg);\\n    }\\n    52% {\\n        transform: translate(0, 2.5px) rotate(2.5deg);\\n    }\\n    54% {\\n        transform: translate(0, -1.5px) rotate(1.5deg);\\n    }\\n    56% {\\n        transform: translate(0, 2.5px) rotate(2.5deg);\\n    }\\n    58% {\\n        transform: translate(0, 0.5px) rotate(2.5deg);\\n    }\\n    60% {\\n        transform: translate(0, 2.5px) rotate(2.5deg);\\n    }\\n    62% {\\n        transform: translate(0, -0.5px) rotate(2.5deg);\\n    }\\n    64% {\\n        transform: translate(0, -0.5px) rotate(1.5deg);\\n    }\\n    66% {\\n        transform: translate(0, 1.5px) rotate(-0.5deg);\\n    }\\n    68% {\\n        transform: translate(0, -1.5px) rotate(-0.5deg);\\n    }\\n    70% {\\n        transform: translate(0, 1.5px) rotate(0.5deg);\\n    }\\n    72% {\\n        transform: translate(0, 2.5px) rotate(1.5deg);\\n    }\\n    74% {\\n        transform: translate(0, -0.5px) rotate(0.5deg);\\n    }\\n    76% {\\n        transform: translate(0, -0.5px) rotate(2.5deg);\\n    }\\n    78% {\\n        transform: translate(0, -0.5px) rotate(1.5deg);\\n    }\\n    80% {\\n        transform: translate(0, 1.5px) rotate(1.5deg);\\n    }\\n    82% {\\n        transform: translate(0, -0.5px) rotate(0.5deg);\\n    }\\n    84% {\\n        transform: translate(0, 1.5px) rotate(2.5deg);\\n    }\\n    86% {\\n        transform: translate(0, -1.5px) rotate(-1.5deg);\\n    }\\n    88% {\\n        transform: translate(0, -0.5px) rotate(2.5deg);\\n    }\\n    90% {\\n        transform: translate(0, 2.5px) rotate(-0.5deg);\\n    }\\n    92% {\\n        transform: translate(0, 0.5px) rotate(-0.5deg);\\n    }\\n    94% {\\n        transform: translate(0, 2.5px) rotate(0.5deg);\\n    }\\n    96% {\\n        transform: translate(0, -0.5px) rotate(1.5deg);\\n    }\\n    98% {\\n        transform: translate(0, -1.5px) rotate(-0.5deg);\\n    }\\n    0%,\\n    100% {\\n        transform: translate(0, 0) rotate(0deg);\\n    }\\n}\\n\",\".dplayer {\\n    position: relative;\\n    overflow: hidden;\\n    user-select: none;\\n    -webkit-user-select: none;\\n    line-height: 1;\\n\\n    * {\\n        box-sizing: content-box;\\n    }\\n\\n    svg {\\n        width: 100%;\\n        height: 100%;\\n\\n        path,\\n        circle {\\n            fill: #fff;\\n        }\\n    }\\n\\n    &.dplayer-fulled, &.dplayer-fulled-browser {\\n        width: 100% !important;\\n        height: 100% !important;\\n        background: #000;\\n        position: fixed;\\n        z-index: 100000;\\n        left: 0;\\n        top: 0;\\n        margin: 0;\\n        padding: 0;\\n        transform: translate(0, 0);\\n    }\\n\\n    &.dplayer-no-danmaku {\\n        .dplayer-setting-box {\\n            .dplayer-setting-showdan,\\n            .dplayer-setting-danmaku,\\n            .dplayer-setting-danunlimit {\\n                display: none;\\n            }\\n        }\\n\\n        .dplayer-controller .dplayer-icons .dplayer-comment {\\n            display: none;\\n        }\\n\\n        .dplayer-danmaku {\\n            display: none;\\n        }\\n    }\\n\\n    &.dplayer-no-audio-switching {\\n        .dplayer-setting-box {\\n            .dplayer-setting-audio {\\n                display: none;\\n            }\\n        }\\n    }\\n\\n    &.dplayer-live {\\n        .dplayer-time {\\n            display: none;\\n        }\\n        .dplayer-bar-wrap {\\n            display: none;\\n        }\\n        .dplayer-notice {\\n            bottom: 56px;\\n        }\\n        .dplayer-setting-speed {\\n            display: none;\\n        }\\n        .dplayer-setting-loop {\\n            display: none;\\n        }\\n        .dplayer-controller .dplayer-icons .dplayer-setting-box {\\n            height: auto;\\n            overflow-y: hidden;\\n        }\\n        .dplayer-mobile-icon-backward, .dplayer-mobile-icon-forward {\\n            display: none;\\n        }\\n\\n        .dplayer-setting-box, .dplayer-comment-setting-box {\\n            bottom: 58px;\\n            max-height: calc(100% - 58px - 8px);\\n        }\\n        &.dplayer-mobile {\\n            .dplayer-setting-box, .dplayer-comment-setting-box {\\n                bottom: 52px;\\n                max-height: calc(100% - 52px - 8px);\\n            }\\n        }\\n    }\\n\\n    &.dplayer-narrow {\\n        .dplayer-danmaku {\\n            font-size: 18px;\\n        }\\n        .dplayer-icon {\\n            margin: 0 -3px;\\n        }\\n    }\\n\\n    &.dplayer-playing {\\n        .dplayer-danmaku .dplayer-danmaku-move {\\n            animation-play-state: running;\\n        }\\n\\n        .dplayer-controller-mask {\\n            opacity: 0;\\n        }\\n        .dplayer-controller {\\n            opacity: 0;\\n        }\\n\\n        &:hover {\\n            .dplayer-controller-mask {\\n                opacity: 1;\\n            }\\n            .dplayer-controller {\\n                opacity: 1;\\n            }\\n        }\\n    }\\n\\n    &.dplayer-loading {\\n        .dplayer-bezel .dplayer-loading-icon {\\n            display: block;\\n        }\\n    }\\n\\n    &.dplayer-loading,\\n    &.dplayer-paused {\\n        .dplayer-danmaku,\\n        .dplayer-danmaku-move {\\n            animation-play-state: paused;\\n        }\\n    }\\n\\n    &.dplayer-show-controller {\\n        .dplayer-controller-mask {\\n            opacity: 1;\\n        }\\n        .dplayer-controller {\\n            opacity: 1;\\n        }\\n    }\\n\\n    &.dplayer-fulled {\\n        position: fixed !important;\\n        z-index: 100000;\\n        left: 0;\\n        top: 0;\\n        width: 100% !important;\\n        height: 100% !important;\\n\\n        &.dplayer-hide-controller {\\n            cursor: none;\\n            .dplayer-controller-mask {\\n                opacity: 0 !important;\\n            }\\n            .dplayer-controller {\\n                opacity: 0 !important;\\n            }\\n        }\\n    }\\n\\n    &.dplayer-fulled-browser {\\n        &.dplayer-hide-controller {\\n            cursor: none;\\n            .dplayer-controller-mask {\\n                opacity: 0 !important;\\n            }\\n            .dplayer-controller {\\n                opacity: 0 !important;\\n            }\\n        }\\n    }\\n\\n    &.dplayer-mobile {\\n        .dplayer-controller {\\n            height: 44px;\\n            .dplayer-icons {\\n                padding-top: 3px;\\n                padding-bottom: 3px;\\n                .dplayer-volume,\\n                .dplayer-airplay-icon,\\n                .dplayer-play-icon {\\n                    display: none;\\n                }\\n                .dplayer-full .dplayer-full-in-icon {\\n                    position: static;\\n                    display: inline-block;\\n                }\\n                .dplayer-full .dplayer-pip-icon {\\n                    position: static;\\n                    display: inline-block;\\n                }\\n            }\\n        }\\n\\n        .dplayer-controller-mask {\\n            background: linear-gradient(rgba(0, 0, 0, 0.55) 78%, rgba(0, 0, 0, 0.8) 100%);\\n            height: 100%;\\n        }\\n\\n        &.dplayer-playing {\\n            .dplayer-controller-mask {\\n                opacity: 1;\\n            }\\n            .dplayer-controller {\\n                opacity: 1;\\n            }\\n        }\\n\\n        &.dplayer-hide-controller {\\n            .dplayer-controller-mask {\\n                opacity: 0;\\n            }\\n            .dplayer-controller {\\n                opacity: 0;\\n                transform: translateY(100%);\\n            }\\n        }\\n\\n        .dplayer-bar-wrap {\\n            bottom: 35px;\\n            .dplayer-bar-time {\\n                display: none;\\n            }\\n        }\\n\\n        .dplayer-setting-box, .dplayer-comment-setting-box {\\n            bottom: 58px;\\n            max-height: calc(100% - 58px - 8px);\\n        }\\n\\n        &.dplayer-hide-controller {\\n            .dplayer-mobile-icon-wrap {\\n                visibility: hidden;\\n                opacity: 0;\\n            }\\n        }\\n\\n        .dplayer-mobile-icon-wrap {\\n            visibility: visible;\\n            opacity: 0.7;\\n        }\\n    }\\n}\\n\\n// To hide scroll bar, apply this class to <body>\\n.dplayer-web-fullscreen-fix {\\n    position: fixed;\\n    top: 0;\\n    left: 0;\\n    margin: 0;\\n    padding: 0;\\n}\\n\",\".dplayer-bezel {\\n    position: absolute;\\n    left: 0;\\n    right: 0;\\n    top: 0;\\n    bottom: 0;\\n    font-size: 22px;\\n    color: #fff;\\n    pointer-events: none;\\n    .dplayer-bezel-icon {\\n        position: absolute;\\n        top: 50%;\\n        left: 50%;\\n        margin: -26px 0 0 -26px;\\n        height: 52px;\\n        width: 52px;\\n        padding: 12px;\\n        box-sizing: border-box;\\n        background: rgba(0, 0, 0, .5);\\n        border-radius: 50%;\\n        opacity: 0;\\n        pointer-events: none;\\n        will-change: transform;\\n        &.dplayer-bezel-transition {\\n            animation: bezel-hide .5s linear;\\n        }\\n        @keyframes bezel-hide {\\n            from {\\n                opacity: 1;\\n                transform: scale(1);\\n            }\\n            to {\\n                opacity: 0;\\n                transform: scale(2);\\n            }\\n        }\\n    }\\n    .dplayer-danloading {\\n        position: absolute;\\n        top: 50%;\\n        margin-top: -7px;\\n        width: 100%;\\n        text-align: center;\\n        font-size: 14px;\\n        line-height: 14px;\\n        animation: my-face 5s infinite ease-in-out;\\n    }\\n    .dplayer-loading-icon {\\n        display: none;\\n        position: absolute;\\n        top: 50%;\\n        left: 50%;\\n        margin: -18px 0 0 -18px;\\n        height: 36px;\\n        width: 36px;\\n        pointer-events: none;\\n        .dplayer-loading-hide {\\n            display: none;\\n        }\\n        .dplayer-loading-dot {\\n            animation: dplayer-loading-dot-fade .8s ease infinite;\\n            opacity: 0;\\n            transform-origin: 4px 4px;\\n            will-change: transform;\\n            @for $i from 7 through 1 {\\n                &.dplayer-loading-dot-#{$i} {\\n                    animation-delay: .1s * $i;\\n                }\\n            }\\n        }\\n        @keyframes dplayer-loading-dot-fade {\\n            0% {\\n                opacity: .7;\\n                transform: scale(1.2, 1.2);\\n            }\\n            50% {\\n                opacity: .25;\\n                transform: scale(.9, .9);\\n            }\\n            to {\\n                opacity: .25;\\n                transform: scale(.85, .85);\\n            }\\n        }\\n    }\\n}\\n\",'\\n.dplayer-controller-mask {\\n    position: absolute;\\n    width: 100%;\\n    height: 98px;\\n    bottom: 0;\\n    background: linear-gradient(rgba(0, 0, 0, 0.0) 15%, rgba(0, 0, 0, 0.7) 100%);\\n    transition: all 0.3s ease;\\n}\\n\\n.dplayer-controller {\\n    position: absolute;\\n    bottom: 0;\\n    left: 0;\\n    right: 0;\\n    height: 50px;\\n    padding: 0 20px;\\n    user-select: none;\\n    -webkit-user-select: none;\\n    transition: all 0.3s ease;\\n    &.dplayer-controller-comment {\\n        .dplayer-icons {\\n            display: none;\\n        }\\n        .dplayer-icons.dplayer-comment-box {\\n            display: block;\\n        }\\n    }\\n    .dplayer-bar-wrap {\\n        position: absolute;\\n        width: calc(100% - 40px);\\n        height: 3px;\\n        bottom: 41px;\\n        padding: 10px 0;\\n        cursor: pointer;\\n        -webkit-tap-highlight-color: transparent;\\n        // for preload thumbnails\\n        // ref: https://stackoverflow.com/a/14390213/17124142\\n        &:after {\\n            // load thumbnails (if exists)\\n            content: var(--thumbnail-url);\\n            // hide the element\\n            position: absolute;\\n            width: 0;\\n            height: 0;\\n            overflow: hidden;\\n            z-index: -1;\\n        }\\n        &:hover {\\n            .dplayer-bar .dplayer-played .dplayer-thumb {\\n                transform: scale(1);\\n            }\\n            .dplayer-highlight {\\n                display: block;\\n                width: 8px;\\n                transform: translateX(-4px);\\n                top: 4px;\\n                height: 40%;\\n            }\\n        }\\n        .dplayer-highlight {\\n            z-index: 12;\\n            position: absolute;\\n            top: 5px;\\n            width: 6px;\\n            height: 20%;\\n            border-radius: 6px;\\n            background-color: #fff;\\n            text-align: center;\\n            transform: translateX(-3px);\\n            transition: all .2s ease-in-out;\\n            &:hover {\\n                .dplayer-highlight-text {\\n                    display: block;\\n                }\\n                &~.dplayer-bar-preview {\\n                    opacity: 0;\\n                }\\n                &~.dplayer-bar-time {\\n                    opacity: 0;\\n                }\\n            }\\n            .dplayer-highlight-text {\\n                display: none;\\n                position: absolute;\\n                left: 50%;\\n                top: -24px;\\n                padding: 5px 8px;\\n                background-color: rgba(0, 0, 0, .62);\\n                color: #fff;\\n                border-radius: 4px;\\n                font-size: 12px;\\n                white-space: nowrap;\\n                transform: translateX(-50%);\\n            }\\n        }\\n        .dplayer-bar-preview {\\n            display: none;\\n            position: absolute;\\n            aspect-ratio: 16 / 9;\\n            border-radius: 6px;\\n            background: #131313;\\n            background-image: var(--thumbnail-url);\\n            pointer-events: none;\\n            background-size: 16000px 100%;\\n            background-repeat: no-repeat;\\n            image-rendering: -webkit-optimize-contrast;\\n            image-rendering: crisp-edges;\\n            box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.3);\\n        }\\n        .dplayer-bar-time {\\n            &.hidden {\\n                opacity: 0;\\n            }\\n            position: absolute;\\n            left: 0px;\\n            top: -22px;\\n            border-radius: 4px;\\n            padding: 6.5px 7px;\\n            background-color: rgba(31, 31, 31, 0.85);\\n            color: #fff;\\n            font-size: 12px;\\n            text-align: center;\\n            opacity: 1;\\n            transition: opacity .1s ease-in-out;\\n            word-wrap: normal;\\n            word-break: normal;\\n            z-index: 2;\\n            pointer-events: none;\\n        }\\n        .dplayer-bar {\\n            position: relative;\\n            height: 4px;\\n            width: 100%;\\n            background: rgba(255, 255, 255, .2);\\n            cursor: pointer;\\n            .dplayer-loaded {\\n                position: absolute;\\n                left: 0;\\n                top: 0;\\n                bottom: 0;\\n                background: #fff;\\n                height: 4px;\\n                transition: all 0.5s ease;\\n                will-change: width;\\n            }\\n            .dplayer-played {\\n                position: absolute;\\n                left: 0;\\n                top: 0;\\n                bottom: 0;\\n                height: 4px;\\n                will-change: width;\\n                .dplayer-thumb {\\n                    position: absolute;\\n                    top: 0;\\n                    right: 5px;\\n                    margin-top: -4px;\\n                    margin-right: -10px;\\n                    height: 11px;\\n                    width: 11px;\\n                    border-radius: 50%;\\n                    cursor: pointer;\\n                    transition: all .3s ease-in-out;\\n                    transform: scale(0);\\n                }\\n            }\\n        }\\n    }\\n    .dplayer-icons {\\n        position: absolute;\\n        height: 38px;\\n        padding-top: 6px;\\n        padding-bottom: 6px;\\n        bottom: 0;\\n        -webkit-tap-highlight-color: transparent;\\n        &.dplayer-comment-box {\\n            display: none;\\n            position: absolute;\\n            transition: all .3s ease-in-out;\\n            z-index: 2;\\n            height: 38px;\\n            bottom: 0;\\n            left: 20px;\\n            right: 20px;\\n            color: #fff;\\n            .dplayer-icon {\\n                padding: 7px;\\n            }\\n            .dplayer-comment-setting-icon {\\n                position: absolute;\\n                left: 0;\\n                top: 0;\\n            }\\n            .dplayer-send-icon {\\n                position: absolute;\\n                right: 0;\\n                top: 0;\\n                &[aria-label]:after {\\n                    left: 14%;\\n                }\\n            }\\n            .dplayer-comment-input {\\n                outline: none;\\n                border: none;\\n                padding: 8px 0px;\\n                font-size: 14px;\\n                font-family: inherit;\\n                line-height: 18px;\\n                text-align: center;\\n                border-radius: 4px;\\n                background: none;\\n                margin: 0;\\n                height: 100%;\\n                box-sizing: border-box;\\n                width: 100%;\\n                color: #fff;\\n                &::placeholder {\\n                    color: #fff;\\n                    opacity: 0.8;\\n                }\\n                &::-moz-focus-inner {\\n                    border: 0;\\n                }\\n                &::-ms-clear {\\n                    display: none;\\n                }\\n            }\\n            @media (max-width: 350px){\\n                .dplayer-comment-setting-box {\\n                    padding: 9px 10px 15px;\\n                    .dplayer-comment-setting-title {\\n                        font-size: 12px;\\n                        line-height: 24px;\\n                    }\\n                }\\n                .dplayer-comment-input {\\n                    font-size: 12px;\\n                }\\n            }\\n        }\\n        &.dplayer-icons-left {\\n            .dplayer-icon {\\n                padding: 7px;\\n            }\\n            @media (max-width: 500px){\\n                .dplayer-icon {\\n                    padding-top: 6px;\\n                }\\n            }\\n            @media (max-width: 350px){\\n                .dplayer-icon {\\n                    padding-top: 7px;\\n                }\\n            }\\n        }\\n        &.dplayer-icons-right {\\n            right: 20px;\\n            .dplayer-icon {\\n                padding: 8px;\\n                @media (max-width: 500px){\\n                    & {\\n                        width: 38px;\\n                        padding: 7px;\\n                    }\\n                }\\n                @media (max-width: 350px){\\n                    & {\\n                        width: 31px;\\n                        padding: 5px;\\n                    }\\n                }\\n            }\\n        }\\n        .dplayer-time {\\n            line-height: 38px;\\n            color: #eee;\\n            text-shadow: 0 0 2px rgba(0, 0, 0, .5);\\n            vertical-align: middle;\\n            font-size: 13px;\\n            font-family: inherit;\\n            @media (max-width: 350px){\\n                & {\\n                    font-size: 12px;\\n                }\\n            }\\n        }\\n        .dplayer-live-badge {\\n            line-height: 18px;\\n            color: #eee;\\n            text-shadow: 0 0 2px rgba(0, 0, 0, .5);\\n            vertical-align: middle;\\n            font-size: 13px;\\n            cursor: pointer;\\n            font-family: inherit;\\n            height: 100%;\\n            display: inline-flex;\\n            align-items: center;\\n        }\\n        .dplayer-live-dot {\\n            display: inline-block;\\n            width: 6px;\\n            height: 6px;\\n            vertical-align: 4%;\\n            margin-right: 5px;\\n            content: \\'\\';\\n            border-radius: 6px;\\n        }\\n        .dplayer-icon {\\n            width: 40px;\\n            height: 100%;\\n            border: none;\\n            background-color: transparent;\\n            line-height: 18px;\\n            outline: none;\\n            cursor: pointer;\\n            vertical-align: middle;\\n            box-sizing: border-box;\\n            display: inline-block;\\n            .dplayer-icon-content {\\n                transition: all .2s ease-in-out;\\n                opacity: .8;\\n            }\\n            &:hover {\\n                .dplayer-icon-content {\\n                    opacity: 1;\\n                }\\n            }\\n            &::-moz-focus-inner {\\n                border: 0;\\n            }\\n            &.dplayer-comment-icon {\\n                padding: 10.5px 9.5px 8px;\\n                @media (max-width: 500px){\\n                    & {\\n                        padding: 9px 9px 8px;\\n                    }\\n                }\\n                @media (max-width: 350px){\\n                    & {\\n                        padding: 6.5px 6.5px 6px;\\n                    }\\n                }\\n            }\\n            &.dplayer-volume-icon {\\n                width: 43px;\\n            }\\n            &.dplayer-full-icon[aria-label]:after {\\n                left: 1%;\\n            }\\n            @media (max-width: 350px){\\n                & {\\n                    width: 35px;\\n                }\\n            }\\n        }\\n        .dplayer-volume {\\n            position: relative;\\n            display: inline-block;\\n            cursor: pointer;\\n            height: 100%;\\n            &:hover {\\n                .dplayer-volume-bar-wrap .dplayer-volume-bar {\\n                    width: 45px;\\n                }\\n                .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb {\\n                    transform: scale(1);\\n                }\\n            }\\n            &.dplayer-volume-active {\\n                .dplayer-volume-bar-wrap .dplayer-volume-bar {\\n                    width: 45px;\\n                }\\n                .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb {\\n                    transform: scale(1);\\n                }\\n            }\\n            .dplayer-volume-bar-wrap {\\n                display: inline-block;\\n                margin: 0 10px 0 -5px;\\n                vertical-align: middle;\\n                height: 100%;\\n                .dplayer-volume-bar {\\n                    position: relative;\\n                    top: 17px;\\n                    width: 0;\\n                    height: 4px;\\n                    background: #FFF;\\n                    transition: all 0.3s ease-in-out;\\n                    .dplayer-volume-bar-inner {\\n                        position: absolute;\\n                        bottom: 0;\\n                        left: 0;\\n                        height: 100%;\\n                        transition: all 0.1s ease;\\n                        will-change: width;\\n                        .dplayer-thumb {\\n                            position: absolute;\\n                            top: 0;\\n                            right: 5px;\\n                            margin-top: -4px;\\n                            margin-right: -10px;\\n                            height: 11px;\\n                            width: 11px;\\n                            border-radius: 50%;\\n                            cursor: pointer;\\n                            transition: all .3s ease-in-out;\\n                            transform: scale(0);\\n                        }\\n                    }\\n                }\\n            }\\n        }\\n        .dplayer-subtitle-btn {\\n            display: inline-block;\\n            height: 100%;\\n        }\\n        .dplayer-setting {\\n            display: inline-block;\\n            height: 100%;\\n        }\\n        .dplayer-full {\\n            display: inline-block;\\n            height: 100%;\\n            position: relative;\\n        }\\n        .dplayer-comment {\\n            display: inline-block;\\n            height: 100%;\\n        }\\n    }\\n}\\n\\n.dplayer-mobile-icon-wrap {\\n    display: flex;\\n    align-items: center;\\n    justify-content: space-evenly;\\n    position: absolute;\\n    top: 50%;\\n    left: 50%;\\n    width: 100%;\\n    height: 50px;\\n    transform: translate(-50%, -50%);\\n    transition: all 0.28s ease;\\n    opacity: 0;\\n    visibility: hidden;\\n    pointer-events: none;\\n\\n    .dplayer-mobile-icon {\\n        width: 50px;\\n        height: 50px;\\n        border: none;\\n        background-color: transparent;\\n        -webkit-tap-highlight-color: transparent;\\n        filter: drop-shadow(0 0 7px rgba(0, 0, 0, 0.5));\\n        box-sizing: border-box;\\n        cursor: pointer;\\n        outline: none;\\n        pointer-events: auto;\\n\\n        &-backward, &-forward {\\n            padding: 12px;\\n        }\\n    }\\n}\\n\\n.dplayer-setting-box {\\n    display: flex;\\n    position: absolute;\\n    right: 20px;\\n    bottom: 64px;\\n    width: 210px;\\n    height: calc(100% - 64px - 8px);\\n    border-radius: 7px;\\n    background: rgba(28, 28, 28, 0.9);\\n    transition: all .25s ease;\\n    box-sizing: border-box;\\n    overflow-x: hidden;\\n    overflow-y: hidden;\\n    visibility: hidden;\\n    opacity: 0;\\n    z-index: 2;\\n    -webkit-tap-highlight-color: transparent;\\n    &>div {\\n        overflow-x: hidden;\\n        &.dplayer-setting-origin-panel {\\n            display: block;\\n        }\\n    }\\n    &.dplayer-setting-box-open {\\n        visibility: visible;\\n        opacity: 1;\\n    }\\n    &.dplayer-setting-box-quality {\\n        clip-path: inset(calc(100% - (30px * var(--quality-length)) - 54px) 0 0 round 7px) !important;\\n        .dplayer-setting-origin-panel {\\n            transform: translateX(-100%);\\n        }\\n        .dplayer-setting-quality-panel {\\n            display: block;\\n            transform: translateX(0%);\\n        }\\n    }\\n    &.dplayer-setting-box-speed {\\n        clip-path: inset(calc(100% - (30px * var(--speed-length)) - 54px) 0 0 round 7px) !important;\\n        .dplayer-setting-origin-panel {\\n            transform: translateX(-100%);\\n        }\\n        .dplayer-setting-speed-panel {\\n            display: block;\\n            transform: translateX(0%);\\n        }\\n    }\\n    &.dplayer-setting-box-audio {\\n        clip-path: inset(calc(100% - 114px) 0 0 round 7px) !important;\\n        .dplayer-setting-origin-panel {\\n            transform: translateX(-100%);\\n        }\\n        .dplayer-setting-audio-panel {\\n            display: block;\\n            transform: translateX(0%);\\n        }\\n    }\\n    .dplayer-label {\\n        display: inline-block;\\n        color: #eee;\\n        font-size: 13px;\\n        vertical-align: middle;\\n        white-space: nowrap;\\n    }\\n    .dplayer-label-value {\\n        display: inline-block;\\n        margin-left: auto;\\n        margin-right: 23px;\\n        color: #e0e0e0;\\n        font-size: 12px;\\n        vertical-align: middle;\\n        white-space: nowrap;\\n    }\\n    .dplayer-toggle {\\n        position: absolute;\\n        top: 5px;\\n        right: 7px;\\n        width: 20px;\\n        height: 20px;\\n        text-align: center;\\n        font-size: 0;\\n        vertical-align: middle;\\n        input {\\n            max-height: 0;\\n            max-width: 0;\\n            display: none;\\n        }\\n        input+label {\\n            display: inline-block;\\n            position: relative;\\n            right: 15px;\\n            width: 32px;\\n            height: 20px;\\n            border-radius: 10px;\\n            box-sizing: border-box;\\n            transition: .25s ease;\\n            box-shadow: rgb(223, 223, 223) 0 0 0 0 inset;\\n            border: 1px solid rgb(223, 223, 223);\\n            cursor: pointer;\\n        }\\n        input+label:before {\\n            content: \"\";\\n            position: absolute;\\n            display: block;\\n            height: 19px;\\n            width: 19px;\\n            top: -0.5px;\\n            left: -0.5px;\\n            border-radius: 15px;\\n            transition: .25s ease;\\n        }\\n        input+label:after {\\n            content: \"\";\\n            display: block;\\n            position: absolute;\\n            height: 18.1px;\\n            width: 18.1px;\\n            top: -0.1px;\\n            left: 0;\\n            border-radius: 15px;\\n            background: #fff;\\n            transition: .25s ease;\\n            box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);\\n        }\\n        input:checked+label {\\n            border-color: var(--theme-color);\\n        }\\n        input:checked+label:before {\\n            width: 31px;\\n            background: var(--theme-color);\\n        }\\n        input:checked+label:after {\\n            left: 12px;\\n        }\\n    }\\n    .dplayer-setting-origin-panel,\\n    .dplayer-setting-quality-panel,\\n    .dplayer-setting-speed-panel,\\n    .dplayer-setting-audio-panel {\\n        position: absolute;\\n        bottom: 0px;\\n        width: 100%;\\n        max-height: 100%;\\n        padding: 7px 0;\\n        transition: transform .25s ease;\\n        box-sizing: border-box;\\n        scrollbar-width: thin;\\n        overflow-y: auto;\\n        &::-webkit-scrollbar {\\n            width: 6px;\\n        }\\n        &::-webkit-scrollbar-thumb {\\n            background: rgba(255, 255, 255, .15);\\n        }\\n    }\\n    .dplayer-setting-origin-panel {\\n        transform: translateX(0%);\\n    }\\n    .dplayer-setting-quality-panel,\\n    .dplayer-setting-speed-panel,\\n    .dplayer-setting-audio-panel {\\n        transform: translateX(100%);\\n        .dplayer-setting-header {\\n            display: flex;\\n            align-items: center;\\n            height: 33px;\\n            padding-left: 5px;\\n            padding-bottom: 5px;\\n            margin-bottom: 7px;\\n            border-bottom: 2px solid rgba(255, 255, 255, .15);\\n            box-sizing: border-box;\\n            cursor: pointer;\\n        }\\n        .dplayer-setting-quality-item,\\n        .dplayer-setting-speed-item,\\n        .dplayer-setting-audio-item {\\n            padding: 5px;\\n            .dplayer-toggle {\\n                visibility: hidden;\\n            }\\n            &.dplayer-setting-quality-current .dplayer-toggle,\\n            &.dplayer-setting-speed-current .dplayer-toggle,\\n            &.dplayer-setting-audio-current .dplayer-toggle {\\n                visibility: visible;\\n            }\\n        }\\n        .dplayer-toggle {\\n            display: inline-block;\\n            position: static;\\n            width: 22px;\\n            margin-right: 6px;\\n        }\\n    }\\n    .dplayer-setting-item,\\n    .dplayer-setting-quality-item,\\n    .dplayer-setting-speed-item,\\n    .dplayer-setting-audio-item {\\n        display: flex;\\n        align-items: center;\\n        height: 30px;\\n        padding: 5px 10px;\\n        box-sizing: border-box;\\n        cursor: pointer;\\n        position: relative;\\n        &:hover {\\n            background-color: rgba(255, 255, 255, .1);\\n        }\\n    }\\n    .dplayer-setting-danmaku {\\n        padding: 5px 0;\\n        .dplayer-label {\\n            padding: 0 10px;\\n            display: inline;\\n        }\\n        .dplayer-label-value {\\n            margin-right: 18px;\\n            font-size: 12.5px;\\n        }\\n        &:hover {\\n            .dplayer-label, .dplayer-label-value {\\n                display: none;\\n            }\\n            .dplayer-danmaku-bar-wrap {\\n                display: inline-block;\\n            }\\n        }\\n        &.dplayer-setting-danmaku-active {\\n            .dplayer-label, .dplayer-label-value {\\n                display: none;\\n            }\\n            .dplayer-danmaku-bar-wrap {\\n                display: inline-block;\\n            }\\n        }\\n        .dplayer-danmaku-bar-wrap {\\n            padding: 0 10px;\\n            box-sizing: border-box;\\n            display: none;\\n            vertical-align: middle;\\n            height: 100%;\\n            width: 100%;\\n            .dplayer-danmaku-bar {\\n                position: relative;\\n                top: 8.5px;\\n                width: 100%;\\n                height: 3px;\\n                background: #fff;\\n                transition: all 0.3s ease-in-out;\\n                .dplayer-danmaku-bar-inner {\\n                    position: absolute;\\n                    bottom: 0;\\n                    left: 0;\\n                    height: 100%;\\n                    transition: all 0.05s ease;\\n                    will-change: width;\\n                    .dplayer-thumb {\\n                        position: absolute;\\n                        top: 0;\\n                        right: 5px;\\n                        margin-top: -4px;\\n                        margin-right: -10px;\\n                        height: 11px;\\n                        width: 11px;\\n                        border-radius: 50%;\\n                        cursor: pointer;\\n                        transition: all .3s ease-in-out;\\n                    }\\n                }\\n            }\\n        }\\n    }\\n}\\n\\n.dplayer-comment-setting-box {\\n    position: absolute;\\n    left: 20px;\\n    bottom: 64px;\\n    width: 255px;\\n    max-height: calc(100% - 64px - 8px);\\n    clip-path: inset(0 0 0 round 7px);\\n    border-radius: 7px;\\n    background: rgba(28, 28, 28, 0.9);\\n    padding: 10px 10px 16px;\\n    font-size: 14px;\\n    transition: all .25s ease;\\n    scrollbar-width: thin;\\n    visibility: hidden;\\n    opacity: 0;\\n    box-sizing: border-box;\\n    overflow-y: auto;\\n    z-index: 2;\\n    -webkit-tap-highlight-color: transparent;\\n    &::-webkit-scrollbar {\\n        width: 6px;\\n    }\\n    &::-webkit-scrollbar-thumb {\\n        background: rgba(255, 255, 255, .15);\\n    }\\n    &.dplayer-comment-setting-open {\\n        visibility: visible;\\n        opacity: 1;\\n    }\\n    input[type=radio] {\\n        display: none;\\n    }\\n    label {\\n        cursor: pointer;\\n    }\\n    .dplayer-comment-setting-title {\\n        font-size: 13px;\\n        color: #fff;\\n        line-height: 30px;\\n    }\\n    .dplayer-comment-setting-type, .dplayer-comment-setting-size {\\n        font-size: 0;\\n        &.dplayer-comment-setting-size {\\n            margin-top: 8px;\\n        }\\n        .dplayer-comment-setting-title {\\n            margin-bottom: 6px;\\n        }\\n        label {\\n            &:nth-child(2) {\\n                span {\\n                    border-radius: 4px 0 0 4px;\\n                }\\n            }\\n            &:nth-child(4) {\\n                span {\\n                    border-radius: 0 4px 4px 0;\\n                }\\n            }\\n        }\\n        span {\\n            width: 33.6%;\\n            padding: 4px 6px;\\n            line-height: 16px;\\n            display: inline-block;\\n            font-size: 12px;\\n            color: #fff;\\n            border: 1px solid #fff;\\n            margin-right: -1px;\\n            box-sizing: border-box;\\n            text-align: center;\\n            cursor: pointer;\\n        }\\n        input:checked+span {\\n            background: #E4E4E6;\\n            color: #1c1c1c;\\n        }\\n    }\\n    .dplayer-comment-setting-color {\\n        font-size: 0;\\n        .dplayer-comment-setting-color-list {\\n            display: flex;\\n            justify-content: space-between;\\n            padding: 4px 0px;\\n            label {\\n                display: inline-block;\\n                font-size: 0;\\n                padding: 6px 0px;\\n            }\\n            span {\\n                display: inline-block;\\n                width: 22px;\\n                height: 22px;\\n                border-radius: 50%;\\n                box-sizing: border-box;\\n                cursor: pointer;\\n                &:hover {\\n                    animation: my-face 5s infinite ease-in-out;\\n                }\\n            }\\n        }\\n    }\\n}\\n',\".dplayer-danmaku {\\n    position: absolute;\\n    top: 0;\\n    left: 0;\\n    right: 0;\\n    bottom: 0;\\n    max-width: 100%;\\n    max-height: 100%;\\n    aspect-ratio: 16/9;\\n    margin: auto;\\n    font-size: 29px;\\n    font-family: inherit;\\n    color: #fff;\\n    overflow: hidden;\\n    .dplayer-danmaku-item {\\n        display: inline-block;\\n        font-weight: bold;\\n        font-size: var(--dplayer-danmaku-font-size);\\n        opacity: var(--dplayer-danmaku-opacity);\\n        white-space: nowrap;\\n        text-shadow: 1.2px 1.2px 4px rgba(0, 0, 0, 0.9);\\n        cursor: default;\\n        user-select: none;\\n        -webkit-user-select: none;\\n        pointer-events: none;\\n        &--demo {\\n            position: absolute;\\n            visibility: hidden;\\n        }\\n        span {\\n            box-decoration-break: clone;\\n            -webkit-box-decoration-break: clone;\\n        }\\n        &.dplayer-danmaku-size-big {\\n            font-size: calc(var(--dplayer-danmaku-font-size) * 1.25);\\n        }\\n        &.dplayer-danmaku-size-small {\\n            font-size: calc(var(--dplayer-danmaku-font-size) * 0.8);\\n        }\\n    }\\n    .dplayer-danmaku-right {\\n        position: absolute;\\n        right: 0;\\n        transform: translateX(100%);\\n        &.dplayer-danmaku-move {\\n            animation-name: danmaku;\\n            animation-timing-function: linear;\\n            animation-play-state: paused;\\n        }\\n    }\\n    @keyframes danmaku {\\n        from {\\n            transform: translateX(100%);\\n        }\\n    }\\n    .dplayer-danmaku-top,\\n    .dplayer-danmaku-bottom {\\n        position: absolute;\\n        left: 50%;\\n        transform: translateX(-50%);\\n        visibility: hidden;\\n        &.dplayer-danmaku-move {\\n            animation-name: danmaku-center;\\n            animation-timing-function: linear;\\n            animation-play-state: paused;\\n        }\\n    }\\n    @keyframes danmaku-center {\\n        from {\\n            visibility: visible;\\n        }\\n        to {\\n            visibility: visible;\\n        }\\n    }\\n}\\n\",\".dplayer-logo {\\n    pointer-events: none;\\n    position: absolute;\\n    left: 20px;\\n    top: 20px;\\n    max-width: 50px;\\n    max-height: 50px;\\n    img {\\n        max-width: 100%;\\n        max-height: 100%;\\n        background: none;\\n    }\\n}\\n\",\".dplayer-menu {\\n    position: absolute;\\n    width: 170px;\\n    border-radius: 2px;\\n    background: rgba(28, 28, 28, 0.85);\\n    padding: 5px 0;\\n    overflow: hidden;\\n    z-index: 3;\\n    display: none;\\n    &.dplayer-menu-show {\\n        display: block;\\n    }\\n    .dplayer-menu-item {\\n        height: 30px;\\n        box-sizing: border-box;\\n        cursor: pointer;\\n        &:hover {\\n            background-color: rgba(255, 255, 255, .1);\\n        }\\n        a {\\n            display: inline-block;\\n            padding: 0 10px;\\n            line-height: 30px;\\n            color: #eee;\\n            font-size: 13px;\\n            display: inline-block;\\n            vertical-align: middle;\\n            width: 100%;\\n            box-sizing: border-box;\\n            white-space: nowrap;\\n            text-overflow: ellipsis;\\n            overflow: hidden;\\n            &:hover {\\n                text-decoration: none;\\n            }\\n        }\\n    }\\n}\\n\",\".dplayer-notice {\\n    position: absolute;\\n    bottom: 68px;\\n    left: 20px;\\n    padding: 12px 18px;\\n    margin-right: 20px;\\n    border-radius: 4px;\\n    background: rgba(28, 28, 28, 0.9);\\n    color: #fff;\\n    font-size: 14px;\\n    line-height: 1.6;\\n    transition: all .3s ease-in-out, color 0s;\\n    opacity: 0;\\n    overflow: hidden;\\n    pointer-events: none;\\n}\\n@media (max-width: 500px){\\n    .dplayer-notice {\\n        top: 10px;\\n        bottom: auto !important;\\n    }\\n}\\n\",\".dplayer-subtitle {\\n    position: absolute;\\n    bottom: 40px;\\n    width: 90%;\\n    left: 5%;\\n    text-align: center;\\n    color: #fff;\\n    text-shadow: 0.5px 0.5px 0.5px rgba(0, 0, 0, 0.5);\\n    font-size: 20px;\\n    &.dplayer-subtitle-hide {\\n        display: none;\\n    }\\n}\\n\",\".dplayer-mask {\\n    position: absolute;\\n    top: 0;\\n    bottom: 0;\\n    left: 0;\\n    right: 0;\\n    z-index: 1;\\n    display: none;\\n    &.dplayer-mask-show {\\n        display: block;\\n    }\\n}\\n\\n.dplayer-video-wrap {\\n    display: flex;\\n    position: relative;\\n    align-items: center;\\n    justify-content: center;\\n    background: #000;\\n    font-size: 0;\\n    width: 100%;\\n    height: 100%;\\n\\n    .dplayer-video-wrap-aspect {\\n        position: relative;\\n        max-width: 100%;\\n        max-height: 100%;\\n        aspect-ratio: 16 / 9;\\n        overflow: hidden;\\n\\n        .dplayer-video {\\n            width: 99999px;  // magic!!\\n            max-width: 100%;\\n            max-height: 100%;\\n            display: none;\\n        }\\n        .dplayer-video-current {\\n            display: block;\\n        }\\n        .dplayer-video-prepare {\\n            display: none;\\n        }\\n    }\\n}\\n\",\".dplayer-info-panel {\\n    position: absolute;\\n    top: 10px;\\n    left: 10px;\\n    width: 450px;\\n    background: rgba(28, 28, 28, 0.8);\\n    padding: 10px;\\n    color: #fff;\\n    font-size: 12px;\\n    border-radius: 2px;\\n\\n    &-hide {\\n        display: none;\\n    }\\n\\n    .dplayer-info-panel-close {\\n        cursor: pointer;\\n        position: absolute;\\n        right: 10px;\\n        top: 10px;\\n    }\\n\\n    .dplayer-info-panel-item {\\n        & > span {\\n            display: inline-block;\\n            vertical-align: middle;\\n            line-height: 15px;\\n            white-space: nowrap;\\n            text-overflow: ellipsis;\\n            overflow: hidden;\\n        }\\n    }\\n\\n    .dplayer-info-panel-item-title {\\n        width: 100px;\\n        text-align: right;\\n        margin-right: 10px;\\n    }\\n\\n    .dplayer-info-panel-item-data {\\n        width: 320px;\\n    }\\n}\\n\"],sourceRoot:\"\"}]);const d=l},454:e=>{e.exports='<svg version=\"1.1\" viewBox=\"0 0 22 22\"><svg x=\"7\" y=\"1\"><circle class=\"dplayer-loading-dot dplayer-loading-dot-0\" cx=\"4\" cy=\"4\" r=\"2\"></circle></svg><svg x=\"11\" y=\"3\"><circle class=\"dplayer-loading-dot dplayer-loading-dot-1\" cx=\"4\" cy=\"4\" r=\"2\"></circle></svg><svg x=\"13\" y=\"7\"><circle class=\"dplayer-loading-dot dplayer-loading-dot-2\" cx=\"4\" cy=\"4\" r=\"2\"></circle></svg><svg x=\"11\" y=\"11\"><circle class=\"dplayer-loading-dot dplayer-loading-dot-3\" cx=\"4\" cy=\"4\" r=\"2\"></circle></svg><svg x=\"7\" y=\"13\"><circle class=\"dplayer-loading-dot dplayer-loading-dot-4\" cx=\"4\" cy=\"4\" r=\"2\"></circle></svg><svg x=\"3\" y=\"11\"><circle class=\"dplayer-loading-dot dplayer-loading-dot-5\" cx=\"4\" cy=\"4\" r=\"2\"></circle></svg><svg x=\"1\" y=\"7\"><circle class=\"dplayer-loading-dot dplayer-loading-dot-6\" cx=\"4\" cy=\"4\" r=\"2\"></circle></svg><svg x=\"3\" y=\"3\"><circle class=\"dplayer-loading-dot dplayer-loading-dot-7\" cx=\"4\" cy=\"4\" r=\"2\"></circle></svg></svg>'},456:(e,t,i)=>{var n=i(143);e.exports=function(e){\"use strict\";var t,a=\"\",r=(e=e||{}).video,o=e.options,s=n.$escape,l=e.tran,d=e.icons,p=n.$each,c=(e.$value,e.$index,e.index);return a+='<div class=\"dplayer-mask\"></div>\\n<div class=\"dplayer-video-wrap\">\\n    <div class=\"dplayer-video-wrap-aspect\">\\n      ',t=i(194)(r),a+=t,a+=\"\\n    </div>\\n    \",o.logo&&(a+='\\n    <div class=\"dplayer-logo\">\\n        <img src=\"',a+=s(o.logo),a+='\">\\n    </div>\\n    '),a+='\\n    <div class=\"dplayer-danmaku\"',o.danmaku&&o.danmaku.bottom&&(a+=' style=\"margin-bottom:',a+=s(o.danmaku.bottom),a+='\"'),a+='>\\n        <div class=\"dplayer-danmaku-item dplayer-danmaku-item--demo\"></div>\\n    </div>\\n    <div class=\"dplayer-subtitle\"></div>\\n    <div class=\"dplayer-bezel\">\\n        <span class=\"dplayer-bezel-icon\"></span>\\n        <span class=\"dplayer-danloading\" style=\"display: none\">',a+=s(l(\"Danmaku is loading\")),a+='</span>\\n        <span class=\"dplayer-loading-icon\">',a+=d.loading,a+='</span>\\n    </div>\\n</div>\\n<div class=\"dplayer-controller-mask\"></div>\\n<div class=\"dplayer-controller\">\\n    <div class=\"dplayer-icons dplayer-comment-box\">\\n        <button class=\"dplayer-icon dplayer-comment-setting-icon\" aria-label=\"',a+=s(l(\"Setting\")),a+='\" data-balloon-nofocus data-balloon-pos=\"up\">\\n            <span class=\"dplayer-icon-content\">',a+=d.pallette,a+='</span>\\n        </button>\\n        <input class=\"dplayer-comment-input\" type=\"search\" enterkeyhint=\"send\" placeholder=\"',a+=s(l(\"Input danmaku, hit Enter\")),a+='\" spellcheck=\"false\" maxlength=\"60\">\\n        <button class=\"dplayer-icon dplayer-send-icon\" aria-label=\"',a+=s(l(\"Send\")),a+='\" data-balloon-nofocus data-balloon-pos=\"up\">\\n            <span class=\"dplayer-icon-content\">',a+=d.send,a+='</span>\\n        </button>\\n    </div>\\n    <div class=\"dplayer-icons dplayer-icons-left\">\\n        <button class=\"dplayer-icon dplayer-play-icon\">\\n            <span class=\"dplayer-icon-content\">',a+=d.play,a+='</span>\\n        </button>\\n        <div class=\"dplayer-volume\">\\n            <button class=\"dplayer-icon dplayer-volume-icon\">\\n                <span class=\"dplayer-icon-content\">',a+=d.volumeDown,a+='</span>\\n            </button>\\n            <div class=\"dplayer-volume-bar-wrap\" data-balloon-nofocus data-balloon-pos=\"up\">\\n                <div class=\"dplayer-volume-bar\">\\n                    <div class=\"dplayer-volume-bar-inner\" style=\"background: ',a+=s(o.theme),a+=';\">\\n                        <span class=\"dplayer-thumb\" style=\"background: ',a+=s(o.theme),a+=';\"></span>\\n                    </div>\\n                </div>\\n            </div>\\n        </div>\\n        <span class=\"dplayer-time\">\\n            <span class=\"dplayer-ptime\">00:00</span> /\\n            <span class=\"dplayer-dtime\">00:00</span>\\n        </span>\\n        ',o.live&&(a+='\\n        <span class=\"dplayer-live-badge\" aria-label=\"',a+=s(l(\"Synchronize\")),a+='\" data-balloon-nofocus data-balloon-pos=\"up\">\\n            <span class=\"dplayer-icon-content\">\\n                <span class=\"dplayer-live-dot\" style=\"background: ',a+=s(o.theme),a+=';\"></span>',a+=s(l(\"Live\")),a+=\"\\n            </span>\\n        </span>\\n        \"),a+='\\n    </div>\\n    <div class=\"dplayer-icons dplayer-icons-right\">\\n        ',o.screenshot&&(a+='\\n        <div class=\"dplayer-icon dplayer-camera-icon\" aria-label=\"',a+=s(l(\"Screenshot\")),a+='\" data-balloon-nofocus data-balloon-pos=\"up\">\\n            <span class=\"dplayer-icon-content\">',a+=d.camera,a+=\"</span>\\n        </div>\\n        \"),a+=\"\\n        \",o.airplay&&(a+='\\n        <div class=\"dplayer-icon dplayer-airplay-icon\" aria-label=\"',a+=s(l(\"AirPlay\")),a+='\" data-balloon-nofocus data-balloon-pos=\"up\">\\n            <span class=\"dplayer-icon-content\">',a+=d.airplay,a+=\"</span>\\n        </div>\\n        \"),a+='\\n        <div class=\"dplayer-comment\">\\n            <button class=\"dplayer-icon dplayer-comment-icon\" aria-label=\"',a+=s(l(\"Send danmaku\")),a+='\" data-balloon-nofocus data-balloon-pos=\"up\">\\n                <span class=\"dplayer-icon-content\">',a+=d.comment,a+=\"</span>\\n            </button>\\n        </div>\\n        \",o.subtitle&&(a+='\\n        <div class=\"dplayer-subtitle-btn\">\\n            <button class=\"dplayer-icon dplayer-subtitle-icon\" aria-label=\"',a+=s(l(\"Hide subtitle\")),a+='\" data-balloon-nofocus data-balloon-pos=\"up\">\\n                <span class=\"dplayer-icon-content\">',a+=d.subtitle,a+=\"</span>\\n            </button>\\n        </div>\\n        \"),a+='\\n        <div class=\"dplayer-setting\">\\n            <button class=\"dplayer-icon dplayer-setting-icon\" aria-label=\"',a+=s(l(\"Setting\")),a+='\" data-balloon-nofocus data-balloon-pos=\"up\">\\n                <span class=\"dplayer-icon-content\">',a+=d.setting,a+='</span>\\n            </button>\\n        </div>\\n        <div class=\"dplayer-full\">\\n            <button class=\"dplayer-icon dplayer-pip-icon\" aria-label=\"',a+=s(l(\"Picture-in-Picture\")),a+='\" data-balloon-nofocus data-balloon-pos=\"up\">\\n                <span class=\"dplayer-icon-content\">',a+=d.pip,a+='</span>\\n            </button>\\n            <button class=\"dplayer-icon dplayer-full-in-icon\" aria-label=\"',a+=s(l(\"Web full screen\")),a+='\" data-balloon-nofocus data-balloon-pos=\"up\">\\n                <span class=\"dplayer-icon-content\">',a+=d.fullWeb,a+='</span>\\n            </button>\\n            <button class=\"dplayer-icon dplayer-full-icon\" aria-label=\"',a+=s(l(\"Full screen\")),a+='\" data-balloon-nofocus data-balloon-pos=\"up\">\\n                <span class=\"dplayer-icon-content\">',a+=d.full,a+='</span>\\n            </button>\\n        </div>\\n    </div>\\n    <div class=\"dplayer-bar-wrap\">\\n        <div class=\"dplayer-bar-time hidden\">00:00</div>\\n        <div class=\"dplayer-bar-preview\"></div>\\n        <div class=\"dplayer-bar\">\\n            <div class=\"dplayer-loaded\" style=\"width: 0;\"></div>\\n            <div class=\"dplayer-played\" style=\"width: 0; background: ',a+=s(o.theme),a+=';\">\\n                <span class=\"dplayer-thumb\" style=\"background: ',a+=s(o.theme),a+=';\"></span>\\n            </div>\\n        </div>\\n    </div>\\n</div>\\n<div class=\"dplayer-setting-box\" style=\"',a+=s(o.video.quality?`--quality-length:${o.video.quality.length};`:\"\"),a+=\" \",a+=s(o.playbackSpeed?`--speed-length:${o.playbackSpeed.length};`:\"\"),a+='\">\\n    <div class=\"dplayer-setting-origin-panel\">\\n        ',o.video.quality&&(a+='\\n        <div class=\"dplayer-setting-item dplayer-setting-quality\">\\n            <span class=\"dplayer-label\">',a+=s(l(\"Quality\")),a+='</span>\\n            <span class=\"dplayer-label-value\">',a+=s(o.video.quality[o.video.defaultQuality].name),a+='</span>\\n            <div class=\"dplayer-toggle\">',a+=d.right,a+=\"</div>\\n        </div>\\n        \"),a+='\\n        <div class=\"dplayer-setting-item dplayer-setting-audio\">\\n            <span class=\"dplayer-label\">',a+=s(l(\"Audio\")),a+='</span>\\n            <span class=\"dplayer-label-value\">',a+=s(l(\"Primary audio\")),a+='</span>\\n            <div class=\"dplayer-toggle\">',a+=d.right,a+='</div>\\n        </div>\\n        <div class=\"dplayer-setting-item dplayer-setting-speed\">\\n            <span class=\"dplayer-label\">',a+=s(l(\"Speed\")),a+='</span>\\n            <span class=\"dplayer-label-value\">',a+=s(l(\"Normal\")),a+='</span>\\n            <div class=\"dplayer-toggle\">',a+=d.right,a+='</div>\\n        </div>\\n        <div class=\"dplayer-setting-item dplayer-setting-loop\">\\n            <span class=\"dplayer-label\">',a+=s(l(\"Loop\")),a+='</span>\\n            <div class=\"dplayer-toggle\">\\n                <input class=\"dplayer-toggle-setting-input\" type=\"checkbox\" name=\"dplayer-toggle\">\\n                <label for=\"dplayer-toggle\" style=\"--theme-color:',a+=s(o.theme),a+='\"></label>\\n            </div>\\n        </div>\\n        <div class=\"dplayer-setting-item dplayer-setting-showdan\">\\n            <span class=\"dplayer-label\">',a+=s(l(\"Show danmaku\")),a+='</span>\\n            <div class=\"dplayer-toggle\">\\n                <input class=\"dplayer-showdan-setting-input\" type=\"checkbox\" name=\"dplayer-toggle-dan\">\\n                <label for=\"dplayer-toggle-dan\" style=\"--theme-color:',a+=s(o.theme),a+='\"></label>\\n            </div>\\n        </div>\\n        <div class=\"dplayer-setting-item dplayer-setting-danunlimit\">\\n            <span class=\"dplayer-label\">',a+=s(l(\"Unlimited danmaku\")),a+='</span>\\n            <div class=\"dplayer-toggle\">\\n                <input class=\"dplayer-danunlimit-setting-input\" type=\"checkbox\" name=\"dplayer-toggle-danunlimit\">\\n                <label for=\"dplayer-toggle-danunlimit\" style=\"--theme-color:',a+=s(o.theme),a+='\"></label>\\n            </div>\\n        </div>\\n        <div class=\"dplayer-setting-item dplayer-setting-danmaku\">\\n            <span class=\"dplayer-label\">',a+=s(l(\"Opacity for danmaku\")),a+='</span>\\n            <span class=\"dplayer-label-value\">1.0</span>\\n            <div class=\"dplayer-danmaku-bar-wrap\">\\n                <div class=\"dplayer-danmaku-bar\">\\n                    <div class=\"dplayer-danmaku-bar-inner\" style=\"background: ',a+=s(o.theme),a+=';\">\\n                        <span class=\"dplayer-thumb\" style=\"background: ',a+=s(o.theme),a+=';\"></span>\\n                    </div>\\n                </div>\\n            </div>\\n        </div>\\n    </div>\\n    ',o.video.quality&&(a+='\\n    <div class=\"dplayer-setting-quality-panel\">\\n        <div class=\"dplayer-setting-header dplayer-setting-quality-header\">\\n            <div class=\"dplayer-toggle\">',a+=d.left,a+='</div>\\n            <span class=\"dplayer-label\">',a+=s(l(\"Quality\")),a+=\"</span>\\n        </div>\\n        \",p(o.video.quality,function(e,t){a+='\\n            <div class=\"dplayer-setting-quality-item ',a+=s(e.name===o.video.quality[o.video.defaultQuality].name?\"dplayer-setting-quality-current\":\"\"),a+='\" data-index=\"',a+=s(t),a+='\">\\n                <div class=\"dplayer-toggle\">',a+=d.check,a+='</div>\\n                <span class=\"dplayer-label\">',a+=s(e.name),a+=\"</span>\\n            </div>\\n        \"}),a+=\"\\n    </div>\\n    \"),a+='\\n    <div class=\"dplayer-setting-speed-panel\">\\n        <div class=\"dplayer-setting-header dplayer-setting-speed-header\">\\n            <div class=\"dplayer-toggle\">',a+=d.left,a+='</div>\\n            <span class=\"dplayer-label\">',a+=s(l(\"Speed\")),a+=\"</span>\\n        </div>\\n        \",p(o.playbackSpeed,function(e,t){a+='\\n            <div class=\"dplayer-setting-speed-item ',a+=s(1===e?\"dplayer-setting-speed-current\":\"\"),a+='\" data-speed=\"',a+=s(e),a+='\">\\n                <div class=\"dplayer-toggle\">',a+=d.check,a+='</div>\\n                <span class=\"dplayer-label\">',a+=s(1===e?l(\"Normal\"):e),a+=\"</span>\\n            </div>\\n        \"}),a+='\\n    </div>\\n    <div class=\"dplayer-setting-audio-panel\">\\n        <div class=\"dplayer-setting-header dplayer-setting-audio-header\">\\n            <div class=\"dplayer-toggle\">',a+=d.left,a+='</div>\\n            <span class=\"dplayer-label\">',a+=s(l(\"Audio\")),a+='</span>\\n        </div>\\n        <div class=\"dplayer-setting-audio-item dplayer-setting-audio-current\" data-audio=\"primary\">\\n            <div class=\"dplayer-toggle\">',a+=d.check,a+='</div>\\n            <span class=\"dplayer-label\">',a+=s(l(\"Primary audio\")),a+='</span>\\n        </div>\\n        <div class=\"dplayer-setting-audio-item\" data-audio=\"secondary\">\\n            <div class=\"dplayer-toggle\">',a+=d.check,a+='</div>\\n            <span class=\"dplayer-label\">',a+=s(l(\"Secondary audio\")),a+='</span>\\n        </div>\\n    </div>\\n</div>\\n<div class=\"dplayer-comment-setting-box\">\\n    <div class=\"dplayer-comment-setting-color\">\\n        <div class=\"dplayer-comment-setting-title\">',a+=s(l(\"Set danmaku color\")),a+='</div>\\n        <div class=\"dplayer-comment-setting-color-list\">\\n            <label>\\n                <input type=\"radio\" name=\"dplayer-danmaku-color-',a+=s(c),a+='\" value=\"#ffeaea\" checked>\\n                <span style=\"background: #ffeaea\"></span>\\n            </label>\\n            <label>\\n                <input type=\"radio\" name=\"dplayer-danmaku-color-',a+=s(c),a+='\" value=\"#f02840\">\\n                <span style=\"background: #f02840\"></span>\\n            </label>\\n            <label>\\n                <input type=\"radio\" name=\"dplayer-danmaku-color-',a+=s(c),a+='\" value=\"#fd7e80\">\\n                <span style=\"background: #fd7e80\"></span>\\n            </label>\\n            <label>\\n                <input type=\"radio\" name=\"dplayer-danmaku-color-',a+=s(c),a+='\" value=\"#fda708\">\\n                <span style=\"background: #fda708\"></span>\\n            </label>\\n            <label>\\n                <input type=\"radio\" name=\"dplayer-danmaku-color-',a+=s(c),a+='\" value=\"#ffe133\">\\n                <span style=\"background: #ffe133\"></span>\\n            </label>\\n            <label>\\n                <input type=\"radio\" name=\"dplayer-danmaku-color-',a+=s(c),a+='\" value=\"#64dd17\">\\n                <span style=\"background: #64dd17\"></span>\\n            </label>\\n            <label>\\n                <input type=\"radio\" name=\"dplayer-danmaku-color-',a+=s(c),a+='\" value=\"#00d4f5\">\\n                <span style=\"background: #00d4f5\"></span>\\n            </label>\\n            <label>\\n                <input type=\"radio\" name=\"dplayer-danmaku-color-',a+=s(c),a+='\" value=\"#4763ff\">\\n                <span style=\"background: #4763ff\"></span>\\n            </label>\\n        </div>\\n    </div>\\n    <div class=\"dplayer-comment-setting-type\">\\n        <div class=\"dplayer-comment-setting-title\">',a+=s(l(\"Set danmaku type\")),a+='</div>\\n        <label>\\n            <input type=\"radio\" name=\"dplayer-danmaku-type-',a+=s(c),a+='\" value=\"top\">\\n            <span>',a+=s(l(\"Top\")),a+='</span>\\n        </label>\\n        <label>\\n            <input type=\"radio\" name=\"dplayer-danmaku-type-',a+=s(c),a+='\" value=\"right\" checked>\\n            <span>',a+=s(l(\"Rolling\")),a+='</span>\\n        </label>\\n        <label>\\n            <input type=\"radio\" name=\"dplayer-danmaku-type-',a+=s(c),a+='\" value=\"bottom\">\\n            <span>',a+=s(l(\"Bottom\")),a+='</span>\\n        </label>\\n    </div>\\n    <div class=\"dplayer-comment-setting-size\">\\n        <div class=\"dplayer-comment-setting-title\">',a+=s(l(\"Set danmaku size\")),a+='</div>\\n        <label>\\n            <input type=\"radio\" name=\"dplayer-danmaku-size-',a+=s(c),a+='\" value=\"big\">\\n            <span>',a+=s(l(\"Big\")),a+='</span>\\n        </label>\\n        <label>\\n            <input type=\"radio\" name=\"dplayer-danmaku-size-',a+=s(c),a+='\" value=\"medium\" checked>\\n            <span>',a+=s(l(\"Medium\")),a+='</span>\\n        </label>\\n        <label>\\n            <input type=\"radio\" name=\"dplayer-danmaku-size-',a+=s(c),a+='\" value=\"small\">\\n            <span>',a+=s(l(\"Small\")),a+='</span>\\n        </label>\\n    </div>\\n</div>\\n<div class=\"dplayer-info-panel dplayer-info-panel-hide\">\\n    <div class=\"dplayer-info-panel-close\">[x]</div>\\n    <div class=\"dplayer-info-panel-item dplayer-info-panel-item-version\">\\n        <span class=\"dplayer-info-panel-item-title\">Player Version</span>\\n        <span class=\"dplayer-info-panel-item-data\"></span>\\n    </div>\\n    <div class=\"dplayer-info-panel-item dplayer-info-panel-item-mimetype\">\\n        <span class=\"dplayer-info-panel-item-title\">Mime Type</span>\\n        <span class=\"dplayer-info-panel-item-data\"></span>\\n    </div>\\n    <div class=\"dplayer-info-panel-item dplayer-info-panel-item-video-fps\">\\n        <span class=\"dplayer-info-panel-item-title\">Video FPS</span>\\n        <span class=\"dplayer-info-panel-item-data\"></span>\\n    </div>\\n    <div class=\"dplayer-info-panel-item dplayer-info-panel-item-page-fps\">\\n        <span class=\"dplayer-info-panel-item-title\">Page FPS</span>\\n        <span class=\"dplayer-info-panel-item-data\"></span>\\n    </div>\\n    <div class=\"dplayer-info-panel-item dplayer-info-panel-item-dropped-frames\">\\n        <span class=\"dplayer-info-panel-item-title\">Dropped Frames</span>\\n        <span class=\"dplayer-info-panel-item-data\"></span>\\n    </div>\\n    <div class=\"dplayer-info-panel-item dplayer-info-panel-item-type\">\\n        <span class=\"dplayer-info-panel-item-title\">Video Type</span>\\n        <span class=\"dplayer-info-panel-item-data\"></span>\\n    </div>\\n    <div class=\"dplayer-info-panel-item dplayer-info-panel-item-url\">\\n        <span class=\"dplayer-info-panel-item-title\">Video URL</span>\\n        <span class=\"dplayer-info-panel-item-data\"></span>\\n    </div>\\n    <div class=\"dplayer-info-panel-item dplayer-info-panel-item-resolution\">\\n        <span class=\"dplayer-info-panel-item-title\">Video Resolution</span>\\n        <span class=\"dplayer-info-panel-item-data\"></span>\\n    </div>\\n    <div class=\"dplayer-info-panel-item dplayer-info-panel-item-duration\">\\n        <span class=\"dplayer-info-panel-item-title\">Video Duration</span>\\n        <span class=\"dplayer-info-panel-item-data\"></span>\\n    </div>\\n    <div class=\"dplayer-info-panel-item dplayer-info-panel-item-buffer-remain\">\\n        <span class=\"dplayer-info-panel-item-title\">Buffer Remain</span>\\n        <span class=\"dplayer-info-panel-item-data\"></span>\\n    </div>\\n    <div class=\"dplayer-info-panel-item dplayer-info-panel-item-download-speed\">\\n        <span class=\"dplayer-info-panel-item-title\">Download Speed</span>\\n        <span class=\"dplayer-info-panel-item-data\"></span>\\n    </div>\\n</div>\\n<div class=\"dplayer-menu\">\\n    ',p(o.contextmenu,function(e,t){a+='\\n        <div class=\"dplayer-menu-item\">\\n            <a',e.link&&(a+=' target=\"_blank\"'),a+=' href=\"',a+=s(e.link||\"javascript:void(0);\"),a+='\">',a+=s(l(e.text)),a+=\"</a>\\n        </div>\\n    \"}),a+='\\n</div>\\n<div class=\"dplayer-notice\"></div>\\n<div class=\"dplayer-mobile-icon-wrap\">\\n    <button class=\"dplayer-mobile-icon dplayer-mobile-icon-backward\">\\n        ',a+=d.backward,a+='\\n    </button>\\n    <button class=\"dplayer-mobile-icon dplayer-mobile-icon-play\">\\n        ',a+=d.play,a+='\\n    </button>\\n    <button class=\"dplayer-mobile-icon dplayer-mobile-icon-forward\">\\n        ',a+=d.forward,a+=\"\\n    </button>\\n</div>\\n\"}},460:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 32 32\"><path d=\"M22 16l-10.105-10.6-1.895 1.987 8.211 8.613-8.211 8.612 1.895 1.988 8.211-8.613z\"></path></svg>'},484:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 32 32\"><path d=\"M13.725 30l3.9-5.325-3.9-1.125v6.45zM0 17.5l11.050 3.35 13.6-11.55-10.55 12.425 11.8 3.65 6.1-23.375-32 15.5z\"></path></svg>'},513:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 21 32\"><path d=\"M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528z\"></path></svg>'},540:e=>{\"use strict\";e.exports=function(e){var t=document.createElement(\"style\");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},631:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 32 32\"><path d=\"M16 23c-3.309 0-6-2.691-6-6s2.691-6 6-6 6 2.691 6 6-2.691 6-6 6zM16 13c-2.206 0-4 1.794-4 4s1.794 4 4 4c2.206 0 4-1.794 4-4s-1.794-4-4-4zM27 28h-22c-1.654 0-3-1.346-3-3v-16c0-1.654 1.346-3 3-3h3c0.552 0 1 0.448 1 1s-0.448 1-1 1h-3c-0.551 0-1 0.449-1 1v16c0 0.552 0.449 1 1 1h22c0.552 0 1-0.448 1-1v-16c0-0.551-0.448-1-1-1h-11c-0.552 0-1-0.448-1-1s0.448-1 1-1h11c1.654 0 3 1.346 3 3v16c0 1.654-1.346 3-3 3zM24 10.5c0 0.828 0.672 1.5 1.5 1.5s1.5-0.672 1.5-1.5c0-0.828-0.672-1.5-1.5-1.5s-1.5 0.672-1.5 1.5zM15 4c0 0.552-0.448 1-1 1h-4c-0.552 0-1-0.448-1-1v0c0-0.552 0.448-1 1-1h4c0.552 0 1 0.448 1 1v0z\"></path></svg>'},642:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 24 24\"><path d=\"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"></path></svg>'},657:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 32 33\"><path d=\"M26.3,15.1H14.5v8.6h11.8V15.1z M32.2,26.6V6.4c0-1.6-1.3-2.8-2.9-2.8H2.8c-1.6,0-2.9,1.3-2.9,2.8v20.1c0,1.6,1.3,2.9,2.9,2.9h26.4C30.8,29.4,32.2,28.1,32.2,26.6z M29.2,26.6H2.8V6.4h26.4V26.6z\"></path></svg>'},659:e=>{\"use strict\";var t={};e.exports=function(e,i){var n=function(e){if(void 0===t[e]){var i=document.querySelector(e);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(e){i=null}t[e]=i}return t[e]}(e);if(!n)throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");n.appendChild(i)}},717:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 32 33\"><path d=\"M6.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v4h4c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333zM30.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h4v-4c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM30.667 12c-0.8 0-1.333-0.533-1.333-1.333v-4h-4c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM1.333 12c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333h-4v4c0 0.8-0.533 1.333-1.333 1.333z\"></path></svg>'},825:e=>{\"use strict\";e.exports=function(e){if(\"undefined\"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(i){!function(e,t,i){var n=\"\";i.supports&&(n+=\"@supports (\".concat(i.supports,\") {\")),i.media&&(n+=\"@media \".concat(i.media,\" {\"));var a=void 0!==i.layer;a&&(n+=\"@layer\".concat(i.layer.length>0?\" \".concat(i.layer):\"\",\" {\")),n+=i.css,a&&(n+=\"}\"),i.media&&(n+=\"}\"),i.supports&&(n+=\"}\");var r=i.sourceMap;r&&\"undefined\"!=typeof btoa&&(n+=\"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r)))),\" */\")),t.styleTagTransform(n,e,t.options)}(t,e,i)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},833:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 512 512\"><path d=\"M500.5 231.4l-192-160C287.9 54.3 256 68.6 256 96v320c0 27.4 31.9 41.8 52.5 24.6l192-160c15.3-12.8 15.3-36.4 0-49.2zm-256 0l-192-160C31.9 54.3 0 68.6 0 96v320c0 27.4 31.9 41.8 52.5 24.6l192-160c15.3-12.8 15.3-36.4 0-49.2z\"></path></svg>'},845:(e,t,i)=>{\"use strict\";\n-/*! art-template@runtime | https://github.com/aui/art-template */var n=\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:void 0!==i.g?i.g:{},a=Object.create(n),r=/[\"&'<>]/;function o(e){return\"string\"!=typeof e&&(e=null==e?\"\":\"function\"==typeof e?o(e.call(e)):JSON.stringify(e)),e}a.$escape=function(e){return function(e){var t=\"\"+e,i=r.exec(t);if(!i)return e;var n=\"\",a=void 0,o=void 0,s=void 0;for(a=i.index,o=0;a<t.length;a++){switch(t.charCodeAt(a)){case 34:s=\"&#34;\";break;case 38:s=\"&#38;\";break;case 39:s=\"&#39;\";break;case 60:s=\"&#60;\";break;case 62:s=\"&#62;\";break;default:continue}o!==a&&(n+=t.substring(o,a)),o=a+1,n+=s}return o!==a?n+t.substring(o,a):n}(o(e))},a.$each=function(e,t){if(Array.isArray(e))for(var i=0,n=e.length;i<n;i++)t(e[i],i);else for(var a in e)t(e[a],a)},e.exports=a},880:(e,t,i)=>{\"use strict\";i.d(t,{A:()=>s});var n=i(34),a=i.n(n),r=i(122),o=i.n(r)()(a());o.push([e.id,':root{--balloon-border-radius:2px;--balloon-color:#101010f2;--balloon-text-color:#fff;--balloon-font-size:12px;--balloon-move:4px}button[aria-label][data-balloon-pos]{overflow:visible}[aria-label][data-balloon-pos]{cursor:pointer;position:relative}[aria-label][data-balloon-pos]:after{background:var(--balloon-color);border-radius:2px;border-radius:var(--balloon-border-radius);color:var(--balloon-text-color);content:attr(aria-label);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:var(--balloon-font-size);font-style:normal;font-weight:400;padding:.5em 1em;text-indent:0;text-shadow:none;white-space:nowrap}[aria-label][data-balloon-pos]:after,[aria-label][data-balloon-pos]:before{opacity:0;pointer-events:none;position:absolute;transition:all .18s ease-out .18s;z-index:10}[aria-label][data-balloon-pos]:before{border:5px solid #0000;border-top:5px solid var(--balloon-color);content:\"\";height:0;width:0}[aria-label][data-balloon-pos]:hover:after,[aria-label][data-balloon-pos]:hover:before,[aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:after,[aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:before,[aria-label][data-balloon-pos][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-visible]:before{opacity:1;pointer-events:none}[aria-label][data-balloon-pos].font-awesome:after{font-family:FontAwesome,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif}[aria-label][data-balloon-pos][data-balloon-break]:after{white-space:pre}[aria-label][data-balloon-pos][data-balloon-break][data-balloon-length]:after{white-space:pre-line;word-break:break-word}[aria-label][data-balloon-pos][data-balloon-blunt]:after,[aria-label][data-balloon-pos][data-balloon-blunt]:before{transition:none}[aria-label][data-balloon-pos][data-balloon-pos=down]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=down]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=down][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=down][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=up][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=up][data-balloon-visible]:before{transform:translate(-50%)}[aria-label][data-balloon-pos][data-balloon-pos*=-left]:after{left:0}[aria-label][data-balloon-pos][data-balloon-pos*=-left]:before{left:5px}[aria-label][data-balloon-pos][data-balloon-pos*=-right]:after{right:0}[aria-label][data-balloon-pos][data-balloon-pos*=-right]:before{right:5px}[aria-label][data-balloon-pos][data-balloon-po*=-left]:hover:after,[aria-label][data-balloon-pos][data-balloon-po*=-left]:hover:before,[aria-label][data-balloon-pos][data-balloon-po*=-left][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-po*=-left][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos*=-right]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos*=-right]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos*=-right][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos*=-right][data-balloon-visible]:before{transform:translate(0)}[aria-label][data-balloon-pos][data-balloon-pos^=up]:after,[aria-label][data-balloon-pos][data-balloon-pos^=up]:before{bottom:100%;transform:translateY(var(--balloon-move));transform-origin:top}[aria-label][data-balloon-pos][data-balloon-pos^=up]:after{margin-bottom:10px}[aria-label][data-balloon-pos][data-balloon-pos=up]:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:before{left:50%;transform:translate(-50%,var(--balloon-move))}[aria-label][data-balloon-pos][data-balloon-pos^=down]:after,[aria-label][data-balloon-pos][data-balloon-pos^=down]:before{top:100%;transform:translateY(calc(var(--balloon-move)*-1))}[aria-label][data-balloon-pos][data-balloon-pos^=down]:after{margin-top:10px}[aria-label][data-balloon-pos][data-balloon-pos^=down]:before{border:5px solid #0000;border-bottom:5px solid var(--balloon-color);height:0;width:0}[aria-label][data-balloon-pos][data-balloon-pos=down]:after,[aria-label][data-balloon-pos][data-balloon-pos=down]:before{left:50%;transform:translate(-50%,calc(var(--balloon-move)*-1))}[aria-label][data-balloon-pos][data-balloon-pos=left]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=left]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=left][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=left][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos=right]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=right]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=right][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=right][data-balloon-visible]:before{transform:translateY(-50%)}[aria-label][data-balloon-pos][data-balloon-pos=left]:after,[aria-label][data-balloon-pos][data-balloon-pos=left]:before{right:100%;top:50%;transform:translate(var(--balloon-move),-50%)}[aria-label][data-balloon-pos][data-balloon-pos=left]:after{margin-right:10px}[aria-label][data-balloon-pos][data-balloon-pos=left]:before{border:5px solid #0000;border-left:5px solid var(--balloon-color);height:0;width:0}[aria-label][data-balloon-pos][data-balloon-pos=right]:after,[aria-label][data-balloon-pos][data-balloon-pos=right]:before{left:100%;top:50%;transform:translate(calc(var(--balloon-move)*-1),-50%)}[aria-label][data-balloon-pos][data-balloon-pos=right]:after{margin-left:10px}[aria-label][data-balloon-pos][data-balloon-pos=right]:before{border:5px solid #0000;border-right:5px solid var(--balloon-color);height:0;width:0}[aria-label][data-balloon-pos][data-balloon-length]:after{white-space:normal}[aria-label][data-balloon-pos][data-balloon-length=small]:after{width:80px}[aria-label][data-balloon-pos][data-balloon-length=medium]:after{width:150px}[aria-label][data-balloon-pos][data-balloon-length=large]:after{width:260px}[aria-label][data-balloon-pos][data-balloon-length=xlarge]:after{width:380px}@media screen and (max-width:768px){[aria-label][data-balloon-pos][data-balloon-length=xlarge]:after{width:90vw}}[aria-label][data-balloon-pos][data-balloon-length=fit]:after{width:100%}',\"\",{version:3,sources:[\"webpack://./node_modules/balloon-css/balloon.css\"],names:[],mappings:\"AAAA,MACE,2BAA4B,CAC5B,yBAAuC,CACvC,yBAA0B,CAC1B,wBAAyB,CACzB,kBAAqB,CAEvB,qCACE,gBAAmB,CAErB,+BAEE,cAAe,CADf,iBACiB,CACjB,qCAUE,+BAAgC,CAChC,iBAAkB,CAElB,0CAA2C,CAD3C,+BAAgC,CAEhC,wBAAyB,CATzB,wHAAwI,CAIxI,kCAAmC,CAFnC,iBAAkB,CADlB,eAAmB,CASnB,gBAAiB,CAXjB,aAAc,CAId,gBAAiB,CASjB,kBACa,CACf,2EAlBE,SAAU,CACV,mBAAoB,CAcpB,iBAAkB,CAblB,iCAAoC,CAepC,UAWa,CAVf,sCAIE,sBAAsC,CAAtC,yCAAsC,CAItC,UAAW,CANX,QAAS,CADT,OASa,CACf,6VACE,SAAU,CACV,mBAAsB,CACxB,kDACE,oIAAuJ,CACzJ,yDACE,eAAkB,CACpB,8EACE,oBAAqB,CACrB,qBAAwB,CAC1B,mHACE,eAAkB,CAGpB,4kBACE,yBAA+B,CACjC,8DACE,MAAS,CACX,+DACE,QAAW,CACb,+DACE,OAAU,CACZ,gEACE,SAAY,CAGd,omBACE,sBAA4B,CAC9B,uHACE,WAAY,CAEZ,yCAA4C,CAD5C,oBAC8C,CAChD,2DACE,kBAAqB,CACvB,qHACE,QAAS,CACT,6CAAiD,CACnD,2HACE,QAAS,CACT,kDAAyD,CAC3D,6DACE,eAAkB,CACpB,8DAIE,sBAAyC,CAAzC,4CAAyC,CAFzC,QAAS,CADT,OAG2C,CAC7C,yHACE,QAAS,CACT,sDAA4D,CAG9D,wlBACE,0BAA+B,CACjC,yHACE,UAAW,CACX,OAAQ,CACR,6CAAiD,CACnD,4DACE,iBAAoB,CACtB,6DAIE,sBAAuC,CAAvC,0CAAuC,CAFvC,QAAS,CADT,OAGyC,CAC3C,2HACE,SAAU,CACV,OAAQ,CACR,sDAA4D,CAC9D,6DACE,gBAAmB,CACrB,8DAIE,sBAAwC,CAAxC,2CAAwC,CAFxC,QAAS,CADT,OAG0C,CAC5C,0DACE,kBAAqB,CACvB,gEACE,UAAa,CACf,iEACE,WAAc,CAChB,gEACE,WAAc,CAChB,iEACE,WAAc,CACd,oCACE,iEACE,UAAa,CAAE,CACrB,8DACE,UAAa\",sourcesContent:[':root {\\n  --balloon-border-radius: 2px;\\n  --balloon-color: rgba(16, 16, 16, 0.95);\\n  --balloon-text-color: #fff;\\n  --balloon-font-size: 12px;\\n  --balloon-move: 4px; }\\n\\nbutton[aria-label][data-balloon-pos] {\\n  overflow: visible; }\\n\\n[aria-label][data-balloon-pos] {\\n  position: relative;\\n  cursor: pointer; }\\n  [aria-label][data-balloon-pos]:after {\\n    opacity: 0;\\n    pointer-events: none;\\n    transition: all 0.18s ease-out 0.18s;\\n    text-indent: 0;\\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Open Sans\", \"Helvetica Neue\", sans-serif;\\n    font-weight: normal;\\n    font-style: normal;\\n    text-shadow: none;\\n    font-size: var(--balloon-font-size);\\n    background: var(--balloon-color);\\n    border-radius: 2px;\\n    color: var(--balloon-text-color);\\n    border-radius: var(--balloon-border-radius);\\n    content: attr(aria-label);\\n    padding: .5em 1em;\\n    position: absolute;\\n    white-space: nowrap;\\n    z-index: 10; }\\n  [aria-label][data-balloon-pos]:before {\\n    width: 0;\\n    height: 0;\\n    border: 5px solid transparent;\\n    border-top-color: var(--balloon-color);\\n    opacity: 0;\\n    pointer-events: none;\\n    transition: all 0.18s ease-out 0.18s;\\n    content: \"\";\\n    position: absolute;\\n    z-index: 10; }\\n  [aria-label][data-balloon-pos]:hover:before, [aria-label][data-balloon-pos]:hover:after, [aria-label][data-balloon-pos][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-visible]:after, [aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:before, [aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:after {\\n    opacity: 1;\\n    pointer-events: none; }\\n  [aria-label][data-balloon-pos].font-awesome:after {\\n    font-family: FontAwesome, -apple-system, BlinkMacSystemFont, \\'Segoe UI\\', Roboto, Oxygen, Ubuntu, Cantarell, \\'Open Sans\\', \\'Helvetica Neue\\', sans-serif; }\\n  [aria-label][data-balloon-pos][data-balloon-break]:after {\\n    white-space: pre; }\\n  [aria-label][data-balloon-pos][data-balloon-break][data-balloon-length]:after {\\n    white-space: pre-line;\\n    word-break: break-word; }\\n  [aria-label][data-balloon-pos][data-balloon-blunt]:before, [aria-label][data-balloon-pos][data-balloon-blunt]:after {\\n    transition: none; }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"up\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos=\"up\"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos=\"down\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos=\"down\"][data-balloon-visible]:after {\\n    transform: translate(-50%, 0); }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"up\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos=\"up\"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos=\"down\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos=\"down\"][data-balloon-visible]:before {\\n    transform: translate(-50%, 0); }\\n  [aria-label][data-balloon-pos][data-balloon-pos*=\"-left\"]:after {\\n    left: 0; }\\n  [aria-label][data-balloon-pos][data-balloon-pos*=\"-left\"]:before {\\n    left: 5px; }\\n  [aria-label][data-balloon-pos][data-balloon-pos*=\"-right\"]:after {\\n    right: 0; }\\n  [aria-label][data-balloon-pos][data-balloon-pos*=\"-right\"]:before {\\n    right: 5px; }\\n  [aria-label][data-balloon-pos][data-balloon-po*=\"-left\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-po*=\"-left\"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos*=\"-right\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos*=\"-right\"][data-balloon-visible]:after {\\n    transform: translate(0, 0); }\\n  [aria-label][data-balloon-pos][data-balloon-po*=\"-left\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-po*=\"-left\"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos*=\"-right\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos*=\"-right\"][data-balloon-visible]:before {\\n    transform: translate(0, 0); }\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\"up\"]:before, [aria-label][data-balloon-pos][data-balloon-pos^=\"up\"]:after {\\n    bottom: 100%;\\n    transform-origin: top;\\n    transform: translate(0, var(--balloon-move)); }\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\"up\"]:after {\\n    margin-bottom: 10px; }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"up\"]:before, [aria-label][data-balloon-pos][data-balloon-pos=\"up\"]:after {\\n    left: 50%;\\n    transform: translate(-50%, var(--balloon-move)); }\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\"down\"]:before, [aria-label][data-balloon-pos][data-balloon-pos^=\"down\"]:after {\\n    top: 100%;\\n    transform: translate(0, calc(var(--balloon-move) * -1)); }\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\"down\"]:after {\\n    margin-top: 10px; }\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\"down\"]:before {\\n    width: 0;\\n    height: 0;\\n    border: 5px solid transparent;\\n    border-bottom-color: var(--balloon-color); }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"down\"]:after, [aria-label][data-balloon-pos][data-balloon-pos=\"down\"]:before {\\n    left: 50%;\\n    transform: translate(-50%, calc(var(--balloon-move) * -1)); }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"left\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos=\"left\"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos=\"right\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos=\"right\"][data-balloon-visible]:after {\\n    transform: translate(0, -50%); }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"left\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos=\"left\"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos=\"right\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos=\"right\"][data-balloon-visible]:before {\\n    transform: translate(0, -50%); }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"left\"]:after, [aria-label][data-balloon-pos][data-balloon-pos=\"left\"]:before {\\n    right: 100%;\\n    top: 50%;\\n    transform: translate(var(--balloon-move), -50%); }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"left\"]:after {\\n    margin-right: 10px; }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"left\"]:before {\\n    width: 0;\\n    height: 0;\\n    border: 5px solid transparent;\\n    border-left-color: var(--balloon-color); }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"right\"]:after, [aria-label][data-balloon-pos][data-balloon-pos=\"right\"]:before {\\n    left: 100%;\\n    top: 50%;\\n    transform: translate(calc(var(--balloon-move) * -1), -50%); }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"right\"]:after {\\n    margin-left: 10px; }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"right\"]:before {\\n    width: 0;\\n    height: 0;\\n    border: 5px solid transparent;\\n    border-right-color: var(--balloon-color); }\\n  [aria-label][data-balloon-pos][data-balloon-length]:after {\\n    white-space: normal; }\\n  [aria-label][data-balloon-pos][data-balloon-length=\"small\"]:after {\\n    width: 80px; }\\n  [aria-label][data-balloon-pos][data-balloon-length=\"medium\"]:after {\\n    width: 150px; }\\n  [aria-label][data-balloon-pos][data-balloon-length=\"large\"]:after {\\n    width: 260px; }\\n  [aria-label][data-balloon-pos][data-balloon-length=\"xlarge\"]:after {\\n    width: 380px; }\\n    @media screen and (max-width: 768px) {\\n      [aria-label][data-balloon-pos][data-balloon-length=\"xlarge\"]:after {\\n        width: 90vw; } }\\n  [aria-label][data-balloon-pos][data-balloon-length=\"fit\"]:after {\\n    width: 100%; }\\n'],sourceRoot:\"\"}]);const s=o},894:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 32 28\"><path d=\"M28.633 17.104c0.035 0.21 0.026 0.463-0.026 0.76s-0.14 0.598-0.262 0.904c-0.122 0.306-0.271 0.581-0.445 0.825s-0.367 0.419-0.576 0.524c-0.209 0.105-0.393 0.157-0.55 0.157s-0.332-0.035-0.524-0.105c-0.175-0.052-0.393-0.1-0.655-0.144s-0.528-0.052-0.799-0.026c-0.271 0.026-0.541 0.083-0.812 0.17s-0.502 0.236-0.694 0.445c-0.419 0.437-0.664 0.934-0.734 1.493s0.009 1.092 0.236 1.598c0.175 0.349 0.148 0.699-0.079 1.048-0.105 0.14-0.271 0.284-0.498 0.432s-0.476 0.284-0.747 0.406-0.555 0.218-0.851 0.288c-0.297 0.070-0.559 0.105-0.786 0.105-0.157 0-0.306-0.061-0.445-0.183s-0.236-0.253-0.288-0.393h-0.026c-0.192-0.541-0.52-1.009-0.982-1.402s-1-0.589-1.611-0.589c-0.594 0-1.131 0.197-1.611 0.589s-0.816 0.851-1.009 1.375c-0.087 0.21-0.218 0.362-0.393 0.458s-0.367 0.144-0.576 0.144c-0.244 0-0.52-0.044-0.825-0.131s-0.611-0.197-0.917-0.327c-0.306-0.131-0.581-0.284-0.825-0.458s-0.428-0.349-0.55-0.524c-0.087-0.122-0.135-0.266-0.144-0.432s0.057-0.397 0.197-0.694c0.192-0.402 0.266-0.86 0.223-1.375s-0.266-0.991-0.668-1.428c-0.244-0.262-0.541-0.432-0.891-0.511s-0.681-0.109-0.995-0.092c-0.367 0.017-0.742 0.087-1.127 0.21-0.244 0.070-0.489 0.052-0.734-0.052-0.192-0.070-0.371-0.231-0.537-0.485s-0.314-0.533-0.445-0.838c-0.131-0.306-0.231-0.62-0.301-0.943s-0.087-0.59-0.052-0.799c0.052-0.384 0.227-0.629 0.524-0.734 0.524-0.21 0.995-0.555 1.415-1.035s0.629-1.017 0.629-1.611c0-0.611-0.21-1.144-0.629-1.598s-0.891-0.786-1.415-0.996c-0.157-0.052-0.288-0.179-0.393-0.38s-0.157-0.406-0.157-0.616c0-0.227 0.035-0.48 0.105-0.76s0.162-0.55 0.275-0.812 0.244-0.502 0.393-0.72c0.148-0.218 0.31-0.38 0.485-0.485 0.14-0.087 0.275-0.122 0.406-0.105s0.275 0.052 0.432 0.105c0.524 0.21 1.070 0.275 1.637 0.197s1.070-0.327 1.506-0.747c0.21-0.209 0.362-0.467 0.458-0.773s0.157-0.607 0.183-0.904c0.026-0.297 0.026-0.568 0-0.812s-0.048-0.419-0.065-0.524c-0.035-0.105-0.066-0.227-0.092-0.367s-0.013-0.262 0.039-0.367c0.105-0.244 0.293-0.458 0.563-0.642s0.563-0.336 0.878-0.458c0.314-0.122 0.62-0.214 0.917-0.275s0.533-0.092 0.707-0.092c0.227 0 0.406 0.074 0.537 0.223s0.223 0.301 0.275 0.458c0.192 0.471 0.507 0.886 0.943 1.244s0.952 0.537 1.546 0.537c0.611 0 1.153-0.17 1.624-0.511s0.803-0.773 0.996-1.297c0.070-0.14 0.179-0.284 0.327-0.432s0.301-0.223 0.458-0.223c0.244 0 0.511 0.035 0.799 0.105s0.572 0.166 0.851 0.288c0.279 0.122 0.537 0.279 0.773 0.472s0.423 0.402 0.563 0.629c0.087 0.14 0.113 0.293 0.079 0.458s-0.070 0.284-0.105 0.354c-0.227 0.506-0.297 1.039-0.21 1.598s0.341 1.048 0.76 1.467c0.419 0.419 0.934 0.651 1.546 0.694s1.179-0.057 1.703-0.301c0.14-0.087 0.31-0.122 0.511-0.105s0.371 0.096 0.511 0.236c0.262 0.244 0.493 0.616 0.694 1.113s0.336 1 0.406 1.506c0.035 0.297-0.013 0.528-0.144 0.694s-0.266 0.275-0.406 0.327c-0.542 0.192-1.004 0.528-1.388 1.009s-0.576 1.026-0.576 1.637c0 0.594 0.162 1.113 0.485 1.559s0.747 0.764 1.27 0.956c0.122 0.070 0.227 0.14 0.314 0.21 0.192 0.157 0.323 0.358 0.393 0.602v0zM16.451 19.462c0.786 0 1.528-0.149 2.227-0.445s1.305-0.707 1.821-1.231c0.515-0.524 0.921-1.131 1.218-1.821s0.445-1.428 0.445-2.214c0-0.786-0.148-1.524-0.445-2.214s-0.703-1.292-1.218-1.808c-0.515-0.515-1.122-0.921-1.821-1.218s-1.441-0.445-2.227-0.445c-0.786 0-1.524 0.148-2.214 0.445s-1.292 0.703-1.808 1.218c-0.515 0.515-0.921 1.118-1.218 1.808s-0.445 1.428-0.445 2.214c0 0.786 0.149 1.524 0.445 2.214s0.703 1.297 1.218 1.821c0.515 0.524 1.118 0.934 1.808 1.231s1.428 0.445 2.214 0.445v0z\"></path></svg>'},928:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 32 33\"><path d=\"M24.965 24.38h-18.132c-1.366 0-2.478-1.113-2.478-2.478v-11.806c0-1.364 1.111-2.478 2.478-2.478h18.132c1.366 0 2.478 1.113 2.478 2.478v11.806c0 1.364-1.11 2.478-2.478 2.478zM6.833 10.097v11.806h18.134l-0.002-11.806h-18.132zM2.478 28.928h5.952c0.684 0 1.238-0.554 1.238-1.239 0-0.684-0.554-1.238-1.238-1.238h-5.952v-5.802c0-0.684-0.554-1.239-1.238-1.239s-1.239 0.556-1.239 1.239v5.802c0 1.365 1.111 2.478 2.478 2.478zM30.761 19.412c-0.684 0-1.238 0.554-1.238 1.238v5.801h-5.951c-0.686 0-1.239 0.554-1.239 1.238 0 0.686 0.554 1.239 1.239 1.239h5.951c1.366 0 2.478-1.111 2.478-2.478v-5.801c0-0.683-0.554-1.238-1.239-1.238zM0 5.55v5.802c0 0.683 0.554 1.238 1.238 1.238s1.238-0.555 1.238-1.238v-5.802h5.952c0.684 0 1.238-0.554 1.238-1.238s-0.554-1.238-1.238-1.238h-5.951c-1.366-0.001-2.478 1.111-2.478 2.476zM32 11.35v-5.801c0-1.365-1.11-2.478-2.478-2.478h-5.951c-0.686 0-1.239 0.554-1.239 1.238s0.554 1.238 1.239 1.238h5.951v5.801c0 0.683 0.554 1.237 1.238 1.237 0.686 0.002 1.239-0.553 1.239-1.236z\"></path></svg>'}},t={};function i(n){var a=t[n];if(void 0!==a)return a.exports;var r=t[n]={id:n,exports:{}};return e[n].call(r.exports,r,r.exports,i),r.exports}i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.g=function(){if(\"object\"==typeof globalThis)return globalThis;try{return this||new Function(\"return this\")()}catch(e){if(\"object\"==typeof window)return window}}(),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},i.nc=void 0;var n={};return(()=>{\"use strict\";i.d(n,{default:()=>rn});var e={};i.r(e),i.d(e,{hasBrowserEnv:()=>Ie,hasStandardBrowserEnv:()=>Re,hasStandardBrowserWebWorkerEnv:()=>Oe,navigator:()=>Fe,origin:()=>De});var t=i(72),a=i.n(t),r=i(825),o=i.n(r),s=i(659),l=i.n(s),d=i(56),p=i.n(d),c=i(540),h=i.n(c),u=i(113),f=i.n(u),A=i(420),y={};y.styleTagTransform=f(),y.setAttributes=p(),y.insert=l().bind(null,\"head\"),y.domAPI=o(),y.insertStyleElement=h();a()(A.A,y);A.A&&A.A.locals&&A.A.locals;var m=i(149);const b=/iPhone|iPad|iPod|Windows|Macintosh|Android|Mobile/i.test(navigator.userAgent)&&\"ontouchend\"in document,g={secondToTime:e=>{if(0===(e=e||0)||e===1/0||\"NaN\"===e.toString())return\"00:00\";const t=Math.floor(e/3600),i=Math.floor((e-3600*t)/60),n=Math.floor(e-3600*t-60*i);return(t>0?[t,i,n]:[i,n]).map(e=>e<10?\"0\"+e:\"\"+e).join(\":\")},getVideoDuration:(e,t)=>{let i=e.duration;return i===1/0&&(e.seekable.length>0?(t.dtime.textContent=g.secondToTime(e.seekable.end(0)),i=e.seekable.end(0)):e.buffered.length>0&&(t.dtime.textContent=g.secondToTime(e.buffered.end(0)),i=e.buffered.end(0))),i},getRelativeX:(e,t)=>{const i=t.getBoundingClientRect();let n;return n=\"touches\"in e?e.touches.length>0?e.touches[0].clientX:e.changedTouches&&e.changedTouches.length>0?e.changedTouches[0].clientX:0:e.clientX,n-i.left},getScrollPosition:()=>({left:window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0,top:window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0}),setScrollPosition({left:e=0,top:t=0}){this.isFirefox?(document.documentElement.scrollLeft=e,document.documentElement.scrollTop=t):window.scrollTo(e,t)},isMobile:b,isFirefox:/firefox/i.test(window.navigator.userAgent),isWebKit:/AppleWebKit/.test(window.navigator.userAgent)&&!/Chrome/.test(window.navigator.userAgent)||/\\b(iPad|iPhone|iPod)\\b/.test(window.navigator.userAgent),storage:{set:(e,t)=>{localStorage.setItem(e,t)},get:e=>localStorage.getItem(e)},nameMap:{dragStart:b?\"touchstart\":\"mousedown\",dragMove:b?\"touchmove\":\"mousemove\",dragEnd:b?\"touchend\":\"mouseup\"},color2Number:e=>(\"#\"===e[0]&&(e=e.substr(1)),3===e.length&&(e=`${e[0]}${e[0]}${e[1]}${e[1]}${e[2]}${e[2]}`),parseInt(e,16)+0&16777215),number2Color:e=>\"#\"+(\"00000\"+e.toString(16)).slice(-6),number2Type:e=>{switch(e){case 0:default:return\"right\";case 1:return\"top\";case 2:return\"bottom\"}}},v=g;function C(e,t){return function(){return e.apply(t,arguments)}}const{toString:x}=Object.prototype,{getPrototypeOf:w}=Object,{iterator:k,toStringTag:_}=Symbol,S=(T=Object.create(null),e=>{const t=x.call(e);return T[t]||(T[t]=t.slice(8,-1).toLowerCase())});var T;const B=e=>(e=e.toLowerCase(),t=>S(t)===e),E=e=>t=>typeof t===e,{isArray:I}=Array,F=E(\"undefined\");function R(e){return null!==e&&!F(e)&&null!==e.constructor&&!F(e.constructor)&&M(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const O=B(\"ArrayBuffer\");const D=E(\"string\"),M=E(\"function\"),L=E(\"number\"),P=e=>null!==e&&\"object\"==typeof e,z=e=>{if(\"object\"!==S(e))return!1;const t=w(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||_ in e||k in e)},G=B(\"Date\"),q=B(\"File\"),j=B(\"Blob\"),U=B(\"FileList\"),H=B(\"URLSearchParams\"),[N,W,J,V]=[\"ReadableStream\",\"Request\",\"Response\",\"Headers\"].map(B);function K(e,t,{allOwnKeys:i=!1}={}){if(null==e)return;let n,a;if(\"object\"!=typeof e&&(e=[e]),I(e))for(n=0,a=e.length;n<a;n++)t.call(null,e[n],n,e);else{if(R(e))return;const a=i?Object.getOwnPropertyNames(e):Object.keys(e),r=a.length;let o;for(n=0;n<r;n++)o=a[n],t.call(null,e[o],o,e)}}function X(e,t){if(R(e))return null;t=t.toLowerCase();const i=Object.keys(e);let n,a=i.length;for(;a-- >0;)if(n=i[a],t===n.toLowerCase())return n;return null}const Y=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:global,$=e=>!F(e)&&e!==Y;const Q=(Z=\"undefined\"!=typeof Uint8Array&&w(Uint8Array),e=>Z&&e instanceof Z);var Z;const ee=B(\"HTMLFormElement\"),te=(({hasOwnProperty:e})=>(t,i)=>e.call(t,i))(Object.prototype),ie=B(\"RegExp\"),ne=(e,t)=>{const i=Object.getOwnPropertyDescriptors(e),n={};K(i,(i,a)=>{let r;!1!==(r=t(i,a,e))&&(n[a]=r||i)}),Object.defineProperties(e,n)};const ae=B(\"AsyncFunction\"),re=(oe=\"function\"==typeof setImmediate,se=M(Y.postMessage),oe?setImmediate:se?(le=`axios@${Math.random()}`,de=[],Y.addEventListener(\"message\",({source:e,data:t})=>{e===Y&&t===le&&de.length&&de.shift()()},!1),e=>{de.push(e),Y.postMessage(le,\"*\")}):e=>setTimeout(e));var oe,se,le,de;const pe=\"undefined\"!=typeof queueMicrotask?queueMicrotask.bind(Y):\"undefined\"!=typeof process&&process.nextTick||re,ce={isArray:I,isArrayBuffer:O,isBuffer:R,isFormData:e=>{let t;return e&&(\"function\"==typeof FormData&&e instanceof FormData||M(e.append)&&(\"formdata\"===(t=S(e))||\"object\"===t&&M(e.toString)&&\"[object FormData]\"===e.toString()))},isArrayBufferView:function(e){let t;return t=\"undefined\"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&O(e.buffer),t},isString:D,isNumber:L,isBoolean:e=>!0===e||!1===e,isObject:P,isPlainObject:z,isEmptyObject:e=>{if(!P(e)||R(e))return!1;try{return 0===Object.keys(e).length&&Object.getPrototypeOf(e)===Object.prototype}catch(e){return!1}},isReadableStream:N,isRequest:W,isResponse:J,isHeaders:V,isUndefined:F,isDate:G,isFile:q,isBlob:j,isRegExp:ie,isFunction:M,isStream:e=>P(e)&&M(e.pipe),isURLSearchParams:H,isTypedArray:Q,isFileList:U,forEach:K,merge:function e(){const{caseless:t,skipUndefined:i}=$(this)&&this||{},n={},a=(a,r)=>{const o=t&&X(n,r)||r;z(n[o])&&z(a)?n[o]=e(n[o],a):z(a)?n[o]=e({},a):I(a)?n[o]=a.slice():i&&F(a)||(n[o]=a)};for(let e=0,t=arguments.length;e<t;e++)arguments[e]&&K(arguments[e],a);return n},extend:(e,t,i,{allOwnKeys:n}={})=>(K(t,(t,n)=>{i&&M(t)?e[n]=C(t,i):e[n]=t},{allOwnKeys:n}),e),trim:e=>e.trim?e.trim():e.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\"\"),stripBOM:e=>(65279===e.charCodeAt(0)&&(e=e.slice(1)),e),inherits:(e,t,i,n)=>{e.prototype=Object.create(t.prototype,n),e.prototype.constructor=e,Object.defineProperty(e,\"super\",{value:t.prototype}),i&&Object.assign(e.prototype,i)},toFlatObject:(e,t,i,n)=>{let a,r,o;const s={};if(t=t||{},null==e)return t;do{for(a=Object.getOwnPropertyNames(e),r=a.length;r-- >0;)o=a[r],n&&!n(o,e,t)||s[o]||(t[o]=e[o],s[o]=!0);e=!1!==i&&w(e)}while(e&&(!i||i(e,t))&&e!==Object.prototype);return t},kindOf:S,kindOfTest:B,endsWith:(e,t,i)=>{e=String(e),(void 0===i||i>e.length)&&(i=e.length),i-=t.length;const n=e.indexOf(t,i);return-1!==n&&n===i},toArray:e=>{if(!e)return null;if(I(e))return e;let t=e.length;if(!L(t))return null;const i=new Array(t);for(;t-- >0;)i[t]=e[t];return i},forEachEntry:(e,t)=>{const i=(e&&e[k]).call(e);let n;for(;(n=i.next())&&!n.done;){const i=n.value;t.call(e,i[0],i[1])}},matchAll:(e,t)=>{let i;const n=[];for(;null!==(i=e.exec(t));)n.push(i);return n},isHTMLForm:ee,hasOwnProperty:te,hasOwnProp:te,reduceDescriptors:ne,freezeMethods:e=>{ne(e,(t,i)=>{if(M(e)&&-1!==[\"arguments\",\"caller\",\"callee\"].indexOf(i))return!1;const n=e[i];M(n)&&(t.enumerable=!1,\"writable\"in t?t.writable=!1:t.set||(t.set=()=>{throw Error(\"Can not rewrite read-only method '\"+i+\"'\")}))})},toObjectSet:(e,t)=>{const i={},n=e=>{e.forEach(e=>{i[e]=!0})};return I(e)?n(e):n(String(e).split(t)),i},toCamelCase:e=>e.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,function(e,t,i){return t.toUpperCase()+i}),noop:()=>{},toFiniteNumber:(e,t)=>null!=e&&Number.isFinite(e=+e)?e:t,findKey:X,global:Y,isContextDefined:$,isSpecCompliantForm:function(e){return!!(e&&M(e.append)&&\"FormData\"===e[_]&&e[k])},toJSONObject:e=>{const t=new Array(10),i=(e,n)=>{if(P(e)){if(t.indexOf(e)>=0)return;if(R(e))return e;if(!(\"toJSON\"in e)){t[n]=e;const a=I(e)?[]:{};return K(e,(e,t)=>{const r=i(e,n+1);!F(r)&&(a[t]=r)}),t[n]=void 0,a}}return e};return i(e,0)},isAsyncFn:ae,isThenable:e=>e&&(P(e)||M(e))&&M(e.then)&&M(e.catch),setImmediate:re,asap:pe,isIterable:e=>null!=e&&M(e[k])};function he(e,t,i,n,a){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name=\"AxiosError\",t&&(this.code=t),i&&(this.config=i),n&&(this.request=n),a&&(this.response=a,this.status=a.status?a.status:null)}ce.inherits(he,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:ce.toJSONObject(this.config),code:this.code,status:this.status}}});const ue=he.prototype,fe={};[\"ERR_BAD_OPTION_VALUE\",\"ERR_BAD_OPTION\",\"ECONNABORTED\",\"ETIMEDOUT\",\"ERR_NETWORK\",\"ERR_FR_TOO_MANY_REDIRECTS\",\"ERR_DEPRECATED\",\"ERR_BAD_RESPONSE\",\"ERR_BAD_REQUEST\",\"ERR_CANCELED\",\"ERR_NOT_SUPPORT\",\"ERR_INVALID_URL\"].forEach(e=>{fe[e]={value:e}}),Object.defineProperties(he,fe),Object.defineProperty(ue,\"isAxiosError\",{value:!0}),he.from=(e,t,i,n,a,r)=>{const o=Object.create(ue);ce.toFlatObject(e,o,function(e){return e!==Error.prototype},e=>\"isAxiosError\"!==e);const s=e&&e.message?e.message:\"Error\",l=null==t&&e?e.code:t;return he.call(o,s,l,i,n,a),e&&null==o.cause&&Object.defineProperty(o,\"cause\",{value:e,configurable:!0}),o.name=e&&e.name||\"Error\",r&&Object.assign(o,r),o};const Ae=he;function ye(e){return ce.isPlainObject(e)||ce.isArray(e)}function me(e){return ce.endsWith(e,\"[]\")?e.slice(0,-2):e}function be(e,t,i){return e?e.concat(t).map(function(e,t){return e=me(e),!i&&t?\"[\"+e+\"]\":e}).join(i?\".\":\"\"):t}const ge=ce.toFlatObject(ce,{},null,function(e){return/^is[A-Z]/.test(e)});const ve=function(e,t,i){if(!ce.isObject(e))throw new TypeError(\"target must be an object\");t=t||new FormData;const n=(i=ce.toFlatObject(i,{metaTokens:!0,dots:!1,indexes:!1},!1,function(e,t){return!ce.isUndefined(t[e])})).metaTokens,a=i.visitor||d,r=i.dots,o=i.indexes,s=(i.Blob||\"undefined\"!=typeof Blob&&Blob)&&ce.isSpecCompliantForm(t);if(!ce.isFunction(a))throw new TypeError(\"visitor must be a function\");function l(e){if(null===e)return\"\";if(ce.isDate(e))return e.toISOString();if(ce.isBoolean(e))return e.toString();if(!s&&ce.isBlob(e))throw new Ae(\"Blob is not supported. Use a Buffer instead.\");return ce.isArrayBuffer(e)||ce.isTypedArray(e)?s&&\"function\"==typeof Blob?new Blob([e]):Buffer.from(e):e}function d(e,i,a){let s=e;if(e&&!a&&\"object\"==typeof e)if(ce.endsWith(i,\"{}\"))i=n?i:i.slice(0,-2),e=JSON.stringify(e);else if(ce.isArray(e)&&function(e){return ce.isArray(e)&&!e.some(ye)}(e)||(ce.isFileList(e)||ce.endsWith(i,\"[]\"))&&(s=ce.toArray(e)))return i=me(i),s.forEach(function(e,n){!ce.isUndefined(e)&&null!==e&&t.append(!0===o?be([i],n,r):null===o?i:i+\"[]\",l(e))}),!1;return!!ye(e)||(t.append(be(a,i,r),l(e)),!1)}const p=[],c=Object.assign(ge,{defaultVisitor:d,convertValue:l,isVisitable:ye});if(!ce.isObject(e))throw new TypeError(\"data must be an object\");return function e(i,n){if(!ce.isUndefined(i)){if(-1!==p.indexOf(i))throw Error(\"Circular reference detected in \"+n.join(\".\"));p.push(i),ce.forEach(i,function(i,r){!0===(!(ce.isUndefined(i)||null===i)&&a.call(t,i,ce.isString(r)?r.trim():r,n,c))&&e(i,n?n.concat(r):[r])}),p.pop()}}(e),t};function Ce(e){const t={\"!\":\"%21\",\"'\":\"%27\",\"(\":\"%28\",\")\":\"%29\",\"~\":\"%7E\",\"%20\":\"+\",\"%00\":\"\\0\"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(e){return t[e]})}function xe(e,t){this._pairs=[],e&&ve(e,this,t)}const we=xe.prototype;we.append=function(e,t){this._pairs.push([e,t])},we.toString=function(e){const t=e?function(t){return e.call(this,t,Ce)}:Ce;return this._pairs.map(function(e){return t(e[0])+\"=\"+t(e[1])},\"\").join(\"&\")};const ke=xe;function _e(e){return encodeURIComponent(e).replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%20/g,\"+\")}function Se(e,t,i){if(!t)return e;const n=i&&i.encode||_e;ce.isFunction(i)&&(i={serialize:i});const a=i&&i.serialize;let r;if(r=a?a(t,i):ce.isURLSearchParams(t)?t.toString():new ke(t,i).toString(n),r){const t=e.indexOf(\"#\");-1!==t&&(e=e.slice(0,t)),e+=(-1===e.indexOf(\"?\")?\"?\":\"&\")+r}return e}const Te=class{constructor(){this.handlers=[]}use(e,t,i){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!i&&i.synchronous,runWhen:i?i.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){ce.forEach(this.handlers,function(t){null!==t&&e(t)})}},Be={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},Ee={isBrowser:!0,classes:{URLSearchParams:\"undefined\"!=typeof URLSearchParams?URLSearchParams:ke,FormData:\"undefined\"!=typeof FormData?FormData:null,Blob:\"undefined\"!=typeof Blob?Blob:null},protocols:[\"http\",\"https\",\"file\",\"blob\",\"url\",\"data\"]},Ie=\"undefined\"!=typeof window&&\"undefined\"!=typeof document,Fe=\"object\"==typeof navigator&&navigator||void 0,Re=Ie&&(!Fe||[\"ReactNative\",\"NativeScript\",\"NS\"].indexOf(Fe.product)<0),Oe=\"undefined\"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&\"function\"==typeof self.importScripts,De=Ie&&window.location.href||\"http://localhost\",Me={...e,...Ee};const Le=function(e){function t(e,i,n,a){let r=e[a++];if(\"__proto__\"===r)return!0;const o=Number.isFinite(+r),s=a>=e.length;if(r=!r&&ce.isArray(n)?n.length:r,s)return ce.hasOwnProp(n,r)?n[r]=[n[r],i]:n[r]=i,!o;n[r]&&ce.isObject(n[r])||(n[r]=[]);return t(e,i,n[r],a)&&ce.isArray(n[r])&&(n[r]=function(e){const t={},i=Object.keys(e);let n;const a=i.length;let r;for(n=0;n<a;n++)r=i[n],t[r]=e[r];return t}(n[r])),!o}if(ce.isFormData(e)&&ce.isFunction(e.entries)){const i={};return ce.forEachEntry(e,(e,n)=>{t(function(e){return ce.matchAll(/\\w+|\\[(\\w*)]/g,e).map(e=>\"[]\"===e[0]?\"\":e[1]||e[0])}(e),n,i,0)}),i}return null};const Pe={transitional:Be,adapter:[\"xhr\",\"http\",\"fetch\"],transformRequest:[function(e,t){const i=t.getContentType()||\"\",n=i.indexOf(\"application/json\")>-1,a=ce.isObject(e);a&&ce.isHTMLForm(e)&&(e=new FormData(e));if(ce.isFormData(e))return n?JSON.stringify(Le(e)):e;if(ce.isArrayBuffer(e)||ce.isBuffer(e)||ce.isStream(e)||ce.isFile(e)||ce.isBlob(e)||ce.isReadableStream(e))return e;if(ce.isArrayBufferView(e))return e.buffer;if(ce.isURLSearchParams(e))return t.setContentType(\"application/x-www-form-urlencoded;charset=utf-8\",!1),e.toString();let r;if(a){if(i.indexOf(\"application/x-www-form-urlencoded\")>-1)return function(e,t){return ve(e,new Me.classes.URLSearchParams,{visitor:function(e,t,i,n){return Me.isNode&&ce.isBuffer(e)?(this.append(t,e.toString(\"base64\")),!1):n.defaultVisitor.apply(this,arguments)},...t})}(e,this.formSerializer).toString();if((r=ce.isFileList(e))||i.indexOf(\"multipart/form-data\")>-1){const t=this.env&&this.env.FormData;return ve(r?{\"files[]\":e}:e,t&&new t,this.formSerializer)}}return a||n?(t.setContentType(\"application/json\",!1),function(e,t,i){if(ce.isString(e))try{return(t||JSON.parse)(e),ce.trim(e)}catch(e){if(\"SyntaxError\"!==e.name)throw e}return(i||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){const t=this.transitional||Pe.transitional,i=t&&t.forcedJSONParsing,n=\"json\"===this.responseType;if(ce.isResponse(e)||ce.isReadableStream(e))return e;if(e&&ce.isString(e)&&(i&&!this.responseType||n)){const i=!(t&&t.silentJSONParsing)&&n;try{return JSON.parse(e,this.parseReviver)}catch(e){if(i){if(\"SyntaxError\"===e.name)throw Ae.from(e,Ae.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Me.classes.FormData,Blob:Me.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:\"application/json, text/plain, */*\",\"Content-Type\":void 0}}};ce.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\"],e=>{Pe.headers[e]={}});const ze=Pe,Ge=ce.toObjectSet([\"age\",\"authorization\",\"content-length\",\"content-type\",\"etag\",\"expires\",\"from\",\"host\",\"if-modified-since\",\"if-unmodified-since\",\"last-modified\",\"location\",\"max-forwards\",\"proxy-authorization\",\"referer\",\"retry-after\",\"user-agent\"]),qe=Symbol(\"internals\");function je(e){return e&&String(e).trim().toLowerCase()}function Ue(e){return!1===e||null==e?e:ce.isArray(e)?e.map(Ue):String(e)}function He(e,t,i,n,a){return ce.isFunction(n)?n.call(this,t,i):(a&&(t=i),ce.isString(t)?ce.isString(n)?-1!==t.indexOf(n):ce.isRegExp(n)?n.test(t):void 0:void 0)}class Ne{constructor(e){e&&this.set(e)}set(e,t,i){const n=this;function a(e,t,i){const a=je(t);if(!a)throw new Error(\"header name must be a non-empty string\");const r=ce.findKey(n,a);(!r||void 0===n[r]||!0===i||void 0===i&&!1!==n[r])&&(n[r||t]=Ue(e))}const r=(e,t)=>ce.forEach(e,(e,i)=>a(e,i,t));if(ce.isPlainObject(e)||e instanceof this.constructor)r(e,t);else if(ce.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))r((e=>{const t={};let i,n,a;return e&&e.split(\"\\n\").forEach(function(e){a=e.indexOf(\":\"),i=e.substring(0,a).trim().toLowerCase(),n=e.substring(a+1).trim(),!i||t[i]&&Ge[i]||(\"set-cookie\"===i?t[i]?t[i].push(n):t[i]=[n]:t[i]=t[i]?t[i]+\", \"+n:n)}),t})(e),t);else if(ce.isObject(e)&&ce.isIterable(e)){let i,n,a={};for(const t of e){if(!ce.isArray(t))throw TypeError(\"Object iterator must return a key-value pair\");a[n=t[0]]=(i=a[n])?ce.isArray(i)?[...i,t[1]]:[i,t[1]]:t[1]}r(a,t)}else null!=e&&a(t,e,i);return this}get(e,t){if(e=je(e)){const i=ce.findKey(this,e);if(i){const e=this[i];if(!t)return e;if(!0===t)return function(e){const t=Object.create(null),i=/([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;let n;for(;n=i.exec(e);)t[n[1]]=n[2];return t}(e);if(ce.isFunction(t))return t.call(this,e,i);if(ce.isRegExp(t))return t.exec(e);throw new TypeError(\"parser must be boolean|regexp|function\")}}}has(e,t){if(e=je(e)){const i=ce.findKey(this,e);return!(!i||void 0===this[i]||t&&!He(0,this[i],i,t))}return!1}delete(e,t){const i=this;let n=!1;function a(e){if(e=je(e)){const a=ce.findKey(i,e);!a||t&&!He(0,i[a],a,t)||(delete i[a],n=!0)}}return ce.isArray(e)?e.forEach(a):a(e),n}clear(e){const t=Object.keys(this);let i=t.length,n=!1;for(;i--;){const a=t[i];e&&!He(0,this[a],a,e,!0)||(delete this[a],n=!0)}return n}normalize(e){const t=this,i={};return ce.forEach(this,(n,a)=>{const r=ce.findKey(i,a);if(r)return t[r]=Ue(n),void delete t[a];const o=e?function(e){return e.trim().toLowerCase().replace(/([a-z\\d])(\\w*)/g,(e,t,i)=>t.toUpperCase()+i)}(a):String(a).trim();o!==a&&delete t[a],t[o]=Ue(n),i[o]=!0}),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){const t=Object.create(null);return ce.forEach(this,(i,n)=>{null!=i&&!1!==i&&(t[n]=e&&ce.isArray(i)?i.join(\", \"):i)}),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([e,t])=>e+\": \"+t).join(\"\\n\")}getSetCookie(){return this.get(\"set-cookie\")||[]}get[Symbol.toStringTag](){return\"AxiosHeaders\"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...t){const i=new this(e);return t.forEach(e=>i.set(e)),i}static accessor(e){const t=(this[qe]=this[qe]={accessors:{}}).accessors,i=this.prototype;function n(e){const n=je(e);t[n]||(!function(e,t){const i=ce.toCamelCase(\" \"+t);[\"get\",\"set\",\"has\"].forEach(n=>{Object.defineProperty(e,n+i,{value:function(e,i,a){return this[n].call(this,t,e,i,a)},configurable:!0})})}(i,e),t[n]=!0)}return ce.isArray(e)?e.forEach(n):n(e),this}}Ne.accessor([\"Content-Type\",\"Content-Length\",\"Accept\",\"Accept-Encoding\",\"User-Agent\",\"Authorization\"]),ce.reduceDescriptors(Ne.prototype,({value:e},t)=>{let i=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(e){this[i]=e}}}),ce.freezeMethods(Ne);const We=Ne;function Je(e,t){const i=this||ze,n=t||i,a=We.from(n.headers);let r=n.data;return ce.forEach(e,function(e){r=e.call(i,r,a.normalize(),t?t.status:void 0)}),a.normalize(),r}function Ve(e){return!(!e||!e.__CANCEL__)}function Ke(e,t,i){Ae.call(this,null==e?\"canceled\":e,Ae.ERR_CANCELED,t,i),this.name=\"CanceledError\"}ce.inherits(Ke,Ae,{__CANCEL__:!0});const Xe=Ke;function Ye(e,t,i){const n=i.config.validateStatus;i.status&&n&&!n(i.status)?t(new Ae(\"Request failed with status code \"+i.status,[Ae.ERR_BAD_REQUEST,Ae.ERR_BAD_RESPONSE][Math.floor(i.status/100)-4],i.config,i.request,i)):e(i)}const $e=function(e,t){e=e||10;const i=new Array(e),n=new Array(e);let a,r=0,o=0;return t=void 0!==t?t:1e3,function(s){const l=Date.now(),d=n[o];a||(a=l),i[r]=s,n[r]=l;let p=o,c=0;for(;p!==r;)c+=i[p++],p%=e;if(r=(r+1)%e,r===o&&(o=(o+1)%e),l-a<t)return;const h=d&&l-d;return h?Math.round(1e3*c/h):void 0}};const Qe=function(e,t){let i,n,a=0,r=1e3/t;const o=(t,r=Date.now())=>{a=r,i=null,n&&(clearTimeout(n),n=null),e(...t)};return[(...e)=>{const t=Date.now(),s=t-a;s>=r?o(e,t):(i=e,n||(n=setTimeout(()=>{n=null,o(i)},r-s)))},()=>i&&o(i)]},Ze=(e,t,i=3)=>{let n=0;const a=$e(50,250);return Qe(i=>{const r=i.loaded,o=i.lengthComputable?i.total:void 0,s=r-n,l=a(s);n=r;e({loaded:r,total:o,progress:o?r/o:void 0,bytes:s,rate:l||void 0,estimated:l&&o&&r<=o?(o-r)/l:void 0,event:i,lengthComputable:null!=o,[t?\"download\":\"upload\"]:!0})},i)},et=(e,t)=>{const i=null!=e;return[n=>t[0]({lengthComputable:i,total:e,loaded:n}),t[1]]},tt=e=>(...t)=>ce.asap(()=>e(...t)),it=Me.hasStandardBrowserEnv?((e,t)=>i=>(i=new URL(i,Me.origin),e.protocol===i.protocol&&e.host===i.host&&(t||e.port===i.port)))(new URL(Me.origin),Me.navigator&&/(msie|trident)/i.test(Me.navigator.userAgent)):()=>!0,nt=Me.hasStandardBrowserEnv?{write(e,t,i,n,a,r){const o=[e+\"=\"+encodeURIComponent(t)];ce.isNumber(i)&&o.push(\"expires=\"+new Date(i).toGMTString()),ce.isString(n)&&o.push(\"path=\"+n),ce.isString(a)&&o.push(\"domain=\"+a),!0===r&&o.push(\"secure\"),document.cookie=o.join(\"; \")},read(e){const t=document.cookie.match(new RegExp(\"(^|;\\\\s*)(\"+e+\")=([^;]*)\"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,\"\",Date.now()-864e5)}}:{write(){},read:()=>null,remove(){}};function at(e,t,i){let n=!/^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(t);return e&&(n||0==i)?function(e,t){return t?e.replace(/\\/?\\/$/,\"\")+\"/\"+t.replace(/^\\/+/,\"\"):e}(e,t):t}const rt=e=>e instanceof We?{...e}:e;function ot(e,t){t=t||{};const i={};function n(e,t,i,n){return ce.isPlainObject(e)&&ce.isPlainObject(t)?ce.merge.call({caseless:n},e,t):ce.isPlainObject(t)?ce.merge({},t):ce.isArray(t)?t.slice():t}function a(e,t,i,a){return ce.isUndefined(t)?ce.isUndefined(e)?void 0:n(void 0,e,0,a):n(e,t,0,a)}function r(e,t){if(!ce.isUndefined(t))return n(void 0,t)}function o(e,t){return ce.isUndefined(t)?ce.isUndefined(e)?void 0:n(void 0,e):n(void 0,t)}function s(i,a,r){return r in t?n(i,a):r in e?n(void 0,i):void 0}const l={url:r,method:r,data:r,baseURL:o,transformRequest:o,transformResponse:o,paramsSerializer:o,timeout:o,timeoutMessage:o,withCredentials:o,withXSRFToken:o,adapter:o,responseType:o,xsrfCookieName:o,xsrfHeaderName:o,onUploadProgress:o,onDownloadProgress:o,decompress:o,maxContentLength:o,maxBodyLength:o,beforeRedirect:o,transport:o,httpAgent:o,httpsAgent:o,cancelToken:o,socketPath:o,responseEncoding:o,validateStatus:s,headers:(e,t,i)=>a(rt(e),rt(t),0,!0)};return ce.forEach(Object.keys({...e,...t}),function(n){const r=l[n]||a,o=r(e[n],t[n],n);ce.isUndefined(o)&&r!==s||(i[n]=o)}),i}const st=e=>{const t=ot({},e);let{data:i,withXSRFToken:n,xsrfHeaderName:a,xsrfCookieName:r,headers:o,auth:s}=t;if(t.headers=o=We.from(o),t.url=Se(at(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),s&&o.set(\"Authorization\",\"Basic \"+btoa((s.username||\"\")+\":\"+(s.password?unescape(encodeURIComponent(s.password)):\"\"))),ce.isFormData(i))if(Me.hasStandardBrowserEnv||Me.hasStandardBrowserWebWorkerEnv)o.setContentType(void 0);else if(ce.isFunction(i.getHeaders)){const e=i.getHeaders(),t=[\"content-type\",\"content-length\"];Object.entries(e).forEach(([e,i])=>{t.includes(e.toLowerCase())&&o.set(e,i)})}if(Me.hasStandardBrowserEnv&&(n&&ce.isFunction(n)&&(n=n(t)),n||!1!==n&&it(t.url))){const e=a&&r&&nt.read(r);e&&o.set(a,e)}return t},lt=\"undefined\"!=typeof XMLHttpRequest&&function(e){return new Promise(function(t,i){const n=st(e);let a=n.data;const r=We.from(n.headers).normalize();let o,s,l,d,p,{responseType:c,onUploadProgress:h,onDownloadProgress:u}=n;function f(){d&&d(),p&&p(),n.cancelToken&&n.cancelToken.unsubscribe(o),n.signal&&n.signal.removeEventListener(\"abort\",o)}let A=new XMLHttpRequest;function y(){if(!A)return;const n=We.from(\"getAllResponseHeaders\"in A&&A.getAllResponseHeaders());Ye(function(e){t(e),f()},function(e){i(e),f()},{data:c&&\"text\"!==c&&\"json\"!==c?A.response:A.responseText,status:A.status,statusText:A.statusText,headers:n,config:e,request:A}),A=null}A.open(n.method.toUpperCase(),n.url,!0),A.timeout=n.timeout,\"onloadend\"in A?A.onloadend=y:A.onreadystatechange=function(){A&&4===A.readyState&&(0!==A.status||A.responseURL&&0===A.responseURL.indexOf(\"file:\"))&&setTimeout(y)},A.onabort=function(){A&&(i(new Ae(\"Request aborted\",Ae.ECONNABORTED,e,A)),A=null)},A.onerror=function(t){const n=t&&t.message?t.message:\"Network Error\",a=new Ae(n,Ae.ERR_NETWORK,e,A);a.event=t||null,i(a),A=null},A.ontimeout=function(){let t=n.timeout?\"timeout of \"+n.timeout+\"ms exceeded\":\"timeout exceeded\";const a=n.transitional||Be;n.timeoutErrorMessage&&(t=n.timeoutErrorMessage),i(new Ae(t,a.clarifyTimeoutError?Ae.ETIMEDOUT:Ae.ECONNABORTED,e,A)),A=null},void 0===a&&r.setContentType(null),\"setRequestHeader\"in A&&ce.forEach(r.toJSON(),function(e,t){A.setRequestHeader(t,e)}),ce.isUndefined(n.withCredentials)||(A.withCredentials=!!n.withCredentials),c&&\"json\"!==c&&(A.responseType=n.responseType),u&&([l,p]=Ze(u,!0),A.addEventListener(\"progress\",l)),h&&A.upload&&([s,d]=Ze(h),A.upload.addEventListener(\"progress\",s),A.upload.addEventListener(\"loadend\",d)),(n.cancelToken||n.signal)&&(o=t=>{A&&(i(!t||t.type?new Xe(null,e,A):t),A.abort(),A=null)},n.cancelToken&&n.cancelToken.subscribe(o),n.signal&&(n.signal.aborted?o():n.signal.addEventListener(\"abort\",o)));const m=function(e){const t=/^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(e);return t&&t[1]||\"\"}(n.url);m&&-1===Me.protocols.indexOf(m)?i(new Ae(\"Unsupported protocol \"+m+\":\",Ae.ERR_BAD_REQUEST,e)):A.send(a||null)})},dt=(e,t)=>{const{length:i}=e=e?e.filter(Boolean):[];if(t||i){let i,n=new AbortController;const a=function(e){if(!i){i=!0,o();const t=e instanceof Error?e:this.reason;n.abort(t instanceof Ae?t:new Xe(t instanceof Error?t.message:t))}};let r=t&&setTimeout(()=>{r=null,a(new Ae(`timeout ${t} of ms exceeded`,Ae.ETIMEDOUT))},t);const o=()=>{e&&(r&&clearTimeout(r),r=null,e.forEach(e=>{e.unsubscribe?e.unsubscribe(a):e.removeEventListener(\"abort\",a)}),e=null)};e.forEach(e=>e.addEventListener(\"abort\",a));const{signal:s}=n;return s.unsubscribe=()=>ce.asap(o),s}},pt=function*(e,t){let i=e.byteLength;if(!t||i<t)return void(yield e);let n,a=0;for(;a<i;)n=a+t,yield e.slice(a,n),a=n},ct=async function*(e){if(e[Symbol.asyncIterator])return void(yield*e);const t=e.getReader();try{for(;;){const{done:e,value:i}=await t.read();if(e)break;yield i}}finally{await t.cancel()}},ht=(e,t,i,n)=>{const a=async function*(e,t){for await(const i of ct(e))yield*pt(i,t)}(e,t);let r,o=0,s=e=>{r||(r=!0,n&&n(e))};return new ReadableStream({async pull(e){try{const{done:t,value:n}=await a.next();if(t)return s(),void e.close();let r=n.byteLength;if(i){let e=o+=r;i(e)}e.enqueue(new Uint8Array(n))}catch(e){throw s(e),e}},cancel:e=>(s(e),a.return())},{highWaterMark:2})},{isFunction:ut}=ce,ft=(({Request:e,Response:t})=>({Request:e,Response:t}))(ce.global),{ReadableStream:At,TextEncoder:yt}=ce.global,mt=(e,...t)=>{try{return!!e(...t)}catch(e){return!1}},bt=e=>{e=ce.merge.call({skipUndefined:!0},ft,e);const{fetch:t,Request:i,Response:n}=e,a=t?ut(t):\"function\"==typeof fetch,r=ut(i),o=ut(n);if(!a)return!1;const s=a&&ut(At),l=a&&(\"function\"==typeof yt?(d=new yt,e=>d.encode(e)):async e=>new Uint8Array(await new i(e).arrayBuffer()));var d;const p=r&&s&&mt(()=>{let e=!1;const t=new i(Me.origin,{body:new At,method:\"POST\",get duplex(){return e=!0,\"half\"}}).headers.has(\"Content-Type\");return e&&!t}),c=o&&s&&mt(()=>ce.isReadableStream(new n(\"\").body)),h={stream:c&&(e=>e.body)};a&&[\"text\",\"arrayBuffer\",\"blob\",\"formData\",\"stream\"].forEach(e=>{!h[e]&&(h[e]=(t,i)=>{let n=t&&t[e];if(n)return n.call(t);throw new Ae(`Response type '${e}' is not supported`,Ae.ERR_NOT_SUPPORT,i)})});const u=async(e,t)=>{const n=ce.toFiniteNumber(e.getContentLength());return null==n?(async e=>{if(null==e)return 0;if(ce.isBlob(e))return e.size;if(ce.isSpecCompliantForm(e)){const t=new i(Me.origin,{method:\"POST\",body:e});return(await t.arrayBuffer()).byteLength}return ce.isArrayBufferView(e)||ce.isArrayBuffer(e)?e.byteLength:(ce.isURLSearchParams(e)&&(e+=\"\"),ce.isString(e)?(await l(e)).byteLength:void 0)})(t):n};return async e=>{let{url:a,method:o,data:s,signal:l,cancelToken:d,timeout:f,onDownloadProgress:A,onUploadProgress:y,responseType:m,headers:b,withCredentials:g=\"same-origin\",fetchOptions:v}=st(e),C=t||fetch;m=m?(m+\"\").toLowerCase():\"text\";let x=dt([l,d&&d.toAbortSignal()],f),w=null;const k=x&&x.unsubscribe&&(()=>{x.unsubscribe()});let _;try{if(y&&p&&\"get\"!==o&&\"head\"!==o&&0!==(_=await u(b,s))){let e,t=new i(a,{method:\"POST\",body:s,duplex:\"half\"});if(ce.isFormData(s)&&(e=t.headers.get(\"content-type\"))&&b.setContentType(e),t.body){const[e,i]=et(_,Ze(tt(y)));s=ht(t.body,65536,e,i)}}ce.isString(g)||(g=g?\"include\":\"omit\");const t=r&&\"credentials\"in i.prototype,l={...v,signal:x,method:o.toUpperCase(),headers:b.normalize().toJSON(),body:s,duplex:\"half\",credentials:t?g:void 0};w=r&&new i(a,l);let d=await(r?C(w,v):C(a,l));const f=c&&(\"stream\"===m||\"response\"===m);if(c&&(A||f&&k)){const e={};[\"status\",\"statusText\",\"headers\"].forEach(t=>{e[t]=d[t]});const t=ce.toFiniteNumber(d.headers.get(\"content-length\")),[i,a]=A&&et(t,Ze(tt(A),!0))||[];d=new n(ht(d.body,65536,i,()=>{a&&a(),k&&k()}),e)}m=m||\"text\";let S=await h[ce.findKey(h,m)||\"text\"](d,e);return!f&&k&&k(),await new Promise((t,i)=>{Ye(t,i,{data:S,headers:We.from(d.headers),status:d.status,statusText:d.statusText,config:e,request:w})})}catch(t){if(k&&k(),t&&\"TypeError\"===t.name&&/Load failed|fetch/i.test(t.message))throw Object.assign(new Ae(\"Network Error\",Ae.ERR_NETWORK,e,w),{cause:t.cause||t});throw Ae.from(t,t&&t.code,e,w)}}},gt=new Map,vt=e=>{let t=e?e.env:{};const{fetch:i,Request:n,Response:a}=t,r=[n,a,i];let o,s,l=r.length,d=gt;for(;l--;)o=r[l],s=d.get(o),void 0===s&&d.set(o,s=l?new Map:bt(t)),d=s;return s},Ct=(vt(),{http:null,xhr:lt,fetch:{get:vt}});ce.forEach(Ct,(e,t)=>{if(e){try{Object.defineProperty(e,\"name\",{value:t})}catch(e){}Object.defineProperty(e,\"adapterName\",{value:t})}});const xt=e=>`- ${e}`,wt=e=>ce.isFunction(e)||null===e||!1===e,kt=(e,t)=>{e=ce.isArray(e)?e:[e];const{length:i}=e;let n,a;const r={};for(let o=0;o<i;o++){let i;if(n=e[o],a=n,!wt(n)&&(a=Ct[(i=String(n)).toLowerCase()],void 0===a))throw new Ae(`Unknown adapter '${i}'`);if(a&&(ce.isFunction(a)||(a=a.get(t))))break;r[i||\"#\"+o]=a}if(!a){const e=Object.entries(r).map(([e,t])=>`adapter ${e} `+(!1===t?\"is not supported by the environment\":\"is not available in the build\"));let t=i?e.length>1?\"since :\\n\"+e.map(xt).join(\"\\n\"):\" \"+xt(e[0]):\"as no adapter specified\";throw new Ae(\"There is no suitable adapter to dispatch the request \"+t,\"ERR_NOT_SUPPORT\")}return a};function _t(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Xe(null,e)}function St(e){_t(e),e.headers=We.from(e.headers),e.data=Je.call(e,e.transformRequest),-1!==[\"post\",\"put\",\"patch\"].indexOf(e.method)&&e.headers.setContentType(\"application/x-www-form-urlencoded\",!1);return kt(e.adapter||ze.adapter,e)(e).then(function(t){return _t(e),t.data=Je.call(e,e.transformResponse,t),t.headers=We.from(t.headers),t},function(t){return Ve(t)||(_t(e),t&&t.response&&(t.response.data=Je.call(e,e.transformResponse,t.response),t.response.headers=We.from(t.response.headers))),Promise.reject(t)})}const Tt=\"1.12.2\",Bt={};[\"object\",\"boolean\",\"number\",\"function\",\"string\",\"symbol\"].forEach((e,t)=>{Bt[e]=function(i){return typeof i===e||\"a\"+(t<1?\"n \":\" \")+e}});const Et={};Bt.transitional=function(e,t,i){function n(e,t){return\"[Axios v\"+Tt+\"] Transitional option '\"+e+\"'\"+t+(i?\". \"+i:\"\")}return(i,a,r)=>{if(!1===e)throw new Ae(n(a,\" has been removed\"+(t?\" in \"+t:\"\")),Ae.ERR_DEPRECATED);return t&&!Et[a]&&(Et[a]=!0,console.warn(n(a,\" has been deprecated since v\"+t+\" and will be removed in the near future\"))),!e||e(i,a,r)}},Bt.spelling=function(e){return(t,i)=>(console.warn(`${i} is likely a misspelling of ${e}`),!0)};const It={assertOptions:function(e,t,i){if(\"object\"!=typeof e)throw new Ae(\"options must be an object\",Ae.ERR_BAD_OPTION_VALUE);const n=Object.keys(e);let a=n.length;for(;a-- >0;){const r=n[a],o=t[r];if(o){const t=e[r],i=void 0===t||o(t,r,e);if(!0!==i)throw new Ae(\"option \"+r+\" must be \"+i,Ae.ERR_BAD_OPTION_VALUE);continue}if(!0!==i)throw new Ae(\"Unknown option \"+r,Ae.ERR_BAD_OPTION)}},validators:Bt},Ft=It.validators;class Rt{constructor(e){this.defaults=e||{},this.interceptors={request:new Te,response:new Te}}async request(e,t){try{return await this._request(e,t)}catch(e){if(e instanceof Error){let t={};Error.captureStackTrace?Error.captureStackTrace(t):t=new Error;const i=t.stack?t.stack.replace(/^.+\\n/,\"\"):\"\";try{e.stack?i&&!String(e.stack).endsWith(i.replace(/^.+\\n.+\\n/,\"\"))&&(e.stack+=\"\\n\"+i):e.stack=i}catch(e){}}throw e}}_request(e,t){\"string\"==typeof e?(t=t||{}).url=e:t=e||{},t=ot(this.defaults,t);const{transitional:i,paramsSerializer:n,headers:a}=t;void 0!==i&&It.assertOptions(i,{silentJSONParsing:Ft.transitional(Ft.boolean),forcedJSONParsing:Ft.transitional(Ft.boolean),clarifyTimeoutError:Ft.transitional(Ft.boolean)},!1),null!=n&&(ce.isFunction(n)?t.paramsSerializer={serialize:n}:It.assertOptions(n,{encode:Ft.function,serialize:Ft.function},!0)),void 0!==t.allowAbsoluteUrls||(void 0!==this.defaults.allowAbsoluteUrls?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),It.assertOptions(t,{baseUrl:Ft.spelling(\"baseURL\"),withXsrfToken:Ft.spelling(\"withXSRFToken\")},!0),t.method=(t.method||this.defaults.method||\"get\").toLowerCase();let r=a&&ce.merge(a.common,a[t.method]);a&&ce.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\",\"common\"],e=>{delete a[e]}),t.headers=We.concat(r,a);const o=[];let s=!0;this.interceptors.request.forEach(function(e){\"function\"==typeof e.runWhen&&!1===e.runWhen(t)||(s=s&&e.synchronous,o.unshift(e.fulfilled,e.rejected))});const l=[];let d;this.interceptors.response.forEach(function(e){l.push(e.fulfilled,e.rejected)});let p,c=0;if(!s){const e=[St.bind(this),void 0];for(e.unshift(...o),e.push(...l),p=e.length,d=Promise.resolve(t);c<p;)d=d.then(e[c++],e[c++]);return d}p=o.length;let h=t;for(;c<p;){const e=o[c++],t=o[c++];try{h=e(h)}catch(e){t.call(this,e);break}}try{d=St.call(this,h)}catch(e){return Promise.reject(e)}for(c=0,p=l.length;c<p;)d=d.then(l[c++],l[c++]);return d}getUri(e){return Se(at((e=ot(this.defaults,e)).baseURL,e.url,e.allowAbsoluteUrls),e.params,e.paramsSerializer)}}ce.forEach([\"delete\",\"get\",\"head\",\"options\"],function(e){Rt.prototype[e]=function(t,i){return this.request(ot(i||{},{method:e,url:t,data:(i||{}).data}))}}),ce.forEach([\"post\",\"put\",\"patch\"],function(e){function t(t){return function(i,n,a){return this.request(ot(a||{},{method:e,headers:t?{\"Content-Type\":\"multipart/form-data\"}:{},url:i,data:n}))}}Rt.prototype[e]=t(),Rt.prototype[e+\"Form\"]=t(!0)});const Ot=Rt;class Dt{constructor(e){if(\"function\"!=typeof e)throw new TypeError(\"executor must be a function.\");let t;this.promise=new Promise(function(e){t=e});const i=this;this.promise.then(e=>{if(!i._listeners)return;let t=i._listeners.length;for(;t-- >0;)i._listeners[t](e);i._listeners=null}),this.promise.then=e=>{let t;const n=new Promise(e=>{i.subscribe(e),t=e}).then(e);return n.cancel=function(){i.unsubscribe(t)},n},e(function(e,n,a){i.reason||(i.reason=new Xe(e,n,a),t(i.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}toAbortSignal(){const e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let e;return{token:new Dt(function(t){e=t}),cancel:e}}}const Mt=Dt;const Lt={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Lt).forEach(([e,t])=>{Lt[t]=e});const Pt=Lt;const zt=function e(t){const i=new Ot(t),n=C(Ot.prototype.request,i);return ce.extend(n,Ot.prototype,i,{allOwnKeys:!0}),ce.extend(n,i,null,{allOwnKeys:!0}),n.create=function(i){return e(ot(t,i))},n}(ze);zt.Axios=Ot,zt.CanceledError=Xe,zt.CancelToken=Mt,zt.isCancel=Ve,zt.VERSION=Tt,zt.toFormData=ve,zt.AxiosError=Ae,zt.Cancel=zt.CanceledError,zt.all=function(e){return Promise.all(e)},zt.spread=function(e){return function(t){return e.apply(null,t)}},zt.isAxiosError=function(e){return ce.isObject(e)&&!0===e.isAxiosError},zt.mergeConfig=ot,zt.AxiosHeaders=We,zt.formToJSON=e=>Le(ce.isHTMLForm(e)?new FormData(e):e),zt.getAdapter=kt,zt.HttpStatusCode=Pt,zt.default=zt;const Gt=zt,qt={send:e=>{void 0!==e.url?Gt.post(e.url,e.data).then(t=>{const i=t.data;i&&0===i.code?e.success&&e.success():e.error&&e.error(i&&i.msg)}).catch(t=>{console.error(t),e.error&&e.error()}):e.error&&e.error()},read:e=>{void 0!==e.url?Gt.get(e.url).then(t=>{const i=t.data;i&&0===i.code?i.data?e.success&&e.success(i.data.map(e=>({author:e[3],time:e[0],text:e[4],color:e[2],type:e[1],size:e[5]&&(\"big\"===e[5]||\"small\"===e[5])?e[5]:\"medium\"}))):e.success&&e.success([{author:\"\",time:0,text:\"\",color:\"#ffeaea\",type:\"right\",size:\"medium\"}]):e.error&&e.error(i&&i.msg)}).catch(t=>{console.error(t),e.error&&e.error()}):e.error&&e.error()}},jt=qt;const Ut={\"zh-cn\":{\"Danmaku is loading\":\"弹幕加载中\",Top:\"顶部\",Bottom:\"底部\",Rolling:\"滚动\",Big:\"大的\",Medium:\"中等的\",Small:\"小的\",\"Input danmaku, hit Enter\":\"输入弹幕, 回车发送\",\"About author\":\"关于作者\",\"DPlayer feedback\":\"播放器意见反馈\",\"About DPlayer\":\"关于 DPlayer 播放器\",Loop:\"洗脑循环\",Speed:\"速度\",Audio:\"音频\",\"Primary audio\":\"主要音频\",\"Secondary audio\":\"辅助音频\",\"Opacity for danmaku\":\"弹幕透明度\",Normal:\"正常\",\"Please input danmaku content\":\"请输入弹幕内容\",\"Set danmaku color\":\"设置弹幕颜色\",\"Set danmaku type\":\"设置弹幕类型\",\"Set danmaku size\":\"设置弹幕大小\",\"Show danmaku\":\"显示弹幕\",\"Video load failed\":\"视频加载失败\",\"Danmaku load failed\":\"弹幕加载失败\",\"Danmaku load partial failed\":\"弹幕加载部分失败\",\"Danmaku send failed\":\"弹幕发送失败\",\"Switching to\":\"正在切换至\",\"Switched to\":\"已经切换至\",\"Switching to quality\":\"正在切换至 %s 画质\",\"Switched to quality\":\"已经切换至 %s 画质\",Synchronize:\"同步\",Synchronized:\"同步的\",Quality:\"画质\",FF:\"快进\",REW:\"快退\",\"FF progress\":\"快进 %s 秒\",\"REW progress\":\"快退 %s 秒\",\"Unlimited danmaku\":\"海量弹幕\",\"Send danmaku\":\"发送弹幕\",Setting:\"设置\",\"Full screen\":\"全屏\",\"Web full screen\":\"页面全屏\",PIP:\"画中画\",\"PIP not supported\":\"不支持画中画\",\"Not available\":\"不可用\",Send:\"发送\",Screenshot:\"截图\",AirPlay:\"无线投屏\",Second:\"秒\",\"Show comment\":\"显示弹幕\",\"Hide comment\":\"隐藏弹幕\",\"Show subtitle\":\"显示字幕\",\"Hide subtitle\":\"隐藏字幕\",Volume:\"音量\",Live:\"直播\",\"Video info\":\"视频统计信息\"},\"zh-tw\":{\"Danmaku is loading\":\"彈幕載入中\",Top:\"頂部\",Bottom:\"底部\",Rolling:\"滾動\",Big:\"大的\",Medium:\"中等的\",Small:\"小的\",\"Input danmaku, hit Enter\":\"輸入彈幕, Enter 發送\",\"About author\":\"關於作者\",\"DPlayer feedback\":\"播放器意見回饋\",\"About DPlayer\":\"關於 DPlayer 播放器\",Loop:\"循環播放\",Speed:\"速度\",Audio:\"音頻\",\"Primary audio\":\"主要音頻\",\"Secondary audio\":\"輔助音頻\",\"Opacity for danmaku\":\"彈幕透明度\",Normal:\"正常\",\"Please input danmaku content\":\"請輸入彈幕內容\",\"Set danmaku color\":\"設定彈幕顏色\",\"Set danmaku type\":\"設定彈幕類型\",\"Set danmaku size\":\"设置弹幕大小\",\"Show danmaku\":\"顯示彈幕\",\"Video load failed\":\"影片載入失敗\",\"Danmaku load failed\":\"彈幕載入失敗\",\"Danmaku load partial failed\":\"彈幕載入部分失敗\",\"Danmaku send failed\":\"彈幕發送失敗\",\"Switching to\":\"正在切換至\",\"Switched to\":\"已經切換至\",\"Switching to quality\":\"正在切換至 %s 畫質\",\"Switched to quality\":\"已經切換至 %s 畫質\",Synchronize:\"同步\",Synchronized:\"同步的\",Quality:\"畫質\",FF:\"快轉\",REW:\"倒轉\",\"FF progress\":\"快轉 %s 秒\",\"REW progress\":\"倒轉 %s 秒\",\"Unlimited danmaku\":\"巨量彈幕\",\"Send danmaku\":\"發送彈幕\",Setting:\"設定\",\"Full screen\":\"全螢幕\",\"Web full screen\":\"頁面全螢幕\",PIP:\"畫中畫\",\"PIP not supported\":\"不支援畫中畫\",\"Not available\":\"不可用\",Send:\"發送\",Screenshot:\"截圖\",AirPlay:\"無線投屏\",Second:\"秒\",\"Show comment\":\"顯示彈幕\",\"Hide comment\":\"隱藏彈幕\",\"Show subtitle\":\"顯示字幕\",\"Hide subtitle\":\"隱藏字幕\",Volume:\"音量\",Live:\"直播\",\"Video info\":\"影片統計訊息\"},\"ja-jp\":{\"Danmaku is loading\":\"コメントを読み込み中\",Top:\"上固定\",Bottom:\"下固定\",Rolling:\"スクロール\",Big:\"大きめ\",Medium:\"標準\",Small:\"小さめ\",\"Input danmaku, hit Enter\":\"右のボタンを押すとコメントできます\",\"About author\":\"作者について\",\"DPlayer feedback\":\"フィードバック\",\"About DPlayer\":\"DPlayer について\",Loop:\"リピート再生\",Speed:\"再生速度\",Audio:\"音声\",\"Primary audio\":\"主音声\",\"Secondary audio\":\"副音声\",\"Opacity for danmaku\":\"コメントの透明度\",Normal:\"標準\",\"Please input danmaku content\":\"コメント内容を入力して下さい!\",\"Set danmaku color\":\"コメントの色\",\"Set danmaku type\":\"コメントの位置\",\"Set danmaku size\":\"コメントのサイズ\",\"Show danmaku\":\"コメントを表示\",\"Video load failed\":\"動画の読み込みに失敗しました…\",\"Danmaku load failed\":\"コメントの読み込みに失敗しました…\",\"Danmaku load partial failed\":\"コメントの読み込みに失敗しました…\",\"Danmaku send failed\":\"コメントの送信に失敗しました…\",\"Switching to\":\"画質を切り替えています…\",\"Switched to\":\"画質を切り替えました\",\"Switching to quality\":\"画質を %s に切り替えています…\",\"Switched to quality\":\"画質を %s 切り替えました\",Synchronize:\"同期する\",Synchronized:\"同期しました\",Quality:\"画質\",FF:\"早送り\",REW:\"早戻し\",\"FF progress\":\"%s 秒早送り\",\"REW progress\":\"%s 秒早戻し\",\"Unlimited danmaku\":\"コメントを無制限に表示\",\"Send danmaku\":\"コメントする\",Setting:\"設定\",\"Full screen\":\"フルスクリーン\",\"Web full screen\":\"ブラウザフルスクリーン\",PIP:\"Picture-in-Picture\",\"PIP not supported\":\"Picture-in-Picture はサポートされていません\",\"Not available\":\"使用できません\",Send:\"コメントする\",Screenshot:\"スクリーンショット\",AirPlay:\"ワイヤレススクリーン\",Second:\"秒\",\"Show comment\":\"コメントを表示する\",\"Hide comment\":\"コメントを表示しない\",\"Show subtitle\":\"字幕を表示する\",\"Hide subtitle\":\"字幕を表示しない\",Volume:\"音量\",Live:\"Live\",\"Video info\":\"動画の統計情報\"},en:{\"Danmaku is loading\":\"Danmaku is loading\",Top:\"Top\",Bottom:\"Bottom\",Rolling:\"Rolling\",Big:\"Big\",Medium:\"Medium\",Small:\"Small\",\"Input danmaku, hit Enter\":\"Input danmaku, hit Enter\",\"About author\":\"About author\",\"DPlayer feedback\":\"DPlayer feedback\",\"About DPlayer\":\"About DPlayer\",Loop:\"Loop\",Speed:\"Speed\",Audio:\"Audio\",\"Primary audio\":\"Primary audio\",\"Secondary audio\":\"Secondary audio\",\"Opacity for danmaku\":\"Opacity for danmaku\",Normal:\"Normal\",\"Please input danmaku content\":\"Please input danmaku content\",\"Set danmaku color\":\"Set danmaku color\",\"Set danmaku type\":\"Set danmaku type\",\"Set danmaku size\":\"Set danmaku size\",\"Show danmaku\":\"Show danmaku\",\"Video load failed\":\"Video load failed\",\"Danmaku load failed\":\"Danmaku load failed\",\"Danmaku load partial failed\":\"Danmaku load partial failed\",\"Danmaku send failed\":\"Danmaku send failed\",\"Switching to\":\"Switching to\",\"Switched to\":\"Switched to\",\"Switching to quality\":\"Switching to %s quality\",\"Switched to quality\":\"Switched to %s quality\",Synchronize:\"Synchronize\",Synchronized:\"Synchronized\",Quality:\"Quality\",FF:\"Fast forward\",REW:\"Rewind\",\"FF progress\":\"Fast forward %s sec\",\"REW progress\":\"Rewind %s sec\",\"Unlimited danmaku\":\"Unlimited danmaku\",\"Send danmaku\":\"Send danmaku\",Setting:\"Setting\",\"Full screen\":\"Fullscreen\",\"Web full screen\":\"Web fullscreen\",PIP:\"Picture-in-Picture\",\"PIP not supported\":\"Picture-in-picture is not supported\",\"Not available\":\"Not available\",Send:\"Send\",Screenshot:\"Screenshot\",AirPlay:\"AirPlay\",Second:\"Sec\",\"Show comment\":\"Show comment\",\"Hide comment\":\"Hide comment\",\"Show subtitle\":\"Show subtitle\",\"Hide subtitle\":\"Hide subtitle\",Volume:\"Volume\",Live:\"Live\",\"Video info\":\"Video info\"}},Ht=function(e){this.lang=e,\"ja\"===this.lang&&(this.lang=\"ja-jp\"),this.tran=(e,...t)=>{let i=e;Ut[this.lang]&&Ut[this.lang][e]&&(i=Ut[this.lang][e]);let n=0;return i.replace(/%s/gi,()=>t[n++]??\"\")}};var Nt=i(416),Wt=i.n(Nt),Jt=i(32),Vt=i.n(Jt),Kt=i(177),Xt=i.n(Kt),Yt=i(833),$t=i.n(Yt),Qt=i(278),Zt=i.n(Qt),ei=i(513),ti=i.n(ei),ii=i(204),ni=i.n(ii),ai=i(717),ri=i.n(ai),oi=i(928),si=i.n(oi),li=i(657),di=i.n(li),pi=i(894),ci=i.n(pi),hi=i(105),ui=i.n(hi),fi=i(460),Ai=i.n(fi),yi=i(642),mi=i.n(yi),bi=i(1),gi=i.n(bi),vi=i(165),Ci=i.n(vi),xi=i(484),wi=i.n(xi),ki=i(137),_i=i.n(ki),Si=i(631),Ti=i.n(Si),Bi=i(28),Ei=i.n(Bi),Ii=i(30),Fi=i.n(Ii),Ri=i(454),Oi=i.n(Ri);const Di={play:Wt(),pause:Vt(),backward:Xt(),forward:$t(),volumeUp:Zt(),volumeDown:ti(),volumeOff:ni(),full:ri(),fullWeb:si(),pip:di(),setting:ci(),left:ui(),right:Ai(),check:mi(),comment:gi(),commentOff:Ci(),send:wi(),pallette:_i(),camera:Ti(),subtitle:Fi(),loading:Oi(),airplay:Ei()};var Mi=i(456),Li=i.n(Mi);const Pi=class{container;options;index;tran;volumeBar;volumeBarWrap;volumeBarWrapWrap;volumeButton;volumeButtonIcon;volumeIcon;playedBar;loadedBar;playedBarWrap;playedBarTime;danmaku;danmakuLoading;video;bezel;playButton;playIcon;mobileBackwardButton;mobilePlayButton;mobileForwardButton;videoWrap;videoWrapAspect;controllerMask;ptime;settingButton;settingBox;settingOriginPanel;mask;syncButton;loop;loopToggle;showDanmaku;showDanmakuToggle;unlimitDanmaku;unlimitDanmakuToggle;quality;qualityValue;qualityHeader;qualityItem;speed;speedValue;speedHeader;speedItem;audio;audioValue;audioHeader;audioItem;danmakuOpacityBar;danmakuOpacityBarWrap;danmakuOpacityBarWrapWrap;danmakuOpacityBox;danmakuOpacityValue;dtime;controller;commentInput;commentButton;commentSettingBox;commentSettingButton;commentSettingFill;commentSendButton;commentSendFill;commentColorSettingBox;browserFullButton;webFullButton;pipButton;menu;menuItem;cameraButton;airplayButton;subtitleButton;subtitleButtonInner;subtitle;barPreview;barWrap;notice;infoPanel;infoPanelClose;infoMimeType;infoVersion;infoVideoFPS;infoPageFPS;infoDroppedFrames;infoType;infoUrl;infoResolution;infoDuration;infoBufferRemain;infoDownloadSpeed;constructor(e){this.container=e.container,this.options=e.options,this.index=e.index,this.tran=e.tran,this.init()}init(){this.container.innerHTML=Li()({options:this.options,index:this.index,tran:this.tran,icons:Di,mobile:v.isMobile,video:{current:!0,pic:this.options.video.pic,screenshot:this.options.screenshot,airplay:this.options.airplay,preload:this.options.preload,url:this.options.video.url,subtitle:this.options.subtitle,crossOrigin:this.options.crossOrigin}}),this.volumeBar=this.container.querySelector(\".dplayer-volume-bar-inner\"),this.volumeBarWrap=this.container.querySelector(\".dplayer-volume-bar\"),this.volumeBarWrapWrap=this.container.querySelector(\".dplayer-volume-bar-wrap\"),this.volumeButton=this.container.querySelector(\".dplayer-volume\"),this.volumeButtonIcon=this.container.querySelector(\".dplayer-volume-icon\"),this.volumeIcon=this.container.querySelector(\".dplayer-volume-icon .dplayer-icon-content\"),this.playedBar=this.container.querySelector(\".dplayer-played\"),this.loadedBar=this.container.querySelector(\".dplayer-loaded\"),this.playedBarWrap=this.container.querySelector(\".dplayer-bar-wrap\"),this.playedBarTime=this.container.querySelector(\".dplayer-bar-time\"),this.danmaku=this.container.querySelector(\".dplayer-danmaku\"),this.danmakuLoading=this.container.querySelector(\".dplayer-danloading\"),this.video=this.container.querySelector(\".dplayer-video-current\"),this.bezel=this.container.querySelector(\".dplayer-bezel-icon\"),this.playButton=this.container.querySelector(\".dplayer-play-icon\"),this.playIcon=this.container.querySelector(\".dplayer-play-icon .dplayer-icon-content\"),this.mobileBackwardButton=this.container.querySelector(\".dplayer-mobile-icon-backward\"),this.mobilePlayButton=this.container.querySelector(\".dplayer-mobile-icon-play\"),this.mobileForwardButton=this.container.querySelector(\".dplayer-mobile-icon-forward\"),this.videoWrap=this.container.querySelector(\".dplayer-video-wrap\"),this.videoWrapAspect=this.container.querySelector(\".dplayer-video-wrap-aspect\"),this.controllerMask=this.container.querySelector(\".dplayer-controller-mask\"),this.ptime=this.container.querySelector(\".dplayer-ptime\"),this.settingButton=this.container.querySelector(\".dplayer-setting-icon\"),this.settingBox=this.container.querySelector(\".dplayer-setting-box\"),this.settingOriginPanel=this.container.querySelector(\".dplayer-setting-origin-panel\"),this.mask=this.container.querySelector(\".dplayer-mask\"),this.syncButton=this.container.querySelector(\".dplayer-live-badge\"),this.loop=this.container.querySelector(\".dplayer-setting-loop\"),this.loopToggle=this.container.querySelector(\".dplayer-setting-loop .dplayer-toggle-setting-input\"),this.showDanmaku=this.container.querySelector(\".dplayer-setting-showdan\"),this.showDanmakuToggle=this.container.querySelector(\".dplayer-showdan-setting-input\"),this.unlimitDanmaku=this.container.querySelector(\".dplayer-setting-danunlimit\"),this.unlimitDanmakuToggle=this.container.querySelector(\".dplayer-danunlimit-setting-input\"),this.quality=this.container.querySelector(\".dplayer-setting-quality\"),this.qualityValue=this.container.querySelector(\".dplayer-setting-quality .dplayer-label-value\"),this.qualityHeader=this.container.querySelector(\".dplayer-setting-quality-header\"),this.qualityItem=this.container.querySelectorAll(\".dplayer-setting-quality-item\"),this.speed=this.container.querySelector(\".dplayer-setting-speed\"),this.speedValue=this.container.querySelector(\".dplayer-setting-speed .dplayer-label-value\"),this.speedHeader=this.container.querySelector(\".dplayer-setting-speed-header\"),this.speedItem=this.container.querySelectorAll(\".dplayer-setting-speed-item\"),this.audio=this.container.querySelector(\".dplayer-setting-audio\"),this.audioValue=this.container.querySelector(\".dplayer-setting-audio .dplayer-label-value\"),this.audioHeader=this.container.querySelector(\".dplayer-setting-audio-header\"),this.audioItem=this.container.querySelectorAll(\".dplayer-setting-audio-item\"),this.danmakuOpacityBar=this.container.querySelector(\".dplayer-danmaku-bar-inner\"),this.danmakuOpacityBarWrap=this.container.querySelector(\".dplayer-danmaku-bar\"),this.danmakuOpacityBarWrapWrap=this.container.querySelector(\".dplayer-danmaku-bar-wrap\"),this.danmakuOpacityBox=this.container.querySelector(\".dplayer-setting-danmaku\"),this.danmakuOpacityValue=this.container.querySelector(\".dplayer-setting-danmaku .dplayer-label-value\"),this.dtime=this.container.querySelector(\".dplayer-dtime\"),this.controller=this.container.querySelector(\".dplayer-controller\"),this.commentInput=this.container.querySelector(\".dplayer-comment-input\"),this.commentButton=this.container.querySelector(\".dplayer-comment-icon\"),this.commentSettingBox=this.container.querySelector(\".dplayer-comment-setting-box\"),this.commentSettingButton=this.container.querySelector(\".dplayer-comment-setting-icon\"),this.commentSettingFill=this.container.querySelector(\".dplayer-comment-setting-icon path\"),this.commentSendButton=this.container.querySelector(\".dplayer-send-icon\"),this.commentSendFill=this.container.querySelector(\".dplayer-send-icon path\"),this.commentColorSettingBox=this.container.querySelector(\".dplayer-comment-setting-color\"),this.browserFullButton=this.container.querySelector(\".dplayer-full-icon\"),this.webFullButton=this.container.querySelector(\".dplayer-full-in-icon\"),this.pipButton=this.container.querySelector(\".dplayer-pip-icon\"),this.menu=this.container.querySelector(\".dplayer-menu\"),this.menuItem=this.container.querySelectorAll(\".dplayer-menu-item\"),this.cameraButton=this.container.querySelector(\".dplayer-camera-icon\"),this.airplayButton=this.container.querySelector(\".dplayer-airplay-icon\"),this.subtitleButton=this.container.querySelector(\".dplayer-subtitle-icon\"),this.subtitleButtonInner=this.container.querySelector(\".dplayer-subtitle-icon .dplayer-icon-content\"),this.subtitle=this.container.querySelector(\".dplayer-subtitle\"),this.barPreview=this.container.querySelector(\".dplayer-bar-preview\"),this.barWrap=this.container.querySelector(\".dplayer-bar-wrap\"),this.notice=this.container.querySelector(\".dplayer-notice\"),this.infoPanel=this.container.querySelector(\".dplayer-info-panel\"),this.infoPanelClose=this.container.querySelector(\".dplayer-info-panel-close\"),this.infoMimeType=this.container.querySelector(\".dplayer-info-panel-item-mimetype .dplayer-info-panel-item-data\"),this.infoVersion=this.container.querySelector(\".dplayer-info-panel-item-version .dplayer-info-panel-item-data\"),this.infoVideoFPS=this.container.querySelector(\".dplayer-info-panel-item-video-fps .dplayer-info-panel-item-data\"),this.infoPageFPS=this.container.querySelector(\".dplayer-info-panel-item-page-fps .dplayer-info-panel-item-data\"),this.infoDroppedFrames=this.container.querySelector(\".dplayer-info-panel-item-dropped-frames .dplayer-info-panel-item-data\"),this.infoType=this.container.querySelector(\".dplayer-info-panel-item-type .dplayer-info-panel-item-data\"),this.infoUrl=this.container.querySelector(\".dplayer-info-panel-item-url .dplayer-info-panel-item-data\"),this.infoResolution=this.container.querySelector(\".dplayer-info-panel-item-resolution .dplayer-info-panel-item-data\"),this.infoDuration=this.container.querySelector(\".dplayer-info-panel-item-duration .dplayer-info-panel-item-data\"),this.infoBufferRemain=this.container.querySelector(\".dplayer-info-panel-item-buffer-remain .dplayer-info-panel-item-data\"),this.infoDownloadSpeed=this.container.querySelector(\".dplayer-info-panel-item-download-speed .dplayer-info-panel-item-data\")}};const zi=class{options;player;container;danTunnel;danIndex;danFontSize;dan;_opacity;events;unlimited;context=null;showing;paused=!1;constructor(e){this.options=e,this.player=this.options.player,this.container=this.options.container,this.danTunnel={right:{},top:{},bottom:{}},this.danIndex=0,this.danFontSize=24,this.dan=[],this.showing=!0,this._opacity=this.options.opacity,this.events=this.options.events,this.unlimited=1===this.options.unlimited,this._measure(\"\",0),this.load()}load(){let e;if(this.options.api.address){const t=Object.assign({},this.options.api.id?{id:this.options.api.id}:{},this.options.api.maximum?{max:this.options.api.maximum}:{}),i=Object.entries(t).map(([e,t])=>`${e}=${t}`).join(\"&\");e=i?`${this.options.api.address}?${i}`:this.options.api.address}const t=(this.options.api.addition||[]).slice(0);e&&t.push(e),this.options.apiBackend!==jt&&t.push(\"apiBackend\"),this.events&&this.events.trigger(\"danmaku_load_start\",t),this._readAllEndpoints(t,e=>{this.dan=[].concat(...e).sort((e,t)=>e.time-t.time),window.requestAnimationFrame(()=>{this.frame()}),this.options.callback(),this.events&&this.events.trigger(\"danmaku_load_end\")})}reload(e){this.options.api=e,this.dan=[],this.clear(),this.load()}_readAllEndpoints(e,t){const i=[];let n=0,a=0;for(let r=0;r<e.length;++r)this.options.apiBackend.read({url:e[r],success:n=>{i[r]=n,++a,a===e.length&&t(i)},error:o=>{o&&this.options.error(o),i[r]=[],++n,++a,a===e.length&&(n!==e.length?this.options.error(this.options.tran(\"Danmaku load partial failed\")):this.options.error(this.options.tran(\"Danmaku load failed\")),t(i))}})}send(e,t,i=!1){const n={token:this.options.api.token,id:this.options.api.id,author:this.options.api.user,time:this.options.time(),text:e.text,color:e.color,type:e.type,size:e.size};this.options.apiBackend.send({url:this.options.api.address,data:n,success:()=>{this.dan.splice(this.danIndex,0,n),this.danIndex++,this.draw({text:n.text,color:n.color,type:n.type,size:n.size,border:!0}),this.events&&this.events.trigger(\"danmaku_send\",n),t()},error:e=>{this.options.error(e||this.options.tran(\"Danmaku send failed\")),!0===i&&t()}})}frame(){if(this.dan.length&&!this.paused&&this.showing){let e=this.dan[this.danIndex];const t=[];for(;e&&this.options.time()>(\"number\"==typeof e.time?e.time:parseFloat(e.time));)t.push(e),e=this.dan[++this.danIndex];this.draw(t)}window.requestAnimationFrame(()=>{this.frame()})}opacity(e){return void 0!==e&&(this.container.style.setProperty(\"--dplayer-danmaku-opacity\",`${e}`),this._opacity=e,this.events&&this.events.trigger(\"danmaku_opacity\",this._opacity)),this._opacity}draw(e){if(this.showing){let t;t=\"[object Array]\"!==Object.prototype.toString.call(e)?[e]:e;const i=1.25;let n=this.container.offsetWidth/1024*i;n>=1&&(n=1);let a=this.options.fontSize*n;const r=a+6*n,o=this.container.offsetWidth,s=this.container.offsetHeight/r,l=e=>{const t=e.offsetWidth||parseInt(e.style.width),i=e.getBoundingClientRect().right||this.container.getBoundingClientRect().right+t;return this.container.getBoundingClientRect().right-i},d=e=>(o+e)/5,p=(e,t,i)=>{const n=o/d(i);for(let i=0;this.unlimited||i<s;i++){const a=this.danTunnel[t][i+\"\"];if(!a||!a.length)return this.danTunnel[t][i+\"\"]=[e],e.addEventListener(\"animationend\",()=>{this.danTunnel[t][i+\"\"].splice(0,1)}),i%s;if(\"right\"===t)for(let r=0;r<a.length;r++){const p=l(a[r])-10;if(p<=o-n*d(parseInt(a[r].style.width))||p<=0)break;if(r===a.length-1)return this.danTunnel[t][i+\"\"].push(e),e.addEventListener(\"animationend\",()=>{this.danTunnel[t][i+\"\"].splice(0,1)}),i%s}}return-1},c=document.createDocumentFragment();for(let e=0;e<t.length;e++){const i=t[e];switch(\"number\"==typeof i.color&&isFinite(i.color)&&(i.color=v.number2Color(i.color)),\"number\"==typeof i.type&&isFinite(i.type)&&(i.type=v.number2Type(i.type)),i.color||(i.color=\"#ffeaea\"),(!i.type||\"right\"!==i.type&&\"top\"!==i.type&&\"bottom\"!==i.type)&&(i.type=\"right\"),i.size||(i.size=\"medium\"),i.size){case\"big\":a*=1.25;break;case\"small\":a*=.8}const n=(()=>{let e=0;for(const t of i.text.split(\"\\n\")){const i=this._measure(t,a);i>e&&(e=i)}return e})(),s=i.text.split(\"\\n\");for(const e of\"bottom\"===i.type?s.reverse():s){const t=document.createElement(\"div\");if(t.classList.add(\"dplayer-danmaku-item\"),t.classList.add(`dplayer-danmaku-${i.type}`),t.classList.add(`dplayer-danmaku-size-${i.size}`),t.style.color=i.color,\"border\"in i&&i.border){const i=document.createElement(\"span\");i.style.border=`2px solid ${this.options.borderColor}`,i.textContent=e,t.appendChild(i)}else t.textContent=e;t.addEventListener(\"animationend\",()=>{this.container.removeChild(t)});const a=p(t,i.type,n);switch(i.type){case\"right\":a>=0&&(t.style.width=n+1+\"px\",t.style.top=r*a+8+\"px\",t.style.transform=`translateX(-${o}px)`,t.style.willChange=\"transform\",v.isWebKit&&(t.style.display=\"none\"));break;case\"top\":a>=0&&(t.style.width=n+1+\"px\",t.style.top=r*a+8+\"px\",t.style.willChange=\"visibility\");break;case\"bottom\":a>=0&&(t.style.width=n+1+\"px\",t.style.bottom=r*a+8+\"px\",t.style.willChange=\"visibility\");break;default:console.error(`Can't handled danmaku type: ${i.type}`)}a>=0&&(t.classList.add(\"dplayer-danmaku-move\"),t.style.animationDuration=this._danAnimation(i.type),c.appendChild(t),v.isWebKit&&\"right\"===i.type&&setTimeout(()=>{t.style.display=\"\"},0))}}return this.container.style.setProperty(\"--dplayer-danmaku-font-size\",`${a}px`),this.container.appendChild(c),c}return null}play(){this.paused=!1}pause(){this.paused=!0}_measure(e,t){this.context&&this.danFontSize===t||(this.danFontSize=t,this.context=document.createElement(\"canvas\").getContext(\"2d\"),this.context.font=`bold ${this.danFontSize}px \"Segoe UI\", Arial`);const i=e.split(\"\\n\");let n=0;for(let e=0;e<i.length;e++)n=Math.max(n,this.context.measureText(i[e]).width);return n}seek(){this.clear();for(let e=0;e<this.dan.length;e++){if(this.dan[e].time>=this.options.time()){this.danIndex=e;break}this.danIndex=this.dan.length}}clear(){this.danTunnel={right:{},top:{},bottom:{}},this.danIndex=0,this.options.container.innerHTML=\"\",this.events&&this.events.trigger(\"danmaku_clear\")}resize(){const e=this.container.offsetWidth,t=this.container.querySelectorAll(\".dplayer-danmaku-item\");for(let i=0;i<t.length;i++)t[i].style.transform=`translateX(-${e}px)`}hide(){this.showing=!1,this.pause(),this.clear(),this.events&&this.events.trigger(\"danmaku_hide\")}show(){this.seek(),this.showing=!0,this.play(),this.events&&this.events.trigger(\"danmaku_show\")}toggle(){this.showing?this.hide():this.show()}unlimit(e){this.unlimited=e}speed(e){this.options.speedRate=e}_danAnimation(e){const t=this.options.speedRate,i=this.player.fullScreen.isFullScreen(\"browser\")||this.player.fullScreen.isFullScreen(\"web\");return{top:(i?4.5:4)/t+\"s\",right:(i?5.5:5)/t+\"s\",bottom:(i?4.5:4)/t+\"s\"}[e]}};const Gi=class{events;videoEvents;playerEvents;constructor(){this.events={},this.videoEvents=[\"abort\",\"canplay\",\"canplaythrough\",\"durationchange\",\"emptied\",\"ended\",\"error\",\"loadeddata\",\"loadedmetadata\",\"loadstart\",\"mozaudioavailable\",\"pause\",\"play\",\"playing\",\"progress\",\"ratechange\",\"seeked\",\"seeking\",\"stalled\",\"suspend\",\"timeupdate\",\"volumechange\",\"waiting\"],this.playerEvents=[\"screenshot\",\"thumbnails_show\",\"thumbnails_hide\",\"danmaku_show\",\"danmaku_hide\",\"danmaku_clear\",\"danmaku_load_start\",\"danmaku_load_end\",\"danmaku_send\",\"danmaku_opacity\",\"contextmenu_show\",\"contextmenu_hide\",\"notice_show\",\"notice_hide\",\"quality_start\",\"quality_end\",\"destroy\",\"resize\",\"fullscreen\",\"fullscreen_cancel\",\"webfullscreen\",\"webfullscreen_cancel\",\"subtitle_show\",\"subtitle_hide\",\"subtitle_change\"]}on(e,t,i=!1){this.type(e)&&\"function\"==typeof t&&(this.events[e]||(this.events[e]=[]),this.events[e].push({callback:t,once:i}))}off(e,t){if(this.type(e)&&\"function\"==typeof t&&this.events[e])for(const i of this.events[e])i.callback===t&&this.events[e].splice(this.events[e].indexOf(i),1)}trigger(e,t){if(this.events[e]&&this.events[e].length)for(const i of this.events[e])i.callback(t),i.once&&this.off(e,i.callback)}type(e){return-1!==this.playerEvents.indexOf(e)?\"player\":-1!==this.videoEvents.indexOf(e)?\"video\":(console.error(`Unknown event name: ${e}`),null)}};const qi=class{player;lastScrollPosition;fullscreenchange;constructor(e){this.player=e,this.lastScrollPosition={left:0,top:0},this.player.events.on(\"webfullscreen\",()=>{this.player.resize()}),this.player.events.on(\"webfullscreen_cancel\",()=>{this.player.resize(),v.setScrollPosition(this.lastScrollPosition)}),this.fullscreenchange=()=>{this.player.resize(),this.isFullScreen(\"browser\")?this.player.events.trigger(\"fullscreen\"):(v.setScrollPosition(this.lastScrollPosition),this.player.container.classList.remove(\"dplayer-fulled-browser\"),this.player.events.trigger(\"fullscreen_cancel\"))},void 0!==this.player.container.onfullscreenchange?this.player.container.addEventListener(\"fullscreenchange\",this.fullscreenchange):this.player.container.addEventListener(\"webkitfullscreenchange\",this.fullscreenchange)}isFullScreen(e=\"browser\"){switch(e){case\"browser\":{const e=document.fullscreenElement||document.webkitFullscreenElement;return!(!e||e!==this.player.container)}case\"web\":return this.player.container.classList.contains(\"dplayer-fulled\")}}request(e=\"browser\"){const t=\"browser\"===e?\"web\":\"browser\",i=this.isFullScreen(t);switch(i||(this.lastScrollPosition=v.getScrollPosition()),e){case\"browser\":if(this.player.container.requestFullscreen=this.player.container.requestFullscreen||this.player.container.webkitRequestFullscreen,void 0!==this.player.container.requestFullscreen?this.player.container.requestFullscreen():this.player.video.webkitEnterFullscreen&&this.player.video.webkitEnterFullscreen(),screen.orientation)try{screen.orientation.lock(\"landscape\").catch(()=>{})}catch(e){}void 0!==this.player.container.requestFullscreen&&this.player.container.classList.add(\"dplayer-fulled-browser\");break;case\"web\":this.player.container.classList.add(\"dplayer-fulled\"),document.body.classList.add(\"dplayer-web-fullscreen-fix\"),this.player.events.trigger(\"webfullscreen\")}i&&this.cancel(t)}cancel(e=\"browser\"){switch(e){case\"browser\":if(document.exitFullscreen=document.exitFullscreen||document.webkitExitFullscreen,document.exitFullscreen&&document.exitFullscreen(),screen.orientation)try{screen.orientation.unlock()}catch(e){}this.player.container.classList.remove(\"dplayer-fulled-browser\");break;case\"web\":this.player.container.classList.remove(\"dplayer-fulled\"),document.body.classList.remove(\"dplayer-web-fullscreen-fix\"),this.player.events.trigger(\"webfullscreen_cancel\")}}toggle(e=\"browser\"){this.isFullScreen(e)?this.cancel(e):this.request(e)}destroy(){this.player.container.removeEventListener(\"fullscreenchange\",this.fullscreenchange),this.player.container.removeEventListener(\"webkitfullscreenchange\",this.fullscreenchange)}};const ji=class{storageName;default;data;constructor(e){this.storageName={opacity:\"dplayer-danmaku-opacity\",volume:\"dplayer-volume\",unlimited:\"dplayer-danmaku-unlimited\",danmaku:\"dplayer-danmaku-show\",subtitle:\"dplayer-subtitle-show\",speed:\"dplayer-speed\",loop:\"dplayer-loop\"},this.default={opacity:1,volume:Object.prototype.hasOwnProperty.call(e.options,\"volume\")?e.options.volume:1,unlimited:(e.options.danmaku&&e.options.danmaku.unlimited?1:0)||0,danmaku:1,subtitle:1,speed:1,loop:e.options.loop?1:0},this.data={},this.init()}init(){for(const e in this.storageName){const t=this.storageName[e];this.data[e]=parseFloat(v.storage.get(t)||this.default[e].toString())}}get(e){return this.data[e]}set(e,t){this.data[e]=t,v.storage.set(this.storageName[e],t)}};const Ui=class{container;video;plugins;options;events;constructor(e,t,i,n,a){this.container=e,this.video=t,this.plugins=i,this.options=n,this.events=a,this.init()}init(){if(this.container.style.fontSize=this.options.fontSize,this.container.style.bottom=this.options.bottom,this.container.style.color=this.options.color,\"webvtt\"===this.options.type&&this.video.textTracks&&this.video.textTracks[0]){const e=this.video.textTracks[0];e.oncuechange=()=>{if(!e.activeCues)return;const t=e.activeCues[0];if(this.container.innerHTML=\"\",t){const e=document.createElement(\"div\");e.appendChild(t.getCueAsHTML());const i=e.innerHTML.split(/\\r?\\n/).map(e=>`<p>${e}</p>`).join(\"\");this.container.innerHTML=i}this.events.trigger(\"subtitle_change\")}}}show(){this.container.classList.remove(\"dplayer-subtitle-hide\"),\"aribb24\"===this.options.type&&this.plugins.aribb24Caption&&this.plugins.aribb24Caption.show(),this.events.trigger(\"subtitle_show\")}hide(){this.container.classList.add(\"dplayer-subtitle-hide\"),\"aribb24\"===this.options.type&&this.plugins.aribb24Caption&&this.plugins.aribb24Caption.hide(),this.events.trigger(\"subtitle_hide\")}toggle(){this.container.classList.contains(\"dplayer-subtitle-hide\")?this.show():this.hide()}};const Hi=class{elements;constructor(e){this.elements={},this.elements.volume=e.volumeBar,this.elements.played=e.playedBar,this.elements.loaded=e.loadedBar,this.elements.danmaku=e.danmakuOpacityBar}set(e,t,i){t=Math.max(t,0),t=Math.min(t,1),this.elements[e].style[i]=100*t+\"%\"}get(e){return parseFloat(this.elements[e].style.width)/100}};const Ni=class{player;types;enablefpsChecker;enableinfoChecker;enableloadingChecker;fpsIndex;fpsStart;fpsChecker;infoChecker;loadingChecker;constructor(e){this.player=e,window.requestAnimationFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)},this.types=[\"loading\",\"info\",\"fps\"],this.init()}init(){this.types.map(e=>(\"fps\"!==e&&this[`init${e}Checker`](),e))}initloadingChecker(){let e=0,t=0,i=!1;this.loadingChecker=window.setInterval(()=>{this.enableloadingChecker&&(t=this.player.video.currentTime,i||t!==e||this.player.video.paused||(this.player.container.classList.add(\"dplayer-loading\"),i=!0),i&&t>e&&!this.player.video.paused&&(this.player.container.classList.remove(\"dplayer-loading\"),i=!1),e=t)},100)}initfpsChecker(){window.requestAnimationFrame(()=>{if(this.enablefpsChecker)if(this.initfpsChecker(),this.fpsStart){this.fpsIndex++;const e=new Date;e-this.fpsStart>1e3&&(this.player.infoPanel.fps(this.fpsIndex/(e-this.fpsStart)*1e3),this.fpsStart=new Date,this.fpsIndex=0)}else this.fpsStart=new Date,this.fpsIndex=0;else this.fpsStart=0,this.fpsIndex=0})}initinfoChecker(){this.infoChecker=window.setInterval(()=>{this.enableinfoChecker&&this.player.infoPanel.update()},1e3)}enable(e){this[`enable${e}Checker`]=!0,\"fps\"===e&&this.initfpsChecker()}disable(e){this[`enable${e}Checker`]=!1}destroy(){this.types.map(e=>(this[`enable${e}Checker`]=!1,this[`${e}Checker`]&&window.clearInterval(this[`${e}Checker`]),e))}};const Wi=class{container;constructor(e){this.container=e,this.container.addEventListener(\"animationend\",()=>{this.container.classList.remove(\"dplayer-bezel-transition\")})}switch(e){this.container.innerHTML=e,this.container.classList.add(\"dplayer-bezel-transition\")}};const Ji=class{player;container;barWidth;events;viewportWidth=180;viewportHeight=101;thumbnailSpace=v.isMobile?6:26;width;height;interval;totalCount;columnCount;magnificationScale;constructor(e){this.player=e.player,this.container=this.player.template.barPreview,this.barWidth=this.player.template.barWrap.offsetWidth,this.events=e.events,this.interval=e.interval,e.interval?this.totalCount=Math.ceil(this.player.video.duration/e.interval):this.totalCount=e.totalCount||100,this.width=e.width||160,this.height=e.height||Math.floor(9*this.width/16),this.columnCount=e.columnCount||100,this.magnificationScale=this.viewportWidth/this.width,this.player.template.barWrap.style.setProperty(\"--thumbnail-url\",`url(${e.url})`),this.container.style.width=`${this.viewportWidth}px`,this.container.style.height=`${this.viewportHeight}px`,this.container.style.top=-this.viewportHeight-this.thumbnailSpace+\"px\",this.container.style.backgroundPosition=\"0 0\",this.player.on(\"durationchange\",()=>{this.resize(this.width,this.height,this.barWidth)})}resize(e,t,i){this.width=e,this.height=t,this.barWidth=i,this.interval&&(this.totalCount=Math.ceil(this.player.video.duration/this.interval));const n=Math.ceil(this.totalCount/this.columnCount),a=this.columnCount*e*this.magnificationScale,r=n*t*this.magnificationScale;this.container.style.width=`${this.viewportWidth}px`,this.container.style.height=`${this.viewportHeight}px`,this.container.style.top=-this.viewportHeight-this.thumbnailSpace+\"px\",this.container.style.backgroundSize=`${a}px ${r}px`}show(){this.container.style.display=\"block\",this.events&&this.events.trigger(\"thumbnails_show\")}move(e){const t=Math.max(0,Math.min(Math.floor(e/this.barWidth*this.totalCount),this.totalCount-1)),i=t%this.columnCount,n=Math.floor(t/this.columnCount),a=i*this.width,r=n*this.height;this.container.style.backgroundPosition=`-${a*this.magnificationScale}px -${r*this.magnificationScale}px`;const o=Math.min(Math.max(e-this.container.offsetWidth/2,-10),this.barWidth-(this.viewportWidth-10));this.container.style.left=`${o}px`}hide(){this.container.style.display=\"none\",this.events&&this.events.trigger(\"thumbnails_hide\")}};const Vi=class{player;disableAutoHide=!1;autoHideTimer;mobileSkipTimer;mobileBackwardTime;mobileForwardTime;setAutoHideHandler;thumbnails=null;constructor(e){this.player=e,this.autoHideTimer=0,this.mobileSkipTimer=0,this.mobileBackwardTime=0,this.mobileForwardTime=0,this.setAutoHideHandler=()=>this.setAutoHide(),v.isMobile?this.player.container.addEventListener(\"touchmove\",this.setAutoHideHandler):(this.player.container.addEventListener(\"mousemove\",this.setAutoHideHandler),this.player.container.addEventListener(\"click\",this.setAutoHideHandler)),this.player.on(\"play\",this.setAutoHideHandler),this.player.on(\"pause\",this.setAutoHideHandler),this.initPlayButton(),this.initThumbnails(),this.initPlayedBar(),this.initFullButton(),this.initPipButton(),this.initSyncButton(),this.initScreenshotButton(),this.initSubtitleButton(),this.initHighlights(),this.initAirplayButton(),v.isMobile||this.initVolumeButton()}initPlayButton(){this.player.template.playButton.addEventListener(\"click\",()=>{this.player.toggle()}),this.player.template.mobilePlayButton.addEventListener(\"click\",()=>{this.player.toggle()}),v.isMobile?(this.player.template.videoWrap.addEventListener(\"click\",()=>{this.toggle(),this.isShow()&&this.setAutoHide()}),this.player.template.controllerMask.addEventListener(\"click\",()=>{this.toggle(),this.isShow()&&this.setAutoHide()})):(this.player.template.videoWrap.addEventListener(\"click\",()=>{this.player.toggle()}),this.player.template.controllerMask.addEventListener(\"click\",()=>{this.player.toggle()})),this.player.template.mobileBackwardButton.addEventListener(\"click\",()=>{this.mobileBackwardTime+=10,this.player.seek(this.player.video.currentTime-10),this.player.notice(this.player.tran(\"REW progress\",this.mobileBackwardTime.toFixed(0))),window.clearTimeout(this.mobileSkipTimer),this.mobileSkipTimer=window.setTimeout(()=>{this.mobileBackwardTime=0},1e3),this.setAutoHide()}),this.player.template.mobileForwardButton.addEventListener(\"click\",()=>{this.mobileForwardTime+=10,this.player.seek(this.player.video.currentTime+10),this.player.notice(this.player.tran(\"FF progress\",this.mobileForwardTime.toFixed(0))),window.clearTimeout(this.mobileSkipTimer),this.mobileSkipTimer=window.setTimeout(()=>{this.mobileForwardTime=0},1e3),this.setAutoHide()})}initHighlights(){this.player.on(\"durationchange\",()=>{if(1!==this.player.video.duration&&this.player.video.duration!==1/0&&this.player.options.highlight){const e=this.player.template.playedBarWrap.querySelectorAll(\".dplayer-highlight\");[].slice.call(e,0).forEach(e=>{this.player.template.playedBarWrap.removeChild(e)});for(let e=0;e<this.player.options.highlight.length;e++){if(!this.player.options.highlight[e].text||!this.player.options.highlight[e].time)continue;const t=document.createElement(\"div\");t.classList.add(\"dplayer-highlight\"),t.style.left=this.player.options.highlight[e].time/this.player.video.duration*100+\"%\";const i=document.createElement(\"span\");i.classList.add(\"dplayer-highlight-text\"),i.textContent=this.player.options.highlight[e].text,t.appendChild(i),this.player.template.playedBarWrap.insertBefore(t,this.player.template.playedBarTime)}}})}initThumbnails(){if(this.player.options.video.thumbnails){const e=this.player.options.video.thumbnails;this.thumbnails=new Ji({player:this.player,url:e.url,events:this.player.events,interval:e.interval,totalCount:e.totalCount,width:e.width,height:e.height,columnCount:e.columnCount}),this.player.on(\"loadedmetadata\",()=>{const t=e.width||160,i=e.height||Math.floor(9*t/16);this.thumbnails.resize(t,i,this.player.template.barWrap.offsetWidth)})}}initPlayedBar(){let e;const t=e=>{const t=e;e.preventDefault();let i=v.getRelativeX(t,this.player.template.playedBarWrap)/this.player.template.playedBarWrap.clientWidth;i=Math.max(i,0),i=Math.min(i,1),this.player.bar.set(\"played\",i,\"width\");const n=v.getVideoDuration(this.player.video,this.player.template);this.player.template.ptime.textContent=v.secondToTime(i*n),this.player.container.classList.add(\"dplayer-seeking\"),this.player.video.paused||this.player.video.pause()},i=n=>{const a=n;document.removeEventListener(v.nameMap.dragEnd,i),document.removeEventListener(v.nameMap.dragMove,t),this.player.container.removeEventListener(v.nameMap.dragEnd,i),this.player.container.removeEventListener(v.nameMap.dragMove,t);let r=v.getRelativeX(a,this.player.template.playedBarWrap)/this.player.template.playedBarWrap.clientWidth;r=Math.max(r,0),r=Math.min(r,1),this.player.bar.set(\"played\",r,\"width\");const o=v.getVideoDuration(this.player.video,this.player.template);this.player.seek(this.player.bar.get(\"played\")*o,!0),e||this.player.video.play(),this.player.container.classList.remove(\"dplayer-seeking\")};this.player.template.playedBarWrap.addEventListener(v.nameMap.dragStart,n=>{n.preventDefault(),e=this.player.video.paused,document.addEventListener(v.nameMap.dragMove,t,{passive:!1}),document.addEventListener(v.nameMap.dragEnd,i),this.player.container.addEventListener(v.nameMap.dragMove,t,{passive:!1}),this.player.container.addEventListener(v.nameMap.dragEnd,i)},{passive:!1}),this.player.template.playedBarWrap.addEventListener(v.nameMap.dragMove,e=>{e.preventDefault();const t=e,i=v.getVideoDuration(this.player.video,this.player.template);if(i){const e=v.getRelativeX(t,this.player.template.playedBarWrap);if(e<0||e>this.player.template.playedBarWrap.offsetWidth)return;const n=i*(e/this.player.template.playedBarWrap.offsetWidth);v.isMobile&&this.thumbnails&&this.thumbnails.show(),this.thumbnails&&this.thumbnails.move(e),this.player.template.playedBarTime.style.left=e-(n>=3600?27.5:22.5)+\"px\",this.player.template.playedBarTime.textContent=v.secondToTime(n),this.player.template.playedBarTime.classList.remove(\"hidden\")}},{passive:!1}),this.player.template.playedBarWrap.addEventListener(v.nameMap.dragEnd,()=>{v.isMobile&&this.thumbnails&&this.thumbnails.hide()}),v.isMobile||(this.player.template.playedBarWrap.addEventListener(\"mouseenter\",()=>{this.player.video.duration&&(this.thumbnails&&this.thumbnails.show(),this.player.template.playedBarTime.classList.remove(\"hidden\"))}),this.player.template.playedBarWrap.addEventListener(\"mouseleave\",()=>{this.player.video.duration&&(this.thumbnails&&this.thumbnails.hide(),this.player.template.playedBarTime.classList.add(\"hidden\"))}))}initFullButton(){this.player.template.browserFullButton.addEventListener(\"click\",()=>{this.player.fullScreen.toggle(\"browser\")}),this.player.template.webFullButton.addEventListener(\"click\",()=>{this.player.fullScreen.toggle(\"web\")})}initPipButton(){document.pictureInPictureEnabled?this.player.template.pipButton.addEventListener(\"click\",()=>{document.pictureInPictureElement?document.exitPictureInPicture():this.player.video.requestPictureInPicture().catch(e=>{console.error(e),this.player.notice(this.player.tran(\"PIP not supported\"),void 0,void 0,\"#FF6F6A\")})}):this.player.template.pipButton.style.display=\"none\"}initVolumeButton(){const e=e=>{const t=e,i=(v.getRelativeX(t,this.player.template.volumeBarWrap)-5.5)/35;this.player.volume(i)},t=()=>{document.removeEventListener(v.nameMap.dragEnd,t),document.removeEventListener(v.nameMap.dragMove,e),this.player.container.removeEventListener(v.nameMap.dragEnd,t),this.player.container.removeEventListener(v.nameMap.dragMove,e),this.player.template.volumeButton.classList.remove(\"dplayer-volume-active\")};this.player.template.volumeBarWrapWrap.addEventListener(\"click\",e=>{const t=e,i=(v.getRelativeX(t,this.player.template.volumeBarWrap)-5.5)/35;this.player.volume(i)}),this.player.template.volumeBarWrapWrap.addEventListener(v.nameMap.dragStart,()=>{document.addEventListener(v.nameMap.dragMove,e),document.addEventListener(v.nameMap.dragEnd,t),this.player.container.addEventListener(v.nameMap.dragMove,e),this.player.container.addEventListener(v.nameMap.dragEnd,t),this.player.template.volumeButton.classList.add(\"dplayer-volume-active\")}),this.player.template.volumeButtonIcon.addEventListener(\"click\",()=>{this.player.video.muted?(this.player.video.muted=!1,this.player.switchVolumeIcon(),this.player.bar.set(\"volume\",this.player.volume(),\"width\")):(this.player.video.muted=!0,this.player.template.volumeIcon.innerHTML=Di.volumeOff,this.player.bar.set(\"volume\",0,\"width\"))})}initSyncButton(){this.player.options.live&&this.player.template.syncButton.addEventListener(\"click\",()=>{this.player.sync()})}initScreenshotButton(){this.player.options.screenshot&&this.player.template.cameraButton.addEventListener(\"click\",()=>{const e=document.createElement(\"canvas\");e.width=this.player.video.videoWidth,e.height=this.player.video.videoHeight,e.getContext(\"2d\").drawImage(this.player.video,0,0,e.width,e.height),e.toBlob(e=>{if(null===e)return;const t=new Date,i=`Capture_${t.getFullYear()}${(\"0\"+(t.getMonth()+1)).slice(-2)}${(\"0\"+t.getDate()).slice(-2)}-${(\"0\"+t.getHours()).slice(-2)}${(\"0\"+t.getMinutes()).slice(-2)}${(\"0\"+t.getSeconds()).slice(-2)}.jpg`,n=URL.createObjectURL(e),a=document.createElement(\"a\");void 0!==a.download?(a.download=i,a.href=n,a.click(),URL.revokeObjectURL(n),this.player.events.trigger(\"screenshot\",e)):this.player.notice(\"Error: Screenshot download is not supported.\",void 0,void 0,\"#FF6F6A\")},\"image/jpeg\",1)})}initAirplayButton(){this.player.options.airplay&&(window.WebKitPlaybackTargetAvailabilityEvent?this.player.video.addEventListener(\"webkitplaybacktargetavailabilitychanged\",function(e){if(\"available\"===e.availability)this.template.airplayButton.disable=!1;else this.template.airplayButton.disable=!0;this.template.airplayButton.addEventListener(\"click\",function(){this.video.webkitShowPlaybackTargetPicker()}.bind(this))}.bind(this.player)):this.player.template.airplayButton.style.display=\"none\")}initSubtitleButton(){this.player.options.subtitle&&(this.player.events.on(\"subtitle_show\",()=>{this.player.template.subtitleButton.ariaLabel=this.player.tran(\"Hide subtitle\"),this.player.template.subtitleButtonInner.style.opacity=\"\",this.player.user.set(\"subtitle\",1)}),this.player.events.on(\"subtitle_hide\",()=>{this.player.template.subtitleButton.ariaLabel=this.player.tran(\"Show subtitle\"),this.player.template.subtitleButtonInner.style.opacity=\"0.4\",this.player.user.set(\"subtitle\",0)}),this.player.template.subtitleButton.addEventListener(\"click\",()=>{null!==this.player.subtitle&&this.player.subtitle.toggle()}))}setAutoHide(e=3e3){this.show(),window.clearTimeout(this.autoHideTimer),this.autoHideTimer=window.setTimeout(()=>{!this.player.video.played.length||this.player.paused||this.disableAutoHide||this.hide()},e)}show(){this.player.container.classList.remove(\"dplayer-hide-controller\")}hide(){this.player.container.classList.add(\"dplayer-hide-controller\"),this.player.setting.hide(),this.player.comment&&this.player.comment.hide()}isShow(){return!this.player.container.classList.contains(\"dplayer-hide-controller\")}toggle(){this.isShow()?this.hide():this.show()}destroy(){v.isMobile?this.player.container.removeEventListener(\"touchmove\",this.setAutoHideHandler):(this.player.container.removeEventListener(\"mousemove\",this.setAutoHideHandler),this.player.container.removeEventListener(\"click\",this.setAutoHideHandler)),window.clearTimeout(this.autoHideTimer)}};const Ki=class{player;loop;showDanmaku;unlimitDanmaku;currentAudio=\"primary\";resizeObserver;constructor(e){this.player=e,this.player.template.mask.addEventListener(\"click\",()=>{this.hide()}),this.player.template.settingButton.addEventListener(\"click\",()=>{this.show()});const t=()=>{const e=this.player.template.settingOriginPanel.scrollHeight;this.player.template.settingBox.style.clipPath=`inset(calc(100% - ${e}px) 0 0 round 7px)`};if(t(),this.resizeObserver=new ResizeObserver(t),this.resizeObserver.observe(this.player.template.settingOriginPanel),this.player.options.video.quality){this.player.template.quality.addEventListener(\"click\",()=>{this.player.template.settingBox.classList.add(\"dplayer-setting-box-quality\")}),this.player.template.qualityHeader.addEventListener(\"click\",()=>{this.player.template.settingBox.classList.remove(\"dplayer-setting-box-quality\")});for(let e=0;e<this.player.template.qualityItem.length;e++)this.player.template.qualityItem[e].addEventListener(\"click\",()=>{this.player.switchingQuality||this.player.switchQuality(parseInt(this.player.template.qualityItem[e].dataset.index))})}this.player.template.speed.addEventListener(\"click\",()=>{this.player.template.settingBox.classList.add(\"dplayer-setting-box-speed\")}),this.player.template.speedHeader.addEventListener(\"click\",()=>{this.player.template.settingBox.classList.remove(\"dplayer-setting-box-speed\")});for(let e=0;e<this.player.template.speedItem.length;e++)this.player.template.speedItem[e].addEventListener(\"click\",e=>{this.player.speed(parseFloat(e.target.dataset.speed))});this.player.template.audio.addEventListener(\"click\",()=>{this.player.template.settingBox.classList.add(\"dplayer-setting-box-audio\")}),this.player.template.audioHeader.addEventListener(\"click\",()=>{this.player.template.settingBox.classList.remove(\"dplayer-setting-box-audio\")});for(let e=0;e<this.player.template.audioItem.length;e++)this.player.template.audioItem[e].addEventListener(\"click\",()=>{if(this.player.plugins.mpegts&&window.mpegts&&this.player.plugins.mpegts instanceof window.mpegts.MSEPlayer){if(this.player.template.audioItem[e].dataset.audio===this.currentAudio)return;\"primary\"===this.player.template.audioItem[e].dataset.audio?(this.currentAudio=\"primary\",this.player.template.audioItem[0].classList.add(\"dplayer-setting-audio-current\"),this.player.template.audioItem[1].classList.remove(\"dplayer-setting-audio-current\"),this.player.template.audioValue.textContent=this.player.tran(\"Primary audio\"),this.player.plugins.mpegts.switchPrimaryAudio()):\"secondary\"===this.player.template.audioItem[e].dataset.audio&&(this.currentAudio=\"secondary\",this.player.template.audioItem[0].classList.remove(\"dplayer-setting-audio-current\"),this.player.template.audioItem[1].classList.add(\"dplayer-setting-audio-current\"),this.player.template.audioValue.textContent=this.player.tran(\"Secondary audio\"),this.player.plugins.mpegts.switchSecondaryAudio()),this.player.template.settingBox.classList.remove(\"dplayer-setting-box-audio\")}else if(this.player.plugins.hls&&window.Hls&&this.player.plugins.hls instanceof window.Hls){const t=this.player.plugins.hls;if(t.audioTracks.length<=1)return;if(this.player.template.audioItem[e].dataset.audio===this.currentAudio)return;\"primary\"===this.player.template.audioItem[e].dataset.audio?(this.currentAudio=\"primary\",this.player.template.audioItem[0].classList.add(\"dplayer-setting-audio-current\"),this.player.template.audioItem[1].classList.remove(\"dplayer-setting-audio-current\"),this.player.template.audioValue.textContent=this.player.tran(\"Primary audio\"),t.audioTrack=0):\"secondary\"===this.player.template.audioItem[e].dataset.audio&&(this.currentAudio=\"secondary\",this.player.template.audioItem[0].classList.remove(\"dplayer-setting-audio-current\"),this.player.template.audioItem[1].classList.add(\"dplayer-setting-audio-current\"),this.player.template.audioValue.textContent=this.player.tran(\"Secondary audio\"),t.audioTrack=1),this.player.template.settingBox.classList.remove(\"dplayer-setting-box-audio\")}});if(this.loop=1===this.player.user.get(\"loop\"),this.player.template.loopToggle.checked=this.loop,this.player.template.loop.addEventListener(\"click\",()=>{this.player.template.loopToggle.checked=!this.player.template.loopToggle.checked,this.player.template.loopToggle.checked?this.loop=!0:this.loop=!1,this.player.user.set(\"loop\",this.loop?1:0)}),this.showDanmaku=1===this.player.user.get(\"danmaku\"),this.showDanmaku||this.player.danmaku&&this.player.danmaku.hide(),this.player.template.showDanmakuToggle.checked=this.showDanmaku,this.player.template.showDanmaku.addEventListener(\"click\",()=>{this.player.template.showDanmakuToggle.checked=!this.player.template.showDanmakuToggle.checked,this.player.template.showDanmakuToggle.checked?(this.showDanmaku=!0,null!==this.player.danmaku&&this.player.danmaku.show()):(this.showDanmaku=!1,null!==this.player.danmaku&&this.player.danmaku.hide()),this.player.user.set(\"danmaku\",this.showDanmaku?1:0)}),this.unlimitDanmaku=1===this.player.user.get(\"unlimited\"),this.player.template.unlimitDanmakuToggle.checked=this.unlimitDanmaku,this.player.template.unlimitDanmaku.addEventListener(\"click\",()=>{this.player.template.unlimitDanmakuToggle.checked=!this.player.template.unlimitDanmakuToggle.checked,this.player.template.unlimitDanmakuToggle.checked?(this.unlimitDanmaku=!0,null!==this.player.danmaku&&this.player.danmaku.unlimit(!0)):(this.unlimitDanmaku=!1,null!==this.player.danmaku&&this.player.danmaku.unlimit(!1)),this.player.user.set(\"unlimited\",this.unlimitDanmaku?1:0)}),this.player.danmaku){this.player.on(\"danmaku_opacity\",e=>{this.player.bar.set(\"danmaku\",e,\"width\"),this.player.user.set(\"opacity\",e),this.player.template.danmakuOpacityValue.textContent=e.toFixed(1)}),this.player.danmaku.opacity(this.player.user.get(\"opacity\")),this.player.template.danmakuOpacityValue.textContent=this.player.user.get(\"opacity\").toFixed(1);const e=e=>{const t=e,i=this.player.template.danmakuOpacityBarWrap.clientWidth;let n=v.getRelativeX(t,this.player.template.danmakuOpacityBarWrap)/i;n=Math.max(n,0),n=Math.min(n,1),null!==this.player.danmaku&&this.player.danmaku.opacity(n)},t=()=>{document.removeEventListener(v.nameMap.dragEnd,t),document.removeEventListener(v.nameMap.dragMove,e),this.player.container.removeEventListener(v.nameMap.dragEnd,t),this.player.container.removeEventListener(v.nameMap.dragMove,e),this.player.template.danmakuOpacityBox.classList.remove(\"dplayer-setting-danmaku-active\")};this.player.template.danmakuOpacityBarWrapWrap.addEventListener(\"click\",e=>{const t=e,i=this.player.template.danmakuOpacityBarWrap.clientWidth;let n=v.getRelativeX(t,this.player.template.danmakuOpacityBarWrap)/i;n=Math.max(n,0),n=Math.min(n,1),null!==this.player.danmaku&&this.player.danmaku.opacity(n)}),this.player.template.danmakuOpacityBarWrapWrap.addEventListener(v.nameMap.dragStart,()=>{document.addEventListener(v.nameMap.dragMove,e),document.addEventListener(v.nameMap.dragEnd,t),this.player.container.addEventListener(v.nameMap.dragMove,e),this.player.container.addEventListener(v.nameMap.dragEnd,t),this.player.template.danmakuOpacityBox.classList.add(\"dplayer-setting-danmaku-active\")})}}hide(){this.player.template.container.classList.remove(\"dplayer-show-controller\"),this.player.template.settingBox.classList.remove(\"dplayer-setting-box-open\"),this.player.template.mask.classList.remove(\"dplayer-mask-show\"),window.setTimeout(()=>{this.player.template.settingBox.classList.remove(\"dplayer-setting-box-speed\"),this.player.template.settingBox.classList.remove(\"dplayer-setting-box-audio\")},300),this.player.controller.disableAutoHide=!1}show(){this.player.template.container.classList.add(\"dplayer-show-controller\"),this.player.template.settingBox.classList.add(\"dplayer-setting-box-open\"),this.player.template.mask.classList.add(\"dplayer-mask-show\"),this.player.controller.disableAutoHide=!0}destroy(){this.resizeObserver.disconnect()}};const Xi=class{player;constructor(e){this.player=e,this.player.template.mask.addEventListener(\"click\",()=>{this.hide()}),this.player.template.commentButton.addEventListener(\"click\",()=>{this.show()}),this.player.template.commentSettingButton.addEventListener(\"click\",()=>{this.toggleSetting()}),this.player.template.commentColorSettingBox.addEventListener(\"click\",()=>{if(this.player.template.commentColorSettingBox.querySelector(\"input:checked+span\")){const e=this.player.template.commentColorSettingBox.querySelector(\"input:checked\").value;this.player.template.commentSettingFill.style.fill=e,this.player.template.commentInput.style.color=e,this.player.template.commentSendFill.style.fill=e}}),this.player.template.commentInput.addEventListener(\"click\",()=>{this.hideSetting()}),this.player.template.commentInput.addEventListener(\"keydown\",e=>{13===(e||window.event).keyCode&&this.send()}),this.player.template.commentSendButton.addEventListener(\"click\",()=>{this.send()})}show(){this.player.controller.disableAutoHide=!0,this.player.template.controller.classList.add(\"dplayer-controller-comment\"),this.player.template.mask.classList.add(\"dplayer-mask-show\"),this.player.container.classList.add(\"dplayer-show-controller\"),this.player.template.commentInput.focus()}hide(){this.player.template.controller.classList.remove(\"dplayer-controller-comment\"),this.player.template.mask.classList.remove(\"dplayer-mask-show\"),this.player.container.classList.remove(\"dplayer-show-controller\"),this.player.controller.disableAutoHide=!1,this.hideSetting()}showSetting(){this.player.template.commentSettingBox.classList.add(\"dplayer-comment-setting-open\")}hideSetting(){this.player.template.commentSettingBox.classList.remove(\"dplayer-comment-setting-open\")}toggleSetting(){this.player.template.commentSettingBox.classList.contains(\"dplayer-comment-setting-open\")?this.hideSetting():this.showSetting()}send(){!0===this.player.options.danmaku?.closeCommentFormAfterSend&&this.player.template.commentInput.blur(),this.player.template.commentInput.value.replace(/^\\s+|\\s+$/g,\"\")?(null!==this.player.danmaku&&this.player.danmaku.send({text:this.player.template.commentInput.value,color:this.player.container.querySelector(\".dplayer-comment-setting-color input:checked\").value,type:this.player.container.querySelector(\".dplayer-comment-setting-type input:checked\").value,size:this.player.container.querySelector(\".dplayer-comment-setting-size input:checked\").value},()=>{!0===this.player.options.danmaku?.closeCommentFormAfterSend&&(this.hide(),this.player.controller.setAutoHide(750))},!0),this.player.template.commentInput.value=\"\"):this.player.notice(this.player.tran(\"Please input danmaku content\"),void 0,void 0,\"#FF6F6A\")}};const Yi=class{player;doHotKeyHandler;cancelFullScreenHandler;constructor(e){this.player=e,this.doHotKeyHandler=this.doHotKey.bind(this),this.cancelFullScreenHandler=this.cancelFullScreen.bind(this),this.player.options.hotkey&&document.addEventListener(\"keydown\",this.doHotKeyHandler),document.addEventListener(\"keydown\",this.cancelFullScreenHandler)}doHotKey(e){const t=document.activeElement?.tagName.toUpperCase(),i=document.activeElement?.getAttribute(\"contenteditable\");if(\"INPUT\"!==t&&\"TEXTAREA\"!==t&&\"\"!==i&&\"true\"!==i){const t=e||window.event;let i;switch(t.keyCode){case 32:(this.player.focus||this.player.options.hotkey)&&(t.preventDefault(),this.player.toggle());break;case 37:(this.player.focus||this.player.options.hotkey)&&(t.preventDefault(),t.altKey?this.player.seek(this.player.video.currentTime-60):t.shiftKey?this.player.seek(this.player.video.currentTime-30):t.ctrlKey||t.metaKey?this.player.seek(this.player.video.currentTime-15):this.player.seek(this.player.video.currentTime-5),this.player.controller.setAutoHide());break;case 39:(this.player.focus||this.player.options.hotkey)&&(t.preventDefault(),t.altKey?this.player.seek(this.player.video.currentTime+60):t.shiftKey?this.player.seek(this.player.video.currentTime+30):t.ctrlKey||t.metaKey?this.player.seek(this.player.video.currentTime+15):this.player.seek(this.player.video.currentTime+5),this.player.controller.setAutoHide());break;case 38:this.player.focus&&(t.preventDefault(),i=this.player.volume()+.1,this.player.volume(i));break;case 40:this.player.focus&&(t.preventDefault(),i=this.player.volume()-.1,this.player.volume(i));break;case 70:t.ctrlKey||t.metaKey||(t.preventDefault(),this.player.fullScreen.toggle(\"browser\"));break;case 87:t.ctrlKey||t.metaKey||(t.preventDefault(),this.player.fullScreen.toggle(\"web\"));break;case 76:this.player.options.live&&(t.preventDefault(),this.player.sync());break;case 80:this.player.options.pictureInPicture&&document.pictureInPictureEnabled&&(t.preventDefault(),this.player.template.pipButton.click());break;case 67:\"object\"==typeof this.player.options.danmaku&&this.player.options.danmaku&&(t.ctrlKey||t.metaKey||(t.preventDefault(),this.player.controller.show(),null!=this.player.comment&&this.player.comment.show()));break;case 68:\"object\"==typeof this.player.options.danmaku&&this.player.options.danmaku&&(t.ctrlKey||t.metaKey||(t.preventDefault(),this.player.template.showDanmaku.click(),this.player.template.showDanmakuToggle.checked?this.player.notice(`${this.player.tran(\"Show comment\")}`):this.player.notice(`${this.player.tran(\"Hide comment\")}`)));break;case 83:this.player.options.subtitle&&(t.ctrlKey||t.metaKey||(t.preventDefault(),null!==this.player.subtitle&&(this.player.subtitle.container.classList.contains(\"dplayer-subtitle-hide\")?this.player.notice(`${this.player.tran(\"Show subtitle\")}`):this.player.notice(`${this.player.tran(\"Hide subtitle\")}`),this.player.subtitle.toggle())))}}}cancelFullScreen(e){if(27===(e||window.event).keyCode)this.player.fullScreen.isFullScreen(\"web\")&&this.player.fullScreen.cancel(\"web\")}destroy(){this.player.options.hotkey&&document.removeEventListener(\"keydown\",this.doHotKeyHandler),document.removeEventListener(\"keydown\",this.cancelFullScreenHandler)}};const $i=class{contextmenuHandler;player;shown;constructor(e){this.player=e,this.shown=!1,Array.prototype.slice.call(this.player.template.menuItem).forEach((e,t)=>{this.player.options.contextmenu[t].click&&e.addEventListener(\"click\",()=>{const e=this.player.options.contextmenu[t];e.click&&e.click(this.player),this.hide()})}),this.contextmenuHandler=e=>{const t=e||window.event;if(t.preventDefault(),this.shown)return void this.hide();const i=this.player.container.getBoundingClientRect();this.show(t.clientX-i.left,t.clientY-i.top),this.player.template.mask.addEventListener(\"click\",()=>{this.hide()})},this.player.container.addEventListener(\"contextmenu\",this.contextmenuHandler)}show(e,t){this.player.template.menu.classList.add(\"dplayer-menu-show\");const i=this.player.container.getBoundingClientRect();e+this.player.template.menu.offsetWidth>=i.width?(this.player.template.menu.style.right=i.width-e+\"px\",this.player.template.menu.style.left=\"initial\"):(this.player.template.menu.style.left=e+\"px\",this.player.template.menu.style.right=\"initial\"),t+this.player.template.menu.offsetHeight>=i.height?(this.player.template.menu.style.bottom=i.height-t+\"px\",this.player.template.menu.style.top=\"initial\"):(this.player.template.menu.style.top=t+\"px\",this.player.template.menu.style.bottom=\"initial\"),this.player.template.mask.classList.add(\"dplayer-mask-show\"),this.shown=!0,this.player.events.trigger(\"contextmenu_show\")}hide(){this.player.template.mask.classList.remove(\"dplayer-mask-show\"),this.player.template.menu.classList.remove(\"dplayer-menu-show\"),this.shown=!1,this.player.events.trigger(\"contextmenu_hide\")}destroy(){this.player.container.removeEventListener(\"contextmenu\",this.contextmenuHandler)}};const Qi=class{player;container;template;video;beginTime=0;constructor(e){this.player=e,this.container=e.template.infoPanel,this.template=e.template,this.video=e.video,this.template.infoPanelClose.addEventListener(\"click\",()=>{this.hide()})}show(){this.beginTime=Date.now(),this.update(),this.player.timer.enable(\"info\"),this.player.timer.enable(\"fps\"),this.container.classList.remove(\"dplayer-info-panel-hide\")}hide(){this.player.timer.disable(\"info\"),this.player.timer.disable(\"fps\"),this.container.classList.add(\"dplayer-info-panel-hide\")}toggle(){this.container.classList.contains(\"dplayer-info-panel-hide\")?this.show():this.hide()}update(){if(this.template.infoVersion.textContent=\"v1.32.7 19d0c63\",this.template.infoType.textContent=this.player.type,this.template.infoUrl.textContent=this.player.options.video.url??\"N/A\",this.template.infoResolution.textContent=`${this.player.video.videoWidth} x ${this.player.video.videoHeight}`,this.template.infoDuration.textContent=`${this.player.video.duration}`,null!=this.player.video.getVideoPlaybackQuality){const e=this.player.video.getVideoPlaybackQuality();this.template.infoDroppedFrames.textContent=`${e.droppedVideoFrames} / ${e.totalVideoFrames}`}else if(null!=this.player.video.webkitDecodedFrameCount){const e=this.player.video.webkitDecodedFrameCount,t=this.player.video.webkitDroppedFrameCount;this.template.infoDroppedFrames.textContent=`${t} / ${e}`}else this.template.infoDroppedFrames.textContent=\"N/A\";if(this.player.video.buffered.length>0){const e=this.player.video.buffered.length,t=this.player.video.buffered.end(e-1)-this.player.video.currentTime;this.template.infoBufferRemain.textContent=`${t.toFixed(3)} s`}else this.template.infoBufferRemain.textContent=\"N/A\";if(\"mpegts\"===this.player.type||\"flv\"===this.player.type){const e=this.player.plugins.mpegts||this.player.plugins.flvjs;if(e){const t=e.mediaInfo,i=e.statisticsInfo;this.template.infoMimeType.textContent=t.mimeType??\"N/A\",this.template.infoVideoFPS.textContent=`${t.fps?.toFixed(3)??\"N/A\"}`,null!=i.speed?this.template.infoDownloadSpeed.textContent=`${i.speed.toFixed(3)} KB/s`:this.template.infoDownloadSpeed.textContent=\"N/A\"}}else this.template.infoMimeType.textContent=\"N/A\",this.template.infoVideoFPS.textContent=\"N/A\",this.template.infoDownloadSpeed.textContent=\"N/A\"}fps(e){this.template.infoPageFPS.textContent=`${e.toFixed(1)}`}};var Zi=i(194),en=i.n(Zi);let tn=0;const nn=[];const an=class{bar;bezel;comment=null;contextmenu;controller;danmaku=null;events;fullScreen;hotkey;infoPanel;setting;subtitle=null;template;timer;user;container;containerClickFun;docClickFun;focus=!1;narrow=!1;noticeTime=null;options;paused=!1;plugins;prevVideoCurrentTime=0;prevVideo=null;quality=null;qualityIndex=null;switchingQuality=!1;resizeObserver;tran;type=\"auto\";video;constructor(e){this.options=(e=>{const t={container:e.container||document.querySelector(\".dplayer\")||void 0,live:!1,liveSyncMinBufferSize:.8,syncWhenPlayingLive:!0,autoplay:!1,theme:\"#b7daff\",loop:!1,lang:navigator.language.toLowerCase(),screenshot:!1,pictureInPicture:!0,airplay:!0,hotkey:!0,preload:\"metadata\",crossOrigin:null,volume:1,playbackSpeed:[.25,.5,.75,1,1.25,1.5,1.75,2],apiBackend:jt,video:{},contextmenu:[],mutex:!0,pluginOptions:{}};for(const i in t)Object.prototype.hasOwnProperty.call(t,i)&&!Object.prototype.hasOwnProperty.call(e,i)&&(e[i]=t[i]);return e.video&&(!e.video.type&&(e.video.type=\"auto\"),e.video.thumbnails&&(\"string\"==typeof e.video.thumbnails&&(e.video.thumbnails={url:e.video.thumbnails}),!e.video.thumbnails.width&&(e.video.thumbnails.width=160),!e.video.thumbnails.columnCount&&(e.video.thumbnails.columnCount=100),e.video.thumbnails.interval?delete e.video.thumbnails.totalCount:e.video.thumbnails.totalCount||(e.video.thumbnails.totalCount=100))),\"object\"==typeof e.danmaku&&e.danmaku&&(!e.danmaku.user&&(e.danmaku.user=\"DPlayer\"),!e.danmaku.speedRate&&(e.danmaku.speedRate=1),!e.danmaku.fontSize&&(e.danmaku.fontSize=35),!1!==e.danmaku.closeCommentFormAfterSend&&(e.danmaku.closeCommentFormAfterSend=!0)),e.subtitle&&(!e.subtitle.type&&(e.subtitle.type=\"webvtt\"),!e.subtitle.fontSize&&(e.subtitle.fontSize=\"20px\"),!e.subtitle.bottom&&(e.subtitle.bottom=\"40px\"),!e.subtitle.color&&(e.subtitle.color=\"#fff\")),e.video.quality&&(\"string\"==typeof e.video.defaultQuality&&(e.video.quality.forEach((t,i)=>{e.video.defaultQuality===t.name&&(e.video.defaultQuality=i)}),\"string\"==typeof e.video.defaultQuality&&(e.video.defaultQuality=0)),void 0===e.video.defaultQuality&&(e.video.defaultQuality=0),e.video.type=e.video.quality[e.video.defaultQuality].type,e.video.url=e.video.quality[e.video.defaultQuality].url),e.lang&&(e.lang=e.lang.toLowerCase()),e.contextmenu=e.contextmenu.concat([{text:\"Video info\",click:e=>{e.infoPanel.toggle()}},{text:\"DPlayer v1.32.7\",link:\"https://github.com/tsukumijima/DPlayer\"}]),{container:e.container,live:e.live,liveSyncMinBufferSize:e.liveSyncMinBufferSize,syncWhenPlayingLive:e.syncWhenPlayingLive,autoplay:e.autoplay,theme:e.theme,loop:e.loop,lang:e.lang,screenshot:e.screenshot,pictureInPicture:e.pictureInPicture,airplay:e.airplay,hotkey:e.hotkey,preload:e.preload,crossOrigin:e.crossOrigin,volume:e.volume,playbackSpeed:e.playbackSpeed,logo:e.logo,apiBackend:e.apiBackend,video:e.video,subtitle:e.subtitle,danmaku:e.danmaku,contextmenu:e.contextmenu,highlight:e.highlight,mutex:e.mutex,pluginOptions:e.pluginOptions}})({preload:\"webtorrent\"===e.video.type?\"none\":\"metadata\",...e}),this.options.video.quality&&(this.qualityIndex=this.options.video.defaultQuality,this.quality=this.options.video.quality[this.options.video.defaultQuality]),this.tran=new Ht(this.options.lang).tran,this.events=new Gi,this.user=new ji(this),this.container=this.options.container,this.container.classList.add(\"dplayer\"),this.options.live?this.container.classList.add(\"dplayer-live\"):this.container.classList.remove(\"dplayer-live\"),v.isMobile&&this.container.classList.add(\"dplayer-mobile\"),this.narrow=this.container.offsetWidth<=500,this.narrow&&this.container.classList.add(\"dplayer-narrow\"),this.resizeObserver=new ResizeObserver(e=>{for(const t of e)t.target===this.container&&(this.narrow=this.container.offsetWidth<=500,this.narrow?this.container.classList.add(\"dplayer-narrow\"):this.container.classList.remove(\"dplayer-narrow\"));this.resize()}),this.resizeObserver.observe(this.container),this.template=new Pi({container:this.container,options:this.options,index:tn,tran:this.tran}),this.video=this.template.video,this.bar=new Hi(this.template),this.bezel=new Wi(this.template.bezel),this.fullScreen=new qi(this),this.controller=new Vi(this),this.initDanmaku(this.options.danmaku,this.options.apiBackend),this.plugins={},this.docClickFun=()=>{this.focus=!1},this.containerClickFun=()=>{this.focus=!0},document.addEventListener(\"click\",this.docClickFun,!0),this.container.addEventListener(\"click\",this.containerClickFun,!0),this.paused=!0,this.timer=new Ni(this),this.hotkey=new Yi(this),this.contextmenu=new $i(this),this.initVideo(this.video,this.quality&&this.quality.type||this.options.video.type),this.setting=new Ki(this),this.infoPanel=new Qi(this),!this.danmaku&&this.options.autoplay&&this.play(),tn++,nn.push(this)}seek(e,t=!1){e=Math.max(e,0);const i=v.getVideoDuration(this.video,this.template);i&&(e=Math.min(e,i)),t||(this.video.currentTime<e?this.notice(this.tran(\"FF progress\",(e-this.video.currentTime).toFixed(0))):this.video.currentTime>e&&this.notice(this.tran(\"REW progress\",(this.video.currentTime-e).toFixed(0)))),isFinite(e)&&(this.video.currentTime=e),this.danmaku&&this.danmaku.seek(),this.bar.set(\"played\",e/i,\"width\"),this.template.ptime.textContent=v.secondToTime(e)}sync(e=!1){if(this.options.live){const t=v.getVideoDuration(this.video,this.template)-this.options.liveSyncMinBufferSize;try{this.video.currentTime=t}catch(e){return}this.danmaku&&this.danmaku.seek(),this.template.ptime.textContent=v.secondToTime(t),e||this.notice(this.tran(\"Synchronized\"))}}play(e=!1){if(this.paused=!1,this.video.paused&&!v.isMobile&&this.bezel.switch(Di.play),this.template.playIcon.innerHTML=Di.pause,this.template.mobilePlayButton.innerHTML=Di.pause,this.options.live&&this.options.syncWhenPlayingLive&&this.sync(!0),!e){const e=\"mpegts\"===this.type&&this.plugins.mpegts&&this.plugins.mpegts.play.bind(this.plugins.mpegts)||this.video.play.bind(this.video);Promise.resolve(e()).catch(()=>{this.pause()}).then(()=>{})}if(this.timer.enable(\"loading\"),this.container.classList.remove(\"dplayer-paused\"),this.container.classList.add(\"dplayer-playing\"),this.danmaku&&this.danmaku.play(),this.options.mutex)for(let e=0;e<nn.length;e++)this!==nn[e]&&nn[e].pause()}pause(e=!1){this.paused=!0,this.container.classList.remove(\"dplayer-loading\"),this.video.paused||v.isMobile||this.bezel.switch(Di.pause),this.template.playIcon.innerHTML=Di.play,this.template.mobilePlayButton.innerHTML=Di.play,e||this.video.pause(),this.timer.disable(\"loading\"),this.container.classList.remove(\"dplayer-playing\"),this.container.classList.add(\"dplayer-paused\"),this.danmaku&&this.danmaku.pause()}switchVolumeIcon(){this.volume()>=.95?this.template.volumeIcon.innerHTML=Di.volumeUp:this.volume()>0?this.template.volumeIcon.innerHTML=Di.volumeDown:this.template.volumeIcon.innerHTML=Di.volumeOff}volume(e=NaN,t=!1,i=!1){if(\"string\"==typeof e&&(e=parseFloat(e)),!isNaN(e)){e=Math.max(e,0),e=Math.min(e,1),this.bar.set(\"volume\",e,\"width\");const n=`${(100*e).toFixed(0)}%`;this.template.volumeBarWrapWrap.ariaLabel=n,t||this.user.set(\"volume\",e),i||this.notice(`${this.tran(\"Volume\")} ${(100*e).toFixed(0)}%`),this.video.volume=e,this.video.muted&&(this.video.muted=!1),this.switchVolumeIcon()}return this.video.volume}muted(e){return\"boolean\"==typeof e&&(e?(this.video.muted=!0,this.template.volumeIcon.innerHTML=Di.volumeOff,this.bar.set(\"volume\",0,\"width\")):(this.video.muted=!1,this.switchVolumeIcon(),this.bar.set(\"volume\",this.volume(),\"width\"))),this.video.muted}toggle(){this.video.paused?this.play():this.pause()}on(e,t,i=!1){this.events.on(e,t,i)}off(e,t){this.events.off(e,t)}switchVideo(e,t,i=!1,n=jt){this.pause();const a=this.video.currentTime,r=this.video.playbackRate;this.video.poster=e.pic?e.pic:\"\",this.video.src=e.url,this.initMSE(this.video,e.type||\"auto\"),t&&(this.danmaku?(i||(this.bar.set(\"played\",0,\"width\"),this.bar.set(\"loaded\",0,\"width\"),this.template.ptime.textContent=\"00:00\"),this.template.danmaku.innerHTML=\"\",this.danmaku.options.apiBackend=n,\"object\"==typeof t?this.danmaku.reload({id:t.id,address:t.api,token:t.token,maximum:t.maximum,addition:t.addition,user:t.user}):this.danmaku.reload({})):this.initDanmaku(t,n)),i&&!this.options.live&&(0!==a&&this.seek(a),1!==r&&this.speed(r))}initDanmaku(e,t=jt){e?(this.container.classList.remove(\"dplayer-no-danmaku\"),this.template.danmakuLoading.style.display=\"block\",this.danmaku=new zi({player:this,container:this.template.danmaku,opacity:this.user.get(\"opacity\"),callback:()=>{setTimeout(()=>{this.template.danmakuLoading.style.display=\"none\",this.options.autoplay&&this.play()},0)},error:e=>{this.notice(e,void 0,void 0,\"#FF6F6A\")},apiBackend:t,borderColor:this.options.theme,fontSize:\"boolean\"==typeof e?24:e.fontSize||24,time:()=>this.video.currentTime,unlimited:this.user.get(\"unlimited\"),speedRate:\"boolean\"==typeof e?1:e.speedRate||1,api:\"boolean\"==typeof e?{}:{id:e.id,address:e.api,token:e.token,maximum:e.maximum,addition:e.addition,user:e.user},events:this.events,tran:e=>this.tran(e)}),this.comment=new Xi(this)):this.container.classList.add(\"dplayer-no-danmaku\")}initMSE(e,t){if(this.type=t,this.options.video.customType&&this.options.video.customType[t])\"[object Function]\"===Object.prototype.toString.call(this.options.video.customType[t])?this.options.video.customType[t](this.video,this):console.error(`Illegal customType: ${t}`);else switch(\"auto\"===this.type&&(/m3u8(#|\\?|$)/i.exec(e.src)?this.type=\"hls\":/.ts(#|\\?|$)/i.exec(e.src)?this.type=\"mpegts\":/.flv(#|\\?|$)/i.exec(e.src)?this.type=\"flv\":/.mpd(#|\\?|$)/i.exec(e.src)?this.type=\"dash\":this.type=\"normal\"),\"mpegts\"!==this.type&&this.container.classList.add(\"dplayer-no-audio-switching\"),this.type){case\"hls\":if(window.Hls)if(window.Hls.isSupported()){this.plugins.hls&&(this.plugins.aribb24Caption&&(this.plugins.aribb24Caption.dispose(),delete this.plugins.aribb24Caption),this.plugins.aribb24Superimpose&&(this.plugins.aribb24Superimpose.dispose(),delete this.plugins.aribb24Superimpose),this.plugins.hls.destroy(),delete this.plugins.hls);const t=this.options.pluginOptions.hls,i=new window.Hls(t);if(this.plugins.hls=i,i.loadSource(e.src),i.attachMedia(e),i.on(window.Hls.Events.AUDIO_TRACKS_UPDATED,()=>{i.audioTracks.length>=2?this.container.classList.remove(\"dplayer-no-audio-switching\"):this.container.classList.add(\"dplayer-no-audio-switching\")}),this.events.on(\"destroy\",()=>{this.plugins.aribb24Caption&&(this.plugins.aribb24Caption.dispose(),delete this.plugins.aribb24Caption),this.plugins.aribb24Superimpose&&(this.plugins.aribb24Superimpose.dispose(),delete this.plugins.aribb24Superimpose),i.destroy(),delete this.plugins.hls}),this.options.subtitle&&\"aribb24\"===this.options.subtitle.type){void 0===this.options.pluginOptions.aribb24&&(this.options.pluginOptions.aribb24={}),this.options.pluginOptions.aribb24.enableAutoInBandMetadataTextTrackDetection=!1;const t=this.options.pluginOptions.aribb24,n=this.plugins.aribb24Caption=new m.CanvasRenderer({...t,data_identifier:128});if(n.attachMedia(e),n.show(),!0!==this.options.pluginOptions.aribb24.disableSuperimposeRenderer){const i=this.plugins.aribb24Superimpose=new m.CanvasRenderer({...t,data_identifier:129});i.attachMedia(e),i.show()}i.on(window.Hls.Events.FRAG_PARSING_METADATA,(e,t)=>{for(const e of t.samples)this.plugins.aribb24Caption&&this.plugins.aribb24Caption.pushID3v2Data(e.pts,e.data),this.plugins.aribb24Superimpose&&this.plugins.aribb24Superimpose.pushID3v2Data(e.pts,e.data)})}}else if(e.canPlayType(\"application/x-mpegURL\")||e.canPlayType(\"application/vnd.apple.mpegURL\")){if(this.plugins.aribb24Caption&&(this.plugins.aribb24Caption.dispose(),delete this.plugins.aribb24Caption),this.plugins.aribb24Superimpose&&(this.plugins.aribb24Superimpose.dispose(),delete this.plugins.aribb24Superimpose),this.events.on(\"destroy\",()=>{this.plugins.aribb24Caption&&(this.plugins.aribb24Caption.dispose(),delete this.plugins.aribb24Caption),this.plugins.aribb24Superimpose&&(this.plugins.aribb24Superimpose.dispose(),delete this.plugins.aribb24Superimpose)}),this.options.subtitle&&\"aribb24\"===this.options.subtitle.type){void 0===this.options.pluginOptions.aribb24&&(this.options.pluginOptions.aribb24={}),this.options.pluginOptions.aribb24.enableAutoInBandMetadataTextTrackDetection=!0;const t=this.options.pluginOptions.aribb24,i=this.plugins.aribb24Caption=new m.CanvasRenderer({...t,data_identifier:128});if(i.attachMedia(e),i.show(),!0!==this.options.pluginOptions.aribb24.disableSuperimposeRenderer){const i=this.plugins.aribb24Superimpose=new m.CanvasRenderer({...t,data_identifier:129});i.attachMedia(e),i.show()}}}else this.notice(\"Error: HLS is not supported.\",void 0,void 0,\"#FF6F6A\");else this.notice(\"Error: Can't find hls.js.\",void 0,void 0,\"#FF6F6A\");break;case\"mpegts\":if(window.mpegts)if(window.mpegts.isSupported()){this.plugins.mpegts&&(this.plugins.aribb24Caption&&(this.plugins.aribb24Caption.dispose(),delete this.plugins.aribb24Caption),this.plugins.aribb24Superimpose&&(this.plugins.aribb24Superimpose.dispose(),delete this.plugins.aribb24Superimpose),this.plugins.mpegts.unload(),this.plugins.mpegts.detachMediaElement(),this.plugins.mpegts.destroy(),delete this.plugins.mpegts),void 0===this.options.pluginOptions.mpegts&&(this.options.pluginOptions.mpegts={});const t=window.mpegts.createPlayer(Object.assign(this.options.pluginOptions.mpegts.mediaDataSource||{},{type:\"mpegts\",isLive:this.options.live,url:e.src}),this.options.pluginOptions.mpegts.config);if(this.plugins.mpegts=t,t.attachMediaElement(e),t.load(),this.events.on(\"destroy\",()=>{this.plugins.aribb24Caption&&(this.plugins.aribb24Caption.dispose(),delete this.plugins.aribb24Caption),this.plugins.aribb24Superimpose&&(this.plugins.aribb24Superimpose.dispose(),delete this.plugins.aribb24Superimpose),t.unload(),t.detachMediaElement(),t.destroy(),delete this.plugins.mpegts}),this.options.subtitle&&\"aribb24\"===this.options.subtitle.type){void 0===this.options.pluginOptions.aribb24&&(this.options.pluginOptions.aribb24={}),this.options.pluginOptions.aribb24.enableAutoInBandMetadataTextTrackDetection=!1;const i=this.options.pluginOptions.aribb24,n=this.plugins.aribb24Caption=new m.CanvasRenderer({...i,data_identifier:128});if(n.attachMedia(e),n.show(),!0!==this.options.pluginOptions.aribb24.disableSuperimposeRenderer){const t=this.plugins.aribb24Superimpose=new m.CanvasRenderer({...i,data_identifier:129});t.attachMedia(e),t.show()}t.on(window.mpegts.Events.TIMED_ID3_METADATA_ARRIVED,e=>{this.plugins.aribb24Caption&&this.plugins.aribb24Caption.pushID3v2Data(e.pts/1e3,e.data),this.plugins.aribb24Superimpose&&this.plugins.aribb24Superimpose.pushID3v2Data(e.pts/1e3,e.data)})}}else this.notice(\"Error: mpegts.js is not supported.\",void 0,void 0,\"#FF6F6A\");else this.notice(\"Error: Can't find mpegts.js.\",void 0,void 0,\"#FF6F6A\");break;case\"flv\":if(window.flvjs)if(window.flvjs.isSupported()){void 0===this.options.pluginOptions.flv&&(this.options.pluginOptions.flv={});const t=window.flvjs.createPlayer(Object.assign(this.options.pluginOptions.flv.mediaDataSource||{},{type:\"flv\",url:e.src}),this.options.pluginOptions.flv.config);this.plugins.flvjs=t,t.attachMediaElement(e),t.load(),this.events.on(\"destroy\",()=>{t.unload(),t.detachMediaElement(),t.destroy(),delete this.plugins.flvjs})}else this.notice(\"Error: flv.js is not supported.\",void 0,void 0,\"#FF6F6A\");else this.notice(\"Error: Can't find flv.js.\",void 0,void 0,\"#FF6F6A\");break;case\"dash\":if(window.dashjs){const t=window.dashjs.MediaPlayer().create();t.initialize(e,e.src,!1);const i=this.options.pluginOptions.dash;t.updateSettings(i??{}),this.plugins.dash=t,this.events.on(\"destroy\",()=>{t.reset(),delete this.plugins.dash})}else this.notice(\"Error: Can't find dash.js.\",void 0,void 0,\"#FF6F6A\");break;case\"webtorrent\":if(window.WebTorrent)if(window.WebTorrent.WEBRTC_SUPPORT){this.container.classList.add(\"dplayer-loading\");const t=this.options.pluginOptions.webtorrent,i=new window.WebTorrent(t);this.plugins.webtorrent=i;const n=e.src;e.src=\"\",e.preload=\"metadata\",e.addEventListener(\"durationchange\",()=>this.container.classList.remove(\"dplayer-loading\"),{once:!0}),i.add(n,e=>{const t=e.files.find(e=>e.name.endsWith(\".mp4\"));t&&t.renderTo(this.video,{autoplay:this.options.autoplay,controls:!1})}),this.events.on(\"destroy\",()=>{i.remove(n),i.destroy(),delete this.plugins.webtorrent})}else this.notice(\"Error: Webtorrent is not supported.\",void 0,void 0,\"#FF6F6A\");else this.notice(\"Error: Can't find Webtorrent.\",void 0,void 0,\"#FF6F6A\")}}initVideo(e,t){this.initMSE(e,t),this.on(\"durationchange\",()=>{1!==e.duration&&e.duration!==1/0&&(this.template.dtime.textContent=v.secondToTime(e.duration))}),this.on(\"progress\",()=>{const t=v.getVideoDuration(this.video,this.template),i=e.buffered.length?e.buffered.end(e.buffered.length-1)/t:0;this.bar.set(\"loaded\",i,\"width\")}),this.on(\"error\",()=>{this.video.error&&(this.switchingQuality&&(null!==this.prevVideo&&this.template.videoWrapAspect.removeChild(this.prevVideo),this.video.classList.add(\"dplayer-video-current\"),this.prevVideo=null,this.switchingQuality=!1,this.events.trigger(\"quality_end\")),this.tran&&this.notice&&\"webtorrent\"!==this.type&&this.notice(this.tran(\"Video load failed\"),-1,void 0,\"#FF6F6A\"),this.container.classList.remove(\"dplayer-loading\"))}),this.on(\"ended\",()=>{this.bar.set(\"played\",1,\"width\"),this.setting.loop?(this.seek(0),this.play()):this.pause(),this.danmaku&&(this.danmaku.danIndex=0)}),this.on(\"play\",()=>{this.paused&&this.play(!0)}),this.on(\"pause\",()=>{this.paused||this.pause(!0)}),this.on(\"timeupdate\",()=>{const e=v.getVideoDuration(this.video,this.template);this.bar.set(\"played\",this.video.currentTime/e,\"width\");const t=v.secondToTime(this.video.currentTime);this.template.ptime.textContent!==t&&(this.template.ptime.textContent=t)});for(let t=0;t<this.events.videoEvents.length;t++)e.addEventListener(this.events.videoEvents[t],e=>{this.events.trigger(this.events.videoEvents[t],e)});this.volume(this.user.get(\"volume\"),!0,!0);const i=this.user.get(\"speed\");i&&1!==i&&this.speed(i),this.options.subtitle&&(this.subtitle=new Ui(this.template.subtitle,this.video,this.plugins,this.options.subtitle,this.events),this.user.get(\"subtitle\")||this.subtitle.hide())}switchQuality(e){if(e=\"string\"==typeof e?parseInt(e):e,void 0===this.options.video.quality||this.qualityIndex===e||this.switchingQuality)return;this.qualityIndex=e,this.switchingQuality=!0,this.quality=this.options.video.quality[e];const t=this.video.paused;this.video.pause();const i=en()({current:!1,pic:null,screenshot:this.options.screenshot,preload:\"auto\",url:this.quality.url,subtitle:this.options.subtitle,crossOrigin:this.options.crossOrigin}),n=(new DOMParser).parseFromString(i,\"text/html\").body.firstChild;this.template.videoWrapAspect.insertBefore(n,this.template.videoWrapAspect.getElementsByTagName(\"div\")[0]),this.prevVideoCurrentTime=this.video.currentTime,this.prevVideo=this.video,this.video=n,this.initVideo(this.video,this.quality.type||this.options.video.type),this.options.live||this.seek(this.prevVideoCurrentTime),t||this.video.play(),this.notice(this.tran(\"Switching to quality\",this.quality.name),-1),this.container.classList.add(\"dplayer-loading\"),this.events.trigger(\"quality_start\",this.quality),this.template.qualityItem.forEach(t=>{t.classList.remove(\"dplayer-setting-quality-current\"),parseInt(t.dataset.index)===e&&(t.classList.add(\"dplayer-setting-quality-current\"),this.template.qualityValue.textContent=this.quality.name,this.template.settingBox.classList.remove(\"dplayer-setting-box-quality\"))}),this.on(\"canplay\",()=>{if(null!==this.prevVideo){if(!this.options.live&&this.video.currentTime!==this.prevVideoCurrentTime)return void this.seek(this.prevVideoCurrentTime);this.template.videoWrapAspect.removeChild(this.prevVideo),this.video.classList.add(\"dplayer-video-current\"),t||this.video.play(),this.prevVideo=null,this.notice(this.tran(\"Switched to quality\",this.quality.name),1e3),this.switchingQuality=!1;const e=parseFloat(this.template.settingBox.querySelector(\".dplayer-setting-speed-current\").dataset.speed);this.speed(e);if(\"secondary\"===this.template.settingBox.querySelector(\".dplayer-setting-audio-current\").dataset.audio){if(window.mpegts&&this.plugins.mpegts&&this.plugins.mpegts instanceof window.mpegts.MSEPlayer)this.plugins.mpegts.switchSecondaryAudio();else if(window.Hls&&this.plugins.hls&&this.plugins.hls instanceof window.Hls){const e=this.plugins.hls;e.audioTracks.length>=2&&(e.audioTrack=1)}}else if(window.Hls&&this.plugins.hls&&this.plugins.hls instanceof window.Hls){const e=this.plugins.hls;e.audioTracks.length>=2&&(e.audioTrack=0)}this.container.classList.remove(\"dplayer-loading\"),this.events.trigger(\"quality_end\")}})}notice(e,t=2e3,i=.8,n){this.template.notice.textContent=e,this.template.notice.style.opacity=`${i}`,this.template.notice.style.color=n&&\"\"!==n?n:\"\",this.noticeTime&&window.clearTimeout(this.noticeTime),this.events.trigger(\"notice_show\",e),t>0&&(this.noticeTime=window.setTimeout(()=>{this.hideNotice()},t))}hideNotice(){this.template.notice.style.opacity=\"0\",this.events.trigger(\"notice_hide\")}resize(){if(this.danmaku&&this.danmaku.resize(),this.plugins.aribb24Caption&&this.plugins.aribb24Caption.refresh(),this.plugins.aribb24Superimpose&&this.plugins.aribb24Superimpose.refresh(),this.controller.thumbnails){const e=this.options.video.thumbnails,t=e&&e.width||160,i=e&&e.height||Math.floor(9*t/16);this.controller.thumbnails.resize(t,i,this.template.barWrap.offsetWidth)}this.events.trigger(\"resize\")}speed(e){this.video.playbackRate=e,this.user.set(\"speed\",e),this.template.speedItem.forEach(t=>{t.classList.remove(\"dplayer-setting-speed-current\"),parseFloat(t.dataset.speed)===e&&(t.classList.add(\"dplayer-setting-speed-current\"),1===parseFloat(t.dataset.speed)?this.template.speedValue.textContent=this.tran(\"Normal\"):this.template.speedValue.textContent=`${e}`,this.template.settingBox.classList.remove(\"dplayer-setting-box-speed\"))})}destroy(e=!1){nn.splice(nn.indexOf(this),1),this.pause(),document.removeEventListener(\"click\",this.docClickFun,!0),this.container.removeEventListener(\"click\",this.containerClickFun,!0),this.fullScreen.destroy(),this.hotkey.destroy(),this.contextmenu.destroy(),this.controller.destroy(),this.timer.destroy(),this.setting.destroy(),this.resizeObserver.disconnect(),this.video.removeAttribute(\"src\"),e||(this.container.innerHTML=\"\"),this.events.trigger(\"destroy\")}static get version(){return\"1.32.7\"}};console.log(\"\\n %c DPlayer v1.32.7 19d0c63 %c http://dplayer.js.org \\n\\n\",\"color: #fadfa3; background: #030307; padding:5px 0;\",\"background: #fadfa3; padding:5px 0;\");const rn=an})(),n=n.default})());\n+/*! art-template@runtime | https://github.com/aui/art-template */var n=\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:void 0!==i.g?i.g:{},a=Object.create(n),r=/[\"&'<>]/;function o(e){return\"string\"!=typeof e&&(e=null==e?\"\":\"function\"==typeof e?o(e.call(e)):JSON.stringify(e)),e}a.$escape=function(e){return function(e){var t=\"\"+e,i=r.exec(t);if(!i)return e;var n=\"\",a=void 0,o=void 0,s=void 0;for(a=i.index,o=0;a<t.length;a++){switch(t.charCodeAt(a)){case 34:s=\"&#34;\";break;case 38:s=\"&#38;\";break;case 39:s=\"&#39;\";break;case 60:s=\"&#60;\";break;case 62:s=\"&#62;\";break;default:continue}o!==a&&(n+=t.substring(o,a)),o=a+1,n+=s}return o!==a?n+t.substring(o,a):n}(o(e))},a.$each=function(e,t){if(Array.isArray(e))for(var i=0,n=e.length;i<n;i++)t(e[i],i);else for(var a in e)t(e[a],a)},e.exports=a},880:(e,t,i)=>{\"use strict\";i.d(t,{A:()=>s});var n=i(34),a=i.n(n),r=i(122),o=i.n(r)()(a());o.push([e.id,':root{--balloon-border-radius:2px;--balloon-color:#101010f2;--balloon-text-color:#fff;--balloon-font-size:12px;--balloon-move:4px}button[aria-label][data-balloon-pos]{overflow:visible}[aria-label][data-balloon-pos]{cursor:pointer;position:relative}[aria-label][data-balloon-pos]:after{background:var(--balloon-color);border-radius:2px;border-radius:var(--balloon-border-radius);color:var(--balloon-text-color);content:attr(aria-label);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:var(--balloon-font-size);font-style:normal;font-weight:400;padding:.5em 1em;text-indent:0;text-shadow:none;white-space:nowrap}[aria-label][data-balloon-pos]:after,[aria-label][data-balloon-pos]:before{opacity:0;pointer-events:none;position:absolute;transition:all .18s ease-out .18s;z-index:10}[aria-label][data-balloon-pos]:before{border:5px solid #0000;border-top:5px solid var(--balloon-color);content:\"\";height:0;width:0}[aria-label][data-balloon-pos]:hover:after,[aria-label][data-balloon-pos]:hover:before,[aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:after,[aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:before,[aria-label][data-balloon-pos][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-visible]:before{opacity:1;pointer-events:none}[aria-label][data-balloon-pos].font-awesome:after{font-family:FontAwesome,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif}[aria-label][data-balloon-pos][data-balloon-break]:after{white-space:pre}[aria-label][data-balloon-pos][data-balloon-break][data-balloon-length]:after{white-space:pre-line;word-break:break-word}[aria-label][data-balloon-pos][data-balloon-blunt]:after,[aria-label][data-balloon-pos][data-balloon-blunt]:before{transition:none}[aria-label][data-balloon-pos][data-balloon-pos=down]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=down]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=down][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=down][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=up][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=up][data-balloon-visible]:before{transform:translate(-50%)}[aria-label][data-balloon-pos][data-balloon-pos*=-left]:after{left:0}[aria-label][data-balloon-pos][data-balloon-pos*=-left]:before{left:5px}[aria-label][data-balloon-pos][data-balloon-pos*=-right]:after{right:0}[aria-label][data-balloon-pos][data-balloon-pos*=-right]:before{right:5px}[aria-label][data-balloon-pos][data-balloon-po*=-left]:hover:after,[aria-label][data-balloon-pos][data-balloon-po*=-left]:hover:before,[aria-label][data-balloon-pos][data-balloon-po*=-left][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-po*=-left][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos*=-right]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos*=-right]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos*=-right][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos*=-right][data-balloon-visible]:before{transform:translate(0)}[aria-label][data-balloon-pos][data-balloon-pos^=up]:after,[aria-label][data-balloon-pos][data-balloon-pos^=up]:before{bottom:100%;transform:translateY(var(--balloon-move));transform-origin:top}[aria-label][data-balloon-pos][data-balloon-pos^=up]:after{margin-bottom:10px}[aria-label][data-balloon-pos][data-balloon-pos=up]:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:before{left:50%;transform:translate(-50%,var(--balloon-move))}[aria-label][data-balloon-pos][data-balloon-pos^=down]:after,[aria-label][data-balloon-pos][data-balloon-pos^=down]:before{top:100%;transform:translateY(calc(var(--balloon-move)*-1))}[aria-label][data-balloon-pos][data-balloon-pos^=down]:after{margin-top:10px}[aria-label][data-balloon-pos][data-balloon-pos^=down]:before{border:5px solid #0000;border-bottom:5px solid var(--balloon-color);height:0;width:0}[aria-label][data-balloon-pos][data-balloon-pos=down]:after,[aria-label][data-balloon-pos][data-balloon-pos=down]:before{left:50%;transform:translate(-50%,calc(var(--balloon-move)*-1))}[aria-label][data-balloon-pos][data-balloon-pos=left]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=left]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=left][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=left][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos=right]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=right]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=right][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=right][data-balloon-visible]:before{transform:translateY(-50%)}[aria-label][data-balloon-pos][data-balloon-pos=left]:after,[aria-label][data-balloon-pos][data-balloon-pos=left]:before{right:100%;top:50%;transform:translate(var(--balloon-move),-50%)}[aria-label][data-balloon-pos][data-balloon-pos=left]:after{margin-right:10px}[aria-label][data-balloon-pos][data-balloon-pos=left]:before{border:5px solid #0000;border-left:5px solid var(--balloon-color);height:0;width:0}[aria-label][data-balloon-pos][data-balloon-pos=right]:after,[aria-label][data-balloon-pos][data-balloon-pos=right]:before{left:100%;top:50%;transform:translate(calc(var(--balloon-move)*-1),-50%)}[aria-label][data-balloon-pos][data-balloon-pos=right]:after{margin-left:10px}[aria-label][data-balloon-pos][data-balloon-pos=right]:before{border:5px solid #0000;border-right:5px solid var(--balloon-color);height:0;width:0}[aria-label][data-balloon-pos][data-balloon-length]:after{white-space:normal}[aria-label][data-balloon-pos][data-balloon-length=small]:after{width:80px}[aria-label][data-balloon-pos][data-balloon-length=medium]:after{width:150px}[aria-label][data-balloon-pos][data-balloon-length=large]:after{width:260px}[aria-label][data-balloon-pos][data-balloon-length=xlarge]:after{width:380px}@media screen and (max-width:768px){[aria-label][data-balloon-pos][data-balloon-length=xlarge]:after{width:90vw}}[aria-label][data-balloon-pos][data-balloon-length=fit]:after{width:100%}',\"\",{version:3,sources:[\"webpack://./node_modules/balloon-css/balloon.css\"],names:[],mappings:\"AAAA,MACE,2BAA4B,CAC5B,yBAAuC,CACvC,yBAA0B,CAC1B,wBAAyB,CACzB,kBAAqB,CAEvB,qCACE,gBAAmB,CAErB,+BAEE,cAAe,CADf,iBACiB,CACjB,qCAUE,+BAAgC,CAChC,iBAAkB,CAElB,0CAA2C,CAD3C,+BAAgC,CAEhC,wBAAyB,CATzB,wHAAwI,CAIxI,kCAAmC,CAFnC,iBAAkB,CADlB,eAAmB,CASnB,gBAAiB,CAXjB,aAAc,CAId,gBAAiB,CASjB,kBACa,CACf,2EAlBE,SAAU,CACV,mBAAoB,CAcpB,iBAAkB,CAblB,iCAAoC,CAepC,UAWa,CAVf,sCAIE,sBAAsC,CAAtC,yCAAsC,CAItC,UAAW,CANX,QAAS,CADT,OASa,CACf,6VACE,SAAU,CACV,mBAAsB,CACxB,kDACE,oIAAuJ,CACzJ,yDACE,eAAkB,CACpB,8EACE,oBAAqB,CACrB,qBAAwB,CAC1B,mHACE,eAAkB,CAGpB,4kBACE,yBAA+B,CACjC,8DACE,MAAS,CACX,+DACE,QAAW,CACb,+DACE,OAAU,CACZ,gEACE,SAAY,CAGd,omBACE,sBAA4B,CAC9B,uHACE,WAAY,CAEZ,yCAA4C,CAD5C,oBAC8C,CAChD,2DACE,kBAAqB,CACvB,qHACE,QAAS,CACT,6CAAiD,CACnD,2HACE,QAAS,CACT,kDAAyD,CAC3D,6DACE,eAAkB,CACpB,8DAIE,sBAAyC,CAAzC,4CAAyC,CAFzC,QAAS,CADT,OAG2C,CAC7C,yHACE,QAAS,CACT,sDAA4D,CAG9D,wlBACE,0BAA+B,CACjC,yHACE,UAAW,CACX,OAAQ,CACR,6CAAiD,CACnD,4DACE,iBAAoB,CACtB,6DAIE,sBAAuC,CAAvC,0CAAuC,CAFvC,QAAS,CADT,OAGyC,CAC3C,2HACE,SAAU,CACV,OAAQ,CACR,sDAA4D,CAC9D,6DACE,gBAAmB,CACrB,8DAIE,sBAAwC,CAAxC,2CAAwC,CAFxC,QAAS,CADT,OAG0C,CAC5C,0DACE,kBAAqB,CACvB,gEACE,UAAa,CACf,iEACE,WAAc,CAChB,gEACE,WAAc,CAChB,iEACE,WAAc,CACd,oCACE,iEACE,UAAa,CAAE,CACrB,8DACE,UAAa\",sourcesContent:[':root {\\n  --balloon-border-radius: 2px;\\n  --balloon-color: rgba(16, 16, 16, 0.95);\\n  --balloon-text-color: #fff;\\n  --balloon-font-size: 12px;\\n  --balloon-move: 4px; }\\n\\nbutton[aria-label][data-balloon-pos] {\\n  overflow: visible; }\\n\\n[aria-label][data-balloon-pos] {\\n  position: relative;\\n  cursor: pointer; }\\n  [aria-label][data-balloon-pos]:after {\\n    opacity: 0;\\n    pointer-events: none;\\n    transition: all 0.18s ease-out 0.18s;\\n    text-indent: 0;\\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Open Sans\", \"Helvetica Neue\", sans-serif;\\n    font-weight: normal;\\n    font-style: normal;\\n    text-shadow: none;\\n    font-size: var(--balloon-font-size);\\n    background: var(--balloon-color);\\n    border-radius: 2px;\\n    color: var(--balloon-text-color);\\n    border-radius: var(--balloon-border-radius);\\n    content: attr(aria-label);\\n    padding: .5em 1em;\\n    position: absolute;\\n    white-space: nowrap;\\n    z-index: 10; }\\n  [aria-label][data-balloon-pos]:before {\\n    width: 0;\\n    height: 0;\\n    border: 5px solid transparent;\\n    border-top-color: var(--balloon-color);\\n    opacity: 0;\\n    pointer-events: none;\\n    transition: all 0.18s ease-out 0.18s;\\n    content: \"\";\\n    position: absolute;\\n    z-index: 10; }\\n  [aria-label][data-balloon-pos]:hover:before, [aria-label][data-balloon-pos]:hover:after, [aria-label][data-balloon-pos][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-visible]:after, [aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:before, [aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:after {\\n    opacity: 1;\\n    pointer-events: none; }\\n  [aria-label][data-balloon-pos].font-awesome:after {\\n    font-family: FontAwesome, -apple-system, BlinkMacSystemFont, \\'Segoe UI\\', Roboto, Oxygen, Ubuntu, Cantarell, \\'Open Sans\\', \\'Helvetica Neue\\', sans-serif; }\\n  [aria-label][data-balloon-pos][data-balloon-break]:after {\\n    white-space: pre; }\\n  [aria-label][data-balloon-pos][data-balloon-break][data-balloon-length]:after {\\n    white-space: pre-line;\\n    word-break: break-word; }\\n  [aria-label][data-balloon-pos][data-balloon-blunt]:before, [aria-label][data-balloon-pos][data-balloon-blunt]:after {\\n    transition: none; }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"up\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos=\"up\"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos=\"down\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos=\"down\"][data-balloon-visible]:after {\\n    transform: translate(-50%, 0); }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"up\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos=\"up\"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos=\"down\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos=\"down\"][data-balloon-visible]:before {\\n    transform: translate(-50%, 0); }\\n  [aria-label][data-balloon-pos][data-balloon-pos*=\"-left\"]:after {\\n    left: 0; }\\n  [aria-label][data-balloon-pos][data-balloon-pos*=\"-left\"]:before {\\n    left: 5px; }\\n  [aria-label][data-balloon-pos][data-balloon-pos*=\"-right\"]:after {\\n    right: 0; }\\n  [aria-label][data-balloon-pos][data-balloon-pos*=\"-right\"]:before {\\n    right: 5px; }\\n  [aria-label][data-balloon-pos][data-balloon-po*=\"-left\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-po*=\"-left\"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos*=\"-right\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos*=\"-right\"][data-balloon-visible]:after {\\n    transform: translate(0, 0); }\\n  [aria-label][data-balloon-pos][data-balloon-po*=\"-left\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-po*=\"-left\"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos*=\"-right\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos*=\"-right\"][data-balloon-visible]:before {\\n    transform: translate(0, 0); }\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\"up\"]:before, [aria-label][data-balloon-pos][data-balloon-pos^=\"up\"]:after {\\n    bottom: 100%;\\n    transform-origin: top;\\n    transform: translate(0, var(--balloon-move)); }\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\"up\"]:after {\\n    margin-bottom: 10px; }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"up\"]:before, [aria-label][data-balloon-pos][data-balloon-pos=\"up\"]:after {\\n    left: 50%;\\n    transform: translate(-50%, var(--balloon-move)); }\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\"down\"]:before, [aria-label][data-balloon-pos][data-balloon-pos^=\"down\"]:after {\\n    top: 100%;\\n    transform: translate(0, calc(var(--balloon-move) * -1)); }\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\"down\"]:after {\\n    margin-top: 10px; }\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\"down\"]:before {\\n    width: 0;\\n    height: 0;\\n    border: 5px solid transparent;\\n    border-bottom-color: var(--balloon-color); }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"down\"]:after, [aria-label][data-balloon-pos][data-balloon-pos=\"down\"]:before {\\n    left: 50%;\\n    transform: translate(-50%, calc(var(--balloon-move) * -1)); }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"left\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos=\"left\"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos=\"right\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos=\"right\"][data-balloon-visible]:after {\\n    transform: translate(0, -50%); }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"left\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos=\"left\"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos=\"right\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos=\"right\"][data-balloon-visible]:before {\\n    transform: translate(0, -50%); }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"left\"]:after, [aria-label][data-balloon-pos][data-balloon-pos=\"left\"]:before {\\n    right: 100%;\\n    top: 50%;\\n    transform: translate(var(--balloon-move), -50%); }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"left\"]:after {\\n    margin-right: 10px; }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"left\"]:before {\\n    width: 0;\\n    height: 0;\\n    border: 5px solid transparent;\\n    border-left-color: var(--balloon-color); }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"right\"]:after, [aria-label][data-balloon-pos][data-balloon-pos=\"right\"]:before {\\n    left: 100%;\\n    top: 50%;\\n    transform: translate(calc(var(--balloon-move) * -1), -50%); }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"right\"]:after {\\n    margin-left: 10px; }\\n  [aria-label][data-balloon-pos][data-balloon-pos=\"right\"]:before {\\n    width: 0;\\n    height: 0;\\n    border: 5px solid transparent;\\n    border-right-color: var(--balloon-color); }\\n  [aria-label][data-balloon-pos][data-balloon-length]:after {\\n    white-space: normal; }\\n  [aria-label][data-balloon-pos][data-balloon-length=\"small\"]:after {\\n    width: 80px; }\\n  [aria-label][data-balloon-pos][data-balloon-length=\"medium\"]:after {\\n    width: 150px; }\\n  [aria-label][data-balloon-pos][data-balloon-length=\"large\"]:after {\\n    width: 260px; }\\n  [aria-label][data-balloon-pos][data-balloon-length=\"xlarge\"]:after {\\n    width: 380px; }\\n    @media screen and (max-width: 768px) {\\n      [aria-label][data-balloon-pos][data-balloon-length=\"xlarge\"]:after {\\n        width: 90vw; } }\\n  [aria-label][data-balloon-pos][data-balloon-length=\"fit\"]:after {\\n    width: 100%; }\\n'],sourceRoot:\"\"}]);const s=o},894:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 32 28\"><path d=\"M28.633 17.104c0.035 0.21 0.026 0.463-0.026 0.76s-0.14 0.598-0.262 0.904c-0.122 0.306-0.271 0.581-0.445 0.825s-0.367 0.419-0.576 0.524c-0.209 0.105-0.393 0.157-0.55 0.157s-0.332-0.035-0.524-0.105c-0.175-0.052-0.393-0.1-0.655-0.144s-0.528-0.052-0.799-0.026c-0.271 0.026-0.541 0.083-0.812 0.17s-0.502 0.236-0.694 0.445c-0.419 0.437-0.664 0.934-0.734 1.493s0.009 1.092 0.236 1.598c0.175 0.349 0.148 0.699-0.079 1.048-0.105 0.14-0.271 0.284-0.498 0.432s-0.476 0.284-0.747 0.406-0.555 0.218-0.851 0.288c-0.297 0.070-0.559 0.105-0.786 0.105-0.157 0-0.306-0.061-0.445-0.183s-0.236-0.253-0.288-0.393h-0.026c-0.192-0.541-0.52-1.009-0.982-1.402s-1-0.589-1.611-0.589c-0.594 0-1.131 0.197-1.611 0.589s-0.816 0.851-1.009 1.375c-0.087 0.21-0.218 0.362-0.393 0.458s-0.367 0.144-0.576 0.144c-0.244 0-0.52-0.044-0.825-0.131s-0.611-0.197-0.917-0.327c-0.306-0.131-0.581-0.284-0.825-0.458s-0.428-0.349-0.55-0.524c-0.087-0.122-0.135-0.266-0.144-0.432s0.057-0.397 0.197-0.694c0.192-0.402 0.266-0.86 0.223-1.375s-0.266-0.991-0.668-1.428c-0.244-0.262-0.541-0.432-0.891-0.511s-0.681-0.109-0.995-0.092c-0.367 0.017-0.742 0.087-1.127 0.21-0.244 0.070-0.489 0.052-0.734-0.052-0.192-0.070-0.371-0.231-0.537-0.485s-0.314-0.533-0.445-0.838c-0.131-0.306-0.231-0.62-0.301-0.943s-0.087-0.59-0.052-0.799c0.052-0.384 0.227-0.629 0.524-0.734 0.524-0.21 0.995-0.555 1.415-1.035s0.629-1.017 0.629-1.611c0-0.611-0.21-1.144-0.629-1.598s-0.891-0.786-1.415-0.996c-0.157-0.052-0.288-0.179-0.393-0.38s-0.157-0.406-0.157-0.616c0-0.227 0.035-0.48 0.105-0.76s0.162-0.55 0.275-0.812 0.244-0.502 0.393-0.72c0.148-0.218 0.31-0.38 0.485-0.485 0.14-0.087 0.275-0.122 0.406-0.105s0.275 0.052 0.432 0.105c0.524 0.21 1.070 0.275 1.637 0.197s1.070-0.327 1.506-0.747c0.21-0.209 0.362-0.467 0.458-0.773s0.157-0.607 0.183-0.904c0.026-0.297 0.026-0.568 0-0.812s-0.048-0.419-0.065-0.524c-0.035-0.105-0.066-0.227-0.092-0.367s-0.013-0.262 0.039-0.367c0.105-0.244 0.293-0.458 0.563-0.642s0.563-0.336 0.878-0.458c0.314-0.122 0.62-0.214 0.917-0.275s0.533-0.092 0.707-0.092c0.227 0 0.406 0.074 0.537 0.223s0.223 0.301 0.275 0.458c0.192 0.471 0.507 0.886 0.943 1.244s0.952 0.537 1.546 0.537c0.611 0 1.153-0.17 1.624-0.511s0.803-0.773 0.996-1.297c0.070-0.14 0.179-0.284 0.327-0.432s0.301-0.223 0.458-0.223c0.244 0 0.511 0.035 0.799 0.105s0.572 0.166 0.851 0.288c0.279 0.122 0.537 0.279 0.773 0.472s0.423 0.402 0.563 0.629c0.087 0.14 0.113 0.293 0.079 0.458s-0.070 0.284-0.105 0.354c-0.227 0.506-0.297 1.039-0.21 1.598s0.341 1.048 0.76 1.467c0.419 0.419 0.934 0.651 1.546 0.694s1.179-0.057 1.703-0.301c0.14-0.087 0.31-0.122 0.511-0.105s0.371 0.096 0.511 0.236c0.262 0.244 0.493 0.616 0.694 1.113s0.336 1 0.406 1.506c0.035 0.297-0.013 0.528-0.144 0.694s-0.266 0.275-0.406 0.327c-0.542 0.192-1.004 0.528-1.388 1.009s-0.576 1.026-0.576 1.637c0 0.594 0.162 1.113 0.485 1.559s0.747 0.764 1.27 0.956c0.122 0.070 0.227 0.14 0.314 0.21 0.192 0.157 0.323 0.358 0.393 0.602v0zM16.451 19.462c0.786 0 1.528-0.149 2.227-0.445s1.305-0.707 1.821-1.231c0.515-0.524 0.921-1.131 1.218-1.821s0.445-1.428 0.445-2.214c0-0.786-0.148-1.524-0.445-2.214s-0.703-1.292-1.218-1.808c-0.515-0.515-1.122-0.921-1.821-1.218s-1.441-0.445-2.227-0.445c-0.786 0-1.524 0.148-2.214 0.445s-1.292 0.703-1.808 1.218c-0.515 0.515-0.921 1.118-1.218 1.808s-0.445 1.428-0.445 2.214c0 0.786 0.149 1.524 0.445 2.214s0.703 1.297 1.218 1.821c0.515 0.524 1.118 0.934 1.808 1.231s1.428 0.445 2.214 0.445v0z\"></path></svg>'},928:e=>{e.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 32 33\"><path d=\"M24.965 24.38h-18.132c-1.366 0-2.478-1.113-2.478-2.478v-11.806c0-1.364 1.111-2.478 2.478-2.478h18.132c1.366 0 2.478 1.113 2.478 2.478v11.806c0 1.364-1.11 2.478-2.478 2.478zM6.833 10.097v11.806h18.134l-0.002-11.806h-18.132zM2.478 28.928h5.952c0.684 0 1.238-0.554 1.238-1.239 0-0.684-0.554-1.238-1.238-1.238h-5.952v-5.802c0-0.684-0.554-1.239-1.238-1.239s-1.239 0.556-1.239 1.239v5.802c0 1.365 1.111 2.478 2.478 2.478zM30.761 19.412c-0.684 0-1.238 0.554-1.238 1.238v5.801h-5.951c-0.686 0-1.239 0.554-1.239 1.238 0 0.686 0.554 1.239 1.239 1.239h5.951c1.366 0 2.478-1.111 2.478-2.478v-5.801c0-0.683-0.554-1.238-1.239-1.238zM0 5.55v5.802c0 0.683 0.554 1.238 1.238 1.238s1.238-0.555 1.238-1.238v-5.802h5.952c0.684 0 1.238-0.554 1.238-1.238s-0.554-1.238-1.238-1.238h-5.951c-1.366-0.001-2.478 1.111-2.478 2.476zM32 11.35v-5.801c0-1.365-1.11-2.478-2.478-2.478h-5.951c-0.686 0-1.239 0.554-1.239 1.238s0.554 1.238 1.239 1.238h5.951v5.801c0 0.683 0.554 1.237 1.238 1.237 0.686 0.002 1.239-0.553 1.239-1.236z\"></path></svg>'}},t={};function i(n){var a=t[n];if(void 0!==a)return a.exports;var r=t[n]={id:n,exports:{}};return e[n].call(r.exports,r,r.exports,i),r.exports}i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.g=function(){if(\"object\"==typeof globalThis)return globalThis;try{return this||new Function(\"return this\")()}catch(e){if(\"object\"==typeof window)return window}}(),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},i.nc=void 0;var n={};return(()=>{\"use strict\";i.d(n,{default:()=>rn});var e={};i.r(e),i.d(e,{hasBrowserEnv:()=>Ie,hasStandardBrowserEnv:()=>Re,hasStandardBrowserWebWorkerEnv:()=>Oe,navigator:()=>Fe,origin:()=>De});var t=i(72),a=i.n(t),r=i(825),o=i.n(r),s=i(659),l=i.n(s),d=i(56),p=i.n(d),c=i(540),h=i.n(c),u=i(113),f=i.n(u),A=i(420),y={};y.styleTagTransform=f(),y.setAttributes=p(),y.insert=l().bind(null,\"head\"),y.domAPI=o(),y.insertStyleElement=h();a()(A.A,y);A.A&&A.A.locals&&A.A.locals;var m=i(149);const b=/iPhone|iPad|iPod|Windows|Macintosh|Android|Mobile/i.test(navigator.userAgent)&&\"ontouchend\"in document,g={secondToTime:e=>{if(0===(e=e||0)||e===1/0||\"NaN\"===e.toString())return\"00:00\";const t=Math.floor(e/3600),i=Math.floor((e-3600*t)/60),n=Math.floor(e-3600*t-60*i);return(t>0?[t,i,n]:[i,n]).map(e=>e<10?\"0\"+e:\"\"+e).join(\":\")},getVideoDuration:(e,t)=>{let i=e.duration;return i===1/0&&(e.seekable.length>0?(t.dtime.textContent=g.secondToTime(e.seekable.end(0)),i=e.seekable.end(0)):e.buffered.length>0&&(t.dtime.textContent=g.secondToTime(e.buffered.end(0)),i=e.buffered.end(0))),i},getRelativeX:(e,t)=>{const i=t.getBoundingClientRect();let n;return n=\"touches\"in e?e.touches.length>0?e.touches[0].clientX:e.changedTouches&&e.changedTouches.length>0?e.changedTouches[0].clientX:0:e.clientX,n-i.left},getScrollPosition:()=>({left:window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0,top:window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0}),setScrollPosition({left:e=0,top:t=0}){this.isFirefox?(document.documentElement.scrollLeft=e,document.documentElement.scrollTop=t):window.scrollTo(e,t)},isMobile:b,isFirefox:/firefox/i.test(window.navigator.userAgent),isWebKit:/AppleWebKit/.test(window.navigator.userAgent)&&!/Chrome/.test(window.navigator.userAgent)||/\\b(iPad|iPhone|iPod)\\b/.test(window.navigator.userAgent),storage:{set:(e,t)=>{localStorage.setItem(e,t)},get:e=>localStorage.getItem(e)},nameMap:{dragStart:b?\"touchstart\":\"mousedown\",dragMove:b?\"touchmove\":\"mousemove\",dragEnd:b?\"touchend\":\"mouseup\"},color2Number:e=>(\"#\"===e[0]&&(e=e.substr(1)),3===e.length&&(e=`${e[0]}${e[0]}${e[1]}${e[1]}${e[2]}${e[2]}`),parseInt(e,16)+0&16777215),number2Color:e=>\"#\"+(\"00000\"+e.toString(16)).slice(-6),number2Type:e=>{switch(e){case 0:default:return\"right\";case 1:return\"top\";case 2:return\"bottom\"}}},v=g;function C(e,t){return function(){return e.apply(t,arguments)}}const{toString:x}=Object.prototype,{getPrototypeOf:w}=Object,{iterator:k,toStringTag:_}=Symbol,S=(T=Object.create(null),e=>{const t=x.call(e);return T[t]||(T[t]=t.slice(8,-1).toLowerCase())});var T;const B=e=>(e=e.toLowerCase(),t=>S(t)===e),E=e=>t=>typeof t===e,{isArray:I}=Array,F=E(\"undefined\");function R(e){return null!==e&&!F(e)&&null!==e.constructor&&!F(e.constructor)&&M(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const O=B(\"ArrayBuffer\");const D=E(\"string\"),M=E(\"function\"),L=E(\"number\"),P=e=>null!==e&&\"object\"==typeof e,z=e=>{if(\"object\"!==S(e))return!1;const t=w(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||_ in e||k in e)},G=B(\"Date\"),q=B(\"File\"),j=B(\"Blob\"),U=B(\"FileList\"),H=B(\"URLSearchParams\"),[N,W,J,V]=[\"ReadableStream\",\"Request\",\"Response\",\"Headers\"].map(B);function K(e,t,{allOwnKeys:i=!1}={}){if(null==e)return;let n,a;if(\"object\"!=typeof e&&(e=[e]),I(e))for(n=0,a=e.length;n<a;n++)t.call(null,e[n],n,e);else{if(R(e))return;const a=i?Object.getOwnPropertyNames(e):Object.keys(e),r=a.length;let o;for(n=0;n<r;n++)o=a[n],t.call(null,e[o],o,e)}}function X(e,t){if(R(e))return null;t=t.toLowerCase();const i=Object.keys(e);let n,a=i.length;for(;a-- >0;)if(n=i[a],t===n.toLowerCase())return n;return null}const Y=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:global,$=e=>!F(e)&&e!==Y;const Q=(Z=\"undefined\"!=typeof Uint8Array&&w(Uint8Array),e=>Z&&e instanceof Z);var Z;const ee=B(\"HTMLFormElement\"),te=(({hasOwnProperty:e})=>(t,i)=>e.call(t,i))(Object.prototype),ie=B(\"RegExp\"),ne=(e,t)=>{const i=Object.getOwnPropertyDescriptors(e),n={};K(i,(i,a)=>{let r;!1!==(r=t(i,a,e))&&(n[a]=r||i)}),Object.defineProperties(e,n)};const ae=B(\"AsyncFunction\"),re=(oe=\"function\"==typeof setImmediate,se=M(Y.postMessage),oe?setImmediate:se?(le=`axios@${Math.random()}`,de=[],Y.addEventListener(\"message\",({source:e,data:t})=>{e===Y&&t===le&&de.length&&de.shift()()},!1),e=>{de.push(e),Y.postMessage(le,\"*\")}):e=>setTimeout(e));var oe,se,le,de;const pe=\"undefined\"!=typeof queueMicrotask?queueMicrotask.bind(Y):\"undefined\"!=typeof process&&process.nextTick||re,ce={isArray:I,isArrayBuffer:O,isBuffer:R,isFormData:e=>{let t;return e&&(\"function\"==typeof FormData&&e instanceof FormData||M(e.append)&&(\"formdata\"===(t=S(e))||\"object\"===t&&M(e.toString)&&\"[object FormData]\"===e.toString()))},isArrayBufferView:function(e){let t;return t=\"undefined\"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&O(e.buffer),t},isString:D,isNumber:L,isBoolean:e=>!0===e||!1===e,isObject:P,isPlainObject:z,isEmptyObject:e=>{if(!P(e)||R(e))return!1;try{return 0===Object.keys(e).length&&Object.getPrototypeOf(e)===Object.prototype}catch(e){return!1}},isReadableStream:N,isRequest:W,isResponse:J,isHeaders:V,isUndefined:F,isDate:G,isFile:q,isBlob:j,isRegExp:ie,isFunction:M,isStream:e=>P(e)&&M(e.pipe),isURLSearchParams:H,isTypedArray:Q,isFileList:U,forEach:K,merge:function e(){const{caseless:t,skipUndefined:i}=$(this)&&this||{},n={},a=(a,r)=>{const o=t&&X(n,r)||r;z(n[o])&&z(a)?n[o]=e(n[o],a):z(a)?n[o]=e({},a):I(a)?n[o]=a.slice():i&&F(a)||(n[o]=a)};for(let e=0,t=arguments.length;e<t;e++)arguments[e]&&K(arguments[e],a);return n},extend:(e,t,i,{allOwnKeys:n}={})=>(K(t,(t,n)=>{i&&M(t)?e[n]=C(t,i):e[n]=t},{allOwnKeys:n}),e),trim:e=>e.trim?e.trim():e.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\"\"),stripBOM:e=>(65279===e.charCodeAt(0)&&(e=e.slice(1)),e),inherits:(e,t,i,n)=>{e.prototype=Object.create(t.prototype,n),e.prototype.constructor=e,Object.defineProperty(e,\"super\",{value:t.prototype}),i&&Object.assign(e.prototype,i)},toFlatObject:(e,t,i,n)=>{let a,r,o;const s={};if(t=t||{},null==e)return t;do{for(a=Object.getOwnPropertyNames(e),r=a.length;r-- >0;)o=a[r],n&&!n(o,e,t)||s[o]||(t[o]=e[o],s[o]=!0);e=!1!==i&&w(e)}while(e&&(!i||i(e,t))&&e!==Object.prototype);return t},kindOf:S,kindOfTest:B,endsWith:(e,t,i)=>{e=String(e),(void 0===i||i>e.length)&&(i=e.length),i-=t.length;const n=e.indexOf(t,i);return-1!==n&&n===i},toArray:e=>{if(!e)return null;if(I(e))return e;let t=e.length;if(!L(t))return null;const i=new Array(t);for(;t-- >0;)i[t]=e[t];return i},forEachEntry:(e,t)=>{const i=(e&&e[k]).call(e);let n;for(;(n=i.next())&&!n.done;){const i=n.value;t.call(e,i[0],i[1])}},matchAll:(e,t)=>{let i;const n=[];for(;null!==(i=e.exec(t));)n.push(i);return n},isHTMLForm:ee,hasOwnProperty:te,hasOwnProp:te,reduceDescriptors:ne,freezeMethods:e=>{ne(e,(t,i)=>{if(M(e)&&-1!==[\"arguments\",\"caller\",\"callee\"].indexOf(i))return!1;const n=e[i];M(n)&&(t.enumerable=!1,\"writable\"in t?t.writable=!1:t.set||(t.set=()=>{throw Error(\"Can not rewrite read-only method '\"+i+\"'\")}))})},toObjectSet:(e,t)=>{const i={},n=e=>{e.forEach(e=>{i[e]=!0})};return I(e)?n(e):n(String(e).split(t)),i},toCamelCase:e=>e.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,function(e,t,i){return t.toUpperCase()+i}),noop:()=>{},toFiniteNumber:(e,t)=>null!=e&&Number.isFinite(e=+e)?e:t,findKey:X,global:Y,isContextDefined:$,isSpecCompliantForm:function(e){return!!(e&&M(e.append)&&\"FormData\"===e[_]&&e[k])},toJSONObject:e=>{const t=new Array(10),i=(e,n)=>{if(P(e)){if(t.indexOf(e)>=0)return;if(R(e))return e;if(!(\"toJSON\"in e)){t[n]=e;const a=I(e)?[]:{};return K(e,(e,t)=>{const r=i(e,n+1);!F(r)&&(a[t]=r)}),t[n]=void 0,a}}return e};return i(e,0)},isAsyncFn:ae,isThenable:e=>e&&(P(e)||M(e))&&M(e.then)&&M(e.catch),setImmediate:re,asap:pe,isIterable:e=>null!=e&&M(e[k])};function he(e,t,i,n,a){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name=\"AxiosError\",t&&(this.code=t),i&&(this.config=i),n&&(this.request=n),a&&(this.response=a,this.status=a.status?a.status:null)}ce.inherits(he,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:ce.toJSONObject(this.config),code:this.code,status:this.status}}});const ue=he.prototype,fe={};[\"ERR_BAD_OPTION_VALUE\",\"ERR_BAD_OPTION\",\"ECONNABORTED\",\"ETIMEDOUT\",\"ERR_NETWORK\",\"ERR_FR_TOO_MANY_REDIRECTS\",\"ERR_DEPRECATED\",\"ERR_BAD_RESPONSE\",\"ERR_BAD_REQUEST\",\"ERR_CANCELED\",\"ERR_NOT_SUPPORT\",\"ERR_INVALID_URL\"].forEach(e=>{fe[e]={value:e}}),Object.defineProperties(he,fe),Object.defineProperty(ue,\"isAxiosError\",{value:!0}),he.from=(e,t,i,n,a,r)=>{const o=Object.create(ue);ce.toFlatObject(e,o,function(e){return e!==Error.prototype},e=>\"isAxiosError\"!==e);const s=e&&e.message?e.message:\"Error\",l=null==t&&e?e.code:t;return he.call(o,s,l,i,n,a),e&&null==o.cause&&Object.defineProperty(o,\"cause\",{value:e,configurable:!0}),o.name=e&&e.name||\"Error\",r&&Object.assign(o,r),o};const Ae=he;function ye(e){return ce.isPlainObject(e)||ce.isArray(e)}function me(e){return ce.endsWith(e,\"[]\")?e.slice(0,-2):e}function be(e,t,i){return e?e.concat(t).map(function(e,t){return e=me(e),!i&&t?\"[\"+e+\"]\":e}).join(i?\".\":\"\"):t}const ge=ce.toFlatObject(ce,{},null,function(e){return/^is[A-Z]/.test(e)});const ve=function(e,t,i){if(!ce.isObject(e))throw new TypeError(\"target must be an object\");t=t||new FormData;const n=(i=ce.toFlatObject(i,{metaTokens:!0,dots:!1,indexes:!1},!1,function(e,t){return!ce.isUndefined(t[e])})).metaTokens,a=i.visitor||d,r=i.dots,o=i.indexes,s=(i.Blob||\"undefined\"!=typeof Blob&&Blob)&&ce.isSpecCompliantForm(t);if(!ce.isFunction(a))throw new TypeError(\"visitor must be a function\");function l(e){if(null===e)return\"\";if(ce.isDate(e))return e.toISOString();if(ce.isBoolean(e))return e.toString();if(!s&&ce.isBlob(e))throw new Ae(\"Blob is not supported. Use a Buffer instead.\");return ce.isArrayBuffer(e)||ce.isTypedArray(e)?s&&\"function\"==typeof Blob?new Blob([e]):Buffer.from(e):e}function d(e,i,a){let s=e;if(e&&!a&&\"object\"==typeof e)if(ce.endsWith(i,\"{}\"))i=n?i:i.slice(0,-2),e=JSON.stringify(e);else if(ce.isArray(e)&&function(e){return ce.isArray(e)&&!e.some(ye)}(e)||(ce.isFileList(e)||ce.endsWith(i,\"[]\"))&&(s=ce.toArray(e)))return i=me(i),s.forEach(function(e,n){!ce.isUndefined(e)&&null!==e&&t.append(!0===o?be([i],n,r):null===o?i:i+\"[]\",l(e))}),!1;return!!ye(e)||(t.append(be(a,i,r),l(e)),!1)}const p=[],c=Object.assign(ge,{defaultVisitor:d,convertValue:l,isVisitable:ye});if(!ce.isObject(e))throw new TypeError(\"data must be an object\");return function e(i,n){if(!ce.isUndefined(i)){if(-1!==p.indexOf(i))throw Error(\"Circular reference detected in \"+n.join(\".\"));p.push(i),ce.forEach(i,function(i,r){!0===(!(ce.isUndefined(i)||null===i)&&a.call(t,i,ce.isString(r)?r.trim():r,n,c))&&e(i,n?n.concat(r):[r])}),p.pop()}}(e),t};function Ce(e){const t={\"!\":\"%21\",\"'\":\"%27\",\"(\":\"%28\",\")\":\"%29\",\"~\":\"%7E\",\"%20\":\"+\",\"%00\":\"\\0\"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(e){return t[e]})}function xe(e,t){this._pairs=[],e&&ve(e,this,t)}const we=xe.prototype;we.append=function(e,t){this._pairs.push([e,t])},we.toString=function(e){const t=e?function(t){return e.call(this,t,Ce)}:Ce;return this._pairs.map(function(e){return t(e[0])+\"=\"+t(e[1])},\"\").join(\"&\")};const ke=xe;function _e(e){return encodeURIComponent(e).replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%20/g,\"+\")}function Se(e,t,i){if(!t)return e;const n=i&&i.encode||_e;ce.isFunction(i)&&(i={serialize:i});const a=i&&i.serialize;let r;if(r=a?a(t,i):ce.isURLSearchParams(t)?t.toString():new ke(t,i).toString(n),r){const t=e.indexOf(\"#\");-1!==t&&(e=e.slice(0,t)),e+=(-1===e.indexOf(\"?\")?\"?\":\"&\")+r}return e}const Te=class{constructor(){this.handlers=[]}use(e,t,i){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!i&&i.synchronous,runWhen:i?i.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){ce.forEach(this.handlers,function(t){null!==t&&e(t)})}},Be={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},Ee={isBrowser:!0,classes:{URLSearchParams:\"undefined\"!=typeof URLSearchParams?URLSearchParams:ke,FormData:\"undefined\"!=typeof FormData?FormData:null,Blob:\"undefined\"!=typeof Blob?Blob:null},protocols:[\"http\",\"https\",\"file\",\"blob\",\"url\",\"data\"]},Ie=\"undefined\"!=typeof window&&\"undefined\"!=typeof document,Fe=\"object\"==typeof navigator&&navigator||void 0,Re=Ie&&(!Fe||[\"ReactNative\",\"NativeScript\",\"NS\"].indexOf(Fe.product)<0),Oe=\"undefined\"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&\"function\"==typeof self.importScripts,De=Ie&&window.location.href||\"http://localhost\",Me={...e,...Ee};const Le=function(e){function t(e,i,n,a){let r=e[a++];if(\"__proto__\"===r)return!0;const o=Number.isFinite(+r),s=a>=e.length;if(r=!r&&ce.isArray(n)?n.length:r,s)return ce.hasOwnProp(n,r)?n[r]=[n[r],i]:n[r]=i,!o;n[r]&&ce.isObject(n[r])||(n[r]=[]);return t(e,i,n[r],a)&&ce.isArray(n[r])&&(n[r]=function(e){const t={},i=Object.keys(e);let n;const a=i.length;let r;for(n=0;n<a;n++)r=i[n],t[r]=e[r];return t}(n[r])),!o}if(ce.isFormData(e)&&ce.isFunction(e.entries)){const i={};return ce.forEachEntry(e,(e,n)=>{t(function(e){return ce.matchAll(/\\w+|\\[(\\w*)]/g,e).map(e=>\"[]\"===e[0]?\"\":e[1]||e[0])}(e),n,i,0)}),i}return null};const Pe={transitional:Be,adapter:[\"xhr\",\"http\",\"fetch\"],transformRequest:[function(e,t){const i=t.getContentType()||\"\",n=i.indexOf(\"application/json\")>-1,a=ce.isObject(e);a&&ce.isHTMLForm(e)&&(e=new FormData(e));if(ce.isFormData(e))return n?JSON.stringify(Le(e)):e;if(ce.isArrayBuffer(e)||ce.isBuffer(e)||ce.isStream(e)||ce.isFile(e)||ce.isBlob(e)||ce.isReadableStream(e))return e;if(ce.isArrayBufferView(e))return e.buffer;if(ce.isURLSearchParams(e))return t.setContentType(\"application/x-www-form-urlencoded;charset=utf-8\",!1),e.toString();let r;if(a){if(i.indexOf(\"application/x-www-form-urlencoded\")>-1)return function(e,t){return ve(e,new Me.classes.URLSearchParams,{visitor:function(e,t,i,n){return Me.isNode&&ce.isBuffer(e)?(this.append(t,e.toString(\"base64\")),!1):n.defaultVisitor.apply(this,arguments)},...t})}(e,this.formSerializer).toString();if((r=ce.isFileList(e))||i.indexOf(\"multipart/form-data\")>-1){const t=this.env&&this.env.FormData;return ve(r?{\"files[]\":e}:e,t&&new t,this.formSerializer)}}return a||n?(t.setContentType(\"application/json\",!1),function(e,t,i){if(ce.isString(e))try{return(t||JSON.parse)(e),ce.trim(e)}catch(e){if(\"SyntaxError\"!==e.name)throw e}return(i||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){const t=this.transitional||Pe.transitional,i=t&&t.forcedJSONParsing,n=\"json\"===this.responseType;if(ce.isResponse(e)||ce.isReadableStream(e))return e;if(e&&ce.isString(e)&&(i&&!this.responseType||n)){const i=!(t&&t.silentJSONParsing)&&n;try{return JSON.parse(e,this.parseReviver)}catch(e){if(i){if(\"SyntaxError\"===e.name)throw Ae.from(e,Ae.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Me.classes.FormData,Blob:Me.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:\"application/json, text/plain, */*\",\"Content-Type\":void 0}}};ce.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\"],e=>{Pe.headers[e]={}});const ze=Pe,Ge=ce.toObjectSet([\"age\",\"authorization\",\"content-length\",\"content-type\",\"etag\",\"expires\",\"from\",\"host\",\"if-modified-since\",\"if-unmodified-since\",\"last-modified\",\"location\",\"max-forwards\",\"proxy-authorization\",\"referer\",\"retry-after\",\"user-agent\"]),qe=Symbol(\"internals\");function je(e){return e&&String(e).trim().toLowerCase()}function Ue(e){return!1===e||null==e?e:ce.isArray(e)?e.map(Ue):String(e)}function He(e,t,i,n,a){return ce.isFunction(n)?n.call(this,t,i):(a&&(t=i),ce.isString(t)?ce.isString(n)?-1!==t.indexOf(n):ce.isRegExp(n)?n.test(t):void 0:void 0)}class Ne{constructor(e){e&&this.set(e)}set(e,t,i){const n=this;function a(e,t,i){const a=je(t);if(!a)throw new Error(\"header name must be a non-empty string\");const r=ce.findKey(n,a);(!r||void 0===n[r]||!0===i||void 0===i&&!1!==n[r])&&(n[r||t]=Ue(e))}const r=(e,t)=>ce.forEach(e,(e,i)=>a(e,i,t));if(ce.isPlainObject(e)||e instanceof this.constructor)r(e,t);else if(ce.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))r((e=>{const t={};let i,n,a;return e&&e.split(\"\\n\").forEach(function(e){a=e.indexOf(\":\"),i=e.substring(0,a).trim().toLowerCase(),n=e.substring(a+1).trim(),!i||t[i]&&Ge[i]||(\"set-cookie\"===i?t[i]?t[i].push(n):t[i]=[n]:t[i]=t[i]?t[i]+\", \"+n:n)}),t})(e),t);else if(ce.isObject(e)&&ce.isIterable(e)){let i,n,a={};for(const t of e){if(!ce.isArray(t))throw TypeError(\"Object iterator must return a key-value pair\");a[n=t[0]]=(i=a[n])?ce.isArray(i)?[...i,t[1]]:[i,t[1]]:t[1]}r(a,t)}else null!=e&&a(t,e,i);return this}get(e,t){if(e=je(e)){const i=ce.findKey(this,e);if(i){const e=this[i];if(!t)return e;if(!0===t)return function(e){const t=Object.create(null),i=/([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;let n;for(;n=i.exec(e);)t[n[1]]=n[2];return t}(e);if(ce.isFunction(t))return t.call(this,e,i);if(ce.isRegExp(t))return t.exec(e);throw new TypeError(\"parser must be boolean|regexp|function\")}}}has(e,t){if(e=je(e)){const i=ce.findKey(this,e);return!(!i||void 0===this[i]||t&&!He(0,this[i],i,t))}return!1}delete(e,t){const i=this;let n=!1;function a(e){if(e=je(e)){const a=ce.findKey(i,e);!a||t&&!He(0,i[a],a,t)||(delete i[a],n=!0)}}return ce.isArray(e)?e.forEach(a):a(e),n}clear(e){const t=Object.keys(this);let i=t.length,n=!1;for(;i--;){const a=t[i];e&&!He(0,this[a],a,e,!0)||(delete this[a],n=!0)}return n}normalize(e){const t=this,i={};return ce.forEach(this,(n,a)=>{const r=ce.findKey(i,a);if(r)return t[r]=Ue(n),void delete t[a];const o=e?function(e){return e.trim().toLowerCase().replace(/([a-z\\d])(\\w*)/g,(e,t,i)=>t.toUpperCase()+i)}(a):String(a).trim();o!==a&&delete t[a],t[o]=Ue(n),i[o]=!0}),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){const t=Object.create(null);return ce.forEach(this,(i,n)=>{null!=i&&!1!==i&&(t[n]=e&&ce.isArray(i)?i.join(\", \"):i)}),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([e,t])=>e+\": \"+t).join(\"\\n\")}getSetCookie(){return this.get(\"set-cookie\")||[]}get[Symbol.toStringTag](){return\"AxiosHeaders\"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...t){const i=new this(e);return t.forEach(e=>i.set(e)),i}static accessor(e){const t=(this[qe]=this[qe]={accessors:{}}).accessors,i=this.prototype;function n(e){const n=je(e);t[n]||(!function(e,t){const i=ce.toCamelCase(\" \"+t);[\"get\",\"set\",\"has\"].forEach(n=>{Object.defineProperty(e,n+i,{value:function(e,i,a){return this[n].call(this,t,e,i,a)},configurable:!0})})}(i,e),t[n]=!0)}return ce.isArray(e)?e.forEach(n):n(e),this}}Ne.accessor([\"Content-Type\",\"Content-Length\",\"Accept\",\"Accept-Encoding\",\"User-Agent\",\"Authorization\"]),ce.reduceDescriptors(Ne.prototype,({value:e},t)=>{let i=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(e){this[i]=e}}}),ce.freezeMethods(Ne);const We=Ne;function Je(e,t){const i=this||ze,n=t||i,a=We.from(n.headers);let r=n.data;return ce.forEach(e,function(e){r=e.call(i,r,a.normalize(),t?t.status:void 0)}),a.normalize(),r}function Ve(e){return!(!e||!e.__CANCEL__)}function Ke(e,t,i){Ae.call(this,null==e?\"canceled\":e,Ae.ERR_CANCELED,t,i),this.name=\"CanceledError\"}ce.inherits(Ke,Ae,{__CANCEL__:!0});const Xe=Ke;function Ye(e,t,i){const n=i.config.validateStatus;i.status&&n&&!n(i.status)?t(new Ae(\"Request failed with status code \"+i.status,[Ae.ERR_BAD_REQUEST,Ae.ERR_BAD_RESPONSE][Math.floor(i.status/100)-4],i.config,i.request,i)):e(i)}const $e=function(e,t){e=e||10;const i=new Array(e),n=new Array(e);let a,r=0,o=0;return t=void 0!==t?t:1e3,function(s){const l=Date.now(),d=n[o];a||(a=l),i[r]=s,n[r]=l;let p=o,c=0;for(;p!==r;)c+=i[p++],p%=e;if(r=(r+1)%e,r===o&&(o=(o+1)%e),l-a<t)return;const h=d&&l-d;return h?Math.round(1e3*c/h):void 0}};const Qe=function(e,t){let i,n,a=0,r=1e3/t;const o=(t,r=Date.now())=>{a=r,i=null,n&&(clearTimeout(n),n=null),e(...t)};return[(...e)=>{const t=Date.now(),s=t-a;s>=r?o(e,t):(i=e,n||(n=setTimeout(()=>{n=null,o(i)},r-s)))},()=>i&&o(i)]},Ze=(e,t,i=3)=>{let n=0;const a=$e(50,250);return Qe(i=>{const r=i.loaded,o=i.lengthComputable?i.total:void 0,s=r-n,l=a(s);n=r;e({loaded:r,total:o,progress:o?r/o:void 0,bytes:s,rate:l||void 0,estimated:l&&o&&r<=o?(o-r)/l:void 0,event:i,lengthComputable:null!=o,[t?\"download\":\"upload\"]:!0})},i)},et=(e,t)=>{const i=null!=e;return[n=>t[0]({lengthComputable:i,total:e,loaded:n}),t[1]]},tt=e=>(...t)=>ce.asap(()=>e(...t)),it=Me.hasStandardBrowserEnv?((e,t)=>i=>(i=new URL(i,Me.origin),e.protocol===i.protocol&&e.host===i.host&&(t||e.port===i.port)))(new URL(Me.origin),Me.navigator&&/(msie|trident)/i.test(Me.navigator.userAgent)):()=>!0,nt=Me.hasStandardBrowserEnv?{write(e,t,i,n,a,r){const o=[e+\"=\"+encodeURIComponent(t)];ce.isNumber(i)&&o.push(\"expires=\"+new Date(i).toGMTString()),ce.isString(n)&&o.push(\"path=\"+n),ce.isString(a)&&o.push(\"domain=\"+a),!0===r&&o.push(\"secure\"),document.cookie=o.join(\"; \")},read(e){const t=document.cookie.match(new RegExp(\"(^|;\\\\s*)(\"+e+\")=([^;]*)\"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,\"\",Date.now()-864e5)}}:{write(){},read:()=>null,remove(){}};function at(e,t,i){let n=!/^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(t);return e&&(n||0==i)?function(e,t){return t?e.replace(/\\/?\\/$/,\"\")+\"/\"+t.replace(/^\\/+/,\"\"):e}(e,t):t}const rt=e=>e instanceof We?{...e}:e;function ot(e,t){t=t||{};const i={};function n(e,t,i,n){return ce.isPlainObject(e)&&ce.isPlainObject(t)?ce.merge.call({caseless:n},e,t):ce.isPlainObject(t)?ce.merge({},t):ce.isArray(t)?t.slice():t}function a(e,t,i,a){return ce.isUndefined(t)?ce.isUndefined(e)?void 0:n(void 0,e,0,a):n(e,t,0,a)}function r(e,t){if(!ce.isUndefined(t))return n(void 0,t)}function o(e,t){return ce.isUndefined(t)?ce.isUndefined(e)?void 0:n(void 0,e):n(void 0,t)}function s(i,a,r){return r in t?n(i,a):r in e?n(void 0,i):void 0}const l={url:r,method:r,data:r,baseURL:o,transformRequest:o,transformResponse:o,paramsSerializer:o,timeout:o,timeoutMessage:o,withCredentials:o,withXSRFToken:o,adapter:o,responseType:o,xsrfCookieName:o,xsrfHeaderName:o,onUploadProgress:o,onDownloadProgress:o,decompress:o,maxContentLength:o,maxBodyLength:o,beforeRedirect:o,transport:o,httpAgent:o,httpsAgent:o,cancelToken:o,socketPath:o,responseEncoding:o,validateStatus:s,headers:(e,t,i)=>a(rt(e),rt(t),0,!0)};return ce.forEach(Object.keys({...e,...t}),function(n){const r=l[n]||a,o=r(e[n],t[n],n);ce.isUndefined(o)&&r!==s||(i[n]=o)}),i}const st=e=>{const t=ot({},e);let{data:i,withXSRFToken:n,xsrfHeaderName:a,xsrfCookieName:r,headers:o,auth:s}=t;if(t.headers=o=We.from(o),t.url=Se(at(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),s&&o.set(\"Authorization\",\"Basic \"+btoa((s.username||\"\")+\":\"+(s.password?unescape(encodeURIComponent(s.password)):\"\"))),ce.isFormData(i))if(Me.hasStandardBrowserEnv||Me.hasStandardBrowserWebWorkerEnv)o.setContentType(void 0);else if(ce.isFunction(i.getHeaders)){const e=i.getHeaders(),t=[\"content-type\",\"content-length\"];Object.entries(e).forEach(([e,i])=>{t.includes(e.toLowerCase())&&o.set(e,i)})}if(Me.hasStandardBrowserEnv&&(n&&ce.isFunction(n)&&(n=n(t)),n||!1!==n&&it(t.url))){const e=a&&r&&nt.read(r);e&&o.set(a,e)}return t},lt=\"undefined\"!=typeof XMLHttpRequest&&function(e){return new Promise(function(t,i){const n=st(e);let a=n.data;const r=We.from(n.headers).normalize();let o,s,l,d,p,{responseType:c,onUploadProgress:h,onDownloadProgress:u}=n;function f(){d&&d(),p&&p(),n.cancelToken&&n.cancelToken.unsubscribe(o),n.signal&&n.signal.removeEventListener(\"abort\",o)}let A=new XMLHttpRequest;function y(){if(!A)return;const n=We.from(\"getAllResponseHeaders\"in A&&A.getAllResponseHeaders());Ye(function(e){t(e),f()},function(e){i(e),f()},{data:c&&\"text\"!==c&&\"json\"!==c?A.response:A.responseText,status:A.status,statusText:A.statusText,headers:n,config:e,request:A}),A=null}A.open(n.method.toUpperCase(),n.url,!0),A.timeout=n.timeout,\"onloadend\"in A?A.onloadend=y:A.onreadystatechange=function(){A&&4===A.readyState&&(0!==A.status||A.responseURL&&0===A.responseURL.indexOf(\"file:\"))&&setTimeout(y)},A.onabort=function(){A&&(i(new Ae(\"Request aborted\",Ae.ECONNABORTED,e,A)),A=null)},A.onerror=function(t){const n=t&&t.message?t.message:\"Network Error\",a=new Ae(n,Ae.ERR_NETWORK,e,A);a.event=t||null,i(a),A=null},A.ontimeout=function(){let t=n.timeout?\"timeout of \"+n.timeout+\"ms exceeded\":\"timeout exceeded\";const a=n.transitional||Be;n.timeoutErrorMessage&&(t=n.timeoutErrorMessage),i(new Ae(t,a.clarifyTimeoutError?Ae.ETIMEDOUT:Ae.ECONNABORTED,e,A)),A=null},void 0===a&&r.setContentType(null),\"setRequestHeader\"in A&&ce.forEach(r.toJSON(),function(e,t){A.setRequestHeader(t,e)}),ce.isUndefined(n.withCredentials)||(A.withCredentials=!!n.withCredentials),c&&\"json\"!==c&&(A.responseType=n.responseType),u&&([l,p]=Ze(u,!0),A.addEventListener(\"progress\",l)),h&&A.upload&&([s,d]=Ze(h),A.upload.addEventListener(\"progress\",s),A.upload.addEventListener(\"loadend\",d)),(n.cancelToken||n.signal)&&(o=t=>{A&&(i(!t||t.type?new Xe(null,e,A):t),A.abort(),A=null)},n.cancelToken&&n.cancelToken.subscribe(o),n.signal&&(n.signal.aborted?o():n.signal.addEventListener(\"abort\",o)));const m=function(e){const t=/^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(e);return t&&t[1]||\"\"}(n.url);m&&-1===Me.protocols.indexOf(m)?i(new Ae(\"Unsupported protocol \"+m+\":\",Ae.ERR_BAD_REQUEST,e)):A.send(a||null)})},dt=(e,t)=>{const{length:i}=e=e?e.filter(Boolean):[];if(t||i){let i,n=new AbortController;const a=function(e){if(!i){i=!0,o();const t=e instanceof Error?e:this.reason;n.abort(t instanceof Ae?t:new Xe(t instanceof Error?t.message:t))}};let r=t&&setTimeout(()=>{r=null,a(new Ae(`timeout ${t} of ms exceeded`,Ae.ETIMEDOUT))},t);const o=()=>{e&&(r&&clearTimeout(r),r=null,e.forEach(e=>{e.unsubscribe?e.unsubscribe(a):e.removeEventListener(\"abort\",a)}),e=null)};e.forEach(e=>e.addEventListener(\"abort\",a));const{signal:s}=n;return s.unsubscribe=()=>ce.asap(o),s}},pt=function*(e,t){let i=e.byteLength;if(!t||i<t)return void(yield e);let n,a=0;for(;a<i;)n=a+t,yield e.slice(a,n),a=n},ct=async function*(e){if(e[Symbol.asyncIterator])return void(yield*e);const t=e.getReader();try{for(;;){const{done:e,value:i}=await t.read();if(e)break;yield i}}finally{await t.cancel()}},ht=(e,t,i,n)=>{const a=async function*(e,t){for await(const i of ct(e))yield*pt(i,t)}(e,t);let r,o=0,s=e=>{r||(r=!0,n&&n(e))};return new ReadableStream({async pull(e){try{const{done:t,value:n}=await a.next();if(t)return s(),void e.close();let r=n.byteLength;if(i){let e=o+=r;i(e)}e.enqueue(new Uint8Array(n))}catch(e){throw s(e),e}},cancel:e=>(s(e),a.return())},{highWaterMark:2})},{isFunction:ut}=ce,ft=(({Request:e,Response:t})=>({Request:e,Response:t}))(ce.global),{ReadableStream:At,TextEncoder:yt}=ce.global,mt=(e,...t)=>{try{return!!e(...t)}catch(e){return!1}},bt=e=>{e=ce.merge.call({skipUndefined:!0},ft,e);const{fetch:t,Request:i,Response:n}=e,a=t?ut(t):\"function\"==typeof fetch,r=ut(i),o=ut(n);if(!a)return!1;const s=a&&ut(At),l=a&&(\"function\"==typeof yt?(d=new yt,e=>d.encode(e)):async e=>new Uint8Array(await new i(e).arrayBuffer()));var d;const p=r&&s&&mt(()=>{let e=!1;const t=new i(Me.origin,{body:new At,method:\"POST\",get duplex(){return e=!0,\"half\"}}).headers.has(\"Content-Type\");return e&&!t}),c=o&&s&&mt(()=>ce.isReadableStream(new n(\"\").body)),h={stream:c&&(e=>e.body)};a&&[\"text\",\"arrayBuffer\",\"blob\",\"formData\",\"stream\"].forEach(e=>{!h[e]&&(h[e]=(t,i)=>{let n=t&&t[e];if(n)return n.call(t);throw new Ae(`Response type '${e}' is not supported`,Ae.ERR_NOT_SUPPORT,i)})});const u=async(e,t)=>{const n=ce.toFiniteNumber(e.getContentLength());return null==n?(async e=>{if(null==e)return 0;if(ce.isBlob(e))return e.size;if(ce.isSpecCompliantForm(e)){const t=new i(Me.origin,{method:\"POST\",body:e});return(await t.arrayBuffer()).byteLength}return ce.isArrayBufferView(e)||ce.isArrayBuffer(e)?e.byteLength:(ce.isURLSearchParams(e)&&(e+=\"\"),ce.isString(e)?(await l(e)).byteLength:void 0)})(t):n};return async e=>{let{url:a,method:o,data:s,signal:l,cancelToken:d,timeout:f,onDownloadProgress:A,onUploadProgress:y,responseType:m,headers:b,withCredentials:g=\"same-origin\",fetchOptions:v}=st(e),C=t||fetch;m=m?(m+\"\").toLowerCase():\"text\";let x=dt([l,d&&d.toAbortSignal()],f),w=null;const k=x&&x.unsubscribe&&(()=>{x.unsubscribe()});let _;try{if(y&&p&&\"get\"!==o&&\"head\"!==o&&0!==(_=await u(b,s))){let e,t=new i(a,{method:\"POST\",body:s,duplex:\"half\"});if(ce.isFormData(s)&&(e=t.headers.get(\"content-type\"))&&b.setContentType(e),t.body){const[e,i]=et(_,Ze(tt(y)));s=ht(t.body,65536,e,i)}}ce.isString(g)||(g=g?\"include\":\"omit\");const t=r&&\"credentials\"in i.prototype,l={...v,signal:x,method:o.toUpperCase(),headers:b.normalize().toJSON(),body:s,duplex:\"half\",credentials:t?g:void 0};w=r&&new i(a,l);let d=await(r?C(w,v):C(a,l));const f=c&&(\"stream\"===m||\"response\"===m);if(c&&(A||f&&k)){const e={};[\"status\",\"statusText\",\"headers\"].forEach(t=>{e[t]=d[t]});const t=ce.toFiniteNumber(d.headers.get(\"content-length\")),[i,a]=A&&et(t,Ze(tt(A),!0))||[];d=new n(ht(d.body,65536,i,()=>{a&&a(),k&&k()}),e)}m=m||\"text\";let S=await h[ce.findKey(h,m)||\"text\"](d,e);return!f&&k&&k(),await new Promise((t,i)=>{Ye(t,i,{data:S,headers:We.from(d.headers),status:d.status,statusText:d.statusText,config:e,request:w})})}catch(t){if(k&&k(),t&&\"TypeError\"===t.name&&/Load failed|fetch/i.test(t.message))throw Object.assign(new Ae(\"Network Error\",Ae.ERR_NETWORK,e,w),{cause:t.cause||t});throw Ae.from(t,t&&t.code,e,w)}}},gt=new Map,vt=e=>{let t=e?e.env:{};const{fetch:i,Request:n,Response:a}=t,r=[n,a,i];let o,s,l=r.length,d=gt;for(;l--;)o=r[l],s=d.get(o),void 0===s&&d.set(o,s=l?new Map:bt(t)),d=s;return s},Ct=(vt(),{http:null,xhr:lt,fetch:{get:vt}});ce.forEach(Ct,(e,t)=>{if(e){try{Object.defineProperty(e,\"name\",{value:t})}catch(e){}Object.defineProperty(e,\"adapterName\",{value:t})}});const xt=e=>`- ${e}`,wt=e=>ce.isFunction(e)||null===e||!1===e,kt=(e,t)=>{e=ce.isArray(e)?e:[e];const{length:i}=e;let n,a;const r={};for(let o=0;o<i;o++){let i;if(n=e[o],a=n,!wt(n)&&(a=Ct[(i=String(n)).toLowerCase()],void 0===a))throw new Ae(`Unknown adapter '${i}'`);if(a&&(ce.isFunction(a)||(a=a.get(t))))break;r[i||\"#\"+o]=a}if(!a){const e=Object.entries(r).map(([e,t])=>`adapter ${e} `+(!1===t?\"is not supported by the environment\":\"is not available in the build\"));let t=i?e.length>1?\"since :\\n\"+e.map(xt).join(\"\\n\"):\" \"+xt(e[0]):\"as no adapter specified\";throw new Ae(\"There is no suitable adapter to dispatch the request \"+t,\"ERR_NOT_SUPPORT\")}return a};function _t(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Xe(null,e)}function St(e){_t(e),e.headers=We.from(e.headers),e.data=Je.call(e,e.transformRequest),-1!==[\"post\",\"put\",\"patch\"].indexOf(e.method)&&e.headers.setContentType(\"application/x-www-form-urlencoded\",!1);return kt(e.adapter||ze.adapter,e)(e).then(function(t){return _t(e),t.data=Je.call(e,e.transformResponse,t),t.headers=We.from(t.headers),t},function(t){return Ve(t)||(_t(e),t&&t.response&&(t.response.data=Je.call(e,e.transformResponse,t.response),t.response.headers=We.from(t.response.headers))),Promise.reject(t)})}const Tt=\"1.12.2\",Bt={};[\"object\",\"boolean\",\"number\",\"function\",\"string\",\"symbol\"].forEach((e,t)=>{Bt[e]=function(i){return typeof i===e||\"a\"+(t<1?\"n \":\" \")+e}});const Et={};Bt.transitional=function(e,t,i){function n(e,t){return\"[Axios v\"+Tt+\"] Transitional option '\"+e+\"'\"+t+(i?\". \"+i:\"\")}return(i,a,r)=>{if(!1===e)throw new Ae(n(a,\" has been removed\"+(t?\" in \"+t:\"\")),Ae.ERR_DEPRECATED);return t&&!Et[a]&&(Et[a]=!0,console.warn(n(a,\" has been deprecated since v\"+t+\" and will be removed in the near future\"))),!e||e(i,a,r)}},Bt.spelling=function(e){return(t,i)=>(console.warn(`${i} is likely a misspelling of ${e}`),!0)};const It={assertOptions:function(e,t,i){if(\"object\"!=typeof e)throw new Ae(\"options must be an object\",Ae.ERR_BAD_OPTION_VALUE);const n=Object.keys(e);let a=n.length;for(;a-- >0;){const r=n[a],o=t[r];if(o){const t=e[r],i=void 0===t||o(t,r,e);if(!0!==i)throw new Ae(\"option \"+r+\" must be \"+i,Ae.ERR_BAD_OPTION_VALUE);continue}if(!0!==i)throw new Ae(\"Unknown option \"+r,Ae.ERR_BAD_OPTION)}},validators:Bt},Ft=It.validators;class Rt{constructor(e){this.defaults=e||{},this.interceptors={request:new Te,response:new Te}}async request(e,t){try{return await this._request(e,t)}catch(e){if(e instanceof Error){let t={};Error.captureStackTrace?Error.captureStackTrace(t):t=new Error;const i=t.stack?t.stack.replace(/^.+\\n/,\"\"):\"\";try{e.stack?i&&!String(e.stack).endsWith(i.replace(/^.+\\n.+\\n/,\"\"))&&(e.stack+=\"\\n\"+i):e.stack=i}catch(e){}}throw e}}_request(e,t){\"string\"==typeof e?(t=t||{}).url=e:t=e||{},t=ot(this.defaults,t);const{transitional:i,paramsSerializer:n,headers:a}=t;void 0!==i&&It.assertOptions(i,{silentJSONParsing:Ft.transitional(Ft.boolean),forcedJSONParsing:Ft.transitional(Ft.boolean),clarifyTimeoutError:Ft.transitional(Ft.boolean)},!1),null!=n&&(ce.isFunction(n)?t.paramsSerializer={serialize:n}:It.assertOptions(n,{encode:Ft.function,serialize:Ft.function},!0)),void 0!==t.allowAbsoluteUrls||(void 0!==this.defaults.allowAbsoluteUrls?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),It.assertOptions(t,{baseUrl:Ft.spelling(\"baseURL\"),withXsrfToken:Ft.spelling(\"withXSRFToken\")},!0),t.method=(t.method||this.defaults.method||\"get\").toLowerCase();let r=a&&ce.merge(a.common,a[t.method]);a&&ce.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\",\"common\"],e=>{delete a[e]}),t.headers=We.concat(r,a);const o=[];let s=!0;this.interceptors.request.forEach(function(e){\"function\"==typeof e.runWhen&&!1===e.runWhen(t)||(s=s&&e.synchronous,o.unshift(e.fulfilled,e.rejected))});const l=[];let d;this.interceptors.response.forEach(function(e){l.push(e.fulfilled,e.rejected)});let p,c=0;if(!s){const e=[St.bind(this),void 0];for(e.unshift(...o),e.push(...l),p=e.length,d=Promise.resolve(t);c<p;)d=d.then(e[c++],e[c++]);return d}p=o.length;let h=t;for(;c<p;){const e=o[c++],t=o[c++];try{h=e(h)}catch(e){t.call(this,e);break}}try{d=St.call(this,h)}catch(e){return Promise.reject(e)}for(c=0,p=l.length;c<p;)d=d.then(l[c++],l[c++]);return d}getUri(e){return Se(at((e=ot(this.defaults,e)).baseURL,e.url,e.allowAbsoluteUrls),e.params,e.paramsSerializer)}}ce.forEach([\"delete\",\"get\",\"head\",\"options\"],function(e){Rt.prototype[e]=function(t,i){return this.request(ot(i||{},{method:e,url:t,data:(i||{}).data}))}}),ce.forEach([\"post\",\"put\",\"patch\"],function(e){function t(t){return function(i,n,a){return this.request(ot(a||{},{method:e,headers:t?{\"Content-Type\":\"multipart/form-data\"}:{},url:i,data:n}))}}Rt.prototype[e]=t(),Rt.prototype[e+\"Form\"]=t(!0)});const Ot=Rt;class Dt{constructor(e){if(\"function\"!=typeof e)throw new TypeError(\"executor must be a function.\");let t;this.promise=new Promise(function(e){t=e});const i=this;this.promise.then(e=>{if(!i._listeners)return;let t=i._listeners.length;for(;t-- >0;)i._listeners[t](e);i._listeners=null}),this.promise.then=e=>{let t;const n=new Promise(e=>{i.subscribe(e),t=e}).then(e);return n.cancel=function(){i.unsubscribe(t)},n},e(function(e,n,a){i.reason||(i.reason=new Xe(e,n,a),t(i.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}toAbortSignal(){const e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let e;return{token:new Dt(function(t){e=t}),cancel:e}}}const Mt=Dt;const Lt={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Lt).forEach(([e,t])=>{Lt[t]=e});const Pt=Lt;const zt=function e(t){const i=new Ot(t),n=C(Ot.prototype.request,i);return ce.extend(n,Ot.prototype,i,{allOwnKeys:!0}),ce.extend(n,i,null,{allOwnKeys:!0}),n.create=function(i){return e(ot(t,i))},n}(ze);zt.Axios=Ot,zt.CanceledError=Xe,zt.CancelToken=Mt,zt.isCancel=Ve,zt.VERSION=Tt,zt.toFormData=ve,zt.AxiosError=Ae,zt.Cancel=zt.CanceledError,zt.all=function(e){return Promise.all(e)},zt.spread=function(e){return function(t){return e.apply(null,t)}},zt.isAxiosError=function(e){return ce.isObject(e)&&!0===e.isAxiosError},zt.mergeConfig=ot,zt.AxiosHeaders=We,zt.formToJSON=e=>Le(ce.isHTMLForm(e)?new FormData(e):e),zt.getAdapter=kt,zt.HttpStatusCode=Pt,zt.default=zt;const Gt=zt,qt={send:e=>{void 0!==e.url?Gt.post(e.url,e.data).then(t=>{const i=t.data;i&&0===i.code?e.success&&e.success():e.error&&e.error(i&&i.msg)}).catch(t=>{console.error(t),e.error&&e.error()}):e.error&&e.error()},read:e=>{void 0!==e.url?Gt.get(e.url).then(t=>{const i=t.data;i&&0===i.code?i.data?e.success&&e.success(i.data.map(e=>({author:e[3],time:e[0],text:e[4],color:e[2],type:e[1],size:e[5]&&(\"big\"===e[5]||\"small\"===e[5])?e[5]:\"medium\"}))):e.success&&e.success([{author:\"\",time:0,text:\"\",color:\"#ffeaea\",type:\"right\",size:\"medium\"}]):e.error&&e.error(i&&i.msg)}).catch(t=>{console.error(t),e.error&&e.error()}):e.error&&e.error()}},jt=qt;const Ut={\"zh-cn\":{\"Danmaku is loading\":\"弹幕加载中\",Top:\"顶部\",Bottom:\"底部\",Rolling:\"滚动\",Big:\"大的\",Medium:\"中等的\",Small:\"小的\",\"Input danmaku, hit Enter\":\"输入弹幕, 回车发送\",\"About author\":\"关于作者\",\"DPlayer feedback\":\"播放器意见反馈\",\"About DPlayer\":\"关于 DPlayer 播放器\",Loop:\"洗脑循环\",Speed:\"速度\",Audio:\"音频\",\"Primary audio\":\"主要音频\",\"Secondary audio\":\"辅助音频\",\"Opacity for danmaku\":\"弹幕透明度\",Normal:\"正常\",\"Please input danmaku content\":\"请输入弹幕内容\",\"Set danmaku color\":\"设置弹幕颜色\",\"Set danmaku type\":\"设置弹幕类型\",\"Set danmaku size\":\"设置弹幕大小\",\"Show danmaku\":\"显示弹幕\",\"Video load failed\":\"视频加载失败\",\"Danmaku load failed\":\"弹幕加载失败\",\"Danmaku load partial failed\":\"弹幕加载部分失败\",\"Danmaku send failed\":\"弹幕发送失败\",\"Switching to\":\"正在切换至\",\"Switched to\":\"已经切换至\",\"Switching to quality\":\"正在切换至 %s 画质\",\"Switched to quality\":\"已经切换至 %s 画质\",Synchronize:\"同步\",Synchronized:\"同步的\",Quality:\"画质\",FF:\"快进\",REW:\"快退\",\"FF progress\":\"快进 %s 秒\",\"REW progress\":\"快退 %s 秒\",\"Unlimited danmaku\":\"海量弹幕\",\"Send danmaku\":\"发送弹幕\",Setting:\"设置\",\"Full screen\":\"全屏\",\"Web full screen\":\"页面全屏\",PIP:\"画中画\",\"PIP not supported\":\"不支持画中画\",\"Not available\":\"不可用\",Send:\"发送\",Screenshot:\"截图\",AirPlay:\"无线投屏\",Second:\"秒\",\"Show comment\":\"显示弹幕\",\"Hide comment\":\"隐藏弹幕\",\"Show subtitle\":\"显示字幕\",\"Hide subtitle\":\"隐藏字幕\",Volume:\"音量\",Live:\"直播\",\"Video info\":\"视频统计信息\"},\"zh-tw\":{\"Danmaku is loading\":\"彈幕載入中\",Top:\"頂部\",Bottom:\"底部\",Rolling:\"滾動\",Big:\"大的\",Medium:\"中等的\",Small:\"小的\",\"Input danmaku, hit Enter\":\"輸入彈幕, Enter 發送\",\"About author\":\"關於作者\",\"DPlayer feedback\":\"播放器意見回饋\",\"About DPlayer\":\"關於 DPlayer 播放器\",Loop:\"循環播放\",Speed:\"速度\",Audio:\"音頻\",\"Primary audio\":\"主要音頻\",\"Secondary audio\":\"輔助音頻\",\"Opacity for danmaku\":\"彈幕透明度\",Normal:\"正常\",\"Please input danmaku content\":\"請輸入彈幕內容\",\"Set danmaku color\":\"設定彈幕顏色\",\"Set danmaku type\":\"設定彈幕類型\",\"Set danmaku size\":\"设置弹幕大小\",\"Show danmaku\":\"顯示彈幕\",\"Video load failed\":\"影片載入失敗\",\"Danmaku load failed\":\"彈幕載入失敗\",\"Danmaku load partial failed\":\"彈幕載入部分失敗\",\"Danmaku send failed\":\"彈幕發送失敗\",\"Switching to\":\"正在切換至\",\"Switched to\":\"已經切換至\",\"Switching to quality\":\"正在切換至 %s 畫質\",\"Switched to quality\":\"已經切換至 %s 畫質\",Synchronize:\"同步\",Synchronized:\"同步的\",Quality:\"畫質\",FF:\"快轉\",REW:\"倒轉\",\"FF progress\":\"快轉 %s 秒\",\"REW progress\":\"倒轉 %s 秒\",\"Unlimited danmaku\":\"巨量彈幕\",\"Send danmaku\":\"發送彈幕\",Setting:\"設定\",\"Full screen\":\"全螢幕\",\"Web full screen\":\"頁面全螢幕\",PIP:\"畫中畫\",\"PIP not supported\":\"不支援畫中畫\",\"Not available\":\"不可用\",Send:\"發送\",Screenshot:\"截圖\",AirPlay:\"無線投屏\",Second:\"秒\",\"Show comment\":\"顯示彈幕\",\"Hide comment\":\"隱藏彈幕\",\"Show subtitle\":\"顯示字幕\",\"Hide subtitle\":\"隱藏字幕\",Volume:\"音量\",Live:\"直播\",\"Video info\":\"影片統計訊息\"},\"ja-jp\":{\"Danmaku is loading\":\"コメントを読み込み中\",Top:\"上固定\",Bottom:\"下固定\",Rolling:\"スクロール\",Big:\"大きめ\",Medium:\"標準\",Small:\"小さめ\",\"Input danmaku, hit Enter\":\"右のボタンを押すとコメントできます\",\"About author\":\"作者について\",\"DPlayer feedback\":\"フィードバック\",\"About DPlayer\":\"DPlayer について\",Loop:\"リピート再生\",Speed:\"再生速度\",Audio:\"音声\",\"Primary audio\":\"主音声\",\"Secondary audio\":\"副音声\",\"Opacity for danmaku\":\"コメントの透明度\",Normal:\"標準\",\"Please input danmaku content\":\"コメント内容を入力して下さい!\",\"Set danmaku color\":\"コメントの色\",\"Set danmaku type\":\"コメントの位置\",\"Set danmaku size\":\"コメントのサイズ\",\"Show danmaku\":\"コメントを表示\",\"Video load failed\":\"動画の読み込みに失敗しました…\",\"Danmaku load failed\":\"コメントの読み込みに失敗しました…\",\"Danmaku load partial failed\":\"コメントの読み込みに失敗しました…\",\"Danmaku send failed\":\"コメントの送信に失敗しました…\",\"Switching to\":\"画質を切り替えています…\",\"Switched to\":\"画質を切り替えました\",\"Switching to quality\":\"画質を %s に切り替えています…\",\"Switched to quality\":\"画質を %s 切り替えました\",Synchronize:\"同期する\",Synchronized:\"同期しました\",Quality:\"画質\",FF:\"早送り\",REW:\"早戻し\",\"FF progress\":\"%s 秒早送り\",\"REW progress\":\"%s 秒早戻し\",\"Unlimited danmaku\":\"コメントを無制限に表示\",\"Send danmaku\":\"コメントする\",Setting:\"設定\",\"Full screen\":\"フルスクリーン\",\"Web full screen\":\"ブラウザフルスクリーン\",PIP:\"Picture-in-Picture\",\"PIP not supported\":\"Picture-in-Picture はサポートされていません\",\"Not available\":\"使用できません\",Send:\"コメントする\",Screenshot:\"スクリーンショット\",AirPlay:\"ワイヤレススクリーン\",Second:\"秒\",\"Show comment\":\"コメントを表示する\",\"Hide comment\":\"コメントを表示しない\",\"Show subtitle\":\"字幕を表示する\",\"Hide subtitle\":\"字幕を表示しない\",Volume:\"音量\",Live:\"Live\",\"Video info\":\"動画の統計情報\"},en:{\"Danmaku is loading\":\"Danmaku is loading\",Top:\"Top\",Bottom:\"Bottom\",Rolling:\"Rolling\",Big:\"Big\",Medium:\"Medium\",Small:\"Small\",\"Input danmaku, hit Enter\":\"Input danmaku, hit Enter\",\"About author\":\"About author\",\"DPlayer feedback\":\"DPlayer feedback\",\"About DPlayer\":\"About DPlayer\",Loop:\"Loop\",Speed:\"Speed\",Audio:\"Audio\",\"Primary audio\":\"Primary audio\",\"Secondary audio\":\"Secondary audio\",\"Opacity for danmaku\":\"Opacity for danmaku\",Normal:\"Normal\",\"Please input danmaku content\":\"Please input danmaku content\",\"Set danmaku color\":\"Set danmaku color\",\"Set danmaku type\":\"Set danmaku type\",\"Set danmaku size\":\"Set danmaku size\",\"Show danmaku\":\"Show danmaku\",\"Video load failed\":\"Video load failed\",\"Danmaku load failed\":\"Danmaku load failed\",\"Danmaku load partial failed\":\"Danmaku load partial failed\",\"Danmaku send failed\":\"Danmaku send failed\",\"Switching to\":\"Switching to\",\"Switched to\":\"Switched to\",\"Switching to quality\":\"Switching to %s quality\",\"Switched to quality\":\"Switched to %s quality\",Synchronize:\"Synchronize\",Synchronized:\"Synchronized\",Quality:\"Quality\",FF:\"Fast forward\",REW:\"Rewind\",\"FF progress\":\"Fast forward %s sec\",\"REW progress\":\"Rewind %s sec\",\"Unlimited danmaku\":\"Unlimited danmaku\",\"Send danmaku\":\"Send danmaku\",Setting:\"Setting\",\"Full screen\":\"Fullscreen\",\"Web full screen\":\"Web fullscreen\",PIP:\"Picture-in-Picture\",\"PIP not supported\":\"Picture-in-picture is not supported\",\"Not available\":\"Not available\",Send:\"Send\",Screenshot:\"Screenshot\",AirPlay:\"AirPlay\",Second:\"Sec\",\"Show comment\":\"Show comment\",\"Hide comment\":\"Hide comment\",\"Show subtitle\":\"Show subtitle\",\"Hide subtitle\":\"Hide subtitle\",Volume:\"Volume\",Live:\"Live\",\"Video info\":\"Video info\"}},Ht=function(e){this.lang=e,\"ja\"===this.lang&&(this.lang=\"ja-jp\"),this.tran=(e,...t)=>{let i=e;Ut[this.lang]&&Ut[this.lang][e]&&(i=Ut[this.lang][e]);let n=0;return i.replace(/%s/gi,()=>t[n++]??\"\")}};var Nt=i(416),Wt=i.n(Nt),Jt=i(32),Vt=i.n(Jt),Kt=i(177),Xt=i.n(Kt),Yt=i(833),$t=i.n(Yt),Qt=i(278),Zt=i.n(Qt),ei=i(513),ti=i.n(ei),ii=i(204),ni=i.n(ii),ai=i(717),ri=i.n(ai),oi=i(928),si=i.n(oi),li=i(657),di=i.n(li),pi=i(894),ci=i.n(pi),hi=i(105),ui=i.n(hi),fi=i(460),Ai=i.n(fi),yi=i(642),mi=i.n(yi),bi=i(1),gi=i.n(bi),vi=i(165),Ci=i.n(vi),xi=i(484),wi=i.n(xi),ki=i(137),_i=i.n(ki),Si=i(631),Ti=i.n(Si),Bi=i(28),Ei=i.n(Bi),Ii=i(30),Fi=i.n(Ii),Ri=i(454),Oi=i.n(Ri);const Di={play:Wt(),pause:Vt(),backward:Xt(),forward:$t(),volumeUp:Zt(),volumeDown:ti(),volumeOff:ni(),full:ri(),fullWeb:si(),pip:di(),setting:ci(),left:ui(),right:Ai(),check:mi(),comment:gi(),commentOff:Ci(),send:wi(),pallette:_i(),camera:Ti(),subtitle:Fi(),loading:Oi(),airplay:Ei()};var Mi=i(456),Li=i.n(Mi);const Pi=class{container;options;index;tran;volumeBar;volumeBarWrap;volumeBarWrapWrap;volumeButton;volumeButtonIcon;volumeIcon;playedBar;loadedBar;playedBarWrap;playedBarTime;danmaku;danmakuLoading;video;bezel;playButton;playIcon;mobileBackwardButton;mobilePlayButton;mobileForwardButton;videoWrap;videoWrapAspect;controllerMask;ptime;settingButton;settingBox;settingOriginPanel;mask;syncButton;loop;loopToggle;showDanmaku;showDanmakuToggle;unlimitDanmaku;unlimitDanmakuToggle;quality;qualityValue;qualityHeader;qualityItem;speed;speedValue;speedHeader;speedItem;audio;audioValue;audioHeader;audioItem;danmakuOpacityBar;danmakuOpacityBarWrap;danmakuOpacityBarWrapWrap;danmakuOpacityBox;danmakuOpacityValue;dtime;controller;commentInput;commentButton;commentSettingBox;commentSettingButton;commentSettingFill;commentSendButton;commentSendFill;commentColorSettingBox;browserFullButton;webFullButton;pipButton;menu;menuItem;cameraButton;airplayButton;subtitleButton;subtitleButtonInner;subtitle;barPreview;barWrap;notice;infoPanel;infoPanelClose;infoMimeType;infoVersion;infoVideoFPS;infoPageFPS;infoDroppedFrames;infoType;infoUrl;infoResolution;infoDuration;infoBufferRemain;infoDownloadSpeed;constructor(e){this.container=e.container,this.options=e.options,this.index=e.index,this.tran=e.tran,this.init()}init(){this.container.innerHTML=Li()({options:this.options,index:this.index,tran:this.tran,icons:Di,mobile:v.isMobile,video:{current:!0,pic:this.options.video.pic,screenshot:this.options.screenshot,airplay:this.options.airplay,preload:this.options.preload,url:this.options.video.url,subtitle:this.options.subtitle,crossOrigin:this.options.crossOrigin}}),this.volumeBar=this.container.querySelector(\".dplayer-volume-bar-inner\"),this.volumeBarWrap=this.container.querySelector(\".dplayer-volume-bar\"),this.volumeBarWrapWrap=this.container.querySelector(\".dplayer-volume-bar-wrap\"),this.volumeButton=this.container.querySelector(\".dplayer-volume\"),this.volumeButtonIcon=this.container.querySelector(\".dplayer-volume-icon\"),this.volumeIcon=this.container.querySelector(\".dplayer-volume-icon .dplayer-icon-content\"),this.playedBar=this.container.querySelector(\".dplayer-played\"),this.loadedBar=this.container.querySelector(\".dplayer-loaded\"),this.playedBarWrap=this.container.querySelector(\".dplayer-bar-wrap\"),this.playedBarTime=this.container.querySelector(\".dplayer-bar-time\"),this.danmaku=this.container.querySelector(\".dplayer-danmaku\"),this.danmakuLoading=this.container.querySelector(\".dplayer-danloading\"),this.video=this.container.querySelector(\".dplayer-video-current\"),this.bezel=this.container.querySelector(\".dplayer-bezel-icon\"),this.playButton=this.container.querySelector(\".dplayer-play-icon\"),this.playIcon=this.container.querySelector(\".dplayer-play-icon .dplayer-icon-content\"),this.mobileBackwardButton=this.container.querySelector(\".dplayer-mobile-icon-backward\"),this.mobilePlayButton=this.container.querySelector(\".dplayer-mobile-icon-play\"),this.mobileForwardButton=this.container.querySelector(\".dplayer-mobile-icon-forward\"),this.videoWrap=this.container.querySelector(\".dplayer-video-wrap\"),this.videoWrapAspect=this.container.querySelector(\".dplayer-video-wrap-aspect\"),this.controllerMask=this.container.querySelector(\".dplayer-controller-mask\"),this.ptime=this.container.querySelector(\".dplayer-ptime\"),this.settingButton=this.container.querySelector(\".dplayer-setting-icon\"),this.settingBox=this.container.querySelector(\".dplayer-setting-box\"),this.settingOriginPanel=this.container.querySelector(\".dplayer-setting-origin-panel\"),this.mask=this.container.querySelector(\".dplayer-mask\"),this.syncButton=this.container.querySelector(\".dplayer-live-badge\"),this.loop=this.container.querySelector(\".dplayer-setting-loop\"),this.loopToggle=this.container.querySelector(\".dplayer-setting-loop .dplayer-toggle-setting-input\"),this.showDanmaku=this.container.querySelector(\".dplayer-setting-showdan\"),this.showDanmakuToggle=this.container.querySelector(\".dplayer-showdan-setting-input\"),this.unlimitDanmaku=this.container.querySelector(\".dplayer-setting-danunlimit\"),this.unlimitDanmakuToggle=this.container.querySelector(\".dplayer-danunlimit-setting-input\"),this.quality=this.container.querySelector(\".dplayer-setting-quality\"),this.qualityValue=this.container.querySelector(\".dplayer-setting-quality .dplayer-label-value\"),this.qualityHeader=this.container.querySelector(\".dplayer-setting-quality-header\"),this.qualityItem=this.container.querySelectorAll(\".dplayer-setting-quality-item\"),this.speed=this.container.querySelector(\".dplayer-setting-speed\"),this.speedValue=this.container.querySelector(\".dplayer-setting-speed .dplayer-label-value\"),this.speedHeader=this.container.querySelector(\".dplayer-setting-speed-header\"),this.speedItem=this.container.querySelectorAll(\".dplayer-setting-speed-item\"),this.audio=this.container.querySelector(\".dplayer-setting-audio\"),this.audioValue=this.container.querySelector(\".dplayer-setting-audio .dplayer-label-value\"),this.audioHeader=this.container.querySelector(\".dplayer-setting-audio-header\"),this.audioItem=this.container.querySelectorAll(\".dplayer-setting-audio-item\"),this.danmakuOpacityBar=this.container.querySelector(\".dplayer-danmaku-bar-inner\"),this.danmakuOpacityBarWrap=this.container.querySelector(\".dplayer-danmaku-bar\"),this.danmakuOpacityBarWrapWrap=this.container.querySelector(\".dplayer-danmaku-bar-wrap\"),this.danmakuOpacityBox=this.container.querySelector(\".dplayer-setting-danmaku\"),this.danmakuOpacityValue=this.container.querySelector(\".dplayer-setting-danmaku .dplayer-label-value\"),this.dtime=this.container.querySelector(\".dplayer-dtime\"),this.controller=this.container.querySelector(\".dplayer-controller\"),this.commentInput=this.container.querySelector(\".dplayer-comment-input\"),this.commentButton=this.container.querySelector(\".dplayer-comment-icon\"),this.commentSettingBox=this.container.querySelector(\".dplayer-comment-setting-box\"),this.commentSettingButton=this.container.querySelector(\".dplayer-comment-setting-icon\"),this.commentSettingFill=this.container.querySelector(\".dplayer-comment-setting-icon path\"),this.commentSendButton=this.container.querySelector(\".dplayer-send-icon\"),this.commentSendFill=this.container.querySelector(\".dplayer-send-icon path\"),this.commentColorSettingBox=this.container.querySelector(\".dplayer-comment-setting-color\"),this.browserFullButton=this.container.querySelector(\".dplayer-full-icon\"),this.webFullButton=this.container.querySelector(\".dplayer-full-in-icon\"),this.pipButton=this.container.querySelector(\".dplayer-pip-icon\"),this.menu=this.container.querySelector(\".dplayer-menu\"),this.menuItem=this.container.querySelectorAll(\".dplayer-menu-item\"),this.cameraButton=this.container.querySelector(\".dplayer-camera-icon\"),this.airplayButton=this.container.querySelector(\".dplayer-airplay-icon\"),this.subtitleButton=this.container.querySelector(\".dplayer-subtitle-icon\"),this.subtitleButtonInner=this.container.querySelector(\".dplayer-subtitle-icon .dplayer-icon-content\"),this.subtitle=this.container.querySelector(\".dplayer-subtitle\"),this.barPreview=this.container.querySelector(\".dplayer-bar-preview\"),this.barWrap=this.container.querySelector(\".dplayer-bar-wrap\"),this.notice=this.container.querySelector(\".dplayer-notice\"),this.infoPanel=this.container.querySelector(\".dplayer-info-panel\"),this.infoPanelClose=this.container.querySelector(\".dplayer-info-panel-close\"),this.infoMimeType=this.container.querySelector(\".dplayer-info-panel-item-mimetype .dplayer-info-panel-item-data\"),this.infoVersion=this.container.querySelector(\".dplayer-info-panel-item-version .dplayer-info-panel-item-data\"),this.infoVideoFPS=this.container.querySelector(\".dplayer-info-panel-item-video-fps .dplayer-info-panel-item-data\"),this.infoPageFPS=this.container.querySelector(\".dplayer-info-panel-item-page-fps .dplayer-info-panel-item-data\"),this.infoDroppedFrames=this.container.querySelector(\".dplayer-info-panel-item-dropped-frames .dplayer-info-panel-item-data\"),this.infoType=this.container.querySelector(\".dplayer-info-panel-item-type .dplayer-info-panel-item-data\"),this.infoUrl=this.container.querySelector(\".dplayer-info-panel-item-url .dplayer-info-panel-item-data\"),this.infoResolution=this.container.querySelector(\".dplayer-info-panel-item-resolution .dplayer-info-panel-item-data\"),this.infoDuration=this.container.querySelector(\".dplayer-info-panel-item-duration .dplayer-info-panel-item-data\"),this.infoBufferRemain=this.container.querySelector(\".dplayer-info-panel-item-buffer-remain .dplayer-info-panel-item-data\"),this.infoDownloadSpeed=this.container.querySelector(\".dplayer-info-panel-item-download-speed .dplayer-info-panel-item-data\")}};const zi=class{options;player;container;danTunnel;danIndex;danFontSize;dan;_opacity;events;unlimited;context=null;showing;paused=!1;constructor(e){this.options=e,this.player=this.options.player,this.container=this.options.container,this.danTunnel={right:{},top:{},bottom:{}},this.danIndex=0,this.danFontSize=24,this.dan=[],this.showing=!0,this._opacity=this.options.opacity,this.events=this.options.events,this.unlimited=1===this.options.unlimited,this._measure(\"\",0),this.load()}load(){let e;if(this.options.api.address){const t=Object.assign({},this.options.api.id?{id:this.options.api.id}:{},this.options.api.maximum?{max:this.options.api.maximum}:{}),i=Object.entries(t).map(([e,t])=>`${e}=${t}`).join(\"&\");e=i?`${this.options.api.address}?${i}`:this.options.api.address}const t=(this.options.api.addition||[]).slice(0);e&&t.push(e),this.options.apiBackend!==jt&&t.push(\"apiBackend\"),this.events&&this.events.trigger(\"danmaku_load_start\",t),this._readAllEndpoints(t,e=>{this.dan=[].concat(...e).sort((e,t)=>e.time-t.time),window.requestAnimationFrame(()=>{this.frame()}),this.options.callback(),this.events&&this.events.trigger(\"danmaku_load_end\")})}reload(e){this.options.api=e,this.dan=[],this.clear(),this.load()}_readAllEndpoints(e,t){const i=[];let n=0,a=0;for(let r=0;r<e.length;++r)this.options.apiBackend.read({url:e[r],success:n=>{i[r]=n,++a,a===e.length&&t(i)},error:o=>{o&&this.options.error(o),i[r]=[],++n,++a,a===e.length&&(n!==e.length?this.options.error(this.options.tran(\"Danmaku load partial failed\")):this.options.error(this.options.tran(\"Danmaku load failed\")),t(i))}})}send(e,t,i=!1){const n={token:this.options.api.token,id:this.options.api.id,author:this.options.api.user,time:this.options.time(),text:e.text,color:e.color,type:e.type,size:e.size};this.options.apiBackend.send({url:this.options.api.address,data:n,success:()=>{this.dan.splice(this.danIndex,0,n),this.danIndex++,this.draw({text:n.text,color:n.color,type:n.type,size:n.size,border:!0}),this.events&&this.events.trigger(\"danmaku_send\",n),t()},error:e=>{this.options.error(e||this.options.tran(\"Danmaku send failed\")),!0===i&&t()}})}frame(){if(this.dan.length&&!this.paused&&this.showing){let e=this.dan[this.danIndex];const t=[];for(;e&&this.options.time()>(\"number\"==typeof e.time?e.time:parseFloat(e.time));)t.push(e),e=this.dan[++this.danIndex];this.draw(t)}window.requestAnimationFrame(()=>{this.frame()})}opacity(e){return void 0!==e&&(this.container.style.setProperty(\"--dplayer-danmaku-opacity\",`${e}`),this._opacity=e,this.events&&this.events.trigger(\"danmaku_opacity\",this._opacity)),this._opacity}draw(e){if(this.showing){let t;t=\"[object Array]\"!==Object.prototype.toString.call(e)?[e]:e;const i=1.25;let n=this.container.offsetWidth/1024*i;n>=1&&(n=1);let a=this.options.fontSize*n;const r=a+6*n,o=this.container.offsetWidth,s=this.container.offsetHeight/r,l=e=>{const t=e.offsetWidth||parseInt(e.style.width),i=e.getBoundingClientRect().right||this.container.getBoundingClientRect().right+t;return this.container.getBoundingClientRect().right-i},d=e=>(o+e)/5,p=(e,t,i)=>{const n=o/d(i);for(let i=0;this.unlimited||i<s;i++){const a=this.danTunnel[t][i+\"\"];if(!a||!a.length)return this.danTunnel[t][i+\"\"]=[e],e.addEventListener(\"animationend\",()=>{this.danTunnel[t][i+\"\"].splice(0,1)}),i%s;if(\"right\"===t)for(let r=0;r<a.length;r++){const p=l(a[r])-10;if(p<=o-n*d(parseInt(a[r].style.width))||p<=0)break;if(r===a.length-1)return this.danTunnel[t][i+\"\"].push(e),e.addEventListener(\"animationend\",()=>{this.danTunnel[t][i+\"\"].splice(0,1)}),i%s}}return-1},c=document.createDocumentFragment();for(let e=0;e<t.length;e++){const i=t[e];switch(\"number\"==typeof i.color&&isFinite(i.color)&&(i.color=v.number2Color(i.color)),\"number\"==typeof i.type&&isFinite(i.type)&&(i.type=v.number2Type(i.type)),i.color||(i.color=\"#ffeaea\"),(!i.type||\"right\"!==i.type&&\"top\"!==i.type&&\"bottom\"!==i.type)&&(i.type=\"right\"),i.size||(i.size=\"medium\"),i.size){case\"big\":a*=1.25;break;case\"small\":a*=.8}const n=(()=>{let e=0;for(const t of i.text.split(\"\\n\")){const i=this._measure(t,a);i>e&&(e=i)}return e})(),s=i.text.split(\"\\n\");for(const e of\"bottom\"===i.type?s.reverse():s){const t=document.createElement(\"div\");if(t.classList.add(\"dplayer-danmaku-item\"),t.classList.add(`dplayer-danmaku-${i.type}`),t.classList.add(`dplayer-danmaku-size-${i.size}`),t.style.color=i.color,\"border\"in i&&i.border){const i=document.createElement(\"span\");i.style.border=`2px solid ${this.options.borderColor}`,i.textContent=e,t.appendChild(i)}else t.textContent=e;t.addEventListener(\"animationend\",()=>{this.container.removeChild(t)});const a=p(t,i.type,n);switch(i.type){case\"right\":a>=0&&(t.style.width=n+1+\"px\",t.style.top=r*a+8+\"px\",t.style.transform=`translateX(-${o}px)`,t.style.willChange=\"transform\",v.isWebKit&&(t.style.display=\"none\"));break;case\"top\":a>=0&&(t.style.width=n+1+\"px\",t.style.top=r*a+8+\"px\",t.style.willChange=\"visibility\");break;case\"bottom\":a>=0&&(t.style.width=n+1+\"px\",t.style.bottom=r*a+8+\"px\",t.style.willChange=\"visibility\");break;default:console.error(`Can't handled danmaku type: ${i.type}`)}a>=0&&(t.classList.add(\"dplayer-danmaku-move\"),t.style.animationDuration=this._danAnimation(i.type),c.appendChild(t),v.isWebKit&&\"right\"===i.type&&setTimeout(()=>{t.style.display=\"\"},0))}}return this.container.style.setProperty(\"--dplayer-danmaku-font-size\",`${a}px`),this.container.appendChild(c),c}return null}play(){this.paused=!1}pause(){this.paused=!0}_measure(e,t){this.context&&this.danFontSize===t||(this.danFontSize=t,this.context=document.createElement(\"canvas\").getContext(\"2d\"),this.context.font=`bold ${this.danFontSize}px \"Segoe UI\", Arial`);const i=e.split(\"\\n\");let n=0;for(let e=0;e<i.length;e++)n=Math.max(n,this.context.measureText(i[e]).width);return n}seek(){this.clear();for(let e=0;e<this.dan.length;e++){if(this.dan[e].time>=this.options.time()){this.danIndex=e;break}this.danIndex=this.dan.length}}clear(){this.danTunnel={right:{},top:{},bottom:{}},this.danIndex=0,this.options.container.innerHTML=\"\",this.events&&this.events.trigger(\"danmaku_clear\")}resize(){const e=this.container.offsetWidth,t=this.container.querySelectorAll(\".dplayer-danmaku-item\");for(let i=0;i<t.length;i++)t[i].style.transform=`translateX(-${e}px)`}hide(){this.showing=!1,this.pause(),this.clear(),this.events&&this.events.trigger(\"danmaku_hide\")}show(){this.seek(),this.showing=!0,this.play(),this.events&&this.events.trigger(\"danmaku_show\")}toggle(){this.showing?this.hide():this.show()}unlimit(e){this.unlimited=e}speed(e){this.options.speedRate=e}_danAnimation(e){const t=this.options.speedRate,i=this.player.fullScreen.isFullScreen(\"browser\")||this.player.fullScreen.isFullScreen(\"web\");return{top:(i?4.5:4)/t+\"s\",right:(i?5.5:5)/t+\"s\",bottom:(i?4.5:4)/t+\"s\"}[e]}};const Gi=class{events;videoEvents;playerEvents;constructor(){this.events={},this.videoEvents=[\"abort\",\"canplay\",\"canplaythrough\",\"durationchange\",\"emptied\",\"ended\",\"error\",\"loadeddata\",\"loadedmetadata\",\"loadstart\",\"mozaudioavailable\",\"pause\",\"play\",\"playing\",\"progress\",\"ratechange\",\"seeked\",\"seeking\",\"stalled\",\"suspend\",\"timeupdate\",\"volumechange\",\"waiting\"],this.playerEvents=[\"screenshot\",\"thumbnails_show\",\"thumbnails_hide\",\"danmaku_show\",\"danmaku_hide\",\"danmaku_clear\",\"danmaku_load_start\",\"danmaku_load_end\",\"danmaku_send\",\"danmaku_opacity\",\"contextmenu_show\",\"contextmenu_hide\",\"notice_show\",\"notice_hide\",\"quality_start\",\"quality_end\",\"destroy\",\"resize\",\"fullscreen\",\"fullscreen_cancel\",\"webfullscreen\",\"webfullscreen_cancel\",\"subtitle_show\",\"subtitle_hide\",\"subtitle_change\"]}on(e,t,i=!1){this.type(e)&&\"function\"==typeof t&&(this.events[e]||(this.events[e]=[]),this.events[e].push({callback:t,once:i}))}off(e,t){if(this.type(e)&&\"function\"==typeof t&&this.events[e])for(const i of this.events[e])i.callback===t&&this.events[e].splice(this.events[e].indexOf(i),1)}trigger(e,t){if(this.events[e]&&this.events[e].length)for(const i of this.events[e])i.callback(t),i.once&&this.off(e,i.callback)}type(e){return-1!==this.playerEvents.indexOf(e)?\"player\":-1!==this.videoEvents.indexOf(e)?\"video\":(console.error(`Unknown event name: ${e}`),null)}};const qi=class{player;lastScrollPosition;fullscreenchange;constructor(e){this.player=e,this.lastScrollPosition={left:0,top:0},this.player.events.on(\"webfullscreen\",()=>{this.player.resize()}),this.player.events.on(\"webfullscreen_cancel\",()=>{this.player.resize(),v.setScrollPosition(this.lastScrollPosition)}),this.fullscreenchange=()=>{this.player.resize(),this.isFullScreen(\"browser\")?this.player.events.trigger(\"fullscreen\"):(v.setScrollPosition(this.lastScrollPosition),this.player.container.classList.remove(\"dplayer-fulled-browser\"),this.player.events.trigger(\"fullscreen_cancel\"))},void 0!==this.player.container.onfullscreenchange?this.player.container.addEventListener(\"fullscreenchange\",this.fullscreenchange):this.player.container.addEventListener(\"webkitfullscreenchange\",this.fullscreenchange)}isFullScreen(e=\"browser\"){switch(e){case\"browser\":{const e=document.fullscreenElement||document.webkitFullscreenElement;return!(!e||e!==this.player.container)}case\"web\":return this.player.container.classList.contains(\"dplayer-fulled\")}}request(e=\"browser\"){const t=\"browser\"===e?\"web\":\"browser\",i=this.isFullScreen(t);switch(i||(this.lastScrollPosition=v.getScrollPosition()),e){case\"browser\":if(this.player.container.requestFullscreen=this.player.container.requestFullscreen||this.player.container.webkitRequestFullscreen,void 0!==this.player.container.requestFullscreen?this.player.container.requestFullscreen():this.player.video.webkitEnterFullscreen&&this.player.video.webkitEnterFullscreen(),screen.orientation)try{screen.orientation.lock(\"landscape\").catch(()=>{})}catch(e){}void 0!==this.player.container.requestFullscreen&&this.player.container.classList.add(\"dplayer-fulled-browser\");break;case\"web\":this.player.container.classList.add(\"dplayer-fulled\"),document.body.classList.add(\"dplayer-web-fullscreen-fix\"),this.player.events.trigger(\"webfullscreen\")}i&&this.cancel(t)}cancel(e=\"browser\"){switch(e){case\"browser\":if(document.exitFullscreen=document.exitFullscreen||document.webkitExitFullscreen,document.exitFullscreen&&document.exitFullscreen(),screen.orientation)try{screen.orientation.unlock()}catch(e){}this.player.container.classList.remove(\"dplayer-fulled-browser\");break;case\"web\":this.player.container.classList.remove(\"dplayer-fulled\"),document.body.classList.remove(\"dplayer-web-fullscreen-fix\"),this.player.events.trigger(\"webfullscreen_cancel\")}}toggle(e=\"browser\"){this.isFullScreen(e)?this.cancel(e):this.request(e)}destroy(){this.player.container.removeEventListener(\"fullscreenchange\",this.fullscreenchange),this.player.container.removeEventListener(\"webkitfullscreenchange\",this.fullscreenchange)}};const ji=class{storageName;default;data;constructor(e){this.storageName={opacity:\"dplayer-danmaku-opacity\",volume:\"dplayer-volume\",unlimited:\"dplayer-danmaku-unlimited\",danmaku:\"dplayer-danmaku-show\",subtitle:\"dplayer-subtitle-show\",speed:\"dplayer-speed\",loop:\"dplayer-loop\"},this.default={opacity:1,volume:Object.prototype.hasOwnProperty.call(e.options,\"volume\")?e.options.volume:1,unlimited:(e.options.danmaku&&e.options.danmaku.unlimited?1:0)||0,danmaku:1,subtitle:1,speed:1,loop:e.options.loop?1:0},this.data={},this.init()}init(){for(const e in this.storageName){const t=this.storageName[e];this.data[e]=parseFloat(v.storage.get(t)||this.default[e].toString())}}get(e){return this.data[e]}set(e,t){this.data[e]=t,v.storage.set(this.storageName[e],t)}};const Ui=class{container;video;plugins;options;events;constructor(e,t,i,n,a){this.container=e,this.video=t,this.plugins=i,this.options=n,this.events=a,this.init()}init(){if(this.container.style.fontSize=this.options.fontSize,this.container.style.bottom=this.options.bottom,this.container.style.color=this.options.color,\"webvtt\"===this.options.type&&this.video.textTracks&&this.video.textTracks[0]){const e=this.video.textTracks[0];e.oncuechange=()=>{if(!e.activeCues)return;const t=e.activeCues[0];if(this.container.innerHTML=\"\",t){const e=document.createElement(\"div\");e.appendChild(t.getCueAsHTML());const i=e.innerHTML.split(/\\r?\\n/).map(e=>`<p>${e}</p>`).join(\"\");this.container.innerHTML=i}this.events.trigger(\"subtitle_change\")}}}show(){this.container.classList.remove(\"dplayer-subtitle-hide\"),\"aribb24\"===this.options.type&&this.plugins.aribb24Caption&&this.plugins.aribb24Caption.show(),this.events.trigger(\"subtitle_show\")}hide(){this.container.classList.add(\"dplayer-subtitle-hide\"),\"aribb24\"===this.options.type&&this.plugins.aribb24Caption&&this.plugins.aribb24Caption.hide(),this.events.trigger(\"subtitle_hide\")}toggle(){this.container.classList.contains(\"dplayer-subtitle-hide\")?this.show():this.hide()}};const Hi=class{elements;constructor(e){this.elements={},this.elements.volume=e.volumeBar,this.elements.played=e.playedBar,this.elements.loaded=e.loadedBar,this.elements.danmaku=e.danmakuOpacityBar}set(e,t,i){t=Math.max(t,0),t=Math.min(t,1),this.elements[e].style[i]=100*t+\"%\"}get(e){return parseFloat(this.elements[e].style.width)/100}};const Ni=class{player;types;enablefpsChecker;enableinfoChecker;enableloadingChecker;fpsIndex;fpsStart;fpsChecker;infoChecker;loadingChecker;constructor(e){this.player=e,window.requestAnimationFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)},this.types=[\"loading\",\"info\",\"fps\"],this.init()}init(){this.types.map(e=>(\"fps\"!==e&&this[`init${e}Checker`](),e))}initloadingChecker(){let e=0,t=0,i=!1;this.loadingChecker=window.setInterval(()=>{this.enableloadingChecker&&(t=this.player.video.currentTime,i||t!==e||this.player.video.paused||(this.player.container.classList.add(\"dplayer-loading\"),i=!0),i&&t>e&&!this.player.video.paused&&(this.player.container.classList.remove(\"dplayer-loading\"),i=!1),e=t)},100)}initfpsChecker(){window.requestAnimationFrame(()=>{if(this.enablefpsChecker)if(this.initfpsChecker(),this.fpsStart){this.fpsIndex++;const e=new Date;e-this.fpsStart>1e3&&(this.player.infoPanel.fps(this.fpsIndex/(e-this.fpsStart)*1e3),this.fpsStart=new Date,this.fpsIndex=0)}else this.fpsStart=new Date,this.fpsIndex=0;else this.fpsStart=0,this.fpsIndex=0})}initinfoChecker(){this.infoChecker=window.setInterval(()=>{this.enableinfoChecker&&this.player.infoPanel.update()},1e3)}enable(e){this[`enable${e}Checker`]=!0,\"fps\"===e&&this.initfpsChecker()}disable(e){this[`enable${e}Checker`]=!1}destroy(){this.types.map(e=>(this[`enable${e}Checker`]=!1,this[`${e}Checker`]&&window.clearInterval(this[`${e}Checker`]),e))}};const Wi=class{container;constructor(e){this.container=e,this.container.addEventListener(\"animationend\",()=>{this.container.classList.remove(\"dplayer-bezel-transition\")})}switch(e){this.container.innerHTML=e,this.container.classList.add(\"dplayer-bezel-transition\")}};const Ji=class{player;container;barWidth;events;viewportWidth=180;viewportHeight=101;thumbnailSpace=v.isMobile?6:26;width;height;interval;totalCount;columnCount;magnificationScale;constructor(e){this.player=e.player,this.container=this.player.template.barPreview,this.barWidth=this.player.template.barWrap.offsetWidth,this.events=e.events,this.interval=e.interval,e.interval?this.totalCount=Math.ceil(this.player.video.duration/e.interval):this.totalCount=e.totalCount||100,this.width=e.width||160,this.height=e.height||Math.floor(9*this.width/16),this.columnCount=e.columnCount||100,this.magnificationScale=this.viewportWidth/this.width,this.player.template.barWrap.style.setProperty(\"--thumbnail-url\",`url(${e.url})`),this.container.style.width=`${this.viewportWidth}px`,this.container.style.height=`${this.viewportHeight}px`,this.container.style.top=-this.viewportHeight-this.thumbnailSpace+\"px\",this.container.style.backgroundPosition=\"0 0\",this.player.on(\"durationchange\",()=>{this.resize(this.width,this.height,this.barWidth)})}resize(e,t,i){this.width=e,this.height=t,this.barWidth=i,this.interval&&(this.totalCount=Math.ceil(this.player.video.duration/this.interval));const n=Math.ceil(this.totalCount/this.columnCount),a=this.columnCount*e*this.magnificationScale,r=n*t*this.magnificationScale;this.container.style.width=`${this.viewportWidth}px`,this.container.style.height=`${this.viewportHeight}px`,this.container.style.top=-this.viewportHeight-this.thumbnailSpace+\"px\",this.container.style.backgroundSize=`${a}px ${r}px`}show(){this.container.style.display=\"block\",this.events&&this.events.trigger(\"thumbnails_show\")}move(e){const t=Math.max(0,Math.min(Math.floor(e/this.barWidth*this.totalCount),this.totalCount-1)),i=t%this.columnCount,n=Math.floor(t/this.columnCount),a=i*this.width,r=n*this.height;this.container.style.backgroundPosition=`-${a*this.magnificationScale}px -${r*this.magnificationScale}px`;const o=Math.min(Math.max(e-this.container.offsetWidth/2,-10),this.barWidth-(this.viewportWidth-10));this.container.style.left=`${o}px`}hide(){this.container.style.display=\"none\",this.events&&this.events.trigger(\"thumbnails_hide\")}};const Vi=class{player;disableAutoHide=!1;autoHideTimer;mobileSkipTimer;mobileBackwardTime;mobileForwardTime;setAutoHideHandler;thumbnails=null;constructor(e){this.player=e,this.autoHideTimer=0,this.mobileSkipTimer=0,this.mobileBackwardTime=0,this.mobileForwardTime=0,this.setAutoHideHandler=()=>this.setAutoHide(),v.isMobile?this.player.container.addEventListener(\"touchmove\",this.setAutoHideHandler):(this.player.container.addEventListener(\"mousemove\",this.setAutoHideHandler),this.player.container.addEventListener(\"click\",this.setAutoHideHandler)),this.player.on(\"play\",this.setAutoHideHandler),this.player.on(\"pause\",this.setAutoHideHandler),this.initPlayButton(),this.initThumbnails(),this.initPlayedBar(),this.initFullButton(),this.initPipButton(),this.initSyncButton(),this.initScreenshotButton(),this.initSubtitleButton(),this.initHighlights(),this.initAirplayButton(),v.isMobile||this.initVolumeButton()}initPlayButton(){this.player.template.playButton.addEventListener(\"click\",()=>{this.player.toggle()}),this.player.template.mobilePlayButton.addEventListener(\"click\",()=>{this.player.toggle()}),v.isMobile?(this.player.template.videoWrap.addEventListener(\"click\",()=>{this.toggle(),this.isShow()&&this.setAutoHide()}),this.player.template.controllerMask.addEventListener(\"click\",()=>{this.toggle(),this.isShow()&&this.setAutoHide()})):(this.player.template.videoWrap.addEventListener(\"click\",()=>{this.player.toggle()}),this.player.template.controllerMask.addEventListener(\"click\",()=>{this.player.toggle()})),this.player.template.mobileBackwardButton.addEventListener(\"click\",()=>{this.mobileBackwardTime+=10,this.player.seek(this.player.video.currentTime-10),this.player.notice(this.player.tran(\"REW progress\",this.mobileBackwardTime.toFixed(0))),window.clearTimeout(this.mobileSkipTimer),this.mobileSkipTimer=window.setTimeout(()=>{this.mobileBackwardTime=0},1e3),this.setAutoHide()}),this.player.template.mobileForwardButton.addEventListener(\"click\",()=>{this.mobileForwardTime+=10,this.player.seek(this.player.video.currentTime+10),this.player.notice(this.player.tran(\"FF progress\",this.mobileForwardTime.toFixed(0))),window.clearTimeout(this.mobileSkipTimer),this.mobileSkipTimer=window.setTimeout(()=>{this.mobileForwardTime=0},1e3),this.setAutoHide()})}initHighlights(){this.player.on(\"durationchange\",()=>{if(1!==this.player.video.duration&&this.player.video.duration!==1/0&&this.player.options.highlight){const e=this.player.template.playedBarWrap.querySelectorAll(\".dplayer-highlight\");[].slice.call(e,0).forEach(e=>{this.player.template.playedBarWrap.removeChild(e)});for(let e=0;e<this.player.options.highlight.length;e++){if(!this.player.options.highlight[e].text||!this.player.options.highlight[e].time)continue;const t=document.createElement(\"div\");t.classList.add(\"dplayer-highlight\"),t.style.left=this.player.options.highlight[e].time/this.player.video.duration*100+\"%\";const i=document.createElement(\"span\");i.classList.add(\"dplayer-highlight-text\"),i.textContent=this.player.options.highlight[e].text,t.appendChild(i),this.player.template.playedBarWrap.insertBefore(t,this.player.template.playedBarTime)}}})}initThumbnails(){if(this.player.options.video.thumbnails){const e=this.player.options.video.thumbnails;this.thumbnails=new Ji({player:this.player,url:e.url,events:this.player.events,interval:e.interval,totalCount:e.totalCount,width:e.width,height:e.height,columnCount:e.columnCount}),this.player.on(\"loadedmetadata\",()=>{const t=e.width||160,i=e.height||Math.floor(9*t/16);this.thumbnails.resize(t,i,this.player.template.barWrap.offsetWidth)})}}initPlayedBar(){let e;const t=e=>{const t=e;e.preventDefault();let i=v.getRelativeX(t,this.player.template.playedBarWrap)/this.player.template.playedBarWrap.clientWidth;i=Math.max(i,0),i=Math.min(i,1),this.player.bar.set(\"played\",i,\"width\");const n=v.getVideoDuration(this.player.video,this.player.template);this.player.template.ptime.textContent=v.secondToTime(i*n),this.player.container.classList.add(\"dplayer-seeking\"),this.player.video.paused||this.player.video.pause()},i=n=>{const a=n;document.removeEventListener(v.nameMap.dragEnd,i),document.removeEventListener(v.nameMap.dragMove,t),this.player.container.removeEventListener(v.nameMap.dragEnd,i),this.player.container.removeEventListener(v.nameMap.dragMove,t);let r=v.getRelativeX(a,this.player.template.playedBarWrap)/this.player.template.playedBarWrap.clientWidth;r=Math.max(r,0),r=Math.min(r,1),this.player.bar.set(\"played\",r,\"width\");const o=v.getVideoDuration(this.player.video,this.player.template);this.player.seek(this.player.bar.get(\"played\")*o,!0),e||this.player.video.play(),this.player.container.classList.remove(\"dplayer-seeking\")};this.player.template.playedBarWrap.addEventListener(v.nameMap.dragStart,n=>{n.preventDefault(),e=this.player.video.paused,document.addEventListener(v.nameMap.dragMove,t,{passive:!1}),document.addEventListener(v.nameMap.dragEnd,i),this.player.container.addEventListener(v.nameMap.dragMove,t,{passive:!1}),this.player.container.addEventListener(v.nameMap.dragEnd,i)},{passive:!1}),this.player.template.playedBarWrap.addEventListener(v.nameMap.dragMove,e=>{e.preventDefault();const t=e,i=v.getVideoDuration(this.player.video,this.player.template);if(i){const e=v.getRelativeX(t,this.player.template.playedBarWrap);if(e<0||e>this.player.template.playedBarWrap.offsetWidth)return;const n=i*(e/this.player.template.playedBarWrap.offsetWidth);v.isMobile&&this.thumbnails&&this.thumbnails.show(),this.thumbnails&&this.thumbnails.move(e),this.player.template.playedBarTime.style.left=e-(n>=3600?27.5:22.5)+\"px\",this.player.template.playedBarTime.textContent=v.secondToTime(n),this.player.template.playedBarTime.classList.remove(\"hidden\")}},{passive:!1}),this.player.template.playedBarWrap.addEventListener(v.nameMap.dragEnd,()=>{v.isMobile&&this.thumbnails&&this.thumbnails.hide()}),v.isMobile||(this.player.template.playedBarWrap.addEventListener(\"mouseenter\",()=>{this.player.video.duration&&(this.thumbnails&&this.thumbnails.show(),this.player.template.playedBarTime.classList.remove(\"hidden\"))}),this.player.template.playedBarWrap.addEventListener(\"mouseleave\",()=>{this.player.video.duration&&(this.thumbnails&&this.thumbnails.hide(),this.player.template.playedBarTime.classList.add(\"hidden\"))}))}initFullButton(){this.player.template.browserFullButton.addEventListener(\"click\",()=>{this.player.fullScreen.toggle(\"browser\")}),this.player.template.webFullButton.addEventListener(\"click\",()=>{this.player.fullScreen.toggle(\"web\")})}initPipButton(){document.pictureInPictureEnabled?this.player.template.pipButton.addEventListener(\"click\",()=>{document.pictureInPictureElement?document.exitPictureInPicture():this.player.video.requestPictureInPicture().catch(e=>{console.error(e),this.player.notice(this.player.tran(\"PIP not supported\"),void 0,void 0,\"#FF6F6A\")})}):this.player.template.pipButton.style.display=\"none\"}initVolumeButton(){const e=e=>{const t=e,i=(v.getRelativeX(t,this.player.template.volumeBarWrap)-5.5)/35;this.player.volume(i)},t=()=>{document.removeEventListener(v.nameMap.dragEnd,t),document.removeEventListener(v.nameMap.dragMove,e),this.player.container.removeEventListener(v.nameMap.dragEnd,t),this.player.container.removeEventListener(v.nameMap.dragMove,e),this.player.template.volumeButton.classList.remove(\"dplayer-volume-active\")};this.player.template.volumeBarWrapWrap.addEventListener(\"click\",e=>{const t=e,i=(v.getRelativeX(t,this.player.template.volumeBarWrap)-5.5)/35;this.player.volume(i)}),this.player.template.volumeBarWrapWrap.addEventListener(v.nameMap.dragStart,()=>{document.addEventListener(v.nameMap.dragMove,e),document.addEventListener(v.nameMap.dragEnd,t),this.player.container.addEventListener(v.nameMap.dragMove,e),this.player.container.addEventListener(v.nameMap.dragEnd,t),this.player.template.volumeButton.classList.add(\"dplayer-volume-active\")}),this.player.template.volumeButtonIcon.addEventListener(\"click\",()=>{this.player.video.muted?(this.player.video.muted=!1,this.player.switchVolumeIcon(),this.player.bar.set(\"volume\",this.player.volume(),\"width\")):(this.player.video.muted=!0,this.player.template.volumeIcon.innerHTML=Di.volumeOff,this.player.bar.set(\"volume\",0,\"width\"))})}initSyncButton(){this.player.options.live&&this.player.template.syncButton.addEventListener(\"click\",()=>{this.player.sync()})}initScreenshotButton(){this.player.options.screenshot&&this.player.template.cameraButton.addEventListener(\"click\",()=>{const e=document.createElement(\"canvas\");e.width=this.player.video.videoWidth,e.height=this.player.video.videoHeight,e.getContext(\"2d\").drawImage(this.player.video,0,0,e.width,e.height),e.toBlob(e=>{if(null===e)return;const t=new Date,i=`Capture_${t.getFullYear()}${(\"0\"+(t.getMonth()+1)).slice(-2)}${(\"0\"+t.getDate()).slice(-2)}-${(\"0\"+t.getHours()).slice(-2)}${(\"0\"+t.getMinutes()).slice(-2)}${(\"0\"+t.getSeconds()).slice(-2)}.jpg`,n=URL.createObjectURL(e),a=document.createElement(\"a\");void 0!==a.download?(a.download=i,a.href=n,a.click(),URL.revokeObjectURL(n),this.player.events.trigger(\"screenshot\",e)):this.player.notice(\"Error: Screenshot download is not supported.\",void 0,void 0,\"#FF6F6A\")},\"image/jpeg\",1)})}initAirplayButton(){this.player.options.airplay&&(window.WebKitPlaybackTargetAvailabilityEvent?this.player.video.addEventListener(\"webkitplaybacktargetavailabilitychanged\",function(e){if(\"available\"===e.availability)this.template.airplayButton.disable=!1;else this.template.airplayButton.disable=!0;this.template.airplayButton.addEventListener(\"click\",function(){this.video.webkitShowPlaybackTargetPicker()}.bind(this))}.bind(this.player)):this.player.template.airplayButton.style.display=\"none\")}initSubtitleButton(){this.player.options.subtitle&&(this.player.events.on(\"subtitle_show\",()=>{this.player.template.subtitleButton.ariaLabel=this.player.tran(\"Hide subtitle\"),this.player.template.subtitleButtonInner.style.opacity=\"\",this.player.user.set(\"subtitle\",1)}),this.player.events.on(\"subtitle_hide\",()=>{this.player.template.subtitleButton.ariaLabel=this.player.tran(\"Show subtitle\"),this.player.template.subtitleButtonInner.style.opacity=\"0.4\",this.player.user.set(\"subtitle\",0)}),this.player.template.subtitleButton.addEventListener(\"click\",()=>{null!==this.player.subtitle&&this.player.subtitle.toggle()}))}setAutoHide(e=3e3){this.show(),window.clearTimeout(this.autoHideTimer),this.autoHideTimer=window.setTimeout(()=>{!this.player.video.played.length||this.player.paused||this.disableAutoHide||this.hide()},e)}show(){this.player.container.classList.remove(\"dplayer-hide-controller\")}hide(){this.player.container.classList.add(\"dplayer-hide-controller\"),this.player.setting.hide(),this.player.comment&&this.player.comment.hide()}isShow(){return!this.player.container.classList.contains(\"dplayer-hide-controller\")}toggle(){this.isShow()?this.hide():this.show()}destroy(){v.isMobile?this.player.container.removeEventListener(\"touchmove\",this.setAutoHideHandler):(this.player.container.removeEventListener(\"mousemove\",this.setAutoHideHandler),this.player.container.removeEventListener(\"click\",this.setAutoHideHandler)),window.clearTimeout(this.autoHideTimer)}};const Ki=class{player;loop;showDanmaku;unlimitDanmaku;currentAudio=\"primary\";resizeObserver;constructor(e){this.player=e,this.player.template.mask.addEventListener(\"click\",()=>{this.hide()}),this.player.template.settingButton.addEventListener(\"click\",()=>{this.show()});const t=()=>{const e=this.player.template.settingOriginPanel.scrollHeight;this.player.template.settingBox.style.clipPath=`inset(calc(100% - ${e}px) 0 0 round 7px)`};if(t(),this.resizeObserver=new ResizeObserver(t),this.resizeObserver.observe(this.player.template.settingOriginPanel),this.player.options.video.quality){this.player.template.quality.addEventListener(\"click\",()=>{this.player.template.settingBox.classList.add(\"dplayer-setting-box-quality\")}),this.player.template.qualityHeader.addEventListener(\"click\",()=>{this.player.template.settingBox.classList.remove(\"dplayer-setting-box-quality\")});for(let e=0;e<this.player.template.qualityItem.length;e++)this.player.template.qualityItem[e].addEventListener(\"click\",()=>{this.player.switchingQuality||this.player.switchQuality(parseInt(this.player.template.qualityItem[e].dataset.index))})}this.player.template.speed.addEventListener(\"click\",()=>{this.player.template.settingBox.classList.add(\"dplayer-setting-box-speed\")}),this.player.template.speedHeader.addEventListener(\"click\",()=>{this.player.template.settingBox.classList.remove(\"dplayer-setting-box-speed\")});for(let e=0;e<this.player.template.speedItem.length;e++)this.player.template.speedItem[e].addEventListener(\"click\",e=>{this.player.speed(parseFloat(e.target.dataset.speed))});this.player.template.audio.addEventListener(\"click\",()=>{this.player.template.settingBox.classList.add(\"dplayer-setting-box-audio\")}),this.player.template.audioHeader.addEventListener(\"click\",()=>{this.player.template.settingBox.classList.remove(\"dplayer-setting-box-audio\")});for(let e=0;e<this.player.template.audioItem.length;e++)this.player.template.audioItem[e].addEventListener(\"click\",()=>{if(this.player.plugins.mpegts&&window.mpegts&&this.player.plugins.mpegts instanceof window.mpegts.MSEPlayer){if(this.player.template.audioItem[e].dataset.audio===this.currentAudio)return;\"primary\"===this.player.template.audioItem[e].dataset.audio?(this.currentAudio=\"primary\",this.player.template.audioItem[0].classList.add(\"dplayer-setting-audio-current\"),this.player.template.audioItem[1].classList.remove(\"dplayer-setting-audio-current\"),this.player.template.audioValue.textContent=this.player.tran(\"Primary audio\"),this.player.plugins.mpegts.switchPrimaryAudio()):\"secondary\"===this.player.template.audioItem[e].dataset.audio&&(this.currentAudio=\"secondary\",this.player.template.audioItem[0].classList.remove(\"dplayer-setting-audio-current\"),this.player.template.audioItem[1].classList.add(\"dplayer-setting-audio-current\"),this.player.template.audioValue.textContent=this.player.tran(\"Secondary audio\"),this.player.plugins.mpegts.switchSecondaryAudio()),this.player.template.settingBox.classList.remove(\"dplayer-setting-box-audio\")}else if(this.player.plugins.hls&&window.Hls&&this.player.plugins.hls instanceof window.Hls){const t=this.player.plugins.hls;if(t.audioTracks.length<=1)return;if(this.player.template.audioItem[e].dataset.audio===this.currentAudio)return;\"primary\"===this.player.template.audioItem[e].dataset.audio?(this.currentAudio=\"primary\",this.player.template.audioItem[0].classList.add(\"dplayer-setting-audio-current\"),this.player.template.audioItem[1].classList.remove(\"dplayer-setting-audio-current\"),this.player.template.audioValue.textContent=this.player.tran(\"Primary audio\"),t.audioTrack=0):\"secondary\"===this.player.template.audioItem[e].dataset.audio&&(this.currentAudio=\"secondary\",this.player.template.audioItem[0].classList.remove(\"dplayer-setting-audio-current\"),this.player.template.audioItem[1].classList.add(\"dplayer-setting-audio-current\"),this.player.template.audioValue.textContent=this.player.tran(\"Secondary audio\"),t.audioTrack=1),this.player.template.settingBox.classList.remove(\"dplayer-setting-box-audio\")}});if(this.loop=1===this.player.user.get(\"loop\"),this.player.template.loopToggle.checked=this.loop,this.player.template.loop.addEventListener(\"click\",()=>{this.player.template.loopToggle.checked=!this.player.template.loopToggle.checked,this.player.template.loopToggle.checked?this.loop=!0:this.loop=!1,this.player.user.set(\"loop\",this.loop?1:0)}),this.showDanmaku=1===this.player.user.get(\"danmaku\"),this.showDanmaku||this.player.danmaku&&this.player.danmaku.hide(),this.player.template.showDanmakuToggle.checked=this.showDanmaku,this.player.template.showDanmaku.addEventListener(\"click\",()=>{this.player.template.showDanmakuToggle.checked=!this.player.template.showDanmakuToggle.checked,this.player.template.showDanmakuToggle.checked?(this.showDanmaku=!0,null!==this.player.danmaku&&this.player.danmaku.show()):(this.showDanmaku=!1,null!==this.player.danmaku&&this.player.danmaku.hide()),this.player.user.set(\"danmaku\",this.showDanmaku?1:0)}),this.unlimitDanmaku=1===this.player.user.get(\"unlimited\"),this.player.template.unlimitDanmakuToggle.checked=this.unlimitDanmaku,this.player.template.unlimitDanmaku.addEventListener(\"click\",()=>{this.player.template.unlimitDanmakuToggle.checked=!this.player.template.unlimitDanmakuToggle.checked,this.player.template.unlimitDanmakuToggle.checked?(this.unlimitDanmaku=!0,null!==this.player.danmaku&&this.player.danmaku.unlimit(!0)):(this.unlimitDanmaku=!1,null!==this.player.danmaku&&this.player.danmaku.unlimit(!1)),this.player.user.set(\"unlimited\",this.unlimitDanmaku?1:0)}),this.player.danmaku){this.player.on(\"danmaku_opacity\",e=>{this.player.bar.set(\"danmaku\",e,\"width\"),this.player.user.set(\"opacity\",e),this.player.template.danmakuOpacityValue.textContent=e.toFixed(1)}),this.player.danmaku.opacity(this.player.user.get(\"opacity\")),this.player.template.danmakuOpacityValue.textContent=this.player.user.get(\"opacity\").toFixed(1);const e=e=>{const t=e,i=this.player.template.danmakuOpacityBarWrap.clientWidth;let n=v.getRelativeX(t,this.player.template.danmakuOpacityBarWrap)/i;n=Math.max(n,0),n=Math.min(n,1),null!==this.player.danmaku&&this.player.danmaku.opacity(n)},t=()=>{document.removeEventListener(v.nameMap.dragEnd,t),document.removeEventListener(v.nameMap.dragMove,e),this.player.container.removeEventListener(v.nameMap.dragEnd,t),this.player.container.removeEventListener(v.nameMap.dragMove,e),this.player.template.danmakuOpacityBox.classList.remove(\"dplayer-setting-danmaku-active\")};this.player.template.danmakuOpacityBarWrapWrap.addEventListener(\"click\",e=>{const t=e,i=this.player.template.danmakuOpacityBarWrap.clientWidth;let n=v.getRelativeX(t,this.player.template.danmakuOpacityBarWrap)/i;n=Math.max(n,0),n=Math.min(n,1),null!==this.player.danmaku&&this.player.danmaku.opacity(n)}),this.player.template.danmakuOpacityBarWrapWrap.addEventListener(v.nameMap.dragStart,()=>{document.addEventListener(v.nameMap.dragMove,e),document.addEventListener(v.nameMap.dragEnd,t),this.player.container.addEventListener(v.nameMap.dragMove,e),this.player.container.addEventListener(v.nameMap.dragEnd,t),this.player.template.danmakuOpacityBox.classList.add(\"dplayer-setting-danmaku-active\")})}}hide(){this.player.template.container.classList.remove(\"dplayer-show-controller\"),this.player.template.settingBox.classList.remove(\"dplayer-setting-box-open\"),this.player.template.mask.classList.remove(\"dplayer-mask-show\"),window.setTimeout(()=>{this.player.template.settingBox.classList.remove(\"dplayer-setting-box-speed\"),this.player.template.settingBox.classList.remove(\"dplayer-setting-box-audio\")},300),this.player.controller.disableAutoHide=!1}show(){this.player.template.container.classList.add(\"dplayer-show-controller\"),this.player.template.settingBox.classList.add(\"dplayer-setting-box-open\"),this.player.template.mask.classList.add(\"dplayer-mask-show\"),this.player.controller.disableAutoHide=!0}destroy(){this.resizeObserver.disconnect()}};const Xi=class{player;constructor(e){this.player=e,this.player.template.mask.addEventListener(\"click\",()=>{this.hide()}),this.player.template.commentButton.addEventListener(\"click\",()=>{this.show()}),this.player.template.commentSettingButton.addEventListener(\"click\",()=>{this.toggleSetting()}),this.player.template.commentColorSettingBox.addEventListener(\"click\",()=>{if(this.player.template.commentColorSettingBox.querySelector(\"input:checked+span\")){const e=this.player.template.commentColorSettingBox.querySelector(\"input:checked\").value;this.player.template.commentSettingFill.style.fill=e,this.player.template.commentInput.style.color=e,this.player.template.commentSendFill.style.fill=e}}),this.player.template.commentInput.addEventListener(\"click\",()=>{this.hideSetting()}),this.player.template.commentInput.addEventListener(\"keydown\",e=>{13===(e||window.event).keyCode&&this.send()}),this.player.template.commentSendButton.addEventListener(\"click\",()=>{this.send()})}show(){this.player.controller.disableAutoHide=!0,this.player.template.controller.classList.add(\"dplayer-controller-comment\"),this.player.template.mask.classList.add(\"dplayer-mask-show\"),this.player.container.classList.add(\"dplayer-show-controller\"),this.player.template.commentInput.focus()}hide(){this.player.template.controller.classList.remove(\"dplayer-controller-comment\"),this.player.template.mask.classList.remove(\"dplayer-mask-show\"),this.player.container.classList.remove(\"dplayer-show-controller\"),this.player.controller.disableAutoHide=!1,this.hideSetting()}showSetting(){this.player.template.commentSettingBox.classList.add(\"dplayer-comment-setting-open\")}hideSetting(){this.player.template.commentSettingBox.classList.remove(\"dplayer-comment-setting-open\")}toggleSetting(){this.player.template.commentSettingBox.classList.contains(\"dplayer-comment-setting-open\")?this.hideSetting():this.showSetting()}send(){!0===this.player.options.danmaku?.closeCommentFormAfterSend&&this.player.template.commentInput.blur(),this.player.template.commentInput.value.replace(/^\\s+|\\s+$/g,\"\")?(null!==this.player.danmaku&&this.player.danmaku.send({text:this.player.template.commentInput.value,color:this.player.container.querySelector(\".dplayer-comment-setting-color input:checked\").value,type:this.player.container.querySelector(\".dplayer-comment-setting-type input:checked\").value,size:this.player.container.querySelector(\".dplayer-comment-setting-size input:checked\").value},()=>{!0===this.player.options.danmaku?.closeCommentFormAfterSend&&(this.hide(),this.player.controller.setAutoHide(750))},!0),this.player.template.commentInput.value=\"\"):this.player.notice(this.player.tran(\"Please input danmaku content\"),void 0,void 0,\"#FF6F6A\")}};const Yi=class{player;doHotKeyHandler;cancelFullScreenHandler;constructor(e){this.player=e,this.doHotKeyHandler=this.doHotKey.bind(this),this.cancelFullScreenHandler=this.cancelFullScreen.bind(this),this.player.options.hotkey&&document.addEventListener(\"keydown\",this.doHotKeyHandler),document.addEventListener(\"keydown\",this.cancelFullScreenHandler)}doHotKey(e){const t=document.activeElement?.tagName.toUpperCase(),i=document.activeElement?.getAttribute(\"contenteditable\");if(\"INPUT\"!==t&&\"TEXTAREA\"!==t&&\"\"!==i&&\"true\"!==i){const t=e||window.event;let i;switch(t.keyCode){case 32:(this.player.focus||this.player.options.hotkey)&&(t.preventDefault(),this.player.toggle());break;case 37:(this.player.focus||this.player.options.hotkey)&&(t.preventDefault(),t.altKey?this.player.seek(this.player.video.currentTime-60):t.shiftKey?this.player.seek(this.player.video.currentTime-30):t.ctrlKey||t.metaKey?this.player.seek(this.player.video.currentTime-15):this.player.seek(this.player.video.currentTime-5),this.player.controller.setAutoHide());break;case 39:(this.player.focus||this.player.options.hotkey)&&(t.preventDefault(),t.altKey?this.player.seek(this.player.video.currentTime+60):t.shiftKey?this.player.seek(this.player.video.currentTime+30):t.ctrlKey||t.metaKey?this.player.seek(this.player.video.currentTime+15):this.player.seek(this.player.video.currentTime+5),this.player.controller.setAutoHide());break;case 38:this.player.focus&&(t.preventDefault(),i=this.player.volume()+.1,this.player.volume(i));break;case 40:this.player.focus&&(t.preventDefault(),i=this.player.volume()-.1,this.player.volume(i));break;case 70:t.ctrlKey||t.metaKey||(t.preventDefault(),this.player.fullScreen.toggle(\"browser\"));break;case 87:t.ctrlKey||t.metaKey||(t.preventDefault(),this.player.fullScreen.toggle(\"web\"));break;case 76:this.player.options.live&&(t.preventDefault(),this.player.sync());break;case 80:this.player.options.pictureInPicture&&document.pictureInPictureEnabled&&(t.preventDefault(),this.player.template.pipButton.click());break;case 67:\"object\"==typeof this.player.options.danmaku&&this.player.options.danmaku&&(t.ctrlKey||t.metaKey||(t.preventDefault(),this.player.controller.show(),null!=this.player.comment&&this.player.comment.show()));break;case 68:\"object\"==typeof this.player.options.danmaku&&this.player.options.danmaku&&(t.ctrlKey||t.metaKey||(t.preventDefault(),this.player.template.showDanmaku.click(),this.player.template.showDanmakuToggle.checked?this.player.notice(`${this.player.tran(\"Show comment\")}`):this.player.notice(`${this.player.tran(\"Hide comment\")}`)));break;case 83:this.player.options.subtitle&&(t.ctrlKey||t.metaKey||(t.preventDefault(),null!==this.player.subtitle&&(this.player.subtitle.container.classList.contains(\"dplayer-subtitle-hide\")?this.player.notice(`${this.player.tran(\"Show subtitle\")}`):this.player.notice(`${this.player.tran(\"Hide subtitle\")}`),this.player.subtitle.toggle())))}}}cancelFullScreen(e){if(27===(e||window.event).keyCode)this.player.fullScreen.isFullScreen(\"web\")&&this.player.fullScreen.cancel(\"web\")}destroy(){this.player.options.hotkey&&document.removeEventListener(\"keydown\",this.doHotKeyHandler),document.removeEventListener(\"keydown\",this.cancelFullScreenHandler)}};const $i=class{contextmenuHandler;player;shown;constructor(e){this.player=e,this.shown=!1,Array.prototype.slice.call(this.player.template.menuItem).forEach((e,t)=>{this.player.options.contextmenu[t].click&&e.addEventListener(\"click\",()=>{const e=this.player.options.contextmenu[t];e.click&&e.click(this.player),this.hide()})}),this.contextmenuHandler=e=>{const t=e||window.event;if(t.preventDefault(),this.shown)return void this.hide();const i=this.player.container.getBoundingClientRect();this.show(t.clientX-i.left,t.clientY-i.top),this.player.template.mask.addEventListener(\"click\",()=>{this.hide()})},this.player.container.addEventListener(\"contextmenu\",this.contextmenuHandler)}show(e,t){this.player.template.menu.classList.add(\"dplayer-menu-show\");const i=this.player.container.getBoundingClientRect();e+this.player.template.menu.offsetWidth>=i.width?(this.player.template.menu.style.right=i.width-e+\"px\",this.player.template.menu.style.left=\"initial\"):(this.player.template.menu.style.left=e+\"px\",this.player.template.menu.style.right=\"initial\"),t+this.player.template.menu.offsetHeight>=i.height?(this.player.template.menu.style.bottom=i.height-t+\"px\",this.player.template.menu.style.top=\"initial\"):(this.player.template.menu.style.top=t+\"px\",this.player.template.menu.style.bottom=\"initial\"),this.player.template.mask.classList.add(\"dplayer-mask-show\"),this.shown=!0,this.player.events.trigger(\"contextmenu_show\")}hide(){this.player.template.mask.classList.remove(\"dplayer-mask-show\"),this.player.template.menu.classList.remove(\"dplayer-menu-show\"),this.shown=!1,this.player.events.trigger(\"contextmenu_hide\")}destroy(){this.player.container.removeEventListener(\"contextmenu\",this.contextmenuHandler)}};const Qi=class{player;container;template;video;beginTime=0;constructor(e){this.player=e,this.container=e.template.infoPanel,this.template=e.template,this.video=e.video,this.template.infoPanelClose.addEventListener(\"click\",()=>{this.hide()})}show(){this.beginTime=Date.now(),this.update(),this.player.timer.enable(\"info\"),this.player.timer.enable(\"fps\"),this.container.classList.remove(\"dplayer-info-panel-hide\")}hide(){this.player.timer.disable(\"info\"),this.player.timer.disable(\"fps\"),this.container.classList.add(\"dplayer-info-panel-hide\")}toggle(){this.container.classList.contains(\"dplayer-info-panel-hide\")?this.show():this.hide()}update(){if(this.template.infoVersion.textContent=\"v1.32.7 19d0c63\",this.template.infoType.textContent=this.player.type,this.template.infoUrl.textContent=this.player.options.video.url??\"N/A\",this.template.infoResolution.textContent=`${this.player.video.videoWidth} x ${this.player.video.videoHeight}`,this.template.infoDuration.textContent=`${this.player.video.duration}`,null!=this.player.video.getVideoPlaybackQuality){const e=this.player.video.getVideoPlaybackQuality();this.template.infoDroppedFrames.textContent=`${e.droppedVideoFrames} / ${e.totalVideoFrames}`}else if(null!=this.player.video.webkitDecodedFrameCount){const e=this.player.video.webkitDecodedFrameCount,t=this.player.video.webkitDroppedFrameCount;this.template.infoDroppedFrames.textContent=`${t} / ${e}`}else this.template.infoDroppedFrames.textContent=\"N/A\";if(this.player.video.buffered.length>0){const e=this.player.video.buffered.length,t=this.player.video.buffered.end(e-1)-this.player.video.currentTime;this.template.infoBufferRemain.textContent=`${t.toFixed(3)} s`}else this.template.infoBufferRemain.textContent=\"N/A\";if(\"mpegts\"===this.player.type||\"flv\"===this.player.type){const e=this.player.plugins.mpegts||this.player.plugins.flvjs;if(e){const t=e.mediaInfo,i=e.statisticsInfo;this.template.infoMimeType.textContent=t.mimeType??\"N/A\",this.template.infoVideoFPS.textContent=`${t.fps?.toFixed(3)??\"N/A\"}`,null!=i.speed?this.template.infoDownloadSpeed.textContent=`${i.speed.toFixed(3)} KB/s`:this.template.infoDownloadSpeed.textContent=\"N/A\"}}else this.template.infoMimeType.textContent=\"N/A\",this.template.infoVideoFPS.textContent=\"N/A\",this.template.infoDownloadSpeed.textContent=\"N/A\"}fps(e){this.template.infoPageFPS.textContent=`${e.toFixed(1)}`}};var Zi=i(194),en=i.n(Zi);let tn=0;const nn=[];const an=class{bar;bezel;comment=null;contextmenu;controller;danmaku=null;events;fullScreen;hotkey;infoPanel;setting;subtitle=null;template;timer;user;container;containerClickFun;docClickFun;focus=!1;narrow=!1;noticeTime=null;options;paused=!1;plugins;prevVideoCurrentTime=0;prevVideo=null;quality=null;qualityIndex=null;switchingQuality=!1;resizeObserver;tran;type=\"auto\";video;constructor(e){this.options=(e=>{const t={container:e.container||document.querySelector(\".dplayer\")||void 0,live:!1,liveSyncMinBufferSize:.8,syncWhenPlayingLive:!0,autoplay:!1,theme:\"#b7daff\",loop:!1,lang:navigator.language.toLowerCase(),screenshot:!1,pictureInPicture:!0,airplay:!0,hotkey:!0,preload:\"metadata\",crossOrigin:null,volume:1,playbackSpeed:[.25,.5,.75,1,1.25,1.5,1.75,2],apiBackend:jt,video:{},contextmenu:[],mutex:!0,pluginOptions:{}};for(const i in t)Object.prototype.hasOwnProperty.call(t,i)&&!Object.prototype.hasOwnProperty.call(e,i)&&(e[i]=t[i]);return e.video&&(!e.video.type&&(e.video.type=\"auto\"),e.video.thumbnails&&(\"string\"==typeof e.video.thumbnails&&(e.video.thumbnails={url:e.video.thumbnails}),!e.video.thumbnails.width&&(e.video.thumbnails.width=160),!e.video.thumbnails.columnCount&&(e.video.thumbnails.columnCount=100),e.video.thumbnails.interval?delete e.video.thumbnails.totalCount:e.video.thumbnails.totalCount||(e.video.thumbnails.totalCount=100))),\"object\"==typeof e.danmaku&&e.danmaku&&(!e.danmaku.user&&(e.danmaku.user=\"DPlayer\"),!e.danmaku.speedRate&&(e.danmaku.speedRate=1),!e.danmaku.fontSize&&(e.danmaku.fontSize=35),!1!==e.danmaku.closeCommentFormAfterSend&&(e.danmaku.closeCommentFormAfterSend=!0)),e.subtitle&&(!e.subtitle.type&&(e.subtitle.type=\"webvtt\"),!e.subtitle.fontSize&&(e.subtitle.fontSize=\"20px\"),!e.subtitle.bottom&&(e.subtitle.bottom=\"40px\"),!e.subtitle.color&&(e.subtitle.color=\"#fff\")),e.video.quality&&(\"string\"==typeof e.video.defaultQuality&&(e.video.quality.forEach((t,i)=>{e.video.defaultQuality===t.name&&(e.video.defaultQuality=i)}),\"string\"==typeof e.video.defaultQuality&&(e.video.defaultQuality=0)),void 0===e.video.defaultQuality&&(e.video.defaultQuality=0),e.video.type=e.video.quality[e.video.defaultQuality].type,e.video.url=e.video.quality[e.video.defaultQuality].url),e.lang&&(e.lang=e.lang.toLowerCase()),e.contextmenu=e.contextmenu.concat([{text:\"Video info\",click:e=>{e.infoPanel.toggle()}},{text:\"DPlayer v1.32.7\",link:\"https://github.com/tsukumijima/DPlayer\"}]),{container:e.container,live:e.live,liveSyncMinBufferSize:e.liveSyncMinBufferSize,syncWhenPlayingLive:e.syncWhenPlayingLive,autoplay:e.autoplay,theme:e.theme,loop:e.loop,lang:e.lang,screenshot:e.screenshot,pictureInPicture:e.pictureInPicture,airplay:e.airplay,hotkey:e.hotkey,preload:e.preload,crossOrigin:e.crossOrigin,volume:e.volume,playbackSpeed:e.playbackSpeed,logo:e.logo,apiBackend:e.apiBackend,video:e.video,subtitle:e.subtitle,danmaku:e.danmaku,contextmenu:e.contextmenu,highlight:e.highlight,mutex:e.mutex,pluginOptions:e.pluginOptions}})({preload:\"webtorrent\"===e.video.type?\"none\":\"metadata\",...e}),this.options.video.quality&&(this.qualityIndex=this.options.video.defaultQuality,this.quality=this.options.video.quality[this.options.video.defaultQuality]),this.tran=new Ht(this.options.lang).tran,this.events=new Gi,this.user=new ji(this),this.container=this.options.container,this.container.classList.add(\"dplayer\"),this.options.live?this.container.classList.add(\"dplayer-live\"):this.container.classList.remove(\"dplayer-live\"),v.isMobile&&this.container.classList.add(\"dplayer-mobile\"),this.narrow=this.container.offsetWidth<=500,this.narrow&&this.container.classList.add(\"dplayer-narrow\"),this.resizeObserver=new ResizeObserver(e=>{for(const t of e)t.target===this.container&&(this.narrow=this.container.offsetWidth<=500,this.narrow?this.container.classList.add(\"dplayer-narrow\"):this.container.classList.remove(\"dplayer-narrow\"));this.resize()}),this.resizeObserver.observe(this.container),this.template=new Pi({container:this.container,options:this.options,index:tn,tran:this.tran}),this.video=this.template.video,this.bar=new Hi(this.template),this.bezel=new Wi(this.template.bezel),this.fullScreen=new qi(this),this.controller=new Vi(this),this.initDanmaku(this.options.danmaku,this.options.apiBackend),this.plugins={},this.docClickFun=()=>{this.focus=!1},this.containerClickFun=()=>{this.focus=!0},document.addEventListener(\"click\",this.docClickFun,!0),this.container.addEventListener(\"click\",this.containerClickFun,!0),this.paused=!0,this.timer=new Ni(this),this.hotkey=new Yi(this),this.contextmenu=new $i(this),this.initVideo(this.video,this.quality&&this.quality.type||this.options.video.type),this.setting=new Ki(this),this.infoPanel=new Qi(this),!this.danmaku&&this.options.autoplay&&this.play(),tn++,nn.push(this)}seek(e,t=!1){e=Math.max(e,0);const i=v.getVideoDuration(this.video,this.template);i&&(e=Math.min(e,i)),t||(this.video.currentTime<e?this.notice(this.tran(\"FF progress\",(e-this.video.currentTime).toFixed(0))):this.video.currentTime>e&&this.notice(this.tran(\"REW progress\",(this.video.currentTime-e).toFixed(0)))),isFinite(e)&&(this.video.currentTime=e),this.danmaku&&this.danmaku.seek(),this.bar.set(\"played\",e/i,\"width\"),this.template.ptime.textContent=v.secondToTime(e)}sync(e=!1){if(this.options.live){const t=v.getVideoDuration(this.video,this.template)-this.options.liveSyncMinBufferSize;try{this.video.currentTime=t}catch(e){return}this.danmaku&&this.danmaku.seek(),this.template.ptime.textContent=v.secondToTime(t),e||this.notice(this.tran(\"Synchronized\"))}}play(e=!1){if(this.paused=!1,this.video.paused&&!v.isMobile&&this.bezel.switch(Di.play),this.template.playIcon.innerHTML=Di.pause,this.template.mobilePlayButton.innerHTML=Di.pause,this.options.live&&this.options.syncWhenPlayingLive&&this.sync(!0),!e){const e=\"mpegts\"===this.type&&this.plugins.mpegts&&this.plugins.mpegts.play.bind(this.plugins.mpegts)||this.video.play.bind(this.video);Promise.resolve(e()).catch(()=>{this.pause()}).then(()=>{})}if(this.timer.enable(\"loading\"),this.container.classList.remove(\"dplayer-paused\"),this.container.classList.add(\"dplayer-playing\"),this.danmaku&&this.danmaku.play(),this.options.mutex)for(let e=0;e<nn.length;e++)this!==nn[e]&&nn[e].pause()}pause(e=!1){this.paused=!0,this.container.classList.remove(\"dplayer-loading\"),this.video.paused||v.isMobile||this.bezel.switch(Di.pause),this.template.playIcon.innerHTML=Di.play,this.template.mobilePlayButton.innerHTML=Di.play,e||this.video.pause(),this.timer.disable(\"loading\"),this.container.classList.remove(\"dplayer-playing\"),this.container.classList.add(\"dplayer-paused\"),this.danmaku&&this.danmaku.pause()}switchVolumeIcon(){this.volume()>=.95?this.template.volumeIcon.innerHTML=Di.volumeUp:this.volume()>0?this.template.volumeIcon.innerHTML=Di.volumeDown:this.template.volumeIcon.innerHTML=Di.volumeOff}volume(e=NaN,t=!1,i=!1){if(\"string\"==typeof e&&(e=parseFloat(e)),!isNaN(e)){e=Math.max(e,0),e=Math.min(e,1),this.bar.set(\"volume\",e,\"width\");const n=`${(100*e).toFixed(0)}%`;this.template.volumeBarWrapWrap.ariaLabel=n,t||this.user.set(\"volume\",e),i||this.notice(`${this.tran(\"Volume\")} ${(100*e).toFixed(0)}%`),this.video.volume=e,this.video.muted&&(this.video.muted=!1),this.switchVolumeIcon()}return this.video.volume}muted(e){return\"boolean\"==typeof e&&(e?(this.video.muted=!0,this.template.volumeIcon.innerHTML=Di.volumeOff,this.bar.set(\"volume\",0,\"width\")):(this.video.muted=!1,this.switchVolumeIcon(),this.bar.set(\"volume\",this.volume(),\"width\"))),this.video.muted}toggle(){this.video.paused?this.play():this.pause()}on(e,t,i=!1){this.events.on(e,t,i)}off(e,t){this.events.off(e,t)}switchVideo(e,t,i=!1,n=jt){this.pause();const a=this.video.currentTime,r=this.video.playbackRate;this.video.poster=e.pic?e.pic:\"\",this.video.src=e.url,this.initMSE(this.video,e.type||\"auto\"),t&&(this.danmaku?(i||(this.bar.set(\"played\",0,\"width\"),this.bar.set(\"loaded\",0,\"width\"),this.template.ptime.textContent=\"00:00\"),this.template.danmaku.innerHTML=\"\",this.danmaku.options.apiBackend=n,\"object\"==typeof t?this.danmaku.reload({id:t.id,address:t.api,token:t.token,maximum:t.maximum,addition:t.addition,user:t.user}):this.danmaku.reload({})):this.initDanmaku(t,n)),i&&!this.options.live&&(0!==a&&this.seek(a),1!==r&&this.speed(r))}initDanmaku(e,t=jt){e?(this.container.classList.remove(\"dplayer-no-danmaku\"),this.template.danmakuLoading.style.display=\"block\",this.danmaku=new zi({player:this,container:this.template.danmaku,opacity:this.user.get(\"opacity\"),callback:()=>{setTimeout(()=>{this.template.danmakuLoading.style.display=\"none\",this.options.autoplay&&this.play()},0)},error:e=>{this.notice(e,void 0,void 0,\"#FF6F6A\")},apiBackend:t,borderColor:this.options.theme,fontSize:\"boolean\"==typeof e?24:e.fontSize||24,time:()=>this.video.currentTime,unlimited:this.user.get(\"unlimited\"),speedRate:\"boolean\"==typeof e?1:e.speedRate||1,api:\"boolean\"==typeof e?{}:{id:e.id,address:e.api,token:e.token,maximum:e.maximum,addition:e.addition,user:e.user},events:this.events,tran:e=>this.tran(e)}),this.comment=new Xi(this)):this.container.classList.add(\"dplayer-no-danmaku\")}initMSE(e,t){if(this.type=t,this.options.video.customType&&this.options.video.customType[t])\"[object Function]\"===Object.prototype.toString.call(this.options.video.customType[t])?this.options.video.customType[t](this.video,this):console.error(`Illegal customType: ${t}`);else switch(\"auto\"===this.type&&(/m3u8(#|\\?|$)/i.exec(e.src)?this.type=\"hls\":/.ts(#|\\?|$)/i.exec(e.src)?this.type=\"mpegts\":/.flv(#|\\?|$)/i.exec(e.src)?this.type=\"flv\":/.mpd(#|\\?|$)/i.exec(e.src)?this.type=\"dash\":this.type=\"normal\"),\"mpegts\"!==this.type&&this.container.classList.add(\"dplayer-no-audio-switching\"),this.type){case\"hls\":if(window.Hls)if(window.Hls.isSupported()){this.plugins.hls&&(this.plugins.aribb24Caption&&(this.plugins.aribb24Caption.dispose(),delete this.plugins.aribb24Caption),this.plugins.aribb24Superimpose&&(this.plugins.aribb24Superimpose.dispose(),delete this.plugins.aribb24Superimpose),this.plugins.hls.destroy(),delete this.plugins.hls);const t=this.options.pluginOptions.hls,i=new window.Hls(t);if(this.plugins.hls=i,i.loadSource(e.src),i.attachMedia(e),i.on(window.Hls.Events.AUDIO_TRACKS_UPDATED,()=>{i.audioTracks.length>=2?this.container.classList.remove(\"dplayer-no-audio-switching\"):this.container.classList.add(\"dplayer-no-audio-switching\")}),this.events.on(\"destroy\",()=>{this.plugins.aribb24Caption&&(this.plugins.aribb24Caption.dispose(),delete this.plugins.aribb24Caption),this.plugins.aribb24Superimpose&&(this.plugins.aribb24Superimpose.dispose(),delete this.plugins.aribb24Superimpose),i.destroy(),delete this.plugins.hls}),this.options.subtitle&&\"aribb24\"===this.options.subtitle.type){void 0===this.options.pluginOptions.aribb24&&(this.options.pluginOptions.aribb24={}),this.options.pluginOptions.aribb24.enableAutoInBandMetadataTextTrackDetection=!1;const t=this.options.pluginOptions.aribb24,n=this.plugins.aribb24Caption=new m.CanvasRenderer({...t,data_identifier:128});if(n.attachMedia(e),n.show(),!0!==this.options.pluginOptions.aribb24.disableSuperimposeRenderer){const i=this.plugins.aribb24Superimpose=new m.CanvasRenderer({...t,data_identifier:129});i.attachMedia(e),i.show()}i.on(window.Hls.Events.FRAG_PARSING_METADATA,(e,t)=>{for(const e of t.samples)this.plugins.aribb24Caption&&this.plugins.aribb24Caption.pushID3v2Data(e.pts,e.data),this.plugins.aribb24Superimpose&&this.plugins.aribb24Superimpose.pushID3v2Data(e.pts,e.data)})}}else if(e.canPlayType(\"application/x-mpegURL\")||e.canPlayType(\"application/vnd.apple.mpegURL\")){if(this.plugins.aribb24Caption&&(this.plugins.aribb24Caption.dispose(),delete this.plugins.aribb24Caption),this.plugins.aribb24Superimpose&&(this.plugins.aribb24Superimpose.dispose(),delete this.plugins.aribb24Superimpose),this.events.on(\"destroy\",()=>{this.plugins.aribb24Caption&&(this.plugins.aribb24Caption.dispose(),delete this.plugins.aribb24Caption),this.plugins.aribb24Superimpose&&(this.plugins.aribb24Superimpose.dispose(),delete this.plugins.aribb24Superimpose)}),this.options.subtitle&&\"aribb24\"===this.options.subtitle.type){void 0===this.options.pluginOptions.aribb24&&(this.options.pluginOptions.aribb24={}),this.options.pluginOptions.aribb24.enableAutoInBandMetadataTextTrackDetection=!0;const t=this.options.pluginOptions.aribb24,i=this.plugins.aribb24Caption=new m.CanvasRenderer({...t,data_identifier:128});if(i.attachMedia(e),i.show(),!0!==this.options.pluginOptions.aribb24.disableSuperimposeRenderer){const i=this.plugins.aribb24Superimpose=new m.CanvasRenderer({...t,data_identifier:129});i.attachMedia(e),i.show()}}}else this.notice(\"Error: HLS is not supported.\",void 0,void 0,\"#FF6F6A\");else this.notice(\"Error: Can't find hls.js.\",void 0,void 0,\"#FF6F6A\");break;case\"mpegts\":if(window.mpegts)if(window.mpegts.isSupported()){this.plugins.mpegts&&(this.plugins.aribb24Caption&&(this.plugins.aribb24Caption.dispose(),delete this.plugins.aribb24Caption),this.plugins.aribb24Superimpose&&(this.plugins.aribb24Superimpose.dispose(),delete this.plugins.aribb24Superimpose),this.plugins.mpegts.unload(),this.plugins.mpegts.detachMediaElement(),this.plugins.mpegts.destroy(),delete this.plugins.mpegts),void 0===this.options.pluginOptions.mpegts&&(this.options.pluginOptions.mpegts={});const t=window.mpegts.createPlayer(Object.assign(this.options.pluginOptions.mpegts.mediaDataSource||{},{type:\"mpegts\",isLive:this.options.live,url:e.src}),this.options.pluginOptions.mpegts.config);if(this.plugins.mpegts=t,t.attachMediaElement(e),t.load(),this.events.on(\"destroy\",()=>{this.plugins.aribb24Caption&&(this.plugins.aribb24Caption.dispose(),delete this.plugins.aribb24Caption),this.plugins.aribb24Superimpose&&(this.plugins.aribb24Superimpose.dispose(),delete this.plugins.aribb24Superimpose),t.unload(),t.detachMediaElement(),t.destroy(),delete this.plugins.mpegts}),this.options.subtitle&&\"aribb24\"===this.options.subtitle.type){void 0===this.options.pluginOptions.aribb24&&(this.options.pluginOptions.aribb24={}),this.options.pluginOptions.aribb24.enableAutoInBandMetadataTextTrackDetection=!1;const i=this.options.pluginOptions.aribb24,n=this.plugins.aribb24Caption=new m.CanvasRenderer({...i,data_identifier:128});if(n.attachMedia(e),n.show(),!0!==this.options.pluginOptions.aribb24.disableSuperimposeRenderer){const t=this.plugins.aribb24Superimpose=new m.CanvasRenderer({...i,data_identifier:129});t.attachMedia(e),t.show()}t.on(window.mpegts.Events.TIMED_ID3_METADATA_ARRIVED,e=>{this.plugins.aribb24Caption&&this.plugins.aribb24Caption.pushID3v2Data(e.pts/1e3,e.data),this.plugins.aribb24Superimpose&&this.plugins.aribb24Superimpose.pushID3v2Data(e.pts/1e3,e.data)})}}else this.notice(\"Error: mpegts.js is not supported.\",void 0,void 0,\"#FF6F6A\");else this.notice(\"Error: Can't find mpegts.js.\",void 0,void 0,\"#FF6F6A\");break;case\"flv\":if(window.flvjs)if(window.flvjs.isSupported()){void 0===this.options.pluginOptions.flv&&(this.options.pluginOptions.flv={});const t=window.flvjs.createPlayer(Object.assign(this.options.pluginOptions.flv.mediaDataSource||{},{type:\"flv\",url:e.src}),this.options.pluginOptions.flv.config);this.plugins.flvjs=t,t.attachMediaElement(e),t.load(),this.events.on(\"destroy\",()=>{t.unload(),t.detachMediaElement(),t.destroy(),delete this.plugins.flvjs})}else this.notice(\"Error: flv.js is not supported.\",void 0,void 0,\"#FF6F6A\");else this.notice(\"Error: Can't find flv.js.\",void 0,void 0,\"#FF6F6A\");break;case\"dash\":if(window.dashjs){const t=window.dashjs.MediaPlayer().create();t.initialize(e,e.src,!1);const i=this.options.pluginOptions.dash;t.updateSettings(i??{}),this.plugins.dash=t,this.events.on(\"destroy\",()=>{t.reset(),delete this.plugins.dash})}else this.notice(\"Error: Can't find dash.js.\",void 0,void 0,\"#FF6F6A\");break;case\"webtorrent\":if(window.WebTorrent)if(window.WebTorrent.WEBRTC_SUPPORT){this.container.classList.add(\"dplayer-loading\");const t=this.options.pluginOptions.webtorrent,i=new window.WebTorrent(t);this.plugins.webtorrent=i;const n=e.src;e.src=\"\",e.preload=\"metadata\",e.addEventListener(\"durationchange\",()=>this.container.classList.remove(\"dplayer-loading\"),{once:!0}),i.add(n,e=>{const t=e.files.find(e=>e.name.endsWith(\".mp4\"));t&&t.renderTo(this.video,{autoplay:this.options.autoplay,controls:!1})}),this.events.on(\"destroy\",()=>{i.remove(n),i.destroy(),delete this.plugins.webtorrent})}else this.notice(\"Error: Webtorrent is not supported.\",void 0,void 0,\"#FF6F6A\");else this.notice(\"Error: Can't find Webtorrent.\",void 0,void 0,\"#FF6F6A\")}}initVideo(e,t){this.initMSE(e,t),this.on(\"durationchange\",()=>{1!==e.duration&&e.duration!==1/0&&(this.template.dtime.textContent=v.secondToTime(e.duration))}),this.on(\"progress\",()=>{const t=v.getVideoDuration(this.video,this.template),i=e.buffered.length?e.buffered.end(e.buffered.length-1)/t:0;this.bar.set(\"loaded\",i,\"width\")}),this.on(\"error\",()=>{this.video.error&&(this.switchingQuality&&(null!==this.prevVideo&&this.template.videoWrapAspect.removeChild(this.prevVideo),this.video.classList.add(\"dplayer-video-current\"),this.prevVideo=null,this.switchingQuality=!1,this.events.trigger(\"quality_end\")),this.tran&&this.notice&&\"webtorrent\"!==this.type&&this.notice(this.tran(\"Video load failed\"),-1,void 0,\"#FF6F6A\"),this.container.classList.remove(\"dplayer-loading\"))}),this.on(\"ended\",()=>{this.bar.set(\"played\",1,\"width\"),this.setting.loop?(this.seek(0),this.play()):this.pause(),this.danmaku&&(this.danmaku.danIndex=0)}),this.on(\"play\",()=>{this.paused&&this.play(!0)}),this.on(\"pause\",()=>{this.paused||this.pause(!0)}),this.on(\"timeupdate\",()=>{const e=v.getVideoDuration(this.video,this.template);this.bar.set(\"played\",this.video.currentTime/e,\"width\");const t=v.secondToTime(this.video.currentTime);this.template.ptime.textContent!==t&&(this.template.ptime.textContent=t)});for(let t=0;t<this.events.videoEvents.length;t++)e.addEventListener(this.events.videoEvents[t],e=>{this.events.trigger(this.events.videoEvents[t],e)});this.volume(this.user.get(\"volume\"),!0,!0);const i=this.user.get(\"speed\");i&&1!==i&&this.speed(i),this.options.subtitle&&(this.subtitle=new Ui(this.template.subtitle,this.video,this.plugins,this.options.subtitle,this.events),this.user.get(\"subtitle\")||this.subtitle.hide())}switchQuality(e){if(e=\"string\"==typeof e?parseInt(e):e,void 0===this.options.video.quality||this.qualityIndex===e||this.switchingQuality)return;this.qualityIndex=e,this.switchingQuality=!0,this.quality=this.options.video.quality[e];const t=this.video.paused;this.video.pause();const i=en()({current:!1,pic:null,screenshot:this.options.screenshot,preload:\"auto\",url:this.quality.url,subtitle:this.options.subtitle,crossOrigin:this.options.crossOrigin}),n=(new DOMParser).parseFromString(i,\"text/html\").body.firstChild;this.template.videoWrapAspect.insertBefore(n,this.template.videoWrapAspect.getElementsByTagName(\"div\")[0]),this.prevVideoCurrentTime=this.video.currentTime,this.prevVideo=this.video,this.video=n,this.initVideo(this.video,this.quality.type||this.options.video.type),this.options.live||this.seek(this.prevVideoCurrentTime),t||this.video.play(),this.notice(this.tran(\"Switching to quality\",this.quality.name),-1),this.container.classList.add(\"dplayer-loading\"),this.events.trigger(\"quality_start\",this.quality),this.template.qualityItem.forEach(t=>{t.classList.remove(\"dplayer-setting-quality-current\"),parseInt(t.dataset.index)===e&&(t.classList.add(\"dplayer-setting-quality-current\"),this.template.qualityValue.textContent=this.quality.name,this.template.settingBox.classList.remove(\"dplayer-setting-box-quality\"))}),this.on(\"canplay\",()=>{if(null!==this.prevVideo){if(!this.options.live&&this.video.currentTime!==this.prevVideoCurrentTime)return void this.seek(this.prevVideoCurrentTime);this.template.videoWrapAspect.removeChild(this.prevVideo),this.video.classList.add(\"dplayer-video-current\"),t||this.video.play(),this.prevVideo=null,this.notice(this.tran(\"Switched to quality\",this.quality.name),1e3),this.switchingQuality=!1;const e=parseFloat(this.template.settingBox.querySelector(\".dplayer-setting-speed-current\").dataset.speed);this.speed(e);if(\"secondary\"===this.template.settingBox.querySelector(\".dplayer-setting-audio-current\").dataset.audio){if(window.mpegts&&this.plugins.mpegts&&this.plugins.mpegts instanceof window.mpegts.MSEPlayer)this.plugins.mpegts.switchSecondaryAudio();else if(window.Hls&&this.plugins.hls&&this.plugins.hls instanceof window.Hls){const e=this.plugins.hls;e.audioTracks.length>=2&&(e.audioTrack=1)}}else if(window.Hls&&this.plugins.hls&&this.plugins.hls instanceof window.Hls){const e=this.plugins.hls;e.audioTracks.length>=2&&(e.audioTrack=0)}this.container.classList.remove(\"dplayer-loading\"),this.events.trigger(\"quality_end\")}})}notice(e,t=2e3,i=.8,n){this.template.notice.textContent=e,this.template.notice.style.opacity=`${i}`,this.template.notice.style.color=n&&\"\"!==n?n:\"\",this.noticeTime&&window.clearTimeout(this.noticeTime),this.events.trigger(\"notice_show\",e),t>0&&(this.noticeTime=window.setTimeout(()=>{this.hideNotice()},t))}hideNotice(){this.template.notice.style.opacity=\"0\",this.events.trigger(\"notice_hide\")}resize(){if(this.danmaku&&this.danmaku.resize(),this.plugins.aribb24Caption&&this.plugins.aribb24Caption.refresh(),this.plugins.aribb24Superimpose&&this.plugins.aribb24Superimpose.refresh(),this.controller.thumbnails){const e=this.options.video.thumbnails,t=e&&e.width||160,i=e&&e.height||Math.floor(9*t/16);this.controller.thumbnails.resize(t,i,this.template.barWrap.offsetWidth)}this.events.trigger(\"resize\")}speed(e){this.video.playbackRate=e,this.user.set(\"speed\",e),this.template.speedItem.forEach(t=>{t.classList.remove(\"dplayer-setting-speed-current\"),parseFloat(t.dataset.speed)===e&&(t.classList.add(\"dplayer-setting-speed-current\"),1===parseFloat(t.dataset.speed)?this.template.speedValue.textContent=this.tran(\"Normal\"):this.template.speedValue.textContent=`${e}`,this.template.settingBox.classList.remove(\"dplayer-setting-box-speed\"))})}destroy(e=!1){nn.splice(nn.indexOf(this),1),this.pause(),document.removeEventListener(\"click\",this.docClickFun,!0),this.container.removeEventListener(\"click\",this.containerClickFun,!0),this.fullScreen.destroy(),this.hotkey.destroy(),this.contextmenu.destroy(),this.controller.destroy(),this.timer.destroy(),this.setting.destroy(),this.resizeObserver.disconnect(),this.video.removeAttribute(\"src\"),e||(this.container.innerHTML=\"\"),this.events.trigger(\"destroy\")}static get version(){return\"1.32.7\"}};const rn=an})(),n=n.default})());\n //# sourceMappingURL=DPlayer.min.js.map\n\\ No newline at end of file\ndiff --git a/dist/DPlayer.min.js.map b/dist/DPlayer.min.js.map\nindex e034002f3336af561d169be31eba02de4907f1e1..552b563547fe4d395235bbd7b4113e4fa6167d87 100644\n--- a/dist/DPlayer.min.js.map\n+++ b/dist/DPlayer.min.js.map\n@@ -1 +1 @@\n-{\"version\":3,\"file\":\"DPlayer.min.js\",\"mappings\":\"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IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAIC,EAAE,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAIC,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,KAAK,KAAK,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAIhB,EAAE,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAKiB,EAAE,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAKC,EAAE,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAKC,EAAE,IAAI0V,IAAI,CAAC,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,MAAM,CAAC,mCAAmC,MAAM,CAAC,mCAAmC,MAAM,CAAC,mCAAmC,MAAM,CAAC,mCAAmC,MAAM,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,OAAOzV,GAAG/E,EAAE,MAAM,IAAI0a,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,QAAQ1V,EAAE,CAAC,EAAE,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,IAAI,MAAM,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM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,KAC1B,IAAI73C,EAAS8nB,EAET4vB,GAAQ90C,KAAK+0C,OAASD,GAAQ90C,KAAK+0C,MAAM7vB,KAEzC9nB,EAAS03C,GAAQ90C,KAAK+0C,MAAM7vB,IAEhC,IAAI7nB,EAAI,EAER,OAAOD,EAAOqS,QAAQ,OAAQ,IAAMwlC,EAAI53C,MAAQ,IAExD,E,6cCFA,MAyBA,GAzBc,CACV63C,KAAM,KACNC,MAAO,KACPC,SAAU,KACVC,QAAS,KACTC,SAAU,KACVC,WAAY,KACZC,UAAW,KACXC,KAAM,KACNC,QAAS,KACTC,IAAK,KACLC,QAAS,KACT/rC,KAAM,KACNC,MAAO,KACP+rC,MAAO,KACPC,QAAS,KACTC,WAAY,KACZlO,KAAM,KACNmO,SAAU,KACVC,OAAQ,KACRC,SAAU,KACVC,QAAS,KACTC,QAAS,M,yBC2Kb,SAnNA,MACI3pB,UACAhvB,QACA0B,MACA61C,KAEAqB,UACAC,cACAC,kBACAC,aACAC,iBACAC,WACAC,UACAC,UACAC,cACAC,cACAC,QACAC,eACA/qB,MACAgrB,MACAC,WACAC,SACAC,qBACAC,iBACAC,oBACAC,UACAC,gBACAC,eACAC,MACAC,cACAC,WACAC,mBACAC,KACAC,WACAC,KACAC,WACAC,YACAC,kBACAC,eACAC,qBACAC,QACAC,aACAC,cACAC,YACAC,MACAC,WACAC,YACAC,UACAC,MACAC,WACAC,YACAC,UACAC,kBACAC,sBACAC,0BACAC,kBACAC,oBACAjtB,MACA2b,WACAuR,aACAC,cACAC,kBACAC,qBACAC,mBACAC,kBACAC,gBACAC,uBACAC,kBACAC,cACAC,UACAC,KACAC,SACAC,aACAC,cACAC,eACAC,oBACArE,SACAsE,WACAC,QACAC,OACAC,UACAC,eACAC,aACAC,YACAC,aACAC,YACAC,kBACAC,SACAC,QACAC,eACAC,aACAC,iBACAC,kBAEA,WAAAp0C,CAAY1J,GACRuC,KAAKysB,UAAYhvB,EAAQgvB,UACzBzsB,KAAKvC,QAAUA,EAAQA,QACvBuC,KAAKb,MAAQ1B,EAAQ0B,MACrBa,KAAKg1C,KAAOv3C,EAAQ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\",\"sources\":[\"webpack://dplayer/webpack/universalModuleDefinition\",\"webpack://dplayer/./src/assets/comment.svg\",\"webpack://dplayer/./src/assets/airplay.svg\",\"webpack://dplayer/./src/assets/subtitle.svg\",\"webpack://dplayer/./src/assets/pause.svg\",\"webpack://dplayer/./node_modules/css-loader/dist/runtime/sourceMaps.js\",\"webpack://dplayer/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\",\"webpack://dplayer/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\",\"webpack://dplayer/./src/assets/left.svg\",\"webpack://dplayer/./node_modules/style-loader/dist/runtime/styleTagTransform.js\",\"webpack://dplayer/./node_modules/css-loader/dist/runtime/api.js\",\"webpack://dplayer/./src/assets/pallette.svg\",\"webpack://dplayer/./node_modules/art-template/lib/runtime.js\",\"webpack://dplayer/./node_modules/aribb24.js/dist/aribb24.js\",\"webpack://dplayer/./src/assets/comment-off.svg\",\"webpack://dplayer/./src/assets/backward.svg\",\"webpack://dplayer/./Users/hiram/Data/code/DPlayer/src/template/video.art\",\"webpack://dplayer/./src/assets/volume-off.svg\",\"webpack://dplayer/./src/assets/volume-up.svg\",\"webpack://dplayer/./src/assets/play.svg\",\"webpack://dplayer/./src/css/index.scss\",\"webpack://dplayer/./src/assets/loading.svg\",\"webpack://dplayer/./Users/hiram/Data/code/DPlayer/src/template/player.art\",\"webpack://dplayer/./src/assets/right.svg\",\"webpack://dplayer/./src/assets/send.svg\",\"webpack://dplayer/./src/assets/volume-down.svg\",\"webpack://dplayer/./node_modules/style-loader/dist/runtime/insertStyleElement.js\",\"webpack://dplayer/./src/assets/camera.svg\",\"webpack://dplayer/./src/assets/check.svg\",\"webpack://dplayer/./src/assets/pip.svg\",\"webpack://dplayer/./node_modules/style-loader/dist/runtime/insertBySelector.js\",\"webpack://dplayer/./src/assets/full.svg\",\"webpack://dplayer/./node_modules/style-loader/dist/runtime/styleDomAPI.js\",\"webpack://dplayer/./src/assets/forward.svg\",\"webpack://dplayer/./node_modules/art-template/lib/compile/runtime.js\",\"webpack://dplayer/./node_modules/balloon-css/balloon.css\",\"webpack://dplayer/./src/assets/setting.svg\",\"webpack://dplayer/./src/assets/full-web.svg\",\"webpack://dplayer/webpack/bootstrap\",\"webpack://dplayer/webpack/runtime/compat get default export\",\"webpack://dplayer/webpack/runtime/define property getters\",\"webpack://dplayer/webpack/runtime/global\",\"webpack://dplayer/webpack/runtime/hasOwnProperty shorthand\",\"webpack://dplayer/webpack/runtime/make namespace object\",\"webpack://dplayer/webpack/runtime/nonce\",\"webpack://dplayer/./src/css/index.scss?a858\",\"webpack://dplayer/./src/ts/utils.ts\",\"webpack://dplayer/./node_modules/axios/lib/helpers/bind.js\",\"webpack://dplayer/./node_modules/axios/lib/utils.js\",\"webpack://dplayer/./node_modules/axios/lib/core/AxiosError.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/toFormData.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/AxiosURLSearchParams.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/buildURL.js\",\"webpack://dplayer/./node_modules/axios/lib/core/InterceptorManager.js\",\"webpack://dplayer/./node_modules/axios/lib/defaults/transitional.js\",\"webpack://dplayer/./node_modules/axios/lib/platform/browser/index.js\",\"webpack://dplayer/./node_modules/axios/lib/platform/browser/classes/URLSearchParams.js\",\"webpack://dplayer/./node_modules/axios/lib/platform/browser/classes/FormData.js\",\"webpack://dplayer/./node_modules/axios/lib/platform/browser/classes/Blob.js\",\"webpack://dplayer/./node_modules/axios/lib/platform/common/utils.js\",\"webpack://dplayer/./node_modules/axios/lib/platform/index.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/formDataToJSON.js\",\"webpack://dplayer/./node_modules/axios/lib/defaults/index.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/toURLEncodedForm.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/parseHeaders.js\",\"webpack://dplayer/./node_modules/axios/lib/core/AxiosHeaders.js\",\"webpack://dplayer/./node_modules/axios/lib/core/transformData.js\",\"webpack://dplayer/./node_modules/axios/lib/cancel/isCancel.js\",\"webpack://dplayer/./node_modules/axios/lib/cancel/CanceledError.js\",\"webpack://dplayer/./node_modules/axios/lib/core/settle.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/speedometer.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/throttle.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/progressEventReducer.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/isURLSameOrigin.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/cookies.js\",\"webpack://dplayer/./node_modules/axios/lib/core/buildFullPath.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/isAbsoluteURL.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/combineURLs.js\",\"webpack://dplayer/./node_modules/axios/lib/core/mergeConfig.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/resolveConfig.js\",\"webpack://dplayer/./node_modules/axios/lib/adapters/xhr.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/parseProtocol.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/composeSignals.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/trackStream.js\",\"webpack://dplayer/./node_modules/axios/lib/adapters/fetch.js\",\"webpack://dplayer/./node_modules/axios/lib/adapters/adapters.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/null.js\",\"webpack://dplayer/./node_modules/axios/lib/core/dispatchRequest.js\",\"webpack://dplayer/./node_modules/axios/lib/env/data.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/validator.js\",\"webpack://dplayer/./node_modules/axios/lib/core/Axios.js\",\"webpack://dplayer/./node_modules/axios/lib/cancel/CancelToken.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/HttpStatusCode.js\",\"webpack://dplayer/./node_modules/axios/lib/axios.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/spread.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/isAxiosError.js\",\"webpack://dplayer/./src/ts/api.ts\",\"webpack://dplayer/./src/ts/i18n.ts\",\"webpack://dplayer/./src/ts/icons.ts\",\"webpack://dplayer/./src/ts/template.ts\",\"webpack://dplayer/./src/ts/danmaku.ts\",\"webpack://dplayer/./src/ts/events.ts\",\"webpack://dplayer/./src/ts/fullscreen.ts\",\"webpack://dplayer/./src/ts/user.ts\",\"webpack://dplayer/./src/ts/subtitle.ts\",\"webpack://dplayer/./src/ts/bar.ts\",\"webpack://dplayer/./src/ts/timer.ts\",\"webpack://dplayer/./src/ts/bezel.ts\",\"webpack://dplayer/./src/ts/thumbnails.ts\",\"webpack://dplayer/./src/ts/controller.ts\",\"webpack://dplayer/./src/ts/setting.ts\",\"webpack://dplayer/./src/ts/comment.ts\",\"webpack://dplayer/./src/ts/hotkey.ts\",\"webpack://dplayer/./src/ts/contextmenu.ts\",\"webpack://dplayer/./src/ts/info-panel.ts\",\"webpack://dplayer/./src/ts/player.ts\",\"webpack://dplayer/./src/ts/options.ts\",\"webpack://dplayer/./src/ts/index.ts\"],\"sourcesContent\":[\"(function webpackUniversalModuleDefinition(root, factory) {\\n\\tif(typeof exports === 'object' && typeof module === 'object')\\n\\t\\tmodule.exports = factory();\\n\\telse if(typeof define === 'function' && define.amd)\\n\\t\\tdefine(\\\"DPlayer\\\", [], factory);\\n\\telse if(typeof exports === 'object')\\n\\t\\texports[\\\"DPlayer\\\"] = factory();\\n\\telse\\n\\t\\troot[\\\"DPlayer\\\"] = factory();\\n})(globalThis, () => {\\nreturn \",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 32\\\\\\\"><path d=\\\\\\\"M27.128 0.38h-22.553c-2.336 0-4.229 1.825-4.229 4.076v16.273c0 2.251 1.893 4.076 4.229 4.076h4.229v-2.685h8.403l-8.784 8.072 1.566 1.44 7.429-6.827h9.71c2.335 0 4.229-1.825 4.229-4.076v-16.273c0-2.252-1.894-4.076-4.229-4.076zM28.538 19.403c0 1.5-1.262 2.717-2.819 2.717h-8.36l-0.076-0.070-0.076 0.070h-11.223c-1.557 0-2.819-1.217-2.819-2.717v-13.589c0-1.501 1.262-2.718 2.819-2.718h19.734c1.557 0 2.819-0.141 2.819 1.359v14.947zM9.206 10.557c-1.222 0-2.215 0.911-2.215 2.036s0.992 2.035 2.215 2.035c1.224 0 2.216-0.911 2.216-2.035s-0.992-2.036-2.216-2.036zM22.496 10.557c-1.224 0-2.215 0.911-2.215 2.036s0.991 2.035 2.215 2.035c1.224 0 2.215-0.911 2.215-2.035s-0.991-2.036-2.215-2.036zM15.852 10.557c-1.224 0-2.215 0.911-2.215 2.036s0.991 2.035 2.215 2.035c1.222 0 2.215-0.911 2.215-2.035s-0.992-2.036-2.215-2.036z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg viewBox=\\\\\\\"0 0 288 288\\\\\\\" xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\"><path d=\\\\\\\"M288 90v96c0 20-16 36-36 36h-10c-16 0-16-24 0-24h10c7 0 12-5 12-12V90c0-7-5-12-12-12H36c-7 0-12 5-12 12v96c0 7 5 12 12 12h10c16 0 16 24 0 24H36c-20 0-36-16-36-36V90c0-20 16-36 36-36h216c20 0 36 16 36 36zm-120 62l48 68c14 20 1 38-20 38H92c-21 0-34-18-20-38l48-68c13-18 35-18 48 0z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 32\\\\\\\"><path d=\\\\\\\"M26.667 5.333h-21.333c-0 0-0.001 0-0.001 0-1.472 0-2.666 1.194-2.666 2.666 0 0 0 0.001 0 0.001v-0 16c0 0 0 0.001 0 0.001 0 1.472 1.194 2.666 2.666 2.666 0 0 0.001 0 0.001 0h21.333c0 0 0.001 0 0.001 0 1.472 0 2.666-1.194 2.666-2.666 0-0 0-0.001 0-0.001v0-16c0-0 0-0.001 0-0.001 0-1.472-1.194-2.666-2.666-2.666-0 0-0.001 0-0.001 0h0zM5.333 16h5.333v2.667h-5.333v-2.667zM18.667 24h-13.333v-2.667h13.333v2.667zM26.667 24h-5.333v-2.667h5.333v2.667zM26.667 18.667h-13.333v-2.667h13.333v2.667z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 17 32\\\\\\\"><path d=\\\\\\\"M14.080 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048zM2.88 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048z\\\\\\\"></path></svg>\\\"\",\"\\\"use strict\\\";\\n\\nmodule.exports = function (item) {\\n  var content = item[1];\\n  var cssMapping = item[3];\\n  if (!cssMapping) {\\n    return content;\\n  }\\n  if (typeof btoa === \\\"function\\\") {\\n    var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\\n    var data = \\\"sourceMappingURL=data:application/json;charset=utf-8;base64,\\\".concat(base64);\\n    var sourceMapping = \\\"/*# \\\".concat(data, \\\" */\\\");\\n    return [content].concat([sourceMapping]).join(\\\"\\\\n\\\");\\n  }\\n  return [content].join(\\\"\\\\n\\\");\\n};\",\"\\\"use strict\\\";\\n\\n/* istanbul ignore next  */\\nfunction setAttributesWithoutAttributes(styleElement) {\\n  var nonce = typeof __webpack_nonce__ !== \\\"undefined\\\" ? __webpack_nonce__ : null;\\n  if (nonce) {\\n    styleElement.setAttribute(\\\"nonce\\\", nonce);\\n  }\\n}\\nmodule.exports = setAttributesWithoutAttributes;\",\"\\\"use strict\\\";\\n\\nvar stylesInDOM = [];\\nfunction getIndexByIdentifier(identifier) {\\n  var result = -1;\\n  for (var i = 0; i < stylesInDOM.length; i++) {\\n    if (stylesInDOM[i].identifier === identifier) {\\n      result = i;\\n      break;\\n    }\\n  }\\n  return result;\\n}\\nfunction modulesToDom(list, options) {\\n  var idCountMap = {};\\n  var identifiers = [];\\n  for (var i = 0; i < list.length; i++) {\\n    var item = list[i];\\n    var id = options.base ? item[0] + options.base : item[0];\\n    var count = idCountMap[id] || 0;\\n    var identifier = \\\"\\\".concat(id, \\\" \\\").concat(count);\\n    idCountMap[id] = count + 1;\\n    var indexByIdentifier = getIndexByIdentifier(identifier);\\n    var obj = {\\n      css: item[1],\\n      media: item[2],\\n      sourceMap: item[3],\\n      supports: item[4],\\n      layer: item[5]\\n    };\\n    if (indexByIdentifier !== -1) {\\n      stylesInDOM[indexByIdentifier].references++;\\n      stylesInDOM[indexByIdentifier].updater(obj);\\n    } else {\\n      var updater = addElementStyle(obj, options);\\n      options.byIndex = i;\\n      stylesInDOM.splice(i, 0, {\\n        identifier: identifier,\\n        updater: updater,\\n        references: 1\\n      });\\n    }\\n    identifiers.push(identifier);\\n  }\\n  return identifiers;\\n}\\nfunction addElementStyle(obj, options) {\\n  var api = options.domAPI(options);\\n  api.update(obj);\\n  var updater = function updater(newObj) {\\n    if (newObj) {\\n      if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\\n        return;\\n      }\\n      api.update(obj = newObj);\\n    } else {\\n      api.remove();\\n    }\\n  };\\n  return updater;\\n}\\nmodule.exports = function (list, options) {\\n  options = options || {};\\n  list = list || [];\\n  var lastIdentifiers = modulesToDom(list, options);\\n  return function update(newList) {\\n    newList = newList || [];\\n    for (var i = 0; i < lastIdentifiers.length; i++) {\\n      var identifier = lastIdentifiers[i];\\n      var index = getIndexByIdentifier(identifier);\\n      stylesInDOM[index].references--;\\n    }\\n    var newLastIdentifiers = modulesToDom(newList, options);\\n    for (var _i = 0; _i < lastIdentifiers.length; _i++) {\\n      var _identifier = lastIdentifiers[_i];\\n      var _index = getIndexByIdentifier(_identifier);\\n      if (stylesInDOM[_index].references === 0) {\\n        stylesInDOM[_index].updater();\\n        stylesInDOM.splice(_index, 1);\\n      }\\n    }\\n    lastIdentifiers = newLastIdentifiers;\\n  };\\n};\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 32\\\\\\\" style=\\\\\\\"transform: scale(-1,1)\\\\\\\"><path d=\\\\\\\"M22 16l-10.105-10.6-1.895 1.987 8.211 8.613-8.211 8.612 1.895 1.988 8.211-8.613z\\\\\\\"></path></svg>\\\"\",\"\\\"use strict\\\";\\n\\n/* istanbul ignore next  */\\nfunction styleTagTransform(css, styleElement) {\\n  if (styleElement.styleSheet) {\\n    styleElement.styleSheet.cssText = css;\\n  } else {\\n    while (styleElement.firstChild) {\\n      styleElement.removeChild(styleElement.firstChild);\\n    }\\n    styleElement.appendChild(document.createTextNode(css));\\n  }\\n}\\nmodule.exports = styleTagTransform;\",\"\\\"use strict\\\";\\n\\n/*\\n  MIT License http://www.opensource.org/licenses/mit-license.php\\n  Author Tobias Koppers @sokra\\n*/\\nmodule.exports = function (cssWithMappingToString) {\\n  var list = [];\\n\\n  // return the list of modules as css string\\n  list.toString = function toString() {\\n    return this.map(function (item) {\\n      var content = \\\"\\\";\\n      var needLayer = typeof item[5] !== \\\"undefined\\\";\\n      if (item[4]) {\\n        content += \\\"@supports (\\\".concat(item[4], \\\") {\\\");\\n      }\\n      if (item[2]) {\\n        content += \\\"@media \\\".concat(item[2], \\\" {\\\");\\n      }\\n      if (needLayer) {\\n        content += \\\"@layer\\\".concat(item[5].length > 0 ? \\\" \\\".concat(item[5]) : \\\"\\\", \\\" {\\\");\\n      }\\n      content += cssWithMappingToString(item);\\n      if (needLayer) {\\n        content += \\\"}\\\";\\n      }\\n      if (item[2]) {\\n        content += \\\"}\\\";\\n      }\\n      if (item[4]) {\\n        content += \\\"}\\\";\\n      }\\n      return content;\\n    }).join(\\\"\\\");\\n  };\\n\\n  // import a list of modules into the list\\n  list.i = function i(modules, media, dedupe, supports, layer) {\\n    if (typeof modules === \\\"string\\\") {\\n      modules = [[null, modules, undefined]];\\n    }\\n    var alreadyImportedModules = {};\\n    if (dedupe) {\\n      for (var k = 0; k < this.length; k++) {\\n        var id = this[k][0];\\n        if (id != null) {\\n          alreadyImportedModules[id] = true;\\n        }\\n      }\\n    }\\n    for (var _k = 0; _k < modules.length; _k++) {\\n      var item = [].concat(modules[_k]);\\n      if (dedupe && alreadyImportedModules[item[0]]) {\\n        continue;\\n      }\\n      if (typeof layer !== \\\"undefined\\\") {\\n        if (typeof item[5] === \\\"undefined\\\") {\\n          item[5] = layer;\\n        } else {\\n          item[1] = \\\"@layer\\\".concat(item[5].length > 0 ? \\\" \\\".concat(item[5]) : \\\"\\\", \\\" {\\\").concat(item[1], \\\"}\\\");\\n          item[5] = layer;\\n        }\\n      }\\n      if (media) {\\n        if (!item[2]) {\\n          item[2] = media;\\n        } else {\\n          item[1] = \\\"@media \\\".concat(item[2], \\\" {\\\").concat(item[1], \\\"}\\\");\\n          item[2] = media;\\n        }\\n      }\\n      if (supports) {\\n        if (!item[4]) {\\n          item[4] = \\\"\\\".concat(supports);\\n        } else {\\n          item[1] = \\\"@supports (\\\".concat(item[4], \\\") {\\\").concat(item[1], \\\"}\\\");\\n          item[4] = supports;\\n        }\\n      }\\n      list.push(item);\\n    }\\n  };\\n  return list;\\n};\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 32\\\\\\\"><path d=\\\\\\\"M19.357 2.88c1.749 0 3.366 0.316 4.851 0.946 1.485 0.632 2.768 1.474 3.845 2.533s1.922 2.279 2.532 3.661c0.611 1.383 0.915 2.829 0.915 4.334 0 1.425-0.304 2.847-0.915 4.271-0.611 1.425-1.587 2.767-2.928 4.028-0.855 0.813-1.811 1.607-2.869 2.38s-2.136 1.465-3.233 2.075c-1.099 0.61-2.198 1.098-3.296 1.465-1.098 0.366-2.115 0.549-3.051 0.549-1.343 0-2.441-0.438-3.296-1.311-0.854-0.876-1.281-2.41-1.281-4.608 0-0.366 0.020-0.773 0.060-1.221s0.062-0.895 0.062-1.343c0-0.773-0.183-1.353-0.55-1.738-0.366-0.387-0.793-0.58-1.281-0.58-0.652 0-1.21 0.295-1.678 0.886s-0.926 1.23-1.373 1.921c-0.447 0.693-0.905 1.334-1.372 1.923s-1.028 0.886-1.679 0.886c-0.529 0-1.048-0.427-1.556-1.282s-0.763-2.259-0.763-4.212c0-2.197 0.529-4.241 1.587-6.133s2.462-3.529 4.21-4.912c1.75-1.383 3.762-2.471 6.041-3.264 2.277-0.796 4.617-1.212 7.018-1.253zM7.334 15.817c0.569 0 1.047-0.204 1.434-0.611s0.579-0.875 0.579-1.404c0-0.569-0.193-1.047-0.579-1.434s-0.864-0.579-1.434-0.579c-0.529 0-0.987 0.193-1.373 0.579s-0.58 0.864-0.58 1.434c0 0.53 0.194 0.998 0.58 1.404 0.388 0.407 0.845 0.611 1.373 0.611zM12.216 11.79c0.691 0 1.292-0.254 1.8-0.763s0.762-1.107 0.762-1.8c0-0.732-0.255-1.343-0.762-1.831-0.509-0.489-1.109-0.732-1.8-0.732-0.732 0-1.342 0.244-1.831 0.732-0.488 0.488-0.732 1.098-0.732 1.831 0 0.693 0.244 1.292 0.732 1.8s1.099 0.763 1.831 0.763zM16.366 25.947c0.692 0 1.282-0.214 1.77-0.64s0.732-0.987 0.732-1.678-0.244-1.261-0.732-1.709c-0.489-0.448-1.078-0.671-1.77-0.671-0.65 0-1.21 0.223-1.678 0.671s-0.702 1.018-0.702 1.709c0 0.692 0.234 1.25 0.702 1.678s1.027 0.64 1.678 0.64zM19.113 9.592c0.651 0 1.129-0.203 1.433-0.611 0.305-0.406 0.459-0.874 0.459-1.404 0-0.488-0.154-0.947-0.459-1.373-0.304-0.427-0.782-0.641-1.433-0.641-0.529 0-1.008 0.193-1.434 0.58s-0.64 0.865-0.64 1.434c0 0.571 0.213 1.049 0.64 1.434 0.427 0.389 0.905 0.581 1.434 0.581zM24.848 12.826c0.57 0 1.067-0.213 1.495-0.64 0.427-0.427 0.64-0.947 0.64-1.556 0-0.57-0.214-1.068-0.64-1.495-0.428-0.427-0.927-0.64-1.495-0.64-0.611 0-1.129 0.213-1.555 0.64-0.428 0.427-0.642 0.926-0.642 1.495 0 0.611 0.213 1.129 0.642 1.556s0.947 0.64 1.555 0.64z\\\\\\\"></path></svg>\\\"\",\"'use strict';\\n\\nmodule.exports = require('./compile/runtime');\",\"!function(t,e){\\\"object\\\"==typeof exports&&\\\"object\\\"==typeof module?module.exports=e():\\\"function\\\"==typeof define&&define.amd?define([],e):\\\"object\\\"==typeof exports?exports.aribb24js=e():t.aribb24js=e()}(this,(function(){return function(){\\\"use strict\\\";var t={9306:function(t,e,i){var r=i(4901),n=i(6823),s=TypeError;t.exports=function(t){if(r(t))return t;throw new s(n(t)+\\\" is not a function\\\")}},5548:function(t,e,i){var r=i(3517),n=i(6823),s=TypeError;t.exports=function(t){if(r(t))return t;throw new s(n(t)+\\\" is not a constructor\\\")}},3506:function(t,e,i){var r=i(3925),n=String,s=TypeError;t.exports=function(t){if(r(t))return t;throw new s(\\\"Can't set \\\"+n(t)+\\\" as a prototype\\\")}},6469:function(t,e,i){var r=i(8227),n=i(2360),s=i(4913).f,a=r(\\\"unscopables\\\"),o=Array.prototype;void 0===o[a]&&s(o,a,{configurable:!0,value:n(null)}),t.exports=function(t){o[a][t]=!0}},7829:function(t,e,i){var r=i(8183).charAt;t.exports=function(t,e,i){return e+(i?r(t,e).length:1)}},679:function(t,e,i){var r=i(1625),n=TypeError;t.exports=function(t,e){if(r(e,t))return t;throw new n(\\\"Incorrect invocation\\\")}},8551:function(t,e,i){var r=i(34),n=String,s=TypeError;t.exports=function(t){if(r(t))return t;throw new s(n(t)+\\\" is not an object\\\")}},7811:function(t){t.exports=\\\"undefined\\\"!=typeof ArrayBuffer&&\\\"undefined\\\"!=typeof DataView},5652:function(t,e,i){var r=i(9039);t.exports=r((function(){if(\\\"function\\\"==typeof ArrayBuffer){var t=new ArrayBuffer(8);Object.isExtensible(t)&&Object.defineProperty(t,\\\"a\\\",{value:8})}}))},4644:function(t,e,i){var r,n,s,a=i(7811),o=i(3724),h=i(4576),c=i(4901),u=i(34),l=i(9297),f=i(6955),d=i(6823),p=i(6699),v=i(6840),b=i(2106),g=i(1625),y=i(2787),m=i(2967),_=i(8227),w=i(3392),x=i(1181),A=x.enforce,C=x.get,T=h.Int8Array,k=T&&T.prototype,F=h.Uint8ClampedArray,S=F&&F.prototype,R=T&&y(T),I=k&&y(k),E=Object.prototype,O=h.TypeError,M=_(\\\"toStringTag\\\"),G=w(\\\"TYPED_ARRAY_TAG\\\"),B=\\\"TypedArrayConstructor\\\",P=a&&!!m&&\\\"Opera\\\"!==f(h.opera),D=!1,j={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},L={BigInt64Array:8,BigUint64Array:8},N=function(t){var e=y(t);if(u(e)){var i=C(e);return i&&l(i,B)?i[B]:N(e)}},U=function(t){if(!u(t))return!1;var e=f(t);return l(j,e)||l(L,e)};for(r in j)(s=(n=h[r])&&n.prototype)?A(s)[B]=n:P=!1;for(r in L)(s=(n=h[r])&&n.prototype)&&(A(s)[B]=n);if((!P||!c(R)||R===Function.prototype)&&(R=function(){throw new O(\\\"Incorrect invocation\\\")},P))for(r in j)h[r]&&m(h[r],R);if((!P||!I||I===E)&&(I=R.prototype,P))for(r in j)h[r]&&m(h[r].prototype,I);if(P&&y(S)!==I&&m(S,I),o&&!l(I,M))for(r in D=!0,b(I,M,{configurable:!0,get:function(){return u(this)?this[G]:void 0}}),j)h[r]&&p(h[r],G,r);t.exports={NATIVE_ARRAY_BUFFER_VIEWS:P,TYPED_ARRAY_TAG:D&&G,aTypedArray:function(t){if(U(t))return t;throw new O(\\\"Target is not a typed array\\\")},aTypedArrayConstructor:function(t){if(c(t)&&(!m||g(R,t)))return t;throw new O(d(t)+\\\" is not a typed array constructor\\\")},exportTypedArrayMethod:function(t,e,i,r){if(o){if(i)for(var n in j){var s=h[n];if(s&&l(s.prototype,t))try{delete s.prototype[t]}catch(i){try{s.prototype[t]=e}catch(t){}}}I[t]&&!i||v(I,t,i?e:P&&k[t]||e,r)}},exportTypedArrayStaticMethod:function(t,e,i){var r,n;if(o){if(m){if(i)for(r in j)if((n=h[r])&&l(n,t))try{delete n[t]}catch(t){}if(R[t]&&!i)return;try{return v(R,t,i?e:P&&R[t]||e)}catch(t){}}for(r in j)!(n=h[r])||n[t]&&!i||v(n,t,e)}},getTypedArrayConstructor:N,isView:function(t){if(!u(t))return!1;var e=f(t);return\\\"DataView\\\"===e||l(j,e)||l(L,e)},isTypedArray:U,TypedArray:R,TypedArrayPrototype:I}},6346:function(t,e,i){var r=i(4576),n=i(9504),s=i(3724),a=i(7811),o=i(350),h=i(6699),c=i(2106),u=i(6279),l=i(9039),f=i(679),d=i(1291),p=i(8014),v=i(7696),b=i(5617),g=i(8490),y=i(2787),m=i(2967),_=i(4373),w=i(7680),x=i(3167),A=i(7740),C=i(687),T=i(1181),k=o.PROPER,F=o.CONFIGURABLE,S=\\\"ArrayBuffer\\\",R=\\\"DataView\\\",I=\\\"prototype\\\",E=\\\"Wrong index\\\",O=T.getterFor(S),M=T.getterFor(R),G=T.set,B=r[S],P=B,D=P&&P[I],j=r[R],L=j&&j[I],N=Object.prototype,U=r.Array,z=r.RangeError,H=n(_),X=n([].reverse),K=g.pack,V=g.unpack,$=function(t){return[255&t]},W=function(t){return[255&t,t>>8&255]},Y=function(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]},J=function(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]},Z=function(t){return K(b(t),23,4)},q=function(t){return K(t,52,8)},Q=function(t,e,i){c(t[I],e,{configurable:!0,get:function(){return i(this)[e]}})},tt=function(t,e,i,r){var n=M(t),s=v(i),a=!!r;if(s+e>n.byteLength)throw new z(E);var o=n.bytes,h=s+n.byteOffset,c=w(o,h,h+e);return a?c:X(c)},et=function(t,e,i,r,n,s){var a=M(t),o=v(i),h=r(+n),c=!!s;if(o+e>a.byteLength)throw new z(E);for(var u=a.bytes,l=o+a.byteOffset,f=0;f<e;f++)u[l+f]=h[c?f:e-f-1]};if(a){var it=k&&B.name!==S;l((function(){B(1)}))&&l((function(){new B(-1)}))&&!l((function(){return new B,new B(1.5),new B(NaN),1!==B.length||it&&!F}))?it&&F&&h(B,\\\"name\\\",S):((P=function(t){return f(this,D),x(new B(v(t)),this,P)})[I]=D,D.constructor=P,A(P,B)),m&&y(L)!==N&&m(L,N);var rt=new j(new P(2)),nt=n(L.setInt8);rt.setInt8(0,2147483648),rt.setInt8(1,2147483649),!rt.getInt8(0)&&rt.getInt8(1)||u(L,{setInt8:function(t,e){nt(this,t,e<<24>>24)},setUint8:function(t,e){nt(this,t,e<<24>>24)}},{unsafe:!0})}else D=(P=function(t){f(this,D);var e=v(t);G(this,{type:S,bytes:H(U(e),0),byteLength:e}),s||(this.byteLength=e,this.detached=!1)})[I],L=(j=function(t,e,i){f(this,L),f(t,D);var r=O(t),n=r.byteLength,a=d(e);if(a<0||a>n)throw new z(\\\"Wrong offset\\\");if(a+(i=void 0===i?n-a:p(i))>n)throw new z(\\\"Wrong length\\\");G(this,{type:R,buffer:t,byteLength:i,byteOffset:a,bytes:r.bytes}),s||(this.buffer=t,this.byteLength=i,this.byteOffset=a)})[I],s&&(Q(P,\\\"byteLength\\\",O),Q(j,\\\"buffer\\\",M),Q(j,\\\"byteLength\\\",M),Q(j,\\\"byteOffset\\\",M)),u(L,{getInt8:function(t){return tt(this,1,t)[0]<<24>>24},getUint8:function(t){return tt(this,1,t)[0]},getInt16:function(t){var e=tt(this,2,t,arguments.length>1&&arguments[1]);return(e[1]<<8|e[0])<<16>>16},getUint16:function(t){var e=tt(this,2,t,arguments.length>1&&arguments[1]);return e[1]<<8|e[0]},getInt32:function(t){return J(tt(this,4,t,arguments.length>1&&arguments[1]))},getUint32:function(t){return J(tt(this,4,t,arguments.length>1&&arguments[1]))>>>0},getFloat32:function(t){return V(tt(this,4,t,arguments.length>1&&arguments[1]),23)},getFloat64:function(t){return V(tt(this,8,t,arguments.length>1&&arguments[1]),52)},setInt8:function(t,e){et(this,1,t,$,e)},setUint8:function(t,e){et(this,1,t,$,e)},setInt16:function(t,e){et(this,2,t,W,e,arguments.length>2&&arguments[2])},setUint16:function(t,e){et(this,2,t,W,e,arguments.length>2&&arguments[2])},setInt32:function(t,e){et(this,4,t,Y,e,arguments.length>2&&arguments[2])},setUint32:function(t,e){et(this,4,t,Y,e,arguments.length>2&&arguments[2])},setFloat32:function(t,e){et(this,4,t,Z,e,arguments.length>2&&arguments[2])},setFloat64:function(t,e){et(this,8,t,q,e,arguments.length>2&&arguments[2])}});C(P,S),C(j,R),t.exports={ArrayBuffer:P,DataView:j}},7029:function(t,e,i){var r=i(8981),n=i(5610),s=i(6198),a=i(4606),o=Math.min;t.exports=[].copyWithin||function(t,e){var i=r(this),h=s(i),c=n(t,h),u=n(e,h),l=arguments.length>2?arguments[2]:void 0,f=o((void 0===l?h:n(l,h))-u,h-c),d=1;for(u<c&&c<u+f&&(d=-1,u+=f-1,c+=f-1);f-- >0;)u in i?i[c]=i[u]:a(i,c),c+=d,u+=d;return i}},4373:function(t,e,i){var r=i(8981),n=i(5610),s=i(6198);t.exports=function(t){for(var e=r(this),i=s(e),a=arguments.length,o=n(a>1?arguments[1]:void 0,i),h=a>2?arguments[2]:void 0,c=void 0===h?i:n(h,i);c>o;)e[o++]=t;return e}},235:function(t,e,i){var r=i(9213).forEach,n=i(4598)(\\\"forEach\\\");t.exports=n?[].forEach:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}},5370:function(t,e,i){var r=i(6198);t.exports=function(t,e,i){for(var n=0,s=arguments.length>2?i:r(e),a=new t(s);s>n;)a[n]=e[n++];return a}},7916:function(t,e,i){var r=i(6080),n=i(9565),s=i(8981),a=i(6319),o=i(4209),h=i(3517),c=i(6198),u=i(4659),l=i(81),f=i(851),d=Array;t.exports=function(t){var e=s(t),i=h(this),p=arguments.length,v=p>1?arguments[1]:void 0,b=void 0!==v;b&&(v=r(v,p>2?arguments[2]:void 0));var g,y,m,_,w,x,A=f(e),C=0;if(!A||this===d&&o(A))for(g=c(e),y=i?new this(g):d(g);g>C;C++)x=b?v(e[C],C):e[C],u(y,C,x);else for(y=i?new this:[],w=(_=l(e,A)).next;!(m=n(w,_)).done;C++)x=b?a(_,v,[m.value,C],!0):m.value,u(y,C,x);return y.length=C,y}},9617:function(t,e,i){var r=i(5397),n=i(5610),s=i(6198),a=function(t){return function(e,i,a){var o=r(e),h=s(o);if(0===h)return!t&&-1;var c,u=n(a,h);if(t&&i!=i){for(;h>u;)if((c=o[u++])!=c)return!0}else for(;h>u;u++)if((t||u in o)&&o[u]===i)return t||u||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},9213:function(t,e,i){var r=i(6080),n=i(9504),s=i(7055),a=i(8981),o=i(6198),h=i(1469),c=n([].push),u=function(t){var e=1===t,i=2===t,n=3===t,u=4===t,l=6===t,f=7===t,d=5===t||l;return function(p,v,b,g){for(var y,m,_=a(p),w=s(_),x=o(w),A=r(v,b),C=0,T=g||h,k=e?T(p,x):i||f?T(p,0):void 0;x>C;C++)if((d||C in w)&&(m=A(y=w[C],C,_),t))if(e)k[C]=m;else if(m)switch(t){case 3:return!0;case 5:return y;case 6:return C;case 2:c(k,y)}else switch(t){case 4:return!1;case 7:c(k,y)}return l?-1:n||u?u:k}};t.exports={forEach:u(0),map:u(1),filter:u(2),some:u(3),every:u(4),find:u(5),findIndex:u(6),filterReject:u(7)}},8379:function(t,e,i){var r=i(8745),n=i(5397),s=i(1291),a=i(6198),o=i(4598),h=Math.min,c=[].lastIndexOf,u=!!c&&1/[1].lastIndexOf(1,-0)<0,l=o(\\\"lastIndexOf\\\"),f=u||!l;t.exports=f?function(t){if(u)return r(c,this,arguments)||0;var e=n(this),i=a(e);if(0===i)return-1;var o=i-1;for(arguments.length>1&&(o=h(o,s(arguments[1]))),o<0&&(o=i+o);o>=0;o--)if(o in e&&e[o]===t)return o||0;return-1}:c},597:function(t,e,i){var r=i(9039),n=i(8227),s=i(9519),a=n(\\\"species\\\");t.exports=function(t){return s>=51||!r((function(){var e=[];return(e.constructor={})[a]=function(){return{foo:1}},1!==e[t](Boolean).foo}))}},4598:function(t,e,i){var r=i(9039);t.exports=function(t,e){var i=[][t];return!!i&&r((function(){i.call(null,e||function(){return 1},1)}))}},926:function(t,e,i){var r=i(9306),n=i(8981),s=i(7055),a=i(6198),o=TypeError,h=\\\"Reduce of empty array with no initial value\\\",c=function(t){return function(e,i,c,u){var l=n(e),f=s(l),d=a(l);if(r(i),0===d&&c<2)throw new o(h);var p=t?d-1:0,v=t?-1:1;if(c<2)for(;;){if(p in f){u=f[p],p+=v;break}if(p+=v,t?p<0:d<=p)throw new o(h)}for(;t?p>=0:d>p;p+=v)p in f&&(u=i(u,f[p],p,l));return u}};t.exports={left:c(!1),right:c(!0)}},4527:function(t,e,i){var r=i(3724),n=i(4376),s=TypeError,a=Object.getOwnPropertyDescriptor,o=r&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],\\\"length\\\",{writable:!1}).length=1}catch(t){return t instanceof TypeError}}();t.exports=o?function(t,e){if(n(t)&&!a(t,\\\"length\\\").writable)throw new s(\\\"Cannot set read only .length\\\");return t.length=e}:function(t,e){return t.length=e}},7680:function(t,e,i){var r=i(9504);t.exports=r([].slice)},4488:function(t,e,i){var r=i(7680),n=Math.floor,s=function(t,e){var i=t.length;if(i<8)for(var a,o,h=1;h<i;){for(o=h,a=t[h];o&&e(t[o-1],a)>0;)t[o]=t[--o];o!==h++&&(t[o]=a)}else for(var c=n(i/2),u=s(r(t,0,c),e),l=s(r(t,c),e),f=u.length,d=l.length,p=0,v=0;p<f||v<d;)t[p+v]=p<f&&v<d?e(u[p],l[v])<=0?u[p++]:l[v++]:p<f?u[p++]:l[v++];return t};t.exports=s},7433:function(t,e,i){var r=i(4376),n=i(3517),s=i(34),a=i(8227)(\\\"species\\\"),o=Array;t.exports=function(t){var e;return r(t)&&(e=t.constructor,(n(e)&&(e===o||r(e.prototype))||s(e)&&null===(e=e[a]))&&(e=void 0)),void 0===e?o:e}},1469:function(t,e,i){var r=i(7433);t.exports=function(t,e){return new(r(t))(0===e?0:e)}},6319:function(t,e,i){var r=i(8551),n=i(1920);t.exports=function(t,e,i,s){try{return s?e(r(i)[0],i[1]):e(i)}catch(e){n(t,\\\"throw\\\",e)}}},4428:function(t,e,i){var r=i(8227)(\\\"iterator\\\"),n=!1;try{var s=0,a={next:function(){return{done:!!s++}},return:function(){n=!0}};a[r]=function(){return this},Array.from(a,(function(){throw 2}))}catch(t){}t.exports=function(t,e){try{if(!e&&!n)return!1}catch(t){return!1}var i=!1;try{var s={};s[r]=function(){return{next:function(){return{done:i=!0}}}},t(s)}catch(t){}return i}},2195:function(t,e,i){var r=i(9504),n=r({}.toString),s=r(\\\"\\\".slice);t.exports=function(t){return s(n(t),8,-1)}},6955:function(t,e,i){var r=i(2140),n=i(4901),s=i(2195),a=i(8227)(\\\"toStringTag\\\"),o=Object,h=\\\"Arguments\\\"===s(function(){return arguments}());t.exports=r?s:function(t){var e,i,r;return void 0===t?\\\"Undefined\\\":null===t?\\\"Null\\\":\\\"string\\\"==typeof(i=function(t,e){try{return t[e]}catch(t){}}(e=o(t),a))?i:h?s(e):\\\"Object\\\"===(r=s(e))&&n(e.callee)?\\\"Arguments\\\":r}},6938:function(t,e,i){var r=i(2360),n=i(2106),s=i(6279),a=i(6080),o=i(679),h=i(4117),c=i(2652),u=i(1088),l=i(2529),f=i(7633),d=i(3724),p=i(3451).fastKey,v=i(1181),b=v.set,g=v.getterFor;t.exports={getConstructor:function(t,e,i,u){var l=t((function(t,n){o(t,f),b(t,{type:e,index:r(null),first:null,last:null,size:0}),d||(t.size=0),h(n)||c(n,t[u],{that:t,AS_ENTRIES:i})})),f=l.prototype,v=g(e),y=function(t,e,i){var r,n,s=v(t),a=m(t,e);return a?a.value=i:(s.last=a={index:n=p(e,!0),key:e,value:i,previous:r=s.last,next:null,removed:!1},s.first||(s.first=a),r&&(r.next=a),d?s.size++:t.size++,\\\"F\\\"!==n&&(s.index[n]=a)),t},m=function(t,e){var i,r=v(t),n=p(e);if(\\\"F\\\"!==n)return r.index[n];for(i=r.first;i;i=i.next)if(i.key===e)return i};return s(f,{clear:function(){for(var t=v(this),e=t.first;e;)e.removed=!0,e.previous&&(e.previous=e.previous.next=null),e=e.next;t.first=t.last=null,t.index=r(null),d?t.size=0:this.size=0},delete:function(t){var e=this,i=v(e),r=m(e,t);if(r){var n=r.next,s=r.previous;delete i.index[r.index],r.removed=!0,s&&(s.next=n),n&&(n.previous=s),i.first===r&&(i.first=n),i.last===r&&(i.last=s),d?i.size--:e.size--}return!!r},forEach:function(t){for(var e,i=v(this),r=a(t,arguments.length>1?arguments[1]:void 0);e=e?e.next:i.first;)for(r(e.value,e.key,this);e&&e.removed;)e=e.previous},has:function(t){return!!m(this,t)}}),s(f,i?{get:function(t){var e=m(this,t);return e&&e.value},set:function(t,e){return y(this,0===t?0:t,e)}}:{add:function(t){return y(this,t=0===t?0:t,t)}}),d&&n(f,\\\"size\\\",{configurable:!0,get:function(){return v(this).size}}),l},setStrong:function(t,e,i){var r=e+\\\" Iterator\\\",n=g(e),s=g(r);u(t,e,(function(t,e){b(this,{type:r,target:t,state:n(t),kind:e,last:null})}),(function(){for(var t=s(this),e=t.kind,i=t.last;i&&i.removed;)i=i.previous;return t.target&&(t.last=i=i?i.next:t.state.first)?l(\\\"keys\\\"===e?i.key:\\\"values\\\"===e?i.value:[i.key,i.value],!1):(t.target=null,l(void 0,!0))}),i?\\\"entries\\\":\\\"values\\\",!i,!0),f(e)}}},6468:function(t,e,i){var r=i(6518),n=i(4576),s=i(9504),a=i(2796),o=i(6840),h=i(3451),c=i(2652),u=i(679),l=i(4901),f=i(4117),d=i(34),p=i(9039),v=i(4428),b=i(687),g=i(3167);t.exports=function(t,e,i){var y=-1!==t.indexOf(\\\"Map\\\"),m=-1!==t.indexOf(\\\"Weak\\\"),_=y?\\\"set\\\":\\\"add\\\",w=n[t],x=w&&w.prototype,A=w,C={},T=function(t){var e=s(x[t]);o(x,t,\\\"add\\\"===t?function(t){return e(this,0===t?0:t),this}:\\\"delete\\\"===t?function(t){return!(m&&!d(t))&&e(this,0===t?0:t)}:\\\"get\\\"===t?function(t){return m&&!d(t)?void 0:e(this,0===t?0:t)}:\\\"has\\\"===t?function(t){return!(m&&!d(t))&&e(this,0===t?0:t)}:function(t,i){return e(this,0===t?0:t,i),this})};if(a(t,!l(w)||!(m||x.forEach&&!p((function(){(new w).entries().next()})))))A=i.getConstructor(e,t,y,_),h.enable();else if(a(t,!0)){var k=new A,F=k[_](m?{}:-0,1)!==k,S=p((function(){k.has(1)})),R=v((function(t){new w(t)})),I=!m&&p((function(){for(var t=new w,e=5;e--;)t[_](e,e);return!t.has(-0)}));R||((A=e((function(t,e){u(t,x);var i=g(new w,t,A);return f(e)||c(e,i[_],{that:i,AS_ENTRIES:y}),i}))).prototype=x,x.constructor=A),(S||I)&&(T(\\\"delete\\\"),T(\\\"has\\\"),y&&T(\\\"get\\\")),(I||F)&&T(_),m&&x.clear&&delete x.clear}return C[t]=A,r({global:!0,constructor:!0,forced:A!==w},C),b(A,t),m||i.setStrong(A,t,y),A}},7740:function(t,e,i){var r=i(9297),n=i(5031),s=i(7347),a=i(4913);t.exports=function(t,e,i){for(var o=n(e),h=a.f,c=s.f,u=0;u<o.length;u++){var l=o[u];r(t,l)||i&&r(i,l)||h(t,l,c(e,l))}}},1436:function(t,e,i){var r=i(8227)(\\\"match\\\");t.exports=function(t){var e=/./;try{\\\"/./\\\"[t](e)}catch(i){try{return e[r]=!1,\\\"/./\\\"[t](e)}catch(t){}}return!1}},2211:function(t,e,i){var r=i(9039);t.exports=!r((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}))},2529:function(t){t.exports=function(t,e){return{value:t,done:e}}},6699:function(t,e,i){var r=i(3724),n=i(4913),s=i(6980);t.exports=r?function(t,e,i){return n.f(t,e,s(1,i))}:function(t,e,i){return t[e]=i,t}},6980:function(t){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},4659:function(t,e,i){var r=i(3724),n=i(4913),s=i(6980);t.exports=function(t,e,i){r?n.f(t,e,s(0,i)):t[e]=i}},3640:function(t,e,i){var r=i(8551),n=i(4270),s=TypeError;t.exports=function(t){if(r(this),\\\"string\\\"===t||\\\"default\\\"===t)t=\\\"string\\\";else if(\\\"number\\\"!==t)throw new s(\\\"Incorrect hint\\\");return n(this,t)}},2106:function(t,e,i){var r=i(283),n=i(4913);t.exports=function(t,e,i){return i.get&&r(i.get,e,{getter:!0}),i.set&&r(i.set,e,{setter:!0}),n.f(t,e,i)}},6840:function(t,e,i){var r=i(4901),n=i(4913),s=i(283),a=i(9433);t.exports=function(t,e,i,o){o||(o={});var h=o.enumerable,c=void 0!==o.name?o.name:e;if(r(i)&&s(i,c,o),o.global)h?t[e]=i:a(e,i);else{try{o.unsafe?t[e]&&(h=!0):delete t[e]}catch(t){}h?t[e]=i:n.f(t,e,{value:i,enumerable:!1,configurable:!o.nonConfigurable,writable:!o.nonWritable})}return t}},6279:function(t,e,i){var r=i(6840);t.exports=function(t,e,i){for(var n in e)r(t,n,e[n],i);return t}},9433:function(t,e,i){var r=i(4576),n=Object.defineProperty;t.exports=function(t,e){try{n(r,t,{value:e,configurable:!0,writable:!0})}catch(i){r[t]=e}return e}},4606:function(t,e,i){var r=i(6823),n=TypeError;t.exports=function(t,e){if(!delete t[e])throw new n(\\\"Cannot delete property \\\"+r(e)+\\\" of \\\"+r(t))}},3724:function(t,e,i){var r=i(9039);t.exports=!r((function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]}))},4055:function(t,e,i){var r=i(4576),n=i(34),s=r.document,a=n(s)&&n(s.createElement);t.exports=function(t){return a?s.createElement(t):{}}},6837:function(t){var e=TypeError;t.exports=function(t){if(t>9007199254740991)throw e(\\\"Maximum allowed index exceeded\\\");return t}},7400:function(t){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},9296:function(t,e,i){var r=i(4055)(\\\"span\\\").classList,n=r&&r.constructor&&r.constructor.prototype;t.exports=n===Object.prototype?void 0:n},8727:function(t){t.exports=[\\\"constructor\\\",\\\"hasOwnProperty\\\",\\\"isPrototypeOf\\\",\\\"propertyIsEnumerable\\\",\\\"toLocaleString\\\",\\\"toString\\\",\\\"valueOf\\\"]},3709:function(t,e,i){var r=i(2839).match(/firefox\\\\/(\\\\d+)/i);t.exports=!!r&&+r[1]},3763:function(t,e,i){var r=i(2839);t.exports=/MSIE|Trident/.test(r)},2839:function(t,e,i){var r=i(4576).navigator,n=r&&r.userAgent;t.exports=n?String(n):\\\"\\\"},9519:function(t,e,i){var r,n,s=i(4576),a=i(2839),o=s.process,h=s.Deno,c=o&&o.versions||h&&h.version,u=c&&c.v8;u&&(n=(r=u.split(\\\".\\\"))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!n&&a&&(!(r=a.match(/Edge\\\\/(\\\\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\\\\/(\\\\d+)/))&&(n=+r[1]),t.exports=n},3607:function(t,e,i){var r=i(2839).match(/AppleWebKit\\\\/(\\\\d+)\\\\./);t.exports=!!r&&+r[1]},6518:function(t,e,i){var r=i(4576),n=i(7347).f,s=i(6699),a=i(6840),o=i(9433),h=i(7740),c=i(2796);t.exports=function(t,e){var i,u,l,f,d,p=t.target,v=t.global,b=t.stat;if(i=v?r:b?r[p]||o(p,{}):r[p]&&r[p].prototype)for(u in e){if(f=e[u],l=t.dontCallGetSet?(d=n(i,u))&&d.value:i[u],!c(v?u:p+(b?\\\".\\\":\\\"#\\\")+u,t.forced)&&void 0!==l){if(typeof f==typeof l)continue;h(f,l)}(t.sham||l&&l.sham)&&s(f,\\\"sham\\\",!0),a(i,u,f,t)}}},9039:function(t){t.exports=function(t){try{return!!t()}catch(t){return!0}}},9228:function(t,e,i){i(7495);var r=i(9565),n=i(6840),s=i(7323),a=i(9039),o=i(8227),h=i(6699),c=o(\\\"species\\\"),u=RegExp.prototype;t.exports=function(t,e,i,l){var f=o(t),d=!a((function(){var e={};return e[f]=function(){return 7},7!==\\\"\\\"[t](e)})),p=d&&!a((function(){var e=!1,i=/a/;return\\\"split\\\"===t&&((i={}).constructor={},i.constructor[c]=function(){return i},i.flags=\\\"\\\",i[f]=/./[f]),i.exec=function(){return e=!0,null},i[f](\\\"\\\"),!e}));if(!d||!p||i){var v=/./[f],b=e(f,\\\"\\\"[t],(function(t,e,i,n,a){var o=e.exec;return o===s||o===u.exec?d&&!a?{done:!0,value:r(v,e,i,n)}:{done:!0,value:r(t,i,e,n)}:{done:!1}}));n(String.prototype,t,b[0]),n(u,f,b[1])}l&&h(u[f],\\\"sham\\\",!0)}},2744:function(t,e,i){var r=i(9039);t.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},8745:function(t,e,i){var r=i(616),n=Function.prototype,s=n.apply,a=n.call;t.exports=\\\"object\\\"==typeof Reflect&&Reflect.apply||(r?a.bind(s):function(){return a.apply(s,arguments)})},6080:function(t,e,i){var r=i(7476),n=i(9306),s=i(616),a=r(r.bind);t.exports=function(t,e){return n(t),void 0===e?t:s?a(t,e):function(){return t.apply(e,arguments)}}},616:function(t,e,i){var r=i(9039);t.exports=!r((function(){var t=function(){}.bind();return\\\"function\\\"!=typeof t||t.hasOwnProperty(\\\"prototype\\\")}))},566:function(t,e,i){var r=i(9504),n=i(9306),s=i(34),a=i(9297),o=i(7680),h=i(616),c=Function,u=r([].concat),l=r([].join),f={};t.exports=h?c.bind:function(t){var e=n(this),i=e.prototype,r=o(arguments,1),h=function(){var i=u(r,o(arguments));return this instanceof h?function(t,e,i){if(!a(f,e)){for(var r=[],n=0;n<e;n++)r[n]=\\\"a[\\\"+n+\\\"]\\\";f[e]=c(\\\"C,a\\\",\\\"return new C(\\\"+l(r,\\\",\\\")+\\\")\\\")}return f[e](t,i)}(e,i.length,i):e.apply(t,i)};return s(i)&&(h.prototype=i),h}},9565:function(t,e,i){var r=i(616),n=Function.prototype.call;t.exports=r?n.bind(n):function(){return n.apply(n,arguments)}},350:function(t,e,i){var r=i(3724),n=i(9297),s=Function.prototype,a=r&&Object.getOwnPropertyDescriptor,o=n(s,\\\"name\\\"),h=o&&\\\"something\\\"===function(){}.name,c=o&&(!r||r&&a(s,\\\"name\\\").configurable);t.exports={EXISTS:o,PROPER:h,CONFIGURABLE:c}},6706:function(t,e,i){var r=i(9504),n=i(9306);t.exports=function(t,e,i){try{return r(n(Object.getOwnPropertyDescriptor(t,e)[i]))}catch(t){}}},7476:function(t,e,i){var r=i(2195),n=i(9504);t.exports=function(t){if(\\\"Function\\\"===r(t))return n(t)}},9504:function(t,e,i){var r=i(616),n=Function.prototype,s=n.call,a=r&&n.bind.bind(s,s);t.exports=r?a:function(t){return function(){return s.apply(t,arguments)}}},7751:function(t,e,i){var r=i(4576),n=i(4901);t.exports=function(t,e){return arguments.length<2?(i=r[t],n(i)?i:void 0):r[t]&&r[t][e];var i}},851:function(t,e,i){var r=i(6955),n=i(5966),s=i(4117),a=i(6269),o=i(8227)(\\\"iterator\\\");t.exports=function(t){if(!s(t))return n(t,o)||n(t,\\\"@@iterator\\\")||a[r(t)]}},81:function(t,e,i){var r=i(9565),n=i(9306),s=i(8551),a=i(6823),o=i(851),h=TypeError;t.exports=function(t,e){var i=arguments.length<2?o(t):e;if(n(i))return s(r(i,t));throw new h(a(t)+\\\" is not iterable\\\")}},6933:function(t,e,i){var r=i(9504),n=i(4376),s=i(4901),a=i(2195),o=i(655),h=r([].push);t.exports=function(t){if(s(t))return t;if(n(t)){for(var e=t.length,i=[],r=0;r<e;r++){var c=t[r];\\\"string\\\"==typeof c?h(i,c):\\\"number\\\"!=typeof c&&\\\"Number\\\"!==a(c)&&\\\"String\\\"!==a(c)||h(i,o(c))}var u=i.length,l=!0;return function(t,e){if(l)return l=!1,e;if(n(this))return e;for(var r=0;r<u;r++)if(i[r]===t)return e}}}},5966:function(t,e,i){var r=i(9306),n=i(4117);t.exports=function(t,e){var i=t[e];return n(i)?void 0:r(i)}},2478:function(t,e,i){var r=i(9504),n=i(8981),s=Math.floor,a=r(\\\"\\\".charAt),o=r(\\\"\\\".replace),h=r(\\\"\\\".slice),c=/\\\\$([$&'`]|\\\\d{1,2}|<[^>]*>)/g,u=/\\\\$([$&'`]|\\\\d{1,2})/g;t.exports=function(t,e,i,r,l,f){var d=i+t.length,p=r.length,v=u;return void 0!==l&&(l=n(l),v=c),o(f,v,(function(n,o){var c;switch(a(o,0)){case\\\"$\\\":return\\\"$\\\";case\\\"&\\\":return t;case\\\"`\\\":return h(e,0,i);case\\\"'\\\":return h(e,d);case\\\"<\\\":c=l[h(o,1,-1)];break;default:var u=+o;if(0===u)return n;if(u>p){var f=s(u/10);return 0===f?n:f<=p?void 0===r[f-1]?a(o,1):r[f-1]+a(o,1):n}c=r[u-1]}return void 0===c?\\\"\\\":c}))}},4576:function(t,e,i){var r=function(t){return t&&t.Math===Math&&t};t.exports=r(\\\"object\\\"==typeof globalThis&&globalThis)||r(\\\"object\\\"==typeof window&&window)||r(\\\"object\\\"==typeof self&&self)||r(\\\"object\\\"==typeof i.g&&i.g)||r(\\\"object\\\"==typeof this&&this)||function(){return this}()||Function(\\\"return this\\\")()},9297:function(t,e,i){var r=i(9504),n=i(8981),s=r({}.hasOwnProperty);t.exports=Object.hasOwn||function(t,e){return s(n(t),e)}},421:function(t){t.exports={}},397:function(t,e,i){var r=i(7751);t.exports=r(\\\"document\\\",\\\"documentElement\\\")},5917:function(t,e,i){var r=i(3724),n=i(9039),s=i(4055);t.exports=!r&&!n((function(){return 7!==Object.defineProperty(s(\\\"div\\\"),\\\"a\\\",{get:function(){return 7}}).a}))},8490:function(t){var e=Array,i=Math.abs,r=Math.pow,n=Math.floor,s=Math.log,a=Math.LN2;t.exports={pack:function(t,o,h){var c,u,l,f=e(h),d=8*h-o-1,p=(1<<d)-1,v=p>>1,b=23===o?r(2,-24)-r(2,-77):0,g=t<0||0===t&&1/t<0?1:0,y=0;for((t=i(t))!=t||t===1/0?(u=t!=t?1:0,c=p):(c=n(s(t)/a),t*(l=r(2,-c))<1&&(c--,l*=2),(t+=c+v>=1?b/l:b*r(2,1-v))*l>=2&&(c++,l/=2),c+v>=p?(u=0,c=p):c+v>=1?(u=(t*l-1)*r(2,o),c+=v):(u=t*r(2,v-1)*r(2,o),c=0));o>=8;)f[y++]=255&u,u/=256,o-=8;for(c=c<<o|u,d+=o;d>0;)f[y++]=255&c,c/=256,d-=8;return f[y-1]|=128*g,f},unpack:function(t,e){var i,n=t.length,s=8*n-e-1,a=(1<<s)-1,o=a>>1,h=s-7,c=n-1,u=t[c--],l=127&u;for(u>>=7;h>0;)l=256*l+t[c--],h-=8;for(i=l&(1<<-h)-1,l>>=-h,h+=e;h>0;)i=256*i+t[c--],h-=8;if(0===l)l=1-o;else{if(l===a)return i?NaN:u?-1/0:1/0;i+=r(2,e),l-=o}return(u?-1:1)*i*r(2,l-e)}}},7055:function(t,e,i){var r=i(9504),n=i(9039),s=i(2195),a=Object,o=r(\\\"\\\".split);t.exports=n((function(){return!a(\\\"z\\\").propertyIsEnumerable(0)}))?function(t){return\\\"String\\\"===s(t)?o(t,\\\"\\\"):a(t)}:a},3167:function(t,e,i){var r=i(4901),n=i(34),s=i(2967);t.exports=function(t,e,i){var a,o;return s&&r(a=e.constructor)&&a!==i&&n(o=a.prototype)&&o!==i.prototype&&s(t,o),t}},3706:function(t,e,i){var r=i(9504),n=i(4901),s=i(7629),a=r(Function.toString);n(s.inspectSource)||(s.inspectSource=function(t){return a(t)}),t.exports=s.inspectSource},3451:function(t,e,i){var r=i(6518),n=i(9504),s=i(421),a=i(34),o=i(9297),h=i(4913).f,c=i(8480),u=i(298),l=i(4124),f=i(3392),d=i(2744),p=!1,v=f(\\\"meta\\\"),b=0,g=function(t){h(t,v,{value:{objectID:\\\"O\\\"+b++,weakData:{}}})},y=t.exports={enable:function(){y.enable=function(){},p=!0;var t=c.f,e=n([].splice),i={};i[v]=1,t(i).length&&(c.f=function(i){for(var r=t(i),n=0,s=r.length;n<s;n++)if(r[n]===v){e(r,n,1);break}return r},r({target:\\\"Object\\\",stat:!0,forced:!0},{getOwnPropertyNames:u.f}))},fastKey:function(t,e){if(!a(t))return\\\"symbol\\\"==typeof t?t:(\\\"string\\\"==typeof t?\\\"S\\\":\\\"P\\\")+t;if(!o(t,v)){if(!l(t))return\\\"F\\\";if(!e)return\\\"E\\\";g(t)}return t[v].objectID},getWeakData:function(t,e){if(!o(t,v)){if(!l(t))return!0;if(!e)return!1;g(t)}return t[v].weakData},onFreeze:function(t){return d&&p&&l(t)&&!o(t,v)&&g(t),t}};s[v]=!0},1181:function(t,e,i){var r,n,s,a=i(8622),o=i(4576),h=i(34),c=i(6699),u=i(9297),l=i(7629),f=i(6119),d=i(421),p=\\\"Object already initialized\\\",v=o.TypeError,b=o.WeakMap;if(a||l.state){var g=l.state||(l.state=new b);g.get=g.get,g.has=g.has,g.set=g.set,r=function(t,e){if(g.has(t))throw new v(p);return e.facade=t,g.set(t,e),e},n=function(t){return g.get(t)||{}},s=function(t){return g.has(t)}}else{var y=f(\\\"state\\\");d[y]=!0,r=function(t,e){if(u(t,y))throw new v(p);return e.facade=t,c(t,y,e),e},n=function(t){return u(t,y)?t[y]:{}},s=function(t){return u(t,y)}}t.exports={set:r,get:n,has:s,enforce:function(t){return s(t)?n(t):r(t,{})},getterFor:function(t){return function(e){var i;if(!h(e)||(i=n(e)).type!==t)throw new v(\\\"Incompatible receiver, \\\"+t+\\\" required\\\");return i}}}},4209:function(t,e,i){var r=i(8227),n=i(6269),s=r(\\\"iterator\\\"),a=Array.prototype;t.exports=function(t){return void 0!==t&&(n.Array===t||a[s]===t)}},4376:function(t,e,i){var r=i(2195);t.exports=Array.isArray||function(t){return\\\"Array\\\"===r(t)}},1108:function(t,e,i){var r=i(6955);t.exports=function(t){var e=r(t);return\\\"BigInt64Array\\\"===e||\\\"BigUint64Array\\\"===e}},4901:function(t){var e=\\\"object\\\"==typeof document&&document.all;t.exports=void 0===e&&void 0!==e?function(t){return\\\"function\\\"==typeof t||t===e}:function(t){return\\\"function\\\"==typeof t}},3517:function(t,e,i){var r=i(9504),n=i(9039),s=i(4901),a=i(6955),o=i(7751),h=i(3706),c=function(){},u=o(\\\"Reflect\\\",\\\"construct\\\"),l=/^\\\\s*(?:class|function)\\\\b/,f=r(l.exec),d=!l.test(c),p=function(t){if(!s(t))return!1;try{return u(c,[],t),!0}catch(t){return!1}},v=function(t){if(!s(t))return!1;switch(a(t)){case\\\"AsyncFunction\\\":case\\\"GeneratorFunction\\\":case\\\"AsyncGeneratorFunction\\\":return!1}try{return d||!!f(l,h(t))}catch(t){return!0}};v.sham=!0,t.exports=!u||n((function(){var t;return p(p.call)||!p(Object)||!p((function(){t=!0}))||t}))?v:p},2796:function(t,e,i){var r=i(9039),n=i(4901),s=/#|\\\\.prototype\\\\./,a=function(t,e){var i=h[o(t)];return i===u||i!==c&&(n(e)?r(e):!!e)},o=a.normalize=function(t){return String(t).replace(s,\\\".\\\").toLowerCase()},h=a.data={},c=a.NATIVE=\\\"N\\\",u=a.POLYFILL=\\\"P\\\";t.exports=a},2087:function(t,e,i){var r=i(34),n=Math.floor;t.exports=Number.isInteger||function(t){return!r(t)&&isFinite(t)&&n(t)===t}},4117:function(t){t.exports=function(t){return null==t}},34:function(t,e,i){var r=i(4901);t.exports=function(t){return\\\"object\\\"==typeof t?null!==t:r(t)}},3925:function(t,e,i){var r=i(34);t.exports=function(t){return r(t)||null===t}},6395:function(t){t.exports=!1},788:function(t,e,i){var r=i(34),n=i(2195),s=i(8227)(\\\"match\\\");t.exports=function(t){var e;return r(t)&&(void 0!==(e=t[s])?!!e:\\\"RegExp\\\"===n(t))}},757:function(t,e,i){var r=i(7751),n=i(4901),s=i(1625),a=i(7040),o=Object;t.exports=a?function(t){return\\\"symbol\\\"==typeof t}:function(t){var e=r(\\\"Symbol\\\");return n(e)&&s(e.prototype,o(t))}},2652:function(t,e,i){var r=i(6080),n=i(9565),s=i(8551),a=i(6823),o=i(4209),h=i(6198),c=i(1625),u=i(81),l=i(851),f=i(1920),d=TypeError,p=function(t,e){this.stopped=t,this.result=e},v=p.prototype;t.exports=function(t,e,i){var b,g,y,m,_,w,x,A=i&&i.that,C=!(!i||!i.AS_ENTRIES),T=!(!i||!i.IS_RECORD),k=!(!i||!i.IS_ITERATOR),F=!(!i||!i.INTERRUPTED),S=r(e,A),R=function(t){return b&&f(b,\\\"normal\\\",t),new p(!0,t)},I=function(t){return C?(s(t),F?S(t[0],t[1],R):S(t[0],t[1])):F?S(t,R):S(t)};if(T)b=t.iterator;else if(k)b=t;else{if(!(g=l(t)))throw new d(a(t)+\\\" is not iterable\\\");if(o(g)){for(y=0,m=h(t);m>y;y++)if((_=I(t[y]))&&c(v,_))return _;return new p(!1)}b=u(t,g)}for(w=T?t.next:b.next;!(x=n(w,b)).done;){try{_=I(x.value)}catch(t){f(b,\\\"throw\\\",t)}if(\\\"object\\\"==typeof _&&_&&c(v,_))return _}return new p(!1)}},1920:function(t,e,i){var r=i(9565),n=i(8551),s=i(5966);t.exports=function(t,e,i){var a,o;n(t);try{if(!(a=s(t,\\\"return\\\"))){if(\\\"throw\\\"===e)throw i;return i}a=r(a,t)}catch(t){o=!0,a=t}if(\\\"throw\\\"===e)throw i;if(o)throw a;return n(a),i}},3994:function(t,e,i){var r=i(7657).IteratorPrototype,n=i(2360),s=i(6980),a=i(687),o=i(6269),h=function(){return this};t.exports=function(t,e,i,c){var u=e+\\\" Iterator\\\";return t.prototype=n(r,{next:s(+!c,i)}),a(t,u,!1,!0),o[u]=h,t}},1088:function(t,e,i){var r=i(6518),n=i(9565),s=i(6395),a=i(350),o=i(4901),h=i(3994),c=i(2787),u=i(2967),l=i(687),f=i(6699),d=i(6840),p=i(8227),v=i(6269),b=i(7657),g=a.PROPER,y=a.CONFIGURABLE,m=b.IteratorPrototype,_=b.BUGGY_SAFARI_ITERATORS,w=p(\\\"iterator\\\"),x=\\\"keys\\\",A=\\\"values\\\",C=\\\"entries\\\",T=function(){return this};t.exports=function(t,e,i,a,p,b,k){h(i,e,a);var F,S,R,I=function(t){if(t===p&&B)return B;if(!_&&t&&t in M)return M[t];switch(t){case x:case A:case C:return function(){return new i(this,t)}}return function(){return new i(this)}},E=e+\\\" Iterator\\\",O=!1,M=t.prototype,G=M[w]||M[\\\"@@iterator\\\"]||p&&M[p],B=!_&&G||I(p),P=\\\"Array\\\"===e&&M.entries||G;if(P&&(F=c(P.call(new t)))!==Object.prototype&&F.next&&(s||c(F)===m||(u?u(F,m):o(F[w])||d(F,w,T)),l(F,E,!0,!0),s&&(v[E]=T)),g&&p===A&&G&&G.name!==A&&(!s&&y?f(M,\\\"name\\\",A):(O=!0,B=function(){return n(G,this)})),p)if(S={values:I(A),keys:b?B:I(x),entries:I(C)},k)for(R in S)(_||O||!(R in M))&&d(M,R,S[R]);else r({target:e,proto:!0,forced:_||O},S);return s&&!k||M[w]===B||d(M,w,B,{name:p}),v[e]=B,S}},7657:function(t,e,i){var r,n,s,a=i(9039),o=i(4901),h=i(34),c=i(2360),u=i(2787),l=i(6840),f=i(8227),d=i(6395),p=f(\\\"iterator\\\"),v=!1;[].keys&&(\\\"next\\\"in(s=[].keys())?(n=u(u(s)))!==Object.prototype&&(r=n):v=!0),!h(r)||a((function(){var t={};return r[p].call(t)!==t}))?r={}:d&&(r=c(r)),o(r[p])||l(r,p,(function(){return this})),t.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:v}},6269:function(t){t.exports={}},6198:function(t,e,i){var r=i(8014);t.exports=function(t){return r(t.length)}},283:function(t,e,i){var r=i(9504),n=i(9039),s=i(4901),a=i(9297),o=i(3724),h=i(350).CONFIGURABLE,c=i(3706),u=i(1181),l=u.enforce,f=u.get,d=String,p=Object.defineProperty,v=r(\\\"\\\".slice),b=r(\\\"\\\".replace),g=r([].join),y=o&&!n((function(){return 8!==p((function(){}),\\\"length\\\",{value:8}).length})),m=String(String).split(\\\"String\\\"),_=t.exports=function(t,e,i){\\\"Symbol(\\\"===v(d(e),0,7)&&(e=\\\"[\\\"+b(d(e),/^Symbol\\\\(([^)]*)\\\\).*$/,\\\"$1\\\")+\\\"]\\\"),i&&i.getter&&(e=\\\"get \\\"+e),i&&i.setter&&(e=\\\"set \\\"+e),(!a(t,\\\"name\\\")||h&&t.name!==e)&&(o?p(t,\\\"name\\\",{value:e,configurable:!0}):t.name=e),y&&i&&a(i,\\\"arity\\\")&&t.length!==i.arity&&p(t,\\\"length\\\",{value:i.arity});try{i&&a(i,\\\"constructor\\\")&&i.constructor?o&&p(t,\\\"prototype\\\",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(t){}var r=l(t);return a(r,\\\"source\\\")||(r.source=g(m,\\\"string\\\"==typeof e?e:\\\"\\\")),t};Function.prototype.toString=_((function(){return s(this)&&f(this).source||c(this)}),\\\"toString\\\")},3164:function(t,e,i){var r=i(7782),n=Math.abs,s=2220446049250313e-31,a=1/s;t.exports=function(t,e,i,o){var h=+t,c=n(h),u=r(h);if(c<o)return u*function(t){return t+a-a}(c/o/e)*o*e;var l=(1+e/s)*c,f=l-(l-c);return f>i||f!=f?u*(1/0):u*f}},5617:function(t,e,i){var r=i(3164);t.exports=Math.fround||function(t){return r(t,1.1920928955078125e-7,34028234663852886e22,11754943508222875e-54)}},7782:function(t){t.exports=Math.sign||function(t){var e=+t;return 0===e||e!=e?e:e<0?-1:1}},741:function(t){var e=Math.ceil,i=Math.floor;t.exports=Math.trunc||function(t){var r=+t;return(r>0?i:e)(r)}},5749:function(t,e,i){var r=i(788),n=TypeError;t.exports=function(t){if(r(t))throw new n(\\\"The method doesn't accept regular expressions\\\");return t}},360:function(t,e,i){var r=i(4576).isFinite;t.exports=Number.isFinite||function(t){return\\\"number\\\"==typeof t&&r(t)}},2703:function(t,e,i){var r=i(4576),n=i(9039),s=i(9504),a=i(655),o=i(3802).trim,h=i(7452),c=r.parseInt,u=r.Symbol,l=u&&u.iterator,f=/^[+-]?0x/i,d=s(f.exec),p=8!==c(h+\\\"08\\\")||22!==c(h+\\\"0x16\\\")||l&&!n((function(){c(Object(l))}));t.exports=p?function(t,e){var i=o(a(t));return c(i,e>>>0||(d(f,i)?16:10))}:c},2360:function(t,e,i){var r,n=i(8551),s=i(6801),a=i(8727),o=i(421),h=i(397),c=i(4055),u=i(6119),l=\\\"prototype\\\",f=\\\"script\\\",d=u(\\\"IE_PROTO\\\"),p=function(){},v=function(t){return\\\"<\\\"+f+\\\">\\\"+t+\\\"</\\\"+f+\\\">\\\"},b=function(t){t.write(v(\\\"\\\")),t.close();var e=t.parentWindow.Object;return t=null,e},g=function(){try{r=new ActiveXObject(\\\"htmlfile\\\")}catch(t){}var t,e,i;g=\\\"undefined\\\"!=typeof document?document.domain&&r?b(r):(e=c(\\\"iframe\\\"),i=\\\"java\\\"+f+\\\":\\\",e.style.display=\\\"none\\\",h.appendChild(e),e.src=String(i),(t=e.contentWindow.document).open(),t.write(v(\\\"document.F=Object\\\")),t.close(),t.F):b(r);for(var n=a.length;n--;)delete g[l][a[n]];return g()};o[d]=!0,t.exports=Object.create||function(t,e){var i;return null!==t?(p[l]=n(t),i=new p,p[l]=null,i[d]=t):i=g(),void 0===e?i:s.f(i,e)}},6801:function(t,e,i){var r=i(3724),n=i(8686),s=i(4913),a=i(8551),o=i(5397),h=i(1072);e.f=r&&!n?Object.defineProperties:function(t,e){a(t);for(var i,r=o(e),n=h(e),c=n.length,u=0;c>u;)s.f(t,i=n[u++],r[i]);return t}},4913:function(t,e,i){var r=i(3724),n=i(5917),s=i(8686),a=i(8551),o=i(6969),h=TypeError,c=Object.defineProperty,u=Object.getOwnPropertyDescriptor,l=\\\"enumerable\\\",f=\\\"configurable\\\",d=\\\"writable\\\";e.f=r?s?function(t,e,i){if(a(t),e=o(e),a(i),\\\"function\\\"==typeof t&&\\\"prototype\\\"===e&&\\\"value\\\"in i&&d in i&&!i[d]){var r=u(t,e);r&&r[d]&&(t[e]=i.value,i={configurable:f in i?i[f]:r[f],enumerable:l in i?i[l]:r[l],writable:!1})}return c(t,e,i)}:c:function(t,e,i){if(a(t),e=o(e),a(i),n)try{return c(t,e,i)}catch(t){}if(\\\"get\\\"in i||\\\"set\\\"in i)throw new h(\\\"Accessors not supported\\\");return\\\"value\\\"in i&&(t[e]=i.value),t}},7347:function(t,e,i){var r=i(3724),n=i(9565),s=i(8773),a=i(6980),o=i(5397),h=i(6969),c=i(9297),u=i(5917),l=Object.getOwnPropertyDescriptor;e.f=r?l:function(t,e){if(t=o(t),e=h(e),u)try{return l(t,e)}catch(t){}if(c(t,e))return a(!n(s.f,t,e),t[e])}},298:function(t,e,i){var r=i(2195),n=i(5397),s=i(8480).f,a=i(7680),o=\\\"object\\\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return o&&\\\"Window\\\"===r(t)?function(t){try{return s(t)}catch(t){return a(o)}}(t):s(n(t))}},8480:function(t,e,i){var r=i(1828),n=i(8727).concat(\\\"length\\\",\\\"prototype\\\");e.f=Object.getOwnPropertyNames||function(t){return r(t,n)}},3717:function(t,e){e.f=Object.getOwnPropertySymbols},2787:function(t,e,i){var r=i(9297),n=i(4901),s=i(8981),a=i(6119),o=i(2211),h=a(\\\"IE_PROTO\\\"),c=Object,u=c.prototype;t.exports=o?c.getPrototypeOf:function(t){var e=s(t);if(r(e,h))return e[h];var i=e.constructor;return n(i)&&e instanceof i?i.prototype:e instanceof c?u:null}},4124:function(t,e,i){var r=i(9039),n=i(34),s=i(2195),a=i(5652),o=Object.isExtensible,h=r((function(){o(1)}));t.exports=h||a?function(t){return!!n(t)&&(!a||\\\"ArrayBuffer\\\"!==s(t))&&(!o||o(t))}:o},1625:function(t,e,i){var r=i(9504);t.exports=r({}.isPrototypeOf)},1828:function(t,e,i){var r=i(9504),n=i(9297),s=i(5397),a=i(9617).indexOf,o=i(421),h=r([].push);t.exports=function(t,e){var i,r=s(t),c=0,u=[];for(i in r)!n(o,i)&&n(r,i)&&h(u,i);for(;e.length>c;)n(r,i=e[c++])&&(~a(u,i)||h(u,i));return u}},1072:function(t,e,i){var r=i(1828),n=i(8727);t.exports=Object.keys||function(t){return r(t,n)}},8773:function(t,e){var i={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,n=r&&!i.call({1:2},1);e.f=n?function(t){var e=r(this,t);return!!e&&e.enumerable}:i},2967:function(t,e,i){var r=i(6706),n=i(34),s=i(7750),a=i(3506);t.exports=Object.setPrototypeOf||(\\\"__proto__\\\"in{}?function(){var t,e=!1,i={};try{(t=r(Object.prototype,\\\"__proto__\\\",\\\"set\\\"))(i,[]),e=i instanceof Array}catch(t){}return function(i,r){return s(i),a(r),n(i)?(e?t(i,r):i.__proto__=r,i):i}}():void 0)},2357:function(t,e,i){var r=i(3724),n=i(9039),s=i(9504),a=i(2787),o=i(1072),h=i(5397),c=s(i(8773).f),u=s([].push),l=r&&n((function(){var t=Object.create(null);return t[2]=2,!c(t,2)})),f=function(t){return function(e){for(var i,n=h(e),s=o(n),f=l&&null===a(n),d=s.length,p=0,v=[];d>p;)i=s[p++],r&&!(f?i in n:c(n,i))||u(v,t?[i,n[i]]:n[i]);return v}};t.exports={entries:f(!0),values:f(!1)}},3179:function(t,e,i){var r=i(2140),n=i(6955);t.exports=r?{}.toString:function(){return\\\"[object \\\"+n(this)+\\\"]\\\"}},4270:function(t,e,i){var r=i(9565),n=i(4901),s=i(34),a=TypeError;t.exports=function(t,e){var i,o;if(\\\"string\\\"===e&&n(i=t.toString)&&!s(o=r(i,t)))return o;if(n(i=t.valueOf)&&!s(o=r(i,t)))return o;if(\\\"string\\\"!==e&&n(i=t.toString)&&!s(o=r(i,t)))return o;throw new a(\\\"Can't convert object to primitive value\\\")}},5031:function(t,e,i){var r=i(7751),n=i(9504),s=i(8480),a=i(3717),o=i(8551),h=n([].concat);t.exports=r(\\\"Reflect\\\",\\\"ownKeys\\\")||function(t){var e=s.f(o(t)),i=a.f;return i?h(e,i(t)):e}},9167:function(t,e,i){var r=i(4576);t.exports=r},6682:function(t,e,i){var r=i(9565),n=i(8551),s=i(4901),a=i(2195),o=i(7323),h=TypeError;t.exports=function(t,e){var i=t.exec;if(s(i)){var c=r(i,t,e);return null!==c&&n(c),c}if(\\\"RegExp\\\"===a(t))return r(o,t,e);throw new h(\\\"RegExp#exec called on incompatible receiver\\\")}},7323:function(t,e,i){var r,n,s=i(9565),a=i(9504),o=i(655),h=i(7979),c=i(8429),u=i(5745),l=i(2360),f=i(1181).get,d=i(3635),p=i(8814),v=u(\\\"native-string-replace\\\",String.prototype.replace),b=RegExp.prototype.exec,g=b,y=a(\\\"\\\".charAt),m=a(\\\"\\\".indexOf),_=a(\\\"\\\".replace),w=a(\\\"\\\".slice),x=(n=/b*/g,s(b,r=/a/,\\\"a\\\"),s(b,n,\\\"a\\\"),0!==r.lastIndex||0!==n.lastIndex),A=c.BROKEN_CARET,C=void 0!==/()??/.exec(\\\"\\\")[1];(x||C||A||d||p)&&(g=function(t){var e,i,r,n,a,c,u,d=this,p=f(d),T=o(t),k=p.raw;if(k)return k.lastIndex=d.lastIndex,e=s(g,k,T),d.lastIndex=k.lastIndex,e;var F=p.groups,S=A&&d.sticky,R=s(h,d),I=d.source,E=0,O=T;if(S&&(R=_(R,\\\"y\\\",\\\"\\\"),-1===m(R,\\\"g\\\")&&(R+=\\\"g\\\"),O=w(T,d.lastIndex),d.lastIndex>0&&(!d.multiline||d.multiline&&\\\"\\\\n\\\"!==y(T,d.lastIndex-1))&&(I=\\\"(?: \\\"+I+\\\")\\\",O=\\\" \\\"+O,E++),i=new RegExp(\\\"^(?:\\\"+I+\\\")\\\",R)),C&&(i=new RegExp(\\\"^\\\"+I+\\\"$(?!\\\\\\\\s)\\\",R)),x&&(r=d.lastIndex),n=s(b,S?i:d,O),S?n?(n.input=w(n.input,E),n[0]=w(n[0],E),n.index=d.lastIndex,d.lastIndex+=n[0].length):d.lastIndex=0:x&&n&&(d.lastIndex=d.global?n.index+n[0].length:r),C&&n&&n.length>1&&s(v,n[0],i,(function(){for(a=1;a<arguments.length-2;a++)void 0===arguments[a]&&(n[a]=void 0)})),n&&F)for(n.groups=c=l(null),a=0;a<F.length;a++)c[(u=F[a])[0]]=n[u[1]];return n}),t.exports=g},7979:function(t,e,i){var r=i(8551);t.exports=function(){var t=r(this),e=\\\"\\\";return t.hasIndices&&(e+=\\\"d\\\"),t.global&&(e+=\\\"g\\\"),t.ignoreCase&&(e+=\\\"i\\\"),t.multiline&&(e+=\\\"m\\\"),t.dotAll&&(e+=\\\"s\\\"),t.unicode&&(e+=\\\"u\\\"),t.unicodeSets&&(e+=\\\"v\\\"),t.sticky&&(e+=\\\"y\\\"),e}},1034:function(t,e,i){var r=i(9565),n=i(9297),s=i(1625),a=i(7979),o=RegExp.prototype;t.exports=function(t){var e=t.flags;return void 0!==e||\\\"flags\\\"in o||n(t,\\\"flags\\\")||!s(o,t)?e:r(a,t)}},8429:function(t,e,i){var r=i(9039),n=i(4576).RegExp,s=r((function(){var t=n(\\\"a\\\",\\\"y\\\");return t.lastIndex=2,null!==t.exec(\\\"abcd\\\")})),a=s||r((function(){return!n(\\\"a\\\",\\\"y\\\").sticky})),o=s||r((function(){var t=n(\\\"^r\\\",\\\"gy\\\");return t.lastIndex=2,null!==t.exec(\\\"str\\\")}));t.exports={BROKEN_CARET:o,MISSED_STICKY:a,UNSUPPORTED_Y:s}},3635:function(t,e,i){var r=i(9039),n=i(4576).RegExp;t.exports=r((function(){var t=n(\\\".\\\",\\\"s\\\");return!(t.dotAll&&t.test(\\\"\\\\n\\\")&&\\\"s\\\"===t.flags)}))},8814:function(t,e,i){var r=i(9039),n=i(4576).RegExp;t.exports=r((function(){var t=n(\\\"(?<a>b)\\\",\\\"g\\\");return\\\"b\\\"!==t.exec(\\\"b\\\").groups.a||\\\"bc\\\"!==\\\"b\\\".replace(t,\\\"$<a>c\\\")}))},7750:function(t,e,i){var r=i(4117),n=TypeError;t.exports=function(t){if(r(t))throw new n(\\\"Can't call method on \\\"+t);return t}},7633:function(t,e,i){var r=i(7751),n=i(2106),s=i(8227),a=i(3724),o=s(\\\"species\\\");t.exports=function(t){var e=r(t);a&&e&&!e[o]&&n(e,o,{configurable:!0,get:function(){return this}})}},687:function(t,e,i){var r=i(4913).f,n=i(9297),s=i(8227)(\\\"toStringTag\\\");t.exports=function(t,e,i){t&&!i&&(t=t.prototype),t&&!n(t,s)&&r(t,s,{configurable:!0,value:e})}},6119:function(t,e,i){var r=i(5745),n=i(3392),s=r(\\\"keys\\\");t.exports=function(t){return s[t]||(s[t]=n(t))}},7629:function(t,e,i){var r=i(6395),n=i(4576),s=i(9433),a=\\\"__core-js_shared__\\\",o=t.exports=n[a]||s(a,{});(o.versions||(o.versions=[])).push({version:\\\"3.38.1\\\",mode:r?\\\"pure\\\":\\\"global\\\",copyright:\\\"© 2014-2024 Denis Pushkarev (zloirock.ru)\\\",license:\\\"https://github.com/zloirock/core-js/blob/v3.38.1/LICENSE\\\",source:\\\"https://github.com/zloirock/core-js\\\"})},5745:function(t,e,i){var r=i(7629);t.exports=function(t,e){return r[t]||(r[t]=e||{})}},2293:function(t,e,i){var r=i(8551),n=i(5548),s=i(4117),a=i(8227)(\\\"species\\\");t.exports=function(t,e){var i,o=r(t).constructor;return void 0===o||s(i=r(o)[a])?e:n(i)}},8183:function(t,e,i){var r=i(9504),n=i(1291),s=i(655),a=i(7750),o=r(\\\"\\\".charAt),h=r(\\\"\\\".charCodeAt),c=r(\\\"\\\".slice),u=function(t){return function(e,i){var r,u,l=s(a(e)),f=n(i),d=l.length;return f<0||f>=d?t?\\\"\\\":void 0:(r=h(l,f))<55296||r>56319||f+1===d||(u=h(l,f+1))<56320||u>57343?t?o(l,f):r:t?c(l,f,f+2):u-56320+(r-55296<<10)+65536}};t.exports={codeAt:u(!1),charAt:u(!0)}},3063:function(t,e,i){var r=i(2839);t.exports=/Version\\\\/10(?:\\\\.\\\\d+){1,2}(?: [\\\\w./]+)?(?: Mobile\\\\/\\\\w+)? Safari\\\\//.test(r)},533:function(t,e,i){var r=i(9504),n=i(8014),s=i(655),a=i(2333),o=i(7750),h=r(a),c=r(\\\"\\\".slice),u=Math.ceil,l=function(t){return function(e,i,r){var a,l,f=s(o(e)),d=n(i),p=f.length,v=void 0===r?\\\" \\\":s(r);return d<=p||\\\"\\\"===v?f:((l=h(v,u((a=d-p)/v.length))).length>a&&(l=c(l,0,a)),t?f+l:l+f)}};t.exports={start:l(!1),end:l(!0)}},2333:function(t,e,i){var r=i(1291),n=i(655),s=i(7750),a=RangeError;t.exports=function(t){var e=n(s(this)),i=\\\"\\\",o=r(t);if(o<0||o===1/0)throw new a(\\\"Wrong number of repetitions\\\");for(;o>0;(o>>>=1)&&(e+=e))1&o&&(i+=e);return i}},3802:function(t,e,i){var r=i(9504),n=i(7750),s=i(655),a=i(7452),o=r(\\\"\\\".replace),h=RegExp(\\\"^[\\\"+a+\\\"]+\\\"),c=RegExp(\\\"(^|[^\\\"+a+\\\"])[\\\"+a+\\\"]+$\\\"),u=function(t){return function(e){var i=s(n(e));return 1&t&&(i=o(i,h,\\\"\\\")),2&t&&(i=o(i,c,\\\"$1\\\")),i}};t.exports={start:u(1),end:u(2),trim:u(3)}},4495:function(t,e,i){var r=i(9519),n=i(9039),s=i(4576).String;t.exports=!!Object.getOwnPropertySymbols&&!n((function(){var t=Symbol(\\\"symbol detection\\\");return!s(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},8242:function(t,e,i){var r=i(9565),n=i(7751),s=i(8227),a=i(6840);t.exports=function(){var t=n(\\\"Symbol\\\"),e=t&&t.prototype,i=e&&e.valueOf,o=s(\\\"toPrimitive\\\");e&&!e[o]&&a(e,o,(function(t){return r(i,this)}),{arity:1})}},1296:function(t,e,i){var r=i(4495);t.exports=r&&!!Symbol.for&&!!Symbol.keyFor},1240:function(t,e,i){var r=i(9504);t.exports=r(1..valueOf)},5610:function(t,e,i){var r=i(1291),n=Math.max,s=Math.min;t.exports=function(t,e){var i=r(t);return i<0?n(i+e,0):s(i,e)}},5854:function(t,e,i){var r=i(2777),n=TypeError;t.exports=function(t){var e=r(t,\\\"number\\\");if(\\\"number\\\"==typeof e)throw new n(\\\"Can't convert number to bigint\\\");return BigInt(e)}},7696:function(t,e,i){var r=i(1291),n=i(8014),s=RangeError;t.exports=function(t){if(void 0===t)return 0;var e=r(t),i=n(e);if(e!==i)throw new s(\\\"Wrong length or index\\\");return i}},5397:function(t,e,i){var r=i(7055),n=i(7750);t.exports=function(t){return r(n(t))}},1291:function(t,e,i){var r=i(741);t.exports=function(t){var e=+t;return e!=e||0===e?0:r(e)}},8014:function(t,e,i){var r=i(1291),n=Math.min;t.exports=function(t){var e=r(t);return e>0?n(e,9007199254740991):0}},8981:function(t,e,i){var r=i(7750),n=Object;t.exports=function(t){return n(r(t))}},8229:function(t,e,i){var r=i(9590),n=RangeError;t.exports=function(t,e){var i=r(t);if(i%e)throw new n(\\\"Wrong offset\\\");return i}},9590:function(t,e,i){var r=i(1291),n=RangeError;t.exports=function(t){var e=r(t);if(e<0)throw new n(\\\"The argument can't be less than 0\\\");return e}},2777:function(t,e,i){var r=i(9565),n=i(34),s=i(757),a=i(5966),o=i(4270),h=i(8227),c=TypeError,u=h(\\\"toPrimitive\\\");t.exports=function(t,e){if(!n(t)||s(t))return t;var i,h=a(t,u);if(h){if(void 0===e&&(e=\\\"default\\\"),i=r(h,t,e),!n(i)||s(i))return i;throw new c(\\\"Can't convert object to primitive value\\\")}return void 0===e&&(e=\\\"number\\\"),o(t,e)}},6969:function(t,e,i){var r=i(2777),n=i(757);t.exports=function(t){var e=r(t,\\\"string\\\");return n(e)?e:e+\\\"\\\"}},2140:function(t,e,i){var r={};r[i(8227)(\\\"toStringTag\\\")]=\\\"z\\\",t.exports=\\\"[object z]\\\"===String(r)},655:function(t,e,i){var r=i(6955),n=String;t.exports=function(t){if(\\\"Symbol\\\"===r(t))throw new TypeError(\\\"Cannot convert a Symbol value to a string\\\");return n(t)}},8319:function(t){var e=Math.round;t.exports=function(t){var i=e(t);return i<0?0:i>255?255:255&i}},6823:function(t){var e=String;t.exports=function(t){try{return e(t)}catch(t){return\\\"Object\\\"}}},5823:function(t,e,i){var r=i(6518),n=i(4576),s=i(9565),a=i(3724),o=i(2805),h=i(4644),c=i(6346),u=i(679),l=i(6980),f=i(6699),d=i(2087),p=i(8014),v=i(7696),b=i(8229),g=i(8319),y=i(6969),m=i(9297),_=i(6955),w=i(34),x=i(757),A=i(2360),C=i(1625),T=i(2967),k=i(8480).f,F=i(3251),S=i(9213).forEach,R=i(7633),I=i(2106),E=i(4913),O=i(7347),M=i(5370),G=i(1181),B=i(3167),P=G.get,D=G.set,j=G.enforce,L=E.f,N=O.f,U=n.RangeError,z=c.ArrayBuffer,H=z.prototype,X=c.DataView,K=h.NATIVE_ARRAY_BUFFER_VIEWS,V=h.TYPED_ARRAY_TAG,$=h.TypedArray,W=h.TypedArrayPrototype,Y=h.isTypedArray,J=\\\"BYTES_PER_ELEMENT\\\",Z=\\\"Wrong length\\\",q=function(t,e){I(t,e,{configurable:!0,get:function(){return P(this)[e]}})},Q=function(t){var e;return C(H,t)||\\\"ArrayBuffer\\\"===(e=_(t))||\\\"SharedArrayBuffer\\\"===e},tt=function(t,e){return Y(t)&&!x(e)&&e in t&&d(+e)&&e>=0},et=function(t,e){return e=y(e),tt(t,e)?l(2,t[e]):N(t,e)},it=function(t,e,i){return e=y(e),!(tt(t,e)&&w(i)&&m(i,\\\"value\\\"))||m(i,\\\"get\\\")||m(i,\\\"set\\\")||i.configurable||m(i,\\\"writable\\\")&&!i.writable||m(i,\\\"enumerable\\\")&&!i.enumerable?L(t,e,i):(t[e]=i.value,t)};a?(K||(O.f=et,E.f=it,q(W,\\\"buffer\\\"),q(W,\\\"byteOffset\\\"),q(W,\\\"byteLength\\\"),q(W,\\\"length\\\")),r({target:\\\"Object\\\",stat:!0,forced:!K},{getOwnPropertyDescriptor:et,defineProperty:it}),t.exports=function(t,e,i){var a=t.match(/\\\\d+/)[0]/8,h=t+(i?\\\"Clamped\\\":\\\"\\\")+\\\"Array\\\",c=\\\"get\\\"+t,l=\\\"set\\\"+t,d=n[h],y=d,m=y&&y.prototype,_={},x=function(t,e){L(t,e,{get:function(){return function(t,e){var i=P(t);return i.view[c](e*a+i.byteOffset,!0)}(this,e)},set:function(t){return function(t,e,r){var n=P(t);n.view[l](e*a+n.byteOffset,i?g(r):r,!0)}(this,e,t)},enumerable:!0})};K?o&&(y=e((function(t,e,i,r){return u(t,m),B(w(e)?Q(e)?void 0!==r?new d(e,b(i,a),r):void 0!==i?new d(e,b(i,a)):new d(e):Y(e)?M(y,e):s(F,y,e):new d(v(e)),t,y)})),T&&T(y,$),S(k(d),(function(t){t in y||f(y,t,d[t])})),y.prototype=m):(y=e((function(t,e,i,r){u(t,m);var n,o,h,c=0,l=0;if(w(e)){if(!Q(e))return Y(e)?M(y,e):s(F,y,e);n=e,l=b(i,a);var f=e.byteLength;if(void 0===r){if(f%a)throw new U(Z);if((o=f-l)<0)throw new U(Z)}else if((o=p(r)*a)+l>f)throw new U(Z);h=o/a}else h=v(e),n=new z(o=h*a);for(D(t,{buffer:n,byteOffset:l,byteLength:o,length:h,view:new X(n)});c<h;)x(t,c++)})),T&&T(y,$),m=y.prototype=A(W)),m.constructor!==y&&f(m,\\\"constructor\\\",y),j(m).TypedArrayConstructor=y,V&&f(m,V,h);var C=y!==d;_[h]=y,r({global:!0,constructor:!0,forced:C,sham:!K},_),J in y||f(y,J,a),J in m||f(m,J,a),R(h)}):t.exports=function(){}},2805:function(t,e,i){var r=i(4576),n=i(9039),s=i(4428),a=i(4644).NATIVE_ARRAY_BUFFER_VIEWS,o=r.ArrayBuffer,h=r.Int8Array;t.exports=!a||!n((function(){h(1)}))||!n((function(){new h(-1)}))||!s((function(t){new h,new h(null),new h(1.5),new h(t)}),!0)||n((function(){return 1!==new h(new o(2),1,void 0).length}))},6357:function(t,e,i){var r=i(5370),n=i(1412);t.exports=function(t,e){return r(n(t),e)}},3251:function(t,e,i){var r=i(6080),n=i(9565),s=i(5548),a=i(8981),o=i(6198),h=i(81),c=i(851),u=i(4209),l=i(1108),f=i(4644).aTypedArrayConstructor,d=i(5854);t.exports=function(t){var e,i,p,v,b,g,y,m,_=s(this),w=a(t),x=arguments.length,A=x>1?arguments[1]:void 0,C=void 0!==A,T=c(w);if(T&&!u(T))for(m=(y=h(w,T)).next,w=[];!(g=n(m,y)).done;)w.push(g.value);for(C&&x>2&&(A=r(A,arguments[2])),i=o(w),p=new(f(_))(i),v=l(p),e=0;i>e;e++)b=C?A(w[e],e):w[e],p[e]=v?d(b):+b;return p}},1412:function(t,e,i){var r=i(4644),n=i(2293),s=r.aTypedArrayConstructor,a=r.getTypedArrayConstructor;t.exports=function(t){return s(n(t,a(t)))}},3392:function(t,e,i){var r=i(9504),n=0,s=Math.random(),a=r(1..toString);t.exports=function(t){return\\\"Symbol(\\\"+(void 0===t?\\\"\\\":t)+\\\")_\\\"+a(++n+s,36)}},7040:function(t,e,i){var r=i(4495);t.exports=r&&!Symbol.sham&&\\\"symbol\\\"==typeof Symbol.iterator},8686:function(t,e,i){var r=i(3724),n=i(9039);t.exports=r&&n((function(){return 42!==Object.defineProperty((function(){}),\\\"prototype\\\",{value:42,writable:!1}).prototype}))},8622:function(t,e,i){var r=i(4576),n=i(4901),s=r.WeakMap;t.exports=n(s)&&/native code/.test(String(s))},511:function(t,e,i){var r=i(9167),n=i(9297),s=i(1951),a=i(4913).f;t.exports=function(t){var e=r.Symbol||(r.Symbol={});n(e,t)||a(e,t,{value:s.f(t)})}},1951:function(t,e,i){var r=i(8227);e.f=r},8227:function(t,e,i){var r=i(4576),n=i(5745),s=i(9297),a=i(3392),o=i(4495),h=i(7040),c=r.Symbol,u=n(\\\"wks\\\"),l=h?c.for||c:c&&c.withoutSetter||a;t.exports=function(t){return s(u,t)||(u[t]=o&&s(c,t)?c[t]:l(\\\"Symbol.\\\"+t)),u[t]}},7452:function(t){t.exports=\\\"\\\\t\\\\n\\\\v\\\\f\\\\r                　\\\\u2028\\\\u2029\\\\ufeff\\\"},4743:function(t,e,i){var r=i(6518),n=i(4576),s=i(6346),a=i(7633),o=\\\"ArrayBuffer\\\",h=s[o];r({global:!0,constructor:!0,forced:n[o]!==h},{ArrayBuffer:h}),a(o)},1745:function(t,e,i){var r=i(6518),n=i(7476),s=i(9039),a=i(6346),o=i(8551),h=i(5610),c=i(8014),u=i(2293),l=a.ArrayBuffer,f=a.DataView,d=f.prototype,p=n(l.prototype.slice),v=n(d.getUint8),b=n(d.setUint8);r({target:\\\"ArrayBuffer\\\",proto:!0,unsafe:!0,forced:s((function(){return!new l(2).slice(1,void 0).byteLength}))},{slice:function(t,e){if(p&&void 0===e)return p(o(this),t);for(var i=o(this).byteLength,r=h(t,i),n=h(void 0===e?i:e,i),s=new(u(this,l))(c(n-r)),a=new f(this),d=new f(s),g=0;r<n;)b(d,g++,v(a,r++));return s}})},8706:function(t,e,i){var r=i(6518),n=i(9039),s=i(4376),a=i(34),o=i(8981),h=i(6198),c=i(6837),u=i(4659),l=i(1469),f=i(597),d=i(8227),p=i(9519),v=d(\\\"isConcatSpreadable\\\"),b=p>=51||!n((function(){var t=[];return t[v]=!1,t.concat()[0]!==t})),g=function(t){if(!a(t))return!1;var e=t[v];return void 0!==e?!!e:s(t)};r({target:\\\"Array\\\",proto:!0,arity:1,forced:!b||!f(\\\"concat\\\")},{concat:function(t){var e,i,r,n,s,a=o(this),f=l(a,0),d=0;for(e=-1,r=arguments.length;e<r;e++)if(g(s=-1===e?a:arguments[e]))for(n=h(s),c(d+n),i=0;i<n;i++,d++)i in s&&u(f,d,s[i]);else c(d+1),u(f,d++,s);return f.length=d,f}})},3771:function(t,e,i){var r=i(6518),n=i(4373),s=i(6469);r({target:\\\"Array\\\",proto:!0},{fill:n}),s(\\\"fill\\\")},2008:function(t,e,i){var r=i(6518),n=i(9213).filter;r({target:\\\"Array\\\",proto:!0,forced:!i(597)(\\\"filter\\\")},{filter:function(t){return n(this,t,arguments.length>1?arguments[1]:void 0)}})},8980:function(t,e,i){var r=i(6518),n=i(9213).findIndex,s=i(6469),a=\\\"findIndex\\\",o=!0;a in[]&&Array(1)[a]((function(){o=!1})),r({target:\\\"Array\\\",proto:!0,forced:o},{findIndex:function(t){return n(this,t,arguments.length>1?arguments[1]:void 0)}}),s(a)},113:function(t,e,i){var r=i(6518),n=i(9213).find,s=i(6469),a=\\\"find\\\",o=!0;a in[]&&Array(1)[a]((function(){o=!1})),r({target:\\\"Array\\\",proto:!0,forced:o},{find:function(t){return n(this,t,arguments.length>1?arguments[1]:void 0)}}),s(a)},3418:function(t,e,i){var r=i(6518),n=i(7916);r({target:\\\"Array\\\",stat:!0,forced:!i(4428)((function(t){Array.from(t)}))},{from:n})},4423:function(t,e,i){var r=i(6518),n=i(9617).includes,s=i(9039),a=i(6469);r({target:\\\"Array\\\",proto:!0,forced:s((function(){return!Array(1).includes()}))},{includes:function(t){return n(this,t,arguments.length>1?arguments[1]:void 0)}}),a(\\\"includes\\\")},3792:function(t,e,i){var r=i(5397),n=i(6469),s=i(6269),a=i(1181),o=i(4913).f,h=i(1088),c=i(2529),u=i(6395),l=i(3724),f=\\\"Array Iterator\\\",d=a.set,p=a.getterFor(f);t.exports=h(Array,\\\"Array\\\",(function(t,e){d(this,{type:f,target:r(t),index:0,kind:e})}),(function(){var t=p(this),e=t.target,i=t.index++;if(!e||i>=e.length)return t.target=null,c(void 0,!0);switch(t.kind){case\\\"keys\\\":return c(i,!1);case\\\"values\\\":return c(e[i],!1)}return c([i,e[i]],!1)}),\\\"values\\\");var v=s.Arguments=s.Array;if(n(\\\"keys\\\"),n(\\\"values\\\"),n(\\\"entries\\\"),!u&&l&&\\\"values\\\"!==v.name)try{o(v,\\\"name\\\",{value:\\\"values\\\"})}catch(t){}},4782:function(t,e,i){var r=i(6518),n=i(4376),s=i(3517),a=i(34),o=i(5610),h=i(6198),c=i(5397),u=i(4659),l=i(8227),f=i(597),d=i(7680),p=f(\\\"slice\\\"),v=l(\\\"species\\\"),b=Array,g=Math.max;r({target:\\\"Array\\\",proto:!0,forced:!p},{slice:function(t,e){var i,r,l,f=c(this),p=h(f),y=o(t,p),m=o(void 0===e?p:e,p);if(n(f)&&(i=f.constructor,(s(i)&&(i===b||n(i.prototype))||a(i)&&null===(i=i[v]))&&(i=void 0),i===b||void 0===i))return d(f,y,m);for(r=new(void 0===i?b:i)(g(m-y,0)),l=0;y<m;y++,l++)y in f&&u(r,l,f[y]);return r.length=l,r}})},6910:function(t,e,i){var r=i(6518),n=i(9504),s=i(9306),a=i(8981),o=i(6198),h=i(4606),c=i(655),u=i(9039),l=i(4488),f=i(4598),d=i(3709),p=i(3763),v=i(9519),b=i(3607),g=[],y=n(g.sort),m=n(g.push),_=u((function(){g.sort(void 0)})),w=u((function(){g.sort(null)})),x=f(\\\"sort\\\"),A=!u((function(){if(v)return v<70;if(!(d&&d>3)){if(p)return!0;if(b)return b<603;var t,e,i,r,n=\\\"\\\";for(t=65;t<76;t++){switch(e=String.fromCharCode(t),t){case 66:case 69:case 70:case 72:i=3;break;case 68:case 71:i=4;break;default:i=2}for(r=0;r<47;r++)g.push({k:e+r,v:i})}for(g.sort((function(t,e){return e.v-t.v})),r=0;r<g.length;r++)e=g[r].k.charAt(0),n.charAt(n.length-1)!==e&&(n+=e);return\\\"DGBEFHACIJK\\\"!==n}}));r({target:\\\"Array\\\",proto:!0,forced:_||!w||!x||!A},{sort:function(t){void 0!==t&&s(t);var e=a(this);if(A)return void 0===t?y(e):y(e,t);var i,r,n=[],u=o(e);for(r=0;r<u;r++)r in e&&m(n,e[r]);for(l(n,function(t){return function(e,i){return void 0===i?-1:void 0===e?1:void 0!==t?+t(e,i)||0:c(e)>c(i)?1:-1}}(t)),i=o(n),r=0;r<i;)e[r]=n[r++];for(;r<u;)h(e,r++);return e}})},4554:function(t,e,i){var r=i(6518),n=i(8981),s=i(5610),a=i(1291),o=i(6198),h=i(4527),c=i(6837),u=i(1469),l=i(4659),f=i(4606),d=i(597)(\\\"splice\\\"),p=Math.max,v=Math.min;r({target:\\\"Array\\\",proto:!0,forced:!d},{splice:function(t,e){var i,r,d,b,g,y,m=n(this),_=o(m),w=s(t,_),x=arguments.length;for(0===x?i=r=0:1===x?(i=0,r=_-w):(i=x-2,r=v(p(a(e),0),_-w)),c(_+i-r),d=u(m,r),b=0;b<r;b++)(g=w+b)in m&&l(d,b,m[g]);if(d.length=r,i<r){for(b=w;b<_-r;b++)y=b+i,(g=b+r)in m?m[y]=m[g]:f(m,y);for(b=_;b>_-r+i;b--)f(m,b-1)}else if(i>r)for(b=_-r;b>w;b--)y=b+i-1,(g=b+r-1)in m?m[y]=m[g]:f(m,y);for(b=0;b<i;b++)m[b+w]=arguments[b+2];return h(m,_-r+i),d}})},9572:function(t,e,i){var r=i(9297),n=i(6840),s=i(3640),a=i(8227)(\\\"toPrimitive\\\"),o=Date.prototype;r(o,a)||n(o,a,s)},2010:function(t,e,i){var r=i(3724),n=i(350).EXISTS,s=i(9504),a=i(2106),o=Function.prototype,h=s(o.toString),c=/function\\\\b(?:\\\\s|\\\\/\\\\*[\\\\S\\\\s]*?\\\\*\\\\/|\\\\/\\\\/[^\\\\n\\\\r]*[\\\\n\\\\r]+)*([^\\\\s(/]*)/,u=s(c.exec);r&&!n&&a(o,\\\"name\\\",{configurable:!0,get:function(){try{return u(c,h(this))[1]}catch(t){return\\\"\\\"}}})},3110:function(t,e,i){var r=i(6518),n=i(7751),s=i(8745),a=i(9565),o=i(9504),h=i(9039),c=i(4901),u=i(757),l=i(7680),f=i(6933),d=i(4495),p=String,v=n(\\\"JSON\\\",\\\"stringify\\\"),b=o(/./.exec),g=o(\\\"\\\".charAt),y=o(\\\"\\\".charCodeAt),m=o(\\\"\\\".replace),_=o(1..toString),w=/[\\\\uD800-\\\\uDFFF]/g,x=/^[\\\\uD800-\\\\uDBFF]$/,A=/^[\\\\uDC00-\\\\uDFFF]$/,C=!d||h((function(){var t=n(\\\"Symbol\\\")(\\\"stringify detection\\\");return\\\"[null]\\\"!==v([t])||\\\"{}\\\"!==v({a:t})||\\\"{}\\\"!==v(Object(t))})),T=h((function(){return'\\\"\\\\\\\\udf06\\\\\\\\ud834\\\"'!==v(\\\"\\\\udf06\\\\ud834\\\")||'\\\"\\\\\\\\udead\\\"'!==v(\\\"\\\\udead\\\")})),k=function(t,e){var i=l(arguments),r=f(e);if(c(r)||void 0!==t&&!u(t))return i[1]=function(t,e){if(c(r)&&(e=a(r,this,p(t),e)),!u(e))return e},s(v,null,i)},F=function(t,e,i){var r=g(i,e-1),n=g(i,e+1);return b(x,t)&&!b(A,n)||b(A,t)&&!b(x,r)?\\\"\\\\\\\\u\\\"+_(y(t,0),16):t};v&&r({target:\\\"JSON\\\",stat:!0,arity:3,forced:C||T},{stringify:function(t,e,i){var r=l(arguments),n=s(C?k:v,null,r);return T&&\\\"string\\\"==typeof n?m(n,w,F):n}})},8523:function(t,e,i){i(6468)(\\\"Map\\\",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),i(6938))},6033:function(t,e,i){i(8523)},2892:function(t,e,i){var r=i(6518),n=i(6395),s=i(3724),a=i(4576),o=i(9167),h=i(9504),c=i(2796),u=i(9297),l=i(3167),f=i(1625),d=i(757),p=i(2777),v=i(9039),b=i(8480).f,g=i(7347).f,y=i(4913).f,m=i(1240),_=i(3802).trim,w=\\\"Number\\\",x=a[w],A=o[w],C=x.prototype,T=a.TypeError,k=h(\\\"\\\".slice),F=h(\\\"\\\".charCodeAt),S=c(w,!x(\\\" 0o1\\\")||!x(\\\"0b1\\\")||x(\\\"+0x1\\\")),R=function(t){var e,i=arguments.length<1?0:x(function(t){var e=p(t,\\\"number\\\");return\\\"bigint\\\"==typeof e?e:function(t){var e,i,r,n,s,a,o,h,c=p(t,\\\"number\\\");if(d(c))throw new T(\\\"Cannot convert a Symbol value to a number\\\");if(\\\"string\\\"==typeof c&&c.length>2)if(c=_(c),43===(e=F(c,0))||45===e){if(88===(i=F(c,2))||120===i)return NaN}else if(48===e){switch(F(c,1)){case 66:case 98:r=2,n=49;break;case 79:case 111:r=8,n=55;break;default:return+c}for(a=(s=k(c,2)).length,o=0;o<a;o++)if((h=F(s,o))<48||h>n)return NaN;return parseInt(s,r)}return+c}(e)}(t));return f(C,e=this)&&v((function(){m(e)}))?l(Object(i),this,R):i};R.prototype=C,S&&!n&&(C.constructor=R),r({global:!0,constructor:!0,wrap:!0,forced:S},{Number:R});var I=function(t,e){for(var i,r=s?b(e):\\\"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,fromString,range\\\".split(\\\",\\\"),n=0;r.length>n;n++)u(e,i=r[n])&&!u(t,i)&&y(t,i,g(e,i))};n&&A&&I(o[w],A),(S||n)&&I(o[w],x)},5428:function(t,e,i){i(6518)({target:\\\"Number\\\",stat:!0},{isFinite:i(360)})},4601:function(t,e,i){i(6518)({target:\\\"Number\\\",stat:!0,nonConfigurable:!0,nonWritable:!0},{MAX_SAFE_INTEGER:9007199254740991})},5843:function(t,e,i){var r=i(6518),n=i(2703);r({target:\\\"Number\\\",stat:!0,forced:Number.parseInt!==n},{parseInt:n})},5506:function(t,e,i){var r=i(6518),n=i(2357).entries;r({target:\\\"Object\\\",stat:!0},{entries:function(t){return n(t)}})},3851:function(t,e,i){var r=i(6518),n=i(9039),s=i(5397),a=i(7347).f,o=i(3724);r({target:\\\"Object\\\",stat:!0,forced:!o||n((function(){a(1)})),sham:!o},{getOwnPropertyDescriptor:function(t,e){return a(s(t),e)}})},1278:function(t,e,i){var r=i(6518),n=i(3724),s=i(5031),a=i(5397),o=i(7347),h=i(4659);r({target:\\\"Object\\\",stat:!0,sham:!n},{getOwnPropertyDescriptors:function(t){for(var e,i,r=a(t),n=o.f,c=s(r),u={},l=0;c.length>l;)void 0!==(i=n(r,e=c[l++]))&&h(u,e,i);return u}})},9773:function(t,e,i){var r=i(6518),n=i(4495),s=i(9039),a=i(3717),o=i(8981);r({target:\\\"Object\\\",stat:!0,forced:!n||s((function(){a.f(1)}))},{getOwnPropertySymbols:function(t){var e=a.f;return e?e(o(t)):[]}})},875:function(t,e,i){var r=i(6518),n=i(9039),s=i(8981),a=i(2787),o=i(2211);r({target:\\\"Object\\\",stat:!0,forced:n((function(){a(1)})),sham:!o},{getPrototypeOf:function(t){return a(s(t))}})},9432:function(t,e,i){var r=i(6518),n=i(8981),s=i(1072);r({target:\\\"Object\\\",stat:!0,forced:i(9039)((function(){s(1)}))},{keys:function(t){return s(n(t))}})},287:function(t,e,i){i(6518)({target:\\\"Object\\\",stat:!0},{setPrototypeOf:i(2967)})},6099:function(t,e,i){var r=i(2140),n=i(6840),s=i(3179);r||n(Object.prototype,\\\"toString\\\",s,{unsafe:!0})},825:function(t,e,i){var r=i(6518),n=i(7751),s=i(8745),a=i(566),o=i(5548),h=i(8551),c=i(34),u=i(2360),l=i(9039),f=n(\\\"Reflect\\\",\\\"construct\\\"),d=Object.prototype,p=[].push,v=l((function(){function t(){}return!(f((function(){}),[],t)instanceof t)})),b=!l((function(){f((function(){}))})),g=v||b;r({target:\\\"Reflect\\\",stat:!0,forced:g,sham:g},{construct:function(t,e){o(t),h(e);var i=arguments.length<3?t:o(arguments[2]);if(b&&!v)return f(t,e,i);if(t===i){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var r=[null];return s(p,r,e),new(s(a,t,r))}var n=i.prototype,l=u(c(n)?n:d),g=s(t,l,e);return c(g)?g:l}})},7495:function(t,e,i){var r=i(6518),n=i(7323);r({target:\\\"RegExp\\\",proto:!0,forced:/./.exec!==n},{exec:n})},8781:function(t,e,i){var r=i(350).PROPER,n=i(6840),s=i(8551),a=i(655),o=i(9039),h=i(1034),c=\\\"toString\\\",u=RegExp.prototype,l=u[c],f=o((function(){return\\\"/a/b\\\"!==l.call({source:\\\"a\\\",flags:\\\"b\\\"})})),d=r&&l.name!==c;(f||d)&&n(u,c,(function(){var t=s(this);return\\\"/\\\"+a(t.source)+\\\"/\\\"+a(h(t))}),{unsafe:!0})},2405:function(t,e,i){i(6468)(\\\"Set\\\",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),i(6938))},1415:function(t,e,i){i(2405)},1699:function(t,e,i){var r=i(6518),n=i(9504),s=i(5749),a=i(7750),o=i(655),h=i(1436),c=n(\\\"\\\".indexOf);r({target:\\\"String\\\",proto:!0,forced:!h(\\\"includes\\\")},{includes:function(t){return!!~c(o(a(this)),o(s(t)),arguments.length>1?arguments[1]:void 0)}})},7764:function(t,e,i){var r=i(8183).charAt,n=i(655),s=i(1181),a=i(1088),o=i(2529),h=\\\"String Iterator\\\",c=s.set,u=s.getterFor(h);a(String,\\\"String\\\",(function(t){c(this,{type:h,string:n(t),index:0})}),(function(){var t,e=u(this),i=e.string,n=e.index;return n>=i.length?o(void 0,!0):(t=r(i,n),e.index+=t.length,o(t,!1))}))},8156:function(t,e,i){var r=i(6518),n=i(533).start;r({target:\\\"String\\\",proto:!0,forced:i(3063)},{padStart:function(t){return n(this,t,arguments.length>1?arguments[1]:void 0)}})},5440:function(t,e,i){var r=i(8745),n=i(9565),s=i(9504),a=i(9228),o=i(9039),h=i(8551),c=i(4901),u=i(4117),l=i(1291),f=i(8014),d=i(655),p=i(7750),v=i(7829),b=i(5966),g=i(2478),y=i(6682),m=i(8227)(\\\"replace\\\"),_=Math.max,w=Math.min,x=s([].concat),A=s([].push),C=s(\\\"\\\".indexOf),T=s(\\\"\\\".slice),k=\\\"$0\\\"===\\\"a\\\".replace(/./,\\\"$0\\\"),F=!!/./[m]&&\\\"\\\"===/./[m](\\\"a\\\",\\\"$0\\\");a(\\\"replace\\\",(function(t,e,i){var s=F?\\\"$\\\":\\\"$0\\\";return[function(t,i){var r=p(this),s=u(t)?void 0:b(t,m);return s?n(s,t,r,i):n(e,d(r),t,i)},function(t,n){var a=h(this),o=d(t);if(\\\"string\\\"==typeof n&&-1===C(n,s)&&-1===C(n,\\\"$<\\\")){var u=i(e,a,o,n);if(u.done)return u.value}var p=c(n);p||(n=d(n));var b,m=a.global;m&&(b=a.unicode,a.lastIndex=0);for(var k,F=[];null!==(k=y(a,o))&&(A(F,k),m);)\\\"\\\"===d(k[0])&&(a.lastIndex=v(o,f(a.lastIndex),b));for(var S,R=\\\"\\\",I=0,E=0;E<F.length;E++){for(var O,M=d((k=F[E])[0]),G=_(w(l(k.index),o.length),0),B=[],P=1;P<k.length;P++)A(B,void 0===(S=k[P])?S:String(S));var D=k.groups;if(p){var j=x([M],B,G,o);void 0!==D&&A(j,D),O=d(r(n,void 0,j))}else O=g(M,o,G,B,D,n);G>=I&&(R+=T(o,I,G)+O,I=G+M.length)}return R+T(o,I)}]}),!!o((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:\\\"7\\\"},t},\\\"7\\\"!==\\\"\\\".replace(t,\\\"$<a>\\\")}))||!k||F)},6761:function(t,e,i){var r=i(6518),n=i(4576),s=i(9565),a=i(9504),o=i(6395),h=i(3724),c=i(4495),u=i(9039),l=i(9297),f=i(1625),d=i(8551),p=i(5397),v=i(6969),b=i(655),g=i(6980),y=i(2360),m=i(1072),_=i(8480),w=i(298),x=i(3717),A=i(7347),C=i(4913),T=i(6801),k=i(8773),F=i(6840),S=i(2106),R=i(5745),I=i(6119),E=i(421),O=i(3392),M=i(8227),G=i(1951),B=i(511),P=i(8242),D=i(687),j=i(1181),L=i(9213).forEach,N=I(\\\"hidden\\\"),U=\\\"Symbol\\\",z=\\\"prototype\\\",H=j.set,X=j.getterFor(U),K=Object[z],V=n.Symbol,$=V&&V[z],W=n.RangeError,Y=n.TypeError,J=n.QObject,Z=A.f,q=C.f,Q=w.f,tt=k.f,et=a([].push),it=R(\\\"symbols\\\"),rt=R(\\\"op-symbols\\\"),nt=R(\\\"wks\\\"),st=!J||!J[z]||!J[z].findChild,at=function(t,e,i){var r=Z(K,e);r&&delete K[e],q(t,e,i),r&&t!==K&&q(K,e,r)},ot=h&&u((function(){return 7!==y(q({},\\\"a\\\",{get:function(){return q(this,\\\"a\\\",{value:7}).a}})).a}))?at:q,ht=function(t,e){var i=it[t]=y($);return H(i,{type:U,tag:t,description:e}),h||(i.description=e),i},ct=function(t,e,i){t===K&&ct(rt,e,i),d(t);var r=v(e);return d(i),l(it,r)?(i.enumerable?(l(t,N)&&t[N][r]&&(t[N][r]=!1),i=y(i,{enumerable:g(0,!1)})):(l(t,N)||q(t,N,g(1,y(null))),t[N][r]=!0),ot(t,r,i)):q(t,r,i)},ut=function(t,e){d(t);var i=p(e),r=m(i).concat(pt(i));return L(r,(function(e){h&&!s(lt,i,e)||ct(t,e,i[e])})),t},lt=function(t){var e=v(t),i=s(tt,this,e);return!(this===K&&l(it,e)&&!l(rt,e))&&(!(i||!l(this,e)||!l(it,e)||l(this,N)&&this[N][e])||i)},ft=function(t,e){var i=p(t),r=v(e);if(i!==K||!l(it,r)||l(rt,r)){var n=Z(i,r);return!n||!l(it,r)||l(i,N)&&i[N][r]||(n.enumerable=!0),n}},dt=function(t){var e=Q(p(t)),i=[];return L(e,(function(t){l(it,t)||l(E,t)||et(i,t)})),i},pt=function(t){var e=t===K,i=Q(e?rt:p(t)),r=[];return L(i,(function(t){!l(it,t)||e&&!l(K,t)||et(r,it[t])})),r};c||(V=function(){if(f($,this))throw new Y(\\\"Symbol is not a constructor\\\");var t=arguments.length&&void 0!==arguments[0]?b(arguments[0]):void 0,e=O(t),i=function(t){var r=void 0===this?n:this;r===K&&s(i,rt,t),l(r,N)&&l(r[N],e)&&(r[N][e]=!1);var a=g(1,t);try{ot(r,e,a)}catch(t){if(!(t instanceof W))throw t;at(r,e,a)}};return h&&st&&ot(K,e,{configurable:!0,set:i}),ht(e,t)},F($=V[z],\\\"toString\\\",(function(){return X(this).tag})),F(V,\\\"withoutSetter\\\",(function(t){return ht(O(t),t)})),k.f=lt,C.f=ct,T.f=ut,A.f=ft,_.f=w.f=dt,x.f=pt,G.f=function(t){return ht(M(t),t)},h&&(S($,\\\"description\\\",{configurable:!0,get:function(){return X(this).description}}),o||F(K,\\\"propertyIsEnumerable\\\",lt,{unsafe:!0}))),r({global:!0,constructor:!0,wrap:!0,forced:!c,sham:!c},{Symbol:V}),L(m(nt),(function(t){B(t)})),r({target:U,stat:!0,forced:!c},{useSetter:function(){st=!0},useSimple:function(){st=!1}}),r({target:\\\"Object\\\",stat:!0,forced:!c,sham:!h},{create:function(t,e){return void 0===e?y(t):ut(y(t),e)},defineProperty:ct,defineProperties:ut,getOwnPropertyDescriptor:ft}),r({target:\\\"Object\\\",stat:!0,forced:!c},{getOwnPropertyNames:dt}),P(),D(V,U),E[N]=!0},9463:function(t,e,i){var r=i(6518),n=i(3724),s=i(4576),a=i(9504),o=i(9297),h=i(4901),c=i(1625),u=i(655),l=i(2106),f=i(7740),d=s.Symbol,p=d&&d.prototype;if(n&&h(d)&&(!(\\\"description\\\"in p)||void 0!==d().description)){var v={},b=function(){var t=arguments.length<1||void 0===arguments[0]?void 0:u(arguments[0]),e=c(p,this)?new d(t):void 0===t?d():d(t);return\\\"\\\"===t&&(v[e]=!0),e};f(b,d),b.prototype=p,p.constructor=b;var g=\\\"Symbol(description detection)\\\"===String(d(\\\"description detection\\\")),y=a(p.valueOf),m=a(p.toString),_=/^Symbol\\\\((.*)\\\\)[^)]+$/,w=a(\\\"\\\".replace),x=a(\\\"\\\".slice);l(p,\\\"description\\\",{configurable:!0,get:function(){var t=y(this);if(o(v,t))return\\\"\\\";var e=m(t),i=g?x(e,7,-1):w(e,_,\\\"$1\\\");return\\\"\\\"===i?void 0:i}}),r({global:!0,constructor:!0,forced:!0},{Symbol:b})}},1510:function(t,e,i){var r=i(6518),n=i(7751),s=i(9297),a=i(655),o=i(5745),h=i(1296),c=o(\\\"string-to-symbol-registry\\\"),u=o(\\\"symbol-to-string-registry\\\");r({target:\\\"Symbol\\\",stat:!0,forced:!h},{for:function(t){var e=a(t);if(s(c,e))return c[e];var i=n(\\\"Symbol\\\")(e);return c[e]=i,u[i]=e,i}})},2259:function(t,e,i){i(511)(\\\"iterator\\\")},2675:function(t,e,i){i(6761),i(1510),i(7812),i(3110),i(9773)},7812:function(t,e,i){var r=i(6518),n=i(9297),s=i(757),a=i(6823),o=i(5745),h=i(1296),c=o(\\\"symbol-to-string-registry\\\");r({target:\\\"Symbol\\\",stat:!0,forced:!h},{keyFor:function(t){if(!s(t))throw new TypeError(a(t)+\\\" is not a symbol\\\");if(n(c,t))return c[t]}})},5700:function(t,e,i){var r=i(511),n=i(8242);r(\\\"toPrimitive\\\"),n()},1630:function(t,e,i){var r=i(9504),n=i(4644),s=r(i(7029)),a=n.aTypedArray;(0,n.exportTypedArrayMethod)(\\\"copyWithin\\\",(function(t,e){return s(a(this),t,e,arguments.length>2?arguments[2]:void 0)}))},2170:function(t,e,i){var r=i(4644),n=i(9213).every,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"every\\\",(function(t){return n(s(this),t,arguments.length>1?arguments[1]:void 0)}))},5044:function(t,e,i){var r=i(4644),n=i(4373),s=i(5854),a=i(6955),o=i(9565),h=i(9504),c=i(9039),u=r.aTypedArray,l=r.exportTypedArrayMethod,f=h(\\\"\\\".slice);l(\\\"fill\\\",(function(t){var e=arguments.length;u(this);var i=\\\"Big\\\"===f(a(this),0,3)?s(t):+t;return o(n,this,i,e>1?arguments[1]:void 0,e>2?arguments[2]:void 0)}),c((function(){var t=0;return new Int8Array(2).fill({valueOf:function(){return t++}}),1!==t})))},9539:function(t,e,i){var r=i(4644),n=i(9213).filter,s=i(6357),a=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"filter\\\",(function(t){var e=n(a(this),t,arguments.length>1?arguments[1]:void 0);return s(this,e)}))},9955:function(t,e,i){var r=i(4644),n=i(9213).findIndex,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"findIndex\\\",(function(t){return n(s(this),t,arguments.length>1?arguments[1]:void 0)}))},1694:function(t,e,i){var r=i(4644),n=i(9213).find,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"find\\\",(function(t){return n(s(this),t,arguments.length>1?arguments[1]:void 0)}))},3206:function(t,e,i){var r=i(4644),n=i(9213).forEach,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"forEach\\\",(function(t){n(s(this),t,arguments.length>1?arguments[1]:void 0)}))},4496:function(t,e,i){var r=i(4644),n=i(9617).includes,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"includes\\\",(function(t){return n(s(this),t,arguments.length>1?arguments[1]:void 0)}))},6651:function(t,e,i){var r=i(4644),n=i(9617).indexOf,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"indexOf\\\",(function(t){return n(s(this),t,arguments.length>1?arguments[1]:void 0)}))},2887:function(t,e,i){var r=i(4576),n=i(9039),s=i(9504),a=i(4644),o=i(3792),h=i(8227)(\\\"iterator\\\"),c=r.Uint8Array,u=s(o.values),l=s(o.keys),f=s(o.entries),d=a.aTypedArray,p=a.exportTypedArrayMethod,v=c&&c.prototype,b=!n((function(){v[h].call([1])})),g=!!v&&v.values&&v[h]===v.values&&\\\"values\\\"===v.values.name,y=function(){return u(d(this))};p(\\\"entries\\\",(function(){return f(d(this))}),b),p(\\\"keys\\\",(function(){return l(d(this))}),b),p(\\\"values\\\",y,b||!g,{name:\\\"values\\\"}),p(h,y,b||!g,{name:\\\"values\\\"})},9369:function(t,e,i){var r=i(4644),n=i(9504),s=r.aTypedArray,a=r.exportTypedArrayMethod,o=n([].join);a(\\\"join\\\",(function(t){return o(s(this),t)}))},6812:function(t,e,i){var r=i(4644),n=i(8745),s=i(8379),a=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"lastIndexOf\\\",(function(t){var e=arguments.length;return n(s,a(this),e>1?[t,arguments[1]]:[t])}))},8995:function(t,e,i){var r=i(4644),n=i(9213).map,s=i(1412),a=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"map\\\",(function(t){return n(a(this),t,arguments.length>1?arguments[1]:void 0,(function(t,e){return new(s(t))(e)}))}))},6072:function(t,e,i){var r=i(4644),n=i(926).right,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"reduceRight\\\",(function(t){var e=arguments.length;return n(s(this),t,e,e>1?arguments[1]:void 0)}))},1575:function(t,e,i){var r=i(4644),n=i(926).left,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"reduce\\\",(function(t){var e=arguments.length;return n(s(this),t,e,e>1?arguments[1]:void 0)}))},8747:function(t,e,i){var r=i(4644),n=r.aTypedArray,s=r.exportTypedArrayMethod,a=Math.floor;s(\\\"reverse\\\",(function(){for(var t,e=this,i=n(e).length,r=a(i/2),s=0;s<r;)t=e[s],e[s++]=e[--i],e[i]=t;return e}))},8845:function(t,e,i){var r=i(4576),n=i(9565),s=i(4644),a=i(6198),o=i(8229),h=i(8981),c=i(9039),u=r.RangeError,l=r.Int8Array,f=l&&l.prototype,d=f&&f.set,p=s.aTypedArray,v=s.exportTypedArrayMethod,b=!c((function(){var t=new Uint8ClampedArray(2);return n(d,t,{length:1,0:3},1),3!==t[1]})),g=b&&s.NATIVE_ARRAY_BUFFER_VIEWS&&c((function(){var t=new l(2);return t.set(1),t.set(\\\"2\\\",1),0!==t[0]||2!==t[1]}));v(\\\"set\\\",(function(t){p(this);var e=o(arguments.length>1?arguments[1]:void 0,1),i=h(t);if(b)return n(d,this,i,e);var r=this.length,s=a(i),c=0;if(s+e>r)throw new u(\\\"Wrong length\\\");for(;c<s;)this[e+c]=i[c++]}),!b||g)},9423:function(t,e,i){var r=i(4644),n=i(1412),s=i(9039),a=i(7680),o=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"slice\\\",(function(t,e){for(var i=a(o(this),t,e),r=n(this),s=0,h=i.length,c=new r(h);h>s;)c[s]=i[s++];return c}),s((function(){new Int8Array(1).slice()})))},7301:function(t,e,i){var r=i(4644),n=i(9213).some,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"some\\\",(function(t){return n(s(this),t,arguments.length>1?arguments[1]:void 0)}))},373:function(t,e,i){var r=i(4576),n=i(7476),s=i(9039),a=i(9306),o=i(4488),h=i(4644),c=i(3709),u=i(3763),l=i(9519),f=i(3607),d=h.aTypedArray,p=h.exportTypedArrayMethod,v=r.Uint16Array,b=v&&n(v.prototype.sort),g=!(!b||s((function(){b(new v(2),null)}))&&s((function(){b(new v(2),{})}))),y=!!b&&!s((function(){if(l)return l<74;if(c)return c<67;if(u)return!0;if(f)return f<602;var t,e,i=new v(516),r=Array(516);for(t=0;t<516;t++)e=t%4,i[t]=515-t,r[t]=t-2*e+3;for(b(i,(function(t,e){return(t/4|0)-(e/4|0)})),t=0;t<516;t++)if(i[t]!==r[t])return!0}));p(\\\"sort\\\",(function(t){return void 0!==t&&a(t),y?b(this,t):o(d(this),function(t){return function(e,i){return void 0!==t?+t(e,i)||0:i!=i?-1:e!=e?1:0===e&&0===i?1/e>0&&1/i<0?1:-1:e>i}}(t))}),!y||g)},6614:function(t,e,i){var r=i(4644),n=i(8014),s=i(5610),a=i(1412),o=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"subarray\\\",(function(t,e){var i=o(this),r=i.length,h=s(t,r);return new(a(i))(i.buffer,i.byteOffset+h*i.BYTES_PER_ELEMENT,n((void 0===e?r:s(e,r))-h))}))},1405:function(t,e,i){var r=i(4576),n=i(8745),s=i(4644),a=i(9039),o=i(7680),h=r.Int8Array,c=s.aTypedArray,u=s.exportTypedArrayMethod,l=[].toLocaleString,f=!!h&&a((function(){l.call(new h(1))}));u(\\\"toLocaleString\\\",(function(){return n(l,f?o(c(this)):c(this),o(arguments))}),a((function(){return[1,2].toLocaleString()!==new h([1,2]).toLocaleString()}))||!a((function(){h.prototype.toLocaleString.call([1,2])})))},3684:function(t,e,i){var r=i(4644).exportTypedArrayMethod,n=i(9039),s=i(4576),a=i(9504),o=s.Uint8Array,h=o&&o.prototype||{},c=[].toString,u=a([].join);n((function(){c.call({})}))&&(c=function(){return u(this)});var l=h.toString!==c;r(\\\"toString\\\",c,l)},1489:function(t,e,i){i(5823)(\\\"Uint8\\\",(function(t){return function(e,i,r){return t(this,e,i,r)}}))},3500:function(t,e,i){var r=i(4576),n=i(7400),s=i(9296),a=i(235),o=i(6699),h=function(t){if(t&&t.forEach!==a)try{o(t,\\\"forEach\\\",a)}catch(e){t.forEach=a}};for(var c in n)n[c]&&h(r[c]&&r[c].prototype);h(s)},2953:function(t,e,i){var r=i(4576),n=i(7400),s=i(9296),a=i(3792),o=i(6699),h=i(687),c=i(8227)(\\\"iterator\\\"),u=a.values,l=function(t,e){if(t){if(t[c]!==u)try{o(t,c,u)}catch(e){t[c]=u}if(h(t,e,!0),n[e])for(var i in a)if(t[i]!==a[i])try{o(t,i,a[i])}catch(e){t[i]=a[i]}}};for(var f in n)l(r[f]&&r[f].prototype,f);l(s,\\\"DOMTokenList\\\")}},e={};function i(r){var n=e[r];if(void 0!==n)return n.exports;var s=e[r]={exports:{}};return t[r].call(s.exports,s,s.exports,i),s.exports}i.d=function(t,e){for(var r in e)i.o(e,r)&&!i.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},i.g=function(){if(\\\"object\\\"==typeof globalThis)return globalThis;try{return this||new Function(\\\"return this\\\")()}catch(t){if(\\\"object\\\"==typeof window)return window}}(),i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.r=function(t){\\\"undefined\\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\\\"Module\\\"}),Object.defineProperty(t,\\\"__esModule\\\",{value:!0})};var r={};i.r(r),i.d(r,{CanvasProvider:function(){return O},CanvasRenderer:function(){return ot},HTMLProvider:function(){return Rt},HTMLRenderer:function(){return Pt},SVGProvider:function(){return bt},SVGRenderer:function(){return At}}),i(2675),i(9463),i(2259),i(5700),i(8706),i(2008),i(3792),i(4782),i(4743),i(1745),i(9572),i(2892),i(5428),i(4601),i(5843),i(3851),i(1278),i(9432),i(6099),i(8781),i(7764),i(1489),i(1630),i(2170),i(5044),i(9539),i(1694),i(9955),i(3206),i(4496),i(6651),i(2887),i(9369),i(6812),i(8995),i(1575),i(6072),i(8747),i(8845),i(9423),i(7301),i(373),i(6614),i(1405),i(3684),i(3500),i(2953),i(3771),i(3418),i(4423),i(2010),i(6033),i(5506),i(7495),i(1699),i(8156),i(5440);var n=new Map([[0,{bytes:2,alphabet:0}],[1,{bytes:1,alphabet:1}],[2,{bytes:1,alphabet:2}],[3,{bytes:1,alphabet:3}],[4,{bytes:1,alphabet:4}],[5,{bytes:1,alphabet:5}],[6,{bytes:1,alphabet:6}],[7,{bytes:1,alphabet:7}],[8,{bytes:1,alphabet:8}],[9,{bytes:1,alphabet:9}],[10,{bytes:1,alphabet:10}],[11,{bytes:1,alphabet:11}],[12,{bytes:2,alphabet:12}],[13,{bytes:2,alphabet:13}],[14,{bytes:2,alphabet:14}]]),s=new Map([[66,{bytes:2,alphabet:0}],[74,{bytes:1,alphabet:1}],[48,{bytes:1,alphabet:2}],[49,{bytes:1,alphabet:3}],[50,{bytes:1,alphabet:4}],[51,{bytes:1,alphabet:5}],[52,{bytes:1,alphabet:6}],[53,{bytes:1,alphabet:7}],[54,{bytes:1,alphabet:8}],[55,{bytes:1,alphabet:9}],[56,{bytes:1,alphabet:10}],[73,{bytes:1,alphabet:11}],[57,{bytes:2,alphabet:12}],[58,{bytes:2,alphabet:13}],[59,{bytes:2,alphabet:14}]]),a=new Map([[15,{bytes:2,alphabet:15}],[16,{bytes:1,alphabet:16}],[17,{bytes:1,alphabet:17}],[18,{bytes:1,alphabet:18}],[19,{bytes:1,alphabet:19}],[20,{bytes:1,alphabet:20}],[21,{bytes:1,alphabet:21}],[22,{bytes:1,alphabet:22}],[23,{bytes:1,alphabet:23}],[24,{bytes:1,alphabet:24}],[25,{bytes:1,alphabet:25}],[26,{bytes:1,alphabet:26}],[27,{bytes:1,alphabet:27}],[28,{bytes:1,alphabet:28}],[29,{bytes:1,alphabet:29}],[30,{bytes:1,alphabet:30}],[31,{bytes:1,alphabet:31}]]),o=new Map([[64,{bytes:2,alphabet:15}],[65,{bytes:1,alphabet:16}],[66,{bytes:1,alphabet:17}],[67,{bytes:1,alphabet:18}],[68,{bytes:1,alphabet:19}],[69,{bytes:1,alphabet:20}],[70,{bytes:1,alphabet:21}],[71,{bytes:1,alphabet:22}],[72,{bytes:1,alphabet:23}],[73,{bytes:1,alphabet:24}],[74,{bytes:1,alphabet:25}],[75,{bytes:1,alphabet:26}],[76,{bytes:1,alphabet:27}],[77,{bytes:1,alphabet:28}],[78,{bytes:1,alphabet:29}],[79,{bytes:1,alphabet:30}],[112,{bytes:1,alphabet:31}]]),h=[[\\\"#000000FF\\\",\\\"#FF0000FF\\\",\\\"#00FF00FF\\\",\\\"#FFFF00FF\\\",\\\"#0000FFFF\\\",\\\"#FF00FFFF\\\",\\\"#00FFFFFF\\\",\\\"#FFFFFFFF\\\",\\\"#00000000\\\",\\\"#AA0000FF\\\",\\\"#00AA00FF\\\",\\\"#AAAA00FF\\\",\\\"#0000AAFF\\\",\\\"#AA00AAFF\\\",\\\"#00AAAAFF\\\",\\\"#AAAAAAFF\\\"],[\\\"#000055FF\\\",\\\"#005500FF\\\",\\\"#005555FF\\\",\\\"#0055AAFF\\\",\\\"#0055FFFF\\\",\\\"#00AA55FF\\\",\\\"#00AAFFFF\\\",\\\"#00FF55FF\\\",\\\"#00FFAAFF\\\",\\\"#550000FF\\\",\\\"#550055FF\\\",\\\"#5500AAFF\\\",\\\"#5500FFFF\\\",\\\"#555500FF\\\",\\\"#555555FF\\\",\\\"#5555AAFF\\\"],[\\\"#5555FFFF\\\",\\\"#55AA00FF\\\",\\\"#55AA55FF\\\",\\\"#55AAAAFF\\\",\\\"#55AAFFFF\\\",\\\"#55FF00FF\\\",\\\"#55FF55FF\\\",\\\"#55FFAAFF\\\",\\\"#55FFFFFF\\\",\\\"#AA0055FF\\\",\\\"#AA00FFFF\\\",\\\"#AA5500FF\\\",\\\"#AA5555FF\\\",\\\"#AA55AAFF\\\",\\\"#AA55FFFF\\\",\\\"#AAAA55FF\\\"],[\\\"#AAAAFFFF\\\",\\\"#AAFF00FF\\\",\\\"#AAFF55FF\\\",\\\"#AAFFAAFF\\\",\\\"#AAFFFFFF\\\",\\\"#FF0055FF\\\",\\\"#FF00AAFF\\\",\\\"#FF5500FF\\\",\\\"#FF5555FF\\\",\\\"#FF55AAFF\\\",\\\"#FF55FFFF\\\",\\\"#FFAA00FF\\\",\\\"#FFAA55FF\\\",\\\"#FFAAAAFF\\\",\\\"#FFAAFFFF\\\",\\\"#FFFF55FF\\\"],[\\\"#FFFFAAFF\\\",\\\"#00000080\\\",\\\"#FF000080\\\",\\\"#00FF0080\\\",\\\"#FFFF0080\\\",\\\"#0000FF80\\\",\\\"#FF00FF80\\\",\\\"#00FFFF80\\\",\\\"#FFFFFF80\\\",\\\"#AA000080\\\",\\\"#00AA0080\\\",\\\"#AAAA0080\\\",\\\"#0000AA80\\\",\\\"#AA00AA80\\\",\\\"#00AAAA80\\\",\\\"#AAAAAA80\\\"],[\\\"#00005580\\\",\\\"#00550080\\\",\\\"#00555580\\\",\\\"#0055AA80\\\",\\\"#0055FF80\\\",\\\"#00AA5580\\\",\\\"#00AAFF80\\\",\\\"#00FF5580\\\",\\\"#00FFAA80\\\",\\\"#55000080\\\",\\\"#55005580\\\",\\\"#5500AA80\\\",\\\"#5500FF80\\\",\\\"#55550080\\\",\\\"#55555580\\\",\\\"#5555AA80\\\"],[\\\"#5555FF80\\\",\\\"#55AA0080\\\",\\\"#55AA5580\\\",\\\"#55AAAA80\\\",\\\"#55AAFF80\\\",\\\"#55FF0080\\\",\\\"#55FF5580\\\",\\\"#55FFAA80\\\",\\\"#55FFFF80\\\",\\\"#AA005580\\\",\\\"#AA00FF80\\\",\\\"#AA550080\\\",\\\"#AA555580\\\",\\\"#AA55AA80\\\",\\\"#AA55FF80\\\",\\\"#AAAA5580\\\"],[\\\"#AAAAFF80\\\",\\\"#AAFF0080\\\",\\\"#AAFF5580\\\",\\\"#AAFFAA80\\\",\\\"#AAFFFF80\\\",\\\"#FF005580\\\",\\\"#FF00AA80\\\",\\\"#FF550080\\\",\\\"#FF555580\\\",\\\"#FF55AA80\\\",\\\"#FF55FF80\\\",\\\"#FFAA0080\\\",\\\"#FFAA5580\\\",\\\"#FFAAAA80\\\",\\\"#FFAAFF80\\\",\\\"#FFFF5580\\\"]],c=[\\\"　\\\",\\\"、\\\",\\\"。\\\",\\\"，\\\",\\\"．\\\",\\\"・\\\",\\\"：\\\",\\\"；\\\",\\\"？\\\",\\\"！\\\",\\\"゛\\\",\\\"゜\\\",\\\"´\\\",\\\"｀\\\",\\\"¨\\\",\\\"＾\\\",\\\"￣\\\",\\\"＿\\\",\\\"ヽ\\\",\\\"ヾ\\\",\\\"ゝ\\\",\\\"ゞ\\\",\\\"〃\\\",\\\"仝\\\",\\\"々\\\",\\\"〆\\\",\\\"〇\\\",\\\"ー\\\",\\\"―\\\",\\\"‐\\\",\\\"／\\\",\\\"＼\\\",\\\"〜\\\",\\\"‖\\\",\\\"｜\\\",\\\"…\\\",\\\"‥\\\",\\\"‘\\\",\\\"’\\\",\\\"“\\\",\\\"”\\\",\\\"（\\\",\\\"）\\\",\\\"〔\\\",\\\"〕\\\",\\\"［\\\",\\\"］\\\",\\\"｛\\\",\\\"｝\\\",\\\"〈\\\",\\\"〉\\\",\\\"《\\\",\\\"》\\\",\\\"「\\\",\\\"」\\\",\\\"『\\\",\\\"』\\\",\\\"【\\\",\\\"】\\\",\\\"＋\\\",\\\"−\\\",\\\"±\\\",\\\"×\\\",\\\"÷\\\",\\\"＝\\\",\\\"≠\\\",\\\"＜\\\",\\\"＞\\\",\\\"≦\\\",\\\"≧\\\",\\\"∞\\\",\\\"∴\\\",\\\"♂\\\",\\\"♀\\\",\\\"°\\\",\\\"′\\\",\\\"″\\\",\\\"℃\\\",\\\"￥\\\",\\\"＄\\\",\\\"¢\\\",\\\"£\\\",\\\"％\\\",\\\"＃\\\",\\\"＆\\\",\\\"＊\\\",\\\"＠\\\",\\\"§\\\",\\\"☆\\\",\\\"★\\\",\\\"○\\\",\\\"●\\\",\\\"◎\\\",\\\"◇\\\",\\\"◆\\\",\\\"□\\\",\\\"■\\\",\\\"△\\\",\\\"▲\\\",\\\"▽\\\",\\\"▼\\\",\\\"※\\\",\\\"〒\\\",\\\"→\\\",\\\"←\\\",\\\"↑\\\",\\\"↓\\\",\\\"〓\\\",\\\"＇\\\",\\\"＂\\\",\\\"－\\\",\\\"～\\\",\\\"〳\\\",\\\"〴\\\",\\\"〵\\\",\\\"〻\\\",\\\"〼\\\",\\\"ヿ\\\",\\\"ゟ\\\",\\\"∈\\\",\\\"∋\\\",\\\"⊆\\\",\\\"⊇\\\",\\\"⊂\\\",\\\"⊃\\\",\\\"∪\\\",\\\"∩\\\",\\\"⊄\\\",\\\"⊅\\\",\\\"⊊\\\",\\\"⊋\\\",\\\"∉\\\",\\\"∅\\\",\\\"⌅\\\",\\\"⌆\\\",\\\"∧\\\",\\\"∨\\\",\\\"¬\\\",\\\"⇒\\\",\\\"⇔\\\",\\\"∀\\\",\\\"∃\\\",\\\"⊕\\\",\\\"⊖\\\",\\\"⊗\\\",\\\"∥\\\",\\\"∦\\\",\\\"⦅\\\",\\\"⦆\\\",\\\"〘\\\",\\\"〙\\\",\\\"〖\\\",\\\"〗\\\",\\\"∠\\\",\\\"⊥\\\",\\\"⌒\\\",\\\"∂\\\",\\\"∇\\\",\\\"≡\\\",\\\"≒\\\",\\\"≪\\\",\\\"≫\\\",\\\"√\\\",\\\"∽\\\",\\\"∝\\\",\\\"∵\\\",\\\"∫\\\",\\\"∬\\\",\\\"≢\\\",\\\"≃\\\",\\\"≅\\\",\\\"≈\\\",\\\"≶\\\",\\\"≷\\\",\\\"↔\\\",\\\"Å\\\",\\\"‰\\\",\\\"♯\\\",\\\"♭\\\",\\\"♪\\\",\\\"†\\\",\\\"‡\\\",\\\"¶\\\",\\\"♮\\\",\\\"♫\\\",\\\"♬\\\",\\\"♩\\\",\\\"◯\\\",\\\"▷\\\",\\\"▶\\\",\\\"◁\\\",\\\"◀\\\",\\\"↗\\\",\\\"↘\\\",\\\"↖\\\",\\\"↙\\\",\\\"⇄\\\",\\\"⇨\\\",\\\"⇦\\\",\\\"⇧\\\",\\\"⇩\\\",\\\"⤴\\\",\\\"⤵\\\",\\\"０\\\",\\\"１\\\",\\\"２\\\",\\\"３\\\",\\\"４\\\",\\\"５\\\",\\\"６\\\",\\\"７\\\",\\\"８\\\",\\\"９\\\",\\\"⦿\\\",\\\"◉\\\",\\\"〽\\\",\\\"﹆\\\",\\\"﹅\\\",\\\"◦\\\",\\\"•\\\",\\\"Ａ\\\",\\\"Ｂ\\\",\\\"Ｃ\\\",\\\"Ｄ\\\",\\\"Ｅ\\\",\\\"Ｆ\\\",\\\"Ｇ\\\",\\\"Ｈ\\\",\\\"Ｉ\\\",\\\"Ｊ\\\",\\\"Ｋ\\\",\\\"Ｌ\\\",\\\"Ｍ\\\",\\\"Ｎ\\\",\\\"Ｏ\\\",\\\"Ｐ\\\",\\\"Ｑ\\\",\\\"Ｒ\\\",\\\"Ｓ\\\",\\\"Ｔ\\\",\\\"Ｕ\\\",\\\"Ｖ\\\",\\\"Ｗ\\\",\\\"Ｘ\\\",\\\"Ｙ\\\",\\\"Ｚ\\\",\\\"∓\\\",\\\"ℵ\\\",\\\"ℏ\\\",\\\"㏋\\\",\\\"ℓ\\\",\\\"℧\\\",\\\"ａ\\\",\\\"ｂ\\\",\\\"ｃ\\\",\\\"ｄ\\\",\\\"ｅ\\\",\\\"ｆ\\\",\\\"ｇ\\\",\\\"ｈ\\\",\\\"ｉ\\\",\\\"ｊ\\\",\\\"ｋ\\\",\\\"ｌ\\\",\\\"ｍ\\\",\\\"ｎ\\\",\\\"ｏ\\\",\\\"ｐ\\\",\\\"ｑ\\\",\\\"ｒ\\\",\\\"ｓ\\\",\\\"ｔ\\\",\\\"ｕ\\\",\\\"ｖ\\\",\\\"ｗ\\\",\\\"ｘ\\\",\\\"ｙ\\\",\\\"ｚ\\\",\\\"゠\\\",\\\"–\\\",\\\"⧺\\\",\\\"⧻\\\",\\\"ぁ\\\",\\\"あ\\\",\\\"ぃ\\\",\\\"い\\\",\\\"ぅ\\\",\\\"う\\\",\\\"ぇ\\\",\\\"え\\\",\\\"ぉ\\\",\\\"お\\\",\\\"か\\\",\\\"が\\\",\\\"き\\\",\\\"ぎ\\\",\\\"く\\\",\\\"ぐ\\\",\\\"け\\\",\\\"げ\\\",\\\"こ\\\",\\\"ご\\\",\\\"さ\\\",\\\"ざ\\\",\\\"し\\\",\\\"じ\\\",\\\"す\\\",\\\"ず\\\",\\\"せ\\\",\\\"ぜ\\\",\\\"そ\\\",\\\"ぞ\\\",\\\"た\\\",\\\"だ\\\",\\\"ち\\\",\\\"ぢ\\\",\\\"っ\\\",\\\"つ\\\",\\\"づ\\\",\\\"て\\\",\\\"で\\\",\\\"と\\\",\\\"ど\\\",\\\"な\\\",\\\"に\\\",\\\"ぬ\\\",\\\"ね\\\",\\\"の\\\",\\\"は\\\",\\\"ば\\\",\\\"ぱ\\\",\\\"ひ\\\",\\\"び\\\",\\\"ぴ\\\",\\\"ふ\\\",\\\"ぶ\\\",\\\"ぷ\\\",\\\"へ\\\",\\\"べ\\\",\\\"ぺ\\\",\\\"ほ\\\",\\\"ぼ\\\",\\\"ぽ\\\",\\\"ま\\\",\\\"み\\\",\\\"む\\\",\\\"め\\\",\\\"も\\\",\\\"ゃ\\\",\\\"や\\\",\\\"ゅ\\\",\\\"ゆ\\\",\\\"ょ\\\",\\\"よ\\\",\\\"ら\\\",\\\"り\\\",\\\"る\\\",\\\"れ\\\",\\\"ろ\\\",\\\"ゎ\\\",\\\"わ\\\",\\\"ゐ\\\",\\\"ゑ\\\",\\\"を\\\",\\\"ん\\\",\\\"ゔ\\\",\\\"ゕ\\\",\\\"ゖ\\\",\\\"か゚\\\",\\\"き゚\\\",\\\"く゚\\\",\\\"け゚\\\",\\\"こ゚\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"ァ\\\",\\\"ア\\\",\\\"ィ\\\",\\\"イ\\\",\\\"ゥ\\\",\\\"ウ\\\",\\\"ェ\\\",\\\"エ\\\",\\\"ォ\\\",\\\"オ\\\",\\\"カ\\\",\\\"ガ\\\",\\\"キ\\\",\\\"ギ\\\",\\\"ク\\\",\\\"グ\\\",\\\"ケ\\\",\\\"ゲ\\\",\\\"コ\\\",\\\"ゴ\\\",\\\"サ\\\",\\\"ザ\\\",\\\"シ\\\",\\\"ジ\\\",\\\"ス\\\",\\\"ズ\\\",\\\"セ\\\",\\\"ゼ\\\",\\\"ソ\\\",\\\"ゾ\\\",\\\"タ\\\",\\\"ダ\\\",\\\"チ\\\",\\\"ヂ\\\",\\\"ッ\\\",\\\"ツ\\\",\\\"ヅ\\\",\\\"テ\\\",\\\"デ\\\",\\\"ト\\\",\\\"ド\\\",\\\"ナ\\\",\\\"ニ\\\",\\\"ヌ\\\",\\\"ネ\\\",\\\"ノ\\\",\\\"ハ\\\",\\\"バ\\\",\\\"パ\\\",\\\"ヒ\\\",\\\"ビ\\\",\\\"ピ\\\",\\\"フ\\\",\\\"ブ\\\",\\\"プ\\\",\\\"ヘ\\\",\\\"ベ\\\",\\\"ペ\\\",\\\"ホ\\\",\\\"ボ\\\",\\\"ポ\\\",\\\"マ\\\",\\\"ミ\\\",\\\"ム\\\",\\\"メ\\\",\\\"モ\\\",\\\"ャ\\\",\\\"ヤ\\\",\\\"ュ\\\",\\\"ユ\\\",\\\"ョ\\\",\\\"ヨ\\\",\\\"ラ\\\",\\\"リ\\\",\\\"ル\\\",\\\"レ\\\",\\\"ロ\\\",\\\"ヮ\\\",\\\"ワ\\\",\\\"ヰ\\\",\\\"ヱ\\\",\\\"ヲ\\\",\\\"ン\\\",\\\"ヴ\\\",\\\"ヵ\\\",\\\"ヶ\\\",\\\"カ゚\\\",\\\"キ゚\\\",\\\"ク゚\\\",\\\"ケ゚\\\",\\\"コ゚\\\",\\\"セ゚\\\",\\\"ツ゚\\\",\\\"ト゚\\\",\\\"Α\\\",\\\"Β\\\",\\\"Γ\\\",\\\"Δ\\\",\\\"Ε\\\",\\\"Ζ\\\",\\\"Η\\\",\\\"Θ\\\",\\\"Ι\\\",\\\"Κ\\\",\\\"Λ\\\",\\\"Μ\\\",\\\"Ν\\\",\\\"Ξ\\\",\\\"Ο\\\",\\\"Π\\\",\\\"Ρ\\\",\\\"Σ\\\",\\\"Τ\\\",\\\"Υ\\\",\\\"Φ\\\",\\\"Χ\\\",\\\"Ψ\\\",\\\"Ω\\\",\\\"♤\\\",\\\"♠\\\",\\\"♢\\\",\\\"♦\\\",\\\"♡\\\",\\\"♥\\\",\\\"♧\\\",\\\"♣\\\",\\\"α\\\",\\\"β\\\",\\\"γ\\\",\\\"δ\\\",\\\"ε\\\",\\\"ζ\\\",\\\"η\\\",\\\"θ\\\",\\\"ι\\\",\\\"κ\\\",\\\"λ\\\",\\\"μ\\\",\\\"ν\\\",\\\"ξ\\\",\\\"ο\\\",\\\"π\\\",\\\"ρ\\\",\\\"σ\\\",\\\"τ\\\",\\\"υ\\\",\\\"φ\\\",\\\"χ\\\",\\\"ψ\\\",\\\"ω\\\",\\\"ς\\\",\\\"⓵\\\",\\\"⓶\\\",\\\"⓷\\\",\\\"⓸\\\",\\\"⓹\\\",\\\"⓺\\\",\\\"⓻\\\",\\\"⓼\\\",\\\"⓽\\\",\\\"⓾\\\",\\\"☖\\\",\\\"☗\\\",\\\"〠\\\",\\\"☎\\\",\\\"☀\\\",\\\"☁\\\",\\\"☂\\\",\\\"☃\\\",\\\"♨\\\",\\\"▱\\\",\\\"ㇰ\\\",\\\"ㇱ\\\",\\\"ㇲ\\\",\\\"ㇳ\\\",\\\"ㇴ\\\",\\\"ㇵ\\\",\\\"ㇶ\\\",\\\"ㇷ\\\",\\\"ㇸ\\\",\\\"ㇹ\\\",\\\"ㇷ゚\\\",\\\"ㇺ\\\",\\\"ㇻ\\\",\\\"ㇼ\\\",\\\"ㇽ\\\",\\\"ㇾ\\\",\\\"ㇿ\\\",\\\"А\\\",\\\"Б\\\",\\\"В\\\",\\\"Г\\\",\\\"Д\\\",\\\"Е\\\",\\\"Ё\\\",\\\"Ж\\\",\\\"З\\\",\\\"И\\\",\\\"Й\\\",\\\"К\\\",\\\"Л\\\",\\\"М\\\",\\\"Н\\\",\\\"О\\\",\\\"П\\\",\\\"Р\\\",\\\"С\\\",\\\"Т\\\",\\\"У\\\",\\\"Ф\\\",\\\"Х\\\",\\\"Ц\\\",\\\"Ч\\\",\\\"Ш\\\",\\\"Щ\\\",\\\"Ъ\\\",\\\"Ы\\\",\\\"Ь\\\",\\\"Э\\\",\\\"Ю\\\",\\\"Я\\\",\\\"⎾\\\",\\\"⎿\\\",\\\"⏀\\\",\\\"⏁\\\",\\\"⏂\\\",\\\"⏃\\\",\\\"⏄\\\",\\\"⏅\\\",\\\"⏆\\\",\\\"⏇\\\",\\\"⏈\\\",\\\"⏉\\\",\\\"⏊\\\",\\\"⏋\\\",\\\"⏌\\\",\\\"а\\\",\\\"б\\\",\\\"в\\\",\\\"г\\\",\\\"д\\\",\\\"е\\\",\\\"ё\\\",\\\"ж\\\",\\\"з\\\",\\\"и\\\",\\\"й\\\",\\\"к\\\",\\\"л\\\",\\\"м\\\",\\\"н\\\",\\\"о\\\",\\\"п\\\",\\\"р\\\",\\\"с\\\",\\\"т\\\",\\\"у\\\",\\\"ф\\\",\\\"х\\\",\\\"ц\\\",\\\"ч\\\",\\\"ш\\\",\\\"щ\\\",\\\"ъ\\\",\\\"ы\\\",\\\"ь\\\",\\\"э\\\",\\\"ю\\\",\\\"я\\\",\\\"ヷ\\\",\\\"ヸ\\\",\\\"ヹ\\\",\\\"ヺ\\\",\\\"⋚\\\",\\\"⋛\\\",\\\"⅓\\\",\\\"⅔\\\",\\\"⅕\\\",\\\"✓\\\",\\\"⌘\\\",\\\"␣\\\",\\\"⏎\\\",\\\"─\\\",\\\"│\\\",\\\"┌\\\",\\\"┐\\\",\\\"┘\\\",\\\"└\\\",\\\"├\\\",\\\"┬\\\",\\\"┤\\\",\\\"┴\\\",\\\"┼\\\",\\\"━\\\",\\\"┃\\\",\\\"┏\\\",\\\"┓\\\",\\\"┛\\\",\\\"┗\\\",\\\"┣\\\",\\\"┳\\\",\\\"┫\\\",\\\"┻\\\",\\\"╋\\\",\\\"┠\\\",\\\"┯\\\",\\\"┨\\\",\\\"┷\\\",\\\"┿\\\",\\\"┝\\\",\\\"┰\\\",\\\"┥\\\",\\\"┸\\\",\\\"╂\\\",\\\"㉑\\\",\\\"㉒\\\",\\\"㉓\\\",\\\"㉔\\\",\\\"㉕\\\",\\\"㉖\\\",\\\"㉗\\\",\\\"㉘\\\",\\\"㉙\\\",\\\"㉚\\\",\\\"㉛\\\",\\\"㉜\\\",\\\"㉝\\\",\\\"㉞\\\",\\\"㉟\\\",\\\"㊱\\\",\\\"㊲\\\",\\\"㊳\\\",\\\"㊴\\\",\\\"㊵\\\",\\\"㊶\\\",\\\"㊷\\\",\\\"㊸\\\",\\\"㊹\\\",\\\"㊺\\\",\\\"㊻\\\",\\\"㊼\\\",\\\"㊽\\\",\\\"㊾\\\",\\\"㊿\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"◐\\\",\\\"◑\\\",\\\"◒\\\",\\\"◓\\\",\\\"‼\\\",\\\"⁇\\\",\\\"⁈\\\",\\\"⁉\\\",\\\"Ǎ\\\",\\\"ǎ\\\",\\\"ǐ\\\",\\\"Ḿ\\\",\\\"ḿ\\\",\\\"Ǹ\\\",\\\"ǹ\\\",\\\"Ǒ\\\",\\\"ǒ\\\",\\\"ǔ\\\",\\\"ǖ\\\",\\\"ǘ\\\",\\\"ǚ\\\",\\\"ǜ\\\",\\\"\\\",\\\"\\\",\\\"€\\\",\\\" \\\",\\\"¡\\\",\\\"¤\\\",\\\"¦\\\",\\\"©\\\",\\\"ª\\\",\\\"«\\\",\\\"­\\\",\\\"®\\\",\\\"¯\\\",\\\"²\\\",\\\"³\\\",\\\"·\\\",\\\"¸\\\",\\\"¹\\\",\\\"º\\\",\\\"»\\\",\\\"¼\\\",\\\"½\\\",\\\"¾\\\",\\\"¿\\\",\\\"À\\\",\\\"Á\\\",\\\"Â\\\",\\\"Ã\\\",\\\"Ä\\\",\\\"Å\\\",\\\"Æ\\\",\\\"Ç\\\",\\\"È\\\",\\\"É\\\",\\\"Ê\\\",\\\"Ë\\\",\\\"Ì\\\",\\\"Í\\\",\\\"Î\\\",\\\"Ï\\\",\\\"Ð\\\",\\\"Ñ\\\",\\\"Ò\\\",\\\"Ó\\\",\\\"Ô\\\",\\\"Õ\\\",\\\"Ö\\\",\\\"Ø\\\",\\\"Ù\\\",\\\"Ú\\\",\\\"Û\\\",\\\"Ü\\\",\\\"Ý\\\",\\\"Þ\\\",\\\"ß\\\",\\\"à\\\",\\\"á\\\",\\\"â\\\",\\\"ã\\\",\\\"ä\\\",\\\"å\\\",\\\"æ\\\",\\\"ç\\\",\\\"è\\\",\\\"é\\\",\\\"ê\\\",\\\"ë\\\",\\\"ì\\\",\\\"í\\\",\\\"î\\\",\\\"ï\\\",\\\"ð\\\",\\\"ñ\\\",\\\"ò\\\",\\\"ó\\\",\\\"ô\\\",\\\"õ\\\",\\\"ö\\\",\\\"ø\\\",\\\"ù\\\",\\\"ú\\\",\\\"û\\\",\\\"ü\\\",\\\"ý\\\",\\\"þ\\\",\\\"ÿ\\\",\\\"Ā\\\",\\\"Ī\\\",\\\"Ū\\\",\\\"Ē\\\",\\\"Ō\\\",\\\"ā\\\",\\\"ī\\\",\\\"ū\\\",\\\"ē\\\",\\\"ō\\\",\\\"Ą\\\",\\\"˘\\\",\\\"Ł\\\",\\\"Ľ\\\",\\\"Ś\\\",\\\"Š\\\",\\\"Ş\\\",\\\"Ť\\\",\\\"Ź\\\",\\\"Ž\\\",\\\"Ż\\\",\\\"ą\\\",\\\"˛\\\",\\\"ł\\\",\\\"ľ\\\",\\\"ś\\\",\\\"ˇ\\\",\\\"š\\\",\\\"ş\\\",\\\"ť\\\",\\\"ź\\\",\\\"˝\\\",\\\"ž\\\",\\\"ż\\\",\\\"Ŕ\\\",\\\"Ă\\\",\\\"Ĺ\\\",\\\"Ć\\\",\\\"Č\\\",\\\"Ę\\\",\\\"Ě\\\",\\\"Ď\\\",\\\"Ń\\\",\\\"Ň\\\",\\\"Ő\\\",\\\"Ř\\\",\\\"Ů\\\",\\\"Ű\\\",\\\"Ţ\\\",\\\"ŕ\\\",\\\"ă\\\",\\\"ĺ\\\",\\\"ć\\\",\\\"č\\\",\\\"ę\\\",\\\"ě\\\",\\\"ď\\\",\\\"đ\\\",\\\"ń\\\",\\\"ň\\\",\\\"ő\\\",\\\"ř\\\",\\\"ů\\\",\\\"ű\\\",\\\"ţ\\\",\\\"˙\\\",\\\"Ĉ\\\",\\\"Ĝ\\\",\\\"Ĥ\\\",\\\"Ĵ\\\",\\\"Ŝ\\\",\\\"Ŭ\\\",\\\"ĉ\\\",\\\"ĝ\\\",\\\"ĥ\\\",\\\"ĵ\\\",\\\"ŝ\\\",\\\"ŭ\\\",\\\"ɱ\\\",\\\"ʋ\\\",\\\"ɾ\\\",\\\"ʃ\\\",\\\"ʒ\\\",\\\"ɬ\\\",\\\"ɮ\\\",\\\"ɹ\\\",\\\"ʈ\\\",\\\"ɖ\\\",\\\"ɳ\\\",\\\"ɽ\\\",\\\"ʂ\\\",\\\"ʐ\\\",\\\"ɻ\\\",\\\"ɭ\\\",\\\"ɟ\\\",\\\"ɲ\\\",\\\"ʝ\\\",\\\"ʎ\\\",\\\"ɡ\\\",\\\"ŋ\\\",\\\"ɰ\\\",\\\"ʁ\\\",\\\"ħ\\\",\\\"ʕ\\\",\\\"ʔ\\\",\\\"ɦ\\\",\\\"ʘ\\\",\\\"ǂ\\\",\\\"ɓ\\\",\\\"ɗ\\\",\\\"ʄ\\\",\\\"ɠ\\\",\\\"Ɠ\\\",\\\"œ\\\",\\\"Œ\\\",\\\"ɨ\\\",\\\"ʉ\\\",\\\"ɘ\\\",\\\"ɵ\\\",\\\"ə\\\",\\\"ɜ\\\",\\\"ɞ\\\",\\\"ɐ\\\",\\\"ɯ\\\",\\\"ʊ\\\",\\\"ɤ\\\",\\\"ʌ\\\",\\\"ɔ\\\",\\\"ɑ\\\",\\\"ɒ\\\",\\\"ʍ\\\",\\\"ɥ\\\",\\\"ʢ\\\",\\\"ʡ\\\",\\\"ɕ\\\",\\\"ʑ\\\",\\\"ɺ\\\",\\\"ɧ\\\",\\\"ɚ\\\",\\\"æ̀\\\",\\\"ǽ\\\",\\\"ὰ\\\",\\\"ά\\\",\\\"ɔ̀\\\",\\\"ɔ́\\\",\\\"ʌ̀\\\",\\\"ʌ́\\\",\\\"ə̀\\\",\\\"ə́\\\",\\\"ɚ̀\\\",\\\"ɚ́\\\",\\\"ὲ\\\",\\\"έ\\\",\\\"͡\\\",\\\"ˈ\\\",\\\"ˌ\\\",\\\"ː\\\",\\\"ˑ\\\",\\\"̆\\\",\\\"‿\\\",\\\"̋\\\",\\\"́\\\",\\\"̄\\\",\\\"̀\\\",\\\"̏\\\",\\\"̌\\\",\\\"̂\\\",\\\"˥\\\",\\\"˦\\\",\\\"˧\\\",\\\"˨\\\",\\\"˩\\\",\\\"˩˥\\\",\\\"˥˩\\\",\\\"̥\\\",\\\"̬\\\",\\\"̹\\\",\\\"̜\\\",\\\"̟\\\",\\\"̠\\\",\\\"̈\\\",\\\"̽\\\",\\\"̩\\\",\\\"̯\\\",\\\"˞\\\",\\\"̤\\\",\\\"̰\\\",\\\"̼\\\",\\\"̴\\\",\\\"̝\\\",\\\"̞\\\",\\\"̘\\\",\\\"̙\\\",\\\"̪\\\",\\\"̺\\\",\\\"̻\\\",\\\"̃\\\",\\\"̚\\\",\\\"❶\\\",\\\"❷\\\",\\\"❸\\\",\\\"❹\\\",\\\"❺\\\",\\\"❻\\\",\\\"❼\\\",\\\"❽\\\",\\\"❾\\\",\\\"❿\\\",\\\"⓫\\\",\\\"⓬\\\",\\\"⓭\\\",\\\"⓮\\\",\\\"⓯\\\",\\\"⓰\\\",\\\"⓱\\\",\\\"⓲\\\",\\\"⓳\\\",\\\"⓴\\\",\\\"ⅰ\\\",\\\"ⅱ\\\",\\\"ⅲ\\\",\\\"ⅳ\\\",\\\"ⅴ\\\",\\\"ⅵ\\\",\\\"ⅶ\\\",\\\"ⅷ\\\",\\\"ⅸ\\\",\\\"ⅹ\\\",\\\"ⅺ\\\",\\\"ⅻ\\\",\\\"ⓐ\\\",\\\"ⓑ\\\",\\\"ⓒ\\\",\\\"ⓓ\\\",\\\"ⓔ\\\",\\\"ⓕ\\\",\\\"ⓖ\\\",\\\"ⓗ\\\",\\\"ⓘ\\\",\\\"ⓙ\\\",\\\"ⓚ\\\",\\\"ⓛ\\\",\\\"ⓜ\\\",\\\"ⓝ\\\",\\\"ⓞ\\\",\\\"ⓟ\\\",\\\"ⓠ\\\",\\\"ⓡ\\\",\\\"ⓢ\\\",\\\"ⓣ\\\",\\\"ⓤ\\\",\\\"ⓥ\\\",\\\"ⓦ\\\",\\\"ⓧ\\\",\\\"ⓨ\\\",\\\"ⓩ\\\",\\\"㋐\\\",\\\"㋑\\\",\\\"㋒\\\",\\\"㋓\\\",\\\"㋔\\\",\\\"㋕\\\",\\\"㋖\\\",\\\"㋗\\\",\\\"㋘\\\",\\\"㋙\\\",\\\"㋚\\\",\\\"㋛\\\",\\\"㋜\\\",\\\"㋝\\\",\\\"㋞\\\",\\\"㋟\\\",\\\"㋠\\\",\\\"㋡\\\",\\\"㋢\\\",\\\"㋣\\\",\\\"㋺\\\",\\\"㋩\\\",\\\"㋥\\\",\\\"㋭\\\",\\\"㋬\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⁑\\\",\\\"⁂\\\",\\\"①\\\",\\\"②\\\",\\\"③\\\",\\\"④\\\",\\\"⑤\\\",\\\"⑥\\\",\\\"⑦\\\",\\\"⑧\\\",\\\"⑨\\\",\\\"⑩\\\",\\\"⑪\\\",\\\"⑫\\\",\\\"⑬\\\",\\\"⑭\\\",\\\"⑮\\\",\\\"⑯\\\",\\\"⑰\\\",\\\"⑱\\\",\\\"⑲\\\",\\\"⑳\\\",\\\"Ⅰ\\\",\\\"Ⅱ\\\",\\\"Ⅲ\\\",\\\"Ⅳ\\\",\\\"Ⅴ\\\",\\\"Ⅵ\\\",\\\"Ⅶ\\\",\\\"Ⅷ\\\",\\\"Ⅸ\\\",\\\"Ⅹ\\\",\\\"Ⅺ\\\",\\\"㍉\\\",\\\"㌔\\\",\\\"㌢\\\",\\\"㍍\\\",\\\"㌘\\\",\\\"㌧\\\",\\\"㌃\\\",\\\"㌶\\\",\\\"㍑\\\",\\\"㍗\\\",\\\"㌍\\\",\\\"㌦\\\",\\\"㌣\\\",\\\"㌫\\\",\\\"㍊\\\",\\\"㌻\\\",\\\"㎜\\\",\\\"㎝\\\",\\\"㎞\\\",\\\"㎎\\\",\\\"㎏\\\",\\\"㏄\\\",\\\"㎡\\\",\\\"Ⅻ\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㍻\\\",\\\"〝\\\",\\\"〟\\\",\\\"№\\\",\\\"㏍\\\",\\\"℡\\\",\\\"㊤\\\",\\\"㊥\\\",\\\"㊦\\\",\\\"㊧\\\",\\\"㊨\\\",\\\"㈱\\\",\\\"㈲\\\",\\\"㈹\\\",\\\"㍾\\\",\\\"㍽\\\",\\\"㍼\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"∮\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"∟\\\",\\\"⊿\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"❖\\\",\\\"☞\\\",\\\"俱\\\",\\\"𠀋\\\",\\\"㐂\\\",\\\"丨\\\",\\\"丯\\\",\\\"丰\\\",\\\"亍\\\",\\\"仡\\\",\\\"份\\\",\\\"仿\\\",\\\"伃\\\",\\\"伋\\\",\\\"你\\\",\\\"佈\\\",\\\"佉\\\",\\\"佖\\\",\\\"佟\\\",\\\"佪\\\",\\\"佬\\\",\\\"佾\\\",\\\"侊\\\",\\\"侔\\\",\\\"侗\\\",\\\"侮\\\",\\\"俉\\\",\\\"俠\\\",\\\"倁\\\",\\\"倂\\\",\\\"倎\\\",\\\"倘\\\",\\\"倧\\\",\\\"倮\\\",\\\"偀\\\",\\\"倻\\\",\\\"偁\\\",\\\"傔\\\",\\\"僌\\\",\\\"僲\\\",\\\"僐\\\",\\\"僦\\\",\\\"僧\\\",\\\"儆\\\",\\\"儃\\\",\\\"儋\\\",\\\"儞\\\",\\\"儵\\\",\\\"兊\\\",\\\"免\\\",\\\"兕\\\",\\\"兗\\\",\\\"㒵\\\",\\\"冝\\\",\\\"凃\\\",\\\"凊\\\",\\\"凞\\\",\\\"凢\\\",\\\"凮\\\",\\\"刁\\\",\\\"㓛\\\",\\\"刓\\\",\\\"刕\\\",\\\"剉\\\",\\\"剗\\\",\\\"剡\\\",\\\"劓\\\",\\\"勈\\\",\\\"勉\\\",\\\"勌\\\",\\\"勐\\\",\\\"勖\\\",\\\"勛\\\",\\\"勤\\\",\\\"勰\\\",\\\"勻\\\",\\\"匀\\\",\\\"匇\\\",\\\"匜\\\",\\\"卑\\\",\\\"卡\\\",\\\"卣\\\",\\\"卽\\\",\\\"厓\\\",\\\"厝\\\",\\\"厲\\\",\\\"吒\\\",\\\"吧\\\",\\\"呍\\\",\\\"咜\\\",\\\"呫\\\",\\\"呴\\\",\\\"呿\\\",\\\"咈\\\",\\\"咖\\\",\\\"咡\\\",\\\"咩\\\",\\\"哆\\\",\\\"哿\\\",\\\"唎\\\",\\\"唫\\\",\\\"唵\\\",\\\"啐\\\",\\\"啞\\\",\\\"喁\\\",\\\"喆\\\",\\\"喎\\\",\\\"喝\\\",\\\"喭\\\",\\\"嗎\\\",\\\"嘆\\\",\\\"嘈\\\",\\\"嘎\\\",\\\"嘻\\\",\\\"噉\\\",\\\"噶\\\",\\\"噦\\\",\\\"器\\\",\\\"噯\\\",\\\"噱\\\",\\\"噲\\\",\\\"嚙\\\",\\\"嚞\\\",\\\"嚩\\\",\\\"嚬\\\",\\\"嚳\\\",\\\"囉\\\",\\\"囊\\\",\\\"圊\\\",\\\"𡈽\\\",\\\"圡\\\",\\\"圯\\\",\\\"圳\\\",\\\"圴\\\",\\\"坰\\\",\\\"坷\\\",\\\"坼\\\",\\\"垜\\\",\\\"﨏\\\",\\\"𡌛\\\",\\\"垸\\\",\\\"埇\\\",\\\"埈\\\",\\\"埏\\\",\\\"埤\\\",\\\"埭\\\",\\\"埵\\\",\\\"埶\\\",\\\"埿\\\",\\\"堉\\\",\\\"塚\\\",\\\"塡\\\",\\\"塤\\\",\\\"塀\\\",\\\"塼\\\",\\\"墉\\\",\\\"增\\\",\\\"墨\\\",\\\"墩\\\",\\\"𡑮\\\",\\\"壒\\\",\\\"壎\\\",\\\"壔\\\",\\\"壚\\\",\\\"壠\\\",\\\"壩\\\",\\\"夌\\\",\\\"虁\\\",\\\"奝\\\",\\\"奭\\\",\\\"妋\\\",\\\"妒\\\",\\\"妤\\\",\\\"姃\\\",\\\"姒\\\",\\\"姝\\\",\\\"娓\\\",\\\"娣\\\",\\\"婧\\\",\\\"婭\\\",\\\"婷\\\",\\\"婾\\\",\\\"媄\\\",\\\"媞\\\",\\\"媧\\\",\\\"嫄\\\",\\\"𡢽\\\",\\\"嬙\\\",\\\"嬥\\\",\\\"剝\\\",\\\"亜\\\",\\\"唖\\\",\\\"娃\\\",\\\"阿\\\",\\\"哀\\\",\\\"愛\\\",\\\"挨\\\",\\\"姶\\\",\\\"逢\\\",\\\"葵\\\",\\\"茜\\\",\\\"穐\\\",\\\"悪\\\",\\\"握\\\",\\\"渥\\\",\\\"旭\\\",\\\"葦\\\",\\\"芦\\\",\\\"鯵\\\",\\\"梓\\\",\\\"圧\\\",\\\"斡\\\",\\\"扱\\\",\\\"宛\\\",\\\"姐\\\",\\\"虻\\\",\\\"飴\\\",\\\"絢\\\",\\\"綾\\\",\\\"鮎\\\",\\\"或\\\",\\\"粟\\\",\\\"袷\\\",\\\"安\\\",\\\"庵\\\",\\\"按\\\",\\\"暗\\\",\\\"案\\\",\\\"闇\\\",\\\"鞍\\\",\\\"杏\\\",\\\"以\\\",\\\"伊\\\",\\\"位\\\",\\\"依\\\",\\\"偉\\\",\\\"囲\\\",\\\"夷\\\",\\\"委\\\",\\\"威\\\",\\\"尉\\\",\\\"惟\\\",\\\"意\\\",\\\"慰\\\",\\\"易\\\",\\\"椅\\\",\\\"為\\\",\\\"畏\\\",\\\"異\\\",\\\"移\\\",\\\"維\\\",\\\"緯\\\",\\\"胃\\\",\\\"萎\\\",\\\"衣\\\",\\\"謂\\\",\\\"違\\\",\\\"遺\\\",\\\"医\\\",\\\"井\\\",\\\"亥\\\",\\\"域\\\",\\\"育\\\",\\\"郁\\\",\\\"磯\\\",\\\"一\\\",\\\"壱\\\",\\\"溢\\\",\\\"逸\\\",\\\"稲\\\",\\\"茨\\\",\\\"芋\\\",\\\"鰯\\\",\\\"允\\\",\\\"印\\\",\\\"咽\\\",\\\"員\\\",\\\"因\\\",\\\"姻\\\",\\\"引\\\",\\\"飲\\\",\\\"淫\\\",\\\"胤\\\",\\\"蔭\\\",\\\"院\\\",\\\"陰\\\",\\\"隠\\\",\\\"韻\\\",\\\"吋\\\",\\\"右\\\",\\\"宇\\\",\\\"烏\\\",\\\"羽\\\",\\\"迂\\\",\\\"雨\\\",\\\"卯\\\",\\\"鵜\\\",\\\"窺\\\",\\\"丑\\\",\\\"碓\\\",\\\"臼\\\",\\\"渦\\\",\\\"嘘\\\",\\\"唄\\\",\\\"欝\\\",\\\"蔚\\\",\\\"鰻\\\",\\\"姥\\\",\\\"厩\\\",\\\"浦\\\",\\\"瓜\\\",\\\"閏\\\",\\\"噂\\\",\\\"云\\\",\\\"運\\\",\\\"雲\\\",\\\"荏\\\",\\\"餌\\\",\\\"叡\\\",\\\"営\\\",\\\"嬰\\\",\\\"影\\\",\\\"映\\\",\\\"曳\\\",\\\"栄\\\",\\\"永\\\",\\\"泳\\\",\\\"洩\\\",\\\"瑛\\\",\\\"盈\\\",\\\"穎\\\",\\\"頴\\\",\\\"英\\\",\\\"衛\\\",\\\"詠\\\",\\\"鋭\\\",\\\"液\\\",\\\"疫\\\",\\\"益\\\",\\\"駅\\\",\\\"悦\\\",\\\"謁\\\",\\\"越\\\",\\\"閲\\\",\\\"榎\\\",\\\"厭\\\",\\\"円\\\",\\\"園\\\",\\\"堰\\\",\\\"奄\\\",\\\"宴\\\",\\\"延\\\",\\\"怨\\\",\\\"掩\\\",\\\"援\\\",\\\"沿\\\",\\\"演\\\",\\\"炎\\\",\\\"焔\\\",\\\"煙\\\",\\\"燕\\\",\\\"猿\\\",\\\"縁\\\",\\\"艶\\\",\\\"苑\\\",\\\"薗\\\",\\\"遠\\\",\\\"鉛\\\",\\\"鴛\\\",\\\"塩\\\",\\\"於\\\",\\\"汚\\\",\\\"甥\\\",\\\"凹\\\",\\\"央\\\",\\\"奥\\\",\\\"往\\\",\\\"応\\\",\\\"押\\\",\\\"旺\\\",\\\"横\\\",\\\"欧\\\",\\\"殴\\\",\\\"王\\\",\\\"翁\\\",\\\"襖\\\",\\\"鴬\\\",\\\"鴎\\\",\\\"黄\\\",\\\"岡\\\",\\\"沖\\\",\\\"荻\\\",\\\"億\\\",\\\"屋\\\",\\\"憶\\\",\\\"臆\\\",\\\"桶\\\",\\\"牡\\\",\\\"乙\\\",\\\"俺\\\",\\\"卸\\\",\\\"恩\\\",\\\"温\\\",\\\"穏\\\",\\\"音\\\",\\\"下\\\",\\\"化\\\",\\\"仮\\\",\\\"何\\\",\\\"伽\\\",\\\"価\\\",\\\"佳\\\",\\\"加\\\",\\\"可\\\",\\\"嘉\\\",\\\"夏\\\",\\\"嫁\\\",\\\"家\\\",\\\"寡\\\",\\\"科\\\",\\\"暇\\\",\\\"果\\\",\\\"架\\\",\\\"歌\\\",\\\"河\\\",\\\"火\\\",\\\"珂\\\",\\\"禍\\\",\\\"禾\\\",\\\"稼\\\",\\\"箇\\\",\\\"花\\\",\\\"苛\\\",\\\"茄\\\",\\\"荷\\\",\\\"華\\\",\\\"菓\\\",\\\"蝦\\\",\\\"課\\\",\\\"嘩\\\",\\\"貨\\\",\\\"迦\\\",\\\"過\\\",\\\"霞\\\",\\\"蚊\\\",\\\"俄\\\",\\\"峨\\\",\\\"我\\\",\\\"牙\\\",\\\"画\\\",\\\"臥\\\",\\\"芽\\\",\\\"蛾\\\",\\\"賀\\\",\\\"雅\\\",\\\"餓\\\",\\\"駕\\\",\\\"介\\\",\\\"会\\\",\\\"解\\\",\\\"回\\\",\\\"塊\\\",\\\"壊\\\",\\\"廻\\\",\\\"快\\\",\\\"怪\\\",\\\"悔\\\",\\\"恢\\\",\\\"懐\\\",\\\"戒\\\",\\\"拐\\\",\\\"改\\\",\\\"魁\\\",\\\"晦\\\",\\\"械\\\",\\\"海\\\",\\\"灰\\\",\\\"界\\\",\\\"皆\\\",\\\"絵\\\",\\\"芥\\\",\\\"蟹\\\",\\\"開\\\",\\\"階\\\",\\\"貝\\\",\\\"凱\\\",\\\"劾\\\",\\\"外\\\",\\\"咳\\\",\\\"害\\\",\\\"崖\\\",\\\"慨\\\",\\\"概\\\",\\\"涯\\\",\\\"碍\\\",\\\"蓋\\\",\\\"街\\\",\\\"該\\\",\\\"鎧\\\",\\\"骸\\\",\\\"浬\\\",\\\"馨\\\",\\\"蛙\\\",\\\"垣\\\",\\\"柿\\\",\\\"蛎\\\",\\\"鈎\\\",\\\"劃\\\",\\\"嚇\\\",\\\"各\\\",\\\"廓\\\",\\\"拡\\\",\\\"撹\\\",\\\"格\\\",\\\"核\\\",\\\"殻\\\",\\\"獲\\\",\\\"確\\\",\\\"穫\\\",\\\"覚\\\",\\\"角\\\",\\\"赫\\\",\\\"較\\\",\\\"郭\\\",\\\"閣\\\",\\\"隔\\\",\\\"革\\\",\\\"学\\\",\\\"岳\\\",\\\"楽\\\",\\\"額\\\",\\\"顎\\\",\\\"掛\\\",\\\"笠\\\",\\\"樫\\\",\\\"橿\\\",\\\"梶\\\",\\\"鰍\\\",\\\"潟\\\",\\\"割\\\",\\\"喝\\\",\\\"恰\\\",\\\"括\\\",\\\"活\\\",\\\"渇\\\",\\\"滑\\\",\\\"葛\\\",\\\"褐\\\",\\\"轄\\\",\\\"且\\\",\\\"鰹\\\",\\\"叶\\\",\\\"椛\\\",\\\"樺\\\",\\\"鞄\\\",\\\"株\\\",\\\"兜\\\",\\\"竃\\\",\\\"蒲\\\",\\\"釜\\\",\\\"鎌\\\",\\\"噛\\\",\\\"鴨\\\",\\\"栢\\\",\\\"茅\\\",\\\"萱\\\",\\\"粥\\\",\\\"刈\\\",\\\"苅\\\",\\\"瓦\\\",\\\"乾\\\",\\\"侃\\\",\\\"冠\\\",\\\"寒\\\",\\\"刊\\\",\\\"勘\\\",\\\"勧\\\",\\\"巻\\\",\\\"喚\\\",\\\"堪\\\",\\\"姦\\\",\\\"完\\\",\\\"官\\\",\\\"寛\\\",\\\"干\\\",\\\"幹\\\",\\\"患\\\",\\\"感\\\",\\\"慣\\\",\\\"憾\\\",\\\"換\\\",\\\"敢\\\",\\\"柑\\\",\\\"桓\\\",\\\"棺\\\",\\\"款\\\",\\\"歓\\\",\\\"汗\\\",\\\"漢\\\",\\\"澗\\\",\\\"潅\\\",\\\"環\\\",\\\"甘\\\",\\\"監\\\",\\\"看\\\",\\\"竿\\\",\\\"管\\\",\\\"簡\\\",\\\"緩\\\",\\\"缶\\\",\\\"翰\\\",\\\"肝\\\",\\\"艦\\\",\\\"莞\\\",\\\"観\\\",\\\"諌\\\",\\\"貫\\\",\\\"還\\\",\\\"鑑\\\",\\\"間\\\",\\\"閑\\\",\\\"関\\\",\\\"陥\\\",\\\"韓\\\",\\\"館\\\",\\\"舘\\\",\\\"丸\\\",\\\"含\\\",\\\"岸\\\",\\\"巌\\\",\\\"玩\\\",\\\"癌\\\",\\\"眼\\\",\\\"岩\\\",\\\"翫\\\",\\\"贋\\\",\\\"雁\\\",\\\"頑\\\",\\\"顔\\\",\\\"願\\\",\\\"企\\\",\\\"伎\\\",\\\"危\\\",\\\"喜\\\",\\\"器\\\",\\\"基\\\",\\\"奇\\\",\\\"嬉\\\",\\\"寄\\\",\\\"岐\\\",\\\"希\\\",\\\"幾\\\",\\\"忌\\\",\\\"揮\\\",\\\"机\\\",\\\"旗\\\",\\\"既\\\",\\\"期\\\",\\\"棋\\\",\\\"棄\\\",\\\"機\\\",\\\"帰\\\",\\\"毅\\\",\\\"気\\\",\\\"汽\\\",\\\"畿\\\",\\\"祈\\\",\\\"季\\\",\\\"稀\\\",\\\"紀\\\",\\\"徽\\\",\\\"規\\\",\\\"記\\\",\\\"貴\\\",\\\"起\\\",\\\"軌\\\",\\\"輝\\\",\\\"飢\\\",\\\"騎\\\",\\\"鬼\\\",\\\"亀\\\",\\\"偽\\\",\\\"儀\\\",\\\"妓\\\",\\\"宜\\\",\\\"戯\\\",\\\"技\\\",\\\"擬\\\",\\\"欺\\\",\\\"犠\\\",\\\"疑\\\",\\\"祇\\\",\\\"義\\\",\\\"蟻\\\",\\\"誼\\\",\\\"議\\\",\\\"掬\\\",\\\"菊\\\",\\\"鞠\\\",\\\"吉\\\",\\\"吃\\\",\\\"喫\\\",\\\"桔\\\",\\\"橘\\\",\\\"詰\\\",\\\"砧\\\",\\\"杵\\\",\\\"黍\\\",\\\"却\\\",\\\"客\\\",\\\"脚\\\",\\\"虐\\\",\\\"逆\\\",\\\"丘\\\",\\\"久\\\",\\\"仇\\\",\\\"休\\\",\\\"及\\\",\\\"吸\\\",\\\"宮\\\",\\\"弓\\\",\\\"急\\\",\\\"救\\\",\\\"朽\\\",\\\"求\\\",\\\"汲\\\",\\\"泣\\\",\\\"灸\\\",\\\"球\\\",\\\"究\\\",\\\"窮\\\",\\\"笈\\\",\\\"級\\\",\\\"糾\\\",\\\"給\\\",\\\"旧\\\",\\\"牛\\\",\\\"去\\\",\\\"居\\\",\\\"巨\\\",\\\"拒\\\",\\\"拠\\\",\\\"挙\\\",\\\"渠\\\",\\\"虚\\\",\\\"許\\\",\\\"距\\\",\\\"鋸\\\",\\\"漁\\\",\\\"禦\\\",\\\"魚\\\",\\\"亨\\\",\\\"享\\\",\\\"京\\\",\\\"供\\\",\\\"侠\\\",\\\"僑\\\",\\\"兇\\\",\\\"競\\\",\\\"共\\\",\\\"凶\\\",\\\"協\\\",\\\"匡\\\",\\\"卿\\\",\\\"叫\\\",\\\"喬\\\",\\\"境\\\",\\\"峡\\\",\\\"強\\\",\\\"彊\\\",\\\"怯\\\",\\\"恐\\\",\\\"恭\\\",\\\"挟\\\",\\\"教\\\",\\\"橋\\\",\\\"況\\\",\\\"狂\\\",\\\"狭\\\",\\\"矯\\\",\\\"胸\\\",\\\"脅\\\",\\\"興\\\",\\\"蕎\\\",\\\"郷\\\",\\\"鏡\\\",\\\"響\\\",\\\"饗\\\",\\\"驚\\\",\\\"仰\\\",\\\"凝\\\",\\\"尭\\\",\\\"暁\\\",\\\"業\\\",\\\"局\\\",\\\"曲\\\",\\\"極\\\",\\\"玉\\\",\\\"桐\\\",\\\"粁\\\",\\\"僅\\\",\\\"勤\\\",\\\"均\\\",\\\"巾\\\",\\\"錦\\\",\\\"斤\\\",\\\"欣\\\",\\\"欽\\\",\\\"琴\\\",\\\"禁\\\",\\\"禽\\\",\\\"筋\\\",\\\"緊\\\",\\\"芹\\\",\\\"菌\\\",\\\"衿\\\",\\\"襟\\\",\\\"謹\\\",\\\"近\\\",\\\"金\\\",\\\"吟\\\",\\\"銀\\\",\\\"九\\\",\\\"倶\\\",\\\"句\\\",\\\"区\\\",\\\"狗\\\",\\\"玖\\\",\\\"矩\\\",\\\"苦\\\",\\\"躯\\\",\\\"駆\\\",\\\"駈\\\",\\\"駒\\\",\\\"具\\\",\\\"愚\\\",\\\"虞\\\",\\\"喰\\\",\\\"空\\\",\\\"偶\\\",\\\"寓\\\",\\\"遇\\\",\\\"隅\\\",\\\"串\\\",\\\"櫛\\\",\\\"釧\\\",\\\"屑\\\",\\\"屈\\\",\\\"掘\\\",\\\"窟\\\",\\\"沓\\\",\\\"靴\\\",\\\"轡\\\",\\\"窪\\\",\\\"熊\\\",\\\"隈\\\",\\\"粂\\\",\\\"栗\\\",\\\"繰\\\",\\\"桑\\\",\\\"鍬\\\",\\\"勲\\\",\\\"君\\\",\\\"薫\\\",\\\"訓\\\",\\\"群\\\",\\\"軍\\\",\\\"郡\\\",\\\"卦\\\",\\\"袈\\\",\\\"祁\\\",\\\"係\\\",\\\"傾\\\",\\\"刑\\\",\\\"兄\\\",\\\"啓\\\",\\\"圭\\\",\\\"珪\\\",\\\"型\\\",\\\"契\\\",\\\"形\\\",\\\"径\\\",\\\"恵\\\",\\\"慶\\\",\\\"慧\\\",\\\"憩\\\",\\\"掲\\\",\\\"携\\\",\\\"敬\\\",\\\"景\\\",\\\"桂\\\",\\\"渓\\\",\\\"畦\\\",\\\"稽\\\",\\\"系\\\",\\\"経\\\",\\\"継\\\",\\\"繋\\\",\\\"罫\\\",\\\"茎\\\",\\\"荊\\\",\\\"蛍\\\",\\\"計\\\",\\\"詣\\\",\\\"警\\\",\\\"軽\\\",\\\"頚\\\",\\\"鶏\\\",\\\"芸\\\",\\\"迎\\\",\\\"鯨\\\",\\\"劇\\\",\\\"戟\\\",\\\"撃\\\",\\\"激\\\",\\\"隙\\\",\\\"桁\\\",\\\"傑\\\",\\\"欠\\\",\\\"決\\\",\\\"潔\\\",\\\"穴\\\",\\\"結\\\",\\\"血\\\",\\\"訣\\\",\\\"月\\\",\\\"件\\\",\\\"倹\\\",\\\"倦\\\",\\\"健\\\",\\\"兼\\\",\\\"券\\\",\\\"剣\\\",\\\"喧\\\",\\\"圏\\\",\\\"堅\\\",\\\"嫌\\\",\\\"建\\\",\\\"憲\\\",\\\"懸\\\",\\\"拳\\\",\\\"捲\\\",\\\"検\\\",\\\"権\\\",\\\"牽\\\",\\\"犬\\\",\\\"献\\\",\\\"研\\\",\\\"硯\\\",\\\"絹\\\",\\\"県\\\",\\\"肩\\\",\\\"見\\\",\\\"謙\\\",\\\"賢\\\",\\\"軒\\\",\\\"遣\\\",\\\"鍵\\\",\\\"険\\\",\\\"顕\\\",\\\"験\\\",\\\"鹸\\\",\\\"元\\\",\\\"原\\\",\\\"厳\\\",\\\"幻\\\",\\\"弦\\\",\\\"減\\\",\\\"源\\\",\\\"玄\\\",\\\"現\\\",\\\"絃\\\",\\\"舷\\\",\\\"言\\\",\\\"諺\\\",\\\"限\\\",\\\"乎\\\",\\\"個\\\",\\\"古\\\",\\\"呼\\\",\\\"固\\\",\\\"姑\\\",\\\"孤\\\",\\\"己\\\",\\\"庫\\\",\\\"弧\\\",\\\"戸\\\",\\\"故\\\",\\\"枯\\\",\\\"湖\\\",\\\"狐\\\",\\\"糊\\\",\\\"袴\\\",\\\"股\\\",\\\"胡\\\",\\\"菰\\\",\\\"虎\\\",\\\"誇\\\",\\\"跨\\\",\\\"鈷\\\",\\\"雇\\\",\\\"顧\\\",\\\"鼓\\\",\\\"五\\\",\\\"互\\\",\\\"伍\\\",\\\"午\\\",\\\"呉\\\",\\\"吾\\\",\\\"娯\\\",\\\"後\\\",\\\"御\\\",\\\"悟\\\",\\\"梧\\\",\\\"檎\\\",\\\"瑚\\\",\\\"碁\\\",\\\"語\\\",\\\"誤\\\",\\\"護\\\",\\\"醐\\\",\\\"乞\\\",\\\"鯉\\\",\\\"交\\\",\\\"佼\\\",\\\"侯\\\",\\\"候\\\",\\\"倖\\\",\\\"光\\\",\\\"公\\\",\\\"功\\\",\\\"効\\\",\\\"勾\\\",\\\"厚\\\",\\\"口\\\",\\\"向\\\",\\\"后\\\",\\\"喉\\\",\\\"坑\\\",\\\"垢\\\",\\\"好\\\",\\\"孔\\\",\\\"孝\\\",\\\"宏\\\",\\\"工\\\",\\\"巧\\\",\\\"巷\\\",\\\"幸\\\",\\\"広\\\",\\\"庚\\\",\\\"康\\\",\\\"弘\\\",\\\"恒\\\",\\\"慌\\\",\\\"抗\\\",\\\"拘\\\",\\\"控\\\",\\\"攻\\\",\\\"昂\\\",\\\"晃\\\",\\\"更\\\",\\\"杭\\\",\\\"校\\\",\\\"梗\\\",\\\"構\\\",\\\"江\\\",\\\"洪\\\",\\\"浩\\\",\\\"港\\\",\\\"溝\\\",\\\"甲\\\",\\\"皇\\\",\\\"硬\\\",\\\"稿\\\",\\\"糠\\\",\\\"紅\\\",\\\"紘\\\",\\\"絞\\\",\\\"綱\\\",\\\"耕\\\",\\\"考\\\",\\\"肯\\\",\\\"肱\\\",\\\"腔\\\",\\\"膏\\\",\\\"航\\\",\\\"荒\\\",\\\"行\\\",\\\"衡\\\",\\\"講\\\",\\\"貢\\\",\\\"購\\\",\\\"郊\\\",\\\"酵\\\",\\\"鉱\\\",\\\"砿\\\",\\\"鋼\\\",\\\"閤\\\",\\\"降\\\",\\\"項\\\",\\\"香\\\",\\\"高\\\",\\\"鴻\\\",\\\"剛\\\",\\\"劫\\\",\\\"号\\\",\\\"合\\\",\\\"壕\\\",\\\"拷\\\",\\\"濠\\\",\\\"豪\\\",\\\"轟\\\",\\\"麹\\\",\\\"克\\\",\\\"刻\\\",\\\"告\\\",\\\"国\\\",\\\"穀\\\",\\\"酷\\\",\\\"鵠\\\",\\\"黒\\\",\\\"獄\\\",\\\"漉\\\",\\\"腰\\\",\\\"甑\\\",\\\"忽\\\",\\\"惚\\\",\\\"骨\\\",\\\"狛\\\",\\\"込\\\",\\\"此\\\",\\\"頃\\\",\\\"今\\\",\\\"困\\\",\\\"坤\\\",\\\"墾\\\",\\\"婚\\\",\\\"恨\\\",\\\"懇\\\",\\\"昏\\\",\\\"昆\\\",\\\"根\\\",\\\"梱\\\",\\\"混\\\",\\\"痕\\\",\\\"紺\\\",\\\"艮\\\",\\\"魂\\\",\\\"些\\\",\\\"佐\\\",\\\"叉\\\",\\\"唆\\\",\\\"嵯\\\",\\\"左\\\",\\\"差\\\",\\\"査\\\",\\\"沙\\\",\\\"瑳\\\",\\\"砂\\\",\\\"詐\\\",\\\"鎖\\\",\\\"裟\\\",\\\"坐\\\",\\\"座\\\",\\\"挫\\\",\\\"債\\\",\\\"催\\\",\\\"再\\\",\\\"最\\\",\\\"哉\\\",\\\"塞\\\",\\\"妻\\\",\\\"宰\\\",\\\"彩\\\",\\\"才\\\",\\\"採\\\",\\\"栽\\\",\\\"歳\\\",\\\"済\\\",\\\"災\\\",\\\"采\\\",\\\"犀\\\",\\\"砕\\\",\\\"砦\\\",\\\"祭\\\",\\\"斎\\\",\\\"細\\\",\\\"菜\\\",\\\"裁\\\",\\\"載\\\",\\\"際\\\",\\\"剤\\\",\\\"在\\\",\\\"材\\\",\\\"罪\\\",\\\"財\\\",\\\"冴\\\",\\\"坂\\\",\\\"阪\\\",\\\"堺\\\",\\\"榊\\\",\\\"肴\\\",\\\"咲\\\",\\\"崎\\\",\\\"埼\\\",\\\"碕\\\",\\\"鷺\\\",\\\"作\\\",\\\"削\\\",\\\"咋\\\",\\\"搾\\\",\\\"昨\\\",\\\"朔\\\",\\\"柵\\\",\\\"窄\\\",\\\"策\\\",\\\"索\\\",\\\"錯\\\",\\\"桜\\\",\\\"鮭\\\",\\\"笹\\\",\\\"匙\\\",\\\"冊\\\",\\\"刷\\\",\\\"察\\\",\\\"拶\\\",\\\"撮\\\",\\\"擦\\\",\\\"札\\\",\\\"殺\\\",\\\"薩\\\",\\\"雑\\\",\\\"皐\\\",\\\"鯖\\\",\\\"捌\\\",\\\"錆\\\",\\\"鮫\\\",\\\"皿\\\",\\\"晒\\\",\\\"三\\\",\\\"傘\\\",\\\"参\\\",\\\"山\\\",\\\"惨\\\",\\\"撒\\\",\\\"散\\\",\\\"桟\\\",\\\"燦\\\",\\\"珊\\\",\\\"産\\\",\\\"算\\\",\\\"纂\\\",\\\"蚕\\\",\\\"讃\\\",\\\"賛\\\",\\\"酸\\\",\\\"餐\\\",\\\"斬\\\",\\\"暫\\\",\\\"残\\\",\\\"仕\\\",\\\"仔\\\",\\\"伺\\\",\\\"使\\\",\\\"刺\\\",\\\"司\\\",\\\"史\\\",\\\"嗣\\\",\\\"四\\\",\\\"士\\\",\\\"始\\\",\\\"姉\\\",\\\"姿\\\",\\\"子\\\",\\\"屍\\\",\\\"市\\\",\\\"師\\\",\\\"志\\\",\\\"思\\\",\\\"指\\\",\\\"支\\\",\\\"孜\\\",\\\"斯\\\",\\\"施\\\",\\\"旨\\\",\\\"枝\\\",\\\"止\\\",\\\"死\\\",\\\"氏\\\",\\\"獅\\\",\\\"祉\\\",\\\"私\\\",\\\"糸\\\",\\\"紙\\\",\\\"紫\\\",\\\"肢\\\",\\\"脂\\\",\\\"至\\\",\\\"視\\\",\\\"詞\\\",\\\"詩\\\",\\\"試\\\",\\\"誌\\\",\\\"諮\\\",\\\"資\\\",\\\"賜\\\",\\\"雌\\\",\\\"飼\\\",\\\"歯\\\",\\\"事\\\",\\\"似\\\",\\\"侍\\\",\\\"児\\\",\\\"字\\\",\\\"寺\\\",\\\"慈\\\",\\\"持\\\",\\\"時\\\",\\\"次\\\",\\\"滋\\\",\\\"治\\\",\\\"爾\\\",\\\"璽\\\",\\\"痔\\\",\\\"磁\\\",\\\"示\\\",\\\"而\\\",\\\"耳\\\",\\\"自\\\",\\\"蒔\\\",\\\"辞\\\",\\\"汐\\\",\\\"鹿\\\",\\\"式\\\",\\\"識\\\",\\\"鴫\\\",\\\"竺\\\",\\\"軸\\\",\\\"宍\\\",\\\"雫\\\",\\\"七\\\",\\\"叱\\\",\\\"執\\\",\\\"失\\\",\\\"嫉\\\",\\\"室\\\",\\\"悉\\\",\\\"湿\\\",\\\"漆\\\",\\\"疾\\\",\\\"質\\\",\\\"実\\\",\\\"蔀\\\",\\\"篠\\\",\\\"偲\\\",\\\"柴\\\",\\\"芝\\\",\\\"屡\\\",\\\"蕊\\\",\\\"縞\\\",\\\"舎\\\",\\\"写\\\",\\\"射\\\",\\\"捨\\\",\\\"赦\\\",\\\"斜\\\",\\\"煮\\\",\\\"社\\\",\\\"紗\\\",\\\"者\\\",\\\"謝\\\",\\\"車\\\",\\\"遮\\\",\\\"蛇\\\",\\\"邪\\\",\\\"借\\\",\\\"勺\\\",\\\"尺\\\",\\\"杓\\\",\\\"灼\\\",\\\"爵\\\",\\\"酌\\\",\\\"釈\\\",\\\"錫\\\",\\\"若\\\",\\\"寂\\\",\\\"弱\\\",\\\"惹\\\",\\\"主\\\",\\\"取\\\",\\\"守\\\",\\\"手\\\",\\\"朱\\\",\\\"殊\\\",\\\"狩\\\",\\\"珠\\\",\\\"種\\\",\\\"腫\\\",\\\"趣\\\",\\\"酒\\\",\\\"首\\\",\\\"儒\\\",\\\"受\\\",\\\"呪\\\",\\\"寿\\\",\\\"授\\\",\\\"樹\\\",\\\"綬\\\",\\\"需\\\",\\\"囚\\\",\\\"収\\\",\\\"周\\\",\\\"宗\\\",\\\"就\\\",\\\"州\\\",\\\"修\\\",\\\"愁\\\",\\\"拾\\\",\\\"洲\\\",\\\"秀\\\",\\\"秋\\\",\\\"終\\\",\\\"繍\\\",\\\"習\\\",\\\"臭\\\",\\\"舟\\\",\\\"蒐\\\",\\\"衆\\\",\\\"襲\\\",\\\"讐\\\",\\\"蹴\\\",\\\"輯\\\",\\\"週\\\",\\\"酋\\\",\\\"酬\\\",\\\"集\\\",\\\"醜\\\",\\\"什\\\",\\\"住\\\",\\\"充\\\",\\\"十\\\",\\\"従\\\",\\\"戎\\\",\\\"柔\\\",\\\"汁\\\",\\\"渋\\\",\\\"獣\\\",\\\"縦\\\",\\\"重\\\",\\\"銃\\\",\\\"叔\\\",\\\"夙\\\",\\\"宿\\\",\\\"淑\\\",\\\"祝\\\",\\\"縮\\\",\\\"粛\\\",\\\"塾\\\",\\\"熟\\\",\\\"出\\\",\\\"術\\\",\\\"述\\\",\\\"俊\\\",\\\"峻\\\",\\\"春\\\",\\\"瞬\\\",\\\"竣\\\",\\\"舜\\\",\\\"駿\\\",\\\"准\\\",\\\"循\\\",\\\"旬\\\",\\\"楯\\\",\\\"殉\\\",\\\"淳\\\",\\\"準\\\",\\\"潤\\\",\\\"盾\\\",\\\"純\\\",\\\"巡\\\",\\\"遵\\\",\\\"醇\\\",\\\"順\\\",\\\"処\\\",\\\"初\\\",\\\"所\\\",\\\"暑\\\",\\\"曙\\\",\\\"渚\\\",\\\"庶\\\",\\\"緒\\\",\\\"署\\\",\\\"書\\\",\\\"薯\\\",\\\"藷\\\",\\\"諸\\\",\\\"助\\\",\\\"叙\\\",\\\"女\\\",\\\"序\\\",\\\"徐\\\",\\\"恕\\\",\\\"鋤\\\",\\\"除\\\",\\\"傷\\\",\\\"償\\\",\\\"勝\\\",\\\"匠\\\",\\\"升\\\",\\\"召\\\",\\\"哨\\\",\\\"商\\\",\\\"唱\\\",\\\"嘗\\\",\\\"奨\\\",\\\"妾\\\",\\\"娼\\\",\\\"宵\\\",\\\"将\\\",\\\"小\\\",\\\"少\\\",\\\"尚\\\",\\\"庄\\\",\\\"床\\\",\\\"廠\\\",\\\"彰\\\",\\\"承\\\",\\\"抄\\\",\\\"招\\\",\\\"掌\\\",\\\"捷\\\",\\\"昇\\\",\\\"昌\\\",\\\"昭\\\",\\\"晶\\\",\\\"松\\\",\\\"梢\\\",\\\"樟\\\",\\\"樵\\\",\\\"沼\\\",\\\"消\\\",\\\"渉\\\",\\\"湘\\\",\\\"焼\\\",\\\"焦\\\",\\\"照\\\",\\\"症\\\",\\\"省\\\",\\\"硝\\\",\\\"礁\\\",\\\"祥\\\",\\\"称\\\",\\\"章\\\",\\\"笑\\\",\\\"粧\\\",\\\"紹\\\",\\\"肖\\\",\\\"菖\\\",\\\"蒋\\\",\\\"蕉\\\",\\\"衝\\\",\\\"裳\\\",\\\"訟\\\",\\\"証\\\",\\\"詔\\\",\\\"詳\\\",\\\"象\\\",\\\"賞\\\",\\\"醤\\\",\\\"鉦\\\",\\\"鍾\\\",\\\"鐘\\\",\\\"障\\\",\\\"鞘\\\",\\\"上\\\",\\\"丈\\\",\\\"丞\\\",\\\"乗\\\",\\\"冗\\\",\\\"剰\\\",\\\"城\\\",\\\"場\\\",\\\"壌\\\",\\\"嬢\\\",\\\"常\\\",\\\"情\\\",\\\"擾\\\",\\\"条\\\",\\\"杖\\\",\\\"浄\\\",\\\"状\\\",\\\"畳\\\",\\\"穣\\\",\\\"蒸\\\",\\\"譲\\\",\\\"醸\\\",\\\"錠\\\",\\\"嘱\\\",\\\"埴\\\",\\\"飾\\\",\\\"拭\\\",\\\"植\\\",\\\"殖\\\",\\\"燭\\\",\\\"織\\\",\\\"職\\\",\\\"色\\\",\\\"触\\\",\\\"食\\\",\\\"蝕\\\",\\\"辱\\\",\\\"尻\\\",\\\"伸\\\",\\\"信\\\",\\\"侵\\\",\\\"唇\\\",\\\"娠\\\",\\\"寝\\\",\\\"審\\\",\\\"心\\\",\\\"慎\\\",\\\"振\\\",\\\"新\\\",\\\"晋\\\",\\\"森\\\",\\\"榛\\\",\\\"浸\\\",\\\"深\\\",\\\"申\\\",\\\"疹\\\",\\\"真\\\",\\\"神\\\",\\\"秦\\\",\\\"紳\\\",\\\"臣\\\",\\\"芯\\\",\\\"薪\\\",\\\"親\\\",\\\"診\\\",\\\"身\\\",\\\"辛\\\",\\\"進\\\",\\\"針\\\",\\\"震\\\",\\\"人\\\",\\\"仁\\\",\\\"刃\\\",\\\"塵\\\",\\\"壬\\\",\\\"尋\\\",\\\"甚\\\",\\\"尽\\\",\\\"腎\\\",\\\"訊\\\",\\\"迅\\\",\\\"陣\\\",\\\"靭\\\",\\\"笥\\\",\\\"諏\\\",\\\"須\\\",\\\"酢\\\",\\\"図\\\",\\\"厨\\\",\\\"逗\\\",\\\"吹\\\",\\\"垂\\\",\\\"帥\\\",\\\"推\\\",\\\"水\\\",\\\"炊\\\",\\\"睡\\\",\\\"粋\\\",\\\"翠\\\",\\\"衰\\\",\\\"遂\\\",\\\"酔\\\",\\\"錐\\\",\\\"錘\\\",\\\"随\\\",\\\"瑞\\\",\\\"髄\\\",\\\"崇\\\",\\\"嵩\\\",\\\"数\\\",\\\"枢\\\",\\\"趨\\\",\\\"雛\\\",\\\"据\\\",\\\"杉\\\",\\\"椙\\\",\\\"菅\\\",\\\"頗\\\",\\\"雀\\\",\\\"裾\\\",\\\"澄\\\",\\\"摺\\\",\\\"寸\\\",\\\"世\\\",\\\"瀬\\\",\\\"畝\\\",\\\"是\\\",\\\"凄\\\",\\\"制\\\",\\\"勢\\\",\\\"姓\\\",\\\"征\\\",\\\"性\\\",\\\"成\\\",\\\"政\\\",\\\"整\\\",\\\"星\\\",\\\"晴\\\",\\\"棲\\\",\\\"栖\\\",\\\"正\\\",\\\"清\\\",\\\"牲\\\",\\\"生\\\",\\\"盛\\\",\\\"精\\\",\\\"聖\\\",\\\"声\\\",\\\"製\\\",\\\"西\\\",\\\"誠\\\",\\\"誓\\\",\\\"請\\\",\\\"逝\\\",\\\"醒\\\",\\\"青\\\",\\\"静\\\",\\\"斉\\\",\\\"税\\\",\\\"脆\\\",\\\"隻\\\",\\\"席\\\",\\\"惜\\\",\\\"戚\\\",\\\"斥\\\",\\\"昔\\\",\\\"析\\\",\\\"石\\\",\\\"積\\\",\\\"籍\\\",\\\"績\\\",\\\"脊\\\",\\\"責\\\",\\\"赤\\\",\\\"跡\\\",\\\"蹟\\\",\\\"碩\\\",\\\"切\\\",\\\"拙\\\",\\\"接\\\",\\\"摂\\\",\\\"折\\\",\\\"設\\\",\\\"窃\\\",\\\"節\\\",\\\"説\\\",\\\"雪\\\",\\\"絶\\\",\\\"舌\\\",\\\"蝉\\\",\\\"仙\\\",\\\"先\\\",\\\"千\\\",\\\"占\\\",\\\"宣\\\",\\\"専\\\",\\\"尖\\\",\\\"川\\\",\\\"戦\\\",\\\"扇\\\",\\\"撰\\\",\\\"栓\\\",\\\"栴\\\",\\\"泉\\\",\\\"浅\\\",\\\"洗\\\",\\\"染\\\",\\\"潜\\\",\\\"煎\\\",\\\"煽\\\",\\\"旋\\\",\\\"穿\\\",\\\"箭\\\",\\\"線\\\",\\\"繊\\\",\\\"羨\\\",\\\"腺\\\",\\\"舛\\\",\\\"船\\\",\\\"薦\\\",\\\"詮\\\",\\\"賎\\\",\\\"践\\\",\\\"選\\\",\\\"遷\\\",\\\"銭\\\",\\\"銑\\\",\\\"閃\\\",\\\"鮮\\\",\\\"前\\\",\\\"善\\\",\\\"漸\\\",\\\"然\\\",\\\"全\\\",\\\"禅\\\",\\\"繕\\\",\\\"膳\\\",\\\"糎\\\",\\\"噌\\\",\\\"塑\\\",\\\"岨\\\",\\\"措\\\",\\\"曾\\\",\\\"曽\\\",\\\"楚\\\",\\\"狙\\\",\\\"疏\\\",\\\"疎\\\",\\\"礎\\\",\\\"祖\\\",\\\"租\\\",\\\"粗\\\",\\\"素\\\",\\\"組\\\",\\\"蘇\\\",\\\"訴\\\",\\\"阻\\\",\\\"遡\\\",\\\"鼠\\\",\\\"僧\\\",\\\"創\\\",\\\"双\\\",\\\"叢\\\",\\\"倉\\\",\\\"喪\\\",\\\"壮\\\",\\\"奏\\\",\\\"爽\\\",\\\"宋\\\",\\\"層\\\",\\\"匝\\\",\\\"惣\\\",\\\"想\\\",\\\"捜\\\",\\\"掃\\\",\\\"挿\\\",\\\"掻\\\",\\\"操\\\",\\\"早\\\",\\\"曹\\\",\\\"巣\\\",\\\"槍\\\",\\\"槽\\\",\\\"漕\\\",\\\"燥\\\",\\\"争\\\",\\\"痩\\\",\\\"相\\\",\\\"窓\\\",\\\"糟\\\",\\\"総\\\",\\\"綜\\\",\\\"聡\\\",\\\"草\\\",\\\"荘\\\",\\\"葬\\\",\\\"蒼\\\",\\\"藻\\\",\\\"装\\\",\\\"走\\\",\\\"送\\\",\\\"遭\\\",\\\"鎗\\\",\\\"霜\\\",\\\"騒\\\",\\\"像\\\",\\\"増\\\",\\\"憎\\\",\\\"臓\\\",\\\"蔵\\\",\\\"贈\\\",\\\"造\\\",\\\"促\\\",\\\"側\\\",\\\"則\\\",\\\"即\\\",\\\"息\\\",\\\"捉\\\",\\\"束\\\",\\\"測\\\",\\\"足\\\",\\\"速\\\",\\\"俗\\\",\\\"属\\\",\\\"賊\\\",\\\"族\\\",\\\"続\\\",\\\"卒\\\",\\\"袖\\\",\\\"其\\\",\\\"揃\\\",\\\"存\\\",\\\"孫\\\",\\\"尊\\\",\\\"損\\\",\\\"村\\\",\\\"遜\\\",\\\"他\\\",\\\"多\\\",\\\"太\\\",\\\"汰\\\",\\\"詑\\\",\\\"唾\\\",\\\"堕\\\",\\\"妥\\\",\\\"惰\\\",\\\"打\\\",\\\"柁\\\",\\\"舵\\\",\\\"楕\\\",\\\"陀\\\",\\\"駄\\\",\\\"騨\\\",\\\"体\\\",\\\"堆\\\",\\\"対\\\",\\\"耐\\\",\\\"岱\\\",\\\"帯\\\",\\\"待\\\",\\\"怠\\\",\\\"態\\\",\\\"戴\\\",\\\"替\\\",\\\"泰\\\",\\\"滞\\\",\\\"胎\\\",\\\"腿\\\",\\\"苔\\\",\\\"袋\\\",\\\"貸\\\",\\\"退\\\",\\\"逮\\\",\\\"隊\\\",\\\"黛\\\",\\\"鯛\\\",\\\"代\\\",\\\"台\\\",\\\"大\\\",\\\"第\\\",\\\"醍\\\",\\\"題\\\",\\\"鷹\\\",\\\"滝\\\",\\\"瀧\\\",\\\"卓\\\",\\\"啄\\\",\\\"宅\\\",\\\"托\\\",\\\"択\\\",\\\"拓\\\",\\\"沢\\\",\\\"濯\\\",\\\"琢\\\",\\\"託\\\",\\\"鐸\\\",\\\"濁\\\",\\\"諾\\\",\\\"茸\\\",\\\"凧\\\",\\\"蛸\\\",\\\"只\\\",\\\"叩\\\",\\\"但\\\",\\\"達\\\",\\\"辰\\\",\\\"奪\\\",\\\"脱\\\",\\\"巽\\\",\\\"竪\\\",\\\"辿\\\",\\\"棚\\\",\\\"谷\\\",\\\"狸\\\",\\\"鱈\\\",\\\"樽\\\",\\\"誰\\\",\\\"丹\\\",\\\"単\\\",\\\"嘆\\\",\\\"坦\\\",\\\"担\\\",\\\"探\\\",\\\"旦\\\",\\\"歎\\\",\\\"淡\\\",\\\"湛\\\",\\\"炭\\\",\\\"短\\\",\\\"端\\\",\\\"箪\\\",\\\"綻\\\",\\\"耽\\\",\\\"胆\\\",\\\"蛋\\\",\\\"誕\\\",\\\"鍛\\\",\\\"団\\\",\\\"壇\\\",\\\"弾\\\",\\\"断\\\",\\\"暖\\\",\\\"檀\\\",\\\"段\\\",\\\"男\\\",\\\"談\\\",\\\"値\\\",\\\"知\\\",\\\"地\\\",\\\"弛\\\",\\\"恥\\\",\\\"智\\\",\\\"池\\\",\\\"痴\\\",\\\"稚\\\",\\\"置\\\",\\\"致\\\",\\\"蜘\\\",\\\"遅\\\",\\\"馳\\\",\\\"築\\\",\\\"畜\\\",\\\"竹\\\",\\\"筑\\\",\\\"蓄\\\",\\\"逐\\\",\\\"秩\\\",\\\"窒\\\",\\\"茶\\\",\\\"嫡\\\",\\\"着\\\",\\\"中\\\",\\\"仲\\\",\\\"宙\\\",\\\"忠\\\",\\\"抽\\\",\\\"昼\\\",\\\"柱\\\",\\\"注\\\",\\\"虫\\\",\\\"衷\\\",\\\"註\\\",\\\"酎\\\",\\\"鋳\\\",\\\"駐\\\",\\\"樗\\\",\\\"瀦\\\",\\\"猪\\\",\\\"苧\\\",\\\"著\\\",\\\"貯\\\",\\\"丁\\\",\\\"兆\\\",\\\"凋\\\",\\\"喋\\\",\\\"寵\\\",\\\"帖\\\",\\\"帳\\\",\\\"庁\\\",\\\"弔\\\",\\\"張\\\",\\\"彫\\\",\\\"徴\\\",\\\"懲\\\",\\\"挑\\\",\\\"暢\\\",\\\"朝\\\",\\\"潮\\\",\\\"牒\\\",\\\"町\\\",\\\"眺\\\",\\\"聴\\\",\\\"脹\\\",\\\"腸\\\",\\\"蝶\\\",\\\"調\\\",\\\"諜\\\",\\\"超\\\",\\\"跳\\\",\\\"銚\\\",\\\"長\\\",\\\"頂\\\",\\\"鳥\\\",\\\"勅\\\",\\\"捗\\\",\\\"直\\\",\\\"朕\\\",\\\"沈\\\",\\\"珍\\\",\\\"賃\\\",\\\"鎮\\\",\\\"陳\\\",\\\"津\\\",\\\"墜\\\",\\\"椎\\\",\\\"槌\\\",\\\"追\\\",\\\"鎚\\\",\\\"痛\\\",\\\"通\\\",\\\"塚\\\",\\\"栂\\\",\\\"掴\\\",\\\"槻\\\",\\\"佃\\\",\\\"漬\\\",\\\"柘\\\",\\\"辻\\\",\\\"蔦\\\",\\\"綴\\\",\\\"鍔\\\",\\\"椿\\\",\\\"潰\\\",\\\"坪\\\",\\\"壷\\\",\\\"嬬\\\",\\\"紬\\\",\\\"爪\\\",\\\"吊\\\",\\\"釣\\\",\\\"鶴\\\",\\\"亭\\\",\\\"低\\\",\\\"停\\\",\\\"偵\\\",\\\"剃\\\",\\\"貞\\\",\\\"呈\\\",\\\"堤\\\",\\\"定\\\",\\\"帝\\\",\\\"底\\\",\\\"庭\\\",\\\"廷\\\",\\\"弟\\\",\\\"悌\\\",\\\"抵\\\",\\\"挺\\\",\\\"提\\\",\\\"梯\\\",\\\"汀\\\",\\\"碇\\\",\\\"禎\\\",\\\"程\\\",\\\"締\\\",\\\"艇\\\",\\\"訂\\\",\\\"諦\\\",\\\"蹄\\\",\\\"逓\\\",\\\"邸\\\",\\\"鄭\\\",\\\"釘\\\",\\\"鼎\\\",\\\"泥\\\",\\\"摘\\\",\\\"擢\\\",\\\"敵\\\",\\\"滴\\\",\\\"的\\\",\\\"笛\\\",\\\"適\\\",\\\"鏑\\\",\\\"溺\\\",\\\"哲\\\",\\\"徹\\\",\\\"撤\\\",\\\"轍\\\",\\\"迭\\\",\\\"鉄\\\",\\\"典\\\",\\\"填\\\",\\\"天\\\",\\\"展\\\",\\\"店\\\",\\\"添\\\",\\\"纏\\\",\\\"甜\\\",\\\"貼\\\",\\\"転\\\",\\\"顛\\\",\\\"点\\\",\\\"伝\\\",\\\"殿\\\",\\\"澱\\\",\\\"田\\\",\\\"電\\\",\\\"兎\\\",\\\"吐\\\",\\\"堵\\\",\\\"塗\\\",\\\"妬\\\",\\\"屠\\\",\\\"徒\\\",\\\"斗\\\",\\\"杜\\\",\\\"渡\\\",\\\"登\\\",\\\"菟\\\",\\\"賭\\\",\\\"途\\\",\\\"都\\\",\\\"鍍\\\",\\\"砥\\\",\\\"砺\\\",\\\"努\\\",\\\"度\\\",\\\"土\\\",\\\"奴\\\",\\\"怒\\\",\\\"倒\\\",\\\"党\\\",\\\"冬\\\",\\\"凍\\\",\\\"刀\\\",\\\"唐\\\",\\\"塔\\\",\\\"塘\\\",\\\"套\\\",\\\"宕\\\",\\\"島\\\",\\\"嶋\\\",\\\"悼\\\",\\\"投\\\",\\\"搭\\\",\\\"東\\\",\\\"桃\\\",\\\"梼\\\",\\\"棟\\\",\\\"盗\\\",\\\"淘\\\",\\\"湯\\\",\\\"涛\\\",\\\"灯\\\",\\\"燈\\\",\\\"当\\\",\\\"痘\\\",\\\"祷\\\",\\\"等\\\",\\\"答\\\",\\\"筒\\\",\\\"糖\\\",\\\"統\\\",\\\"到\\\",\\\"董\\\",\\\"蕩\\\",\\\"藤\\\",\\\"討\\\",\\\"謄\\\",\\\"豆\\\",\\\"踏\\\",\\\"逃\\\",\\\"透\\\",\\\"鐙\\\",\\\"陶\\\",\\\"頭\\\",\\\"騰\\\",\\\"闘\\\",\\\"働\\\",\\\"動\\\",\\\"同\\\",\\\"堂\\\",\\\"導\\\",\\\"憧\\\",\\\"撞\\\",\\\"洞\\\",\\\"瞳\\\",\\\"童\\\",\\\"胴\\\",\\\"萄\\\",\\\"道\\\",\\\"銅\\\",\\\"峠\\\",\\\"鴇\\\",\\\"匿\\\",\\\"得\\\",\\\"徳\\\",\\\"涜\\\",\\\"特\\\",\\\"督\\\",\\\"禿\\\",\\\"篤\\\",\\\"毒\\\",\\\"独\\\",\\\"読\\\",\\\"栃\\\",\\\"橡\\\",\\\"凸\\\",\\\"突\\\",\\\"椴\\\",\\\"届\\\",\\\"鳶\\\",\\\"苫\\\",\\\"寅\\\",\\\"酉\\\",\\\"瀞\\\",\\\"噸\\\",\\\"屯\\\",\\\"惇\\\",\\\"敦\\\",\\\"沌\\\",\\\"豚\\\",\\\"遁\\\",\\\"頓\\\",\\\"呑\\\",\\\"曇\\\",\\\"鈍\\\",\\\"奈\\\",\\\"那\\\",\\\"内\\\",\\\"乍\\\",\\\"凪\\\",\\\"薙\\\",\\\"謎\\\",\\\"灘\\\",\\\"捺\\\",\\\"鍋\\\",\\\"楢\\\",\\\"馴\\\",\\\"縄\\\",\\\"畷\\\",\\\"南\\\",\\\"楠\\\",\\\"軟\\\",\\\"難\\\",\\\"汝\\\",\\\"二\\\",\\\"尼\\\",\\\"弐\\\",\\\"迩\\\",\\\"匂\\\",\\\"賑\\\",\\\"肉\\\",\\\"虹\\\",\\\"廿\\\",\\\"日\\\",\\\"乳\\\",\\\"入\\\",\\\"如\\\",\\\"尿\\\",\\\"韮\\\",\\\"任\\\",\\\"妊\\\",\\\"忍\\\",\\\"認\\\",\\\"濡\\\",\\\"禰\\\",\\\"祢\\\",\\\"寧\\\",\\\"葱\\\",\\\"猫\\\",\\\"熱\\\",\\\"年\\\",\\\"念\\\",\\\"捻\\\",\\\"撚\\\",\\\"燃\\\",\\\"粘\\\",\\\"乃\\\",\\\"廼\\\",\\\"之\\\",\\\"埜\\\",\\\"嚢\\\",\\\"悩\\\",\\\"濃\\\",\\\"納\\\",\\\"能\\\",\\\"脳\\\",\\\"膿\\\",\\\"農\\\",\\\"覗\\\",\\\"蚤\\\",\\\"巴\\\",\\\"把\\\",\\\"播\\\",\\\"覇\\\",\\\"杷\\\",\\\"波\\\",\\\"派\\\",\\\"琶\\\",\\\"破\\\",\\\"婆\\\",\\\"罵\\\",\\\"芭\\\",\\\"馬\\\",\\\"俳\\\",\\\"廃\\\",\\\"拝\\\",\\\"排\\\",\\\"敗\\\",\\\"杯\\\",\\\"盃\\\",\\\"牌\\\",\\\"背\\\",\\\"肺\\\",\\\"輩\\\",\\\"配\\\",\\\"倍\\\",\\\"培\\\",\\\"媒\\\",\\\"梅\\\",\\\"楳\\\",\\\"煤\\\",\\\"狽\\\",\\\"買\\\",\\\"売\\\",\\\"賠\\\",\\\"陪\\\",\\\"這\\\",\\\"蝿\\\",\\\"秤\\\",\\\"矧\\\",\\\"萩\\\",\\\"伯\\\",\\\"剥\\\",\\\"博\\\",\\\"拍\\\",\\\"柏\\\",\\\"泊\\\",\\\"白\\\",\\\"箔\\\",\\\"粕\\\",\\\"舶\\\",\\\"薄\\\",\\\"迫\\\",\\\"曝\\\",\\\"漠\\\",\\\"爆\\\",\\\"縛\\\",\\\"莫\\\",\\\"駁\\\",\\\"麦\\\",\\\"函\\\",\\\"箱\\\",\\\"硲\\\",\\\"箸\\\",\\\"肇\\\",\\\"筈\\\",\\\"櫨\\\",\\\"幡\\\",\\\"肌\\\",\\\"畑\\\",\\\"畠\\\",\\\"八\\\",\\\"鉢\\\",\\\"溌\\\",\\\"発\\\",\\\"醗\\\",\\\"髪\\\",\\\"伐\\\",\\\"罰\\\",\\\"抜\\\",\\\"筏\\\",\\\"閥\\\",\\\"鳩\\\",\\\"噺\\\",\\\"塙\\\",\\\"蛤\\\",\\\"隼\\\",\\\"伴\\\",\\\"判\\\",\\\"半\\\",\\\"反\\\",\\\"叛\\\",\\\"帆\\\",\\\"搬\\\",\\\"斑\\\",\\\"板\\\",\\\"氾\\\",\\\"汎\\\",\\\"版\\\",\\\"犯\\\",\\\"班\\\",\\\"畔\\\",\\\"繁\\\",\\\"般\\\",\\\"藩\\\",\\\"販\\\",\\\"範\\\",\\\"釆\\\",\\\"煩\\\",\\\"頒\\\",\\\"飯\\\",\\\"挽\\\",\\\"晩\\\",\\\"番\\\",\\\"盤\\\",\\\"磐\\\",\\\"蕃\\\",\\\"蛮\\\",\\\"匪\\\",\\\"卑\\\",\\\"否\\\",\\\"妃\\\",\\\"庇\\\",\\\"彼\\\",\\\"悲\\\",\\\"扉\\\",\\\"批\\\",\\\"披\\\",\\\"斐\\\",\\\"比\\\",\\\"泌\\\",\\\"疲\\\",\\\"皮\\\",\\\"碑\\\",\\\"秘\\\",\\\"緋\\\",\\\"罷\\\",\\\"肥\\\",\\\"被\\\",\\\"誹\\\",\\\"費\\\",\\\"避\\\",\\\"非\\\",\\\"飛\\\",\\\"樋\\\",\\\"簸\\\",\\\"備\\\",\\\"尾\\\",\\\"微\\\",\\\"枇\\\",\\\"毘\\\",\\\"琵\\\",\\\"眉\\\",\\\"美\\\",\\\"鼻\\\",\\\"柊\\\",\\\"稗\\\",\\\"匹\\\",\\\"疋\\\",\\\"髭\\\",\\\"彦\\\",\\\"膝\\\",\\\"菱\\\",\\\"肘\\\",\\\"弼\\\",\\\"必\\\",\\\"畢\\\",\\\"筆\\\",\\\"逼\\\",\\\"桧\\\",\\\"姫\\\",\\\"媛\\\",\\\"紐\\\",\\\"百\\\",\\\"謬\\\",\\\"俵\\\",\\\"彪\\\",\\\"標\\\",\\\"氷\\\",\\\"漂\\\",\\\"瓢\\\",\\\"票\\\",\\\"表\\\",\\\"評\\\",\\\"豹\\\",\\\"廟\\\",\\\"描\\\",\\\"病\\\",\\\"秒\\\",\\\"苗\\\",\\\"錨\\\",\\\"鋲\\\",\\\"蒜\\\",\\\"蛭\\\",\\\"鰭\\\",\\\"品\\\",\\\"彬\\\",\\\"斌\\\",\\\"浜\\\",\\\"瀕\\\",\\\"貧\\\",\\\"賓\\\",\\\"頻\\\",\\\"敏\\\",\\\"瓶\\\",\\\"不\\\",\\\"付\\\",\\\"埠\\\",\\\"夫\\\",\\\"婦\\\",\\\"富\\\",\\\"冨\\\",\\\"布\\\",\\\"府\\\",\\\"怖\\\",\\\"扶\\\",\\\"敷\\\",\\\"斧\\\",\\\"普\\\",\\\"浮\\\",\\\"父\\\",\\\"符\\\",\\\"腐\\\",\\\"膚\\\",\\\"芙\\\",\\\"譜\\\",\\\"負\\\",\\\"賦\\\",\\\"赴\\\",\\\"阜\\\",\\\"附\\\",\\\"侮\\\",\\\"撫\\\",\\\"武\\\",\\\"舞\\\",\\\"葡\\\",\\\"蕪\\\",\\\"部\\\",\\\"封\\\",\\\"楓\\\",\\\"風\\\",\\\"葺\\\",\\\"蕗\\\",\\\"伏\\\",\\\"副\\\",\\\"復\\\",\\\"幅\\\",\\\"服\\\",\\\"福\\\",\\\"腹\\\",\\\"複\\\",\\\"覆\\\",\\\"淵\\\",\\\"弗\\\",\\\"払\\\",\\\"沸\\\",\\\"仏\\\",\\\"物\\\",\\\"鮒\\\",\\\"分\\\",\\\"吻\\\",\\\"噴\\\",\\\"墳\\\",\\\"憤\\\",\\\"扮\\\",\\\"焚\\\",\\\"奮\\\",\\\"粉\\\",\\\"糞\\\",\\\"紛\\\",\\\"雰\\\",\\\"文\\\",\\\"聞\\\",\\\"丙\\\",\\\"併\\\",\\\"兵\\\",\\\"塀\\\",\\\"幣\\\",\\\"平\\\",\\\"弊\\\",\\\"柄\\\",\\\"並\\\",\\\"蔽\\\",\\\"閉\\\",\\\"陛\\\",\\\"米\\\",\\\"頁\\\",\\\"僻\\\",\\\"壁\\\",\\\"癖\\\",\\\"碧\\\",\\\"別\\\",\\\"瞥\\\",\\\"蔑\\\",\\\"箆\\\",\\\"偏\\\",\\\"変\\\",\\\"片\\\",\\\"篇\\\",\\\"編\\\",\\\"辺\\\",\\\"返\\\",\\\"遍\\\",\\\"便\\\",\\\"勉\\\",\\\"娩\\\",\\\"弁\\\",\\\"鞭\\\",\\\"保\\\",\\\"舗\\\",\\\"鋪\\\",\\\"圃\\\",\\\"捕\\\",\\\"歩\\\",\\\"甫\\\",\\\"補\\\",\\\"輔\\\",\\\"穂\\\",\\\"募\\\",\\\"墓\\\",\\\"慕\\\",\\\"戊\\\",\\\"暮\\\",\\\"母\\\",\\\"簿\\\",\\\"菩\\\",\\\"倣\\\",\\\"俸\\\",\\\"包\\\",\\\"呆\\\",\\\"報\\\",\\\"奉\\\",\\\"宝\\\",\\\"峰\\\",\\\"峯\\\",\\\"崩\\\",\\\"庖\\\",\\\"抱\\\",\\\"捧\\\",\\\"放\\\",\\\"方\\\",\\\"朋\\\",\\\"法\\\",\\\"泡\\\",\\\"烹\\\",\\\"砲\\\",\\\"縫\\\",\\\"胞\\\",\\\"芳\\\",\\\"萌\\\",\\\"蓬\\\",\\\"蜂\\\",\\\"褒\\\",\\\"訪\\\",\\\"豊\\\",\\\"邦\\\",\\\"鋒\\\",\\\"飽\\\",\\\"鳳\\\",\\\"鵬\\\",\\\"乏\\\",\\\"亡\\\",\\\"傍\\\",\\\"剖\\\",\\\"坊\\\",\\\"妨\\\",\\\"帽\\\",\\\"忘\\\",\\\"忙\\\",\\\"房\\\",\\\"暴\\\",\\\"望\\\",\\\"某\\\",\\\"棒\\\",\\\"冒\\\",\\\"紡\\\",\\\"肪\\\",\\\"膨\\\",\\\"謀\\\",\\\"貌\\\",\\\"貿\\\",\\\"鉾\\\",\\\"防\\\",\\\"吠\\\",\\\"頬\\\",\\\"北\\\",\\\"僕\\\",\\\"卜\\\",\\\"墨\\\",\\\"撲\\\",\\\"朴\\\",\\\"牧\\\",\\\"睦\\\",\\\"穆\\\",\\\"釦\\\",\\\"勃\\\",\\\"没\\\",\\\"殆\\\",\\\"堀\\\",\\\"幌\\\",\\\"奔\\\",\\\"本\\\",\\\"翻\\\",\\\"凡\\\",\\\"盆\\\",\\\"摩\\\",\\\"磨\\\",\\\"魔\\\",\\\"麻\\\",\\\"埋\\\",\\\"妹\\\",\\\"昧\\\",\\\"枚\\\",\\\"毎\\\",\\\"哩\\\",\\\"槙\\\",\\\"幕\\\",\\\"膜\\\",\\\"枕\\\",\\\"鮪\\\",\\\"柾\\\",\\\"鱒\\\",\\\"桝\\\",\\\"亦\\\",\\\"俣\\\",\\\"又\\\",\\\"抹\\\",\\\"末\\\",\\\"沫\\\",\\\"迄\\\",\\\"侭\\\",\\\"繭\\\",\\\"麿\\\",\\\"万\\\",\\\"慢\\\",\\\"満\\\",\\\"漫\\\",\\\"蔓\\\",\\\"味\\\",\\\"未\\\",\\\"魅\\\",\\\"巳\\\",\\\"箕\\\",\\\"岬\\\",\\\"密\\\",\\\"蜜\\\",\\\"湊\\\",\\\"蓑\\\",\\\"稔\\\",\\\"脈\\\",\\\"妙\\\",\\\"粍\\\",\\\"民\\\",\\\"眠\\\",\\\"務\\\",\\\"夢\\\",\\\"無\\\",\\\"牟\\\",\\\"矛\\\",\\\"霧\\\",\\\"鵡\\\",\\\"椋\\\",\\\"婿\\\",\\\"娘\\\",\\\"冥\\\",\\\"名\\\",\\\"命\\\",\\\"明\\\",\\\"盟\\\",\\\"迷\\\",\\\"銘\\\",\\\"鳴\\\",\\\"姪\\\",\\\"牝\\\",\\\"滅\\\",\\\"免\\\",\\\"棉\\\",\\\"綿\\\",\\\"緬\\\",\\\"面\\\",\\\"麺\\\",\\\"摸\\\",\\\"模\\\",\\\"茂\\\",\\\"妄\\\",\\\"孟\\\",\\\"毛\\\",\\\"猛\\\",\\\"盲\\\",\\\"網\\\",\\\"耗\\\",\\\"蒙\\\",\\\"儲\\\",\\\"木\\\",\\\"黙\\\",\\\"目\\\",\\\"杢\\\",\\\"勿\\\",\\\"餅\\\",\\\"尤\\\",\\\"戻\\\",\\\"籾\\\",\\\"貰\\\",\\\"問\\\",\\\"悶\\\",\\\"紋\\\",\\\"門\\\",\\\"匁\\\",\\\"也\\\",\\\"冶\\\",\\\"夜\\\",\\\"爺\\\",\\\"耶\\\",\\\"野\\\",\\\"弥\\\",\\\"矢\\\",\\\"厄\\\",\\\"役\\\",\\\"約\\\",\\\"薬\\\",\\\"訳\\\",\\\"躍\\\",\\\"靖\\\",\\\"柳\\\",\\\"薮\\\",\\\"鑓\\\",\\\"愉\\\",\\\"愈\\\",\\\"油\\\",\\\"癒\\\",\\\"諭\\\",\\\"輸\\\",\\\"唯\\\",\\\"佑\\\",\\\"優\\\",\\\"勇\\\",\\\"友\\\",\\\"宥\\\",\\\"幽\\\",\\\"悠\\\",\\\"憂\\\",\\\"揖\\\",\\\"有\\\",\\\"柚\\\",\\\"湧\\\",\\\"涌\\\",\\\"猶\\\",\\\"猷\\\",\\\"由\\\",\\\"祐\\\",\\\"裕\\\",\\\"誘\\\",\\\"遊\\\",\\\"邑\\\",\\\"郵\\\",\\\"雄\\\",\\\"融\\\",\\\"夕\\\",\\\"予\\\",\\\"余\\\",\\\"与\\\",\\\"誉\\\",\\\"輿\\\",\\\"預\\\",\\\"傭\\\",\\\"幼\\\",\\\"妖\\\",\\\"容\\\",\\\"庸\\\",\\\"揚\\\",\\\"揺\\\",\\\"擁\\\",\\\"曜\\\",\\\"楊\\\",\\\"様\\\",\\\"洋\\\",\\\"溶\\\",\\\"熔\\\",\\\"用\\\",\\\"窯\\\",\\\"羊\\\",\\\"耀\\\",\\\"葉\\\",\\\"蓉\\\",\\\"要\\\",\\\"謡\\\",\\\"踊\\\",\\\"遥\\\",\\\"陽\\\",\\\"養\\\",\\\"慾\\\",\\\"抑\\\",\\\"欲\\\",\\\"沃\\\",\\\"浴\\\",\\\"翌\\\",\\\"翼\\\",\\\"淀\\\",\\\"羅\\\",\\\"螺\\\",\\\"裸\\\",\\\"来\\\",\\\"莱\\\",\\\"頼\\\",\\\"雷\\\",\\\"洛\\\",\\\"絡\\\",\\\"落\\\",\\\"酪\\\",\\\"乱\\\",\\\"卵\\\",\\\"嵐\\\",\\\"欄\\\",\\\"濫\\\",\\\"藍\\\",\\\"蘭\\\",\\\"覧\\\",\\\"利\\\",\\\"吏\\\",\\\"履\\\",\\\"李\\\",\\\"梨\\\",\\\"理\\\",\\\"璃\\\",\\\"痢\\\",\\\"裏\\\",\\\"裡\\\",\\\"里\\\",\\\"離\\\",\\\"陸\\\",\\\"律\\\",\\\"率\\\",\\\"立\\\",\\\"葎\\\",\\\"掠\\\",\\\"略\\\",\\\"劉\\\",\\\"流\\\",\\\"溜\\\",\\\"琉\\\",\\\"留\\\",\\\"硫\\\",\\\"粒\\\",\\\"隆\\\",\\\"竜\\\",\\\"龍\\\",\\\"侶\\\",\\\"慮\\\",\\\"旅\\\",\\\"虜\\\",\\\"了\\\",\\\"亮\\\",\\\"僚\\\",\\\"両\\\",\\\"凌\\\",\\\"寮\\\",\\\"料\\\",\\\"梁\\\",\\\"涼\\\",\\\"猟\\\",\\\"療\\\",\\\"瞭\\\",\\\"稜\\\",\\\"糧\\\",\\\"良\\\",\\\"諒\\\",\\\"遼\\\",\\\"量\\\",\\\"陵\\\",\\\"領\\\",\\\"力\\\",\\\"緑\\\",\\\"倫\\\",\\\"厘\\\",\\\"林\\\",\\\"淋\\\",\\\"燐\\\",\\\"琳\\\",\\\"臨\\\",\\\"輪\\\",\\\"隣\\\",\\\"鱗\\\",\\\"麟\\\",\\\"瑠\\\",\\\"塁\\\",\\\"涙\\\",\\\"累\\\",\\\"類\\\",\\\"令\\\",\\\"伶\\\",\\\"例\\\",\\\"冷\\\",\\\"励\\\",\\\"嶺\\\",\\\"怜\\\",\\\"玲\\\",\\\"礼\\\",\\\"苓\\\",\\\"鈴\\\",\\\"隷\\\",\\\"零\\\",\\\"霊\\\",\\\"麗\\\",\\\"齢\\\",\\\"暦\\\",\\\"歴\\\",\\\"列\\\",\\\"劣\\\",\\\"烈\\\",\\\"裂\\\",\\\"廉\\\",\\\"恋\\\",\\\"憐\\\",\\\"漣\\\",\\\"煉\\\",\\\"簾\\\",\\\"練\\\",\\\"聯\\\",\\\"蓮\\\",\\\"連\\\",\\\"錬\\\",\\\"呂\\\",\\\"魯\\\",\\\"櫓\\\",\\\"炉\\\",\\\"賂\\\",\\\"路\\\",\\\"露\\\",\\\"労\\\",\\\"婁\\\",\\\"廊\\\",\\\"弄\\\",\\\"朗\\\",\\\"楼\\\",\\\"榔\\\",\\\"浪\\\",\\\"漏\\\",\\\"牢\\\",\\\"狼\\\",\\\"篭\\\",\\\"老\\\",\\\"聾\\\",\\\"蝋\\\",\\\"郎\\\",\\\"六\\\",\\\"麓\\\",\\\"禄\\\",\\\"肋\\\",\\\"録\\\",\\\"論\\\",\\\"倭\\\",\\\"和\\\",\\\"話\\\",\\\"歪\\\",\\\"賄\\\",\\\"脇\\\",\\\"惑\\\",\\\"枠\\\",\\\"鷲\\\",\\\"亙\\\",\\\"亘\\\",\\\"鰐\\\",\\\"詫\\\",\\\"藁\\\",\\\"蕨\\\",\\\"椀\\\",\\\"湾\\\",\\\"碗\\\",\\\"腕\\\",\\\"𠮟\\\",\\\"孁\\\",\\\"孖\\\",\\\"孽\\\",\\\"宓\\\",\\\"寘\\\",\\\"寬\\\",\\\"尒\\\",\\\"尞\\\",\\\"尣\\\",\\\"尫\\\",\\\"㞍\\\",\\\"屢\\\",\\\"層\\\",\\\"屮\\\",\\\"𡚴\\\",\\\"屺\\\",\\\"岏\\\",\\\"岟\\\",\\\"岣\\\",\\\"岪\\\",\\\"岺\\\",\\\"峋\\\",\\\"峐\\\",\\\"峒\\\",\\\"峴\\\",\\\"𡸴\\\",\\\"㟢\\\",\\\"崍\\\",\\\"崧\\\",\\\"﨑\\\",\\\"嵆\\\",\\\"嵇\\\",\\\"嵓\\\",\\\"嵊\\\",\\\"嵭\\\",\\\"嶁\\\",\\\"嶠\\\",\\\"嶤\\\",\\\"嶧\\\",\\\"嶸\\\",\\\"巋\\\",\\\"吞\\\",\\\"弌\\\",\\\"丐\\\",\\\"丕\\\",\\\"个\\\",\\\"丱\\\",\\\"丶\\\",\\\"丼\\\",\\\"丿\\\",\\\"乂\\\",\\\"乖\\\",\\\"乘\\\",\\\"亂\\\",\\\"亅\\\",\\\"豫\\\",\\\"亊\\\",\\\"舒\\\",\\\"弍\\\",\\\"于\\\",\\\"亞\\\",\\\"亟\\\",\\\"亠\\\",\\\"亢\\\",\\\"亰\\\",\\\"亳\\\",\\\"亶\\\",\\\"从\\\",\\\"仍\\\",\\\"仄\\\",\\\"仆\\\",\\\"仂\\\",\\\"仗\\\",\\\"仞\\\",\\\"仭\\\",\\\"仟\\\",\\\"价\\\",\\\"伉\\\",\\\"佚\\\",\\\"估\\\",\\\"佛\\\",\\\"佝\\\",\\\"佗\\\",\\\"佇\\\",\\\"佶\\\",\\\"侈\\\",\\\"侏\\\",\\\"侘\\\",\\\"佻\\\",\\\"佩\\\",\\\"佰\\\",\\\"侑\\\",\\\"佯\\\",\\\"來\\\",\\\"侖\\\",\\\"儘\\\",\\\"俔\\\",\\\"俟\\\",\\\"俎\\\",\\\"俘\\\",\\\"俛\\\",\\\"俑\\\",\\\"俚\\\",\\\"俐\\\",\\\"俤\\\",\\\"俥\\\",\\\"倚\\\",\\\"倨\\\",\\\"倔\\\",\\\"倪\\\",\\\"倥\\\",\\\"倅\\\",\\\"伜\\\",\\\"俶\\\",\\\"倡\\\",\\\"倩\\\",\\\"倬\\\",\\\"俾\\\",\\\"俯\\\",\\\"們\\\",\\\"倆\\\",\\\"偃\\\",\\\"假\\\",\\\"會\\\",\\\"偕\\\",\\\"偐\\\",\\\"偈\\\",\\\"做\\\",\\\"偖\\\",\\\"偬\\\",\\\"偸\\\",\\\"傀\\\",\\\"傚\\\",\\\"傅\\\",\\\"傴\\\",\\\"傲\\\",\\\"僉\\\",\\\"僊\\\",\\\"傳\\\",\\\"僂\\\",\\\"僖\\\",\\\"僞\\\",\\\"僥\\\",\\\"僭\\\",\\\"僣\\\",\\\"僮\\\",\\\"價\\\",\\\"僵\\\",\\\"儉\\\",\\\"儁\\\",\\\"儂\\\",\\\"儖\\\",\\\"儕\\\",\\\"儔\\\",\\\"儚\\\",\\\"儡\\\",\\\"儺\\\",\\\"儷\\\",\\\"儼\\\",\\\"儻\\\",\\\"儿\\\",\\\"兀\\\",\\\"兒\\\",\\\"兌\\\",\\\"兔\\\",\\\"兢\\\",\\\"竸\\\",\\\"兩\\\",\\\"兪\\\",\\\"兮\\\",\\\"冀\\\",\\\"冂\\\",\\\"囘\\\",\\\"册\\\",\\\"冉\\\",\\\"冏\\\",\\\"冑\\\",\\\"冓\\\",\\\"冕\\\",\\\"冖\\\",\\\"冤\\\",\\\"冦\\\",\\\"冢\\\",\\\"冩\\\",\\\"冪\\\",\\\"冫\\\",\\\"决\\\",\\\"冱\\\",\\\"冲\\\",\\\"冰\\\",\\\"况\\\",\\\"冽\\\",\\\"凅\\\",\\\"凉\\\",\\\"凛\\\",\\\"几\\\",\\\"處\\\",\\\"凩\\\",\\\"凭\\\",\\\"凰\\\",\\\"凵\\\",\\\"凾\\\",\\\"刄\\\",\\\"刋\\\",\\\"刔\\\",\\\"刎\\\",\\\"刧\\\",\\\"刪\\\",\\\"刮\\\",\\\"刳\\\",\\\"刹\\\",\\\"剏\\\",\\\"剄\\\",\\\"剋\\\",\\\"剌\\\",\\\"剞\\\",\\\"剔\\\",\\\"剪\\\",\\\"剴\\\",\\\"剩\\\",\\\"剳\\\",\\\"剿\\\",\\\"剽\\\",\\\"劍\\\",\\\"劔\\\",\\\"劒\\\",\\\"剱\\\",\\\"劈\\\",\\\"劑\\\",\\\"辨\\\",\\\"辧\\\",\\\"劬\\\",\\\"劭\\\",\\\"劼\\\",\\\"劵\\\",\\\"勁\\\",\\\"勍\\\",\\\"勗\\\",\\\"勞\\\",\\\"勣\\\",\\\"勦\\\",\\\"飭\\\",\\\"勠\\\",\\\"勳\\\",\\\"勵\\\",\\\"勸\\\",\\\"勹\\\",\\\"匆\\\",\\\"匈\\\",\\\"甸\\\",\\\"匍\\\",\\\"匐\\\",\\\"匏\\\",\\\"匕\\\",\\\"匚\\\",\\\"匣\\\",\\\"匯\\\",\\\"匱\\\",\\\"匳\\\",\\\"匸\\\",\\\"區\\\",\\\"卆\\\",\\\"卅\\\",\\\"丗\\\",\\\"卉\\\",\\\"卍\\\",\\\"凖\\\",\\\"卞\\\",\\\"卩\\\",\\\"卮\\\",\\\"夘\\\",\\\"卻\\\",\\\"卷\\\",\\\"厂\\\",\\\"厖\\\",\\\"厠\\\",\\\"厦\\\",\\\"厥\\\",\\\"厮\\\",\\\"厰\\\",\\\"厶\\\",\\\"參\\\",\\\"簒\\\",\\\"雙\\\",\\\"叟\\\",\\\"曼\\\",\\\"燮\\\",\\\"叮\\\",\\\"叨\\\",\\\"叭\\\",\\\"叺\\\",\\\"吁\\\",\\\"吽\\\",\\\"呀\\\",\\\"听\\\",\\\"吭\\\",\\\"吼\\\",\\\"吮\\\",\\\"吶\\\",\\\"吩\\\",\\\"吝\\\",\\\"呎\\\",\\\"咏\\\",\\\"呵\\\",\\\"咎\\\",\\\"呟\\\",\\\"呱\\\",\\\"呷\\\",\\\"呰\\\",\\\"咒\\\",\\\"呻\\\",\\\"咀\\\",\\\"呶\\\",\\\"咄\\\",\\\"咐\\\",\\\"咆\\\",\\\"哇\\\",\\\"咢\\\",\\\"咸\\\",\\\"咥\\\",\\\"咬\\\",\\\"哄\\\",\\\"哈\\\",\\\"咨\\\",\\\"咫\\\",\\\"哂\\\",\\\"咤\\\",\\\"咾\\\",\\\"咼\\\",\\\"哘\\\",\\\"哥\\\",\\\"哦\\\",\\\"唏\\\",\\\"唔\\\",\\\"哽\\\",\\\"哮\\\",\\\"哭\\\",\\\"哺\\\",\\\"哢\\\",\\\"唹\\\",\\\"啀\\\",\\\"啣\\\",\\\"啌\\\",\\\"售\\\",\\\"啜\\\",\\\"啅\\\",\\\"啖\\\",\\\"啗\\\",\\\"唸\\\",\\\"唳\\\",\\\"啝\\\",\\\"喙\\\",\\\"喀\\\",\\\"咯\\\",\\\"喊\\\",\\\"喟\\\",\\\"啻\\\",\\\"啾\\\",\\\"喘\\\",\\\"喞\\\",\\\"單\\\",\\\"啼\\\",\\\"喃\\\",\\\"喩\\\",\\\"喇\\\",\\\"喨\\\",\\\"嗚\\\",\\\"嗅\\\",\\\"嗟\\\",\\\"嗄\\\",\\\"嗜\\\",\\\"嗤\\\",\\\"嗔\\\",\\\"嘔\\\",\\\"嗷\\\",\\\"嘖\\\",\\\"嗾\\\",\\\"嗽\\\",\\\"嘛\\\",\\\"嗹\\\",\\\"噎\\\",\\\"噐\\\",\\\"營\\\",\\\"嘴\\\",\\\"嘶\\\",\\\"嘲\\\",\\\"嘸\\\",\\\"噫\\\",\\\"噤\\\",\\\"嘯\\\",\\\"噬\\\",\\\"噪\\\",\\\"嚆\\\",\\\"嚀\\\",\\\"嚊\\\",\\\"嚠\\\",\\\"嚔\\\",\\\"嚏\\\",\\\"嚥\\\",\\\"嚮\\\",\\\"嚶\\\",\\\"嚴\\\",\\\"囂\\\",\\\"嚼\\\",\\\"囁\\\",\\\"囃\\\",\\\"囀\\\",\\\"囈\\\",\\\"囎\\\",\\\"囑\\\",\\\"囓\\\",\\\"囗\\\",\\\"囮\\\",\\\"囹\\\",\\\"圀\\\",\\\"囿\\\",\\\"圄\\\",\\\"圉\\\",\\\"圈\\\",\\\"國\\\",\\\"圍\\\",\\\"圓\\\",\\\"團\\\",\\\"圖\\\",\\\"嗇\\\",\\\"圜\\\",\\\"圦\\\",\\\"圷\\\",\\\"圸\\\",\\\"坎\\\",\\\"圻\\\",\\\"址\\\",\\\"坏\\\",\\\"坩\\\",\\\"埀\\\",\\\"垈\\\",\\\"坡\\\",\\\"坿\\\",\\\"垉\\\",\\\"垓\\\",\\\"垠\\\",\\\"垳\\\",\\\"垤\\\",\\\"垪\\\",\\\"垰\\\",\\\"埃\\\",\\\"埆\\\",\\\"埔\\\",\\\"埒\\\",\\\"埓\\\",\\\"堊\\\",\\\"埖\\\",\\\"埣\\\",\\\"堋\\\",\\\"堙\\\",\\\"堝\\\",\\\"塲\\\",\\\"堡\\\",\\\"塢\\\",\\\"塋\\\",\\\"塰\\\",\\\"毀\\\",\\\"塒\\\",\\\"堽\\\",\\\"塹\\\",\\\"墅\\\",\\\"墹\\\",\\\"墟\\\",\\\"墫\\\",\\\"墺\\\",\\\"壞\\\",\\\"墻\\\",\\\"墸\\\",\\\"墮\\\",\\\"壅\\\",\\\"壓\\\",\\\"壑\\\",\\\"壗\\\",\\\"壙\\\",\\\"壘\\\",\\\"壥\\\",\\\"壜\\\",\\\"壤\\\",\\\"壟\\\",\\\"壯\\\",\\\"壺\\\",\\\"壹\\\",\\\"壻\\\",\\\"壼\\\",\\\"壽\\\",\\\"夂\\\",\\\"夊\\\",\\\"夐\\\",\\\"夛\\\",\\\"梦\\\",\\\"夥\\\",\\\"夬\\\",\\\"夭\\\",\\\"夲\\\",\\\"夸\\\",\\\"夾\\\",\\\"竒\\\",\\\"奕\\\",\\\"奐\\\",\\\"奎\\\",\\\"奚\\\",\\\"奘\\\",\\\"奢\\\",\\\"奠\\\",\\\"奧\\\",\\\"奬\\\",\\\"奩\\\",\\\"奸\\\",\\\"妁\\\",\\\"妝\\\",\\\"佞\\\",\\\"侫\\\",\\\"妣\\\",\\\"妲\\\",\\\"姆\\\",\\\"姨\\\",\\\"姜\\\",\\\"妍\\\",\\\"姙\\\",\\\"姚\\\",\\\"娥\\\",\\\"娟\\\",\\\"娑\\\",\\\"娜\\\",\\\"娉\\\",\\\"娚\\\",\\\"婀\\\",\\\"婬\\\",\\\"婉\\\",\\\"娵\\\",\\\"娶\\\",\\\"婢\\\",\\\"婪\\\",\\\"媚\\\",\\\"媼\\\",\\\"媾\\\",\\\"嫋\\\",\\\"嫂\\\",\\\"媽\\\",\\\"嫣\\\",\\\"嫗\\\",\\\"嫦\\\",\\\"嫩\\\",\\\"嫖\\\",\\\"嫺\\\",\\\"嫻\\\",\\\"嬌\\\",\\\"嬋\\\",\\\"嬖\\\",\\\"嬲\\\",\\\"嫐\\\",\\\"嬪\\\",\\\"嬶\\\",\\\"嬾\\\",\\\"孃\\\",\\\"孅\\\",\\\"孀\\\",\\\"孑\\\",\\\"孕\\\",\\\"孚\\\",\\\"孛\\\",\\\"孥\\\",\\\"孩\\\",\\\"孰\\\",\\\"孳\\\",\\\"孵\\\",\\\"學\\\",\\\"斈\\\",\\\"孺\\\",\\\"宀\\\",\\\"它\\\",\\\"宦\\\",\\\"宸\\\",\\\"寃\\\",\\\"寇\\\",\\\"寉\\\",\\\"寔\\\",\\\"寐\\\",\\\"寤\\\",\\\"實\\\",\\\"寢\\\",\\\"寞\\\",\\\"寥\\\",\\\"寫\\\",\\\"寰\\\",\\\"寶\\\",\\\"寳\\\",\\\"尅\\\",\\\"將\\\",\\\"專\\\",\\\"對\\\",\\\"尓\\\",\\\"尠\\\",\\\"尢\\\",\\\"尨\\\",\\\"尸\\\",\\\"尹\\\",\\\"屁\\\",\\\"屆\\\",\\\"屎\\\",\\\"屓\\\",\\\"屐\\\",\\\"屏\\\",\\\"孱\\\",\\\"屬\\\",\\\"屮\\\",\\\"乢\\\",\\\"屶\\\",\\\"屹\\\",\\\"岌\\\",\\\"岑\\\",\\\"岔\\\",\\\"妛\\\",\\\"岫\\\",\\\"岻\\\",\\\"岶\\\",\\\"岼\\\",\\\"岷\\\",\\\"峅\\\",\\\"岾\\\",\\\"峇\\\",\\\"峙\\\",\\\"峩\\\",\\\"峽\\\",\\\"峺\\\",\\\"峭\\\",\\\"嶌\\\",\\\"峪\\\",\\\"崋\\\",\\\"崕\\\",\\\"崗\\\",\\\"嵜\\\",\\\"崟\\\",\\\"崛\\\",\\\"崑\\\",\\\"崔\\\",\\\"崢\\\",\\\"崚\\\",\\\"崙\\\",\\\"崘\\\",\\\"嵌\\\",\\\"嵒\\\",\\\"嵎\\\",\\\"嵋\\\",\\\"嵬\\\",\\\"嵳\\\",\\\"嵶\\\",\\\"嶇\\\",\\\"嶄\\\",\\\"嶂\\\",\\\"嶢\\\",\\\"嶝\\\",\\\"嶬\\\",\\\"嶮\\\",\\\"嶽\\\",\\\"嶐\\\",\\\"嶷\\\",\\\"嶼\\\",\\\"巉\\\",\\\"巍\\\",\\\"巓\\\",\\\"巒\\\",\\\"巖\\\",\\\"巛\\\",\\\"巫\\\",\\\"已\\\",\\\"巵\\\",\\\"帋\\\",\\\"帚\\\",\\\"帙\\\",\\\"帑\\\",\\\"帛\\\",\\\"帶\\\",\\\"帷\\\",\\\"幄\\\",\\\"幃\\\",\\\"幀\\\",\\\"幎\\\",\\\"幗\\\",\\\"幔\\\",\\\"幟\\\",\\\"幢\\\",\\\"幤\\\",\\\"幇\\\",\\\"幵\\\",\\\"并\\\",\\\"幺\\\",\\\"麼\\\",\\\"广\\\",\\\"庠\\\",\\\"廁\\\",\\\"廂\\\",\\\"廈\\\",\\\"廐\\\",\\\"廏\\\",\\\"廖\\\",\\\"廣\\\",\\\"廝\\\",\\\"廚\\\",\\\"廛\\\",\\\"廢\\\",\\\"廡\\\",\\\"廨\\\",\\\"廩\\\",\\\"廬\\\",\\\"廱\\\",\\\"廳\\\",\\\"廰\\\",\\\"廴\\\",\\\"廸\\\",\\\"廾\\\",\\\"弃\\\",\\\"弉\\\",\\\"彝\\\",\\\"彜\\\",\\\"弋\\\",\\\"弑\\\",\\\"弖\\\",\\\"弩\\\",\\\"弭\\\",\\\"弸\\\",\\\"彁\\\",\\\"彈\\\",\\\"彌\\\",\\\"彎\\\",\\\"弯\\\",\\\"彑\\\",\\\"彖\\\",\\\"彗\\\",\\\"彙\\\",\\\"彡\\\",\\\"彭\\\",\\\"彳\\\",\\\"彷\\\",\\\"徃\\\",\\\"徂\\\",\\\"彿\\\",\\\"徊\\\",\\\"很\\\",\\\"徑\\\",\\\"徇\\\",\\\"從\\\",\\\"徙\\\",\\\"徘\\\",\\\"徠\\\",\\\"徨\\\",\\\"徭\\\",\\\"徼\\\",\\\"忖\\\",\\\"忻\\\",\\\"忤\\\",\\\"忸\\\",\\\"忱\\\",\\\"忝\\\",\\\"悳\\\",\\\"忿\\\",\\\"怡\\\",\\\"恠\\\",\\\"怙\\\",\\\"怐\\\",\\\"怩\\\",\\\"怎\\\",\\\"怱\\\",\\\"怛\\\",\\\"怕\\\",\\\"怫\\\",\\\"怦\\\",\\\"怏\\\",\\\"怺\\\",\\\"恚\\\",\\\"恁\\\",\\\"恪\\\",\\\"恷\\\",\\\"恟\\\",\\\"恊\\\",\\\"恆\\\",\\\"恍\\\",\\\"恣\\\",\\\"恃\\\",\\\"恤\\\",\\\"恂\\\",\\\"恬\\\",\\\"恫\\\",\\\"恙\\\",\\\"悁\\\",\\\"悍\\\",\\\"惧\\\",\\\"悃\\\",\\\"悚\\\",\\\"悄\\\",\\\"悛\\\",\\\"悖\\\",\\\"悗\\\",\\\"悒\\\",\\\"悧\\\",\\\"悋\\\",\\\"惡\\\",\\\"悸\\\",\\\"惠\\\",\\\"惓\\\",\\\"悴\\\",\\\"忰\\\",\\\"悽\\\",\\\"惆\\\",\\\"悵\\\",\\\"惘\\\",\\\"慍\\\",\\\"愕\\\",\\\"愆\\\",\\\"惶\\\",\\\"惷\\\",\\\"愀\\\",\\\"惴\\\",\\\"惺\\\",\\\"愃\\\",\\\"愡\\\",\\\"惻\\\",\\\"惱\\\",\\\"愍\\\",\\\"愎\\\",\\\"慇\\\",\\\"愾\\\",\\\"愨\\\",\\\"愧\\\",\\\"慊\\\",\\\"愿\\\",\\\"愼\\\",\\\"愬\\\",\\\"愴\\\",\\\"愽\\\",\\\"慂\\\",\\\"慄\\\",\\\"慳\\\",\\\"慷\\\",\\\"慘\\\",\\\"慙\\\",\\\"慚\\\",\\\"慫\\\",\\\"慴\\\",\\\"慯\\\",\\\"慥\\\",\\\"慱\\\",\\\"慟\\\",\\\"慝\\\",\\\"慓\\\",\\\"慵\\\",\\\"憙\\\",\\\"憖\\\",\\\"憇\\\",\\\"憬\\\",\\\"憔\\\",\\\"憚\\\",\\\"憊\\\",\\\"憑\\\",\\\"憫\\\",\\\"憮\\\",\\\"懌\\\",\\\"懊\\\",\\\"應\\\",\\\"懷\\\",\\\"懈\\\",\\\"懃\\\",\\\"懆\\\",\\\"憺\\\",\\\"懋\\\",\\\"罹\\\",\\\"懍\\\",\\\"懦\\\",\\\"懣\\\",\\\"懶\\\",\\\"懺\\\",\\\"懴\\\",\\\"懿\\\",\\\"懽\\\",\\\"懼\\\",\\\"懾\\\",\\\"戀\\\",\\\"戈\\\",\\\"戉\\\",\\\"戍\\\",\\\"戌\\\",\\\"戔\\\",\\\"戛\\\",\\\"戞\\\",\\\"戡\\\",\\\"截\\\",\\\"戮\\\",\\\"戰\\\",\\\"戲\\\",\\\"戳\\\",\\\"扁\\\",\\\"扎\\\",\\\"扞\\\",\\\"扣\\\",\\\"扛\\\",\\\"扠\\\",\\\"扨\\\",\\\"扼\\\",\\\"抂\\\",\\\"抉\\\",\\\"找\\\",\\\"抒\\\",\\\"抓\\\",\\\"抖\\\",\\\"拔\\\",\\\"抃\\\",\\\"抔\\\",\\\"拗\\\",\\\"拑\\\",\\\"抻\\\",\\\"拏\\\",\\\"拿\\\",\\\"拆\\\",\\\"擔\\\",\\\"拈\\\",\\\"拜\\\",\\\"拌\\\",\\\"拊\\\",\\\"拂\\\",\\\"拇\\\",\\\"抛\\\",\\\"拉\\\",\\\"挌\\\",\\\"拮\\\",\\\"拱\\\",\\\"挧\\\",\\\"挂\\\",\\\"挈\\\",\\\"拯\\\",\\\"拵\\\",\\\"捐\\\",\\\"挾\\\",\\\"捍\\\",\\\"搜\\\",\\\"捏\\\",\\\"掖\\\",\\\"掎\\\",\\\"掀\\\",\\\"掫\\\",\\\"捶\\\",\\\"掣\\\",\\\"掏\\\",\\\"掉\\\",\\\"掟\\\",\\\"掵\\\",\\\"捫\\\",\\\"捩\\\",\\\"掾\\\",\\\"揩\\\",\\\"揀\\\",\\\"揆\\\",\\\"揣\\\",\\\"揉\\\",\\\"插\\\",\\\"揶\\\",\\\"揄\\\",\\\"搖\\\",\\\"搴\\\",\\\"搆\\\",\\\"搓\\\",\\\"搦\\\",\\\"搶\\\",\\\"攝\\\",\\\"搗\\\",\\\"搨\\\",\\\"搏\\\",\\\"摧\\\",\\\"摯\\\",\\\"摶\\\",\\\"摎\\\",\\\"攪\\\",\\\"撕\\\",\\\"撓\\\",\\\"撥\\\",\\\"撩\\\",\\\"撈\\\",\\\"撼\\\",\\\"據\\\",\\\"擒\\\",\\\"擅\\\",\\\"擇\\\",\\\"撻\\\",\\\"擘\\\",\\\"擂\\\",\\\"擱\\\",\\\"擧\\\",\\\"舉\\\",\\\"擠\\\",\\\"擡\\\",\\\"抬\\\",\\\"擣\\\",\\\"擯\\\",\\\"攬\\\",\\\"擶\\\",\\\"擴\\\",\\\"擲\\\",\\\"擺\\\",\\\"攀\\\",\\\"擽\\\",\\\"攘\\\",\\\"攜\\\",\\\"攅\\\",\\\"攤\\\",\\\"攣\\\",\\\"攫\\\",\\\"攴\\\",\\\"攵\\\",\\\"攷\\\",\\\"收\\\",\\\"攸\\\",\\\"畋\\\",\\\"效\\\",\\\"敖\\\",\\\"敕\\\",\\\"敍\\\",\\\"敘\\\",\\\"敞\\\",\\\"敝\\\",\\\"敲\\\",\\\"數\\\",\\\"斂\\\",\\\"斃\\\",\\\"變\\\",\\\"斛\\\",\\\"斟\\\",\\\"斫\\\",\\\"斷\\\",\\\"旃\\\",\\\"旆\\\",\\\"旁\\\",\\\"旄\\\",\\\"旌\\\",\\\"旒\\\",\\\"旛\\\",\\\"旙\\\",\\\"无\\\",\\\"旡\\\",\\\"旱\\\",\\\"杲\\\",\\\"昊\\\",\\\"昃\\\",\\\"旻\\\",\\\"杳\\\",\\\"昵\\\",\\\"昶\\\",\\\"昴\\\",\\\"昜\\\",\\\"晏\\\",\\\"晄\\\",\\\"晉\\\",\\\"晁\\\",\\\"晞\\\",\\\"晝\\\",\\\"晤\\\",\\\"晧\\\",\\\"晨\\\",\\\"晟\\\",\\\"晢\\\",\\\"晰\\\",\\\"暃\\\",\\\"暈\\\",\\\"暎\\\",\\\"暉\\\",\\\"暄\\\",\\\"暘\\\",\\\"暝\\\",\\\"曁\\\",\\\"暹\\\",\\\"曉\\\",\\\"暾\\\",\\\"暼\\\",\\\"曄\\\",\\\"暸\\\",\\\"曖\\\",\\\"曚\\\",\\\"曠\\\",\\\"昿\\\",\\\"曦\\\",\\\"曩\\\",\\\"曰\\\",\\\"曵\\\",\\\"曷\\\",\\\"朏\\\",\\\"朖\\\",\\\"朞\\\",\\\"朦\\\",\\\"朧\\\",\\\"霸\\\",\\\"朮\\\",\\\"朿\\\",\\\"朶\\\",\\\"杁\\\",\\\"朸\\\",\\\"朷\\\",\\\"杆\\\",\\\"杞\\\",\\\"杠\\\",\\\"杙\\\",\\\"杣\\\",\\\"杤\\\",\\\"枉\\\",\\\"杰\\\",\\\"枩\\\",\\\"杼\\\",\\\"杪\\\",\\\"枌\\\",\\\"枋\\\",\\\"枦\\\",\\\"枡\\\",\\\"枅\\\",\\\"枷\\\",\\\"柯\\\",\\\"枴\\\",\\\"柬\\\",\\\"枳\\\",\\\"柩\\\",\\\"枸\\\",\\\"柤\\\",\\\"柞\\\",\\\"柝\\\",\\\"柢\\\",\\\"柮\\\",\\\"枹\\\",\\\"柎\\\",\\\"柆\\\",\\\"柧\\\",\\\"檜\\\",\\\"栞\\\",\\\"框\\\",\\\"栩\\\",\\\"桀\\\",\\\"桍\\\",\\\"栲\\\",\\\"桎\\\",\\\"梳\\\",\\\"栫\\\",\\\"桙\\\",\\\"档\\\",\\\"桷\\\",\\\"桿\\\",\\\"梟\\\",\\\"梏\\\",\\\"梭\\\",\\\"梔\\\",\\\"條\\\",\\\"梛\\\",\\\"梃\\\",\\\"檮\\\",\\\"梹\\\",\\\"桴\\\",\\\"梵\\\",\\\"梠\\\",\\\"梺\\\",\\\"椏\\\",\\\"梍\\\",\\\"桾\\\",\\\"椁\\\",\\\"棊\\\",\\\"椈\\\",\\\"棘\\\",\\\"椢\\\",\\\"椦\\\",\\\"棡\\\",\\\"椌\\\",\\\"棍\\\",\\\"棔\\\",\\\"棧\\\",\\\"棕\\\",\\\"椶\\\",\\\"椒\\\",\\\"椄\\\",\\\"棗\\\",\\\"棣\\\",\\\"椥\\\",\\\"棹\\\",\\\"棠\\\",\\\"棯\\\",\\\"椨\\\",\\\"椪\\\",\\\"椚\\\",\\\"椣\\\",\\\"椡\\\",\\\"棆\\\",\\\"楹\\\",\\\"楷\\\",\\\"楜\\\",\\\"楸\\\",\\\"楫\\\",\\\"楔\\\",\\\"楾\\\",\\\"楮\\\",\\\"椹\\\",\\\"楴\\\",\\\"椽\\\",\\\"楙\\\",\\\"椰\\\",\\\"楡\\\",\\\"楞\\\",\\\"楝\\\",\\\"榁\\\",\\\"楪\\\",\\\"榲\\\",\\\"榮\\\",\\\"槐\\\",\\\"榿\\\",\\\"槁\\\",\\\"槓\\\",\\\"榾\\\",\\\"槎\\\",\\\"寨\\\",\\\"槊\\\",\\\"槝\\\",\\\"榻\\\",\\\"槃\\\",\\\"榧\\\",\\\"樮\\\",\\\"榑\\\",\\\"榠\\\",\\\"榜\\\",\\\"榕\\\",\\\"榴\\\",\\\"槞\\\",\\\"槨\\\",\\\"樂\\\",\\\"樛\\\",\\\"槿\\\",\\\"權\\\",\\\"槹\\\",\\\"槲\\\",\\\"槧\\\",\\\"樅\\\",\\\"榱\\\",\\\"樞\\\",\\\"槭\\\",\\\"樔\\\",\\\"槫\\\",\\\"樊\\\",\\\"樒\\\",\\\"櫁\\\",\\\"樣\\\",\\\"樓\\\",\\\"橄\\\",\\\"樌\\\",\\\"橲\\\",\\\"樶\\\",\\\"橸\\\",\\\"橇\\\",\\\"橢\\\",\\\"橙\\\",\\\"橦\\\",\\\"橈\\\",\\\"樸\\\",\\\"樢\\\",\\\"檐\\\",\\\"檍\\\",\\\"檠\\\",\\\"檄\\\",\\\"檢\\\",\\\"檣\\\",\\\"檗\\\",\\\"蘗\\\",\\\"檻\\\",\\\"櫃\\\",\\\"櫂\\\",\\\"檸\\\",\\\"檳\\\",\\\"檬\\\",\\\"櫞\\\",\\\"櫑\\\",\\\"櫟\\\",\\\"檪\\\",\\\"櫚\\\",\\\"櫪\\\",\\\"櫻\\\",\\\"欅\\\",\\\"蘖\\\",\\\"櫺\\\",\\\"欒\\\",\\\"欖\\\",\\\"鬱\\\",\\\"欟\\\",\\\"欸\\\",\\\"欷\\\",\\\"盜\\\",\\\"欹\\\",\\\"飮\\\",\\\"歇\\\",\\\"歃\\\",\\\"歉\\\",\\\"歐\\\",\\\"歙\\\",\\\"歔\\\",\\\"歛\\\",\\\"歟\\\",\\\"歡\\\",\\\"歸\\\",\\\"歹\\\",\\\"歿\\\",\\\"殀\\\",\\\"殄\\\",\\\"殃\\\",\\\"殍\\\",\\\"殘\\\",\\\"殕\\\",\\\"殞\\\",\\\"殤\\\",\\\"殪\\\",\\\"殫\\\",\\\"殯\\\",\\\"殲\\\",\\\"殱\\\",\\\"殳\\\",\\\"殷\\\",\\\"殼\\\",\\\"毆\\\",\\\"毋\\\",\\\"毓\\\",\\\"毟\\\",\\\"毬\\\",\\\"毫\\\",\\\"毳\\\",\\\"毯\\\",\\\"麾\\\",\\\"氈\\\",\\\"氓\\\",\\\"气\\\",\\\"氛\\\",\\\"氤\\\",\\\"氣\\\",\\\"汞\\\",\\\"汕\\\",\\\"汢\\\",\\\"汪\\\",\\\"沂\\\",\\\"沍\\\",\\\"沚\\\",\\\"沁\\\",\\\"沛\\\",\\\"汾\\\",\\\"汨\\\",\\\"汳\\\",\\\"沒\\\",\\\"沐\\\",\\\"泄\\\",\\\"泱\\\",\\\"泓\\\",\\\"沽\\\",\\\"泗\\\",\\\"泅\\\",\\\"泝\\\",\\\"沮\\\",\\\"沱\\\",\\\"沾\\\",\\\"沺\\\",\\\"泛\\\",\\\"泯\\\",\\\"泙\\\",\\\"泪\\\",\\\"洟\\\",\\\"衍\\\",\\\"洶\\\",\\\"洫\\\",\\\"洽\\\",\\\"洸\\\",\\\"洙\\\",\\\"洵\\\",\\\"洳\\\",\\\"洒\\\",\\\"洌\\\",\\\"浣\\\",\\\"涓\\\",\\\"浤\\\",\\\"浚\\\",\\\"浹\\\",\\\"浙\\\",\\\"涎\\\",\\\"涕\\\",\\\"濤\\\",\\\"涅\\\",\\\"淹\\\",\\\"渕\\\",\\\"渊\\\",\\\"涵\\\",\\\"淇\\\",\\\"淦\\\",\\\"涸\\\",\\\"淆\\\",\\\"淬\\\",\\\"淞\\\",\\\"淌\\\",\\\"淨\\\",\\\"淒\\\",\\\"淅\\\",\\\"淺\\\",\\\"淙\\\",\\\"淤\\\",\\\"淕\\\",\\\"淪\\\",\\\"淮\\\",\\\"渭\\\",\\\"湮\\\",\\\"渮\\\",\\\"渙\\\",\\\"湲\\\",\\\"湟\\\",\\\"渾\\\",\\\"渣\\\",\\\"湫\\\",\\\"渫\\\",\\\"湶\\\",\\\"湍\\\",\\\"渟\\\",\\\"湃\\\",\\\"渺\\\",\\\"湎\\\",\\\"渤\\\",\\\"滿\\\",\\\"渝\\\",\\\"游\\\",\\\"溂\\\",\\\"溪\\\",\\\"溘\\\",\\\"滉\\\",\\\"溷\\\",\\\"滓\\\",\\\"溽\\\",\\\"溯\\\",\\\"滄\\\",\\\"溲\\\",\\\"滔\\\",\\\"滕\\\",\\\"溏\\\",\\\"溥\\\",\\\"滂\\\",\\\"溟\\\",\\\"潁\\\",\\\"漑\\\",\\\"灌\\\",\\\"滬\\\",\\\"滸\\\",\\\"滾\\\",\\\"漿\\\",\\\"滲\\\",\\\"漱\\\",\\\"滯\\\",\\\"漲\\\",\\\"滌\\\",\\\"漾\\\",\\\"漓\\\",\\\"滷\\\",\\\"澆\\\",\\\"潺\\\",\\\"潸\\\",\\\"澁\\\",\\\"澀\\\",\\\"潯\\\",\\\"潛\\\",\\\"濳\\\",\\\"潭\\\",\\\"澂\\\",\\\"潼\\\",\\\"潘\\\",\\\"澎\\\",\\\"澑\\\",\\\"濂\\\",\\\"潦\\\",\\\"澳\\\",\\\"澣\\\",\\\"澡\\\",\\\"澤\\\",\\\"澹\\\",\\\"濆\\\",\\\"澪\\\",\\\"濟\\\",\\\"濕\\\",\\\"濬\\\",\\\"濔\\\",\\\"濘\\\",\\\"濱\\\",\\\"濮\\\",\\\"濛\\\",\\\"瀉\\\",\\\"瀋\\\",\\\"濺\\\",\\\"瀑\\\",\\\"瀁\\\",\\\"瀏\\\",\\\"濾\\\",\\\"瀛\\\",\\\"瀚\\\",\\\"潴\\\",\\\"瀝\\\",\\\"瀘\\\",\\\"瀟\\\",\\\"瀰\\\",\\\"瀾\\\",\\\"瀲\\\",\\\"灑\\\",\\\"灣\\\",\\\"炙\\\",\\\"炒\\\",\\\"炯\\\",\\\"烱\\\",\\\"炬\\\",\\\"炸\\\",\\\"炳\\\",\\\"炮\\\",\\\"烟\\\",\\\"烋\\\",\\\"烝\\\",\\\"烙\\\",\\\"焉\\\",\\\"烽\\\",\\\"焜\\\",\\\"焙\\\",\\\"煥\\\",\\\"煕\\\",\\\"熈\\\",\\\"煦\\\",\\\"煢\\\",\\\"煌\\\",\\\"煖\\\",\\\"煬\\\",\\\"熏\\\",\\\"燻\\\",\\\"熄\\\",\\\"熕\\\",\\\"熨\\\",\\\"熬\\\",\\\"燗\\\",\\\"熹\\\",\\\"熾\\\",\\\"燒\\\",\\\"燉\\\",\\\"燔\\\",\\\"燎\\\",\\\"燠\\\",\\\"燬\\\",\\\"燧\\\",\\\"燵\\\",\\\"燼\\\",\\\"燹\\\",\\\"燿\\\",\\\"爍\\\",\\\"爐\\\",\\\"爛\\\",\\\"爨\\\",\\\"爭\\\",\\\"爬\\\",\\\"爰\\\",\\\"爲\\\",\\\"爻\\\",\\\"爼\\\",\\\"爿\\\",\\\"牀\\\",\\\"牆\\\",\\\"牋\\\",\\\"牘\\\",\\\"牴\\\",\\\"牾\\\",\\\"犂\\\",\\\"犁\\\",\\\"犇\\\",\\\"犒\\\",\\\"犖\\\",\\\"犢\\\",\\\"犧\\\",\\\"犹\\\",\\\"犲\\\",\\\"狃\\\",\\\"狆\\\",\\\"狄\\\",\\\"狎\\\",\\\"狒\\\",\\\"狢\\\",\\\"狠\\\",\\\"狡\\\",\\\"狹\\\",\\\"狷\\\",\\\"倏\\\",\\\"猗\\\",\\\"猊\\\",\\\"猜\\\",\\\"猖\\\",\\\"猝\\\",\\\"猴\\\",\\\"猯\\\",\\\"猩\\\",\\\"猥\\\",\\\"猾\\\",\\\"獎\\\",\\\"獏\\\",\\\"默\\\",\\\"獗\\\",\\\"獪\\\",\\\"獨\\\",\\\"獰\\\",\\\"獸\\\",\\\"獵\\\",\\\"獻\\\",\\\"獺\\\",\\\"珈\\\",\\\"玳\\\",\\\"珎\\\",\\\"玻\\\",\\\"珀\\\",\\\"珥\\\",\\\"珮\\\",\\\"珞\\\",\\\"璢\\\",\\\"琅\\\",\\\"瑯\\\",\\\"琥\\\",\\\"珸\\\",\\\"琲\\\",\\\"琺\\\",\\\"瑕\\\",\\\"琿\\\",\\\"瑟\\\",\\\"瑙\\\",\\\"瑁\\\",\\\"瑜\\\",\\\"瑩\\\",\\\"瑰\\\",\\\"瑣\\\",\\\"瑪\\\",\\\"瑶\\\",\\\"瑾\\\",\\\"璋\\\",\\\"璞\\\",\\\"璧\\\",\\\"瓊\\\",\\\"瓏\\\",\\\"瓔\\\",\\\"珱\\\",\\\"瓠\\\",\\\"瓣\\\",\\\"瓧\\\",\\\"瓩\\\",\\\"瓮\\\",\\\"瓲\\\",\\\"瓰\\\",\\\"瓱\\\",\\\"瓸\\\",\\\"瓷\\\",\\\"甄\\\",\\\"甃\\\",\\\"甅\\\",\\\"甌\\\",\\\"甎\\\",\\\"甍\\\",\\\"甕\\\",\\\"甓\\\",\\\"甞\\\",\\\"甦\\\",\\\"甬\\\",\\\"甼\\\",\\\"畄\\\",\\\"畍\\\",\\\"畊\\\",\\\"畉\\\",\\\"畛\\\",\\\"畆\\\",\\\"畚\\\",\\\"畩\\\",\\\"畤\\\",\\\"畧\\\",\\\"畫\\\",\\\"畭\\\",\\\"畸\\\",\\\"當\\\",\\\"疆\\\",\\\"疇\\\",\\\"畴\\\",\\\"疊\\\",\\\"疉\\\",\\\"疂\\\",\\\"疔\\\",\\\"疚\\\",\\\"疝\\\",\\\"疥\\\",\\\"疣\\\",\\\"痂\\\",\\\"疳\\\",\\\"痃\\\",\\\"疵\\\",\\\"疽\\\",\\\"疸\\\",\\\"疼\\\",\\\"疱\\\",\\\"痍\\\",\\\"痊\\\",\\\"痒\\\",\\\"痙\\\",\\\"痣\\\",\\\"痞\\\",\\\"痾\\\",\\\"痿\\\",\\\"痼\\\",\\\"瘁\\\",\\\"痰\\\",\\\"痺\\\",\\\"痲\\\",\\\"痳\\\",\\\"瘋\\\",\\\"瘍\\\",\\\"瘉\\\",\\\"瘟\\\",\\\"瘧\\\",\\\"瘠\\\",\\\"瘡\\\",\\\"瘢\\\",\\\"瘤\\\",\\\"瘴\\\",\\\"瘰\\\",\\\"瘻\\\",\\\"癇\\\",\\\"癈\\\",\\\"癆\\\",\\\"癜\\\",\\\"癘\\\",\\\"癡\\\",\\\"癢\\\",\\\"癨\\\",\\\"癩\\\",\\\"癪\\\",\\\"癧\\\",\\\"癬\\\",\\\"癰\\\",\\\"癲\\\",\\\"癶\\\",\\\"癸\\\",\\\"發\\\",\\\"皀\\\",\\\"皃\\\",\\\"皈\\\",\\\"皋\\\",\\\"皎\\\",\\\"皖\\\",\\\"皓\\\",\\\"皙\\\",\\\"皚\\\",\\\"皰\\\",\\\"皴\\\",\\\"皸\\\",\\\"皹\\\",\\\"皺\\\",\\\"盂\\\",\\\"盍\\\",\\\"盖\\\",\\\"盒\\\",\\\"盞\\\",\\\"盡\\\",\\\"盥\\\",\\\"盧\\\",\\\"盪\\\",\\\"蘯\\\",\\\"盻\\\",\\\"眈\\\",\\\"眇\\\",\\\"眄\\\",\\\"眩\\\",\\\"眤\\\",\\\"眞\\\",\\\"眥\\\",\\\"眦\\\",\\\"眛\\\",\\\"眷\\\",\\\"眸\\\",\\\"睇\\\",\\\"睚\\\",\\\"睨\\\",\\\"睫\\\",\\\"睛\\\",\\\"睥\\\",\\\"睿\\\",\\\"睾\\\",\\\"睹\\\",\\\"瞎\\\",\\\"瞋\\\",\\\"瞑\\\",\\\"瞠\\\",\\\"瞞\\\",\\\"瞰\\\",\\\"瞶\\\",\\\"瞹\\\",\\\"瞿\\\",\\\"瞼\\\",\\\"瞽\\\",\\\"瞻\\\",\\\"矇\\\",\\\"矍\\\",\\\"矗\\\",\\\"矚\\\",\\\"矜\\\",\\\"矣\\\",\\\"矮\\\",\\\"矼\\\",\\\"砌\\\",\\\"砒\\\",\\\"礦\\\",\\\"砠\\\",\\\"礪\\\",\\\"硅\\\",\\\"碎\\\",\\\"硴\\\",\\\"碆\\\",\\\"硼\\\",\\\"碚\\\",\\\"碌\\\",\\\"碣\\\",\\\"碵\\\",\\\"碪\\\",\\\"碯\\\",\\\"磑\\\",\\\"磆\\\",\\\"磋\\\",\\\"磔\\\",\\\"碾\\\",\\\"碼\\\",\\\"磅\\\",\\\"磊\\\",\\\"磬\\\",\\\"磧\\\",\\\"磚\\\",\\\"磽\\\",\\\"磴\\\",\\\"礇\\\",\\\"礒\\\",\\\"礑\\\",\\\"礙\\\",\\\"礬\\\",\\\"礫\\\",\\\"祀\\\",\\\"祠\\\",\\\"祗\\\",\\\"祟\\\",\\\"祚\\\",\\\"祕\\\",\\\"祓\\\",\\\"祺\\\",\\\"祿\\\",\\\"禊\\\",\\\"禝\\\",\\\"禧\\\",\\\"齋\\\",\\\"禪\\\",\\\"禮\\\",\\\"禳\\\",\\\"禹\\\",\\\"禺\\\",\\\"秉\\\",\\\"秕\\\",\\\"秧\\\",\\\"秬\\\",\\\"秡\\\",\\\"秣\\\",\\\"稈\\\",\\\"稍\\\",\\\"稘\\\",\\\"稙\\\",\\\"稠\\\",\\\"稟\\\",\\\"禀\\\",\\\"稱\\\",\\\"稻\\\",\\\"稾\\\",\\\"稷\\\",\\\"穃\\\",\\\"穗\\\",\\\"穉\\\",\\\"穡\\\",\\\"穢\\\",\\\"穩\\\",\\\"龝\\\",\\\"穰\\\",\\\"穹\\\",\\\"穽\\\",\\\"窈\\\",\\\"窗\\\",\\\"窕\\\",\\\"窘\\\",\\\"窖\\\",\\\"窩\\\",\\\"竈\\\",\\\"窰\\\",\\\"窶\\\",\\\"竅\\\",\\\"竄\\\",\\\"窿\\\",\\\"邃\\\",\\\"竇\\\",\\\"竊\\\",\\\"竍\\\",\\\"竏\\\",\\\"竕\\\",\\\"竓\\\",\\\"站\\\",\\\"竚\\\",\\\"竝\\\",\\\"竡\\\",\\\"竢\\\",\\\"竦\\\",\\\"竭\\\",\\\"竰\\\",\\\"笂\\\",\\\"笏\\\",\\\"笊\\\",\\\"笆\\\",\\\"笳\\\",\\\"笘\\\",\\\"笙\\\",\\\"笞\\\",\\\"笵\\\",\\\"笨\\\",\\\"笶\\\",\\\"筐\\\",\\\"筺\\\",\\\"笄\\\",\\\"筍\\\",\\\"笋\\\",\\\"筌\\\",\\\"筅\\\",\\\"筵\\\",\\\"筥\\\",\\\"筴\\\",\\\"筧\\\",\\\"筰\\\",\\\"筱\\\",\\\"筬\\\",\\\"筮\\\",\\\"箝\\\",\\\"箘\\\",\\\"箟\\\",\\\"箍\\\",\\\"箜\\\",\\\"箚\\\",\\\"箋\\\",\\\"箒\\\",\\\"箏\\\",\\\"筝\\\",\\\"箙\\\",\\\"篋\\\",\\\"篁\\\",\\\"篌\\\",\\\"篏\\\",\\\"箴\\\",\\\"篆\\\",\\\"篝\\\",\\\"篩\\\",\\\"簑\\\",\\\"簔\\\",\\\"篦\\\",\\\"篥\\\",\\\"籠\\\",\\\"簀\\\",\\\"簇\\\",\\\"簓\\\",\\\"篳\\\",\\\"篷\\\",\\\"簗\\\",\\\"簍\\\",\\\"篶\\\",\\\"簣\\\",\\\"簧\\\",\\\"簪\\\",\\\"簟\\\",\\\"簷\\\",\\\"簫\\\",\\\"簽\\\",\\\"籌\\\",\\\"籃\\\",\\\"籔\\\",\\\"籏\\\",\\\"籀\\\",\\\"籐\\\",\\\"籘\\\",\\\"籟\\\",\\\"籤\\\",\\\"籖\\\",\\\"籥\\\",\\\"籬\\\",\\\"籵\\\",\\\"粃\\\",\\\"粐\\\",\\\"粤\\\",\\\"粭\\\",\\\"粢\\\",\\\"粫\\\",\\\"粡\\\",\\\"粨\\\",\\\"粳\\\",\\\"粲\\\",\\\"粱\\\",\\\"粮\\\",\\\"粹\\\",\\\"粽\\\",\\\"糀\\\",\\\"糅\\\",\\\"糂\\\",\\\"糘\\\",\\\"糒\\\",\\\"糜\\\",\\\"糢\\\",\\\"鬻\\\",\\\"糯\\\",\\\"糲\\\",\\\"糴\\\",\\\"糶\\\",\\\"糺\\\",\\\"紆\\\",\\\"紂\\\",\\\"紜\\\",\\\"紕\\\",\\\"紊\\\",\\\"絅\\\",\\\"絋\\\",\\\"紮\\\",\\\"紲\\\",\\\"紿\\\",\\\"紵\\\",\\\"絆\\\",\\\"絳\\\",\\\"絖\\\",\\\"絎\\\",\\\"絲\\\",\\\"絨\\\",\\\"絮\\\",\\\"絏\\\",\\\"絣\\\",\\\"經\\\",\\\"綉\\\",\\\"絛\\\",\\\"綏\\\",\\\"絽\\\",\\\"綛\\\",\\\"綺\\\",\\\"綮\\\",\\\"綣\\\",\\\"綵\\\",\\\"緇\\\",\\\"綽\\\",\\\"綫\\\",\\\"總\\\",\\\"綢\\\",\\\"綯\\\",\\\"緜\\\",\\\"綸\\\",\\\"綟\\\",\\\"綰\\\",\\\"緘\\\",\\\"緝\\\",\\\"緤\\\",\\\"緞\\\",\\\"緻\\\",\\\"緲\\\",\\\"緡\\\",\\\"縅\\\",\\\"縊\\\",\\\"縣\\\",\\\"縡\\\",\\\"縒\\\",\\\"縱\\\",\\\"縟\\\",\\\"縉\\\",\\\"縋\\\",\\\"縢\\\",\\\"繆\\\",\\\"繦\\\",\\\"縻\\\",\\\"縵\\\",\\\"縹\\\",\\\"繃\\\",\\\"縷\\\",\\\"縲\\\",\\\"縺\\\",\\\"繧\\\",\\\"繝\\\",\\\"繖\\\",\\\"繞\\\",\\\"繙\\\",\\\"繚\\\",\\\"繹\\\",\\\"繪\\\",\\\"繩\\\",\\\"繼\\\",\\\"繻\\\",\\\"纃\\\",\\\"緕\\\",\\\"繽\\\",\\\"辮\\\",\\\"繿\\\",\\\"纈\\\",\\\"纉\\\",\\\"續\\\",\\\"纒\\\",\\\"纐\\\",\\\"纓\\\",\\\"纔\\\",\\\"纖\\\",\\\"纎\\\",\\\"纛\\\",\\\"纜\\\",\\\"缸\\\",\\\"缺\\\",\\\"罅\\\",\\\"罌\\\",\\\"罍\\\",\\\"罎\\\",\\\"罐\\\",\\\"网\\\",\\\"罕\\\",\\\"罔\\\",\\\"罘\\\",\\\"罟\\\",\\\"罠\\\",\\\"罨\\\",\\\"罩\\\",\\\"罧\\\",\\\"罸\\\",\\\"羂\\\",\\\"羆\\\",\\\"羃\\\",\\\"羈\\\",\\\"羇\\\",\\\"羌\\\",\\\"羔\\\",\\\"羞\\\",\\\"羝\\\",\\\"羚\\\",\\\"羣\\\",\\\"羯\\\",\\\"羲\\\",\\\"羹\\\",\\\"羮\\\",\\\"羶\\\",\\\"羸\\\",\\\"譱\\\",\\\"翅\\\",\\\"翆\\\",\\\"翊\\\",\\\"翕\\\",\\\"翔\\\",\\\"翡\\\",\\\"翦\\\",\\\"翩\\\",\\\"翳\\\",\\\"翹\\\",\\\"飜\\\",\\\"耆\\\",\\\"耄\\\",\\\"耋\\\",\\\"耒\\\",\\\"耘\\\",\\\"耙\\\",\\\"耜\\\",\\\"耡\\\",\\\"耨\\\",\\\"耿\\\",\\\"耻\\\",\\\"聊\\\",\\\"聆\\\",\\\"聒\\\",\\\"聘\\\",\\\"聚\\\",\\\"聟\\\",\\\"聢\\\",\\\"聨\\\",\\\"聳\\\",\\\"聲\\\",\\\"聰\\\",\\\"聶\\\",\\\"聹\\\",\\\"聽\\\",\\\"聿\\\",\\\"肄\\\",\\\"肆\\\",\\\"肅\\\",\\\"肛\\\",\\\"肓\\\",\\\"肚\\\",\\\"肭\\\",\\\"冐\\\",\\\"肬\\\",\\\"胛\\\",\\\"胥\\\",\\\"胙\\\",\\\"胝\\\",\\\"胄\\\",\\\"胚\\\",\\\"胖\\\",\\\"脉\\\",\\\"胯\\\",\\\"胱\\\",\\\"脛\\\",\\\"脩\\\",\\\"脣\\\",\\\"脯\\\",\\\"腋\\\",\\\"隋\\\",\\\"腆\\\",\\\"脾\\\",\\\"腓\\\",\\\"腑\\\",\\\"胼\\\",\\\"腱\\\",\\\"腮\\\",\\\"腥\\\",\\\"腦\\\",\\\"腴\\\",\\\"膃\\\",\\\"膈\\\",\\\"膊\\\",\\\"膀\\\",\\\"膂\\\",\\\"膠\\\",\\\"膕\\\",\\\"膤\\\",\\\"膣\\\",\\\"腟\\\",\\\"膓\\\",\\\"膩\\\",\\\"膰\\\",\\\"膵\\\",\\\"膾\\\",\\\"膸\\\",\\\"膽\\\",\\\"臀\\\",\\\"臂\\\",\\\"膺\\\",\\\"臉\\\",\\\"臍\\\",\\\"臑\\\",\\\"臙\\\",\\\"臘\\\",\\\"臈\\\",\\\"臚\\\",\\\"臟\\\",\\\"臠\\\",\\\"臧\\\",\\\"臺\\\",\\\"臻\\\",\\\"臾\\\",\\\"舁\\\",\\\"舂\\\",\\\"舅\\\",\\\"與\\\",\\\"舊\\\",\\\"舍\\\",\\\"舐\\\",\\\"舖\\\",\\\"舩\\\",\\\"舫\\\",\\\"舸\\\",\\\"舳\\\",\\\"艀\\\",\\\"艙\\\",\\\"艘\\\",\\\"艝\\\",\\\"艚\\\",\\\"艟\\\",\\\"艤\\\",\\\"艢\\\",\\\"艨\\\",\\\"艪\\\",\\\"艫\\\",\\\"舮\\\",\\\"艱\\\",\\\"艷\\\",\\\"艸\\\",\\\"艾\\\",\\\"芍\\\",\\\"芒\\\",\\\"芫\\\",\\\"芟\\\",\\\"芻\\\",\\\"芬\\\",\\\"苡\\\",\\\"苣\\\",\\\"苟\\\",\\\"苒\\\",\\\"苴\\\",\\\"苳\\\",\\\"苺\\\",\\\"莓\\\",\\\"范\\\",\\\"苻\\\",\\\"苹\\\",\\\"苞\\\",\\\"茆\\\",\\\"苜\\\",\\\"茉\\\",\\\"苙\\\",\\\"茵\\\",\\\"茴\\\",\\\"茖\\\",\\\"茲\\\",\\\"茱\\\",\\\"荀\\\",\\\"茹\\\",\\\"荐\\\",\\\"荅\\\",\\\"茯\\\",\\\"茫\\\",\\\"茗\\\",\\\"茘\\\",\\\"莅\\\",\\\"莚\\\",\\\"莪\\\",\\\"莟\\\",\\\"莢\\\",\\\"莖\\\",\\\"茣\\\",\\\"莎\\\",\\\"莇\\\",\\\"莊\\\",\\\"荼\\\",\\\"莵\\\",\\\"荳\\\",\\\"荵\\\",\\\"莠\\\",\\\"莉\\\",\\\"莨\\\",\\\"菴\\\",\\\"萓\\\",\\\"菫\\\",\\\"菎\\\",\\\"菽\\\",\\\"萃\\\",\\\"菘\\\",\\\"萋\\\",\\\"菁\\\",\\\"菷\\\",\\\"萇\\\",\\\"菠\\\",\\\"菲\\\",\\\"萍\\\",\\\"萢\\\",\\\"萠\\\",\\\"莽\\\",\\\"萸\\\",\\\"蔆\\\",\\\"菻\\\",\\\"葭\\\",\\\"萪\\\",\\\"萼\\\",\\\"蕚\\\",\\\"蒄\\\",\\\"葷\\\",\\\"葫\\\",\\\"蒭\\\",\\\"葮\\\",\\\"蒂\\\",\\\"葩\\\",\\\"葆\\\",\\\"萬\\\",\\\"葯\\\",\\\"葹\\\",\\\"萵\\\",\\\"蓊\\\",\\\"葢\\\",\\\"蒹\\\",\\\"蒿\\\",\\\"蒟\\\",\\\"蓙\\\",\\\"蓍\\\",\\\"蒻\\\",\\\"蓚\\\",\\\"蓐\\\",\\\"蓁\\\",\\\"蓆\\\",\\\"蓖\\\",\\\"蒡\\\",\\\"蔡\\\",\\\"蓿\\\",\\\"蓴\\\",\\\"蔗\\\",\\\"蔘\\\",\\\"蔬\\\",\\\"蔟\\\",\\\"蔕\\\",\\\"蔔\\\",\\\"蓼\\\",\\\"蕀\\\",\\\"蕣\\\",\\\"蕘\\\",\\\"蕈\\\",\\\"蕁\\\",\\\"蘂\\\",\\\"蕋\\\",\\\"蕕\\\",\\\"薀\\\",\\\"薤\\\",\\\"薈\\\",\\\"薑\\\",\\\"薊\\\",\\\"薨\\\",\\\"蕭\\\",\\\"薔\\\",\\\"薛\\\",\\\"藪\\\",\\\"薇\\\",\\\"薜\\\",\\\"蕷\\\",\\\"蕾\\\",\\\"薐\\\",\\\"藉\\\",\\\"薺\\\",\\\"藏\\\",\\\"薹\\\",\\\"藐\\\",\\\"藕\\\",\\\"藝\\\",\\\"藥\\\",\\\"藜\\\",\\\"藹\\\",\\\"蘊\\\",\\\"蘓\\\",\\\"蘋\\\",\\\"藾\\\",\\\"藺\\\",\\\"蘆\\\",\\\"蘢\\\",\\\"蘚\\\",\\\"蘰\\\",\\\"蘿\\\",\\\"虍\\\",\\\"乕\\\",\\\"虔\\\",\\\"號\\\",\\\"虧\\\",\\\"虱\\\",\\\"蚓\\\",\\\"蚣\\\",\\\"蚩\\\",\\\"蚪\\\",\\\"蚋\\\",\\\"蚌\\\",\\\"蚶\\\",\\\"蚯\\\",\\\"蛄\\\",\\\"蛆\\\",\\\"蚰\\\",\\\"蛉\\\",\\\"蠣\\\",\\\"蚫\\\",\\\"蛔\\\",\\\"蛞\\\",\\\"蛩\\\",\\\"蛬\\\",\\\"蛟\\\",\\\"蛛\\\",\\\"蛯\\\",\\\"蜒\\\",\\\"蜆\\\",\\\"蜈\\\",\\\"蜀\\\",\\\"蜃\\\",\\\"蛻\\\",\\\"蜑\\\",\\\"蜉\\\",\\\"蜍\\\",\\\"蛹\\\",\\\"蜊\\\",\\\"蜴\\\",\\\"蜿\\\",\\\"蜷\\\",\\\"蜻\\\",\\\"蜥\\\",\\\"蜩\\\",\\\"蜚\\\",\\\"蝠\\\",\\\"蝟\\\",\\\"蝸\\\",\\\"蝌\\\",\\\"蝎\\\",\\\"蝴\\\",\\\"蝗\\\",\\\"蝨\\\",\\\"蝮\\\",\\\"蝙\\\",\\\"蝓\\\",\\\"蝣\\\",\\\"蝪\\\",\\\"蠅\\\",\\\"螢\\\",\\\"螟\\\",\\\"螂\\\",\\\"螯\\\",\\\"蟋\\\",\\\"螽\\\",\\\"蟀\\\",\\\"蟐\\\",\\\"雖\\\",\\\"螫\\\",\\\"蟄\\\",\\\"螳\\\",\\\"蟇\\\",\\\"蟆\\\",\\\"螻\\\",\\\"蟯\\\",\\\"蟲\\\",\\\"蟠\\\",\\\"蠏\\\",\\\"蠍\\\",\\\"蟾\\\",\\\"蟶\\\",\\\"蟷\\\",\\\"蠎\\\",\\\"蟒\\\",\\\"蠑\\\",\\\"蠖\\\",\\\"蠕\\\",\\\"蠢\\\",\\\"蠡\\\",\\\"蠱\\\",\\\"蠶\\\",\\\"蠹\\\",\\\"蠧\\\",\\\"蠻\\\",\\\"衄\\\",\\\"衂\\\",\\\"衒\\\",\\\"衙\\\",\\\"衞\\\",\\\"衢\\\",\\\"衫\\\",\\\"袁\\\",\\\"衾\\\",\\\"袞\\\",\\\"衵\\\",\\\"衽\\\",\\\"袵\\\",\\\"衲\\\",\\\"袂\\\",\\\"袗\\\",\\\"袒\\\",\\\"袮\\\",\\\"袙\\\",\\\"袢\\\",\\\"袍\\\",\\\"袤\\\",\\\"袰\\\",\\\"袿\\\",\\\"袱\\\",\\\"裃\\\",\\\"裄\\\",\\\"裔\\\",\\\"裘\\\",\\\"裙\\\",\\\"裝\\\",\\\"裹\\\",\\\"褂\\\",\\\"裼\\\",\\\"裴\\\",\\\"裨\\\",\\\"裲\\\",\\\"褄\\\",\\\"褌\\\",\\\"褊\\\",\\\"褓\\\",\\\"襃\\\",\\\"褞\\\",\\\"褥\\\",\\\"褪\\\",\\\"褫\\\",\\\"襁\\\",\\\"襄\\\",\\\"褻\\\",\\\"褶\\\",\\\"褸\\\",\\\"襌\\\",\\\"褝\\\",\\\"襠\\\",\\\"襞\\\",\\\"襦\\\",\\\"襤\\\",\\\"襭\\\",\\\"襪\\\",\\\"襯\\\",\\\"襴\\\",\\\"襷\\\",\\\"襾\\\",\\\"覃\\\",\\\"覈\\\",\\\"覊\\\",\\\"覓\\\",\\\"覘\\\",\\\"覡\\\",\\\"覩\\\",\\\"覦\\\",\\\"覬\\\",\\\"覯\\\",\\\"覲\\\",\\\"覺\\\",\\\"覽\\\",\\\"覿\\\",\\\"觀\\\",\\\"觚\\\",\\\"觜\\\",\\\"觝\\\",\\\"觧\\\",\\\"觴\\\",\\\"觸\\\",\\\"訃\\\",\\\"訖\\\",\\\"訐\\\",\\\"訌\\\",\\\"訛\\\",\\\"訝\\\",\\\"訥\\\",\\\"訶\\\",\\\"詁\\\",\\\"詛\\\",\\\"詒\\\",\\\"詆\\\",\\\"詈\\\",\\\"詼\\\",\\\"詭\\\",\\\"詬\\\",\\\"詢\\\",\\\"誅\\\",\\\"誂\\\",\\\"誄\\\",\\\"誨\\\",\\\"誡\\\",\\\"誑\\\",\\\"誥\\\",\\\"誦\\\",\\\"誚\\\",\\\"誣\\\",\\\"諄\\\",\\\"諍\\\",\\\"諂\\\",\\\"諚\\\",\\\"諫\\\",\\\"諳\\\",\\\"諧\\\",\\\"諤\\\",\\\"諱\\\",\\\"謔\\\",\\\"諠\\\",\\\"諢\\\",\\\"諷\\\",\\\"諞\\\",\\\"諛\\\",\\\"謌\\\",\\\"謇\\\",\\\"謚\\\",\\\"諡\\\",\\\"謖\\\",\\\"謐\\\",\\\"謗\\\",\\\"謠\\\",\\\"謳\\\",\\\"鞫\\\",\\\"謦\\\",\\\"謫\\\",\\\"謾\\\",\\\"謨\\\",\\\"譁\\\",\\\"譌\\\",\\\"譏\\\",\\\"譎\\\",\\\"證\\\",\\\"譖\\\",\\\"譛\\\",\\\"譚\\\",\\\"譫\\\",\\\"譟\\\",\\\"譬\\\",\\\"譯\\\",\\\"譴\\\",\\\"譽\\\",\\\"讀\\\",\\\"讌\\\",\\\"讎\\\",\\\"讒\\\",\\\"讓\\\",\\\"讖\\\",\\\"讙\\\",\\\"讚\\\",\\\"谺\\\",\\\"豁\\\",\\\"谿\\\",\\\"豈\\\",\\\"豌\\\",\\\"豎\\\",\\\"豐\\\",\\\"豕\\\",\\\"豢\\\",\\\"豬\\\",\\\"豸\\\",\\\"豺\\\",\\\"貂\\\",\\\"貉\\\",\\\"貅\\\",\\\"貊\\\",\\\"貍\\\",\\\"貎\\\",\\\"貔\\\",\\\"豼\\\",\\\"貘\\\",\\\"戝\\\",\\\"貭\\\",\\\"貪\\\",\\\"貽\\\",\\\"貲\\\",\\\"貳\\\",\\\"貮\\\",\\\"貶\\\",\\\"賈\\\",\\\"賁\\\",\\\"賤\\\",\\\"賣\\\",\\\"賚\\\",\\\"賽\\\",\\\"賺\\\",\\\"賻\\\",\\\"贄\\\",\\\"贅\\\",\\\"贊\\\",\\\"贇\\\",\\\"贏\\\",\\\"贍\\\",\\\"贐\\\",\\\"齎\\\",\\\"贓\\\",\\\"賍\\\",\\\"贔\\\",\\\"贖\\\",\\\"赧\\\",\\\"赭\\\",\\\"赱\\\",\\\"赳\\\",\\\"趁\\\",\\\"趙\\\",\\\"跂\\\",\\\"趾\\\",\\\"趺\\\",\\\"跏\\\",\\\"跚\\\",\\\"跖\\\",\\\"跌\\\",\\\"跛\\\",\\\"跋\\\",\\\"跪\\\",\\\"跫\\\",\\\"跟\\\",\\\"跣\\\",\\\"跼\\\",\\\"踈\\\",\\\"踉\\\",\\\"跿\\\",\\\"踝\\\",\\\"踞\\\",\\\"踐\\\",\\\"踟\\\",\\\"蹂\\\",\\\"踵\\\",\\\"踰\\\",\\\"踴\\\",\\\"蹊\\\",\\\"蹇\\\",\\\"蹉\\\",\\\"蹌\\\",\\\"蹐\\\",\\\"蹈\\\",\\\"蹙\\\",\\\"蹤\\\",\\\"蹠\\\",\\\"踪\\\",\\\"蹣\\\",\\\"蹕\\\",\\\"蹶\\\",\\\"蹲\\\",\\\"蹼\\\",\\\"躁\\\",\\\"躇\\\",\\\"躅\\\",\\\"躄\\\",\\\"躋\\\",\\\"躊\\\",\\\"躓\\\",\\\"躑\\\",\\\"躔\\\",\\\"躙\\\",\\\"躪\\\",\\\"躡\\\",\\\"躬\\\",\\\"躰\\\",\\\"軆\\\",\\\"躱\\\",\\\"躾\\\",\\\"軅\\\",\\\"軈\\\",\\\"軋\\\",\\\"軛\\\",\\\"軣\\\",\\\"軼\\\",\\\"軻\\\",\\\"軫\\\",\\\"軾\\\",\\\"輊\\\",\\\"輅\\\",\\\"輕\\\",\\\"輒\\\",\\\"輙\\\",\\\"輓\\\",\\\"輜\\\",\\\"輟\\\",\\\"輛\\\",\\\"輌\\\",\\\"輦\\\",\\\"輳\\\",\\\"輻\\\",\\\"輹\\\",\\\"轅\\\",\\\"轂\\\",\\\"輾\\\",\\\"轌\\\",\\\"轉\\\",\\\"轆\\\",\\\"轎\\\",\\\"轗\\\",\\\"轜\\\",\\\"轢\\\",\\\"轣\\\",\\\"轤\\\",\\\"辜\\\",\\\"辟\\\",\\\"辣\\\",\\\"辭\\\",\\\"辯\\\",\\\"辷\\\",\\\"迚\\\",\\\"迥\\\",\\\"迢\\\",\\\"迪\\\",\\\"迯\\\",\\\"邇\\\",\\\"迴\\\",\\\"逅\\\",\\\"迹\\\",\\\"迺\\\",\\\"逑\\\",\\\"逕\\\",\\\"逡\\\",\\\"逍\\\",\\\"逞\\\",\\\"逖\\\",\\\"逋\\\",\\\"逧\\\",\\\"逶\\\",\\\"逵\\\",\\\"逹\\\",\\\"迸\\\",\\\"遏\\\",\\\"遐\\\",\\\"遑\\\",\\\"遒\\\",\\\"逎\\\",\\\"遉\\\",\\\"逾\\\",\\\"遖\\\",\\\"遘\\\",\\\"遞\\\",\\\"遨\\\",\\\"遯\\\",\\\"遶\\\",\\\"隨\\\",\\\"遲\\\",\\\"邂\\\",\\\"遽\\\",\\\"邁\\\",\\\"邀\\\",\\\"邊\\\",\\\"邉\\\",\\\"邏\\\",\\\"邨\\\",\\\"邯\\\",\\\"邱\\\",\\\"邵\\\",\\\"郢\\\",\\\"郤\\\",\\\"扈\\\",\\\"郛\\\",\\\"鄂\\\",\\\"鄒\\\",\\\"鄙\\\",\\\"鄲\\\",\\\"鄰\\\",\\\"酊\\\",\\\"酖\\\",\\\"酘\\\",\\\"酣\\\",\\\"酥\\\",\\\"酩\\\",\\\"酳\\\",\\\"酲\\\",\\\"醋\\\",\\\"醉\\\",\\\"醂\\\",\\\"醢\\\",\\\"醫\\\",\\\"醯\\\",\\\"醪\\\",\\\"醵\\\",\\\"醴\\\",\\\"醺\\\",\\\"釀\\\",\\\"釁\\\",\\\"釉\\\",\\\"釋\\\",\\\"釐\\\",\\\"釖\\\",\\\"釟\\\",\\\"釡\\\",\\\"釛\\\",\\\"釼\\\",\\\"釵\\\",\\\"釶\\\",\\\"鈞\\\",\\\"釿\\\",\\\"鈔\\\",\\\"鈬\\\",\\\"鈕\\\",\\\"鈑\\\",\\\"鉞\\\",\\\"鉗\\\",\\\"鉅\\\",\\\"鉉\\\",\\\"鉤\\\",\\\"鉈\\\",\\\"銕\\\",\\\"鈿\\\",\\\"鉋\\\",\\\"鉐\\\",\\\"銜\\\",\\\"銖\\\",\\\"銓\\\",\\\"銛\\\",\\\"鉚\\\",\\\"鋏\\\",\\\"銹\\\",\\\"銷\\\",\\\"鋩\\\",\\\"錏\\\",\\\"鋺\\\",\\\"鍄\\\",\\\"錮\\\",\\\"錙\\\",\\\"錢\\\",\\\"錚\\\",\\\"錣\\\",\\\"錺\\\",\\\"錵\\\",\\\"錻\\\",\\\"鍜\\\",\\\"鍠\\\",\\\"鍼\\\",\\\"鍮\\\",\\\"鍖\\\",\\\"鎰\\\",\\\"鎬\\\",\\\"鎭\\\",\\\"鎔\\\",\\\"鎹\\\",\\\"鏖\\\",\\\"鏗\\\",\\\"鏨\\\",\\\"鏥\\\",\\\"鏘\\\",\\\"鏃\\\",\\\"鏝\\\",\\\"鏐\\\",\\\"鏈\\\",\\\"鏤\\\",\\\"鐚\\\",\\\"鐔\\\",\\\"鐓\\\",\\\"鐃\\\",\\\"鐇\\\",\\\"鐐\\\",\\\"鐶\\\",\\\"鐫\\\",\\\"鐵\\\",\\\"鐡\\\",\\\"鐺\\\",\\\"鑁\\\",\\\"鑒\\\",\\\"鑄\\\",\\\"鑛\\\",\\\"鑠\\\",\\\"鑢\\\",\\\"鑞\\\",\\\"鑪\\\",\\\"鈩\\\",\\\"鑰\\\",\\\"鑵\\\",\\\"鑷\\\",\\\"鑽\\\",\\\"鑚\\\",\\\"鑼\\\",\\\"鑾\\\",\\\"钁\\\",\\\"鑿\\\",\\\"閂\\\",\\\"閇\\\",\\\"閊\\\",\\\"閔\\\",\\\"閖\\\",\\\"閘\\\",\\\"閙\\\",\\\"閠\\\",\\\"閨\\\",\\\"閧\\\",\\\"閭\\\",\\\"閼\\\",\\\"閻\\\",\\\"閹\\\",\\\"閾\\\",\\\"闊\\\",\\\"濶\\\",\\\"闃\\\",\\\"闍\\\",\\\"闌\\\",\\\"闕\\\",\\\"闔\\\",\\\"闖\\\",\\\"關\\\",\\\"闡\\\",\\\"闥\\\",\\\"闢\\\",\\\"阡\\\",\\\"阨\\\",\\\"阮\\\",\\\"阯\\\",\\\"陂\\\",\\\"陌\\\",\\\"陏\\\",\\\"陋\\\",\\\"陷\\\",\\\"陜\\\",\\\"陞\\\",\\\"陝\\\",\\\"陟\\\",\\\"陦\\\",\\\"陲\\\",\\\"陬\\\",\\\"隍\\\",\\\"隘\\\",\\\"隕\\\",\\\"隗\\\",\\\"險\\\",\\\"隧\\\",\\\"隱\\\",\\\"隲\\\",\\\"隰\\\",\\\"隴\\\",\\\"隶\\\",\\\"隸\\\",\\\"隹\\\",\\\"雎\\\",\\\"雋\\\",\\\"雉\\\",\\\"雍\\\",\\\"襍\\\",\\\"雜\\\",\\\"霍\\\",\\\"雕\\\",\\\"雹\\\",\\\"霄\\\",\\\"霆\\\",\\\"霈\\\",\\\"霓\\\",\\\"霎\\\",\\\"霑\\\",\\\"霏\\\",\\\"霖\\\",\\\"霙\\\",\\\"霤\\\",\\\"霪\\\",\\\"霰\\\",\\\"霹\\\",\\\"霽\\\",\\\"霾\\\",\\\"靄\\\",\\\"靆\\\",\\\"靈\\\",\\\"靂\\\",\\\"靉\\\",\\\"靜\\\",\\\"靠\\\",\\\"靤\\\",\\\"靦\\\",\\\"靨\\\",\\\"勒\\\",\\\"靫\\\",\\\"靱\\\",\\\"靹\\\",\\\"鞅\\\",\\\"靼\\\",\\\"鞁\\\",\\\"靺\\\",\\\"鞆\\\",\\\"鞋\\\",\\\"鞏\\\",\\\"鞐\\\",\\\"鞜\\\",\\\"鞨\\\",\\\"鞦\\\",\\\"鞣\\\",\\\"鞳\\\",\\\"鞴\\\",\\\"韃\\\",\\\"韆\\\",\\\"韈\\\",\\\"韋\\\",\\\"韜\\\",\\\"韭\\\",\\\"齏\\\",\\\"韲\\\",\\\"竟\\\",\\\"韶\\\",\\\"韵\\\",\\\"頏\\\",\\\"頌\\\",\\\"頸\\\",\\\"頤\\\",\\\"頡\\\",\\\"頷\\\",\\\"頽\\\",\\\"顆\\\",\\\"顏\\\",\\\"顋\\\",\\\"顫\\\",\\\"顯\\\",\\\"顰\\\",\\\"顱\\\",\\\"顴\\\",\\\"顳\\\",\\\"颪\\\",\\\"颯\\\",\\\"颱\\\",\\\"颶\\\",\\\"飄\\\",\\\"飃\\\",\\\"飆\\\",\\\"飩\\\",\\\"飫\\\",\\\"餃\\\",\\\"餉\\\",\\\"餒\\\",\\\"餔\\\",\\\"餘\\\",\\\"餡\\\",\\\"餝\\\",\\\"餞\\\",\\\"餤\\\",\\\"餠\\\",\\\"餬\\\",\\\"餮\\\",\\\"餽\\\",\\\"餾\\\",\\\"饂\\\",\\\"饉\\\",\\\"饅\\\",\\\"饐\\\",\\\"饋\\\",\\\"饑\\\",\\\"饒\\\",\\\"饌\\\",\\\"饕\\\",\\\"馗\\\",\\\"馘\\\",\\\"馥\\\",\\\"馭\\\",\\\"馮\\\",\\\"馼\\\",\\\"駟\\\",\\\"駛\\\",\\\"駝\\\",\\\"駘\\\",\\\"駑\\\",\\\"駭\\\",\\\"駮\\\",\\\"駱\\\",\\\"駲\\\",\\\"駻\\\",\\\"駸\\\",\\\"騁\\\",\\\"騏\\\",\\\"騅\\\",\\\"駢\\\",\\\"騙\\\",\\\"騫\\\",\\\"騷\\\",\\\"驅\\\",\\\"驂\\\",\\\"驀\\\",\\\"驃\\\",\\\"騾\\\",\\\"驕\\\",\\\"驍\\\",\\\"驛\\\",\\\"驗\\\",\\\"驟\\\",\\\"驢\\\",\\\"驥\\\",\\\"驤\\\",\\\"驩\\\",\\\"驫\\\",\\\"驪\\\",\\\"骭\\\",\\\"骰\\\",\\\"骼\\\",\\\"髀\\\",\\\"髏\\\",\\\"髑\\\",\\\"髓\\\",\\\"體\\\",\\\"髞\\\",\\\"髟\\\",\\\"髢\\\",\\\"髣\\\",\\\"髦\\\",\\\"髯\\\",\\\"髫\\\",\\\"髮\\\",\\\"髴\\\",\\\"髱\\\",\\\"髷\\\",\\\"髻\\\",\\\"鬆\\\",\\\"鬘\\\",\\\"鬚\\\",\\\"鬟\\\",\\\"鬢\\\",\\\"鬣\\\",\\\"鬥\\\",\\\"鬧\\\",\\\"鬨\\\",\\\"鬩\\\",\\\"鬪\\\",\\\"鬮\\\",\\\"鬯\\\",\\\"鬲\\\",\\\"魄\\\",\\\"魃\\\",\\\"魏\\\",\\\"魍\\\",\\\"魎\\\",\\\"魑\\\",\\\"魘\\\",\\\"魴\\\",\\\"鮓\\\",\\\"鮃\\\",\\\"鮑\\\",\\\"鮖\\\",\\\"鮗\\\",\\\"鮟\\\",\\\"鮠\\\",\\\"鮨\\\",\\\"鮴\\\",\\\"鯀\\\",\\\"鯊\\\",\\\"鮹\\\",\\\"鯆\\\",\\\"鯏\\\",\\\"鯑\\\",\\\"鯒\\\",\\\"鯣\\\",\\\"鯢\\\",\\\"鯤\\\",\\\"鯔\\\",\\\"鯡\\\",\\\"鰺\\\",\\\"鯲\\\",\\\"鯱\\\",\\\"鯰\\\",\\\"鰕\\\",\\\"鰔\\\",\\\"鰉\\\",\\\"鰓\\\",\\\"鰌\\\",\\\"鰆\\\",\\\"鰈\\\",\\\"鰒\\\",\\\"鰊\\\",\\\"鰄\\\",\\\"鰮\\\",\\\"鰛\\\",\\\"鰥\\\",\\\"鰤\\\",\\\"鰡\\\",\\\"鰰\\\",\\\"鱇\\\",\\\"鰲\\\",\\\"鱆\\\",\\\"鰾\\\",\\\"鱚\\\",\\\"鱠\\\",\\\"鱧\\\",\\\"鱶\\\",\\\"鱸\\\",\\\"鳧\\\",\\\"鳬\\\",\\\"鳰\\\",\\\"鴉\\\",\\\"鴈\\\",\\\"鳫\\\",\\\"鴃\\\",\\\"鴆\\\",\\\"鴪\\\",\\\"鴦\\\",\\\"鶯\\\",\\\"鴣\\\",\\\"鴟\\\",\\\"鵄\\\",\\\"鴕\\\",\\\"鴒\\\",\\\"鵁\\\",\\\"鴿\\\",\\\"鴾\\\",\\\"鵆\\\",\\\"鵈\\\",\\\"鵝\\\",\\\"鵞\\\",\\\"鵤\\\",\\\"鵑\\\",\\\"鵐\\\",\\\"鵙\\\",\\\"鵲\\\",\\\"鶉\\\",\\\"鶇\\\",\\\"鶫\\\",\\\"鵯\\\",\\\"鵺\\\",\\\"鶚\\\",\\\"鶤\\\",\\\"鶩\\\",\\\"鶲\\\",\\\"鷄\\\",\\\"鷁\\\",\\\"鶻\\\",\\\"鶸\\\",\\\"鶺\\\",\\\"鷆\\\",\\\"鷏\\\",\\\"鷂\\\",\\\"鷙\\\",\\\"鷓\\\",\\\"鷸\\\",\\\"鷦\\\",\\\"鷭\\\",\\\"鷯\\\",\\\"鷽\\\",\\\"鸚\\\",\\\"鸛\\\",\\\"鸞\\\",\\\"鹵\\\",\\\"鹹\\\",\\\"鹽\\\",\\\"麁\\\",\\\"麈\\\",\\\"麋\\\",\\\"麌\\\",\\\"麒\\\",\\\"麕\\\",\\\"麑\\\",\\\"麝\\\",\\\"麥\\\",\\\"麩\\\",\\\"麸\\\",\\\"麪\\\",\\\"麭\\\",\\\"靡\\\",\\\"黌\\\",\\\"黎\\\",\\\"黏\\\",\\\"黐\\\",\\\"黔\\\",\\\"黜\\\",\\\"點\\\",\\\"黝\\\",\\\"黠\\\",\\\"黥\\\",\\\"黨\\\",\\\"黯\\\",\\\"黴\\\",\\\"黶\\\",\\\"黷\\\",\\\"黹\\\",\\\"黻\\\",\\\"黼\\\",\\\"黽\\\",\\\"鼇\\\",\\\"鼈\\\",\\\"皷\\\",\\\"鼕\\\",\\\"鼡\\\",\\\"鼬\\\",\\\"鼾\\\",\\\"齊\\\",\\\"齒\\\",\\\"齔\\\",\\\"齣\\\",\\\"齟\\\",\\\"齠\\\",\\\"齡\\\",\\\"齦\\\",\\\"齧\\\",\\\"齬\\\",\\\"齪\\\",\\\"齷\\\",\\\"齲\\\",\\\"齶\\\",\\\"龕\\\",\\\"龜\\\",\\\"龠\\\",\\\"堯\\\",\\\"槇\\\",\\\"遙\\\",\\\"瑤\\\",\\\"凜\\\",\\\"熙\\\",\\\"噓\\\",\\\"巢\\\",\\\"帔\\\",\\\"帘\\\",\\\"幘\\\",\\\"幞\\\",\\\"庾\\\",\\\"廊\\\",\\\"廋\\\",\\\"廹\\\",\\\"开\\\",\\\"异\\\",\\\"弇\\\",\\\"弝\\\",\\\"弣\\\",\\\"弴\\\",\\\"弶\\\",\\\"弽\\\",\\\"彀\\\",\\\"彅\\\",\\\"彔\\\",\\\"彘\\\",\\\"彤\\\",\\\"彧\\\",\\\"彽\\\",\\\"徉\\\",\\\"徜\\\",\\\"徧\\\",\\\"徯\\\",\\\"徵\\\",\\\"德\\\",\\\"忉\\\",\\\"忞\\\",\\\"忡\\\",\\\"忩\\\",\\\"怍\\\",\\\"怔\\\",\\\"怘\\\",\\\"怳\\\",\\\"怵\\\",\\\"恇\\\",\\\"悔\\\",\\\"悝\\\",\\\"悞\\\",\\\"惋\\\",\\\"惔\\\",\\\"惕\\\",\\\"惝\\\",\\\"惸\\\",\\\"愜\\\",\\\"愫\\\",\\\"愰\\\",\\\"愷\\\",\\\"慨\\\",\\\"憍\\\",\\\"憎\\\",\\\"憼\\\",\\\"憹\\\",\\\"懲\\\",\\\"戢\\\",\\\"戾\\\",\\\"扃\\\",\\\"扖\\\",\\\"扚\\\",\\\"扯\\\",\\\"抅\\\",\\\"拄\\\",\\\"拖\\\",\\\"拼\\\",\\\"挊\\\",\\\"挘\\\",\\\"挹\\\",\\\"捃\\\",\\\"捥\\\",\\\"捼\\\",\\\"揥\\\",\\\"揭\\\",\\\"揵\\\",\\\"搐\\\",\\\"搔\\\",\\\"搢\\\",\\\"摹\\\",\\\"摑\\\",\\\"摠\\\",\\\"摭\\\",\\\"擎\\\",\\\"撾\\\",\\\"撿\\\",\\\"㐂\\\",\\\"𠅘\\\",\\\"份\\\",\\\"仿\\\",\\\"侚\\\",\\\"俉\\\",\\\"傜\\\",\\\"儞\\\",\\\"冼\\\",\\\"㔟\\\",\\\"匇\\\",\\\"卡\\\",\\\"卬\\\",\\\"詹\\\",\\\"𠮷\\\",\\\"呍\\\",\\\"咖\\\",\\\"咜\\\",\\\"咩\\\",\\\"唎\\\",\\\"啊\\\",\\\"噲\\\",\\\"囤\\\",\\\"圳\\\",\\\"圴\\\",\\\"塚\\\",\\\"墀\\\",\\\"姤\\\",\\\"娣\\\",\\\"婕\\\",\\\"寬\\\",\\\"﨑\\\",\\\"㟢\\\",\\\"庬\\\",\\\"弴\\\",\\\"彅\\\",\\\"德\\\",\\\"怗\\\",\\\"恵\\\",\\\"愰\\\",\\\"昤\\\",\\\"曈\\\",\\\"曙\\\",\\\"曺\\\",\\\"曻\\\",\\\"桒\\\",\\\"鿄\\\",\\\"椑\\\",\\\"椻\\\",\\\"橅\\\",\\\"檑\\\",\\\"櫛\\\",\\\"𣏌\\\",\\\"𣏾\\\",\\\"𣗄\\\",\\\"毱\\\",\\\"泠\\\",\\\"洮\\\",\\\"海\\\",\\\"涿\\\",\\\"淊\\\",\\\"淸\\\",\\\"渚\\\",\\\"潞\\\",\\\"濹\\\",\\\"灤\\\",\\\"𤋮\\\",\\\"𤋮\\\",\\\"煇\\\",\\\"燁\\\",\\\"爀\\\",\\\"玟\\\",\\\"玨\\\",\\\"珉\\\",\\\"珖\\\",\\\"琛\\\",\\\"琡\\\",\\\"琢\\\",\\\"琦\\\",\\\"琪\\\",\\\"琬\\\",\\\"琹\\\",\\\"瑋\\\",\\\"㻚\\\",\\\"畵\\\",\\\"疁\\\",\\\"睲\\\",\\\"䂓\\\",\\\"磈\\\",\\\"磠\\\",\\\"祇\\\",\\\"禮\\\",\\\"鿆\\\",\\\"䄃\\\",\\\"鿅\\\",\\\"秚\\\",\\\"稞\\\",\\\"筿\\\",\\\"簱\\\",\\\"䉤\\\",\\\"綋\\\",\\\"羡\\\",\\\"脘\\\",\\\"脺\\\",\\\"舘\\\",\\\"芮\\\",\\\"葛\\\",\\\"蓜\\\",\\\"蓬\\\",\\\"蕙\\\",\\\"藎\\\",\\\"蝕\\\",\\\"蟬\\\",\\\"蠋\\\",\\\"裵\\\",\\\"角\\\",\\\"諶\\\",\\\"跎\\\",\\\"辻\\\",\\\"迶\\\",\\\"郝\\\",\\\"鄧\\\",\\\"鄭\\\",\\\"醲\\\",\\\"鈳\\\",\\\"銈\\\",\\\"錡\\\",\\\"鍈\\\",\\\"閒\\\",\\\"雞\\\",\\\"餃\\\",\\\"饀\\\",\\\"髙\\\",\\\"鯖\\\",\\\"鷗\\\",\\\"麴\\\",\\\"麵\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛌\\\",\\\"⛍\\\",\\\"❗\\\",\\\"⛏\\\",\\\"⛐\\\",\\\"⛑\\\",\\\"\\\",\\\"⛒\\\",\\\"⛕\\\",\\\"⛓\\\",\\\"⛔\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛖\\\",\\\"⛗\\\",\\\"⛘\\\",\\\"⛙\\\",\\\"⛚\\\",\\\"⛛\\\",\\\"⛜\\\",\\\"⛝\\\",\\\"⛞\\\",\\\"⛟\\\",\\\"⛠\\\",\\\"⛡\\\",\\\"⭕\\\",\\\"㉈\\\",\\\"㉉\\\",\\\"㉊\\\",\\\"㉋\\\",\\\"㉌\\\",\\\"㉍\\\",\\\"㉎\\\",\\\"㉏\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⒑\\\",\\\"⒒\\\",\\\"⒓\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⬛\\\",\\\"⬤\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⚿\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㊙\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛣\\\",\\\"⭖\\\",\\\"⭗\\\",\\\"⭘\\\",\\\"⭙\\\",\\\"☓\\\",\\\"㊋\\\",\\\"〒\\\",\\\"⛨\\\",\\\"㉆\\\",\\\"㉅\\\",\\\"⛩\\\",\\\"࿖\\\",\\\"⛪\\\",\\\"⛫\\\",\\\"⛬\\\",\\\"♨\\\",\\\"⛭\\\",\\\"⛮\\\",\\\"⛯\\\",\\\"⚓\\\",\\\"✈\\\",\\\"⛰\\\",\\\"⛱\\\",\\\"⛲\\\",\\\"⛳\\\",\\\"⛴\\\",\\\"⛵\\\",\\\"\\\",\\\"Ⓓ\\\",\\\"Ⓢ\\\",\\\"⛶\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛷\\\",\\\"⛸\\\",\\\"⛹\\\",\\\"⛺\\\",\\\"\\\",\\\"☎\\\",\\\"⛻\\\",\\\"⛼\\\",\\\"⛽\\\",\\\"⛾\\\",\\\"\\\",\\\"⛿\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"➡\\\",\\\"⬅\\\",\\\"⬆\\\",\\\"⬇\\\",\\\"⬯\\\",\\\"⬮\\\",\\\"年\\\",\\\"月\\\",\\\"日\\\",\\\"円\\\",\\\"㎡\\\",\\\"㎥\\\",\\\"㎝\\\",\\\"㎠\\\",\\\"㎤\\\",\\\"\\\",\\\"⒈\\\",\\\"⒉\\\",\\\"⒊\\\",\\\"⒋\\\",\\\"⒌\\\",\\\"⒍\\\",\\\"⒎\\\",\\\"⒏\\\",\\\"⒐\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㈳\\\",\\\"㈶\\\",\\\"㈲\\\",\\\"㈱\\\",\\\"㈹\\\",\\\"㉄\\\",\\\"▶\\\",\\\"◀\\\",\\\"〖\\\",\\\"〗\\\",\\\"⟐\\\",\\\"²\\\",\\\"³\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㉇\\\",\\\"\\\",\\\"\\\",\\\"℻\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㈪\\\",\\\"㈫\\\",\\\"㈬\\\",\\\"㈭\\\",\\\"㈮\\\",\\\"㈯\\\",\\\"㈰\\\",\\\"㈷\\\",\\\"㍾\\\",\\\"㍽\\\",\\\"㍼\\\",\\\"㍻\\\",\\\"№\\\",\\\"℡\\\",\\\"〶\\\",\\\"⚾\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"ℓ\\\",\\\"㎏\\\",\\\"㎐\\\",\\\"㏊\\\",\\\"㎞\\\",\\\"㎢\\\",\\\"㍱\\\",\\\"\\\",\\\"\\\",\\\"½\\\",\\\"↉\\\",\\\"⅓\\\",\\\"⅔\\\",\\\"¼\\\",\\\"¾\\\",\\\"⅕\\\",\\\"⅖\\\",\\\"⅗\\\",\\\"⅘\\\",\\\"⅙\\\",\\\"⅚\\\",\\\"⅐\\\",\\\"⅛\\\",\\\"⅑\\\",\\\"⅒\\\",\\\"☀\\\",\\\"☁\\\",\\\"☂\\\",\\\"⛄\\\",\\\"☖\\\",\\\"☗\\\",\\\"⛉\\\",\\\"⛊\\\",\\\"♦\\\",\\\"♥\\\",\\\"♣\\\",\\\"♠\\\",\\\"⛋\\\",\\\"⨀\\\",\\\"‼\\\",\\\"⁉\\\",\\\"⛅\\\",\\\"☔\\\",\\\"⛆\\\",\\\"☃\\\",\\\"⛇\\\",\\\"⚡\\\",\\\"⛈\\\",\\\"\\\",\\\"⚞\\\",\\\"⚟\\\",\\\"♬\\\",\\\"☎\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"Ⅰ\\\",\\\"Ⅱ\\\",\\\"Ⅲ\\\",\\\"Ⅳ\\\",\\\"Ⅴ\\\",\\\"Ⅵ\\\",\\\"Ⅶ\\\",\\\"Ⅷ\\\",\\\"Ⅸ\\\",\\\"Ⅹ\\\",\\\"Ⅺ\\\",\\\"Ⅻ\\\",\\\"⑰\\\",\\\"⑱\\\",\\\"⑲\\\",\\\"⑳\\\",\\\"⑴\\\",\\\"⑵\\\",\\\"⑶\\\",\\\"⑷\\\",\\\"⑸\\\",\\\"⑹\\\",\\\"⑺\\\",\\\"⑻\\\",\\\"⑼\\\",\\\"⑽\\\",\\\"⑾\\\",\\\"⑿\\\",\\\"㉑\\\",\\\"㉒\\\",\\\"㉓\\\",\\\"㉔\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㉕\\\",\\\"㉖\\\",\\\"㉗\\\",\\\"㉘\\\",\\\"㉙\\\",\\\"㉚\\\",\\\"①\\\",\\\"②\\\",\\\"③\\\",\\\"④\\\",\\\"⑤\\\",\\\"⑥\\\",\\\"⑦\\\",\\\"⑧\\\",\\\"⑨\\\",\\\"⑩\\\",\\\"⑪\\\",\\\"⑫\\\",\\\"⑬\\\",\\\"⑭\\\",\\\"⑮\\\",\\\"⑯\\\",\\\"❶\\\",\\\"❷\\\",\\\"❸\\\",\\\"❹\\\",\\\"❺\\\",\\\"❻\\\",\\\"❼\\\",\\\"❽\\\",\\\"❾\\\",\\\"❿\\\",\\\"⓫\\\",\\\"⓬\\\",\\\"㉛\\\",\\\"\\\"],u=[\\\"㐂\\\",\\\"\\\",\\\"份\\\",\\\"仿\\\",\\\"侚\\\",\\\"俉\\\",\\\"傜\\\",\\\"儞\\\",\\\"冼\\\",\\\"㔟\\\",\\\"匇\\\",\\\"卡\\\",\\\"卬\\\",\\\"詹\\\",\\\"\\\",\\\"呍\\\",\\\"咖\\\",\\\"咜\\\",\\\"咩\\\",\\\"唎\\\",\\\"啊\\\",\\\"噲\\\",\\\"囤\\\",\\\"圳\\\",\\\"圴\\\",\\\"塚\\\",\\\"墀\\\",\\\"姤\\\",\\\"娣\\\",\\\"婕\\\",\\\"寬\\\",\\\"﨑\\\",\\\"㟢\\\",\\\"庬\\\",\\\"弴\\\",\\\"彅\\\",\\\"德\\\",\\\"怗\\\",\\\"恵\\\",\\\"愰\\\",\\\"昤\\\",\\\"曈\\\",\\\"曙\\\",\\\"曺\\\",\\\"曻\\\",\\\"桒\\\",\\\"鿄\\\",\\\"椑\\\",\\\"椻\\\",\\\"橅\\\",\\\"檑\\\",\\\"櫛\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"毱\\\",\\\"泠\\\",\\\"洮\\\",\\\"海\\\",\\\"涿\\\",\\\"淊\\\",\\\"淸\\\",\\\"渚\\\",\\\"潞\\\",\\\"濹\\\",\\\"灤\\\",\\\"𤋮\\\",\\\"\\\",\\\"煇\\\",\\\"燁\\\",\\\"爀\\\",\\\"玟\\\",\\\"玨\\\",\\\"珉\\\",\\\"珖\\\",\\\"琛\\\",\\\"琡\\\",\\\"琢\\\",\\\"琦\\\",\\\"琪\\\",\\\"琬\\\",\\\"琹\\\",\\\"瑋\\\",\\\"㻚\\\",\\\"畵\\\",\\\"疁\\\",\\\"睲\\\",\\\"䂓\\\",\\\"磈\\\",\\\"磠\\\",\\\"祇\\\",\\\"禮\\\",\\\"鿆\\\",\\\"䄃\\\",\\\"鿅\\\",\\\"秚\\\",\\\"稞\\\",\\\"筿\\\",\\\"簱\\\",\\\"䉤\\\",\\\"綋\\\",\\\"羡\\\",\\\"脘\\\",\\\"脺\\\",\\\"舘\\\",\\\"芮\\\",\\\"葛\\\",\\\"蓜\\\",\\\"蓬\\\",\\\"蕙\\\",\\\"藎\\\",\\\"蝕\\\",\\\"蟬\\\",\\\"蠋\\\",\\\"裵\\\",\\\"角\\\",\\\"諶\\\",\\\"跎\\\",\\\"辻\\\",\\\"迶\\\",\\\"郝\\\",\\\"鄧\\\",\\\"鄭\\\",\\\"醲\\\",\\\"鈳\\\",\\\"銈\\\",\\\"錡\\\",\\\"鍈\\\",\\\"閒\\\",\\\"雞\\\",\\\"餃\\\",\\\"饀\\\",\\\"髙\\\",\\\"鯖\\\",\\\"鷗\\\",\\\"麴\\\",\\\"麵\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛌\\\",\\\"⛍\\\",\\\"❗\\\",\\\"⛏\\\",\\\"⛐\\\",\\\"⛑\\\",\\\"\\\",\\\"⛒\\\",\\\"⛕\\\",\\\"⛓\\\",\\\"⛔\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛖\\\",\\\"⛗\\\",\\\"⛘\\\",\\\"⛙\\\",\\\"⛚\\\",\\\"⛛\\\",\\\"⛜\\\",\\\"⛝\\\",\\\"⛞\\\",\\\"⛟\\\",\\\"⛠\\\",\\\"⛡\\\",\\\"⭕\\\",\\\"㉈\\\",\\\"㉉\\\",\\\"㉊\\\",\\\"㉋\\\",\\\"㉌\\\",\\\"㉍\\\",\\\"㉎\\\",\\\"㉏\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⒑\\\",\\\"⒒\\\",\\\"⒓\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⬛\\\",\\\"⬤\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⚿\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㊙\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛣\\\",\\\"⭖\\\",\\\"⭗\\\",\\\"⭘\\\",\\\"⭙\\\",\\\"☓\\\",\\\"㊋\\\",\\\"〒\\\",\\\"⛨\\\",\\\"㉆\\\",\\\"㉅\\\",\\\"⛩\\\",\\\"࿖\\\",\\\"⛪\\\",\\\"⛫\\\",\\\"⛬\\\",\\\"♨\\\",\\\"⛭\\\",\\\"⛮\\\",\\\"⛯\\\",\\\"⚓\\\",\\\"✈\\\",\\\"⛰\\\",\\\"⛱\\\",\\\"⛲\\\",\\\"⛳\\\",\\\"⛴\\\",\\\"⛵\\\",\\\"\\\",\\\"Ⓓ\\\",\\\"Ⓢ\\\",\\\"⛶\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛷\\\",\\\"⛸\\\",\\\"⛹\\\",\\\"⛺\\\",\\\"\\\",\\\"☎\\\",\\\"⛻\\\",\\\"⛼\\\",\\\"⛽\\\",\\\"⛾\\\",\\\"\\\",\\\"⛿\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"➡\\\",\\\"⬅\\\",\\\"⬆\\\",\\\"⬇\\\",\\\"⬯\\\",\\\"⬮\\\",\\\"年\\\",\\\"月\\\",\\\"日\\\",\\\"円\\\",\\\"㎡\\\",\\\"㎥\\\",\\\"㎝\\\",\\\"㎠\\\",\\\"㎤\\\",\\\"\\\",\\\"⒈\\\",\\\"⒉\\\",\\\"⒊\\\",\\\"⒋\\\",\\\"⒌\\\",\\\"⒍\\\",\\\"⒎\\\",\\\"⒏\\\",\\\"⒐\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㈳\\\",\\\"㈶\\\",\\\"㈲\\\",\\\"㈱\\\",\\\"㈹\\\",\\\"㉄\\\",\\\"▶\\\",\\\"◀\\\",\\\"〖\\\",\\\"〗\\\",\\\"⟐\\\",\\\"²\\\",\\\"³\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㉇\\\",\\\"\\\",\\\"\\\",\\\"℻\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㈪\\\",\\\"㈫\\\",\\\"㈬\\\",\\\"㈭\\\",\\\"㈮\\\",\\\"㈯\\\",\\\"㈰\\\",\\\"㈷\\\",\\\"㍾\\\",\\\"㍽\\\",\\\"㍼\\\",\\\"㍻\\\",\\\"№\\\",\\\"℡\\\",\\\"〶\\\",\\\"⚾\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"ℓ\\\",\\\"㎏\\\",\\\"㎐\\\",\\\"㏊\\\",\\\"㎞\\\",\\\"㎢\\\",\\\"㍱\\\",\\\"\\\",\\\"\\\",\\\"½\\\",\\\"↉\\\",\\\"⅓\\\",\\\"⅔\\\",\\\"¼\\\",\\\"¾\\\",\\\"⅕\\\",\\\"⅖\\\",\\\"⅗\\\",\\\"⅘\\\",\\\"⅙\\\",\\\"⅚\\\",\\\"⅐\\\",\\\"⅛\\\",\\\"⅑\\\",\\\"⅒\\\",\\\"☀\\\",\\\"☁\\\",\\\"☂\\\",\\\"⛄\\\",\\\"☖\\\",\\\"☗\\\",\\\"⛉\\\",\\\"⛊\\\",\\\"♦\\\",\\\"♥\\\",\\\"♣\\\",\\\"♠\\\",\\\"⛋\\\",\\\"⨀\\\",\\\"‼\\\",\\\"⁉\\\",\\\"⛅\\\",\\\"☔\\\",\\\"⛆\\\",\\\"☃\\\",\\\"⛇\\\",\\\"⚡\\\",\\\"⛈\\\",\\\"\\\",\\\"⚞\\\",\\\"⚟\\\",\\\"♬\\\",\\\"☎\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"Ⅰ\\\",\\\"Ⅱ\\\",\\\"Ⅲ\\\",\\\"Ⅳ\\\",\\\"Ⅴ\\\",\\\"Ⅵ\\\",\\\"Ⅶ\\\",\\\"Ⅷ\\\",\\\"Ⅸ\\\",\\\"Ⅹ\\\",\\\"Ⅺ\\\",\\\"Ⅻ\\\",\\\"⑰\\\",\\\"⑱\\\",\\\"⑲\\\",\\\"⑳\\\",\\\"⑴\\\",\\\"⑵\\\",\\\"⑶\\\",\\\"⑷\\\",\\\"⑸\\\",\\\"⑹\\\",\\\"⑺\\\",\\\"⑻\\\",\\\"⑼\\\",\\\"⑽\\\",\\\"⑾\\\",\\\"⑿\\\",\\\"㉑\\\",\\\"㉒\\\",\\\"㉓\\\",\\\"㉔\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㉕\\\",\\\"㉖\\\",\\\"㉗\\\",\\\"㉘\\\",\\\"㉙\\\",\\\"㉚\\\",\\\"①\\\",\\\"②\\\",\\\"③\\\",\\\"④\\\",\\\"⑤\\\",\\\"⑥\\\",\\\"⑦\\\",\\\"⑧\\\",\\\"⑨\\\",\\\"⑩\\\",\\\"⑪\\\",\\\"⑫\\\",\\\"⑬\\\",\\\"⑭\\\",\\\"⑮\\\",\\\"⑯\\\",\\\"❶\\\",\\\"❷\\\",\\\"❸\\\",\\\"❹\\\",\\\"❺\\\",\\\"❻\\\",\\\"❼\\\",\\\"❽\\\",\\\"❾\\\",\\\"❿\\\",\\\"⓫\\\",\\\"⓬\\\",\\\"㉛\\\",\\\"\\\"],l=[\\\"㐂\\\",\\\"𠅘\\\",\\\"份\\\",\\\"仿\\\",\\\"侚\\\",\\\"俉\\\",\\\"傜\\\",\\\"儞\\\",\\\"冼\\\",\\\"㔟\\\",\\\"匇\\\",\\\"卡\\\",\\\"卬\\\",\\\"詹\\\",\\\"𠮷\\\",\\\"呍\\\",\\\"咖\\\",\\\"咜\\\",\\\"咩\\\",\\\"唎\\\",\\\"啊\\\",\\\"噲\\\",\\\"囤\\\",\\\"圳\\\",\\\"圴\\\",\\\"塚\\\",\\\"墀\\\",\\\"姤\\\",\\\"娣\\\",\\\"婕\\\",\\\"寬\\\",\\\"﨑\\\",\\\"㟢\\\",\\\"庬\\\",\\\"弴\\\",\\\"彅\\\",\\\"德\\\",\\\"怗\\\",\\\"恵\\\",\\\"愰\\\",\\\"昤\\\",\\\"曈\\\",\\\"曙\\\",\\\"曺\\\",\\\"曻\\\",\\\"桒\\\",\\\"鿄\\\",\\\"椑\\\",\\\"椻\\\",\\\"橅\\\",\\\"檑\\\",\\\"櫛\\\",\\\"𣏌\\\",\\\"𣏾\\\",\\\"𣗄\\\",\\\"毱\\\",\\\"泠\\\",\\\"洮\\\",\\\"海\\\",\\\"涿\\\",\\\"淊\\\",\\\"淸\\\",\\\"渚\\\",\\\"潞\\\",\\\"濹\\\",\\\"灤\\\",\\\"𤋮\\\",\\\"𤋮\\\",\\\"煇\\\",\\\"燁\\\",\\\"爀\\\",\\\"玟\\\",\\\"玨\\\",\\\"珉\\\",\\\"珖\\\",\\\"琛\\\",\\\"琡\\\",\\\"琢\\\",\\\"琦\\\",\\\"琪\\\",\\\"琬\\\",\\\"琹\\\",\\\"瑋\\\",\\\"㻚\\\",\\\"畵\\\",\\\"疁\\\",\\\"睲\\\",\\\"䂓\\\",\\\"磈\\\",\\\"磠\\\",\\\"祇\\\",\\\"禮\\\",\\\"鿆\\\",\\\"䄃\\\",\\\"鿅\\\",\\\"秚\\\",\\\"稞\\\",\\\"筿\\\",\\\"簱\\\",\\\"䉤\\\",\\\"綋\\\",\\\"羡\\\",\\\"脘\\\",\\\"脺\\\",\\\"舘\\\",\\\"芮\\\",\\\"葛\\\",\\\"蓜\\\",\\\"蓬\\\",\\\"蕙\\\",\\\"藎\\\",\\\"蝕\\\",\\\"蟬\\\",\\\"蠋\\\",\\\"裵\\\",\\\"角\\\",\\\"諶\\\",\\\"跎\\\",\\\"辻\\\",\\\"迶\\\",\\\"郝\\\",\\\"鄧\\\",\\\"鄭\\\",\\\"醲\\\",\\\"鈳\\\",\\\"銈\\\",\\\"錡\\\",\\\"鍈\\\",\\\"閒\\\",\\\"雞\\\",\\\"餃\\\",\\\"饀\\\",\\\"髙\\\",\\\"鯖\\\",\\\"鷗\\\",\\\"麴\\\",\\\"麵\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛌\\\",\\\"⛍\\\",\\\"❗\\\",\\\"⛏\\\",\\\"⛐\\\",\\\"⛑\\\",\\\"\\\",\\\"⛒\\\",\\\"⛕\\\",\\\"⛓\\\",\\\"⛔\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"🅿\\\",\\\"🆊\\\",\\\"\\\",\\\"\\\",\\\"⛖\\\",\\\"⛗\\\",\\\"⛘\\\",\\\"⛙\\\",\\\"⛚\\\",\\\"⛛\\\",\\\"⛜\\\",\\\"⛝\\\",\\\"⛞\\\",\\\"⛟\\\",\\\"⛠\\\",\\\"⛡\\\",\\\"⭕\\\",\\\"㉈\\\",\\\"㉉\\\",\\\"㉊\\\",\\\"㉋\\\",\\\"㉌\\\",\\\"㉍\\\",\\\"㉎\\\",\\\"㉏\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⒑\\\",\\\"⒒\\\",\\\"⒓\\\",\\\"🅊\\\",\\\"🅌\\\",\\\"🄿\\\",\\\"🅆\\\",\\\"🅋\\\",\\\"🈐\\\",\\\"🈑\\\",\\\"🈒\\\",\\\"🈓\\\",\\\"🅂\\\",\\\"🈔\\\",\\\"🈕\\\",\\\"🈖\\\",\\\"🅍\\\",\\\"🄱\\\",\\\"🄽\\\",\\\"⬛\\\",\\\"⬤\\\",\\\"🈗\\\",\\\"🈘\\\",\\\"🈙\\\",\\\"🈚\\\",\\\"🈛\\\",\\\"⚿\\\",\\\"🈜\\\",\\\"🈝\\\",\\\"🈞\\\",\\\"🈟\\\",\\\"🈠\\\",\\\"🈡\\\",\\\"🈢\\\",\\\"🈣\\\",\\\"🈤\\\",\\\"🈥\\\",\\\"🅎\\\",\\\"㊙\\\",\\\"🈀\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛣\\\",\\\"⭖\\\",\\\"⭗\\\",\\\"⭘\\\",\\\"⭙\\\",\\\"☓\\\",\\\"㊋\\\",\\\"〒\\\",\\\"⛨\\\",\\\"㉆\\\",\\\"㉅\\\",\\\"⛩\\\",\\\"࿖\\\",\\\"⛪\\\",\\\"⛫\\\",\\\"⛬\\\",\\\"♨\\\",\\\"⛭\\\",\\\"⛮\\\",\\\"⛯\\\",\\\"⚓\\\",\\\"✈\\\",\\\"⛰\\\",\\\"⛱\\\",\\\"⛲\\\",\\\"⛳\\\",\\\"⛴\\\",\\\"⛵\\\",\\\"🅗\\\",\\\"Ⓓ\\\",\\\"Ⓢ\\\",\\\"⛶\\\",\\\"🅟\\\",\\\"🆋\\\",\\\"🆍\\\",\\\"🆌\\\",\\\"🅹\\\",\\\"⛷\\\",\\\"⛸\\\",\\\"⛹\\\",\\\"⛺\\\",\\\"🅻\\\",\\\"☎\\\",\\\"⛻\\\",\\\"⛼\\\",\\\"⛽\\\",\\\"⛾\\\",\\\"🅼\\\",\\\"⛿\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"➡\\\",\\\"⬅\\\",\\\"⬆\\\",\\\"⬇\\\",\\\"⬯\\\",\\\"⬮\\\",\\\"年\\\",\\\"月\\\",\\\"日\\\",\\\"円\\\",\\\"㎡\\\",\\\"㎥\\\",\\\"㎝\\\",\\\"㎠\\\",\\\"㎤\\\",\\\"🄀\\\",\\\"⒈\\\",\\\"⒉\\\",\\\"⒊\\\",\\\"⒋\\\",\\\"⒌\\\",\\\"⒍\\\",\\\"⒎\\\",\\\"⒏\\\",\\\"⒐\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"🄁\\\",\\\"🄂\\\",\\\"🄃\\\",\\\"🄄\\\",\\\"🄅\\\",\\\"🄆\\\",\\\"🄇\\\",\\\"🄈\\\",\\\"🄉\\\",\\\"🄊\\\",\\\"㈳\\\",\\\"㈶\\\",\\\"㈲\\\",\\\"㈱\\\",\\\"㈹\\\",\\\"㉄\\\",\\\"▶\\\",\\\"◀\\\",\\\"〖\\\",\\\"〗\\\",\\\"⟐\\\",\\\"²\\\",\\\"³\\\",\\\"🄭\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"🄬\\\",\\\"🄫\\\",\\\"㉇\\\",\\\"🆐\\\",\\\"🈦\\\",\\\"℻\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㈪\\\",\\\"㈫\\\",\\\"㈬\\\",\\\"㈭\\\",\\\"㈮\\\",\\\"㈯\\\",\\\"㈰\\\",\\\"㈷\\\",\\\"㍾\\\",\\\"㍽\\\",\\\"㍼\\\",\\\"㍻\\\",\\\"№\\\",\\\"℡\\\",\\\"〶\\\",\\\"⚾\\\",\\\"🉀\\\",\\\"🉁\\\",\\\"🉂\\\",\\\"🉃\\\",\\\"🉄\\\",\\\"🉅\\\",\\\"🉆\\\",\\\"🉇\\\",\\\"🉈\\\",\\\"🄪\\\",\\\"🈧\\\",\\\"🈨\\\",\\\"🈩\\\",\\\"🈔\\\",\\\"🈪\\\",\\\"🈫\\\",\\\"🈬\\\",\\\"🈭\\\",\\\"🈮\\\",\\\"🈯\\\",\\\"🈰\\\",\\\"🈱\\\",\\\"ℓ\\\",\\\"㎏\\\",\\\"㎐\\\",\\\"㏊\\\",\\\"㎞\\\",\\\"㎢\\\",\\\"㍱\\\",\\\"\\\",\\\"\\\",\\\"½\\\",\\\"↉\\\",\\\"⅓\\\",\\\"⅔\\\",\\\"¼\\\",\\\"¾\\\",\\\"⅕\\\",\\\"⅖\\\",\\\"⅗\\\",\\\"⅘\\\",\\\"⅙\\\",\\\"⅚\\\",\\\"⅐\\\",\\\"⅛\\\",\\\"⅑\\\",\\\"⅒\\\",\\\"☀\\\",\\\"☁\\\",\\\"☂\\\",\\\"⛄\\\",\\\"☖\\\",\\\"☗\\\",\\\"⛉\\\",\\\"⛊\\\",\\\"♦\\\",\\\"♥\\\",\\\"♣\\\",\\\"♠\\\",\\\"⛋\\\",\\\"⨀\\\",\\\"‼\\\",\\\"⁉\\\",\\\"⛅\\\",\\\"☔\\\",\\\"⛆\\\",\\\"☃\\\",\\\"⛇\\\",\\\"⚡\\\",\\\"⛈\\\",\\\"\\\",\\\"⚞\\\",\\\"⚟\\\",\\\"♬\\\",\\\"☎\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"Ⅰ\\\",\\\"Ⅱ\\\",\\\"Ⅲ\\\",\\\"Ⅳ\\\",\\\"Ⅴ\\\",\\\"Ⅵ\\\",\\\"Ⅶ\\\",\\\"Ⅷ\\\",\\\"Ⅸ\\\",\\\"Ⅹ\\\",\\\"Ⅺ\\\",\\\"Ⅻ\\\",\\\"⑰\\\",\\\"⑱\\\",\\\"⑲\\\",\\\"⑳\\\",\\\"⑴\\\",\\\"⑵\\\",\\\"⑶\\\",\\\"⑷\\\",\\\"⑸\\\",\\\"⑹\\\",\\\"⑺\\\",\\\"⑻\\\",\\\"⑼\\\",\\\"⑽\\\",\\\"⑾\\\",\\\"⑿\\\",\\\"㉑\\\",\\\"㉒\\\",\\\"㉓\\\",\\\"㉔\\\",\\\"🄐\\\",\\\"🄑\\\",\\\"🄒\\\",\\\"🄓\\\",\\\"🄔\\\",\\\"🄕\\\",\\\"🄖\\\",\\\"🄗\\\",\\\"🄘\\\",\\\"🄙\\\",\\\"🄚\\\",\\\"🄛\\\",\\\"🄜\\\",\\\"🄝\\\",\\\"🄞\\\",\\\"🄟\\\",\\\"🄠\\\",\\\"🄡\\\",\\\"🄢\\\",\\\"🄣\\\",\\\"🄤\\\",\\\"🄥\\\",\\\"🄦\\\",\\\"🄧\\\",\\\"🄨\\\",\\\"🄩\\\",\\\"㉕\\\",\\\"㉖\\\",\\\"㉗\\\",\\\"㉘\\\",\\\"㉙\\\",\\\"㉚\\\",\\\"①\\\",\\\"②\\\",\\\"③\\\",\\\"④\\\",\\\"⑤\\\",\\\"⑥\\\",\\\"⑦\\\",\\\"⑧\\\",\\\"⑨\\\",\\\"⑩\\\",\\\"⑪\\\",\\\"⑫\\\",\\\"⑬\\\",\\\"⑭\\\",\\\"⑮\\\",\\\"⑯\\\",\\\"❶\\\",\\\"❷\\\",\\\"❸\\\",\\\"❹\\\",\\\"❺\\\",\\\"❻\\\",\\\"❼\\\",\\\"❽\\\",\\\"❾\\\",\\\"❿\\\",\\\"⓫\\\",\\\"⓬\\\",\\\"㉛\\\",\\\"\\\"],f=[\\\"！\\\",\\\"＂\\\",\\\"＃\\\",\\\"＄\\\",\\\"％\\\",\\\"＆\\\",\\\"＇\\\",\\\"（\\\",\\\"）\\\",\\\"＊\\\",\\\"＋\\\",\\\"，\\\",\\\"－\\\",\\\"．\\\",\\\"／\\\",\\\"０\\\",\\\"１\\\",\\\"２\\\",\\\"３\\\",\\\"４\\\",\\\"５\\\",\\\"６\\\",\\\"７\\\",\\\"８\\\",\\\"９\\\",\\\"：\\\",\\\"；\\\",\\\"＜\\\",\\\"＝\\\",\\\"＞\\\",\\\"？\\\",\\\"＠\\\",\\\"Ａ\\\",\\\"Ｂ\\\",\\\"Ｃ\\\",\\\"Ｄ\\\",\\\"Ｅ\\\",\\\"Ｆ\\\",\\\"Ｇ\\\",\\\"Ｈ\\\",\\\"Ｉ\\\",\\\"Ｊ\\\",\\\"Ｋ\\\",\\\"Ｌ\\\",\\\"Ｍ\\\",\\\"Ｎ\\\",\\\"Ｏ\\\",\\\"Ｐ\\\",\\\"Ｑ\\\",\\\"Ｒ\\\",\\\"Ｓ\\\",\\\"Ｔ\\\",\\\"Ｕ\\\",\\\"Ｖ\\\",\\\"Ｗ\\\",\\\"Ｘ\\\",\\\"Ｙ\\\",\\\"Ｚ\\\",\\\"［\\\",\\\"￥\\\",\\\"］\\\",\\\"＾\\\",\\\"＿\\\",\\\"｀\\\",\\\"ａ\\\",\\\"ｂ\\\",\\\"ｃ\\\",\\\"ｄ\\\",\\\"ｅ\\\",\\\"ｆ\\\",\\\"ｇ\\\",\\\"ｈ\\\",\\\"ｉ\\\",\\\"ｊ\\\",\\\"ｋ\\\",\\\"ｌ\\\",\\\"ｍ\\\",\\\"ｎ\\\",\\\"ｏ\\\",\\\"ｐ\\\",\\\"ｑ\\\",\\\"ｒ\\\",\\\"ｓ\\\",\\\"ｔ\\\",\\\"ｕ\\\",\\\"ｖ\\\",\\\"ｗ\\\",\\\"ｘ\\\",\\\"ｙ\\\",\\\"ｚ\\\",\\\"｛\\\",\\\"｜\\\",\\\"｝\\\",\\\"～\\\"],d=[\\\"ぁ\\\",\\\"あ\\\",\\\"ぃ\\\",\\\"い\\\",\\\"ぅ\\\",\\\"う\\\",\\\"ぇ\\\",\\\"え\\\",\\\"ぉ\\\",\\\"お\\\",\\\"か\\\",\\\"が\\\",\\\"き\\\",\\\"ぎ\\\",\\\"く\\\",\\\"ぐ\\\",\\\"け\\\",\\\"げ\\\",\\\"こ\\\",\\\"ご\\\",\\\"さ\\\",\\\"ざ\\\",\\\"し\\\",\\\"じ\\\",\\\"す\\\",\\\"ず\\\",\\\"せ\\\",\\\"ぜ\\\",\\\"そ\\\",\\\"ぞ\\\",\\\"た\\\",\\\"だ\\\",\\\"ち\\\",\\\"ぢ\\\",\\\"っ\\\",\\\"つ\\\",\\\"づ\\\",\\\"て\\\",\\\"で\\\",\\\"と\\\",\\\"ど\\\",\\\"な\\\",\\\"に\\\",\\\"ぬ\\\",\\\"ね\\\",\\\"の\\\",\\\"は\\\",\\\"ば\\\",\\\"ぱ\\\",\\\"ひ\\\",\\\"び\\\",\\\"ぴ\\\",\\\"ふ\\\",\\\"ぶ\\\",\\\"ぷ\\\",\\\"へ\\\",\\\"べ\\\",\\\"ぺ\\\",\\\"ほ\\\",\\\"ぼ\\\",\\\"ぽ\\\",\\\"ま\\\",\\\"み\\\",\\\"む\\\",\\\"め\\\",\\\"も\\\",\\\"ゃ\\\",\\\"や\\\",\\\"ゅ\\\",\\\"ゆ\\\",\\\"ょ\\\",\\\"よ\\\",\\\"ら\\\",\\\"り\\\",\\\"る\\\",\\\"れ\\\",\\\"ろ\\\",\\\"ゎ\\\",\\\"わ\\\",\\\"ゐ\\\",\\\"ゑ\\\",\\\"を\\\",\\\"ん\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"ゝ\\\",\\\"ゞ\\\",\\\"ー\\\",\\\"。\\\",\\\"「\\\",\\\"」\\\",\\\"、\\\",\\\"・\\\"],p=[\\\"ァ\\\",\\\"ア\\\",\\\"ィ\\\",\\\"イ\\\",\\\"ゥ\\\",\\\"ウ\\\",\\\"ェ\\\",\\\"エ\\\",\\\"ォ\\\",\\\"オ\\\",\\\"カ\\\",\\\"ガ\\\",\\\"キ\\\",\\\"ギ\\\",\\\"ク\\\",\\\"グ\\\",\\\"ケ\\\",\\\"ゲ\\\",\\\"コ\\\",\\\"ゴ\\\",\\\"サ\\\",\\\"ザ\\\",\\\"シ\\\",\\\"ジ\\\",\\\"ス\\\",\\\"ズ\\\",\\\"セ\\\",\\\"ゼ\\\",\\\"ソ\\\",\\\"ゾ\\\",\\\"タ\\\",\\\"ダ\\\",\\\"チ\\\",\\\"ヂ\\\",\\\"ッ\\\",\\\"ツ\\\",\\\"ヅ\\\",\\\"テ\\\",\\\"デ\\\",\\\"ト\\\",\\\"ド\\\",\\\"ナ\\\",\\\"ニ\\\",\\\"ヌ\\\",\\\"ネ\\\",\\\"ノ\\\",\\\"ハ\\\",\\\"バ\\\",\\\"パ\\\",\\\"ヒ\\\",\\\"ビ\\\",\\\"ピ\\\",\\\"フ\\\",\\\"ブ\\\",\\\"プ\\\",\\\"ヘ\\\",\\\"ベ\\\",\\\"ペ\\\",\\\"ホ\\\",\\\"ボ\\\",\\\"ポ\\\",\\\"マ\\\",\\\"ミ\\\",\\\"ム\\\",\\\"メ\\\",\\\"モ\\\",\\\"ャ\\\",\\\"ヤ\\\",\\\"ュ\\\",\\\"ユ\\\",\\\"ョ\\\",\\\"ヨ\\\",\\\"ラ\\\",\\\"リ\\\",\\\"ル\\\",\\\"レ\\\",\\\"ロ\\\",\\\"ヮ\\\",\\\"ワ\\\",\\\"ヰ\\\",\\\"ヱ\\\",\\\"ヲ\\\",\\\"ン\\\",\\\"ヴ\\\",\\\"ヵ\\\",\\\"ヶ\\\",\\\"ヽ\\\",\\\"ヾ\\\",\\\"ー\\\",\\\"。\\\",\\\"「\\\",\\\"」\\\",\\\"、\\\",\\\"・\\\"],v=new Map([[\\\"022b6f43e2a414fd68f172da202bac9a\\\",\\\"⚞\\\"],[\\\"94fb7be756372db6b62e3e0a119083d5\\\",\\\"⚞\\\"],[\\\"12aecdea283e4d07f88b9f2b740e4f86\\\",\\\"⚟\\\"],[\\\"1a563501affbf7f5baec350a108d5505\\\",\\\"⚟\\\"],[\\\"556971570f40044fa4520df3289a1cf2\\\",\\\"⚟\\\"],[\\\"65b042886a563a771aa389b12af7bca7\\\",\\\"⚟\\\"],[\\\"bbda644d17efd3c020635ee3d90968a5\\\",\\\"｟\\\"],[\\\"5063561406195ca45f5992e3f7ad77d2\\\",\\\"｟\\\"],[\\\"9d15c0395a4738936af34308acf2d032\\\",\\\"｟\\\"],[\\\"2a063edc4770b3403f060b38166a0d4d\\\",\\\"｟\\\"],[\\\"54479aa90145b4713134b78d4fb98aa5\\\",\\\"｟\\\"],[\\\"12a2c7156da32fc972b5a451bb87b813\\\",\\\"｟\\\"],[\\\"c8d428ead557285b0b7088388b22519c\\\",\\\"｟\\\"],[\\\"7160f7419cba7acdacd23cbeb4834dbe\\\",\\\"｟\\\"],[\\\"3c49616fb9bf0b9052b30e118f8857ea\\\",\\\"｟\\\"],[\\\"71c94bb6d963e47443eac448a09d22ce\\\",\\\"｟\\\"],[\\\"7ec2179107ba4c58abb6ef92e7781365\\\",\\\"｟\\\"],[\\\"2eb49bd25d7eeada006afc0864350da4\\\",\\\"｟\\\"],[\\\"a341ee7fe8a368c9737a3341f016ac70\\\",\\\"｟\\\"],[\\\"f47048d669ac8d84eeb62477e8420f89\\\",\\\"｟\\\"],[\\\"38566b372f4c5a1aead4efa20decd079\\\",\\\"｠\\\"],[\\\"d84fc83615b75802ed422eda4ba39465\\\",\\\"｠\\\"],[\\\"5bb8b7731d9473ebd7c842334dfa24f2\\\",\\\"｠\\\"],[\\\"9ffa7e00cfc7e807a161ada460b8060c\\\",\\\"｠\\\"],[\\\"a58dc0e1271b03a5981b57a83271afa7\\\",\\\"｠\\\"],[\\\"e67210b0da0161d36b79e8c9be6a9d0c\\\",\\\"｠\\\"],[\\\"08de4be9569ebd6ac01709f552ae8a65\\\",\\\"｠\\\"],[\\\"e214599903c94c532684bdf54b62df61\\\",\\\"｠\\\"],[\\\"2a83209f8a7489081890c277397df425\\\",\\\"｠\\\"],[\\\"0294d50cea5197c8c4646d2cace3e78d\\\",\\\"｠\\\"],[\\\"0b808509e4d89a2b9d02252ca85f2e34\\\",\\\"｠\\\"],[\\\"2a74d4ad7292c858dc2bb559de67f2d9\\\",\\\"｠\\\"],[\\\"8c810b8cbe6159e837a88575bb4e6033\\\",\\\"｠\\\"],[\\\"dc66317cd6fff4f4221069a20f321fce\\\",\\\"｠\\\"],[\\\"563e1633d226c10ef4ec80638997e4a9\\\",\\\"『\\\"],[\\\"0993d5cdf910f481eeefa19e4f09d77c\\\",\\\"『\\\"],[\\\"7b80a8345c16e2d4f8ff2691e245c2b1\\\",\\\"『\\\"],[\\\"016669fa94786f9581342d47f317c02c\\\",\\\"『\\\"],[\\\"01d3eb52ab29f0eecc62ff74224fffd4\\\",\\\"『\\\"],[\\\"089aa1d87915ef8ad3c43982ac657c8c\\\",\\\"『\\\"],[\\\"30e8cb69cda3ad84e87943c4351c24b7\\\",\\\"『\\\"],[\\\"385927959c2621acf57f8d40140924f8\\\",\\\"『\\\"],[\\\"2c256506f406bac4c214318f196ad5db\\\",\\\"『\\\"],[\\\"2d3912e10113e5c7bef33df3249af4a7\\\",\\\"『\\\"],[\\\"8b6444be18f269ac615643b26f9e3041\\\",\\\"『\\\"],[\\\"9c8c1ff659b439f73c65cf4766ab2f14\\\",\\\"『\\\"],[\\\"e4caa1628ad6878f14be986761e06aaa\\\",\\\"『\\\"],[\\\"e702912587801d73d58cdb30e48debed\\\",\\\"』\\\"],[\\\"d70bb2b097f44c1ddefb93bf92bbb5cd\\\",\\\"』\\\"],[\\\"f2b927267947a75b891403f95db72005\\\",\\\"』\\\"],[\\\"4ec38a1d8d22e4df6c359f00f7ad8662\\\",\\\"』\\\"],[\\\"55c9ea9aa8eb630e5ecb793b2f85c927\\\",\\\"』\\\"],[\\\"70376e1ea05a3438a19c062ad49a7960\\\",\\\"』\\\"],[\\\"8fe7cb78ca24d1973419eecf99252a88\\\",\\\"』\\\"],[\\\"9ee59c7d2c202e0214836a0138f59e24\\\",\\\"』\\\"],[\\\"b56aaf7fc68c5e206ccbc2ee1442b3af\\\",\\\"』\\\"],[\\\"ba37f6b56d8fc8980c8236de9894fa61\\\",\\\"』\\\"],[\\\"cc9fde9238a2bf78fd1c13f65b098e77\\\",\\\"』\\\"],[\\\"f02e3e84dcd71c5d3bab2b7b4b99bd7e\\\",\\\"』\\\"],[\\\"f686e0b742abe806fccbd4d9b3fcc4cd\\\",\\\"』\\\"],[\\\"37f6ecf37a0a3ef8dff083ccc8754f81\\\",\\\"♬\\\"],[\\\"3336f18e849144658f212bd9399bec5f\\\",\\\"♬\\\"],[\\\"93efdc18683d8ecacb0a920d5f2fffb3\\\",\\\"♬\\\"],[\\\"9b8325b71aa6a000d24f88c4d7ec730d\\\",\\\"♬\\\"],[\\\"ab791ef796e6b5d66f13ed9aea3e8ab2\\\",\\\"♬\\\"],[\\\"6eb29f1917caea1cadf94f5496a4c374\\\",\\\"↱\\\"],[\\\"583134b86e7d90960f64c5b863196978\\\",\\\"➡\\\"],[\\\"4ba716a88c003ca0a069392be3b63951\\\",\\\"➡\\\"],[\\\"4e0fbe47e3ba0fd5949bda53f11b16a5\\\",\\\"➡\\\"],[\\\"61ec226a927ee80fffa12db219a43233\\\",\\\"➡\\\"],[\\\"8e5b873ac8e1bf84246b281b3548c2ff\\\",\\\"↴\\\"],[\\\"a78d9b65f46654601ce0145622164b47\\\",\\\"↴\\\"],[\\\"5d01e6804b9aaec0c276f77306888c54\\\",\\\"↴\\\"],[\\\"6168af1e81b6497fccb6b8d3226a8016\\\",\\\"↴\\\"],[\\\"4360c0b7364802b680f5a65fa415bdd6\\\",\\\"↗\\\"],[\\\"4dab788480bb9ac50d2454b58438e407\\\",\\\"↗\\\"],[\\\"bfb2d58ab8c469d2b8b5c42d81e4e3b7\\\",\\\"↗\\\"],[\\\"4c503a0873195bfe8d71c9d55669781b\\\",\\\"→\\\"],[\\\"caf36eff2cf3580cd66c5cd021ee4c09\\\",\\\"→\\\"],[\\\"f00be20caf0aaef3a6fbec90a0e71852\\\",\\\"Ⅰ\\\"],[\\\"e660e1e23a6ddc9a5d2e0e1ef7ac5b86\\\",\\\"Ⅱ\\\"],[\\\"a62583f621fb5405add08e8f0beb6db4\\\",\\\"Ⅱ\\\"],[\\\"0e761ebb18b9870383725b3712f5c8d4\\\",\\\"Ⅱ\\\"],[\\\"1f65debfbf9df96de52c6f80922b012b\\\",\\\"Ⅱ\\\"],[\\\"5c13facf2da9f38922a9419061771ed0\\\",\\\"Ⅱ\\\"],[\\\"75a65cc3171c4c7ca0141042846ab91a\\\",\\\"Ⅱ\\\"],[\\\"eae94a6301787ff7bf77786ae4424601\\\",\\\"Ⅱ\\\"],[\\\"f1add7809e18e064e4609783211c9815\\\",\\\"Ⅲ\\\"],[\\\"a7ee6f7f63d348e2b8fb7ee9503f3c5c\\\",\\\"♡\\\"],[\\\"9c8cfb5e9349b06f0939605638896f4e\\\",\\\"♥\\\"],[\\\"45ce7d6d5c779136d32d3e60e13e10cd\\\",\\\"⅕\\\"],[\\\"51f5fe58aaf460263b766e990fdbe979\\\",\\\"⅕\\\"],[\\\"db40b0a65939e462396822d5ab3c6d9c\\\",\\\"⅕\\\"],[\\\"d9e3a48d5a7c6ba6f8db18f56cf91f92\\\",\\\"⅛\\\"],[\\\"86586bcdf8f14883f846849e93ca274c\\\",\\\"⅜\\\"],[\\\"9d81f46e134081d56bc92f69eebfabd9\\\",\\\"⅒\\\"],[\\\"18dddb04a4fe9b3f5c7b79e68fb8ab4b\\\",\\\"⅒\\\"],[\\\"eff8659a150859b7b69682a023b283c1\\\",\\\"⅒\\\"],[\\\"6e5ccf08b2bc815b0923df83cf9fafa1\\\",\\\"㎠\\\"],[\\\"8a77e56517a074d3d2ba426b84a07bf4\\\",\\\"㎠\\\"],[\\\"2c381a0eab014487d50f6f8bae8f0b71\\\",\\\"㎢\\\"],[\\\"9d1a36a1bec1cd2b0b0765f93c1e4f3c\\\",\\\"㎢\\\"],[\\\"e03eb00c54de790d8cc9997527fde905\\\",\\\"㎢\\\"],[\\\"3bce2a06a6a8557082543a6c90a42fe0\\\",\\\"〽\\\"],[\\\"4898c7d9fe3a8a6f9859b0e6f85a4327\\\",\\\"〽\\\"],[\\\"98ab18764756c8ca7608e17f562b21ce\\\",\\\"〽\\\"],[\\\"3037aad230d8cdae3df6e0ebedc0db79\\\",\\\"⁉\\\"],[\\\"66e3474e6cbd8e817ba0a1f8920bf4e7\\\",\\\"⁉\\\"],[\\\"4360dd96063ce1a9660cc8437e8238e3\\\",\\\"⁈\\\"],[\\\"6ce68b7e389c5169309ee956ed0c98a8\\\",\\\"⁈\\\"],[\\\"737a19289d25d963e255f3692ded6536\\\",\\\"⁈\\\"],[\\\"14b18199bbc3f4bf65b72e316bc41d3c\\\",\\\"！\\\"],[\\\"6bf58c146b692aeb403ed1f7618a060a\\\",\\\"！\\\"],[\\\"7f12b67caaf7c8c5075b444bb2a16c70\\\",\\\"！\\\"],[\\\"bfd55f4031ad80cb7401d65937b1d5d9\\\",\\\"〜\\\"],[\\\"4a61f6f7da9e6c8e373f4112cbd453cf\\\",\\\"〜\\\"],[\\\"882ded8f0bb4cdfa4ce28a0b64056d2a\\\",\\\"〜\\\"],[\\\"7726ffbf3a6e953affe6353c24ffb085\\\",\\\"〜\\\"],[\\\"0e290ec6542b5d52c972775e3d7cfeaf\\\",\\\"－\\\"],[\\\"420f1d27972d7cc83929307fbbb6dd50\\\",\\\"－\\\"],[\\\"4aa0e459273a2fe3012d7b3d2e14e07e\\\",\\\"－\\\"],[\\\"030b487ae68da1f4da98046f4fed390f\\\",\\\"一\\\"],[\\\"21699fa18fd14735a312512dfea2bff4\\\",\\\"一\\\"],[\\\"559fc240f4efe5a1e64714ce09217a3e\\\",\\\"一\\\"],[\\\"b7352c3f33a77bc9d3fbf693efbb8095\\\",\\\"一\\\"],[\\\"fcdb30a244fb6aad5255ee2d32fdf7fc\\\",\\\"一\\\"],[\\\"15a0a0fb33aacd4ce730a9503c46df5f\\\",\\\"㊙\\\"],[\\\"9dad4982bd65fbf21525261a7efdf669\\\",\\\"㊙\\\"],[\\\"c3e68e6d08d5429e28ffd6592acf4519\\\",\\\"ゔ\\\"],[\\\"f022cfe594d6f6930d7a5b994e1a0b71\\\",\\\"凜\\\"],[\\\"407057c7b7b1a91d058d572d9a9d3aa5\\\",\\\"凜\\\"],[\\\"fc85b0622183795f89111219dfbc6281\\\",\\\"凜\\\"],[\\\"9707099e5828d97eb12ff2e6ba438558\\\",\\\"凜\\\"],[\\\"987c829b62eb31f467165827766c410d\\\",\\\"凜\\\"],[\\\"58371bb195aaa7a468c5c508351ac383\\\",\\\"凜\\\"],[\\\"32324012ed7274a15002b66ed1e464f8\\\",\\\"蜻\\\"],[\\\"0ffb731db8d4a6b711f97bbb08ed8819\\\",\\\"蜻\\\"],[\\\"d90aae9a752e9b61662a9cafa837961f\\\",\\\"祓\\\"],[\\\"23d6c6f231ac5d51f4cdaaaa26701956\\\",\\\"祓\\\"],[\\\"81cbedabd8f88d4494255b0631820dfd\\\",\\\"祓\\\"],[\\\"4185f93a5571e49433ca9c13ae588f96\\\",\\\"魎\\\"],[\\\"9ab74d6e8bda8723614017a7fce587fe\\\",\\\"魎\\\"],[\\\"e96a39a050b694e5f8aadb111420b698\\\",\\\"𠮷\\\"],[\\\"08c5eb5fac4f1d362b946689eb2e4edf\\\",\\\"𠮷\\\"],[\\\"2cef7e443c22f5835658e67749ae52d1\\\",\\\"𠮷\\\"],[\\\"4ab0dd1578c8c5fa25f45938ff0f8575\\\",\\\"𠮷\\\"],[\\\"4c392bb90a1f62796f8fba2c19b4a7de\\\",\\\"𠮷\\\"],[\\\"43856fd7c04a779e571fe24c47f02a6c\\\",\\\"髙\\\"],[\\\"265efc2a174c73ea229f9ffefa703f32\\\",\\\"髙\\\"],[\\\"5a7af09cce6b3005355e1c6c82df8858\\\",\\\"髙\\\"],[\\\"808e9b858294184933f8bf45d6291572\\\",\\\"髙\\\"],[\\\"27f0c69a76bf571d6dc25db389d20779\\\",\\\"髙\\\"],[\\\"46fb250f60436fd5f33808343893ca12\\\",\\\"髙\\\"],[\\\"8a8c4c67a6094d4dc6039e5fe931159c\\\",\\\"髙\\\"],[\\\"9257f3792fcfcd21b85524d5f86f624e\\\",\\\"髙\\\"],[\\\"d502a276d6f311449597ee9e576d9217\\\",\\\"髙\\\"],[\\\"eaa49075e50fbe1fa4b7f593dfd95620\\\",\\\"髙\\\"],[\\\"c01d2bafce469da1abbb612fdb16c1e3\\\",\\\"元\\\"],[\\\"e1ce03321fdb4eaca026a49a43e521a5\\\",\\\"元\\\"],[\\\"0cfa6c95283a90eff3733db1ac80f58a\\\",\\\"元\\\"],[\\\"52c1ad5b834821dc6b85ec27bdea1f76\\\",\\\"元\\\"],[\\\"ad088cffd260c1fccb655cae17b14803\\\",\\\"元\\\"],[\\\"a9ee52eaa5b4cc32d1891d540bfe93cc\\\",\\\"塚\\\"],[\\\"a00182f1de36aaee28cac80a3c89d067\\\",\\\"塚\\\"],[\\\"b03d44ca831a0c995116056ce23f82c5\\\",\\\"塚\\\"],[\\\"2d6b7d3b5ca6c02d94c5b48661045b7a\\\",\\\"﨑\\\"],[\\\"f5c6e02e235abd23a87f48ed6a64cdcc\\\",\\\"﨑\\\"],[\\\"e9a3b055bda7b9ae70bde4003a4c5885\\\",\\\"﨑\\\"],[\\\"cb17df533b4ebd698a038defeddecf8a\\\",\\\"﨑\\\"],[\\\"0ea39c05c35f96d5b5a48e9815974132\\\",\\\"﨑\\\"],[\\\"3f642f3778827e651c8b82a4e9f06fd3\\\",\\\"﨑\\\"],[\\\"447d8358f482a4e1d9495902ebe269b1\\\",\\\"﨑\\\"],[\\\"ca59a20f1e0ee55b74db34697f961385\\\",\\\"﨑\\\"],[\\\"d2eae5651260b39c4239bcf00c8a76c5\\\",\\\"﨑\\\"],[\\\"f55eb365a9ded45d1e620f83d9f9de26\\\",\\\"﨑\\\"],[\\\"2b385c2642704e44347f2f4db147c8fa\\\",\\\"葛\\\"],[\\\"5c3a8c3a891386a771ff8f00a239b4ba\\\",\\\"葛\\\"],[\\\"e8caa78518e2d690af54e2206c9538f8\\\",\\\"彅\\\"],[\\\"2e8659ae5e220240c5f8a97147d09df6\\\",\\\"彅\\\"],[\\\"7592e633260537c1dfa7e5af1000752a\\\",\\\"彅\\\"],[\\\"a57d3f7684c28d2a901fe6020145de32\\\",\\\"彅\\\"],[\\\"da3ab2d5da4d69c7d312c7d819e45856\\\",\\\"彅\\\"],[\\\"918e84ed41c2157aa5f5bbf9aa60514c\\\",\\\"塡\\\"],[\\\"b1e889986beb3a6518d8c2ea53547b7c\\\",\\\"塡\\\"],[\\\"d449ab392afa98c27eb817c40e2eb7ce\\\",\\\"塡\\\"],[\\\"e7158075f2976c353e4cf9247aae3abc\\\",\\\"遁\\\"],[\\\"f1a6fbb17f041cc15148163da34f541f\\\",\\\"遁\\\"],[\\\"a1779a3aaf215916fd0d8fbbb5bf5925\\\",\\\"蟬\\\"],[\\\"a3c09b57be535c0f5618d72f95884c50\\\",\\\"蟬\\\"],[\\\"4b9401a9f9a58c7d0f9c86120aa2dd23\\\",\\\"鏢\\\"],[\\\"fe00b640a48dd341573cafa94afeafa2\\\",\\\"鏢\\\"],[\\\"f4e1d8b42e3c49ea7c896049186d74bd\\\",\\\"蟜\\\"],[\\\"640130a634bd2a0f4347f933a8c5d6d6\\\",\\\"蟜\\\"],[\\\"62985aeebaec69314f03ff9d3080ada2\\\",\\\"鷗\\\"],[\\\"1bd027207977c585c5889a1e24cae94e\\\",\\\"鷗\\\"],[\\\"5c8022286d3bc941c12e9bbc475255dd\\\",\\\"鷗\\\"],[\\\"e4a837fe20dfa091e03afe4857e2482e\\\",\\\"剝\\\"],[\\\"bf2cccb40b985fe3af04281944beac1a\\\",\\\"剝\\\"],[\\\"d5451a035c4e516e5ccb9372cd533d81\\\",\\\"剝\\\"],[\\\"e13ae32f28d840df74a88432df9b122e\\\",\\\"剝\\\"],[\\\"41637d181cd99088e2120a4ec6fc18aa\\\",\\\"嬴\\\"],[\\\"de63abb1aaa44e6ab8a11470103377d5\\\",\\\"嬴\\\"],[\\\"3d32b12254e01c701c195412cb8ef37c\\\",\\\"嬴\\\"],[\\\"f67bc6318ccf43e7902df9a6f9622932\\\",\\\"嬴\\\"],[\\\"d4ce6847d78fc2f8241088b5c0be795c\\\",\\\"嬴\\\"],[\\\"c472e6ade04610e67904aca1b1fa1468\\\",\\\"麃\\\"],[\\\"db3d060943fbf888eb2fa7fd87340cba\\\",\\\"麃\\\"],[\\\"509cff0edcba46d5db30b2f2f45c49c9\\\",\\\"瘣\\\"],[\\\"4862270872e35184aab420c4d38169ad\\\",\\\"瘣\\\"],[\\\"def4d364d00d0f78577987eaebd42aef\\\",\\\"齕\\\"],[\\\"3cc113a87b49ce231a7b2ffbca4c1e18\\\",\\\"齕\\\"],[\\\"03dddff25be65f7c284ef8addb8a0a8b\\\",\\\"驁\\\"],[\\\"52aa815a5a57aff03085d31acd5afbc4\\\",\\\"驁\\\"],[\\\"4f0431c4c63a6a362646758e62521df8\\\",\\\"煖\\\"],[\\\"dbf1ab17c746c48d474b3730064ba6f2\\\",\\\"煖\\\"],[\\\"790c6b4da6a88f7f4fdb6fdab77fe045\\\",\\\"煖\\\"],[\\\"4d7ae77f2bbf9c8af03d49d466f74058\\\",\\\"煖\\\"],[\\\"0335ba124be8a9e0c501f4051ac5fcf5\\\",\\\"龐\\\"],[\\\"01d7892b430fd4362c8917ad921199b2\\\",\\\"龐\\\"],[\\\"e866fd7e605c8b7c8bf718c45a5438cf\\\",\\\"龐\\\"],[\\\"5df7d88e1e15018b3bce73e765ef72d6\\\",\\\"槌\\\"],[\\\"48478e1f69ea50c6f7709d47f15b4007\\\",\\\"槌\\\"],[\\\"4d7d276f23c92f94056b292e295ebd78\\\",\\\"神\\\"],[\\\"87d2b97034cf680cd86bc7fe7c500d93\\\",\\\"神\\\"],[\\\"f6300abbfcd6bd0db3abd41041499aaa\\\",\\\"邂\\\"],[\\\"26c476496eb73e15285527ab7c635f0b\\\",\\\"邂\\\"],[\\\"be33b9008a58bab485e17de9b2ab2626\\\",\\\"逅\\\"],[\\\"3a9b8b576fe8efca2dedc957732afa37\\\",\\\"逅\\\"],[\\\"b798637262a0c1a29c8de602d4b688c6\\\",\\\"逅\\\"],[\\\"a3785fd94f13646623554b180d08ac77\\\",\\\"德\\\"],[\\\"1f81885b0996be70410e5aa3e4aab3c6\\\",\\\"德\\\"],[\\\"88425dfcbd96fcb6d77ebb76f834d986\\\",\\\"德\\\"],[\\\"9f993f913cd0614a3a965d74e0f4c8d1\\\",\\\"德\\\"],[\\\"a8bb5f2f83d975edfc951a1e461befdc\\\",\\\"德\\\"],[\\\"cd2eadbb87d0aadf1d1cd71fed0ab02f\\\",\\\"德\\\"],[\\\"d22feeb00ace0a632e1a780682f937e8\\\",\\\"德\\\"],[\\\"c9f2fda15b722253c625aebe73f4b1d9\\\",\\\"辻\\\"],[\\\"04556b37bff1ccc2f3b395232e104934\\\",\\\"辻\\\"],[\\\"117bacaeb67e3508d23a650b98f3c143\\\",\\\"辻\\\"],[\\\"211d70374c1787c4bc62df15794a4692\\\",\\\"辻\\\"],[\\\"7ba50856c59d1de19cc9c88caaced915\\\",\\\"辻\\\"],[\\\"0d627ebf7693b13645336a88813fb7e3\\\",\\\"祀\\\"],[\\\"2c3c032660b20a485575c2d8c7d47956\\\",\\\"祀\\\"],[\\\"1aaec04e53f2978bdf0a127c01b34e9a\\\",\\\"遼\\\"],[\\\"e2c3bf09b755b0d59a8a25cba6dda273\\\",\\\"遼\\\"],[\\\"fb13879ba2f93a8b0a28b2cd5358d1ee\\\",\\\"遼\\\"],[\\\"20eff1fff8d986496b949efa604ec402\\\",\\\"誾\\\"],[\\\"8742940fcbdbd65aeff1566c1889ece7\\\",\\\"誾\\\"],[\\\"23e6ef0ecc7bbe8e9465b0b40e901c0d\\\",\\\"厓\\\"],[\\\"5a69785acb47d746fd1ae98bd511db81\\\",\\\"厓\\\"],[\\\"392b8afa18046fc06398b32a42641889\\\",\\\"你\\\"],[\\\"7ff2c821d31ef0ca7e9c430f3e659d46\\\",\\\"你\\\"],[\\\"44d8b7aacbfc1fc4c32d6526ab8012ee\\\",\\\"祠\\\"],[\\\"c9486b883ab870fc02e7a1f189454f49\\\",\\\"祠\\\"],[\\\"62e7447a02f797cf287a7a758d66563b\\\",\\\"擲\\\"],[\\\"7d767d2518431dd61e631941dea6bb5e\\\",\\\"擲\\\"],[\\\"914fa35485d5016adc8b799b0cb5e978\\\",\\\"口\\\"],[\\\"d50802fc331261feed1a140f3b70c4b3\\\",\\\"口\\\"],[\\\"eeff4833bdfc34b1cbfe6a9d98f38cb5\\\",\\\"口\\\"],[\\\"a6d6aaeaf5505676111390a52fa6be51\\\",\\\"暲\\\"],[\\\"bc534a1accc68d8876e9d47ad8d4b489\\\",\\\"暲\\\"],[\\\"b5e8cb114ccad281bcb4d86768d509df\\\",\\\"銈\\\"],[\\\"d2c0ab0242ae4ad8a08bffa71613a1a7\\\",\\\"銈\\\"],[\\\"f09031463933b2892be7ebbc501269d0\\\",\\\"蕙\\\"],[\\\"f1378529fe66a7f655031d7f5b8c4eb5\\\",\\\"蕙\\\"],[\\\"6b696a5ae7634c454aaa7dd833fdfaf9\\\",\\\"眷\\\"],[\\\"5012d099f110e5e7c0df78528686ae07\\\",\\\"榮\\\"],[\\\"bf27e95238dd789b05e38d56dc41cbf7\\\",\\\"嵓\\\"],[\\\"1d2eafa6be36dc6152cb1917cd2ac486\\\",\\\"氏\\\"],[\\\"8b1bd5636f709dfd6a95da9f463729c3\\\",\\\"柀\\\"],[\\\"0b49a77f459cf3783c5bac37a80518c5\\\",\\\"份\\\"],[\\\"8d1ba0e24b619cb4d377ddb7adb3e6fa\\\",\\\"喼\\\"],[\\\"dab4c329f3c540192f758a2e0008d275\\\",\\\"鎚\\\"],[\\\"5b6c90ad3012bfbbc2450b5ab930484d\\\",\\\"翟\\\"],[\\\"7eb78d5654f8335d0b1cf4cf78872097\\\",\\\"鄭\\\"],[\\\"c3852ea003683f2866abd56140fb5d84\\\",\\\"錆\\\"],[\\\"a78b8a79d8a32c925776c82955d168cc\\\",\\\"郭\\\"],[\\\"b6e773b060fdd575bc965369d509f4e0\\\",\\\"煉\\\"],[\\\"6d981a3b846347e2b3c9ca4d13794834\\\",\\\"桒\\\"],[\\\"d0ed8ffbc229f84dd796cdd6de36d2e4\\\",\\\"䃯\\\"],[\\\"d9aff359058ab474d552ce52e5a71ec8\\\",\\\"卿\\\"],[\\\"5417381484172c1607d7ca60765b62d2\\\",\\\"蝕\\\"],[\\\"b309cd2c649ce3ef6ea0ad2f5fc655cc\\\",\\\"這\\\"],[\\\"2a349ac3d6b94a8a64d904083fdd5c02\\\",\\\"辿\\\"],[\\\"0632283bfd909ef205b1f950e2b00f16\\\",\\\"靑\\\"],[\\\"d91c5a40619510b21610f523f9434269\\\",\\\"淸\\\"],[\\\"8dc47c6e65beb788da7ed9efd59f0934\\\",\\\"買\\\"],[\\\"e28d4c57d97fbe4a0d67aec2cc92e7c8\\\",\\\"捥\\\"],[\\\"9374173a2e4b7f1dcac75eccd5ee7e7f\\\",\\\"榊\\\"]]),b=(i(1415),new Set([\\\"⛌\\\",\\\"⛍\\\",\\\"❗\\\",\\\"⛏\\\",\\\"⛐\\\",\\\"⛑\\\",\\\"⛒\\\",\\\"⛕\\\",\\\"⛓\\\",\\\"⛔\\\",\\\"\\\",\\\"\\\",\\\"⛖\\\",\\\"⛗\\\",\\\"⛘\\\",\\\"⛙\\\",\\\"⛚\\\",\\\"⛛\\\",\\\"⛜\\\",\\\"⛝\\\",\\\"⛞\\\",\\\"⛟\\\",\\\"⛠\\\",\\\"⛡\\\",\\\"⭕\\\",\\\"㉈\\\",\\\"㉉\\\",\\\"㉊\\\",\\\"㉋\\\",\\\"㉌\\\",\\\"㉍\\\",\\\"㉎\\\",\\\"㉏\\\",\\\"⒑\\\",\\\"⒒\\\",\\\"⒓\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⬛\\\",\\\"⬤\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⚿\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㊙\\\",\\\"\\\",\\\"⛣\\\",\\\"⭖\\\",\\\"⭗\\\",\\\"⭘\\\",\\\"⭙\\\",\\\"☓\\\",\\\"㊋\\\",\\\"〒\\\",\\\"⛨\\\",\\\"㉆\\\",\\\"㉅\\\",\\\"⛩\\\",\\\"࿖\\\",\\\"⛪\\\",\\\"⛫\\\",\\\"⛬\\\",\\\"♨\\\",\\\"⛭\\\",\\\"⛮\\\",\\\"⛯\\\",\\\"⚓\\\",\\\"✈\\\",\\\"⛰\\\",\\\"⛱\\\",\\\"⛲\\\",\\\"⛳\\\",\\\"⛴\\\",\\\"⛵\\\",\\\"\\\",\\\"Ⓓ\\\",\\\"Ⓢ\\\",\\\"⛶\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛷\\\",\\\"⛸\\\",\\\"⛹\\\",\\\"⛺\\\",\\\"\\\",\\\"☎\\\",\\\"⛻\\\",\\\"⛼\\\",\\\"⛽\\\",\\\"⛾\\\",\\\"\\\",\\\"⛿\\\",\\\"➡\\\",\\\"⬅\\\",\\\"⬆\\\",\\\"⬇\\\",\\\"⬯\\\",\\\"⬮\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㎡\\\",\\\"㎥\\\",\\\"㎝\\\",\\\"㎠\\\",\\\"㎤\\\",\\\"\\\",\\\"⒈\\\",\\\"⒉\\\",\\\"⒊\\\",\\\"⒋\\\",\\\"⒌\\\",\\\"⒍\\\",\\\"⒎\\\",\\\"⒏\\\",\\\"⒐\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㈳\\\",\\\"㈶\\\",\\\"㈲\\\",\\\"㈱\\\",\\\"㈹\\\",\\\"㉄\\\",\\\"▶\\\",\\\"◀\\\",\\\"〖\\\",\\\"〗\\\",\\\"⟐\\\",\\\"²\\\",\\\"³\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㉇\\\",\\\"\\\",\\\"\\\",\\\"℻\\\",\\\"㈪\\\",\\\"㈫\\\",\\\"㈬\\\",\\\"㈭\\\",\\\"㈮\\\",\\\"㈯\\\",\\\"㈰\\\",\\\"㈷\\\",\\\"㍾\\\",\\\"㍽\\\",\\\"㍼\\\",\\\"㍻\\\",\\\"№\\\",\\\"℡\\\",\\\"〶\\\",\\\"⚾\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"ℓ\\\",\\\"㎏\\\",\\\"㎐\\\",\\\"㏊\\\",\\\"㎞\\\",\\\"㎢\\\",\\\"㍱\\\",\\\"½\\\",\\\"↉\\\",\\\"⅓\\\",\\\"⅔\\\",\\\"¼\\\",\\\"¾\\\",\\\"⅕\\\",\\\"⅖\\\",\\\"⅗\\\",\\\"⅘\\\",\\\"⅙\\\",\\\"⅚\\\",\\\"⅐\\\",\\\"⅛\\\",\\\"⅑\\\",\\\"⅒\\\",\\\"☀\\\",\\\"☁\\\",\\\"☂\\\",\\\"⛄\\\",\\\"☖\\\",\\\"☗\\\",\\\"⛉\\\",\\\"⛊\\\",\\\"♦\\\",\\\"♥\\\",\\\"♣\\\",\\\"♠\\\",\\\"⛋\\\",\\\"⨀\\\",\\\"‼\\\",\\\"⁉\\\",\\\"⛅\\\",\\\"☔\\\",\\\"⛆\\\",\\\"☃\\\",\\\"⛇\\\",\\\"⚡\\\",\\\"⛈\\\",\\\"⚞\\\",\\\"⚟\\\",\\\"♬\\\",\\\"\\\",\\\"Ⅰ\\\",\\\"Ⅱ\\\",\\\"Ⅲ\\\",\\\"Ⅳ\\\",\\\"Ⅴ\\\",\\\"Ⅵ\\\",\\\"Ⅶ\\\",\\\"Ⅷ\\\",\\\"Ⅸ\\\",\\\"Ⅹ\\\",\\\"Ⅺ\\\",\\\"Ⅻ\\\",\\\"⑰\\\",\\\"⑱\\\",\\\"⑲\\\",\\\"⑳\\\",\\\"⑴\\\",\\\"⑵\\\",\\\"⑶\\\",\\\"⑷\\\",\\\"⑸\\\",\\\"⑹\\\",\\\"⑺\\\",\\\"⑻\\\",\\\"⑼\\\",\\\"⑽\\\",\\\"⑾\\\",\\\"⑿\\\",\\\"㉑\\\",\\\"㉒\\\",\\\"㉓\\\",\\\"㉔\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㉕\\\",\\\"㉖\\\",\\\"㉗\\\",\\\"㉘\\\",\\\"㉙\\\",\\\"㉚\\\",\\\"①\\\",\\\"②\\\",\\\"③\\\",\\\"④\\\",\\\"⑤\\\",\\\"⑥\\\",\\\"⑦\\\",\\\"⑧\\\",\\\"⑨\\\",\\\"⑩\\\",\\\"⑪\\\",\\\"⑫\\\",\\\"⑬\\\",\\\"⑭\\\",\\\"⑮\\\",\\\"⑯\\\",\\\"❶\\\",\\\"❷\\\",\\\"❸\\\",\\\"❹\\\",\\\"❺\\\",\\\"❻\\\",\\\"❼\\\",\\\"❽\\\",\\\"❾\\\",\\\"❿\\\",\\\"⓫\\\",\\\"⓬\\\",\\\"㉛\\\",\\\"☎\\\",\\\"⛌\\\",\\\"⛍\\\",\\\"❗\\\",\\\"⛏\\\",\\\"⛐\\\",\\\"⛑\\\",\\\"⛒\\\",\\\"⛕\\\",\\\"⛓\\\",\\\"⛔\\\",\\\"🅿\\\",\\\"🆊\\\",\\\"⛖\\\",\\\"⛗\\\",\\\"⛘\\\",\\\"⛙\\\",\\\"⛚\\\",\\\"⛛\\\",\\\"⛜\\\",\\\"⛝\\\",\\\"⛞\\\",\\\"⛟\\\",\\\"⛠\\\",\\\"⛡\\\",\\\"⭕\\\",\\\"㉈\\\",\\\"㉉\\\",\\\"㉊\\\",\\\"㉋\\\",\\\"㉌\\\",\\\"㉍\\\",\\\"㉎\\\",\\\"㉏\\\",\\\"⒑\\\",\\\"⒒\\\",\\\"⒓\\\",\\\"🅊\\\",\\\"🅌\\\",\\\"🄿\\\",\\\"🅆\\\",\\\"🅋\\\",\\\"🈐\\\",\\\"🈑\\\",\\\"🈒\\\",\\\"🈓\\\",\\\"🅂\\\",\\\"🈔\\\",\\\"🈕\\\",\\\"🈖\\\",\\\"🅍\\\",\\\"🄱\\\",\\\"🄽\\\",\\\"⬛\\\",\\\"⬤\\\",\\\"🈗\\\",\\\"🈘\\\",\\\"🈙\\\",\\\"🈚\\\",\\\"🈛\\\",\\\"⚿\\\",\\\"🈜\\\",\\\"🈝\\\",\\\"🈞\\\",\\\"🈟\\\",\\\"🈠\\\",\\\"🈡\\\",\\\"🈢\\\",\\\"🈣\\\",\\\"🈤\\\",\\\"🈥\\\",\\\"🅎\\\",\\\"㊙\\\",\\\"🈀\\\",\\\"⛣\\\",\\\"⭖\\\",\\\"⭗\\\",\\\"⭘\\\",\\\"⭙\\\",\\\"☓\\\",\\\"㊋\\\",\\\"⛨\\\",\\\"㉆\\\",\\\"㉅\\\",\\\"⛩\\\",\\\"࿖\\\",\\\"⛪\\\",\\\"⛫\\\",\\\"⛬\\\",\\\"⛭\\\",\\\"⛮\\\",\\\"⛯\\\",\\\"⚓\\\",\\\"✈\\\",\\\"⛰\\\",\\\"⛱\\\",\\\"⛲\\\",\\\"⛳\\\",\\\"⛴\\\",\\\"⛵\\\",\\\"🅗\\\",\\\"Ⓓ\\\",\\\"Ⓢ\\\",\\\"⛶\\\",\\\"🅟\\\",\\\"🆋\\\",\\\"🆍\\\",\\\"🆌\\\",\\\"🅹\\\",\\\"⛷\\\",\\\"⛸\\\",\\\"⛹\\\",\\\"⛺\\\",\\\"🅻\\\",\\\"⛻\\\",\\\"⛼\\\",\\\"⛽\\\",\\\"⛾\\\",\\\"🅼\\\",\\\"⛿\\\",\\\"➡\\\",\\\"⬅\\\",\\\"⬆\\\",\\\"⬇\\\",\\\"⬯\\\",\\\"⬮\\\",\\\"㎥\\\",\\\"㎠\\\",\\\"㎤\\\",\\\"🄀\\\",\\\"⒈\\\",\\\"⒉\\\",\\\"⒊\\\",\\\"⒋\\\",\\\"⒌\\\",\\\"⒍\\\",\\\"⒎\\\",\\\"⒏\\\",\\\"⒐\\\",\\\"🄁\\\",\\\"🄂\\\",\\\"🄃\\\",\\\"🄄\\\",\\\"🄅\\\",\\\"🄆\\\",\\\"🄇\\\",\\\"🄈\\\",\\\"🄉\\\",\\\"🄊\\\",\\\"㈳\\\",\\\"㈶\\\",\\\"㉄\\\",\\\"⟐\\\",\\\"🄭\\\",\\\"🄬\\\",\\\"🄫\\\",\\\"㉇\\\",\\\"🆐\\\",\\\"🈦\\\",\\\"℻\\\",\\\"㈪\\\",\\\"㈫\\\",\\\"㈬\\\",\\\"㈭\\\",\\\"㈮\\\",\\\"㈯\\\",\\\"㈰\\\",\\\"㈷\\\",\\\"〶\\\",\\\"⚾\\\",\\\"🉀\\\",\\\"🉁\\\",\\\"🉂\\\",\\\"🉃\\\",\\\"🉄\\\",\\\"🉅\\\",\\\"🉆\\\",\\\"🉇\\\",\\\"🉈\\\",\\\"🄪\\\",\\\"🈧\\\",\\\"🈨\\\",\\\"🈩\\\",\\\"🈔\\\",\\\"🈪\\\",\\\"🈫\\\",\\\"🈬\\\",\\\"🈭\\\",\\\"🈮\\\",\\\"🈯\\\",\\\"🈰\\\",\\\"🈱\\\",\\\"㎐\\\",\\\"㏊\\\",\\\"㎢\\\",\\\"㍱\\\",\\\"↉\\\",\\\"⅖\\\",\\\"⅗\\\",\\\"⅘\\\",\\\"⅙\\\",\\\"⅚\\\",\\\"⅐\\\",\\\"⅛\\\",\\\"⅑\\\",\\\"⅒\\\",\\\"⛄\\\",\\\"⛉\\\",\\\"⛊\\\",\\\"⛋\\\",\\\"⨀\\\",\\\"⛅\\\",\\\"☔\\\",\\\"⛆\\\",\\\"⛇\\\",\\\"⚡\\\",\\\"⛈\\\",\\\"⚞\\\",\\\"⚟\\\",\\\"⑴\\\",\\\"⑵\\\",\\\"⑶\\\",\\\"⑷\\\",\\\"⑸\\\",\\\"⑹\\\",\\\"⑺\\\",\\\"⑻\\\",\\\"⑼\\\",\\\"⑽\\\",\\\"⑾\\\",\\\"⑿\\\",\\\"🄐\\\",\\\"🄑\\\",\\\"🄒\\\",\\\"🄓\\\",\\\"🄔\\\",\\\"🄕\\\",\\\"🄖\\\",\\\"🄗\\\",\\\"🄘\\\",\\\"🄙\\\",\\\"🄚\\\",\\\"🄛\\\",\\\"🄜\\\",\\\"🄝\\\",\\\"🄞\\\",\\\"🄟\\\",\\\"🄠\\\",\\\"🄡\\\",\\\"🄢\\\",\\\"🄣\\\",\\\"🄤\\\",\\\"🄥\\\",\\\"🄦\\\",\\\"🄧\\\",\\\"🄨\\\",\\\"🄩\\\"])),g=[0,4129,8258,12387,16516,20645,24774,28903,33032,37161,41290,45419,49548,53677,57806,61935,4657,528,12915,8786,21173,17044,29431,25302,37689,33560,45947,41818,54205,50076,62463,58334,9314,13379,1056,5121,25830,29895,17572,21637,42346,46411,34088,38153,58862,62927,50604,54669,13907,9842,5649,1584,30423,26358,22165,18100,46939,42874,38681,34616,63455,59390,55197,51132,18628,22757,26758,30887,2112,6241,10242,14371,51660,55789,59790,63919,35144,39273,43274,47403,23285,19156,31415,27286,6769,2640,14899,10770,56317,52188,64447,60318,39801,35672,47931,43802,27814,31879,19684,23749,11298,15363,3168,7233,60846,64911,52716,56781,44330,48395,36200,40265,32407,28342,24277,20212,15891,11826,7761,3696,65439,61374,57309,53244,48923,44858,40793,36728,37256,33193,45514,41451,53516,49453,61774,57711,4224,161,12482,8419,20484,16421,28742,24679,33721,37784,41979,46042,49981,54044,58239,62302,689,4752,8947,13010,16949,21012,25207,29270,46570,42443,38312,34185,62830,58703,54572,50445,13538,9411,5280,1153,29798,25671,21540,17413,42971,47098,34713,38840,59231,63358,50973,55100,9939,14066,1681,5808,26199,30326,17941,22068,55628,51565,63758,59695,39368,35305,47498,43435,22596,18533,30726,26663,6336,2273,14466,10403,52093,56156,60223,64286,35833,39896,43963,48026,19061,23124,27191,31254,2801,6864,10931,14994,64814,60687,56684,52557,48554,44427,40424,36297,31782,27655,23652,19525,15522,11395,7392,3265,61215,65342,53085,57212,44955,49082,36825,40952,28183,32310,20053,24180,11923,16050,3793,7920],y=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2?arguments[2]:void 0;null==i&&(i=t.length);for(var r=0,n=e;n<i;n++)r=65535&(r<<8^g[255&(r>>8^t[n])]);return r},m=function(t,e,i,r,n,s,a,o){return 0|((h=e+t(i,r,n)+s+a|0)<<(c=o)|h>>>32-c)+i;var h,c},_=function(t,e,i){return t&e|~t&i},w=function(t,e,i){return t&i|e&~i},x=function(t,e,i){return t^e^i},A=function(t,e,i){return e^(t|~i)},C=function(t){var e=15&t;return\\\"\\\".concat(((240&t)>>4).toString(16)).concat(e.toString(16))},T=function(t){var e=64*Math.floor((t.byteLength+8)/64+1),i=new Uint8Array(e);i.set(new Uint8Array(t),0);var r=new DataView(i.buffer);r.setUint8(t.byteLength,128),r.setUint32(e-8,8*t.byteLength%Math.pow(2,32),!0),r.setUint32(e-4,8*t.byteLength/Math.pow(2,32),!0);for(var n=1732584193,s=-271733879,a=-1732584194,o=271733878,h=0;h<e;h+=64){var c=n,u=s,l=a,f=o;n=m(_,n,s,a,o,r.getUint32(h+0,!0),3614090360,7),o=m(_,o,n,s,a,r.getUint32(h+4,!0),3905402710,12),a=m(_,a,o,n,s,r.getUint32(h+8,!0),606105819,17),s=m(_,s,a,o,n,r.getUint32(h+12,!0),3250441966,22),n=m(_,n,s,a,o,r.getUint32(h+16,!0),4118548399,7),o=m(_,o,n,s,a,r.getUint32(h+20,!0),1200080426,12),a=m(_,a,o,n,s,r.getUint32(h+24,!0),2821735955,17),s=m(_,s,a,o,n,r.getUint32(h+28,!0),4249261313,22),n=m(_,n,s,a,o,r.getUint32(h+32,!0),1770035416,7),o=m(_,o,n,s,a,r.getUint32(h+36,!0),2336552879,12),a=m(_,a,o,n,s,r.getUint32(h+40,!0),4294925233,17),s=m(_,s,a,o,n,r.getUint32(h+44,!0),2304563134,22),n=m(_,n,s,a,o,r.getUint32(h+48,!0),1804603682,7),o=m(_,o,n,s,a,r.getUint32(h+52,!0),4254626195,12),a=m(_,a,o,n,s,r.getUint32(h+56,!0),2792965006,17),s=m(_,s,a,o,n,r.getUint32(h+60,!0),1236535329,22),n=m(w,n,s,a,o,r.getUint32(h+4,!0),4129170786,5),o=m(w,o,n,s,a,r.getUint32(h+24,!0),3225465664,9),a=m(w,a,o,n,s,r.getUint32(h+44,!0),643717713,14),s=m(w,s,a,o,n,r.getUint32(h+0,!0),3921069994,20),n=m(w,n,s,a,o,r.getUint32(h+20,!0),3593408605,5),o=m(w,o,n,s,a,r.getUint32(h+40,!0),38016083,9),a=m(w,a,o,n,s,r.getUint32(h+60,!0),3634488961,14),s=m(w,s,a,o,n,r.getUint32(h+16,!0),3889429448,20),n=m(w,n,s,a,o,r.getUint32(h+36,!0),568446438,5),o=m(w,o,n,s,a,r.getUint32(h+56,!0),3275163606,9),a=m(w,a,o,n,s,r.getUint32(h+12,!0),4107603335,14),s=m(w,s,a,o,n,r.getUint32(h+32,!0),1163531501,20),n=m(w,n,s,a,o,r.getUint32(h+52,!0),2850285829,5),o=m(w,o,n,s,a,r.getUint32(h+8,!0),4243563512,9),a=m(w,a,o,n,s,r.getUint32(h+28,!0),1735328473,14),s=m(w,s,a,o,n,r.getUint32(h+48,!0),2368359562,20),n=m(x,n,s,a,o,r.getUint32(h+20,!0),4294588738,4),o=m(x,o,n,s,a,r.getUint32(h+32,!0),2272392833,11),a=m(x,a,o,n,s,r.getUint32(h+44,!0),1839030562,16),s=m(x,s,a,o,n,r.getUint32(h+56,!0),4259657740,23),n=m(x,n,s,a,o,r.getUint32(h+4,!0),2763975236,4),o=m(x,o,n,s,a,r.getUint32(h+16,!0),1272893353,11),a=m(x,a,o,n,s,r.getUint32(h+28,!0),4139469664,16),s=m(x,s,a,o,n,r.getUint32(h+40,!0),3200236656,23),n=m(x,n,s,a,o,r.getUint32(h+52,!0),681279174,4),o=m(x,o,n,s,a,r.getUint32(h+0,!0),3936430074,11),a=m(x,a,o,n,s,r.getUint32(h+12,!0),3572445317,16),s=m(x,s,a,o,n,r.getUint32(h+24,!0),76029189,23),n=m(x,n,s,a,o,r.getUint32(h+36,!0),3654602809,4),o=m(x,o,n,s,a,r.getUint32(h+48,!0),3873151461,11),a=m(x,a,o,n,s,r.getUint32(h+60,!0),530742520,16),s=m(x,s,a,o,n,r.getUint32(h+8,!0),3299628645,23),n=m(A,n,s,a,o,r.getUint32(h+0,!0),4096336452,6),o=m(A,o,n,s,a,r.getUint32(h+28,!0),1126891415,10),a=m(A,a,o,n,s,r.getUint32(h+56,!0),2878612391,15),s=m(A,s,a,o,n,r.getUint32(h+20,!0),4237533241,21),n=m(A,n,s,a,o,r.getUint32(h+48,!0),1700485571,6),o=m(A,o,n,s,a,r.getUint32(h+12,!0),2399980690,10),a=m(A,a,o,n,s,r.getUint32(h+40,!0),4293915773,15),s=m(A,s,a,o,n,r.getUint32(h+4,!0),2240044497,21),n=m(A,n,s,a,o,r.getUint32(h+32,!0),1873313359,6),o=m(A,o,n,s,a,r.getUint32(h+60,!0),4264355552,10),a=m(A,a,o,n,s,r.getUint32(h+24,!0),2734768916,15),s=m(A,s,a,o,n,r.getUint32(h+52,!0),1309151649,21),n=m(A,n,s,a,o,r.getUint32(h+16,!0),4149444226,6),o=m(A,o,n,s,a,r.getUint32(h+44,!0),3174756917,10),a=m(A,a,o,n,s,r.getUint32(h+8,!0),718787259,15),s=m(A,s,a,o,n,r.getUint32(h+36,!0),3951481745,21),n=c+n|0,s=u+s|0,a=l+a|0,o=f+o|0}var d=\\\"\\\";return d+=C((255&n)>>>0),d+=C((65280&n)>>>8),d+=C((16711680&n)>>>16),d+=C((4278190080&n)>>>24),d+=C((255&s)>>>0),d+=C((65280&s)>>>8),d+=C((16711680&s)>>>16),d+=C((4278190080&s)>>>24),d+=C((255&a)>>>0),d+=C((65280&a)>>>8),d+=C((16711680&a)>>>16),d+=C((4278190080&a)>>>24),d+=C((255&o)>>>0),d+=C((65280&o)>>>8),(d+=C((16711680&o)>>>16))+C((4278190080&o)>>>24)};function k(t){return k=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\\\"function\\\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\\\"symbol\\\":typeof t},k(t)}function F(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:\\\"undefined\\\"!=typeof Symbol&&t[Symbol.iterator]||t[\\\"@@iterator\\\"];if(null!=i){var r,n,s,a,o=[],h=!0,c=!1;try{if(s=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;h=!1}else for(;!(h=(r=s.call(i)).done)&&(o.push(r.value),o.length!==e);h=!0);}catch(t){c=!0,n=t}finally{try{if(!h&&null!=i.return&&(a=i.return(),Object(a)!==a))return}finally{if(c)throw n}}return o}}(t,e)||function(t,e){if(t){if(\\\"string\\\"==typeof t)return S(t,e);var i={}.toString.call(t).slice(8,-1);return\\\"Object\\\"===i&&t.constructor&&(i=t.constructor.name),\\\"Map\\\"===i||\\\"Set\\\"===i?Array.from(t):\\\"Arguments\\\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?S(t,e):void 0}}(t,e)||function(){throw new TypeError(\\\"Invalid attempt to destructure non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\\\")}()}function S(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,r=Array(e);i<e;i++)r[i]=t[i];return r}function R(t,e){for(var i=0;i<e.length;i++){var r=e[i];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(t,I(r.key),r)}}function I(t){var e=function(t){if(\\\"object\\\"!=k(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,\\\"string\\\");if(\\\"object\\\"!=k(i))return i;throw new TypeError(\\\"@@toPrimitive must return a primitive value.\\\")}return String(t)}(t);return\\\"symbol\\\"==k(e)?e:e+\\\"\\\"}var E=null,O=function(){function t(e,i){!function(t,e){if(!(t instanceof e))throw new TypeError(\\\"Cannot call a class as a function\\\")}(this,t),this.option_canvas=null,this.render_canvas=null,this.render_text=\\\"\\\",this.GL=0,this.GR=2,this.G_BACK=[n.get(0),n.get(1),n.get(2),a.get(31)],this.DRCS_mapping=new Map([[15,new Map],[16,new Map],[17,new Map],[18,new Map],[19,new Map],[20,new Map],[21,new Map],[22,new Map],[23,new Map],[24,new Map],[25,new Map],[26,new Map],[27,new Map],[28,new Map],[29,new Map],[30,new Map]]),this.purpose_width=1920,this.purpose_height=1080,this.swf_x=1920,this.swf_y=1080,this.sdf_x=1920,this.sdf_y=1080,this.sdp_x=0,this.sdp_y=0,this.ssm_x=72,this.ssm_y=72,this.shs=8,this.svs=48,this.text_size_x=1,this.text_size_y=1,this.position_x=-1,this.position_y=-1,this.pallet=0,this.fg_color=h[this.pallet][7],this.bg_color=h[this.pallet][8],this.force_bg_color=null,this.hlc=0,this.stl=!1,this.orn=null,this.force_orn=null,this.non_spacing=\\\"\\\",this.timeElapsed=0,this.endTime=null,this.rendered=!1,this.PRA=null,this.normalFont=\\\"sans-serif\\\",this.gaijiFont=this.normalFont,this.drcsReplacement=!1,this.drcsReplaceMapping=new Map,this.useStroke=!1,this.usePUA=!1,this.pes=e,this.startTime=i}return e=t,r=[{key:\\\"setEmbeddedGlyph\\\",value:function(t){E=t}},{key:\\\"detect\\\",value:function(t,e){var i,r,n=null!==(i=null==e?void 0:e.data_identifier)&&void 0!==i?i:128,s=null!==(r=null==e?void 0:e.data_group_id)&&void 0!==r?r:1;if(t.length<=0)return!1;if(t[0]!==n)return!1;if(t.length<=2)return!1;var a=3+(15&t[2]);return!(t.length<=a||(15&(252&t[a+0])>>2)!==s||(y(t,a),0))}},{key:\\\"getRGBAColorCode\\\",value:function(t){if(null==t)return null;var e=document.createElement(\\\"canvas\\\");e.width=e.height=1;var i=e.getContext(\\\"2d\\\");if(!i)return null;i.fillStyle=t,i.fillRect(0,0,e.width,e.height);var r=F(i.getImageData(0,0,1,1).data,4),n=r[0],s=r[1],a=r[2],o=r[3],h=\\\"#\\\".concat(n.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(s.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(a.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(o.toString(16).toUpperCase().padStart(2,\\\"0\\\"));return e.width=e.height=0,h}},{key:\\\"fillAlphaColorCode\\\",value:function(t){if(null==t)return\\\"\\\";var e=Number.parseInt(t.substring(1,3),16),i=Number.parseInt(t.substring(3,5),16),r=Number.parseInt(t.substring(5,7),16);return\\\"#\\\".concat(e.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(i.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(r.toString(16).toUpperCase().padStart(2,\\\"0\\\"),\\\"FF\\\")}},{key:\\\"getRGBAfromColorCode\\\",value:function(t){if(null==t)return\\\"\\\";var e=Number.parseInt(t.substring(1,3),16),i=Number.parseInt(t.substring(3,5),16),r=Number.parseInt(t.substring(5,7),16),n=Number.parseInt(t.substring(7,9),16);return\\\"rgba(\\\".concat(e,\\\", \\\").concat(i,\\\", \\\").concat(r,\\\", \\\").concat(n/255,\\\")\\\")}}],(i=[{key:\\\"initialize\\\",value:function(){this.render_canvas=null,this.option_canvas=null,this.render_text=\\\"\\\",this.GL=0,this.GR=2,this.G_BACK=[n.get(0),n.get(1),n.get(2),a.get(31)],this.DRCS_mapping=new Map([[15,new Map],[16,new Map],[17,new Map],[18,new Map],[19,new Map],[20,new Map],[21,new Map],[22,new Map],[23,new Map],[24,new Map],[25,new Map],[26,new Map],[27,new Map],[28,new Map],[29,new Map],[30,new Map]]),this.purpose_width=1920,this.purpose_height=1080,this.swf_x=1920,this.swf_y=1080,this.sdf_x=1920,this.sdf_y=1080,this.sdp_x=0,this.sdp_y=0,this.ssm_x=72,this.ssm_y=72,this.shs=8,this.svs=48,this.text_size_x=1,this.text_size_y=1,this.position_x=-1,this.position_y=-1,this.pallet=0,this.fg_color=h[this.pallet][7],this.bg_color=h[this.pallet][8],this.force_bg_color=null,this.hlc=0,this.stl=!1,this.orn=null,this.force_orn=null,this.non_spacing=\\\"\\\",this.timeElapsed=0,this.endTime=null,this.rendered=!1,this.PRA=null,this.normalFont=\\\"sans-serif\\\",this.gaijiFont=this.normalFont,this.drcsReplacement=!1,this.drcsReplaceMapping=new Map,this.useStroke=!1,this.usePUA=!1}},{key:\\\"width\\\",value:function(){return Math.floor((this.shs+this.ssm_x)*this.text_size_x)}},{key:\\\"height\\\",value:function(){return Math.floor((this.svs+this.ssm_y)*this.text_size_y)}},{key:\\\"width_magnification\\\",value:function(){return Math.ceil(this.purpose_width/this.swf_x)}},{key:\\\"height_magnification\\\",value:function(){return Math.ceil(this.purpose_height/this.swf_y)}},{key:\\\"canvas_width\\\",value:function(){return this.swf_x*this.width_magnification()}},{key:\\\"canvas_height\\\",value:function(){return this.swf_y*this.height_magnification()}},{key:\\\"move_absolute_dot\\\",value:function(t,e){this.position_x=t,this.position_y=e}},{key:\\\"move_absolute_pos\\\",value:function(t,e){this.position_x=this.sdp_x+t*this.width(),this.position_y=this.sdp_y+(e+1)*this.height()}},{key:\\\"move_relative_pos\\\",value:function(t,e){for((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs));t<0;)this.position_x-=this.width(),t++,this.position_x<this.sdp_x&&(this.position_x=this.sdp_x+this.sdf_x-this.width(),e--);for(;t>0;)this.position_x+=this.width(),t--,this.position_x>=this.sdp_x+this.sdf_x&&(this.position_x=this.sdp_x,e++);for(;e<0;)this.position_y-=this.height(),e++;for(;e>0;)this.position_y+=this.height(),e--}},{key:\\\"move_newline\\\",value:function(){(this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),this.position_x=this.sdp_x,this.position_y=this.position_y+this.height()}},{key:\\\"render\\\",value:function(e){var i,r,n,s,a,o,h,c,u,l,f,d,p,b,g;this.initialize(),this.option_canvas=null!==(i=null==e?void 0:e.canvas)&&void 0!==i?i:null,this.force_orn=null!==(r=\\\"boolean\\\"==typeof(null==e?void 0:e.forceStrokeColor)?null==e?void 0:e.forceStrokeColor:t.getRGBAColorCode(null==e?void 0:e.forceStrokeColor))&&void 0!==r?r:null,this.force_bg_color=null!==(n=t.getRGBAColorCode(null==e?void 0:e.forceBackgroundColor))&&void 0!==n?n:null,this.purpose_width=null!==(s=null!==(a=null==e?void 0:e.width)&&void 0!==a?a:null==e||null===(o=e.canvas)||void 0===o?void 0:o.width)&&void 0!==s?s:this.purpose_width,this.purpose_height=null!==(h=null!==(c=null==e?void 0:e.height)&&void 0!==c?c:null==e||null===(u=e.canvas)||void 0===u?void 0:u.height)&&void 0!==h?h:this.purpose_height,this.normalFont=null!==(l=null==e?void 0:e.normalFont)&&void 0!==l?l:\\\"sans-serif\\\",this.gaijiFont=null!==(f=null==e?void 0:e.gaijiFont)&&void 0!==f?f:this.normalFont,this.drcsReplacement=null!==(d=null==e?void 0:e.drcsReplacement)&&void 0!==d&&d,this.drcsReplaceMapping=new Map(v);for(var y,m=Object.entries(null!==(y=null==e?void 0:e.drcsReplaceMapping)&&void 0!==y?y:{}),_=0;_<m.length;_++){var w=m[_];this.drcsReplaceMapping.set(w[0],w[1])}if(this.useStroke=null!==(p=null==e?void 0:e.useStroke)&&void 0!==p&&p,this.usePUA=null!==(b=null==e?void 0:e.usePUA)&&void 0!==b&&b,!t.detect(this.pes,e))return null;for(var x=3+(15&this.pes[2]),A=(this.pes[x+0],(this.pes[x+3]<<8)+this.pes[x+4]),C=x+9;C<x+(5+A);){this.pes[C+0];var T=this.pes[C+1],k=this.pes[C+2]<<16|this.pes[C+3]<<8|this.pes[C+4];32===T?this.parseText(C+5,C+5+k):48==T?this.parseDRCS(1,C+5,C+5+k):49==T&&this.parseDRCS(2,C+5,C+5+k),C+=5+k}if(this.option_canvas){var F=this.option_canvas.getContext(\\\"2d\\\");if(F&&(F.clearRect(0,0,this.option_canvas.width,this.option_canvas.height),this.render_canvas))if(null!=e&&e.keepAspectRatio){var S=this.option_canvas.width/this.swf_x,R=this.option_canvas.height/this.swf_y,I=Math.min(S,R),E=this.swf_x*I,O=this.swf_y*I,M=(this.option_canvas.width-E)/2,G=(this.option_canvas.height-O)/2;F.drawImage(this.render_canvas,0,0,this.render_canvas.width,this.render_canvas.height,M,G,E,O)}else F.drawImage(this.render_canvas,0,0,this.render_canvas.width,this.render_canvas.height,0,0,this.option_canvas.width,this.option_canvas.height)}return this.render_canvas&&(this.render_canvas.width=this.render_canvas.height=0,this.render_canvas=null),this.option_canvas=null,{startTime:this.startTime,endTime:null!==(g=this.endTime)&&void 0!==g?g:Number.POSITIVE_INFINITY,rendered:this.rendered,textContent:this.rendered?this.render_text:null,PRA:this.PRA}}},{key:\\\"parseText\\\",value:function(t,e){for(;t<e;)if(32<this.pes[t]&&this.pes[t]<127){var i=0,r=this.G_BACK[this.GL];if(!r)return;for(var a=0;a<r.bytes;a++)i<<=8,i|=127&this.pes[t+a];this.renderCharacter(i,r),t+=r.bytes}else if(160<this.pes[t]&&this.pes[t]<255){var c=0,u=this.G_BACK[this.GR];if(!u)return;for(var l=0;l<u.bytes;l++)c<<=8,c|=127&this.pes[t+l];this.renderCharacter(c,u),t+=u.bytes}else if(0===this.pes[t])t+=1;else if(7===this.pes[t])t+=1;else if(8===this.pes[t])this.move_relative_pos(-1,0),t+=1;else if(9===this.pes[t])this.move_relative_pos(1,0),t+=1;else if(10===this.pes[t])this.move_relative_pos(0,1),t+=1;else if(11===this.pes[t])this.move_relative_pos(0,-1),t+=1;else if(12===this.pes[t])null!=this.startTime&&this.timeElapsed>0&&(this.endTime=this.startTime+this.timeElapsed),t+=1;else if(13===this.pes[t])this.move_newline(),t+=1;else if(14===this.pes[t])this.GL=1,t+=1;else if(15===this.pes[t])this.GL=0,t+=1;else if(22===this.pes[t]){var f=63&this.pes[t+1];this.move_relative_pos(f,0),t+=2}else if(24===this.pes[t])t+=1;else if(25===this.pes[t]){var d=0,p=this.G_BACK[2];if(!p)return;for(var v=0;v<p.bytes;v++)d<<=8,d|=127&this.pes[t+1+v];this.renderCharacter(d,p),t+=1+p.bytes}else if(27===this.pes[t])if(110===this.pes[t+1])this.GL=2,t+=2;else if(111==this.pes[t+1])this.GL=3,t+=2;else if(126==this.pes[t+1])this.GR=1,t+=2;else if(125==this.pes[t+1])this.GR=2,t+=2;else if(124==this.pes[t+1])this.GR=3,t+=2;else if(40<=this.pes[t+1]&&this.pes[t+1]<=43){var b=this.pes[t+1]-40;32===this.pes[t+2]?(this.G_BACK[b]=o.get(this.pes[t+3]),t+=4):(this.G_BACK[b]=s.get(this.pes[t+2]),t+=3)}else{if(36!==this.pes[t+1])return;if(40<=this.pes[t+2]&&this.pes[t+2]<=43){var g=this.pes[t+2]-40;32===this.pes[t+3]?(this.G_BACK[g]=o.get(this.pes[t+4]),t+=5):(this.G_BACK[g]=s.get(this.pes[t+3]),t+=4)}else this.G_BACK[0]=s.get(this.pes[t+2]),t+=3}else if(28===this.pes[t]){var y=63&this.pes[t+1],m=63&this.pes[t+2];this.move_absolute_pos(m,y),t+=3}else if(29===this.pes[t]){var _=0,w=this.G_BACK[3];if(!w)return;for(var x=0;x<w.bytes;x++)_<<=8,_|=127&this.pes[t+1+x];this.renderCharacter(_,w),t+=1+w.bytes}else if(30===this.pes[t])t+=1;else if(31===this.pes[t])t+=1;else if(32===this.pes[t]){var A=n.get(0);if(!A)return;this.renderCharacter(8481,A),t+=1}else if(127===this.pes[t])t+=1;else if(128===this.pes[t])this.fg_color=h[this.pallet][0],t+=1;else if(129===this.pes[t])this.fg_color=h[this.pallet][1],t+=1;else if(130===this.pes[t])this.fg_color=h[this.pallet][2],t+=1;else if(131===this.pes[t])this.fg_color=h[this.pallet][3],t+=1;else if(132===this.pes[t])this.fg_color=h[this.pallet][4],t+=1;else if(133===this.pes[t])this.fg_color=h[this.pallet][5],t+=1;else if(134===this.pes[t])this.fg_color=h[this.pallet][6],t+=1;else if(135===this.pes[t])this.fg_color=h[this.pallet][7],t+=1;else if(136===this.pes[t])this.text_size_x=.5,this.text_size_y=.5,t+=1;else if(137===this.pes[t])this.text_size_x=.5,this.text_size_y=1,t+=1;else if(138===this.pes[t])this.text_size_x=1,this.text_size_y=1,t+=1;else{if(139===this.pes[t])return;if(144===this.pes[t]){var C=this.pes[t+1];if(32==C){var T=15&this.pes[t+2];this.pallet=T,t+=3}else{var k=15&C;64==(112&C)?this.fg_color=h[this.pallet][k]:80==(112&C)&&(this.bg_color=h[this.pallet][k]),t+=2}}else if(145===this.pes[t])t+=2;else{if(146===this.pes[t])return;if(147===this.pes[t])return;if(148===this.pes[t])return;if(149===this.pes[t])return;if(151===this.pes[t])this.hlc=15&this.pes[t+1],t+=2;else{if(152===this.pes[t])return;if(153===this.pes[t])this.stl=!1,t+=1;else if(154===this.pes[t])this.stl=!0,t+=1;else if(155===this.pes[t]){for(var F=t,S=-1,R=-1;F+1<e;)if(F+=1,32===this.pes[F])S<0&&(S=F);else if(59===this.pes[F])S<0&&R<0&&(R=F);else{if(66===this.pes[F])break;if(83===this.pes[F]){var I=t+1,E=0;if(R>=0||S<0)return;for(;I<S;)E*=10,E+=15&this.pes[I],I++;if(5===E)this.swf_x=3840,this.swf_y=2160;else if(7===E)this.swf_x=1920,this.swf_y=1080;else{if(9!=E)return;this.swf_x=1440,this.swf_y=960}break}if(84===this.pes[F])break;if(86===this.pes[F]){for(var O=t+1,M=0,G=0;O<R;)M*=10,M+=15&this.pes[O],O++;for(O++;O<S;)G*=10,G+=15&this.pes[O],O++;this.sdf_x=2*M,this.sdf_y=2*G;break}if(87===this.pes[F]){for(var B=t+1,P=0,D=0;B<R;)P*=10,P+=15&this.pes[B],B++;for(B++;B<S;)D*=10,D+=15&this.pes[B],B++;this.ssm_x=2*P,this.ssm_y=2*D;break}if(88===this.pes[F]){for(var j=t+1,L=0;j<S;)L*=10,L+=15&this.pes[j],j++;this.shs=2*L;break}if(89===this.pes[F]){for(var N=t+1,U=0;N<S;)U*=10,U+=15&this.pes[N],N++;this.svs=2*U;break}if(91===this.pes[F])break;if(92===this.pes[F])break;if(93===this.pes[F])break;if(94===this.pes[F])break;if(95===this.pes[F]){for(var z=t+1,H=0,X=0;z<R;)H*=10,H+=15&this.pes[z],z++;for(z++;z<S;)X*=10,X+=15&this.pes[z],z++;this.sdp_x=2*H,this.sdp_y=2*X;break}if(97===this.pes[F]){for(var K=t+1,V=0,$=0;K<R;)V*=10,V+=15&this.pes[K],K++;for(K++;K<S;)$*=10,$+=15&this.pes[K],K++;this.move_absolute_dot(2*V,2*$);break}if(98===this.pes[F])break;if(99===this.pes[F]){var W=this.pes[t+1];if(48==W)this.orn=null;else if(49==W){var Y=10*(15&this.pes[t+3])+(15&this.pes[t+4]),J=10*(15&this.pes[t+5])+(15&this.pes[t+6]);this.orn=h[Y][J]}break}if(100===this.pes[F])break;if(101===this.pes[F])break;if(102===this.pes[F])break;if(103===this.pes[F])break;if(104===this.pes[F]){for(var Z=t+1,q=0;Z<S;)q*=10,q+=15&this.pes[Z],Z++;this.PRA=q;break}if(105===this.pes[F])break;if(106===this.pes[F])break;if(110===this.pes[F])break;if(111===this.pes[F])break}t=F+1}else{if(157!==this.pes[t])return;if(32!=this.pes[t+1])return void this.pes[t+1];var Q=63&this.pes[t+2];this.timeElapsed+=Q/10,t+=3}}}}}},{key:\\\"parseDRCS\\\",value:function(t,e,i){for(this.pes[e+0],e+=1;e<i;){var r=this.pes[e+0]<<8|this.pes[e+1],n=this.pes[e+2];e+=3;for(var s=0;s<n;s++){this.pes[e+0];var a=15&this.pes[e+0];if(0===a||1===a){var h=this.pes[e+1]+2,c=this.pes[e+2],u=this.pes[e+3],l=h.toString(2).length-h.toString(2).replace(/0*$/,\\\"\\\").length,f=Math.floor(c*u*l/8),d=new Uint8Array(Array.prototype.slice.call(this.pes,e+4,e+4+f));if(1===t){var p,v,b=64+((3840&r)>>8),g=127&r,y=null===(p=o.get(b))||void 0===p?void 0:p.alphabet;y&&(null===(v=this.DRCS_mapping.get(y))||void 0===v||v.set(g,d))}else{var m,_=32639&r;null===(m=this.DRCS_mapping.get(15))||void 0===m||m.set(_,d)}e+=4+f}}}}},{key:\\\"renderCharacter\\\",value:function(e,i){var r;if((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),this.option_canvas){this.option_canvas&&!this.render_canvas&&(this.render_canvas=document.createElement(\\\"canvas\\\"),this.render_canvas.width=this.canvas_width(),this.render_canvas.height=this.canvas_height());var s=null===(r=this.render_canvas)||void 0===r?void 0:r.getContext(\\\"2d\\\");if(s){if(0===i.alphabet){var o=((65280&e)>>8)-33,h=(255&e)-33;if(0===o&&12<=h&&h<=17)return void(this.non_spacing=[\\\"́\\\",\\\"̀\\\",\\\"̈\\\",\\\"̂\\\",\\\"̅\\\",\\\"̲\\\"][h-12]);if(1===o&&93===h)return void(this.non_spacing+=\\\"⃝\\\")}var v;if(31!==i.alphabet&&(this.rendered=!0,s.fillStyle=t.getRGBAfromColorCode(null!==(v=this.force_bg_color)&&void 0!==v?v:this.bg_color),s.fillRect(this.position_x*this.width_magnification(),(this.position_y-this.height())*this.height_magnification(),this.width()*this.width_magnification(),this.height()*this.height_magnification()),1&this.hlc&&(s.fillStyle=t.getRGBAfromColorCode(this.fg_color),s.fillRect(this.position_x*this.width_magnification(),(this.position_y-1)*this.height_magnification(),this.width()*this.width_magnification(),1*this.height_magnification())),2&this.hlc&&(s.fillStyle=t.getRGBAfromColorCode(this.fg_color),s.fillRect((this.position_x+this.width()-1)*this.width_magnification(),(this.position_y-this.height())*this.height_magnification(),1*this.width_magnification(),this.height()*this.height_magnification())),4&this.hlc&&(s.fillStyle=t.getRGBAfromColorCode(this.fg_color),s.fillRect(this.position_x*this.width_magnification(),(this.position_y-this.height())*this.height_magnification(),this.width()*this.width_magnification(),1*this.height_magnification())),8&this.hlc&&(s.fillStyle=t.getRGBAfromColorCode(this.fg_color),s.fillRect(this.position_x*this.width_magnification(),(this.position_y-this.height())*this.height_magnification(),1*this.width_magnification(),this.height()*this.height_magnification())),this.stl&&(s.fillStyle=t.getRGBAfromColorCode(this.fg_color),s.fillRect(this.position_x*this.width_magnification(),(this.position_y-1)*this.height_magnification(),this.width()*this.width_magnification(),1*this.height_magnification()))),0===i.alphabet){var b=94*(((65280&e)>>8)-33)+((255&e)-33),g=7896;if(b<g){var y=c[b];this.renderFont(y)}else if(this.usePUA){var m=u[b-g];this.renderFont(m)}else{var _=l[b-g];this.renderFont(_)}this.move_relative_pos(1,0)}else if(1===i.alphabet){var w=f[e-33];this.renderFont(w),this.move_relative_pos(1,0)}else if(2===i.alphabet){var x=d[e-33];this.renderFont(x),this.move_relative_pos(1,0)}else if(3===i.alphabet){var A=p[e-33];this.renderFont(A),this.move_relative_pos(1,0)}else{if(31===i.alphabet)return void(96===e?(this.G_BACK=[n.get(0),n.get(1),n.get(2),a.get(31)],this.GL=0,this.GR=2):97===e?(this.G_BACK=[n.get(0),n.get(3),n.get(2),a.get(31)],this.GL=0,this.GR=2):98===e?(this.G_BACK=[n.get(0),a.get(16),n.get(2),a.get(31)],this.GL=0,this.GR=2):99===e?(this.G_BACK=[n.get(4),n.get(6),n.get(7),a.get(31)],this.GL=0,this.GR=2):100===e?(this.G_BACK=[n.get(4),n.get(5),n.get(7),a.get(31)],this.GL=0,this.GR=2):101===e?(this.G_BACK=[n.get(4),a.get(16),n.get(7),a.get(31)],this.GL=0,this.GR=2):102===e?(this.G_BACK=[a.get(16),a.get(17),a.get(18),a.get(31)],this.GL=0,this.GR=2):103===e?(this.G_BACK=[a.get(19),a.get(20),a.get(21),a.get(31)],this.GL=0,this.GR=2):104===e?(this.G_BACK=[a.get(22),a.get(23),a.get(24),a.get(31)],this.GL=0,this.GR=2):105===e?(this.G_BACK=[a.get(25),a.get(26),a.get(27),a.get(31)],this.GL=0,this.GR=2):106===e?(this.G_BACK=[a.get(28),a.get(29),a.get(30),a.get(31)],this.GL=0,this.GR=2):107===e?(this.G_BACK=[n.get(0),a.get(17),n.get(2),a.get(31)],this.GL=0,this.GR=2):108===e?(this.G_BACK=[n.get(0),a.get(18),n.get(2),a.get(31)],this.GL=0,this.GR=2):109===e?(this.G_BACK=[n.get(0),a.get(19),n.get(2),a.get(31)],this.GL=0,this.GR=2):110===e?(this.G_BACK=[n.get(3),n.get(2),n.get(1),a.get(31)],this.GL=0,this.GR=2):111===e&&(this.G_BACK=[n.get(1),n.get(4),a.get(16),a.get(31)],this.GL=0,this.GR=2));var C,k=null===(C=this.DRCS_mapping.get(i.alphabet))||void 0===C?void 0:C.get(32639&e);if(!k)return;var F=T(k.buffer);if(this.drcsReplacement&&this.drcsReplaceMapping.has(F.toLowerCase()))this.renderFont(this.drcsReplaceMapping.get(F.toLowerCase()));else if(this.drcsReplacement&&this.drcsReplaceMapping.has(F.toUpperCase()))this.renderFont(this.drcsReplaceMapping.get(F.toUpperCase()));else{var S=Math.floor(this.ssm_x*this.text_size_x/2),R=Math.floor(this.ssm_y*this.text_size_y/2),I=Math.floor(8*k.length/(S*R)),E=this.getOrnColorCode();if(E&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color)){s.fillStyle=t.getRGBAfromColorCode(E);for(var O=-2*this.height_magnification();O<=2*this.height_magnification();O++)for(var M=-2*this.width_magnification();M<=2*this.width_magnification();M++)for(var G=0;G<R;G++)for(var B=0;B<S;B++){for(var P=0,D=0;D<I;D++){var j=7-((G*S+B)*I+D)%8;P*=2,P+=(k[Math.floor(((G*S+B)*I+D)/8)]&1<<j)>>j}P>0&&s.fillRect((this.position_x-0+Math.floor(this.shs*this.text_size_x/2)+2*B)*this.width_magnification()+2*M,(this.position_y-this.height()+Math.floor(this.svs*this.text_size_y/2)+2*G)*this.height_magnification()+2*O,2*this.width_magnification(),2*this.height_magnification())}}s.fillStyle=t.getRGBAfromColorCode(this.fg_color);for(var L=0;L<R;L++)for(var N=0;N<S;N++){for(var U=0,z=0;z<I;z++){var H=7-((L*S+N)*I+z)%8;U*=2,U+=(k[Math.floor(((L*S+N)*I+z)/8)]&1<<H)>>H}U>0&&s.fillRect((this.position_x-0+Math.floor(this.shs*this.text_size_x/2)+2*N)*this.width_magnification(),(this.position_y-this.height()+Math.floor(this.svs*this.text_size_y/2)+2*L)*this.height_magnification(),2*this.width_magnification(),2*this.height_magnification())}}this.move_relative_pos(1,0)}}}}},{key:\\\"renderFont\\\",value:function(e){var i;if(e+=this.non_spacing,this.non_spacing=\\\"\\\",.5===this.text_size_x&&.5===this.text_size_y&&(d.includes(e)||p.includes(e))||(this.render_text+=e),this.render_canvas)if(null!=E&&E.has(e)){var r=E.get(e),n=r.viewBox,s=r.path;this.renderPath(n,s)}else{var a=b.has(e);a&&(e+=\\\"︎\\\");var o=null===(i=this.render_canvas)||void 0===i?void 0:i.getContext(\\\"2d\\\");if(o){var h=(this.position_x+this.width()/2)*this.width_magnification(),c=(this.position_y-this.height()/2)*this.height_magnification();o.translate(h,c),o.scale(this.text_size_x*this.width_magnification(),this.text_size_y*this.height_magnification());var u=this.getOrnColorCode();if(u&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color))if(this.useStroke)o.font=\\\"\\\".concat(this.ssm_x,\\\"px \\\").concat(a?this.gaijiFont:this.normalFont),o.strokeStyle=t.getRGBAfromColorCode(u),o.lineJoin=\\\"round\\\",o.textBaseline=\\\"middle\\\",o.textAlign=\\\"center\\\",o.lineWidth=8,o.strokeText(e,0,0);else{o.setTransform(1,0,0,1,0,0),o.translate(h,c),o.scale(this.text_size_x,this.text_size_y*this.height_magnification()/this.width_magnification());for(var l=-4*this.width_magnification();l<=4*this.width_magnification();l++)for(var f=-4*this.width_magnification();f<=4*this.width_magnification();f++)o.font=\\\"\\\".concat(this.ssm_x*this.width_magnification(),\\\"px \\\").concat(a?this.gaijiFont:this.normalFont),o.fillStyle=t.getRGBAfromColorCode(u),o.textBaseline=\\\"middle\\\",o.textAlign=\\\"center\\\",o.fillText(e,0+f,0+l);o.setTransform(1,0,0,1,0,0),o.translate(h,c),o.scale(this.text_size_x*this.width_magnification(),this.text_size_y*this.height_magnification())}o.font=\\\"\\\".concat(this.ssm_x,\\\"px \\\").concat(a?this.gaijiFont:this.normalFont),o.fillStyle=t.getRGBAfromColorCode(this.fg_color),o.textBaseline=\\\"middle\\\",o.textAlign=\\\"center\\\",o.fillText(e,0,0),o.setTransform(1,0,0,1,0,0)}}}},{key:\\\"renderPath\\\",value:function(e,i){var r;if(this.render_canvas){var n=null===(r=this.render_canvas)||void 0===r?void 0:r.getContext(\\\"2d\\\");if(n){var s=(this.position_x+this.shs/2)*this.width_magnification(),a=(this.position_y-this.height()+this.svs/2)*this.height_magnification();n.translate(s,a);var o=F(e,4),h=o[0],c=o[1],u=o[2]-h,l=o[3]-c;n.scale(this.ssm_y/u,this.ssm_y/l),n.translate(h,c);var f=this.getOrnColorCode();if(f&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color))if(this.useStroke)n.strokeStyle=t.getRGBAfromColorCode(f),n.lineJoin=\\\"round\\\",n.lineWidth=4*Math.max(u/this.ssm_y,l/this.ssm_y)*2,n.stroke(new Path2D(i));else for(var d=-4*this.width_magnification();d<=4*this.width_magnification();d++)for(var p=-4*this.width_magnification();p<=4*this.width_magnification();p++)n.translate(p,d),n.fillStyle=t.getRGBAfromColorCode(f),n.fill(new Path2D(i)),n.translate(-p,-d);n.fillStyle=t.getRGBAfromColorCode(this.fg_color),n.fill(new Path2D(i)),n.setTransform(1,0,0,1,0,0)}}}},{key:\\\"getOrnColorCode\\\",value:function(){return!0===this.force_orn?t.fillAlphaColorCode(this.bg_color):!1===this.force_orn?this.orn:null!==(e=this.force_orn)&&void 0!==e?e:this.orn;var e}}])&&R(e.prototype,i),r&&R(e,r),Object.defineProperty(e,\\\"prototype\\\",{writable:!1}),e;var e,i,r}();function M(t){return M=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\\\"function\\\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\\\"symbol\\\":typeof t},M(t)}function G(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,r=Array(e);i<e;i++)r[i]=t[i];return r}function B(t,e){if(!(t instanceof e))throw new TypeError(\\\"Cannot call a class as a function\\\")}function P(t,e){for(var i=0;i<e.length;i++){var r=e[i];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(t,j(r.key),r)}}function D(t,e,i){return e&&P(t.prototype,e),i&&P(t,i),Object.defineProperty(t,\\\"prototype\\\",{writable:!1}),t}function j(t){var e=function(t){if(\\\"object\\\"!=M(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,\\\"string\\\");if(\\\"object\\\"!=M(i))return i;throw new TypeError(\\\"@@toPrimitive must return a primitive value.\\\")}return String(t)}(t);return\\\"symbol\\\"==M(e)?e:e+\\\"\\\"}function L(t){var e=\\\"function\\\"==typeof Map?new Map:void 0;return L=function(t){if(null===t||!function(t){try{return-1!==Function.toString.call(t).indexOf(\\\"[native code]\\\")}catch(e){return\\\"function\\\"==typeof t}}(t))return t;if(\\\"function\\\"!=typeof t)throw new TypeError(\\\"Super expression must either be null or a function\\\");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,i)}function i(){return N(t,arguments,H(this).constructor)}return i.prototype=Object.create(t.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),z(i,t)},L(t)}function N(t,e,i){if(U())return Reflect.construct.apply(null,arguments);var r=[null];r.push.apply(r,e);var n=new(t.bind.apply(t,r));return i&&z(n,i.prototype),n}function U(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(U=function(){return!!t})()}function z(t,e){return z=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},z(t,e)}function H(t){return H=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},H(t)}i(113),i(8980),i(6910),i(4554),i(875),i(287),i(825);var X=function(t){function e(){return B(this,e),t=this,r=arguments,i=H(i=e),function(t,e){if(e&&(\\\"object\\\"==M(e)||\\\"function\\\"==typeof e))return e;if(void 0!==e)throw new TypeError(\\\"Derived constructors may only return object or undefined\\\");return function(t){if(void 0===t)throw new ReferenceError(\\\"this hasn't been initialised - super() hasn't been called\\\");return t}(t)}(t,U()?Reflect.construct(i,r||[],H(t).constructor):i.apply(t,r));var t,i,r}return function(t,e){if(\\\"function\\\"!=typeof e&&null!==e)throw new TypeError(\\\"Super expression must either be null or a function\\\");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,\\\"prototype\\\",{writable:!1}),e&&z(t,e)}(e,t),D(e,[{key:\\\"addCue\\\",value:function(t){this.push(t)}},{key:\\\"removeCue\\\",value:function(t){var e=this.findIndex((function(e){return e===t}));e<0||this.splice(e,1)}},{key:\\\"getCueById\\\",value:function(t){var e;return null!==(e=this.find((function(e){return e.id===t})))&&void 0!==e?e:null}}])}(L(Array)),K=function(){return D((function t(e){B(this,t),this.all=new X,this.active=new X,this.polling_handler=this.polling.bind(this),this.polling_id=null,this.cues=this.all,this.oncuechange=null,this.id=\\\"\\\",this.kind=\\\"metadata\\\",this.label=\\\"\\\",this.language=\\\"ja-JP\\\",this.mode=\\\"hidden\\\",this.inBandMetadataTrackDispatchType=\\\"\\\",this.sourceBuffer=null,this.listeners=[],this.media=e}),[{key:\\\"startPolling\\\",value:function(){this.polling_id=window.requestAnimationFrame(this.polling_handler)}},{key:\\\"stopPolling\\\",value:function(){null!=this.polling_id&&(window.cancelAnimationFrame(this.polling_id),this.polling_id=null)}},{key:\\\"polling\\\",value:function(){var t=this.active,e=this.activeCues;if(t.length!==e.length){var i=null;try{i=new CustomEvent(\\\"cuechange\\\")}catch(t){(i=document.createEvent(\\\"CustomEvent\\\")).initCustomEvent(\\\"cuechange\\\",!1,!1,{})}null!=i&&(this.dispatchEvent(i),this.oncuechange&&this.oncuechange.call(this,i))}else for(var r=0;r<e.length;r++)if(t[r]!==e[r]){var n=null;try{n=new CustomEvent(\\\"cuechange\\\")}catch(t){(n=document.createEvent(\\\"CustomEvent\\\")).initCustomEvent(\\\"cuechange\\\",!1,!1,{})}if(null!=n){this.dispatchEvent(n),this.oncuechange&&this.oncuechange.call(this,n);break}}this.polling_id=window.requestAnimationFrame(this.polling_handler)}},{key:\\\"activeCues\\\",get:function(){var t,e=this,i=N(X,function(t){if(Array.isArray(t))return G(t)}(t=this.all.filter((function(t){return t.startTime<=e.media.currentTime&&e.media.currentTime<=t.endTime})))||function(t){if(\\\"undefined\\\"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t[\\\"@@iterator\\\"])return Array.from(t)}(t)||function(t,e){if(t){if(\\\"string\\\"==typeof t)return G(t,e);var i={}.toString.call(t).slice(8,-1);return\\\"Object\\\"===i&&t.constructor&&(i=t.constructor.name),\\\"Map\\\"===i||\\\"Set\\\"===i?Array.from(t):\\\"Arguments\\\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?G(t,e):void 0}}(t)||function(){throw new TypeError(\\\"Invalid attempt to spread non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\\\")}());return i.sort((function(t,e){return t.startTime===e.startTime?-(t.endTime-e.endTime):t.startTime-e.startTime})),this.active=i,this.active}},{key:\\\"getCueById\\\",value:function(t){return this.all.getCueById(t)}},{key:\\\"addCue\\\",value:function(t){this.all.addCue(t)}},{key:\\\"removeCue\\\",value:function(t){this.all.removeCue(t)}},{key:\\\"addEventListener\\\",value:function(t,e){this.listeners.push(e)}},{key:\\\"removeEventListener\\\",value:function(t,e){var i=this.listeners.findIndex((function(t){return t===e}));i<0||this.listeners.splice(i,1)}},{key:\\\"dispatchEvent\\\",value:function(t){var e=this;return\\\"cuechange\\\"!==t.type||this.listeners.forEach((function(i){return i.call(e,t)})),!0}}])}();function V(t){return V=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\\\"function\\\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\\\"symbol\\\":typeof t},V(t)}function $(t,e){for(var i=0;i<e.length;i++){var r=e[i];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(t,W(r.key),r)}}function W(t){var e=function(t){if(\\\"object\\\"!=V(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,\\\"string\\\");if(\\\"object\\\"!=V(i))return i;throw new TypeError(\\\"@@toPrimitive must return a primitive value.\\\")}return String(t)}(t);return\\\"symbol\\\"==V(e)?e:e+\\\"\\\"}var Y=function(){return t=function t(e,i){!function(t,e){if(!(t instanceof e))throw new TypeError(\\\"Cannot call a class as a function\\\")}(this,t),this.id=\\\"\\\",this.pauseOnExit=!1,this.onenter=null,this.onexit=null,this.track=null,this.startTime=e,this.endTime=i},(e=[{key:\\\"addEventListener\\\",value:function(t,e,i){}},{key:\\\"removeEventListener\\\",value:function(t,e,i){}},{key:\\\"dispatchEvent\\\",value:function(t){return!1}}])&&$(t.prototype,e),Object.defineProperty(t,\\\"prototype\\\",{writable:!1}),t;var t,e}();function J(t,e,i){for(var r=0,n=e;n<i;n++)r<<=7,r|=127&t[n];return r}function Z(t,e,i){for(var r=\\\"\\\",n=e;n<i;n++)r+=\\\"%\\\".concat(t[n].toString(16).padStart(2,\\\"0\\\"));return r}function q(t,e,i){if(window.TextDecoder){var r=new TextDecoder(\\\"utf-8\\\"),n=new Uint8Array(Array.prototype.slice.call(t,e,i));return r.decode(n)}return window.decodeURIComponent(Z(t,e,i))}function Q(t,e,i){if(window.TextDecoder){var r=new TextDecoder(\\\"iso-8859-1\\\"),n=new Uint8Array(Array.prototype.slice.call(t,e,i));return r.decode(n)}return window.unescape(Z(t,e,i))}function tt(t){for(var e=window.atob(t),i=new Uint8Array(e.length),r=0;r<e.length;r++)i[r]=e.charCodeAt(r);return i}function et(t){return et=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\\\"function\\\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\\\"symbol\\\":typeof t},et(t)}function it(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,r)}return i}function rt(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?it(Object(i),!0).forEach((function(e){nt(t,e,i[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):it(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}function nt(t,e,i){return(e=at(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function st(t,e){for(var i=0;i<e.length;i++){var r=e[i];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(t,at(r.key),r)}}function at(t){var e=function(t){if(\\\"object\\\"!=et(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,\\\"string\\\");if(\\\"object\\\"!=et(i))return i;throw new TypeError(\\\"@@toPrimitive must return a primitive value.\\\")}return String(t)}(t);return\\\"symbol\\\"==et(e)?e:e+\\\"\\\"}var ot=function(){return t=function t(e){var i,r,n,s,a;!function(t,e){if(!(t instanceof e))throw new TypeError(\\\"Cannot call a class as a function\\\")}(this,t),this.media=null,this.id3Track=null,this.b24Track=null,this.subtitleElement=null,this.viewCanvas=null,this.rawCanvas=null,this.textContent=null,this.resizeObserver=null,this.mutationObserver=null,this.prevCurrentTime=null,this.highResTimeupdatePollingId=null,this.isShowing=!0,this.isOnSeeking=!1,this.onB24CueChangeDrawed=!1,this.onID3AddtrackHandler=this.onID3Addtrack.bind(this),this.onID3CueChangeHandler=this.onID3CueChange.bind(this),this.onB24CueChangeHandler=this.onB24CueChange.bind(this),this.onHighResTimeupdateHandler=this.onHighResTimeupdate.bind(this),this.onTimeupdateHandler=this.onTimeupdate.bind(this),this.onCanplayHandler=this.onCanplay.bind(this),this.onPlayHandler=this.onPlay.bind(this),this.onPauseHandler=this.onPause.bind(this),this.onSeekingHandler=this.onSeeking.bind(this),this.onSeekedHandler=this.onSeeked.bind(this),this.onResizeHandler=this.onResize.bind(this),this.data_identifier=null!==(i=null==e?void 0:e.data_identifier)&&void 0!==i?i:128,this.data_group_id=null!==(r=null==e?void 0:e.data_group_id)&&void 0!==r?r:1,this.rendererOption=rt(rt({},e),{},{data_identifier:this.data_identifier,data_group_id:this.data_group_id,keepAspectRatio:null===(n=null==e?void 0:e.keepAspectRatio)||void 0===n||n,enableAutoInBandMetadataTextTrackDetection:null===(s=null==e?void 0:e.enableAutoInBandMetadataTextTrackDetection)||void 0===s||s,useStroke:null===(a=null==e?void 0:e.useStroke)||void 0===a||a})},(e=[{key:\\\"attachMedia\\\",value:function(t,e){var i;this.detachMedia(),this.media=t,this.subtitleElement=null!=e?e:t.parentElement,this.media.addEventListener(\\\"canplay\\\",this.onCanplayHandler),null!==(i=this.rendererOption)&&void 0!==i&&i.useHighResTimeupdate?(this.media.addEventListener(\\\"play\\\",this.onPlayHandler),this.media.addEventListener(\\\"pause\\\",this.onPauseHandler)):this.media.addEventListener(\\\"timeupdate\\\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.setupTrack(),this.setupCanvas()}},{key:\\\"detachMedia\\\",value:function(){var t,e,i,r;this.cleanupCanvas(),this.cleanupTrack(),null===(t=this.media)||void 0===t||t.removeEventListener(\\\"canplay\\\",this.onCanplayHandler),null===(e=this.media)||void 0===e||e.removeEventListener(\\\"play\\\",this.onPlayHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\\\"pause\\\",this.onPauseHandler),this.onPause(),null===(r=this.media)||void 0===r||r.removeEventListener(\\\"timeupdate\\\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.media=this.subtitleElement=null}},{key:\\\"dispose\\\",value:function(){this.detachMedia()}},{key:\\\"getViewCanvas\\\",value:function(){return this.viewCanvas}},{key:\\\"getRawCanvas\\\",value:function(){return this.rawCanvas}},{key:\\\"getTextContent\\\",value:function(){return this.textContent}},{key:\\\"refresh\\\",value:function(){this.onResize()}},{key:\\\"show\\\",value:function(){this.isShowing=!0,this.onResize()}},{key:\\\"hide\\\",value:function(){if(this.isShowing=!1,this.viewCanvas){var t=this.viewCanvas.getContext(\\\"2d\\\");t&&t.clearRect(0,0,this.viewCanvas.width,this.viewCanvas.height)}if(this.rawCanvas){var e=this.rawCanvas.getContext(\\\"2d\\\");e&&e.clearRect(0,0,this.rawCanvas.width,this.rawCanvas.height)}}},{key:\\\"isPresent\\\",value:function(){return this.onB24CueChangeDrawed}},{key:\\\"pushRawData\\\",value:function(t,e){var i=new O(e,t).render(rt(rt({},this.rendererOption),{},{width:void 0,height:void 0}));if(null==i)return!1;var r=Number.isFinite(i.endTime)?i.endTime:Number.MAX_SAFE_INTEGER;return this.addB24Cue(t,r,e)}},{key:\\\"pushBase64Data\\\",value:function(t,e){var i=tt(e);return this.pushRawData(t,i)}},{key:\\\"pushData\\\",value:function(t,e,i){return this.pushRawData(i,e)}},{key:\\\"pushID3v2PRIVData\\\",value:function(t,e,i){return\\\"aribb24.js\\\"===e&&this.pushRawData(t,i)}},{key:\\\"pushID3v2TXXXData\\\",value:function(t,e,i){return\\\"aribb24.js\\\"===e&&this.pushBase64Data(t,i)}},{key:\\\"pushID3v2Data\\\",value:function(t,e){for(var i=!1,r=0;r<e.length;){var n=r;if(r+3>e.length)break;if(73!==e[r+0]||68!==e[r+1]||51!==e[r+2]){if(0===r){r+=5;continue}break}if((r+=6)+4>e.length)break;var s=J(e,r+0,r+4);r+=4;var a=n+3+2+1+4+s;if(a>e.length)break;for(var o=r;o<a;){var h=o;if(o+4>e.length)break;var c=Q(e,o+0,o+4);if((o+=4)+4>e.length)break;var u=J(e,o+0,o+4);o+=6;var l=h+4+4+2+u;if(l>e.length)break;if(\\\"PRIV\\\"===c){for(var f=o,d=l;0!==e[o]&&o<l;)o++;var p=Q(e,f,o),v=new Uint8Array(Array.prototype.slice.call(e,o+1,d));this.pushID3v2PRIVData(t,p,v)&&(i=!0)}else if(\\\"TXXX\\\"===c){var b=e[o+0],g=o+1;if(3===b){for(;0!==e[o]&&o<l;)o++;for(var y=o,m=o+=1;0!==e[o]&&o<l;)o++;var _=o,w=q(e,g,y),x=q(e,m,_);this.pushID3v2TXXXData(t,w,x)&&(i=!0)}else if(0===b){for(;0!==e[o]&&o<l;)o++;for(var A=o,C=o+=1;0!==e[o]&&o<l;)o++;var T=o,k=Q(e,g,A),F=Q(e,C,T);this.pushID3v2TXXXData(t,k,F)&&(i=!0)}}o=l}(r=n+3+2+1+4+s)+3>e.length||51===e[r+0]&&68===e[r+1]&&73===e[r+2]&&(r+=10)}return i}},{key:\\\"setInBandMetadataTextTrack\\\",value:function(t){var e;null===(e=this.id3Track)||void 0===e||e.removeEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler),this.id3Track=t,this.id3Track.mode=\\\"hidden\\\",this.id3Track.addEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler)}},{key:\\\"pushID3v2Cue\\\",value:function(t){if(!this.id3Track)return!1;var e=t.startTime,i=t;if(\\\"15260DFFFF49443320FF49443320000F\\\"===this.id3Track.inBandMetadataTrackDispatchType)return this.pushID3v2Data(e,new Uint8Array(i.data));if(\\\"com.apple.streaming\\\"===this.id3Track.inBandMetadataTrackDispatchType){if(\\\"PRIV\\\"===i.value.key)return this.pushID3v2PRIVData(e,i.value.info,new Uint8Array(i.value.data));if(\\\"TXXX\\\"===i.value.key)return this.pushID3v2TXXXData(e,i.value.info,i.value.data)}else if(\\\"id3\\\"===this.id3Track.label){if(\\\"PRIV\\\"===i.value.key)return this.pushID3v2PRIVData(e,i.value.info,new Uint8Array(i.value.data));if(\\\"TXXX\\\"===i.value.key)return this.pushID3v2TXXXData(e,i.value.info,i.value.data)}else if(\\\"Timed Metadata\\\"===this.id3Track.label){if(\\\"PRIV\\\"===i.frame.key)return this.pushID3v2PRIVData(e,i.frame.owner,new Uint8Array(i.frame.data));if(\\\"TXXX\\\"===i.frame.key)return this.pushID3v2TXXXData(e,i.frame.description,i.frame.data)}return!1}},{key:\\\"onID3CueChange\\\",value:function(){this.id3Track&&(this.isOnSeeking||this.onTimeupdate())}},{key:\\\"addB24Cue\\\",value:function(t,e,i){var r;if(!this.b24Track)return!1;if(!O.detect(i,this.rendererOption))return!1;var n=new(null!==(r=window.VTTCue)&&void 0!==r?r:window.TextTrackCue)(t,e,\\\"\\\");if(n.data=i,window.VTTCue)this.b24Track.addCue(n);else if(window.TextTrackCue){var s;if(Array.prototype.some.call(null!==(s=this.b24Track.cues)&&void 0!==s?s:[],(function(e){return e.startTime===t})))return!1;if(this.b24Track.cues){for(var a=[],o=this.b24Track.cues.length-1;o>=0;o--)this.b24Track.cues[o].startTime>=t&&(a.push(this.b24Track.cues[o]),this.b24Track.removeCue(this.b24Track.cues[o]));this.b24Track.addCue(n);for(var h=a.length-1;h>=0;h--)this.b24Track.addCue(a[h])}}return!0}},{key:\\\"onB24CueChange\\\",value:function(){if(this.media&&this.b24Track){if(this.viewCanvas){var t=this.viewCanvas.getContext(\\\"2d\\\");t&&t.clearRect(0,0,this.viewCanvas.width,this.viewCanvas.height)}if(this.rawCanvas){var e=this.rawCanvas.getContext(\\\"2d\\\");e&&e.clearRect(0,0,this.rawCanvas.width,this.rawCanvas.height)}if(this.b24Track.activeCues&&this.b24Track.activeCues.length>0){var i=this.b24Track.activeCues[this.b24Track.activeCues.length-1];if(i.startTime<=this.media.currentTime&&this.media.currentTime<=i.endTime&&!this.isOnSeeking){var r=new O(i.data,i.startTime),n=!1;if(this.isShowing&&this.viewCanvas){var s,a,o,h,c,u,l,f,d=r.render(rt(rt({},this.rendererOption),{},{canvas:this.viewCanvas,width:null!==(s=null===(a=this.rendererOption)||void 0===a?void 0:a.width)&&void 0!==s?s:this.viewCanvas.width,height:null!==(o=null===(h=this.rendererOption)||void 0===h?void 0:h.height)&&void 0!==o?o:this.viewCanvas.height}));null!=(null==d?void 0:d.PRA)&&(null===(l=this.rendererOption)||void 0===l||null===(f=l.PRACallback)||void 0===f||f.call(l,d.PRA)),n=null!==(c=null==d?void 0:d.rendered)&&void 0!==c&&c,this.textContent=null!==(u=null==d?void 0:d.textContent)&&void 0!==u?u:null}this.isShowing&&this.rawCanvas&&r.render(rt(rt({},this.rendererOption),{},{canvas:this.rawCanvas,width:this.rawCanvas.width,height:this.rawCanvas.height,keepAspectRatio:!0})),this.onB24CueChangeDrawed=n}else this.onB24CueChangeDrawed=!1,this.textContent=null;for(var p=this.b24Track.activeCues.length-2;p>=0;p--){var v=this.b24Track.activeCues[p];v.endTime=Math.min(v.endTime,i.startTime),v.startTime===v.endTime&&this.b24Track.removeCue(v)}}else this.onB24CueChangeDrawed=!1,this.textContent=null}else this.onB24CueChangeDrawed=!1}},{key:\\\"onHighResTimeupdate\\\",value:function(){this.onTimeupdate(),this.highResTimeupdatePollingId=window.requestAnimationFrame(this.onHighResTimeupdateHandler)}},{key:\\\"onTimeupdate\\\",value:function(){if(this.media)if(null!=this.prevCurrentTime)if(this.id3Track&&this.id3Track.cues&&0!==this.id3Track.cues.length)if(this.isOnSeeking)this.prevCurrentTime=this.media.currentTime;else if(Math.abs(this.media.currentTime-this.prevCurrentTime)>1)this.prevCurrentTime=this.media.currentTime;else{for(var t,e,i=new Y(Number.NEGATIVE_INFINITY,this.id3Track.cues[0].startTime),r=[i],n=0;n<this.id3Track.cues.length;n++)r.push(this.id3Track.cues[n]);for(var s=0,a=r.length;s+1<a;){var o=this.prevCurrentTime,h=Math.floor((s+a)/2);o<r[h].startTime?a=h:s=h}t=s;for(var c=0,u=r.length;c+1<u;){var l=this.media.currentTime,f=Math.floor((c+u)/2);l<r[f].startTime?u=f:c=f}if(e=c,null!==t&&null!==e&&t!==e){if(t<e)for(var d=e;d>t;d--){var p=r[d];if(p!==i&&this.pushID3v2Cue(p))break}else for(var v=t;v<e;v++){var b=r[v];if(b!==i&&this.pushID3v2Cue(b))break}this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime;else this.prevCurrentTime=this.media.currentTime}},{key:\\\"onCanplay\\\",value:function(){this.id3Track&&(this.id3Track.mode=\\\"hidden\\\"),this.b24Track&&(this.b24Track.mode=\\\"hidden\\\"),null!=this.media&&null==this.prevCurrentTime&&(this.prevCurrentTime=this.media.currentTime-Number.MIN_VALUE)}},{key:\\\"onPlay\\\",value:function(){null==this.highResTimeupdatePollingId&&this.onHighResTimeupdate()}},{key:\\\"onPause\\\",value:function(){null!=this.highResTimeupdatePollingId&&(window.cancelAnimationFrame(this.highResTimeupdatePollingId),this.highResTimeupdatePollingId=null)}},{key:\\\"onSeeking\\\",value:function(){this.isOnSeeking=!0,this.onB24CueChange()}},{key:\\\"onSeeked\\\",value:function(){this.isOnSeeking=!1}},{key:\\\"onResize\\\",value:function(){if(this.media){var t=window.getComputedStyle(this.media),e=Number.parseInt(t.width)*window.devicePixelRatio,i=Number.parseInt(t.height)*window.devicePixelRatio,r=this.media.videoWidth,n=this.media.videoHeight;if(this.viewCanvas&&(this.viewCanvas.width=Math.round(e),this.viewCanvas.height=Math.round(i)),this.rawCanvas&&(this.rawCanvas.width=r,this.rawCanvas.height=n),this.b24Track){if(this.viewCanvas){var s=this.viewCanvas.getContext(\\\"2d\\\");s&&s.clearRect(0,0,this.viewCanvas.width,this.viewCanvas.height)}if(this.rawCanvas){var a=this.rawCanvas.getContext(\\\"2d\\\");a&&a.clearRect(0,0,this.rawCanvas.width,this.rawCanvas.height)}if(this.onB24CueChangeDrawed&&this.b24Track.activeCues&&this.b24Track.activeCues.length>0){var o=this.b24Track.activeCues[this.b24Track.activeCues.length-1];if(o.startTime<=this.media.currentTime&&this.media.currentTime<=o.endTime&&!this.isOnSeeking){var h,c,u,l,f=new O(o.data,o.startTime);this.isShowing&&this.viewCanvas&&f.render(rt(rt({},this.rendererOption),{},{canvas:this.viewCanvas,width:null!==(h=null===(c=this.rendererOption)||void 0===c?void 0:c.width)&&void 0!==h?h:this.viewCanvas.width,height:null!==(u=null===(l=this.rendererOption)||void 0===l?void 0:l.height)&&void 0!==u?u:this.viewCanvas.height})),this.isShowing&&this.rawCanvas&&f.render(rt(rt({},this.rendererOption),{},{canvas:this.rawCanvas,width:this.rawCanvas.width,height:this.rawCanvas.height,keepAspectRatio:!0}))}}}}}},{key:\\\"onID3Addtrack\\\",value:function(t){if(this.media){var e=t.track;\\\"metadata\\\"===e.kind&&(\\\"15260DFFFF49443320FF49443320000F\\\"!==e.inBandMetadataTrackDispatchType&&\\\"com.apple.streaming\\\"!==e.inBandMetadataTrackDispatchType&&\\\"id3\\\"!==e.label||this.setInBandMetadataTextTrack(e))}}},{key:\\\"setupTrack\\\",value:function(){var t,e;if(this.media){if(null!==(t=this.rendererOption)&&void 0!==t&&t.useHighResTextTrack)this.b24Track=new K(this.media),this.b24Track.startPolling();else{for(var i=\\\"ARIB B24 Japanese (data_identifier=0x\\\".concat(this.data_identifier.toString(16),\\\", data_group_id=\\\").concat(this.data_group_id,\\\")\\\"),r=0;r<this.media.textTracks.length;r++){var n=this.media.textTracks[r];if(n.label===i){this.b24Track=n;break}}this.b24Track||(this.b24Track=this.media.addTextTrack(\\\"metadata\\\",i,\\\"ja\\\"),this.b24Track.mode=\\\"hidden\\\")}if(this.b24Track.addEventListener(\\\"cuechange\\\",this.onB24CueChangeHandler),null!==(e=this.rendererOption)&&void 0!==e&&e.enableAutoInBandMetadataTextTrackDetection){for(var s=0;s<this.media.textTracks.length;s++){var a=this.media.textTracks[s];if(\\\"metadata\\\"===a.kind&&(\\\"15260DFFFF49443320FF49443320000F\\\"===a.inBandMetadataTrackDispatchType||\\\"com.apple.streaming\\\"===a.inBandMetadataTrackDispatchType||\\\"id3\\\"===a.label)){this.setInBandMetadataTextTrack(a);break}}this.media.textTracks.addEventListener(\\\"addtrack\\\",this.onID3AddtrackHandler)}this.media.addEventListener(\\\"seeking\\\",this.onSeekingHandler),this.media.addEventListener(\\\"seeked\\\",this.onSeekedHandler)}}},{key:\\\"setupCanvas\\\",value:function(){var t,e=this;this.media&&this.subtitleElement&&(this.viewCanvas=document.createElement(\\\"canvas\\\"),this.viewCanvas.style.position=\\\"absolute\\\",this.viewCanvas.style.top=this.viewCanvas.style.left=\\\"0\\\",this.viewCanvas.style.pointerEvents=\\\"none\\\",this.viewCanvas.style.width=\\\"100%\\\",this.viewCanvas.style.height=\\\"100%\\\",null!==(t=this.rendererOption)&&void 0!==t&&t.enableRawCanvas&&(this.rawCanvas=document.createElement(\\\"canvas\\\")),this.onResize(),this.subtitleElement.appendChild(this.viewCanvas),this.media.addEventListener(\\\"resize\\\",this.onResizeHandler),window.ResizeObserver?(this.resizeObserver=new ResizeObserver((function(){e.onResize()})),this.resizeObserver.observe(this.media)):(window.addEventListener(\\\"resize\\\",this.onResizeHandler),window.MutationObserver&&(this.mutationObserver=new MutationObserver((function(){e.onResize()})),this.mutationObserver.observe(this.media,{attributes:!0,attributeFilter:[\\\"class\\\",\\\"style\\\"]}))))}},{key:\\\"cleanupTrack\\\",value:function(){var t,e,i,r,n,s;if(this.b24Track)if(null!==(s=this.rendererOption)&&void 0!==s&&s.useHighResTextTrack)this.b24Track.stopPolling();else if(this.b24Track.cues)for(var a=this.b24Track.cues.length-1;a>=0;a--)this.b24Track.removeCue(this.b24Track.cues[a]);null===(t=this.b24Track)||void 0===t||t.removeEventListener(\\\"cuechange\\\",this.onB24CueChangeHandler),null===(e=this.id3Track)||void 0===e||e.removeEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\\\"seeking\\\",this.onSeekingHandler),null===(r=this.media)||void 0===r||r.removeEventListener(\\\"seeked\\\",this.onSeekedHandler),null===(n=this.media)||void 0===n||n.textTracks.removeEventListener(\\\"addtrack\\\",this.onID3AddtrackHandler),this.b24Track=this.id3Track=null}},{key:\\\"cleanupCanvas\\\",value:function(){var t;window.removeEventListener(\\\"resize\\\",this.onResizeHandler),null===(t=this.media)||void 0===t||t.removeEventListener(\\\"resize\\\",this.onResizeHandler),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.mutationObserver&&(this.mutationObserver.disconnect(),this.mutationObserver=null),this.viewCanvas&&this.subtitleElement&&this.subtitleElement.removeChild(this.viewCanvas),this.viewCanvas&&(this.viewCanvas.width=this.viewCanvas.height=0),this.rawCanvas&&(this.rawCanvas.width=this.rawCanvas.height=0),this.viewCanvas=this.rawCanvas=null}}])&&st(t.prototype,e),Object.defineProperty(t,\\\"prototype\\\",{writable:!1}),t;var t,e}();function ht(t,e,i){for(var r=-1,n=e;n<i;n++){r^=t[n];for(var s=0;s<8;s++)1&r?r=r>>>1^3988292384:r>>>=1}return~r}function ct(t){return ct=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\\\"function\\\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\\\"symbol\\\":typeof t},ct(t)}function ut(t){return function(t){if(Array.isArray(t))return ft(t)}(t)||function(t){if(\\\"undefined\\\"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t[\\\"@@iterator\\\"])return Array.from(t)}(t)||lt(t)||function(){throw new TypeError(\\\"Invalid attempt to spread non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\\\")}()}function lt(t,e){if(t){if(\\\"string\\\"==typeof t)return ft(t,e);var i={}.toString.call(t).slice(8,-1);return\\\"Object\\\"===i&&t.constructor&&(i=t.constructor.name),\\\"Map\\\"===i||\\\"Set\\\"===i?Array.from(t):\\\"Arguments\\\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?ft(t,e):void 0}}function ft(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,r=Array(e);i<e;i++)r[i]=t[i];return r}function dt(t,e){for(var i=0;i<e.length;i++){var r=e[i];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(t,pt(r.key),r)}}function pt(t){var e=function(t){if(\\\"object\\\"!=ct(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,\\\"string\\\");if(\\\"object\\\"!=ct(i))return i;throw new TypeError(\\\"@@toPrimitive must return a primitive value.\\\")}return String(t)}(t);return\\\"symbol\\\"==ct(e)?e:e+\\\"\\\"}var vt=null,bt=function(){function t(e,i){!function(t,e){if(!(t instanceof e))throw new TypeError(\\\"Cannot call a class as a function\\\")}(this,t),this.text=\\\"\\\",this.svg=null,this.groups=new Map,this.GL=0,this.GR=2,this.G_BACK=[n.get(0),n.get(1),n.get(2),a.get(31)],this.DRCS_mapping=new Map([[15,new Map],[16,new Map],[17,new Map],[18,new Map],[19,new Map],[20,new Map],[21,new Map],[22,new Map],[23,new Map],[24,new Map],[25,new Map],[26,new Map],[27,new Map],[28,new Map],[29,new Map],[30,new Map]]),this.swf_x=1920,this.swf_y=1080,this.sdf_x=1920,this.sdf_y=1080,this.sdp_x=0,this.sdp_y=0,this.ssm_x=72,this.ssm_y=72,this.shs=8,this.svs=48,this.text_size_x=1,this.text_size_y=1,this.text_type=\\\"NSZ\\\",this.position_x=-1,this.position_y=-1,this.pallet=0,this.fg_color=h[this.pallet][7],this.bg_color=h[this.pallet][8],this.force_bg_color=null,this.hlc=0,this.prev_hlc=0,this.stl=!1,this.orn=null,this.force_orn=null,this.flc=15,this.non_spacing=\\\"\\\",this.timeElapsed=0,this.endTime=null,this.rendered=!1,this.PRA=null,this.normalFont=\\\"monospace\\\",this.gaijiFont=this.normalFont,this.drcsReplacement=!1,this.drcsReplaceMapping=new Map,this.usePUA=!1,this.pes=e,this.startTime=i}return e=t,i=[{key:\\\"width\\\",value:function(){return Math.floor((this.shs+this.ssm_x)*this.text_size_x)}},{key:\\\"height\\\",value:function(){return Math.floor((this.svs+this.ssm_y)*this.text_size_y)}},{key:\\\"move_absolute_dot\\\",value:function(t,e){this.position_x=t,this.position_y=e}},{key:\\\"move_absolute_pos\\\",value:function(t,e){this.position_x=this.sdp_x+t*this.width(),this.position_y=this.sdp_y+(e+1)*this.height()}},{key:\\\"move_relative_pos\\\",value:function(t,e){for((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs));t<0;)this.position_x-=this.width(),t++,this.position_x<this.sdp_x&&(this.position_x=this.sdp_x+this.sdf_x-this.width(),e--);for(;t>0;)this.position_x+=this.width(),t--,this.position_x>=this.sdp_x+this.sdf_x&&(this.position_x=this.sdp_x,e++);for(;e<0;)this.position_y-=this.height(),e++;for(;e>0;)this.position_y+=this.height(),e--}},{key:\\\"move_newline\\\",value:function(){(this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),this.position_x=this.sdp_x,this.position_y=this.position_y+this.height()}},{key:\\\"render\\\",value:function(e){var i,r,n,s,a,o,h,c;this.svg=null!==(i=null==e?void 0:e.svg)&&void 0!==i?i:null,this.force_orn=null!==(r=\\\"boolean\\\"==typeof(null==e?void 0:e.forceStrokeColor)?null==e?void 0:e.forceStrokeColor:t.getRGBAColorCode(null==e?void 0:e.forceStrokeColor))&&void 0!==r?r:null,this.force_bg_color=null!==(n=t.getRGBAColorCode(null==e?void 0:e.forceBackgroundColor))&&void 0!==n?n:null,this.normalFont=null!==(s=null==e?void 0:e.normalFont)&&void 0!==s?s:this.normalFont,this.gaijiFont=null!==(a=null==e?void 0:e.gaijiFont)&&void 0!==a?a:this.normalFont,this.drcsReplacement=null!==(o=null==e?void 0:e.drcsReplacement)&&void 0!==o&&o,this.drcsReplaceMapping=new Map(v);for(var u,l=Object.entries(null!==(u=null==e?void 0:e.drcsReplaceMapping)&&void 0!==u?u:{}),f=0;f<l.length;f++){var d=l[f];this.drcsReplaceMapping.set(d[0],d[1])}if(this.usePUA=null!==(h=null==e?void 0:e.usePUA)&&void 0!==h&&h,!t.detect(this.pes,e))return null;if(this.svg)for(;this.svg.firstChild;)this.svg.removeChild(this.svg.firstChild);for(var p=3+(15&this.pes[2]),b=(this.pes[p+0],(this.pes[p+3]<<8)+this.pes[p+4]),g=p+9;g<p+(5+b);){this.pes[g+0];var y=this.pes[g+1],m=this.pes[g+2]<<16|this.pes[g+3]<<8|this.pes[g+4];32===y?this.parseText(g+5,g+5+m):48==y?this.parseDRCS(1,g+5,g+5+m):49==y?this.parseDRCS(2,g+5,g+5+m):53==y&&this.parseBitmap(g+5,g+5+m),g+=5+m}return{startTime:this.startTime,endTime:null!==(c=this.endTime)&&void 0!==c?c:Number.POSITIVE_INFINITY,rendered:this.rendered,textContent:this.rendered?this.text:null,PRA:this.PRA}}},{key:\\\"parseText\\\",value:function(t,e){for(;t<e;)if(32<this.pes[t]&&this.pes[t]<127){var i=0,r=this.G_BACK[this.GL];if(!r)return;for(var a=0;a<r.bytes;a++)i<<=8,i|=127&this.pes[t+a];this.renderCharacter(i,r),t+=r.bytes}else if(160<this.pes[t]&&this.pes[t]<255){var c=0,u=this.G_BACK[this.GR];if(!u)return;for(var l=0;l<u.bytes;l++)c<<=8,c|=127&this.pes[t+l];this.renderCharacter(c,u),t+=u.bytes}else if(0===this.pes[t])t+=1;else if(7===this.pes[t])t+=1;else if(8===this.pes[t])this.move_relative_pos(-1,0),t+=1;else if(9===this.pes[t])this.move_relative_pos(1,0),t+=1;else if(10===this.pes[t])this.move_relative_pos(0,1),t+=1;else if(11===this.pes[t])this.move_relative_pos(0,-1),t+=1;else if(12===this.pes[t])null!=this.startTime&&this.timeElapsed>0&&(this.endTime=this.startTime+this.timeElapsed),t+=1;else if(13===this.pes[t])this.move_newline(),t+=1;else if(14===this.pes[t])this.GL=1,t+=1;else if(15===this.pes[t])this.GL=0,t+=1;else if(22===this.pes[t]){var f=63&this.pes[t+1];this.move_relative_pos(f,0),t+=2}else if(24===this.pes[t])t+=1;else if(25===this.pes[t]){var d=0,p=this.G_BACK[2];if(!p)return;for(var v=0;v<p.bytes;v++)d<<=8,d|=127&this.pes[t+1+v];this.renderCharacter(d,p),t+=1+p.bytes}else if(27===this.pes[t])if(110===this.pes[t+1])this.GL=2,t+=2;else if(111==this.pes[t+1])this.GL=3,t+=2;else if(126==this.pes[t+1])this.GR=1,t+=2;else if(125==this.pes[t+1])this.GR=2,t+=2;else if(124==this.pes[t+1])this.GR=3,t+=2;else if(40<=this.pes[t+1]&&this.pes[t+1]<=43){var b=this.pes[t+1]-40;32===this.pes[t+2]?(this.G_BACK[b]=o.get(this.pes[t+3]),t+=4):(this.G_BACK[b]=s.get(this.pes[t+2]),t+=3)}else{if(36!==this.pes[t+1])return;if(40<=this.pes[t+2]&&this.pes[t+2]<=43){var g=this.pes[t+2]-40;32===this.pes[t+3]?(this.G_BACK[g]=o.get(this.pes[t+4]),t+=5):(this.G_BACK[g]=s.get(this.pes[t+3]),t+=4)}else this.G_BACK[0]=s.get(this.pes[t+2]),t+=3}else if(28===this.pes[t]){var y=63&this.pes[t+1],m=63&this.pes[t+2];this.move_absolute_pos(m,y),t+=3}else if(29===this.pes[t]){var _=0,w=this.G_BACK[3];if(!w)return;for(var x=0;x<w.bytes;x++)_<<=8,_|=127&this.pes[t+1+x];this.renderCharacter(_,w),t+=1+w.bytes}else if(30===this.pes[t])t+=1;else if(31===this.pes[t])t+=1;else if(32===this.pes[t]){var A=n.get(0);if(!A)return;this.renderCharacter(8481,A),t+=1}else if(127===this.pes[t])t+=1;else if(128===this.pes[t])this.fg_color=h[this.pallet][0],t+=1;else if(129===this.pes[t])this.fg_color=h[this.pallet][1],t+=1;else if(130===this.pes[t])this.fg_color=h[this.pallet][2],t+=1;else if(131===this.pes[t])this.fg_color=h[this.pallet][3],t+=1;else if(132===this.pes[t])this.fg_color=h[this.pallet][4],t+=1;else if(133===this.pes[t])this.fg_color=h[this.pallet][5],t+=1;else if(134===this.pes[t])this.fg_color=h[this.pallet][6],t+=1;else if(135===this.pes[t])this.fg_color=h[this.pallet][7],t+=1;else if(136===this.pes[t])this.text_size_x=.5,this.text_size_y=.5,this.text_type=\\\"SSZ\\\",t+=1;else if(137===this.pes[t])this.text_size_x=.5,this.text_size_y=1,this.text_type=\\\"MSZ\\\",t+=1;else if(138===this.pes[t])this.text_size_x=1,this.text_size_y=1,this.text_type=\\\"NSZ\\\",t+=1;else{if(139===this.pes[t])return;if(144===this.pes[t]){var C=this.pes[t+1];if(32==C){var T=15&this.pes[t+2];this.pallet=T,t+=3}else{var k=15&C;64==(112&C)?this.fg_color=h[this.pallet][k]:80==(112&C)&&(this.bg_color=h[this.pallet][k]),t+=2}}else if(145===this.pes[t]){var F=15&this.pes[t+1];this.flc=F,t+=2}else{if(146===this.pes[t])return;if(147===this.pes[t])return;if(148===this.pes[t])return;if(149===this.pes[t])return;if(151===this.pes[t])this.prev_hlc=this.hlc,this.hlc=15&this.pes[t+1],t+=2;else{if(152===this.pes[t])return;if(153===this.pes[t])this.stl=!1,t+=1;else if(154===this.pes[t])this.stl=!0,t+=1;else if(155===this.pes[t]){for(var S=t,R=-1,I=-1;S+1<e;)if(S+=1,32===this.pes[S])R<0&&(R=S);else if(59===this.pes[S])R<0&&I<0&&(I=S);else{if(66===this.pes[S])break;if(83===this.pes[S]){var E=t+1,O=0;if(I>=0||R<0)return;for(;E<R;)O*=10,O+=15&this.pes[E],E++;if(5===O)this.swf_x=3840,this.swf_y=2160;else if(7===O)this.swf_x=1920,this.swf_y=1080;else{if(9!=O)return;this.swf_x=1440,this.swf_y=960}break}if(84===this.pes[S])break;if(86===this.pes[S]){for(var M=t+1,G=0,B=0;M<I;)G*=10,G+=15&this.pes[M],M++;for(M++;M<R;)B*=10,B+=15&this.pes[M],M++;this.sdf_x=2*G,this.sdf_y=2*B;break}if(87===this.pes[S]){for(var P=t+1,D=0,j=0;P<I;)D*=10,D+=15&this.pes[P],P++;for(P++;P<R;)j*=10,j+=15&this.pes[P],P++;this.ssm_x=2*D,this.ssm_y=2*j;break}if(88===this.pes[S]){for(var L=t+1,N=0;L<R;)N*=10,N+=15&this.pes[L],L++;this.shs=2*N;break}if(89===this.pes[S]){for(var U=t+1,z=0;U<R;)z*=10,z+=15&this.pes[U],U++;this.svs=2*z;break}if(91===this.pes[S])break;if(92===this.pes[S])break;if(93===this.pes[S])break;if(94===this.pes[S])break;if(95===this.pes[S]){for(var H=t+1,X=0,K=0;H<I;)X*=10,X+=15&this.pes[H],H++;for(H++;H<R;)K*=10,K+=15&this.pes[H],H++;this.sdp_x=2*X,this.sdp_y=2*K;break}if(97===this.pes[S]){for(var V=t+1,$=0,W=0;V<I;)$*=10,$+=15&this.pes[V],V++;for(V++;V<R;)W*=10,W+=15&this.pes[V],V++;this.move_absolute_dot(2*$,2*W);break}if(98===this.pes[S])break;if(99===this.pes[S]){var Y=this.pes[t+1];if(48==Y)this.orn=null;else if(49==Y){var J=10*(15&this.pes[t+3])+(15&this.pes[t+4]),Z=10*(15&this.pes[t+5])+(15&this.pes[t+6]);this.orn=h[J][Z]}break}if(100===this.pes[S])break;if(101===this.pes[S])break;if(102===this.pes[S])break;if(103===this.pes[S])break;if(104===this.pes[S]){for(var q=t+1,Q=0;q<R;)Q*=10,Q+=15&this.pes[q],q++;this.PRA=Q;break}if(105===this.pes[S])break;if(106===this.pes[S])break;if(110===this.pes[S])break;if(111===this.pes[S])break}t=S+1}else{if(157!==this.pes[t])return;if(32!=this.pes[t+1])return void this.pes[t+1];var tt=63&this.pes[t+2];this.timeElapsed+=tt/10,t+=3}}}}}},{key:\\\"parseDRCS\\\",value:function(t,e,i){for(this.pes[e+0],e+=1;e<i;){var r=this.pes[e+0]<<8|this.pes[e+1],n=this.pes[e+2];e+=3;for(var s=0;s<n;s++){this.pes[e+0];var a=15&this.pes[e+0];if(0===a||1===a){var h=this.pes[e+1]+2,c=this.pes[e+2],u=this.pes[e+3],l=h.toString(2).length-h.toString(2).replace(/0*$/,\\\"\\\").length,f=Math.floor(c*u*l/8),d=new Uint8Array(Array.prototype.slice.call(this.pes,e+4,e+4+f));if(1===t){var p,v,b=64+((3840&r)>>8),g=127&r,y=null===(p=o.get(b))||void 0===p?void 0:p.alphabet;y&&(null===(v=this.DRCS_mapping.get(y))||void 0===v||v.set(g,d))}else{var m,_=32639&r;null===(m=this.DRCS_mapping.get(15))||void 0===m||m.set(_,d)}e+=4+f}}}}},{key:\\\"renderCharacter\\\",value:function(e,i){if((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),null!==this.svg){if(0===i.alphabet){var r=((65280&e)>>8)-33,s=(255&e)-33;if(0===r&&12<=s&&s<=17)return void(this.non_spacing=[\\\"́\\\",\\\"̀\\\",\\\"̈\\\",\\\"̂\\\",\\\"̅\\\",\\\"̲\\\"][s-12]);if(1===r&&93===s)return void(this.non_spacing+=\\\"⃝\\\")}if(31!==i.alphabet){this.rendered||this.svg.setAttribute(\\\"viewBox\\\",\\\"0 0 \\\".concat(this.swf_x,\\\" \\\").concat(this.swf_y)),this.rendered=!0;var o=this.force_bg_color||this.bg_color,h=t.getAlphaFromColorCode(o);if(!this.groups.has(h)){var v=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"g\\\");v.setAttribute(\\\"opacity\\\",\\\"\\\".concat(h/255)),this.groups.set(h,v),this.svg.appendChild(v)}var b=this.groups.get(h),g=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"rect\\\");if(g.setAttribute(\\\"shape-rendering\\\",\\\"crispEdges\\\"),g.setAttribute(\\\"x\\\",\\\"\\\".concat(this.position_x)),g.setAttribute(\\\"y\\\",\\\"\\\".concat(this.position_y-this.height())),g.setAttribute(\\\"width\\\",\\\"\\\".concat(this.width()+1)),g.setAttribute(\\\"height\\\",\\\"\\\".concat(this.height()+1)),g.setAttribute(\\\"fill\\\",\\\"\\\".concat(t.getRGBfromColorCode(o))),b.appendChild(g),1&this.hlc){var y=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"line\\\");y.setAttribute(\\\"shape-rendering\\\",\\\"crispEdges\\\"),y.setAttribute(\\\"x1\\\",\\\"\\\".concat(this.position_x)),y.setAttribute(\\\"y1\\\",\\\"\\\".concat(this.position_y-1)),y.setAttribute(\\\"x2\\\",\\\"\\\".concat(this.position_x+this.width())),y.setAttribute(\\\"y2\\\",\\\"\\\".concat(this.position_y-1)),y.setAttribute(\\\"stroke\\\",\\\"\\\".concat(t.getRGBAfromColorCode(this.fg_color))),y.setAttribute(\\\"stroke-width\\\",\\\"\\\".concat(2)),this.svg.appendChild(y)}if(2&this.hlc){var m=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"line\\\");m.setAttribute(\\\"shape-rendering\\\",\\\"crispEdges\\\"),m.setAttribute(\\\"x1\\\",\\\"\\\".concat(this.position_x+this.width()-1)),m.setAttribute(\\\"y1\\\",\\\"\\\".concat(this.position_y-this.height())),m.setAttribute(\\\"x2\\\",\\\"\\\".concat(this.position_x+this.width()-1)),m.setAttribute(\\\"y2\\\",\\\"\\\".concat(this.position_y)),m.setAttribute(\\\"stroke\\\",\\\"\\\".concat(t.getRGBAfromColorCode(this.fg_color))),m.setAttribute(\\\"stroke-width\\\",\\\"\\\".concat(2)),this.svg.appendChild(m)}if(4&this.hlc){var _=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"line\\\");_.setAttribute(\\\"shape-rendering\\\",\\\"crispEdges\\\"),_.setAttribute(\\\"x1\\\",\\\"\\\".concat(this.position_x)),_.setAttribute(\\\"y1\\\",\\\"\\\".concat(this.position_y-this.height()+1)),_.setAttribute(\\\"x2\\\",\\\"\\\".concat(this.position_x+this.width())),_.setAttribute(\\\"y2\\\",\\\"\\\".concat(this.position_y-this.height()+1)),_.setAttribute(\\\"stroke\\\",\\\"\\\".concat(t.getRGBAfromColorCode(this.fg_color))),_.setAttribute(\\\"stroke-width\\\",\\\"\\\".concat(2)),this.svg.appendChild(_)}if(8&this.hlc){var w=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"line\\\");w.setAttribute(\\\"shape-rendering\\\",\\\"crispEdges\\\"),w.setAttribute(\\\"x1\\\",\\\"\\\".concat(this.position_x+1)),w.setAttribute(\\\"y1\\\",\\\"\\\".concat(this.position_y-this.height())),w.setAttribute(\\\"x2\\\",\\\"\\\".concat(this.position_x+1)),w.setAttribute(\\\"y2\\\",\\\"\\\".concat(this.position_y)),w.setAttribute(\\\"stroke\\\",\\\"\\\".concat(t.getRGBAfromColorCode(this.fg_color))),w.setAttribute(\\\"stroke-width\\\",\\\"\\\".concat(2)),this.svg.appendChild(w)}if(this.stl){var x=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"line\\\");x.setAttribute(\\\"shape-rendering\\\",\\\"crispEdges\\\"),x.setAttribute(\\\"x1\\\",\\\"\\\".concat(this.position_x)),x.setAttribute(\\\"y1\\\",\\\"\\\".concat(this.position_y-1)),x.setAttribute(\\\"x2\\\",\\\"\\\".concat(this.position_x+this.width())),x.setAttribute(\\\"y2\\\",\\\"\\\".concat(this.position_y-1)),x.setAttribute(\\\"stroke\\\",\\\"\\\".concat(t.getRGBAfromColorCode(this.fg_color))),x.setAttribute(\\\"stroke-width\\\",\\\"\\\".concat(2)),this.svg.appendChild(x)}}if(0===i.alphabet){var A=94*(((65280&e)>>8)-33)+((255&e)-33),C=7896;if(A<C){var k=c[A];this.renderFont(k)}else if(this.usePUA){var F=u[A-C];this.renderFont(F)}else{var S=l[A-C];this.renderFont(S)}this.move_relative_pos(1,0)}else if(1===i.alphabet){var R=f[e-33];this.renderFont(R),this.move_relative_pos(1,0)}else if(2===i.alphabet){var I=d[e-33];this.renderFont(I),this.move_relative_pos(1,0)}else if(3===i.alphabet){var E=p[e-33];this.renderFont(E),this.move_relative_pos(1,0)}else{if(31===i.alphabet)return void(96===e?(this.G_BACK=[n.get(0),n.get(1),n.get(2),a.get(31)],this.GL=0,this.GR=2):97===e?(this.G_BACK=[n.get(0),n.get(3),n.get(2),a.get(31)],this.GL=0,this.GR=2):98===e?(this.G_BACK=[n.get(0),a.get(16),n.get(2),a.get(31)],this.GL=0,this.GR=2):99===e?(this.G_BACK=[n.get(4),n.get(6),n.get(7),a.get(31)],this.GL=0,this.GR=2):100===e?(this.G_BACK=[n.get(4),n.get(5),n.get(7),a.get(31)],this.GL=0,this.GR=2):101===e?(this.G_BACK=[n.get(4),a.get(16),n.get(7),a.get(31)],this.GL=0,this.GR=2):102===e?(this.G_BACK=[a.get(16),a.get(17),a.get(18),a.get(31)],this.GL=0,this.GR=2):103===e?(this.G_BACK=[a.get(19),a.get(20),a.get(21),a.get(31)],this.GL=0,this.GR=2):104===e?(this.G_BACK=[a.get(22),a.get(23),a.get(24),a.get(31)],this.GL=0,this.GR=2):105===e?(this.G_BACK=[a.get(25),a.get(26),a.get(27),a.get(31)],this.GL=0,this.GR=2):106===e?(this.G_BACK=[a.get(28),a.get(29),a.get(30),a.get(31)],this.GL=0,this.GR=2):107===e?(this.G_BACK=[n.get(0),a.get(17),n.get(2),a.get(31)],this.GL=0,this.GR=2):108===e?(this.G_BACK=[n.get(0),a.get(18),n.get(2),a.get(31)],this.GL=0,this.GR=2):109===e?(this.G_BACK=[n.get(0),a.get(19),n.get(2),a.get(31)],this.GL=0,this.GR=2):110===e?(this.G_BACK=[n.get(3),n.get(2),n.get(1),a.get(31)],this.GL=0,this.GR=2):111===e&&(this.G_BACK=[n.get(1),n.get(4),a.get(16),a.get(31)],this.GL=0,this.GR=2));var O,M=null===(O=this.DRCS_mapping.get(i.alphabet))||void 0===O?void 0:O.get(32639&e);if(!M)return;var G=T(M.buffer);if(this.drcsReplacement&&this.drcsReplaceMapping.has(G.toLowerCase()))this.renderFont(this.drcsReplaceMapping.get(G.toLowerCase()));else if(this.drcsReplacement&&this.drcsReplaceMapping.has(G.toUpperCase()))this.renderFont(this.drcsReplaceMapping.get(G.toUpperCase()));else{var B=document.createElement(\\\"canvas\\\"),P=Math.floor(this.ssm_x*this.text_size_x/2),D=Math.floor(this.ssm_y*this.text_size_y/2),j=Math.floor(8*M.length/(P*D));B.width=2*(P+4),B.height=2*(D+4);var L=B.getContext(\\\"2d\\\");if(!L)return;var N=this.getOrnColorCode();if(N&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color)){L.fillStyle=t.getRGBAfromColorCode(N);for(var U=-2;U<=2;U++)for(var z=-2;z<=2;z++)for(var H=0;H<D;H++)for(var X=0;X<P;X++){for(var K=0,V=0;V<j;V++){var $=7-((H*P+X)*j+V)%8;K*=2,K+=(M[Math.floor(((H*P+X)*j+V)/8)]&1<<$)>>$}K>0&&L.fillRect(2*(2+X+z),2*(2+H+U),2,2)}}L.fillStyle=t.getRGBAfromColorCode(this.fg_color);for(var W=0;W<D;W++)for(var Y=0;Y<P;Y++){for(var J=0,Z=0;Z<j;Z++){var q=7-((W*P+Y)*j+Z)%8;J*=2,J+=(M[Math.floor(((W*P+Y)*j+Z)/8)]&1<<q)>>q}J>0&&L.fillRect(2*(2+Y),2*(2+W),2,2)}var Q=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"image\\\");if(Q.setAttribute(\\\"href\\\",B.toDataURL()),Q.setAttribute(\\\"x\\\",\\\"\\\".concat(this.position_x+Math.floor(this.shs*this.text_size_x/2)-4)),Q.setAttribute(\\\"y\\\",\\\"\\\".concat(this.position_y+Math.floor(this.svs*this.text_size_y/2)-this.height()-4)),Q.setAttribute(\\\"width\\\",\\\"\\\".concat(B.width/2*2)),Q.setAttribute(\\\"height\\\",\\\"\\\".concat(B.height/2*2)),0===this.flc){var tt=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"animate\\\");tt.setAttribute(\\\"attributeName\\\",\\\"opacity\\\"),tt.setAttribute(\\\"values\\\",\\\"1;0\\\"),tt.setAttribute(\\\"dur\\\",\\\"1s\\\"),tt.setAttribute(\\\"calcMode\\\",\\\"discrete\\\"),tt.setAttribute(\\\"repeatCount\\\",\\\"indefinite\\\"),Q.appendChild(tt)}else if(7===this.flc){var et=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"animate\\\");et.setAttribute(\\\"attributeName\\\",\\\"opacity\\\"),et.setAttribute(\\\"values\\\",\\\"0;1\\\"),et.setAttribute(\\\"dur\\\",\\\"1s\\\"),et.setAttribute(\\\"calcMode\\\",\\\"discrete\\\"),et.setAttribute(\\\"repeatCount\\\",\\\"indefinite\\\"),Q.appendChild(et)}this.svg.appendChild(Q)}this.move_relative_pos(1,0)}}}},{key:\\\"renderFont\\\",value:function(e){var i,r;e+=this.non_spacing,this.non_spacing=\\\"\\\",.5===this.text_size_x&&.5===this.text_size_y&&(d.includes(e)||p.includes(e))||(this.text+=e);var n=b.has(e),s=n?this.gaijiFont:this.normalFont;if(null!=vt&&null!==(i=vt)&&void 0!==i&&i.has(e)){var a=vt.get(e),o=a.viewBox,h=a.path;this.renderPath(o,h)}else{n&&(e+=\\\"︎\\\");var c=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"text\\\");if(c.setAttribute(\\\"x\\\",\\\"0\\\"),c.setAttribute(\\\"y\\\",\\\"0\\\"),c.setAttribute(\\\"transform\\\",\\\"scale(\\\".concat(this.text_size_x,\\\" \\\").concat(this.text_size_y,\\\") translate(\\\").concat((this.position_x+this.width()/2)/this.text_size_x,\\\" \\\").concat((this.position_y-this.height()/2)/this.text_size_y,\\\")\\\")),c.setAttribute(\\\"transform-origin\\\",\\\"0 0\\\"),c.setAttribute(\\\"font-size\\\",\\\"\\\".concat(this.ssm_x)),c.setAttribute(\\\"font-family\\\",s),c.setAttribute(\\\"dominant-baseline\\\",\\\"central\\\"),c.setAttribute(\\\"text-anchor\\\",\\\"middle\\\"),c.setAttribute(\\\"fill\\\",t.getRGBAfromColorCode(this.fg_color)),c.setAttribute(\\\"paint-order\\\",\\\"stroke\\\"),c.setAttribute(\\\"stroke-linejoin\\\",\\\"round\\\"),c.setAttribute(\\\"stroke-width\\\",this.getOrnColorCode()?\\\"\\\".concat(8):\\\"0\\\"),c.setAttribute(\\\"stroke\\\",this.getOrnColorCode()?t.getRGBAfromColorCode(this.getOrnColorCode()):\\\"transparent\\\"),c.appendChild(document.createTextNode(e)),0===this.flc){var u=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"animate\\\");u.setAttribute(\\\"attributeName\\\",\\\"opacity\\\"),u.setAttribute(\\\"values\\\",\\\"1;0\\\"),u.setAttribute(\\\"dur\\\",\\\"1s\\\"),u.setAttribute(\\\"calcMode\\\",\\\"discrete\\\"),u.setAttribute(\\\"repeatCount\\\",\\\"indefinite\\\"),c.appendChild(u)}else if(7===this.flc){var l=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"animate\\\");l.setAttribute(\\\"attributeName\\\",\\\"opacity\\\"),l.setAttribute(\\\"values\\\",\\\"0;1\\\"),l.setAttribute(\\\"dur\\\",\\\"1s\\\"),l.setAttribute(\\\"calcMode\\\",\\\"discrete\\\"),l.setAttribute(\\\"repeatCount\\\",\\\"indefinite\\\"),c.appendChild(l)}null===(r=this.svg)||void 0===r||r.appendChild(c)}}},{key:\\\"renderPath\\\",value:function(e,i){var r;document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"svg\\\").setAttribute(\\\"viewBox\\\",\\\"\\\".concat(e[0],\\\" \\\").concat(e[1],\\\" \\\").concat(e[2],\\\" \\\").concat(e[3]));var n=this.ssm_x*this.text_size_x/(e[2]-e[0]),s=this.ssm_y*this.text_size_y/(e[3]-e[1]),a=this.shs*this.text_size_x/2,o=this.svs*this.text_size_y/2,h=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"path\\\");if(h.setAttribute(\\\"d\\\",i),h.setAttribute(\\\"x\\\",\\\"0\\\"),h.setAttribute(\\\"y\\\",\\\"0\\\"),h.setAttribute(\\\"transform\\\",\\\"scale(\\\".concat(n,\\\" \\\").concat(s,\\\") translate(\\\").concat((this.position_x+a)/n,\\\" \\\").concat((this.position_y+o-this.height())/s,\\\")\\\")),h.setAttribute(\\\"transform-origin\\\",\\\"0 0\\\"),h.setAttribute(\\\"fill\\\",t.getRGBAfromColorCode(this.fg_color)),h.setAttribute(\\\"paint-order\\\",\\\"stroke\\\"),h.setAttribute(\\\"stroke-linejoin\\\",\\\"round\\\"),h.setAttribute(\\\"stroke-width\\\",this.getOrnColorCode()?\\\"\\\".concat(4/Math.min(n,s)):\\\"0\\\"),h.setAttribute(\\\"stroke\\\",this.getOrnColorCode()?t.getRGBAfromColorCode(this.getOrnColorCode()):\\\"transparent\\\"),0===this.flc){var c=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"animate\\\");c.setAttribute(\\\"attributeName\\\",\\\"opacity\\\"),c.setAttribute(\\\"values\\\",\\\"1;0\\\"),c.setAttribute(\\\"dur\\\",\\\"1s\\\"),c.setAttribute(\\\"calcMode\\\",\\\"discrete\\\"),c.setAttribute(\\\"repeatCount\\\",\\\"indefinite\\\"),h.appendChild(c)}else if(7===this.flc){var u=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"animate\\\");u.setAttribute(\\\"attributeName\\\",\\\"opacity\\\"),u.setAttribute(\\\"values\\\",\\\"0;1\\\"),u.setAttribute(\\\"dur\\\",\\\"1s\\\"),u.setAttribute(\\\"calcMode\\\",\\\"discrete\\\"),u.setAttribute(\\\"repeatCount\\\",\\\"indefinite\\\"),h.appendChild(u)}null===(r=this.svg)||void 0===r||r.appendChild(h)}},{key:\\\"parseBitmap\\\",value:function(t,e){if(null!==this.svg){this.rendered||this.svg.setAttribute(\\\"viewBox\\\",\\\"0 0 \\\".concat(this.swf_x,\\\" \\\").concat(this.swf_y)),this.rendered=!0;var i=this.pes[t]<<8|this.pes[t+1];t+=2;var r=this.pes[t]<<8|this.pes[t+1];t+=2;var n=this.pes[t];t+=1;var s=new Set(this.pes.subarray(t,t+n));if(!((t+=n)+33>e)){var a=this.pes.subarray(t,t+33),o=this.pes.subarray(t+33,e),c=new Uint8Array(a.byteLength+o.byteLength+396+140),u=new DataView(c.buffer);c.set(a,0),c.set(o,569);for(var l=0;l<8;l++)for(var f=0;f<16;f++)if(!s.has(16*l+f)){var d=h[l][f],p=Number.parseInt(d.substring(1,3),16),v=Number.parseInt(d.substring(3,5),16),b=Number.parseInt(d.substring(5,7),16),g=Number.parseInt(d.substring(7,9),16);c[41+3*(16*l+f)]=p,c[41+3*(16*l+f)+1]=v,c[41+3*(16*l+f)+2]=b,c[437+(16*l+f)]=g}u.setInt32(33,384,!1),c[37]=\\\"P\\\".charCodeAt(0),c[38]=\\\"L\\\".charCodeAt(0),c[39]=\\\"T\\\".charCodeAt(0),c[40]=\\\"E\\\".charCodeAt(0),u.setInt32(429,128,!1),c[433]=\\\"t\\\".charCodeAt(0),c[434]=\\\"R\\\".charCodeAt(0),c[435]=\\\"N\\\".charCodeAt(0),c[436]=\\\"S\\\".charCodeAt(0),u.setInt32(425,ht(c,37,425),!1),u.setInt32(565,ht(c,433,565),!1);var y=u.getInt32(16,!1),m=u.getInt32(20,!1),_=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"svg\\\");_.setAttribute(\\\"x\\\",\\\"\\\".concat(this.sdp_x)),_.setAttribute(\\\"y\\\",\\\"\\\".concat(this.sdp_y)),_.setAttribute(\\\"width\\\",\\\"\\\".concat(this.sdf_x)),_.setAttribute(\\\"height\\\",\\\"\\\".concat(this.sdf_y)),_.setAttribute(\\\"viewBox\\\",\\\"0 0 \\\".concat(this.sdf_x,\\\" \\\").concat(this.sdf_y));var w=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"image\\\");if(w.setAttribute(\\\"href\\\",\\\"data:image/png;base64,\\\"+window.btoa(String.fromCharCode.apply(String,ut(c)))),w.setAttribute(\\\"x\\\",\\\"\\\".concat(2*i)),w.setAttribute(\\\"y\\\",\\\"\\\".concat(2*r)),w.setAttribute(\\\"width\\\",\\\"\\\".concat(2*y)),w.setAttribute(\\\"height\\\",\\\"\\\".concat(2*m)),_.appendChild(w),s.size>0){for(var x=0;x<8;x++)for(var A=0;A<16;A++)if(s.has(16*x+A)){var C=h[x][A],T=Number.parseInt(C.substring(1,3),16),k=Number.parseInt(C.substring(3,5),16),F=Number.parseInt(C.substring(5,7),16),S=Number.parseInt(C.substring(7,9),16);c[41+3*(16*x+A)]=T,c[41+3*(16*x+A)+1]=k,c[41+3*(16*x+A)+2]=F,c[437+(16*x+A)]=S}else c[437+(16*x+A)]=0;u.setInt32(425,ht(c,37,425),!1),u.setInt32(565,ht(c,433,565),!1);var R=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"image\\\");R.setAttribute(\\\"href\\\",\\\"data:image/png;base64,\\\"+window.btoa(String.fromCharCode.apply(String,ut(c)))),R.setAttribute(\\\"x\\\",\\\"\\\".concat(2*i)),R.setAttribute(\\\"y\\\",\\\"\\\".concat(2*r)),R.setAttribute(\\\"width\\\",\\\"\\\".concat(2*y)),R.setAttribute(\\\"height\\\",\\\"\\\".concat(2*m));var I=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"animate\\\");I.setAttribute(\\\"attributeName\\\",\\\"opacity\\\"),I.setAttribute(\\\"values\\\",\\\"1;0\\\"),I.setAttribute(\\\"dur\\\",\\\"1s\\\"),I.setAttribute(\\\"calcMode\\\",\\\"discrete\\\"),I.setAttribute(\\\"repeatCount\\\",\\\"indefinite\\\"),R.appendChild(I),_.appendChild(R)}this.svg.appendChild(_)}}}},{key:\\\"getOrnColorCode\\\",value:function(){return!0===this.force_orn?t.fillAlphaColorCode(this.bg_color):!1===this.force_orn?this.orn:null!==(e=this.force_orn)&&void 0!==e?e:this.orn;var e}}],r=[{key:\\\"setEmbeddedGlyph\\\",value:function(t){vt=t}},{key:\\\"detect\\\",value:function(t,e){var i,r,n=null!==(i=null==e?void 0:e.data_identifier)&&void 0!==i?i:128,s=null!==(r=null==e?void 0:e.data_group_id)&&void 0!==r?r:1;if(t.length<=0)return!1;if(t[0]!==n)return!1;if(t.length<=2)return!1;var a=3+(15&t[2]);return!(t.length<=a||(15&(252&t[a+0])>>2)!==s||(y(t,a),0))}},{key:\\\"getRGBAColorCode\\\",value:function(t){if(null==t)return null;var e=document.createElement(\\\"canvas\\\");e.width=e.height=1;var i=e.getContext(\\\"2d\\\");if(!i)return null;i.fillStyle=t,i.fillRect(0,0,e.width,e.height);var r=function(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:\\\"undefined\\\"!=typeof Symbol&&t[Symbol.iterator]||t[\\\"@@iterator\\\"];if(null!=i){var r,n,s,a,o=[],h=!0,c=!1;try{if(s=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;h=!1}else for(;!(h=(r=s.call(i)).done)&&(o.push(r.value),o.length!==e);h=!0);}catch(t){c=!0,n=t}finally{try{if(!h&&null!=i.return&&(a=i.return(),Object(a)!==a))return}finally{if(c)throw n}}return o}}(t,e)||lt(t,e)||function(){throw new TypeError(\\\"Invalid attempt to destructure non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\\\")}()}(i.getImageData(0,0,1,1).data,4),n=r[0],s=r[1],a=r[2],o=r[3],h=\\\"#\\\".concat(n.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(s.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(a.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(o.toString(16).toUpperCase().padStart(2,\\\"0\\\"));return e.width=e.height=0,h}},{key:\\\"fillAlphaColorCode\\\",value:function(t){if(null==t)return\\\"\\\";var e=Number.parseInt(t.substring(1,3),16),i=Number.parseInt(t.substring(3,5),16),r=Number.parseInt(t.substring(5,7),16);return\\\"#\\\".concat(e.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(i.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(r.toString(16).toUpperCase().padStart(2,\\\"0\\\"),\\\"FF\\\")}},{key:\\\"getRGBAfromColorCode\\\",value:function(t){if(null==t)return\\\"\\\";var e=Number.parseInt(t.substring(1,3),16),i=Number.parseInt(t.substring(3,5),16),r=Number.parseInt(t.substring(5,7),16),n=Number.parseInt(t.substring(7,9),16);return\\\"rgba(\\\".concat(e,\\\", \\\").concat(i,\\\", \\\").concat(r,\\\", \\\").concat(n/255,\\\")\\\")}},{key:\\\"getRGBfromColorCode\\\",value:function(t){if(null==t)return\\\"\\\";var e=Number.parseInt(t.substring(1,3),16),i=Number.parseInt(t.substring(3,5),16),r=Number.parseInt(t.substring(5,7),16);return\\\"rgb(\\\".concat(e,\\\", \\\").concat(i,\\\", \\\").concat(r,\\\")\\\")}},{key:\\\"getAlphaFromColorCode\\\",value:function(t){return null==t?Number.NaN:Number.parseInt(t.substring(7,9),16)}}],i&&dt(e.prototype,i),r&&dt(e,r),Object.defineProperty(e,\\\"prototype\\\",{writable:!1}),e;var e,i,r}();function gt(t){return gt=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\\\"function\\\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\\\"symbol\\\":typeof t},gt(t)}function yt(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,r)}return i}function mt(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?yt(Object(i),!0).forEach((function(e){_t(t,e,i[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):yt(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}function _t(t,e,i){return(e=xt(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function wt(t,e){for(var i=0;i<e.length;i++){var r=e[i];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(t,xt(r.key),r)}}function xt(t){var e=function(t){if(\\\"object\\\"!=gt(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,\\\"string\\\");if(\\\"object\\\"!=gt(i))return i;throw new TypeError(\\\"@@toPrimitive must return a primitive value.\\\")}return String(t)}(t);return\\\"symbol\\\"==gt(e)?e:e+\\\"\\\"}var At=function(){return t=function t(e){var i,r,n,s;!function(t,e){if(!(t instanceof e))throw new TypeError(\\\"Cannot call a class as a function\\\")}(this,t),this.media=null,this.id3Track=null,this.b24Track=null,this.subtitleElement=null,this.svg=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"svg\\\"),this.textContent=null,this.prevCurrentTime=null,this.highResTimeupdatePollingId=null,this.isShowing=!0,this.isOnSeeking=!1,this.onB24CueChangeDrawed=!1,this.onID3AddtrackHandler=this.onID3Addtrack.bind(this),this.onID3CueChangeHandler=this.onID3CueChange.bind(this),this.onB24CueChangeHandler=this.onB24CueChange.bind(this),this.onHighResTimeupdateHandler=this.onHighResTimeupdate.bind(this),this.onTimeupdateHandler=this.onTimeupdate.bind(this),this.onCanplayHandler=this.onCanplay.bind(this),this.onPlayHandler=this.onPlay.bind(this),this.onPauseHandler=this.onPause.bind(this),this.onPauseAnimationHandler=this.onPauseAnimation.bind(this),this.onResumeAnimationHandler=this.onResumeAnimation.bind(this),this.onSeekingHandler=this.onSeeking.bind(this),this.onSeekedHandler=this.onSeeked.bind(this),this.data_identifier=null!==(i=null==e?void 0:e.data_identifier)&&void 0!==i?i:128,this.data_group_id=null!==(r=null==e?void 0:e.data_group_id)&&void 0!==r?r:1,this.rendererOption=mt(mt({},e),{},{data_identifier:this.data_identifier,data_group_id:this.data_group_id,keepAspectRatio:null===(n=null==e?void 0:e.keepAspectRatio)||void 0===n||n,enableAutoInBandMetadataTextTrackDetection:null===(s=null==e?void 0:e.enableAutoInBandMetadataTextTrackDetection)||void 0===s||s})},(e=[{key:\\\"attachMedia\\\",value:function(t,e){var i;this.detachMedia(),this.media=t,this.subtitleElement=null!=e?e:t.parentElement,this.media.addEventListener(\\\"canplay\\\",this.onCanplayHandler),this.media.addEventListener(\\\"play\\\",this.onResumeAnimationHandler),this.media.addEventListener(\\\"pause\\\",this.onPauseAnimationHandler),null!==(i=this.rendererOption)&&void 0!==i&&i.useHighResTimeupdate?(this.media.addEventListener(\\\"play\\\",this.onPlayHandler),this.media.addEventListener(\\\"pause\\\",this.onPauseHandler)):this.media.addEventListener(\\\"timeupdate\\\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.setupTrack(),this.setupSVG()}},{key:\\\"detachMedia\\\",value:function(){var t,e,i,r,n,s;this.cleanupSVG(),this.cleanupTrack(),null===(t=this.media)||void 0===t||t.removeEventListener(\\\"canplay\\\",this.onCanplayHandler),null===(e=this.media)||void 0===e||e.removeEventListener(\\\"play\\\",this.onPlayHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\\\"pause\\\",this.onPauseHandler),null===(r=this.media)||void 0===r||r.removeEventListener(\\\"play\\\",this.onResumeAnimationHandler),null===(n=this.media)||void 0===n||n.removeEventListener(\\\"pause\\\",this.onPauseAnimationHandler),this.onPause(),null===(s=this.media)||void 0===s||s.removeEventListener(\\\"timeupdate\\\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.media=this.subtitleElement=null}},{key:\\\"dispose\\\",value:function(){this.detachMedia()}},{key:\\\"getSVG\\\",value:function(){return this.svg}},{key:\\\"getTextContent\\\",value:function(){return this.textContent}},{key:\\\"show\\\",value:function(){this.isShowing=!0,this.svg.style.visibility=\\\"visible\\\"}},{key:\\\"hide\\\",value:function(){this.isShowing=!1,this.svg.style.visibility=\\\"hidden\\\"}},{key:\\\"isPresent\\\",value:function(){return this.onB24CueChangeDrawed}},{key:\\\"pushRawData\\\",value:function(t,e){var i=new bt(e,t).render(mt({},this.rendererOption));if(null==i)return!1;var r=Number.isFinite(i.endTime)?i.endTime:Number.MAX_SAFE_INTEGER;return this.addB24Cue(t,r,e)}},{key:\\\"pushBase64Data\\\",value:function(t,e){var i=tt(e);return this.pushRawData(t,i)}},{key:\\\"pushData\\\",value:function(t,e,i){return this.pushRawData(i,e)}},{key:\\\"pushID3v2PRIVData\\\",value:function(t,e,i){return\\\"aribb24.js\\\"===e&&this.pushRawData(t,i)}},{key:\\\"pushID3v2TXXXData\\\",value:function(t,e,i){return\\\"aribb24.js\\\"===e&&this.pushBase64Data(t,i)}},{key:\\\"pushID3v2Data\\\",value:function(t,e){for(var i=!1,r=0;r<e.length;){var n=r;if(r+3>e.length)break;if(73!==e[r+0]||68!==e[r+1]||51!==e[r+2]){if(0===r){r+=5;continue}break}if((r+=6)+4>e.length)break;var s=J(e,r+0,r+4);r+=4;var a=n+3+2+1+4+s;if(a>e.length)break;for(var o=r;o<a;){var h=o;if(o+4>e.length)break;var c=Q(e,o+0,o+4);if((o+=4)+4>e.length)break;var u=J(e,o+0,o+4);o+=6;var l=h+4+4+2+u;if(l>e.length)break;if(\\\"PRIV\\\"===c){for(var f=o,d=l;0!==e[o]&&o<l;)o++;var p=Q(e,f,o),v=new Uint8Array(Array.prototype.slice.call(e,o+1,d));this.pushID3v2PRIVData(t,p,v)&&(i=!0)}else if(\\\"TXXX\\\"===c){var b=e[o+0],g=o+1;if(3===b){for(;0!==e[o]&&o<l;)o++;for(var y=o,m=o+=1;0!==e[o]&&o<l;)o++;var _=o,w=q(e,g,y),x=q(e,m,_);this.pushID3v2TXXXData(t,w,x)&&(i=!0)}else if(0===b){for(;0!==e[o]&&o<l;)o++;for(var A=o,C=o+=1;0!==e[o]&&o<l;)o++;var T=o,k=Q(e,g,A),F=Q(e,C,T);this.pushID3v2TXXXData(t,k,F)&&(i=!0)}}o=l}(r=n+3+2+1+4+s)+3>e.length||51===e[r+0]&&68===e[r+1]&&73===e[r+2]&&(r+=10)}return i}},{key:\\\"setInBandMetadataTextTrack\\\",value:function(t){var e;null===(e=this.id3Track)||void 0===e||e.removeEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler),this.id3Track=t,this.id3Track.mode=\\\"hidden\\\",this.id3Track.addEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler)}},{key:\\\"pushID3v2Cue\\\",value:function(t){if(!this.id3Track)return!1;var e=t.startTime,i=t;if(\\\"15260DFFFF49443320FF49443320000F\\\"===this.id3Track.inBandMetadataTrackDispatchType)return this.pushID3v2Data(e,new Uint8Array(i.data));if(\\\"com.apple.streaming\\\"===this.id3Track.inBandMetadataTrackDispatchType){if(\\\"PRIV\\\"===i.value.key)return this.pushID3v2PRIVData(e,i.value.info,new Uint8Array(i.value.data));if(\\\"TXXX\\\"===i.value.key)return this.pushID3v2TXXXData(e,i.value.info,i.value.data)}else if(\\\"id3\\\"===this.id3Track.label){if(\\\"PRIV\\\"===i.value.key)return this.pushID3v2PRIVData(e,i.value.info,new Uint8Array(i.value.data));if(\\\"TXXX\\\"===i.value.key)return this.pushID3v2TXXXData(e,i.value.info,i.value.data)}else if(\\\"Timed Metadata\\\"===this.id3Track.label){if(\\\"PRIV\\\"===i.frame.key)return this.pushID3v2PRIVData(e,i.frame.owner,new Uint8Array(i.frame.data));if(\\\"TXXX\\\"===i.frame.key)return this.pushID3v2TXXXData(e,i.frame.description,i.frame.data)}return!1}},{key:\\\"onID3CueChange\\\",value:function(){this.id3Track&&(this.isOnSeeking||this.onTimeupdate())}},{key:\\\"addB24Cue\\\",value:function(t,e,i){var r;if(!this.b24Track)return!1;if(!bt.detect(i,this.rendererOption))return!1;var n=new(null!==(r=window.VTTCue)&&void 0!==r?r:window.TextTrackCue)(t,e,\\\"\\\");if(n.data=i,window.VTTCue)this.b24Track.addCue(n);else if(window.TextTrackCue){var s;if(Array.prototype.some.call(null!==(s=this.b24Track.cues)&&void 0!==s?s:[],(function(e){return e.startTime===t})))return!1;if(this.b24Track.cues){for(var a=[],o=this.b24Track.cues.length-1;o>=0;o--)this.b24Track.cues[o].startTime>=t&&(a.push(this.b24Track.cues[o]),this.b24Track.removeCue(this.b24Track.cues[o]));this.b24Track.addCue(n);for(var h=a.length-1;h>=0;h--)this.b24Track.addCue(a[h])}}return!0}},{key:\\\"onB24CueChange\\\",value:function(){if(this.media&&this.b24Track){for(;this.svg.firstChild;)this.svg.removeChild(this.svg.firstChild);if(this.b24Track.activeCues&&this.b24Track.activeCues.length>0){var t=this.b24Track.activeCues[this.b24Track.activeCues.length-1];if(t.startTime<=this.media.currentTime&&this.media.currentTime<=t.endTime&&!this.isOnSeeking){var e=new bt(t.data,t.startTime);if(this.isShowing){var i,r,n,s=e.render(mt(mt({},this.rendererOption),{},{svg:this.svg}));null!=(null==s?void 0:s.PRA)&&(null===(r=this.rendererOption)||void 0===r||null===(n=r.PRACallback)||void 0===n||n.call(r,s.PRA)),null==s||s.rendered,this.textContent=null!==(i=null==s?void 0:s.textContent)&&void 0!==i?i:null}this.onB24CueChangeDrawed=!0}else this.onB24CueChangeDrawed=!1,this.textContent=null;for(var a=this.b24Track.activeCues.length-2;a>=0;a--){var o=this.b24Track.activeCues[a];o.endTime=Math.min(o.endTime,t.startTime),o.startTime===o.endTime&&this.b24Track.removeCue(o)}}else this.onB24CueChangeDrawed=!1,this.textContent=null}else this.onB24CueChangeDrawed=!1}},{key:\\\"onHighResTimeupdate\\\",value:function(){this.onTimeupdate(),this.highResTimeupdatePollingId=window.requestAnimationFrame(this.onHighResTimeupdateHandler)}},{key:\\\"onTimeupdate\\\",value:function(){if(this.media)if(null!=this.prevCurrentTime)if(this.id3Track&&this.id3Track.cues&&0!==this.id3Track.cues.length)if(this.isOnSeeking)this.prevCurrentTime=this.media.currentTime;else if(Math.abs(this.media.currentTime-this.prevCurrentTime)>1)this.prevCurrentTime=this.media.currentTime;else{for(var t,e,i=new Y(Number.NEGATIVE_INFINITY,this.id3Track.cues[0].startTime),r=[i],n=0;n<this.id3Track.cues.length;n++)r.push(this.id3Track.cues[n]);for(var s=0,a=r.length;s+1<a;){var o=this.prevCurrentTime,h=Math.floor((s+a)/2);o<r[h].startTime?a=h:s=h}t=s;for(var c=0,u=r.length;c+1<u;){var l=this.media.currentTime,f=Math.floor((c+u)/2);l<r[f].startTime?u=f:c=f}if(e=c,null!==t&&null!==e&&t!==e){if(t<e)for(var d=e;d>t;d--){var p=r[d];if(p!==i&&this.pushID3v2Cue(p))break}else for(var v=t;v<e;v++){var b=r[v];if(b!==i&&this.pushID3v2Cue(b))break}this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime;else this.prevCurrentTime=this.media.currentTime}},{key:\\\"onCanplay\\\",value:function(){this.id3Track&&(this.id3Track.mode=\\\"hidden\\\"),this.b24Track&&(this.b24Track.mode=\\\"hidden\\\"),null!=this.media&&null==this.prevCurrentTime&&(this.prevCurrentTime=this.media.currentTime-Number.MIN_VALUE)}},{key:\\\"onPlay\\\",value:function(){null==this.highResTimeupdatePollingId&&this.onHighResTimeupdate()}},{key:\\\"onPause\\\",value:function(){null!=this.highResTimeupdatePollingId&&(window.cancelAnimationFrame(this.highResTimeupdatePollingId),this.highResTimeupdatePollingId=null)}},{key:\\\"onPauseAnimation\\\",value:function(){this.svg.pauseAnimations()}},{key:\\\"onResumeAnimation\\\",value:function(){this.svg.unpauseAnimations()}},{key:\\\"onSeeking\\\",value:function(){this.isOnSeeking=!0,this.onB24CueChange()}},{key:\\\"onSeeked\\\",value:function(){this.isOnSeeking=!1}},{key:\\\"onID3Addtrack\\\",value:function(t){if(this.media){var e=t.track;\\\"metadata\\\"===e.kind&&(\\\"15260DFFFF49443320FF49443320000F\\\"!==e.inBandMetadataTrackDispatchType&&\\\"com.apple.streaming\\\"!==e.inBandMetadataTrackDispatchType&&\\\"id3\\\"!==e.label||this.setInBandMetadataTextTrack(e))}}},{key:\\\"setupTrack\\\",value:function(){var t,e;if(this.media){if(null!==(t=this.rendererOption)&&void 0!==t&&t.useHighResTextTrack)this.b24Track=new K(this.media),this.b24Track.startPolling();else{for(var i=\\\"ARIB B24 Japanese SVG (data_identifier=0x\\\".concat(this.data_identifier.toString(16),\\\", data_group_id=\\\").concat(this.data_group_id,\\\")\\\"),r=0;r<this.media.textTracks.length;r++){var n=this.media.textTracks[r];if(n.label===i){this.b24Track=n;break}}this.b24Track||(this.b24Track=this.media.addTextTrack(\\\"metadata\\\",i,\\\"ja\\\"),this.b24Track.mode=\\\"hidden\\\")}if(this.b24Track.addEventListener(\\\"cuechange\\\",this.onB24CueChangeHandler),null!==(e=this.rendererOption)&&void 0!==e&&e.enableAutoInBandMetadataTextTrackDetection){for(var s=0;s<this.media.textTracks.length;s++){var a=this.media.textTracks[s];if(\\\"metadata\\\"===a.kind&&(\\\"15260DFFFF49443320FF49443320000F\\\"===a.inBandMetadataTrackDispatchType||\\\"com.apple.streaming\\\"===a.inBandMetadataTrackDispatchType||\\\"id3\\\"===a.label)){this.setInBandMetadataTextTrack(a);break}}this.media.textTracks.addEventListener(\\\"addtrack\\\",this.onID3AddtrackHandler)}this.media.addEventListener(\\\"seeking\\\",this.onSeekingHandler),this.media.addEventListener(\\\"seeked\\\",this.onSeekedHandler)}}},{key:\\\"setupSVG\\\",value:function(){this.media&&this.subtitleElement&&(this.svg.style.position=\\\"absolute\\\",this.svg.style.top=this.svg.style.left=\\\"0\\\",this.svg.style.pointerEvents=\\\"none\\\",this.svg.style.width=\\\"100%\\\",this.svg.style.height=\\\"100%\\\",this.subtitleElement.appendChild(this.svg))}},{key:\\\"cleanupTrack\\\",value:function(){var t,e,i,r,n,s;if(this.b24Track)if(null!==(s=this.rendererOption)&&void 0!==s&&s.useHighResTextTrack)this.b24Track.stopPolling();else if(this.b24Track.cues)for(var a=this.b24Track.cues.length-1;a>=0;a--)this.b24Track.removeCue(this.b24Track.cues[a]);null===(t=this.b24Track)||void 0===t||t.removeEventListener(\\\"cuechange\\\",this.onB24CueChangeHandler),null===(e=this.id3Track)||void 0===e||e.removeEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\\\"seeking\\\",this.onSeekingHandler),null===(r=this.media)||void 0===r||r.removeEventListener(\\\"seeked\\\",this.onSeekedHandler),null===(n=this.media)||void 0===n||n.textTracks.removeEventListener(\\\"addtrack\\\",this.onID3AddtrackHandler),this.b24Track=this.id3Track=null}},{key:\\\"cleanupSVG\\\",value:function(){for(;this.svg.firstChild;)this.svg.removeChild(this.svg.firstChild)}}])&&wt(t.prototype,e),Object.defineProperty(t,\\\"prototype\\\",{writable:!1}),t;var t,e}();function Ct(t){return Ct=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\\\"function\\\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\\\"symbol\\\":typeof t},Ct(t)}function Tt(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,r=Array(e);i<e;i++)r[i]=t[i];return r}function kt(t,e){for(var i=0;i<e.length;i++){var r=e[i];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(t,Ft(r.key),r)}}function Ft(t){var e=function(t){if(\\\"object\\\"!=Ct(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,\\\"string\\\");if(\\\"object\\\"!=Ct(i))return i;throw new TypeError(\\\"@@toPrimitive must return a primitive value.\\\")}return String(t)}(t);return\\\"symbol\\\"==Ct(e)?e:e+\\\"\\\"}var St=null,Rt=function(){function t(e,i){!function(t,e){if(!(t instanceof e))throw new TypeError(\\\"Cannot call a class as a function\\\")}(this,t),this.text=\\\"\\\",this.table=null,this.cells=null,this.GL=0,this.GR=2,this.G_BACK=[n.get(0),n.get(1),n.get(2),a.get(31)],this.DRCS_mapping=new Map([[15,new Map],[16,new Map],[17,new Map],[18,new Map],[19,new Map],[20,new Map],[21,new Map],[22,new Map],[23,new Map],[24,new Map],[25,new Map],[26,new Map],[27,new Map],[28,new Map],[29,new Map],[30,new Map]]),this.swf_x=1920,this.swf_y=1080,this.sdf_x=1920,this.sdf_y=1080,this.sdp_x=0,this.sdp_y=0,this.ssm_x=72,this.ssm_y=72,this.shs=8,this.svs=48,this.text_size_x=1,this.text_size_y=1,this.text_type=\\\"NSZ\\\",this.position_x=-1,this.position_y=-1,this.pallet=0,this.fg_color=h[this.pallet][7],this.bg_color=h[this.pallet][8],this.force_bg_color=null,this.hlc=0,this.prev_hlc=0,this.stl=!1,this.orn=null,this.force_orn=null,this.flc=15,this.non_spacing=\\\"\\\",this.timeElapsed=0,this.endTime=null,this.rendered=!1,this.PRA=null,this.normalFont=\\\"monospace\\\",this.gaijiFont=this.normalFont,this.drcsReplacement=!1,this.drcsReplaceMapping=new Map,this.usePUA=!1,this.pes=e,this.startTime=i}return e=t,r=[{key:\\\"setEmbeddedGlyph\\\",value:function(t){St=t}},{key:\\\"detect\\\",value:function(t,e){var i,r,n=null!==(i=null==e?void 0:e.data_identifier)&&void 0!==i?i:128,s=null!==(r=null==e?void 0:e.data_group_id)&&void 0!==r?r:1;if(t.length<=0)return!1;if(t[0]!==n)return!1;if(t.length<=2)return!1;var a=3+(15&t[2]);return!(t.length<=a||(15&(252&t[a+0])>>2)!==s||(y(t,a),0))}},{key:\\\"getRGBAColorCode\\\",value:function(t){if(null==t)return null;var e=document.createElement(\\\"canvas\\\");e.width=e.height=1;var i=e.getContext(\\\"2d\\\");if(!i)return null;i.fillStyle=t,i.fillRect(0,0,e.width,e.height);var r=function(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:\\\"undefined\\\"!=typeof Symbol&&t[Symbol.iterator]||t[\\\"@@iterator\\\"];if(null!=i){var r,n,s,a,o=[],h=!0,c=!1;try{if(s=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;h=!1}else for(;!(h=(r=s.call(i)).done)&&(o.push(r.value),o.length!==e);h=!0);}catch(t){c=!0,n=t}finally{try{if(!h&&null!=i.return&&(a=i.return(),Object(a)!==a))return}finally{if(c)throw n}}return o}}(t,e)||function(t,e){if(t){if(\\\"string\\\"==typeof t)return Tt(t,e);var i={}.toString.call(t).slice(8,-1);return\\\"Object\\\"===i&&t.constructor&&(i=t.constructor.name),\\\"Map\\\"===i||\\\"Set\\\"===i?Array.from(t):\\\"Arguments\\\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Tt(t,e):void 0}}(t,e)||function(){throw new TypeError(\\\"Invalid attempt to destructure non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\\\")}()}(i.getImageData(0,0,1,1).data,4),n=r[0],s=r[1],a=r[2],o=r[3],h=\\\"#\\\".concat(n.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(s.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(a.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(o.toString(16).toUpperCase().padStart(2,\\\"0\\\"));return e.width=e.height=0,h}},{key:\\\"fillAlphaColorCode\\\",value:function(t){if(null==t)return\\\"\\\";var e=Number.parseInt(t.substring(1,3),16),i=Number.parseInt(t.substring(3,5),16),r=Number.parseInt(t.substring(5,7),16);return\\\"#\\\".concat(e.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(i.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(r.toString(16).toUpperCase().padStart(2,\\\"0\\\"),\\\"FF\\\")}},{key:\\\"getRGBAfromColorCode\\\",value:function(t){if(null==t)return\\\"\\\";var e=Number.parseInt(t.substring(1,3),16),i=Number.parseInt(t.substring(3,5),16),r=Number.parseInt(t.substring(5,7),16),n=Number.parseInt(t.substring(7,9),16);return\\\"rgba(\\\".concat(e,\\\", \\\").concat(i,\\\", \\\").concat(r,\\\", \\\").concat(n/255,\\\")\\\")}}],(i=[{key:\\\"width\\\",value:function(){return Math.floor((this.shs+this.ssm_x)*this.text_size_x)}},{key:\\\"height\\\",value:function(){return Math.floor((this.svs+this.ssm_y)*this.text_size_y)}},{key:\\\"move_absolute_dot\\\",value:function(t,e){this.position_x=t,this.position_y=e}},{key:\\\"move_absolute_pos\\\",value:function(t,e){this.position_x=this.sdp_x+t*this.width(),this.position_y=this.sdp_y+(e+1)*this.height()}},{key:\\\"move_relative_pos\\\",value:function(t,e){for((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs));t<0;)this.position_x-=this.width(),t++,this.position_x<this.sdp_x&&(this.position_x=this.sdp_x+this.sdf_x-this.width(),e--);for(;t>0;)this.position_x+=this.width(),t--,this.position_x>=this.sdp_x+this.sdf_x&&(this.position_x=this.sdp_x,e++);for(;e<0;)this.position_y-=this.height(),e++;for(;e>0;)this.position_y+=this.height(),e--}},{key:\\\"move_newline\\\",value:function(){(this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),this.position_x=this.sdp_x,this.position_y=this.position_y+this.height()}},{key:\\\"render\\\",value:function(e){var i,r,n,s,a,o,h,c;this.table=null!==(i=null==e?void 0:e.table)&&void 0!==i?i:null,this.force_orn=null!==(r=\\\"boolean\\\"==typeof(null==e?void 0:e.forceStrokeColor)?null==e?void 0:e.forceStrokeColor:t.getRGBAColorCode(null==e?void 0:e.forceStrokeColor))&&void 0!==r?r:null,this.force_bg_color=null!==(n=t.getRGBAColorCode(null==e?void 0:e.forceBackgroundColor))&&void 0!==n?n:null,this.normalFont=null!==(s=null==e?void 0:e.normalFont)&&void 0!==s?s:this.normalFont,this.gaijiFont=null!==(a=null==e?void 0:e.gaijiFont)&&void 0!==a?a:this.normalFont,this.drcsReplacement=null!==(o=null==e?void 0:e.drcsReplacement)&&void 0!==o&&o,this.drcsReplaceMapping=new Map(v);for(var u,l=Object.entries(null!==(u=null==e?void 0:e.drcsReplaceMapping)&&void 0!==u?u:{}),f=0;f<l.length;f++){var d=l[f];this.drcsReplaceMapping.set(d[0],d[1])}if(this.usePUA=null!==(h=null==e?void 0:e.usePUA)&&void 0!==h&&h,!t.detect(this.pes,e))return null;if(this.table)for(;this.table.firstChild;)this.table.removeChild(this.table.firstChild);for(var p=3+(15&this.pes[2]),b=(this.pes[p+0],(this.pes[p+3]<<8)+this.pes[p+4]),g=p+9;g<p+(5+b);){this.pes[g+0];var y=this.pes[g+1],m=this.pes[g+2]<<16|this.pes[g+3]<<8|this.pes[g+4];32===y?this.parseText(g+5,g+5+m):48==y?this.parseDRCS(1,g+5,g+5+m):49==y&&this.parseDRCS(2,g+5,g+5+m),g+=5+m}return{startTime:this.startTime,endTime:null!==(c=this.endTime)&&void 0!==c?c:Number.POSITIVE_INFINITY,rendered:this.rendered,textContent:this.rendered?this.text:null,PRA:this.PRA}}},{key:\\\"parseText\\\",value:function(t,e){for(;t<e;)if(32<this.pes[t]&&this.pes[t]<127){var i=0,r=this.G_BACK[this.GL];if(!r)return;for(var a=0;a<r.bytes;a++)i<<=8,i|=127&this.pes[t+a];this.renderCharacter(i,r),t+=r.bytes}else if(160<this.pes[t]&&this.pes[t]<255){var c=0,u=this.G_BACK[this.GR];if(!u)return;for(var l=0;l<u.bytes;l++)c<<=8,c|=127&this.pes[t+l];this.renderCharacter(c,u),t+=u.bytes}else if(0===this.pes[t])t+=1;else if(7===this.pes[t])t+=1;else if(8===this.pes[t])this.move_relative_pos(-1,0),t+=1;else if(9===this.pes[t])this.move_relative_pos(1,0),t+=1;else if(10===this.pes[t])this.move_relative_pos(0,1),t+=1;else if(11===this.pes[t])this.move_relative_pos(0,-1),t+=1;else if(12===this.pes[t])null!=this.startTime&&this.timeElapsed>0&&(this.endTime=this.startTime+this.timeElapsed),t+=1;else if(13===this.pes[t])this.move_newline(),t+=1;else if(14===this.pes[t])this.GL=1,t+=1;else if(15===this.pes[t])this.GL=0,t+=1;else if(22===this.pes[t]){var f=63&this.pes[t+1];this.move_relative_pos(f,0),t+=2}else if(24===this.pes[t])t+=1;else if(25===this.pes[t]){var d=0,p=this.G_BACK[2];if(!p)return;for(var v=0;v<p.bytes;v++)d<<=8,d|=127&this.pes[t+1+v];this.renderCharacter(d,p),t+=1+p.bytes}else if(27===this.pes[t])if(110===this.pes[t+1])this.GL=2,t+=2;else if(111==this.pes[t+1])this.GL=3,t+=2;else if(126==this.pes[t+1])this.GR=1,t+=2;else if(125==this.pes[t+1])this.GR=2,t+=2;else if(124==this.pes[t+1])this.GR=3,t+=2;else if(40<=this.pes[t+1]&&this.pes[t+1]<=43){var b=this.pes[t+1]-40;32===this.pes[t+2]?(this.G_BACK[b]=o.get(this.pes[t+3]),t+=4):(this.G_BACK[b]=s.get(this.pes[t+2]),t+=3)}else{if(36!==this.pes[t+1])return;if(40<=this.pes[t+2]&&this.pes[t+2]<=43){var g=this.pes[t+2]-40;32===this.pes[t+3]?(this.G_BACK[g]=o.get(this.pes[t+4]),t+=5):(this.G_BACK[g]=s.get(this.pes[t+3]),t+=4)}else this.G_BACK[0]=s.get(this.pes[t+2]),t+=3}else if(28===this.pes[t]){var y=63&this.pes[t+1],m=63&this.pes[t+2];this.move_absolute_pos(m,y),t+=3}else if(29===this.pes[t]){var _=0,w=this.G_BACK[3];if(!w)return;for(var x=0;x<w.bytes;x++)_<<=8,_|=127&this.pes[t+1+x];this.renderCharacter(_,w),t+=1+w.bytes}else if(30===this.pes[t])t+=1;else if(31===this.pes[t])t+=1;else if(32===this.pes[t]){var A=n.get(0);if(!A)return;this.renderCharacter(8481,A),t+=1}else if(127===this.pes[t])t+=1;else if(128===this.pes[t])this.fg_color=h[this.pallet][0],t+=1;else if(129===this.pes[t])this.fg_color=h[this.pallet][1],t+=1;else if(130===this.pes[t])this.fg_color=h[this.pallet][2],t+=1;else if(131===this.pes[t])this.fg_color=h[this.pallet][3],t+=1;else if(132===this.pes[t])this.fg_color=h[this.pallet][4],t+=1;else if(133===this.pes[t])this.fg_color=h[this.pallet][5],t+=1;else if(134===this.pes[t])this.fg_color=h[this.pallet][6],t+=1;else if(135===this.pes[t])this.fg_color=h[this.pallet][7],t+=1;else if(136===this.pes[t])this.text_size_x=.5,this.text_size_y=.5,this.text_type=\\\"SSZ\\\",t+=1;else if(137===this.pes[t])this.text_size_x=.5,this.text_size_y=1,this.text_type=\\\"MSZ\\\",t+=1;else if(138===this.pes[t])this.text_size_x=1,this.text_size_y=1,this.text_type=\\\"NSZ\\\",t+=1;else{if(139===this.pes[t])return;if(144===this.pes[t]){var C=this.pes[t+1];if(32==C){var T=15&this.pes[t+2];this.pallet=T,t+=3}else{var k=15&C;64==(112&C)?this.fg_color=h[this.pallet][k]:80==(112&C)&&(this.bg_color=h[this.pallet][k]),t+=2}}else if(145===this.pes[t]){var F=15&this.pes[t];this.flc=F,t+=2}else{if(146===this.pes[t])return;if(147===this.pes[t])return;if(148===this.pes[t])return;if(149===this.pes[t])return;if(151===this.pes[t])this.prev_hlc=this.hlc,this.hlc=15&this.pes[t+1],t+=2;else{if(152===this.pes[t])return;if(153===this.pes[t])this.stl=!1,t+=1;else if(154===this.pes[t])this.stl=!0,t+=1;else if(155===this.pes[t]){for(var S=t+1;66!==this.pes[S];){if(83===this.pes[S]){for(var R=t+1,I=0;59!=this.pes[R]&&32!=this.pes[R];)I*=10,I+=15&this.pes[R],R++;if(32!==this.pes[R])return;if(5===I)this.swf_x=3840,this.swf_y=2160;else if(7===I)this.swf_x=1920,this.swf_y=1080;else{if(9!=I)return;this.swf_x=1440,this.swf_y=960}break}if(84===this.pes[S])break;if(86===this.pes[S]){for(var E=t+1,O=0,M=0;59!=this.pes[E];)O*=10,O+=15&this.pes[E],E++;for(E++;32!=this.pes[E];)M*=10,M+=15&this.pes[E],E++;this.sdf_x=2*O,this.sdf_y=2*M;break}if(87===this.pes[S]){for(var G=t+1,B=0,P=0;59!=this.pes[G];)B*=10,B+=15&this.pes[G],G++;for(G++;32!=this.pes[G];)P*=10,P+=15&this.pes[G],G++;this.ssm_x=2*B,this.ssm_y=2*P;break}if(88===this.pes[S]){for(var D=t+1,j=0;32!=this.pes[D];)j*=10,j+=15&this.pes[D],D++;this.shs=2*j;break}if(89===this.pes[S]){for(var L=t+1,N=0;32!=this.pes[L];)N*=10,N+=15&this.pes[L],L++;this.svs=2*N;break}if(91===this.pes[S])break;if(92===this.pes[S])break;if(93===this.pes[S])break;if(94===this.pes[S])break;if(95===this.pes[S]){for(var U=t+1,z=0,H=0;59!=this.pes[U];)z*=10,z+=15&this.pes[U],U++;for(U++;32!=this.pes[U];)H*=10,H+=15&this.pes[U],U++;this.sdp_x=2*z,this.sdp_y=2*H;break}if(97===this.pes[S]){for(var X=t+1,K=0,V=0;59!=this.pes[X];)K*=10,K+=15&this.pes[X],X++;for(X++;32!=this.pes[X];)V*=10,V+=15&this.pes[X],X++;this.move_absolute_dot(2*K,2*V);break}if(98===this.pes[S])break;if(99===this.pes[S]){var $=this.pes[t+1];if(48==$)this.orn=null;else if(49==$){var W=10*(15&this.pes[t+3])+(15&this.pes[t+4]),Y=10*(15&this.pes[t+5])+(15&this.pes[t+6]);this.orn=h[W][Y]}break}if(100===this.pes[S])break;if(101===this.pes[S])break;if(102===this.pes[S])break;if(103===this.pes[S])break;if(104===this.pes[S]){for(var J=t+1,Z=0;32!=this.pes[J];)Z*=10,Z+=15&this.pes[J],J++;this.PRA=Z;break}if(105===this.pes[S])break;if(106===this.pes[S])break;if(110===this.pes[S])break;if(111===this.pes[S])break;S+=1}t=S+1}else{if(157!==this.pes[t])return;if(32!=this.pes[t+1])return void this.pes[t+1];var q=63&this.pes[t+2];this.timeElapsed+=q/10,t+=3}}}}}},{key:\\\"parseDRCS\\\",value:function(t,e,i){for(this.pes[e+0],e+=1;e<i;){var r=this.pes[e+0]<<8|this.pes[e+1],n=this.pes[e+2];e+=3;for(var s=0;s<n;s++){this.pes[e+0];var a=15&this.pes[e+0];if(0===a||1===a){var h=this.pes[e+1]+2,c=this.pes[e+2],u=this.pes[e+3],l=h.toString(2).length-h.toString(2).replace(/0*$/,\\\"\\\").length,f=Math.floor(c*u*l/8),d=new Uint8Array(Array.prototype.slice.call(this.pes,e+4,e+4+f));if(1===t){var p,v,b=64+((3840&r)>>8),g=127&r,y=null===(p=o.get(b))||void 0===p?void 0:p.alphabet;y&&(null===(v=this.DRCS_mapping.get(y))||void 0===v||v.set(g,d))}else{var m,_=32639&r;null===(m=this.DRCS_mapping.get(15))||void 0===m||m.set(_,d)}e+=4+f}}}}},{key:\\\"renderCharacter\\\",value:function(e,i){if((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),0===i.alphabet){var r=((65280&e)>>8)-33,s=(255&e)-33;if(0===r&&12<=s&&s<=17)return void(this.non_spacing=[\\\"́\\\",\\\"̀\\\",\\\"̈\\\",\\\"̂\\\",\\\"̅\\\",\\\"̲\\\"][s-12]);if(1===r&&93===s)return void(this.non_spacing+=\\\"⃝\\\")}if(null!==this.table){if(null===this.cells){this.table.parentElement&&(this.table.parentElement.style.position=\\\"absolute\\\",this.table.parentElement.style.width=\\\"\\\".concat(this.swf_x,\\\"px\\\"),this.table.parentElement.style.height=\\\"\\\".concat(this.swf_y,\\\"px\\\")),this.table.style.willChange=\\\"transform\\\",this.table.style.position=\\\"absolute\\\",this.table.style.left=\\\"\\\".concat(this.sdp_x,\\\"px\\\"),this.table.style.top=\\\"\\\".concat(this.sdp_y,\\\"px\\\"),this.table.style.width=\\\"\\\".concat(this.sdf_x,\\\"px\\\"),this.table.style.height=\\\"\\\".concat(this.sdf_y,\\\"px\\\"),this.table.style.boxSizing=\\\"border-box\\\",this.table.style.border=\\\"none\\\",this.table.style.borderCollapse=\\\"collapse\\\";for(var o=[],h=0,v=0;h<this.sdf_y;h+=Math.floor((this.ssm_y+this.svs)/2),v+=1){var b=document.createElement(\\\"tr\\\");o.push([]),b.style.position=\\\"relative\\\",b.style.height=\\\"\\\".concat(Math.floor((this.ssm_y+this.svs)/2),\\\"px\\\"),b.style.width=\\\"100%\\\",b.style.boxSizing=\\\"border-box\\\",b.style.border=\\\"none\\\";for(var g=0;g<this.sdf_x;g+=Math.floor((this.ssm_x+this.shs)/2)){var y=document.createElement(\\\"td\\\");y.style.height=\\\"\\\".concat(Math.floor((this.ssm_y+this.svs)/2),\\\"px\\\"),y.style.width=\\\"\\\".concat(Math.floor((this.ssm_x+this.shs)/2),\\\"px\\\"),y.style.padding=\\\"0px\\\",y.style.boxSizing=\\\"border-box\\\",y.style.border=\\\"none\\\",b.appendChild(y),o[v].push(y)}this.table.appendChild(b)}this.cells=o}if(31!==i.alphabet&&(this.rendered=!0),0===i.alphabet){var m=94*(((65280&e)>>8)-33)+((255&e)-33),_=7896;if(m<_){var w=c[m];this.renderFont(w)}else if(this.usePUA){var x=u[m-_];this.renderFont(x)}else{var A=l[m-_];this.renderFont(A)}this.move_relative_pos(1,0)}else if(1===i.alphabet){var C=f[e-33];this.renderFont(C),this.move_relative_pos(1,0)}else if(2===i.alphabet){var k=d[e-33];this.renderFont(k),this.move_relative_pos(1,0)}else if(3===i.alphabet){var F=p[e-33];this.renderFont(F),this.move_relative_pos(1,0)}else{if(31===i.alphabet)return void(96===e?(this.G_BACK=[n.get(0),n.get(1),n.get(2),a.get(31)],this.GL=0,this.GR=2):97===e?(this.G_BACK=[n.get(0),n.get(3),n.get(2),a.get(31)],this.GL=0,this.GR=2):98===e?(this.G_BACK=[n.get(0),a.get(16),n.get(2),a.get(31)],this.GL=0,this.GR=2):99===e?(this.G_BACK=[n.get(4),n.get(6),n.get(7),a.get(31)],this.GL=0,this.GR=2):100===e?(this.G_BACK=[n.get(4),n.get(5),n.get(7),a.get(31)],this.GL=0,this.GR=2):101===e?(this.G_BACK=[n.get(4),a.get(16),n.get(7),a.get(31)],this.GL=0,this.GR=2):102===e?(this.G_BACK=[a.get(16),a.get(17),a.get(18),a.get(31)],this.GL=0,this.GR=2):103===e?(this.G_BACK=[a.get(19),a.get(20),a.get(21),a.get(31)],this.GL=0,this.GR=2):104===e?(this.G_BACK=[a.get(22),a.get(23),a.get(24),a.get(31)],this.GL=0,this.GR=2):105===e?(this.G_BACK=[a.get(25),a.get(26),a.get(27),a.get(31)],this.GL=0,this.GR=2):106===e?(this.G_BACK=[a.get(28),a.get(29),a.get(30),a.get(31)],this.GL=0,this.GR=2):107===e?(this.G_BACK=[n.get(0),a.get(17),n.get(2),a.get(31)],this.GL=0,this.GR=2):108===e?(this.G_BACK=[n.get(0),a.get(18),n.get(2),a.get(31)],this.GL=0,this.GR=2):109===e?(this.G_BACK=[n.get(0),a.get(19),n.get(2),a.get(31)],this.GL=0,this.GR=2):110===e?(this.G_BACK=[n.get(3),n.get(2),n.get(1),a.get(31)],this.GL=0,this.GR=2):111===e&&(this.G_BACK=[n.get(1),n.get(4),a.get(16),a.get(31)],this.GL=0,this.GR=2));var S,R=null===(S=this.DRCS_mapping.get(i.alphabet))||void 0===S?void 0:S.get(32639&e);if(!R)return;var I=T(R.buffer);if(this.drcsReplacement&&this.drcsReplaceMapping.has(I.toLowerCase()))this.renderFont(this.drcsReplaceMapping.get(I.toLowerCase()));else if(this.drcsReplacement&&this.drcsReplaceMapping.has(I.toUpperCase()))this.renderFont(this.drcsReplaceMapping.get(I.toUpperCase()));else{var E=document.createElement(\\\"canvas\\\"),O=Math.floor(this.ssm_x/2),M=Math.floor(this.ssm_y/2),G=Math.floor(8*R.length/(O*M));E.width=O+4/this.text_size_x,E.height=M+4/this.text_size_y,E.style.width=\\\"\\\".concat(this.ssm_x+4/this.text_size_x*2,\\\"px\\\"),E.style.height=\\\"\\\".concat(this.ssm_y+4/this.text_size_y*2,\\\"px\\\");var B=E.getContext(\\\"2d\\\");if(!B)return;var P=this.getOrnColorCode();if(P&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color)){B.fillStyle=t.getRGBAfromColorCode(P);for(var D=-2/this.text_size_y;D<=2/this.text_size_y;D++)for(var j=-2/this.text_size_x;j<=2/this.text_size_x;j++)for(var L=0;L<M;L++)for(var N=0;N<O;N++){for(var U=0,z=0;z<G;z++){var H=7-((L*O+N)*G+z)%8;U*=2,U+=(R[Math.floor(((L*O+N)*G+z)/8)]&1<<H)>>H}U>0&&B.fillRect(2/this.text_size_x+N+j,2/this.text_size_y+L+D,1,1)}}B.fillStyle=t.getRGBAfromColorCode(this.fg_color);for(var X=0;X<M;X++)for(var K=0;K<O;K++){for(var V=0,$=0;$<G;$++){var W=7-((X*O+K)*G+$)%8;V*=2,V+=(R[Math.floor(((X*O+K)*G+$)/8)]&1<<W)>>W}V>0&&B.fillRect(2/this.text_size_x+K,2/this.text_size_y+X,1,1)}for(var Y=Math.floor(2*this.text_size_x),J=Math.floor(2*this.text_size_y),Z=Math.round((this.position_x-this.sdp_x)/(this.ssm_x+this.shs)*2),q=Math.round((this.position_y-this.height()-this.sdp_y)/(this.ssm_y+this.svs)*2),Q=0;Q<J;Q++)for(var tt=0;tt<Y;tt++){var et=this.cells[q+Q][Z+tt];if(0===Q&&0===tt){var it;et.setAttribute(\\\"rowspan\\\",\\\"\\\".concat(J)),et.setAttribute(\\\"colspan\\\",\\\"\\\".concat(Y)),et.style.textAlign=\\\"center\\\",et.style.verticalAlign=\\\"top\\\";var rt=document.createElement(\\\"div\\\");rt.appendChild(E),rt.style.display=\\\"flex\\\",rt.style.alignItems=\\\"center\\\",rt.style.justifyContent=\\\"middle\\\",rt.style.width=\\\"\\\".concat(this.ssm_x+this.shs,\\\"px\\\"),rt.style.height=\\\"\\\".concat(this.ssm_y+this.svs,\\\"px\\\"),rt.style.lineHeight=\\\"\\\".concat(this.height(),\\\"px\\\"),rt.style.fontSize=\\\"\\\".concat(this.ssm_x,\\\"px\\\"),rt.style.transform=\\\"scale(\\\".concat(this.text_size_x,\\\", \\\").concat(this.text_size_y,\\\")\\\"),rt.style.transformOrigin=\\\"0 0\\\",rt.style.marginRight=\\\"-\\\".concat(this.ssm_x+this.shs-this.width(),\\\"px\\\"),rt.style.marginBottom=\\\"-\\\".concat(this.ssm_y+this.svs-this.height(),\\\"px\\\"),rt.style.color=t.getRGBAfromColorCode(this.fg_color),1&this.hlc&&(et.style.borderBottom=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),2&this.hlc&&(et.style.borderRight=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),4&this.hlc&&(et.style.borderTop=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),8&this.hlc&&(et.style.borderLeft=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),this.stl&&(et.style.borderBottom=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),et.style.backgroundColor=t.getRGBAfromColorCode(null!==(it=this.force_bg_color)&&void 0!==it?it:this.bg_color),et.appendChild(rt)}else null!=et.parentNode&&et.parentNode.removeChild(et)}}this.move_relative_pos(1,0)}}}},{key:\\\"renderFont\\\",value:function(e){var i;if(e+=this.non_spacing,this.non_spacing=\\\"\\\",.5===this.text_size_x&&.5===this.text_size_y&&(d.includes(e)||p.includes(e))||(this.text+=e),null!==this.cells){var r=b.has(e),n=r?this.gaijiFont:this.normalFont;if(null!=St&&null!==(i=St)&&void 0!==i&&i.has(e)){var s=St.get(e),a=s.viewBox,o=s.path;this.renderPath(a,o)}else{r&&(e+=\\\"︎\\\");for(var h=Math.floor(2*this.text_size_x),c=Math.floor(2*this.text_size_y),u=Math.round((this.position_x-this.sdp_x)/(this.ssm_x+this.shs)*2),l=Math.round((this.position_y-this.height()-this.sdp_y)/(this.ssm_y+this.svs)*2),f=0;f<c;f++)for(var v=0;v<h;v++){var g=this.cells[l+f][u+v];if(0===f&&0===v){var y;g.setAttribute(\\\"rowspan\\\",\\\"\\\".concat(c)),g.setAttribute(\\\"colspan\\\",\\\"\\\".concat(h)),g.style.textAlign=\\\"center\\\",g.style.verticalAlign=\\\"top\\\";var m=document.createElement(\\\"div\\\");m.textContent=e,m.style.display=\\\"flex\\\",m.style.alignItems=\\\"center\\\",m.style.justifyContent=\\\"middle\\\",m.style.width=\\\"\\\".concat(this.ssm_x+this.shs,\\\"px\\\"),m.style.height=\\\"\\\".concat(this.ssm_y+this.svs,\\\"px\\\"),m.style.fontFamily=\\\"\\\".concat(n),m.style.lineHeight=\\\"\\\".concat(this.height(),\\\"px\\\"),m.style.fontSize=\\\"\\\".concat(this.ssm_x,\\\"px\\\"),m.style.transform=\\\"scale(\\\".concat(this.text_size_x,\\\", \\\").concat(this.text_size_y,\\\")\\\"),m.style.transformOrigin=\\\"0 0\\\",m.style.marginRight=\\\"-\\\".concat(this.ssm_x+this.shs-this.width(),\\\"px\\\"),m.style.marginBottom=\\\"-\\\".concat(this.ssm_y+this.svs-this.height(),\\\"px\\\"),m.style.color=t.getRGBAfromColorCode(this.fg_color);var _=this.getOrnColorCode();if(_&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color)){for(var w=\\\"\\\",x=!0,A=-4;A<=4;A++)for(var C=-4;C<=4;C++)0===A&&0===C||(w+=\\\"\\\".concat(x?\\\"\\\":\\\",\\\").concat(C,\\\"px \\\").concat(A,\\\"px 0 \\\").concat(t.getRGBAfromColorCode(_)),x=!1);m.style.textShadow=w}1&this.hlc&&(g.style.borderBottom=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),2&this.hlc&&(g.style.borderRight=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),4&this.hlc&&(g.style.borderTop=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),8&this.hlc&&(g.style.borderLeft=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),this.stl&&(g.style.borderBottom=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),g.style.backgroundColor=t.getRGBAfromColorCode(null!==(y=this.force_bg_color)&&void 0!==y?y:this.bg_color),g.appendChild(m)}else null!=g.parentNode&&g.parentNode.removeChild(g)}}}}},{key:\\\"renderPath\\\",value:function(e,i){if(null!==this.cells){var r=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"svg\\\");r.setAttribute(\\\"viewBox\\\",\\\"\\\".concat(e[0],\\\" \\\").concat(e[1],\\\" \\\").concat(e[2],\\\" \\\").concat(e[3])),r.style.width=\\\"\\\".concat(this.ssm_x+this.shs,\\\"px\\\"),r.style.height=\\\"\\\".concat(this.ssm_y,\\\"px\\\");var n=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"path\\\");n.setAttribute(\\\"d\\\",i),n.setAttribute(\\\"fill\\\",\\\"\\\".concat(t.getRGBAfromColorCode(this.fg_color)));var s=this.getOrnColorCode();if(!s||this.force_orn&&!0!==this.force_orn&&this.force_orn===this.fg_color)n.setAttribute(\\\"stroke\\\",\\\"transparent\\\");else{var a=4*Math.max((e[2]-e[0])/this.ssm_x,(e[3]-e[1])/this.ssm_y);n.setAttribute(\\\"stroke\\\",\\\"\\\".concat(t.getRGBAfromColorCode(s))),n.setAttribute(\\\"stroke-width\\\",\\\"\\\".concat(a))}r.appendChild(n);for(var o=Math.floor(2*this.text_size_x),h=Math.floor(2*this.text_size_y),c=Math.round((this.position_x-this.sdp_x)/(this.ssm_x+this.shs)*2),u=Math.round((this.position_y-this.height()-this.sdp_y)/(this.ssm_y+this.svs)*2),l=0;l<h;l++)for(var f=0;f<o;f++){var d=this.cells[u+l][c+f];if(0===l&&0===f){var p;d.setAttribute(\\\"rowspan\\\",\\\"\\\".concat(h)),d.setAttribute(\\\"colspan\\\",\\\"\\\".concat(o)),d.style.textAlign=\\\"center\\\",d.style.verticalAlign=\\\"top\\\";var v=document.createElement(\\\"div\\\");v.appendChild(r),v.style.display=\\\"flex\\\",v.style.alignItems=\\\"center\\\",v.style.justifyContent=\\\"middle\\\",v.style.width=\\\"\\\".concat(this.ssm_x+this.shs,\\\"px\\\"),v.style.height=\\\"\\\".concat(this.ssm_y+this.svs,\\\"px\\\"),v.style.lineHeight=\\\"\\\".concat(this.height(),\\\"px\\\"),v.style.fontSize=\\\"\\\".concat(this.ssm_x,\\\"px\\\"),v.style.transform=\\\"scale(\\\".concat(this.text_size_x,\\\", \\\").concat(this.text_size_y,\\\")\\\"),v.style.transformOrigin=\\\"0 0\\\",v.style.marginRight=\\\"-\\\".concat(this.ssm_x+this.shs-this.width(),\\\"px\\\"),v.style.marginBottom=\\\"-\\\".concat(this.ssm_y+this.svs-this.height(),\\\"px\\\"),v.style.color=t.getRGBAfromColorCode(this.fg_color),1&this.hlc&&(d.style.borderBottom=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),2&this.hlc&&(d.style.borderRight=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),4&this.hlc&&(d.style.borderTop=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),8&this.hlc&&(d.style.borderLeft=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),this.stl&&(d.style.borderBottom=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),d.style.backgroundColor=t.getRGBAfromColorCode(null!==(p=this.force_bg_color)&&void 0!==p?p:this.bg_color),d.appendChild(v)}else null!=d.parentNode&&d.parentNode.removeChild(d)}}}},{key:\\\"getOrnColorCode\\\",value:function(){return!0===this.force_orn?t.fillAlphaColorCode(this.bg_color):!1===this.force_orn?this.orn:null!==(e=this.force_orn)&&void 0!==e?e:this.orn;var e}}])&&kt(e.prototype,i),r&&kt(e,r),Object.defineProperty(e,\\\"prototype\\\",{writable:!1}),e;var e,i,r}();function It(t){return It=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\\\"function\\\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\\\"symbol\\\":typeof t},It(t)}function Et(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,r)}return i}function Ot(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?Et(Object(i),!0).forEach((function(e){Mt(t,e,i[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):Et(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}function Mt(t,e,i){return(e=Bt(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function Gt(t,e){for(var i=0;i<e.length;i++){var r=e[i];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(t,Bt(r.key),r)}}function Bt(t){var e=function(t){if(\\\"object\\\"!=It(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,\\\"string\\\");if(\\\"object\\\"!=It(i))return i;throw new TypeError(\\\"@@toPrimitive must return a primitive value.\\\")}return String(t)}(t);return\\\"symbol\\\"==It(e)?e:e+\\\"\\\"}var Pt=function(){return t=function t(e){var i,r,n,s,a;!function(t,e){if(!(t instanceof e))throw new TypeError(\\\"Cannot call a class as a function\\\")}(this,t),this.media=null,this.id3Track=null,this.b24Track=null,this.subtitleElement=null,this.table=null,this.textContent=null,this.wrapper=null,this.resizeObserver=null,this.mutationObserver=null,this.prevCurrentTime=null,this.highResTimeupdatePollingId=null,this.isShowing=!0,this.isOnSeeking=!1,this.onB24CueChangeDrawed=!1,this.onID3AddtrackHandler=this.onID3Addtrack.bind(this),this.onID3CueChangeHandler=this.onID3CueChange.bind(this),this.onB24CueChangeHandler=this.onB24CueChange.bind(this),this.onHighResTimeupdateHandler=this.onHighResTimeupdate.bind(this),this.onTimeupdateHandler=this.onTimeupdate.bind(this),this.onCanplayHandler=this.onCanplay.bind(this),this.onPlayHandler=this.onPlay.bind(this),this.onPauseHandler=this.onPause.bind(this),this.onSeekingHandler=this.onSeeking.bind(this),this.onSeekedHandler=this.onSeeked.bind(this),this.onResizeHandler=this.onResize.bind(this),this.data_identifier=null!==(i=null==e?void 0:e.data_identifier)&&void 0!==i?i:128,this.data_group_id=null!==(r=null==e?void 0:e.data_group_id)&&void 0!==r?r:1,this.rendererOption=Ot(Ot({},e),{},{data_identifier:this.data_identifier,data_group_id:this.data_group_id,keepAspectRatio:null===(n=null==e?void 0:e.keepAspectRatio)||void 0===n||n,enableAutoInBandMetadataTextTrackDetection:null===(s=null==e?void 0:e.enableAutoInBandMetadataTextTrackDetection)||void 0===s||s,useStroke:null===(a=null==e?void 0:e.useStroke)||void 0===a||a})},(e=[{key:\\\"attachMedia\\\",value:function(t,e){var i;this.detachMedia(),this.media=t,this.subtitleElement=null!=e?e:t.parentElement,this.media.addEventListener(\\\"canplay\\\",this.onCanplayHandler),null!==(i=this.rendererOption)&&void 0!==i&&i.useHighResTimeupdate?(this.media.addEventListener(\\\"play\\\",this.onPlayHandler),this.media.addEventListener(\\\"pause\\\",this.onPauseHandler)):this.media.addEventListener(\\\"timeupdate\\\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.setupTrack(),this.setupTable()}},{key:\\\"detachMedia\\\",value:function(){var t,e,i,r;this.cleanupTable(),this.cleanupTrack(),null===(t=this.media)||void 0===t||t.removeEventListener(\\\"canplay\\\",this.onCanplayHandler),null===(e=this.media)||void 0===e||e.removeEventListener(\\\"play\\\",this.onPlayHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\\\"pause\\\",this.onPauseHandler),this.onPause(),null===(r=this.media)||void 0===r||r.removeEventListener(\\\"timeupdate\\\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.media=this.subtitleElement=null}},{key:\\\"dispose\\\",value:function(){this.detachMedia()}},{key:\\\"getTextContent\\\",value:function(){return this.textContent}},{key:\\\"refresh\\\",value:function(){this.onResize()}},{key:\\\"show\\\",value:function(){this.isShowing=!0,this.table&&(this.table.style.visibility=\\\"visible\\\")}},{key:\\\"hide\\\",value:function(){this.isShowing=!1,this.table&&(this.table.style.visibility=\\\"hidden\\\")}},{key:\\\"isPresent\\\",value:function(){return this.onB24CueChangeDrawed}},{key:\\\"pushRawData\\\",value:function(t,e){var i=new Rt(e,t).render(this.rendererOption);if(null==i)return!1;var r=Number.isFinite(i.endTime)?i.endTime:Number.MAX_SAFE_INTEGER;return this.addB24Cue(t,r,e)}},{key:\\\"pushBase64Data\\\",value:function(t,e){var i=tt(e);return this.pushRawData(t,i)}},{key:\\\"pushData\\\",value:function(t,e,i){return this.pushRawData(i,e)}},{key:\\\"pushID3v2PRIVData\\\",value:function(t,e,i){return\\\"aribb24.js\\\"===e&&this.pushRawData(t,i)}},{key:\\\"pushID3v2TXXXData\\\",value:function(t,e,i){return\\\"aribb24.js\\\"===e&&this.pushBase64Data(t,i)}},{key:\\\"pushID3v2Data\\\",value:function(t,e){for(var i=!1,r=0;r<e.length;){var n=r;if(r+3>e.length)break;if(73!==e[r+0]||68!==e[r+1]||51!==e[r+2]){if(0===r){r+=5;continue}break}if((r+=6)+4>e.length)break;var s=J(e,r+0,r+4);r+=4;var a=n+3+2+1+4+s;if(a>e.length)break;for(var o=r;o<a;){var h=o;if(o+4>e.length)break;var c=Q(e,o+0,o+4);if((o+=4)+4>e.length)break;var u=J(e,o+0,o+4);o+=6;var l=h+4+4+2+u;if(l>e.length)break;if(\\\"PRIV\\\"===c){for(var f=o,d=l;0!==e[o]&&o<l;)o++;var p=Q(e,f,o),v=new Uint8Array(Array.prototype.slice.call(e,o+1,d));this.pushID3v2PRIVData(t,p,v)&&(i=!0)}else if(\\\"TXXX\\\"===c){var b=e[o+0],g=o+1;if(3===b){for(;0!==e[o]&&o<l;)o++;for(var y=o,m=o+=1;0!==e[o]&&o<l;)o++;var _=o,w=q(e,g,y),x=q(e,m,_);this.pushID3v2TXXXData(t,w,x)&&(i=!0)}else if(0===b){for(;0!==e[o]&&o<l;)o++;for(var A=o,C=o+=1;0!==e[o]&&o<l;)o++;var T=o,k=Q(e,g,A),F=Q(e,C,T);this.pushID3v2TXXXData(t,k,F)&&(i=!0)}}o=l}(r=n+3+2+1+4+s)+3>e.length||51===e[r+0]&&68===e[r+1]&&73===e[r+2]&&(r+=10)}return i}},{key:\\\"setInBandMetadataTextTrack\\\",value:function(t){var e;null===(e=this.id3Track)||void 0===e||e.removeEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler),this.id3Track=t,this.id3Track.mode=\\\"hidden\\\",this.id3Track.addEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler)}},{key:\\\"pushID3v2Cue\\\",value:function(t){if(!this.id3Track)return!1;var e=t.startTime,i=t;if(\\\"15260DFFFF49443320FF49443320000F\\\"===this.id3Track.inBandMetadataTrackDispatchType)return this.pushID3v2Data(e,new Uint8Array(i.data));if(\\\"com.apple.streaming\\\"===this.id3Track.inBandMetadataTrackDispatchType){if(\\\"PRIV\\\"===i.value.key)return this.pushID3v2PRIVData(e,i.value.info,new Uint8Array(i.value.data));if(\\\"TXXX\\\"===i.value.key)return this.pushID3v2TXXXData(e,i.value.info,i.value.data)}else if(\\\"id3\\\"===this.id3Track.label){if(\\\"PRIV\\\"===i.value.key)return this.pushID3v2PRIVData(e,i.value.info,new Uint8Array(i.value.data));if(\\\"TXXX\\\"===i.value.key)return this.pushID3v2TXXXData(e,i.value.info,i.value.data)}else if(\\\"Timed Metadata\\\"===this.id3Track.label){if(\\\"PRIV\\\"===i.frame.key)return this.pushID3v2PRIVData(e,i.frame.owner,new Uint8Array(i.frame.data));if(\\\"TXXX\\\"===i.frame.key)return this.pushID3v2TXXXData(e,i.frame.description,i.frame.data)}return!1}},{key:\\\"onID3CueChange\\\",value:function(){this.id3Track&&(this.isOnSeeking||this.onTimeupdate())}},{key:\\\"addB24Cue\\\",value:function(t,e,i){var r;if(!this.b24Track)return!1;if(!Rt.detect(i,this.rendererOption))return!1;var n=new(null!==(r=window.VTTCue)&&void 0!==r?r:window.TextTrackCue)(t,e,\\\"\\\");if(n.data=i,window.VTTCue)this.b24Track.addCue(n);else if(window.TextTrackCue){var s;if(Array.prototype.some.call(null!==(s=this.b24Track.cues)&&void 0!==s?s:[],(function(e){return e.startTime===t})))return!1;if(this.b24Track.cues){for(var a=[],o=this.b24Track.cues.length-1;o>=0;o--)this.b24Track.cues[o].startTime>=t&&(a.push(this.b24Track.cues[o]),this.b24Track.removeCue(this.b24Track.cues[o]));this.b24Track.addCue(n);for(var h=a.length-1;h>=0;h--)this.b24Track.addCue(a[h])}}return!0}},{key:\\\"onB24CueChange\\\",value:function(){if(this.media&&this.b24Track){if(this.table)for(;this.table.firstChild;)this.table.removeChild(this.table.firstChild);if(this.b24Track.activeCues&&this.b24Track.activeCues.length>0){var t=this.b24Track.activeCues[this.b24Track.activeCues.length-1];if(t.startTime<=this.media.currentTime&&this.media.currentTime<=t.endTime&&!this.isOnSeeking){var e,i,r,n,s,a=new Rt(t.data,t.startTime).render(Ot(Ot({},this.rendererOption),{},{table:null!==(e=this.table)&&void 0!==e?e:void 0}));null!=(null==a?void 0:a.PRA)&&(null===(n=this.rendererOption)||void 0===n||null===(s=n.PRACallback)||void 0===s||s.call(n,a.PRA)),null!=a&&a.rendered&&this.onResize(),this.onB24CueChangeDrawed=null!==(i=null==a?void 0:a.rendered)&&void 0!==i&&i,this.textContent=null!==(r=null==a?void 0:a.textContent)&&void 0!==r?r:null}else this.onB24CueChangeDrawed=!1,this.textContent=null;for(var o=this.b24Track.activeCues.length-2;o>=0;o--){var h=this.b24Track.activeCues[o];h.endTime=Math.min(h.endTime,t.startTime),h.startTime===h.endTime&&this.b24Track.removeCue(h)}}else this.onB24CueChangeDrawed=!1,this.textContent=null}else this.onB24CueChangeDrawed=!1}},{key:\\\"onHighResTimeupdate\\\",value:function(){this.onTimeupdate(),this.highResTimeupdatePollingId=window.requestAnimationFrame(this.onHighResTimeupdateHandler)}},{key:\\\"onTimeupdate\\\",value:function(){if(this.media)if(null!=this.prevCurrentTime)if(this.id3Track&&this.id3Track.cues&&0!==this.id3Track.cues.length)if(this.isOnSeeking)this.prevCurrentTime=this.media.currentTime;else if(Math.abs(this.media.currentTime-this.prevCurrentTime)>1)this.prevCurrentTime=this.media.currentTime;else{for(var t,e,i=new Y(Number.NEGATIVE_INFINITY,this.id3Track.cues[0].startTime),r=[i],n=0;n<this.id3Track.cues.length;n++)r.push(this.id3Track.cues[n]);for(var s=0,a=r.length;s+1<a;){var o=this.prevCurrentTime,h=Math.floor((s+a)/2);o<r[h].startTime?a=h:s=h}t=s;for(var c=0,u=r.length;c+1<u;){var l=this.media.currentTime,f=Math.floor((c+u)/2);l<r[f].startTime?u=f:c=f}if(e=c,null!==t&&null!==e&&t!==e){if(t<e)for(var d=e;d>t;d--){var p=r[d];if(p!==i&&this.pushID3v2Cue(p))break}else for(var v=t;v<e;v++){var b=r[v];if(b!==i&&this.pushID3v2Cue(b))break}this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime;else this.prevCurrentTime=this.media.currentTime}},{key:\\\"onCanplay\\\",value:function(){this.id3Track&&(this.id3Track.mode=\\\"hidden\\\"),this.b24Track&&(this.b24Track.mode=\\\"hidden\\\"),null!=this.media&&null==this.prevCurrentTime&&(this.prevCurrentTime=this.media.currentTime-Number.MIN_VALUE)}},{key:\\\"onPlay\\\",value:function(){null==this.highResTimeupdatePollingId&&this.onHighResTimeupdate()}},{key:\\\"onPause\\\",value:function(){null!=this.highResTimeupdatePollingId&&(window.cancelAnimationFrame(this.highResTimeupdatePollingId),this.highResTimeupdatePollingId=null)}},{key:\\\"onSeeking\\\",value:function(){this.isOnSeeking=!0,this.onB24CueChange()}},{key:\\\"onSeeked\\\",value:function(){this.isOnSeeking=!1}},{key:\\\"onResize\\\",value:function(){var t;if(this.media&&this.wrapper){var e=window.getComputedStyle(this.media),i=Number.parseInt(e.width),r=Number.parseInt(e.height),n=this.wrapper.offsetWidth,s=this.wrapper.offsetHeight,a=i/n,o=r/s;if(null!==(t=this.rendererOption)&&void 0!==t&&t.keepAspectRatio){var h=Math.min(a,o);this.wrapper.style.top=\\\"\\\".concat((r-s*h)/2,\\\"px\\\"),this.wrapper.style.left=\\\"\\\".concat((i-n*h)/2,\\\"px\\\"),this.wrapper.style.transform=\\\"scale(\\\".concat(h,\\\")\\\"),this.wrapper.style.transformOrigin=\\\"0 0\\\"}else this.wrapper.style.top=\\\"0px\\\",this.wrapper.style.left=\\\"0px\\\",this.wrapper.style.transform=\\\"scale(\\\".concat(a,\\\", \\\").concat(o,\\\")\\\"),this.wrapper.style.transformOrigin=\\\"0 0\\\"}}},{key:\\\"onID3Addtrack\\\",value:function(t){if(this.media){var e=t.track;\\\"metadata\\\"===e.kind&&(\\\"15260DFFFF49443320FF49443320000F\\\"!==e.inBandMetadataTrackDispatchType&&\\\"com.apple.streaming\\\"!==e.inBandMetadataTrackDispatchType&&\\\"id3\\\"!==e.label||this.setInBandMetadataTextTrack(e))}}},{key:\\\"setupTrack\\\",value:function(){var t,e;if(this.media){if(null!==(t=this.rendererOption)&&void 0!==t&&t.useHighResTextTrack)this.b24Track=new K(this.media),this.b24Track.startPolling();else{for(var i=\\\"ARIB B24 Japanese (data_identifier=0x\\\".concat(this.data_identifier.toString(16),\\\", data_group_id=\\\").concat(this.data_group_id,\\\")\\\"),r=0;r<this.media.textTracks.length;r++){var n=this.media.textTracks[r];if(n.label===i){this.b24Track=n;break}}this.b24Track||(this.b24Track=this.media.addTextTrack(\\\"metadata\\\",i,\\\"ja\\\"),this.b24Track.mode=\\\"hidden\\\")}if(this.b24Track.addEventListener(\\\"cuechange\\\",this.onB24CueChangeHandler),null!==(e=this.rendererOption)&&void 0!==e&&e.enableAutoInBandMetadataTextTrackDetection){for(var s=0;s<this.media.textTracks.length;s++){var a=this.media.textTracks[s];if(\\\"metadata\\\"===a.kind&&(\\\"15260DFFFF49443320FF49443320000F\\\"===a.inBandMetadataTrackDispatchType||\\\"com.apple.streaming\\\"===a.inBandMetadataTrackDispatchType||\\\"id3\\\"===a.label)){this.setInBandMetadataTextTrack(a);break}}this.media.textTracks.addEventListener(\\\"addtrack\\\",this.onID3AddtrackHandler)}this.media.addEventListener(\\\"seeking\\\",this.onSeekingHandler),this.media.addEventListener(\\\"seeked\\\",this.onSeekedHandler)}}},{key:\\\"setupTable\\\",value:function(){var t=this;this.media&&this.subtitleElement&&(this.wrapper=document.createElement(\\\"div\\\"),this.table=document.createElement(\\\"table\\\"),this.wrapper.style.pointerEvents=\\\"none\\\",this.wrapper.appendChild(this.table),this.subtitleElement.appendChild(this.wrapper),this.media.addEventListener(\\\"resize\\\",this.onResizeHandler),window.ResizeObserver?(this.resizeObserver=new ResizeObserver((function(){t.onResize()})),this.resizeObserver.observe(this.media)):(window.addEventListener(\\\"resize\\\",this.onResizeHandler),window.MutationObserver&&(this.mutationObserver=new MutationObserver((function(){t.onResize()})),this.mutationObserver.observe(this.media,{attributes:!0,attributeFilter:[\\\"class\\\",\\\"style\\\"]}))))}},{key:\\\"cleanupTrack\\\",value:function(){var t,e,i,r,n,s;if(this.b24Track)if(null!==(s=this.rendererOption)&&void 0!==s&&s.useHighResTextTrack)this.b24Track.stopPolling();else if(this.b24Track.cues)for(var a=this.b24Track.cues.length-1;a>=0;a--)this.b24Track.removeCue(this.b24Track.cues[a]);null===(t=this.b24Track)||void 0===t||t.removeEventListener(\\\"cuechange\\\",this.onB24CueChangeHandler),null===(e=this.id3Track)||void 0===e||e.removeEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\\\"seeking\\\",this.onSeekingHandler),null===(r=this.media)||void 0===r||r.removeEventListener(\\\"seeked\\\",this.onSeekedHandler),null===(n=this.media)||void 0===n||n.textTracks.removeEventListener(\\\"addtrack\\\",this.onID3AddtrackHandler),this.b24Track=this.id3Track=null}},{key:\\\"cleanupTable\\\",value:function(){var t;window.removeEventListener(\\\"resize\\\",this.onResizeHandler),null===(t=this.media)||void 0===t||t.removeEventListener(\\\"resize\\\",this.onResizeHandler),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.mutationObserver&&(this.mutationObserver.disconnect(),this.mutationObserver=null),this.table&&this.wrapper&&this.wrapper.removeChild(this.table),this.wrapper&&this.subtitleElement&&this.subtitleElement.removeChild(this.wrapper),this.wrapper=this.table=null}}])&&Gt(t.prototype,e),Object.defineProperty(t,\\\"prototype\\\",{writable:!1}),t;var t,e}();return r}()}));\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 32\\\\\\\"><path d=\\\\\\\"M27.090 0.131h-22.731c-2.354 0-4.262 1.839-4.262 4.109v16.401c0 2.269 1.908 4.109 4.262 4.109h4.262v-2.706h8.469l-8.853 8.135 1.579 1.451 7.487-6.88h9.787c2.353 0 4.262-1.84 4.262-4.109v-16.401c0-2.27-1.909-4.109-4.262-4.109v0zM28.511 19.304c0 1.512-1.272 2.738-2.841 2.738h-8.425l-0.076-0.070-0.076 0.070h-11.311c-1.569 0-2.841-1.226-2.841-2.738v-13.696c0-1.513 1.272-2.739 2.841-2.739h19.889c1.569 0 2.841-0.142 2.841 1.37v15.064z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 512 512\\\\\\\"><path d=\\\\\\\"M11.5 280.6l192 160c20.6 17.2 52.5 2.8 52.5-24.6V96c0-27.4-31.9-41.8-52.5-24.6l-192 160c-15.3 12.8-15.3 36.4 0 49.2zm256 0l192 160c20.6 17.2 52.5 2.8 52.5-24.6V96c0-27.4-31.9-41.8-52.5-24.6l-192 160c-15.3 12.8-15.3 36.4 0 49.2z\\\\\\\"></path></svg>\\\"\",\"{{ set enableSubtitle = subtitle && subtitle.type === 'webvtt' }}\\n<video\\n    class=\\\"dplayer-video {{ if current }}dplayer-video-current{{ /if }}\\\"\\n    webkit-playsinline\\n    {{ if airplay }} x-webkit-airplay=\\\"allow\\\" {{ /if }}\\n    playsinline\\n    {{ if pic }}poster=\\\"{{ pic }}\\\"{{ /if }}\\n    {{ if crossOrigin !== null || screenshot || enableSubtitle }}crossorigin=\\\"{{ crossOrigin ? crossOrigin : 'anonymous' }}\\\"{{ /if }}\\n    {{ if preload }}preload=\\\"{{ preload }}\\\"{{ /if }}\\n    {{ if url }}src=\\\"{{ url }}\\\"{{ /if }}\\n    >\\n    {{ if enableSubtitle }}\\n    <track kind=\\\"metadata\\\" default src=\\\"{{ subtitle.url }}\\\"></track>\\n    {{ /if }}\\n</video>\\n\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 21 32\\\\\\\"><path d=\\\\\\\"M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 21 32\\\\\\\"><path d=\\\\\\\"M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528zM25.152 16q0 2.72-1.536 5.056t-4 3.36q-0.256 0.096-0.448 0.096-0.48 0-0.832-0.352t-0.32-0.8q0-0.704 0.672-1.056 1.024-0.512 1.376-0.8 1.312-0.96 2.048-2.4t0.736-3.104-0.736-3.104-2.048-2.4q-0.352-0.288-1.376-0.8-0.672-0.352-0.672-1.056 0-0.448 0.32-0.8t0.8-0.352q0.224 0 0.48 0.096 2.496 1.056 4 3.36t1.536 5.056z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 16 32\\\\\\\"><path d=\\\\\\\"M15.552 15.168q0.448 0.32 0.448 0.832 0 0.448-0.448 0.768l-13.696 8.512q-0.768 0.512-1.312 0.192t-0.544-1.28v-16.448q0-0.96 0.544-1.28t1.312 0.192z\\\\\\\"></path></svg>\\\"\",\"// Imports\\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \\\"../../node_modules/css-loader/dist/runtime/sourceMaps.js\\\";\\nimport ___CSS_LOADER_API_IMPORT___ from \\\"../../node_modules/css-loader/dist/runtime/api.js\\\";\\nimport ___CSS_LOADER_AT_RULE_IMPORT_0___ from \\\"-!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!../../node_modules/balloon-css/balloon.css\\\";\\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_0___);\\n// Module\\n___CSS_LOADER_EXPORT___.push([module.id, `@keyframes my-face{2%{transform:translateY(1.5px) rotate(1.5deg)}4%{transform:translateY(-1.5px) rotate(-.5deg)}6%{transform:translateY(1.5px) rotate(-1.5deg)}8%{transform:translateY(-1.5px) rotate(-1.5deg)}10%{transform:translateY(2.5px) rotate(1.5deg)}12%{transform:translateY(-.5px) rotate(1.5deg)}14%{transform:translateY(-1.5px) rotate(1.5deg)}16%{transform:translateY(-.5px) rotate(-1.5deg)}18%{transform:translateY(.5px) rotate(-1.5deg)}20%{transform:translateY(-1.5px) rotate(2.5deg)}22%{transform:translateY(.5px) rotate(-1.5deg)}24%{transform:translateY(1.5px) rotate(1.5deg)}26%{transform:translateY(.5px) rotate(.5deg)}28%{transform:translateY(.5px) rotate(1.5deg)}30%{transform:translateY(-.5px) rotate(2.5deg)}32%{transform:translateY(1.5px) rotate(-.5deg)}34%{transform:translateY(1.5px) rotate(-.5deg)}36%{transform:translateY(-1.5px) rotate(2.5deg)}38%{transform:translateY(1.5px) rotate(-1.5deg)}40%{transform:translateY(-.5px) rotate(2.5deg)}42%{transform:translateY(2.5px) rotate(-1.5deg)}44%{transform:translateY(1.5px) rotate(.5deg)}46%{transform:translateY(-1.5px) rotate(2.5deg)}48%{transform:translateY(-.5px) rotate(.5deg)}50%{transform:translateY(.5px) rotate(.5deg)}52%{transform:translateY(2.5px) rotate(2.5deg)}54%{transform:translateY(-1.5px) rotate(1.5deg)}56%{transform:translateY(2.5px) rotate(2.5deg)}58%{transform:translateY(.5px) rotate(2.5deg)}60%{transform:translateY(2.5px) rotate(2.5deg)}62%{transform:translateY(-.5px) rotate(2.5deg)}64%{transform:translateY(-.5px) rotate(1.5deg)}66%{transform:translateY(1.5px) rotate(-.5deg)}68%{transform:translateY(-1.5px) rotate(-.5deg)}70%{transform:translateY(1.5px) rotate(.5deg)}72%{transform:translateY(2.5px) rotate(1.5deg)}74%{transform:translateY(-.5px) rotate(.5deg)}76%{transform:translateY(-.5px) rotate(2.5deg)}78%{transform:translateY(-.5px) rotate(1.5deg)}80%{transform:translateY(1.5px) rotate(1.5deg)}82%{transform:translateY(-.5px) rotate(.5deg)}84%{transform:translateY(1.5px) rotate(2.5deg)}86%{transform:translateY(-1.5px) rotate(-1.5deg)}88%{transform:translateY(-.5px) rotate(2.5deg)}90%{transform:translateY(2.5px) rotate(-.5deg)}92%{transform:translateY(.5px) rotate(-.5deg)}94%{transform:translateY(2.5px) rotate(.5deg)}96%{transform:translateY(-.5px) rotate(1.5deg)}98%{transform:translateY(-1.5px) rotate(-.5deg)}0%,to{transform:translate(0) rotate(0deg)}}.dplayer{line-height:1;overflow:hidden;position:relative;user-select:none;-webkit-user-select:none}.dplayer *{box-sizing:initial}.dplayer svg{height:100%;width:100%}.dplayer svg circle,.dplayer svg path{fill:#fff}.dplayer.dplayer-fulled,.dplayer.dplayer-fulled-browser{background:#000;height:100%!important;left:0;margin:0;padding:0;position:fixed;top:0;transform:translate(0);width:100%!important;z-index:100000}.dplayer.dplayer-live .dplayer-bar-wrap,.dplayer.dplayer-live .dplayer-time,.dplayer.dplayer-no-audio-switching .dplayer-setting-box .dplayer-setting-audio,.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-comment,.dplayer.dplayer-no-danmaku .dplayer-danmaku,.dplayer.dplayer-no-danmaku .dplayer-setting-box .dplayer-setting-danmaku,.dplayer.dplayer-no-danmaku .dplayer-setting-box .dplayer-setting-danunlimit,.dplayer.dplayer-no-danmaku .dplayer-setting-box .dplayer-setting-showdan{display:none}.dplayer.dplayer-live .dplayer-notice{bottom:56px}.dplayer.dplayer-live .dplayer-setting-loop,.dplayer.dplayer-live .dplayer-setting-speed{display:none}.dplayer.dplayer-live .dplayer-controller .dplayer-icons .dplayer-setting-box{height:auto;overflow-y:hidden}.dplayer.dplayer-live .dplayer-mobile-icon-backward,.dplayer.dplayer-live .dplayer-mobile-icon-forward{display:none}.dplayer.dplayer-live .dplayer-comment-setting-box,.dplayer.dplayer-live .dplayer-setting-box{bottom:58px;max-height:calc(100% - 66px)}.dplayer.dplayer-live.dplayer-mobile .dplayer-comment-setting-box,.dplayer.dplayer-live.dplayer-mobile .dplayer-setting-box{bottom:52px;max-height:calc(100% - 60px)}.dplayer.dplayer-narrow .dplayer-danmaku{font-size:18px}.dplayer.dplayer-narrow .dplayer-icon{margin:0 -3px}.dplayer.dplayer-playing .dplayer-danmaku .dplayer-danmaku-move{animation-play-state:running}.dplayer.dplayer-playing .dplayer-controller,.dplayer.dplayer-playing .dplayer-controller-mask{opacity:0}.dplayer.dplayer-playing:hover .dplayer-controller,.dplayer.dplayer-playing:hover .dplayer-controller-mask{opacity:1}.dplayer.dplayer-loading .dplayer-bezel .dplayer-loading-icon{display:block}.dplayer.dplayer-loading .dplayer-danmaku,.dplayer.dplayer-loading .dplayer-danmaku-move,.dplayer.dplayer-paused .dplayer-danmaku,.dplayer.dplayer-paused .dplayer-danmaku-move{animation-play-state:paused}.dplayer.dplayer-show-controller .dplayer-controller,.dplayer.dplayer-show-controller .dplayer-controller-mask{opacity:1}.dplayer.dplayer-fulled{height:100%!important;left:0;position:fixed!important;top:0;width:100%!important;z-index:100000}.dplayer.dplayer-fulled.dplayer-hide-controller{cursor:none}.dplayer.dplayer-fulled.dplayer-hide-controller .dplayer-controller,.dplayer.dplayer-fulled.dplayer-hide-controller .dplayer-controller-mask{opacity:0!important}.dplayer.dplayer-fulled-browser.dplayer-hide-controller{cursor:none}.dplayer.dplayer-fulled-browser.dplayer-hide-controller .dplayer-controller,.dplayer.dplayer-fulled-browser.dplayer-hide-controller .dplayer-controller-mask{opacity:0!important}.dplayer.dplayer-mobile .dplayer-controller{height:44px}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons{padding-bottom:3px;padding-top:3px}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-airplay-icon,.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-play-icon,.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-volume{display:none}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-full .dplayer-full-in-icon,.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-full .dplayer-pip-icon{display:inline-block;position:static}.dplayer.dplayer-mobile .dplayer-controller-mask{background:linear-gradient(#0000008c 78%,#000c);height:100%}.dplayer.dplayer-mobile.dplayer-playing .dplayer-controller,.dplayer.dplayer-mobile.dplayer-playing .dplayer-controller-mask{opacity:1}.dplayer.dplayer-mobile.dplayer-hide-controller .dplayer-controller-mask{opacity:0}.dplayer.dplayer-mobile.dplayer-hide-controller .dplayer-controller{opacity:0;transform:translateY(100%)}.dplayer.dplayer-mobile .dplayer-bar-wrap{bottom:35px}.dplayer.dplayer-mobile .dplayer-bar-wrap .dplayer-bar-time{display:none}.dplayer.dplayer-mobile .dplayer-comment-setting-box,.dplayer.dplayer-mobile .dplayer-setting-box{bottom:58px;max-height:calc(100% - 66px)}.dplayer.dplayer-mobile.dplayer-hide-controller .dplayer-mobile-icon-wrap{opacity:0;visibility:hidden}.dplayer.dplayer-mobile .dplayer-mobile-icon-wrap{opacity:.7;visibility:visible}.dplayer-web-fullscreen-fix{left:0;margin:0;padding:0;position:fixed;top:0}.dplayer [aria-label]{--balloon-font-size:11.5px}.dplayer [aria-label]:before{display:none}.dplayer [aria-label]:after{background:#111111b3!important;font-family:inherit!important;padding:.3em .8em!important}.dplayer [aria-label][data-balloon-pos=up]:after{margin-bottom:0!important}.dplayer-bezel{bottom:0;color:#fff;font-size:22px;left:0;pointer-events:none;position:absolute;right:0;top:0}.dplayer-bezel .dplayer-bezel-icon{background:#00000080;border-radius:50%;box-sizing:border-box;height:52px;left:50%;margin:-26px 0 0 -26px;opacity:0;padding:12px;pointer-events:none;position:absolute;top:50%;width:52px;will-change:transform}.dplayer-bezel .dplayer-bezel-icon.dplayer-bezel-transition{animation:bezel-hide .5s linear}@keyframes bezel-hide{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(2)}}.dplayer-bezel .dplayer-danloading{animation:my-face 5s ease-in-out infinite;font-size:14px;line-height:14px;margin-top:-7px;position:absolute;text-align:center;top:50%;width:100%}.dplayer-bezel .dplayer-loading-icon{display:none;height:36px;left:50%;margin:-18px 0 0 -18px;pointer-events:none;position:absolute;top:50%;width:36px}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-hide{display:none}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot{animation:dplayer-loading-dot-fade .8s ease infinite;opacity:0;transform-origin:4px 4px;will-change:transform}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-7{animation-delay:.7s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-6{animation-delay:.6s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-5{animation-delay:.5s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-4{animation-delay:.4s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-3{animation-delay:.3s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-2{animation-delay:.2s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-1{animation-delay:.1s}@keyframes dplayer-loading-dot-fade{0%{opacity:.7;transform:scale(1.2)}50%{opacity:.25;transform:scale(.9)}to{opacity:.25;transform:scale(.85)}}.dplayer-controller-mask{background:linear-gradient(#0000 15%,#000000b3);height:98px;width:100%}.dplayer-controller,.dplayer-controller-mask{bottom:0;position:absolute;transition:all .3s ease}.dplayer-controller{height:50px;left:0;padding:0 20px;right:0;user-select:none;-webkit-user-select:none}.dplayer-controller.dplayer-controller-comment .dplayer-icons{display:none}.dplayer-controller.dplayer-controller-comment .dplayer-icons.dplayer-comment-box{display:block}.dplayer-controller .dplayer-bar-wrap{-webkit-tap-highlight-color:rgba(0,0,0,0);bottom:41px;cursor:pointer;height:3px;padding:10px 0;position:absolute;width:calc(100% - 40px)}.dplayer-controller .dplayer-bar-wrap:after{content:var(--thumbnail-url);height:0;overflow:hidden;position:absolute;width:0;z-index:-1}.dplayer-controller .dplayer-bar-wrap:hover .dplayer-bar .dplayer-played .dplayer-thumb{transform:scale(1)}.dplayer-controller .dplayer-bar-wrap:hover .dplayer-highlight{display:block;height:40%;top:4px;transform:translateX(-4px);width:8px}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight{background-color:#fff;border-radius:6px;height:20%;position:absolute;text-align:center;top:5px;transform:translateX(-3px);transition:all .2s ease-in-out;width:6px;z-index:12}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover .dplayer-highlight-text{display:block}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover~.dplayer-bar-preview,.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover~.dplayer-bar-time{opacity:0}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight .dplayer-highlight-text{background-color:#0000009e;border-radius:4px;color:#fff;display:none;font-size:12px;left:50%;padding:5px 8px;position:absolute;top:-24px;transform:translateX(-50%);white-space:nowrap}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-preview{aspect-ratio:16/9;background:#131313;background-image:var(--thumbnail-url);background-repeat:no-repeat;background-size:16000px 100%;border-radius:6px;box-shadow:0 0 5px 0 #0000004d;display:none;image-rendering:-webkit-optimize-contrast;image-rendering:crisp-edges;pointer-events:none;position:absolute}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time{word-wrap:normal;background-color:#1f1f1fd9;border-radius:4px;color:#fff;font-size:12px;left:0;opacity:1;padding:6.5px 7px;pointer-events:none;position:absolute;text-align:center;top:-22px;transition:opacity .1s ease-in-out;word-break:normal;z-index:2}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time.hidden{opacity:0}.dplayer-controller .dplayer-bar-wrap .dplayer-bar{background:#fff3;cursor:pointer;height:4px;position:relative;width:100%}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-loaded{background:#fff;transition:all .5s ease}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-loaded,.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played{bottom:0;height:4px;left:0;position:absolute;top:0;will-change:width}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played .dplayer-thumb{border-radius:50%;cursor:pointer;height:11px;margin-right:-10px;margin-top:-4px;position:absolute;right:5px;top:0;transform:scale(0);transition:all .3s ease-in-out;width:11px}.dplayer-controller .dplayer-icons{-webkit-tap-highlight-color:rgba(0,0,0,0);bottom:0;height:38px;padding-bottom:6px;padding-top:6px;position:absolute}.dplayer-controller .dplayer-icons.dplayer-comment-box{bottom:0;color:#fff;display:none;height:38px;left:20px;position:absolute;right:20px;transition:all .3s ease-in-out;z-index:2}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-icon{padding:7px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-icon{left:0;position:absolute;top:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-send-icon{position:absolute;right:0;top:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-send-icon[aria-label]:after{left:14%}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input{background:none;border:none;border-radius:4px;box-sizing:border-box;color:#fff;font-family:inherit;font-size:14px;height:100%;line-height:18px;margin:0;outline:none;padding:8px 0;text-align:center;width:100%}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::placeholder{color:#fff;opacity:.8}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-moz-focus-inner{border:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-ms-clear{display:none}@media(max-width:350px){.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box{padding:9px 10px 15px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-title{font-size:12px;line-height:24px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input{font-size:12px}}.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon{padding:7px}@media(max-width:500px){.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon{padding-top:6px}}@media(max-width:350px){.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon{padding-top:7px}}.dplayer-controller .dplayer-icons.dplayer-icons-right{right:20px}.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon{padding:8px}@media(max-width:500px){.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon{padding:7px;width:38px}}@media(max-width:350px){.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon{padding:5px;width:31px}}.dplayer-controller .dplayer-icons .dplayer-time{color:#eee;font-family:inherit;font-size:13px;line-height:38px;text-shadow:0 0 2px #00000080;vertical-align:middle}@media(max-width:350px){.dplayer-controller .dplayer-icons .dplayer-time{font-size:12px}}.dplayer-controller .dplayer-icons .dplayer-live-badge{align-items:center;color:#eee;cursor:pointer;display:inline-flex;font-family:inherit;font-size:13px;height:100%;line-height:18px;text-shadow:0 0 2px #00000080;vertical-align:middle}.dplayer-controller .dplayer-icons .dplayer-live-dot{border-radius:6px;content:\\\"\\\";display:inline-block;height:6px;margin-right:5px;vertical-align:4%;width:6px}.dplayer-controller .dplayer-icons .dplayer-icon{background-color:#0000;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;height:100%;line-height:18px;outline:none;vertical-align:middle;width:40px}.dplayer-controller .dplayer-icons .dplayer-icon .dplayer-icon-content{opacity:.8;transition:all .2s ease-in-out}.dplayer-controller .dplayer-icons .dplayer-icon:hover .dplayer-icon-content{opacity:1}.dplayer-controller .dplayer-icons .dplayer-icon::-moz-focus-inner{border:0}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon{padding:10.5px 9.5px 8px}@media(max-width:500px){.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon{padding:9px 9px 8px}}@media(max-width:350px){.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon{padding:6.5px 6.5px 6px}}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-volume-icon{width:43px}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-full-icon[aria-label]:after{left:1%}@media(max-width:350px){.dplayer-controller .dplayer-icons .dplayer-icon{width:35px}}.dplayer-controller .dplayer-icons .dplayer-volume{cursor:pointer;display:inline-block;height:100%;position:relative}.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar{width:45px}.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{transform:scale(1)}.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar{width:45px}.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{transform:scale(1)}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap{display:inline-block;height:100%;margin:0 10px 0 -5px;vertical-align:middle}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar{background:#fff;height:4px;position:relative;top:17px;transition:all .3s ease-in-out;width:0}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner{bottom:0;height:100%;left:0;position:absolute;transition:all .1s ease;will-change:width}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{border-radius:50%;cursor:pointer;height:11px;margin-right:-10px;margin-top:-4px;position:absolute;right:5px;top:0;transform:scale(0);transition:all .3s ease-in-out;width:11px}.dplayer-controller .dplayer-icons .dplayer-setting,.dplayer-controller .dplayer-icons .dplayer-subtitle-btn{display:inline-block;height:100%}.dplayer-controller .dplayer-icons .dplayer-full{display:inline-block;height:100%;position:relative}.dplayer-controller .dplayer-icons .dplayer-comment{display:inline-block;height:100%}.dplayer-mobile-icon-wrap{align-items:center;display:flex;height:50px;justify-content:space-evenly;left:50%;opacity:0;pointer-events:none;position:absolute;top:50%;transform:translate(-50%,-50%);transition:all .28s ease;visibility:hidden;width:100%}.dplayer-mobile-icon-wrap .dplayer-mobile-icon{-webkit-tap-highlight-color:rgba(0,0,0,0);background-color:#0000;border:none;box-sizing:border-box;cursor:pointer;filter:drop-shadow(0 0 7px rgba(0,0,0,.5));height:50px;outline:none;pointer-events:auto;width:50px}.dplayer-mobile-icon-wrap .dplayer-mobile-icon-backward,.dplayer-mobile-icon-wrap .dplayer-mobile-icon-forward{padding:12px}.dplayer-setting-box{-webkit-tap-highlight-color:rgba(0,0,0,0);background:#1c1c1ce6;border-radius:7px;bottom:64px;box-sizing:border-box;display:flex;height:calc(100% - 72px);opacity:0;overflow-x:hidden;overflow-y:hidden;position:absolute;right:20px;transition:all .25s ease;visibility:hidden;width:210px;z-index:2}.dplayer-setting-box>div{overflow-x:hidden}.dplayer-setting-box>div.dplayer-setting-origin-panel{display:block}.dplayer-setting-box.dplayer-setting-box-open{opacity:1;visibility:visible}.dplayer-setting-box.dplayer-setting-box-quality{clip-path:inset(calc(100% - 30px*var(--quality-length) - 54px) 0 0 round 7px)!important}.dplayer-setting-box.dplayer-setting-box-quality .dplayer-setting-origin-panel{transform:translateX(-100%)}.dplayer-setting-box.dplayer-setting-box-quality .dplayer-setting-quality-panel{display:block;transform:translateX(0)}.dplayer-setting-box.dplayer-setting-box-speed{clip-path:inset(calc(100% - 30px*var(--speed-length) - 54px) 0 0 round 7px)!important}.dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-origin-panel{transform:translateX(-100%)}.dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-speed-panel{display:block;transform:translateX(0)}.dplayer-setting-box.dplayer-setting-box-audio{clip-path:inset(calc(100% - 114px) 0 0 round 7px)!important}.dplayer-setting-box.dplayer-setting-box-audio .dplayer-setting-origin-panel{transform:translateX(-100%)}.dplayer-setting-box.dplayer-setting-box-audio .dplayer-setting-audio-panel{display:block;transform:translateX(0)}.dplayer-setting-box .dplayer-label{color:#eee;display:inline-block;font-size:13px;vertical-align:middle;white-space:nowrap}.dplayer-setting-box .dplayer-label-value{color:#e0e0e0;display:inline-block;font-size:12px;margin-left:auto;margin-right:23px;vertical-align:middle;white-space:nowrap}.dplayer-setting-box .dplayer-toggle{font-size:0;height:20px;position:absolute;right:7px;text-align:center;top:5px;vertical-align:middle;width:20px}.dplayer-setting-box .dplayer-toggle input{display:none;max-height:0;max-width:0}.dplayer-setting-box .dplayer-toggle input+label{border:1px solid #dfdfdf;border-radius:10px;box-shadow:inset 0 0 0 0 #dfdfdf;box-sizing:border-box;cursor:pointer;display:inline-block;height:20px;position:relative;right:15px;transition:.25s ease;width:32px}.dplayer-setting-box .dplayer-toggle input+label:before{border-radius:15px;content:\\\"\\\";display:block;height:19px;left:-.5px;position:absolute;top:-.5px;transition:.25s ease;width:19px}.dplayer-setting-box .dplayer-toggle input+label:after{background:#fff;border-radius:15px;box-shadow:0 1px 3px #0006;content:\\\"\\\";display:block;height:18.1px;left:0;position:absolute;top:-.1px;transition:.25s ease;width:18.1px}.dplayer-setting-box .dplayer-toggle input:checked+label{border-color:var(--theme-color)}.dplayer-setting-box .dplayer-toggle input:checked+label:before{background:var(--theme-color);width:31px}.dplayer-setting-box .dplayer-toggle input:checked+label:after{left:12px}.dplayer-setting-box .dplayer-setting-audio-panel,.dplayer-setting-box .dplayer-setting-origin-panel,.dplayer-setting-box .dplayer-setting-quality-panel,.dplayer-setting-box .dplayer-setting-speed-panel{bottom:0;box-sizing:border-box;max-height:100%;overflow-y:auto;padding:7px 0;position:absolute;scrollbar-width:thin;transition:transform .25s ease;width:100%}.dplayer-setting-box .dplayer-setting-audio-panel::-webkit-scrollbar,.dplayer-setting-box .dplayer-setting-origin-panel::-webkit-scrollbar,.dplayer-setting-box .dplayer-setting-quality-panel::-webkit-scrollbar,.dplayer-setting-box .dplayer-setting-speed-panel::-webkit-scrollbar{width:6px}.dplayer-setting-box .dplayer-setting-audio-panel::-webkit-scrollbar-thumb,.dplayer-setting-box .dplayer-setting-origin-panel::-webkit-scrollbar-thumb,.dplayer-setting-box .dplayer-setting-quality-panel::-webkit-scrollbar-thumb,.dplayer-setting-box .dplayer-setting-speed-panel::-webkit-scrollbar-thumb{background:#ffffff26}.dplayer-setting-box .dplayer-setting-origin-panel{transform:translateX(0)}.dplayer-setting-box .dplayer-setting-audio-panel,.dplayer-setting-box .dplayer-setting-quality-panel,.dplayer-setting-box .dplayer-setting-speed-panel{transform:translateX(100%)}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-header,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-header,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-header{align-items:center;border-bottom:2px solid #ffffff26;box-sizing:border-box;cursor:pointer;display:flex;height:33px;margin-bottom:7px;padding-bottom:5px;padding-left:5px}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item{padding:5px}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item .dplayer-toggle{visibility:hidden}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item.dplayer-setting-speed-current .dplayer-toggle{visibility:visible}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-toggle{display:inline-block;margin-right:6px;position:static;width:22px}.dplayer-setting-box .dplayer-setting-audio-item,.dplayer-setting-box .dplayer-setting-item,.dplayer-setting-box .dplayer-setting-quality-item,.dplayer-setting-box .dplayer-setting-speed-item{align-items:center;box-sizing:border-box;cursor:pointer;display:flex;height:30px;padding:5px 10px;position:relative}.dplayer-setting-box .dplayer-setting-audio-item:hover,.dplayer-setting-box .dplayer-setting-item:hover,.dplayer-setting-box .dplayer-setting-quality-item:hover,.dplayer-setting-box .dplayer-setting-speed-item:hover{background-color:#ffffff1a}.dplayer-setting-box .dplayer-setting-danmaku{padding:5px 0}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-label{display:inline;padding:0 10px}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-label-value{font-size:12.5px;margin-right:18px}.dplayer-setting-box .dplayer-setting-danmaku:hover .dplayer-label,.dplayer-setting-box .dplayer-setting-danmaku:hover .dplayer-label-value{display:none}.dplayer-setting-box .dplayer-setting-danmaku:hover .dplayer-danmaku-bar-wrap{display:inline-block}.dplayer-setting-box .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-label,.dplayer-setting-box .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-label-value{display:none}.dplayer-setting-box .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-danmaku-bar-wrap{display:inline-block}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap{box-sizing:border-box;display:none;height:100%;padding:0 10px;vertical-align:middle;width:100%}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar{background:#fff;height:3px;position:relative;top:8.5px;transition:all .3s ease-in-out;width:100%}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner{bottom:0;height:100%;left:0;position:absolute;transition:all .05s ease;will-change:width}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner .dplayer-thumb{border-radius:50%;cursor:pointer;height:11px;margin-right:-10px;margin-top:-4px;position:absolute;right:5px;top:0;transition:all .3s ease-in-out;width:11px}.dplayer-comment-setting-box{-webkit-tap-highlight-color:rgba(0,0,0,0);background:#1c1c1ce6;border-radius:7px;bottom:64px;box-sizing:border-box;clip-path:inset(0 0 0 round 7px);font-size:14px;left:20px;max-height:calc(100% - 72px);opacity:0;overflow-y:auto;padding:10px 10px 16px;position:absolute;scrollbar-width:thin;transition:all .25s ease;visibility:hidden;width:255px;z-index:2}.dplayer-comment-setting-box::-webkit-scrollbar{width:6px}.dplayer-comment-setting-box::-webkit-scrollbar-thumb{background:#ffffff26}.dplayer-comment-setting-box.dplayer-comment-setting-open{opacity:1;visibility:visible}.dplayer-comment-setting-box input[type=radio]{display:none}.dplayer-comment-setting-box label{cursor:pointer}.dplayer-comment-setting-box .dplayer-comment-setting-title{color:#fff;font-size:13px;line-height:30px}.dplayer-comment-setting-box .dplayer-comment-setting-size,.dplayer-comment-setting-box .dplayer-comment-setting-type{font-size:0}.dplayer-comment-setting-box .dplayer-comment-setting-size.dplayer-comment-setting-size,.dplayer-comment-setting-box .dplayer-comment-setting-type.dplayer-comment-setting-size{margin-top:8px}.dplayer-comment-setting-box .dplayer-comment-setting-size .dplayer-comment-setting-title,.dplayer-comment-setting-box .dplayer-comment-setting-type .dplayer-comment-setting-title{margin-bottom:6px}.dplayer-comment-setting-box .dplayer-comment-setting-size label:nth-child(2) span,.dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(2) span{border-radius:4px 0 0 4px}.dplayer-comment-setting-box .dplayer-comment-setting-size label:nth-child(4) span,.dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(4) span{border-radius:0 4px 4px 0}.dplayer-comment-setting-box .dplayer-comment-setting-size span,.dplayer-comment-setting-box .dplayer-comment-setting-type span{border:1px solid #fff;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-size:12px;line-height:16px;margin-right:-1px;padding:4px 6px;text-align:center;width:33.6%}.dplayer-comment-setting-box .dplayer-comment-setting-size input:checked+span,.dplayer-comment-setting-box .dplayer-comment-setting-type input:checked+span{background:#e4e4e6;color:#1c1c1c}.dplayer-comment-setting-box .dplayer-comment-setting-color{font-size:0}.dplayer-comment-setting-box .dplayer-comment-setting-color .dplayer-comment-setting-color-list{display:flex;justify-content:space-between;padding:4px 0}.dplayer-comment-setting-box .dplayer-comment-setting-color .dplayer-comment-setting-color-list label{display:inline-block;font-size:0;padding:6px 0}.dplayer-comment-setting-box .dplayer-comment-setting-color .dplayer-comment-setting-color-list span{border-radius:50%;box-sizing:border-box;cursor:pointer;display:inline-block;height:22px;width:22px}.dplayer-comment-setting-box .dplayer-comment-setting-color .dplayer-comment-setting-color-list span:hover{animation:my-face 5s ease-in-out infinite}.dplayer-danmaku{aspect-ratio:16/9;bottom:0;color:#fff;font-family:inherit;font-size:29px;left:0;margin:auto;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0}.dplayer-danmaku .dplayer-danmaku-item{cursor:default;display:inline-block;font-size:var(--dplayer-danmaku-font-size);font-weight:700;opacity:var(--dplayer-danmaku-opacity);pointer-events:none;text-shadow:1.2px 1.2px 4px #000000e6;user-select:none;-webkit-user-select:none;white-space:nowrap}.dplayer-danmaku .dplayer-danmaku-item--demo{position:absolute;visibility:hidden}.dplayer-danmaku .dplayer-danmaku-item span{box-decoration-break:clone;-webkit-box-decoration-break:clone}.dplayer-danmaku .dplayer-danmaku-item.dplayer-danmaku-size-big{font-size:calc(var(--dplayer-danmaku-font-size)*1.25)}.dplayer-danmaku .dplayer-danmaku-item.dplayer-danmaku-size-small{font-size:calc(var(--dplayer-danmaku-font-size)*.8)}.dplayer-danmaku .dplayer-danmaku-right{position:absolute;right:0;transform:translateX(100%)}.dplayer-danmaku .dplayer-danmaku-right.dplayer-danmaku-move{animation-name:danmaku;animation-play-state:paused;animation-timing-function:linear}@keyframes danmaku{0%{transform:translateX(100%)}}.dplayer-danmaku .dplayer-danmaku-bottom,.dplayer-danmaku .dplayer-danmaku-top{left:50%;position:absolute;transform:translateX(-50%);visibility:hidden}.dplayer-danmaku .dplayer-danmaku-bottom.dplayer-danmaku-move,.dplayer-danmaku .dplayer-danmaku-top.dplayer-danmaku-move{animation-name:danmaku-center;animation-play-state:paused;animation-timing-function:linear}@keyframes danmaku-center{0%{visibility:visible}to{visibility:visible}}.dplayer-logo{left:20px;max-height:50px;max-width:50px;pointer-events:none;position:absolute;top:20px}.dplayer-logo img{background:none;max-height:100%;max-width:100%}.dplayer-menu{background:#1c1c1cd9;border-radius:2px;display:none;overflow:hidden;padding:5px 0;position:absolute;width:170px;z-index:3}.dplayer-menu.dplayer-menu-show{display:block}.dplayer-menu .dplayer-menu-item{box-sizing:border-box;cursor:pointer;height:30px}.dplayer-menu .dplayer-menu-item:hover{background-color:#ffffff1a}.dplayer-menu .dplayer-menu-item a{box-sizing:border-box;color:#eee;display:inline-block;font-size:13px;line-height:30px;overflow:hidden;padding:0 10px;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap;width:100%}.dplayer-menu .dplayer-menu-item a:hover{text-decoration:none}.dplayer-notice{background:#1c1c1ce6;border-radius:4px;bottom:68px;color:#fff;font-size:14px;left:20px;line-height:1.6;margin-right:20px;opacity:0;overflow:hidden;padding:12px 18px;pointer-events:none;position:absolute;transition:all .3s ease-in-out,color 0s}@media(max-width:500px){.dplayer-notice{bottom:auto!important;top:10px}}.dplayer-subtitle{bottom:40px;color:#fff;font-size:20px;left:5%;position:absolute;text-align:center;text-shadow:.5px .5px .5px #00000080;width:90%}.dplayer-subtitle.dplayer-subtitle-hide{display:none}.dplayer-mask{bottom:0;display:none;left:0;position:absolute;right:0;top:0;z-index:1}.dplayer-mask.dplayer-mask-show{display:block}.dplayer-video-wrap{align-items:center;background:#000;display:flex;font-size:0;height:100%;justify-content:center;position:relative;width:100%}.dplayer-video-wrap .dplayer-video-wrap-aspect{aspect-ratio:16/9;max-height:100%;max-width:100%;overflow:hidden;position:relative}.dplayer-video-wrap .dplayer-video-wrap-aspect .dplayer-video{display:none;max-height:100%;max-width:100%;width:99999px}.dplayer-video-wrap .dplayer-video-wrap-aspect .dplayer-video-current{display:block}.dplayer-video-wrap .dplayer-video-wrap-aspect .dplayer-video-prepare{display:none}.dplayer-info-panel{background:#1c1c1ccc;border-radius:2px;color:#fff;font-size:12px;left:10px;padding:10px;position:absolute;top:10px;width:450px}.dplayer-info-panel-hide{display:none}.dplayer-info-panel .dplayer-info-panel-close{cursor:pointer;position:absolute;right:10px;top:10px}.dplayer-info-panel .dplayer-info-panel-item>span{display:inline-block;line-height:15px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.dplayer-info-panel .dplayer-info-panel-item-title{margin-right:10px;text-align:right;width:100px}.dplayer-info-panel .dplayer-info-panel-item-data{width:320px}`, \\\"\\\",{\\\"version\\\":3,\\\"sources\\\":[\\\"webpack://./src/css/balloon.scss\\\",\\\"webpack://./src/css/global.scss\\\",\\\"webpack://./src/css/player.scss\\\",\\\"webpack://./src/css/bezel.scss\\\",\\\"webpack://./src/css/controller.scss\\\",\\\"webpack://./src/css/danmaku.scss\\\",\\\"webpack://./src/css/logo.scss\\\",\\\"webpack://./src/css/menu.scss\\\",\\\"webpack://./src/css/notice.scss\\\",\\\"webpack://./src/css/subtitle.scss\\\",\\\"webpack://./src/css/video.scss\\\",\\\"webpack://./src/css/info-panel.scss\\\"],\\\"names\\\":[],\\\"mappings\\\":\\\"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\\\",\\\"sourcesContent\\\":[\\\"@import '../../node_modules/balloon-css/balloon.css';\\\\n\\\\n.dplayer [aria-label] {\\\\n    --balloon-font-size: 11.5px;\\\\n}\\\\n\\\\n.dplayer [aria-label]:before {\\\\n    display: none;\\\\n}\\\\n\\\\n.dplayer [aria-label]:after {\\\\n    padding: .3em .8em !important;\\\\n    background: rgba(17, 17, 17, 0.7) !important;\\\\n    font-family: inherit !important;\\\\n}\\\\n\\\\n.dplayer [aria-label][data-balloon-pos=\\\\\\\"up\\\\\\\"]:after {\\\\n    margin-bottom: 0 !important;\\\\n}\\\\n\\\",\\\"@keyframes my-face {\\\\n    2% {\\\\n        transform: translate(0, 1.5px) rotate(1.5deg);\\\\n    }\\\\n    4% {\\\\n        transform: translate(0, -1.5px) rotate(-0.5deg);\\\\n    }\\\\n    6% {\\\\n        transform: translate(0, 1.5px) rotate(-1.5deg);\\\\n    }\\\\n    8% {\\\\n        transform: translate(0, -1.5px) rotate(-1.5deg);\\\\n    }\\\\n    10% {\\\\n        transform: translate(0, 2.5px) rotate(1.5deg);\\\\n    }\\\\n    12% {\\\\n        transform: translate(0, -0.5px) rotate(1.5deg);\\\\n    }\\\\n    14% {\\\\n        transform: translate(0, -1.5px) rotate(1.5deg);\\\\n    }\\\\n    16% {\\\\n        transform: translate(0, -0.5px) rotate(-1.5deg);\\\\n    }\\\\n    18% {\\\\n        transform: translate(0, 0.5px) rotate(-1.5deg);\\\\n    }\\\\n    20% {\\\\n        transform: translate(0, -1.5px) rotate(2.5deg);\\\\n    }\\\\n    22% {\\\\n        transform: translate(0, 0.5px) rotate(-1.5deg);\\\\n    }\\\\n    24% {\\\\n        transform: translate(0, 1.5px) rotate(1.5deg);\\\\n    }\\\\n    26% {\\\\n        transform: translate(0, 0.5px) rotate(0.5deg);\\\\n    }\\\\n    28% {\\\\n        transform: translate(0, 0.5px) rotate(1.5deg);\\\\n    }\\\\n    30% {\\\\n        transform: translate(0, -0.5px) rotate(2.5deg);\\\\n    }\\\\n    32% {\\\\n        transform: translate(0, 1.5px) rotate(-0.5deg);\\\\n    }\\\\n    34% {\\\\n        transform: translate(0, 1.5px) rotate(-0.5deg);\\\\n    }\\\\n    36% {\\\\n        transform: translate(0, -1.5px) rotate(2.5deg);\\\\n    }\\\\n    38% {\\\\n        transform: translate(0, 1.5px) rotate(-1.5deg);\\\\n    }\\\\n    40% {\\\\n        transform: translate(0, -0.5px) rotate(2.5deg);\\\\n    }\\\\n    42% {\\\\n        transform: translate(0, 2.5px) rotate(-1.5deg);\\\\n    }\\\\n    44% {\\\\n        transform: translate(0, 1.5px) rotate(0.5deg);\\\\n    }\\\\n    46% {\\\\n        transform: translate(0, -1.5px) rotate(2.5deg);\\\\n    }\\\\n    48% {\\\\n        transform: translate(0, -0.5px) rotate(0.5deg);\\\\n    }\\\\n    50% {\\\\n        transform: translate(0, 0.5px) rotate(0.5deg);\\\\n    }\\\\n    52% {\\\\n        transform: translate(0, 2.5px) rotate(2.5deg);\\\\n    }\\\\n    54% {\\\\n        transform: translate(0, -1.5px) rotate(1.5deg);\\\\n    }\\\\n    56% {\\\\n        transform: translate(0, 2.5px) rotate(2.5deg);\\\\n    }\\\\n    58% {\\\\n        transform: translate(0, 0.5px) rotate(2.5deg);\\\\n    }\\\\n    60% {\\\\n        transform: translate(0, 2.5px) rotate(2.5deg);\\\\n    }\\\\n    62% {\\\\n        transform: translate(0, -0.5px) rotate(2.5deg);\\\\n    }\\\\n    64% {\\\\n        transform: translate(0, -0.5px) rotate(1.5deg);\\\\n    }\\\\n    66% {\\\\n        transform: translate(0, 1.5px) rotate(-0.5deg);\\\\n    }\\\\n    68% {\\\\n        transform: translate(0, -1.5px) rotate(-0.5deg);\\\\n    }\\\\n    70% {\\\\n        transform: translate(0, 1.5px) rotate(0.5deg);\\\\n    }\\\\n    72% {\\\\n        transform: translate(0, 2.5px) rotate(1.5deg);\\\\n    }\\\\n    74% {\\\\n        transform: translate(0, -0.5px) rotate(0.5deg);\\\\n    }\\\\n    76% {\\\\n        transform: translate(0, -0.5px) rotate(2.5deg);\\\\n    }\\\\n    78% {\\\\n        transform: translate(0, -0.5px) rotate(1.5deg);\\\\n    }\\\\n    80% {\\\\n        transform: translate(0, 1.5px) rotate(1.5deg);\\\\n    }\\\\n    82% {\\\\n        transform: translate(0, -0.5px) rotate(0.5deg);\\\\n    }\\\\n    84% {\\\\n        transform: translate(0, 1.5px) rotate(2.5deg);\\\\n    }\\\\n    86% {\\\\n        transform: translate(0, -1.5px) rotate(-1.5deg);\\\\n    }\\\\n    88% {\\\\n        transform: translate(0, -0.5px) rotate(2.5deg);\\\\n    }\\\\n    90% {\\\\n        transform: translate(0, 2.5px) rotate(-0.5deg);\\\\n    }\\\\n    92% {\\\\n        transform: translate(0, 0.5px) rotate(-0.5deg);\\\\n    }\\\\n    94% {\\\\n        transform: translate(0, 2.5px) rotate(0.5deg);\\\\n    }\\\\n    96% {\\\\n        transform: translate(0, -0.5px) rotate(1.5deg);\\\\n    }\\\\n    98% {\\\\n        transform: translate(0, -1.5px) rotate(-0.5deg);\\\\n    }\\\\n    0%,\\\\n    100% {\\\\n        transform: translate(0, 0) rotate(0deg);\\\\n    }\\\\n}\\\\n\\\",\\\".dplayer {\\\\n    position: relative;\\\\n    overflow: hidden;\\\\n    user-select: none;\\\\n    -webkit-user-select: none;\\\\n    line-height: 1;\\\\n\\\\n    * {\\\\n        box-sizing: content-box;\\\\n    }\\\\n\\\\n    svg {\\\\n        width: 100%;\\\\n        height: 100%;\\\\n\\\\n        path,\\\\n        circle {\\\\n            fill: #fff;\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-fulled, &.dplayer-fulled-browser {\\\\n        width: 100% !important;\\\\n        height: 100% !important;\\\\n        background: #000;\\\\n        position: fixed;\\\\n        z-index: 100000;\\\\n        left: 0;\\\\n        top: 0;\\\\n        margin: 0;\\\\n        padding: 0;\\\\n        transform: translate(0, 0);\\\\n    }\\\\n\\\\n    &.dplayer-no-danmaku {\\\\n        .dplayer-setting-box {\\\\n            .dplayer-setting-showdan,\\\\n            .dplayer-setting-danmaku,\\\\n            .dplayer-setting-danunlimit {\\\\n                display: none;\\\\n            }\\\\n        }\\\\n\\\\n        .dplayer-controller .dplayer-icons .dplayer-comment {\\\\n            display: none;\\\\n        }\\\\n\\\\n        .dplayer-danmaku {\\\\n            display: none;\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-no-audio-switching {\\\\n        .dplayer-setting-box {\\\\n            .dplayer-setting-audio {\\\\n                display: none;\\\\n            }\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-live {\\\\n        .dplayer-time {\\\\n            display: none;\\\\n        }\\\\n        .dplayer-bar-wrap {\\\\n            display: none;\\\\n        }\\\\n        .dplayer-notice {\\\\n            bottom: 56px;\\\\n        }\\\\n        .dplayer-setting-speed {\\\\n            display: none;\\\\n        }\\\\n        .dplayer-setting-loop {\\\\n            display: none;\\\\n        }\\\\n        .dplayer-controller .dplayer-icons .dplayer-setting-box {\\\\n            height: auto;\\\\n            overflow-y: hidden;\\\\n        }\\\\n        .dplayer-mobile-icon-backward, .dplayer-mobile-icon-forward {\\\\n            display: none;\\\\n        }\\\\n\\\\n        .dplayer-setting-box, .dplayer-comment-setting-box {\\\\n            bottom: 58px;\\\\n            max-height: calc(100% - 58px - 8px);\\\\n        }\\\\n        &.dplayer-mobile {\\\\n            .dplayer-setting-box, .dplayer-comment-setting-box {\\\\n                bottom: 52px;\\\\n                max-height: calc(100% - 52px - 8px);\\\\n            }\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-narrow {\\\\n        .dplayer-danmaku {\\\\n            font-size: 18px;\\\\n        }\\\\n        .dplayer-icon {\\\\n            margin: 0 -3px;\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-playing {\\\\n        .dplayer-danmaku .dplayer-danmaku-move {\\\\n            animation-play-state: running;\\\\n        }\\\\n\\\\n        .dplayer-controller-mask {\\\\n            opacity: 0;\\\\n        }\\\\n        .dplayer-controller {\\\\n            opacity: 0;\\\\n        }\\\\n\\\\n        &:hover {\\\\n            .dplayer-controller-mask {\\\\n                opacity: 1;\\\\n            }\\\\n            .dplayer-controller {\\\\n                opacity: 1;\\\\n            }\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-loading {\\\\n        .dplayer-bezel .dplayer-loading-icon {\\\\n            display: block;\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-loading,\\\\n    &.dplayer-paused {\\\\n        .dplayer-danmaku,\\\\n        .dplayer-danmaku-move {\\\\n            animation-play-state: paused;\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-show-controller {\\\\n        .dplayer-controller-mask {\\\\n            opacity: 1;\\\\n        }\\\\n        .dplayer-controller {\\\\n            opacity: 1;\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-fulled {\\\\n        position: fixed !important;\\\\n        z-index: 100000;\\\\n        left: 0;\\\\n        top: 0;\\\\n        width: 100% !important;\\\\n        height: 100% !important;\\\\n\\\\n        &.dplayer-hide-controller {\\\\n            cursor: none;\\\\n            .dplayer-controller-mask {\\\\n                opacity: 0 !important;\\\\n            }\\\\n            .dplayer-controller {\\\\n                opacity: 0 !important;\\\\n            }\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-fulled-browser {\\\\n        &.dplayer-hide-controller {\\\\n            cursor: none;\\\\n            .dplayer-controller-mask {\\\\n                opacity: 0 !important;\\\\n            }\\\\n            .dplayer-controller {\\\\n                opacity: 0 !important;\\\\n            }\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-mobile {\\\\n        .dplayer-controller {\\\\n            height: 44px;\\\\n            .dplayer-icons {\\\\n                padding-top: 3px;\\\\n                padding-bottom: 3px;\\\\n                .dplayer-volume,\\\\n                .dplayer-airplay-icon,\\\\n                .dplayer-play-icon {\\\\n                    display: none;\\\\n                }\\\\n                .dplayer-full .dplayer-full-in-icon {\\\\n                    position: static;\\\\n                    display: inline-block;\\\\n                }\\\\n                .dplayer-full .dplayer-pip-icon {\\\\n                    position: static;\\\\n                    display: inline-block;\\\\n                }\\\\n            }\\\\n        }\\\\n\\\\n        .dplayer-controller-mask {\\\\n            background: linear-gradient(rgba(0, 0, 0, 0.55) 78%, rgba(0, 0, 0, 0.8) 100%);\\\\n            height: 100%;\\\\n        }\\\\n\\\\n        &.dplayer-playing {\\\\n            .dplayer-controller-mask {\\\\n                opacity: 1;\\\\n            }\\\\n            .dplayer-controller {\\\\n                opacity: 1;\\\\n            }\\\\n        }\\\\n\\\\n        &.dplayer-hide-controller {\\\\n            .dplayer-controller-mask {\\\\n                opacity: 0;\\\\n            }\\\\n            .dplayer-controller {\\\\n                opacity: 0;\\\\n                transform: translateY(100%);\\\\n            }\\\\n        }\\\\n\\\\n        .dplayer-bar-wrap {\\\\n            bottom: 35px;\\\\n            .dplayer-bar-time {\\\\n                display: none;\\\\n            }\\\\n        }\\\\n\\\\n        .dplayer-setting-box, .dplayer-comment-setting-box {\\\\n            bottom: 58px;\\\\n            max-height: calc(100% - 58px - 8px);\\\\n        }\\\\n\\\\n        &.dplayer-hide-controller {\\\\n            .dplayer-mobile-icon-wrap {\\\\n                visibility: hidden;\\\\n                opacity: 0;\\\\n            }\\\\n        }\\\\n\\\\n        .dplayer-mobile-icon-wrap {\\\\n            visibility: visible;\\\\n            opacity: 0.7;\\\\n        }\\\\n    }\\\\n}\\\\n\\\\n// To hide scroll bar, apply this class to <body>\\\\n.dplayer-web-fullscreen-fix {\\\\n    position: fixed;\\\\n    top: 0;\\\\n    left: 0;\\\\n    margin: 0;\\\\n    padding: 0;\\\\n}\\\\n\\\",\\\".dplayer-bezel {\\\\n    position: absolute;\\\\n    left: 0;\\\\n    right: 0;\\\\n    top: 0;\\\\n    bottom: 0;\\\\n    font-size: 22px;\\\\n    color: #fff;\\\\n    pointer-events: none;\\\\n    .dplayer-bezel-icon {\\\\n        position: absolute;\\\\n        top: 50%;\\\\n        left: 50%;\\\\n        margin: -26px 0 0 -26px;\\\\n        height: 52px;\\\\n        width: 52px;\\\\n        padding: 12px;\\\\n        box-sizing: border-box;\\\\n        background: rgba(0, 0, 0, .5);\\\\n        border-radius: 50%;\\\\n        opacity: 0;\\\\n        pointer-events: none;\\\\n        will-change: transform;\\\\n        &.dplayer-bezel-transition {\\\\n            animation: bezel-hide .5s linear;\\\\n        }\\\\n        @keyframes bezel-hide {\\\\n            from {\\\\n                opacity: 1;\\\\n                transform: scale(1);\\\\n            }\\\\n            to {\\\\n                opacity: 0;\\\\n                transform: scale(2);\\\\n            }\\\\n        }\\\\n    }\\\\n    .dplayer-danloading {\\\\n        position: absolute;\\\\n        top: 50%;\\\\n        margin-top: -7px;\\\\n        width: 100%;\\\\n        text-align: center;\\\\n        font-size: 14px;\\\\n        line-height: 14px;\\\\n        animation: my-face 5s infinite ease-in-out;\\\\n    }\\\\n    .dplayer-loading-icon {\\\\n        display: none;\\\\n        position: absolute;\\\\n        top: 50%;\\\\n        left: 50%;\\\\n        margin: -18px 0 0 -18px;\\\\n        height: 36px;\\\\n        width: 36px;\\\\n        pointer-events: none;\\\\n        .dplayer-loading-hide {\\\\n            display: none;\\\\n        }\\\\n        .dplayer-loading-dot {\\\\n            animation: dplayer-loading-dot-fade .8s ease infinite;\\\\n            opacity: 0;\\\\n            transform-origin: 4px 4px;\\\\n            will-change: transform;\\\\n            @for $i from 7 through 1 {\\\\n                &.dplayer-loading-dot-#{$i} {\\\\n                    animation-delay: .1s * $i;\\\\n                }\\\\n            }\\\\n        }\\\\n        @keyframes dplayer-loading-dot-fade {\\\\n            0% {\\\\n                opacity: .7;\\\\n                transform: scale(1.2, 1.2);\\\\n            }\\\\n            50% {\\\\n                opacity: .25;\\\\n                transform: scale(.9, .9);\\\\n            }\\\\n            to {\\\\n                opacity: .25;\\\\n                transform: scale(.85, .85);\\\\n            }\\\\n        }\\\\n    }\\\\n}\\\\n\\\",\\\"\\\\n.dplayer-controller-mask {\\\\n    position: absolute;\\\\n    width: 100%;\\\\n    height: 98px;\\\\n    bottom: 0;\\\\n    background: linear-gradient(rgba(0, 0, 0, 0.0) 15%, rgba(0, 0, 0, 0.7) 100%);\\\\n    transition: all 0.3s ease;\\\\n}\\\\n\\\\n.dplayer-controller {\\\\n    position: absolute;\\\\n    bottom: 0;\\\\n    left: 0;\\\\n    right: 0;\\\\n    height: 50px;\\\\n    padding: 0 20px;\\\\n    user-select: none;\\\\n    -webkit-user-select: none;\\\\n    transition: all 0.3s ease;\\\\n    &.dplayer-controller-comment {\\\\n        .dplayer-icons {\\\\n            display: none;\\\\n        }\\\\n        .dplayer-icons.dplayer-comment-box {\\\\n            display: block;\\\\n        }\\\\n    }\\\\n    .dplayer-bar-wrap {\\\\n        position: absolute;\\\\n        width: calc(100% - 40px);\\\\n        height: 3px;\\\\n        bottom: 41px;\\\\n        padding: 10px 0;\\\\n        cursor: pointer;\\\\n        -webkit-tap-highlight-color: transparent;\\\\n        // for preload thumbnails\\\\n        // ref: https://stackoverflow.com/a/14390213/17124142\\\\n        &:after {\\\\n            // load thumbnails (if exists)\\\\n            content: var(--thumbnail-url);\\\\n            // hide the element\\\\n            position: absolute;\\\\n            width: 0;\\\\n            height: 0;\\\\n            overflow: hidden;\\\\n            z-index: -1;\\\\n        }\\\\n        &:hover {\\\\n            .dplayer-bar .dplayer-played .dplayer-thumb {\\\\n                transform: scale(1);\\\\n            }\\\\n            .dplayer-highlight {\\\\n                display: block;\\\\n                width: 8px;\\\\n                transform: translateX(-4px);\\\\n                top: 4px;\\\\n                height: 40%;\\\\n            }\\\\n        }\\\\n        .dplayer-highlight {\\\\n            z-index: 12;\\\\n            position: absolute;\\\\n            top: 5px;\\\\n            width: 6px;\\\\n            height: 20%;\\\\n            border-radius: 6px;\\\\n            background-color: #fff;\\\\n            text-align: center;\\\\n            transform: translateX(-3px);\\\\n            transition: all .2s ease-in-out;\\\\n            &:hover {\\\\n                .dplayer-highlight-text {\\\\n                    display: block;\\\\n                }\\\\n                &~.dplayer-bar-preview {\\\\n                    opacity: 0;\\\\n                }\\\\n                &~.dplayer-bar-time {\\\\n                    opacity: 0;\\\\n                }\\\\n            }\\\\n            .dplayer-highlight-text {\\\\n                display: none;\\\\n                position: absolute;\\\\n                left: 50%;\\\\n                top: -24px;\\\\n                padding: 5px 8px;\\\\n                background-color: rgba(0, 0, 0, .62);\\\\n                color: #fff;\\\\n                border-radius: 4px;\\\\n                font-size: 12px;\\\\n                white-space: nowrap;\\\\n                transform: translateX(-50%);\\\\n            }\\\\n        }\\\\n        .dplayer-bar-preview {\\\\n            display: none;\\\\n            position: absolute;\\\\n            aspect-ratio: 16 / 9;\\\\n            border-radius: 6px;\\\\n            background: #131313;\\\\n            background-image: var(--thumbnail-url);\\\\n            pointer-events: none;\\\\n            background-size: 16000px 100%;\\\\n            background-repeat: no-repeat;\\\\n            image-rendering: -webkit-optimize-contrast;\\\\n            image-rendering: crisp-edges;\\\\n            box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.3);\\\\n        }\\\\n        .dplayer-bar-time {\\\\n            &.hidden {\\\\n                opacity: 0;\\\\n            }\\\\n            position: absolute;\\\\n            left: 0px;\\\\n            top: -22px;\\\\n            border-radius: 4px;\\\\n            padding: 6.5px 7px;\\\\n            background-color: rgba(31, 31, 31, 0.85);\\\\n            color: #fff;\\\\n            font-size: 12px;\\\\n            text-align: center;\\\\n            opacity: 1;\\\\n            transition: opacity .1s ease-in-out;\\\\n            word-wrap: normal;\\\\n            word-break: normal;\\\\n            z-index: 2;\\\\n            pointer-events: none;\\\\n        }\\\\n        .dplayer-bar {\\\\n            position: relative;\\\\n            height: 4px;\\\\n            width: 100%;\\\\n            background: rgba(255, 255, 255, .2);\\\\n            cursor: pointer;\\\\n            .dplayer-loaded {\\\\n                position: absolute;\\\\n                left: 0;\\\\n                top: 0;\\\\n                bottom: 0;\\\\n                background: #fff;\\\\n                height: 4px;\\\\n                transition: all 0.5s ease;\\\\n                will-change: width;\\\\n            }\\\\n            .dplayer-played {\\\\n                position: absolute;\\\\n                left: 0;\\\\n                top: 0;\\\\n                bottom: 0;\\\\n                height: 4px;\\\\n                will-change: width;\\\\n                .dplayer-thumb {\\\\n                    position: absolute;\\\\n                    top: 0;\\\\n                    right: 5px;\\\\n                    margin-top: -4px;\\\\n                    margin-right: -10px;\\\\n                    height: 11px;\\\\n                    width: 11px;\\\\n                    border-radius: 50%;\\\\n                    cursor: pointer;\\\\n                    transition: all .3s ease-in-out;\\\\n                    transform: scale(0);\\\\n                }\\\\n            }\\\\n        }\\\\n    }\\\\n    .dplayer-icons {\\\\n        position: absolute;\\\\n        height: 38px;\\\\n        padding-top: 6px;\\\\n        padding-bottom: 6px;\\\\n        bottom: 0;\\\\n        -webkit-tap-highlight-color: transparent;\\\\n        &.dplayer-comment-box {\\\\n            display: none;\\\\n            position: absolute;\\\\n            transition: all .3s ease-in-out;\\\\n            z-index: 2;\\\\n            height: 38px;\\\\n            bottom: 0;\\\\n            left: 20px;\\\\n            right: 20px;\\\\n            color: #fff;\\\\n            .dplayer-icon {\\\\n                padding: 7px;\\\\n            }\\\\n            .dplayer-comment-setting-icon {\\\\n                position: absolute;\\\\n                left: 0;\\\\n                top: 0;\\\\n            }\\\\n            .dplayer-send-icon {\\\\n                position: absolute;\\\\n                right: 0;\\\\n                top: 0;\\\\n                &[aria-label]:after {\\\\n                    left: 14%;\\\\n                }\\\\n            }\\\\n            .dplayer-comment-input {\\\\n                outline: none;\\\\n                border: none;\\\\n                padding: 8px 0px;\\\\n                font-size: 14px;\\\\n                font-family: inherit;\\\\n                line-height: 18px;\\\\n                text-align: center;\\\\n                border-radius: 4px;\\\\n                background: none;\\\\n                margin: 0;\\\\n                height: 100%;\\\\n                box-sizing: border-box;\\\\n                width: 100%;\\\\n                color: #fff;\\\\n                &::placeholder {\\\\n                    color: #fff;\\\\n                    opacity: 0.8;\\\\n                }\\\\n                &::-moz-focus-inner {\\\\n                    border: 0;\\\\n                }\\\\n                &::-ms-clear {\\\\n                    display: none;\\\\n                }\\\\n            }\\\\n            @media (max-width: 350px){\\\\n                .dplayer-comment-setting-box {\\\\n                    padding: 9px 10px 15px;\\\\n                    .dplayer-comment-setting-title {\\\\n                        font-size: 12px;\\\\n                        line-height: 24px;\\\\n                    }\\\\n                }\\\\n                .dplayer-comment-input {\\\\n                    font-size: 12px;\\\\n                }\\\\n            }\\\\n        }\\\\n        &.dplayer-icons-left {\\\\n            .dplayer-icon {\\\\n                padding: 7px;\\\\n            }\\\\n            @media (max-width: 500px){\\\\n                .dplayer-icon {\\\\n                    padding-top: 6px;\\\\n                }\\\\n            }\\\\n            @media (max-width: 350px){\\\\n                .dplayer-icon {\\\\n                    padding-top: 7px;\\\\n                }\\\\n            }\\\\n        }\\\\n        &.dplayer-icons-right {\\\\n            right: 20px;\\\\n            .dplayer-icon {\\\\n                padding: 8px;\\\\n                @media (max-width: 500px){\\\\n                    & {\\\\n                        width: 38px;\\\\n                        padding: 7px;\\\\n                    }\\\\n                }\\\\n                @media (max-width: 350px){\\\\n                    & {\\\\n                        width: 31px;\\\\n                        padding: 5px;\\\\n                    }\\\\n                }\\\\n            }\\\\n        }\\\\n        .dplayer-time {\\\\n            line-height: 38px;\\\\n            color: #eee;\\\\n            text-shadow: 0 0 2px rgba(0, 0, 0, .5);\\\\n            vertical-align: middle;\\\\n            font-size: 13px;\\\\n            font-family: inherit;\\\\n            @media (max-width: 350px){\\\\n                & {\\\\n                    font-size: 12px;\\\\n                }\\\\n            }\\\\n        }\\\\n        .dplayer-live-badge {\\\\n            line-height: 18px;\\\\n            color: #eee;\\\\n            text-shadow: 0 0 2px rgba(0, 0, 0, .5);\\\\n            vertical-align: middle;\\\\n            font-size: 13px;\\\\n            cursor: pointer;\\\\n            font-family: inherit;\\\\n            height: 100%;\\\\n            display: inline-flex;\\\\n            align-items: center;\\\\n        }\\\\n        .dplayer-live-dot {\\\\n            display: inline-block;\\\\n            width: 6px;\\\\n            height: 6px;\\\\n            vertical-align: 4%;\\\\n            margin-right: 5px;\\\\n            content: '';\\\\n            border-radius: 6px;\\\\n        }\\\\n        .dplayer-icon {\\\\n            width: 40px;\\\\n            height: 100%;\\\\n            border: none;\\\\n            background-color: transparent;\\\\n            line-height: 18px;\\\\n            outline: none;\\\\n            cursor: pointer;\\\\n            vertical-align: middle;\\\\n            box-sizing: border-box;\\\\n            display: inline-block;\\\\n            .dplayer-icon-content {\\\\n                transition: all .2s ease-in-out;\\\\n                opacity: .8;\\\\n            }\\\\n            &:hover {\\\\n                .dplayer-icon-content {\\\\n                    opacity: 1;\\\\n                }\\\\n            }\\\\n            &::-moz-focus-inner {\\\\n                border: 0;\\\\n            }\\\\n            &.dplayer-comment-icon {\\\\n                padding: 10.5px 9.5px 8px;\\\\n                @media (max-width: 500px){\\\\n                    & {\\\\n                        padding: 9px 9px 8px;\\\\n                    }\\\\n                }\\\\n                @media (max-width: 350px){\\\\n                    & {\\\\n                        padding: 6.5px 6.5px 6px;\\\\n                    }\\\\n                }\\\\n            }\\\\n            &.dplayer-volume-icon {\\\\n                width: 43px;\\\\n            }\\\\n            &.dplayer-full-icon[aria-label]:after {\\\\n                left: 1%;\\\\n            }\\\\n            @media (max-width: 350px){\\\\n                & {\\\\n                    width: 35px;\\\\n                }\\\\n            }\\\\n        }\\\\n        .dplayer-volume {\\\\n            position: relative;\\\\n            display: inline-block;\\\\n            cursor: pointer;\\\\n            height: 100%;\\\\n            &:hover {\\\\n                .dplayer-volume-bar-wrap .dplayer-volume-bar {\\\\n                    width: 45px;\\\\n                }\\\\n                .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb {\\\\n                    transform: scale(1);\\\\n                }\\\\n            }\\\\n            &.dplayer-volume-active {\\\\n                .dplayer-volume-bar-wrap .dplayer-volume-bar {\\\\n                    width: 45px;\\\\n                }\\\\n                .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb {\\\\n                    transform: scale(1);\\\\n                }\\\\n            }\\\\n            .dplayer-volume-bar-wrap {\\\\n                display: inline-block;\\\\n                margin: 0 10px 0 -5px;\\\\n                vertical-align: middle;\\\\n                height: 100%;\\\\n                .dplayer-volume-bar {\\\\n                    position: relative;\\\\n                    top: 17px;\\\\n                    width: 0;\\\\n                    height: 4px;\\\\n                    background: #FFF;\\\\n                    transition: all 0.3s ease-in-out;\\\\n                    .dplayer-volume-bar-inner {\\\\n                        position: absolute;\\\\n                        bottom: 0;\\\\n                        left: 0;\\\\n                        height: 100%;\\\\n                        transition: all 0.1s ease;\\\\n                        will-change: width;\\\\n                        .dplayer-thumb {\\\\n                            position: absolute;\\\\n                            top: 0;\\\\n                            right: 5px;\\\\n                            margin-top: -4px;\\\\n                            margin-right: -10px;\\\\n                            height: 11px;\\\\n                            width: 11px;\\\\n                            border-radius: 50%;\\\\n                            cursor: pointer;\\\\n                            transition: all .3s ease-in-out;\\\\n                            transform: scale(0);\\\\n                        }\\\\n                    }\\\\n                }\\\\n            }\\\\n        }\\\\n        .dplayer-subtitle-btn {\\\\n            display: inline-block;\\\\n            height: 100%;\\\\n        }\\\\n        .dplayer-setting {\\\\n            display: inline-block;\\\\n            height: 100%;\\\\n        }\\\\n        .dplayer-full {\\\\n            display: inline-block;\\\\n            height: 100%;\\\\n            position: relative;\\\\n        }\\\\n        .dplayer-comment {\\\\n            display: inline-block;\\\\n            height: 100%;\\\\n        }\\\\n    }\\\\n}\\\\n\\\\n.dplayer-mobile-icon-wrap {\\\\n    display: flex;\\\\n    align-items: center;\\\\n    justify-content: space-evenly;\\\\n    position: absolute;\\\\n    top: 50%;\\\\n    left: 50%;\\\\n    width: 100%;\\\\n    height: 50px;\\\\n    transform: translate(-50%, -50%);\\\\n    transition: all 0.28s ease;\\\\n    opacity: 0;\\\\n    visibility: hidden;\\\\n    pointer-events: none;\\\\n\\\\n    .dplayer-mobile-icon {\\\\n        width: 50px;\\\\n        height: 50px;\\\\n        border: none;\\\\n        background-color: transparent;\\\\n        -webkit-tap-highlight-color: transparent;\\\\n        filter: drop-shadow(0 0 7px rgba(0, 0, 0, 0.5));\\\\n        box-sizing: border-box;\\\\n        cursor: pointer;\\\\n        outline: none;\\\\n        pointer-events: auto;\\\\n\\\\n        &-backward, &-forward {\\\\n            padding: 12px;\\\\n        }\\\\n    }\\\\n}\\\\n\\\\n.dplayer-setting-box {\\\\n    display: flex;\\\\n    position: absolute;\\\\n    right: 20px;\\\\n    bottom: 64px;\\\\n    width: 210px;\\\\n    height: calc(100% - 64px - 8px);\\\\n    border-radius: 7px;\\\\n    background: rgba(28, 28, 28, 0.9);\\\\n    transition: all .25s ease;\\\\n    box-sizing: border-box;\\\\n    overflow-x: hidden;\\\\n    overflow-y: hidden;\\\\n    visibility: hidden;\\\\n    opacity: 0;\\\\n    z-index: 2;\\\\n    -webkit-tap-highlight-color: transparent;\\\\n    &>div {\\\\n        overflow-x: hidden;\\\\n        &.dplayer-setting-origin-panel {\\\\n            display: block;\\\\n        }\\\\n    }\\\\n    &.dplayer-setting-box-open {\\\\n        visibility: visible;\\\\n        opacity: 1;\\\\n    }\\\\n    &.dplayer-setting-box-quality {\\\\n        clip-path: inset(calc(100% - (30px * var(--quality-length)) - 54px) 0 0 round 7px) !important;\\\\n        .dplayer-setting-origin-panel {\\\\n            transform: translateX(-100%);\\\\n        }\\\\n        .dplayer-setting-quality-panel {\\\\n            display: block;\\\\n            transform: translateX(0%);\\\\n        }\\\\n    }\\\\n    &.dplayer-setting-box-speed {\\\\n        clip-path: inset(calc(100% - (30px * var(--speed-length)) - 54px) 0 0 round 7px) !important;\\\\n        .dplayer-setting-origin-panel {\\\\n            transform: translateX(-100%);\\\\n        }\\\\n        .dplayer-setting-speed-panel {\\\\n            display: block;\\\\n            transform: translateX(0%);\\\\n        }\\\\n    }\\\\n    &.dplayer-setting-box-audio {\\\\n        clip-path: inset(calc(100% - 114px) 0 0 round 7px) !important;\\\\n        .dplayer-setting-origin-panel {\\\\n            transform: translateX(-100%);\\\\n        }\\\\n        .dplayer-setting-audio-panel {\\\\n            display: block;\\\\n            transform: translateX(0%);\\\\n        }\\\\n    }\\\\n    .dplayer-label {\\\\n        display: inline-block;\\\\n        color: #eee;\\\\n        font-size: 13px;\\\\n        vertical-align: middle;\\\\n        white-space: nowrap;\\\\n    }\\\\n    .dplayer-label-value {\\\\n        display: inline-block;\\\\n        margin-left: auto;\\\\n        margin-right: 23px;\\\\n        color: #e0e0e0;\\\\n        font-size: 12px;\\\\n        vertical-align: middle;\\\\n        white-space: nowrap;\\\\n    }\\\\n    .dplayer-toggle {\\\\n        position: absolute;\\\\n        top: 5px;\\\\n        right: 7px;\\\\n        width: 20px;\\\\n        height: 20px;\\\\n        text-align: center;\\\\n        font-size: 0;\\\\n        vertical-align: middle;\\\\n        input {\\\\n            max-height: 0;\\\\n            max-width: 0;\\\\n            display: none;\\\\n        }\\\\n        input+label {\\\\n            display: inline-block;\\\\n            position: relative;\\\\n            right: 15px;\\\\n            width: 32px;\\\\n            height: 20px;\\\\n            border-radius: 10px;\\\\n            box-sizing: border-box;\\\\n            transition: .25s ease;\\\\n            box-shadow: rgb(223, 223, 223) 0 0 0 0 inset;\\\\n            border: 1px solid rgb(223, 223, 223);\\\\n            cursor: pointer;\\\\n        }\\\\n        input+label:before {\\\\n            content: \\\\\\\"\\\\\\\";\\\\n            position: absolute;\\\\n            display: block;\\\\n            height: 19px;\\\\n            width: 19px;\\\\n            top: -0.5px;\\\\n            left: -0.5px;\\\\n            border-radius: 15px;\\\\n            transition: .25s ease;\\\\n        }\\\\n        input+label:after {\\\\n            content: \\\\\\\"\\\\\\\";\\\\n            display: block;\\\\n            position: absolute;\\\\n            height: 18.1px;\\\\n            width: 18.1px;\\\\n            top: -0.1px;\\\\n            left: 0;\\\\n            border-radius: 15px;\\\\n            background: #fff;\\\\n            transition: .25s ease;\\\\n            box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);\\\\n        }\\\\n        input:checked+label {\\\\n            border-color: var(--theme-color);\\\\n        }\\\\n        input:checked+label:before {\\\\n            width: 31px;\\\\n            background: var(--theme-color);\\\\n        }\\\\n        input:checked+label:after {\\\\n            left: 12px;\\\\n        }\\\\n    }\\\\n    .dplayer-setting-origin-panel,\\\\n    .dplayer-setting-quality-panel,\\\\n    .dplayer-setting-speed-panel,\\\\n    .dplayer-setting-audio-panel {\\\\n        position: absolute;\\\\n        bottom: 0px;\\\\n        width: 100%;\\\\n        max-height: 100%;\\\\n        padding: 7px 0;\\\\n        transition: transform .25s ease;\\\\n        box-sizing: border-box;\\\\n        scrollbar-width: thin;\\\\n        overflow-y: auto;\\\\n        &::-webkit-scrollbar {\\\\n            width: 6px;\\\\n        }\\\\n        &::-webkit-scrollbar-thumb {\\\\n            background: rgba(255, 255, 255, .15);\\\\n        }\\\\n    }\\\\n    .dplayer-setting-origin-panel {\\\\n        transform: translateX(0%);\\\\n    }\\\\n    .dplayer-setting-quality-panel,\\\\n    .dplayer-setting-speed-panel,\\\\n    .dplayer-setting-audio-panel {\\\\n        transform: translateX(100%);\\\\n        .dplayer-setting-header {\\\\n            display: flex;\\\\n            align-items: center;\\\\n            height: 33px;\\\\n            padding-left: 5px;\\\\n            padding-bottom: 5px;\\\\n            margin-bottom: 7px;\\\\n            border-bottom: 2px solid rgba(255, 255, 255, .15);\\\\n            box-sizing: border-box;\\\\n            cursor: pointer;\\\\n        }\\\\n        .dplayer-setting-quality-item,\\\\n        .dplayer-setting-speed-item,\\\\n        .dplayer-setting-audio-item {\\\\n            padding: 5px;\\\\n            .dplayer-toggle {\\\\n                visibility: hidden;\\\\n            }\\\\n            &.dplayer-setting-quality-current .dplayer-toggle,\\\\n            &.dplayer-setting-speed-current .dplayer-toggle,\\\\n            &.dplayer-setting-audio-current .dplayer-toggle {\\\\n                visibility: visible;\\\\n            }\\\\n        }\\\\n        .dplayer-toggle {\\\\n            display: inline-block;\\\\n            position: static;\\\\n            width: 22px;\\\\n            margin-right: 6px;\\\\n        }\\\\n    }\\\\n    .dplayer-setting-item,\\\\n    .dplayer-setting-quality-item,\\\\n    .dplayer-setting-speed-item,\\\\n    .dplayer-setting-audio-item {\\\\n        display: flex;\\\\n        align-items: center;\\\\n        height: 30px;\\\\n        padding: 5px 10px;\\\\n        box-sizing: border-box;\\\\n        cursor: pointer;\\\\n        position: relative;\\\\n        &:hover {\\\\n            background-color: rgba(255, 255, 255, .1);\\\\n        }\\\\n    }\\\\n    .dplayer-setting-danmaku {\\\\n        padding: 5px 0;\\\\n        .dplayer-label {\\\\n            padding: 0 10px;\\\\n            display: inline;\\\\n        }\\\\n        .dplayer-label-value {\\\\n            margin-right: 18px;\\\\n            font-size: 12.5px;\\\\n        }\\\\n        &:hover {\\\\n            .dplayer-label, .dplayer-label-value {\\\\n                display: none;\\\\n            }\\\\n            .dplayer-danmaku-bar-wrap {\\\\n                display: inline-block;\\\\n            }\\\\n        }\\\\n        &.dplayer-setting-danmaku-active {\\\\n            .dplayer-label, .dplayer-label-value {\\\\n                display: none;\\\\n            }\\\\n            .dplayer-danmaku-bar-wrap {\\\\n                display: inline-block;\\\\n            }\\\\n        }\\\\n        .dplayer-danmaku-bar-wrap {\\\\n            padding: 0 10px;\\\\n            box-sizing: border-box;\\\\n            display: none;\\\\n            vertical-align: middle;\\\\n            height: 100%;\\\\n            width: 100%;\\\\n            .dplayer-danmaku-bar {\\\\n                position: relative;\\\\n                top: 8.5px;\\\\n                width: 100%;\\\\n                height: 3px;\\\\n                background: #fff;\\\\n                transition: all 0.3s ease-in-out;\\\\n                .dplayer-danmaku-bar-inner {\\\\n                    position: absolute;\\\\n                    bottom: 0;\\\\n                    left: 0;\\\\n                    height: 100%;\\\\n                    transition: all 0.05s ease;\\\\n                    will-change: width;\\\\n                    .dplayer-thumb {\\\\n                        position: absolute;\\\\n                        top: 0;\\\\n                        right: 5px;\\\\n                        margin-top: -4px;\\\\n                        margin-right: -10px;\\\\n                        height: 11px;\\\\n                        width: 11px;\\\\n                        border-radius: 50%;\\\\n                        cursor: pointer;\\\\n                        transition: all .3s ease-in-out;\\\\n                    }\\\\n                }\\\\n            }\\\\n        }\\\\n    }\\\\n}\\\\n\\\\n.dplayer-comment-setting-box {\\\\n    position: absolute;\\\\n    left: 20px;\\\\n    bottom: 64px;\\\\n    width: 255px;\\\\n    max-height: calc(100% - 64px - 8px);\\\\n    clip-path: inset(0 0 0 round 7px);\\\\n    border-radius: 7px;\\\\n    background: rgba(28, 28, 28, 0.9);\\\\n    padding: 10px 10px 16px;\\\\n    font-size: 14px;\\\\n    transition: all .25s ease;\\\\n    scrollbar-width: thin;\\\\n    visibility: hidden;\\\\n    opacity: 0;\\\\n    box-sizing: border-box;\\\\n    overflow-y: auto;\\\\n    z-index: 2;\\\\n    -webkit-tap-highlight-color: transparent;\\\\n    &::-webkit-scrollbar {\\\\n        width: 6px;\\\\n    }\\\\n    &::-webkit-scrollbar-thumb {\\\\n        background: rgba(255, 255, 255, .15);\\\\n    }\\\\n    &.dplayer-comment-setting-open {\\\\n        visibility: visible;\\\\n        opacity: 1;\\\\n    }\\\\n    input[type=radio] {\\\\n        display: none;\\\\n    }\\\\n    label {\\\\n        cursor: pointer;\\\\n    }\\\\n    .dplayer-comment-setting-title {\\\\n        font-size: 13px;\\\\n        color: #fff;\\\\n        line-height: 30px;\\\\n    }\\\\n    .dplayer-comment-setting-type, .dplayer-comment-setting-size {\\\\n        font-size: 0;\\\\n        &.dplayer-comment-setting-size {\\\\n            margin-top: 8px;\\\\n        }\\\\n        .dplayer-comment-setting-title {\\\\n            margin-bottom: 6px;\\\\n        }\\\\n        label {\\\\n            &:nth-child(2) {\\\\n                span {\\\\n                    border-radius: 4px 0 0 4px;\\\\n                }\\\\n            }\\\\n            &:nth-child(4) {\\\\n                span {\\\\n                    border-radius: 0 4px 4px 0;\\\\n                }\\\\n            }\\\\n        }\\\\n        span {\\\\n            width: 33.6%;\\\\n            padding: 4px 6px;\\\\n            line-height: 16px;\\\\n            display: inline-block;\\\\n            font-size: 12px;\\\\n            color: #fff;\\\\n            border: 1px solid #fff;\\\\n            margin-right: -1px;\\\\n            box-sizing: border-box;\\\\n            text-align: center;\\\\n            cursor: pointer;\\\\n        }\\\\n        input:checked+span {\\\\n            background: #E4E4E6;\\\\n            color: #1c1c1c;\\\\n        }\\\\n    }\\\\n    .dplayer-comment-setting-color {\\\\n        font-size: 0;\\\\n        .dplayer-comment-setting-color-list {\\\\n            display: flex;\\\\n            justify-content: space-between;\\\\n            padding: 4px 0px;\\\\n            label {\\\\n                display: inline-block;\\\\n                font-size: 0;\\\\n                padding: 6px 0px;\\\\n            }\\\\n            span {\\\\n                display: inline-block;\\\\n                width: 22px;\\\\n                height: 22px;\\\\n                border-radius: 50%;\\\\n                box-sizing: border-box;\\\\n                cursor: pointer;\\\\n                &:hover {\\\\n                    animation: my-face 5s infinite ease-in-out;\\\\n                }\\\\n            }\\\\n        }\\\\n    }\\\\n}\\\\n\\\",\\\".dplayer-danmaku {\\\\n    position: absolute;\\\\n    top: 0;\\\\n    left: 0;\\\\n    right: 0;\\\\n    bottom: 0;\\\\n    max-width: 100%;\\\\n    max-height: 100%;\\\\n    aspect-ratio: 16/9;\\\\n    margin: auto;\\\\n    font-size: 29px;\\\\n    font-family: inherit;\\\\n    color: #fff;\\\\n    overflow: hidden;\\\\n    .dplayer-danmaku-item {\\\\n        display: inline-block;\\\\n        font-weight: bold;\\\\n        font-size: var(--dplayer-danmaku-font-size);\\\\n        opacity: var(--dplayer-danmaku-opacity);\\\\n        white-space: nowrap;\\\\n        text-shadow: 1.2px 1.2px 4px rgba(0, 0, 0, 0.9);\\\\n        cursor: default;\\\\n        user-select: none;\\\\n        -webkit-user-select: none;\\\\n        pointer-events: none;\\\\n        &--demo {\\\\n            position: absolute;\\\\n            visibility: hidden;\\\\n        }\\\\n        span {\\\\n            box-decoration-break: clone;\\\\n            -webkit-box-decoration-break: clone;\\\\n        }\\\\n        &.dplayer-danmaku-size-big {\\\\n            font-size: calc(var(--dplayer-danmaku-font-size) * 1.25);\\\\n        }\\\\n        &.dplayer-danmaku-size-small {\\\\n            font-size: calc(var(--dplayer-danmaku-font-size) * 0.8);\\\\n        }\\\\n    }\\\\n    .dplayer-danmaku-right {\\\\n        position: absolute;\\\\n        right: 0;\\\\n        transform: translateX(100%);\\\\n        &.dplayer-danmaku-move {\\\\n            animation-name: danmaku;\\\\n            animation-timing-function: linear;\\\\n            animation-play-state: paused;\\\\n        }\\\\n    }\\\\n    @keyframes danmaku {\\\\n        from {\\\\n            transform: translateX(100%);\\\\n        }\\\\n    }\\\\n    .dplayer-danmaku-top,\\\\n    .dplayer-danmaku-bottom {\\\\n        position: absolute;\\\\n        left: 50%;\\\\n        transform: translateX(-50%);\\\\n        visibility: hidden;\\\\n        &.dplayer-danmaku-move {\\\\n            animation-name: danmaku-center;\\\\n            animation-timing-function: linear;\\\\n            animation-play-state: paused;\\\\n        }\\\\n    }\\\\n    @keyframes danmaku-center {\\\\n        from {\\\\n            visibility: visible;\\\\n        }\\\\n        to {\\\\n            visibility: visible;\\\\n        }\\\\n    }\\\\n}\\\\n\\\",\\\".dplayer-logo {\\\\n    pointer-events: none;\\\\n    position: absolute;\\\\n    left: 20px;\\\\n    top: 20px;\\\\n    max-width: 50px;\\\\n    max-height: 50px;\\\\n    img {\\\\n        max-width: 100%;\\\\n        max-height: 100%;\\\\n        background: none;\\\\n    }\\\\n}\\\\n\\\",\\\".dplayer-menu {\\\\n    position: absolute;\\\\n    width: 170px;\\\\n    border-radius: 2px;\\\\n    background: rgba(28, 28, 28, 0.85);\\\\n    padding: 5px 0;\\\\n    overflow: hidden;\\\\n    z-index: 3;\\\\n    display: none;\\\\n    &.dplayer-menu-show {\\\\n        display: block;\\\\n    }\\\\n    .dplayer-menu-item {\\\\n        height: 30px;\\\\n        box-sizing: border-box;\\\\n        cursor: pointer;\\\\n        &:hover {\\\\n            background-color: rgba(255, 255, 255, .1);\\\\n        }\\\\n        a {\\\\n            display: inline-block;\\\\n            padding: 0 10px;\\\\n            line-height: 30px;\\\\n            color: #eee;\\\\n            font-size: 13px;\\\\n            display: inline-block;\\\\n            vertical-align: middle;\\\\n            width: 100%;\\\\n            box-sizing: border-box;\\\\n            white-space: nowrap;\\\\n            text-overflow: ellipsis;\\\\n            overflow: hidden;\\\\n            &:hover {\\\\n                text-decoration: none;\\\\n            }\\\\n        }\\\\n    }\\\\n}\\\\n\\\",\\\".dplayer-notice {\\\\n    position: absolute;\\\\n    bottom: 68px;\\\\n    left: 20px;\\\\n    padding: 12px 18px;\\\\n    margin-right: 20px;\\\\n    border-radius: 4px;\\\\n    background: rgba(28, 28, 28, 0.9);\\\\n    color: #fff;\\\\n    font-size: 14px;\\\\n    line-height: 1.6;\\\\n    transition: all .3s ease-in-out, color 0s;\\\\n    opacity: 0;\\\\n    overflow: hidden;\\\\n    pointer-events: none;\\\\n}\\\\n@media (max-width: 500px){\\\\n    .dplayer-notice {\\\\n        top: 10px;\\\\n        bottom: auto !important;\\\\n    }\\\\n}\\\\n\\\",\\\".dplayer-subtitle {\\\\n    position: absolute;\\\\n    bottom: 40px;\\\\n    width: 90%;\\\\n    left: 5%;\\\\n    text-align: center;\\\\n    color: #fff;\\\\n    text-shadow: 0.5px 0.5px 0.5px rgba(0, 0, 0, 0.5);\\\\n    font-size: 20px;\\\\n    &.dplayer-subtitle-hide {\\\\n        display: none;\\\\n    }\\\\n}\\\\n\\\",\\\".dplayer-mask {\\\\n    position: absolute;\\\\n    top: 0;\\\\n    bottom: 0;\\\\n    left: 0;\\\\n    right: 0;\\\\n    z-index: 1;\\\\n    display: none;\\\\n    &.dplayer-mask-show {\\\\n        display: block;\\\\n    }\\\\n}\\\\n\\\\n.dplayer-video-wrap {\\\\n    display: flex;\\\\n    position: relative;\\\\n    align-items: center;\\\\n    justify-content: center;\\\\n    background: #000;\\\\n    font-size: 0;\\\\n    width: 100%;\\\\n    height: 100%;\\\\n\\\\n    .dplayer-video-wrap-aspect {\\\\n        position: relative;\\\\n        max-width: 100%;\\\\n        max-height: 100%;\\\\n        aspect-ratio: 16 / 9;\\\\n        overflow: hidden;\\\\n\\\\n        .dplayer-video {\\\\n            width: 99999px;  // magic!!\\\\n            max-width: 100%;\\\\n            max-height: 100%;\\\\n            display: none;\\\\n        }\\\\n        .dplayer-video-current {\\\\n            display: block;\\\\n        }\\\\n        .dplayer-video-prepare {\\\\n            display: none;\\\\n        }\\\\n    }\\\\n}\\\\n\\\",\\\".dplayer-info-panel {\\\\n    position: absolute;\\\\n    top: 10px;\\\\n    left: 10px;\\\\n    width: 450px;\\\\n    background: rgba(28, 28, 28, 0.8);\\\\n    padding: 10px;\\\\n    color: #fff;\\\\n    font-size: 12px;\\\\n    border-radius: 2px;\\\\n\\\\n    &-hide {\\\\n        display: none;\\\\n    }\\\\n\\\\n    .dplayer-info-panel-close {\\\\n        cursor: pointer;\\\\n        position: absolute;\\\\n        right: 10px;\\\\n        top: 10px;\\\\n    }\\\\n\\\\n    .dplayer-info-panel-item {\\\\n        & > span {\\\\n            display: inline-block;\\\\n            vertical-align: middle;\\\\n            line-height: 15px;\\\\n            white-space: nowrap;\\\\n            text-overflow: ellipsis;\\\\n            overflow: hidden;\\\\n        }\\\\n    }\\\\n\\\\n    .dplayer-info-panel-item-title {\\\\n        width: 100px;\\\\n        text-align: right;\\\\n        margin-right: 10px;\\\\n    }\\\\n\\\\n    .dplayer-info-panel-item-data {\\\\n        width: 320px;\\\\n    }\\\\n}\\\\n\\\"],\\\"sourceRoot\\\":\\\"\\\"}]);\\n// Exports\\nexport default ___CSS_LOADER_EXPORT___;\\n\",\"module.exports = \\\"<svg version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 22 22\\\\\\\"><svg x=\\\\\\\"7\\\\\\\" y=\\\\\\\"1\\\\\\\"><circle class=\\\\\\\"dplayer-loading-dot dplayer-loading-dot-0\\\\\\\" cx=\\\\\\\"4\\\\\\\" cy=\\\\\\\"4\\\\\\\" r=\\\\\\\"2\\\\\\\"></circle></svg><svg x=\\\\\\\"11\\\\\\\" y=\\\\\\\"3\\\\\\\"><circle class=\\\\\\\"dplayer-loading-dot dplayer-loading-dot-1\\\\\\\" cx=\\\\\\\"4\\\\\\\" cy=\\\\\\\"4\\\\\\\" r=\\\\\\\"2\\\\\\\"></circle></svg><svg x=\\\\\\\"13\\\\\\\" y=\\\\\\\"7\\\\\\\"><circle class=\\\\\\\"dplayer-loading-dot dplayer-loading-dot-2\\\\\\\" cx=\\\\\\\"4\\\\\\\" cy=\\\\\\\"4\\\\\\\" r=\\\\\\\"2\\\\\\\"></circle></svg><svg x=\\\\\\\"11\\\\\\\" y=\\\\\\\"11\\\\\\\"><circle class=\\\\\\\"dplayer-loading-dot dplayer-loading-dot-3\\\\\\\" cx=\\\\\\\"4\\\\\\\" cy=\\\\\\\"4\\\\\\\" r=\\\\\\\"2\\\\\\\"></circle></svg><svg x=\\\\\\\"7\\\\\\\" y=\\\\\\\"13\\\\\\\"><circle class=\\\\\\\"dplayer-loading-dot dplayer-loading-dot-4\\\\\\\" cx=\\\\\\\"4\\\\\\\" cy=\\\\\\\"4\\\\\\\" r=\\\\\\\"2\\\\\\\"></circle></svg><svg x=\\\\\\\"3\\\\\\\" y=\\\\\\\"11\\\\\\\"><circle class=\\\\\\\"dplayer-loading-dot dplayer-loading-dot-5\\\\\\\" cx=\\\\\\\"4\\\\\\\" cy=\\\\\\\"4\\\\\\\" r=\\\\\\\"2\\\\\\\"></circle></svg><svg x=\\\\\\\"1\\\\\\\" y=\\\\\\\"7\\\\\\\"><circle class=\\\\\\\"dplayer-loading-dot dplayer-loading-dot-6\\\\\\\" cx=\\\\\\\"4\\\\\\\" cy=\\\\\\\"4\\\\\\\" r=\\\\\\\"2\\\\\\\"></circle></svg><svg x=\\\\\\\"3\\\\\\\" y=\\\\\\\"3\\\\\\\"><circle class=\\\\\\\"dplayer-loading-dot dplayer-loading-dot-7\\\\\\\" cx=\\\\\\\"4\\\\\\\" cy=\\\\\\\"4\\\\\\\" r=\\\\\\\"2\\\\\\\"></circle></svg></svg>\\\"\",\"<div class=\\\"dplayer-mask\\\"></div>\\n<div class=\\\"dplayer-video-wrap\\\">\\n    <div class=\\\"dplayer-video-wrap-aspect\\\">\\n      {{ include './video.art' video }}\\n    </div>\\n    {{ if options.logo }}\\n    <div class=\\\"dplayer-logo\\\">\\n        <img src=\\\"{{ options.logo }}\\\">\\n    </div>\\n    {{ /if }}\\n    <div class=\\\"dplayer-danmaku\\\"{{ if options.danmaku && options.danmaku.bottom }} style=\\\"margin-bottom:{{ options.danmaku.bottom }}\\\"{{ /if }}>\\n        <div class=\\\"dplayer-danmaku-item dplayer-danmaku-item--demo\\\"></div>\\n    </div>\\n    <div class=\\\"dplayer-subtitle\\\"></div>\\n    <div class=\\\"dplayer-bezel\\\">\\n        <span class=\\\"dplayer-bezel-icon\\\"></span>\\n        <span class=\\\"dplayer-danloading\\\" style=\\\"display: none\\\">{{ tran('Danmaku is loading') }}</span>\\n        <span class=\\\"dplayer-loading-icon\\\">{{@ icons.loading }}</span>\\n    </div>\\n</div>\\n<div class=\\\"dplayer-controller-mask\\\"></div>\\n<div class=\\\"dplayer-controller\\\">\\n    <div class=\\\"dplayer-icons dplayer-comment-box\\\">\\n        <button class=\\\"dplayer-icon dplayer-comment-setting-icon\\\" aria-label=\\\"{{ tran('Setting') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n            <span class=\\\"dplayer-icon-content\\\">{{@ icons.pallette }}</span>\\n        </button>\\n        <input class=\\\"dplayer-comment-input\\\" type=\\\"search\\\" enterkeyhint=\\\"send\\\" placeholder=\\\"{{ tran('Input danmaku, hit Enter') }}\\\" spellcheck=\\\"false\\\" maxlength=\\\"60\\\">\\n        <button class=\\\"dplayer-icon dplayer-send-icon\\\" aria-label=\\\"{{ tran('Send') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n            <span class=\\\"dplayer-icon-content\\\">{{@ icons.send }}</span>\\n        </button>\\n    </div>\\n    <div class=\\\"dplayer-icons dplayer-icons-left\\\">\\n        <button class=\\\"dplayer-icon dplayer-play-icon\\\">\\n            <span class=\\\"dplayer-icon-content\\\">{{@ icons.play }}</span>\\n        </button>\\n        <div class=\\\"dplayer-volume\\\">\\n            <button class=\\\"dplayer-icon dplayer-volume-icon\\\">\\n                <span class=\\\"dplayer-icon-content\\\">{{@ icons.volumeDown }}</span>\\n            </button>\\n            <div class=\\\"dplayer-volume-bar-wrap\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n                <div class=\\\"dplayer-volume-bar\\\">\\n                    <div class=\\\"dplayer-volume-bar-inner\\\" style=\\\"background: {{ options.theme }};\\\">\\n                        <span class=\\\"dplayer-thumb\\\" style=\\\"background: {{ options.theme }};\\\"></span>\\n                    </div>\\n                </div>\\n            </div>\\n        </div>\\n        <span class=\\\"dplayer-time\\\">\\n            <span class=\\\"dplayer-ptime\\\">00:00</span> /\\n            <span class=\\\"dplayer-dtime\\\">00:00</span>\\n        </span>\\n        {{ if options.live }}\\n        <span class=\\\"dplayer-live-badge\\\" aria-label=\\\"{{ tran('Synchronize') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n            <span class=\\\"dplayer-icon-content\\\">\\n                <span class=\\\"dplayer-live-dot\\\" style=\\\"background: {{ options.theme }};\\\"></span>{{ tran('Live') }}\\n            </span>\\n        </span>\\n        {{ /if }}\\n    </div>\\n    <div class=\\\"dplayer-icons dplayer-icons-right\\\">\\n        {{ if options.screenshot }}\\n        <div class=\\\"dplayer-icon dplayer-camera-icon\\\" aria-label=\\\"{{ tran('Screenshot') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n            <span class=\\\"dplayer-icon-content\\\">{{@ icons.camera }}</span>\\n        </div>\\n        {{ /if }}\\n        {{ if options.airplay }}\\n        <div class=\\\"dplayer-icon dplayer-airplay-icon\\\" aria-label=\\\"{{ tran('AirPlay') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n            <span class=\\\"dplayer-icon-content\\\">{{@ icons.airplay }}</span>\\n        </div>\\n        {{ /if }}\\n        <div class=\\\"dplayer-comment\\\">\\n            <button class=\\\"dplayer-icon dplayer-comment-icon\\\" aria-label=\\\"{{ tran('Send danmaku') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n                <span class=\\\"dplayer-icon-content\\\">{{@ icons.comment }}</span>\\n            </button>\\n        </div>\\n        {{ if options.subtitle }}\\n        <div class=\\\"dplayer-subtitle-btn\\\">\\n            <button class=\\\"dplayer-icon dplayer-subtitle-icon\\\" aria-label=\\\"{{ tran('Hide subtitle') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n                <span class=\\\"dplayer-icon-content\\\">{{@ icons.subtitle }}</span>\\n            </button>\\n        </div>\\n        {{ /if }}\\n        <div class=\\\"dplayer-setting\\\">\\n            <button class=\\\"dplayer-icon dplayer-setting-icon\\\" aria-label=\\\"{{ tran('Setting') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n                <span class=\\\"dplayer-icon-content\\\">{{@ icons.setting }}</span>\\n            </button>\\n        </div>\\n        <div class=\\\"dplayer-full\\\">\\n            <button class=\\\"dplayer-icon dplayer-pip-icon\\\" aria-label=\\\"{{ tran('Picture-in-Picture') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n                <span class=\\\"dplayer-icon-content\\\">{{@ icons.pip }}</span>\\n            </button>\\n            <button class=\\\"dplayer-icon dplayer-full-in-icon\\\" aria-label=\\\"{{ tran('Web full screen') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n                <span class=\\\"dplayer-icon-content\\\">{{@ icons.fullWeb }}</span>\\n            </button>\\n            <button class=\\\"dplayer-icon dplayer-full-icon\\\" aria-label=\\\"{{ tran('Full screen') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n                <span class=\\\"dplayer-icon-content\\\">{{@ icons.full }}</span>\\n            </button>\\n        </div>\\n    </div>\\n    <div class=\\\"dplayer-bar-wrap\\\">\\n        <div class=\\\"dplayer-bar-time hidden\\\">00:00</div>\\n        <div class=\\\"dplayer-bar-preview\\\"></div>\\n        <div class=\\\"dplayer-bar\\\">\\n            <div class=\\\"dplayer-loaded\\\" style=\\\"width: 0;\\\"></div>\\n            <div class=\\\"dplayer-played\\\" style=\\\"width: 0; background: {{ options.theme }};\\\">\\n                <span class=\\\"dplayer-thumb\\\" style=\\\"background: {{ options.theme }};\\\"></span>\\n            </div>\\n        </div>\\n    </div>\\n</div>\\n<div class=\\\"dplayer-setting-box\\\" style=\\\"{{ options.video.quality ? `--quality-length:${options.video.quality.length};` : '' }} {{ options.playbackSpeed ? `--speed-length:${options.playbackSpeed.length};` : '' }}\\\">\\n    <div class=\\\"dplayer-setting-origin-panel\\\">\\n        {{ if options.video.quality }}\\n        <div class=\\\"dplayer-setting-item dplayer-setting-quality\\\">\\n            <span class=\\\"dplayer-label\\\">{{ tran('Quality') }}</span>\\n            <span class=\\\"dplayer-label-value\\\">{{ options.video.quality[options.video.defaultQuality].name }}</span>\\n            <div class=\\\"dplayer-toggle\\\">{{@ icons.right }}</div>\\n        </div>\\n        {{ /if }}\\n        <div class=\\\"dplayer-setting-item dplayer-setting-audio\\\">\\n            <span class=\\\"dplayer-label\\\">{{ tran('Audio') }}</span>\\n            <span class=\\\"dplayer-label-value\\\">{{ tran('Primary audio') }}</span>\\n            <div class=\\\"dplayer-toggle\\\">{{@ icons.right }}</div>\\n        </div>\\n        <div class=\\\"dplayer-setting-item dplayer-setting-speed\\\">\\n            <span class=\\\"dplayer-label\\\">{{ tran('Speed') }}</span>\\n            <span class=\\\"dplayer-label-value\\\">{{ tran('Normal') }}</span>\\n            <div class=\\\"dplayer-toggle\\\">{{@ icons.right }}</div>\\n        </div>\\n        <div class=\\\"dplayer-setting-item dplayer-setting-loop\\\">\\n            <span class=\\\"dplayer-label\\\">{{ tran('Loop') }}</span>\\n            <div class=\\\"dplayer-toggle\\\">\\n                <input class=\\\"dplayer-toggle-setting-input\\\" type=\\\"checkbox\\\" name=\\\"dplayer-toggle\\\">\\n                <label for=\\\"dplayer-toggle\\\" style=\\\"--theme-color:{{ options.theme }}\\\"></label>\\n            </div>\\n        </div>\\n        <div class=\\\"dplayer-setting-item dplayer-setting-showdan\\\">\\n            <span class=\\\"dplayer-label\\\">{{ tran('Show danmaku') }}</span>\\n            <div class=\\\"dplayer-toggle\\\">\\n                <input class=\\\"dplayer-showdan-setting-input\\\" type=\\\"checkbox\\\" name=\\\"dplayer-toggle-dan\\\">\\n                <label for=\\\"dplayer-toggle-dan\\\" style=\\\"--theme-color:{{ options.theme }}\\\"></label>\\n            </div>\\n        </div>\\n        <div class=\\\"dplayer-setting-item dplayer-setting-danunlimit\\\">\\n            <span class=\\\"dplayer-label\\\">{{ tran('Unlimited danmaku') }}</span>\\n            <div class=\\\"dplayer-toggle\\\">\\n                <input class=\\\"dplayer-danunlimit-setting-input\\\" type=\\\"checkbox\\\" name=\\\"dplayer-toggle-danunlimit\\\">\\n                <label for=\\\"dplayer-toggle-danunlimit\\\" style=\\\"--theme-color:{{ options.theme }}\\\"></label>\\n            </div>\\n        </div>\\n        <div class=\\\"dplayer-setting-item dplayer-setting-danmaku\\\">\\n            <span class=\\\"dplayer-label\\\">{{ tran('Opacity for danmaku') }}</span>\\n            <span class=\\\"dplayer-label-value\\\">1.0</span>\\n            <div class=\\\"dplayer-danmaku-bar-wrap\\\">\\n                <div class=\\\"dplayer-danmaku-bar\\\">\\n                    <div class=\\\"dplayer-danmaku-bar-inner\\\" style=\\\"background: {{ options.theme }};\\\">\\n                        <span class=\\\"dplayer-thumb\\\" style=\\\"background: {{ options.theme }};\\\"></span>\\n                    </div>\\n                </div>\\n            </div>\\n        </div>\\n    </div>\\n    {{ if options.video.quality }}\\n    <div class=\\\"dplayer-setting-quality-panel\\\">\\n        <div class=\\\"dplayer-setting-header dplayer-setting-quality-header\\\">\\n            <div class=\\\"dplayer-toggle\\\">{{@ icons.left }}</div>\\n            <span class=\\\"dplayer-label\\\">{{ tran('Quality') }}</span>\\n        </div>\\n        {{ each options.video.quality }}\\n            <div class=\\\"dplayer-setting-quality-item {{ $value.name === options.video.quality[options.video.defaultQuality].name ? 'dplayer-setting-quality-current' : '' }}\\\" data-index=\\\"{{ $index }}\\\">\\n                <div class=\\\"dplayer-toggle\\\">{{@ icons.check }}</div>\\n                <span class=\\\"dplayer-label\\\">{{ $value.name }}</span>\\n            </div>\\n        {{ /each }}\\n    </div>\\n    {{ /if }}\\n    <div class=\\\"dplayer-setting-speed-panel\\\">\\n        <div class=\\\"dplayer-setting-header dplayer-setting-speed-header\\\">\\n            <div class=\\\"dplayer-toggle\\\">{{@ icons.left }}</div>\\n            <span class=\\\"dplayer-label\\\">{{ tran('Speed') }}</span>\\n        </div>\\n        {{ each options.playbackSpeed }}\\n            <div class=\\\"dplayer-setting-speed-item {{ $value === 1 ? 'dplayer-setting-speed-current' : '' }}\\\" data-speed=\\\"{{ $value }}\\\">\\n                <div class=\\\"dplayer-toggle\\\">{{@ icons.check }}</div>\\n                <span class=\\\"dplayer-label\\\">{{ $value === 1 ? tran('Normal') : $value }}</span>\\n            </div>\\n        {{ /each }}\\n    </div>\\n    <div class=\\\"dplayer-setting-audio-panel\\\">\\n        <div class=\\\"dplayer-setting-header dplayer-setting-audio-header\\\">\\n            <div class=\\\"dplayer-toggle\\\">{{@ icons.left }}</div>\\n            <span class=\\\"dplayer-label\\\">{{ tran('Audio') }}</span>\\n        </div>\\n        <div class=\\\"dplayer-setting-audio-item dplayer-setting-audio-current\\\" data-audio=\\\"primary\\\">\\n            <div class=\\\"dplayer-toggle\\\">{{@ icons.check }}</div>\\n            <span class=\\\"dplayer-label\\\">{{ tran('Primary audio') }}</span>\\n        </div>\\n        <div class=\\\"dplayer-setting-audio-item\\\" data-audio=\\\"secondary\\\">\\n            <div class=\\\"dplayer-toggle\\\">{{@ icons.check }}</div>\\n            <span class=\\\"dplayer-label\\\">{{ tran('Secondary audio') }}</span>\\n        </div>\\n    </div>\\n</div>\\n<div class=\\\"dplayer-comment-setting-box\\\">\\n    <div class=\\\"dplayer-comment-setting-color\\\">\\n        <div class=\\\"dplayer-comment-setting-title\\\">{{ tran('Set danmaku color') }}</div>\\n        <div class=\\\"dplayer-comment-setting-color-list\\\">\\n            <label>\\n                <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-color-{{ index }}\\\" value=\\\"#ffeaea\\\" checked>\\n                <span style=\\\"background: #ffeaea\\\"></span>\\n            </label>\\n            <label>\\n                <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-color-{{ index }}\\\" value=\\\"#f02840\\\">\\n                <span style=\\\"background: #f02840\\\"></span>\\n            </label>\\n            <label>\\n                <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-color-{{ index }}\\\" value=\\\"#fd7e80\\\">\\n                <span style=\\\"background: #fd7e80\\\"></span>\\n            </label>\\n            <label>\\n                <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-color-{{ index }}\\\" value=\\\"#fda708\\\">\\n                <span style=\\\"background: #fda708\\\"></span>\\n            </label>\\n            <label>\\n                <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-color-{{ index }}\\\" value=\\\"#ffe133\\\">\\n                <span style=\\\"background: #ffe133\\\"></span>\\n            </label>\\n            <label>\\n                <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-color-{{ index }}\\\" value=\\\"#64dd17\\\">\\n                <span style=\\\"background: #64dd17\\\"></span>\\n            </label>\\n            <label>\\n                <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-color-{{ index }}\\\" value=\\\"#00d4f5\\\">\\n                <span style=\\\"background: #00d4f5\\\"></span>\\n            </label>\\n            <label>\\n                <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-color-{{ index }}\\\" value=\\\"#4763ff\\\">\\n                <span style=\\\"background: #4763ff\\\"></span>\\n            </label>\\n        </div>\\n    </div>\\n    <div class=\\\"dplayer-comment-setting-type\\\">\\n        <div class=\\\"dplayer-comment-setting-title\\\">{{ tran('Set danmaku type') }}</div>\\n        <label>\\n            <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-type-{{ index }}\\\" value=\\\"top\\\">\\n            <span>{{ tran('Top') }}</span>\\n        </label>\\n        <label>\\n            <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-type-{{ index }}\\\" value=\\\"right\\\" checked>\\n            <span>{{ tran('Rolling') }}</span>\\n        </label>\\n        <label>\\n            <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-type-{{ index }}\\\" value=\\\"bottom\\\">\\n            <span>{{ tran('Bottom') }}</span>\\n        </label>\\n    </div>\\n    <div class=\\\"dplayer-comment-setting-size\\\">\\n        <div class=\\\"dplayer-comment-setting-title\\\">{{ tran('Set danmaku size') }}</div>\\n        <label>\\n            <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-size-{{ index }}\\\" value=\\\"big\\\">\\n            <span>{{ tran('Big') }}</span>\\n        </label>\\n        <label>\\n            <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-size-{{ index }}\\\" value=\\\"medium\\\" checked>\\n            <span>{{ tran('Medium') }}</span>\\n        </label>\\n        <label>\\n            <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-size-{{ index }}\\\" value=\\\"small\\\">\\n            <span>{{ tran('Small') }}</span>\\n        </label>\\n    </div>\\n</div>\\n<div class=\\\"dplayer-info-panel dplayer-info-panel-hide\\\">\\n    <div class=\\\"dplayer-info-panel-close\\\">[x]</div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-version\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Player Version</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-mimetype\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Mime Type</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-video-fps\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Video FPS</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-page-fps\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Page FPS</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-dropped-frames\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Dropped Frames</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-type\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Video Type</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-url\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Video URL</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-resolution\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Video Resolution</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-duration\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Video Duration</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-buffer-remain\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Buffer Remain</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-download-speed\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Download Speed</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n</div>\\n<div class=\\\"dplayer-menu\\\">\\n    {{ each options.contextmenu }}\\n        <div class=\\\"dplayer-menu-item\\\">\\n            <a{{ if $value.link }} target=\\\"_blank\\\"{{ /if }} href=\\\"{{ $value.link || 'javascript:void(0);' }}\\\">{{ tran($value.text) }}</a>\\n        </div>\\n    {{ /each }}\\n</div>\\n<div class=\\\"dplayer-notice\\\"></div>\\n<div class=\\\"dplayer-mobile-icon-wrap\\\">\\n    <button class=\\\"dplayer-mobile-icon dplayer-mobile-icon-backward\\\">\\n        {{@ icons.backward }}\\n    </button>\\n    <button class=\\\"dplayer-mobile-icon dplayer-mobile-icon-play\\\">\\n        {{@ icons.play }}\\n    </button>\\n    <button class=\\\"dplayer-mobile-icon dplayer-mobile-icon-forward\\\">\\n        {{@ icons.forward }}\\n    </button>\\n</div>\\n\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 32\\\\\\\"><path d=\\\\\\\"M22 16l-10.105-10.6-1.895 1.987 8.211 8.613-8.211 8.612 1.895 1.988 8.211-8.613z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 32\\\\\\\"><path d=\\\\\\\"M13.725 30l3.9-5.325-3.9-1.125v6.45zM0 17.5l11.050 3.35 13.6-11.55-10.55 12.425 11.8 3.65 6.1-23.375-32 15.5z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 21 32\\\\\\\"><path d=\\\\\\\"M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528z\\\\\\\"></path></svg>\\\"\",\"\\\"use strict\\\";\\n\\n/* istanbul ignore next  */\\nfunction insertStyleElement(options) {\\n  var element = document.createElement(\\\"style\\\");\\n  options.setAttributes(element, options.attributes);\\n  options.insert(element, options.options);\\n  return element;\\n}\\nmodule.exports = insertStyleElement;\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 32\\\\\\\"><path d=\\\\\\\"M16 23c-3.309 0-6-2.691-6-6s2.691-6 6-6 6 2.691 6 6-2.691 6-6 6zM16 13c-2.206 0-4 1.794-4 4s1.794 4 4 4c2.206 0 4-1.794 4-4s-1.794-4-4-4zM27 28h-22c-1.654 0-3-1.346-3-3v-16c0-1.654 1.346-3 3-3h3c0.552 0 1 0.448 1 1s-0.448 1-1 1h-3c-0.551 0-1 0.449-1 1v16c0 0.552 0.449 1 1 1h22c0.552 0 1-0.448 1-1v-16c0-0.551-0.448-1-1-1h-11c-0.552 0-1-0.448-1-1s0.448-1 1-1h11c1.654 0 3 1.346 3 3v16c0 1.654-1.346 3-3 3zM24 10.5c0 0.828 0.672 1.5 1.5 1.5s1.5-0.672 1.5-1.5c0-0.828-0.672-1.5-1.5-1.5s-1.5 0.672-1.5 1.5zM15 4c0 0.552-0.448 1-1 1h-4c-0.552 0-1-0.448-1-1v0c0-0.552 0.448-1 1-1h4c0.552 0 1 0.448 1 1v0z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 24 24\\\\\\\"><path d=\\\\\\\"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 33\\\\\\\"><path d=\\\\\\\"M26.3,15.1H14.5v8.6h11.8V15.1z M32.2,26.6V6.4c0-1.6-1.3-2.8-2.9-2.8H2.8c-1.6,0-2.9,1.3-2.9,2.8v20.1c0,1.6,1.3,2.9,2.9,2.9h26.4C30.8,29.4,32.2,28.1,32.2,26.6z M29.2,26.6H2.8V6.4h26.4V26.6z\\\\\\\"></path></svg>\\\"\",\"\\\"use strict\\\";\\n\\nvar memo = {};\\n\\n/* istanbul ignore next  */\\nfunction getTarget(target) {\\n  if (typeof memo[target] === \\\"undefined\\\") {\\n    var styleTarget = document.querySelector(target);\\n\\n    // Special case to return head of iframe instead of iframe itself\\n    if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\\n      try {\\n        // This will throw an exception if access to iframe is blocked\\n        // due to cross-origin restrictions\\n        styleTarget = styleTarget.contentDocument.head;\\n      } catch (e) {\\n        // istanbul ignore next\\n        styleTarget = null;\\n      }\\n    }\\n    memo[target] = styleTarget;\\n  }\\n  return memo[target];\\n}\\n\\n/* istanbul ignore next  */\\nfunction insertBySelector(insert, style) {\\n  var target = getTarget(insert);\\n  if (!target) {\\n    throw new Error(\\\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\\\");\\n  }\\n  target.appendChild(style);\\n}\\nmodule.exports = insertBySelector;\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 33\\\\\\\"><path d=\\\\\\\"M6.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v4h4c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333zM30.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h4v-4c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM30.667 12c-0.8 0-1.333-0.533-1.333-1.333v-4h-4c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM1.333 12c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333h-4v4c0 0.8-0.533 1.333-1.333 1.333z\\\\\\\"></path></svg>\\\"\",\"\\\"use strict\\\";\\n\\n/* istanbul ignore next  */\\nfunction apply(styleElement, options, obj) {\\n  var css = \\\"\\\";\\n  if (obj.supports) {\\n    css += \\\"@supports (\\\".concat(obj.supports, \\\") {\\\");\\n  }\\n  if (obj.media) {\\n    css += \\\"@media \\\".concat(obj.media, \\\" {\\\");\\n  }\\n  var needLayer = typeof obj.layer !== \\\"undefined\\\";\\n  if (needLayer) {\\n    css += \\\"@layer\\\".concat(obj.layer.length > 0 ? \\\" \\\".concat(obj.layer) : \\\"\\\", \\\" {\\\");\\n  }\\n  css += obj.css;\\n  if (needLayer) {\\n    css += \\\"}\\\";\\n  }\\n  if (obj.media) {\\n    css += \\\"}\\\";\\n  }\\n  if (obj.supports) {\\n    css += \\\"}\\\";\\n  }\\n  var sourceMap = obj.sourceMap;\\n  if (sourceMap && typeof btoa !== \\\"undefined\\\") {\\n    css += \\\"\\\\n/*# sourceMappingURL=data:application/json;base64,\\\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \\\" */\\\");\\n  }\\n\\n  // For old IE\\n  /* istanbul ignore if  */\\n  options.styleTagTransform(css, styleElement, options.options);\\n}\\nfunction removeStyleElement(styleElement) {\\n  // istanbul ignore if\\n  if (styleElement.parentNode === null) {\\n    return false;\\n  }\\n  styleElement.parentNode.removeChild(styleElement);\\n}\\n\\n/* istanbul ignore next  */\\nfunction domAPI(options) {\\n  if (typeof document === \\\"undefined\\\") {\\n    return {\\n      update: function update() {},\\n      remove: function remove() {}\\n    };\\n  }\\n  var styleElement = options.insertStyleElement(options);\\n  return {\\n    update: function update(obj) {\\n      apply(styleElement, options, obj);\\n    },\\n    remove: function remove() {\\n      removeStyleElement(styleElement);\\n    }\\n  };\\n}\\nmodule.exports = domAPI;\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 512 512\\\\\\\"><path d=\\\\\\\"M500.5 231.4l-192-160C287.9 54.3 256 68.6 256 96v320c0 27.4 31.9 41.8 52.5 24.6l192-160c15.3-12.8 15.3-36.4 0-49.2zm-256 0l-192-160C31.9 54.3 0 68.6 0 96v320c0 27.4 31.9 41.8 52.5 24.6l192-160c15.3-12.8 15.3-36.4 0-49.2z\\\\\\\"></path></svg>\\\"\",\"'use strict';\\n\\n/*! art-template@runtime | https://github.com/aui/art-template */\\n\\nvar globalThis = typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : {};\\n\\nvar runtime = Object.create(globalThis);\\nvar ESCAPE_REG = /[\\\"&'<>]/;\\n\\n/**\\n * 编码模板输出的内容\\n * @param  {any}        content\\n * @return {string}\\n */\\nruntime.$escape = function (content) {\\n    return xmlEscape(toString(content));\\n};\\n\\n/**\\n * 迭代器，支持数组与对象\\n * @param {array|Object} data\\n * @param {function}     callback\\n */\\nruntime.$each = function (data, callback) {\\n    if (Array.isArray(data)) {\\n        for (var i = 0, len = data.length; i < len; i++) {\\n            callback(data[i], i);\\n        }\\n    } else {\\n        for (var _i in data) {\\n            callback(data[_i], _i);\\n        }\\n    }\\n};\\n\\n// 将目标转成字符\\nfunction toString(value) {\\n    if (typeof value !== 'string') {\\n        if (value === undefined || value === null) {\\n            value = '';\\n        } else if (typeof value === 'function') {\\n            value = toString(value.call(value));\\n        } else {\\n            value = JSON.stringify(value);\\n        }\\n    }\\n\\n    return value;\\n}\\n\\n// 编码 HTML 内容\\nfunction xmlEscape(content) {\\n    var html = '' + content;\\n    var regexResult = ESCAPE_REG.exec(html);\\n    if (!regexResult) {\\n        return content;\\n    }\\n\\n    var result = '';\\n    var i = void 0,\\n        lastIndex = void 0,\\n        char = void 0;\\n    for (i = regexResult.index, lastIndex = 0; i < html.length; i++) {\\n        switch (html.charCodeAt(i)) {\\n            case 34:\\n                char = '&#34;';\\n                break;\\n            case 38:\\n                char = '&#38;';\\n                break;\\n            case 39:\\n                char = '&#39;';\\n                break;\\n            case 60:\\n                char = '&#60;';\\n                break;\\n            case 62:\\n                char = '&#62;';\\n                break;\\n            default:\\n                continue;\\n        }\\n\\n        if (lastIndex !== i) {\\n            result += html.substring(lastIndex, i);\\n        }\\n\\n        lastIndex = i + 1;\\n        result += char;\\n    }\\n\\n    if (lastIndex !== i) {\\n        return result + html.substring(lastIndex, i);\\n    } else {\\n        return result;\\n    }\\n}\\n\\nmodule.exports = runtime;\",\"// Imports\\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \\\"../css-loader/dist/runtime/sourceMaps.js\\\";\\nimport ___CSS_LOADER_API_IMPORT___ from \\\"../css-loader/dist/runtime/api.js\\\";\\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\\n// Module\\n___CSS_LOADER_EXPORT___.push([module.id, `:root{--balloon-border-radius:2px;--balloon-color:#101010f2;--balloon-text-color:#fff;--balloon-font-size:12px;--balloon-move:4px}button[aria-label][data-balloon-pos]{overflow:visible}[aria-label][data-balloon-pos]{cursor:pointer;position:relative}[aria-label][data-balloon-pos]:after{background:var(--balloon-color);border-radius:2px;border-radius:var(--balloon-border-radius);color:var(--balloon-text-color);content:attr(aria-label);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:var(--balloon-font-size);font-style:normal;font-weight:400;padding:.5em 1em;text-indent:0;text-shadow:none;white-space:nowrap}[aria-label][data-balloon-pos]:after,[aria-label][data-balloon-pos]:before{opacity:0;pointer-events:none;position:absolute;transition:all .18s ease-out .18s;z-index:10}[aria-label][data-balloon-pos]:before{border:5px solid #0000;border-top:5px solid var(--balloon-color);content:\\\"\\\";height:0;width:0}[aria-label][data-balloon-pos]:hover:after,[aria-label][data-balloon-pos]:hover:before,[aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:after,[aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:before,[aria-label][data-balloon-pos][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-visible]:before{opacity:1;pointer-events:none}[aria-label][data-balloon-pos].font-awesome:after{font-family:FontAwesome,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif}[aria-label][data-balloon-pos][data-balloon-break]:after{white-space:pre}[aria-label][data-balloon-pos][data-balloon-break][data-balloon-length]:after{white-space:pre-line;word-break:break-word}[aria-label][data-balloon-pos][data-balloon-blunt]:after,[aria-label][data-balloon-pos][data-balloon-blunt]:before{transition:none}[aria-label][data-balloon-pos][data-balloon-pos=down]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=down]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=down][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=down][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=up][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=up][data-balloon-visible]:before{transform:translate(-50%)}[aria-label][data-balloon-pos][data-balloon-pos*=-left]:after{left:0}[aria-label][data-balloon-pos][data-balloon-pos*=-left]:before{left:5px}[aria-label][data-balloon-pos][data-balloon-pos*=-right]:after{right:0}[aria-label][data-balloon-pos][data-balloon-pos*=-right]:before{right:5px}[aria-label][data-balloon-pos][data-balloon-po*=-left]:hover:after,[aria-label][data-balloon-pos][data-balloon-po*=-left]:hover:before,[aria-label][data-balloon-pos][data-balloon-po*=-left][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-po*=-left][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos*=-right]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos*=-right]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos*=-right][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos*=-right][data-balloon-visible]:before{transform:translate(0)}[aria-label][data-balloon-pos][data-balloon-pos^=up]:after,[aria-label][data-balloon-pos][data-balloon-pos^=up]:before{bottom:100%;transform:translateY(var(--balloon-move));transform-origin:top}[aria-label][data-balloon-pos][data-balloon-pos^=up]:after{margin-bottom:10px}[aria-label][data-balloon-pos][data-balloon-pos=up]:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:before{left:50%;transform:translate(-50%,var(--balloon-move))}[aria-label][data-balloon-pos][data-balloon-pos^=down]:after,[aria-label][data-balloon-pos][data-balloon-pos^=down]:before{top:100%;transform:translateY(calc(var(--balloon-move)*-1))}[aria-label][data-balloon-pos][data-balloon-pos^=down]:after{margin-top:10px}[aria-label][data-balloon-pos][data-balloon-pos^=down]:before{border:5px solid #0000;border-bottom:5px solid var(--balloon-color);height:0;width:0}[aria-label][data-balloon-pos][data-balloon-pos=down]:after,[aria-label][data-balloon-pos][data-balloon-pos=down]:before{left:50%;transform:translate(-50%,calc(var(--balloon-move)*-1))}[aria-label][data-balloon-pos][data-balloon-pos=left]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=left]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=left][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=left][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos=right]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=right]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=right][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=right][data-balloon-visible]:before{transform:translateY(-50%)}[aria-label][data-balloon-pos][data-balloon-pos=left]:after,[aria-label][data-balloon-pos][data-balloon-pos=left]:before{right:100%;top:50%;transform:translate(var(--balloon-move),-50%)}[aria-label][data-balloon-pos][data-balloon-pos=left]:after{margin-right:10px}[aria-label][data-balloon-pos][data-balloon-pos=left]:before{border:5px solid #0000;border-left:5px solid var(--balloon-color);height:0;width:0}[aria-label][data-balloon-pos][data-balloon-pos=right]:after,[aria-label][data-balloon-pos][data-balloon-pos=right]:before{left:100%;top:50%;transform:translate(calc(var(--balloon-move)*-1),-50%)}[aria-label][data-balloon-pos][data-balloon-pos=right]:after{margin-left:10px}[aria-label][data-balloon-pos][data-balloon-pos=right]:before{border:5px solid #0000;border-right:5px solid var(--balloon-color);height:0;width:0}[aria-label][data-balloon-pos][data-balloon-length]:after{white-space:normal}[aria-label][data-balloon-pos][data-balloon-length=small]:after{width:80px}[aria-label][data-balloon-pos][data-balloon-length=medium]:after{width:150px}[aria-label][data-balloon-pos][data-balloon-length=large]:after{width:260px}[aria-label][data-balloon-pos][data-balloon-length=xlarge]:after{width:380px}@media screen and (max-width:768px){[aria-label][data-balloon-pos][data-balloon-length=xlarge]:after{width:90vw}}[aria-label][data-balloon-pos][data-balloon-length=fit]:after{width:100%}`, \\\"\\\",{\\\"version\\\":3,\\\"sources\\\":[\\\"webpack://./node_modules/balloon-css/balloon.css\\\"],\\\"names\\\":[],\\\"mappings\\\":\\\"AAAA,MACE,2BAA4B,CAC5B,yBAAuC,CACvC,yBAA0B,CAC1B,wBAAyB,CACzB,kBAAqB,CAEvB,qCACE,gBAAmB,CAErB,+BAEE,cAAe,CADf,iBACiB,CACjB,qCAUE,+BAAgC,CAChC,iBAAkB,CAElB,0CAA2C,CAD3C,+BAAgC,CAEhC,wBAAyB,CATzB,wHAAwI,CAIxI,kCAAmC,CAFnC,iBAAkB,CADlB,eAAmB,CASnB,gBAAiB,CAXjB,aAAc,CAId,gBAAiB,CASjB,kBACa,CACf,2EAlBE,SAAU,CACV,mBAAoB,CAcpB,iBAAkB,CAblB,iCAAoC,CAepC,UAWa,CAVf,sCAIE,sBAAsC,CAAtC,yCAAsC,CAItC,UAAW,CANX,QAAS,CADT,OASa,CACf,6VACE,SAAU,CACV,mBAAsB,CACxB,kDACE,oIAAuJ,CACzJ,yDACE,eAAkB,CACpB,8EACE,oBAAqB,CACrB,qBAAwB,CAC1B,mHACE,eAAkB,CAGpB,4kBACE,yBAA+B,CACjC,8DACE,MAAS,CACX,+DACE,QAAW,CACb,+DACE,OAAU,CACZ,gEACE,SAAY,CAGd,omBACE,sBAA4B,CAC9B,uHACE,WAAY,CAEZ,yCAA4C,CAD5C,oBAC8C,CAChD,2DACE,kBAAqB,CACvB,qHACE,QAAS,CACT,6CAAiD,CACnD,2HACE,QAAS,CACT,kDAAyD,CAC3D,6DACE,eAAkB,CACpB,8DAIE,sBAAyC,CAAzC,4CAAyC,CAFzC,QAAS,CADT,OAG2C,CAC7C,yHACE,QAAS,CACT,sDAA4D,CAG9D,wlBACE,0BAA+B,CACjC,yHACE,UAAW,CACX,OAAQ,CACR,6CAAiD,CACnD,4DACE,iBAAoB,CACtB,6DAIE,sBAAuC,CAAvC,0CAAuC,CAFvC,QAAS,CADT,OAGyC,CAC3C,2HACE,SAAU,CACV,OAAQ,CACR,sDAA4D,CAC9D,6DACE,gBAAmB,CACrB,8DAIE,sBAAwC,CAAxC,2CAAwC,CAFxC,QAAS,CADT,OAG0C,CAC5C,0DACE,kBAAqB,CACvB,gEACE,UAAa,CACf,iEACE,WAAc,CAChB,gEACE,WAAc,CAChB,iEACE,WAAc,CACd,oCACE,iEACE,UAAa,CAAE,CACrB,8DACE,UAAa\\\",\\\"sourcesContent\\\":[\\\":root {\\\\n  --balloon-border-radius: 2px;\\\\n  --balloon-color: rgba(16, 16, 16, 0.95);\\\\n  --balloon-text-color: #fff;\\\\n  --balloon-font-size: 12px;\\\\n  --balloon-move: 4px; }\\\\n\\\\nbutton[aria-label][data-balloon-pos] {\\\\n  overflow: visible; }\\\\n\\\\n[aria-label][data-balloon-pos] {\\\\n  position: relative;\\\\n  cursor: pointer; }\\\\n  [aria-label][data-balloon-pos]:after {\\\\n    opacity: 0;\\\\n    pointer-events: none;\\\\n    transition: all 0.18s ease-out 0.18s;\\\\n    text-indent: 0;\\\\n    font-family: -apple-system, BlinkMacSystemFont, \\\\\\\"Segoe UI\\\\\\\", Roboto, Oxygen, Ubuntu, Cantarell, \\\\\\\"Open Sans\\\\\\\", \\\\\\\"Helvetica Neue\\\\\\\", sans-serif;\\\\n    font-weight: normal;\\\\n    font-style: normal;\\\\n    text-shadow: none;\\\\n    font-size: var(--balloon-font-size);\\\\n    background: var(--balloon-color);\\\\n    border-radius: 2px;\\\\n    color: var(--balloon-text-color);\\\\n    border-radius: var(--balloon-border-radius);\\\\n    content: attr(aria-label);\\\\n    padding: .5em 1em;\\\\n    position: absolute;\\\\n    white-space: nowrap;\\\\n    z-index: 10; }\\\\n  [aria-label][data-balloon-pos]:before {\\\\n    width: 0;\\\\n    height: 0;\\\\n    border: 5px solid transparent;\\\\n    border-top-color: var(--balloon-color);\\\\n    opacity: 0;\\\\n    pointer-events: none;\\\\n    transition: all 0.18s ease-out 0.18s;\\\\n    content: \\\\\\\"\\\\\\\";\\\\n    position: absolute;\\\\n    z-index: 10; }\\\\n  [aria-label][data-balloon-pos]:hover:before, [aria-label][data-balloon-pos]:hover:after, [aria-label][data-balloon-pos][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-visible]:after, [aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:before, [aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:after {\\\\n    opacity: 1;\\\\n    pointer-events: none; }\\\\n  [aria-label][data-balloon-pos].font-awesome:after {\\\\n    font-family: FontAwesome, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; }\\\\n  [aria-label][data-balloon-pos][data-balloon-break]:after {\\\\n    white-space: pre; }\\\\n  [aria-label][data-balloon-pos][data-balloon-break][data-balloon-length]:after {\\\\n    white-space: pre-line;\\\\n    word-break: break-word; }\\\\n  [aria-label][data-balloon-pos][data-balloon-blunt]:before, [aria-label][data-balloon-pos][data-balloon-blunt]:after {\\\\n    transition: none; }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"up\\\\\\\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"up\\\\\\\"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"down\\\\\\\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"down\\\\\\\"][data-balloon-visible]:after {\\\\n    transform: translate(-50%, 0); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"up\\\\\\\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"up\\\\\\\"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"down\\\\\\\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"down\\\\\\\"][data-balloon-visible]:before {\\\\n    transform: translate(-50%, 0); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos*=\\\\\\\"-left\\\\\\\"]:after {\\\\n    left: 0; }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos*=\\\\\\\"-left\\\\\\\"]:before {\\\\n    left: 5px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos*=\\\\\\\"-right\\\\\\\"]:after {\\\\n    right: 0; }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos*=\\\\\\\"-right\\\\\\\"]:before {\\\\n    right: 5px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-po*=\\\\\\\"-left\\\\\\\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-po*=\\\\\\\"-left\\\\\\\"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos*=\\\\\\\"-right\\\\\\\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos*=\\\\\\\"-right\\\\\\\"][data-balloon-visible]:after {\\\\n    transform: translate(0, 0); }\\\\n  [aria-label][data-balloon-pos][data-balloon-po*=\\\\\\\"-left\\\\\\\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-po*=\\\\\\\"-left\\\\\\\"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos*=\\\\\\\"-right\\\\\\\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos*=\\\\\\\"-right\\\\\\\"][data-balloon-visible]:before {\\\\n    transform: translate(0, 0); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\\\\\\\"up\\\\\\\"]:before, [aria-label][data-balloon-pos][data-balloon-pos^=\\\\\\\"up\\\\\\\"]:after {\\\\n    bottom: 100%;\\\\n    transform-origin: top;\\\\n    transform: translate(0, var(--balloon-move)); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\\\\\\\"up\\\\\\\"]:after {\\\\n    margin-bottom: 10px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"up\\\\\\\"]:before, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"up\\\\\\\"]:after {\\\\n    left: 50%;\\\\n    transform: translate(-50%, var(--balloon-move)); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\\\\\\\"down\\\\\\\"]:before, [aria-label][data-balloon-pos][data-balloon-pos^=\\\\\\\"down\\\\\\\"]:after {\\\\n    top: 100%;\\\\n    transform: translate(0, calc(var(--balloon-move) * -1)); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\\\\\\\"down\\\\\\\"]:after {\\\\n    margin-top: 10px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\\\\\\\"down\\\\\\\"]:before {\\\\n    width: 0;\\\\n    height: 0;\\\\n    border: 5px solid transparent;\\\\n    border-bottom-color: var(--balloon-color); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"down\\\\\\\"]:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"down\\\\\\\"]:before {\\\\n    left: 50%;\\\\n    transform: translate(-50%, calc(var(--balloon-move) * -1)); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"left\\\\\\\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"left\\\\\\\"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"right\\\\\\\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"right\\\\\\\"][data-balloon-visible]:after {\\\\n    transform: translate(0, -50%); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"left\\\\\\\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"left\\\\\\\"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"right\\\\\\\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"right\\\\\\\"][data-balloon-visible]:before {\\\\n    transform: translate(0, -50%); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"left\\\\\\\"]:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"left\\\\\\\"]:before {\\\\n    right: 100%;\\\\n    top: 50%;\\\\n    transform: translate(var(--balloon-move), -50%); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"left\\\\\\\"]:after {\\\\n    margin-right: 10px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"left\\\\\\\"]:before {\\\\n    width: 0;\\\\n    height: 0;\\\\n    border: 5px solid transparent;\\\\n    border-left-color: var(--balloon-color); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"right\\\\\\\"]:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"right\\\\\\\"]:before {\\\\n    left: 100%;\\\\n    top: 50%;\\\\n    transform: translate(calc(var(--balloon-move) * -1), -50%); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"right\\\\\\\"]:after {\\\\n    margin-left: 10px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"right\\\\\\\"]:before {\\\\n    width: 0;\\\\n    height: 0;\\\\n    border: 5px solid transparent;\\\\n    border-right-color: var(--balloon-color); }\\\\n  [aria-label][data-balloon-pos][data-balloon-length]:after {\\\\n    white-space: normal; }\\\\n  [aria-label][data-balloon-pos][data-balloon-length=\\\\\\\"small\\\\\\\"]:after {\\\\n    width: 80px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-length=\\\\\\\"medium\\\\\\\"]:after {\\\\n    width: 150px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-length=\\\\\\\"large\\\\\\\"]:after {\\\\n    width: 260px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-length=\\\\\\\"xlarge\\\\\\\"]:after {\\\\n    width: 380px; }\\\\n    @media screen and (max-width: 768px) {\\\\n      [aria-label][data-balloon-pos][data-balloon-length=\\\\\\\"xlarge\\\\\\\"]:after {\\\\n        width: 90vw; } }\\\\n  [aria-label][data-balloon-pos][data-balloon-length=\\\\\\\"fit\\\\\\\"]:after {\\\\n    width: 100%; }\\\\n\\\"],\\\"sourceRoot\\\":\\\"\\\"}]);\\n// Exports\\nexport default ___CSS_LOADER_EXPORT___;\\n\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 28\\\\\\\"><path d=\\\\\\\"M28.633 17.104c0.035 0.21 0.026 0.463-0.026 0.76s-0.14 0.598-0.262 0.904c-0.122 0.306-0.271 0.581-0.445 0.825s-0.367 0.419-0.576 0.524c-0.209 0.105-0.393 0.157-0.55 0.157s-0.332-0.035-0.524-0.105c-0.175-0.052-0.393-0.1-0.655-0.144s-0.528-0.052-0.799-0.026c-0.271 0.026-0.541 0.083-0.812 0.17s-0.502 0.236-0.694 0.445c-0.419 0.437-0.664 0.934-0.734 1.493s0.009 1.092 0.236 1.598c0.175 0.349 0.148 0.699-0.079 1.048-0.105 0.14-0.271 0.284-0.498 0.432s-0.476 0.284-0.747 0.406-0.555 0.218-0.851 0.288c-0.297 0.070-0.559 0.105-0.786 0.105-0.157 0-0.306-0.061-0.445-0.183s-0.236-0.253-0.288-0.393h-0.026c-0.192-0.541-0.52-1.009-0.982-1.402s-1-0.589-1.611-0.589c-0.594 0-1.131 0.197-1.611 0.589s-0.816 0.851-1.009 1.375c-0.087 0.21-0.218 0.362-0.393 0.458s-0.367 0.144-0.576 0.144c-0.244 0-0.52-0.044-0.825-0.131s-0.611-0.197-0.917-0.327c-0.306-0.131-0.581-0.284-0.825-0.458s-0.428-0.349-0.55-0.524c-0.087-0.122-0.135-0.266-0.144-0.432s0.057-0.397 0.197-0.694c0.192-0.402 0.266-0.86 0.223-1.375s-0.266-0.991-0.668-1.428c-0.244-0.262-0.541-0.432-0.891-0.511s-0.681-0.109-0.995-0.092c-0.367 0.017-0.742 0.087-1.127 0.21-0.244 0.070-0.489 0.052-0.734-0.052-0.192-0.070-0.371-0.231-0.537-0.485s-0.314-0.533-0.445-0.838c-0.131-0.306-0.231-0.62-0.301-0.943s-0.087-0.59-0.052-0.799c0.052-0.384 0.227-0.629 0.524-0.734 0.524-0.21 0.995-0.555 1.415-1.035s0.629-1.017 0.629-1.611c0-0.611-0.21-1.144-0.629-1.598s-0.891-0.786-1.415-0.996c-0.157-0.052-0.288-0.179-0.393-0.38s-0.157-0.406-0.157-0.616c0-0.227 0.035-0.48 0.105-0.76s0.162-0.55 0.275-0.812 0.244-0.502 0.393-0.72c0.148-0.218 0.31-0.38 0.485-0.485 0.14-0.087 0.275-0.122 0.406-0.105s0.275 0.052 0.432 0.105c0.524 0.21 1.070 0.275 1.637 0.197s1.070-0.327 1.506-0.747c0.21-0.209 0.362-0.467 0.458-0.773s0.157-0.607 0.183-0.904c0.026-0.297 0.026-0.568 0-0.812s-0.048-0.419-0.065-0.524c-0.035-0.105-0.066-0.227-0.092-0.367s-0.013-0.262 0.039-0.367c0.105-0.244 0.293-0.458 0.563-0.642s0.563-0.336 0.878-0.458c0.314-0.122 0.62-0.214 0.917-0.275s0.533-0.092 0.707-0.092c0.227 0 0.406 0.074 0.537 0.223s0.223 0.301 0.275 0.458c0.192 0.471 0.507 0.886 0.943 1.244s0.952 0.537 1.546 0.537c0.611 0 1.153-0.17 1.624-0.511s0.803-0.773 0.996-1.297c0.070-0.14 0.179-0.284 0.327-0.432s0.301-0.223 0.458-0.223c0.244 0 0.511 0.035 0.799 0.105s0.572 0.166 0.851 0.288c0.279 0.122 0.537 0.279 0.773 0.472s0.423 0.402 0.563 0.629c0.087 0.14 0.113 0.293 0.079 0.458s-0.070 0.284-0.105 0.354c-0.227 0.506-0.297 1.039-0.21 1.598s0.341 1.048 0.76 1.467c0.419 0.419 0.934 0.651 1.546 0.694s1.179-0.057 1.703-0.301c0.14-0.087 0.31-0.122 0.511-0.105s0.371 0.096 0.511 0.236c0.262 0.244 0.493 0.616 0.694 1.113s0.336 1 0.406 1.506c0.035 0.297-0.013 0.528-0.144 0.694s-0.266 0.275-0.406 0.327c-0.542 0.192-1.004 0.528-1.388 1.009s-0.576 1.026-0.576 1.637c0 0.594 0.162 1.113 0.485 1.559s0.747 0.764 1.27 0.956c0.122 0.070 0.227 0.14 0.314 0.21 0.192 0.157 0.323 0.358 0.393 0.602v0zM16.451 19.462c0.786 0 1.528-0.149 2.227-0.445s1.305-0.707 1.821-1.231c0.515-0.524 0.921-1.131 1.218-1.821s0.445-1.428 0.445-2.214c0-0.786-0.148-1.524-0.445-2.214s-0.703-1.292-1.218-1.808c-0.515-0.515-1.122-0.921-1.821-1.218s-1.441-0.445-2.227-0.445c-0.786 0-1.524 0.148-2.214 0.445s-1.292 0.703-1.808 1.218c-0.515 0.515-0.921 1.118-1.218 1.808s-0.445 1.428-0.445 2.214c0 0.786 0.149 1.524 0.445 2.214s0.703 1.297 1.218 1.821c0.515 0.524 1.118 0.934 1.808 1.231s1.428 0.445 2.214 0.445v0z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 33\\\\\\\"><path d=\\\\\\\"M24.965 24.38h-18.132c-1.366 0-2.478-1.113-2.478-2.478v-11.806c0-1.364 1.111-2.478 2.478-2.478h18.132c1.366 0 2.478 1.113 2.478 2.478v11.806c0 1.364-1.11 2.478-2.478 2.478zM6.833 10.097v11.806h18.134l-0.002-11.806h-18.132zM2.478 28.928h5.952c0.684 0 1.238-0.554 1.238-1.239 0-0.684-0.554-1.238-1.238-1.238h-5.952v-5.802c0-0.684-0.554-1.239-1.238-1.239s-1.239 0.556-1.239 1.239v5.802c0 1.365 1.111 2.478 2.478 2.478zM30.761 19.412c-0.684 0-1.238 0.554-1.238 1.238v5.801h-5.951c-0.686 0-1.239 0.554-1.239 1.238 0 0.686 0.554 1.239 1.239 1.239h5.951c1.366 0 2.478-1.111 2.478-2.478v-5.801c0-0.683-0.554-1.238-1.239-1.238zM0 5.55v5.802c0 0.683 0.554 1.238 1.238 1.238s1.238-0.555 1.238-1.238v-5.802h5.952c0.684 0 1.238-0.554 1.238-1.238s-0.554-1.238-1.238-1.238h-5.951c-1.366-0.001-2.478 1.111-2.478 2.476zM32 11.35v-5.801c0-1.365-1.11-2.478-2.478-2.478h-5.951c-0.686 0-1.239 0.554-1.239 1.238s0.554 1.238 1.239 1.238h5.951v5.801c0 0.683 0.554 1.237 1.238 1.237 0.686 0.002 1.239-0.553 1.239-1.236z\\\\\\\"></path></svg>\\\"\",\"// The module cache\\nvar __webpack_module_cache__ = {};\\n\\n// The require function\\nfunction __webpack_require__(moduleId) {\\n\\t// Check if module is in cache\\n\\tvar cachedModule = __webpack_module_cache__[moduleId];\\n\\tif (cachedModule !== undefined) {\\n\\t\\treturn cachedModule.exports;\\n\\t}\\n\\t// Create a new module (and put it into the cache)\\n\\tvar module = __webpack_module_cache__[moduleId] = {\\n\\t\\tid: moduleId,\\n\\t\\t// no module.loaded needed\\n\\t\\texports: {}\\n\\t};\\n\\n\\t// Execute the module function\\n\\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\\n\\n\\t// Return the exports of the module\\n\\treturn module.exports;\\n}\\n\\n\",\"// getDefaultExport function for compatibility with non-harmony modules\\n__webpack_require__.n = (module) => {\\n\\tvar getter = module && module.__esModule ?\\n\\t\\t() => (module['default']) :\\n\\t\\t() => (module);\\n\\t__webpack_require__.d(getter, { a: getter });\\n\\treturn getter;\\n};\",\"// define getter functions for harmony exports\\n__webpack_require__.d = (exports, definition) => {\\n\\tfor(var key in definition) {\\n\\t\\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\\n\\t\\t\\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\\n\\t\\t}\\n\\t}\\n};\",\"__webpack_require__.g = (function() {\\n\\tif (typeof globalThis === 'object') return globalThis;\\n\\ttry {\\n\\t\\treturn this || new Function('return this')();\\n\\t} catch (e) {\\n\\t\\tif (typeof window === 'object') return window;\\n\\t}\\n})();\",\"__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\",\"// define __esModule on exports\\n__webpack_require__.r = (exports) => {\\n\\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\\n\\t\\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\\n\\t}\\n\\tObject.defineProperty(exports, '__esModule', { value: true });\\n};\",\"__webpack_require__.nc = undefined;\",\"\\n      import API from \\\"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\\\";\\n      import domAPI from \\\"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\\\";\\n      import insertFn from \\\"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\\\";\\n      import setAttributes from \\\"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\\\";\\n      import insertStyleElement from \\\"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\\\";\\n      import styleTagTransformFn from \\\"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\\\";\\n      import content, * as namedExport from \\\"!!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!../../node_modules/sass-loader/dist/cjs.js!./index.scss\\\";\\n      \\n      \\n\\nvar options = {};\\n\\noptions.styleTagTransform = styleTagTransformFn;\\noptions.setAttributes = setAttributes;\\n\\n      options.insert = insertFn.bind(null, \\\"head\\\");\\n    \\noptions.domAPI = domAPI;\\noptions.insertStyleElement = insertStyleElement;\\n\\nvar update = API(content, options);\\n\\n\\n\\nexport * from \\\"!!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!../../node_modules/sass-loader/dist/cjs.js!./index.scss\\\";\\n       export default content && content.locals ? content.locals : undefined;\\n\",\"import Template from './template';\\n\\nconst isMobile = /iPhone|iPad|iPod|Windows|Macintosh|Android|Mobile/i.test(navigator.userAgent) && 'ontouchend' in document;\\n\\nconst utils = {\\n    /**\\n     * Parse second to time string\\n     *\\n     * @param {Number} second\\n     * @return {String} 00:00 or 00:00:00\\n     */\\n    secondToTime: (second: number): string => {\\n        second = second || 0;\\n        if (second === 0 || second === Infinity || second.toString() === 'NaN') {\\n            return '00:00';\\n        }\\n        const add0 = (num: number): string => num < 10 ? '0' + num : '' + num;\\n        const hour = Math.floor(second / 3600);\\n        const min = Math.floor((second - hour * 3600) / 60);\\n        const sec = Math.floor(second - hour * 3600 - min * 60);\\n        return (hour > 0 ? [hour, min, sec] : [min, sec]).map(add0).join(':');\\n    },\\n\\n    /**\\n     * get video duration\\n     * compatibility: measures against video length becoming Infinity during HLS playback on native HLS player of Safari\\n     *\\n     * @param {HTMLVideoElement} video\\n     * @param {Template} template\\n     * @returns {Number}\\n     */\\n    getVideoDuration: (video: HTMLVideoElement, template: Template): number => {\\n        let duration = video.duration;\\n        if (duration === Infinity) {\\n            if (video.seekable.length > 0) {\\n                template.dtime.textContent = utils.secondToTime(video.seekable.end(0));\\n                duration = video.seekable.end(0);\\n            } else if (video.buffered.length > 0) {\\n                template.dtime.textContent = utils.secondToTime(video.buffered.end(0));\\n                duration = video.buffered.end(0);\\n            }\\n        }\\n        return duration;\\n    },\\n\\n    /**\\n     * Get the X coordinate of the pointer relative to a container element.\\n     * @param event - PointerEvent or TouchEvent.\\n     * @param container - The container to calculate relative coordinate for.\\n     * @returns The relative X coordinate in pixels.\\n     */\\n    getRelativeX: (event: PointerEvent | TouchEvent | MouseEvent, container: HTMLElement): number => {\\n        const rect = container.getBoundingClientRect();\\n        let clientX: number;\\n        if ('touches' in event) {\\n            // If TouchEvent, use changedTouches if touches is empty\\n            if (event.touches.length > 0) {\\n                clientX = event.touches[0].clientX;\\n            } else if (event.changedTouches && event.changedTouches.length > 0) {\\n                clientX = event.changedTouches[0].clientX;\\n            } else {\\n                // If both are not available, return 0 (should not happen normally)\\n                clientX = 0;\\n            }\\n        } else {\\n            clientX = event.clientX;\\n        }\\n        return clientX - rect.left;\\n    },\\n\\n    getScrollPosition(): { left: number; top: number } {\\n        return {\\n            left: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0,\\n            top: window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0,\\n        };\\n    },\\n\\n    setScrollPosition({ left = 0, top = 0 }: { left: number; top: number; }): void {\\n        if (this.isFirefox) {\\n            document.documentElement.scrollLeft = left;\\n            document.documentElement.scrollTop = top;\\n        } else {\\n            window.scrollTo(left, top);\\n        }\\n    },\\n\\n    isMobile: isMobile,\\n\\n    isFirefox: /firefox/i.test(window.navigator.userAgent),\\n\\n    // ref: https://rnwest.engineer/detect-webkit/\\n    isWebKit: (/AppleWebKit/.test(window.navigator.userAgent) && !/Chrome/.test(window.navigator.userAgent)) ||\\n        /\\\\b(iPad|iPhone|iPod)\\\\b/.test(window.navigator.userAgent),\\n\\n    storage: {\\n        set: (key: string, value: any): void => {\\n            localStorage.setItem(key, value);\\n        },\\n\\n        get: (key: string): string | null => localStorage.getItem(key),\\n    },\\n\\n    nameMap: {\\n        dragStart: isMobile ? 'touchstart' : 'mousedown',\\n        dragMove: isMobile ? 'touchmove' : 'mousemove',\\n        dragEnd: isMobile ? 'touchend' : 'mouseup',\\n    },\\n\\n    // currently not used\\n    color2Number: (color: string): number => {\\n        if (color[0] === '#') {\\n            color = color.substr(1);\\n        }\\n        if (color.length === 3) {\\n            color = `${color[0]}${color[0]}${color[1]}${color[1]}${color[2]}${color[2]}`;\\n        }\\n        return (parseInt(color, 16) + 0x000000) & 0xffffff;\\n    },\\n\\n    number2Color: (number: number): string => '#' + ('00000' + number.toString(16)).slice(-6),\\n\\n    number2Type: (number: number): string => {\\n        switch (number) {\\n            case 0:\\n                return 'right';\\n            case 1:\\n                return 'top';\\n            case 2:\\n                return 'bottom';\\n            default:\\n                return 'right';\\n        }\\n    },\\n};\\n\\nexport default utils;\\n\",\"'use strict';\\n\\nexport default function bind(fn, thisArg) {\\n  return function wrap() {\\n    return fn.apply(thisArg, arguments);\\n  };\\n}\\n\",\"'use strict';\\n\\nimport bind from './helpers/bind.js';\\n\\n// utils is a library of generic helper functions non-specific to axios\\n\\nconst {toString} = Object.prototype;\\nconst {getPrototypeOf} = Object;\\nconst {iterator, toStringTag} = Symbol;\\n\\nconst kindOf = (cache => thing => {\\n    const str = toString.call(thing);\\n    return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\\n})(Object.create(null));\\n\\nconst kindOfTest = (type) => {\\n  type = type.toLowerCase();\\n  return (thing) => kindOf(thing) === type\\n}\\n\\nconst typeOfTest = type => thing => typeof thing === type;\\n\\n/**\\n * Determine if a value is an Array\\n *\\n * @param {Object} val The value to test\\n *\\n * @returns {boolean} True if value is an Array, otherwise false\\n */\\nconst {isArray} = Array;\\n\\n/**\\n * Determine if a value is undefined\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if the value is undefined, otherwise false\\n */\\nconst isUndefined = typeOfTest('undefined');\\n\\n/**\\n * Determine if a value is a Buffer\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a Buffer, otherwise false\\n */\\nfunction isBuffer(val) {\\n  return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\\n    && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\\n}\\n\\n/**\\n * Determine if a value is an ArrayBuffer\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\\n */\\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\\n\\n\\n/**\\n * Determine if a value is a view on an ArrayBuffer\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\\n */\\nfunction isArrayBufferView(val) {\\n  let result;\\n  if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\\n    result = ArrayBuffer.isView(val);\\n  } else {\\n    result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\\n  }\\n  return result;\\n}\\n\\n/**\\n * Determine if a value is a String\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a String, otherwise false\\n */\\nconst isString = typeOfTest('string');\\n\\n/**\\n * Determine if a value is a Function\\n *\\n * @param {*} val The value to test\\n * @returns {boolean} True if value is a Function, otherwise false\\n */\\nconst isFunction = typeOfTest('function');\\n\\n/**\\n * Determine if a value is a Number\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a Number, otherwise false\\n */\\nconst isNumber = typeOfTest('number');\\n\\n/**\\n * Determine if a value is an Object\\n *\\n * @param {*} thing The value to test\\n *\\n * @returns {boolean} True if value is an Object, otherwise false\\n */\\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\\n\\n/**\\n * Determine if a value is a Boolean\\n *\\n * @param {*} thing The value to test\\n * @returns {boolean} True if value is a Boolean, otherwise false\\n */\\nconst isBoolean = thing => thing === true || thing === false;\\n\\n/**\\n * Determine if a value is a plain Object\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a plain Object, otherwise false\\n */\\nconst isPlainObject = (val) => {\\n  if (kindOf(val) !== 'object') {\\n    return false;\\n  }\\n\\n  const prototype = getPrototypeOf(val);\\n  return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);\\n}\\n\\n/**\\n * Determine if a value is an empty object (safely handles Buffers)\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is an empty object, otherwise false\\n */\\nconst isEmptyObject = (val) => {\\n  // Early return for non-objects or Buffers to prevent RangeError\\n  if (!isObject(val) || isBuffer(val)) {\\n    return false;\\n  }\\n\\n  try {\\n    return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;\\n  } catch (e) {\\n    // Fallback for any other objects that might cause RangeError with Object.keys()\\n    return false;\\n  }\\n}\\n\\n/**\\n * Determine if a value is a Date\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a Date, otherwise false\\n */\\nconst isDate = kindOfTest('Date');\\n\\n/**\\n * Determine if a value is a File\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a File, otherwise false\\n */\\nconst isFile = kindOfTest('File');\\n\\n/**\\n * Determine if a value is a Blob\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a Blob, otherwise false\\n */\\nconst isBlob = kindOfTest('Blob');\\n\\n/**\\n * Determine if a value is a FileList\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a File, otherwise false\\n */\\nconst isFileList = kindOfTest('FileList');\\n\\n/**\\n * Determine if a value is a Stream\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a Stream, otherwise false\\n */\\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\\n\\n/**\\n * Determine if a value is a FormData\\n *\\n * @param {*} thing The value to test\\n *\\n * @returns {boolean} True if value is an FormData, otherwise false\\n */\\nconst isFormData = (thing) => {\\n  let kind;\\n  return thing && (\\n    (typeof FormData === 'function' && thing instanceof FormData) || (\\n      isFunction(thing.append) && (\\n        (kind = kindOf(thing)) === 'formdata' ||\\n        // detect form-data instance\\n        (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\\n      )\\n    )\\n  )\\n}\\n\\n/**\\n * Determine if a value is a URLSearchParams object\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\\n */\\nconst isURLSearchParams = kindOfTest('URLSearchParams');\\n\\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\\n\\n/**\\n * Trim excess whitespace off the beginning and end of a string\\n *\\n * @param {String} str The String to trim\\n *\\n * @returns {String} The String freed of excess whitespace\\n */\\nconst trim = (str) => str.trim ?\\n  str.trim() : str.replace(/^[\\\\s\\\\uFEFF\\\\xA0]+|[\\\\s\\\\uFEFF\\\\xA0]+$/g, '');\\n\\n/**\\n * Iterate over an Array or an Object invoking a function for each item.\\n *\\n * If `obj` is an Array callback will be called passing\\n * the value, index, and complete array for each item.\\n *\\n * If 'obj' is an Object callback will be called passing\\n * the value, key, and complete object for each property.\\n *\\n * @param {Object|Array} obj The object to iterate\\n * @param {Function} fn The callback to invoke for each item\\n *\\n * @param {Boolean} [allOwnKeys = false]\\n * @returns {any}\\n */\\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\\n  // Don't bother if no value provided\\n  if (obj === null || typeof obj === 'undefined') {\\n    return;\\n  }\\n\\n  let i;\\n  let l;\\n\\n  // Force an array if not already something iterable\\n  if (typeof obj !== 'object') {\\n    /*eslint no-param-reassign:0*/\\n    obj = [obj];\\n  }\\n\\n  if (isArray(obj)) {\\n    // Iterate over array values\\n    for (i = 0, l = obj.length; i < l; i++) {\\n      fn.call(null, obj[i], i, obj);\\n    }\\n  } else {\\n    // Buffer check\\n    if (isBuffer(obj)) {\\n      return;\\n    }\\n\\n    // Iterate over object keys\\n    const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\\n    const len = keys.length;\\n    let key;\\n\\n    for (i = 0; i < len; i++) {\\n      key = keys[i];\\n      fn.call(null, obj[key], key, obj);\\n    }\\n  }\\n}\\n\\nfunction findKey(obj, key) {\\n  if (isBuffer(obj)){\\n    return null;\\n  }\\n\\n  key = key.toLowerCase();\\n  const keys = Object.keys(obj);\\n  let i = keys.length;\\n  let _key;\\n  while (i-- > 0) {\\n    _key = keys[i];\\n    if (key === _key.toLowerCase()) {\\n      return _key;\\n    }\\n  }\\n  return null;\\n}\\n\\nconst _global = (() => {\\n  /*eslint no-undef:0*/\\n  if (typeof globalThis !== \\\"undefined\\\") return globalThis;\\n  return typeof self !== \\\"undefined\\\" ? self : (typeof window !== 'undefined' ? window : global)\\n})();\\n\\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\\n\\n/**\\n * Accepts varargs expecting each argument to be an object, then\\n * immutably merges the properties of each object and returns result.\\n *\\n * When multiple objects contain the same key the later object in\\n * the arguments list will take precedence.\\n *\\n * Example:\\n *\\n * ```js\\n * var result = merge({foo: 123}, {foo: 456});\\n * console.log(result.foo); // outputs 456\\n * ```\\n *\\n * @param {Object} obj1 Object to merge\\n *\\n * @returns {Object} Result of all merge properties\\n */\\nfunction merge(/* obj1, obj2, obj3, ... */) {\\n  const {caseless, skipUndefined} = isContextDefined(this) && this || {};\\n  const result = {};\\n  const assignValue = (val, key) => {\\n    const targetKey = caseless && findKey(result, key) || key;\\n    if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\\n      result[targetKey] = merge(result[targetKey], val);\\n    } else if (isPlainObject(val)) {\\n      result[targetKey] = merge({}, val);\\n    } else if (isArray(val)) {\\n      result[targetKey] = val.slice();\\n    } else if (!skipUndefined || !isUndefined(val)) {\\n      result[targetKey] = val;\\n    }\\n  }\\n\\n  for (let i = 0, l = arguments.length; i < l; i++) {\\n    arguments[i] && forEach(arguments[i], assignValue);\\n  }\\n  return result;\\n}\\n\\n/**\\n * Extends object a by mutably adding to it the properties of object b.\\n *\\n * @param {Object} a The object to be extended\\n * @param {Object} b The object to copy properties from\\n * @param {Object} thisArg The object to bind function to\\n *\\n * @param {Boolean} [allOwnKeys]\\n * @returns {Object} The resulting value of object a\\n */\\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\\n  forEach(b, (val, key) => {\\n    if (thisArg && isFunction(val)) {\\n      a[key] = bind(val, thisArg);\\n    } else {\\n      a[key] = val;\\n    }\\n  }, {allOwnKeys});\\n  return a;\\n}\\n\\n/**\\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\\n *\\n * @param {string} content with BOM\\n *\\n * @returns {string} content value without BOM\\n */\\nconst stripBOM = (content) => {\\n  if (content.charCodeAt(0) === 0xFEFF) {\\n    content = content.slice(1);\\n  }\\n  return content;\\n}\\n\\n/**\\n * Inherit the prototype methods from one constructor into another\\n * @param {function} constructor\\n * @param {function} superConstructor\\n * @param {object} [props]\\n * @param {object} [descriptors]\\n *\\n * @returns {void}\\n */\\nconst inherits = (constructor, superConstructor, props, descriptors) => {\\n  constructor.prototype = Object.create(superConstructor.prototype, descriptors);\\n  constructor.prototype.constructor = constructor;\\n  Object.defineProperty(constructor, 'super', {\\n    value: superConstructor.prototype\\n  });\\n  props && Object.assign(constructor.prototype, props);\\n}\\n\\n/**\\n * Resolve object with deep prototype chain to a flat object\\n * @param {Object} sourceObj source object\\n * @param {Object} [destObj]\\n * @param {Function|Boolean} [filter]\\n * @param {Function} [propFilter]\\n *\\n * @returns {Object}\\n */\\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\\n  let props;\\n  let i;\\n  let prop;\\n  const merged = {};\\n\\n  destObj = destObj || {};\\n  // eslint-disable-next-line no-eq-null,eqeqeq\\n  if (sourceObj == null) return destObj;\\n\\n  do {\\n    props = Object.getOwnPropertyNames(sourceObj);\\n    i = props.length;\\n    while (i-- > 0) {\\n      prop = props[i];\\n      if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\\n        destObj[prop] = sourceObj[prop];\\n        merged[prop] = true;\\n      }\\n    }\\n    sourceObj = filter !== false && getPrototypeOf(sourceObj);\\n  } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\\n\\n  return destObj;\\n}\\n\\n/**\\n * Determines whether a string ends with the characters of a specified string\\n *\\n * @param {String} str\\n * @param {String} searchString\\n * @param {Number} [position= 0]\\n *\\n * @returns {boolean}\\n */\\nconst endsWith = (str, searchString, position) => {\\n  str = String(str);\\n  if (position === undefined || position > str.length) {\\n    position = str.length;\\n  }\\n  position -= searchString.length;\\n  const lastIndex = str.indexOf(searchString, position);\\n  return lastIndex !== -1 && lastIndex === position;\\n}\\n\\n\\n/**\\n * Returns new array from array like object or null if failed\\n *\\n * @param {*} [thing]\\n *\\n * @returns {?Array}\\n */\\nconst toArray = (thing) => {\\n  if (!thing) return null;\\n  if (isArray(thing)) return thing;\\n  let i = thing.length;\\n  if (!isNumber(i)) return null;\\n  const arr = new Array(i);\\n  while (i-- > 0) {\\n    arr[i] = thing[i];\\n  }\\n  return arr;\\n}\\n\\n/**\\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\\n * thing passed in is an instance of Uint8Array\\n *\\n * @param {TypedArray}\\n *\\n * @returns {Array}\\n */\\n// eslint-disable-next-line func-names\\nconst isTypedArray = (TypedArray => {\\n  // eslint-disable-next-line func-names\\n  return thing => {\\n    return TypedArray && thing instanceof TypedArray;\\n  };\\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\\n\\n/**\\n * For each entry in the object, call the function with the key and value.\\n *\\n * @param {Object<any, any>} obj - The object to iterate over.\\n * @param {Function} fn - The function to call for each entry.\\n *\\n * @returns {void}\\n */\\nconst forEachEntry = (obj, fn) => {\\n  const generator = obj && obj[iterator];\\n\\n  const _iterator = generator.call(obj);\\n\\n  let result;\\n\\n  while ((result = _iterator.next()) && !result.done) {\\n    const pair = result.value;\\n    fn.call(obj, pair[0], pair[1]);\\n  }\\n}\\n\\n/**\\n * It takes a regular expression and a string, and returns an array of all the matches\\n *\\n * @param {string} regExp - The regular expression to match against.\\n * @param {string} str - The string to search.\\n *\\n * @returns {Array<boolean>}\\n */\\nconst matchAll = (regExp, str) => {\\n  let matches;\\n  const arr = [];\\n\\n  while ((matches = regExp.exec(str)) !== null) {\\n    arr.push(matches);\\n  }\\n\\n  return arr;\\n}\\n\\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\\nconst isHTMLForm = kindOfTest('HTMLFormElement');\\n\\nconst toCamelCase = str => {\\n  return str.toLowerCase().replace(/[-_\\\\s]([a-z\\\\d])(\\\\w*)/g,\\n    function replacer(m, p1, p2) {\\n      return p1.toUpperCase() + p2;\\n    }\\n  );\\n};\\n\\n/* Creating a function that will check if an object has a property. */\\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\\n\\n/**\\n * Determine if a value is a RegExp object\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a RegExp object, otherwise false\\n */\\nconst isRegExp = kindOfTest('RegExp');\\n\\nconst reduceDescriptors = (obj, reducer) => {\\n  const descriptors = Object.getOwnPropertyDescriptors(obj);\\n  const reducedDescriptors = {};\\n\\n  forEach(descriptors, (descriptor, name) => {\\n    let ret;\\n    if ((ret = reducer(descriptor, name, obj)) !== false) {\\n      reducedDescriptors[name] = ret || descriptor;\\n    }\\n  });\\n\\n  Object.defineProperties(obj, reducedDescriptors);\\n}\\n\\n/**\\n * Makes all methods read-only\\n * @param {Object} obj\\n */\\n\\nconst freezeMethods = (obj) => {\\n  reduceDescriptors(obj, (descriptor, name) => {\\n    // skip restricted props in strict mode\\n    if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\\n      return false;\\n    }\\n\\n    const value = obj[name];\\n\\n    if (!isFunction(value)) return;\\n\\n    descriptor.enumerable = false;\\n\\n    if ('writable' in descriptor) {\\n      descriptor.writable = false;\\n      return;\\n    }\\n\\n    if (!descriptor.set) {\\n      descriptor.set = () => {\\n        throw Error('Can not rewrite read-only method \\\\'' + name + '\\\\'');\\n      };\\n    }\\n  });\\n}\\n\\nconst toObjectSet = (arrayOrString, delimiter) => {\\n  const obj = {};\\n\\n  const define = (arr) => {\\n    arr.forEach(value => {\\n      obj[value] = true;\\n    });\\n  }\\n\\n  isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\\n\\n  return obj;\\n}\\n\\nconst noop = () => {}\\n\\nconst toFiniteNumber = (value, defaultValue) => {\\n  return value != null && Number.isFinite(value = +value) ? value : defaultValue;\\n}\\n\\n\\n\\n/**\\n * If the thing is a FormData object, return true, otherwise return false.\\n *\\n * @param {unknown} thing - The thing to check.\\n *\\n * @returns {boolean}\\n */\\nfunction isSpecCompliantForm(thing) {\\n  return !!(thing && isFunction(thing.append) && thing[toStringTag] === 'FormData' && thing[iterator]);\\n}\\n\\nconst toJSONObject = (obj) => {\\n  const stack = new Array(10);\\n\\n  const visit = (source, i) => {\\n\\n    if (isObject(source)) {\\n      if (stack.indexOf(source) >= 0) {\\n        return;\\n      }\\n\\n      //Buffer check\\n      if (isBuffer(source)) {\\n        return source;\\n      }\\n\\n      if(!('toJSON' in source)) {\\n        stack[i] = source;\\n        const target = isArray(source) ? [] : {};\\n\\n        forEach(source, (value, key) => {\\n          const reducedValue = visit(value, i + 1);\\n          !isUndefined(reducedValue) && (target[key] = reducedValue);\\n        });\\n\\n        stack[i] = undefined;\\n\\n        return target;\\n      }\\n    }\\n\\n    return source;\\n  }\\n\\n  return visit(obj, 0);\\n}\\n\\nconst isAsyncFn = kindOfTest('AsyncFunction');\\n\\nconst isThenable = (thing) =>\\n  thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\\n\\n// original code\\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\\n\\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\\n  if (setImmediateSupported) {\\n    return setImmediate;\\n  }\\n\\n  return postMessageSupported ? ((token, callbacks) => {\\n    _global.addEventListener(\\\"message\\\", ({source, data}) => {\\n      if (source === _global && data === token) {\\n        callbacks.length && callbacks.shift()();\\n      }\\n    }, false);\\n\\n    return (cb) => {\\n      callbacks.push(cb);\\n      _global.postMessage(token, \\\"*\\\");\\n    }\\n  })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\\n})(\\n  typeof setImmediate === 'function',\\n  isFunction(_global.postMessage)\\n);\\n\\nconst asap = typeof queueMicrotask !== 'undefined' ?\\n  queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\\n\\n// *********************\\n\\n\\nconst isIterable = (thing) => thing != null && isFunction(thing[iterator]);\\n\\n\\nexport default {\\n  isArray,\\n  isArrayBuffer,\\n  isBuffer,\\n  isFormData,\\n  isArrayBufferView,\\n  isString,\\n  isNumber,\\n  isBoolean,\\n  isObject,\\n  isPlainObject,\\n  isEmptyObject,\\n  isReadableStream,\\n  isRequest,\\n  isResponse,\\n  isHeaders,\\n  isUndefined,\\n  isDate,\\n  isFile,\\n  isBlob,\\n  isRegExp,\\n  isFunction,\\n  isStream,\\n  isURLSearchParams,\\n  isTypedArray,\\n  isFileList,\\n  forEach,\\n  merge,\\n  extend,\\n  trim,\\n  stripBOM,\\n  inherits,\\n  toFlatObject,\\n  kindOf,\\n  kindOfTest,\\n  endsWith,\\n  toArray,\\n  forEachEntry,\\n  matchAll,\\n  isHTMLForm,\\n  hasOwnProperty,\\n  hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\\n  reduceDescriptors,\\n  freezeMethods,\\n  toObjectSet,\\n  toCamelCase,\\n  noop,\\n  toFiniteNumber,\\n  findKey,\\n  global: _global,\\n  isContextDefined,\\n  isSpecCompliantForm,\\n  toJSONObject,\\n  isAsyncFn,\\n  isThenable,\\n  setImmediate: _setImmediate,\\n  asap,\\n  isIterable\\n};\\n\",\"'use strict';\\n\\nimport utils from '../utils.js';\\n\\n/**\\n * Create an Error with the specified message, config, error code, request and response.\\n *\\n * @param {string} message The error message.\\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\\n * @param {Object} [config] The config.\\n * @param {Object} [request] The request.\\n * @param {Object} [response] The response.\\n *\\n * @returns {Error} The created error.\\n */\\nfunction AxiosError(message, code, config, request, response) {\\n  Error.call(this);\\n\\n  if (Error.captureStackTrace) {\\n    Error.captureStackTrace(this, this.constructor);\\n  } else {\\n    this.stack = (new Error()).stack;\\n  }\\n\\n  this.message = message;\\n  this.name = 'AxiosError';\\n  code && (this.code = code);\\n  config && (this.config = config);\\n  request && (this.request = request);\\n  if (response) {\\n    this.response = response;\\n    this.status = response.status ? response.status : null;\\n  }\\n}\\n\\nutils.inherits(AxiosError, Error, {\\n  toJSON: function toJSON() {\\n    return {\\n      // Standard\\n      message: this.message,\\n      name: this.name,\\n      // Microsoft\\n      description: this.description,\\n      number: this.number,\\n      // Mozilla\\n      fileName: this.fileName,\\n      lineNumber: this.lineNumber,\\n      columnNumber: this.columnNumber,\\n      stack: this.stack,\\n      // Axios\\n      config: utils.toJSONObject(this.config),\\n      code: this.code,\\n      status: this.status\\n    };\\n  }\\n});\\n\\nconst prototype = AxiosError.prototype;\\nconst descriptors = {};\\n\\n[\\n  'ERR_BAD_OPTION_VALUE',\\n  'ERR_BAD_OPTION',\\n  'ECONNABORTED',\\n  'ETIMEDOUT',\\n  'ERR_NETWORK',\\n  'ERR_FR_TOO_MANY_REDIRECTS',\\n  'ERR_DEPRECATED',\\n  'ERR_BAD_RESPONSE',\\n  'ERR_BAD_REQUEST',\\n  'ERR_CANCELED',\\n  'ERR_NOT_SUPPORT',\\n  'ERR_INVALID_URL'\\n// eslint-disable-next-line func-names\\n].forEach(code => {\\n  descriptors[code] = {value: code};\\n});\\n\\nObject.defineProperties(AxiosError, descriptors);\\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\\n\\n// eslint-disable-next-line func-names\\nAxiosError.from = (error, code, config, request, response, customProps) => {\\n  const axiosError = Object.create(prototype);\\n\\n  utils.toFlatObject(error, axiosError, function filter(obj) {\\n    return obj !== Error.prototype;\\n  }, prop => {\\n    return prop !== 'isAxiosError';\\n  });\\n\\n  const msg = error && error.message ? error.message : 'Error';\\n\\n  // Prefer explicit code; otherwise copy the low-level error's code (e.g. ECONNREFUSED)\\n  const errCode = code == null && error ? error.code : code;\\n  AxiosError.call(axiosError, msg, errCode, config, request, response);\\n\\n  // Chain the original error on the standard field; non-enumerable to avoid JSON noise\\n  if (error && axiosError.cause == null) {\\n    Object.defineProperty(axiosError, 'cause', { value: error, configurable: true });\\n  }\\n\\n  axiosError.name = (error && error.name) || 'Error';\\n\\n  customProps && Object.assign(axiosError, customProps);\\n\\n  return axiosError;\\n};\\n\\nexport default AxiosError;\\n\",\"'use strict';\\n\\nimport utils from '../utils.js';\\nimport AxiosError from '../core/AxiosError.js';\\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\\nimport PlatformFormData from '../platform/node/classes/FormData.js';\\n\\n/**\\n * Determines if the given thing is a array or js object.\\n *\\n * @param {string} thing - The object or array to be visited.\\n *\\n * @returns {boolean}\\n */\\nfunction isVisitable(thing) {\\n  return utils.isPlainObject(thing) || utils.isArray(thing);\\n}\\n\\n/**\\n * It removes the brackets from the end of a string\\n *\\n * @param {string} key - The key of the parameter.\\n *\\n * @returns {string} the key without the brackets.\\n */\\nfunction removeBrackets(key) {\\n  return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\\n}\\n\\n/**\\n * It takes a path, a key, and a boolean, and returns a string\\n *\\n * @param {string} path - The path to the current key.\\n * @param {string} key - The key of the current object being iterated over.\\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\\n *\\n * @returns {string} The path to the current key.\\n */\\nfunction renderKey(path, key, dots) {\\n  if (!path) return key;\\n  return path.concat(key).map(function each(token, i) {\\n    // eslint-disable-next-line no-param-reassign\\n    token = removeBrackets(token);\\n    return !dots && i ? '[' + token + ']' : token;\\n  }).join(dots ? '.' : '');\\n}\\n\\n/**\\n * If the array is an array and none of its elements are visitable, then it's a flat array.\\n *\\n * @param {Array<any>} arr - The array to check\\n *\\n * @returns {boolean}\\n */\\nfunction isFlatArray(arr) {\\n  return utils.isArray(arr) && !arr.some(isVisitable);\\n}\\n\\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\\n  return /^is[A-Z]/.test(prop);\\n});\\n\\n/**\\n * Convert a data object to FormData\\n *\\n * @param {Object} obj\\n * @param {?Object} [formData]\\n * @param {?Object} [options]\\n * @param {Function} [options.visitor]\\n * @param {Boolean} [options.metaTokens = true]\\n * @param {Boolean} [options.dots = false]\\n * @param {?Boolean} [options.indexes = false]\\n *\\n * @returns {Object}\\n **/\\n\\n/**\\n * It converts an object into a FormData object\\n *\\n * @param {Object<any, any>} obj - The object to convert to form data.\\n * @param {string} formData - The FormData object to append to.\\n * @param {Object<string, any>} options\\n *\\n * @returns\\n */\\nfunction toFormData(obj, formData, options) {\\n  if (!utils.isObject(obj)) {\\n    throw new TypeError('target must be an object');\\n  }\\n\\n  // eslint-disable-next-line no-param-reassign\\n  formData = formData || new (PlatformFormData || FormData)();\\n\\n  // eslint-disable-next-line no-param-reassign\\n  options = utils.toFlatObject(options, {\\n    metaTokens: true,\\n    dots: false,\\n    indexes: false\\n  }, false, function defined(option, source) {\\n    // eslint-disable-next-line no-eq-null,eqeqeq\\n    return !utils.isUndefined(source[option]);\\n  });\\n\\n  const metaTokens = options.metaTokens;\\n  // eslint-disable-next-line no-use-before-define\\n  const visitor = options.visitor || defaultVisitor;\\n  const dots = options.dots;\\n  const indexes = options.indexes;\\n  const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\\n  const useBlob = _Blob && utils.isSpecCompliantForm(formData);\\n\\n  if (!utils.isFunction(visitor)) {\\n    throw new TypeError('visitor must be a function');\\n  }\\n\\n  function convertValue(value) {\\n    if (value === null) return '';\\n\\n    if (utils.isDate(value)) {\\n      return value.toISOString();\\n    }\\n\\n    if (utils.isBoolean(value)) {\\n      return value.toString();\\n    }\\n\\n    if (!useBlob && utils.isBlob(value)) {\\n      throw new AxiosError('Blob is not supported. Use a Buffer instead.');\\n    }\\n\\n    if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\\n      return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\\n    }\\n\\n    return value;\\n  }\\n\\n  /**\\n   * Default visitor.\\n   *\\n   * @param {*} value\\n   * @param {String|Number} key\\n   * @param {Array<String|Number>} path\\n   * @this {FormData}\\n   *\\n   * @returns {boolean} return true to visit the each prop of the value recursively\\n   */\\n  function defaultVisitor(value, key, path) {\\n    let arr = value;\\n\\n    if (value && !path && typeof value === 'object') {\\n      if (utils.endsWith(key, '{}')) {\\n        // eslint-disable-next-line no-param-reassign\\n        key = metaTokens ? key : key.slice(0, -2);\\n        // eslint-disable-next-line no-param-reassign\\n        value = JSON.stringify(value);\\n      } else if (\\n        (utils.isArray(value) && isFlatArray(value)) ||\\n        ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\\n        )) {\\n        // eslint-disable-next-line no-param-reassign\\n        key = removeBrackets(key);\\n\\n        arr.forEach(function each(el, index) {\\n          !(utils.isUndefined(el) || el === null) && formData.append(\\n            // eslint-disable-next-line no-nested-ternary\\n            indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\\n            convertValue(el)\\n          );\\n        });\\n        return false;\\n      }\\n    }\\n\\n    if (isVisitable(value)) {\\n      return true;\\n    }\\n\\n    formData.append(renderKey(path, key, dots), convertValue(value));\\n\\n    return false;\\n  }\\n\\n  const stack = [];\\n\\n  const exposedHelpers = Object.assign(predicates, {\\n    defaultVisitor,\\n    convertValue,\\n    isVisitable\\n  });\\n\\n  function build(value, path) {\\n    if (utils.isUndefined(value)) return;\\n\\n    if (stack.indexOf(value) !== -1) {\\n      throw Error('Circular reference detected in ' + path.join('.'));\\n    }\\n\\n    stack.push(value);\\n\\n    utils.forEach(value, function each(el, key) {\\n      const result = !(utils.isUndefined(el) || el === null) && visitor.call(\\n        formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\\n      );\\n\\n      if (result === true) {\\n        build(el, path ? path.concat(key) : [key]);\\n      }\\n    });\\n\\n    stack.pop();\\n  }\\n\\n  if (!utils.isObject(obj)) {\\n    throw new TypeError('data must be an object');\\n  }\\n\\n  build(obj);\\n\\n  return formData;\\n}\\n\\nexport default toFormData;\\n\",\"'use strict';\\n\\nimport toFormData from './toFormData.js';\\n\\n/**\\n * It encodes a string by replacing all characters that are not in the unreserved set with\\n * their percent-encoded equivalents\\n *\\n * @param {string} str - The string to encode.\\n *\\n * @returns {string} The encoded string.\\n */\\nfunction encode(str) {\\n  const charMap = {\\n    '!': '%21',\\n    \\\"'\\\": '%27',\\n    '(': '%28',\\n    ')': '%29',\\n    '~': '%7E',\\n    '%20': '+',\\n    '%00': '\\\\x00'\\n  };\\n  return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\\n    return charMap[match];\\n  });\\n}\\n\\n/**\\n * It takes a params object and converts it to a FormData object\\n *\\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\\n *\\n * @returns {void}\\n */\\nfunction AxiosURLSearchParams(params, options) {\\n  this._pairs = [];\\n\\n  params && toFormData(params, this, options);\\n}\\n\\nconst prototype = AxiosURLSearchParams.prototype;\\n\\nprototype.append = function append(name, value) {\\n  this._pairs.push([name, value]);\\n};\\n\\nprototype.toString = function toString(encoder) {\\n  const _encode = encoder ? function(value) {\\n    return encoder.call(this, value, encode);\\n  } : encode;\\n\\n  return this._pairs.map(function each(pair) {\\n    return _encode(pair[0]) + '=' + _encode(pair[1]);\\n  }, '').join('&');\\n};\\n\\nexport default AxiosURLSearchParams;\\n\",\"'use strict';\\n\\nimport utils from '../utils.js';\\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\\n\\n/**\\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\\n * URI encoded counterparts\\n *\\n * @param {string} val The value to be encoded.\\n *\\n * @returns {string} The encoded value.\\n */\\nfunction encode(val) {\\n  return encodeURIComponent(val).\\n    replace(/%3A/gi, ':').\\n    replace(/%24/g, '$').\\n    replace(/%2C/gi, ',').\\n    replace(/%20/g, '+');\\n}\\n\\n/**\\n * Build a URL by appending params to the end\\n *\\n * @param {string} url The base of the url (e.g., http://www.google.com)\\n * @param {object} [params] The params to be appended\\n * @param {?(object|Function)} options\\n *\\n * @returns {string} The formatted url\\n */\\nexport default function buildURL(url, params, options) {\\n  /*eslint no-param-reassign:0*/\\n  if (!params) {\\n    return url;\\n  }\\n  \\n  const _encode = options && options.encode || encode;\\n\\n  if (utils.isFunction(options)) {\\n    options = {\\n      serialize: options\\n    };\\n  } \\n\\n  const serializeFn = options && options.serialize;\\n\\n  let serializedParams;\\n\\n  if (serializeFn) {\\n    serializedParams = serializeFn(params, options);\\n  } else {\\n    serializedParams = utils.isURLSearchParams(params) ?\\n      params.toString() :\\n      new AxiosURLSearchParams(params, options).toString(_encode);\\n  }\\n\\n  if (serializedParams) {\\n    const hashmarkIndex = url.indexOf(\\\"#\\\");\\n\\n    if (hashmarkIndex !== -1) {\\n      url = url.slice(0, hashmarkIndex);\\n    }\\n    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\\n  }\\n\\n  return url;\\n}\\n\",\"'use strict';\\n\\nimport utils from './../utils.js';\\n\\nclass InterceptorManager {\\n  constructor() {\\n    this.handlers = [];\\n  }\\n\\n  /**\\n   * Add a new interceptor to the stack\\n   *\\n   * @param {Function} fulfilled The function to handle `then` for a `Promise`\\n   * @param {Function} rejected The function to handle `reject` for a `Promise`\\n   *\\n   * @return {Number} An ID used to remove interceptor later\\n   */\\n  use(fulfilled, rejected, options) {\\n    this.handlers.push({\\n      fulfilled,\\n      rejected,\\n      synchronous: options ? options.synchronous : false,\\n      runWhen: options ? options.runWhen : null\\n    });\\n    return this.handlers.length - 1;\\n  }\\n\\n  /**\\n   * Remove an interceptor from the stack\\n   *\\n   * @param {Number} id The ID that was returned by `use`\\n   *\\n   * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\\n   */\\n  eject(id) {\\n    if (this.handlers[id]) {\\n      this.handlers[id] = null;\\n    }\\n  }\\n\\n  /**\\n   * Clear all interceptors from the stack\\n   *\\n   * @returns {void}\\n   */\\n  clear() {\\n    if (this.handlers) {\\n      this.handlers = [];\\n    }\\n  }\\n\\n  /**\\n   * Iterate over all the registered interceptors\\n   *\\n   * This method is particularly useful for skipping over any\\n   * interceptors that may have become `null` calling `eject`.\\n   *\\n   * @param {Function} fn The function to call for each interceptor\\n   *\\n   * @returns {void}\\n   */\\n  forEach(fn) {\\n    utils.forEach(this.handlers, function forEachHandler(h) {\\n      if (h !== null) {\\n        fn(h);\\n      }\\n    });\\n  }\\n}\\n\\nexport default InterceptorManager;\\n\",\"'use strict';\\n\\nexport default {\\n  silentJSONParsing: true,\\n  forcedJSONParsing: true,\\n  clarifyTimeoutError: false\\n};\\n\",\"import URLSearchParams from './classes/URLSearchParams.js'\\nimport FormData from './classes/FormData.js'\\nimport Blob from './classes/Blob.js'\\n\\nexport default {\\n  isBrowser: true,\\n  classes: {\\n    URLSearchParams,\\n    FormData,\\n    Blob\\n  },\\n  protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\\n};\\n\",\"'use strict';\\n\\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\\n\",\"'use strict';\\n\\nexport default typeof FormData !== 'undefined' ? FormData : null;\\n\",\"'use strict'\\n\\nexport default typeof Blob !== 'undefined' ? Blob : null\\n\",\"const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\\n\\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\\n\\n/**\\n * Determine if we're running in a standard browser environment\\n *\\n * This allows axios to run in a web worker, and react-native.\\n * Both environments support XMLHttpRequest, but not fully standard globals.\\n *\\n * web workers:\\n *  typeof window -> undefined\\n *  typeof document -> undefined\\n *\\n * react-native:\\n *  navigator.product -> 'ReactNative'\\n * nativescript\\n *  navigator.product -> 'NativeScript' or 'NS'\\n *\\n * @returns {boolean}\\n */\\nconst hasStandardBrowserEnv = hasBrowserEnv &&\\n  (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\\n\\n/**\\n * Determine if we're running in a standard browser webWorker environment\\n *\\n * Although the `isStandardBrowserEnv` method indicates that\\n * `allows axios to run in a web worker`, the WebWorker will still be\\n * filtered out due to its judgment standard\\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\\n * This leads to a problem when axios post `FormData` in webWorker\\n */\\nconst hasStandardBrowserWebWorkerEnv = (() => {\\n  return (\\n    typeof WorkerGlobalScope !== 'undefined' &&\\n    // eslint-disable-next-line no-undef\\n    self instanceof WorkerGlobalScope &&\\n    typeof self.importScripts === 'function'\\n  );\\n})();\\n\\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\\n\\nexport {\\n  hasBrowserEnv,\\n  hasStandardBrowserWebWorkerEnv,\\n  hasStandardBrowserEnv,\\n  _navigator as navigator,\\n  origin\\n}\\n\",\"import platform from './node/index.js';\\nimport * as utils from './common/utils.js';\\n\\nexport default {\\n  ...utils,\\n  ...platform\\n}\\n\",\"'use strict';\\n\\nimport utils from '../utils.js';\\n\\n/**\\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\\n *\\n * @param {string} name - The name of the property to get.\\n *\\n * @returns An array of strings.\\n */\\nfunction parsePropPath(name) {\\n  // foo[x][y][z]\\n  // foo.x.y.z\\n  // foo-x-y-z\\n  // foo x y z\\n  return utils.matchAll(/\\\\w+|\\\\[(\\\\w*)]/g, name).map(match => {\\n    return match[0] === '[]' ? '' : match[1] || match[0];\\n  });\\n}\\n\\n/**\\n * Convert an array to an object.\\n *\\n * @param {Array<any>} arr - The array to convert to an object.\\n *\\n * @returns An object with the same keys and values as the array.\\n */\\nfunction arrayToObject(arr) {\\n  const obj = {};\\n  const keys = Object.keys(arr);\\n  let i;\\n  const len = keys.length;\\n  let key;\\n  for (i = 0; i < len; i++) {\\n    key = keys[i];\\n    obj[key] = arr[key];\\n  }\\n  return obj;\\n}\\n\\n/**\\n * It takes a FormData object and returns a JavaScript object\\n *\\n * @param {string} formData The FormData object to convert to JSON.\\n *\\n * @returns {Object<string, any> | null} The converted object.\\n */\\nfunction formDataToJSON(formData) {\\n  function buildPath(path, value, target, index) {\\n    let name = path[index++];\\n\\n    if (name === '__proto__') return true;\\n\\n    const isNumericKey = Number.isFinite(+name);\\n    const isLast = index >= path.length;\\n    name = !name && utils.isArray(target) ? target.length : name;\\n\\n    if (isLast) {\\n      if (utils.hasOwnProp(target, name)) {\\n        target[name] = [target[name], value];\\n      } else {\\n        target[name] = value;\\n      }\\n\\n      return !isNumericKey;\\n    }\\n\\n    if (!target[name] || !utils.isObject(target[name])) {\\n      target[name] = [];\\n    }\\n\\n    const result = buildPath(path, value, target[name], index);\\n\\n    if (result && utils.isArray(target[name])) {\\n      target[name] = arrayToObject(target[name]);\\n    }\\n\\n    return !isNumericKey;\\n  }\\n\\n  if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\\n    const obj = {};\\n\\n    utils.forEachEntry(formData, (name, value) => {\\n      buildPath(parsePropPath(name), value, obj, 0);\\n    });\\n\\n    return obj;\\n  }\\n\\n  return null;\\n}\\n\\nexport default formDataToJSON;\\n\",\"'use strict';\\n\\nimport utils from '../utils.js';\\nimport AxiosError from '../core/AxiosError.js';\\nimport transitionalDefaults from './transitional.js';\\nimport toFormData from '../helpers/toFormData.js';\\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\\nimport platform from '../platform/index.js';\\nimport formDataToJSON from '../helpers/formDataToJSON.js';\\n\\n/**\\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\\n * of the input\\n *\\n * @param {any} rawValue - The value to be stringified.\\n * @param {Function} parser - A function that parses a string into a JavaScript object.\\n * @param {Function} encoder - A function that takes a value and returns a string.\\n *\\n * @returns {string} A stringified version of the rawValue.\\n */\\nfunction stringifySafely(rawValue, parser, encoder) {\\n  if (utils.isString(rawValue)) {\\n    try {\\n      (parser || JSON.parse)(rawValue);\\n      return utils.trim(rawValue);\\n    } catch (e) {\\n      if (e.name !== 'SyntaxError') {\\n        throw e;\\n      }\\n    }\\n  }\\n\\n  return (encoder || JSON.stringify)(rawValue);\\n}\\n\\nconst defaults = {\\n\\n  transitional: transitionalDefaults,\\n\\n  adapter: ['xhr', 'http', 'fetch'],\\n\\n  transformRequest: [function transformRequest(data, headers) {\\n    const contentType = headers.getContentType() || '';\\n    const hasJSONContentType = contentType.indexOf('application/json') > -1;\\n    const isObjectPayload = utils.isObject(data);\\n\\n    if (isObjectPayload && utils.isHTMLForm(data)) {\\n      data = new FormData(data);\\n    }\\n\\n    const isFormData = utils.isFormData(data);\\n\\n    if (isFormData) {\\n      return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\\n    }\\n\\n    if (utils.isArrayBuffer(data) ||\\n      utils.isBuffer(data) ||\\n      utils.isStream(data) ||\\n      utils.isFile(data) ||\\n      utils.isBlob(data) ||\\n      utils.isReadableStream(data)\\n    ) {\\n      return data;\\n    }\\n    if (utils.isArrayBufferView(data)) {\\n      return data.buffer;\\n    }\\n    if (utils.isURLSearchParams(data)) {\\n      headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\\n      return data.toString();\\n    }\\n\\n    let isFileList;\\n\\n    if (isObjectPayload) {\\n      if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\\n        return toURLEncodedForm(data, this.formSerializer).toString();\\n      }\\n\\n      if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\\n        const _FormData = this.env && this.env.FormData;\\n\\n        return toFormData(\\n          isFileList ? {'files[]': data} : data,\\n          _FormData && new _FormData(),\\n          this.formSerializer\\n        );\\n      }\\n    }\\n\\n    if (isObjectPayload || hasJSONContentType ) {\\n      headers.setContentType('application/json', false);\\n      return stringifySafely(data);\\n    }\\n\\n    return data;\\n  }],\\n\\n  transformResponse: [function transformResponse(data) {\\n    const transitional = this.transitional || defaults.transitional;\\n    const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\\n    const JSONRequested = this.responseType === 'json';\\n\\n    if (utils.isResponse(data) || utils.isReadableStream(data)) {\\n      return data;\\n    }\\n\\n    if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\\n      const silentJSONParsing = transitional && transitional.silentJSONParsing;\\n      const strictJSONParsing = !silentJSONParsing && JSONRequested;\\n\\n      try {\\n        return JSON.parse(data, this.parseReviver);\\n      } catch (e) {\\n        if (strictJSONParsing) {\\n          if (e.name === 'SyntaxError') {\\n            throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\\n          }\\n          throw e;\\n        }\\n      }\\n    }\\n\\n    return data;\\n  }],\\n\\n  /**\\n   * A timeout in milliseconds to abort a request. If set to 0 (default) a\\n   * timeout is not created.\\n   */\\n  timeout: 0,\\n\\n  xsrfCookieName: 'XSRF-TOKEN',\\n  xsrfHeaderName: 'X-XSRF-TOKEN',\\n\\n  maxContentLength: -1,\\n  maxBodyLength: -1,\\n\\n  env: {\\n    FormData: platform.classes.FormData,\\n    Blob: platform.classes.Blob\\n  },\\n\\n  validateStatus: function validateStatus(status) {\\n    return status >= 200 && status < 300;\\n  },\\n\\n  headers: {\\n    common: {\\n      'Accept': 'application/json, text/plain, */*',\\n      'Content-Type': undefined\\n    }\\n  }\\n};\\n\\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\\n  defaults.headers[method] = {};\\n});\\n\\nexport default defaults;\\n\",\"'use strict';\\n\\nimport utils from '../utils.js';\\nimport toFormData from './toFormData.js';\\nimport platform from '../platform/index.js';\\n\\nexport default function toURLEncodedForm(data, options) {\\n  return toFormData(data, new platform.classes.URLSearchParams(), {\\n    visitor: function(value, key, path, helpers) {\\n      if (platform.isNode && utils.isBuffer(value)) {\\n        this.append(key, value.toString('base64'));\\n        return false;\\n      }\\n\\n      return helpers.defaultVisitor.apply(this, arguments);\\n    },\\n    ...options\\n  });\\n}\\n\",\"'use strict';\\n\\nimport utils from './../utils.js';\\n\\n// RawAxiosHeaders whose duplicates are ignored by node\\n// c.f. https://nodejs.org/api/http.html#http_message_headers\\nconst ignoreDuplicateOf = utils.toObjectSet([\\n  'age', 'authorization', 'content-length', 'content-type', 'etag',\\n  'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\\n  'last-modified', 'location', 'max-forwards', 'proxy-authorization',\\n  'referer', 'retry-after', 'user-agent'\\n]);\\n\\n/**\\n * Parse headers into an object\\n *\\n * ```\\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\\n * Content-Type: application/json\\n * Connection: keep-alive\\n * Transfer-Encoding: chunked\\n * ```\\n *\\n * @param {String} rawHeaders Headers needing to be parsed\\n *\\n * @returns {Object} Headers parsed into an object\\n */\\nexport default rawHeaders => {\\n  const parsed = {};\\n  let key;\\n  let val;\\n  let i;\\n\\n  rawHeaders && rawHeaders.split('\\\\n').forEach(function parser(line) {\\n    i = line.indexOf(':');\\n    key = line.substring(0, i).trim().toLowerCase();\\n    val = line.substring(i + 1).trim();\\n\\n    if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\\n      return;\\n    }\\n\\n    if (key === 'set-cookie') {\\n      if (parsed[key]) {\\n        parsed[key].push(val);\\n      } else {\\n        parsed[key] = [val];\\n      }\\n    } else {\\n      parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\\n    }\\n  });\\n\\n  return parsed;\\n};\\n\",\"'use strict';\\n\\nimport utils from '../utils.js';\\nimport parseHeaders from '../helpers/parseHeaders.js';\\n\\nconst $internals = Symbol('internals');\\n\\nfunction normalizeHeader(header) {\\n  return header && String(header).trim().toLowerCase();\\n}\\n\\nfunction normalizeValue(value) {\\n  if (value === false || value == null) {\\n    return value;\\n  }\\n\\n  return utils.isArray(value) ? value.map(normalizeValue) : String(value);\\n}\\n\\nfunction parseTokens(str) {\\n  const tokens = Object.create(null);\\n  const tokensRE = /([^\\\\s,;=]+)\\\\s*(?:=\\\\s*([^,;]+))?/g;\\n  let match;\\n\\n  while ((match = tokensRE.exec(str))) {\\n    tokens[match[1]] = match[2];\\n  }\\n\\n  return tokens;\\n}\\n\\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\\n\\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\\n  if (utils.isFunction(filter)) {\\n    return filter.call(this, value, header);\\n  }\\n\\n  if (isHeaderNameFilter) {\\n    value = header;\\n  }\\n\\n  if (!utils.isString(value)) return;\\n\\n  if (utils.isString(filter)) {\\n    return value.indexOf(filter) !== -1;\\n  }\\n\\n  if (utils.isRegExp(filter)) {\\n    return filter.test(value);\\n  }\\n}\\n\\nfunction formatHeader(header) {\\n  return header.trim()\\n    .toLowerCase().replace(/([a-z\\\\d])(\\\\w*)/g, (w, char, str) => {\\n      return char.toUpperCase() + str;\\n    });\\n}\\n\\nfunction buildAccessors(obj, header) {\\n  const accessorName = utils.toCamelCase(' ' + header);\\n\\n  ['get', 'set', 'has'].forEach(methodName => {\\n    Object.defineProperty(obj, methodName + accessorName, {\\n      value: function(arg1, arg2, arg3) {\\n        return this[methodName].call(this, header, arg1, arg2, arg3);\\n      },\\n      configurable: true\\n    });\\n  });\\n}\\n\\nclass AxiosHeaders {\\n  constructor(headers) {\\n    headers && this.set(headers);\\n  }\\n\\n  set(header, valueOrRewrite, rewrite) {\\n    const self = this;\\n\\n    function setHeader(_value, _header, _rewrite) {\\n      const lHeader = normalizeHeader(_header);\\n\\n      if (!lHeader) {\\n        throw new Error('header name must be a non-empty string');\\n      }\\n\\n      const key = utils.findKey(self, lHeader);\\n\\n      if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\\n        self[key || _header] = normalizeValue(_value);\\n      }\\n    }\\n\\n    const setHeaders = (headers, _rewrite) =>\\n      utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\\n\\n    if (utils.isPlainObject(header) || header instanceof this.constructor) {\\n      setHeaders(header, valueOrRewrite)\\n    } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\\n      setHeaders(parseHeaders(header), valueOrRewrite);\\n    } else if (utils.isObject(header) && utils.isIterable(header)) {\\n      let obj = {}, dest, key;\\n      for (const entry of header) {\\n        if (!utils.isArray(entry)) {\\n          throw TypeError('Object iterator must return a key-value pair');\\n        }\\n\\n        obj[key = entry[0]] = (dest = obj[key]) ?\\n          (utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];\\n      }\\n\\n      setHeaders(obj, valueOrRewrite)\\n    } else {\\n      header != null && setHeader(valueOrRewrite, header, rewrite);\\n    }\\n\\n    return this;\\n  }\\n\\n  get(header, parser) {\\n    header = normalizeHeader(header);\\n\\n    if (header) {\\n      const key = utils.findKey(this, header);\\n\\n      if (key) {\\n        const value = this[key];\\n\\n        if (!parser) {\\n          return value;\\n        }\\n\\n        if (parser === true) {\\n          return parseTokens(value);\\n        }\\n\\n        if (utils.isFunction(parser)) {\\n          return parser.call(this, value, key);\\n        }\\n\\n        if (utils.isRegExp(parser)) {\\n          return parser.exec(value);\\n        }\\n\\n        throw new TypeError('parser must be boolean|regexp|function');\\n      }\\n    }\\n  }\\n\\n  has(header, matcher) {\\n    header = normalizeHeader(header);\\n\\n    if (header) {\\n      const key = utils.findKey(this, header);\\n\\n      return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\\n    }\\n\\n    return false;\\n  }\\n\\n  delete(header, matcher) {\\n    const self = this;\\n    let deleted = false;\\n\\n    function deleteHeader(_header) {\\n      _header = normalizeHeader(_header);\\n\\n      if (_header) {\\n        const key = utils.findKey(self, _header);\\n\\n        if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\\n          delete self[key];\\n\\n          deleted = true;\\n        }\\n      }\\n    }\\n\\n    if (utils.isArray(header)) {\\n      header.forEach(deleteHeader);\\n    } else {\\n      deleteHeader(header);\\n    }\\n\\n    return deleted;\\n  }\\n\\n  clear(matcher) {\\n    const keys = Object.keys(this);\\n    let i = keys.length;\\n    let deleted = false;\\n\\n    while (i--) {\\n      const key = keys[i];\\n      if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\\n        delete this[key];\\n        deleted = true;\\n      }\\n    }\\n\\n    return deleted;\\n  }\\n\\n  normalize(format) {\\n    const self = this;\\n    const headers = {};\\n\\n    utils.forEach(this, (value, header) => {\\n      const key = utils.findKey(headers, header);\\n\\n      if (key) {\\n        self[key] = normalizeValue(value);\\n        delete self[header];\\n        return;\\n      }\\n\\n      const normalized = format ? formatHeader(header) : String(header).trim();\\n\\n      if (normalized !== header) {\\n        delete self[header];\\n      }\\n\\n      self[normalized] = normalizeValue(value);\\n\\n      headers[normalized] = true;\\n    });\\n\\n    return this;\\n  }\\n\\n  concat(...targets) {\\n    return this.constructor.concat(this, ...targets);\\n  }\\n\\n  toJSON(asStrings) {\\n    const obj = Object.create(null);\\n\\n    utils.forEach(this, (value, header) => {\\n      value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\\n    });\\n\\n    return obj;\\n  }\\n\\n  [Symbol.iterator]() {\\n    return Object.entries(this.toJSON())[Symbol.iterator]();\\n  }\\n\\n  toString() {\\n    return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\\\n');\\n  }\\n\\n  getSetCookie() {\\n    return this.get(\\\"set-cookie\\\") || [];\\n  }\\n\\n  get [Symbol.toStringTag]() {\\n    return 'AxiosHeaders';\\n  }\\n\\n  static from(thing) {\\n    return thing instanceof this ? thing : new this(thing);\\n  }\\n\\n  static concat(first, ...targets) {\\n    const computed = new this(first);\\n\\n    targets.forEach((target) => computed.set(target));\\n\\n    return computed;\\n  }\\n\\n  static accessor(header) {\\n    const internals = this[$internals] = (this[$internals] = {\\n      accessors: {}\\n    });\\n\\n    const accessors = internals.accessors;\\n    const prototype = this.prototype;\\n\\n    function defineAccessor(_header) {\\n      const lHeader = normalizeHeader(_header);\\n\\n      if (!accessors[lHeader]) {\\n        buildAccessors(prototype, _header);\\n        accessors[lHeader] = true;\\n      }\\n    }\\n\\n    utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\\n\\n    return this;\\n  }\\n}\\n\\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\\n\\n// reserved names hotfix\\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\\n  let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\\n  return {\\n    get: () => value,\\n    set(headerValue) {\\n      this[mapped] = headerValue;\\n    }\\n  }\\n});\\n\\nutils.freezeMethods(AxiosHeaders);\\n\\nexport default AxiosHeaders;\\n\",\"'use strict';\\n\\nimport utils from './../utils.js';\\nimport defaults from '../defaults/index.js';\\nimport AxiosHeaders from '../core/AxiosHeaders.js';\\n\\n/**\\n * Transform the data for a request or a response\\n *\\n * @param {Array|Function} fns A single function or Array of functions\\n * @param {?Object} response The response object\\n *\\n * @returns {*} The resulting transformed data\\n */\\nexport default function transformData(fns, response) {\\n  const config = this || defaults;\\n  const context = response || config;\\n  const headers = AxiosHeaders.from(context.headers);\\n  let data = context.data;\\n\\n  utils.forEach(fns, function transform(fn) {\\n    data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\\n  });\\n\\n  headers.normalize();\\n\\n  return data;\\n}\\n\",\"'use strict';\\n\\nexport default function isCancel(value) {\\n  return !!(value && value.__CANCEL__);\\n}\\n\",\"'use strict';\\n\\nimport AxiosError from '../core/AxiosError.js';\\nimport utils from '../utils.js';\\n\\n/**\\n * A `CanceledError` is an object that is thrown when an operation is canceled.\\n *\\n * @param {string=} message The message.\\n * @param {Object=} config The config.\\n * @param {Object=} request The request.\\n *\\n * @returns {CanceledError} The created error.\\n */\\nfunction CanceledError(message, config, request) {\\n  // eslint-disable-next-line no-eq-null,eqeqeq\\n  AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\\n  this.name = 'CanceledError';\\n}\\n\\nutils.inherits(CanceledError, AxiosError, {\\n  __CANCEL__: true\\n});\\n\\nexport default CanceledError;\\n\",\"'use strict';\\n\\nimport AxiosError from './AxiosError.js';\\n\\n/**\\n * Resolve or reject a Promise based on response status.\\n *\\n * @param {Function} resolve A function that resolves the promise.\\n * @param {Function} reject A function that rejects the promise.\\n * @param {object} response The response.\\n *\\n * @returns {object} The response.\\n */\\nexport default function settle(resolve, reject, response) {\\n  const validateStatus = response.config.validateStatus;\\n  if (!response.status || !validateStatus || validateStatus(response.status)) {\\n    resolve(response);\\n  } else {\\n    reject(new AxiosError(\\n      'Request failed with status code ' + response.status,\\n      [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\\n      response.config,\\n      response.request,\\n      response\\n    ));\\n  }\\n}\\n\",\"'use strict';\\n\\n/**\\n * Calculate data maxRate\\n * @param {Number} [samplesCount= 10]\\n * @param {Number} [min= 1000]\\n * @returns {Function}\\n */\\nfunction speedometer(samplesCount, min) {\\n  samplesCount = samplesCount || 10;\\n  const bytes = new Array(samplesCount);\\n  const timestamps = new Array(samplesCount);\\n  let head = 0;\\n  let tail = 0;\\n  let firstSampleTS;\\n\\n  min = min !== undefined ? min : 1000;\\n\\n  return function push(chunkLength) {\\n    const now = Date.now();\\n\\n    const startedAt = timestamps[tail];\\n\\n    if (!firstSampleTS) {\\n      firstSampleTS = now;\\n    }\\n\\n    bytes[head] = chunkLength;\\n    timestamps[head] = now;\\n\\n    let i = tail;\\n    let bytesCount = 0;\\n\\n    while (i !== head) {\\n      bytesCount += bytes[i++];\\n      i = i % samplesCount;\\n    }\\n\\n    head = (head + 1) % samplesCount;\\n\\n    if (head === tail) {\\n      tail = (tail + 1) % samplesCount;\\n    }\\n\\n    if (now - firstSampleTS < min) {\\n      return;\\n    }\\n\\n    const passed = startedAt && now - startedAt;\\n\\n    return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\\n  };\\n}\\n\\nexport default speedometer;\\n\",\"/**\\n * Throttle decorator\\n * @param {Function} fn\\n * @param {Number} freq\\n * @return {Function}\\n */\\nfunction throttle(fn, freq) {\\n  let timestamp = 0;\\n  let threshold = 1000 / freq;\\n  let lastArgs;\\n  let timer;\\n\\n  const invoke = (args, now = Date.now()) => {\\n    timestamp = now;\\n    lastArgs = null;\\n    if (timer) {\\n      clearTimeout(timer);\\n      timer = null;\\n    }\\n    fn(...args);\\n  }\\n\\n  const throttled = (...args) => {\\n    const now = Date.now();\\n    const passed = now - timestamp;\\n    if ( passed >= threshold) {\\n      invoke(args, now);\\n    } else {\\n      lastArgs = args;\\n      if (!timer) {\\n        timer = setTimeout(() => {\\n          timer = null;\\n          invoke(lastArgs)\\n        }, threshold - passed);\\n      }\\n    }\\n  }\\n\\n  const flush = () => lastArgs && invoke(lastArgs);\\n\\n  return [throttled, flush];\\n}\\n\\nexport default throttle;\\n\",\"import speedometer from \\\"./speedometer.js\\\";\\nimport throttle from \\\"./throttle.js\\\";\\nimport utils from \\\"../utils.js\\\";\\n\\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\\n  let bytesNotified = 0;\\n  const _speedometer = speedometer(50, 250);\\n\\n  return throttle(e => {\\n    const loaded = e.loaded;\\n    const total = e.lengthComputable ? e.total : undefined;\\n    const progressBytes = loaded - bytesNotified;\\n    const rate = _speedometer(progressBytes);\\n    const inRange = loaded <= total;\\n\\n    bytesNotified = loaded;\\n\\n    const data = {\\n      loaded,\\n      total,\\n      progress: total ? (loaded / total) : undefined,\\n      bytes: progressBytes,\\n      rate: rate ? rate : undefined,\\n      estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\\n      event: e,\\n      lengthComputable: total != null,\\n      [isDownloadStream ? 'download' : 'upload']: true\\n    };\\n\\n    listener(data);\\n  }, freq);\\n}\\n\\nexport const progressEventDecorator = (total, throttled) => {\\n  const lengthComputable = total != null;\\n\\n  return [(loaded) => throttled[0]({\\n    lengthComputable,\\n    total,\\n    loaded\\n  }), throttled[1]];\\n}\\n\\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\\n\",\"import platform from '../platform/index.js';\\n\\nexport default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\\n  url = new URL(url, platform.origin);\\n\\n  return (\\n    origin.protocol === url.protocol &&\\n    origin.host === url.host &&\\n    (isMSIE || origin.port === url.port)\\n  );\\n})(\\n  new URL(platform.origin),\\n  platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\\n) : () => true;\\n\",\"import utils from './../utils.js';\\nimport platform from '../platform/index.js';\\n\\nexport default platform.hasStandardBrowserEnv ?\\n\\n  // Standard browser envs support document.cookie\\n  {\\n    write(name, value, expires, path, domain, secure) {\\n      const cookie = [name + '=' + encodeURIComponent(value)];\\n\\n      utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\\n\\n      utils.isString(path) && cookie.push('path=' + path);\\n\\n      utils.isString(domain) && cookie.push('domain=' + domain);\\n\\n      secure === true && cookie.push('secure');\\n\\n      document.cookie = cookie.join('; ');\\n    },\\n\\n    read(name) {\\n      const match = document.cookie.match(new RegExp('(^|;\\\\\\\\s*)(' + name + ')=([^;]*)'));\\n      return (match ? decodeURIComponent(match[3]) : null);\\n    },\\n\\n    remove(name) {\\n      this.write(name, '', Date.now() - 86400000);\\n    }\\n  }\\n\\n  :\\n\\n  // Non-standard browser env (web workers, react-native) lack needed support.\\n  {\\n    write() {},\\n    read() {\\n      return null;\\n    },\\n    remove() {}\\n  };\\n\\n\",\"'use strict';\\n\\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\\nimport combineURLs from '../helpers/combineURLs.js';\\n\\n/**\\n * Creates a new URL by combining the baseURL with the requestedURL,\\n * only when the requestedURL is not already an absolute URL.\\n * If the requestURL is absolute, this function returns the requestedURL untouched.\\n *\\n * @param {string} baseURL The base URL\\n * @param {string} requestedURL Absolute or relative URL to combine\\n *\\n * @returns {string} The combined full path\\n */\\nexport default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\\n  let isRelativeUrl = !isAbsoluteURL(requestedURL);\\n  if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\\n    return combineURLs(baseURL, requestedURL);\\n  }\\n  return requestedURL;\\n}\\n\",\"'use strict';\\n\\n/**\\n * Determines whether the specified URL is absolute\\n *\\n * @param {string} url The URL to test\\n *\\n * @returns {boolean} True if the specified URL is absolute, otherwise false\\n */\\nexport default function isAbsoluteURL(url) {\\n  // A URL is considered absolute if it begins with \\\"<scheme>://\\\" or \\\"//\\\" (protocol-relative URL).\\n  // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\\n  // by any combination of letters, digits, plus, period, or hyphen.\\n  return /^([a-z][a-z\\\\d+\\\\-.]*:)?\\\\/\\\\//i.test(url);\\n}\\n\",\"'use strict';\\n\\n/**\\n * Creates a new URL by combining the specified URLs\\n *\\n * @param {string} baseURL The base URL\\n * @param {string} relativeURL The relative URL\\n *\\n * @returns {string} The combined URL\\n */\\nexport default function combineURLs(baseURL, relativeURL) {\\n  return relativeURL\\n    ? baseURL.replace(/\\\\/?\\\\/$/, '') + '/' + relativeURL.replace(/^\\\\/+/, '')\\n    : baseURL;\\n}\\n\",\"'use strict';\\n\\nimport utils from '../utils.js';\\nimport AxiosHeaders from \\\"./AxiosHeaders.js\\\";\\n\\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\\n\\n/**\\n * Config-specific merge-function which creates a new config-object\\n * by merging two configuration objects together.\\n *\\n * @param {Object} config1\\n * @param {Object} config2\\n *\\n * @returns {Object} New object resulting from merging config2 to config1\\n */\\nexport default function mergeConfig(config1, config2) {\\n  // eslint-disable-next-line no-param-reassign\\n  config2 = config2 || {};\\n  const config = {};\\n\\n  function getMergedValue(target, source, prop, caseless) {\\n    if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\\n      return utils.merge.call({caseless}, target, source);\\n    } else if (utils.isPlainObject(source)) {\\n      return utils.merge({}, source);\\n    } else if (utils.isArray(source)) {\\n      return source.slice();\\n    }\\n    return source;\\n  }\\n\\n  // eslint-disable-next-line consistent-return\\n  function mergeDeepProperties(a, b, prop , caseless) {\\n    if (!utils.isUndefined(b)) {\\n      return getMergedValue(a, b, prop , caseless);\\n    } else if (!utils.isUndefined(a)) {\\n      return getMergedValue(undefined, a, prop , caseless);\\n    }\\n  }\\n\\n  // eslint-disable-next-line consistent-return\\n  function valueFromConfig2(a, b) {\\n    if (!utils.isUndefined(b)) {\\n      return getMergedValue(undefined, b);\\n    }\\n  }\\n\\n  // eslint-disable-next-line consistent-return\\n  function defaultToConfig2(a, b) {\\n    if (!utils.isUndefined(b)) {\\n      return getMergedValue(undefined, b);\\n    } else if (!utils.isUndefined(a)) {\\n      return getMergedValue(undefined, a);\\n    }\\n  }\\n\\n  // eslint-disable-next-line consistent-return\\n  function mergeDirectKeys(a, b, prop) {\\n    if (prop in config2) {\\n      return getMergedValue(a, b);\\n    } else if (prop in config1) {\\n      return getMergedValue(undefined, a);\\n    }\\n  }\\n\\n  const mergeMap = {\\n    url: valueFromConfig2,\\n    method: valueFromConfig2,\\n    data: valueFromConfig2,\\n    baseURL: defaultToConfig2,\\n    transformRequest: defaultToConfig2,\\n    transformResponse: defaultToConfig2,\\n    paramsSerializer: defaultToConfig2,\\n    timeout: defaultToConfig2,\\n    timeoutMessage: defaultToConfig2,\\n    withCredentials: defaultToConfig2,\\n    withXSRFToken: defaultToConfig2,\\n    adapter: defaultToConfig2,\\n    responseType: defaultToConfig2,\\n    xsrfCookieName: defaultToConfig2,\\n    xsrfHeaderName: defaultToConfig2,\\n    onUploadProgress: defaultToConfig2,\\n    onDownloadProgress: defaultToConfig2,\\n    decompress: defaultToConfig2,\\n    maxContentLength: defaultToConfig2,\\n    maxBodyLength: defaultToConfig2,\\n    beforeRedirect: defaultToConfig2,\\n    transport: defaultToConfig2,\\n    httpAgent: defaultToConfig2,\\n    httpsAgent: defaultToConfig2,\\n    cancelToken: defaultToConfig2,\\n    socketPath: defaultToConfig2,\\n    responseEncoding: defaultToConfig2,\\n    validateStatus: mergeDirectKeys,\\n    headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)\\n  };\\n\\n  utils.forEach(Object.keys({...config1, ...config2}), function computeConfigValue(prop) {\\n    const merge = mergeMap[prop] || mergeDeepProperties;\\n    const configValue = merge(config1[prop], config2[prop], prop);\\n    (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\\n  });\\n\\n  return config;\\n}\\n\",\"import platform from \\\"../platform/index.js\\\";\\nimport utils from \\\"../utils.js\\\";\\nimport isURLSameOrigin from \\\"./isURLSameOrigin.js\\\";\\nimport cookies from \\\"./cookies.js\\\";\\nimport buildFullPath from \\\"../core/buildFullPath.js\\\";\\nimport mergeConfig from \\\"../core/mergeConfig.js\\\";\\nimport AxiosHeaders from \\\"../core/AxiosHeaders.js\\\";\\nimport buildURL from \\\"./buildURL.js\\\";\\n\\nexport default (config) => {\\n  const newConfig = mergeConfig({}, config);\\n\\n  let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;\\n\\n  newConfig.headers = headers = AxiosHeaders.from(headers);\\n\\n  newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);\\n\\n  // HTTP basic authentication\\n  if (auth) {\\n    headers.set('Authorization', 'Basic ' +\\n      btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\\n    );\\n  }\\n\\n  if (utils.isFormData(data)) {\\n    if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\\n      headers.setContentType(undefined); // browser handles it\\n    } else if (utils.isFunction(data.getHeaders)) {\\n      // Node.js FormData (like form-data package)\\n      const formHeaders = data.getHeaders();\\n      // Only set safe headers to avoid overwriting security headers\\n      const allowedHeaders = ['content-type', 'content-length'];\\n      Object.entries(formHeaders).forEach(([key, val]) => {\\n        if (allowedHeaders.includes(key.toLowerCase())) {\\n          headers.set(key, val);\\n        }\\n      });\\n    }\\n  }  \\n\\n  // Add xsrf header\\n  // This is only done if running in a standard browser environment.\\n  // Specifically not if we're in a web worker, or react-native.\\n\\n  if (platform.hasStandardBrowserEnv) {\\n    withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\\n\\n    if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\\n      // Add xsrf header\\n      const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\\n\\n      if (xsrfValue) {\\n        headers.set(xsrfHeaderName, xsrfValue);\\n      }\\n    }\\n  }\\n\\n  return newConfig;\\n}\\n\\n\",\"import utils from './../utils.js';\\nimport settle from './../core/settle.js';\\nimport transitionalDefaults from '../defaults/transitional.js';\\nimport AxiosError from '../core/AxiosError.js';\\nimport CanceledError from '../cancel/CanceledError.js';\\nimport parseProtocol from '../helpers/parseProtocol.js';\\nimport platform from '../platform/index.js';\\nimport AxiosHeaders from '../core/AxiosHeaders.js';\\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\\nimport resolveConfig from \\\"../helpers/resolveConfig.js\\\";\\n\\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\\n\\nexport default isXHRAdapterSupported && function (config) {\\n  return new Promise(function dispatchXhrRequest(resolve, reject) {\\n    const _config = resolveConfig(config);\\n    let requestData = _config.data;\\n    const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\\n    let {responseType, onUploadProgress, onDownloadProgress} = _config;\\n    let onCanceled;\\n    let uploadThrottled, downloadThrottled;\\n    let flushUpload, flushDownload;\\n\\n    function done() {\\n      flushUpload && flushUpload(); // flush events\\n      flushDownload && flushDownload(); // flush events\\n\\n      _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\\n\\n      _config.signal && _config.signal.removeEventListener('abort', onCanceled);\\n    }\\n\\n    let request = new XMLHttpRequest();\\n\\n    request.open(_config.method.toUpperCase(), _config.url, true);\\n\\n    // Set the request timeout in MS\\n    request.timeout = _config.timeout;\\n\\n    function onloadend() {\\n      if (!request) {\\n        return;\\n      }\\n      // Prepare the response\\n      const responseHeaders = AxiosHeaders.from(\\n        'getAllResponseHeaders' in request && request.getAllResponseHeaders()\\n      );\\n      const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\\n        request.responseText : request.response;\\n      const response = {\\n        data: responseData,\\n        status: request.status,\\n        statusText: request.statusText,\\n        headers: responseHeaders,\\n        config,\\n        request\\n      };\\n\\n      settle(function _resolve(value) {\\n        resolve(value);\\n        done();\\n      }, function _reject(err) {\\n        reject(err);\\n        done();\\n      }, response);\\n\\n      // Clean up request\\n      request = null;\\n    }\\n\\n    if ('onloadend' in request) {\\n      // Use onloadend if available\\n      request.onloadend = onloadend;\\n    } else {\\n      // Listen for ready state to emulate onloadend\\n      request.onreadystatechange = function handleLoad() {\\n        if (!request || request.readyState !== 4) {\\n          return;\\n        }\\n\\n        // The request errored out and we didn't get a response, this will be\\n        // handled by onerror instead\\n        // With one exception: request that using file: protocol, most browsers\\n        // will return status as 0 even though it's a successful request\\n        if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\\n          return;\\n        }\\n        // readystate handler is calling before onerror or ontimeout handlers,\\n        // so we should call onloadend on the next 'tick'\\n        setTimeout(onloadend);\\n      };\\n    }\\n\\n    // Handle browser request cancellation (as opposed to a manual cancellation)\\n    request.onabort = function handleAbort() {\\n      if (!request) {\\n        return;\\n      }\\n\\n      reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\\n\\n      // Clean up request\\n      request = null;\\n    };\\n\\n    // Handle low level network errors\\n  request.onerror = function handleError(event) {\\n       // Browsers deliver a ProgressEvent in XHR onerror\\n       // (message may be empty; when present, surface it)\\n       // See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event\\n       const msg = event && event.message ? event.message : 'Network Error';\\n       const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);\\n       // attach the underlying event for consumers who want details\\n       err.event = event || null;\\n       reject(err);\\n       request = null;\\n    };\\n    \\n    // Handle timeout\\n    request.ontimeout = function handleTimeout() {\\n      let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\\n      const transitional = _config.transitional || transitionalDefaults;\\n      if (_config.timeoutErrorMessage) {\\n        timeoutErrorMessage = _config.timeoutErrorMessage;\\n      }\\n      reject(new AxiosError(\\n        timeoutErrorMessage,\\n        transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\\n        config,\\n        request));\\n\\n      // Clean up request\\n      request = null;\\n    };\\n\\n    // Remove Content-Type if data is undefined\\n    requestData === undefined && requestHeaders.setContentType(null);\\n\\n    // Add headers to the request\\n    if ('setRequestHeader' in request) {\\n      utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\\n        request.setRequestHeader(key, val);\\n      });\\n    }\\n\\n    // Add withCredentials to request if needed\\n    if (!utils.isUndefined(_config.withCredentials)) {\\n      request.withCredentials = !!_config.withCredentials;\\n    }\\n\\n    // Add responseType to request if needed\\n    if (responseType && responseType !== 'json') {\\n      request.responseType = _config.responseType;\\n    }\\n\\n    // Handle progress if needed\\n    if (onDownloadProgress) {\\n      ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\\n      request.addEventListener('progress', downloadThrottled);\\n    }\\n\\n    // Not all browsers support upload events\\n    if (onUploadProgress && request.upload) {\\n      ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\\n\\n      request.upload.addEventListener('progress', uploadThrottled);\\n\\n      request.upload.addEventListener('loadend', flushUpload);\\n    }\\n\\n    if (_config.cancelToken || _config.signal) {\\n      // Handle cancellation\\n      // eslint-disable-next-line func-names\\n      onCanceled = cancel => {\\n        if (!request) {\\n          return;\\n        }\\n        reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\\n        request.abort();\\n        request = null;\\n      };\\n\\n      _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\\n      if (_config.signal) {\\n        _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\\n      }\\n    }\\n\\n    const protocol = parseProtocol(_config.url);\\n\\n    if (protocol && platform.protocols.indexOf(protocol) === -1) {\\n      reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\\n      return;\\n    }\\n\\n\\n    // Send the request\\n    request.send(requestData || null);\\n  });\\n}\\n\",\"'use strict';\\n\\nexport default function parseProtocol(url) {\\n  const match = /^([-+\\\\w]{1,25})(:?\\\\/\\\\/|:)/.exec(url);\\n  return match && match[1] || '';\\n}\\n\",\"import CanceledError from \\\"../cancel/CanceledError.js\\\";\\nimport AxiosError from \\\"../core/AxiosError.js\\\";\\nimport utils from '../utils.js';\\n\\nconst composeSignals = (signals, timeout) => {\\n  const {length} = (signals = signals ? signals.filter(Boolean) : []);\\n\\n  if (timeout || length) {\\n    let controller = new AbortController();\\n\\n    let aborted;\\n\\n    const onabort = function (reason) {\\n      if (!aborted) {\\n        aborted = true;\\n        unsubscribe();\\n        const err = reason instanceof Error ? reason : this.reason;\\n        controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\\n      }\\n    }\\n\\n    let timer = timeout && setTimeout(() => {\\n      timer = null;\\n      onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\\n    }, timeout)\\n\\n    const unsubscribe = () => {\\n      if (signals) {\\n        timer && clearTimeout(timer);\\n        timer = null;\\n        signals.forEach(signal => {\\n          signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\\n        });\\n        signals = null;\\n      }\\n    }\\n\\n    signals.forEach((signal) => signal.addEventListener('abort', onabort));\\n\\n    const {signal} = controller;\\n\\n    signal.unsubscribe = () => utils.asap(unsubscribe);\\n\\n    return signal;\\n  }\\n}\\n\\nexport default composeSignals;\\n\",\"\\nexport const streamChunk = function* (chunk, chunkSize) {\\n  let len = chunk.byteLength;\\n\\n  if (!chunkSize || len < chunkSize) {\\n    yield chunk;\\n    return;\\n  }\\n\\n  let pos = 0;\\n  let end;\\n\\n  while (pos < len) {\\n    end = pos + chunkSize;\\n    yield chunk.slice(pos, end);\\n    pos = end;\\n  }\\n}\\n\\nexport const readBytes = async function* (iterable, chunkSize) {\\n  for await (const chunk of readStream(iterable)) {\\n    yield* streamChunk(chunk, chunkSize);\\n  }\\n}\\n\\nconst readStream = async function* (stream) {\\n  if (stream[Symbol.asyncIterator]) {\\n    yield* stream;\\n    return;\\n  }\\n\\n  const reader = stream.getReader();\\n  try {\\n    for (;;) {\\n      const {done, value} = await reader.read();\\n      if (done) {\\n        break;\\n      }\\n      yield value;\\n    }\\n  } finally {\\n    await reader.cancel();\\n  }\\n}\\n\\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\\n  const iterator = readBytes(stream, chunkSize);\\n\\n  let bytes = 0;\\n  let done;\\n  let _onFinish = (e) => {\\n    if (!done) {\\n      done = true;\\n      onFinish && onFinish(e);\\n    }\\n  }\\n\\n  return new ReadableStream({\\n    async pull(controller) {\\n      try {\\n        const {done, value} = await iterator.next();\\n\\n        if (done) {\\n         _onFinish();\\n          controller.close();\\n          return;\\n        }\\n\\n        let len = value.byteLength;\\n        if (onProgress) {\\n          let loadedBytes = bytes += len;\\n          onProgress(loadedBytes);\\n        }\\n        controller.enqueue(new Uint8Array(value));\\n      } catch (err) {\\n        _onFinish(err);\\n        throw err;\\n      }\\n    },\\n    cancel(reason) {\\n      _onFinish(reason);\\n      return iterator.return();\\n    }\\n  }, {\\n    highWaterMark: 2\\n  })\\n}\\n\",\"import platform from \\\"../platform/index.js\\\";\\nimport utils from \\\"../utils.js\\\";\\nimport AxiosError from \\\"../core/AxiosError.js\\\";\\nimport composeSignals from \\\"../helpers/composeSignals.js\\\";\\nimport {trackStream} from \\\"../helpers/trackStream.js\\\";\\nimport AxiosHeaders from \\\"../core/AxiosHeaders.js\\\";\\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \\\"../helpers/progressEventReducer.js\\\";\\nimport resolveConfig from \\\"../helpers/resolveConfig.js\\\";\\nimport settle from \\\"../core/settle.js\\\";\\n\\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\\n\\nconst {isFunction} = utils;\\n\\nconst globalFetchAPI = (({Request, Response}) => ({\\n  Request, Response\\n}))(utils.global);\\n\\nconst {\\n  ReadableStream, TextEncoder\\n} = utils.global;\\n\\n\\nconst test = (fn, ...args) => {\\n  try {\\n    return !!fn(...args);\\n  } catch (e) {\\n    return false\\n  }\\n}\\n\\nconst factory = (env) => {\\n  env = utils.merge.call({\\n    skipUndefined: true\\n  }, globalFetchAPI, env);\\n\\n  const {fetch: envFetch, Request, Response} = env;\\n  const isFetchSupported = envFetch ? isFunction(envFetch) : typeof fetch === 'function';\\n  const isRequestSupported = isFunction(Request);\\n  const isResponseSupported = isFunction(Response);\\n\\n  if (!isFetchSupported) {\\n    return false;\\n  }\\n\\n  const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);\\n\\n  const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\\n      ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\\n      async (str) => new Uint8Array(await new Request(str).arrayBuffer())\\n  );\\n\\n  const supportsRequestStream = isRequestSupported && isReadableStreamSupported && test(() => {\\n    let duplexAccessed = false;\\n\\n    const hasContentType = new Request(platform.origin, {\\n      body: new ReadableStream(),\\n      method: 'POST',\\n      get duplex() {\\n        duplexAccessed = true;\\n        return 'half';\\n      },\\n    }).headers.has('Content-Type');\\n\\n    return duplexAccessed && !hasContentType;\\n  });\\n\\n  const supportsResponseStream = isResponseSupported && isReadableStreamSupported &&\\n    test(() => utils.isReadableStream(new Response('').body));\\n\\n  const resolvers = {\\n    stream: supportsResponseStream && ((res) => res.body)\\n  };\\n\\n  isFetchSupported && ((() => {\\n    ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\\n      !resolvers[type] && (resolvers[type] = (res, config) => {\\n        let method = res && res[type];\\n\\n        if (method) {\\n          return method.call(res);\\n        }\\n\\n        throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\\n      })\\n    });\\n  })());\\n\\n  const getBodyLength = async (body) => {\\n    if (body == null) {\\n      return 0;\\n    }\\n\\n    if (utils.isBlob(body)) {\\n      return body.size;\\n    }\\n\\n    if (utils.isSpecCompliantForm(body)) {\\n      const _request = new Request(platform.origin, {\\n        method: 'POST',\\n        body,\\n      });\\n      return (await _request.arrayBuffer()).byteLength;\\n    }\\n\\n    if (utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\\n      return body.byteLength;\\n    }\\n\\n    if (utils.isURLSearchParams(body)) {\\n      body = body + '';\\n    }\\n\\n    if (utils.isString(body)) {\\n      return (await encodeText(body)).byteLength;\\n    }\\n  }\\n\\n  const resolveBodyLength = async (headers, body) => {\\n    const length = utils.toFiniteNumber(headers.getContentLength());\\n\\n    return length == null ? getBodyLength(body) : length;\\n  }\\n\\n  return async (config) => {\\n    let {\\n      url,\\n      method,\\n      data,\\n      signal,\\n      cancelToken,\\n      timeout,\\n      onDownloadProgress,\\n      onUploadProgress,\\n      responseType,\\n      headers,\\n      withCredentials = 'same-origin',\\n      fetchOptions\\n    } = resolveConfig(config);\\n\\n    let _fetch = envFetch || fetch;\\n\\n    responseType = responseType ? (responseType + '').toLowerCase() : 'text';\\n\\n    let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\\n\\n    let request = null;\\n\\n    const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\\n      composedSignal.unsubscribe();\\n    });\\n\\n    let requestContentLength;\\n\\n    try {\\n      if (\\n        onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\\n        (requestContentLength = await resolveBodyLength(headers, data)) !== 0\\n      ) {\\n        let _request = new Request(url, {\\n          method: 'POST',\\n          body: data,\\n          duplex: \\\"half\\\"\\n        });\\n\\n        let contentTypeHeader;\\n\\n        if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\\n          headers.setContentType(contentTypeHeader)\\n        }\\n\\n        if (_request.body) {\\n          const [onProgress, flush] = progressEventDecorator(\\n            requestContentLength,\\n            progressEventReducer(asyncDecorator(onUploadProgress))\\n          );\\n\\n          data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\\n        }\\n      }\\n\\n      if (!utils.isString(withCredentials)) {\\n        withCredentials = withCredentials ? 'include' : 'omit';\\n      }\\n\\n      // Cloudflare Workers throws when credentials are defined\\n      // see https://github.com/cloudflare/workerd/issues/902\\n      const isCredentialsSupported = isRequestSupported && \\\"credentials\\\" in Request.prototype;\\n\\n      const resolvedOptions = {\\n        ...fetchOptions,\\n        signal: composedSignal,\\n        method: method.toUpperCase(),\\n        headers: headers.normalize().toJSON(),\\n        body: data,\\n        duplex: \\\"half\\\",\\n        credentials: isCredentialsSupported ? withCredentials : undefined\\n      };\\n\\n      request = isRequestSupported && new Request(url, resolvedOptions);\\n\\n      let response = await (isRequestSupported ? _fetch(request, fetchOptions) : _fetch(url, resolvedOptions));\\n\\n      const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\\n\\n      if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\\n        const options = {};\\n\\n        ['status', 'statusText', 'headers'].forEach(prop => {\\n          options[prop] = response[prop];\\n        });\\n\\n        const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\\n\\n        const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\\n          responseContentLength,\\n          progressEventReducer(asyncDecorator(onDownloadProgress), true)\\n        ) || [];\\n\\n        response = new Response(\\n          trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\\n            flush && flush();\\n            unsubscribe && unsubscribe();\\n          }),\\n          options\\n        );\\n      }\\n\\n      responseType = responseType || 'text';\\n\\n      let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\\n\\n      !isStreamResponse && unsubscribe && unsubscribe();\\n\\n      return await new Promise((resolve, reject) => {\\n        settle(resolve, reject, {\\n          data: responseData,\\n          headers: AxiosHeaders.from(response.headers),\\n          status: response.status,\\n          statusText: response.statusText,\\n          config,\\n          request\\n        })\\n      })\\n    } catch (err) {\\n      unsubscribe && unsubscribe();\\n\\n      if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {\\n        throw Object.assign(\\n          new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\\n          {\\n            cause: err.cause || err\\n          }\\n        )\\n      }\\n\\n      throw AxiosError.from(err, err && err.code, config, request);\\n    }\\n  }\\n}\\n\\nconst seedCache = new Map();\\n\\nexport const getFetch = (config) => {\\n  let env = config ? config.env : {};\\n  const {fetch, Request, Response} = env;\\n  const seeds = [\\n    Request, Response, fetch\\n  ];\\n\\n  let len = seeds.length, i = len,\\n    seed, target, map = seedCache;\\n\\n  while (i--) {\\n    seed = seeds[i];\\n    target = map.get(seed);\\n\\n    target === undefined && map.set(seed, target = (i ? new Map() : factory(env)))\\n\\n    map = target;\\n  }\\n\\n  return target;\\n};\\n\\nconst adapter = getFetch();\\n\\nexport default adapter;\\n\",\"import utils from '../utils.js';\\nimport httpAdapter from './http.js';\\nimport xhrAdapter from './xhr.js';\\nimport * as fetchAdapter from './fetch.js';\\nimport AxiosError from \\\"../core/AxiosError.js\\\";\\n\\nconst knownAdapters = {\\n  http: httpAdapter,\\n  xhr: xhrAdapter,\\n  fetch: {\\n    get: fetchAdapter.getFetch,\\n  }\\n}\\n\\nutils.forEach(knownAdapters, (fn, value) => {\\n  if (fn) {\\n    try {\\n      Object.defineProperty(fn, 'name', {value});\\n    } catch (e) {\\n      // eslint-disable-next-line no-empty\\n    }\\n    Object.defineProperty(fn, 'adapterName', {value});\\n  }\\n});\\n\\nconst renderReason = (reason) => `- ${reason}`;\\n\\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\\n\\nexport default {\\n  getAdapter: (adapters, config) => {\\n    adapters = utils.isArray(adapters) ? adapters : [adapters];\\n\\n    const {length} = adapters;\\n    let nameOrAdapter;\\n    let adapter;\\n\\n    const rejectedReasons = {};\\n\\n    for (let i = 0; i < length; i++) {\\n      nameOrAdapter = adapters[i];\\n      let id;\\n\\n      adapter = nameOrAdapter;\\n\\n      if (!isResolvedHandle(nameOrAdapter)) {\\n        adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\\n\\n        if (adapter === undefined) {\\n          throw new AxiosError(`Unknown adapter '${id}'`);\\n        }\\n      }\\n\\n      if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {\\n        break;\\n      }\\n\\n      rejectedReasons[id || '#' + i] = adapter;\\n    }\\n\\n    if (!adapter) {\\n\\n      const reasons = Object.entries(rejectedReasons)\\n        .map(([id, state]) => `adapter ${id} ` +\\n          (state === false ? 'is not supported by the environment' : 'is not available in the build')\\n        );\\n\\n      let s = length ?\\n        (reasons.length > 1 ? 'since :\\\\n' + reasons.map(renderReason).join('\\\\n') : ' ' + renderReason(reasons[0])) :\\n        'as no adapter specified';\\n\\n      throw new AxiosError(\\n        `There is no suitable adapter to dispatch the request ` + s,\\n        'ERR_NOT_SUPPORT'\\n      );\\n    }\\n\\n    return adapter;\\n  },\\n  adapters: knownAdapters\\n}\\n\",\"// eslint-disable-next-line strict\\nexport default null;\\n\",\"'use strict';\\n\\nimport transformData from './transformData.js';\\nimport isCancel from '../cancel/isCancel.js';\\nimport defaults from '../defaults/index.js';\\nimport CanceledError from '../cancel/CanceledError.js';\\nimport AxiosHeaders from '../core/AxiosHeaders.js';\\nimport adapters from \\\"../adapters/adapters.js\\\";\\n\\n/**\\n * Throws a `CanceledError` if cancellation has been requested.\\n *\\n * @param {Object} config The config that is to be used for the request\\n *\\n * @returns {void}\\n */\\nfunction throwIfCancellationRequested(config) {\\n  if (config.cancelToken) {\\n    config.cancelToken.throwIfRequested();\\n  }\\n\\n  if (config.signal && config.signal.aborted) {\\n    throw new CanceledError(null, config);\\n  }\\n}\\n\\n/**\\n * Dispatch a request to the server using the configured adapter.\\n *\\n * @param {object} config The config that is to be used for the request\\n *\\n * @returns {Promise} The Promise to be fulfilled\\n */\\nexport default function dispatchRequest(config) {\\n  throwIfCancellationRequested(config);\\n\\n  config.headers = AxiosHeaders.from(config.headers);\\n\\n  // Transform request data\\n  config.data = transformData.call(\\n    config,\\n    config.transformRequest\\n  );\\n\\n  if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\\n    config.headers.setContentType('application/x-www-form-urlencoded', false);\\n  }\\n\\n  const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);\\n\\n  return adapter(config).then(function onAdapterResolution(response) {\\n    throwIfCancellationRequested(config);\\n\\n    // Transform response data\\n    response.data = transformData.call(\\n      config,\\n      config.transformResponse,\\n      response\\n    );\\n\\n    response.headers = AxiosHeaders.from(response.headers);\\n\\n    return response;\\n  }, function onAdapterRejection(reason) {\\n    if (!isCancel(reason)) {\\n      throwIfCancellationRequested(config);\\n\\n      // Transform response data\\n      if (reason && reason.response) {\\n        reason.response.data = transformData.call(\\n          config,\\n          config.transformResponse,\\n          reason.response\\n        );\\n        reason.response.headers = AxiosHeaders.from(reason.response.headers);\\n      }\\n    }\\n\\n    return Promise.reject(reason);\\n  });\\n}\\n\",\"export const VERSION = \\\"1.12.2\\\";\",\"'use strict';\\n\\nimport {VERSION} from '../env/data.js';\\nimport AxiosError from '../core/AxiosError.js';\\n\\nconst validators = {};\\n\\n// eslint-disable-next-line func-names\\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\\n  validators[type] = function validator(thing) {\\n    return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\\n  };\\n});\\n\\nconst deprecatedWarnings = {};\\n\\n/**\\n * Transitional option validator\\n *\\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\\n * @param {string?} version - deprecated version / removed since version\\n * @param {string?} message - some message with additional info\\n *\\n * @returns {function}\\n */\\nvalidators.transitional = function transitional(validator, version, message) {\\n  function formatMessage(opt, desc) {\\n    return '[Axios v' + VERSION + '] Transitional option \\\\'' + opt + '\\\\'' + desc + (message ? '. ' + message : '');\\n  }\\n\\n  // eslint-disable-next-line func-names\\n  return (value, opt, opts) => {\\n    if (validator === false) {\\n      throw new AxiosError(\\n        formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\\n        AxiosError.ERR_DEPRECATED\\n      );\\n    }\\n\\n    if (version && !deprecatedWarnings[opt]) {\\n      deprecatedWarnings[opt] = true;\\n      // eslint-disable-next-line no-console\\n      console.warn(\\n        formatMessage(\\n          opt,\\n          ' has been deprecated since v' + version + ' and will be removed in the near future'\\n        )\\n      );\\n    }\\n\\n    return validator ? validator(value, opt, opts) : true;\\n  };\\n};\\n\\nvalidators.spelling = function spelling(correctSpelling) {\\n  return (value, opt) => {\\n    // eslint-disable-next-line no-console\\n    console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\\n    return true;\\n  }\\n};\\n\\n/**\\n * Assert object's properties type\\n *\\n * @param {object} options\\n * @param {object} schema\\n * @param {boolean?} allowUnknown\\n *\\n * @returns {object}\\n */\\n\\nfunction assertOptions(options, schema, allowUnknown) {\\n  if (typeof options !== 'object') {\\n    throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\\n  }\\n  const keys = Object.keys(options);\\n  let i = keys.length;\\n  while (i-- > 0) {\\n    const opt = keys[i];\\n    const validator = schema[opt];\\n    if (validator) {\\n      const value = options[opt];\\n      const result = value === undefined || validator(value, opt, options);\\n      if (result !== true) {\\n        throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\\n      }\\n      continue;\\n    }\\n    if (allowUnknown !== true) {\\n      throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\\n    }\\n  }\\n}\\n\\nexport default {\\n  assertOptions,\\n  validators\\n};\\n\",\"'use strict';\\n\\nimport utils from './../utils.js';\\nimport buildURL from '../helpers/buildURL.js';\\nimport InterceptorManager from './InterceptorManager.js';\\nimport dispatchRequest from './dispatchRequest.js';\\nimport mergeConfig from './mergeConfig.js';\\nimport buildFullPath from './buildFullPath.js';\\nimport validator from '../helpers/validator.js';\\nimport AxiosHeaders from './AxiosHeaders.js';\\n\\nconst validators = validator.validators;\\n\\n/**\\n * Create a new instance of Axios\\n *\\n * @param {Object} instanceConfig The default config for the instance\\n *\\n * @return {Axios} A new instance of Axios\\n */\\nclass Axios {\\n  constructor(instanceConfig) {\\n    this.defaults = instanceConfig || {};\\n    this.interceptors = {\\n      request: new InterceptorManager(),\\n      response: new InterceptorManager()\\n    };\\n  }\\n\\n  /**\\n   * Dispatch a request\\n   *\\n   * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\\n   * @param {?Object} config\\n   *\\n   * @returns {Promise} The Promise to be fulfilled\\n   */\\n  async request(configOrUrl, config) {\\n    try {\\n      return await this._request(configOrUrl, config);\\n    } catch (err) {\\n      if (err instanceof Error) {\\n        let dummy = {};\\n\\n        Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\\n\\n        // slice off the Error: ... line\\n        const stack = dummy.stack ? dummy.stack.replace(/^.+\\\\n/, '') : '';\\n        try {\\n          if (!err.stack) {\\n            err.stack = stack;\\n            // match without the 2 top stack lines\\n          } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\\\n.+\\\\n/, ''))) {\\n            err.stack += '\\\\n' + stack\\n          }\\n        } catch (e) {\\n          // ignore the case where \\\"stack\\\" is an un-writable property\\n        }\\n      }\\n\\n      throw err;\\n    }\\n  }\\n\\n  _request(configOrUrl, config) {\\n    /*eslint no-param-reassign:0*/\\n    // Allow for axios('example/url'[, config]) a la fetch API\\n    if (typeof configOrUrl === 'string') {\\n      config = config || {};\\n      config.url = configOrUrl;\\n    } else {\\n      config = configOrUrl || {};\\n    }\\n\\n    config = mergeConfig(this.defaults, config);\\n\\n    const {transitional, paramsSerializer, headers} = config;\\n\\n    if (transitional !== undefined) {\\n      validator.assertOptions(transitional, {\\n        silentJSONParsing: validators.transitional(validators.boolean),\\n        forcedJSONParsing: validators.transitional(validators.boolean),\\n        clarifyTimeoutError: validators.transitional(validators.boolean)\\n      }, false);\\n    }\\n\\n    if (paramsSerializer != null) {\\n      if (utils.isFunction(paramsSerializer)) {\\n        config.paramsSerializer = {\\n          serialize: paramsSerializer\\n        }\\n      } else {\\n        validator.assertOptions(paramsSerializer, {\\n          encode: validators.function,\\n          serialize: validators.function\\n        }, true);\\n      }\\n    }\\n\\n    // Set config.allowAbsoluteUrls\\n    if (config.allowAbsoluteUrls !== undefined) {\\n      // do nothing\\n    } else if (this.defaults.allowAbsoluteUrls !== undefined) {\\n      config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\\n    } else {\\n      config.allowAbsoluteUrls = true;\\n    }\\n\\n    validator.assertOptions(config, {\\n      baseUrl: validators.spelling('baseURL'),\\n      withXsrfToken: validators.spelling('withXSRFToken')\\n    }, true);\\n\\n    // Set config.method\\n    config.method = (config.method || this.defaults.method || 'get').toLowerCase();\\n\\n    // Flatten headers\\n    let contextHeaders = headers && utils.merge(\\n      headers.common,\\n      headers[config.method]\\n    );\\n\\n    headers && utils.forEach(\\n      ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\\n      (method) => {\\n        delete headers[method];\\n      }\\n    );\\n\\n    config.headers = AxiosHeaders.concat(contextHeaders, headers);\\n\\n    // filter out skipped interceptors\\n    const requestInterceptorChain = [];\\n    let synchronousRequestInterceptors = true;\\n    this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\\n      if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\\n        return;\\n      }\\n\\n      synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\\n\\n      requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\\n    });\\n\\n    const responseInterceptorChain = [];\\n    this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\\n      responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\\n    });\\n\\n    let promise;\\n    let i = 0;\\n    let len;\\n\\n    if (!synchronousRequestInterceptors) {\\n      const chain = [dispatchRequest.bind(this), undefined];\\n      chain.unshift(...requestInterceptorChain);\\n      chain.push(...responseInterceptorChain);\\n      len = chain.length;\\n\\n      promise = Promise.resolve(config);\\n\\n      while (i < len) {\\n        promise = promise.then(chain[i++], chain[i++]);\\n      }\\n\\n      return promise;\\n    }\\n\\n    len = requestInterceptorChain.length;\\n\\n    let newConfig = config;\\n\\n    while (i < len) {\\n      const onFulfilled = requestInterceptorChain[i++];\\n      const onRejected = requestInterceptorChain[i++];\\n      try {\\n        newConfig = onFulfilled(newConfig);\\n      } catch (error) {\\n        onRejected.call(this, error);\\n        break;\\n      }\\n    }\\n\\n    try {\\n      promise = dispatchRequest.call(this, newConfig);\\n    } catch (error) {\\n      return Promise.reject(error);\\n    }\\n\\n    i = 0;\\n    len = responseInterceptorChain.length;\\n\\n    while (i < len) {\\n      promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\\n    }\\n\\n    return promise;\\n  }\\n\\n  getUri(config) {\\n    config = mergeConfig(this.defaults, config);\\n    const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\\n    return buildURL(fullPath, config.params, config.paramsSerializer);\\n  }\\n}\\n\\n// Provide aliases for supported request methods\\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\\n  /*eslint func-names:0*/\\n  Axios.prototype[method] = function(url, config) {\\n    return this.request(mergeConfig(config || {}, {\\n      method,\\n      url,\\n      data: (config || {}).data\\n    }));\\n  };\\n});\\n\\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\\n  /*eslint func-names:0*/\\n\\n  function generateHTTPMethod(isForm) {\\n    return function httpMethod(url, data, config) {\\n      return this.request(mergeConfig(config || {}, {\\n        method,\\n        headers: isForm ? {\\n          'Content-Type': 'multipart/form-data'\\n        } : {},\\n        url,\\n        data\\n      }));\\n    };\\n  }\\n\\n  Axios.prototype[method] = generateHTTPMethod();\\n\\n  Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\\n});\\n\\nexport default Axios;\\n\",\"'use strict';\\n\\nimport CanceledError from './CanceledError.js';\\n\\n/**\\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\\n *\\n * @param {Function} executor The executor function.\\n *\\n * @returns {CancelToken}\\n */\\nclass CancelToken {\\n  constructor(executor) {\\n    if (typeof executor !== 'function') {\\n      throw new TypeError('executor must be a function.');\\n    }\\n\\n    let resolvePromise;\\n\\n    this.promise = new Promise(function promiseExecutor(resolve) {\\n      resolvePromise = resolve;\\n    });\\n\\n    const token = this;\\n\\n    // eslint-disable-next-line func-names\\n    this.promise.then(cancel => {\\n      if (!token._listeners) return;\\n\\n      let i = token._listeners.length;\\n\\n      while (i-- > 0) {\\n        token._listeners[i](cancel);\\n      }\\n      token._listeners = null;\\n    });\\n\\n    // eslint-disable-next-line func-names\\n    this.promise.then = onfulfilled => {\\n      let _resolve;\\n      // eslint-disable-next-line func-names\\n      const promise = new Promise(resolve => {\\n        token.subscribe(resolve);\\n        _resolve = resolve;\\n      }).then(onfulfilled);\\n\\n      promise.cancel = function reject() {\\n        token.unsubscribe(_resolve);\\n      };\\n\\n      return promise;\\n    };\\n\\n    executor(function cancel(message, config, request) {\\n      if (token.reason) {\\n        // Cancellation has already been requested\\n        return;\\n      }\\n\\n      token.reason = new CanceledError(message, config, request);\\n      resolvePromise(token.reason);\\n    });\\n  }\\n\\n  /**\\n   * Throws a `CanceledError` if cancellation has been requested.\\n   */\\n  throwIfRequested() {\\n    if (this.reason) {\\n      throw this.reason;\\n    }\\n  }\\n\\n  /**\\n   * Subscribe to the cancel signal\\n   */\\n\\n  subscribe(listener) {\\n    if (this.reason) {\\n      listener(this.reason);\\n      return;\\n    }\\n\\n    if (this._listeners) {\\n      this._listeners.push(listener);\\n    } else {\\n      this._listeners = [listener];\\n    }\\n  }\\n\\n  /**\\n   * Unsubscribe from the cancel signal\\n   */\\n\\n  unsubscribe(listener) {\\n    if (!this._listeners) {\\n      return;\\n    }\\n    const index = this._listeners.indexOf(listener);\\n    if (index !== -1) {\\n      this._listeners.splice(index, 1);\\n    }\\n  }\\n\\n  toAbortSignal() {\\n    const controller = new AbortController();\\n\\n    const abort = (err) => {\\n      controller.abort(err);\\n    };\\n\\n    this.subscribe(abort);\\n\\n    controller.signal.unsubscribe = () => this.unsubscribe(abort);\\n\\n    return controller.signal;\\n  }\\n\\n  /**\\n   * Returns an object that contains a new `CancelToken` and a function that, when called,\\n   * cancels the `CancelToken`.\\n   */\\n  static source() {\\n    let cancel;\\n    const token = new CancelToken(function executor(c) {\\n      cancel = c;\\n    });\\n    return {\\n      token,\\n      cancel\\n    };\\n  }\\n}\\n\\nexport default CancelToken;\\n\",\"const HttpStatusCode = {\\n  Continue: 100,\\n  SwitchingProtocols: 101,\\n  Processing: 102,\\n  EarlyHints: 103,\\n  Ok: 200,\\n  Created: 201,\\n  Accepted: 202,\\n  NonAuthoritativeInformation: 203,\\n  NoContent: 204,\\n  ResetContent: 205,\\n  PartialContent: 206,\\n  MultiStatus: 207,\\n  AlreadyReported: 208,\\n  ImUsed: 226,\\n  MultipleChoices: 300,\\n  MovedPermanently: 301,\\n  Found: 302,\\n  SeeOther: 303,\\n  NotModified: 304,\\n  UseProxy: 305,\\n  Unused: 306,\\n  TemporaryRedirect: 307,\\n  PermanentRedirect: 308,\\n  BadRequest: 400,\\n  Unauthorized: 401,\\n  PaymentRequired: 402,\\n  Forbidden: 403,\\n  NotFound: 404,\\n  MethodNotAllowed: 405,\\n  NotAcceptable: 406,\\n  ProxyAuthenticationRequired: 407,\\n  RequestTimeout: 408,\\n  Conflict: 409,\\n  Gone: 410,\\n  LengthRequired: 411,\\n  PreconditionFailed: 412,\\n  PayloadTooLarge: 413,\\n  UriTooLong: 414,\\n  UnsupportedMediaType: 415,\\n  RangeNotSatisfiable: 416,\\n  ExpectationFailed: 417,\\n  ImATeapot: 418,\\n  MisdirectedRequest: 421,\\n  UnprocessableEntity: 422,\\n  Locked: 423,\\n  FailedDependency: 424,\\n  TooEarly: 425,\\n  UpgradeRequired: 426,\\n  PreconditionRequired: 428,\\n  TooManyRequests: 429,\\n  RequestHeaderFieldsTooLarge: 431,\\n  UnavailableForLegalReasons: 451,\\n  InternalServerError: 500,\\n  NotImplemented: 501,\\n  BadGateway: 502,\\n  ServiceUnavailable: 503,\\n  GatewayTimeout: 504,\\n  HttpVersionNotSupported: 505,\\n  VariantAlsoNegotiates: 506,\\n  InsufficientStorage: 507,\\n  LoopDetected: 508,\\n  NotExtended: 510,\\n  NetworkAuthenticationRequired: 511,\\n};\\n\\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\\n  HttpStatusCode[value] = key;\\n});\\n\\nexport default HttpStatusCode;\\n\",\"'use strict';\\n\\nimport utils from './utils.js';\\nimport bind from './helpers/bind.js';\\nimport Axios from './core/Axios.js';\\nimport mergeConfig from './core/mergeConfig.js';\\nimport defaults from './defaults/index.js';\\nimport formDataToJSON from './helpers/formDataToJSON.js';\\nimport CanceledError from './cancel/CanceledError.js';\\nimport CancelToken from './cancel/CancelToken.js';\\nimport isCancel from './cancel/isCancel.js';\\nimport {VERSION} from './env/data.js';\\nimport toFormData from './helpers/toFormData.js';\\nimport AxiosError from './core/AxiosError.js';\\nimport spread from './helpers/spread.js';\\nimport isAxiosError from './helpers/isAxiosError.js';\\nimport AxiosHeaders from \\\"./core/AxiosHeaders.js\\\";\\nimport adapters from './adapters/adapters.js';\\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\\n\\n/**\\n * Create an instance of Axios\\n *\\n * @param {Object} defaultConfig The default config for the instance\\n *\\n * @returns {Axios} A new instance of Axios\\n */\\nfunction createInstance(defaultConfig) {\\n  const context = new Axios(defaultConfig);\\n  const instance = bind(Axios.prototype.request, context);\\n\\n  // Copy axios.prototype to instance\\n  utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\\n\\n  // Copy context to instance\\n  utils.extend(instance, context, null, {allOwnKeys: true});\\n\\n  // Factory for creating new instances\\n  instance.create = function create(instanceConfig) {\\n    return createInstance(mergeConfig(defaultConfig, instanceConfig));\\n  };\\n\\n  return instance;\\n}\\n\\n// Create the default instance to be exported\\nconst axios = createInstance(defaults);\\n\\n// Expose Axios class to allow class inheritance\\naxios.Axios = Axios;\\n\\n// Expose Cancel & CancelToken\\naxios.CanceledError = CanceledError;\\naxios.CancelToken = CancelToken;\\naxios.isCancel = isCancel;\\naxios.VERSION = VERSION;\\naxios.toFormData = toFormData;\\n\\n// Expose AxiosError class\\naxios.AxiosError = AxiosError;\\n\\n// alias for CanceledError for backward compatibility\\naxios.Cancel = axios.CanceledError;\\n\\n// Expose all/spread\\naxios.all = function all(promises) {\\n  return Promise.all(promises);\\n};\\n\\naxios.spread = spread;\\n\\n// Expose isAxiosError\\naxios.isAxiosError = isAxiosError;\\n\\n// Expose mergeConfig\\naxios.mergeConfig = mergeConfig;\\n\\naxios.AxiosHeaders = AxiosHeaders;\\n\\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\\n\\naxios.getAdapter = adapters.getAdapter;\\n\\naxios.HttpStatusCode = HttpStatusCode;\\n\\naxios.default = axios;\\n\\n// this module should only have a default export\\nexport default axios\\n\",\"'use strict';\\n\\n/**\\n * Syntactic sugar for invoking a function and expanding an array for arguments.\\n *\\n * Common use case would be to use `Function.prototype.apply`.\\n *\\n *  ```js\\n *  function f(x, y, z) {}\\n *  var args = [1, 2, 3];\\n *  f.apply(null, args);\\n *  ```\\n *\\n * With `spread` this example can be re-written.\\n *\\n *  ```js\\n *  spread(function(x, y, z) {})([1, 2, 3]);\\n *  ```\\n *\\n * @param {Function} callback\\n *\\n * @returns {Function}\\n */\\nexport default function spread(callback) {\\n  return function wrap(arr) {\\n    return callback.apply(null, arr);\\n  };\\n}\\n\",\"'use strict';\\n\\nimport utils from './../utils.js';\\n\\n/**\\n * Determines whether the payload is an error thrown by Axios\\n *\\n * @param {*} payload The value to test\\n *\\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\\n */\\nexport default function isAxiosError(payload) {\\n  return utils.isObject(payload) && (payload.isAxiosError === true);\\n}\\n\",\"import axios from 'axios';\\nimport * as DPlayerType from './types';\\n\\nconst defaultApiBackend: DPlayerType.APIBackend = {\\n    send: (options) => {\\n        if (options.url === undefined) {\\n            options.error && options.error();\\n            return;\\n        }\\n        axios\\n            .post(options.url, options.data)\\n            .then((response) => {\\n                const data = response.data;\\n                if (!data || data.code !== 0) {\\n                    options.error && options.error(data && data.msg);\\n                    return;\\n                }\\n                options.success && options.success();\\n            })\\n            .catch((e) => {\\n                console.error(e);\\n                options.error && options.error();\\n            });\\n    },\\n\\n    read: (options) => {\\n        if (options.url === undefined) {\\n            options.error && options.error();\\n            return;\\n        }\\n        axios\\n            .get(options.url)\\n            .then((response) => {\\n                const data = response.data;\\n                if (!data || data.code !== 0) {\\n                    options.error && options.error(data && data.msg);\\n                    return;\\n                }\\n                if (data.data) {\\n                    options.success &&\\n                        options.success((data.data as any[][]).map((item) => ({\\n                            author: item[3],\\n                            time: item[0],\\n                            text: item[4],\\n                            color: item[2],\\n                            type: item[1],\\n                            size: (item[5] ? (((item[5] === 'big') || (item[5] === 'small')) ? item[5] : 'medium') : 'medium'),\\n                        })));\\n                } else {\\n                    options.success &&\\n                        options.success([{\\n                            author: '',\\n                            time: 0,\\n                            text: '',\\n                            color: '#ffeaea',\\n                            type: 'right',\\n                            size: 'medium',\\n                        }]);\\n                }\\n            })\\n            .catch((e) => {\\n                console.error(e);\\n                options.error && options.error();\\n            });\\n    },\\n};\\nexport default defaultApiBackend;\\n\",\"/*\\nW3C def language codes is :\\n    language-code = primary-code ( \\\"-\\\" subcode )\\n        primary-code    ISO 639-1   ( the names of language with 2 code )\\n        subcode         ISO 3166    ( the names of countries )\\n\\nNOTE: use lowercase to prevent case typo from user!\\nUse this as shown below..... */\\n\\nfunction i18n(this: any, lang: string) {\\n    this.lang = lang;\\n    if (this.lang === 'ja') {\\n        this.lang = 'ja-jp';\\n    }\\n    this.tran = (text: string, ...arg: Array<string | number>): string => {\\n        let result = text;\\n        // @ts-expect-error TS(7053): Element implicitly has an 'any' type because expre... Remove this comment to see the full error message\\n        if (tranTxt[this.lang] && tranTxt[this.lang][text]) {\\n            // @ts-expect-error TS(7053): Element implicitly has an 'any' type because expre... Remove this comment to see the full error message\\n            result = tranTxt[this.lang][text];\\n        }\\n        let i = 0;\\n        // @ts-expect-error TS(7053): Element implicitly has an 'any' type because expre... Remove this comment to see the full error message\\n        return result.replace(/%s/gi, () => arg[i++] ?? '');\\n    };\\n}\\n\\n// add translation text here\\nconst tranTxt = {\\n    'zh-cn': {\\n        'Danmaku is loading': '弹幕加载中',\\n        'Top': '顶部',\\n        'Bottom': '底部',\\n        'Rolling': '滚动',\\n        'Big': '大的',\\n        'Medium': '中等的',\\n        'Small': '小的',\\n        'Input danmaku, hit Enter': '输入弹幕, 回车发送',\\n        'About author': '关于作者',\\n        'DPlayer feedback': '播放器意见反馈',\\n        'About DPlayer': '关于 DPlayer 播放器',\\n        'Loop': '洗脑循环',\\n        'Speed': '速度',\\n        'Audio': '音频',\\n        'Primary audio': '主要音频',\\n        'Secondary audio': '辅助音频',\\n        'Opacity for danmaku': '弹幕透明度',\\n        'Normal': '正常',\\n        'Please input danmaku content': '请输入弹幕内容',\\n        'Set danmaku color': '设置弹幕颜色',\\n        'Set danmaku type': '设置弹幕类型',\\n        'Set danmaku size': '设置弹幕大小',\\n        'Show danmaku': '显示弹幕',\\n        'Video load failed': '视频加载失败',\\n        'Danmaku load failed': '弹幕加载失败',\\n        'Danmaku load partial failed': '弹幕加载部分失败',\\n        'Danmaku send failed': '弹幕发送失败',\\n        'Switching to': '正在切换至',\\n        'Switched to': '已经切换至',\\n        'Switching to quality': '正在切换至 %s 画质',\\n        'Switched to quality': '已经切换至 %s 画质',\\n        'Synchronize': '同步',\\n        'Synchronized': '同步的',\\n        'Quality': '画质',\\n        'FF': '快进',\\n        'REW': '快退',\\n        'FF progress': '快进 %s 秒',\\n        'REW progress': '快退 %s 秒',\\n        'Unlimited danmaku': '海量弹幕',\\n        'Send danmaku': '发送弹幕',\\n        'Setting': '设置',\\n        'Full screen': '全屏',\\n        'Web full screen': '页面全屏',\\n        'PIP': '画中画',\\n        'PIP not supported': '不支持画中画',\\n        'Not available': '不可用',\\n        'Send': '发送',\\n        'Screenshot': '截图',\\n        'AirPlay': '无线投屏',\\n        'Second': '秒',\\n        'Show comment': '显示弹幕',\\n        'Hide comment': '隐藏弹幕',\\n        'Show subtitle': '显示字幕',\\n        'Hide subtitle': '隐藏字幕',\\n        'Volume': '音量',\\n        'Live': '直播',\\n        'Video info': '视频统计信息',\\n    },\\n    'zh-tw': {\\n        'Danmaku is loading': '彈幕載入中',\\n        'Top': '頂部',\\n        'Bottom': '底部',\\n        'Rolling': '滾動',\\n        'Big': '大的',\\n        'Medium': '中等的',\\n        'Small': '小的',\\n        'Input danmaku, hit Enter': '輸入彈幕, Enter 發送',\\n        'About author': '關於作者',\\n        'DPlayer feedback': '播放器意見回饋',\\n        'About DPlayer': '關於 DPlayer 播放器',\\n        'Loop': '循環播放',\\n        'Speed': '速度',\\n        'Audio': '音頻',\\n        'Primary audio': '主要音頻',\\n        'Secondary audio': '輔助音頻',\\n        'Opacity for danmaku': '彈幕透明度',\\n        'Normal': '正常',\\n        'Please input danmaku content': '請輸入彈幕內容',\\n        'Set danmaku color': '設定彈幕顏色',\\n        'Set danmaku type': '設定彈幕類型',\\n        'Set danmaku size': '设置弹幕大小',\\n        'Show danmaku': '顯示彈幕',\\n        'Video load failed': '影片載入失敗',\\n        'Danmaku load failed': '彈幕載入失敗',\\n        'Danmaku load partial failed': '彈幕載入部分失敗',\\n        'Danmaku send failed': '彈幕發送失敗',\\n        'Switching to': '正在切換至',\\n        'Switched to': '已經切換至',\\n        'Switching to quality': '正在切換至 %s 畫質',\\n        'Switched to quality': '已經切換至 %s 畫質',\\n        'Synchronize': '同步',\\n        'Synchronized': '同步的',\\n        'Quality': '畫質',\\n        'FF': '快轉',\\n        'REW': '倒轉',\\n        'FF progress': '快轉 %s 秒',\\n        'REW progress': '倒轉 %s 秒',\\n        'Unlimited danmaku': '巨量彈幕',\\n        'Send danmaku': '發送彈幕',\\n        'Setting': '設定',\\n        'Full screen': '全螢幕',\\n        'Web full screen': '頁面全螢幕',\\n        'PIP': '畫中畫',\\n        'PIP not supported': '不支援畫中畫',\\n        'Not available': '不可用',\\n        'Send': '發送',\\n        'Screenshot': '截圖',\\n        'AirPlay': '無線投屏',\\n        'Second': '秒',\\n        'Show comment': '顯示彈幕',\\n        'Hide comment': '隱藏彈幕',\\n        'Show subtitle': '顯示字幕',\\n        'Hide subtitle': '隱藏字幕',\\n        'Volume': '音量',\\n        'Live': '直播',\\n        'Video info': '影片統計訊息',\\n    },\\n    'ja-jp': {\\n        'Danmaku is loading': 'コメントを読み込み中',\\n        'Top': '上固定',\\n        'Bottom': '下固定',\\n        'Rolling': 'スクロール',\\n        'Big': '大きめ',\\n        'Medium': '標準',\\n        'Small': '小さめ',\\n        'Input danmaku, hit Enter': '右のボタンを押すとコメントできます',\\n        'About author': '作者について',\\n        'DPlayer feedback': 'フィードバック',\\n        'About DPlayer': 'DPlayer について',\\n        'Loop': 'リピート再生',\\n        'Speed': '再生速度',\\n        'Audio': '音声',\\n        'Primary audio': '主音声',\\n        'Secondary audio': '副音声',\\n        'Opacity for danmaku': 'コメントの透明度',\\n        'Normal': '標準',\\n        'Please input danmaku content': 'コメント内容を入力して下さい!',\\n        'Set danmaku color': 'コメントの色',\\n        'Set danmaku type': 'コメントの位置',\\n        'Set danmaku size': 'コメントのサイズ',\\n        'Show danmaku': 'コメントを表示',\\n        'Video load failed': '動画の読み込みに失敗しました…',\\n        'Danmaku load failed': 'コメントの読み込みに失敗しました…',\\n        'Danmaku load partial failed': 'コメントの読み込みに失敗しました…',\\n        'Danmaku send failed': 'コメントの送信に失敗しました…',\\n        'Switching to': '画質を切り替えています…',\\n        'Switched to': '画質を切り替えました',\\n        'Switching to quality': '画質を %s に切り替えています…',\\n        'Switched to quality': '画質を %s 切り替えました',\\n        'Synchronize': '同期する',\\n        'Synchronized': '同期しました',\\n        'Quality': '画質',\\n        'FF': '早送り',\\n        'REW': '早戻し',\\n        'FF progress': '%s 秒早送り',\\n        'REW progress': '%s 秒早戻し',\\n        'Unlimited danmaku': 'コメントを無制限に表示',\\n        'Send danmaku': 'コメントする',\\n        'Setting': '設定',\\n        'Full screen': 'フルスクリーン',\\n        'Web full screen': 'ブラウザフルスクリーン',\\n        'PIP': 'Picture-in-Picture',\\n        'PIP not supported': 'Picture-in-Picture はサポートされていません',\\n        'Not available': '使用できません',\\n        'Send': 'コメントする',\\n        'Screenshot': 'スクリーンショット',\\n        'AirPlay': 'ワイヤレススクリーン',\\n        'Second': '秒',\\n        'Show comment': 'コメントを表示する',\\n        'Hide comment': 'コメントを表示しない',\\n        'Show subtitle': '字幕を表示する',\\n        'Hide subtitle': '字幕を表示しない',\\n        'Volume': '音量',\\n        'Live': 'Live',\\n        'Video info': '動画の統計情報',\\n    },\\n    'en': {\\n        'Danmaku is loading': 'Danmaku is loading',\\n        'Top': 'Top',\\n        'Bottom': 'Bottom',\\n        'Rolling': 'Rolling',\\n        'Big': 'Big',\\n        'Medium': 'Medium',\\n        'Small': 'Small',\\n        'Input danmaku, hit Enter': 'Input danmaku, hit Enter',\\n        'About author': 'About author',\\n        'DPlayer feedback': 'DPlayer feedback',\\n        'About DPlayer': 'About DPlayer',\\n        'Loop': 'Loop',\\n        'Speed': 'Speed',\\n        'Audio': 'Audio',\\n        'Primary audio': 'Primary audio',\\n        'Secondary audio': 'Secondary audio',\\n        'Opacity for danmaku': 'Opacity for danmaku',\\n        'Normal': 'Normal',\\n        'Please input danmaku content': 'Please input danmaku content',\\n        'Set danmaku color': 'Set danmaku color',\\n        'Set danmaku type': 'Set danmaku type',\\n        'Set danmaku size': 'Set danmaku size',\\n        'Show danmaku': 'Show danmaku',\\n        'Video load failed': 'Video load failed',\\n        'Danmaku load failed': 'Danmaku load failed',\\n        'Danmaku load partial failed': 'Danmaku load partial failed',\\n        'Danmaku send failed': 'Danmaku send failed',\\n        'Switching to': 'Switching to',\\n        'Switched to': 'Switched to',\\n        'Switching to quality': 'Switching to %s quality',\\n        'Switched to quality': 'Switched to %s quality',\\n        'Synchronize': 'Synchronize',\\n        'Synchronized': 'Synchronized',\\n        'Quality': 'Quality',\\n        'FF': 'Fast forward',\\n        'REW': 'Rewind',\\n        'FF progress': 'Fast forward %s sec',\\n        'REW progress': 'Rewind %s sec',\\n        'Unlimited danmaku': 'Unlimited danmaku',\\n        'Send danmaku': 'Send danmaku',\\n        'Setting': 'Setting',\\n        'Full screen': 'Fullscreen',\\n        'Web full screen': 'Web fullscreen',\\n        'PIP': 'Picture-in-Picture',\\n        'PIP not supported': 'Picture-in-picture is not supported',\\n        'Not available': 'Not available',\\n        'Send': 'Send',\\n        'Screenshot': 'Screenshot',\\n        'AirPlay': 'AirPlay',\\n        'Second': 'Sec',\\n        'Show comment': 'Show comment',\\n        'Hide comment': 'Hide comment',\\n        'Show subtitle': 'Show subtitle',\\n        'Hide subtitle': 'Hide subtitle',\\n        'Volume': 'Volume',\\n        'Live': 'Live',\\n        'Video info': 'Video info',\\n    },\\n};\\n\\nexport default i18n;\\n\",\"import play from '../assets/play.svg';\\nimport pause from '../assets/pause.svg';\\nimport backward from '../assets/backward.svg';\\nimport forward from '../assets/forward.svg';\\nimport volumeUp from '../assets/volume-up.svg';\\nimport volumeDown from '../assets/volume-down.svg';\\nimport volumeOff from '../assets/volume-off.svg';\\nimport full from '../assets/full.svg';\\nimport fullWeb from '../assets/full-web.svg';\\nimport pip from '../assets/pip.svg';\\nimport setting from '../assets/setting.svg';\\nimport left from '../assets/left.svg';\\nimport right from '../assets/right.svg';\\nimport check from '../assets/check.svg';\\nimport comment from '../assets/comment.svg';\\nimport commentOff from '../assets/comment-off.svg';\\nimport send from '../assets/send.svg';\\nimport pallette from '../assets/pallette.svg';\\nimport camera from '../assets/camera.svg';\\nimport airplay from '../assets/airplay.svg';\\nimport subtitle from '../assets/subtitle.svg';\\nimport loading from '../assets/loading.svg';\\n\\nconst Icons = {\\n    play: play,\\n    pause: pause,\\n    backward: backward,\\n    forward: forward,\\n    volumeUp: volumeUp,\\n    volumeDown: volumeDown,\\n    volumeOff: volumeOff,\\n    full: full,\\n    fullWeb: fullWeb,\\n    pip: pip,\\n    setting: setting,\\n    left: left,\\n    right: right,\\n    check: check,\\n    comment: comment,\\n    commentOff: commentOff,\\n    send: send,\\n    pallette: pallette,\\n    camera: camera,\\n    subtitle: subtitle,\\n    loading: loading,\\n    airplay: airplay,\\n};\\n\\nexport default Icons;\\n\",\"import Icons from './icons';\\nimport tplPlayer from '../template/player.art';\\nimport utils from './utils';\\nimport * as DPlayerType from './types';\\n\\nclass Template {\\n    container: HTMLElement;\\n    options: DPlayerType.OptionsInternal;\\n    index: number;\\n    tran: (text: string) => string;\\n\\n    volumeBar!: HTMLElement;\\n    volumeBarWrap!: HTMLElement;\\n    volumeBarWrapWrap!: HTMLElement;\\n    volumeButton!: HTMLElement;\\n    volumeButtonIcon!: HTMLElement;\\n    volumeIcon!: HTMLElement;\\n    playedBar!: HTMLElement;\\n    loadedBar!: HTMLElement;\\n    playedBarWrap!: HTMLElement;\\n    playedBarTime!: HTMLElement;\\n    danmaku!: HTMLElement;\\n    danmakuLoading!: HTMLElement;\\n    video!: HTMLVideoElement;\\n    bezel!: HTMLElement;\\n    playButton!: HTMLElement;\\n    playIcon!: HTMLElement;\\n    mobileBackwardButton!: HTMLElement;\\n    mobilePlayButton!: HTMLElement;\\n    mobileForwardButton!: HTMLElement;\\n    videoWrap!: HTMLElement;\\n    videoWrapAspect!: HTMLElement;\\n    controllerMask!: HTMLElement;\\n    ptime!: HTMLElement;\\n    settingButton!: HTMLElement;\\n    settingBox!: HTMLElement;\\n    settingOriginPanel!: HTMLElement;\\n    mask!: HTMLElement;\\n    syncButton!: HTMLElement;\\n    loop!: HTMLElement;\\n    loopToggle!: HTMLInputElement;\\n    showDanmaku!: HTMLElement;\\n    showDanmakuToggle!: HTMLInputElement;\\n    unlimitDanmaku!: HTMLElement;\\n    unlimitDanmakuToggle!: HTMLInputElement;\\n    quality!: HTMLElement;\\n    qualityValue!: HTMLElement;\\n    qualityHeader!: HTMLElement;\\n    qualityItem!: NodeListOf<HTMLElement>;\\n    speed!: HTMLElement;\\n    speedValue!: HTMLElement;\\n    speedHeader!: HTMLElement;\\n    speedItem!: NodeListOf<HTMLElement>;\\n    audio!: HTMLElement;\\n    audioValue!: HTMLElement;\\n    audioHeader!: HTMLElement;\\n    audioItem!: NodeListOf<HTMLElement>;\\n    danmakuOpacityBar!: HTMLElement;\\n    danmakuOpacityBarWrap!: HTMLElement;\\n    danmakuOpacityBarWrapWrap!: HTMLElement;\\n    danmakuOpacityBox!: HTMLElement;\\n    danmakuOpacityValue!: HTMLElement;\\n    dtime!: HTMLElement;\\n    controller!: HTMLElement;\\n    commentInput!: HTMLInputElement;\\n    commentButton!: HTMLElement;\\n    commentSettingBox!: HTMLElement;\\n    commentSettingButton!: HTMLElement;\\n    commentSettingFill!: HTMLElement;\\n    commentSendButton!: HTMLElement;\\n    commentSendFill!: HTMLElement;\\n    commentColorSettingBox!: HTMLElement;\\n    browserFullButton!: HTMLElement;\\n    webFullButton!: HTMLElement;\\n    pipButton!: HTMLElement;\\n    menu!: HTMLElement;\\n    menuItem!: NodeListOf<HTMLElement>;\\n    cameraButton!: HTMLElement;\\n    airplayButton!: HTMLElement;\\n    subtitleButton!: HTMLElement;\\n    subtitleButtonInner!: HTMLElement;\\n    subtitle!: HTMLElement;\\n    barPreview!: HTMLElement;\\n    barWrap!: HTMLElement;\\n    notice!: HTMLElement;\\n    infoPanel!: HTMLElement;\\n    infoPanelClose!: HTMLElement;\\n    infoMimeType!: HTMLElement;\\n    infoVersion!: HTMLElement;\\n    infoVideoFPS!: HTMLElement;\\n    infoPageFPS!: HTMLElement;\\n    infoDroppedFrames!: HTMLElement;\\n    infoType!: HTMLElement;\\n    infoUrl!: HTMLElement;\\n    infoResolution!: HTMLElement;\\n    infoDuration!: HTMLElement;\\n    infoBufferRemain!: HTMLElement;\\n    infoDownloadSpeed!: HTMLElement;\\n\\n    constructor(options: { container: HTMLElement; options: DPlayerType.OptionsInternal; index: number; tran: (text: string) => string; }) {\\n        this.container = options.container;\\n        this.options = options.options;\\n        this.index = options.index;\\n        this.tran = options.tran;\\n        this.init();\\n    }\\n\\n    init(): void {\\n        this.container.innerHTML = tplPlayer({\\n            options: this.options,\\n            index: this.index,\\n            tran: this.tran,\\n            icons: Icons,\\n            mobile: utils.isMobile,\\n            video: {\\n                current: true,\\n                pic: this.options.video.pic,\\n                screenshot: this.options.screenshot,\\n                airplay: this.options.airplay,\\n                preload: this.options.preload,\\n                url: this.options.video.url,\\n                subtitle: this.options.subtitle,\\n                crossOrigin: this.options.crossOrigin,\\n            },\\n        });\\n\\n        this.volumeBar = this.container.querySelector('.dplayer-volume-bar-inner')!;\\n        this.volumeBarWrap = this.container.querySelector('.dplayer-volume-bar')!;\\n        this.volumeBarWrapWrap = this.container.querySelector('.dplayer-volume-bar-wrap')!;\\n        this.volumeButton = this.container.querySelector('.dplayer-volume')!;\\n        this.volumeButtonIcon = this.container.querySelector('.dplayer-volume-icon')!;\\n        this.volumeIcon = this.container.querySelector('.dplayer-volume-icon .dplayer-icon-content')!;\\n        this.playedBar = this.container.querySelector('.dplayer-played')!;\\n        this.loadedBar = this.container.querySelector('.dplayer-loaded')!;\\n        this.playedBarWrap = this.container.querySelector('.dplayer-bar-wrap')!;\\n        this.playedBarTime = this.container.querySelector('.dplayer-bar-time')!;\\n        this.danmaku = this.container.querySelector('.dplayer-danmaku')!;\\n        this.danmakuLoading = this.container.querySelector('.dplayer-danloading')!;\\n        this.video = this.container.querySelector<HTMLVideoElement>('.dplayer-video-current')!;\\n        this.bezel = this.container.querySelector('.dplayer-bezel-icon')!;\\n        this.playButton = this.container.querySelector('.dplayer-play-icon')!;\\n        this.playIcon = this.container.querySelector('.dplayer-play-icon .dplayer-icon-content')!;\\n        this.mobileBackwardButton = this.container.querySelector('.dplayer-mobile-icon-backward')!;\\n        this.mobilePlayButton = this.container.querySelector('.dplayer-mobile-icon-play')!;\\n        this.mobileForwardButton = this.container.querySelector('.dplayer-mobile-icon-forward')!;\\n        this.videoWrap = this.container.querySelector('.dplayer-video-wrap')!;\\n        this.videoWrapAspect = this.container.querySelector('.dplayer-video-wrap-aspect')!;\\n        this.controllerMask = this.container.querySelector('.dplayer-controller-mask')!;\\n        this.ptime = this.container.querySelector('.dplayer-ptime')!;\\n        this.settingButton = this.container.querySelector('.dplayer-setting-icon')!;\\n        this.settingBox = this.container.querySelector('.dplayer-setting-box')!;\\n        this.settingOriginPanel = this.container.querySelector('.dplayer-setting-origin-panel')!;\\n        this.mask = this.container.querySelector('.dplayer-mask')!;\\n        this.syncButton = this.container.querySelector('.dplayer-live-badge')!;\\n        this.loop = this.container.querySelector('.dplayer-setting-loop')!;\\n        this.loopToggle = this.container.querySelector<HTMLInputElement>('.dplayer-setting-loop .dplayer-toggle-setting-input')!;\\n        this.showDanmaku = this.container.querySelector('.dplayer-setting-showdan')!;\\n        this.showDanmakuToggle = this.container.querySelector<HTMLInputElement>('.dplayer-showdan-setting-input')!;\\n        this.unlimitDanmaku = this.container.querySelector('.dplayer-setting-danunlimit')!;\\n        this.unlimitDanmakuToggle = this.container.querySelector<HTMLInputElement>('.dplayer-danunlimit-setting-input')!;\\n        this.quality = this.container.querySelector('.dplayer-setting-quality')!;\\n        this.qualityValue = this.container.querySelector('.dplayer-setting-quality .dplayer-label-value')!;\\n        this.qualityHeader = this.container.querySelector('.dplayer-setting-quality-header')!;\\n        this.qualityItem = this.container.querySelectorAll<HTMLElement>('.dplayer-setting-quality-item')!;\\n        this.speed = this.container.querySelector('.dplayer-setting-speed')!;\\n        this.speedValue = this.container.querySelector('.dplayer-setting-speed .dplayer-label-value')!;\\n        this.speedHeader = this.container.querySelector('.dplayer-setting-speed-header')!;\\n        this.speedItem = this.container.querySelectorAll<HTMLElement>('.dplayer-setting-speed-item')!;\\n        this.audio = this.container.querySelector('.dplayer-setting-audio')!;\\n        this.audioValue = this.container.querySelector('.dplayer-setting-audio .dplayer-label-value')!;\\n        this.audioHeader = this.container.querySelector('.dplayer-setting-audio-header')!;\\n        this.audioItem = this.container.querySelectorAll<HTMLElement>('.dplayer-setting-audio-item')!;\\n        this.danmakuOpacityBar = this.container.querySelector('.dplayer-danmaku-bar-inner')!;\\n        this.danmakuOpacityBarWrap = this.container.querySelector('.dplayer-danmaku-bar')!;\\n        this.danmakuOpacityBarWrapWrap = this.container.querySelector('.dplayer-danmaku-bar-wrap')!;\\n        this.danmakuOpacityBox = this.container.querySelector('.dplayer-setting-danmaku')!;\\n        this.danmakuOpacityValue = this.container.querySelector('.dplayer-setting-danmaku .dplayer-label-value')!;\\n        this.dtime = this.container.querySelector('.dplayer-dtime')!;\\n        this.controller = this.container.querySelector('.dplayer-controller')!;\\n        this.commentInput = this.container.querySelector<HTMLInputElement>('.dplayer-comment-input')!;\\n        this.commentButton = this.container.querySelector('.dplayer-comment-icon')!;\\n        this.commentSettingBox = this.container.querySelector('.dplayer-comment-setting-box')!;\\n        this.commentSettingButton = this.container.querySelector('.dplayer-comment-setting-icon')!;\\n        this.commentSettingFill = this.container.querySelector('.dplayer-comment-setting-icon path')!;\\n        this.commentSendButton = this.container.querySelector('.dplayer-send-icon')!;\\n        this.commentSendFill = this.container.querySelector('.dplayer-send-icon path')!;\\n        this.commentColorSettingBox = this.container.querySelector('.dplayer-comment-setting-color')!;\\n        this.browserFullButton = this.container.querySelector('.dplayer-full-icon')!;\\n        this.webFullButton = this.container.querySelector('.dplayer-full-in-icon')!;\\n        this.pipButton = this.container.querySelector('.dplayer-pip-icon')!;\\n        this.menu = this.container.querySelector('.dplayer-menu')!;\\n        this.menuItem = this.container.querySelectorAll<HTMLElement>('.dplayer-menu-item')!;\\n        this.cameraButton = this.container.querySelector('.dplayer-camera-icon')!;\\n        this.airplayButton = this.container.querySelector('.dplayer-airplay-icon')!;\\n        this.subtitleButton = this.container.querySelector('.dplayer-subtitle-icon')!;\\n        this.subtitleButtonInner = this.container.querySelector('.dplayer-subtitle-icon .dplayer-icon-content')!;\\n        this.subtitle = this.container.querySelector('.dplayer-subtitle')!;\\n        this.barPreview = this.container.querySelector('.dplayer-bar-preview')!;\\n        this.barWrap = this.container.querySelector('.dplayer-bar-wrap')!;\\n        this.notice = this.container.querySelector('.dplayer-notice')!;\\n        this.infoPanel = this.container.querySelector('.dplayer-info-panel')!;\\n        this.infoPanelClose = this.container.querySelector('.dplayer-info-panel-close')!;\\n        this.infoMimeType = this.container.querySelector('.dplayer-info-panel-item-mimetype .dplayer-info-panel-item-data')!;\\n        this.infoVersion = this.container.querySelector('.dplayer-info-panel-item-version .dplayer-info-panel-item-data')!;\\n        this.infoVideoFPS = this.container.querySelector('.dplayer-info-panel-item-video-fps .dplayer-info-panel-item-data')!;\\n        this.infoPageFPS = this.container.querySelector('.dplayer-info-panel-item-page-fps .dplayer-info-panel-item-data')!;\\n        this.infoDroppedFrames = this.container.querySelector('.dplayer-info-panel-item-dropped-frames .dplayer-info-panel-item-data')!;\\n        this.infoType = this.container.querySelector('.dplayer-info-panel-item-type .dplayer-info-panel-item-data')!;\\n        this.infoUrl = this.container.querySelector('.dplayer-info-panel-item-url .dplayer-info-panel-item-data')!;\\n        this.infoResolution = this.container.querySelector('.dplayer-info-panel-item-resolution .dplayer-info-panel-item-data')!;\\n        this.infoDuration = this.container.querySelector('.dplayer-info-panel-item-duration .dplayer-info-panel-item-data')!;\\n        this.infoBufferRemain = this.container.querySelector('.dplayer-info-panel-item-buffer-remain .dplayer-info-panel-item-data')!;\\n        this.infoDownloadSpeed = this.container.querySelector('.dplayer-info-panel-item-download-speed .dplayer-info-panel-item-data')!;\\n    }\\n}\\n\\nexport default Template;\\n\",\"import DPlayer from './player';\\nimport Events from './events';\\nimport utils from './utils';\\nimport defaultApiBackend from './api';\\nimport * as DPlayerType from './types';\\n\\ninterface DanmakuOptions {\\n    player: DPlayer,\\n    container: HTMLElement,\\n    opacity: number,\\n    callback: () => void,\\n    error: (msg: string) => void,\\n    apiBackend: DPlayerType.APIBackend,\\n    borderColor: string,\\n    fontSize: number,\\n    time: () => number,\\n    unlimited: number,\\n    speedRate: number,\\n    api: DanmakuOptionsAPI,\\n    events: Events,\\n    tran: (msg: string) => string,\\n}\\n\\ninterface DanmakuOptionsAPI {\\n    id?: string,\\n    address?: string,\\n    token?: string,\\n    maximum?: number,\\n    addition?: string[],\\n    user?: string,\\n}\\n\\nclass Danmaku {\\n    options: DanmakuOptions;\\n    player: DPlayer;\\n    container: HTMLElement;\\n    danTunnel: {\\n        right: {[key: string]: HTMLElement[]},\\n        top: {[key: string]: HTMLElement[]},\\n        bottom: {[key: string]: HTMLElement[]},\\n    };\\n    danIndex: number;\\n    danFontSize: number;\\n    dan: DPlayerType.Dan[];\\n    _opacity: number;\\n    events: Events;\\n    unlimited: boolean;\\n\\n    context: CanvasRenderingContext2D | null = null;\\n    showing: boolean;\\n    paused = false;\\n\\n    constructor(options: DanmakuOptions) {\\n        this.options = options;\\n        this.player = this.options.player;\\n        this.container = this.options.container;\\n        this.danTunnel = {\\n            right: {},\\n            top: {},\\n            bottom: {},\\n        };\\n        this.danIndex = 0;\\n        this.danFontSize = 24; // 24px\\n        this.dan = [];\\n        this.showing = true;\\n        this._opacity = this.options.opacity;\\n        this.events = this.options.events;\\n        this.unlimited = this.options.unlimited === 1;\\n        this._measure('', 0);\\n\\n        this.load();\\n    }\\n\\n    load(): void {\\n        let apiurl;\\n        if (this.options.api.address) {\\n            const apiParamsObj = Object.assign({},\\n                this.options.api.id ? { id: this.options.api.id } : {},\\n                this.options.api.maximum ? { max: this.options.api.maximum } : {},\\n            );\\n            const apiParamsStr = Object.entries(apiParamsObj)\\n                .map(([key, value]) => `${key}=${value}`)\\n                .join('&');\\n            apiurl = apiParamsStr ? `${this.options.api.address}?${apiParamsStr}` : this.options.api.address;\\n        }\\n        const endpoints = (this.options.api.addition || []).slice(0);\\n        if (apiurl) endpoints.push(apiurl);\\n        if (this.options.apiBackend !== defaultApiBackend) endpoints.push('apiBackend');\\n        this.events && this.events.trigger('danmaku_load_start', endpoints);\\n\\n        this._readAllEndpoints(endpoints, (results) => {\\n            this.dan = ([] as DPlayerType.Dan[]).concat(...results).sort((a, b) => a.time - b.time);\\n            window.requestAnimationFrame(() => {\\n                this.frame();\\n            });\\n\\n            this.options.callback();\\n\\n            this.events && this.events.trigger('danmaku_load_end');\\n        });\\n    }\\n\\n    reload(newAPI: DanmakuOptionsAPI) {\\n        this.options.api = newAPI;\\n        this.dan = [];\\n        this.clear();\\n        this.load();\\n    }\\n\\n    /**\\n     * Asynchronously read danmaku from all API endpoints\\n     */\\n    _readAllEndpoints(endpoints: string[], callback: (results: DPlayerType.Dan[][]) => void): void {\\n        const results: DPlayerType.Dan[][] = [];\\n        let errorCount = 0;\\n        let readCount = 0;\\n\\n        for (let i = 0; i < endpoints.length; ++i) {\\n            this.options.apiBackend.read({\\n                url: endpoints[i],\\n                success: (data) => {\\n                    results[i] = data;\\n\\n                    ++readCount;\\n                    if (readCount === endpoints.length) {\\n                        callback(results);\\n                    }\\n                },\\n                error: (message) => {\\n                    if (message) this.options.error(message);\\n                    results[i] = [];\\n\\n                    ++errorCount;\\n                    ++readCount;\\n                    if (readCount === endpoints.length) {\\n                        if (errorCount !== endpoints.length) {\\n                            this.options.error(this.options.tran('Danmaku load partial failed'));\\n                        } else {\\n                            this.options.error(this.options.tran('Danmaku load failed'));\\n                        }\\n                        callback(results);\\n                    }\\n                },\\n            });\\n        }\\n    }\\n\\n    send(dan: DPlayerType.DanmakuItem, callback: () => void, isCallbackOnError = false): void {\\n        const danmakuData: DPlayerType.Dan = {\\n            token: this.options.api.token,\\n            id: this.options.api.id,\\n            author: this.options.api.user,\\n            time: this.options.time(),\\n            text: dan.text,\\n            color: dan.color,\\n            type: dan.type,\\n            size: dan.size,\\n        };\\n\\n        this.options.apiBackend.send({\\n            url: this.options.api.address,\\n            data: danmakuData,\\n            success: () => {\\n                this.dan.splice(this.danIndex, 0, danmakuData);\\n                this.danIndex++;\\n                this.draw({\\n                    text: danmakuData.text,\\n                    color: danmakuData.color,\\n                    type: danmakuData.type,\\n                    size: danmakuData.size,\\n                    border: true,\\n                });\\n\\n                this.events && this.events.trigger('danmaku_send', danmakuData);\\n                callback();\\n            },\\n            error: (message) => {\\n                this.options.error(message || this.options.tran('Danmaku send failed'));\\n                if (isCallbackOnError === true) {\\n                    callback();\\n                }\\n            },\\n        });\\n    }\\n\\n    frame(): void {\\n        if (this.dan.length && !this.paused && this.showing) {\\n            let item = this.dan[this.danIndex];\\n            const dan = [];\\n            while (item && this.options.time() > (typeof item.time === 'number' ? item.time : parseFloat(item.time))) {\\n                dan.push(item);\\n                item = this.dan[++this.danIndex];\\n            }\\n            this.draw(dan);\\n        }\\n        window.requestAnimationFrame(() => {\\n            this.frame();\\n        });\\n    }\\n\\n    opacity(percentage?: number): number {\\n        if (percentage !== undefined) {\\n            this.container.style.setProperty('--dplayer-danmaku-opacity', `${percentage}`);\\n            this._opacity = percentage;\\n\\n            this.events && this.events.trigger('danmaku_opacity', this._opacity);\\n        }\\n        return this._opacity;\\n    }\\n\\n    /**\\n     * Push a danmaku into DPlayer\\n     *\\n     * @param {Object Array} dan - {text, color, type}\\n     * text - danmaku content\\n     * color - danmaku color, default: `#ffeaea`\\n     * type - danmaku type, `right` `top` `bottom`, default: `right`\\n     * size - danmaku size, `medium` `big` `small`, default: `medium`\\n     */\\n    draw(dan: DPlayerType.DanmakuItem | DPlayerType.DanmakuItem[] | DPlayerType.Dan[]): DocumentFragment | null {\\n        if (this.showing) {\\n\\n            // if the dan variable is an object, create and assign an array of only one object\\n            let danList: DPlayerType.DanmakuItem[] | DPlayerType.Dan[];\\n            if (Object.prototype.toString.call(dan) !== '[object Array]') {\\n                danList = [dan as DPlayerType.DanmakuItem];\\n            } else {\\n                danList = dan as DPlayerType.DanmakuItem[] | DPlayerType.Dan[];\\n            }\\n\\n            // adjust the font size according to the screen size\\n            const ratioRate = 1.25; // magic!\\n            let ratio = this.container.offsetWidth / 1024 * ratioRate;\\n            if (ratio >= 1) ratio = 1; // ratio should not exceed 1\\n            let itemFontSize = this.options.fontSize * ratio;\\n            const itemHeight = itemFontSize + (6 * ratio); // 6 is the vertical margin of danmaku\\n\\n            const danWidth = this.container.offsetWidth;\\n            const danHeight = this.container.offsetHeight;\\n            const itemY = danHeight / itemHeight;\\n\\n            const danItemRight = (danmakuItem: HTMLElement) => {\\n                const danmakuItemWidth = danmakuItem.offsetWidth || parseInt(danmakuItem.style.width);\\n                const danmakuItemRight =\\n                    danmakuItem.getBoundingClientRect().right || this.container.getBoundingClientRect().right + danmakuItemWidth;\\n                return this.container.getBoundingClientRect().right - danmakuItemRight;\\n            };\\n\\n            const danSpeed = (width: number) => (danWidth + width) / 5;\\n\\n            const getTunnel = (danmakuItem: HTMLElement, type: DPlayerType.DanmakuType, width: number) => {\\n                const tmp = danWidth / danSpeed(width);\\n\\n                for (let i = 0; this.unlimited || i < itemY; i++) {\\n                    const item = this.danTunnel[type][i + ''];\\n                    if (item && item.length) {\\n                        if (type !== 'right') {\\n                            continue;\\n                        }\\n                        for (let j = 0; j < item.length; j++) {\\n                            const danRight = danItemRight(item[j]) - 10;\\n                            if (danRight <= danWidth - tmp * danSpeed(parseInt(item[j].style.width)) || danRight <= 0) {\\n                                break;\\n                            }\\n                            if (j === item.length - 1) {\\n                                this.danTunnel[type][i + ''].push(danmakuItem);\\n                                danmakuItem.addEventListener('animationend', () => {\\n                                    this.danTunnel[type][i + ''].splice(0, 1);\\n                                });\\n                                return i % itemY;\\n                            }\\n                        }\\n                    } else {\\n                        this.danTunnel[type][i + ''] = [danmakuItem];\\n                        danmakuItem.addEventListener('animationend', () => {\\n                            this.danTunnel[type][i + ''].splice(0, 1);\\n                        });\\n                        return i % itemY;\\n                    }\\n                }\\n                return -1;\\n            };\\n\\n            const docFragment = document.createDocumentFragment();\\n\\n            for (let i = 0; i < danList.length; i++) {\\n\\n                const dan = danList[i];\\n\\n                // Whether the type is numeric (for compatibility)\\n                if (typeof dan.color === 'number' && isFinite(dan.color)) {\\n                    dan.color = utils.number2Color(dan.color);\\n                }\\n                if (typeof dan.type === 'number' && isFinite(dan.type)) {\\n                    dan.type = utils.number2Type(dan.type) as DPlayerType.DanmakuType;\\n                }\\n\\n                // set default danmaku color\\n                if (!dan.color) {\\n                    dan.color = '#ffeaea'; // white\\n                }\\n\\n                // set default danmaku type\\n                if (!dan.type || (dan.type !== 'right' && dan.type !== 'top' && dan.type !== 'bottom')) {\\n                    dan.type = 'right';\\n                }\\n\\n                // set default danmaku size\\n                if (!dan.size) {\\n                    dan.size = 'medium';\\n                }\\n\\n                // set danmaku size\\n                // used to calculate danmaku width\\n                // danmaku size doesn't affect itemHeight\\n                switch (dan.size) {\\n                    case 'big':\\n                        itemFontSize = itemFontSize * 1.25;\\n                        break;\\n                    case 'small':\\n                        itemFontSize = itemFontSize * 0.8;\\n                        break;\\n                }\\n\\n                const itemWidth = (() => {\\n                    let measure = 0;\\n                    // returns the width of the widest line\\n                    for (const line of dan.text.split('\\\\n')) {\\n                        const result = this._measure(line, itemFontSize);\\n                        if (result > measure) {\\n                            measure = result;\\n                        }\\n                    }\\n                    return measure;\\n                })();\\n\\n                // repeat for each line of danmaku\\n                // if danmaku type is bottom, the order must be reversed\\n                const lines = dan.text.split('\\\\n');\\n                for (const line of (dan.type === 'bottom') ? lines.reverse() : lines) {\\n\\n                    const danmakuItem = document.createElement('div');\\n                    danmakuItem.classList.add('dplayer-danmaku-item');\\n                    danmakuItem.classList.add(`dplayer-danmaku-${dan.type}`); // set danmaku type (CSS)\\n                    danmakuItem.classList.add(`dplayer-danmaku-size-${dan.size}`); // set danmaku size (CSS)\\n\\n                    // set danmaku color\\n                    danmakuItem.style.color = dan.color;\\n\\n                    // set danmaku text\\n                    if ('border' in dan && dan.border) {\\n                        const span = document.createElement('span');\\n                        span.style.border = `2px solid ${this.options.borderColor}`;\\n                        span.textContent = line;\\n                        danmakuItem.appendChild(span);\\n                    } else {\\n                        danmakuItem.textContent = line;\\n                    }\\n\\n                    // set event to remove this danmaku\\n                    danmakuItem.addEventListener('animationend', () => {\\n                        this.container.removeChild(danmakuItem);\\n                    });\\n\\n                    // ensure and adjust danmaku position\\n                    const tunnel = getTunnel(danmakuItem, dan.type, itemWidth);\\n                    switch (dan.type) {\\n                        case 'right':\\n                            if (tunnel >= 0) {\\n                                danmakuItem.style.width = itemWidth + 1 + 'px';\\n                                danmakuItem.style.top = itemHeight * tunnel + 8 + 'px';\\n                                danmakuItem.style.transform = `translateX(-${danWidth}px)`;\\n                                danmakuItem.style.willChange = 'transform';\\n                                // In Safari and the WKWebView browser on iOS/iPadOS, a rendering bug causes the\\n                                // danmaku to flicker if try to show it right away, so hide it for now.\\n                                if (utils.isWebKit) {\\n                                    danmakuItem.style.display = 'none';\\n                                }\\n                            }\\n                            break;\\n                        case 'top':\\n                            if (tunnel >= 0) {\\n                                danmakuItem.style.width = itemWidth + 1 + 'px';\\n                                danmakuItem.style.top = itemHeight * tunnel + 8 + 'px';\\n                                danmakuItem.style.willChange = 'visibility';\\n                            }\\n                            break;\\n                        case 'bottom':\\n                            if (tunnel >= 0) {\\n                                danmakuItem.style.width = itemWidth + 1 + 'px';\\n                                danmakuItem.style.bottom = itemHeight * tunnel + 8 + 'px';\\n                                danmakuItem.style.willChange = 'visibility';\\n                            }\\n                            break;\\n                        default:\\n                            console.error(`Can't handled danmaku type: ${dan.type}`);\\n                    }\\n\\n                    if (tunnel >= 0) {\\n                        // move\\n                        danmakuItem.classList.add('dplayer-danmaku-move');\\n                        danmakuItem.style.animationDuration = this._danAnimation(dan.type);\\n\\n                        // insert\\n                        docFragment.appendChild(danmakuItem);\\n\\n                        // In Safari and the WKWebView browser:\\n                        // Wait 0 seconds with setTimeout() (important!) and then unhide\\n                        if (utils.isWebKit && dan.type === 'right') {\\n                            setTimeout(() => {\\n                                danmakuItem.style.display = '';\\n                            }, 0);\\n                        }\\n                    }\\n                }\\n            }\\n\\n            // set base danmaku font size\\n            this.container.style.setProperty('--dplayer-danmaku-font-size', `${itemFontSize}px`);\\n\\n            // draw danmaku\\n            this.container.appendChild(docFragment);\\n            return docFragment;\\n        }\\n\\n        return null;\\n    }\\n\\n    play(): void {\\n        this.paused = false;\\n    }\\n\\n    pause(): void {\\n        this.paused = true;\\n    }\\n\\n    _measure(text: string, itemFontSize: number): number {\\n        if (!this.context || this.danFontSize !== itemFontSize) {\\n            this.danFontSize = itemFontSize;\\n            this.context = document.createElement('canvas').getContext('2d');\\n            this.context!.font = `bold ${this.danFontSize}px \\\"Segoe UI\\\", Arial`;\\n        }\\n\\n        // returns the width of the widest line\\n        const lines = text.split('\\\\n');\\n        let maxWidth = 0;\\n        for (let i = 0; i < lines.length; i++) {\\n            maxWidth = Math.max(maxWidth, this.context!.measureText(lines[i]).width);\\n        }\\n        return maxWidth;\\n    }\\n\\n    seek(): void {\\n        this.clear();\\n        for (let i = 0; i < this.dan.length; i++) {\\n            if (this.dan[i].time >= this.options.time()) {\\n                this.danIndex = i;\\n                break;\\n            }\\n            this.danIndex = this.dan.length;\\n        }\\n    }\\n\\n    clear(): void {\\n        this.danTunnel = {\\n            right: {},\\n            top: {},\\n            bottom: {},\\n        };\\n        this.danIndex = 0;\\n        this.options.container.innerHTML = '';\\n\\n        this.events && this.events.trigger('danmaku_clear');\\n    }\\n\\n    resize(): void {\\n        const danWidth = this.container.offsetWidth;\\n        const items = this.container.querySelectorAll<HTMLElement>('.dplayer-danmaku-item');\\n        for (let i = 0; i < items.length; i++) {\\n            items[i].style.transform = `translateX(-${danWidth}px)`;\\n        }\\n    }\\n\\n    hide(): void {\\n        this.showing = false;\\n        this.pause();\\n        this.clear();\\n\\n        this.events && this.events.trigger('danmaku_hide');\\n    }\\n\\n    show(): void {\\n        this.seek();\\n        this.showing = true;\\n        this.play();\\n\\n        this.events && this.events.trigger('danmaku_show');\\n    }\\n\\n    toggle(): void {\\n        if (this.showing) {\\n            this.hide();\\n        } else {\\n            this.show();\\n        }\\n    }\\n\\n    unlimit(boolean: boolean): void {\\n        this.unlimited = boolean;\\n    }\\n\\n    speed(rate: number): void {\\n        this.options.speedRate = rate;\\n    }\\n\\n    _danAnimation(position: DPlayerType.DanmakuType): string {\\n        const rate = this.options.speedRate;\\n        const isFullScreen =\\n            this.player.fullScreen.isFullScreen('browser') ||\\n            this.player.fullScreen.isFullScreen('web');\\n        const animations = {\\n            top: `${(isFullScreen ? 4.5 : 4) / rate}s`,\\n            right: `${(isFullScreen ? 5.5 : 5) / rate}s`,\\n            bottom: `${(isFullScreen ? 4.5 : 4) / rate}s`,\\n        };\\n        return animations[position];\\n    }\\n}\\n\\nexport default Danmaku;\\n\",\"import * as DPlayerType from './types';\\n\\nclass Events {\\n    events: {[key: string]: {callback: (info?: Event | any) => void; once: boolean}[]};\\n    videoEvents: DPlayerType.VideoEvents[];\\n    playerEvents: DPlayerType.PlayerEvents[];\\n\\n    constructor() {\\n        this.events = {};\\n\\n        this.videoEvents = [\\n            'abort',\\n            'canplay',\\n            'canplaythrough',\\n            'durationchange',\\n            'emptied',\\n            'ended',\\n            'error',\\n            'loadeddata',\\n            'loadedmetadata',\\n            'loadstart',\\n            'mozaudioavailable',\\n            'pause',\\n            'play',\\n            'playing',\\n            'progress',\\n            'ratechange',\\n            'seeked',\\n            'seeking',\\n            'stalled',\\n            'suspend',\\n            'timeupdate',\\n            'volumechange',\\n            'waiting',\\n        ];\\n        this.playerEvents = [\\n            'screenshot',\\n            'thumbnails_show',\\n            'thumbnails_hide',\\n            'danmaku_show',\\n            'danmaku_hide',\\n            'danmaku_clear',\\n            'danmaku_load_start',\\n            'danmaku_load_end',\\n            'danmaku_send',\\n            'danmaku_opacity',\\n            'contextmenu_show',\\n            'contextmenu_hide',\\n            'notice_show',\\n            'notice_hide',\\n            'quality_start',\\n            'quality_end',\\n            'destroy',\\n            'resize',\\n            'fullscreen',\\n            'fullscreen_cancel',\\n            'webfullscreen',\\n            'webfullscreen_cancel',\\n            'subtitle_show',\\n            'subtitle_hide',\\n            'subtitle_change',\\n        ];\\n    }\\n\\n    on(name: DPlayerType.Events, callback: (info?: Event | any) => void, once = false): void {\\n        if (this.type(name) && typeof callback === 'function') {\\n            if (!this.events[name]) {\\n                this.events[name] = [];\\n            }\\n            this.events[name].push({\\n                callback,\\n                once,\\n            });\\n        }\\n    }\\n\\n    off(name: DPlayerType.Events, callback: (info?: Event | any) => void): void {\\n        if (this.type(name) && typeof callback === 'function' && this.events[name]) {\\n            for (const event of this.events[name]) {\\n                if (event.callback === callback) {\\n                    this.events[name].splice(this.events[name].indexOf(event), 1);\\n                }\\n            }\\n        }\\n    }\\n\\n    trigger(name: DPlayerType.Events, info?: Event | any): void {\\n        if (this.events[name] && this.events[name].length) {\\n            for (const event of this.events[name]) {\\n                event.callback(info);\\n                if (event.once) {\\n                    this.off(name, event.callback);\\n                }\\n            }\\n        }\\n    }\\n\\n    type(name: DPlayerType.Events): 'player' | 'video' | null {\\n        if ((this.playerEvents as DPlayerType.Events[]).indexOf(name) !== -1) {\\n            return 'player';\\n        } else if ((this.videoEvents as DPlayerType.Events[]).indexOf(name) !== -1) {\\n            return 'video';\\n        }\\n\\n        console.error(`Unknown event name: ${name}`);\\n        return null;\\n    }\\n}\\n\\nexport default Events;\\n\",\"import DPlayer from './player';\\nimport utils from './utils';\\nimport * as DPlayerType from './types';\\n\\nclass FullScreen {\\n    player: DPlayer;\\n    lastScrollPosition: { left: number; top: number; };\\n    fullscreenchange: () => void;\\n\\n    constructor(player: DPlayer) {\\n        this.player = player;\\n        this.lastScrollPosition = { left: 0, top: 0 };\\n        this.player.events.on('webfullscreen', () => {\\n            this.player.resize();\\n        });\\n        this.player.events.on('webfullscreen_cancel', () => {\\n            this.player.resize();\\n            utils.setScrollPosition(this.lastScrollPosition);\\n        });\\n\\n        this.fullscreenchange = () => {\\n            this.player.resize();\\n            if (this.isFullScreen('browser')) {\\n                this.player.events.trigger('fullscreen');\\n            } else {\\n                utils.setScrollPosition(this.lastScrollPosition);\\n                this.player.container.classList.remove('dplayer-fulled-browser');\\n                this.player.events.trigger('fullscreen_cancel');\\n            }\\n        };\\n        if (this.player.container.onfullscreenchange !== undefined) {\\n            this.player.container.addEventListener('fullscreenchange', this.fullscreenchange);\\n        } else {\\n            this.player.container.addEventListener('webkitfullscreenchange', this.fullscreenchange);\\n        }\\n    }\\n\\n    isFullScreen(type: DPlayerType.FullscreenType = 'browser'): boolean {\\n        switch (type) {\\n            case 'browser': {\\n                const fullEle = document.fullscreenElement || document.webkitFullscreenElement;\\n                if (fullEle && fullEle === this.player.container) {\\n                    return true;\\n                } else {\\n                    return false;\\n                }\\n            }\\n            case 'web': {\\n                return this.player.container.classList.contains('dplayer-fulled');\\n            }\\n        }\\n    }\\n\\n    request(type: DPlayerType.FullscreenType = 'browser'): void {\\n        const anotherType = type === 'browser' ? 'web' : 'browser';\\n        const anotherTypeOn = this.isFullScreen(anotherType);\\n        if (!anotherTypeOn) {\\n            this.lastScrollPosition = utils.getScrollPosition();\\n        }\\n\\n        switch (type) {\\n            case 'browser':\\n                // unify method names\\n                this.player.container.requestFullscreen =\\n                    this.player.container.requestFullscreen || // HTML5 standard\\n                    this.player.container.webkitRequestFullscreen; // Webkit\\n                // request fullscreen\\n                if (this.player.container.requestFullscreen !== undefined) {\\n                    this.player.container.requestFullscreen();\\n                } else if (this.player.video.webkitEnterFullscreen) {\\n                    // compatibility: Fullscreen API is not supported in Safari for iOS, so fallback to video.webkitEnterFullscreen()\\n                    // only the video element is fullscreen, so if fullscreen is enabled you can only use the default controls\\n                    this.player.video.webkitEnterFullscreen();\\n                }\\n                // lock screen to landscape (if supported)\\n                if (screen.orientation) {\\n                    try {\\n                        screen.orientation.lock('landscape').catch(() => {\\n                            // pass\\n                        });\\n                    } catch (e) {\\n                        // pass\\n                    }\\n                }\\n                // video.webkitEnterFullscreen() does not dispatch the event that exit fullscreen, so the 'dplayer-fulled-browser' class is not added\\n                if (this.player.container.requestFullscreen !== undefined) {\\n                    this.player.container.classList.add('dplayer-fulled-browser');\\n                }\\n                break;\\n            case 'web':\\n                this.player.container.classList.add('dplayer-fulled');\\n                document.body.classList.add('dplayer-web-fullscreen-fix');\\n                this.player.events.trigger('webfullscreen');\\n                break;\\n        }\\n\\n        if (anotherTypeOn) {\\n            this.cancel(anotherType);\\n        }\\n    }\\n\\n    cancel(type: DPlayerType.FullscreenType = 'browser'): void {\\n        switch (type) {\\n            case 'browser':\\n                // unify method names\\n                document.exitFullscreen =\\n                    document.exitFullscreen || // HTML5 standard\\n                    document.webkitExitFullscreen; // Webkit\\n                // exit fullscreen\\n                if (document.exitFullscreen) {\\n                    document.exitFullscreen();\\n                }\\n                // unlock screen (if supported)\\n                if (screen.orientation) {\\n                    try {\\n                        screen.orientation.unlock();\\n                    } catch (e) {\\n                        // pass\\n                    }\\n                }\\n                this.player.container.classList.remove('dplayer-fulled-browser');\\n                break;\\n            case 'web':\\n                this.player.container.classList.remove('dplayer-fulled');\\n                document.body.classList.remove('dplayer-web-fullscreen-fix');\\n                this.player.events.trigger('webfullscreen_cancel');\\n                break;\\n        }\\n    }\\n\\n    toggle(type: DPlayerType.FullscreenType = 'browser'): void {\\n        if (this.isFullScreen(type)) {\\n            this.cancel(type);\\n        } else {\\n            this.request(type);\\n        }\\n    }\\n\\n    destroy(): void {\\n        this.player.container.removeEventListener('fullscreenchange', this.fullscreenchange);\\n        this.player.container.removeEventListener('webkitfullscreenchange', this.fullscreenchange);\\n    }\\n}\\n\\nexport default FullScreen;\\n\",\"import DPlayer from './player';\\nimport utils from './utils';\\n\\nclass User {\\n    storageName: {[key: string]: string};\\n    default: {[key: string]: number};\\n    data: {[key: string]: number};\\n\\n    constructor(player: DPlayer) {\\n        this.storageName = {\\n            opacity: 'dplayer-danmaku-opacity',\\n            volume: 'dplayer-volume',\\n            unlimited: 'dplayer-danmaku-unlimited',\\n            danmaku: 'dplayer-danmaku-show',\\n            subtitle: 'dplayer-subtitle-show',\\n            speed: 'dplayer-speed',\\n            loop: 'dplayer-loop',\\n        };\\n        this.default = {\\n            opacity: 1.0,\\n            volume: Object.prototype.hasOwnProperty.call(player.options, 'volume') ? player.options.volume : 1.0,\\n            unlimited: (player.options.danmaku && player.options.danmaku.unlimited ? 1 : 0) || 0,\\n            danmaku: 1,\\n            subtitle: 1,\\n            speed: 1.0,\\n            loop: player.options.loop ? 1 : 0,\\n        };\\n        this.data = {};\\n\\n        this.init();\\n    }\\n\\n    init(): void {\\n        for (const item in this.storageName) {\\n            const name = this.storageName[item];\\n            this.data[item] = parseFloat(utils.storage.get(name)! || this.default[item].toString());\\n        }\\n    }\\n\\n    get(key: 'opacity' | 'volume' | 'unlimited' | 'danmaku' | 'subtitle' | 'speed' | 'loop'): number {\\n        return this.data[key];\\n    }\\n\\n    set(key: 'opacity' | 'volume' | 'unlimited' | 'danmaku' | 'subtitle' | 'speed' | 'loop', value: number): void {\\n        this.data[key] = value;\\n        utils.storage.set(this.storageName[key], value);\\n    }\\n}\\n\\nexport default User;\\n\",\"import Events from './events';\\nimport * as DPlayerType from './types';\\n\\nclass Subtitle {\\n    container: HTMLElement;\\n    video: HTMLVideoElement;\\n    plugins: DPlayerType.Plugins;\\n    options: DPlayerType.SubtitleInternal;\\n    events: Events;\\n\\n    constructor(container: HTMLElement, video: HTMLVideoElement, plugins: DPlayerType.Plugins, options: DPlayerType.SubtitleInternal, events: Events) {\\n        this.container = container;\\n        this.video = video;\\n        this.plugins = plugins;\\n        this.options = options;\\n        this.events = events;\\n\\n        this.init();\\n    }\\n\\n    init(): void {\\n        this.container.style.fontSize = this.options.fontSize;\\n        this.container.style.bottom = this.options.bottom;\\n        this.container.style.color = this.options.color;\\n\\n        if (this.options.type === 'webvtt' && this.video.textTracks && this.video.textTracks[0]) {\\n            const track = this.video.textTracks[0];\\n\\n            track.oncuechange = () => {\\n                if (!track.activeCues) {\\n                    return;\\n                }\\n                const cue = track.activeCues[0] as VTTCue;\\n                this.container.innerHTML = '';\\n                if (cue) {\\n                    const template = document.createElement('div');\\n                    template.appendChild(cue.getCueAsHTML());\\n                    const trackHtml = template.innerHTML\\n                        .split(/\\\\r?\\\\n/)\\n                        .map((item) => `<p>${item}</p>`)\\n                        .join('');\\n                    this.container.innerHTML = trackHtml;\\n                }\\n                this.events.trigger('subtitle_change');\\n            };\\n        }\\n    }\\n\\n    show(): void {\\n        this.container.classList.remove('dplayer-subtitle-hide');\\n        // for aribb24.js (caption only)\\n        // superimpose is used to notify important breaking news, so it is inappropriate to hide it at the same time as hiding subtitles.\\n        // if you want to disable the drawing of superimpose itself, options.plugins.aribb24.disableSuperimposeRenderer should be set to true.\\n        if (this.options.type === 'aribb24' && this.plugins.aribb24Caption) {\\n            this.plugins.aribb24Caption.show();\\n        }\\n        this.events.trigger('subtitle_show');\\n    }\\n\\n    hide(): void {\\n        this.container.classList.add('dplayer-subtitle-hide');\\n        // for aribb24.js (caption only)\\n        // superimpose is used to notify important breaking news, so it is inappropriate to hide it at the same time as hiding subtitles.\\n        // if you want to disable the drawing of superimpose itself, options.plugins.aribb24.disableSuperimposeRenderer should be set to true.\\n        if (this.options.type === 'aribb24' && this.plugins.aribb24Caption) {\\n            this.plugins.aribb24Caption.hide();\\n        }\\n        this.events.trigger('subtitle_hide');\\n    }\\n\\n    toggle(): void {\\n        if (this.container.classList.contains('dplayer-subtitle-hide')) {\\n            this.show();\\n        } else {\\n            this.hide();\\n        }\\n    }\\n}\\n\\nexport default Subtitle;\\n\",\"import Template from './template';\\n\\nclass Bar {\\n    elements: {[key: string]: HTMLElement};\\n\\n    constructor(template: Template) {\\n        this.elements = {};\\n        this.elements.volume = template.volumeBar;\\n        this.elements.played = template.playedBar;\\n        this.elements.loaded = template.loadedBar;\\n        this.elements.danmaku = template.danmakuOpacityBar;\\n    }\\n\\n    /**\\n     * Update progress\\n     *\\n     * @param {String} type - Point out which bar it is\\n     * @param {Number} percentage\\n     * @param {String} direction - Point out the direction of this bar, Should be height or width\\n     */\\n    set(type: 'volume' | 'played' | 'loaded' | 'danmaku', percentage: number, direction: 'width' | 'height'): void {\\n        percentage = Math.max(percentage, 0);\\n        percentage = Math.min(percentage, 1);\\n        this.elements[type].style[direction] = percentage * 100 + '%';\\n    }\\n\\n    get(type: 'volume' | 'played' | 'loaded' | 'danmaku'): number {\\n        return parseFloat(this.elements[type].style.width) / 100;\\n    }\\n}\\n\\nexport default Bar;\\n\",\"import DPlayer from './player';\\n\\nclass Timer {\\n    player: DPlayer;\\n    types: ('loading' | 'info' | 'fps')[];\\n    enablefpsChecker!: boolean;\\n    enableinfoChecker!: boolean;\\n    enableloadingChecker!: boolean;\\n    fpsIndex!: number;\\n    fpsStart!: Date | number;\\n    fpsChecker!: number;  // dummy\\n    infoChecker!: number;\\n    loadingChecker!: number;\\n\\n    constructor(player: DPlayer) {\\n        this.player = player;\\n\\n        window.requestAnimationFrame = (() =>\\n            window.requestAnimationFrame ||\\n            window.webkitRequestAnimationFrame ||\\n            window.mozRequestAnimationFrame ||\\n            window.oRequestAnimationFrame ||\\n            window.msRequestAnimationFrame ||\\n            function (callback) {\\n                window.setTimeout(callback, 1000 / 60);\\n            })();\\n\\n        this.types = ['loading', 'info', 'fps'];\\n\\n        this.init();\\n    }\\n\\n    init(): void {\\n        this.types.map((item: 'loading' | 'info' | 'fps') => {\\n            if (item !== 'fps') {\\n                this[`init${item}Checker`]();\\n            }\\n            return item;\\n        });\\n    }\\n\\n    initloadingChecker(): void {\\n        let lastPlayPos = 0;\\n        let currentPlayPos = 0;\\n        let bufferingDetected = false;\\n        this.loadingChecker = window.setInterval(() => {\\n            if (this.enableloadingChecker) {\\n                // whether the video is buffering\\n                currentPlayPos = this.player.video.currentTime;\\n                if (!bufferingDetected && currentPlayPos === lastPlayPos && !this.player.video.paused) {\\n                    this.player.container.classList.add('dplayer-loading');\\n                    bufferingDetected = true;\\n                }\\n                if (bufferingDetected && currentPlayPos > lastPlayPos && !this.player.video.paused) {\\n                    this.player.container.classList.remove('dplayer-loading');\\n                    bufferingDetected = false;\\n                }\\n                lastPlayPos = currentPlayPos;\\n            }\\n        }, 100);\\n    }\\n\\n    initfpsChecker(): void {\\n        window.requestAnimationFrame(() => {\\n            if (this.enablefpsChecker) {\\n                this.initfpsChecker();\\n                if (!this.fpsStart) {\\n                    this.fpsStart = new Date();\\n                    this.fpsIndex = 0;\\n                } else {\\n                    this.fpsIndex++;\\n                    const fpsCurrent = new Date();\\n                    // @ts-expect-error TS(2362): The left-hand side of an arithmetic operation must... Remove this comment to see the full error message\\n                    if (fpsCurrent - this.fpsStart > 1000) {\\n                        // @ts-expect-error TS(2362): The left-hand side of an arithmetic operation must... Remove this comment to see the full error message\\n                        this.player.infoPanel.fps((this.fpsIndex / (fpsCurrent - this.fpsStart)) * 1000);\\n                        this.fpsStart = new Date();\\n                        this.fpsIndex = 0;\\n                    }\\n                }\\n            } else {\\n                this.fpsStart = 0;\\n                this.fpsIndex = 0;\\n            }\\n        });\\n    }\\n\\n    initinfoChecker(): void {\\n        this.infoChecker = window.setInterval(() => {\\n            if (this.enableinfoChecker) {\\n                this.player.infoPanel.update();\\n            }\\n        }, 1000);\\n    }\\n\\n    enable(type: 'loading' | 'info' | 'fps'): void {\\n        this[`enable${type}Checker`] = true;\\n\\n        if (type === 'fps') {\\n            this.initfpsChecker();\\n        }\\n    }\\n\\n    disable(type: 'loading' | 'info' | 'fps'): void {\\n        this[`enable${type}Checker`] = false;\\n    }\\n\\n    destroy(): void {\\n        this.types.map((item) => {\\n            this[`enable${item}Checker`] = false;\\n            this[`${item}Checker`] && window.clearInterval(this[`${item}Checker`]);\\n            return item;\\n        });\\n    }\\n}\\n\\nexport default Timer;\\n\",\"class Bezel {\\n    container: HTMLElement;\\n\\n    constructor(container: HTMLElement) {\\n        this.container = container;\\n\\n        this.container.addEventListener('animationend', () => {\\n            this.container.classList.remove('dplayer-bezel-transition');\\n        });\\n    }\\n\\n    switch(icon: string): void {\\n        this.container.innerHTML = icon;\\n        this.container.classList.add('dplayer-bezel-transition');\\n    }\\n}\\n\\nexport default Bezel;\\n\",\"import Events from './events';\\nimport DPlayer from './player';\\nimport utils from './utils';\\n\\nclass Thumbnails {\\n    player: DPlayer;\\n    container: HTMLElement;\\n    barWidth: number;\\n    events: Events;\\n    private readonly viewportWidth = 180;\\n    private readonly viewportHeight = 101;\\n    private readonly thumbnailSpace = utils.isMobile ? 6 : 26;\\n    private width: number;\\n    private height: number;\\n    private interval?: number;\\n    private totalCount: number;\\n    private columnCount: number;\\n    private magnificationScale: number;\\n\\n    constructor(options: {\\n        player: DPlayer;\\n        url: string;\\n        events: Events;\\n        interval?: number;\\n        totalCount?: number;\\n        width?: number;\\n        height?: number;\\n        columnCount?: number;\\n    }) {\\n        this.player = options.player;\\n        this.container = this.player.template.barPreview;\\n        this.barWidth = this.player.template.barWrap.offsetWidth;\\n        this.events = options.events;\\n        this.interval = options.interval;\\n\\n        // Calculate total count based on interval or use specified totalCount\\n        if (options.interval) {\\n            this.totalCount = Math.ceil(this.player.video.duration / options.interval);\\n        } else {\\n            this.totalCount = options.totalCount || 100;\\n        }\\n\\n        // Set dimensions\\n        this.width = options.width || 160;\\n        // 16:9 aspect ratio if height is not specified\\n        this.height = options.height || Math.floor(this.width * 9 / 16);\\n        this.columnCount = options.columnCount || 100;  // Default to 100 columns if not specified\\n\\n        // Calculate the magnification factor to make the thumbnail width VIEWPORT_WIDTH\\n        this.magnificationScale = this.viewportWidth / this.width;\\n\\n        // Set initial styles\\n        this.player.template.barWrap.style.setProperty('--thumbnail-url', `url(${options.url})`);  // preload thumbnails\\n        this.container.style.width = `${this.viewportWidth}px`;\\n        this.container.style.height = `${this.viewportHeight}px`;\\n        this.container.style.top = `${-this.viewportHeight - this.thumbnailSpace}px`;\\n        this.container.style.backgroundPosition = '0 0';\\n\\n        // Resize thumbnails when video duration changes\\n        this.player.on('durationchange', () => {\\n            this.resize(\\n                this.width,\\n                this.height,\\n                this.barWidth,\\n            );\\n        });\\n    }\\n\\n    resize(width: number, height: number, barWrapWidth: number): void {\\n        // Update internal dimensions\\n        this.width = width;\\n        this.height = height;\\n        this.barWidth = barWrapWidth;\\n\\n        // Recalculate the total count based on the new video duration\\n        if (this.interval) {\\n            this.totalCount = Math.ceil(this.player.video.duration / this.interval);\\n        }\\n\\n        // Calculate the number of rows\\n        const rowCount = Math.ceil(this.totalCount / this.columnCount);\\n\\n        // Calculate background-size based on the sprite image dimensions\\n        const backgroundWidth = this.columnCount * width * this.magnificationScale;\\n        const backgroundHeight = rowCount * height * this.magnificationScale;\\n\\n        // Update container styles\\n        this.container.style.width = `${this.viewportWidth}px`;\\n        this.container.style.height = `${this.viewportHeight}px`;\\n        this.container.style.top = `${-this.viewportHeight - this.thumbnailSpace}px`;\\n        this.container.style.backgroundSize = `${backgroundWidth}px ${backgroundHeight}px`;\\n    }\\n\\n    show(): void {\\n        this.container.style.display = 'block';\\n        this.events && this.events.trigger('thumbnails_show');\\n    }\\n\\n    move(position: number): void {\\n        // Calculate the current thumbnail index based on position\\n        const index = Math.max(0, Math.min(Math.floor((position / this.barWidth) * this.totalCount), this.totalCount - 1));\\n\\n        // Calculate row and column based on index\\n        const column = index % this.columnCount;\\n        const row = Math.floor(index / this.columnCount);\\n\\n        // Calculate background-position based on row and column\\n        const backgroundX = column * this.width;\\n        const backgroundY = row * this.height;\\n\\n        // Set the background position\\n        this.container.style.backgroundPosition = `-${backgroundX * this.magnificationScale}px -${backgroundY * this.magnificationScale}px`;\\n\\n        // Position the container\\n        const left = Math.min(Math.max(position - this.container.offsetWidth / 2, -10), this.barWidth - (this.viewportWidth - 10));\\n        this.container.style.left = `${left}px`;\\n    }\\n\\n    hide(): void {\\n        this.container.style.display = 'none';\\n        this.events && this.events.trigger('thumbnails_hide');\\n    }\\n}\\n\\nexport default Thumbnails;\\n\",\"import DPlayer from './player';\\nimport utils from './utils';\\nimport Thumbnails from './thumbnails';\\nimport Icons from './icons';\\n\\nclass Controller {\\n    player: DPlayer;\\n    disableAutoHide = false;\\n    autoHideTimer: number;\\n    mobileSkipTimer: number;\\n    mobileBackwardTime: number;\\n    mobileForwardTime: number;\\n    setAutoHideHandler: () => void;\\n    thumbnails: Thumbnails | null = null;\\n\\n    constructor(player: DPlayer) {\\n        this.player = player;\\n\\n        this.autoHideTimer = 0;\\n        this.mobileSkipTimer = 0;\\n        this.mobileBackwardTime = 0;\\n        this.mobileForwardTime = 0;\\n        this.setAutoHideHandler = () => this.setAutoHide();\\n        if (!utils.isMobile) {\\n            this.player.container.addEventListener('mousemove', this.setAutoHideHandler);\\n            this.player.container.addEventListener('click', this.setAutoHideHandler);\\n        } else {\\n            this.player.container.addEventListener('touchmove', this.setAutoHideHandler);\\n        }\\n        this.player.on('play', this.setAutoHideHandler);\\n        this.player.on('pause', this.setAutoHideHandler);\\n\\n        this.initPlayButton();\\n        this.initThumbnails();\\n        this.initPlayedBar();\\n        this.initFullButton();\\n        this.initPipButton();\\n        this.initSyncButton();\\n        this.initScreenshotButton();\\n        this.initSubtitleButton();\\n        this.initHighlights();\\n        this.initAirplayButton();\\n        if (!utils.isMobile) {\\n            this.initVolumeButton();\\n        }\\n    }\\n\\n    initPlayButton(): void {\\n        this.player.template.playButton.addEventListener('click', () => {\\n            this.player.toggle();\\n        });\\n\\n        this.player.template.mobilePlayButton.addEventListener('click', () => {\\n            this.player.toggle();\\n        });\\n\\n        if (!utils.isMobile) {\\n            this.player.template.videoWrap.addEventListener('click', () => {\\n                this.player.toggle();\\n            });\\n            this.player.template.controllerMask.addEventListener('click', () => {\\n                this.player.toggle();\\n            });\\n        } else {\\n            this.player.template.videoWrap.addEventListener('click', () => {\\n                this.toggle();\\n                if (this.isShow()) {\\n                    this.setAutoHide();\\n                }\\n            });\\n            this.player.template.controllerMask.addEventListener('click', () => {\\n                this.toggle();\\n                if (this.isShow()) {\\n                    this.setAutoHide();\\n                }\\n            });\\n        }\\n\\n        // REW 10s\\n        this.player.template.mobileBackwardButton.addEventListener('click', () => {\\n            this.mobileBackwardTime += 10;\\n            this.player.seek(this.player.video.currentTime - 10);\\n            this.player.notice(this.player.tran('REW progress', this.mobileBackwardTime.toFixed(0)));\\n            // extend count reset\\n            // if the REW button is not pressed within 1 second, the count will be reset automatically\\n            window.clearTimeout(this.mobileSkipTimer);\\n            this.mobileSkipTimer = window.setTimeout(() => {\\n                this.mobileBackwardTime = 0;\\n            }, 1000);\\n            this.setAutoHide();\\n        });\\n\\n        // FF 10s\\n        this.player.template.mobileForwardButton.addEventListener('click', () => {\\n            this.mobileForwardTime += 10;\\n            this.player.seek(this.player.video.currentTime + 10);\\n            this.player.notice(this.player.tran('FF progress', this.mobileForwardTime.toFixed(0)));\\n            // extend count reset\\n            // if the FF button is not pressed within 1 second, the count will be reset automatically\\n            window.clearTimeout(this.mobileSkipTimer);\\n            this.mobileSkipTimer = window.setTimeout(() => {\\n                this.mobileForwardTime = 0;\\n            }, 1000);\\n            this.setAutoHide();\\n        });\\n    }\\n\\n    initHighlights(): void {\\n        this.player.on('durationchange', () => {\\n            if (this.player.video.duration !== 1 && this.player.video.duration !== Infinity) {\\n                if (this.player.options.highlight) {\\n                    const highlights = this.player.template.playedBarWrap.querySelectorAll('.dplayer-highlight');\\n                    [].slice.call(highlights, 0).forEach((item) => {\\n                        this.player.template.playedBarWrap.removeChild(item);\\n                    });\\n                    for (let i = 0; i < this.player.options.highlight.length; i++) {\\n                        if (!this.player.options.highlight[i].text || !this.player.options.highlight[i].time) {\\n                            continue;\\n                        }\\n                        const p = document.createElement('div');\\n                        p.classList.add('dplayer-highlight');\\n                        p.style.left = (this.player.options.highlight[i].time / this.player.video.duration) * 100 + '%';\\n                        const span = document.createElement('span');\\n                        span.classList.add('dplayer-highlight-text');\\n                        span.textContent = this.player.options.highlight[i].text;\\n                        p.appendChild(span);\\n                        this.player.template.playedBarWrap.insertBefore(p, this.player.template.playedBarTime);\\n                    }\\n                }\\n            }\\n        });\\n    }\\n\\n    initThumbnails(): void {\\n        if (this.player.options.video.thumbnails) {\\n            const thumbnailsConfig = this.player.options.video.thumbnails;\\n            this.thumbnails = new Thumbnails({\\n                player: this.player,\\n                url: thumbnailsConfig.url,\\n                events: this.player.events,\\n                interval: thumbnailsConfig.interval,\\n                totalCount: thumbnailsConfig.totalCount,\\n                width: thumbnailsConfig.width,\\n                height: thumbnailsConfig.height,\\n                columnCount: thumbnailsConfig.columnCount,\\n            });\\n\\n            this.player.on('loadedmetadata', () => {\\n                const width = thumbnailsConfig.width || 160;\\n                const height = thumbnailsConfig.height || Math.floor(width * 9 / 16);\\n                this.thumbnails!.resize(\\n                    width,\\n                    height,\\n                    this.player.template.barWrap.offsetWidth,\\n                );\\n            });\\n        }\\n    }\\n\\n    initPlayedBar(): void {\\n        let paused: boolean;\\n\\n        const thumbMove = (e: Event) => {\\n            const event = e as TouchEvent | MouseEvent;\\n            e.preventDefault();\\n            let percentage = utils.getRelativeX(event, this.player.template.playedBarWrap) / this.player.template.playedBarWrap.clientWidth;\\n            percentage = Math.max(percentage, 0);\\n            percentage = Math.min(percentage, 1);\\n            this.player.bar.set('played', percentage, 'width');\\n            const duration = utils.getVideoDuration(this.player.video, this.player.template);\\n            this.player.template.ptime.textContent = utils.secondToTime(percentage * duration);\\n            this.player.container.classList.add('dplayer-seeking');\\n            if (!this.player.video.paused) {\\n                this.player.video.pause();\\n            }\\n        };\\n\\n        const thumbUp = (e: Event) => {\\n            const event = e as TouchEvent | MouseEvent;\\n            document.removeEventListener(utils.nameMap.dragEnd, thumbUp);\\n            document.removeEventListener(utils.nameMap.dragMove, thumbMove);\\n            // fallback for Document Picture-in-Picture window\\n            this.player.container.removeEventListener(utils.nameMap.dragEnd, thumbUp);\\n            this.player.container.removeEventListener(utils.nameMap.dragMove, thumbMove);\\n            let percentage = utils.getRelativeX(event, this.player.template.playedBarWrap) / this.player.template.playedBarWrap.clientWidth;\\n            percentage = Math.max(percentage, 0);\\n            percentage = Math.min(percentage, 1);\\n            this.player.bar.set('played', percentage, 'width');\\n            const duration = utils.getVideoDuration(this.player.video, this.player.template);\\n            this.player.seek(this.player.bar.get('played') * duration, true);  // hide notice\\n            if (!paused) {\\n                this.player.video.play();\\n            }\\n            this.player.container.classList.remove('dplayer-seeking');\\n        };\\n\\n        this.player.template.playedBarWrap.addEventListener(utils.nameMap.dragStart, (e: Event) => {\\n            e.preventDefault();\\n            paused = this.player.video.paused;\\n            document.addEventListener(utils.nameMap.dragMove, thumbMove, { passive: false });\\n            document.addEventListener(utils.nameMap.dragEnd, thumbUp);\\n            // fallback for Document Picture-in-Picture window\\n            this.player.container.addEventListener(utils.nameMap.dragMove, thumbMove, { passive: false });\\n            this.player.container.addEventListener(utils.nameMap.dragEnd, thumbUp);\\n        }, { passive: false });\\n\\n        this.player.template.playedBarWrap.addEventListener(utils.nameMap.dragMove, (e: Event) => {\\n            e.preventDefault();\\n            const event = e as TouchEvent | MouseEvent;\\n            const duration = utils.getVideoDuration(this.player.video, this.player.template);\\n            if (duration) {\\n                const relativeX = utils.getRelativeX(event, this.player.template.playedBarWrap);\\n                if (relativeX < 0 || relativeX > this.player.template.playedBarWrap.offsetWidth) {\\n                    return;\\n                }\\n                const time = duration * (relativeX / this.player.template.playedBarWrap.offsetWidth);\\n                if (utils.isMobile) {\\n                    this.thumbnails && this.thumbnails.show();\\n                }\\n                this.thumbnails && this.thumbnails.move(relativeX);\\n                this.player.template.playedBarTime.style.left = `${relativeX - (time >= 3600 ? 27.5 : 22.5)}px`;\\n                this.player.template.playedBarTime.textContent = utils.secondToTime(time);\\n                this.player.template.playedBarTime.classList.remove('hidden');\\n            }\\n        }, { passive: false });\\n\\n        this.player.template.playedBarWrap.addEventListener(utils.nameMap.dragEnd, () => {\\n            if (utils.isMobile) {\\n                this.thumbnails && this.thumbnails.hide();\\n            }\\n        });\\n\\n        if (!utils.isMobile) {\\n            this.player.template.playedBarWrap.addEventListener('mouseenter', () => {\\n                if (this.player.video.duration) {\\n                    this.thumbnails && this.thumbnails.show();\\n                    this.player.template.playedBarTime.classList.remove('hidden');\\n                }\\n            });\\n\\n            this.player.template.playedBarWrap.addEventListener('mouseleave', () => {\\n                if (this.player.video.duration) {\\n                    this.thumbnails && this.thumbnails.hide();\\n                    this.player.template.playedBarTime.classList.add('hidden');\\n                }\\n            });\\n        }\\n    }\\n\\n    initFullButton(): void {\\n        this.player.template.browserFullButton.addEventListener('click', () => {\\n            this.player.fullScreen.toggle('browser');\\n        });\\n\\n        this.player.template.webFullButton.addEventListener('click', () => {\\n            this.player.fullScreen.toggle('web');\\n        });\\n    }\\n\\n    initPipButton(): void {\\n        if (document.pictureInPictureEnabled) {\\n            this.player.template.pipButton.addEventListener('click', () => {\\n                if (!document.pictureInPictureElement) {\\n                    this.player.video.requestPictureInPicture().catch((reason) => {\\n                        console.error(reason);\\n                        this.player.notice(this.player.tran('PIP not supported'), undefined, undefined, '#FF6F6A');\\n                    });\\n                } else {\\n                    document.exitPictureInPicture();\\n                }\\n            });\\n        } else {\\n            this.player.template.pipButton.style.display = 'none';\\n        }\\n    }\\n\\n    initVolumeButton(): void {\\n        const vWidth = 35;\\n\\n        const volumeMove = (event: Event) => {\\n            const e = event as TouchEvent | MouseEvent;\\n            const percentage = (utils.getRelativeX(e, this.player.template.volumeBarWrap) - 5.5) / vWidth;\\n            this.player.volume(percentage);\\n        };\\n        const volumeUp = () => {\\n            document.removeEventListener(utils.nameMap.dragEnd, volumeUp);\\n            document.removeEventListener(utils.nameMap.dragMove, volumeMove);\\n            // fallback for Document Picture-in-Picture window\\n            this.player.container.removeEventListener(utils.nameMap.dragEnd, volumeUp);\\n            this.player.container.removeEventListener(utils.nameMap.dragMove, volumeMove);\\n            this.player.template.volumeButton.classList.remove('dplayer-volume-active');\\n        };\\n\\n        this.player.template.volumeBarWrapWrap.addEventListener('click', (event: Event) => {\\n            const e = event as TouchEvent | MouseEvent;\\n            const percentage = (utils.getRelativeX(e, this.player.template.volumeBarWrap) - 5.5) / vWidth;\\n            this.player.volume(percentage);\\n        });\\n        this.player.template.volumeBarWrapWrap.addEventListener(utils.nameMap.dragStart, () => {\\n            document.addEventListener(utils.nameMap.dragMove, volumeMove);\\n            document.addEventListener(utils.nameMap.dragEnd, volumeUp);\\n            // fallback for Document Picture-in-Picture window\\n            this.player.container.addEventListener(utils.nameMap.dragMove, volumeMove);\\n            this.player.container.addEventListener(utils.nameMap.dragEnd, volumeUp);\\n            this.player.template.volumeButton.classList.add('dplayer-volume-active');\\n        });\\n        this.player.template.volumeButtonIcon.addEventListener('click', () => {\\n            if (this.player.video.muted) {\\n                this.player.video.muted = false;\\n                this.player.switchVolumeIcon();\\n                this.player.bar.set('volume', this.player.volume(), 'width');\\n            } else {\\n                this.player.video.muted = true;\\n                this.player.template.volumeIcon.innerHTML = Icons.volumeOff;\\n                this.player.bar.set('volume', 0, 'width');\\n            }\\n        });\\n    }\\n\\n    initSyncButton(): void {\\n        if (this.player.options.live) {\\n            this.player.template.syncButton.addEventListener('click', () => {\\n                this.player.sync();\\n            });\\n        }\\n    }\\n\\n    initScreenshotButton(): void {\\n        if (this.player.options.screenshot) {\\n            this.player.template.cameraButton.addEventListener('click', () => {\\n                const canvas = document.createElement('canvas');\\n                canvas.width = this.player.video.videoWidth;\\n                canvas.height = this.player.video.videoHeight;\\n                canvas.getContext('2d')!.drawImage(this.player.video, 0, 0, canvas.width, canvas.height);\\n\\n                canvas.toBlob((blob) => {\\n                    if (blob === null) return;\\n\\n                    // generate download filename\\n                    const today = new Date();\\n                    const year = today.getFullYear();\\n                    const month = ('0' + (today.getMonth() + 1)).slice(-2);\\n                    const day = ('0' + today.getDate()).slice(-2);\\n                    const hour = ('0' + today.getHours()).slice(-2);\\n                    const min = ('0' + today.getMinutes()).slice(-2);\\n                    const sec = ('0' + today.getSeconds()).slice(-2);\\n                    const filename = `Capture_${year}${month}${day}-${hour}${min}${sec}.jpg`;\\n\\n                    // download screenshot\\n                    const bloburl = URL.createObjectURL(blob);\\n                    const link = document.createElement('a');\\n                    if (typeof link.download === 'undefined') {\\n                        this.player.notice('Error: Screenshot download is not supported.', undefined, undefined, '#FF6F6A');\\n                        return;\\n                    }\\n                    link.download = filename;\\n                    link.href = bloburl;\\n                    link.click();\\n                    URL.revokeObjectURL(bloburl);\\n\\n                    this.player.events.trigger('screenshot', blob);\\n\\n                // specify image type and quality\\n                }, 'image/jpeg', 1);\\n            });\\n        }\\n    }\\n\\n    initAirplayButton(): void {\\n        if (this.player.options.airplay) {\\n            if (window.WebKitPlaybackTargetAvailabilityEvent) {\\n                this.player.video.addEventListener(\\n                    'webkitplaybacktargetavailabilitychanged',\\n                    function(this: DPlayer, event: WebKitPlaybackTargetAvailabilityEvent) {\\n                        switch (event.availability) {\\n                            case 'available':\\n                                // @ts-ignore\\n                                this.template.airplayButton.disable = false;\\n                                break;\\n\\n                            default:\\n                                // @ts-ignore\\n                                this.template.airplayButton.disable = true;\\n                        }\\n\\n                        this.template.airplayButton.addEventListener(\\n                            'click',\\n                            function(this: DPlayer) {\\n                                this.video.webkitShowPlaybackTargetPicker();\\n                            }.bind(this),\\n                        );\\n                    }.bind(this.player),\\n                );\\n            } else {\\n                this.player.template.airplayButton.style.display = 'none';\\n            }\\n        }\\n    }\\n\\n    initSubtitleButton(): void {\\n        if (this.player.options.subtitle) {\\n            this.player.events.on('subtitle_show', () => {\\n                this.player.template.subtitleButton.ariaLabel = this.player.tran('Hide subtitle');\\n                this.player.template.subtitleButtonInner.style.opacity = '';\\n                this.player.user.set('subtitle', 1);\\n            });\\n            this.player.events.on('subtitle_hide', () => {\\n                this.player.template.subtitleButton.ariaLabel = this.player.tran('Show subtitle');\\n                this.player.template.subtitleButtonInner.style.opacity = '0.4';\\n                this.player.user.set('subtitle', 0);\\n            });\\n\\n            this.player.template.subtitleButton.addEventListener('click', () => {\\n                if (this.player.subtitle !== null) {\\n                    this.player.subtitle.toggle();\\n                }\\n            });\\n        }\\n    }\\n\\n    setAutoHide(time = 3000): void {\\n        this.show();\\n        window.clearTimeout(this.autoHideTimer);\\n        this.autoHideTimer = window.setTimeout(() => {\\n            if (this.player.video.played.length && !this.player.paused && !this.disableAutoHide) {\\n                this.hide();\\n            }\\n        }, time);\\n    }\\n\\n    show(): void {\\n        this.player.container.classList.remove('dplayer-hide-controller');\\n    }\\n\\n    hide() : void{\\n        this.player.container.classList.add('dplayer-hide-controller');\\n        this.player.setting.hide();\\n        this.player.comment && this.player.comment.hide();\\n    }\\n\\n    isShow(): boolean {\\n        return !this.player.container.classList.contains('dplayer-hide-controller');\\n    }\\n\\n    toggle(): void {\\n        if (this.isShow()) {\\n            this.hide();\\n        } else {\\n            this.show();\\n        }\\n    }\\n\\n    destroy(): void {\\n        if (!utils.isMobile) {\\n            this.player.container.removeEventListener('mousemove', this.setAutoHideHandler);\\n            this.player.container.removeEventListener('click', this.setAutoHideHandler);\\n        } else {\\n            this.player.container.removeEventListener('touchmove', this.setAutoHideHandler);\\n        }\\n        window.clearTimeout(this.autoHideTimer);\\n    }\\n}\\n\\nexport default Controller;\\n\",\"import DPlayer from './player';\\nimport utils from './utils';\\nimport * as DPlayerType from './types';\\n\\ndeclare let window: DPlayerType.WindowExtend;\\n\\nclass Setting {\\n    player: DPlayer;\\n    loop: boolean;\\n    showDanmaku: boolean;\\n    unlimitDanmaku: boolean;\\n    currentAudio: 'primary' | 'secondary' = 'primary';\\n    resizeObserver: ResizeObserver;\\n\\n    constructor(player: DPlayer) {\\n        this.player = player;\\n\\n        this.player.template.mask.addEventListener('click', () => {\\n            this.hide();\\n        });\\n        this.player.template.settingButton.addEventListener('click', () => {\\n            this.show();\\n        });\\n\\n        // clip setting box\\n        const clipSettingBox = () => {\\n            const settingOriginPanelHeight = this.player.template.settingOriginPanel.scrollHeight;\\n            this.player.template.settingBox.style.clipPath = `inset(calc(100% - ${settingOriginPanelHeight}px) 0 0 round 7px)`;\\n        };\\n        clipSettingBox();\\n        this.resizeObserver = new ResizeObserver(clipSettingBox);\\n        this.resizeObserver.observe(this.player.template.settingOriginPanel);\\n\\n        // quality\\n        if (this.player.options.video.quality) {\\n            this.player.template.quality.addEventListener('click', () => {\\n                this.player.template.settingBox.classList.add('dplayer-setting-box-quality');\\n            });\\n            this.player.template.qualityHeader.addEventListener('click', () => {\\n                this.player.template.settingBox.classList.remove('dplayer-setting-box-quality');\\n            });\\n            for (let i = 0; i < this.player.template.qualityItem.length; i++) {\\n                this.player.template.qualityItem[i].addEventListener('click', () => {\\n                    // currently switching\\n                    if (this.player.switchingQuality) {\\n                        return;\\n                    }\\n                    this.player.switchQuality(parseInt(this.player.template.qualityItem[i].dataset.index!));\\n                });\\n            }\\n        }\\n\\n        // speed\\n        this.player.template.speed.addEventListener('click', () => {\\n            this.player.template.settingBox.classList.add('dplayer-setting-box-speed');\\n        });\\n        this.player.template.speedHeader.addEventListener('click', () => {\\n            this.player.template.settingBox.classList.remove('dplayer-setting-box-speed');\\n        });\\n        for (let i = 0; i < this.player.template.speedItem.length; i++) {\\n            this.player.template.speedItem[i].addEventListener('click', (event: any) => {\\n                this.player.speed(parseFloat(event.target.dataset.speed));\\n            });\\n        }\\n\\n        // audio\\n        this.player.template.audio.addEventListener('click', () => {\\n            this.player.template.settingBox.classList.add('dplayer-setting-box-audio');\\n        });\\n        this.player.template.audioHeader.addEventListener('click', () => {\\n            this.player.template.settingBox.classList.remove('dplayer-setting-box-audio');\\n        });\\n        for (let i = 0; i < this.player.template.audioItem.length; i++) {\\n            this.player.template.audioItem[i].addEventListener('click', () => {\\n                // for mpegts\\n                if (this.player.plugins.mpegts && window.mpegts && this.player.plugins.mpegts instanceof window.mpegts.MSEPlayer) {\\n                    if (this.player.template.audioItem[i].dataset.audio === this.currentAudio) {\\n                        return;  // already on this audio\\n                    }\\n                    if (this.player.template.audioItem[i].dataset.audio === 'primary') {\\n                        // switch primary audio\\n                        this.currentAudio = 'primary';\\n                        this.player.template.audioItem[0].classList.add('dplayer-setting-audio-current');\\n                        this.player.template.audioItem[1].classList.remove('dplayer-setting-audio-current');\\n                        this.player.template.audioValue.textContent = this.player.tran('Primary audio');\\n                        this.player.plugins.mpegts.switchPrimaryAudio();\\n                    } else if (this.player.template.audioItem[i].dataset.audio === 'secondary') {\\n                        // switch secondary audio\\n                        this.currentAudio = 'secondary';\\n                        this.player.template.audioItem[0].classList.remove('dplayer-setting-audio-current');\\n                        this.player.template.audioItem[1].classList.add('dplayer-setting-audio-current');\\n                        this.player.template.audioValue.textContent = this.player.tran('Secondary audio');\\n                        this.player.plugins.mpegts.switchSecondaryAudio();\\n                    }\\n                    this.player.template.settingBox.classList.remove('dplayer-setting-box-audio');\\n                // for hls.js\\n                } else if (this.player.plugins.hls && window.Hls && this.player.plugins.hls instanceof window.Hls) {\\n                    const hls = this.player.plugins.hls;\\n                    if (hls.audioTracks.length <= 1) {\\n                        return;  // no multiple audio tracks\\n                    }\\n                    if (this.player.template.audioItem[i].dataset.audio === this.currentAudio) {\\n                        return;  // already on this audio\\n                    }\\n                    if (this.player.template.audioItem[i].dataset.audio === 'primary') {\\n                        // switch to primary audio track (index 0)\\n                        this.currentAudio = 'primary';\\n                        this.player.template.audioItem[0].classList.add('dplayer-setting-audio-current');\\n                        this.player.template.audioItem[1].classList.remove('dplayer-setting-audio-current');\\n                        this.player.template.audioValue.textContent = this.player.tran('Primary audio');\\n                        hls.audioTrack = 0;\\n                    } else if (this.player.template.audioItem[i].dataset.audio === 'secondary') {\\n                        // switch to secondary audio track (index 1)\\n                        this.currentAudio = 'secondary';\\n                        this.player.template.audioItem[0].classList.remove('dplayer-setting-audio-current');\\n                        this.player.template.audioItem[1].classList.add('dplayer-setting-audio-current');\\n                        this.player.template.audioValue.textContent = this.player.tran('Secondary audio');\\n                        hls.audioTrack = 1;\\n                    }\\n                    this.player.template.settingBox.classList.remove('dplayer-setting-box-audio');\\n                }\\n            });\\n        }\\n\\n        // loop\\n        this.loop = this.player.user.get('loop') === 1;\\n        this.player.template.loopToggle.checked = this.loop;\\n        this.player.template.loop.addEventListener('click', () => {\\n            this.player.template.loopToggle.checked = !this.player.template.loopToggle.checked;\\n            if (this.player.template.loopToggle.checked) {\\n                this.loop = true;\\n            } else {\\n                this.loop = false;\\n            }\\n            this.player.user.set('loop', this.loop ? 1 : 0);\\n        });\\n\\n        // show danmaku\\n        this.showDanmaku = this.player.user.get('danmaku') === 1;\\n        if (!this.showDanmaku) {\\n            this.player.danmaku && this.player.danmaku.hide();\\n        }\\n        this.player.template.showDanmakuToggle.checked = this.showDanmaku;\\n        this.player.template.showDanmaku.addEventListener('click', () => {\\n            this.player.template.showDanmakuToggle.checked = !this.player.template.showDanmakuToggle.checked;\\n            if (this.player.template.showDanmakuToggle.checked) {\\n                this.showDanmaku = true;\\n                if (this.player.danmaku !== null) {\\n                    this.player.danmaku.show();\\n                }\\n            } else {\\n                this.showDanmaku = false;\\n                if (this.player.danmaku !== null) {\\n                    this.player.danmaku.hide();\\n                }\\n            }\\n            this.player.user.set('danmaku', this.showDanmaku ? 1 : 0);\\n        });\\n\\n        // unlimit danmaku\\n        this.unlimitDanmaku = this.player.user.get('unlimited') === 1;\\n        this.player.template.unlimitDanmakuToggle.checked = this.unlimitDanmaku;\\n        this.player.template.unlimitDanmaku.addEventListener('click', () => {\\n            this.player.template.unlimitDanmakuToggle.checked = !this.player.template.unlimitDanmakuToggle.checked;\\n            if (this.player.template.unlimitDanmakuToggle.checked) {\\n                this.unlimitDanmaku = true;\\n                if (this.player.danmaku !== null) {\\n                    this.player.danmaku.unlimit(true);\\n                }\\n            } else {\\n                this.unlimitDanmaku = false;\\n                if (this.player.danmaku !== null) {\\n                    this.player.danmaku.unlimit(false);\\n                }\\n            }\\n            this.player.user.set('unlimited', this.unlimitDanmaku ? 1 : 0);\\n        });\\n\\n        // danmaku opacity\\n        if (this.player.danmaku) {\\n            this.player.on('danmaku_opacity', (percentage: number) => {\\n                this.player.bar.set('danmaku', percentage, 'width');\\n                this.player.user.set('opacity', percentage);\\n                this.player.template.danmakuOpacityValue.textContent = percentage.toFixed(1);\\n            });\\n            this.player.danmaku.opacity(this.player.user.get('opacity'));\\n            this.player.template.danmakuOpacityValue.textContent = this.player.user.get('opacity').toFixed(1);\\n\\n            const danmakuMove = (event: Event) => {\\n                const e = event as PointerEvent | TouchEvent | MouseEvent;\\n                const barWidth = this.player.template.danmakuOpacityBarWrap.clientWidth;\\n                let percentage = utils.getRelativeX(e, this.player.template.danmakuOpacityBarWrap) / barWidth;\\n                percentage = Math.max(percentage, 0);\\n                percentage = Math.min(percentage, 1);\\n                if (this.player.danmaku !== null) {\\n                    this.player.danmaku.opacity(percentage);\\n                }\\n            };\\n            const danmakuUp = () => {\\n                document.removeEventListener(utils.nameMap.dragEnd, danmakuUp);\\n                document.removeEventListener(utils.nameMap.dragMove, danmakuMove);\\n                // fallback for Document Picture-in-Picture window\\n                this.player.container.removeEventListener(utils.nameMap.dragEnd, danmakuUp);\\n                this.player.container.removeEventListener(utils.nameMap.dragMove, danmakuMove);\\n                this.player.template.danmakuOpacityBox.classList.remove('dplayer-setting-danmaku-active');\\n            };\\n\\n            this.player.template.danmakuOpacityBarWrapWrap.addEventListener('click', (event: Event) => {\\n                const e = event as PointerEvent | TouchEvent | MouseEvent;\\n                const barWidth = this.player.template.danmakuOpacityBarWrap.clientWidth;\\n                let percentage = utils.getRelativeX(e, this.player.template.danmakuOpacityBarWrap) / barWidth;\\n                percentage = Math.max(percentage, 0);\\n                percentage = Math.min(percentage, 1);\\n                if (this.player.danmaku !== null) {\\n                    this.player.danmaku.opacity(percentage);\\n                }\\n            });\\n            this.player.template.danmakuOpacityBarWrapWrap.addEventListener(utils.nameMap.dragStart, () => {\\n                document.addEventListener(utils.nameMap.dragMove, danmakuMove);\\n                document.addEventListener(utils.nameMap.dragEnd, danmakuUp);\\n                // fallback for Document Picture-in-Picture window\\n                this.player.container.addEventListener(utils.nameMap.dragMove, danmakuMove);\\n                this.player.container.addEventListener(utils.nameMap.dragEnd, danmakuUp);\\n                this.player.template.danmakuOpacityBox.classList.add('dplayer-setting-danmaku-active');\\n            });\\n        }\\n    }\\n\\n    hide(): void {\\n        this.player.template.container.classList.remove('dplayer-show-controller');\\n        this.player.template.settingBox.classList.remove('dplayer-setting-box-open');\\n        this.player.template.mask.classList.remove('dplayer-mask-show');\\n        window.setTimeout(() => {\\n            this.player.template.settingBox.classList.remove('dplayer-setting-box-speed');\\n            this.player.template.settingBox.classList.remove('dplayer-setting-box-audio');\\n        }, 300);\\n\\n        this.player.controller.disableAutoHide = false;\\n    }\\n\\n    show(): void {\\n        this.player.template.container.classList.add('dplayer-show-controller');\\n        this.player.template.settingBox.classList.add('dplayer-setting-box-open');\\n        this.player.template.mask.classList.add('dplayer-mask-show');\\n\\n        this.player.controller.disableAutoHide = true;\\n    }\\n\\n    destroy(): void {\\n        this.resizeObserver.disconnect();\\n    }\\n}\\n\\nexport default Setting;\\n\",\"import DPlayer from './player';\\nimport * as DPlayerType from './types';\\n\\nclass Comment {\\n    player: DPlayer;\\n\\n    constructor(player: DPlayer) {\\n        this.player = player;\\n\\n        this.player.template.mask.addEventListener('click', () => {\\n            this.hide();\\n        });\\n        this.player.template.commentButton.addEventListener('click', () => {\\n            this.show();\\n        });\\n        this.player.template.commentSettingButton.addEventListener('click', () => {\\n            this.toggleSetting();\\n        });\\n\\n        this.player.template.commentColorSettingBox.addEventListener('click', () => {\\n            const spanElem = this.player.template.commentColorSettingBox.querySelector('input:checked+span');\\n            if (spanElem) {\\n                const color = this.player.template.commentColorSettingBox.querySelector<HTMLInputElement>('input:checked')!.value;\\n                this.player.template.commentSettingFill.style.fill = color;\\n                this.player.template.commentInput.style.color = color;\\n                this.player.template.commentSendFill.style.fill = color;\\n            }\\n        });\\n\\n        this.player.template.commentInput.addEventListener('click', () => {\\n            this.hideSetting();\\n        });\\n        this.player.template.commentInput.addEventListener('keydown', (e) => {\\n            const event = e || window.event;\\n            if (event.keyCode === 13) {\\n                this.send();\\n            }\\n        });\\n\\n        this.player.template.commentSendButton.addEventListener('click', () => {\\n            this.send();\\n        });\\n    }\\n\\n    show(): void {\\n        this.player.controller.disableAutoHide = true;\\n        this.player.template.controller.classList.add('dplayer-controller-comment');\\n        this.player.template.mask.classList.add('dplayer-mask-show');\\n        this.player.container.classList.add('dplayer-show-controller');\\n        this.player.template.commentInput.focus();\\n    }\\n\\n    hide(): void {\\n        this.player.template.controller.classList.remove('dplayer-controller-comment');\\n        this.player.template.mask.classList.remove('dplayer-mask-show');\\n        this.player.container.classList.remove('dplayer-show-controller');\\n        this.player.controller.disableAutoHide = false;\\n        this.hideSetting();\\n    }\\n\\n    showSetting(): void {\\n        this.player.template.commentSettingBox.classList.add('dplayer-comment-setting-open');\\n    }\\n\\n    hideSetting(): void {\\n        this.player.template.commentSettingBox.classList.remove('dplayer-comment-setting-open');\\n    }\\n\\n    toggleSetting(): void {\\n        if (this.player.template.commentSettingBox.classList.contains('dplayer-comment-setting-open')) {\\n            this.hideSetting();\\n        } else {\\n            this.showSetting();\\n        }\\n    }\\n\\n    send(): void {\\n\\n        // remove focus from comment input form\\n        if (this.player.options.danmaku?.closeCommentFormAfterSend === true) {\\n            this.player.template.commentInput.blur();\\n        }\\n\\n        // text can't be empty\\n        if (!this.player.template.commentInput.value.replace(/^\\\\s+|\\\\s+$/g, '')) {\\n            this.player.notice(this.player.tran('Please input danmaku content'), undefined, undefined, '#FF6F6A');\\n            return;\\n        }\\n\\n        if (this.player.danmaku !== null) {\\n            this.player.danmaku.send(\\n                {\\n                    text: this.player.template.commentInput.value,\\n                    color: this.player.container.querySelector<HTMLInputElement>('.dplayer-comment-setting-color input:checked')!.value,\\n                    type: this.player.container.querySelector<HTMLInputElement>('.dplayer-comment-setting-type input:checked')!.value as DPlayerType.DanmakuType,\\n                    size: this.player.container.querySelector<HTMLInputElement>('.dplayer-comment-setting-size input:checked')!.value as DPlayerType.DanmakuSize,\\n                },\\n                () => {\\n                    if (this.player.options.danmaku?.closeCommentFormAfterSend === true) {\\n                        this.hide();\\n                        this.player.controller.setAutoHide(750);\\n                    }\\n                },\\n                true,\\n            );\\n        }\\n\\n        // prevent double send\\n        this.player.template.commentInput.value = '';\\n    }\\n}\\n\\nexport default Comment;\\n\",\"import DPlayer from './player';\\n\\nclass HotKey {\\n    player: DPlayer;\\n    doHotKeyHandler: (e: KeyboardEvent) => void;\\n    cancelFullScreenHandler: (e: KeyboardEvent) => void;\\n\\n    constructor(player: DPlayer) {\\n        this.player = player;\\n        this.doHotKeyHandler = this.doHotKey.bind(this);\\n        this.cancelFullScreenHandler = this.cancelFullScreen.bind(this);\\n        if (this.player.options.hotkey) {\\n            document.addEventListener('keydown', this.doHotKeyHandler);\\n        }\\n        document.addEventListener('keydown', this.cancelFullScreenHandler);\\n    }\\n\\n    doHotKey(e: KeyboardEvent): void {\\n        const tag = document.activeElement?.tagName.toUpperCase();\\n        const editable = document.activeElement?.getAttribute('contenteditable');\\n        if (tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') {\\n            const event = e || window.event;\\n            let percentage;\\n            switch (event.keyCode) {\\n                case 32:\\n                    if (this.player.focus || this.player.options.hotkey) {\\n                        event.preventDefault();\\n                        this.player.toggle();\\n                    }\\n                    break;\\n                case 37:\\n                    if (this.player.focus || this.player.options.hotkey) {\\n                        event.preventDefault();\\n                        if (event.altKey) {\\n                            this.player.seek(this.player.video.currentTime - 60);\\n                        } else if (event.shiftKey) {\\n                            this.player.seek(this.player.video.currentTime - 30);\\n                        } else if (event.ctrlKey || event.metaKey) {\\n                            this.player.seek(this.player.video.currentTime - 15);\\n                        } else {\\n                            this.player.seek(this.player.video.currentTime - 5);\\n                        }\\n                        this.player.controller.setAutoHide();\\n                    }\\n                    break;\\n                case 39:\\n                    if (this.player.focus || this.player.options.hotkey) {\\n                        event.preventDefault();\\n                        if (event.altKey) {\\n                            this.player.seek(this.player.video.currentTime + 60);\\n                        } else if (event.shiftKey) {\\n                            this.player.seek(this.player.video.currentTime + 30);\\n                        } else if (event.ctrlKey || event.metaKey) {\\n                            this.player.seek(this.player.video.currentTime + 15);\\n                        } else {\\n                            this.player.seek(this.player.video.currentTime + 5);\\n                        }\\n                        this.player.controller.setAutoHide();\\n                    }\\n                    break;\\n                case 38:\\n                    if (this.player.focus) {\\n                        event.preventDefault();\\n                        percentage = this.player.volume() + 0.1;\\n                        this.player.volume(percentage);\\n                    }\\n                    break;\\n                case 40:\\n                    if (this.player.focus) {\\n                        event.preventDefault();\\n                        percentage = this.player.volume() - 0.1;\\n                        this.player.volume(percentage);\\n                    }\\n                    break;\\n                case 70: // F\\n                    if (!event.ctrlKey && !event.metaKey) {\\n                        event.preventDefault();\\n                        this.player.fullScreen.toggle('browser');\\n                    }\\n                    break;\\n                case 87: // W\\n                    if (!event.ctrlKey && !event.metaKey) {\\n                        event.preventDefault();\\n                        this.player.fullScreen.toggle('web');\\n                    }\\n                    break;\\n                case 76: // L\\n                    if (this.player.options.live) {\\n                        event.preventDefault();\\n                        this.player.sync();\\n                    }\\n                    break;\\n                case 80: // P\\n                    if (this.player.options.pictureInPicture) {\\n                        if (document.pictureInPictureEnabled) {\\n                            event.preventDefault();\\n                            this.player.template.pipButton.click();\\n                        }\\n                    }\\n                    break;\\n                case 67: // C\\n                    if (typeof this.player.options.danmaku === 'object' && this.player.options.danmaku) {\\n                        if (!event.ctrlKey && !event.metaKey) {\\n                            event.preventDefault();\\n                            this.player.controller.show();\\n                            if (this.player.comment != null) {\\n                                this.player.comment.show();\\n                            }\\n                        }\\n                    }\\n                    break;\\n                case 68: // D\\n                    if (typeof this.player.options.danmaku === 'object' && this.player.options.danmaku) {\\n                        if (!event.ctrlKey && !event.metaKey) {\\n                            event.preventDefault();\\n                            this.player.template.showDanmaku.click();\\n                            if (this.player.template.showDanmakuToggle.checked) {\\n                                this.player.notice(`${this.player.tran('Show comment')}`);\\n                            } else {\\n                                this.player.notice(`${this.player.tran('Hide comment')}`);\\n                            }\\n                        }\\n                    }\\n                    break;\\n                case 83: // S\\n                    if (this.player.options.subtitle) {\\n                        if (!event.ctrlKey && !event.metaKey) {\\n                            event.preventDefault();\\n                            if (this.player.subtitle !== null) {\\n                                if (this.player.subtitle.container.classList.contains('dplayer-subtitle-hide')) {\\n                                    this.player.notice(`${this.player.tran('Show subtitle')}`);\\n                                } else {\\n                                    this.player.notice(`${this.player.tran('Hide subtitle')}`);\\n                                }\\n                                this.player.subtitle.toggle();\\n                            }\\n                        }\\n                    }\\n                    break;\\n            }\\n        }\\n    }\\n\\n    cancelFullScreen(e: KeyboardEvent): void {\\n        const event = e || window.event;\\n        switch (event.keyCode) {\\n            case 27:\\n                if (this.player.fullScreen.isFullScreen('web')) {\\n                    this.player.fullScreen.cancel('web');\\n                }\\n                break;\\n        }\\n    }\\n\\n    destroy(): void {\\n        if (this.player.options.hotkey) {\\n            document.removeEventListener('keydown', this.doHotKeyHandler);\\n        }\\n        document.removeEventListener('keydown', this.cancelFullScreenHandler);\\n    }\\n}\\n\\nexport default HotKey;\\n\",\"import DPlayer from './player';\\n\\nclass ContextMenu {\\n    contextmenuHandler: (e: MouseEvent) => void;\\n    player: DPlayer;\\n    shown: boolean;\\n\\n    constructor(player: DPlayer) {\\n        this.player = player;\\n        this.shown = false;\\n\\n        Array.prototype.slice.call(this.player.template.menuItem).forEach((item, index) => {\\n            if (this.player.options.contextmenu[index].click) {\\n                item.addEventListener('click', () => {\\n                    const contextmenu = this.player.options.contextmenu[index];\\n                    if (contextmenu.click) contextmenu.click(this.player);\\n                    this.hide();\\n                });\\n            }\\n        });\\n\\n        this.contextmenuHandler = (e: MouseEvent) => {\\n            const event = e || window.event;\\n            event.preventDefault();\\n\\n            if (this.shown) {\\n                this.hide();\\n                return;\\n            }\\n\\n            const clientRect = this.player.container.getBoundingClientRect();\\n            this.show(event.clientX - clientRect.left, event.clientY - clientRect.top);\\n\\n            this.player.template.mask.addEventListener('click', () => {\\n                this.hide();\\n            });\\n        };\\n        this.player.container.addEventListener('contextmenu', this.contextmenuHandler);\\n    }\\n\\n    show(x: number, y: number): void {\\n        this.player.template.menu.classList.add('dplayer-menu-show');\\n\\n        const clientRect = this.player.container.getBoundingClientRect();\\n        if (x + this.player.template.menu.offsetWidth >= clientRect.width) {\\n            this.player.template.menu.style.right = clientRect.width - x + 'px';\\n            this.player.template.menu.style.left = 'initial';\\n        } else {\\n            this.player.template.menu.style.left = x + 'px';\\n            this.player.template.menu.style.right = 'initial';\\n        }\\n        if (y + this.player.template.menu.offsetHeight >= clientRect.height) {\\n            this.player.template.menu.style.bottom = clientRect.height - y + 'px';\\n            this.player.template.menu.style.top = 'initial';\\n        } else {\\n            this.player.template.menu.style.top = y + 'px';\\n            this.player.template.menu.style.bottom = 'initial';\\n        }\\n\\n        this.player.template.mask.classList.add('dplayer-mask-show');\\n\\n        this.shown = true;\\n        this.player.events.trigger('contextmenu_show');\\n    }\\n\\n    hide(): void {\\n        this.player.template.mask.classList.remove('dplayer-mask-show');\\n        this.player.template.menu.classList.remove('dplayer-menu-show');\\n\\n        this.shown = false;\\n        this.player.events.trigger('contextmenu_hide');\\n    }\\n\\n    destroy(): void {\\n        this.player.container.removeEventListener('contextmenu', this.contextmenuHandler);\\n    }\\n}\\n\\nexport default ContextMenu;\\n\",\"/* global DPLAYER_VERSION GIT_HASH */\\nimport DPlayer from './player';\\nimport Template from './template';\\nimport Mpegts from 'mpegts.js';\\nimport FlvJs from 'flv.js';\\n\\nclass InfoPanel {\\n    player: DPlayer;\\n    container: HTMLElement;\\n    template: Template;\\n    video: HTMLVideoElement;\\n    beginTime = 0;\\n\\n    constructor(player: DPlayer) {\\n        this.player = player;\\n        this.container = player.template.infoPanel;\\n        this.template = player.template;\\n        this.video = player.video;\\n\\n        this.template.infoPanelClose.addEventListener('click', () => {\\n            this.hide();\\n        });\\n    }\\n\\n    show(): void {\\n        this.beginTime = Date.now();\\n        this.update();\\n        this.player.timer.enable('info');\\n        this.player.timer.enable('fps');\\n        this.container.classList.remove('dplayer-info-panel-hide');\\n    }\\n\\n    hide(): void {\\n        this.player.timer.disable('info');\\n        this.player.timer.disable('fps');\\n        this.container.classList.add('dplayer-info-panel-hide');\\n    }\\n\\n    toggle(): void {\\n        if (this.container.classList.contains('dplayer-info-panel-hide')) {\\n            this.show();\\n        } else {\\n            this.hide();\\n        }\\n    }\\n\\n    update(): void {\\n        // @ts-ignore\\n        this.template.infoVersion.textContent = `v${DPLAYER_VERSION} ${GIT_HASH}`;\\n        this.template.infoType.textContent = this.player.type;\\n        this.template.infoUrl.textContent = this.player.options.video.url ?? 'N/A';\\n        this.template.infoResolution.textContent = `${this.player.video.videoWidth} x ${this.player.video.videoHeight}`;\\n        this.template.infoDuration.textContent = `${this.player.video.duration}`;\\n\\n        // Dropped Frames\\n        if (this.player.video['getVideoPlaybackQuality'] != undefined) {\\n            const quality = this.player.video.getVideoPlaybackQuality();\\n            this.template.infoDroppedFrames.textContent = `${quality.droppedVideoFrames} / ${quality.totalVideoFrames}`;\\n        } else if ((this.player.video as any)['webkitDecodedFrameCount'] != undefined) {\\n            const decoded: number = (this.player.video as any)['webkitDecodedFrameCount'];\\n            const dropped: number = (this.player.video as any)['webkitDroppedFrameCount'];\\n            this.template.infoDroppedFrames.textContent = `${dropped} / ${decoded}`;\\n        } else {\\n            this.template.infoDroppedFrames.textContent = `N/A`;\\n        }\\n\\n        // Buffer Remain\\n        if (this.player.video.buffered.length > 0) {\\n            const bufferedRangeCount = this.player.video.buffered.length;\\n            const bufferRemain = this.player.video.buffered.end(bufferedRangeCount - 1) - this.player.video.currentTime;\\n            this.template.infoBufferRemain.textContent = `${bufferRemain.toFixed(3)} s`;\\n        } else {\\n            this.template.infoBufferRemain.textContent = 'N/A';\\n        }\\n\\n        // flv.js / mpegts.js related metrics\\n        if (this.player.type === 'mpegts' || this.player.type === 'flv') {\\n            const player: Mpegts.Player | Mpegts.MSEPlayer | Mpegts.NativePlayer | FlvJs.Player | undefined =\\n                this.player.plugins.mpegts || this.player.plugins.flvjs;\\n            if (player) {\\n                const mediaInfo = player.mediaInfo as Mpegts.MSEPlayerMediaInfo;\\n                const statisticsInfo = player.statisticsInfo as Mpegts.MSEPlayerStatisticsInfo;\\n                this.template.infoMimeType.textContent = mediaInfo.mimeType ?? 'N/A';\\n                this.template.infoVideoFPS.textContent = `${mediaInfo.fps?.toFixed(3) ?? 'N/A'}`;\\n                if (statisticsInfo.speed != undefined) {\\n                    this.template.infoDownloadSpeed.textContent = `${statisticsInfo.speed.toFixed(3)} KB/s`;\\n                } else {\\n                    this.template.infoDownloadSpeed.textContent = 'N/A';\\n                }\\n            }\\n        } else {\\n            this.template.infoMimeType.textContent = 'N/A';\\n            this.template.infoVideoFPS.textContent = 'N/A';\\n            this.template.infoDownloadSpeed.textContent = 'N/A';\\n        }\\n    }\\n\\n    fps(value: number): void {\\n        this.template.infoPageFPS.textContent = `${value.toFixed(1)}`;\\n    }\\n}\\n\\nexport default InfoPanel;\\n\",\"import * as aribb24js from 'aribb24.js';\\n\\nimport utils from './utils';\\nimport handleOption from './options';\\nimport i18n from './i18n';\\nimport Template from './template';\\nimport Icons from './icons';\\nimport Danmaku from './danmaku';\\nimport Events from './events';\\nimport FullScreen from './fullscreen';\\nimport User from './user';\\nimport Subtitle from './subtitle';\\nimport Bar from './bar';\\nimport Timer from './timer';\\nimport Bezel from './bezel';\\nimport Controller from './controller';\\nimport Setting from './setting';\\nimport Comment from './comment';\\nimport HotKey from './hotkey';\\nimport ContextMenu from './contextmenu';\\nimport InfoPanel from './info-panel';\\nimport tplVideo from '../template/video.art';\\nimport defaultApiBackend from './api';\\nimport * as DPlayerType from './types';\\n\\nlet index = 0;\\nconst instances: DPlayer[] = [];\\n\\ndeclare let window: DPlayerType.WindowExtend;\\n\\nclass DPlayer {\\n    bar: Bar;\\n    bezel: Bezel;\\n    comment: Comment | null = null;\\n    contextmenu: ContextMenu;\\n    controller: Controller;\\n    danmaku: Danmaku | null = null;\\n    events: Events;\\n    fullScreen: FullScreen;\\n    hotkey: HotKey;\\n    infoPanel: InfoPanel;\\n    setting: Setting;\\n    subtitle: Subtitle | null = null;\\n    template: Template;\\n    timer: Timer;\\n    user: User;\\n\\n    container: HTMLElement;\\n    containerClickFun: () => void;\\n    docClickFun: () => void;\\n    focus = false;\\n    narrow = false;\\n    noticeTime: number | null = null;\\n    options: DPlayerType.OptionsInternal;\\n    paused = false;\\n    plugins: DPlayerType.Plugins;\\n    prevVideoCurrentTime = 0;\\n    prevVideo: HTMLVideoElement | null = null;\\n    quality: DPlayerType.VideoQualityInternal | null = null;\\n    qualityIndex: number | null = null;\\n    switchingQuality = false;\\n    resizeObserver: ResizeObserver;\\n    tran: (text: string, ...arg: Array<string | number>) => string;\\n    type: DPlayerType.VideoType | string = 'auto';\\n    video: HTMLVideoElement;\\n\\n    /**\\n     * DPlayer constructor function\\n     *\\n     * @param {Object} options - See README\\n     * @constructor\\n     */\\n    constructor(options: DPlayerType.Options) {\\n        this.options = handleOption({ preload: options.video.type === 'webtorrent' ? 'none' : 'metadata', ...options });\\n\\n        if (this.options.video.quality) {\\n            this.qualityIndex = this.options.video.defaultQuality!;\\n            this.quality = this.options.video.quality[this.options.video.defaultQuality!];\\n        }\\n        // @ts-expect-error TS(7009): 'new' expression, whose target lacks a construct s... Remove this comment to see the full error message\\n        this.tran = new i18n(this.options.lang).tran;\\n        this.events = new Events();\\n        this.user = new User(this);\\n        this.container = this.options.container;\\n\\n        this.container.classList.add('dplayer');\\n        if (this.options.live) {\\n            this.container.classList.add('dplayer-live');\\n        } else {\\n            this.container.classList.remove('dplayer-live');\\n        }\\n        if (utils.isMobile) {\\n            this.container.classList.add('dplayer-mobile');\\n        }\\n        this.narrow = this.container.offsetWidth <= 500;\\n        if (this.narrow) {\\n            this.container.classList.add('dplayer-narrow');\\n        }\\n\\n        // observe container resize\\n        this.resizeObserver = new ResizeObserver((entries) => {\\n            for (const entry of entries) {\\n                if (entry.target === this.container) {\\n                    this.narrow = this.container.offsetWidth <= 500;\\n                    if (this.narrow) {\\n                        this.container.classList.add('dplayer-narrow');\\n                    } else {\\n                        this.container.classList.remove('dplayer-narrow');\\n                    }\\n                }\\n            }\\n            this.resize();\\n        });\\n        this.resizeObserver.observe(this.container);\\n\\n        this.template = new Template({\\n            container: this.container,\\n            options: this.options,\\n            index: index,\\n            tran: this.tran,\\n        });\\n\\n        this.video = this.template.video;\\n\\n        this.bar = new Bar(this.template);\\n\\n        this.bezel = new Bezel(this.template.bezel);\\n\\n        this.fullScreen = new FullScreen(this);\\n\\n        this.controller = new Controller(this);\\n\\n        this.initDanmaku(this.options.danmaku, this.options.apiBackend);\\n\\n        this.plugins = {};\\n        this.docClickFun = () => {\\n            this.focus = false;\\n        };\\n        this.containerClickFun = () => {\\n            this.focus = true;\\n        };\\n        document.addEventListener('click', this.docClickFun, true);\\n        this.container.addEventListener('click', this.containerClickFun, true);\\n\\n        this.paused = true;\\n\\n        this.timer = new Timer(this);\\n\\n        this.hotkey = new HotKey(this);\\n\\n        this.contextmenu = new ContextMenu(this);\\n\\n        this.initVideo(this.video, (this.quality && this.quality.type) || this.options.video.type);\\n\\n        this.setting = new Setting(this);\\n\\n        this.infoPanel = new InfoPanel(this);\\n\\n        if (!this.danmaku && this.options.autoplay) {\\n            this.play();\\n        }\\n\\n        index++;\\n        instances.push(this);\\n    }\\n\\n    /**\\n     * Seek video\\n     */\\n    seek(time: number, hideNotice = false): void {\\n        time = Math.max(time, 0);\\n        const duration = utils.getVideoDuration(this.video, this.template);\\n        if (duration) {\\n            time = Math.min(time, duration);\\n        }\\n        if (!hideNotice) {\\n            if (this.video.currentTime < time) {\\n\\n                this.notice(this.tran('FF progress', (time - this.video.currentTime).toFixed(0)));\\n            } else if (this.video.currentTime > time) {\\n                this.notice(this.tran('REW progress', (this.video.currentTime - time).toFixed(0)));\\n            }\\n        }\\n\\n        if (isFinite(time)) {  // ignore NaN, Infinity, -Infinity\\n            this.video.currentTime = time;\\n        }\\n\\n        if (this.danmaku) {\\n            this.danmaku.seek();\\n        }\\n\\n        this.bar.set('played', time / duration, 'width');\\n        this.template.ptime.textContent = utils.secondToTime(time);\\n    }\\n\\n    /**\\n     * Sync video (live only)\\n     */\\n    sync(quiet = false): void {\\n        if (this.options.live) {\\n            const time = utils.getVideoDuration(this.video, this.template) - this.options.liveSyncMinBufferSize;\\n            try {\\n                this.video.currentTime = time;\\n            } catch (error) {\\n                // seek failed\\n                return;\\n            }\\n\\n            if (this.danmaku) {\\n                this.danmaku.seek();\\n            }\\n\\n            this.template.ptime.textContent = utils.secondToTime(time);\\n            if (!quiet) {\\n                this.notice(this.tran('Synchronized'));\\n            }\\n        }\\n    }\\n\\n    /**\\n     * Play video\\n     */\\n    play(fromNative = false): void {\\n        this.paused = false;\\n        if (this.video.paused && !utils.isMobile) {\\n            this.bezel.switch(Icons.play);\\n        }\\n\\n        this.template.playIcon.innerHTML = Icons.pause;\\n        this.template.mobilePlayButton.innerHTML = Icons.pause;\\n\\n        // if live, sync video in advance\\n        if (this.options.live && this.options.syncWhenPlayingLive) {\\n            this.sync(true);\\n        }\\n\\n        if (!fromNative) {\\n            const playFunc = (this.type === 'mpegts' && this.plugins.mpegts && this.plugins.mpegts.play.bind(this.plugins.mpegts)) || this.video.play.bind(this.video);\\n            const playedPromise = Promise.resolve(playFunc());\\n            playedPromise\\n                .catch(() => {\\n                    this.pause();\\n                })\\n                .then(() => {\\n                    // pass\\n                });\\n        }\\n        this.timer.enable('loading');\\n        this.container.classList.remove('dplayer-paused');\\n        this.container.classList.add('dplayer-playing');\\n        if (this.danmaku) {\\n            this.danmaku.play();\\n        }\\n        if (this.options.mutex) {\\n            for (let i = 0; i < instances.length; i++) {\\n                if (this !== instances[i]) {\\n                    instances[i].pause();\\n                }\\n            }\\n        }\\n    }\\n\\n    /**\\n     * Pause video\\n     */\\n    pause(fromNative = false): void {\\n        this.paused = true;\\n        this.container.classList.remove('dplayer-loading');\\n\\n        if (!this.video.paused && !utils.isMobile) {\\n            this.bezel.switch(Icons.pause);\\n        }\\n\\n        this.template.playIcon.innerHTML = Icons.play;\\n        this.template.mobilePlayButton.innerHTML = Icons.play;\\n        if (!fromNative) {\\n            this.video.pause();\\n        }\\n        this.timer.disable('loading');\\n        this.container.classList.remove('dplayer-playing');\\n        this.container.classList.add('dplayer-paused');\\n        if (this.danmaku) {\\n            this.danmaku.pause();\\n        }\\n    }\\n\\n    switchVolumeIcon(): void {\\n        if (this.volume() >= 0.95) {\\n            this.template.volumeIcon.innerHTML = Icons.volumeUp;\\n        } else if (this.volume() > 0) {\\n            this.template.volumeIcon.innerHTML = Icons.volumeDown;\\n        } else {\\n            this.template.volumeIcon.innerHTML = Icons.volumeOff;\\n        }\\n    }\\n\\n    /**\\n     * Set volume\\n     */\\n    volume(percentage: number | string = NaN, nostorage = false, nonotice = false): number {\\n        if (typeof percentage === 'string') {\\n            percentage = parseFloat(percentage);\\n        }\\n        if (!isNaN(percentage)) {\\n            percentage = Math.max(percentage, 0);\\n            percentage = Math.min(percentage, 1);\\n            this.bar.set('volume', percentage, 'width');\\n            const formatPercentage = `${(percentage * 100).toFixed(0)}%`;\\n            this.template.volumeBarWrapWrap.ariaLabel = formatPercentage;\\n            if (!nostorage) {\\n                this.user.set('volume', percentage);\\n            }\\n            if (!nonotice) {\\n                this.notice(`${this.tran('Volume')} ${(percentage * 100).toFixed(0)}%`);\\n            }\\n\\n            this.video.volume = percentage;\\n            if (this.video.muted) {\\n                this.video.muted = false;\\n            }\\n            this.switchVolumeIcon();\\n        }\\n\\n        return this.video.volume;\\n    }\\n\\n    /**\\n     * Set volume muted\\n     */\\n    muted(muted?: boolean): boolean {\\n        if (typeof muted === 'boolean') {\\n            if (muted) {\\n                this.video.muted = true;\\n                this.template.volumeIcon.innerHTML = Icons.volumeOff;\\n                this.bar.set('volume', 0, 'width');\\n            } else {\\n                this.video.muted = false;\\n                this.switchVolumeIcon();\\n                this.bar.set('volume', this.volume(), 'width');\\n            }\\n        }\\n\\n        return this.video.muted;\\n    }\\n\\n    /**\\n     * Toggle between play and pause\\n     */\\n    toggle(): void {\\n        if (this.video.paused) {\\n            this.play();\\n        } else {\\n            this.pause();\\n        }\\n    }\\n\\n    /**\\n     * Attach event\\n     */\\n    on(name: DPlayerType.Events, callback: (info?: Event | any) => void, once = false): void {\\n        this.events.on(name, callback, once);\\n    }\\n\\n    /**\\n     * Detach event\\n     */\\n    off(name: DPlayerType.Events, callback: (info?: Event | any) => void): void {\\n        this.events.off(name, callback);\\n    }\\n\\n    /**\\n     * Switch to a new video\\n     *\\n     * @param {Object} video - new video info\\n     * @param {Object | boolean} danmakuAPI - new danmaku info\\n     * @param {Boolean} remember - whether to remember the current video time and speed\\n     */\\n    switchVideo(\\n        video: { url: string; type?: DPlayerType.VideoType | string; pic?: string; },\\n        danmakuAPI?: DPlayerType.Danmaku | boolean,\\n        remember = false,\\n        apiBackend: DPlayerType.APIBackend = defaultApiBackend,\\n    ): void {\\n        this.pause();\\n        const seek = this.video.currentTime;\\n        const speed = this.video.playbackRate;\\n        this.video.poster = video.pic ? video.pic : '';\\n        this.video.src = video.url;\\n        this.initMSE(this.video, video.type || 'auto');\\n        if (danmakuAPI) {\\n            if (this.danmaku) {\\n                if (!remember) {\\n                    this.bar.set('played', 0, 'width');\\n                    this.bar.set('loaded', 0, 'width');\\n                    this.template.ptime.textContent = '00:00';\\n                }\\n                this.template.danmaku.innerHTML = '';\\n                this.danmaku.options.apiBackend = apiBackend;\\n                if (typeof danmakuAPI === 'object') {\\n                    this.danmaku.reload({\\n                        id: danmakuAPI.id,\\n                        address: danmakuAPI.api,\\n                        token: danmakuAPI.token,\\n                        maximum: danmakuAPI.maximum,\\n                        addition: danmakuAPI.addition,\\n                        user: danmakuAPI.user,\\n                    });\\n                } else {\\n                    this.danmaku.reload({});\\n                }\\n            } else {\\n                this.initDanmaku(danmakuAPI as DPlayerType.Danmaku, apiBackend);\\n            }\\n        }\\n\\n         if (remember && !this.options.live) {\\n            if (seek !== 0) this.seek(seek);\\n            if (speed !== 1.0) this.speed(speed);\\n        }\\n    }\\n\\n    initDanmaku(danmakuAPI?: DPlayerType.Danmaku | boolean, apiBackend: DPlayerType.APIBackend = defaultApiBackend): void {\\n        if (!danmakuAPI) {\\n            this.container.classList.add('dplayer-no-danmaku');\\n            return;\\n        }\\n        this.container.classList.remove('dplayer-no-danmaku');\\n\\n        this.template.danmakuLoading.style.display = 'block';\\n        this.danmaku = new Danmaku({\\n            player: this,\\n            container: this.template.danmaku,\\n            opacity: this.user.get('opacity'),\\n            callback: () => {\\n                setTimeout(() => {\\n                    this.template.danmakuLoading.style.display = 'none';\\n\\n                    // autoplay\\n                    if (this.options.autoplay) {\\n                        this.play();\\n                    }\\n                }, 0);\\n            },\\n            error: (msg: string) => {\\n                this.notice(msg, undefined, undefined, '#FF6F6A');\\n            },\\n            apiBackend: apiBackend,\\n            borderColor: this.options.theme,\\n            fontSize: typeof danmakuAPI === 'boolean' ? 24 : danmakuAPI.fontSize || 24,\\n            time: () => this.video.currentTime,\\n            unlimited: this.user.get('unlimited'),\\n            speedRate: typeof danmakuAPI === 'boolean' ? 1 : danmakuAPI.speedRate || 1,\\n            api: typeof danmakuAPI === 'boolean' ? {} : {\\n                id: danmakuAPI.id,\\n                address: danmakuAPI.api,\\n                token: danmakuAPI.token,\\n                maximum: danmakuAPI.maximum,\\n                addition: danmakuAPI.addition,\\n                user: danmakuAPI.user,\\n            },\\n            events: this.events,\\n            tran: (msg: string) => this.tran(msg),\\n        });\\n\\n        this.comment = new Comment(this);\\n    }\\n\\n    initMSE(video: HTMLVideoElement, type: DPlayerType.VideoType | string): void {\\n        this.type = type;\\n        if (this.options.video.customType && this.options.video.customType[type]) {\\n            if (Object.prototype.toString.call(this.options.video.customType[type]) === '[object Function]') {\\n                this.options.video.customType[type](this.video, this);\\n            } else {\\n                console.error(`Illegal customType: ${type}`);\\n            }\\n        } else {\\n            if (this.type === 'auto') {\\n                if (/m3u8(#|\\\\?|$)/i.exec(video.src)) {\\n                    this.type = 'hls';\\n                } else if (/.ts(#|\\\\?|$)/i.exec(video.src)) {\\n                    this.type = 'mpegts';\\n                } else if (/.flv(#|\\\\?|$)/i.exec(video.src)) {\\n                    this.type = 'flv';\\n                } else if (/.mpd(#|\\\\?|$)/i.exec(video.src)) {\\n                    this.type = 'dash';\\n                } else {\\n                    this.type = 'normal';\\n                }\\n            }\\n            if (!(this.type === 'mpegts')) {\\n                // audio switching is enabled only when using mpegts.js\\n                this.container.classList.add('dplayer-no-audio-switching');\\n            }\\n\\n            switch (this.type) {\\n                // https://github.com/video-dev/hls.js\\n                case 'hls':\\n                    if (window.Hls) {\\n                        if (window.Hls.isSupported()) {\\n                            // if it has already been initialized, destroy it once\\n                            if (this.plugins.hls) {\\n                                // destroy aribb24 caption\\n                                if (this.plugins.aribb24Caption) {\\n                                    this.plugins.aribb24Caption.dispose();\\n                                    delete this.plugins.aribb24Caption;\\n                                }\\n                                // destroy aribb24 superimpose\\n                                if (this.plugins.aribb24Superimpose) {\\n                                    this.plugins.aribb24Superimpose.dispose();\\n                                    delete this.plugins.aribb24Superimpose;\\n                                }\\n                                this.plugins.hls.destroy();\\n                                delete this.plugins.hls;\\n                            }\\n\\n                            // initialize hls.js\\n                            const hlsOptions = this.options.pluginOptions.hls;\\n                            const hls = new window.Hls(hlsOptions);\\n                            this.plugins.hls = hls;\\n                            hls.loadSource(video.src);\\n                            hls.attachMedia(video);\\n\\n                            // Listen for audio tracks updates\\n                            hls.on(window.Hls.Events.AUDIO_TRACKS_UPDATED, () => {\\n                                if (hls.audioTracks.length >= 2) {\\n                                    // Remove no-audio-switching class if multiple audio tracks are available\\n                                    this.container.classList.remove('dplayer-no-audio-switching');\\n                                } else {\\n                                    this.container.classList.add('dplayer-no-audio-switching');\\n                                }\\n                            });\\n\\n                            // processing when destroy\\n                            this.events.on('destroy', () => {\\n                                // destroy aribb24 caption\\n                                if (this.plugins.aribb24Caption) {\\n                                    this.plugins.aribb24Caption.dispose();\\n                                    delete this.plugins.aribb24Caption;\\n                                }\\n                                // destroy aribb24 superimpose\\n                                if (this.plugins.aribb24Superimpose) {\\n                                    this.plugins.aribb24Superimpose.dispose();\\n                                    delete this.plugins.aribb24Superimpose;\\n                                }\\n                                hls.destroy();\\n                                delete this.plugins.hls;\\n                            });\\n\\n                            // initialize aribb24.js\\n                            // https://github.com/monyone/aribb24.js\\n                            if (this.options.subtitle && this.options.subtitle.type === 'aribb24') {\\n                                // set options\\n                                if (this.options.pluginOptions.aribb24 === undefined) {\\n                                    this.options.pluginOptions.aribb24 = {};\\n                                }\\n                                this.options.pluginOptions.aribb24.enableAutoInBandMetadataTextTrackDetection = false; // for hls.js\\n                                const aribb24Options = this.options.pluginOptions.aribb24;\\n\\n                                // initialize aribb24 caption\\n                                const aribb24Caption = this.plugins.aribb24Caption = new aribb24js.CanvasRenderer(\\n                                    {...aribb24Options, data_identifier: 0x80},\\n                                );\\n                                aribb24Caption.attachMedia(video);\\n                                aribb24Caption.show();\\n\\n                                // initialize aribb24 superimpose\\n                                if (this.options.pluginOptions.aribb24.disableSuperimposeRenderer !== true) {\\n                                    const aribb24Superimpose = this.plugins.aribb24Superimpose = new aribb24js.CanvasRenderer(\\n                                        {...aribb24Options, data_identifier: 0x81},\\n                                    );\\n                                    aribb24Superimpose.attachMedia(video);\\n                                    aribb24Superimpose.show();\\n                                }\\n\\n                                // push caption data into CanvasRenderer\\n                                hls.on(window.Hls.Events.FRAG_PARSING_METADATA, (event, data) => {\\n                                    for (const sample of data.samples) {\\n                                        if (this.plugins.aribb24Caption) {\\n                                            this.plugins.aribb24Caption.pushID3v2Data(sample.pts, sample.data);\\n                                        }\\n                                        if (this.plugins.aribb24Superimpose) {\\n                                            this.plugins.aribb24Superimpose.pushID3v2Data(sample.pts, sample.data);\\n                                        }\\n                                    }\\n                                });\\n                            }\\n                        } else if (video.canPlayType('application/x-mpegURL') || video.canPlayType('application/vnd.apple.mpegURL')) {\\n                            // normal playback\\n                            // if it has already been initialized, destroy it once\\n                            if (this.plugins.aribb24Caption) {\\n                                this.plugins.aribb24Caption.dispose();\\n                                delete this.plugins.aribb24Caption;\\n                            }\\n                            if (this.plugins.aribb24Superimpose) {\\n                                this.plugins.aribb24Superimpose.dispose();\\n                                delete this.plugins.aribb24Superimpose;\\n                            }\\n\\n                            // processing when destroy\\n                            this.events.on('destroy', () => {\\n                                // destroy aribb24 caption\\n                                if (this.plugins.aribb24Caption) {\\n                                    this.plugins.aribb24Caption.dispose();\\n                                    delete this.plugins.aribb24Caption;\\n                                }\\n                                // destroy aribb24 superimpose\\n                                if (this.plugins.aribb24Superimpose) {\\n                                    this.plugins.aribb24Superimpose.dispose();\\n                                    delete this.plugins.aribb24Superimpose;\\n                                }\\n                            });\\n\\n                            // initialize aribb24.js\\n                            // https://github.com/monyone/aribb24.js\\n                            if (this.options.subtitle && this.options.subtitle.type === 'aribb24') {\\n                                // set options\\n                                if (this.options.pluginOptions.aribb24 === undefined) {\\n                                    this.options.pluginOptions.aribb24 = {};\\n                                }\\n                                this.options.pluginOptions.aribb24.enableAutoInBandMetadataTextTrackDetection = true; // for Safari native HLS player\\n                                const aribb24Options = this.options.pluginOptions.aribb24;\\n\\n                                // initialize aribb24 caption\\n                                const aribb24Caption = this.plugins.aribb24Caption = new aribb24js.CanvasRenderer(\\n                                    {...aribb24Options, data_identifier: 0x80},\\n                                );\\n                                aribb24Caption.attachMedia(video);\\n                                aribb24Caption.show();\\n\\n                                // initialize aribb24 superimpose\\n                                if (this.options.pluginOptions.aribb24.disableSuperimposeRenderer !== true) {\\n                                    const aribb24Superimpose = this.plugins.aribb24Superimpose = new aribb24js.CanvasRenderer(\\n                                        {...aribb24Options, data_identifier: 0x81},\\n                                    );\\n                                    aribb24Superimpose.attachMedia(video);\\n                                    aribb24Superimpose.show();\\n                                }\\n                            }\\n                        } else {\\n                            this.notice('Error: HLS is not supported.', undefined, undefined, '#FF6F6A');\\n                        }\\n                    } else {\\n                        this.notice('Error: Can\\\\'t find hls.js.', undefined, undefined, '#FF6F6A');\\n                    }\\n                    break;\\n                // https://github.com/xqq/mpegts.js\\n                case 'mpegts':\\n                    if (window.mpegts) {\\n                        if (window.mpegts.isSupported()) {\\n                            // if it has already been initialized, destroy it once\\n                            if (this.plugins.mpegts) {\\n                                // destroy aribb24 caption\\n                                if (this.plugins.aribb24Caption) {\\n                                    this.plugins.aribb24Caption.dispose();\\n                                    delete this.plugins.aribb24Caption;\\n                                }\\n                                // destroy aribb24 superimpose\\n                                if (this.plugins.aribb24Superimpose) {\\n                                    this.plugins.aribb24Superimpose.dispose();\\n                                    delete this.plugins.aribb24Superimpose;\\n                                }\\n                                this.plugins.mpegts.unload();\\n                                this.plugins.mpegts.detachMediaElement();\\n                                this.plugins.mpegts.destroy();\\n                                delete this.plugins.mpegts;\\n                            }\\n\\n                            // initialize mpegts.js\\n                            if (this.options.pluginOptions.mpegts === undefined) {\\n                                this.options.pluginOptions.mpegts = {};\\n                            }\\n                            const mpegtsPlayer = window.mpegts.createPlayer(\\n                                Object.assign(this.options.pluginOptions.mpegts.mediaDataSource || {}, {\\n                                    type: 'mpegts',\\n                                    isLive: this.options.live,\\n                                    url: video.src,\\n                                }),\\n                                this.options.pluginOptions.mpegts.config,\\n                            );\\n                            this.plugins.mpegts = mpegtsPlayer;\\n                            mpegtsPlayer.attachMediaElement(video);\\n                            mpegtsPlayer.load();\\n\\n                            // processing when destroy\\n                            this.events.on('destroy', () => {\\n                                // destroy aribb24 caption\\n                                if (this.plugins.aribb24Caption) {\\n                                    this.plugins.aribb24Caption.dispose();\\n                                    delete this.plugins.aribb24Caption;\\n                                }\\n                                // destroy aribb24 superimpose\\n                                if (this.plugins.aribb24Superimpose) {\\n                                    this.plugins.aribb24Superimpose.dispose();\\n                                    delete this.plugins.aribb24Superimpose;\\n                                }\\n                                mpegtsPlayer.unload();\\n                                mpegtsPlayer.detachMediaElement();\\n                                mpegtsPlayer.destroy();\\n                                delete this.plugins.mpegts;\\n                            });\\n\\n                            // initialize aribb24.js\\n                            // https://github.com/monyone/aribb24.js\\n                            if (this.options.subtitle && this.options.subtitle.type === 'aribb24') {\\n                                // set options\\n                                if (this.options.pluginOptions.aribb24 === undefined) {\\n                                    this.options.pluginOptions.aribb24 = {};\\n                                }\\n                                this.options.pluginOptions.aribb24.enableAutoInBandMetadataTextTrackDetection = false; // for mpegts.js\\n                                const aribb24Options = this.options.pluginOptions.aribb24;\\n\\n                                // initialize aribb24 caption\\n                                const aribb24Caption = this.plugins.aribb24Caption = new aribb24js.CanvasRenderer(\\n                                    {...aribb24Options, data_identifier: 0x80},\\n                                );\\n                                aribb24Caption.attachMedia(video);\\n                                aribb24Caption.show();\\n\\n                                // initialize aribb24 superimpose\\n                                if (this.options.pluginOptions.aribb24.disableSuperimposeRenderer !== true) {\\n                                    const aribb24Superimpose = this.plugins.aribb24Superimpose = new aribb24js.CanvasRenderer(\\n                                        {...aribb24Options, data_identifier: 0x81},\\n                                    );\\n                                    aribb24Superimpose.attachMedia(video);\\n                                    aribb24Superimpose.show();\\n                                }\\n\\n                                // push caption data into CanvasRenderer\\n                                mpegtsPlayer.on(window.mpegts.Events.TIMED_ID3_METADATA_ARRIVED, (data) => {\\n                                    if (this.plugins.aribb24Caption) {\\n                                        this.plugins.aribb24Caption.pushID3v2Data(data.pts / 1000, data.data);\\n                                    }\\n                                    if (this.plugins.aribb24Superimpose) {\\n                                        this.plugins.aribb24Superimpose.pushID3v2Data(data.pts / 1000, data.data);\\n                                    }\\n                                });\\n                            }\\n                        } else {\\n                            this.notice('Error: mpegts.js is not supported.', undefined, undefined, '#FF6F6A');\\n                        }\\n                    } else {\\n                        this.notice('Error: Can\\\\'t find mpegts.js.', undefined, undefined, '#FF6F6A');\\n                    }\\n                    break;\\n                // https://github.com/Bilibili/flv.js\\n                case 'flv':\\n                    if (window.flvjs) {\\n                        if (window.flvjs.isSupported()) {\\n                            if (this.options.pluginOptions.flv === undefined) {\\n                                this.options.pluginOptions.flv = {};\\n                            }\\n                            const flvPlayer = window.flvjs.createPlayer(\\n                                Object.assign(this.options.pluginOptions.flv.mediaDataSource || {}, {\\n                                    type: 'flv',\\n                                    url: video.src,\\n                                }),\\n                                this.options.pluginOptions.flv.config,\\n                            );\\n                            this.plugins.flvjs = flvPlayer;\\n                            flvPlayer.attachMediaElement(video);\\n                            flvPlayer.load();\\n                            this.events.on('destroy', () => {\\n                                flvPlayer.unload();\\n                                flvPlayer.detachMediaElement();\\n                                flvPlayer.destroy();\\n                                delete this.plugins.flvjs;\\n                            });\\n                        } else {\\n                            this.notice('Error: flv.js is not supported.', undefined, undefined, '#FF6F6A');\\n                        }\\n                    } else {\\n                        this.notice('Error: Can\\\\'t find flv.js.', undefined, undefined, '#FF6F6A');\\n                    }\\n                    break;\\n                // https://github.com/Dash-Industry-Forum/dash.js\\n                case 'dash':\\n                    if (window.dashjs) {\\n                        const dashjsPlayer = window.dashjs.MediaPlayer().create();\\n                        dashjsPlayer.initialize(video, video.src, false);\\n                        const options = this.options.pluginOptions.dash;\\n                        dashjsPlayer.updateSettings(options ?? {});\\n                        this.plugins.dash = dashjsPlayer;\\n                        this.events.on('destroy', () => {\\n                            dashjsPlayer.reset();\\n                            delete this.plugins.dash;\\n                        });\\n                    } else {\\n                        this.notice('Error: Can\\\\'t find dash.js.', undefined, undefined, '#FF6F6A');\\n                    }\\n                    break;\\n\\n                // https://github.com/webtorrent/webtorrent\\n                case 'webtorrent':\\n                    if (window.WebTorrent) {\\n                        if (window.WebTorrent.WEBRTC_SUPPORT) {\\n                            this.container.classList.add('dplayer-loading');\\n                            const options = this.options.pluginOptions.webtorrent;\\n                            const client = new window.WebTorrent(options);\\n                            this.plugins.webtorrent = client;\\n                            const torrentId = video.src;\\n                            video.src = '';\\n                            video.preload = 'metadata';\\n                            video.addEventListener('durationchange', () => this.container.classList.remove('dplayer-loading'), { once: true });\\n                            client.add(torrentId, (torrent) => {\\n                                const file = torrent.files.find((file) => file.name.endsWith('.mp4'));\\n                                if (file) {\\n                                    file.renderTo(this.video, {\\n                                        autoplay: this.options.autoplay,\\n                                        controls: false,\\n                                    });\\n                                }\\n                            });\\n                            this.events.on('destroy', () => {\\n                                client.remove(torrentId);\\n                                client.destroy();\\n                                delete this.plugins.webtorrent;\\n                            });\\n                        } else {\\n                            this.notice('Error: Webtorrent is not supported.', undefined, undefined, '#FF6F6A');\\n                        }\\n                    } else {\\n                        this.notice('Error: Can\\\\'t find Webtorrent.', undefined, undefined, '#FF6F6A');\\n                    }\\n                    break;\\n            }\\n        }\\n    }\\n\\n    initVideo(video: HTMLVideoElement, type: DPlayerType.VideoType | string): void {\\n        this.initMSE(video, type);\\n\\n        /**\\n         * video events\\n         */\\n        // show video time: the metadata has loaded or changed\\n        this.on('durationchange', () => {\\n            // compatibility: Android browsers will output 1 or Infinity at first\\n            if (video.duration !== 1 && video.duration !== Infinity) {\\n                this.template.dtime.textContent = utils.secondToTime(video.duration);\\n            }\\n        });\\n\\n        // show video loaded bar: to inform interested parties of progress downloading the media\\n        this.on('progress', () => {\\n            const duration = utils.getVideoDuration(this.video, this.template);\\n            const percentage = video.buffered.length ? video.buffered.end(video.buffered.length - 1) / duration : 0;\\n            this.bar.set('loaded', percentage, 'width');\\n        });\\n\\n        // video download error: an error occurs\\n        this.on('error', () => {\\n            if (!this.video.error) {\\n                // Not a video load error, may be poster load failed, see #307\\n                return;\\n            }\\n            // quality switching failed\\n            if (this.switchingQuality) {\\n                if (this.prevVideo !== null) {\\n                    this.template.videoWrapAspect.removeChild(this.prevVideo);\\n                }\\n                this.video.classList.add('dplayer-video-current');\\n                this.prevVideo = null;\\n                this.switchingQuality = false;\\n                this.events.trigger('quality_end');\\n            }\\n            if (this.tran && this.notice && this.type !== 'webtorrent') {\\n                this.notice(this.tran('Video load failed'), -1, undefined, '#FF6F6A');\\n            }\\n            this.container.classList.remove('dplayer-loading');\\n        });\\n\\n        // video end\\n        this.on('ended', () => {\\n            this.bar.set('played', 1, 'width');\\n            if (!this.setting.loop) {\\n                this.pause();\\n            } else {\\n                this.seek(0);\\n                this.play();\\n            }\\n            if (this.danmaku) {\\n                this.danmaku.danIndex = 0;\\n            }\\n        });\\n\\n        this.on('play', () => {\\n            if (this.paused) {\\n                this.play(true);\\n            }\\n        });\\n\\n        this.on('pause', () => {\\n            if (!this.paused) {\\n                this.pause(true);\\n            }\\n        });\\n\\n        this.on('timeupdate', () => {\\n            const duration = utils.getVideoDuration(this.video, this.template);\\n            this.bar.set('played', this.video.currentTime / duration, 'width');\\n            const currentTime = utils.secondToTime(this.video.currentTime);\\n            if (this.template.ptime.textContent !== currentTime) {\\n                this.template.ptime.textContent = currentTime;\\n            }\\n        });\\n\\n        for (let i = 0; i < this.events.videoEvents.length; i++) {\\n            video.addEventListener(this.events.videoEvents[i], (event) => {\\n                this.events.trigger(this.events.videoEvents[i], event);\\n            });\\n        }\\n\\n        // restore volume setting from LocalStorage\\n        this.volume(this.user.get('volume'), true, true);\\n\\n        // restore speed setting from LocalStorage\\n        const savedSpeed = this.user.get('speed');\\n        if (savedSpeed && savedSpeed !== 1.0) {\\n            this.speed(savedSpeed);\\n        }\\n\\n        if (this.options.subtitle) {\\n            this.subtitle = new Subtitle(this.template.subtitle, this.video, this.plugins, this.options.subtitle, this.events);\\n            if (!this.user.get('subtitle')) {\\n                this.subtitle.hide();\\n            }\\n        }\\n    }\\n\\n    switchQuality(index: number): void {\\n        index = typeof index === 'string' ? parseInt(index) : index;\\n        if (this.options.video.quality === undefined || this.qualityIndex === index || this.switchingQuality) {\\n            return;\\n        } else {\\n            this.qualityIndex = index;\\n        }\\n        this.switchingQuality = true;\\n        this.quality = this.options.video.quality[index];\\n\\n        const paused = this.video.paused;\\n        this.video.pause();\\n        const videoHTML = tplVideo({\\n            current: false,\\n            pic: null,\\n            screenshot: this.options.screenshot,\\n            preload: 'auto',\\n            url: this.quality.url,\\n            subtitle: this.options.subtitle,\\n            crossOrigin: this.options.crossOrigin,\\n        });\\n        const videoEle = new DOMParser().parseFromString(videoHTML, 'text/html').body.firstChild as HTMLVideoElement;\\n        this.template.videoWrapAspect.insertBefore(videoEle, this.template.videoWrapAspect.getElementsByTagName('div')[0]);\\n        this.prevVideoCurrentTime = this.video.currentTime;\\n        this.prevVideo = this.video;\\n        this.video = videoEle;\\n        this.initVideo(this.video, this.quality.type || this.options.video.type);\\n        if (!this.options.live) {\\n            this.seek(this.prevVideoCurrentTime);\\n        }\\n        if (!paused) {\\n            this.video.play();\\n        }\\n        this.notice(this.tran('Switching to quality', this.quality.name), -1);\\n        this.container.classList.add('dplayer-loading');\\n        this.events.trigger('quality_start', this.quality);\\n\\n        this.template.qualityItem.forEach((elem) => {\\n            elem.classList.remove('dplayer-setting-quality-current');\\n            if (parseInt(elem.dataset.index!) === index) {\\n                elem.classList.add('dplayer-setting-quality-current');\\n                this.template.qualityValue.textContent = this.quality!.name;\\n                this.template.settingBox.classList.remove('dplayer-setting-box-quality');\\n            }\\n        });\\n\\n        this.on('canplay', () => {\\n            if (this.prevVideo !== null) {\\n                if (!this.options.live && this.video.currentTime !== this.prevVideoCurrentTime) {\\n                    this.seek(this.prevVideoCurrentTime);\\n                    return;\\n                }\\n                this.template.videoWrapAspect.removeChild(this.prevVideo);\\n                this.video.classList.add('dplayer-video-current');\\n                if (!paused) {\\n                    this.video.play();\\n                }\\n                this.prevVideo = null;\\n                this.notice(this.tran('Switched to quality', this.quality!.name), 1000);\\n                this.switchingQuality = false;\\n\\n                // restore speed\\n                const speed = parseFloat(this.template.settingBox.querySelector<HTMLElement>('.dplayer-setting-speed-current')!.dataset.speed!);\\n                this.speed(speed);\\n\\n                // restore audio\\n                const audio = this.template.settingBox.querySelector<HTMLElement>('.dplayer-setting-audio-current')!.dataset.audio!;\\n                if (audio === 'secondary') {\\n                    // switch secondary audio\\n                    if (window.mpegts && this.plugins.mpegts && this.plugins.mpegts instanceof window.mpegts.MSEPlayer) {\\n                        this.plugins.mpegts.switchSecondaryAudio();\\n                    // switch secondary audio for HLS\\n                    } else if (window.Hls && this.plugins.hls && this.plugins.hls instanceof window.Hls) {\\n                        const hls = this.plugins.hls;\\n                        if (hls.audioTracks.length >= 2) {\\n                            hls.audioTrack = 1;  // Switch to secondary audio track\\n                        }\\n                    }\\n                } else {\\n                    // switch primary audio for HLS\\n                    if (window.Hls && this.plugins.hls && this.plugins.hls instanceof window.Hls) {\\n                        const hls = this.plugins.hls;\\n                        if (hls.audioTracks.length >= 2) {\\n                            hls.audioTrack = 0;  // Switch to primary audio track\\n                        }\\n                    }\\n                }\\n\\n                this.container.classList.remove('dplayer-loading');\\n                this.events.trigger('quality_end');\\n            }\\n        });\\n    }\\n\\n    /**\\n     * Show notice\\n     * @param text Notice text\\n     * @param time Time to show (ms, if -1 then notice will not hide)\\n     * @param opacity Notice opacity\\n     * @param color Notice color\\n     */\\n    notice(text: string, time = 2000, opacity = 0.8, color?: string): void {\\n        this.template.notice.textContent = text;\\n        this.template.notice.style.opacity = `${opacity}`;\\n        if (color && color !== '') {\\n            this.template.notice.style.color = color;\\n        } else {\\n            this.template.notice.style.color = '';\\n        }\\n        if (this.noticeTime) {\\n            window.clearTimeout(this.noticeTime);\\n        }\\n        this.events.trigger('notice_show', text);\\n        if (time > 0) {\\n            this.noticeTime = window.setTimeout(() => {\\n                this.hideNotice();\\n            }, time);\\n        }\\n    }\\n\\n    /**\\n     * Instantly hide notice\\n     */\\n    hideNotice(): void {\\n        this.template.notice.style.opacity = '0';\\n        this.events.trigger('notice_hide');\\n    }\\n\\n    resize(): void {\\n        if (this.danmaku) {\\n            this.danmaku.resize();\\n        }\\n        if (this.plugins.aribb24Caption) {\\n            this.plugins.aribb24Caption.refresh();\\n        }\\n        if (this.plugins.aribb24Superimpose) {\\n            this.plugins.aribb24Superimpose.refresh();\\n        }\\n        if (this.controller.thumbnails) {\\n            const thumbnailsConfig = this.options.video.thumbnails;\\n            const width = thumbnailsConfig && thumbnailsConfig.width || 160;\\n            const height = thumbnailsConfig && thumbnailsConfig.height || Math.floor(width * 9 / 16);\\n            this.controller.thumbnails.resize(\\n                width,\\n                height,\\n                this.template.barWrap.offsetWidth,\\n            );\\n        }\\n        this.events.trigger('resize');\\n    }\\n\\n    speed(rate: number): void {\\n        this.video.playbackRate = rate;\\n        this.user.set('speed', rate);\\n        this.template.speedItem.forEach((elem) => {\\n            elem.classList.remove('dplayer-setting-speed-current');\\n            if (parseFloat(elem.dataset.speed!) === rate) {\\n                elem.classList.add('dplayer-setting-speed-current');\\n                if (parseFloat(elem.dataset.speed!) === 1) {\\n                    this.template.speedValue.textContent = this.tran('Normal');\\n                } else {\\n                    this.template.speedValue.textContent = `${rate}`;\\n                }\\n                this.template.settingBox.classList.remove('dplayer-setting-box-speed');\\n            }\\n        });\\n    }\\n\\n    /**\\n     * Destroy DPlayer, and it can not be used again\\n     * @param keepContainerInnerHTML If true, do not clean the innerHTML of the container\\n     */\\n    destroy(keepContainerInnerHTML = false): void {\\n        instances.splice(instances.indexOf(this), 1);\\n        this.pause();\\n        document.removeEventListener('click', this.docClickFun, true);\\n        this.container.removeEventListener('click', this.containerClickFun, true);\\n        this.fullScreen.destroy();\\n        this.hotkey.destroy();\\n        this.contextmenu.destroy();\\n        this.controller.destroy();\\n        this.timer.destroy();\\n        this.setting.destroy();\\n        this.resizeObserver.disconnect();\\n        this.video.removeAttribute('src');\\n        if (!keepContainerInnerHTML) {\\n            this.container.innerHTML = '';\\n        }\\n        this.events.trigger('destroy');\\n    }\\n\\n    static get version(): string {\\n        /* global DPLAYER_VERSION */\\n        // @ts-ignore\\n        return DPLAYER_VERSION;\\n    }\\n}\\n\\nexport default DPlayer;\\n\",\"/* global DPLAYER_VERSION */\\nimport defaultApiBackend from './api';\\nimport DPlayer from './player';\\nimport * as DPlayerType from './types';\\n\\nexport default (options: DPlayerType.Options): DPlayerType.OptionsInternal => {\\n    // default options\\n    const defaultOption: DPlayerType.Options = {\\n        container: options.container || document.querySelector<HTMLElement>('.dplayer') || undefined,\\n        live: false,\\n        liveSyncMinBufferSize: 0.8,\\n        syncWhenPlayingLive: true,\\n        autoplay: false,\\n        theme: '#b7daff',\\n        loop: false,\\n        lang: navigator.language.toLowerCase(),\\n        screenshot: false,\\n        pictureInPicture: true,\\n        airplay: true,\\n        hotkey: true,\\n        preload: 'metadata',\\n        crossOrigin: null,\\n        volume: 1.0,\\n        playbackSpeed: [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\\n        apiBackend: defaultApiBackend,\\n        video: {},\\n        contextmenu: [],\\n        mutex: true,\\n        pluginOptions: {},\\n    };\\n    for (const defaultKey in defaultOption) {\\n        if (Object.prototype.hasOwnProperty.call(defaultOption, defaultKey) && !Object.prototype.hasOwnProperty.call(options, defaultKey)) {\\n            // @ts-ignore\\n            options[defaultKey] = defaultOption[defaultKey];\\n        }\\n    }\\n    if (options.video) {\\n        !options.video.type && (options.video.type = 'auto');\\n\\n        // Process thumbnails options\\n        if (options.video.thumbnails) {\\n            // Convert string to object format\\n            if (typeof options.video.thumbnails === 'string') {\\n                options.video.thumbnails = { url: options.video.thumbnails };\\n            }\\n\\n            // Set default values\\n            !options.video.thumbnails.width && (options.video.thumbnails.width = 160);\\n            !options.video.thumbnails.columnCount && (options.video.thumbnails.columnCount = 100);\\n\\n            // Process interval and totalCount (mutually exclusive)\\n            if (options.video.thumbnails.interval) {\\n                // If interval is specified, totalCount will be calculated in Thumbnails class\\n                // when duration is available\\n                delete options.video.thumbnails.totalCount;\\n            } else if (!options.video.thumbnails.totalCount) {\\n                // If neither interval nor totalCount is specified, use default totalCount\\n                options.video.thumbnails.totalCount = 100;\\n            }\\n        }\\n    }\\n    if (typeof options.danmaku === 'object' && options.danmaku) {\\n        !options.danmaku.user && (options.danmaku.user = 'DPlayer');\\n        !options.danmaku.speedRate && (options.danmaku.speedRate = 1);\\n        !options.danmaku.fontSize && (options.danmaku.fontSize = 35);\\n        options.danmaku.closeCommentFormAfterSend !== false && (options.danmaku.closeCommentFormAfterSend = true);\\n    }\\n    if (options.subtitle) {\\n        !options.subtitle.type && (options.subtitle.type = 'webvtt');\\n        !options.subtitle.fontSize && (options.subtitle.fontSize = '20px');\\n        !options.subtitle.bottom && (options.subtitle.bottom = '40px');\\n        !options.subtitle.color && (options.subtitle.color = '#fff');\\n    }\\n\\n    if (options.video.quality) {\\n        // defaultQuality can be specified as a string\\n        if (typeof options.video.defaultQuality === 'string') {\\n            options.video.quality.forEach((quality, qualityIndex) => {\\n                if (options.video.defaultQuality === quality.name) {\\n                    options.video.defaultQuality = qualityIndex;\\n                }\\n            });\\n            // failsafe\\n            if (typeof options.video.defaultQuality === 'string') {\\n                options.video.defaultQuality = 0;\\n            }\\n        }\\n        // failsafe\\n        if (options.video.defaultQuality === undefined) {\\n            options.video.defaultQuality = 0;\\n        }\\n        options.video.type = options.video.quality[options.video.defaultQuality].type;\\n        options.video.url = options.video.quality[options.video.defaultQuality].url;\\n    }\\n\\n    if (options.lang) {\\n        options.lang = options.lang.toLowerCase();\\n    }\\n\\n    options.contextmenu = options.contextmenu!.concat([\\n        {\\n            text: 'Video info',\\n            click: (player: DPlayer) => {\\n                player.infoPanel.toggle();\\n            },\\n        },\\n        {\\n            // @ts-ignore\\n            text: `DPlayer v${DPLAYER_VERSION}`,\\n            link: 'https://github.com/tsukumijima/DPlayer',\\n        },\\n    ]);\\n\\n    const optionsInternal: DPlayerType.OptionsInternal = {\\n        container: options.container!,\\n        live: options.live!,\\n        liveSyncMinBufferSize: options.liveSyncMinBufferSize!,\\n        syncWhenPlayingLive: options.syncWhenPlayingLive!,\\n        autoplay: options.autoplay!,\\n        theme: options.theme!,\\n        loop: options.loop!,\\n        lang: options.lang!,\\n        screenshot: options.screenshot!,\\n        pictureInPicture: options.pictureInPicture!,\\n        airplay: options.airplay!,\\n        hotkey: options.hotkey!,\\n        preload: options.preload!,\\n        crossOrigin: options.crossOrigin!,\\n        volume: options.volume!,\\n        playbackSpeed: options.playbackSpeed!,\\n        logo: options.logo,  // optional\\n        apiBackend: options.apiBackend!,\\n        video: options.video as DPlayerType.VideoInternal,\\n        subtitle: options.subtitle as DPlayerType.SubtitleInternal,  // optional\\n        danmaku: options.danmaku as DPlayerType.DanmakuInternal,  // optional\\n        contextmenu: options.contextmenu!,\\n        highlight: options.highlight,  // optional\\n        mutex: options.mutex!,\\n        pluginOptions: options.pluginOptions!,\\n    };\\n\\n    return optionsInternal;\\n};\\n\",\"import '../css/index.scss';\\nimport DPlayer from './player';\\n\\n/* global DPLAYER_VERSION GIT_HASH */\\n// @ts-ignore\\nconsole.log(`${'\\\\n'} %c DPlayer v${DPLAYER_VERSION} ${GIT_HASH} %c http://dplayer.js.org ${'\\\\n'}${'\\\\n'}`, 'color: #fadfa3; background: #030307; padding:5px 0;', 'background: #fadfa3; padding:5px 0;');\\n\\nexport default DPlayer;\\nexport * as DPlayerType from './types';\\n\"],\"names\":[\"root\",\"factory\",\"exports\",\"module\",\"define\",\"amd\",\"globalThis\",\"item\",\"content\",\"cssMapping\",\"btoa\",\"base64\",\"unescape\",\"encodeURIComponent\",\"JSON\",\"stringify\",\"data\",\"concat\",\"sourceMapping\",\"join\",\"styleElement\",\"nonce\",\"setAttribute\",\"stylesInDOM\",\"getIndexByIdentifier\",\"identifier\",\"result\",\"i\",\"length\",\"modulesToDom\",\"list\",\"options\",\"idCountMap\",\"identifiers\",\"id\",\"base\",\"count\",\"indexByIdentifier\",\"obj\",\"css\",\"media\",\"sourceMap\",\"supports\",\"layer\",\"references\",\"updater\",\"addElementStyle\",\"byIndex\",\"splice\",\"push\",\"api\",\"domAPI\",\"update\",\"newObj\",\"remove\",\"lastIdentifiers\",\"newList\",\"index\",\"newLastIdentifiers\",\"_i\",\"_index\",\"styleSheet\",\"cssText\",\"firstChild\",\"removeChild\",\"appendChild\",\"document\",\"createTextNode\",\"cssWithMappingToString\",\"toString\",\"this\",\"map\",\"needLayer\",\"modules\",\"dedupe\",\"undefined\",\"alreadyImportedModules\",\"k\",\"_k\",\"t\",\"e\",\"r\",\"n\",\"s\",\"TypeError\",\"String\",\"f\",\"a\",\"o\",\"Array\",\"prototype\",\"configurable\",\"value\",\"charAt\",\"ArrayBuffer\",\"DataView\",\"Object\",\"isExtensible\",\"defineProperty\",\"h\",\"c\",\"u\",\"l\",\"d\",\"p\",\"v\",\"b\",\"g\",\"y\",\"m\",\"_\",\"w\",\"x\",\"A\",\"enforce\",\"C\",\"get\",\"T\",\"Int8Array\",\"F\",\"Uint8ClampedArray\",\"S\",\"R\",\"I\",\"E\",\"O\",\"M\",\"G\",\"B\",\"P\",\"opera\",\"D\",\"j\",\"Uint8Array\",\"Int16Array\",\"Uint16Array\",\"Int32Array\",\"Uint32Array\",\"Float32Array\",\"Float64Array\",\"L\",\"BigInt64Array\",\"BigUint64Array\",\"N\",\"U\",\"Function\",\"NATIVE_ARRAY_BUFFER_VIEWS\",\"TYPED_ARRAY_TAG\",\"aTypedArray\",\"aTypedArrayConstructor\",\"exportTypedArrayMethod\",\"exportTypedArrayStaticMethod\",\"getTypedArrayConstructor\",\"isView\",\"isTypedArray\",\"TypedArray\",\"TypedArrayPrototype\",\"PROPER\",\"CONFIGURABLE\",\"getterFor\",\"set\",\"z\",\"RangeError\",\"H\",\"X\",\"reverse\",\"K\",\"pack\",\"V\",\"unpack\",\"$\",\"W\",\"Y\",\"J\",\"Z\",\"q\",\"Q\",\"tt\",\"byteLength\",\"bytes\",\"byteOffset\",\"et\",\"it\",\"name\",\"NaN\",\"constructor\",\"rt\",\"nt\",\"setInt8\",\"getInt8\",\"setUint8\",\"unsafe\",\"type\",\"detached\",\"buffer\",\"getUint8\",\"getInt16\",\"arguments\",\"getUint16\",\"getInt32\",\"getUint32\",\"getFloat32\",\"getFloat64\",\"setInt16\",\"setUint16\",\"setInt32\",\"setUint32\",\"setFloat32\",\"setFloat64\",\"Math\",\"min\",\"copyWithin\",\"forEach\",\"next\",\"done\",\"includes\",\"indexOf\",\"filter\",\"some\",\"every\",\"find\",\"findIndex\",\"filterReject\",\"lastIndexOf\",\"foo\",\"Boolean\",\"call\",\"left\",\"right\",\"getOwnPropertyDescriptor\",\"writable\",\"slice\",\"floor\",\"return\",\"from\",\"callee\",\"fastKey\",\"getConstructor\",\"first\",\"last\",\"size\",\"that\",\"AS_ENTRIES\",\"key\",\"previous\",\"removed\",\"clear\",\"delete\",\"has\",\"add\",\"setStrong\",\"target\",\"state\",\"kind\",\"entries\",\"enable\",\"global\",\"forced\",\"getPrototypeOf\",\"enumerable\",\"getter\",\"setter\",\"nonConfigurable\",\"nonWritable\",\"createElement\",\"CSSRuleList\",\"CSSStyleDeclaration\",\"CSSValueList\",\"ClientRectList\",\"DOMRectList\",\"DOMStringList\",\"DOMTokenList\",\"DataTransferItemList\",\"FileList\",\"HTMLAllCollection\",\"HTMLCollection\",\"HTMLFormElement\",\"HTMLSelectElement\",\"MediaList\",\"MimeTypeArray\",\"NamedNodeMap\",\"NodeList\",\"PaintRequestList\",\"Plugin\",\"PluginArray\",\"SVGLengthList\",\"SVGNumberList\",\"SVGPathSegList\",\"SVGPointList\",\"SVGStringList\",\"SVGTransformList\",\"SourceBufferList\",\"StyleSheetList\",\"TextTrackCueList\",\"TextTrackList\",\"TouchList\",\"classList\",\"match\",\"test\",\"navigator\",\"userAgent\",\"process\",\"Deno\",\"versions\",\"version\",\"v8\",\"split\",\"stat\",\"dontCallGetSet\",\"sham\",\"RegExp\",\"flags\",\"exec\",\"preventExtensions\",\"apply\",\"Reflect\",\"bind\",\"hasOwnProperty\",\"EXISTS\",\"replace\",\"window\",\"self\",\"hasOwn\",\"abs\",\"pow\",\"log\",\"LN2\",\"propertyIsEnumerable\",\"inspectSource\",\"objectID\",\"weakData\",\"getOwnPropertyNames\",\"getWeakData\",\"onFreeze\",\"WeakMap\",\"facade\",\"isArray\",\"all\",\"normalize\",\"toLowerCase\",\"NATIVE\",\"POLYFILL\",\"Number\",\"isInteger\",\"isFinite\",\"stopped\",\"IS_RECORD\",\"IS_ITERATOR\",\"INTERRUPTED\",\"iterator\",\"IteratorPrototype\",\"BUGGY_SAFARI_ITERATORS\",\"values\",\"keys\",\"proto\",\"arity\",\"source\",\"fround\",\"sign\",\"ceil\",\"trunc\",\"trim\",\"parseInt\",\"Symbol\",\"write\",\"close\",\"parentWindow\",\"ActiveXObject\",\"domain\",\"style\",\"display\",\"src\",\"contentWindow\",\"open\",\"create\",\"defineProperties\",\"getOwnPropertySymbols\",\"isPrototypeOf\",\"setPrototypeOf\",\"__proto__\",\"valueOf\",\"lastIndex\",\"BROKEN_CARET\",\"raw\",\"groups\",\"sticky\",\"multiline\",\"input\",\"hasIndices\",\"ignoreCase\",\"dotAll\",\"unicode\",\"unicodeSets\",\"MISSED_STICKY\",\"UNSUPPORTED_Y\",\"mode\",\"copyright\",\"license\",\"charCodeAt\",\"codeAt\",\"start\",\"end\",\"for\",\"keyFor\",\"max\",\"BigInt\",\"round\",\"view\",\"TypedArrayConstructor\",\"random\",\"withoutSetter\",\"fill\",\"Arguments\",\"sort\",\"fromCharCode\",\"Date\",\"wrap\",\"MAX_SAFE_INTEGER\",\"getOwnPropertyDescriptors\",\"construct\",\"string\",\"padStart\",\"QObject\",\"st\",\"findChild\",\"at\",\"ot\",\"ht\",\"tag\",\"description\",\"ct\",\"ut\",\"pt\",\"lt\",\"ft\",\"dt\",\"useSetter\",\"useSimple\",\"BYTES_PER_ELEMENT\",\"toLocaleString\",\"toStringTag\",\"CanvasProvider\",\"CanvasRenderer\",\"HTMLProvider\",\"Rt\",\"HTMLRenderer\",\"Pt\",\"SVGProvider\",\"bt\",\"SVGRenderer\",\"At\",\"Map\",\"alphabet\",\"Set\",\"toPrimitive\",\"option_canvas\",\"render_canvas\",\"render_text\",\"GL\",\"GR\",\"G_BACK\",\"DRCS_mapping\",\"purpose_width\",\"purpose_height\",\"swf_x\",\"swf_y\",\"sdf_x\",\"sdf_y\",\"sdp_x\",\"sdp_y\",\"ssm_x\",\"ssm_y\",\"shs\",\"svs\",\"text_size_x\",\"text_size_y\",\"position_x\",\"position_y\",\"pallet\",\"fg_color\",\"bg_color\",\"force_bg_color\",\"hlc\",\"stl\",\"orn\",\"force_orn\",\"non_spacing\",\"timeElapsed\",\"endTime\",\"rendered\",\"PRA\",\"normalFont\",\"gaijiFont\",\"drcsReplacement\",\"drcsReplaceMapping\",\"useStroke\",\"usePUA\",\"pes\",\"startTime\",\"data_identifier\",\"data_group_id\",\"width\",\"height\",\"getContext\",\"fillStyle\",\"fillRect\",\"getImageData\",\"toUpperCase\",\"substring\",\"width_magnification\",\"height_magnification\",\"move_absolute_dot\",\"initialize\",\"canvas\",\"forceStrokeColor\",\"getRGBAColorCode\",\"forceBackgroundColor\",\"detect\",\"parseText\",\"parseDRCS\",\"clearRect\",\"keepAspectRatio\",\"drawImage\",\"POSITIVE_INFINITY\",\"textContent\",\"renderCharacter\",\"move_relative_pos\",\"move_newline\",\"move_absolute_pos\",\"canvas_width\",\"canvas_height\",\"getRGBAfromColorCode\",\"renderFont\",\"getOrnColorCode\",\"viewBox\",\"path\",\"renderPath\",\"translate\",\"scale\",\"font\",\"strokeStyle\",\"lineJoin\",\"textBaseline\",\"textAlign\",\"lineWidth\",\"strokeText\",\"setTransform\",\"fillText\",\"stroke\",\"Path2D\",\"fillAlphaColorCode\",\"ReferenceError\",\"active\",\"polling_handler\",\"polling\",\"polling_id\",\"cues\",\"oncuechange\",\"label\",\"language\",\"inBandMetadataTrackDispatchType\",\"sourceBuffer\",\"listeners\",\"requestAnimationFrame\",\"cancelAnimationFrame\",\"activeCues\",\"CustomEvent\",\"createEvent\",\"initCustomEvent\",\"dispatchEvent\",\"currentTime\",\"getCueById\",\"addCue\",\"removeCue\",\"pauseOnExit\",\"onenter\",\"onexit\",\"track\",\"TextDecoder\",\"decode\",\"decodeURIComponent\",\"atob\",\"id3Track\",\"b24Track\",\"subtitleElement\",\"viewCanvas\",\"rawCanvas\",\"resizeObserver\",\"mutationObserver\",\"prevCurrentTime\",\"highResTimeupdatePollingId\",\"isShowing\",\"isOnSeeking\",\"onB24CueChangeDrawed\",\"onID3AddtrackHandler\",\"onID3Addtrack\",\"onID3CueChangeHandler\",\"onID3CueChange\",\"onB24CueChangeHandler\",\"onB24CueChange\",\"onHighResTimeupdateHandler\",\"onHighResTimeupdate\",\"onTimeupdateHandler\",\"onTimeupdate\",\"onCanplayHandler\",\"onCanplay\",\"onPlayHandler\",\"onPlay\",\"onPauseHandler\",\"onPause\",\"onSeekingHandler\",\"onSeeking\",\"onSeekedHandler\",\"onSeeked\",\"onResizeHandler\",\"onResize\",\"rendererOption\",\"enableAutoInBandMetadataTextTrackDetection\",\"detachMedia\",\"parentElement\",\"addEventListener\",\"useHighResTimeupdate\",\"setupTrack\",\"setupCanvas\",\"cleanupCanvas\",\"cleanupTrack\",\"removeEventListener\",\"render\",\"addB24Cue\",\"pushRawData\",\"pushBase64Data\",\"pushID3v2PRIVData\",\"pushID3v2TXXXData\",\"pushID3v2Data\",\"info\",\"frame\",\"owner\",\"VTTCue\",\"TextTrackCue\",\"PRACallback\",\"NEGATIVE_INFINITY\",\"pushID3v2Cue\",\"MIN_VALUE\",\"getComputedStyle\",\"devicePixelRatio\",\"videoWidth\",\"videoHeight\",\"setInBandMetadataTextTrack\",\"useHighResTextTrack\",\"startPolling\",\"textTracks\",\"addTextTrack\",\"position\",\"top\",\"pointerEvents\",\"enableRawCanvas\",\"ResizeObserver\",\"observe\",\"MutationObserver\",\"attributes\",\"attributeFilter\",\"stopPolling\",\"disconnect\",\"vt\",\"text\",\"svg\",\"text_type\",\"prev_hlc\",\"flc\",\"parseBitmap\",\"getAlphaFromColorCode\",\"createElementNS\",\"getRGBfromColorCode\",\"toDataURL\",\"subarray\",\"gt\",\"yt\",\"mt\",\"_t\",\"xt\",\"wt\",\"onPauseAnimationHandler\",\"onPauseAnimation\",\"onResumeAnimationHandler\",\"onResumeAnimation\",\"setupSVG\",\"cleanupSVG\",\"visibility\",\"pauseAnimations\",\"unpauseAnimations\",\"Ct\",\"Tt\",\"kt\",\"Ft\",\"St\",\"table\",\"cells\",\"willChange\",\"boxSizing\",\"border\",\"borderCollapse\",\"padding\",\"verticalAlign\",\"alignItems\",\"justifyContent\",\"lineHeight\",\"fontSize\",\"transform\",\"transformOrigin\",\"marginRight\",\"marginBottom\",\"color\",\"borderBottom\",\"borderRight\",\"borderTop\",\"borderLeft\",\"backgroundColor\",\"parentNode\",\"fontFamily\",\"textShadow\",\"It\",\"Et\",\"Ot\",\"Mt\",\"Bt\",\"Gt\",\"wrapper\",\"setupTable\",\"cleanupTable\",\"offsetWidth\",\"offsetHeight\",\"___CSS_LOADER_EXPORT___\",\"element\",\"setAttributes\",\"insert\",\"memo\",\"styleTarget\",\"querySelector\",\"HTMLIFrameElement\",\"contentDocument\",\"head\",\"getTarget\",\"Error\",\"insertStyleElement\",\"styleTagTransform\",\"removeStyleElement\",\"runtime\",\"ESCAPE_REG\",\"$escape\",\"html\",\"regexResult\",\"char\",\"xmlEscape\",\"$each\",\"callback\",\"len\",\"__webpack_module_cache__\",\"__webpack_require__\",\"moduleId\",\"cachedModule\",\"__webpack_modules__\",\"__esModule\",\"definition\",\"prop\",\"nc\",\"locals\",\"isMobile\",\"utils\",\"secondToTime\",\"second\",\"Infinity\",\"hour\",\"sec\",\"num\",\"getVideoDuration\",\"video\",\"template\",\"duration\",\"seekable\",\"dtime\",\"buffered\",\"getRelativeX\",\"event\",\"container\",\"rect\",\"getBoundingClientRect\",\"clientX\",\"touches\",\"changedTouches\",\"getScrollPosition\",\"pageXOffset\",\"documentElement\",\"scrollLeft\",\"body\",\"pageYOffset\",\"scrollTop\",\"setScrollPosition\",\"isFirefox\",\"scrollTo\",\"isWebKit\",\"storage\",\"localStorage\",\"setItem\",\"getItem\",\"nameMap\",\"dragStart\",\"dragMove\",\"dragEnd\",\"color2Number\",\"substr\",\"number2Color\",\"number\",\"number2Type\",\"fn\",\"thisArg\",\"kindOf\",\"cache\",\"thing\",\"str\",\"kindOfTest\",\"typeOfTest\",\"isUndefined\",\"isBuffer\",\"val\",\"isFunction\",\"isArrayBuffer\",\"isString\",\"isNumber\",\"isObject\",\"isPlainObject\",\"isDate\",\"isFile\",\"isBlob\",\"isFileList\",\"isURLSearchParams\",\"isReadableStream\",\"isRequest\",\"isResponse\",\"isHeaders\",\"allOwnKeys\",\"findKey\",\"_key\",\"_global\",\"isContextDefined\",\"context\",\"isHTMLForm\",\"isRegExp\",\"reduceDescriptors\",\"reducer\",\"descriptors\",\"reducedDescriptors\",\"descriptor\",\"ret\",\"isAsyncFn\",\"_setImmediate\",\"setImmediateSupported\",\"setImmediate\",\"postMessageSupported\",\"postMessage\",\"token\",\"callbacks\",\"shift\",\"cb\",\"setTimeout\",\"asap\",\"queueMicrotask\",\"nextTick\",\"isFormData\",\"FormData\",\"append\",\"isArrayBufferView\",\"isBoolean\",\"isEmptyObject\",\"isStream\",\"pipe\",\"merge\",\"caseless\",\"skipUndefined\",\"assignValue\",\"targetKey\",\"extend\",\"stripBOM\",\"inherits\",\"superConstructor\",\"props\",\"assign\",\"toFlatObject\",\"sourceObj\",\"destObj\",\"propFilter\",\"merged\",\"endsWith\",\"searchString\",\"toArray\",\"arr\",\"forEachEntry\",\"_iterator\",\"pair\",\"matchAll\",\"regExp\",\"matches\",\"hasOwnProp\",\"freezeMethods\",\"toObjectSet\",\"arrayOrString\",\"delimiter\",\"toCamelCase\",\"p1\",\"p2\",\"noop\",\"toFiniteNumber\",\"defaultValue\",\"isSpecCompliantForm\",\"toJSONObject\",\"stack\",\"visit\",\"reducedValue\",\"isThenable\",\"then\",\"catch\",\"isIterable\",\"AxiosError\",\"message\",\"code\",\"config\",\"request\",\"response\",\"captureStackTrace\",\"status\",\"toJSON\",\"fileName\",\"lineNumber\",\"columnNumber\",\"error\",\"customProps\",\"axiosError\",\"msg\",\"errCode\",\"cause\",\"isVisitable\",\"removeBrackets\",\"renderKey\",\"dots\",\"predicates\",\"formData\",\"metaTokens\",\"indexes\",\"option\",\"visitor\",\"defaultVisitor\",\"useBlob\",\"Blob\",\"convertValue\",\"toISOString\",\"Buffer\",\"isFlatArray\",\"el\",\"exposedHelpers\",\"build\",\"pop\",\"encode\",\"charMap\",\"AxiosURLSearchParams\",\"params\",\"_pairs\",\"toFormData\",\"encoder\",\"_encode\",\"buildURL\",\"url\",\"serialize\",\"serializeFn\",\"serializedParams\",\"hashmarkIndex\",\"handlers\",\"use\",\"fulfilled\",\"rejected\",\"synchronous\",\"runWhen\",\"eject\",\"silentJSONParsing\",\"forcedJSONParsing\",\"clarifyTimeoutError\",\"isBrowser\",\"classes\",\"URLSearchParams\",\"protocols\",\"hasBrowserEnv\",\"_navigator\",\"hasStandardBrowserEnv\",\"product\",\"hasStandardBrowserWebWorkerEnv\",\"WorkerGlobalScope\",\"importScripts\",\"origin\",\"location\",\"href\",\"platform\",\"buildPath\",\"isNumericKey\",\"isLast\",\"arrayToObject\",\"parsePropPath\",\"defaults\",\"transitional\",\"transitionalDefaults\",\"adapter\",\"transformRequest\",\"headers\",\"contentType\",\"getContentType\",\"hasJSONContentType\",\"isObjectPayload\",\"formDataToJSON\",\"setContentType\",\"helpers\",\"isNode\",\"toURLEncodedForm\",\"formSerializer\",\"_FormData\",\"env\",\"rawValue\",\"parser\",\"parse\",\"stringifySafely\",\"transformResponse\",\"JSONRequested\",\"responseType\",\"strictJSONParsing\",\"parseReviver\",\"ERR_BAD_RESPONSE\",\"timeout\",\"xsrfCookieName\",\"xsrfHeaderName\",\"maxContentLength\",\"maxBodyLength\",\"validateStatus\",\"common\",\"method\",\"ignoreDuplicateOf\",\"$internals\",\"normalizeHeader\",\"header\",\"normalizeValue\",\"matchHeaderValue\",\"isHeaderNameFilter\",\"AxiosHeaders\",\"valueOrRewrite\",\"rewrite\",\"setHeader\",\"_value\",\"_header\",\"_rewrite\",\"lHeader\",\"setHeaders\",\"rawHeaders\",\"parsed\",\"line\",\"parseHeaders\",\"dest\",\"entry\",\"tokens\",\"tokensRE\",\"parseTokens\",\"matcher\",\"deleted\",\"deleteHeader\",\"format\",\"normalized\",\"formatHeader\",\"targets\",\"asStrings\",\"getSetCookie\",\"computed\",\"accessor\",\"accessors\",\"defineAccessor\",\"accessorName\",\"methodName\",\"arg1\",\"arg2\",\"arg3\",\"buildAccessors\",\"mapped\",\"headerValue\",\"transformData\",\"fns\",\"isCancel\",\"__CANCEL__\",\"CanceledError\",\"ERR_CANCELED\",\"settle\",\"resolve\",\"reject\",\"ERR_BAD_REQUEST\",\"samplesCount\",\"timestamps\",\"firstSampleTS\",\"tail\",\"chunkLength\",\"now\",\"startedAt\",\"bytesCount\",\"passed\",\"freq\",\"lastArgs\",\"timer\",\"timestamp\",\"threshold\",\"invoke\",\"args\",\"clearTimeout\",\"throttled\",\"flush\",\"progressEventReducer\",\"listener\",\"isDownloadStream\",\"bytesNotified\",\"_speedometer\",\"speedometer\",\"throttle\",\"loaded\",\"total\",\"lengthComputable\",\"progressBytes\",\"rate\",\"progress\",\"estimated\",\"progressEventDecorator\",\"asyncDecorator\",\"isMSIE\",\"URL\",\"protocol\",\"host\",\"port\",\"expires\",\"secure\",\"cookie\",\"toGMTString\",\"read\",\"buildFullPath\",\"baseURL\",\"requestedURL\",\"allowAbsoluteUrls\",\"isRelativeUrl\",\"relativeURL\",\"combineURLs\",\"headersToObject\",\"mergeConfig\",\"config1\",\"config2\",\"getMergedValue\",\"mergeDeepProperties\",\"valueFromConfig2\",\"defaultToConfig2\",\"mergeDirectKeys\",\"mergeMap\",\"paramsSerializer\",\"timeoutMessage\",\"withCredentials\",\"withXSRFToken\",\"onUploadProgress\",\"onDownloadProgress\",\"decompress\",\"beforeRedirect\",\"transport\",\"httpAgent\",\"httpsAgent\",\"cancelToken\",\"socketPath\",\"responseEncoding\",\"configValue\",\"newConfig\",\"auth\",\"username\",\"password\",\"getHeaders\",\"formHeaders\",\"allowedHeaders\",\"isURLSameOrigin\",\"xsrfValue\",\"cookies\",\"XMLHttpRequest\",\"Promise\",\"_config\",\"resolveConfig\",\"requestData\",\"requestHeaders\",\"onCanceled\",\"uploadThrottled\",\"downloadThrottled\",\"flushUpload\",\"flushDownload\",\"unsubscribe\",\"signal\",\"onloadend\",\"responseHeaders\",\"getAllResponseHeaders\",\"err\",\"responseText\",\"statusText\",\"onreadystatechange\",\"readyState\",\"responseURL\",\"onabort\",\"ECONNABORTED\",\"onerror\",\"ERR_NETWORK\",\"ontimeout\",\"timeoutErrorMessage\",\"ETIMEDOUT\",\"setRequestHeader\",\"upload\",\"cancel\",\"abort\",\"subscribe\",\"aborted\",\"parseProtocol\",\"send\",\"composeSignals\",\"signals\",\"controller\",\"AbortController\",\"reason\",\"streamChunk\",\"chunk\",\"chunkSize\",\"pos\",\"readStream\",\"async\",\"stream\",\"asyncIterator\",\"reader\",\"getReader\",\"trackStream\",\"onProgress\",\"onFinish\",\"iterable\",\"readBytes\",\"_onFinish\",\"ReadableStream\",\"pull\",\"loadedBytes\",\"enqueue\",\"highWaterMark\",\"globalFetchAPI\",\"Request\",\"Response\",\"TextEncoder\",\"fetch\",\"envFetch\",\"isFetchSupported\",\"isRequestSupported\",\"isResponseSupported\",\"isReadableStreamSupported\",\"encodeText\",\"arrayBuffer\",\"supportsRequestStream\",\"duplexAccessed\",\"hasContentType\",\"duplex\",\"supportsResponseStream\",\"resolvers\",\"res\",\"ERR_NOT_SUPPORT\",\"resolveBodyLength\",\"getContentLength\",\"_request\",\"getBodyLength\",\"fetchOptions\",\"_fetch\",\"composedSignal\",\"toAbortSignal\",\"requestContentLength\",\"contentTypeHeader\",\"isCredentialsSupported\",\"resolvedOptions\",\"credentials\",\"isStreamResponse\",\"responseContentLength\",\"responseData\",\"seedCache\",\"getFetch\",\"seeds\",\"seed\",\"knownAdapters\",\"http\",\"xhr\",\"xhrAdapter\",\"fetchAdapter\",\"renderReason\",\"isResolvedHandle\",\"getAdapter\",\"adapters\",\"nameOrAdapter\",\"rejectedReasons\",\"reasons\",\"throwIfCancellationRequested\",\"throwIfRequested\",\"dispatchRequest\",\"VERSION\",\"validators\",\"deprecatedWarnings\",\"validator\",\"formatMessage\",\"opt\",\"desc\",\"opts\",\"ERR_DEPRECATED\",\"console\",\"warn\",\"spelling\",\"correctSpelling\",\"assertOptions\",\"schema\",\"allowUnknown\",\"ERR_BAD_OPTION_VALUE\",\"ERR_BAD_OPTION\",\"Axios\",\"instanceConfig\",\"interceptors\",\"InterceptorManager\",\"configOrUrl\",\"dummy\",\"boolean\",\"function\",\"baseUrl\",\"withXsrfToken\",\"contextHeaders\",\"requestInterceptorChain\",\"synchronousRequestInterceptors\",\"interceptor\",\"unshift\",\"responseInterceptorChain\",\"promise\",\"chain\",\"onFulfilled\",\"onRejected\",\"getUri\",\"generateHTTPMethod\",\"isForm\",\"CancelToken\",\"executor\",\"resolvePromise\",\"_listeners\",\"onfulfilled\",\"_resolve\",\"HttpStatusCode\",\"Continue\",\"SwitchingProtocols\",\"Processing\",\"EarlyHints\",\"Ok\",\"Created\",\"Accepted\",\"NonAuthoritativeInformation\",\"NoContent\",\"ResetContent\",\"PartialContent\",\"MultiStatus\",\"AlreadyReported\",\"ImUsed\",\"MultipleChoices\",\"MovedPermanently\",\"Found\",\"SeeOther\",\"NotModified\",\"UseProxy\",\"Unused\",\"TemporaryRedirect\",\"PermanentRedirect\",\"BadRequest\",\"Unauthorized\",\"PaymentRequired\",\"Forbidden\",\"NotFound\",\"MethodNotAllowed\",\"NotAcceptable\",\"ProxyAuthenticationRequired\",\"RequestTimeout\",\"Conflict\",\"Gone\",\"LengthRequired\",\"PreconditionFailed\",\"PayloadTooLarge\",\"UriTooLong\",\"UnsupportedMediaType\",\"RangeNotSatisfiable\",\"ExpectationFailed\",\"ImATeapot\",\"MisdirectedRequest\",\"UnprocessableEntity\",\"Locked\",\"FailedDependency\",\"TooEarly\",\"UpgradeRequired\",\"PreconditionRequired\",\"TooManyRequests\",\"RequestHeaderFieldsTooLarge\",\"UnavailableForLegalReasons\",\"InternalServerError\",\"NotImplemented\",\"BadGateway\",\"ServiceUnavailable\",\"GatewayTimeout\",\"HttpVersionNotSupported\",\"VariantAlsoNegotiates\",\"InsufficientStorage\",\"LoopDetected\",\"NotExtended\",\"NetworkAuthenticationRequired\",\"axios\",\"createInstance\",\"defaultConfig\",\"instance\",\"Cancel\",\"promises\",\"spread\",\"isAxiosError\",\"payload\",\"formToJSON\",\"default\",\"defaultApiBackend\",\"post\",\"success\",\"author\",\"time\",\"tranTxt\",\"lang\",\"tran\",\"arg\",\"play\",\"pause\",\"backward\",\"forward\",\"volumeUp\",\"volumeDown\",\"volumeOff\",\"full\",\"fullWeb\",\"pip\",\"setting\",\"check\",\"comment\",\"commentOff\",\"pallette\",\"camera\",\"subtitle\",\"loading\",\"airplay\",\"volumeBar\",\"volumeBarWrap\",\"volumeBarWrapWrap\",\"volumeButton\",\"volumeButtonIcon\",\"volumeIcon\",\"playedBar\",\"loadedBar\",\"playedBarWrap\",\"playedBarTime\",\"danmaku\",\"danmakuLoading\",\"bezel\",\"playButton\",\"playIcon\",\"mobileBackwardButton\",\"mobilePlayButton\",\"mobileForwardButton\",\"videoWrap\",\"videoWrapAspect\",\"controllerMask\",\"ptime\",\"settingButton\",\"settingBox\",\"settingOriginPanel\",\"mask\",\"syncButton\",\"loop\",\"loopToggle\",\"showDanmaku\",\"showDanmakuToggle\",\"unlimitDanmaku\",\"unlimitDanmakuToggle\",\"quality\",\"qualityValue\",\"qualityHeader\",\"qualityItem\",\"speed\",\"speedValue\",\"speedHeader\",\"speedItem\",\"audio\",\"audioValue\",\"audioHeader\",\"audioItem\",\"danmakuOpacityBar\",\"danmakuOpacityBarWrap\",\"danmakuOpacityBarWrapWrap\",\"danmakuOpacityBox\",\"danmakuOpacityValue\",\"commentInput\",\"commentButton\",\"commentSettingBox\",\"commentSettingButton\",\"commentSettingFill\",\"commentSendButton\",\"commentSendFill\",\"commentColorSettingBox\",\"browserFullButton\",\"webFullButton\",\"pipButton\",\"menu\",\"menuItem\",\"cameraButton\",\"airplayButton\",\"subtitleButton\",\"subtitleButtonInner\",\"barPreview\",\"barWrap\",\"notice\",\"infoPanel\",\"infoPanelClose\",\"infoMimeType\",\"infoVersion\",\"infoVideoFPS\",\"infoPageFPS\",\"infoDroppedFrames\",\"infoType\",\"infoUrl\",\"infoResolution\",\"infoDuration\",\"infoBufferRemain\",\"infoDownloadSpeed\",\"init\",\"innerHTML\",\"icons\",\"mobile\",\"current\",\"pic\",\"screenshot\",\"preload\",\"crossOrigin\",\"querySelectorAll\",\"player\",\"danTunnel\",\"danIndex\",\"danFontSize\",\"dan\",\"_opacity\",\"events\",\"unlimited\",\"showing\",\"paused\",\"bottom\",\"opacity\",\"_measure\",\"load\",\"apiurl\",\"address\",\"apiParamsObj\",\"maximum\",\"apiParamsStr\",\"endpoints\",\"addition\",\"apiBackend\",\"trigger\",\"_readAllEndpoints\",\"results\",\"reload\",\"newAPI\",\"errorCount\",\"readCount\",\"isCallbackOnError\",\"danmakuData\",\"user\",\"draw\",\"parseFloat\",\"percentage\",\"setProperty\",\"danList\",\"ratioRate\",\"ratio\",\"itemFontSize\",\"itemHeight\",\"danWidth\",\"itemY\",\"danItemRight\",\"danmakuItem\",\"danmakuItemWidth\",\"danmakuItemRight\",\"danSpeed\",\"getTunnel\",\"tmp\",\"danRight\",\"docFragment\",\"createDocumentFragment\",\"itemWidth\",\"measure\",\"lines\",\"span\",\"borderColor\",\"tunnel\",\"animationDuration\",\"_danAnimation\",\"maxWidth\",\"measureText\",\"seek\",\"resize\",\"items\",\"hide\",\"show\",\"toggle\",\"unlimit\",\"speedRate\",\"isFullScreen\",\"fullScreen\",\"videoEvents\",\"playerEvents\",\"on\",\"once\",\"off\",\"lastScrollPosition\",\"fullscreenchange\",\"onfullscreenchange\",\"fullEle\",\"fullscreenElement\",\"webkitFullscreenElement\",\"contains\",\"anotherType\",\"anotherTypeOn\",\"requestFullscreen\",\"webkitRequestFullscreen\",\"webkitEnterFullscreen\",\"screen\",\"orientation\",\"lock\",\"exitFullscreen\",\"webkitExitFullscreen\",\"unlock\",\"destroy\",\"storageName\",\"volume\",\"plugins\",\"cue\",\"getCueAsHTML\",\"trackHtml\",\"aribb24Caption\",\"elements\",\"played\",\"direction\",\"types\",\"enablefpsChecker\",\"enableinfoChecker\",\"enableloadingChecker\",\"fpsIndex\",\"fpsStart\",\"fpsChecker\",\"infoChecker\",\"loadingChecker\",\"webkitRequestAnimationFrame\",\"mozRequestAnimationFrame\",\"oRequestAnimationFrame\",\"msRequestAnimationFrame\",\"initloadingChecker\",\"lastPlayPos\",\"currentPlayPos\",\"bufferingDetected\",\"setInterval\",\"initfpsChecker\",\"fpsCurrent\",\"fps\",\"initinfoChecker\",\"disable\",\"clearInterval\",\"icon\",\"barWidth\",\"viewportWidth\",\"viewportHeight\",\"thumbnailSpace\",\"interval\",\"totalCount\",\"columnCount\",\"magnificationScale\",\"backgroundPosition\",\"barWrapWidth\",\"rowCount\",\"backgroundWidth\",\"backgroundHeight\",\"backgroundSize\",\"move\",\"column\",\"row\",\"backgroundX\",\"backgroundY\",\"disableAutoHide\",\"autoHideTimer\",\"mobileSkipTimer\",\"mobileBackwardTime\",\"mobileForwardTime\",\"setAutoHideHandler\",\"thumbnails\",\"setAutoHide\",\"initPlayButton\",\"initThumbnails\",\"initPlayedBar\",\"initFullButton\",\"initPipButton\",\"initSyncButton\",\"initScreenshotButton\",\"initSubtitleButton\",\"initHighlights\",\"initAirplayButton\",\"initVolumeButton\",\"isShow\",\"toFixed\",\"highlight\",\"highlights\",\"insertBefore\",\"thumbnailsConfig\",\"thumbMove\",\"preventDefault\",\"clientWidth\",\"bar\",\"thumbUp\",\"passive\",\"relativeX\",\"pictureInPictureEnabled\",\"pictureInPictureElement\",\"exitPictureInPicture\",\"requestPictureInPicture\",\"volumeMove\",\"muted\",\"switchVolumeIcon\",\"live\",\"sync\",\"toBlob\",\"blob\",\"today\",\"filename\",\"getFullYear\",\"getMonth\",\"getDate\",\"getHours\",\"getMinutes\",\"getSeconds\",\"bloburl\",\"createObjectURL\",\"link\",\"download\",\"click\",\"revokeObjectURL\",\"WebKitPlaybackTargetAvailabilityEvent\",\"availability\",\"webkitShowPlaybackTargetPicker\",\"ariaLabel\",\"currentAudio\",\"clipSettingBox\",\"settingOriginPanelHeight\",\"scrollHeight\",\"clipPath\",\"switchingQuality\",\"switchQuality\",\"dataset\",\"mpegts\",\"MSEPlayer\",\"switchPrimaryAudio\",\"switchSecondaryAudio\",\"hls\",\"Hls\",\"audioTracks\",\"audioTrack\",\"checked\",\"danmakuMove\",\"danmakuUp\",\"toggleSetting\",\"hideSetting\",\"keyCode\",\"focus\",\"showSetting\",\"closeCommentFormAfterSend\",\"blur\",\"doHotKeyHandler\",\"cancelFullScreenHandler\",\"doHotKey\",\"cancelFullScreen\",\"hotkey\",\"activeElement\",\"tagName\",\"editable\",\"getAttribute\",\"altKey\",\"shiftKey\",\"ctrlKey\",\"metaKey\",\"pictureInPicture\",\"contextmenuHandler\",\"shown\",\"contextmenu\",\"clientRect\",\"clientY\",\"beginTime\",\"getVideoPlaybackQuality\",\"droppedVideoFrames\",\"totalVideoFrames\",\"decoded\",\"dropped\",\"bufferedRangeCount\",\"bufferRemain\",\"flvjs\",\"mediaInfo\",\"statisticsInfo\",\"mimeType\",\"instances\",\"containerClickFun\",\"docClickFun\",\"narrow\",\"noticeTime\",\"prevVideoCurrentTime\",\"prevVideo\",\"qualityIndex\",\"defaultOption\",\"liveSyncMinBufferSize\",\"syncWhenPlayingLive\",\"autoplay\",\"theme\",\"playbackSpeed\",\"mutex\",\"pluginOptions\",\"defaultKey\",\"defaultQuality\",\"logo\",\"initDanmaku\",\"initVideo\",\"hideNotice\",\"quiet\",\"fromNative\",\"switch\",\"playFunc\",\"nostorage\",\"nonotice\",\"isNaN\",\"formatPercentage\",\"switchVideo\",\"danmakuAPI\",\"remember\",\"playbackRate\",\"poster\",\"initMSE\",\"customType\",\"isSupported\",\"dispose\",\"aribb24Superimpose\",\"hlsOptions\",\"loadSource\",\"attachMedia\",\"Events\",\"AUDIO_TRACKS_UPDATED\",\"aribb24\",\"aribb24Options\",\"disableSuperimposeRenderer\",\"FRAG_PARSING_METADATA\",\"sample\",\"samples\",\"pts\",\"canPlayType\",\"unload\",\"detachMediaElement\",\"mpegtsPlayer\",\"createPlayer\",\"mediaDataSource\",\"isLive\",\"attachMediaElement\",\"TIMED_ID3_METADATA_ARRIVED\",\"flv\",\"flvPlayer\",\"dashjs\",\"dashjsPlayer\",\"MediaPlayer\",\"dash\",\"updateSettings\",\"reset\",\"WebTorrent\",\"WEBRTC_SUPPORT\",\"webtorrent\",\"client\",\"torrentId\",\"torrent\",\"file\",\"files\",\"renderTo\",\"controls\",\"savedSpeed\",\"videoHTML\",\"videoEle\",\"DOMParser\",\"parseFromString\",\"getElementsByTagName\",\"elem\",\"refresh\",\"keepContainerInnerHTML\",\"removeAttribute\"],\"sourceRoot\":\"\"}\n\\ No newline at end of file\n+{\"version\":3,\"file\":\"DPlayer.min.js\",\"mappings\":\"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IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAIC,EAAE,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAIC,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,KAAK,KAAK,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAIhB,EAAE,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAKiB,EAAE,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAKC,EAAE,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAKC,EAAE,IAAI0V,IAAI,CAAC,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,MAAM,CAAC,mCAAmC,MAAM,CAAC,mCAAmC,MAAM,CAAC,mCAAmC,MAAM,CAAC,mCAAmC,MAAM,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,KAAK,CAAC,mCAAmC,OAAOzV,GAAG/E,EAAE,MAAM,IAAI0a,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,QAAQ1V,EAAE,CAAC,EAAE,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,IAAI,MAAM,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM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,KAC1B,IAAI73C,EAAS8nB,EAET4vB,GAAQ90C,KAAK+0C,OAASD,GAAQ90C,KAAK+0C,MAAM7vB,KAEzC9nB,EAAS03C,GAAQ90C,KAAK+0C,MAAM7vB,IAEhC,IAAI7nB,EAAI,EAER,OAAOD,EAAOqS,QAAQ,OAAQ,IAAMwlC,EAAI53C,MAAQ,IAExD,E,6cCFA,MAyBA,GAzBc,CACV63C,KAAM,KACNC,MAAO,KACPC,SAAU,KACVC,QAAS,KACTC,SAAU,KACVC,WAAY,KACZC,UAAW,KACXC,KAAM,KACNC,QAAS,KACTC,IAAK,KACLC,QAAS,KACT/rC,KAAM,KACNC,MAAO,KACP+rC,MAAO,KACPC,QAAS,KACTC,WAAY,KACZlO,KAAM,KACNmO,SAAU,KACVC,OAAQ,KACRC,SAAU,KACVC,QAAS,KACTC,QAAS,M,yBC2Kb,SAnNA,MACI3pB,UACAhvB,QACA0B,MACA61C,KAEAqB,UACAC,cACAC,kBACAC,aACAC,iBACAC,WACAC,UACAC,UACAC,cACAC,cACAC,QACAC,eACA/qB,MACAgrB,MACAC,WACAC,SACAC,qBACAC,iBACAC,oBACAC,UACAC,gBACAC,eACAC,MACAC,cACAC,WACAC,mBACAC,KACAC,WACAC,KACAC,WACAC,YACAC,kBACAC,eACAC,qBACAC,QACAC,aACAC,cACAC,YACAC,MACAC,WACAC,YACAC,UACAC,MACAC,WACAC,YACAC,UACAC,kBACAC,sBACAC,0BACAC,kBACAC,oBACAjtB,MACA2b,WACAuR,aACAC,cACAC,kBACAC,qBACAC,mBACAC,kBACAC,gBACAC,uBACAC,kBACAC,cACAC,UACAC,KACAC,SACAC,aACAC,cACAC,eACAC,oBACArE,SACAsE,WACAC,QACAC,OACAC,UACAC,eACAC,aACAC,YACAC,aACAC,YACAC,kBACAC,SACAC,QACAC,eACAC,aACAC,iBACAC,kBAEA,WAAAp0C,CAAY1J,GACRuC,KAAKysB,UAAYhvB,EAAQgvB,UACzBzsB,KAAKvC,QAAUA,EAAQA,QACvBuC,KAAKb,MAAQ1B,EAAQ0B,MACrBa,KAAKg1C,KAAOv3C,EAAQ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\",\"sources\":[\"webpack://dplayer/webpack/universalModuleDefinition\",\"webpack://dplayer/./src/assets/comment.svg\",\"webpack://dplayer/./src/assets/airplay.svg\",\"webpack://dplayer/./src/assets/subtitle.svg\",\"webpack://dplayer/./src/assets/pause.svg\",\"webpack://dplayer/./node_modules/css-loader/dist/runtime/sourceMaps.js\",\"webpack://dplayer/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\",\"webpack://dplayer/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\",\"webpack://dplayer/./src/assets/left.svg\",\"webpack://dplayer/./node_modules/style-loader/dist/runtime/styleTagTransform.js\",\"webpack://dplayer/./node_modules/css-loader/dist/runtime/api.js\",\"webpack://dplayer/./src/assets/pallette.svg\",\"webpack://dplayer/./node_modules/art-template/lib/runtime.js\",\"webpack://dplayer/./node_modules/aribb24.js/dist/aribb24.js\",\"webpack://dplayer/./src/assets/comment-off.svg\",\"webpack://dplayer/./src/assets/backward.svg\",\"webpack://dplayer/./Users/hiram/Data/code/DPlayer/src/template/video.art\",\"webpack://dplayer/./src/assets/volume-off.svg\",\"webpack://dplayer/./src/assets/volume-up.svg\",\"webpack://dplayer/./src/assets/play.svg\",\"webpack://dplayer/./src/css/index.scss\",\"webpack://dplayer/./src/assets/loading.svg\",\"webpack://dplayer/./Users/hiram/Data/code/DPlayer/src/template/player.art\",\"webpack://dplayer/./src/assets/right.svg\",\"webpack://dplayer/./src/assets/send.svg\",\"webpack://dplayer/./src/assets/volume-down.svg\",\"webpack://dplayer/./node_modules/style-loader/dist/runtime/insertStyleElement.js\",\"webpack://dplayer/./src/assets/camera.svg\",\"webpack://dplayer/./src/assets/check.svg\",\"webpack://dplayer/./src/assets/pip.svg\",\"webpack://dplayer/./node_modules/style-loader/dist/runtime/insertBySelector.js\",\"webpack://dplayer/./src/assets/full.svg\",\"webpack://dplayer/./node_modules/style-loader/dist/runtime/styleDomAPI.js\",\"webpack://dplayer/./src/assets/forward.svg\",\"webpack://dplayer/./node_modules/art-template/lib/compile/runtime.js\",\"webpack://dplayer/./node_modules/balloon-css/balloon.css\",\"webpack://dplayer/./src/assets/setting.svg\",\"webpack://dplayer/./src/assets/full-web.svg\",\"webpack://dplayer/webpack/bootstrap\",\"webpack://dplayer/webpack/runtime/compat get default export\",\"webpack://dplayer/webpack/runtime/define property getters\",\"webpack://dplayer/webpack/runtime/global\",\"webpack://dplayer/webpack/runtime/hasOwnProperty shorthand\",\"webpack://dplayer/webpack/runtime/make namespace object\",\"webpack://dplayer/webpack/runtime/nonce\",\"webpack://dplayer/./src/css/index.scss?a858\",\"webpack://dplayer/./src/ts/utils.ts\",\"webpack://dplayer/./node_modules/axios/lib/helpers/bind.js\",\"webpack://dplayer/./node_modules/axios/lib/utils.js\",\"webpack://dplayer/./node_modules/axios/lib/core/AxiosError.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/toFormData.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/AxiosURLSearchParams.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/buildURL.js\",\"webpack://dplayer/./node_modules/axios/lib/core/InterceptorManager.js\",\"webpack://dplayer/./node_modules/axios/lib/defaults/transitional.js\",\"webpack://dplayer/./node_modules/axios/lib/platform/browser/index.js\",\"webpack://dplayer/./node_modules/axios/lib/platform/browser/classes/URLSearchParams.js\",\"webpack://dplayer/./node_modules/axios/lib/platform/browser/classes/FormData.js\",\"webpack://dplayer/./node_modules/axios/lib/platform/browser/classes/Blob.js\",\"webpack://dplayer/./node_modules/axios/lib/platform/common/utils.js\",\"webpack://dplayer/./node_modules/axios/lib/platform/index.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/formDataToJSON.js\",\"webpack://dplayer/./node_modules/axios/lib/defaults/index.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/toURLEncodedForm.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/parseHeaders.js\",\"webpack://dplayer/./node_modules/axios/lib/core/AxiosHeaders.js\",\"webpack://dplayer/./node_modules/axios/lib/core/transformData.js\",\"webpack://dplayer/./node_modules/axios/lib/cancel/isCancel.js\",\"webpack://dplayer/./node_modules/axios/lib/cancel/CanceledError.js\",\"webpack://dplayer/./node_modules/axios/lib/core/settle.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/speedometer.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/throttle.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/progressEventReducer.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/isURLSameOrigin.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/cookies.js\",\"webpack://dplayer/./node_modules/axios/lib/core/buildFullPath.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/isAbsoluteURL.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/combineURLs.js\",\"webpack://dplayer/./node_modules/axios/lib/core/mergeConfig.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/resolveConfig.js\",\"webpack://dplayer/./node_modules/axios/lib/adapters/xhr.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/parseProtocol.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/composeSignals.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/trackStream.js\",\"webpack://dplayer/./node_modules/axios/lib/adapters/fetch.js\",\"webpack://dplayer/./node_modules/axios/lib/adapters/adapters.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/null.js\",\"webpack://dplayer/./node_modules/axios/lib/core/dispatchRequest.js\",\"webpack://dplayer/./node_modules/axios/lib/env/data.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/validator.js\",\"webpack://dplayer/./node_modules/axios/lib/core/Axios.js\",\"webpack://dplayer/./node_modules/axios/lib/cancel/CancelToken.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/HttpStatusCode.js\",\"webpack://dplayer/./node_modules/axios/lib/axios.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/spread.js\",\"webpack://dplayer/./node_modules/axios/lib/helpers/isAxiosError.js\",\"webpack://dplayer/./src/ts/api.ts\",\"webpack://dplayer/./src/ts/i18n.ts\",\"webpack://dplayer/./src/ts/icons.ts\",\"webpack://dplayer/./src/ts/template.ts\",\"webpack://dplayer/./src/ts/danmaku.ts\",\"webpack://dplayer/./src/ts/events.ts\",\"webpack://dplayer/./src/ts/fullscreen.ts\",\"webpack://dplayer/./src/ts/user.ts\",\"webpack://dplayer/./src/ts/subtitle.ts\",\"webpack://dplayer/./src/ts/bar.ts\",\"webpack://dplayer/./src/ts/timer.ts\",\"webpack://dplayer/./src/ts/bezel.ts\",\"webpack://dplayer/./src/ts/thumbnails.ts\",\"webpack://dplayer/./src/ts/controller.ts\",\"webpack://dplayer/./src/ts/setting.ts\",\"webpack://dplayer/./src/ts/comment.ts\",\"webpack://dplayer/./src/ts/hotkey.ts\",\"webpack://dplayer/./src/ts/contextmenu.ts\",\"webpack://dplayer/./src/ts/info-panel.ts\",\"webpack://dplayer/./src/ts/player.ts\",\"webpack://dplayer/./src/ts/options.ts\",\"webpack://dplayer/./src/ts/index.ts\"],\"sourcesContent\":[\"(function webpackUniversalModuleDefinition(root, factory) {\\n\\tif(typeof exports === 'object' && typeof module === 'object')\\n\\t\\tmodule.exports = factory();\\n\\telse if(typeof define === 'function' && define.amd)\\n\\t\\tdefine(\\\"DPlayer\\\", [], factory);\\n\\telse if(typeof exports === 'object')\\n\\t\\texports[\\\"DPlayer\\\"] = factory();\\n\\telse\\n\\t\\troot[\\\"DPlayer\\\"] = factory();\\n})(globalThis, () => {\\nreturn \",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 32\\\\\\\"><path d=\\\\\\\"M27.128 0.38h-22.553c-2.336 0-4.229 1.825-4.229 4.076v16.273c0 2.251 1.893 4.076 4.229 4.076h4.229v-2.685h8.403l-8.784 8.072 1.566 1.44 7.429-6.827h9.71c2.335 0 4.229-1.825 4.229-4.076v-16.273c0-2.252-1.894-4.076-4.229-4.076zM28.538 19.403c0 1.5-1.262 2.717-2.819 2.717h-8.36l-0.076-0.070-0.076 0.070h-11.223c-1.557 0-2.819-1.217-2.819-2.717v-13.589c0-1.501 1.262-2.718 2.819-2.718h19.734c1.557 0 2.819-0.141 2.819 1.359v14.947zM9.206 10.557c-1.222 0-2.215 0.911-2.215 2.036s0.992 2.035 2.215 2.035c1.224 0 2.216-0.911 2.216-2.035s-0.992-2.036-2.216-2.036zM22.496 10.557c-1.224 0-2.215 0.911-2.215 2.036s0.991 2.035 2.215 2.035c1.224 0 2.215-0.911 2.215-2.035s-0.991-2.036-2.215-2.036zM15.852 10.557c-1.224 0-2.215 0.911-2.215 2.036s0.991 2.035 2.215 2.035c1.222 0 2.215-0.911 2.215-2.035s-0.992-2.036-2.215-2.036z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg viewBox=\\\\\\\"0 0 288 288\\\\\\\" xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\"><path d=\\\\\\\"M288 90v96c0 20-16 36-36 36h-10c-16 0-16-24 0-24h10c7 0 12-5 12-12V90c0-7-5-12-12-12H36c-7 0-12 5-12 12v96c0 7 5 12 12 12h10c16 0 16 24 0 24H36c-20 0-36-16-36-36V90c0-20 16-36 36-36h216c20 0 36 16 36 36zm-120 62l48 68c14 20 1 38-20 38H92c-21 0-34-18-20-38l48-68c13-18 35-18 48 0z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 32\\\\\\\"><path d=\\\\\\\"M26.667 5.333h-21.333c-0 0-0.001 0-0.001 0-1.472 0-2.666 1.194-2.666 2.666 0 0 0 0.001 0 0.001v-0 16c0 0 0 0.001 0 0.001 0 1.472 1.194 2.666 2.666 2.666 0 0 0.001 0 0.001 0h21.333c0 0 0.001 0 0.001 0 1.472 0 2.666-1.194 2.666-2.666 0-0 0-0.001 0-0.001v0-16c0-0 0-0.001 0-0.001 0-1.472-1.194-2.666-2.666-2.666-0 0-0.001 0-0.001 0h0zM5.333 16h5.333v2.667h-5.333v-2.667zM18.667 24h-13.333v-2.667h13.333v2.667zM26.667 24h-5.333v-2.667h5.333v2.667zM26.667 18.667h-13.333v-2.667h13.333v2.667z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 17 32\\\\\\\"><path d=\\\\\\\"M14.080 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048zM2.88 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048z\\\\\\\"></path></svg>\\\"\",\"\\\"use strict\\\";\\n\\nmodule.exports = function (item) {\\n  var content = item[1];\\n  var cssMapping = item[3];\\n  if (!cssMapping) {\\n    return content;\\n  }\\n  if (typeof btoa === \\\"function\\\") {\\n    var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\\n    var data = \\\"sourceMappingURL=data:application/json;charset=utf-8;base64,\\\".concat(base64);\\n    var sourceMapping = \\\"/*# \\\".concat(data, \\\" */\\\");\\n    return [content].concat([sourceMapping]).join(\\\"\\\\n\\\");\\n  }\\n  return [content].join(\\\"\\\\n\\\");\\n};\",\"\\\"use strict\\\";\\n\\n/* istanbul ignore next  */\\nfunction setAttributesWithoutAttributes(styleElement) {\\n  var nonce = typeof __webpack_nonce__ !== \\\"undefined\\\" ? __webpack_nonce__ : null;\\n  if (nonce) {\\n    styleElement.setAttribute(\\\"nonce\\\", nonce);\\n  }\\n}\\nmodule.exports = setAttributesWithoutAttributes;\",\"\\\"use strict\\\";\\n\\nvar stylesInDOM = [];\\nfunction getIndexByIdentifier(identifier) {\\n  var result = -1;\\n  for (var i = 0; i < stylesInDOM.length; i++) {\\n    if (stylesInDOM[i].identifier === identifier) {\\n      result = i;\\n      break;\\n    }\\n  }\\n  return result;\\n}\\nfunction modulesToDom(list, options) {\\n  var idCountMap = {};\\n  var identifiers = [];\\n  for (var i = 0; i < list.length; i++) {\\n    var item = list[i];\\n    var id = options.base ? item[0] + options.base : item[0];\\n    var count = idCountMap[id] || 0;\\n    var identifier = \\\"\\\".concat(id, \\\" \\\").concat(count);\\n    idCountMap[id] = count + 1;\\n    var indexByIdentifier = getIndexByIdentifier(identifier);\\n    var obj = {\\n      css: item[1],\\n      media: item[2],\\n      sourceMap: item[3],\\n      supports: item[4],\\n      layer: item[5]\\n    };\\n    if (indexByIdentifier !== -1) {\\n      stylesInDOM[indexByIdentifier].references++;\\n      stylesInDOM[indexByIdentifier].updater(obj);\\n    } else {\\n      var updater = addElementStyle(obj, options);\\n      options.byIndex = i;\\n      stylesInDOM.splice(i, 0, {\\n        identifier: identifier,\\n        updater: updater,\\n        references: 1\\n      });\\n    }\\n    identifiers.push(identifier);\\n  }\\n  return identifiers;\\n}\\nfunction addElementStyle(obj, options) {\\n  var api = options.domAPI(options);\\n  api.update(obj);\\n  var updater = function updater(newObj) {\\n    if (newObj) {\\n      if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\\n        return;\\n      }\\n      api.update(obj = newObj);\\n    } else {\\n      api.remove();\\n    }\\n  };\\n  return updater;\\n}\\nmodule.exports = function (list, options) {\\n  options = options || {};\\n  list = list || [];\\n  var lastIdentifiers = modulesToDom(list, options);\\n  return function update(newList) {\\n    newList = newList || [];\\n    for (var i = 0; i < lastIdentifiers.length; i++) {\\n      var identifier = lastIdentifiers[i];\\n      var index = getIndexByIdentifier(identifier);\\n      stylesInDOM[index].references--;\\n    }\\n    var newLastIdentifiers = modulesToDom(newList, options);\\n    for (var _i = 0; _i < lastIdentifiers.length; _i++) {\\n      var _identifier = lastIdentifiers[_i];\\n      var _index = getIndexByIdentifier(_identifier);\\n      if (stylesInDOM[_index].references === 0) {\\n        stylesInDOM[_index].updater();\\n        stylesInDOM.splice(_index, 1);\\n      }\\n    }\\n    lastIdentifiers = newLastIdentifiers;\\n  };\\n};\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 32\\\\\\\" style=\\\\\\\"transform: scale(-1,1)\\\\\\\"><path d=\\\\\\\"M22 16l-10.105-10.6-1.895 1.987 8.211 8.613-8.211 8.612 1.895 1.988 8.211-8.613z\\\\\\\"></path></svg>\\\"\",\"\\\"use strict\\\";\\n\\n/* istanbul ignore next  */\\nfunction styleTagTransform(css, styleElement) {\\n  if (styleElement.styleSheet) {\\n    styleElement.styleSheet.cssText = css;\\n  } else {\\n    while (styleElement.firstChild) {\\n      styleElement.removeChild(styleElement.firstChild);\\n    }\\n    styleElement.appendChild(document.createTextNode(css));\\n  }\\n}\\nmodule.exports = styleTagTransform;\",\"\\\"use strict\\\";\\n\\n/*\\n  MIT License http://www.opensource.org/licenses/mit-license.php\\n  Author Tobias Koppers @sokra\\n*/\\nmodule.exports = function (cssWithMappingToString) {\\n  var list = [];\\n\\n  // return the list of modules as css string\\n  list.toString = function toString() {\\n    return this.map(function (item) {\\n      var content = \\\"\\\";\\n      var needLayer = typeof item[5] !== \\\"undefined\\\";\\n      if (item[4]) {\\n        content += \\\"@supports (\\\".concat(item[4], \\\") {\\\");\\n      }\\n      if (item[2]) {\\n        content += \\\"@media \\\".concat(item[2], \\\" {\\\");\\n      }\\n      if (needLayer) {\\n        content += \\\"@layer\\\".concat(item[5].length > 0 ? \\\" \\\".concat(item[5]) : \\\"\\\", \\\" {\\\");\\n      }\\n      content += cssWithMappingToString(item);\\n      if (needLayer) {\\n        content += \\\"}\\\";\\n      }\\n      if (item[2]) {\\n        content += \\\"}\\\";\\n      }\\n      if (item[4]) {\\n        content += \\\"}\\\";\\n      }\\n      return content;\\n    }).join(\\\"\\\");\\n  };\\n\\n  // import a list of modules into the list\\n  list.i = function i(modules, media, dedupe, supports, layer) {\\n    if (typeof modules === \\\"string\\\") {\\n      modules = [[null, modules, undefined]];\\n    }\\n    var alreadyImportedModules = {};\\n    if (dedupe) {\\n      for (var k = 0; k < this.length; k++) {\\n        var id = this[k][0];\\n        if (id != null) {\\n          alreadyImportedModules[id] = true;\\n        }\\n      }\\n    }\\n    for (var _k = 0; _k < modules.length; _k++) {\\n      var item = [].concat(modules[_k]);\\n      if (dedupe && alreadyImportedModules[item[0]]) {\\n        continue;\\n      }\\n      if (typeof layer !== \\\"undefined\\\") {\\n        if (typeof item[5] === \\\"undefined\\\") {\\n          item[5] = layer;\\n        } else {\\n          item[1] = \\\"@layer\\\".concat(item[5].length > 0 ? \\\" \\\".concat(item[5]) : \\\"\\\", \\\" {\\\").concat(item[1], \\\"}\\\");\\n          item[5] = layer;\\n        }\\n      }\\n      if (media) {\\n        if (!item[2]) {\\n          item[2] = media;\\n        } else {\\n          item[1] = \\\"@media \\\".concat(item[2], \\\" {\\\").concat(item[1], \\\"}\\\");\\n          item[2] = media;\\n        }\\n      }\\n      if (supports) {\\n        if (!item[4]) {\\n          item[4] = \\\"\\\".concat(supports);\\n        } else {\\n          item[1] = \\\"@supports (\\\".concat(item[4], \\\") {\\\").concat(item[1], \\\"}\\\");\\n          item[4] = supports;\\n        }\\n      }\\n      list.push(item);\\n    }\\n  };\\n  return list;\\n};\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 32\\\\\\\"><path d=\\\\\\\"M19.357 2.88c1.749 0 3.366 0.316 4.851 0.946 1.485 0.632 2.768 1.474 3.845 2.533s1.922 2.279 2.532 3.661c0.611 1.383 0.915 2.829 0.915 4.334 0 1.425-0.304 2.847-0.915 4.271-0.611 1.425-1.587 2.767-2.928 4.028-0.855 0.813-1.811 1.607-2.869 2.38s-2.136 1.465-3.233 2.075c-1.099 0.61-2.198 1.098-3.296 1.465-1.098 0.366-2.115 0.549-3.051 0.549-1.343 0-2.441-0.438-3.296-1.311-0.854-0.876-1.281-2.41-1.281-4.608 0-0.366 0.020-0.773 0.060-1.221s0.062-0.895 0.062-1.343c0-0.773-0.183-1.353-0.55-1.738-0.366-0.387-0.793-0.58-1.281-0.58-0.652 0-1.21 0.295-1.678 0.886s-0.926 1.23-1.373 1.921c-0.447 0.693-0.905 1.334-1.372 1.923s-1.028 0.886-1.679 0.886c-0.529 0-1.048-0.427-1.556-1.282s-0.763-2.259-0.763-4.212c0-2.197 0.529-4.241 1.587-6.133s2.462-3.529 4.21-4.912c1.75-1.383 3.762-2.471 6.041-3.264 2.277-0.796 4.617-1.212 7.018-1.253zM7.334 15.817c0.569 0 1.047-0.204 1.434-0.611s0.579-0.875 0.579-1.404c0-0.569-0.193-1.047-0.579-1.434s-0.864-0.579-1.434-0.579c-0.529 0-0.987 0.193-1.373 0.579s-0.58 0.864-0.58 1.434c0 0.53 0.194 0.998 0.58 1.404 0.388 0.407 0.845 0.611 1.373 0.611zM12.216 11.79c0.691 0 1.292-0.254 1.8-0.763s0.762-1.107 0.762-1.8c0-0.732-0.255-1.343-0.762-1.831-0.509-0.489-1.109-0.732-1.8-0.732-0.732 0-1.342 0.244-1.831 0.732-0.488 0.488-0.732 1.098-0.732 1.831 0 0.693 0.244 1.292 0.732 1.8s1.099 0.763 1.831 0.763zM16.366 25.947c0.692 0 1.282-0.214 1.77-0.64s0.732-0.987 0.732-1.678-0.244-1.261-0.732-1.709c-0.489-0.448-1.078-0.671-1.77-0.671-0.65 0-1.21 0.223-1.678 0.671s-0.702 1.018-0.702 1.709c0 0.692 0.234 1.25 0.702 1.678s1.027 0.64 1.678 0.64zM19.113 9.592c0.651 0 1.129-0.203 1.433-0.611 0.305-0.406 0.459-0.874 0.459-1.404 0-0.488-0.154-0.947-0.459-1.373-0.304-0.427-0.782-0.641-1.433-0.641-0.529 0-1.008 0.193-1.434 0.58s-0.64 0.865-0.64 1.434c0 0.571 0.213 1.049 0.64 1.434 0.427 0.389 0.905 0.581 1.434 0.581zM24.848 12.826c0.57 0 1.067-0.213 1.495-0.64 0.427-0.427 0.64-0.947 0.64-1.556 0-0.57-0.214-1.068-0.64-1.495-0.428-0.427-0.927-0.64-1.495-0.64-0.611 0-1.129 0.213-1.555 0.64-0.428 0.427-0.642 0.926-0.642 1.495 0 0.611 0.213 1.129 0.642 1.556s0.947 0.64 1.555 0.64z\\\\\\\"></path></svg>\\\"\",\"'use strict';\\n\\nmodule.exports = require('./compile/runtime');\",\"!function(t,e){\\\"object\\\"==typeof exports&&\\\"object\\\"==typeof module?module.exports=e():\\\"function\\\"==typeof define&&define.amd?define([],e):\\\"object\\\"==typeof exports?exports.aribb24js=e():t.aribb24js=e()}(this,(function(){return function(){\\\"use strict\\\";var t={9306:function(t,e,i){var r=i(4901),n=i(6823),s=TypeError;t.exports=function(t){if(r(t))return t;throw new s(n(t)+\\\" is not a function\\\")}},5548:function(t,e,i){var r=i(3517),n=i(6823),s=TypeError;t.exports=function(t){if(r(t))return t;throw new s(n(t)+\\\" is not a constructor\\\")}},3506:function(t,e,i){var r=i(3925),n=String,s=TypeError;t.exports=function(t){if(r(t))return t;throw new s(\\\"Can't set \\\"+n(t)+\\\" as a prototype\\\")}},6469:function(t,e,i){var r=i(8227),n=i(2360),s=i(4913).f,a=r(\\\"unscopables\\\"),o=Array.prototype;void 0===o[a]&&s(o,a,{configurable:!0,value:n(null)}),t.exports=function(t){o[a][t]=!0}},7829:function(t,e,i){var r=i(8183).charAt;t.exports=function(t,e,i){return e+(i?r(t,e).length:1)}},679:function(t,e,i){var r=i(1625),n=TypeError;t.exports=function(t,e){if(r(e,t))return t;throw new n(\\\"Incorrect invocation\\\")}},8551:function(t,e,i){var r=i(34),n=String,s=TypeError;t.exports=function(t){if(r(t))return t;throw new s(n(t)+\\\" is not an object\\\")}},7811:function(t){t.exports=\\\"undefined\\\"!=typeof ArrayBuffer&&\\\"undefined\\\"!=typeof DataView},5652:function(t,e,i){var r=i(9039);t.exports=r((function(){if(\\\"function\\\"==typeof ArrayBuffer){var t=new ArrayBuffer(8);Object.isExtensible(t)&&Object.defineProperty(t,\\\"a\\\",{value:8})}}))},4644:function(t,e,i){var r,n,s,a=i(7811),o=i(3724),h=i(4576),c=i(4901),u=i(34),l=i(9297),f=i(6955),d=i(6823),p=i(6699),v=i(6840),b=i(2106),g=i(1625),y=i(2787),m=i(2967),_=i(8227),w=i(3392),x=i(1181),A=x.enforce,C=x.get,T=h.Int8Array,k=T&&T.prototype,F=h.Uint8ClampedArray,S=F&&F.prototype,R=T&&y(T),I=k&&y(k),E=Object.prototype,O=h.TypeError,M=_(\\\"toStringTag\\\"),G=w(\\\"TYPED_ARRAY_TAG\\\"),B=\\\"TypedArrayConstructor\\\",P=a&&!!m&&\\\"Opera\\\"!==f(h.opera),D=!1,j={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},L={BigInt64Array:8,BigUint64Array:8},N=function(t){var e=y(t);if(u(e)){var i=C(e);return i&&l(i,B)?i[B]:N(e)}},U=function(t){if(!u(t))return!1;var e=f(t);return l(j,e)||l(L,e)};for(r in j)(s=(n=h[r])&&n.prototype)?A(s)[B]=n:P=!1;for(r in L)(s=(n=h[r])&&n.prototype)&&(A(s)[B]=n);if((!P||!c(R)||R===Function.prototype)&&(R=function(){throw new O(\\\"Incorrect invocation\\\")},P))for(r in j)h[r]&&m(h[r],R);if((!P||!I||I===E)&&(I=R.prototype,P))for(r in j)h[r]&&m(h[r].prototype,I);if(P&&y(S)!==I&&m(S,I),o&&!l(I,M))for(r in D=!0,b(I,M,{configurable:!0,get:function(){return u(this)?this[G]:void 0}}),j)h[r]&&p(h[r],G,r);t.exports={NATIVE_ARRAY_BUFFER_VIEWS:P,TYPED_ARRAY_TAG:D&&G,aTypedArray:function(t){if(U(t))return t;throw new O(\\\"Target is not a typed array\\\")},aTypedArrayConstructor:function(t){if(c(t)&&(!m||g(R,t)))return t;throw new O(d(t)+\\\" is not a typed array constructor\\\")},exportTypedArrayMethod:function(t,e,i,r){if(o){if(i)for(var n in j){var s=h[n];if(s&&l(s.prototype,t))try{delete s.prototype[t]}catch(i){try{s.prototype[t]=e}catch(t){}}}I[t]&&!i||v(I,t,i?e:P&&k[t]||e,r)}},exportTypedArrayStaticMethod:function(t,e,i){var r,n;if(o){if(m){if(i)for(r in j)if((n=h[r])&&l(n,t))try{delete n[t]}catch(t){}if(R[t]&&!i)return;try{return v(R,t,i?e:P&&R[t]||e)}catch(t){}}for(r in j)!(n=h[r])||n[t]&&!i||v(n,t,e)}},getTypedArrayConstructor:N,isView:function(t){if(!u(t))return!1;var e=f(t);return\\\"DataView\\\"===e||l(j,e)||l(L,e)},isTypedArray:U,TypedArray:R,TypedArrayPrototype:I}},6346:function(t,e,i){var r=i(4576),n=i(9504),s=i(3724),a=i(7811),o=i(350),h=i(6699),c=i(2106),u=i(6279),l=i(9039),f=i(679),d=i(1291),p=i(8014),v=i(7696),b=i(5617),g=i(8490),y=i(2787),m=i(2967),_=i(4373),w=i(7680),x=i(3167),A=i(7740),C=i(687),T=i(1181),k=o.PROPER,F=o.CONFIGURABLE,S=\\\"ArrayBuffer\\\",R=\\\"DataView\\\",I=\\\"prototype\\\",E=\\\"Wrong index\\\",O=T.getterFor(S),M=T.getterFor(R),G=T.set,B=r[S],P=B,D=P&&P[I],j=r[R],L=j&&j[I],N=Object.prototype,U=r.Array,z=r.RangeError,H=n(_),X=n([].reverse),K=g.pack,V=g.unpack,$=function(t){return[255&t]},W=function(t){return[255&t,t>>8&255]},Y=function(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]},J=function(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]},Z=function(t){return K(b(t),23,4)},q=function(t){return K(t,52,8)},Q=function(t,e,i){c(t[I],e,{configurable:!0,get:function(){return i(this)[e]}})},tt=function(t,e,i,r){var n=M(t),s=v(i),a=!!r;if(s+e>n.byteLength)throw new z(E);var o=n.bytes,h=s+n.byteOffset,c=w(o,h,h+e);return a?c:X(c)},et=function(t,e,i,r,n,s){var a=M(t),o=v(i),h=r(+n),c=!!s;if(o+e>a.byteLength)throw new z(E);for(var u=a.bytes,l=o+a.byteOffset,f=0;f<e;f++)u[l+f]=h[c?f:e-f-1]};if(a){var it=k&&B.name!==S;l((function(){B(1)}))&&l((function(){new B(-1)}))&&!l((function(){return new B,new B(1.5),new B(NaN),1!==B.length||it&&!F}))?it&&F&&h(B,\\\"name\\\",S):((P=function(t){return f(this,D),x(new B(v(t)),this,P)})[I]=D,D.constructor=P,A(P,B)),m&&y(L)!==N&&m(L,N);var rt=new j(new P(2)),nt=n(L.setInt8);rt.setInt8(0,2147483648),rt.setInt8(1,2147483649),!rt.getInt8(0)&&rt.getInt8(1)||u(L,{setInt8:function(t,e){nt(this,t,e<<24>>24)},setUint8:function(t,e){nt(this,t,e<<24>>24)}},{unsafe:!0})}else D=(P=function(t){f(this,D);var e=v(t);G(this,{type:S,bytes:H(U(e),0),byteLength:e}),s||(this.byteLength=e,this.detached=!1)})[I],L=(j=function(t,e,i){f(this,L),f(t,D);var r=O(t),n=r.byteLength,a=d(e);if(a<0||a>n)throw new z(\\\"Wrong offset\\\");if(a+(i=void 0===i?n-a:p(i))>n)throw new z(\\\"Wrong length\\\");G(this,{type:R,buffer:t,byteLength:i,byteOffset:a,bytes:r.bytes}),s||(this.buffer=t,this.byteLength=i,this.byteOffset=a)})[I],s&&(Q(P,\\\"byteLength\\\",O),Q(j,\\\"buffer\\\",M),Q(j,\\\"byteLength\\\",M),Q(j,\\\"byteOffset\\\",M)),u(L,{getInt8:function(t){return tt(this,1,t)[0]<<24>>24},getUint8:function(t){return tt(this,1,t)[0]},getInt16:function(t){var e=tt(this,2,t,arguments.length>1&&arguments[1]);return(e[1]<<8|e[0])<<16>>16},getUint16:function(t){var e=tt(this,2,t,arguments.length>1&&arguments[1]);return e[1]<<8|e[0]},getInt32:function(t){return J(tt(this,4,t,arguments.length>1&&arguments[1]))},getUint32:function(t){return J(tt(this,4,t,arguments.length>1&&arguments[1]))>>>0},getFloat32:function(t){return V(tt(this,4,t,arguments.length>1&&arguments[1]),23)},getFloat64:function(t){return V(tt(this,8,t,arguments.length>1&&arguments[1]),52)},setInt8:function(t,e){et(this,1,t,$,e)},setUint8:function(t,e){et(this,1,t,$,e)},setInt16:function(t,e){et(this,2,t,W,e,arguments.length>2&&arguments[2])},setUint16:function(t,e){et(this,2,t,W,e,arguments.length>2&&arguments[2])},setInt32:function(t,e){et(this,4,t,Y,e,arguments.length>2&&arguments[2])},setUint32:function(t,e){et(this,4,t,Y,e,arguments.length>2&&arguments[2])},setFloat32:function(t,e){et(this,4,t,Z,e,arguments.length>2&&arguments[2])},setFloat64:function(t,e){et(this,8,t,q,e,arguments.length>2&&arguments[2])}});C(P,S),C(j,R),t.exports={ArrayBuffer:P,DataView:j}},7029:function(t,e,i){var r=i(8981),n=i(5610),s=i(6198),a=i(4606),o=Math.min;t.exports=[].copyWithin||function(t,e){var i=r(this),h=s(i),c=n(t,h),u=n(e,h),l=arguments.length>2?arguments[2]:void 0,f=o((void 0===l?h:n(l,h))-u,h-c),d=1;for(u<c&&c<u+f&&(d=-1,u+=f-1,c+=f-1);f-- >0;)u in i?i[c]=i[u]:a(i,c),c+=d,u+=d;return i}},4373:function(t,e,i){var r=i(8981),n=i(5610),s=i(6198);t.exports=function(t){for(var e=r(this),i=s(e),a=arguments.length,o=n(a>1?arguments[1]:void 0,i),h=a>2?arguments[2]:void 0,c=void 0===h?i:n(h,i);c>o;)e[o++]=t;return e}},235:function(t,e,i){var r=i(9213).forEach,n=i(4598)(\\\"forEach\\\");t.exports=n?[].forEach:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}},5370:function(t,e,i){var r=i(6198);t.exports=function(t,e,i){for(var n=0,s=arguments.length>2?i:r(e),a=new t(s);s>n;)a[n]=e[n++];return a}},7916:function(t,e,i){var r=i(6080),n=i(9565),s=i(8981),a=i(6319),o=i(4209),h=i(3517),c=i(6198),u=i(4659),l=i(81),f=i(851),d=Array;t.exports=function(t){var e=s(t),i=h(this),p=arguments.length,v=p>1?arguments[1]:void 0,b=void 0!==v;b&&(v=r(v,p>2?arguments[2]:void 0));var g,y,m,_,w,x,A=f(e),C=0;if(!A||this===d&&o(A))for(g=c(e),y=i?new this(g):d(g);g>C;C++)x=b?v(e[C],C):e[C],u(y,C,x);else for(y=i?new this:[],w=(_=l(e,A)).next;!(m=n(w,_)).done;C++)x=b?a(_,v,[m.value,C],!0):m.value,u(y,C,x);return y.length=C,y}},9617:function(t,e,i){var r=i(5397),n=i(5610),s=i(6198),a=function(t){return function(e,i,a){var o=r(e),h=s(o);if(0===h)return!t&&-1;var c,u=n(a,h);if(t&&i!=i){for(;h>u;)if((c=o[u++])!=c)return!0}else for(;h>u;u++)if((t||u in o)&&o[u]===i)return t||u||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},9213:function(t,e,i){var r=i(6080),n=i(9504),s=i(7055),a=i(8981),o=i(6198),h=i(1469),c=n([].push),u=function(t){var e=1===t,i=2===t,n=3===t,u=4===t,l=6===t,f=7===t,d=5===t||l;return function(p,v,b,g){for(var y,m,_=a(p),w=s(_),x=o(w),A=r(v,b),C=0,T=g||h,k=e?T(p,x):i||f?T(p,0):void 0;x>C;C++)if((d||C in w)&&(m=A(y=w[C],C,_),t))if(e)k[C]=m;else if(m)switch(t){case 3:return!0;case 5:return y;case 6:return C;case 2:c(k,y)}else switch(t){case 4:return!1;case 7:c(k,y)}return l?-1:n||u?u:k}};t.exports={forEach:u(0),map:u(1),filter:u(2),some:u(3),every:u(4),find:u(5),findIndex:u(6),filterReject:u(7)}},8379:function(t,e,i){var r=i(8745),n=i(5397),s=i(1291),a=i(6198),o=i(4598),h=Math.min,c=[].lastIndexOf,u=!!c&&1/[1].lastIndexOf(1,-0)<0,l=o(\\\"lastIndexOf\\\"),f=u||!l;t.exports=f?function(t){if(u)return r(c,this,arguments)||0;var e=n(this),i=a(e);if(0===i)return-1;var o=i-1;for(arguments.length>1&&(o=h(o,s(arguments[1]))),o<0&&(o=i+o);o>=0;o--)if(o in e&&e[o]===t)return o||0;return-1}:c},597:function(t,e,i){var r=i(9039),n=i(8227),s=i(9519),a=n(\\\"species\\\");t.exports=function(t){return s>=51||!r((function(){var e=[];return(e.constructor={})[a]=function(){return{foo:1}},1!==e[t](Boolean).foo}))}},4598:function(t,e,i){var r=i(9039);t.exports=function(t,e){var i=[][t];return!!i&&r((function(){i.call(null,e||function(){return 1},1)}))}},926:function(t,e,i){var r=i(9306),n=i(8981),s=i(7055),a=i(6198),o=TypeError,h=\\\"Reduce of empty array with no initial value\\\",c=function(t){return function(e,i,c,u){var l=n(e),f=s(l),d=a(l);if(r(i),0===d&&c<2)throw new o(h);var p=t?d-1:0,v=t?-1:1;if(c<2)for(;;){if(p in f){u=f[p],p+=v;break}if(p+=v,t?p<0:d<=p)throw new o(h)}for(;t?p>=0:d>p;p+=v)p in f&&(u=i(u,f[p],p,l));return u}};t.exports={left:c(!1),right:c(!0)}},4527:function(t,e,i){var r=i(3724),n=i(4376),s=TypeError,a=Object.getOwnPropertyDescriptor,o=r&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],\\\"length\\\",{writable:!1}).length=1}catch(t){return t instanceof TypeError}}();t.exports=o?function(t,e){if(n(t)&&!a(t,\\\"length\\\").writable)throw new s(\\\"Cannot set read only .length\\\");return t.length=e}:function(t,e){return t.length=e}},7680:function(t,e,i){var r=i(9504);t.exports=r([].slice)},4488:function(t,e,i){var r=i(7680),n=Math.floor,s=function(t,e){var i=t.length;if(i<8)for(var a,o,h=1;h<i;){for(o=h,a=t[h];o&&e(t[o-1],a)>0;)t[o]=t[--o];o!==h++&&(t[o]=a)}else for(var c=n(i/2),u=s(r(t,0,c),e),l=s(r(t,c),e),f=u.length,d=l.length,p=0,v=0;p<f||v<d;)t[p+v]=p<f&&v<d?e(u[p],l[v])<=0?u[p++]:l[v++]:p<f?u[p++]:l[v++];return t};t.exports=s},7433:function(t,e,i){var r=i(4376),n=i(3517),s=i(34),a=i(8227)(\\\"species\\\"),o=Array;t.exports=function(t){var e;return r(t)&&(e=t.constructor,(n(e)&&(e===o||r(e.prototype))||s(e)&&null===(e=e[a]))&&(e=void 0)),void 0===e?o:e}},1469:function(t,e,i){var r=i(7433);t.exports=function(t,e){return new(r(t))(0===e?0:e)}},6319:function(t,e,i){var r=i(8551),n=i(1920);t.exports=function(t,e,i,s){try{return s?e(r(i)[0],i[1]):e(i)}catch(e){n(t,\\\"throw\\\",e)}}},4428:function(t,e,i){var r=i(8227)(\\\"iterator\\\"),n=!1;try{var s=0,a={next:function(){return{done:!!s++}},return:function(){n=!0}};a[r]=function(){return this},Array.from(a,(function(){throw 2}))}catch(t){}t.exports=function(t,e){try{if(!e&&!n)return!1}catch(t){return!1}var i=!1;try{var s={};s[r]=function(){return{next:function(){return{done:i=!0}}}},t(s)}catch(t){}return i}},2195:function(t,e,i){var r=i(9504),n=r({}.toString),s=r(\\\"\\\".slice);t.exports=function(t){return s(n(t),8,-1)}},6955:function(t,e,i){var r=i(2140),n=i(4901),s=i(2195),a=i(8227)(\\\"toStringTag\\\"),o=Object,h=\\\"Arguments\\\"===s(function(){return arguments}());t.exports=r?s:function(t){var e,i,r;return void 0===t?\\\"Undefined\\\":null===t?\\\"Null\\\":\\\"string\\\"==typeof(i=function(t,e){try{return t[e]}catch(t){}}(e=o(t),a))?i:h?s(e):\\\"Object\\\"===(r=s(e))&&n(e.callee)?\\\"Arguments\\\":r}},6938:function(t,e,i){var r=i(2360),n=i(2106),s=i(6279),a=i(6080),o=i(679),h=i(4117),c=i(2652),u=i(1088),l=i(2529),f=i(7633),d=i(3724),p=i(3451).fastKey,v=i(1181),b=v.set,g=v.getterFor;t.exports={getConstructor:function(t,e,i,u){var l=t((function(t,n){o(t,f),b(t,{type:e,index:r(null),first:null,last:null,size:0}),d||(t.size=0),h(n)||c(n,t[u],{that:t,AS_ENTRIES:i})})),f=l.prototype,v=g(e),y=function(t,e,i){var r,n,s=v(t),a=m(t,e);return a?a.value=i:(s.last=a={index:n=p(e,!0),key:e,value:i,previous:r=s.last,next:null,removed:!1},s.first||(s.first=a),r&&(r.next=a),d?s.size++:t.size++,\\\"F\\\"!==n&&(s.index[n]=a)),t},m=function(t,e){var i,r=v(t),n=p(e);if(\\\"F\\\"!==n)return r.index[n];for(i=r.first;i;i=i.next)if(i.key===e)return i};return s(f,{clear:function(){for(var t=v(this),e=t.first;e;)e.removed=!0,e.previous&&(e.previous=e.previous.next=null),e=e.next;t.first=t.last=null,t.index=r(null),d?t.size=0:this.size=0},delete:function(t){var e=this,i=v(e),r=m(e,t);if(r){var n=r.next,s=r.previous;delete i.index[r.index],r.removed=!0,s&&(s.next=n),n&&(n.previous=s),i.first===r&&(i.first=n),i.last===r&&(i.last=s),d?i.size--:e.size--}return!!r},forEach:function(t){for(var e,i=v(this),r=a(t,arguments.length>1?arguments[1]:void 0);e=e?e.next:i.first;)for(r(e.value,e.key,this);e&&e.removed;)e=e.previous},has:function(t){return!!m(this,t)}}),s(f,i?{get:function(t){var e=m(this,t);return e&&e.value},set:function(t,e){return y(this,0===t?0:t,e)}}:{add:function(t){return y(this,t=0===t?0:t,t)}}),d&&n(f,\\\"size\\\",{configurable:!0,get:function(){return v(this).size}}),l},setStrong:function(t,e,i){var r=e+\\\" Iterator\\\",n=g(e),s=g(r);u(t,e,(function(t,e){b(this,{type:r,target:t,state:n(t),kind:e,last:null})}),(function(){for(var t=s(this),e=t.kind,i=t.last;i&&i.removed;)i=i.previous;return t.target&&(t.last=i=i?i.next:t.state.first)?l(\\\"keys\\\"===e?i.key:\\\"values\\\"===e?i.value:[i.key,i.value],!1):(t.target=null,l(void 0,!0))}),i?\\\"entries\\\":\\\"values\\\",!i,!0),f(e)}}},6468:function(t,e,i){var r=i(6518),n=i(4576),s=i(9504),a=i(2796),o=i(6840),h=i(3451),c=i(2652),u=i(679),l=i(4901),f=i(4117),d=i(34),p=i(9039),v=i(4428),b=i(687),g=i(3167);t.exports=function(t,e,i){var y=-1!==t.indexOf(\\\"Map\\\"),m=-1!==t.indexOf(\\\"Weak\\\"),_=y?\\\"set\\\":\\\"add\\\",w=n[t],x=w&&w.prototype,A=w,C={},T=function(t){var e=s(x[t]);o(x,t,\\\"add\\\"===t?function(t){return e(this,0===t?0:t),this}:\\\"delete\\\"===t?function(t){return!(m&&!d(t))&&e(this,0===t?0:t)}:\\\"get\\\"===t?function(t){return m&&!d(t)?void 0:e(this,0===t?0:t)}:\\\"has\\\"===t?function(t){return!(m&&!d(t))&&e(this,0===t?0:t)}:function(t,i){return e(this,0===t?0:t,i),this})};if(a(t,!l(w)||!(m||x.forEach&&!p((function(){(new w).entries().next()})))))A=i.getConstructor(e,t,y,_),h.enable();else if(a(t,!0)){var k=new A,F=k[_](m?{}:-0,1)!==k,S=p((function(){k.has(1)})),R=v((function(t){new w(t)})),I=!m&&p((function(){for(var t=new w,e=5;e--;)t[_](e,e);return!t.has(-0)}));R||((A=e((function(t,e){u(t,x);var i=g(new w,t,A);return f(e)||c(e,i[_],{that:i,AS_ENTRIES:y}),i}))).prototype=x,x.constructor=A),(S||I)&&(T(\\\"delete\\\"),T(\\\"has\\\"),y&&T(\\\"get\\\")),(I||F)&&T(_),m&&x.clear&&delete x.clear}return C[t]=A,r({global:!0,constructor:!0,forced:A!==w},C),b(A,t),m||i.setStrong(A,t,y),A}},7740:function(t,e,i){var r=i(9297),n=i(5031),s=i(7347),a=i(4913);t.exports=function(t,e,i){for(var o=n(e),h=a.f,c=s.f,u=0;u<o.length;u++){var l=o[u];r(t,l)||i&&r(i,l)||h(t,l,c(e,l))}}},1436:function(t,e,i){var r=i(8227)(\\\"match\\\");t.exports=function(t){var e=/./;try{\\\"/./\\\"[t](e)}catch(i){try{return e[r]=!1,\\\"/./\\\"[t](e)}catch(t){}}return!1}},2211:function(t,e,i){var r=i(9039);t.exports=!r((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}))},2529:function(t){t.exports=function(t,e){return{value:t,done:e}}},6699:function(t,e,i){var r=i(3724),n=i(4913),s=i(6980);t.exports=r?function(t,e,i){return n.f(t,e,s(1,i))}:function(t,e,i){return t[e]=i,t}},6980:function(t){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},4659:function(t,e,i){var r=i(3724),n=i(4913),s=i(6980);t.exports=function(t,e,i){r?n.f(t,e,s(0,i)):t[e]=i}},3640:function(t,e,i){var r=i(8551),n=i(4270),s=TypeError;t.exports=function(t){if(r(this),\\\"string\\\"===t||\\\"default\\\"===t)t=\\\"string\\\";else if(\\\"number\\\"!==t)throw new s(\\\"Incorrect hint\\\");return n(this,t)}},2106:function(t,e,i){var r=i(283),n=i(4913);t.exports=function(t,e,i){return i.get&&r(i.get,e,{getter:!0}),i.set&&r(i.set,e,{setter:!0}),n.f(t,e,i)}},6840:function(t,e,i){var r=i(4901),n=i(4913),s=i(283),a=i(9433);t.exports=function(t,e,i,o){o||(o={});var h=o.enumerable,c=void 0!==o.name?o.name:e;if(r(i)&&s(i,c,o),o.global)h?t[e]=i:a(e,i);else{try{o.unsafe?t[e]&&(h=!0):delete t[e]}catch(t){}h?t[e]=i:n.f(t,e,{value:i,enumerable:!1,configurable:!o.nonConfigurable,writable:!o.nonWritable})}return t}},6279:function(t,e,i){var r=i(6840);t.exports=function(t,e,i){for(var n in e)r(t,n,e[n],i);return t}},9433:function(t,e,i){var r=i(4576),n=Object.defineProperty;t.exports=function(t,e){try{n(r,t,{value:e,configurable:!0,writable:!0})}catch(i){r[t]=e}return e}},4606:function(t,e,i){var r=i(6823),n=TypeError;t.exports=function(t,e){if(!delete t[e])throw new n(\\\"Cannot delete property \\\"+r(e)+\\\" of \\\"+r(t))}},3724:function(t,e,i){var r=i(9039);t.exports=!r((function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]}))},4055:function(t,e,i){var r=i(4576),n=i(34),s=r.document,a=n(s)&&n(s.createElement);t.exports=function(t){return a?s.createElement(t):{}}},6837:function(t){var e=TypeError;t.exports=function(t){if(t>9007199254740991)throw e(\\\"Maximum allowed index exceeded\\\");return t}},7400:function(t){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},9296:function(t,e,i){var r=i(4055)(\\\"span\\\").classList,n=r&&r.constructor&&r.constructor.prototype;t.exports=n===Object.prototype?void 0:n},8727:function(t){t.exports=[\\\"constructor\\\",\\\"hasOwnProperty\\\",\\\"isPrototypeOf\\\",\\\"propertyIsEnumerable\\\",\\\"toLocaleString\\\",\\\"toString\\\",\\\"valueOf\\\"]},3709:function(t,e,i){var r=i(2839).match(/firefox\\\\/(\\\\d+)/i);t.exports=!!r&&+r[1]},3763:function(t,e,i){var r=i(2839);t.exports=/MSIE|Trident/.test(r)},2839:function(t,e,i){var r=i(4576).navigator,n=r&&r.userAgent;t.exports=n?String(n):\\\"\\\"},9519:function(t,e,i){var r,n,s=i(4576),a=i(2839),o=s.process,h=s.Deno,c=o&&o.versions||h&&h.version,u=c&&c.v8;u&&(n=(r=u.split(\\\".\\\"))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!n&&a&&(!(r=a.match(/Edge\\\\/(\\\\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\\\\/(\\\\d+)/))&&(n=+r[1]),t.exports=n},3607:function(t,e,i){var r=i(2839).match(/AppleWebKit\\\\/(\\\\d+)\\\\./);t.exports=!!r&&+r[1]},6518:function(t,e,i){var r=i(4576),n=i(7347).f,s=i(6699),a=i(6840),o=i(9433),h=i(7740),c=i(2796);t.exports=function(t,e){var i,u,l,f,d,p=t.target,v=t.global,b=t.stat;if(i=v?r:b?r[p]||o(p,{}):r[p]&&r[p].prototype)for(u in e){if(f=e[u],l=t.dontCallGetSet?(d=n(i,u))&&d.value:i[u],!c(v?u:p+(b?\\\".\\\":\\\"#\\\")+u,t.forced)&&void 0!==l){if(typeof f==typeof l)continue;h(f,l)}(t.sham||l&&l.sham)&&s(f,\\\"sham\\\",!0),a(i,u,f,t)}}},9039:function(t){t.exports=function(t){try{return!!t()}catch(t){return!0}}},9228:function(t,e,i){i(7495);var r=i(9565),n=i(6840),s=i(7323),a=i(9039),o=i(8227),h=i(6699),c=o(\\\"species\\\"),u=RegExp.prototype;t.exports=function(t,e,i,l){var f=o(t),d=!a((function(){var e={};return e[f]=function(){return 7},7!==\\\"\\\"[t](e)})),p=d&&!a((function(){var e=!1,i=/a/;return\\\"split\\\"===t&&((i={}).constructor={},i.constructor[c]=function(){return i},i.flags=\\\"\\\",i[f]=/./[f]),i.exec=function(){return e=!0,null},i[f](\\\"\\\"),!e}));if(!d||!p||i){var v=/./[f],b=e(f,\\\"\\\"[t],(function(t,e,i,n,a){var o=e.exec;return o===s||o===u.exec?d&&!a?{done:!0,value:r(v,e,i,n)}:{done:!0,value:r(t,i,e,n)}:{done:!1}}));n(String.prototype,t,b[0]),n(u,f,b[1])}l&&h(u[f],\\\"sham\\\",!0)}},2744:function(t,e,i){var r=i(9039);t.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},8745:function(t,e,i){var r=i(616),n=Function.prototype,s=n.apply,a=n.call;t.exports=\\\"object\\\"==typeof Reflect&&Reflect.apply||(r?a.bind(s):function(){return a.apply(s,arguments)})},6080:function(t,e,i){var r=i(7476),n=i(9306),s=i(616),a=r(r.bind);t.exports=function(t,e){return n(t),void 0===e?t:s?a(t,e):function(){return t.apply(e,arguments)}}},616:function(t,e,i){var r=i(9039);t.exports=!r((function(){var t=function(){}.bind();return\\\"function\\\"!=typeof t||t.hasOwnProperty(\\\"prototype\\\")}))},566:function(t,e,i){var r=i(9504),n=i(9306),s=i(34),a=i(9297),o=i(7680),h=i(616),c=Function,u=r([].concat),l=r([].join),f={};t.exports=h?c.bind:function(t){var e=n(this),i=e.prototype,r=o(arguments,1),h=function(){var i=u(r,o(arguments));return this instanceof h?function(t,e,i){if(!a(f,e)){for(var r=[],n=0;n<e;n++)r[n]=\\\"a[\\\"+n+\\\"]\\\";f[e]=c(\\\"C,a\\\",\\\"return new C(\\\"+l(r,\\\",\\\")+\\\")\\\")}return f[e](t,i)}(e,i.length,i):e.apply(t,i)};return s(i)&&(h.prototype=i),h}},9565:function(t,e,i){var r=i(616),n=Function.prototype.call;t.exports=r?n.bind(n):function(){return n.apply(n,arguments)}},350:function(t,e,i){var r=i(3724),n=i(9297),s=Function.prototype,a=r&&Object.getOwnPropertyDescriptor,o=n(s,\\\"name\\\"),h=o&&\\\"something\\\"===function(){}.name,c=o&&(!r||r&&a(s,\\\"name\\\").configurable);t.exports={EXISTS:o,PROPER:h,CONFIGURABLE:c}},6706:function(t,e,i){var r=i(9504),n=i(9306);t.exports=function(t,e,i){try{return r(n(Object.getOwnPropertyDescriptor(t,e)[i]))}catch(t){}}},7476:function(t,e,i){var r=i(2195),n=i(9504);t.exports=function(t){if(\\\"Function\\\"===r(t))return n(t)}},9504:function(t,e,i){var r=i(616),n=Function.prototype,s=n.call,a=r&&n.bind.bind(s,s);t.exports=r?a:function(t){return function(){return s.apply(t,arguments)}}},7751:function(t,e,i){var r=i(4576),n=i(4901);t.exports=function(t,e){return arguments.length<2?(i=r[t],n(i)?i:void 0):r[t]&&r[t][e];var i}},851:function(t,e,i){var r=i(6955),n=i(5966),s=i(4117),a=i(6269),o=i(8227)(\\\"iterator\\\");t.exports=function(t){if(!s(t))return n(t,o)||n(t,\\\"@@iterator\\\")||a[r(t)]}},81:function(t,e,i){var r=i(9565),n=i(9306),s=i(8551),a=i(6823),o=i(851),h=TypeError;t.exports=function(t,e){var i=arguments.length<2?o(t):e;if(n(i))return s(r(i,t));throw new h(a(t)+\\\" is not iterable\\\")}},6933:function(t,e,i){var r=i(9504),n=i(4376),s=i(4901),a=i(2195),o=i(655),h=r([].push);t.exports=function(t){if(s(t))return t;if(n(t)){for(var e=t.length,i=[],r=0;r<e;r++){var c=t[r];\\\"string\\\"==typeof c?h(i,c):\\\"number\\\"!=typeof c&&\\\"Number\\\"!==a(c)&&\\\"String\\\"!==a(c)||h(i,o(c))}var u=i.length,l=!0;return function(t,e){if(l)return l=!1,e;if(n(this))return e;for(var r=0;r<u;r++)if(i[r]===t)return e}}}},5966:function(t,e,i){var r=i(9306),n=i(4117);t.exports=function(t,e){var i=t[e];return n(i)?void 0:r(i)}},2478:function(t,e,i){var r=i(9504),n=i(8981),s=Math.floor,a=r(\\\"\\\".charAt),o=r(\\\"\\\".replace),h=r(\\\"\\\".slice),c=/\\\\$([$&'`]|\\\\d{1,2}|<[^>]*>)/g,u=/\\\\$([$&'`]|\\\\d{1,2})/g;t.exports=function(t,e,i,r,l,f){var d=i+t.length,p=r.length,v=u;return void 0!==l&&(l=n(l),v=c),o(f,v,(function(n,o){var c;switch(a(o,0)){case\\\"$\\\":return\\\"$\\\";case\\\"&\\\":return t;case\\\"`\\\":return h(e,0,i);case\\\"'\\\":return h(e,d);case\\\"<\\\":c=l[h(o,1,-1)];break;default:var u=+o;if(0===u)return n;if(u>p){var f=s(u/10);return 0===f?n:f<=p?void 0===r[f-1]?a(o,1):r[f-1]+a(o,1):n}c=r[u-1]}return void 0===c?\\\"\\\":c}))}},4576:function(t,e,i){var r=function(t){return t&&t.Math===Math&&t};t.exports=r(\\\"object\\\"==typeof globalThis&&globalThis)||r(\\\"object\\\"==typeof window&&window)||r(\\\"object\\\"==typeof self&&self)||r(\\\"object\\\"==typeof i.g&&i.g)||r(\\\"object\\\"==typeof this&&this)||function(){return this}()||Function(\\\"return this\\\")()},9297:function(t,e,i){var r=i(9504),n=i(8981),s=r({}.hasOwnProperty);t.exports=Object.hasOwn||function(t,e){return s(n(t),e)}},421:function(t){t.exports={}},397:function(t,e,i){var r=i(7751);t.exports=r(\\\"document\\\",\\\"documentElement\\\")},5917:function(t,e,i){var r=i(3724),n=i(9039),s=i(4055);t.exports=!r&&!n((function(){return 7!==Object.defineProperty(s(\\\"div\\\"),\\\"a\\\",{get:function(){return 7}}).a}))},8490:function(t){var e=Array,i=Math.abs,r=Math.pow,n=Math.floor,s=Math.log,a=Math.LN2;t.exports={pack:function(t,o,h){var c,u,l,f=e(h),d=8*h-o-1,p=(1<<d)-1,v=p>>1,b=23===o?r(2,-24)-r(2,-77):0,g=t<0||0===t&&1/t<0?1:0,y=0;for((t=i(t))!=t||t===1/0?(u=t!=t?1:0,c=p):(c=n(s(t)/a),t*(l=r(2,-c))<1&&(c--,l*=2),(t+=c+v>=1?b/l:b*r(2,1-v))*l>=2&&(c++,l/=2),c+v>=p?(u=0,c=p):c+v>=1?(u=(t*l-1)*r(2,o),c+=v):(u=t*r(2,v-1)*r(2,o),c=0));o>=8;)f[y++]=255&u,u/=256,o-=8;for(c=c<<o|u,d+=o;d>0;)f[y++]=255&c,c/=256,d-=8;return f[y-1]|=128*g,f},unpack:function(t,e){var i,n=t.length,s=8*n-e-1,a=(1<<s)-1,o=a>>1,h=s-7,c=n-1,u=t[c--],l=127&u;for(u>>=7;h>0;)l=256*l+t[c--],h-=8;for(i=l&(1<<-h)-1,l>>=-h,h+=e;h>0;)i=256*i+t[c--],h-=8;if(0===l)l=1-o;else{if(l===a)return i?NaN:u?-1/0:1/0;i+=r(2,e),l-=o}return(u?-1:1)*i*r(2,l-e)}}},7055:function(t,e,i){var r=i(9504),n=i(9039),s=i(2195),a=Object,o=r(\\\"\\\".split);t.exports=n((function(){return!a(\\\"z\\\").propertyIsEnumerable(0)}))?function(t){return\\\"String\\\"===s(t)?o(t,\\\"\\\"):a(t)}:a},3167:function(t,e,i){var r=i(4901),n=i(34),s=i(2967);t.exports=function(t,e,i){var a,o;return s&&r(a=e.constructor)&&a!==i&&n(o=a.prototype)&&o!==i.prototype&&s(t,o),t}},3706:function(t,e,i){var r=i(9504),n=i(4901),s=i(7629),a=r(Function.toString);n(s.inspectSource)||(s.inspectSource=function(t){return a(t)}),t.exports=s.inspectSource},3451:function(t,e,i){var r=i(6518),n=i(9504),s=i(421),a=i(34),o=i(9297),h=i(4913).f,c=i(8480),u=i(298),l=i(4124),f=i(3392),d=i(2744),p=!1,v=f(\\\"meta\\\"),b=0,g=function(t){h(t,v,{value:{objectID:\\\"O\\\"+b++,weakData:{}}})},y=t.exports={enable:function(){y.enable=function(){},p=!0;var t=c.f,e=n([].splice),i={};i[v]=1,t(i).length&&(c.f=function(i){for(var r=t(i),n=0,s=r.length;n<s;n++)if(r[n]===v){e(r,n,1);break}return r},r({target:\\\"Object\\\",stat:!0,forced:!0},{getOwnPropertyNames:u.f}))},fastKey:function(t,e){if(!a(t))return\\\"symbol\\\"==typeof t?t:(\\\"string\\\"==typeof t?\\\"S\\\":\\\"P\\\")+t;if(!o(t,v)){if(!l(t))return\\\"F\\\";if(!e)return\\\"E\\\";g(t)}return t[v].objectID},getWeakData:function(t,e){if(!o(t,v)){if(!l(t))return!0;if(!e)return!1;g(t)}return t[v].weakData},onFreeze:function(t){return d&&p&&l(t)&&!o(t,v)&&g(t),t}};s[v]=!0},1181:function(t,e,i){var r,n,s,a=i(8622),o=i(4576),h=i(34),c=i(6699),u=i(9297),l=i(7629),f=i(6119),d=i(421),p=\\\"Object already initialized\\\",v=o.TypeError,b=o.WeakMap;if(a||l.state){var g=l.state||(l.state=new b);g.get=g.get,g.has=g.has,g.set=g.set,r=function(t,e){if(g.has(t))throw new v(p);return e.facade=t,g.set(t,e),e},n=function(t){return g.get(t)||{}},s=function(t){return g.has(t)}}else{var y=f(\\\"state\\\");d[y]=!0,r=function(t,e){if(u(t,y))throw new v(p);return e.facade=t,c(t,y,e),e},n=function(t){return u(t,y)?t[y]:{}},s=function(t){return u(t,y)}}t.exports={set:r,get:n,has:s,enforce:function(t){return s(t)?n(t):r(t,{})},getterFor:function(t){return function(e){var i;if(!h(e)||(i=n(e)).type!==t)throw new v(\\\"Incompatible receiver, \\\"+t+\\\" required\\\");return i}}}},4209:function(t,e,i){var r=i(8227),n=i(6269),s=r(\\\"iterator\\\"),a=Array.prototype;t.exports=function(t){return void 0!==t&&(n.Array===t||a[s]===t)}},4376:function(t,e,i){var r=i(2195);t.exports=Array.isArray||function(t){return\\\"Array\\\"===r(t)}},1108:function(t,e,i){var r=i(6955);t.exports=function(t){var e=r(t);return\\\"BigInt64Array\\\"===e||\\\"BigUint64Array\\\"===e}},4901:function(t){var e=\\\"object\\\"==typeof document&&document.all;t.exports=void 0===e&&void 0!==e?function(t){return\\\"function\\\"==typeof t||t===e}:function(t){return\\\"function\\\"==typeof t}},3517:function(t,e,i){var r=i(9504),n=i(9039),s=i(4901),a=i(6955),o=i(7751),h=i(3706),c=function(){},u=o(\\\"Reflect\\\",\\\"construct\\\"),l=/^\\\\s*(?:class|function)\\\\b/,f=r(l.exec),d=!l.test(c),p=function(t){if(!s(t))return!1;try{return u(c,[],t),!0}catch(t){return!1}},v=function(t){if(!s(t))return!1;switch(a(t)){case\\\"AsyncFunction\\\":case\\\"GeneratorFunction\\\":case\\\"AsyncGeneratorFunction\\\":return!1}try{return d||!!f(l,h(t))}catch(t){return!0}};v.sham=!0,t.exports=!u||n((function(){var t;return p(p.call)||!p(Object)||!p((function(){t=!0}))||t}))?v:p},2796:function(t,e,i){var r=i(9039),n=i(4901),s=/#|\\\\.prototype\\\\./,a=function(t,e){var i=h[o(t)];return i===u||i!==c&&(n(e)?r(e):!!e)},o=a.normalize=function(t){return String(t).replace(s,\\\".\\\").toLowerCase()},h=a.data={},c=a.NATIVE=\\\"N\\\",u=a.POLYFILL=\\\"P\\\";t.exports=a},2087:function(t,e,i){var r=i(34),n=Math.floor;t.exports=Number.isInteger||function(t){return!r(t)&&isFinite(t)&&n(t)===t}},4117:function(t){t.exports=function(t){return null==t}},34:function(t,e,i){var r=i(4901);t.exports=function(t){return\\\"object\\\"==typeof t?null!==t:r(t)}},3925:function(t,e,i){var r=i(34);t.exports=function(t){return r(t)||null===t}},6395:function(t){t.exports=!1},788:function(t,e,i){var r=i(34),n=i(2195),s=i(8227)(\\\"match\\\");t.exports=function(t){var e;return r(t)&&(void 0!==(e=t[s])?!!e:\\\"RegExp\\\"===n(t))}},757:function(t,e,i){var r=i(7751),n=i(4901),s=i(1625),a=i(7040),o=Object;t.exports=a?function(t){return\\\"symbol\\\"==typeof t}:function(t){var e=r(\\\"Symbol\\\");return n(e)&&s(e.prototype,o(t))}},2652:function(t,e,i){var r=i(6080),n=i(9565),s=i(8551),a=i(6823),o=i(4209),h=i(6198),c=i(1625),u=i(81),l=i(851),f=i(1920),d=TypeError,p=function(t,e){this.stopped=t,this.result=e},v=p.prototype;t.exports=function(t,e,i){var b,g,y,m,_,w,x,A=i&&i.that,C=!(!i||!i.AS_ENTRIES),T=!(!i||!i.IS_RECORD),k=!(!i||!i.IS_ITERATOR),F=!(!i||!i.INTERRUPTED),S=r(e,A),R=function(t){return b&&f(b,\\\"normal\\\",t),new p(!0,t)},I=function(t){return C?(s(t),F?S(t[0],t[1],R):S(t[0],t[1])):F?S(t,R):S(t)};if(T)b=t.iterator;else if(k)b=t;else{if(!(g=l(t)))throw new d(a(t)+\\\" is not iterable\\\");if(o(g)){for(y=0,m=h(t);m>y;y++)if((_=I(t[y]))&&c(v,_))return _;return new p(!1)}b=u(t,g)}for(w=T?t.next:b.next;!(x=n(w,b)).done;){try{_=I(x.value)}catch(t){f(b,\\\"throw\\\",t)}if(\\\"object\\\"==typeof _&&_&&c(v,_))return _}return new p(!1)}},1920:function(t,e,i){var r=i(9565),n=i(8551),s=i(5966);t.exports=function(t,e,i){var a,o;n(t);try{if(!(a=s(t,\\\"return\\\"))){if(\\\"throw\\\"===e)throw i;return i}a=r(a,t)}catch(t){o=!0,a=t}if(\\\"throw\\\"===e)throw i;if(o)throw a;return n(a),i}},3994:function(t,e,i){var r=i(7657).IteratorPrototype,n=i(2360),s=i(6980),a=i(687),o=i(6269),h=function(){return this};t.exports=function(t,e,i,c){var u=e+\\\" Iterator\\\";return t.prototype=n(r,{next:s(+!c,i)}),a(t,u,!1,!0),o[u]=h,t}},1088:function(t,e,i){var r=i(6518),n=i(9565),s=i(6395),a=i(350),o=i(4901),h=i(3994),c=i(2787),u=i(2967),l=i(687),f=i(6699),d=i(6840),p=i(8227),v=i(6269),b=i(7657),g=a.PROPER,y=a.CONFIGURABLE,m=b.IteratorPrototype,_=b.BUGGY_SAFARI_ITERATORS,w=p(\\\"iterator\\\"),x=\\\"keys\\\",A=\\\"values\\\",C=\\\"entries\\\",T=function(){return this};t.exports=function(t,e,i,a,p,b,k){h(i,e,a);var F,S,R,I=function(t){if(t===p&&B)return B;if(!_&&t&&t in M)return M[t];switch(t){case x:case A:case C:return function(){return new i(this,t)}}return function(){return new i(this)}},E=e+\\\" Iterator\\\",O=!1,M=t.prototype,G=M[w]||M[\\\"@@iterator\\\"]||p&&M[p],B=!_&&G||I(p),P=\\\"Array\\\"===e&&M.entries||G;if(P&&(F=c(P.call(new t)))!==Object.prototype&&F.next&&(s||c(F)===m||(u?u(F,m):o(F[w])||d(F,w,T)),l(F,E,!0,!0),s&&(v[E]=T)),g&&p===A&&G&&G.name!==A&&(!s&&y?f(M,\\\"name\\\",A):(O=!0,B=function(){return n(G,this)})),p)if(S={values:I(A),keys:b?B:I(x),entries:I(C)},k)for(R in S)(_||O||!(R in M))&&d(M,R,S[R]);else r({target:e,proto:!0,forced:_||O},S);return s&&!k||M[w]===B||d(M,w,B,{name:p}),v[e]=B,S}},7657:function(t,e,i){var r,n,s,a=i(9039),o=i(4901),h=i(34),c=i(2360),u=i(2787),l=i(6840),f=i(8227),d=i(6395),p=f(\\\"iterator\\\"),v=!1;[].keys&&(\\\"next\\\"in(s=[].keys())?(n=u(u(s)))!==Object.prototype&&(r=n):v=!0),!h(r)||a((function(){var t={};return r[p].call(t)!==t}))?r={}:d&&(r=c(r)),o(r[p])||l(r,p,(function(){return this})),t.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:v}},6269:function(t){t.exports={}},6198:function(t,e,i){var r=i(8014);t.exports=function(t){return r(t.length)}},283:function(t,e,i){var r=i(9504),n=i(9039),s=i(4901),a=i(9297),o=i(3724),h=i(350).CONFIGURABLE,c=i(3706),u=i(1181),l=u.enforce,f=u.get,d=String,p=Object.defineProperty,v=r(\\\"\\\".slice),b=r(\\\"\\\".replace),g=r([].join),y=o&&!n((function(){return 8!==p((function(){}),\\\"length\\\",{value:8}).length})),m=String(String).split(\\\"String\\\"),_=t.exports=function(t,e,i){\\\"Symbol(\\\"===v(d(e),0,7)&&(e=\\\"[\\\"+b(d(e),/^Symbol\\\\(([^)]*)\\\\).*$/,\\\"$1\\\")+\\\"]\\\"),i&&i.getter&&(e=\\\"get \\\"+e),i&&i.setter&&(e=\\\"set \\\"+e),(!a(t,\\\"name\\\")||h&&t.name!==e)&&(o?p(t,\\\"name\\\",{value:e,configurable:!0}):t.name=e),y&&i&&a(i,\\\"arity\\\")&&t.length!==i.arity&&p(t,\\\"length\\\",{value:i.arity});try{i&&a(i,\\\"constructor\\\")&&i.constructor?o&&p(t,\\\"prototype\\\",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(t){}var r=l(t);return a(r,\\\"source\\\")||(r.source=g(m,\\\"string\\\"==typeof e?e:\\\"\\\")),t};Function.prototype.toString=_((function(){return s(this)&&f(this).source||c(this)}),\\\"toString\\\")},3164:function(t,e,i){var r=i(7782),n=Math.abs,s=2220446049250313e-31,a=1/s;t.exports=function(t,e,i,o){var h=+t,c=n(h),u=r(h);if(c<o)return u*function(t){return t+a-a}(c/o/e)*o*e;var l=(1+e/s)*c,f=l-(l-c);return f>i||f!=f?u*(1/0):u*f}},5617:function(t,e,i){var r=i(3164);t.exports=Math.fround||function(t){return r(t,1.1920928955078125e-7,34028234663852886e22,11754943508222875e-54)}},7782:function(t){t.exports=Math.sign||function(t){var e=+t;return 0===e||e!=e?e:e<0?-1:1}},741:function(t){var e=Math.ceil,i=Math.floor;t.exports=Math.trunc||function(t){var r=+t;return(r>0?i:e)(r)}},5749:function(t,e,i){var r=i(788),n=TypeError;t.exports=function(t){if(r(t))throw new n(\\\"The method doesn't accept regular expressions\\\");return t}},360:function(t,e,i){var r=i(4576).isFinite;t.exports=Number.isFinite||function(t){return\\\"number\\\"==typeof t&&r(t)}},2703:function(t,e,i){var r=i(4576),n=i(9039),s=i(9504),a=i(655),o=i(3802).trim,h=i(7452),c=r.parseInt,u=r.Symbol,l=u&&u.iterator,f=/^[+-]?0x/i,d=s(f.exec),p=8!==c(h+\\\"08\\\")||22!==c(h+\\\"0x16\\\")||l&&!n((function(){c(Object(l))}));t.exports=p?function(t,e){var i=o(a(t));return c(i,e>>>0||(d(f,i)?16:10))}:c},2360:function(t,e,i){var r,n=i(8551),s=i(6801),a=i(8727),o=i(421),h=i(397),c=i(4055),u=i(6119),l=\\\"prototype\\\",f=\\\"script\\\",d=u(\\\"IE_PROTO\\\"),p=function(){},v=function(t){return\\\"<\\\"+f+\\\">\\\"+t+\\\"</\\\"+f+\\\">\\\"},b=function(t){t.write(v(\\\"\\\")),t.close();var e=t.parentWindow.Object;return t=null,e},g=function(){try{r=new ActiveXObject(\\\"htmlfile\\\")}catch(t){}var t,e,i;g=\\\"undefined\\\"!=typeof document?document.domain&&r?b(r):(e=c(\\\"iframe\\\"),i=\\\"java\\\"+f+\\\":\\\",e.style.display=\\\"none\\\",h.appendChild(e),e.src=String(i),(t=e.contentWindow.document).open(),t.write(v(\\\"document.F=Object\\\")),t.close(),t.F):b(r);for(var n=a.length;n--;)delete g[l][a[n]];return g()};o[d]=!0,t.exports=Object.create||function(t,e){var i;return null!==t?(p[l]=n(t),i=new p,p[l]=null,i[d]=t):i=g(),void 0===e?i:s.f(i,e)}},6801:function(t,e,i){var r=i(3724),n=i(8686),s=i(4913),a=i(8551),o=i(5397),h=i(1072);e.f=r&&!n?Object.defineProperties:function(t,e){a(t);for(var i,r=o(e),n=h(e),c=n.length,u=0;c>u;)s.f(t,i=n[u++],r[i]);return t}},4913:function(t,e,i){var r=i(3724),n=i(5917),s=i(8686),a=i(8551),o=i(6969),h=TypeError,c=Object.defineProperty,u=Object.getOwnPropertyDescriptor,l=\\\"enumerable\\\",f=\\\"configurable\\\",d=\\\"writable\\\";e.f=r?s?function(t,e,i){if(a(t),e=o(e),a(i),\\\"function\\\"==typeof t&&\\\"prototype\\\"===e&&\\\"value\\\"in i&&d in i&&!i[d]){var r=u(t,e);r&&r[d]&&(t[e]=i.value,i={configurable:f in i?i[f]:r[f],enumerable:l in i?i[l]:r[l],writable:!1})}return c(t,e,i)}:c:function(t,e,i){if(a(t),e=o(e),a(i),n)try{return c(t,e,i)}catch(t){}if(\\\"get\\\"in i||\\\"set\\\"in i)throw new h(\\\"Accessors not supported\\\");return\\\"value\\\"in i&&(t[e]=i.value),t}},7347:function(t,e,i){var r=i(3724),n=i(9565),s=i(8773),a=i(6980),o=i(5397),h=i(6969),c=i(9297),u=i(5917),l=Object.getOwnPropertyDescriptor;e.f=r?l:function(t,e){if(t=o(t),e=h(e),u)try{return l(t,e)}catch(t){}if(c(t,e))return a(!n(s.f,t,e),t[e])}},298:function(t,e,i){var r=i(2195),n=i(5397),s=i(8480).f,a=i(7680),o=\\\"object\\\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return o&&\\\"Window\\\"===r(t)?function(t){try{return s(t)}catch(t){return a(o)}}(t):s(n(t))}},8480:function(t,e,i){var r=i(1828),n=i(8727).concat(\\\"length\\\",\\\"prototype\\\");e.f=Object.getOwnPropertyNames||function(t){return r(t,n)}},3717:function(t,e){e.f=Object.getOwnPropertySymbols},2787:function(t,e,i){var r=i(9297),n=i(4901),s=i(8981),a=i(6119),o=i(2211),h=a(\\\"IE_PROTO\\\"),c=Object,u=c.prototype;t.exports=o?c.getPrototypeOf:function(t){var e=s(t);if(r(e,h))return e[h];var i=e.constructor;return n(i)&&e instanceof i?i.prototype:e instanceof c?u:null}},4124:function(t,e,i){var r=i(9039),n=i(34),s=i(2195),a=i(5652),o=Object.isExtensible,h=r((function(){o(1)}));t.exports=h||a?function(t){return!!n(t)&&(!a||\\\"ArrayBuffer\\\"!==s(t))&&(!o||o(t))}:o},1625:function(t,e,i){var r=i(9504);t.exports=r({}.isPrototypeOf)},1828:function(t,e,i){var r=i(9504),n=i(9297),s=i(5397),a=i(9617).indexOf,o=i(421),h=r([].push);t.exports=function(t,e){var i,r=s(t),c=0,u=[];for(i in r)!n(o,i)&&n(r,i)&&h(u,i);for(;e.length>c;)n(r,i=e[c++])&&(~a(u,i)||h(u,i));return u}},1072:function(t,e,i){var r=i(1828),n=i(8727);t.exports=Object.keys||function(t){return r(t,n)}},8773:function(t,e){var i={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,n=r&&!i.call({1:2},1);e.f=n?function(t){var e=r(this,t);return!!e&&e.enumerable}:i},2967:function(t,e,i){var r=i(6706),n=i(34),s=i(7750),a=i(3506);t.exports=Object.setPrototypeOf||(\\\"__proto__\\\"in{}?function(){var t,e=!1,i={};try{(t=r(Object.prototype,\\\"__proto__\\\",\\\"set\\\"))(i,[]),e=i instanceof Array}catch(t){}return function(i,r){return s(i),a(r),n(i)?(e?t(i,r):i.__proto__=r,i):i}}():void 0)},2357:function(t,e,i){var r=i(3724),n=i(9039),s=i(9504),a=i(2787),o=i(1072),h=i(5397),c=s(i(8773).f),u=s([].push),l=r&&n((function(){var t=Object.create(null);return t[2]=2,!c(t,2)})),f=function(t){return function(e){for(var i,n=h(e),s=o(n),f=l&&null===a(n),d=s.length,p=0,v=[];d>p;)i=s[p++],r&&!(f?i in n:c(n,i))||u(v,t?[i,n[i]]:n[i]);return v}};t.exports={entries:f(!0),values:f(!1)}},3179:function(t,e,i){var r=i(2140),n=i(6955);t.exports=r?{}.toString:function(){return\\\"[object \\\"+n(this)+\\\"]\\\"}},4270:function(t,e,i){var r=i(9565),n=i(4901),s=i(34),a=TypeError;t.exports=function(t,e){var i,o;if(\\\"string\\\"===e&&n(i=t.toString)&&!s(o=r(i,t)))return o;if(n(i=t.valueOf)&&!s(o=r(i,t)))return o;if(\\\"string\\\"!==e&&n(i=t.toString)&&!s(o=r(i,t)))return o;throw new a(\\\"Can't convert object to primitive value\\\")}},5031:function(t,e,i){var r=i(7751),n=i(9504),s=i(8480),a=i(3717),o=i(8551),h=n([].concat);t.exports=r(\\\"Reflect\\\",\\\"ownKeys\\\")||function(t){var e=s.f(o(t)),i=a.f;return i?h(e,i(t)):e}},9167:function(t,e,i){var r=i(4576);t.exports=r},6682:function(t,e,i){var r=i(9565),n=i(8551),s=i(4901),a=i(2195),o=i(7323),h=TypeError;t.exports=function(t,e){var i=t.exec;if(s(i)){var c=r(i,t,e);return null!==c&&n(c),c}if(\\\"RegExp\\\"===a(t))return r(o,t,e);throw new h(\\\"RegExp#exec called on incompatible receiver\\\")}},7323:function(t,e,i){var r,n,s=i(9565),a=i(9504),o=i(655),h=i(7979),c=i(8429),u=i(5745),l=i(2360),f=i(1181).get,d=i(3635),p=i(8814),v=u(\\\"native-string-replace\\\",String.prototype.replace),b=RegExp.prototype.exec,g=b,y=a(\\\"\\\".charAt),m=a(\\\"\\\".indexOf),_=a(\\\"\\\".replace),w=a(\\\"\\\".slice),x=(n=/b*/g,s(b,r=/a/,\\\"a\\\"),s(b,n,\\\"a\\\"),0!==r.lastIndex||0!==n.lastIndex),A=c.BROKEN_CARET,C=void 0!==/()??/.exec(\\\"\\\")[1];(x||C||A||d||p)&&(g=function(t){var e,i,r,n,a,c,u,d=this,p=f(d),T=o(t),k=p.raw;if(k)return k.lastIndex=d.lastIndex,e=s(g,k,T),d.lastIndex=k.lastIndex,e;var F=p.groups,S=A&&d.sticky,R=s(h,d),I=d.source,E=0,O=T;if(S&&(R=_(R,\\\"y\\\",\\\"\\\"),-1===m(R,\\\"g\\\")&&(R+=\\\"g\\\"),O=w(T,d.lastIndex),d.lastIndex>0&&(!d.multiline||d.multiline&&\\\"\\\\n\\\"!==y(T,d.lastIndex-1))&&(I=\\\"(?: \\\"+I+\\\")\\\",O=\\\" \\\"+O,E++),i=new RegExp(\\\"^(?:\\\"+I+\\\")\\\",R)),C&&(i=new RegExp(\\\"^\\\"+I+\\\"$(?!\\\\\\\\s)\\\",R)),x&&(r=d.lastIndex),n=s(b,S?i:d,O),S?n?(n.input=w(n.input,E),n[0]=w(n[0],E),n.index=d.lastIndex,d.lastIndex+=n[0].length):d.lastIndex=0:x&&n&&(d.lastIndex=d.global?n.index+n[0].length:r),C&&n&&n.length>1&&s(v,n[0],i,(function(){for(a=1;a<arguments.length-2;a++)void 0===arguments[a]&&(n[a]=void 0)})),n&&F)for(n.groups=c=l(null),a=0;a<F.length;a++)c[(u=F[a])[0]]=n[u[1]];return n}),t.exports=g},7979:function(t,e,i){var r=i(8551);t.exports=function(){var t=r(this),e=\\\"\\\";return t.hasIndices&&(e+=\\\"d\\\"),t.global&&(e+=\\\"g\\\"),t.ignoreCase&&(e+=\\\"i\\\"),t.multiline&&(e+=\\\"m\\\"),t.dotAll&&(e+=\\\"s\\\"),t.unicode&&(e+=\\\"u\\\"),t.unicodeSets&&(e+=\\\"v\\\"),t.sticky&&(e+=\\\"y\\\"),e}},1034:function(t,e,i){var r=i(9565),n=i(9297),s=i(1625),a=i(7979),o=RegExp.prototype;t.exports=function(t){var e=t.flags;return void 0!==e||\\\"flags\\\"in o||n(t,\\\"flags\\\")||!s(o,t)?e:r(a,t)}},8429:function(t,e,i){var r=i(9039),n=i(4576).RegExp,s=r((function(){var t=n(\\\"a\\\",\\\"y\\\");return t.lastIndex=2,null!==t.exec(\\\"abcd\\\")})),a=s||r((function(){return!n(\\\"a\\\",\\\"y\\\").sticky})),o=s||r((function(){var t=n(\\\"^r\\\",\\\"gy\\\");return t.lastIndex=2,null!==t.exec(\\\"str\\\")}));t.exports={BROKEN_CARET:o,MISSED_STICKY:a,UNSUPPORTED_Y:s}},3635:function(t,e,i){var r=i(9039),n=i(4576).RegExp;t.exports=r((function(){var t=n(\\\".\\\",\\\"s\\\");return!(t.dotAll&&t.test(\\\"\\\\n\\\")&&\\\"s\\\"===t.flags)}))},8814:function(t,e,i){var r=i(9039),n=i(4576).RegExp;t.exports=r((function(){var t=n(\\\"(?<a>b)\\\",\\\"g\\\");return\\\"b\\\"!==t.exec(\\\"b\\\").groups.a||\\\"bc\\\"!==\\\"b\\\".replace(t,\\\"$<a>c\\\")}))},7750:function(t,e,i){var r=i(4117),n=TypeError;t.exports=function(t){if(r(t))throw new n(\\\"Can't call method on \\\"+t);return t}},7633:function(t,e,i){var r=i(7751),n=i(2106),s=i(8227),a=i(3724),o=s(\\\"species\\\");t.exports=function(t){var e=r(t);a&&e&&!e[o]&&n(e,o,{configurable:!0,get:function(){return this}})}},687:function(t,e,i){var r=i(4913).f,n=i(9297),s=i(8227)(\\\"toStringTag\\\");t.exports=function(t,e,i){t&&!i&&(t=t.prototype),t&&!n(t,s)&&r(t,s,{configurable:!0,value:e})}},6119:function(t,e,i){var r=i(5745),n=i(3392),s=r(\\\"keys\\\");t.exports=function(t){return s[t]||(s[t]=n(t))}},7629:function(t,e,i){var r=i(6395),n=i(4576),s=i(9433),a=\\\"__core-js_shared__\\\",o=t.exports=n[a]||s(a,{});(o.versions||(o.versions=[])).push({version:\\\"3.38.1\\\",mode:r?\\\"pure\\\":\\\"global\\\",copyright:\\\"© 2014-2024 Denis Pushkarev (zloirock.ru)\\\",license:\\\"https://github.com/zloirock/core-js/blob/v3.38.1/LICENSE\\\",source:\\\"https://github.com/zloirock/core-js\\\"})},5745:function(t,e,i){var r=i(7629);t.exports=function(t,e){return r[t]||(r[t]=e||{})}},2293:function(t,e,i){var r=i(8551),n=i(5548),s=i(4117),a=i(8227)(\\\"species\\\");t.exports=function(t,e){var i,o=r(t).constructor;return void 0===o||s(i=r(o)[a])?e:n(i)}},8183:function(t,e,i){var r=i(9504),n=i(1291),s=i(655),a=i(7750),o=r(\\\"\\\".charAt),h=r(\\\"\\\".charCodeAt),c=r(\\\"\\\".slice),u=function(t){return function(e,i){var r,u,l=s(a(e)),f=n(i),d=l.length;return f<0||f>=d?t?\\\"\\\":void 0:(r=h(l,f))<55296||r>56319||f+1===d||(u=h(l,f+1))<56320||u>57343?t?o(l,f):r:t?c(l,f,f+2):u-56320+(r-55296<<10)+65536}};t.exports={codeAt:u(!1),charAt:u(!0)}},3063:function(t,e,i){var r=i(2839);t.exports=/Version\\\\/10(?:\\\\.\\\\d+){1,2}(?: [\\\\w./]+)?(?: Mobile\\\\/\\\\w+)? Safari\\\\//.test(r)},533:function(t,e,i){var r=i(9504),n=i(8014),s=i(655),a=i(2333),o=i(7750),h=r(a),c=r(\\\"\\\".slice),u=Math.ceil,l=function(t){return function(e,i,r){var a,l,f=s(o(e)),d=n(i),p=f.length,v=void 0===r?\\\" \\\":s(r);return d<=p||\\\"\\\"===v?f:((l=h(v,u((a=d-p)/v.length))).length>a&&(l=c(l,0,a)),t?f+l:l+f)}};t.exports={start:l(!1),end:l(!0)}},2333:function(t,e,i){var r=i(1291),n=i(655),s=i(7750),a=RangeError;t.exports=function(t){var e=n(s(this)),i=\\\"\\\",o=r(t);if(o<0||o===1/0)throw new a(\\\"Wrong number of repetitions\\\");for(;o>0;(o>>>=1)&&(e+=e))1&o&&(i+=e);return i}},3802:function(t,e,i){var r=i(9504),n=i(7750),s=i(655),a=i(7452),o=r(\\\"\\\".replace),h=RegExp(\\\"^[\\\"+a+\\\"]+\\\"),c=RegExp(\\\"(^|[^\\\"+a+\\\"])[\\\"+a+\\\"]+$\\\"),u=function(t){return function(e){var i=s(n(e));return 1&t&&(i=o(i,h,\\\"\\\")),2&t&&(i=o(i,c,\\\"$1\\\")),i}};t.exports={start:u(1),end:u(2),trim:u(3)}},4495:function(t,e,i){var r=i(9519),n=i(9039),s=i(4576).String;t.exports=!!Object.getOwnPropertySymbols&&!n((function(){var t=Symbol(\\\"symbol detection\\\");return!s(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},8242:function(t,e,i){var r=i(9565),n=i(7751),s=i(8227),a=i(6840);t.exports=function(){var t=n(\\\"Symbol\\\"),e=t&&t.prototype,i=e&&e.valueOf,o=s(\\\"toPrimitive\\\");e&&!e[o]&&a(e,o,(function(t){return r(i,this)}),{arity:1})}},1296:function(t,e,i){var r=i(4495);t.exports=r&&!!Symbol.for&&!!Symbol.keyFor},1240:function(t,e,i){var r=i(9504);t.exports=r(1..valueOf)},5610:function(t,e,i){var r=i(1291),n=Math.max,s=Math.min;t.exports=function(t,e){var i=r(t);return i<0?n(i+e,0):s(i,e)}},5854:function(t,e,i){var r=i(2777),n=TypeError;t.exports=function(t){var e=r(t,\\\"number\\\");if(\\\"number\\\"==typeof e)throw new n(\\\"Can't convert number to bigint\\\");return BigInt(e)}},7696:function(t,e,i){var r=i(1291),n=i(8014),s=RangeError;t.exports=function(t){if(void 0===t)return 0;var e=r(t),i=n(e);if(e!==i)throw new s(\\\"Wrong length or index\\\");return i}},5397:function(t,e,i){var r=i(7055),n=i(7750);t.exports=function(t){return r(n(t))}},1291:function(t,e,i){var r=i(741);t.exports=function(t){var e=+t;return e!=e||0===e?0:r(e)}},8014:function(t,e,i){var r=i(1291),n=Math.min;t.exports=function(t){var e=r(t);return e>0?n(e,9007199254740991):0}},8981:function(t,e,i){var r=i(7750),n=Object;t.exports=function(t){return n(r(t))}},8229:function(t,e,i){var r=i(9590),n=RangeError;t.exports=function(t,e){var i=r(t);if(i%e)throw new n(\\\"Wrong offset\\\");return i}},9590:function(t,e,i){var r=i(1291),n=RangeError;t.exports=function(t){var e=r(t);if(e<0)throw new n(\\\"The argument can't be less than 0\\\");return e}},2777:function(t,e,i){var r=i(9565),n=i(34),s=i(757),a=i(5966),o=i(4270),h=i(8227),c=TypeError,u=h(\\\"toPrimitive\\\");t.exports=function(t,e){if(!n(t)||s(t))return t;var i,h=a(t,u);if(h){if(void 0===e&&(e=\\\"default\\\"),i=r(h,t,e),!n(i)||s(i))return i;throw new c(\\\"Can't convert object to primitive value\\\")}return void 0===e&&(e=\\\"number\\\"),o(t,e)}},6969:function(t,e,i){var r=i(2777),n=i(757);t.exports=function(t){var e=r(t,\\\"string\\\");return n(e)?e:e+\\\"\\\"}},2140:function(t,e,i){var r={};r[i(8227)(\\\"toStringTag\\\")]=\\\"z\\\",t.exports=\\\"[object z]\\\"===String(r)},655:function(t,e,i){var r=i(6955),n=String;t.exports=function(t){if(\\\"Symbol\\\"===r(t))throw new TypeError(\\\"Cannot convert a Symbol value to a string\\\");return n(t)}},8319:function(t){var e=Math.round;t.exports=function(t){var i=e(t);return i<0?0:i>255?255:255&i}},6823:function(t){var e=String;t.exports=function(t){try{return e(t)}catch(t){return\\\"Object\\\"}}},5823:function(t,e,i){var r=i(6518),n=i(4576),s=i(9565),a=i(3724),o=i(2805),h=i(4644),c=i(6346),u=i(679),l=i(6980),f=i(6699),d=i(2087),p=i(8014),v=i(7696),b=i(8229),g=i(8319),y=i(6969),m=i(9297),_=i(6955),w=i(34),x=i(757),A=i(2360),C=i(1625),T=i(2967),k=i(8480).f,F=i(3251),S=i(9213).forEach,R=i(7633),I=i(2106),E=i(4913),O=i(7347),M=i(5370),G=i(1181),B=i(3167),P=G.get,D=G.set,j=G.enforce,L=E.f,N=O.f,U=n.RangeError,z=c.ArrayBuffer,H=z.prototype,X=c.DataView,K=h.NATIVE_ARRAY_BUFFER_VIEWS,V=h.TYPED_ARRAY_TAG,$=h.TypedArray,W=h.TypedArrayPrototype,Y=h.isTypedArray,J=\\\"BYTES_PER_ELEMENT\\\",Z=\\\"Wrong length\\\",q=function(t,e){I(t,e,{configurable:!0,get:function(){return P(this)[e]}})},Q=function(t){var e;return C(H,t)||\\\"ArrayBuffer\\\"===(e=_(t))||\\\"SharedArrayBuffer\\\"===e},tt=function(t,e){return Y(t)&&!x(e)&&e in t&&d(+e)&&e>=0},et=function(t,e){return e=y(e),tt(t,e)?l(2,t[e]):N(t,e)},it=function(t,e,i){return e=y(e),!(tt(t,e)&&w(i)&&m(i,\\\"value\\\"))||m(i,\\\"get\\\")||m(i,\\\"set\\\")||i.configurable||m(i,\\\"writable\\\")&&!i.writable||m(i,\\\"enumerable\\\")&&!i.enumerable?L(t,e,i):(t[e]=i.value,t)};a?(K||(O.f=et,E.f=it,q(W,\\\"buffer\\\"),q(W,\\\"byteOffset\\\"),q(W,\\\"byteLength\\\"),q(W,\\\"length\\\")),r({target:\\\"Object\\\",stat:!0,forced:!K},{getOwnPropertyDescriptor:et,defineProperty:it}),t.exports=function(t,e,i){var a=t.match(/\\\\d+/)[0]/8,h=t+(i?\\\"Clamped\\\":\\\"\\\")+\\\"Array\\\",c=\\\"get\\\"+t,l=\\\"set\\\"+t,d=n[h],y=d,m=y&&y.prototype,_={},x=function(t,e){L(t,e,{get:function(){return function(t,e){var i=P(t);return i.view[c](e*a+i.byteOffset,!0)}(this,e)},set:function(t){return function(t,e,r){var n=P(t);n.view[l](e*a+n.byteOffset,i?g(r):r,!0)}(this,e,t)},enumerable:!0})};K?o&&(y=e((function(t,e,i,r){return u(t,m),B(w(e)?Q(e)?void 0!==r?new d(e,b(i,a),r):void 0!==i?new d(e,b(i,a)):new d(e):Y(e)?M(y,e):s(F,y,e):new d(v(e)),t,y)})),T&&T(y,$),S(k(d),(function(t){t in y||f(y,t,d[t])})),y.prototype=m):(y=e((function(t,e,i,r){u(t,m);var n,o,h,c=0,l=0;if(w(e)){if(!Q(e))return Y(e)?M(y,e):s(F,y,e);n=e,l=b(i,a);var f=e.byteLength;if(void 0===r){if(f%a)throw new U(Z);if((o=f-l)<0)throw new U(Z)}else if((o=p(r)*a)+l>f)throw new U(Z);h=o/a}else h=v(e),n=new z(o=h*a);for(D(t,{buffer:n,byteOffset:l,byteLength:o,length:h,view:new X(n)});c<h;)x(t,c++)})),T&&T(y,$),m=y.prototype=A(W)),m.constructor!==y&&f(m,\\\"constructor\\\",y),j(m).TypedArrayConstructor=y,V&&f(m,V,h);var C=y!==d;_[h]=y,r({global:!0,constructor:!0,forced:C,sham:!K},_),J in y||f(y,J,a),J in m||f(m,J,a),R(h)}):t.exports=function(){}},2805:function(t,e,i){var r=i(4576),n=i(9039),s=i(4428),a=i(4644).NATIVE_ARRAY_BUFFER_VIEWS,o=r.ArrayBuffer,h=r.Int8Array;t.exports=!a||!n((function(){h(1)}))||!n((function(){new h(-1)}))||!s((function(t){new h,new h(null),new h(1.5),new h(t)}),!0)||n((function(){return 1!==new h(new o(2),1,void 0).length}))},6357:function(t,e,i){var r=i(5370),n=i(1412);t.exports=function(t,e){return r(n(t),e)}},3251:function(t,e,i){var r=i(6080),n=i(9565),s=i(5548),a=i(8981),o=i(6198),h=i(81),c=i(851),u=i(4209),l=i(1108),f=i(4644).aTypedArrayConstructor,d=i(5854);t.exports=function(t){var e,i,p,v,b,g,y,m,_=s(this),w=a(t),x=arguments.length,A=x>1?arguments[1]:void 0,C=void 0!==A,T=c(w);if(T&&!u(T))for(m=(y=h(w,T)).next,w=[];!(g=n(m,y)).done;)w.push(g.value);for(C&&x>2&&(A=r(A,arguments[2])),i=o(w),p=new(f(_))(i),v=l(p),e=0;i>e;e++)b=C?A(w[e],e):w[e],p[e]=v?d(b):+b;return p}},1412:function(t,e,i){var r=i(4644),n=i(2293),s=r.aTypedArrayConstructor,a=r.getTypedArrayConstructor;t.exports=function(t){return s(n(t,a(t)))}},3392:function(t,e,i){var r=i(9504),n=0,s=Math.random(),a=r(1..toString);t.exports=function(t){return\\\"Symbol(\\\"+(void 0===t?\\\"\\\":t)+\\\")_\\\"+a(++n+s,36)}},7040:function(t,e,i){var r=i(4495);t.exports=r&&!Symbol.sham&&\\\"symbol\\\"==typeof Symbol.iterator},8686:function(t,e,i){var r=i(3724),n=i(9039);t.exports=r&&n((function(){return 42!==Object.defineProperty((function(){}),\\\"prototype\\\",{value:42,writable:!1}).prototype}))},8622:function(t,e,i){var r=i(4576),n=i(4901),s=r.WeakMap;t.exports=n(s)&&/native code/.test(String(s))},511:function(t,e,i){var r=i(9167),n=i(9297),s=i(1951),a=i(4913).f;t.exports=function(t){var e=r.Symbol||(r.Symbol={});n(e,t)||a(e,t,{value:s.f(t)})}},1951:function(t,e,i){var r=i(8227);e.f=r},8227:function(t,e,i){var r=i(4576),n=i(5745),s=i(9297),a=i(3392),o=i(4495),h=i(7040),c=r.Symbol,u=n(\\\"wks\\\"),l=h?c.for||c:c&&c.withoutSetter||a;t.exports=function(t){return s(u,t)||(u[t]=o&&s(c,t)?c[t]:l(\\\"Symbol.\\\"+t)),u[t]}},7452:function(t){t.exports=\\\"\\\\t\\\\n\\\\v\\\\f\\\\r                　\\\\u2028\\\\u2029\\\\ufeff\\\"},4743:function(t,e,i){var r=i(6518),n=i(4576),s=i(6346),a=i(7633),o=\\\"ArrayBuffer\\\",h=s[o];r({global:!0,constructor:!0,forced:n[o]!==h},{ArrayBuffer:h}),a(o)},1745:function(t,e,i){var r=i(6518),n=i(7476),s=i(9039),a=i(6346),o=i(8551),h=i(5610),c=i(8014),u=i(2293),l=a.ArrayBuffer,f=a.DataView,d=f.prototype,p=n(l.prototype.slice),v=n(d.getUint8),b=n(d.setUint8);r({target:\\\"ArrayBuffer\\\",proto:!0,unsafe:!0,forced:s((function(){return!new l(2).slice(1,void 0).byteLength}))},{slice:function(t,e){if(p&&void 0===e)return p(o(this),t);for(var i=o(this).byteLength,r=h(t,i),n=h(void 0===e?i:e,i),s=new(u(this,l))(c(n-r)),a=new f(this),d=new f(s),g=0;r<n;)b(d,g++,v(a,r++));return s}})},8706:function(t,e,i){var r=i(6518),n=i(9039),s=i(4376),a=i(34),o=i(8981),h=i(6198),c=i(6837),u=i(4659),l=i(1469),f=i(597),d=i(8227),p=i(9519),v=d(\\\"isConcatSpreadable\\\"),b=p>=51||!n((function(){var t=[];return t[v]=!1,t.concat()[0]!==t})),g=function(t){if(!a(t))return!1;var e=t[v];return void 0!==e?!!e:s(t)};r({target:\\\"Array\\\",proto:!0,arity:1,forced:!b||!f(\\\"concat\\\")},{concat:function(t){var e,i,r,n,s,a=o(this),f=l(a,0),d=0;for(e=-1,r=arguments.length;e<r;e++)if(g(s=-1===e?a:arguments[e]))for(n=h(s),c(d+n),i=0;i<n;i++,d++)i in s&&u(f,d,s[i]);else c(d+1),u(f,d++,s);return f.length=d,f}})},3771:function(t,e,i){var r=i(6518),n=i(4373),s=i(6469);r({target:\\\"Array\\\",proto:!0},{fill:n}),s(\\\"fill\\\")},2008:function(t,e,i){var r=i(6518),n=i(9213).filter;r({target:\\\"Array\\\",proto:!0,forced:!i(597)(\\\"filter\\\")},{filter:function(t){return n(this,t,arguments.length>1?arguments[1]:void 0)}})},8980:function(t,e,i){var r=i(6518),n=i(9213).findIndex,s=i(6469),a=\\\"findIndex\\\",o=!0;a in[]&&Array(1)[a]((function(){o=!1})),r({target:\\\"Array\\\",proto:!0,forced:o},{findIndex:function(t){return n(this,t,arguments.length>1?arguments[1]:void 0)}}),s(a)},113:function(t,e,i){var r=i(6518),n=i(9213).find,s=i(6469),a=\\\"find\\\",o=!0;a in[]&&Array(1)[a]((function(){o=!1})),r({target:\\\"Array\\\",proto:!0,forced:o},{find:function(t){return n(this,t,arguments.length>1?arguments[1]:void 0)}}),s(a)},3418:function(t,e,i){var r=i(6518),n=i(7916);r({target:\\\"Array\\\",stat:!0,forced:!i(4428)((function(t){Array.from(t)}))},{from:n})},4423:function(t,e,i){var r=i(6518),n=i(9617).includes,s=i(9039),a=i(6469);r({target:\\\"Array\\\",proto:!0,forced:s((function(){return!Array(1).includes()}))},{includes:function(t){return n(this,t,arguments.length>1?arguments[1]:void 0)}}),a(\\\"includes\\\")},3792:function(t,e,i){var r=i(5397),n=i(6469),s=i(6269),a=i(1181),o=i(4913).f,h=i(1088),c=i(2529),u=i(6395),l=i(3724),f=\\\"Array Iterator\\\",d=a.set,p=a.getterFor(f);t.exports=h(Array,\\\"Array\\\",(function(t,e){d(this,{type:f,target:r(t),index:0,kind:e})}),(function(){var t=p(this),e=t.target,i=t.index++;if(!e||i>=e.length)return t.target=null,c(void 0,!0);switch(t.kind){case\\\"keys\\\":return c(i,!1);case\\\"values\\\":return c(e[i],!1)}return c([i,e[i]],!1)}),\\\"values\\\");var v=s.Arguments=s.Array;if(n(\\\"keys\\\"),n(\\\"values\\\"),n(\\\"entries\\\"),!u&&l&&\\\"values\\\"!==v.name)try{o(v,\\\"name\\\",{value:\\\"values\\\"})}catch(t){}},4782:function(t,e,i){var r=i(6518),n=i(4376),s=i(3517),a=i(34),o=i(5610),h=i(6198),c=i(5397),u=i(4659),l=i(8227),f=i(597),d=i(7680),p=f(\\\"slice\\\"),v=l(\\\"species\\\"),b=Array,g=Math.max;r({target:\\\"Array\\\",proto:!0,forced:!p},{slice:function(t,e){var i,r,l,f=c(this),p=h(f),y=o(t,p),m=o(void 0===e?p:e,p);if(n(f)&&(i=f.constructor,(s(i)&&(i===b||n(i.prototype))||a(i)&&null===(i=i[v]))&&(i=void 0),i===b||void 0===i))return d(f,y,m);for(r=new(void 0===i?b:i)(g(m-y,0)),l=0;y<m;y++,l++)y in f&&u(r,l,f[y]);return r.length=l,r}})},6910:function(t,e,i){var r=i(6518),n=i(9504),s=i(9306),a=i(8981),o=i(6198),h=i(4606),c=i(655),u=i(9039),l=i(4488),f=i(4598),d=i(3709),p=i(3763),v=i(9519),b=i(3607),g=[],y=n(g.sort),m=n(g.push),_=u((function(){g.sort(void 0)})),w=u((function(){g.sort(null)})),x=f(\\\"sort\\\"),A=!u((function(){if(v)return v<70;if(!(d&&d>3)){if(p)return!0;if(b)return b<603;var t,e,i,r,n=\\\"\\\";for(t=65;t<76;t++){switch(e=String.fromCharCode(t),t){case 66:case 69:case 70:case 72:i=3;break;case 68:case 71:i=4;break;default:i=2}for(r=0;r<47;r++)g.push({k:e+r,v:i})}for(g.sort((function(t,e){return e.v-t.v})),r=0;r<g.length;r++)e=g[r].k.charAt(0),n.charAt(n.length-1)!==e&&(n+=e);return\\\"DGBEFHACIJK\\\"!==n}}));r({target:\\\"Array\\\",proto:!0,forced:_||!w||!x||!A},{sort:function(t){void 0!==t&&s(t);var e=a(this);if(A)return void 0===t?y(e):y(e,t);var i,r,n=[],u=o(e);for(r=0;r<u;r++)r in e&&m(n,e[r]);for(l(n,function(t){return function(e,i){return void 0===i?-1:void 0===e?1:void 0!==t?+t(e,i)||0:c(e)>c(i)?1:-1}}(t)),i=o(n),r=0;r<i;)e[r]=n[r++];for(;r<u;)h(e,r++);return e}})},4554:function(t,e,i){var r=i(6518),n=i(8981),s=i(5610),a=i(1291),o=i(6198),h=i(4527),c=i(6837),u=i(1469),l=i(4659),f=i(4606),d=i(597)(\\\"splice\\\"),p=Math.max,v=Math.min;r({target:\\\"Array\\\",proto:!0,forced:!d},{splice:function(t,e){var i,r,d,b,g,y,m=n(this),_=o(m),w=s(t,_),x=arguments.length;for(0===x?i=r=0:1===x?(i=0,r=_-w):(i=x-2,r=v(p(a(e),0),_-w)),c(_+i-r),d=u(m,r),b=0;b<r;b++)(g=w+b)in m&&l(d,b,m[g]);if(d.length=r,i<r){for(b=w;b<_-r;b++)y=b+i,(g=b+r)in m?m[y]=m[g]:f(m,y);for(b=_;b>_-r+i;b--)f(m,b-1)}else if(i>r)for(b=_-r;b>w;b--)y=b+i-1,(g=b+r-1)in m?m[y]=m[g]:f(m,y);for(b=0;b<i;b++)m[b+w]=arguments[b+2];return h(m,_-r+i),d}})},9572:function(t,e,i){var r=i(9297),n=i(6840),s=i(3640),a=i(8227)(\\\"toPrimitive\\\"),o=Date.prototype;r(o,a)||n(o,a,s)},2010:function(t,e,i){var r=i(3724),n=i(350).EXISTS,s=i(9504),a=i(2106),o=Function.prototype,h=s(o.toString),c=/function\\\\b(?:\\\\s|\\\\/\\\\*[\\\\S\\\\s]*?\\\\*\\\\/|\\\\/\\\\/[^\\\\n\\\\r]*[\\\\n\\\\r]+)*([^\\\\s(/]*)/,u=s(c.exec);r&&!n&&a(o,\\\"name\\\",{configurable:!0,get:function(){try{return u(c,h(this))[1]}catch(t){return\\\"\\\"}}})},3110:function(t,e,i){var r=i(6518),n=i(7751),s=i(8745),a=i(9565),o=i(9504),h=i(9039),c=i(4901),u=i(757),l=i(7680),f=i(6933),d=i(4495),p=String,v=n(\\\"JSON\\\",\\\"stringify\\\"),b=o(/./.exec),g=o(\\\"\\\".charAt),y=o(\\\"\\\".charCodeAt),m=o(\\\"\\\".replace),_=o(1..toString),w=/[\\\\uD800-\\\\uDFFF]/g,x=/^[\\\\uD800-\\\\uDBFF]$/,A=/^[\\\\uDC00-\\\\uDFFF]$/,C=!d||h((function(){var t=n(\\\"Symbol\\\")(\\\"stringify detection\\\");return\\\"[null]\\\"!==v([t])||\\\"{}\\\"!==v({a:t})||\\\"{}\\\"!==v(Object(t))})),T=h((function(){return'\\\"\\\\\\\\udf06\\\\\\\\ud834\\\"'!==v(\\\"\\\\udf06\\\\ud834\\\")||'\\\"\\\\\\\\udead\\\"'!==v(\\\"\\\\udead\\\")})),k=function(t,e){var i=l(arguments),r=f(e);if(c(r)||void 0!==t&&!u(t))return i[1]=function(t,e){if(c(r)&&(e=a(r,this,p(t),e)),!u(e))return e},s(v,null,i)},F=function(t,e,i){var r=g(i,e-1),n=g(i,e+1);return b(x,t)&&!b(A,n)||b(A,t)&&!b(x,r)?\\\"\\\\\\\\u\\\"+_(y(t,0),16):t};v&&r({target:\\\"JSON\\\",stat:!0,arity:3,forced:C||T},{stringify:function(t,e,i){var r=l(arguments),n=s(C?k:v,null,r);return T&&\\\"string\\\"==typeof n?m(n,w,F):n}})},8523:function(t,e,i){i(6468)(\\\"Map\\\",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),i(6938))},6033:function(t,e,i){i(8523)},2892:function(t,e,i){var r=i(6518),n=i(6395),s=i(3724),a=i(4576),o=i(9167),h=i(9504),c=i(2796),u=i(9297),l=i(3167),f=i(1625),d=i(757),p=i(2777),v=i(9039),b=i(8480).f,g=i(7347).f,y=i(4913).f,m=i(1240),_=i(3802).trim,w=\\\"Number\\\",x=a[w],A=o[w],C=x.prototype,T=a.TypeError,k=h(\\\"\\\".slice),F=h(\\\"\\\".charCodeAt),S=c(w,!x(\\\" 0o1\\\")||!x(\\\"0b1\\\")||x(\\\"+0x1\\\")),R=function(t){var e,i=arguments.length<1?0:x(function(t){var e=p(t,\\\"number\\\");return\\\"bigint\\\"==typeof e?e:function(t){var e,i,r,n,s,a,o,h,c=p(t,\\\"number\\\");if(d(c))throw new T(\\\"Cannot convert a Symbol value to a number\\\");if(\\\"string\\\"==typeof c&&c.length>2)if(c=_(c),43===(e=F(c,0))||45===e){if(88===(i=F(c,2))||120===i)return NaN}else if(48===e){switch(F(c,1)){case 66:case 98:r=2,n=49;break;case 79:case 111:r=8,n=55;break;default:return+c}for(a=(s=k(c,2)).length,o=0;o<a;o++)if((h=F(s,o))<48||h>n)return NaN;return parseInt(s,r)}return+c}(e)}(t));return f(C,e=this)&&v((function(){m(e)}))?l(Object(i),this,R):i};R.prototype=C,S&&!n&&(C.constructor=R),r({global:!0,constructor:!0,wrap:!0,forced:S},{Number:R});var I=function(t,e){for(var i,r=s?b(e):\\\"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,fromString,range\\\".split(\\\",\\\"),n=0;r.length>n;n++)u(e,i=r[n])&&!u(t,i)&&y(t,i,g(e,i))};n&&A&&I(o[w],A),(S||n)&&I(o[w],x)},5428:function(t,e,i){i(6518)({target:\\\"Number\\\",stat:!0},{isFinite:i(360)})},4601:function(t,e,i){i(6518)({target:\\\"Number\\\",stat:!0,nonConfigurable:!0,nonWritable:!0},{MAX_SAFE_INTEGER:9007199254740991})},5843:function(t,e,i){var r=i(6518),n=i(2703);r({target:\\\"Number\\\",stat:!0,forced:Number.parseInt!==n},{parseInt:n})},5506:function(t,e,i){var r=i(6518),n=i(2357).entries;r({target:\\\"Object\\\",stat:!0},{entries:function(t){return n(t)}})},3851:function(t,e,i){var r=i(6518),n=i(9039),s=i(5397),a=i(7347).f,o=i(3724);r({target:\\\"Object\\\",stat:!0,forced:!o||n((function(){a(1)})),sham:!o},{getOwnPropertyDescriptor:function(t,e){return a(s(t),e)}})},1278:function(t,e,i){var r=i(6518),n=i(3724),s=i(5031),a=i(5397),o=i(7347),h=i(4659);r({target:\\\"Object\\\",stat:!0,sham:!n},{getOwnPropertyDescriptors:function(t){for(var e,i,r=a(t),n=o.f,c=s(r),u={},l=0;c.length>l;)void 0!==(i=n(r,e=c[l++]))&&h(u,e,i);return u}})},9773:function(t,e,i){var r=i(6518),n=i(4495),s=i(9039),a=i(3717),o=i(8981);r({target:\\\"Object\\\",stat:!0,forced:!n||s((function(){a.f(1)}))},{getOwnPropertySymbols:function(t){var e=a.f;return e?e(o(t)):[]}})},875:function(t,e,i){var r=i(6518),n=i(9039),s=i(8981),a=i(2787),o=i(2211);r({target:\\\"Object\\\",stat:!0,forced:n((function(){a(1)})),sham:!o},{getPrototypeOf:function(t){return a(s(t))}})},9432:function(t,e,i){var r=i(6518),n=i(8981),s=i(1072);r({target:\\\"Object\\\",stat:!0,forced:i(9039)((function(){s(1)}))},{keys:function(t){return s(n(t))}})},287:function(t,e,i){i(6518)({target:\\\"Object\\\",stat:!0},{setPrototypeOf:i(2967)})},6099:function(t,e,i){var r=i(2140),n=i(6840),s=i(3179);r||n(Object.prototype,\\\"toString\\\",s,{unsafe:!0})},825:function(t,e,i){var r=i(6518),n=i(7751),s=i(8745),a=i(566),o=i(5548),h=i(8551),c=i(34),u=i(2360),l=i(9039),f=n(\\\"Reflect\\\",\\\"construct\\\"),d=Object.prototype,p=[].push,v=l((function(){function t(){}return!(f((function(){}),[],t)instanceof t)})),b=!l((function(){f((function(){}))})),g=v||b;r({target:\\\"Reflect\\\",stat:!0,forced:g,sham:g},{construct:function(t,e){o(t),h(e);var i=arguments.length<3?t:o(arguments[2]);if(b&&!v)return f(t,e,i);if(t===i){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var r=[null];return s(p,r,e),new(s(a,t,r))}var n=i.prototype,l=u(c(n)?n:d),g=s(t,l,e);return c(g)?g:l}})},7495:function(t,e,i){var r=i(6518),n=i(7323);r({target:\\\"RegExp\\\",proto:!0,forced:/./.exec!==n},{exec:n})},8781:function(t,e,i){var r=i(350).PROPER,n=i(6840),s=i(8551),a=i(655),o=i(9039),h=i(1034),c=\\\"toString\\\",u=RegExp.prototype,l=u[c],f=o((function(){return\\\"/a/b\\\"!==l.call({source:\\\"a\\\",flags:\\\"b\\\"})})),d=r&&l.name!==c;(f||d)&&n(u,c,(function(){var t=s(this);return\\\"/\\\"+a(t.source)+\\\"/\\\"+a(h(t))}),{unsafe:!0})},2405:function(t,e,i){i(6468)(\\\"Set\\\",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),i(6938))},1415:function(t,e,i){i(2405)},1699:function(t,e,i){var r=i(6518),n=i(9504),s=i(5749),a=i(7750),o=i(655),h=i(1436),c=n(\\\"\\\".indexOf);r({target:\\\"String\\\",proto:!0,forced:!h(\\\"includes\\\")},{includes:function(t){return!!~c(o(a(this)),o(s(t)),arguments.length>1?arguments[1]:void 0)}})},7764:function(t,e,i){var r=i(8183).charAt,n=i(655),s=i(1181),a=i(1088),o=i(2529),h=\\\"String Iterator\\\",c=s.set,u=s.getterFor(h);a(String,\\\"String\\\",(function(t){c(this,{type:h,string:n(t),index:0})}),(function(){var t,e=u(this),i=e.string,n=e.index;return n>=i.length?o(void 0,!0):(t=r(i,n),e.index+=t.length,o(t,!1))}))},8156:function(t,e,i){var r=i(6518),n=i(533).start;r({target:\\\"String\\\",proto:!0,forced:i(3063)},{padStart:function(t){return n(this,t,arguments.length>1?arguments[1]:void 0)}})},5440:function(t,e,i){var r=i(8745),n=i(9565),s=i(9504),a=i(9228),o=i(9039),h=i(8551),c=i(4901),u=i(4117),l=i(1291),f=i(8014),d=i(655),p=i(7750),v=i(7829),b=i(5966),g=i(2478),y=i(6682),m=i(8227)(\\\"replace\\\"),_=Math.max,w=Math.min,x=s([].concat),A=s([].push),C=s(\\\"\\\".indexOf),T=s(\\\"\\\".slice),k=\\\"$0\\\"===\\\"a\\\".replace(/./,\\\"$0\\\"),F=!!/./[m]&&\\\"\\\"===/./[m](\\\"a\\\",\\\"$0\\\");a(\\\"replace\\\",(function(t,e,i){var s=F?\\\"$\\\":\\\"$0\\\";return[function(t,i){var r=p(this),s=u(t)?void 0:b(t,m);return s?n(s,t,r,i):n(e,d(r),t,i)},function(t,n){var a=h(this),o=d(t);if(\\\"string\\\"==typeof n&&-1===C(n,s)&&-1===C(n,\\\"$<\\\")){var u=i(e,a,o,n);if(u.done)return u.value}var p=c(n);p||(n=d(n));var b,m=a.global;m&&(b=a.unicode,a.lastIndex=0);for(var k,F=[];null!==(k=y(a,o))&&(A(F,k),m);)\\\"\\\"===d(k[0])&&(a.lastIndex=v(o,f(a.lastIndex),b));for(var S,R=\\\"\\\",I=0,E=0;E<F.length;E++){for(var O,M=d((k=F[E])[0]),G=_(w(l(k.index),o.length),0),B=[],P=1;P<k.length;P++)A(B,void 0===(S=k[P])?S:String(S));var D=k.groups;if(p){var j=x([M],B,G,o);void 0!==D&&A(j,D),O=d(r(n,void 0,j))}else O=g(M,o,G,B,D,n);G>=I&&(R+=T(o,I,G)+O,I=G+M.length)}return R+T(o,I)}]}),!!o((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:\\\"7\\\"},t},\\\"7\\\"!==\\\"\\\".replace(t,\\\"$<a>\\\")}))||!k||F)},6761:function(t,e,i){var r=i(6518),n=i(4576),s=i(9565),a=i(9504),o=i(6395),h=i(3724),c=i(4495),u=i(9039),l=i(9297),f=i(1625),d=i(8551),p=i(5397),v=i(6969),b=i(655),g=i(6980),y=i(2360),m=i(1072),_=i(8480),w=i(298),x=i(3717),A=i(7347),C=i(4913),T=i(6801),k=i(8773),F=i(6840),S=i(2106),R=i(5745),I=i(6119),E=i(421),O=i(3392),M=i(8227),G=i(1951),B=i(511),P=i(8242),D=i(687),j=i(1181),L=i(9213).forEach,N=I(\\\"hidden\\\"),U=\\\"Symbol\\\",z=\\\"prototype\\\",H=j.set,X=j.getterFor(U),K=Object[z],V=n.Symbol,$=V&&V[z],W=n.RangeError,Y=n.TypeError,J=n.QObject,Z=A.f,q=C.f,Q=w.f,tt=k.f,et=a([].push),it=R(\\\"symbols\\\"),rt=R(\\\"op-symbols\\\"),nt=R(\\\"wks\\\"),st=!J||!J[z]||!J[z].findChild,at=function(t,e,i){var r=Z(K,e);r&&delete K[e],q(t,e,i),r&&t!==K&&q(K,e,r)},ot=h&&u((function(){return 7!==y(q({},\\\"a\\\",{get:function(){return q(this,\\\"a\\\",{value:7}).a}})).a}))?at:q,ht=function(t,e){var i=it[t]=y($);return H(i,{type:U,tag:t,description:e}),h||(i.description=e),i},ct=function(t,e,i){t===K&&ct(rt,e,i),d(t);var r=v(e);return d(i),l(it,r)?(i.enumerable?(l(t,N)&&t[N][r]&&(t[N][r]=!1),i=y(i,{enumerable:g(0,!1)})):(l(t,N)||q(t,N,g(1,y(null))),t[N][r]=!0),ot(t,r,i)):q(t,r,i)},ut=function(t,e){d(t);var i=p(e),r=m(i).concat(pt(i));return L(r,(function(e){h&&!s(lt,i,e)||ct(t,e,i[e])})),t},lt=function(t){var e=v(t),i=s(tt,this,e);return!(this===K&&l(it,e)&&!l(rt,e))&&(!(i||!l(this,e)||!l(it,e)||l(this,N)&&this[N][e])||i)},ft=function(t,e){var i=p(t),r=v(e);if(i!==K||!l(it,r)||l(rt,r)){var n=Z(i,r);return!n||!l(it,r)||l(i,N)&&i[N][r]||(n.enumerable=!0),n}},dt=function(t){var e=Q(p(t)),i=[];return L(e,(function(t){l(it,t)||l(E,t)||et(i,t)})),i},pt=function(t){var e=t===K,i=Q(e?rt:p(t)),r=[];return L(i,(function(t){!l(it,t)||e&&!l(K,t)||et(r,it[t])})),r};c||(V=function(){if(f($,this))throw new Y(\\\"Symbol is not a constructor\\\");var t=arguments.length&&void 0!==arguments[0]?b(arguments[0]):void 0,e=O(t),i=function(t){var r=void 0===this?n:this;r===K&&s(i,rt,t),l(r,N)&&l(r[N],e)&&(r[N][e]=!1);var a=g(1,t);try{ot(r,e,a)}catch(t){if(!(t instanceof W))throw t;at(r,e,a)}};return h&&st&&ot(K,e,{configurable:!0,set:i}),ht(e,t)},F($=V[z],\\\"toString\\\",(function(){return X(this).tag})),F(V,\\\"withoutSetter\\\",(function(t){return ht(O(t),t)})),k.f=lt,C.f=ct,T.f=ut,A.f=ft,_.f=w.f=dt,x.f=pt,G.f=function(t){return ht(M(t),t)},h&&(S($,\\\"description\\\",{configurable:!0,get:function(){return X(this).description}}),o||F(K,\\\"propertyIsEnumerable\\\",lt,{unsafe:!0}))),r({global:!0,constructor:!0,wrap:!0,forced:!c,sham:!c},{Symbol:V}),L(m(nt),(function(t){B(t)})),r({target:U,stat:!0,forced:!c},{useSetter:function(){st=!0},useSimple:function(){st=!1}}),r({target:\\\"Object\\\",stat:!0,forced:!c,sham:!h},{create:function(t,e){return void 0===e?y(t):ut(y(t),e)},defineProperty:ct,defineProperties:ut,getOwnPropertyDescriptor:ft}),r({target:\\\"Object\\\",stat:!0,forced:!c},{getOwnPropertyNames:dt}),P(),D(V,U),E[N]=!0},9463:function(t,e,i){var r=i(6518),n=i(3724),s=i(4576),a=i(9504),o=i(9297),h=i(4901),c=i(1625),u=i(655),l=i(2106),f=i(7740),d=s.Symbol,p=d&&d.prototype;if(n&&h(d)&&(!(\\\"description\\\"in p)||void 0!==d().description)){var v={},b=function(){var t=arguments.length<1||void 0===arguments[0]?void 0:u(arguments[0]),e=c(p,this)?new d(t):void 0===t?d():d(t);return\\\"\\\"===t&&(v[e]=!0),e};f(b,d),b.prototype=p,p.constructor=b;var g=\\\"Symbol(description detection)\\\"===String(d(\\\"description detection\\\")),y=a(p.valueOf),m=a(p.toString),_=/^Symbol\\\\((.*)\\\\)[^)]+$/,w=a(\\\"\\\".replace),x=a(\\\"\\\".slice);l(p,\\\"description\\\",{configurable:!0,get:function(){var t=y(this);if(o(v,t))return\\\"\\\";var e=m(t),i=g?x(e,7,-1):w(e,_,\\\"$1\\\");return\\\"\\\"===i?void 0:i}}),r({global:!0,constructor:!0,forced:!0},{Symbol:b})}},1510:function(t,e,i){var r=i(6518),n=i(7751),s=i(9297),a=i(655),o=i(5745),h=i(1296),c=o(\\\"string-to-symbol-registry\\\"),u=o(\\\"symbol-to-string-registry\\\");r({target:\\\"Symbol\\\",stat:!0,forced:!h},{for:function(t){var e=a(t);if(s(c,e))return c[e];var i=n(\\\"Symbol\\\")(e);return c[e]=i,u[i]=e,i}})},2259:function(t,e,i){i(511)(\\\"iterator\\\")},2675:function(t,e,i){i(6761),i(1510),i(7812),i(3110),i(9773)},7812:function(t,e,i){var r=i(6518),n=i(9297),s=i(757),a=i(6823),o=i(5745),h=i(1296),c=o(\\\"symbol-to-string-registry\\\");r({target:\\\"Symbol\\\",stat:!0,forced:!h},{keyFor:function(t){if(!s(t))throw new TypeError(a(t)+\\\" is not a symbol\\\");if(n(c,t))return c[t]}})},5700:function(t,e,i){var r=i(511),n=i(8242);r(\\\"toPrimitive\\\"),n()},1630:function(t,e,i){var r=i(9504),n=i(4644),s=r(i(7029)),a=n.aTypedArray;(0,n.exportTypedArrayMethod)(\\\"copyWithin\\\",(function(t,e){return s(a(this),t,e,arguments.length>2?arguments[2]:void 0)}))},2170:function(t,e,i){var r=i(4644),n=i(9213).every,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"every\\\",(function(t){return n(s(this),t,arguments.length>1?arguments[1]:void 0)}))},5044:function(t,e,i){var r=i(4644),n=i(4373),s=i(5854),a=i(6955),o=i(9565),h=i(9504),c=i(9039),u=r.aTypedArray,l=r.exportTypedArrayMethod,f=h(\\\"\\\".slice);l(\\\"fill\\\",(function(t){var e=arguments.length;u(this);var i=\\\"Big\\\"===f(a(this),0,3)?s(t):+t;return o(n,this,i,e>1?arguments[1]:void 0,e>2?arguments[2]:void 0)}),c((function(){var t=0;return new Int8Array(2).fill({valueOf:function(){return t++}}),1!==t})))},9539:function(t,e,i){var r=i(4644),n=i(9213).filter,s=i(6357),a=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"filter\\\",(function(t){var e=n(a(this),t,arguments.length>1?arguments[1]:void 0);return s(this,e)}))},9955:function(t,e,i){var r=i(4644),n=i(9213).findIndex,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"findIndex\\\",(function(t){return n(s(this),t,arguments.length>1?arguments[1]:void 0)}))},1694:function(t,e,i){var r=i(4644),n=i(9213).find,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"find\\\",(function(t){return n(s(this),t,arguments.length>1?arguments[1]:void 0)}))},3206:function(t,e,i){var r=i(4644),n=i(9213).forEach,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"forEach\\\",(function(t){n(s(this),t,arguments.length>1?arguments[1]:void 0)}))},4496:function(t,e,i){var r=i(4644),n=i(9617).includes,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"includes\\\",(function(t){return n(s(this),t,arguments.length>1?arguments[1]:void 0)}))},6651:function(t,e,i){var r=i(4644),n=i(9617).indexOf,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"indexOf\\\",(function(t){return n(s(this),t,arguments.length>1?arguments[1]:void 0)}))},2887:function(t,e,i){var r=i(4576),n=i(9039),s=i(9504),a=i(4644),o=i(3792),h=i(8227)(\\\"iterator\\\"),c=r.Uint8Array,u=s(o.values),l=s(o.keys),f=s(o.entries),d=a.aTypedArray,p=a.exportTypedArrayMethod,v=c&&c.prototype,b=!n((function(){v[h].call([1])})),g=!!v&&v.values&&v[h]===v.values&&\\\"values\\\"===v.values.name,y=function(){return u(d(this))};p(\\\"entries\\\",(function(){return f(d(this))}),b),p(\\\"keys\\\",(function(){return l(d(this))}),b),p(\\\"values\\\",y,b||!g,{name:\\\"values\\\"}),p(h,y,b||!g,{name:\\\"values\\\"})},9369:function(t,e,i){var r=i(4644),n=i(9504),s=r.aTypedArray,a=r.exportTypedArrayMethod,o=n([].join);a(\\\"join\\\",(function(t){return o(s(this),t)}))},6812:function(t,e,i){var r=i(4644),n=i(8745),s=i(8379),a=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"lastIndexOf\\\",(function(t){var e=arguments.length;return n(s,a(this),e>1?[t,arguments[1]]:[t])}))},8995:function(t,e,i){var r=i(4644),n=i(9213).map,s=i(1412),a=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"map\\\",(function(t){return n(a(this),t,arguments.length>1?arguments[1]:void 0,(function(t,e){return new(s(t))(e)}))}))},6072:function(t,e,i){var r=i(4644),n=i(926).right,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"reduceRight\\\",(function(t){var e=arguments.length;return n(s(this),t,e,e>1?arguments[1]:void 0)}))},1575:function(t,e,i){var r=i(4644),n=i(926).left,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"reduce\\\",(function(t){var e=arguments.length;return n(s(this),t,e,e>1?arguments[1]:void 0)}))},8747:function(t,e,i){var r=i(4644),n=r.aTypedArray,s=r.exportTypedArrayMethod,a=Math.floor;s(\\\"reverse\\\",(function(){for(var t,e=this,i=n(e).length,r=a(i/2),s=0;s<r;)t=e[s],e[s++]=e[--i],e[i]=t;return e}))},8845:function(t,e,i){var r=i(4576),n=i(9565),s=i(4644),a=i(6198),o=i(8229),h=i(8981),c=i(9039),u=r.RangeError,l=r.Int8Array,f=l&&l.prototype,d=f&&f.set,p=s.aTypedArray,v=s.exportTypedArrayMethod,b=!c((function(){var t=new Uint8ClampedArray(2);return n(d,t,{length:1,0:3},1),3!==t[1]})),g=b&&s.NATIVE_ARRAY_BUFFER_VIEWS&&c((function(){var t=new l(2);return t.set(1),t.set(\\\"2\\\",1),0!==t[0]||2!==t[1]}));v(\\\"set\\\",(function(t){p(this);var e=o(arguments.length>1?arguments[1]:void 0,1),i=h(t);if(b)return n(d,this,i,e);var r=this.length,s=a(i),c=0;if(s+e>r)throw new u(\\\"Wrong length\\\");for(;c<s;)this[e+c]=i[c++]}),!b||g)},9423:function(t,e,i){var r=i(4644),n=i(1412),s=i(9039),a=i(7680),o=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"slice\\\",(function(t,e){for(var i=a(o(this),t,e),r=n(this),s=0,h=i.length,c=new r(h);h>s;)c[s]=i[s++];return c}),s((function(){new Int8Array(1).slice()})))},7301:function(t,e,i){var r=i(4644),n=i(9213).some,s=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"some\\\",(function(t){return n(s(this),t,arguments.length>1?arguments[1]:void 0)}))},373:function(t,e,i){var r=i(4576),n=i(7476),s=i(9039),a=i(9306),o=i(4488),h=i(4644),c=i(3709),u=i(3763),l=i(9519),f=i(3607),d=h.aTypedArray,p=h.exportTypedArrayMethod,v=r.Uint16Array,b=v&&n(v.prototype.sort),g=!(!b||s((function(){b(new v(2),null)}))&&s((function(){b(new v(2),{})}))),y=!!b&&!s((function(){if(l)return l<74;if(c)return c<67;if(u)return!0;if(f)return f<602;var t,e,i=new v(516),r=Array(516);for(t=0;t<516;t++)e=t%4,i[t]=515-t,r[t]=t-2*e+3;for(b(i,(function(t,e){return(t/4|0)-(e/4|0)})),t=0;t<516;t++)if(i[t]!==r[t])return!0}));p(\\\"sort\\\",(function(t){return void 0!==t&&a(t),y?b(this,t):o(d(this),function(t){return function(e,i){return void 0!==t?+t(e,i)||0:i!=i?-1:e!=e?1:0===e&&0===i?1/e>0&&1/i<0?1:-1:e>i}}(t))}),!y||g)},6614:function(t,e,i){var r=i(4644),n=i(8014),s=i(5610),a=i(1412),o=r.aTypedArray;(0,r.exportTypedArrayMethod)(\\\"subarray\\\",(function(t,e){var i=o(this),r=i.length,h=s(t,r);return new(a(i))(i.buffer,i.byteOffset+h*i.BYTES_PER_ELEMENT,n((void 0===e?r:s(e,r))-h))}))},1405:function(t,e,i){var r=i(4576),n=i(8745),s=i(4644),a=i(9039),o=i(7680),h=r.Int8Array,c=s.aTypedArray,u=s.exportTypedArrayMethod,l=[].toLocaleString,f=!!h&&a((function(){l.call(new h(1))}));u(\\\"toLocaleString\\\",(function(){return n(l,f?o(c(this)):c(this),o(arguments))}),a((function(){return[1,2].toLocaleString()!==new h([1,2]).toLocaleString()}))||!a((function(){h.prototype.toLocaleString.call([1,2])})))},3684:function(t,e,i){var r=i(4644).exportTypedArrayMethod,n=i(9039),s=i(4576),a=i(9504),o=s.Uint8Array,h=o&&o.prototype||{},c=[].toString,u=a([].join);n((function(){c.call({})}))&&(c=function(){return u(this)});var l=h.toString!==c;r(\\\"toString\\\",c,l)},1489:function(t,e,i){i(5823)(\\\"Uint8\\\",(function(t){return function(e,i,r){return t(this,e,i,r)}}))},3500:function(t,e,i){var r=i(4576),n=i(7400),s=i(9296),a=i(235),o=i(6699),h=function(t){if(t&&t.forEach!==a)try{o(t,\\\"forEach\\\",a)}catch(e){t.forEach=a}};for(var c in n)n[c]&&h(r[c]&&r[c].prototype);h(s)},2953:function(t,e,i){var r=i(4576),n=i(7400),s=i(9296),a=i(3792),o=i(6699),h=i(687),c=i(8227)(\\\"iterator\\\"),u=a.values,l=function(t,e){if(t){if(t[c]!==u)try{o(t,c,u)}catch(e){t[c]=u}if(h(t,e,!0),n[e])for(var i in a)if(t[i]!==a[i])try{o(t,i,a[i])}catch(e){t[i]=a[i]}}};for(var f in n)l(r[f]&&r[f].prototype,f);l(s,\\\"DOMTokenList\\\")}},e={};function i(r){var n=e[r];if(void 0!==n)return n.exports;var s=e[r]={exports:{}};return t[r].call(s.exports,s,s.exports,i),s.exports}i.d=function(t,e){for(var r in e)i.o(e,r)&&!i.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},i.g=function(){if(\\\"object\\\"==typeof globalThis)return globalThis;try{return this||new Function(\\\"return this\\\")()}catch(t){if(\\\"object\\\"==typeof window)return window}}(),i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.r=function(t){\\\"undefined\\\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\\\"Module\\\"}),Object.defineProperty(t,\\\"__esModule\\\",{value:!0})};var r={};i.r(r),i.d(r,{CanvasProvider:function(){return O},CanvasRenderer:function(){return ot},HTMLProvider:function(){return Rt},HTMLRenderer:function(){return Pt},SVGProvider:function(){return bt},SVGRenderer:function(){return At}}),i(2675),i(9463),i(2259),i(5700),i(8706),i(2008),i(3792),i(4782),i(4743),i(1745),i(9572),i(2892),i(5428),i(4601),i(5843),i(3851),i(1278),i(9432),i(6099),i(8781),i(7764),i(1489),i(1630),i(2170),i(5044),i(9539),i(1694),i(9955),i(3206),i(4496),i(6651),i(2887),i(9369),i(6812),i(8995),i(1575),i(6072),i(8747),i(8845),i(9423),i(7301),i(373),i(6614),i(1405),i(3684),i(3500),i(2953),i(3771),i(3418),i(4423),i(2010),i(6033),i(5506),i(7495),i(1699),i(8156),i(5440);var n=new Map([[0,{bytes:2,alphabet:0}],[1,{bytes:1,alphabet:1}],[2,{bytes:1,alphabet:2}],[3,{bytes:1,alphabet:3}],[4,{bytes:1,alphabet:4}],[5,{bytes:1,alphabet:5}],[6,{bytes:1,alphabet:6}],[7,{bytes:1,alphabet:7}],[8,{bytes:1,alphabet:8}],[9,{bytes:1,alphabet:9}],[10,{bytes:1,alphabet:10}],[11,{bytes:1,alphabet:11}],[12,{bytes:2,alphabet:12}],[13,{bytes:2,alphabet:13}],[14,{bytes:2,alphabet:14}]]),s=new Map([[66,{bytes:2,alphabet:0}],[74,{bytes:1,alphabet:1}],[48,{bytes:1,alphabet:2}],[49,{bytes:1,alphabet:3}],[50,{bytes:1,alphabet:4}],[51,{bytes:1,alphabet:5}],[52,{bytes:1,alphabet:6}],[53,{bytes:1,alphabet:7}],[54,{bytes:1,alphabet:8}],[55,{bytes:1,alphabet:9}],[56,{bytes:1,alphabet:10}],[73,{bytes:1,alphabet:11}],[57,{bytes:2,alphabet:12}],[58,{bytes:2,alphabet:13}],[59,{bytes:2,alphabet:14}]]),a=new Map([[15,{bytes:2,alphabet:15}],[16,{bytes:1,alphabet:16}],[17,{bytes:1,alphabet:17}],[18,{bytes:1,alphabet:18}],[19,{bytes:1,alphabet:19}],[20,{bytes:1,alphabet:20}],[21,{bytes:1,alphabet:21}],[22,{bytes:1,alphabet:22}],[23,{bytes:1,alphabet:23}],[24,{bytes:1,alphabet:24}],[25,{bytes:1,alphabet:25}],[26,{bytes:1,alphabet:26}],[27,{bytes:1,alphabet:27}],[28,{bytes:1,alphabet:28}],[29,{bytes:1,alphabet:29}],[30,{bytes:1,alphabet:30}],[31,{bytes:1,alphabet:31}]]),o=new Map([[64,{bytes:2,alphabet:15}],[65,{bytes:1,alphabet:16}],[66,{bytes:1,alphabet:17}],[67,{bytes:1,alphabet:18}],[68,{bytes:1,alphabet:19}],[69,{bytes:1,alphabet:20}],[70,{bytes:1,alphabet:21}],[71,{bytes:1,alphabet:22}],[72,{bytes:1,alphabet:23}],[73,{bytes:1,alphabet:24}],[74,{bytes:1,alphabet:25}],[75,{bytes:1,alphabet:26}],[76,{bytes:1,alphabet:27}],[77,{bytes:1,alphabet:28}],[78,{bytes:1,alphabet:29}],[79,{bytes:1,alphabet:30}],[112,{bytes:1,alphabet:31}]]),h=[[\\\"#000000FF\\\",\\\"#FF0000FF\\\",\\\"#00FF00FF\\\",\\\"#FFFF00FF\\\",\\\"#0000FFFF\\\",\\\"#FF00FFFF\\\",\\\"#00FFFFFF\\\",\\\"#FFFFFFFF\\\",\\\"#00000000\\\",\\\"#AA0000FF\\\",\\\"#00AA00FF\\\",\\\"#AAAA00FF\\\",\\\"#0000AAFF\\\",\\\"#AA00AAFF\\\",\\\"#00AAAAFF\\\",\\\"#AAAAAAFF\\\"],[\\\"#000055FF\\\",\\\"#005500FF\\\",\\\"#005555FF\\\",\\\"#0055AAFF\\\",\\\"#0055FFFF\\\",\\\"#00AA55FF\\\",\\\"#00AAFFFF\\\",\\\"#00FF55FF\\\",\\\"#00FFAAFF\\\",\\\"#550000FF\\\",\\\"#550055FF\\\",\\\"#5500AAFF\\\",\\\"#5500FFFF\\\",\\\"#555500FF\\\",\\\"#555555FF\\\",\\\"#5555AAFF\\\"],[\\\"#5555FFFF\\\",\\\"#55AA00FF\\\",\\\"#55AA55FF\\\",\\\"#55AAAAFF\\\",\\\"#55AAFFFF\\\",\\\"#55FF00FF\\\",\\\"#55FF55FF\\\",\\\"#55FFAAFF\\\",\\\"#55FFFFFF\\\",\\\"#AA0055FF\\\",\\\"#AA00FFFF\\\",\\\"#AA5500FF\\\",\\\"#AA5555FF\\\",\\\"#AA55AAFF\\\",\\\"#AA55FFFF\\\",\\\"#AAAA55FF\\\"],[\\\"#AAAAFFFF\\\",\\\"#AAFF00FF\\\",\\\"#AAFF55FF\\\",\\\"#AAFFAAFF\\\",\\\"#AAFFFFFF\\\",\\\"#FF0055FF\\\",\\\"#FF00AAFF\\\",\\\"#FF5500FF\\\",\\\"#FF5555FF\\\",\\\"#FF55AAFF\\\",\\\"#FF55FFFF\\\",\\\"#FFAA00FF\\\",\\\"#FFAA55FF\\\",\\\"#FFAAAAFF\\\",\\\"#FFAAFFFF\\\",\\\"#FFFF55FF\\\"],[\\\"#FFFFAAFF\\\",\\\"#00000080\\\",\\\"#FF000080\\\",\\\"#00FF0080\\\",\\\"#FFFF0080\\\",\\\"#0000FF80\\\",\\\"#FF00FF80\\\",\\\"#00FFFF80\\\",\\\"#FFFFFF80\\\",\\\"#AA000080\\\",\\\"#00AA0080\\\",\\\"#AAAA0080\\\",\\\"#0000AA80\\\",\\\"#AA00AA80\\\",\\\"#00AAAA80\\\",\\\"#AAAAAA80\\\"],[\\\"#00005580\\\",\\\"#00550080\\\",\\\"#00555580\\\",\\\"#0055AA80\\\",\\\"#0055FF80\\\",\\\"#00AA5580\\\",\\\"#00AAFF80\\\",\\\"#00FF5580\\\",\\\"#00FFAA80\\\",\\\"#55000080\\\",\\\"#55005580\\\",\\\"#5500AA80\\\",\\\"#5500FF80\\\",\\\"#55550080\\\",\\\"#55555580\\\",\\\"#5555AA80\\\"],[\\\"#5555FF80\\\",\\\"#55AA0080\\\",\\\"#55AA5580\\\",\\\"#55AAAA80\\\",\\\"#55AAFF80\\\",\\\"#55FF0080\\\",\\\"#55FF5580\\\",\\\"#55FFAA80\\\",\\\"#55FFFF80\\\",\\\"#AA005580\\\",\\\"#AA00FF80\\\",\\\"#AA550080\\\",\\\"#AA555580\\\",\\\"#AA55AA80\\\",\\\"#AA55FF80\\\",\\\"#AAAA5580\\\"],[\\\"#AAAAFF80\\\",\\\"#AAFF0080\\\",\\\"#AAFF5580\\\",\\\"#AAFFAA80\\\",\\\"#AAFFFF80\\\",\\\"#FF005580\\\",\\\"#FF00AA80\\\",\\\"#FF550080\\\",\\\"#FF555580\\\",\\\"#FF55AA80\\\",\\\"#FF55FF80\\\",\\\"#FFAA0080\\\",\\\"#FFAA5580\\\",\\\"#FFAAAA80\\\",\\\"#FFAAFF80\\\",\\\"#FFFF5580\\\"]],c=[\\\"　\\\",\\\"、\\\",\\\"。\\\",\\\"，\\\",\\\"．\\\",\\\"・\\\",\\\"：\\\",\\\"；\\\",\\\"？\\\",\\\"！\\\",\\\"゛\\\",\\\"゜\\\",\\\"´\\\",\\\"｀\\\",\\\"¨\\\",\\\"＾\\\",\\\"￣\\\",\\\"＿\\\",\\\"ヽ\\\",\\\"ヾ\\\",\\\"ゝ\\\",\\\"ゞ\\\",\\\"〃\\\",\\\"仝\\\",\\\"々\\\",\\\"〆\\\",\\\"〇\\\",\\\"ー\\\",\\\"―\\\",\\\"‐\\\",\\\"／\\\",\\\"＼\\\",\\\"〜\\\",\\\"‖\\\",\\\"｜\\\",\\\"…\\\",\\\"‥\\\",\\\"‘\\\",\\\"’\\\",\\\"“\\\",\\\"”\\\",\\\"（\\\",\\\"）\\\",\\\"〔\\\",\\\"〕\\\",\\\"［\\\",\\\"］\\\",\\\"｛\\\",\\\"｝\\\",\\\"〈\\\",\\\"〉\\\",\\\"《\\\",\\\"》\\\",\\\"「\\\",\\\"」\\\",\\\"『\\\",\\\"』\\\",\\\"【\\\",\\\"】\\\",\\\"＋\\\",\\\"−\\\",\\\"±\\\",\\\"×\\\",\\\"÷\\\",\\\"＝\\\",\\\"≠\\\",\\\"＜\\\",\\\"＞\\\",\\\"≦\\\",\\\"≧\\\",\\\"∞\\\",\\\"∴\\\",\\\"♂\\\",\\\"♀\\\",\\\"°\\\",\\\"′\\\",\\\"″\\\",\\\"℃\\\",\\\"￥\\\",\\\"＄\\\",\\\"¢\\\",\\\"£\\\",\\\"％\\\",\\\"＃\\\",\\\"＆\\\",\\\"＊\\\",\\\"＠\\\",\\\"§\\\",\\\"☆\\\",\\\"★\\\",\\\"○\\\",\\\"●\\\",\\\"◎\\\",\\\"◇\\\",\\\"◆\\\",\\\"□\\\",\\\"■\\\",\\\"△\\\",\\\"▲\\\",\\\"▽\\\",\\\"▼\\\",\\\"※\\\",\\\"〒\\\",\\\"→\\\",\\\"←\\\",\\\"↑\\\",\\\"↓\\\",\\\"〓\\\",\\\"＇\\\",\\\"＂\\\",\\\"－\\\",\\\"～\\\",\\\"〳\\\",\\\"〴\\\",\\\"〵\\\",\\\"〻\\\",\\\"〼\\\",\\\"ヿ\\\",\\\"ゟ\\\",\\\"∈\\\",\\\"∋\\\",\\\"⊆\\\",\\\"⊇\\\",\\\"⊂\\\",\\\"⊃\\\",\\\"∪\\\",\\\"∩\\\",\\\"⊄\\\",\\\"⊅\\\",\\\"⊊\\\",\\\"⊋\\\",\\\"∉\\\",\\\"∅\\\",\\\"⌅\\\",\\\"⌆\\\",\\\"∧\\\",\\\"∨\\\",\\\"¬\\\",\\\"⇒\\\",\\\"⇔\\\",\\\"∀\\\",\\\"∃\\\",\\\"⊕\\\",\\\"⊖\\\",\\\"⊗\\\",\\\"∥\\\",\\\"∦\\\",\\\"⦅\\\",\\\"⦆\\\",\\\"〘\\\",\\\"〙\\\",\\\"〖\\\",\\\"〗\\\",\\\"∠\\\",\\\"⊥\\\",\\\"⌒\\\",\\\"∂\\\",\\\"∇\\\",\\\"≡\\\",\\\"≒\\\",\\\"≪\\\",\\\"≫\\\",\\\"√\\\",\\\"∽\\\",\\\"∝\\\",\\\"∵\\\",\\\"∫\\\",\\\"∬\\\",\\\"≢\\\",\\\"≃\\\",\\\"≅\\\",\\\"≈\\\",\\\"≶\\\",\\\"≷\\\",\\\"↔\\\",\\\"Å\\\",\\\"‰\\\",\\\"♯\\\",\\\"♭\\\",\\\"♪\\\",\\\"†\\\",\\\"‡\\\",\\\"¶\\\",\\\"♮\\\",\\\"♫\\\",\\\"♬\\\",\\\"♩\\\",\\\"◯\\\",\\\"▷\\\",\\\"▶\\\",\\\"◁\\\",\\\"◀\\\",\\\"↗\\\",\\\"↘\\\",\\\"↖\\\",\\\"↙\\\",\\\"⇄\\\",\\\"⇨\\\",\\\"⇦\\\",\\\"⇧\\\",\\\"⇩\\\",\\\"⤴\\\",\\\"⤵\\\",\\\"０\\\",\\\"１\\\",\\\"２\\\",\\\"３\\\",\\\"４\\\",\\\"５\\\",\\\"６\\\",\\\"７\\\",\\\"８\\\",\\\"９\\\",\\\"⦿\\\",\\\"◉\\\",\\\"〽\\\",\\\"﹆\\\",\\\"﹅\\\",\\\"◦\\\",\\\"•\\\",\\\"Ａ\\\",\\\"Ｂ\\\",\\\"Ｃ\\\",\\\"Ｄ\\\",\\\"Ｅ\\\",\\\"Ｆ\\\",\\\"Ｇ\\\",\\\"Ｈ\\\",\\\"Ｉ\\\",\\\"Ｊ\\\",\\\"Ｋ\\\",\\\"Ｌ\\\",\\\"Ｍ\\\",\\\"Ｎ\\\",\\\"Ｏ\\\",\\\"Ｐ\\\",\\\"Ｑ\\\",\\\"Ｒ\\\",\\\"Ｓ\\\",\\\"Ｔ\\\",\\\"Ｕ\\\",\\\"Ｖ\\\",\\\"Ｗ\\\",\\\"Ｘ\\\",\\\"Ｙ\\\",\\\"Ｚ\\\",\\\"∓\\\",\\\"ℵ\\\",\\\"ℏ\\\",\\\"㏋\\\",\\\"ℓ\\\",\\\"℧\\\",\\\"ａ\\\",\\\"ｂ\\\",\\\"ｃ\\\",\\\"ｄ\\\",\\\"ｅ\\\",\\\"ｆ\\\",\\\"ｇ\\\",\\\"ｈ\\\",\\\"ｉ\\\",\\\"ｊ\\\",\\\"ｋ\\\",\\\"ｌ\\\",\\\"ｍ\\\",\\\"ｎ\\\",\\\"ｏ\\\",\\\"ｐ\\\",\\\"ｑ\\\",\\\"ｒ\\\",\\\"ｓ\\\",\\\"ｔ\\\",\\\"ｕ\\\",\\\"ｖ\\\",\\\"ｗ\\\",\\\"ｘ\\\",\\\"ｙ\\\",\\\"ｚ\\\",\\\"゠\\\",\\\"–\\\",\\\"⧺\\\",\\\"⧻\\\",\\\"ぁ\\\",\\\"あ\\\",\\\"ぃ\\\",\\\"い\\\",\\\"ぅ\\\",\\\"う\\\",\\\"ぇ\\\",\\\"え\\\",\\\"ぉ\\\",\\\"お\\\",\\\"か\\\",\\\"が\\\",\\\"き\\\",\\\"ぎ\\\",\\\"く\\\",\\\"ぐ\\\",\\\"け\\\",\\\"げ\\\",\\\"こ\\\",\\\"ご\\\",\\\"さ\\\",\\\"ざ\\\",\\\"し\\\",\\\"じ\\\",\\\"す\\\",\\\"ず\\\",\\\"せ\\\",\\\"ぜ\\\",\\\"そ\\\",\\\"ぞ\\\",\\\"た\\\",\\\"だ\\\",\\\"ち\\\",\\\"ぢ\\\",\\\"っ\\\",\\\"つ\\\",\\\"づ\\\",\\\"て\\\",\\\"で\\\",\\\"と\\\",\\\"ど\\\",\\\"な\\\",\\\"に\\\",\\\"ぬ\\\",\\\"ね\\\",\\\"の\\\",\\\"は\\\",\\\"ば\\\",\\\"ぱ\\\",\\\"ひ\\\",\\\"び\\\",\\\"ぴ\\\",\\\"ふ\\\",\\\"ぶ\\\",\\\"ぷ\\\",\\\"へ\\\",\\\"べ\\\",\\\"ぺ\\\",\\\"ほ\\\",\\\"ぼ\\\",\\\"ぽ\\\",\\\"ま\\\",\\\"み\\\",\\\"む\\\",\\\"め\\\",\\\"も\\\",\\\"ゃ\\\",\\\"や\\\",\\\"ゅ\\\",\\\"ゆ\\\",\\\"ょ\\\",\\\"よ\\\",\\\"ら\\\",\\\"り\\\",\\\"る\\\",\\\"れ\\\",\\\"ろ\\\",\\\"ゎ\\\",\\\"わ\\\",\\\"ゐ\\\",\\\"ゑ\\\",\\\"を\\\",\\\"ん\\\",\\\"ゔ\\\",\\\"ゕ\\\",\\\"ゖ\\\",\\\"か゚\\\",\\\"き゚\\\",\\\"く゚\\\",\\\"け゚\\\",\\\"こ゚\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"ァ\\\",\\\"ア\\\",\\\"ィ\\\",\\\"イ\\\",\\\"ゥ\\\",\\\"ウ\\\",\\\"ェ\\\",\\\"エ\\\",\\\"ォ\\\",\\\"オ\\\",\\\"カ\\\",\\\"ガ\\\",\\\"キ\\\",\\\"ギ\\\",\\\"ク\\\",\\\"グ\\\",\\\"ケ\\\",\\\"ゲ\\\",\\\"コ\\\",\\\"ゴ\\\",\\\"サ\\\",\\\"ザ\\\",\\\"シ\\\",\\\"ジ\\\",\\\"ス\\\",\\\"ズ\\\",\\\"セ\\\",\\\"ゼ\\\",\\\"ソ\\\",\\\"ゾ\\\",\\\"タ\\\",\\\"ダ\\\",\\\"チ\\\",\\\"ヂ\\\",\\\"ッ\\\",\\\"ツ\\\",\\\"ヅ\\\",\\\"テ\\\",\\\"デ\\\",\\\"ト\\\",\\\"ド\\\",\\\"ナ\\\",\\\"ニ\\\",\\\"ヌ\\\",\\\"ネ\\\",\\\"ノ\\\",\\\"ハ\\\",\\\"バ\\\",\\\"パ\\\",\\\"ヒ\\\",\\\"ビ\\\",\\\"ピ\\\",\\\"フ\\\",\\\"ブ\\\",\\\"プ\\\",\\\"ヘ\\\",\\\"ベ\\\",\\\"ペ\\\",\\\"ホ\\\",\\\"ボ\\\",\\\"ポ\\\",\\\"マ\\\",\\\"ミ\\\",\\\"ム\\\",\\\"メ\\\",\\\"モ\\\",\\\"ャ\\\",\\\"ヤ\\\",\\\"ュ\\\",\\\"ユ\\\",\\\"ョ\\\",\\\"ヨ\\\",\\\"ラ\\\",\\\"リ\\\",\\\"ル\\\",\\\"レ\\\",\\\"ロ\\\",\\\"ヮ\\\",\\\"ワ\\\",\\\"ヰ\\\",\\\"ヱ\\\",\\\"ヲ\\\",\\\"ン\\\",\\\"ヴ\\\",\\\"ヵ\\\",\\\"ヶ\\\",\\\"カ゚\\\",\\\"キ゚\\\",\\\"ク゚\\\",\\\"ケ゚\\\",\\\"コ゚\\\",\\\"セ゚\\\",\\\"ツ゚\\\",\\\"ト゚\\\",\\\"Α\\\",\\\"Β\\\",\\\"Γ\\\",\\\"Δ\\\",\\\"Ε\\\",\\\"Ζ\\\",\\\"Η\\\",\\\"Θ\\\",\\\"Ι\\\",\\\"Κ\\\",\\\"Λ\\\",\\\"Μ\\\",\\\"Ν\\\",\\\"Ξ\\\",\\\"Ο\\\",\\\"Π\\\",\\\"Ρ\\\",\\\"Σ\\\",\\\"Τ\\\",\\\"Υ\\\",\\\"Φ\\\",\\\"Χ\\\",\\\"Ψ\\\",\\\"Ω\\\",\\\"♤\\\",\\\"♠\\\",\\\"♢\\\",\\\"♦\\\",\\\"♡\\\",\\\"♥\\\",\\\"♧\\\",\\\"♣\\\",\\\"α\\\",\\\"β\\\",\\\"γ\\\",\\\"δ\\\",\\\"ε\\\",\\\"ζ\\\",\\\"η\\\",\\\"θ\\\",\\\"ι\\\",\\\"κ\\\",\\\"λ\\\",\\\"μ\\\",\\\"ν\\\",\\\"ξ\\\",\\\"ο\\\",\\\"π\\\",\\\"ρ\\\",\\\"σ\\\",\\\"τ\\\",\\\"υ\\\",\\\"φ\\\",\\\"χ\\\",\\\"ψ\\\",\\\"ω\\\",\\\"ς\\\",\\\"⓵\\\",\\\"⓶\\\",\\\"⓷\\\",\\\"⓸\\\",\\\"⓹\\\",\\\"⓺\\\",\\\"⓻\\\",\\\"⓼\\\",\\\"⓽\\\",\\\"⓾\\\",\\\"☖\\\",\\\"☗\\\",\\\"〠\\\",\\\"☎\\\",\\\"☀\\\",\\\"☁\\\",\\\"☂\\\",\\\"☃\\\",\\\"♨\\\",\\\"▱\\\",\\\"ㇰ\\\",\\\"ㇱ\\\",\\\"ㇲ\\\",\\\"ㇳ\\\",\\\"ㇴ\\\",\\\"ㇵ\\\",\\\"ㇶ\\\",\\\"ㇷ\\\",\\\"ㇸ\\\",\\\"ㇹ\\\",\\\"ㇷ゚\\\",\\\"ㇺ\\\",\\\"ㇻ\\\",\\\"ㇼ\\\",\\\"ㇽ\\\",\\\"ㇾ\\\",\\\"ㇿ\\\",\\\"А\\\",\\\"Б\\\",\\\"В\\\",\\\"Г\\\",\\\"Д\\\",\\\"Е\\\",\\\"Ё\\\",\\\"Ж\\\",\\\"З\\\",\\\"И\\\",\\\"Й\\\",\\\"К\\\",\\\"Л\\\",\\\"М\\\",\\\"Н\\\",\\\"О\\\",\\\"П\\\",\\\"Р\\\",\\\"С\\\",\\\"Т\\\",\\\"У\\\",\\\"Ф\\\",\\\"Х\\\",\\\"Ц\\\",\\\"Ч\\\",\\\"Ш\\\",\\\"Щ\\\",\\\"Ъ\\\",\\\"Ы\\\",\\\"Ь\\\",\\\"Э\\\",\\\"Ю\\\",\\\"Я\\\",\\\"⎾\\\",\\\"⎿\\\",\\\"⏀\\\",\\\"⏁\\\",\\\"⏂\\\",\\\"⏃\\\",\\\"⏄\\\",\\\"⏅\\\",\\\"⏆\\\",\\\"⏇\\\",\\\"⏈\\\",\\\"⏉\\\",\\\"⏊\\\",\\\"⏋\\\",\\\"⏌\\\",\\\"а\\\",\\\"б\\\",\\\"в\\\",\\\"г\\\",\\\"д\\\",\\\"е\\\",\\\"ё\\\",\\\"ж\\\",\\\"з\\\",\\\"и\\\",\\\"й\\\",\\\"к\\\",\\\"л\\\",\\\"м\\\",\\\"н\\\",\\\"о\\\",\\\"п\\\",\\\"р\\\",\\\"с\\\",\\\"т\\\",\\\"у\\\",\\\"ф\\\",\\\"х\\\",\\\"ц\\\",\\\"ч\\\",\\\"ш\\\",\\\"щ\\\",\\\"ъ\\\",\\\"ы\\\",\\\"ь\\\",\\\"э\\\",\\\"ю\\\",\\\"я\\\",\\\"ヷ\\\",\\\"ヸ\\\",\\\"ヹ\\\",\\\"ヺ\\\",\\\"⋚\\\",\\\"⋛\\\",\\\"⅓\\\",\\\"⅔\\\",\\\"⅕\\\",\\\"✓\\\",\\\"⌘\\\",\\\"␣\\\",\\\"⏎\\\",\\\"─\\\",\\\"│\\\",\\\"┌\\\",\\\"┐\\\",\\\"┘\\\",\\\"└\\\",\\\"├\\\",\\\"┬\\\",\\\"┤\\\",\\\"┴\\\",\\\"┼\\\",\\\"━\\\",\\\"┃\\\",\\\"┏\\\",\\\"┓\\\",\\\"┛\\\",\\\"┗\\\",\\\"┣\\\",\\\"┳\\\",\\\"┫\\\",\\\"┻\\\",\\\"╋\\\",\\\"┠\\\",\\\"┯\\\",\\\"┨\\\",\\\"┷\\\",\\\"┿\\\",\\\"┝\\\",\\\"┰\\\",\\\"┥\\\",\\\"┸\\\",\\\"╂\\\",\\\"㉑\\\",\\\"㉒\\\",\\\"㉓\\\",\\\"㉔\\\",\\\"㉕\\\",\\\"㉖\\\",\\\"㉗\\\",\\\"㉘\\\",\\\"㉙\\\",\\\"㉚\\\",\\\"㉛\\\",\\\"㉜\\\",\\\"㉝\\\",\\\"㉞\\\",\\\"㉟\\\",\\\"㊱\\\",\\\"㊲\\\",\\\"㊳\\\",\\\"㊴\\\",\\\"㊵\\\",\\\"㊶\\\",\\\"㊷\\\",\\\"㊸\\\",\\\"㊹\\\",\\\"㊺\\\",\\\"㊻\\\",\\\"㊼\\\",\\\"㊽\\\",\\\"㊾\\\",\\\"㊿\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"◐\\\",\\\"◑\\\",\\\"◒\\\",\\\"◓\\\",\\\"‼\\\",\\\"⁇\\\",\\\"⁈\\\",\\\"⁉\\\",\\\"Ǎ\\\",\\\"ǎ\\\",\\\"ǐ\\\",\\\"Ḿ\\\",\\\"ḿ\\\",\\\"Ǹ\\\",\\\"ǹ\\\",\\\"Ǒ\\\",\\\"ǒ\\\",\\\"ǔ\\\",\\\"ǖ\\\",\\\"ǘ\\\",\\\"ǚ\\\",\\\"ǜ\\\",\\\"\\\",\\\"\\\",\\\"€\\\",\\\" \\\",\\\"¡\\\",\\\"¤\\\",\\\"¦\\\",\\\"©\\\",\\\"ª\\\",\\\"«\\\",\\\"­\\\",\\\"®\\\",\\\"¯\\\",\\\"²\\\",\\\"³\\\",\\\"·\\\",\\\"¸\\\",\\\"¹\\\",\\\"º\\\",\\\"»\\\",\\\"¼\\\",\\\"½\\\",\\\"¾\\\",\\\"¿\\\",\\\"À\\\",\\\"Á\\\",\\\"Â\\\",\\\"Ã\\\",\\\"Ä\\\",\\\"Å\\\",\\\"Æ\\\",\\\"Ç\\\",\\\"È\\\",\\\"É\\\",\\\"Ê\\\",\\\"Ë\\\",\\\"Ì\\\",\\\"Í\\\",\\\"Î\\\",\\\"Ï\\\",\\\"Ð\\\",\\\"Ñ\\\",\\\"Ò\\\",\\\"Ó\\\",\\\"Ô\\\",\\\"Õ\\\",\\\"Ö\\\",\\\"Ø\\\",\\\"Ù\\\",\\\"Ú\\\",\\\"Û\\\",\\\"Ü\\\",\\\"Ý\\\",\\\"Þ\\\",\\\"ß\\\",\\\"à\\\",\\\"á\\\",\\\"â\\\",\\\"ã\\\",\\\"ä\\\",\\\"å\\\",\\\"æ\\\",\\\"ç\\\",\\\"è\\\",\\\"é\\\",\\\"ê\\\",\\\"ë\\\",\\\"ì\\\",\\\"í\\\",\\\"î\\\",\\\"ï\\\",\\\"ð\\\",\\\"ñ\\\",\\\"ò\\\",\\\"ó\\\",\\\"ô\\\",\\\"õ\\\",\\\"ö\\\",\\\"ø\\\",\\\"ù\\\",\\\"ú\\\",\\\"û\\\",\\\"ü\\\",\\\"ý\\\",\\\"þ\\\",\\\"ÿ\\\",\\\"Ā\\\",\\\"Ī\\\",\\\"Ū\\\",\\\"Ē\\\",\\\"Ō\\\",\\\"ā\\\",\\\"ī\\\",\\\"ū\\\",\\\"ē\\\",\\\"ō\\\",\\\"Ą\\\",\\\"˘\\\",\\\"Ł\\\",\\\"Ľ\\\",\\\"Ś\\\",\\\"Š\\\",\\\"Ş\\\",\\\"Ť\\\",\\\"Ź\\\",\\\"Ž\\\",\\\"Ż\\\",\\\"ą\\\",\\\"˛\\\",\\\"ł\\\",\\\"ľ\\\",\\\"ś\\\",\\\"ˇ\\\",\\\"š\\\",\\\"ş\\\",\\\"ť\\\",\\\"ź\\\",\\\"˝\\\",\\\"ž\\\",\\\"ż\\\",\\\"Ŕ\\\",\\\"Ă\\\",\\\"Ĺ\\\",\\\"Ć\\\",\\\"Č\\\",\\\"Ę\\\",\\\"Ě\\\",\\\"Ď\\\",\\\"Ń\\\",\\\"Ň\\\",\\\"Ő\\\",\\\"Ř\\\",\\\"Ů\\\",\\\"Ű\\\",\\\"Ţ\\\",\\\"ŕ\\\",\\\"ă\\\",\\\"ĺ\\\",\\\"ć\\\",\\\"č\\\",\\\"ę\\\",\\\"ě\\\",\\\"ď\\\",\\\"đ\\\",\\\"ń\\\",\\\"ň\\\",\\\"ő\\\",\\\"ř\\\",\\\"ů\\\",\\\"ű\\\",\\\"ţ\\\",\\\"˙\\\",\\\"Ĉ\\\",\\\"Ĝ\\\",\\\"Ĥ\\\",\\\"Ĵ\\\",\\\"Ŝ\\\",\\\"Ŭ\\\",\\\"ĉ\\\",\\\"ĝ\\\",\\\"ĥ\\\",\\\"ĵ\\\",\\\"ŝ\\\",\\\"ŭ\\\",\\\"ɱ\\\",\\\"ʋ\\\",\\\"ɾ\\\",\\\"ʃ\\\",\\\"ʒ\\\",\\\"ɬ\\\",\\\"ɮ\\\",\\\"ɹ\\\",\\\"ʈ\\\",\\\"ɖ\\\",\\\"ɳ\\\",\\\"ɽ\\\",\\\"ʂ\\\",\\\"ʐ\\\",\\\"ɻ\\\",\\\"ɭ\\\",\\\"ɟ\\\",\\\"ɲ\\\",\\\"ʝ\\\",\\\"ʎ\\\",\\\"ɡ\\\",\\\"ŋ\\\",\\\"ɰ\\\",\\\"ʁ\\\",\\\"ħ\\\",\\\"ʕ\\\",\\\"ʔ\\\",\\\"ɦ\\\",\\\"ʘ\\\",\\\"ǂ\\\",\\\"ɓ\\\",\\\"ɗ\\\",\\\"ʄ\\\",\\\"ɠ\\\",\\\"Ɠ\\\",\\\"œ\\\",\\\"Œ\\\",\\\"ɨ\\\",\\\"ʉ\\\",\\\"ɘ\\\",\\\"ɵ\\\",\\\"ə\\\",\\\"ɜ\\\",\\\"ɞ\\\",\\\"ɐ\\\",\\\"ɯ\\\",\\\"ʊ\\\",\\\"ɤ\\\",\\\"ʌ\\\",\\\"ɔ\\\",\\\"ɑ\\\",\\\"ɒ\\\",\\\"ʍ\\\",\\\"ɥ\\\",\\\"ʢ\\\",\\\"ʡ\\\",\\\"ɕ\\\",\\\"ʑ\\\",\\\"ɺ\\\",\\\"ɧ\\\",\\\"ɚ\\\",\\\"æ̀\\\",\\\"ǽ\\\",\\\"ὰ\\\",\\\"ά\\\",\\\"ɔ̀\\\",\\\"ɔ́\\\",\\\"ʌ̀\\\",\\\"ʌ́\\\",\\\"ə̀\\\",\\\"ə́\\\",\\\"ɚ̀\\\",\\\"ɚ́\\\",\\\"ὲ\\\",\\\"έ\\\",\\\"͡\\\",\\\"ˈ\\\",\\\"ˌ\\\",\\\"ː\\\",\\\"ˑ\\\",\\\"̆\\\",\\\"‿\\\",\\\"̋\\\",\\\"́\\\",\\\"̄\\\",\\\"̀\\\",\\\"̏\\\",\\\"̌\\\",\\\"̂\\\",\\\"˥\\\",\\\"˦\\\",\\\"˧\\\",\\\"˨\\\",\\\"˩\\\",\\\"˩˥\\\",\\\"˥˩\\\",\\\"̥\\\",\\\"̬\\\",\\\"̹\\\",\\\"̜\\\",\\\"̟\\\",\\\"̠\\\",\\\"̈\\\",\\\"̽\\\",\\\"̩\\\",\\\"̯\\\",\\\"˞\\\",\\\"̤\\\",\\\"̰\\\",\\\"̼\\\",\\\"̴\\\",\\\"̝\\\",\\\"̞\\\",\\\"̘\\\",\\\"̙\\\",\\\"̪\\\",\\\"̺\\\",\\\"̻\\\",\\\"̃\\\",\\\"̚\\\",\\\"❶\\\",\\\"❷\\\",\\\"❸\\\",\\\"❹\\\",\\\"❺\\\",\\\"❻\\\",\\\"❼\\\",\\\"❽\\\",\\\"❾\\\",\\\"❿\\\",\\\"⓫\\\",\\\"⓬\\\",\\\"⓭\\\",\\\"⓮\\\",\\\"⓯\\\",\\\"⓰\\\",\\\"⓱\\\",\\\"⓲\\\",\\\"⓳\\\",\\\"⓴\\\",\\\"ⅰ\\\",\\\"ⅱ\\\",\\\"ⅲ\\\",\\\"ⅳ\\\",\\\"ⅴ\\\",\\\"ⅵ\\\",\\\"ⅶ\\\",\\\"ⅷ\\\",\\\"ⅸ\\\",\\\"ⅹ\\\",\\\"ⅺ\\\",\\\"ⅻ\\\",\\\"ⓐ\\\",\\\"ⓑ\\\",\\\"ⓒ\\\",\\\"ⓓ\\\",\\\"ⓔ\\\",\\\"ⓕ\\\",\\\"ⓖ\\\",\\\"ⓗ\\\",\\\"ⓘ\\\",\\\"ⓙ\\\",\\\"ⓚ\\\",\\\"ⓛ\\\",\\\"ⓜ\\\",\\\"ⓝ\\\",\\\"ⓞ\\\",\\\"ⓟ\\\",\\\"ⓠ\\\",\\\"ⓡ\\\",\\\"ⓢ\\\",\\\"ⓣ\\\",\\\"ⓤ\\\",\\\"ⓥ\\\",\\\"ⓦ\\\",\\\"ⓧ\\\",\\\"ⓨ\\\",\\\"ⓩ\\\",\\\"㋐\\\",\\\"㋑\\\",\\\"㋒\\\",\\\"㋓\\\",\\\"㋔\\\",\\\"㋕\\\",\\\"㋖\\\",\\\"㋗\\\",\\\"㋘\\\",\\\"㋙\\\",\\\"㋚\\\",\\\"㋛\\\",\\\"㋜\\\",\\\"㋝\\\",\\\"㋞\\\",\\\"㋟\\\",\\\"㋠\\\",\\\"㋡\\\",\\\"㋢\\\",\\\"㋣\\\",\\\"㋺\\\",\\\"㋩\\\",\\\"㋥\\\",\\\"㋭\\\",\\\"㋬\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⁑\\\",\\\"⁂\\\",\\\"①\\\",\\\"②\\\",\\\"③\\\",\\\"④\\\",\\\"⑤\\\",\\\"⑥\\\",\\\"⑦\\\",\\\"⑧\\\",\\\"⑨\\\",\\\"⑩\\\",\\\"⑪\\\",\\\"⑫\\\",\\\"⑬\\\",\\\"⑭\\\",\\\"⑮\\\",\\\"⑯\\\",\\\"⑰\\\",\\\"⑱\\\",\\\"⑲\\\",\\\"⑳\\\",\\\"Ⅰ\\\",\\\"Ⅱ\\\",\\\"Ⅲ\\\",\\\"Ⅳ\\\",\\\"Ⅴ\\\",\\\"Ⅵ\\\",\\\"Ⅶ\\\",\\\"Ⅷ\\\",\\\"Ⅸ\\\",\\\"Ⅹ\\\",\\\"Ⅺ\\\",\\\"㍉\\\",\\\"㌔\\\",\\\"㌢\\\",\\\"㍍\\\",\\\"㌘\\\",\\\"㌧\\\",\\\"㌃\\\",\\\"㌶\\\",\\\"㍑\\\",\\\"㍗\\\",\\\"㌍\\\",\\\"㌦\\\",\\\"㌣\\\",\\\"㌫\\\",\\\"㍊\\\",\\\"㌻\\\",\\\"㎜\\\",\\\"㎝\\\",\\\"㎞\\\",\\\"㎎\\\",\\\"㎏\\\",\\\"㏄\\\",\\\"㎡\\\",\\\"Ⅻ\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㍻\\\",\\\"〝\\\",\\\"〟\\\",\\\"№\\\",\\\"㏍\\\",\\\"℡\\\",\\\"㊤\\\",\\\"㊥\\\",\\\"㊦\\\",\\\"㊧\\\",\\\"㊨\\\",\\\"㈱\\\",\\\"㈲\\\",\\\"㈹\\\",\\\"㍾\\\",\\\"㍽\\\",\\\"㍼\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"∮\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"∟\\\",\\\"⊿\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"❖\\\",\\\"☞\\\",\\\"俱\\\",\\\"𠀋\\\",\\\"㐂\\\",\\\"丨\\\",\\\"丯\\\",\\\"丰\\\",\\\"亍\\\",\\\"仡\\\",\\\"份\\\",\\\"仿\\\",\\\"伃\\\",\\\"伋\\\",\\\"你\\\",\\\"佈\\\",\\\"佉\\\",\\\"佖\\\",\\\"佟\\\",\\\"佪\\\",\\\"佬\\\",\\\"佾\\\",\\\"侊\\\",\\\"侔\\\",\\\"侗\\\",\\\"侮\\\",\\\"俉\\\",\\\"俠\\\",\\\"倁\\\",\\\"倂\\\",\\\"倎\\\",\\\"倘\\\",\\\"倧\\\",\\\"倮\\\",\\\"偀\\\",\\\"倻\\\",\\\"偁\\\",\\\"傔\\\",\\\"僌\\\",\\\"僲\\\",\\\"僐\\\",\\\"僦\\\",\\\"僧\\\",\\\"儆\\\",\\\"儃\\\",\\\"儋\\\",\\\"儞\\\",\\\"儵\\\",\\\"兊\\\",\\\"免\\\",\\\"兕\\\",\\\"兗\\\",\\\"㒵\\\",\\\"冝\\\",\\\"凃\\\",\\\"凊\\\",\\\"凞\\\",\\\"凢\\\",\\\"凮\\\",\\\"刁\\\",\\\"㓛\\\",\\\"刓\\\",\\\"刕\\\",\\\"剉\\\",\\\"剗\\\",\\\"剡\\\",\\\"劓\\\",\\\"勈\\\",\\\"勉\\\",\\\"勌\\\",\\\"勐\\\",\\\"勖\\\",\\\"勛\\\",\\\"勤\\\",\\\"勰\\\",\\\"勻\\\",\\\"匀\\\",\\\"匇\\\",\\\"匜\\\",\\\"卑\\\",\\\"卡\\\",\\\"卣\\\",\\\"卽\\\",\\\"厓\\\",\\\"厝\\\",\\\"厲\\\",\\\"吒\\\",\\\"吧\\\",\\\"呍\\\",\\\"咜\\\",\\\"呫\\\",\\\"呴\\\",\\\"呿\\\",\\\"咈\\\",\\\"咖\\\",\\\"咡\\\",\\\"咩\\\",\\\"哆\\\",\\\"哿\\\",\\\"唎\\\",\\\"唫\\\",\\\"唵\\\",\\\"啐\\\",\\\"啞\\\",\\\"喁\\\",\\\"喆\\\",\\\"喎\\\",\\\"喝\\\",\\\"喭\\\",\\\"嗎\\\",\\\"嘆\\\",\\\"嘈\\\",\\\"嘎\\\",\\\"嘻\\\",\\\"噉\\\",\\\"噶\\\",\\\"噦\\\",\\\"器\\\",\\\"噯\\\",\\\"噱\\\",\\\"噲\\\",\\\"嚙\\\",\\\"嚞\\\",\\\"嚩\\\",\\\"嚬\\\",\\\"嚳\\\",\\\"囉\\\",\\\"囊\\\",\\\"圊\\\",\\\"𡈽\\\",\\\"圡\\\",\\\"圯\\\",\\\"圳\\\",\\\"圴\\\",\\\"坰\\\",\\\"坷\\\",\\\"坼\\\",\\\"垜\\\",\\\"﨏\\\",\\\"𡌛\\\",\\\"垸\\\",\\\"埇\\\",\\\"埈\\\",\\\"埏\\\",\\\"埤\\\",\\\"埭\\\",\\\"埵\\\",\\\"埶\\\",\\\"埿\\\",\\\"堉\\\",\\\"塚\\\",\\\"塡\\\",\\\"塤\\\",\\\"塀\\\",\\\"塼\\\",\\\"墉\\\",\\\"增\\\",\\\"墨\\\",\\\"墩\\\",\\\"𡑮\\\",\\\"壒\\\",\\\"壎\\\",\\\"壔\\\",\\\"壚\\\",\\\"壠\\\",\\\"壩\\\",\\\"夌\\\",\\\"虁\\\",\\\"奝\\\",\\\"奭\\\",\\\"妋\\\",\\\"妒\\\",\\\"妤\\\",\\\"姃\\\",\\\"姒\\\",\\\"姝\\\",\\\"娓\\\",\\\"娣\\\",\\\"婧\\\",\\\"婭\\\",\\\"婷\\\",\\\"婾\\\",\\\"媄\\\",\\\"媞\\\",\\\"媧\\\",\\\"嫄\\\",\\\"𡢽\\\",\\\"嬙\\\",\\\"嬥\\\",\\\"剝\\\",\\\"亜\\\",\\\"唖\\\",\\\"娃\\\",\\\"阿\\\",\\\"哀\\\",\\\"愛\\\",\\\"挨\\\",\\\"姶\\\",\\\"逢\\\",\\\"葵\\\",\\\"茜\\\",\\\"穐\\\",\\\"悪\\\",\\\"握\\\",\\\"渥\\\",\\\"旭\\\",\\\"葦\\\",\\\"芦\\\",\\\"鯵\\\",\\\"梓\\\",\\\"圧\\\",\\\"斡\\\",\\\"扱\\\",\\\"宛\\\",\\\"姐\\\",\\\"虻\\\",\\\"飴\\\",\\\"絢\\\",\\\"綾\\\",\\\"鮎\\\",\\\"或\\\",\\\"粟\\\",\\\"袷\\\",\\\"安\\\",\\\"庵\\\",\\\"按\\\",\\\"暗\\\",\\\"案\\\",\\\"闇\\\",\\\"鞍\\\",\\\"杏\\\",\\\"以\\\",\\\"伊\\\",\\\"位\\\",\\\"依\\\",\\\"偉\\\",\\\"囲\\\",\\\"夷\\\",\\\"委\\\",\\\"威\\\",\\\"尉\\\",\\\"惟\\\",\\\"意\\\",\\\"慰\\\",\\\"易\\\",\\\"椅\\\",\\\"為\\\",\\\"畏\\\",\\\"異\\\",\\\"移\\\",\\\"維\\\",\\\"緯\\\",\\\"胃\\\",\\\"萎\\\",\\\"衣\\\",\\\"謂\\\",\\\"違\\\",\\\"遺\\\",\\\"医\\\",\\\"井\\\",\\\"亥\\\",\\\"域\\\",\\\"育\\\",\\\"郁\\\",\\\"磯\\\",\\\"一\\\",\\\"壱\\\",\\\"溢\\\",\\\"逸\\\",\\\"稲\\\",\\\"茨\\\",\\\"芋\\\",\\\"鰯\\\",\\\"允\\\",\\\"印\\\",\\\"咽\\\",\\\"員\\\",\\\"因\\\",\\\"姻\\\",\\\"引\\\",\\\"飲\\\",\\\"淫\\\",\\\"胤\\\",\\\"蔭\\\",\\\"院\\\",\\\"陰\\\",\\\"隠\\\",\\\"韻\\\",\\\"吋\\\",\\\"右\\\",\\\"宇\\\",\\\"烏\\\",\\\"羽\\\",\\\"迂\\\",\\\"雨\\\",\\\"卯\\\",\\\"鵜\\\",\\\"窺\\\",\\\"丑\\\",\\\"碓\\\",\\\"臼\\\",\\\"渦\\\",\\\"嘘\\\",\\\"唄\\\",\\\"欝\\\",\\\"蔚\\\",\\\"鰻\\\",\\\"姥\\\",\\\"厩\\\",\\\"浦\\\",\\\"瓜\\\",\\\"閏\\\",\\\"噂\\\",\\\"云\\\",\\\"運\\\",\\\"雲\\\",\\\"荏\\\",\\\"餌\\\",\\\"叡\\\",\\\"営\\\",\\\"嬰\\\",\\\"影\\\",\\\"映\\\",\\\"曳\\\",\\\"栄\\\",\\\"永\\\",\\\"泳\\\",\\\"洩\\\",\\\"瑛\\\",\\\"盈\\\",\\\"穎\\\",\\\"頴\\\",\\\"英\\\",\\\"衛\\\",\\\"詠\\\",\\\"鋭\\\",\\\"液\\\",\\\"疫\\\",\\\"益\\\",\\\"駅\\\",\\\"悦\\\",\\\"謁\\\",\\\"越\\\",\\\"閲\\\",\\\"榎\\\",\\\"厭\\\",\\\"円\\\",\\\"園\\\",\\\"堰\\\",\\\"奄\\\",\\\"宴\\\",\\\"延\\\",\\\"怨\\\",\\\"掩\\\",\\\"援\\\",\\\"沿\\\",\\\"演\\\",\\\"炎\\\",\\\"焔\\\",\\\"煙\\\",\\\"燕\\\",\\\"猿\\\",\\\"縁\\\",\\\"艶\\\",\\\"苑\\\",\\\"薗\\\",\\\"遠\\\",\\\"鉛\\\",\\\"鴛\\\",\\\"塩\\\",\\\"於\\\",\\\"汚\\\",\\\"甥\\\",\\\"凹\\\",\\\"央\\\",\\\"奥\\\",\\\"往\\\",\\\"応\\\",\\\"押\\\",\\\"旺\\\",\\\"横\\\",\\\"欧\\\",\\\"殴\\\",\\\"王\\\",\\\"翁\\\",\\\"襖\\\",\\\"鴬\\\",\\\"鴎\\\",\\\"黄\\\",\\\"岡\\\",\\\"沖\\\",\\\"荻\\\",\\\"億\\\",\\\"屋\\\",\\\"憶\\\",\\\"臆\\\",\\\"桶\\\",\\\"牡\\\",\\\"乙\\\",\\\"俺\\\",\\\"卸\\\",\\\"恩\\\",\\\"温\\\",\\\"穏\\\",\\\"音\\\",\\\"下\\\",\\\"化\\\",\\\"仮\\\",\\\"何\\\",\\\"伽\\\",\\\"価\\\",\\\"佳\\\",\\\"加\\\",\\\"可\\\",\\\"嘉\\\",\\\"夏\\\",\\\"嫁\\\",\\\"家\\\",\\\"寡\\\",\\\"科\\\",\\\"暇\\\",\\\"果\\\",\\\"架\\\",\\\"歌\\\",\\\"河\\\",\\\"火\\\",\\\"珂\\\",\\\"禍\\\",\\\"禾\\\",\\\"稼\\\",\\\"箇\\\",\\\"花\\\",\\\"苛\\\",\\\"茄\\\",\\\"荷\\\",\\\"華\\\",\\\"菓\\\",\\\"蝦\\\",\\\"課\\\",\\\"嘩\\\",\\\"貨\\\",\\\"迦\\\",\\\"過\\\",\\\"霞\\\",\\\"蚊\\\",\\\"俄\\\",\\\"峨\\\",\\\"我\\\",\\\"牙\\\",\\\"画\\\",\\\"臥\\\",\\\"芽\\\",\\\"蛾\\\",\\\"賀\\\",\\\"雅\\\",\\\"餓\\\",\\\"駕\\\",\\\"介\\\",\\\"会\\\",\\\"解\\\",\\\"回\\\",\\\"塊\\\",\\\"壊\\\",\\\"廻\\\",\\\"快\\\",\\\"怪\\\",\\\"悔\\\",\\\"恢\\\",\\\"懐\\\",\\\"戒\\\",\\\"拐\\\",\\\"改\\\",\\\"魁\\\",\\\"晦\\\",\\\"械\\\",\\\"海\\\",\\\"灰\\\",\\\"界\\\",\\\"皆\\\",\\\"絵\\\",\\\"芥\\\",\\\"蟹\\\",\\\"開\\\",\\\"階\\\",\\\"貝\\\",\\\"凱\\\",\\\"劾\\\",\\\"外\\\",\\\"咳\\\",\\\"害\\\",\\\"崖\\\",\\\"慨\\\",\\\"概\\\",\\\"涯\\\",\\\"碍\\\",\\\"蓋\\\",\\\"街\\\",\\\"該\\\",\\\"鎧\\\",\\\"骸\\\",\\\"浬\\\",\\\"馨\\\",\\\"蛙\\\",\\\"垣\\\",\\\"柿\\\",\\\"蛎\\\",\\\"鈎\\\",\\\"劃\\\",\\\"嚇\\\",\\\"各\\\",\\\"廓\\\",\\\"拡\\\",\\\"撹\\\",\\\"格\\\",\\\"核\\\",\\\"殻\\\",\\\"獲\\\",\\\"確\\\",\\\"穫\\\",\\\"覚\\\",\\\"角\\\",\\\"赫\\\",\\\"較\\\",\\\"郭\\\",\\\"閣\\\",\\\"隔\\\",\\\"革\\\",\\\"学\\\",\\\"岳\\\",\\\"楽\\\",\\\"額\\\",\\\"顎\\\",\\\"掛\\\",\\\"笠\\\",\\\"樫\\\",\\\"橿\\\",\\\"梶\\\",\\\"鰍\\\",\\\"潟\\\",\\\"割\\\",\\\"喝\\\",\\\"恰\\\",\\\"括\\\",\\\"活\\\",\\\"渇\\\",\\\"滑\\\",\\\"葛\\\",\\\"褐\\\",\\\"轄\\\",\\\"且\\\",\\\"鰹\\\",\\\"叶\\\",\\\"椛\\\",\\\"樺\\\",\\\"鞄\\\",\\\"株\\\",\\\"兜\\\",\\\"竃\\\",\\\"蒲\\\",\\\"釜\\\",\\\"鎌\\\",\\\"噛\\\",\\\"鴨\\\",\\\"栢\\\",\\\"茅\\\",\\\"萱\\\",\\\"粥\\\",\\\"刈\\\",\\\"苅\\\",\\\"瓦\\\",\\\"乾\\\",\\\"侃\\\",\\\"冠\\\",\\\"寒\\\",\\\"刊\\\",\\\"勘\\\",\\\"勧\\\",\\\"巻\\\",\\\"喚\\\",\\\"堪\\\",\\\"姦\\\",\\\"完\\\",\\\"官\\\",\\\"寛\\\",\\\"干\\\",\\\"幹\\\",\\\"患\\\",\\\"感\\\",\\\"慣\\\",\\\"憾\\\",\\\"換\\\",\\\"敢\\\",\\\"柑\\\",\\\"桓\\\",\\\"棺\\\",\\\"款\\\",\\\"歓\\\",\\\"汗\\\",\\\"漢\\\",\\\"澗\\\",\\\"潅\\\",\\\"環\\\",\\\"甘\\\",\\\"監\\\",\\\"看\\\",\\\"竿\\\",\\\"管\\\",\\\"簡\\\",\\\"緩\\\",\\\"缶\\\",\\\"翰\\\",\\\"肝\\\",\\\"艦\\\",\\\"莞\\\",\\\"観\\\",\\\"諌\\\",\\\"貫\\\",\\\"還\\\",\\\"鑑\\\",\\\"間\\\",\\\"閑\\\",\\\"関\\\",\\\"陥\\\",\\\"韓\\\",\\\"館\\\",\\\"舘\\\",\\\"丸\\\",\\\"含\\\",\\\"岸\\\",\\\"巌\\\",\\\"玩\\\",\\\"癌\\\",\\\"眼\\\",\\\"岩\\\",\\\"翫\\\",\\\"贋\\\",\\\"雁\\\",\\\"頑\\\",\\\"顔\\\",\\\"願\\\",\\\"企\\\",\\\"伎\\\",\\\"危\\\",\\\"喜\\\",\\\"器\\\",\\\"基\\\",\\\"奇\\\",\\\"嬉\\\",\\\"寄\\\",\\\"岐\\\",\\\"希\\\",\\\"幾\\\",\\\"忌\\\",\\\"揮\\\",\\\"机\\\",\\\"旗\\\",\\\"既\\\",\\\"期\\\",\\\"棋\\\",\\\"棄\\\",\\\"機\\\",\\\"帰\\\",\\\"毅\\\",\\\"気\\\",\\\"汽\\\",\\\"畿\\\",\\\"祈\\\",\\\"季\\\",\\\"稀\\\",\\\"紀\\\",\\\"徽\\\",\\\"規\\\",\\\"記\\\",\\\"貴\\\",\\\"起\\\",\\\"軌\\\",\\\"輝\\\",\\\"飢\\\",\\\"騎\\\",\\\"鬼\\\",\\\"亀\\\",\\\"偽\\\",\\\"儀\\\",\\\"妓\\\",\\\"宜\\\",\\\"戯\\\",\\\"技\\\",\\\"擬\\\",\\\"欺\\\",\\\"犠\\\",\\\"疑\\\",\\\"祇\\\",\\\"義\\\",\\\"蟻\\\",\\\"誼\\\",\\\"議\\\",\\\"掬\\\",\\\"菊\\\",\\\"鞠\\\",\\\"吉\\\",\\\"吃\\\",\\\"喫\\\",\\\"桔\\\",\\\"橘\\\",\\\"詰\\\",\\\"砧\\\",\\\"杵\\\",\\\"黍\\\",\\\"却\\\",\\\"客\\\",\\\"脚\\\",\\\"虐\\\",\\\"逆\\\",\\\"丘\\\",\\\"久\\\",\\\"仇\\\",\\\"休\\\",\\\"及\\\",\\\"吸\\\",\\\"宮\\\",\\\"弓\\\",\\\"急\\\",\\\"救\\\",\\\"朽\\\",\\\"求\\\",\\\"汲\\\",\\\"泣\\\",\\\"灸\\\",\\\"球\\\",\\\"究\\\",\\\"窮\\\",\\\"笈\\\",\\\"級\\\",\\\"糾\\\",\\\"給\\\",\\\"旧\\\",\\\"牛\\\",\\\"去\\\",\\\"居\\\",\\\"巨\\\",\\\"拒\\\",\\\"拠\\\",\\\"挙\\\",\\\"渠\\\",\\\"虚\\\",\\\"許\\\",\\\"距\\\",\\\"鋸\\\",\\\"漁\\\",\\\"禦\\\",\\\"魚\\\",\\\"亨\\\",\\\"享\\\",\\\"京\\\",\\\"供\\\",\\\"侠\\\",\\\"僑\\\",\\\"兇\\\",\\\"競\\\",\\\"共\\\",\\\"凶\\\",\\\"協\\\",\\\"匡\\\",\\\"卿\\\",\\\"叫\\\",\\\"喬\\\",\\\"境\\\",\\\"峡\\\",\\\"強\\\",\\\"彊\\\",\\\"怯\\\",\\\"恐\\\",\\\"恭\\\",\\\"挟\\\",\\\"教\\\",\\\"橋\\\",\\\"況\\\",\\\"狂\\\",\\\"狭\\\",\\\"矯\\\",\\\"胸\\\",\\\"脅\\\",\\\"興\\\",\\\"蕎\\\",\\\"郷\\\",\\\"鏡\\\",\\\"響\\\",\\\"饗\\\",\\\"驚\\\",\\\"仰\\\",\\\"凝\\\",\\\"尭\\\",\\\"暁\\\",\\\"業\\\",\\\"局\\\",\\\"曲\\\",\\\"極\\\",\\\"玉\\\",\\\"桐\\\",\\\"粁\\\",\\\"僅\\\",\\\"勤\\\",\\\"均\\\",\\\"巾\\\",\\\"錦\\\",\\\"斤\\\",\\\"欣\\\",\\\"欽\\\",\\\"琴\\\",\\\"禁\\\",\\\"禽\\\",\\\"筋\\\",\\\"緊\\\",\\\"芹\\\",\\\"菌\\\",\\\"衿\\\",\\\"襟\\\",\\\"謹\\\",\\\"近\\\",\\\"金\\\",\\\"吟\\\",\\\"銀\\\",\\\"九\\\",\\\"倶\\\",\\\"句\\\",\\\"区\\\",\\\"狗\\\",\\\"玖\\\",\\\"矩\\\",\\\"苦\\\",\\\"躯\\\",\\\"駆\\\",\\\"駈\\\",\\\"駒\\\",\\\"具\\\",\\\"愚\\\",\\\"虞\\\",\\\"喰\\\",\\\"空\\\",\\\"偶\\\",\\\"寓\\\",\\\"遇\\\",\\\"隅\\\",\\\"串\\\",\\\"櫛\\\",\\\"釧\\\",\\\"屑\\\",\\\"屈\\\",\\\"掘\\\",\\\"窟\\\",\\\"沓\\\",\\\"靴\\\",\\\"轡\\\",\\\"窪\\\",\\\"熊\\\",\\\"隈\\\",\\\"粂\\\",\\\"栗\\\",\\\"繰\\\",\\\"桑\\\",\\\"鍬\\\",\\\"勲\\\",\\\"君\\\",\\\"薫\\\",\\\"訓\\\",\\\"群\\\",\\\"軍\\\",\\\"郡\\\",\\\"卦\\\",\\\"袈\\\",\\\"祁\\\",\\\"係\\\",\\\"傾\\\",\\\"刑\\\",\\\"兄\\\",\\\"啓\\\",\\\"圭\\\",\\\"珪\\\",\\\"型\\\",\\\"契\\\",\\\"形\\\",\\\"径\\\",\\\"恵\\\",\\\"慶\\\",\\\"慧\\\",\\\"憩\\\",\\\"掲\\\",\\\"携\\\",\\\"敬\\\",\\\"景\\\",\\\"桂\\\",\\\"渓\\\",\\\"畦\\\",\\\"稽\\\",\\\"系\\\",\\\"経\\\",\\\"継\\\",\\\"繋\\\",\\\"罫\\\",\\\"茎\\\",\\\"荊\\\",\\\"蛍\\\",\\\"計\\\",\\\"詣\\\",\\\"警\\\",\\\"軽\\\",\\\"頚\\\",\\\"鶏\\\",\\\"芸\\\",\\\"迎\\\",\\\"鯨\\\",\\\"劇\\\",\\\"戟\\\",\\\"撃\\\",\\\"激\\\",\\\"隙\\\",\\\"桁\\\",\\\"傑\\\",\\\"欠\\\",\\\"決\\\",\\\"潔\\\",\\\"穴\\\",\\\"結\\\",\\\"血\\\",\\\"訣\\\",\\\"月\\\",\\\"件\\\",\\\"倹\\\",\\\"倦\\\",\\\"健\\\",\\\"兼\\\",\\\"券\\\",\\\"剣\\\",\\\"喧\\\",\\\"圏\\\",\\\"堅\\\",\\\"嫌\\\",\\\"建\\\",\\\"憲\\\",\\\"懸\\\",\\\"拳\\\",\\\"捲\\\",\\\"検\\\",\\\"権\\\",\\\"牽\\\",\\\"犬\\\",\\\"献\\\",\\\"研\\\",\\\"硯\\\",\\\"絹\\\",\\\"県\\\",\\\"肩\\\",\\\"見\\\",\\\"謙\\\",\\\"賢\\\",\\\"軒\\\",\\\"遣\\\",\\\"鍵\\\",\\\"険\\\",\\\"顕\\\",\\\"験\\\",\\\"鹸\\\",\\\"元\\\",\\\"原\\\",\\\"厳\\\",\\\"幻\\\",\\\"弦\\\",\\\"減\\\",\\\"源\\\",\\\"玄\\\",\\\"現\\\",\\\"絃\\\",\\\"舷\\\",\\\"言\\\",\\\"諺\\\",\\\"限\\\",\\\"乎\\\",\\\"個\\\",\\\"古\\\",\\\"呼\\\",\\\"固\\\",\\\"姑\\\",\\\"孤\\\",\\\"己\\\",\\\"庫\\\",\\\"弧\\\",\\\"戸\\\",\\\"故\\\",\\\"枯\\\",\\\"湖\\\",\\\"狐\\\",\\\"糊\\\",\\\"袴\\\",\\\"股\\\",\\\"胡\\\",\\\"菰\\\",\\\"虎\\\",\\\"誇\\\",\\\"跨\\\",\\\"鈷\\\",\\\"雇\\\",\\\"顧\\\",\\\"鼓\\\",\\\"五\\\",\\\"互\\\",\\\"伍\\\",\\\"午\\\",\\\"呉\\\",\\\"吾\\\",\\\"娯\\\",\\\"後\\\",\\\"御\\\",\\\"悟\\\",\\\"梧\\\",\\\"檎\\\",\\\"瑚\\\",\\\"碁\\\",\\\"語\\\",\\\"誤\\\",\\\"護\\\",\\\"醐\\\",\\\"乞\\\",\\\"鯉\\\",\\\"交\\\",\\\"佼\\\",\\\"侯\\\",\\\"候\\\",\\\"倖\\\",\\\"光\\\",\\\"公\\\",\\\"功\\\",\\\"効\\\",\\\"勾\\\",\\\"厚\\\",\\\"口\\\",\\\"向\\\",\\\"后\\\",\\\"喉\\\",\\\"坑\\\",\\\"垢\\\",\\\"好\\\",\\\"孔\\\",\\\"孝\\\",\\\"宏\\\",\\\"工\\\",\\\"巧\\\",\\\"巷\\\",\\\"幸\\\",\\\"広\\\",\\\"庚\\\",\\\"康\\\",\\\"弘\\\",\\\"恒\\\",\\\"慌\\\",\\\"抗\\\",\\\"拘\\\",\\\"控\\\",\\\"攻\\\",\\\"昂\\\",\\\"晃\\\",\\\"更\\\",\\\"杭\\\",\\\"校\\\",\\\"梗\\\",\\\"構\\\",\\\"江\\\",\\\"洪\\\",\\\"浩\\\",\\\"港\\\",\\\"溝\\\",\\\"甲\\\",\\\"皇\\\",\\\"硬\\\",\\\"稿\\\",\\\"糠\\\",\\\"紅\\\",\\\"紘\\\",\\\"絞\\\",\\\"綱\\\",\\\"耕\\\",\\\"考\\\",\\\"肯\\\",\\\"肱\\\",\\\"腔\\\",\\\"膏\\\",\\\"航\\\",\\\"荒\\\",\\\"行\\\",\\\"衡\\\",\\\"講\\\",\\\"貢\\\",\\\"購\\\",\\\"郊\\\",\\\"酵\\\",\\\"鉱\\\",\\\"砿\\\",\\\"鋼\\\",\\\"閤\\\",\\\"降\\\",\\\"項\\\",\\\"香\\\",\\\"高\\\",\\\"鴻\\\",\\\"剛\\\",\\\"劫\\\",\\\"号\\\",\\\"合\\\",\\\"壕\\\",\\\"拷\\\",\\\"濠\\\",\\\"豪\\\",\\\"轟\\\",\\\"麹\\\",\\\"克\\\",\\\"刻\\\",\\\"告\\\",\\\"国\\\",\\\"穀\\\",\\\"酷\\\",\\\"鵠\\\",\\\"黒\\\",\\\"獄\\\",\\\"漉\\\",\\\"腰\\\",\\\"甑\\\",\\\"忽\\\",\\\"惚\\\",\\\"骨\\\",\\\"狛\\\",\\\"込\\\",\\\"此\\\",\\\"頃\\\",\\\"今\\\",\\\"困\\\",\\\"坤\\\",\\\"墾\\\",\\\"婚\\\",\\\"恨\\\",\\\"懇\\\",\\\"昏\\\",\\\"昆\\\",\\\"根\\\",\\\"梱\\\",\\\"混\\\",\\\"痕\\\",\\\"紺\\\",\\\"艮\\\",\\\"魂\\\",\\\"些\\\",\\\"佐\\\",\\\"叉\\\",\\\"唆\\\",\\\"嵯\\\",\\\"左\\\",\\\"差\\\",\\\"査\\\",\\\"沙\\\",\\\"瑳\\\",\\\"砂\\\",\\\"詐\\\",\\\"鎖\\\",\\\"裟\\\",\\\"坐\\\",\\\"座\\\",\\\"挫\\\",\\\"債\\\",\\\"催\\\",\\\"再\\\",\\\"最\\\",\\\"哉\\\",\\\"塞\\\",\\\"妻\\\",\\\"宰\\\",\\\"彩\\\",\\\"才\\\",\\\"採\\\",\\\"栽\\\",\\\"歳\\\",\\\"済\\\",\\\"災\\\",\\\"采\\\",\\\"犀\\\",\\\"砕\\\",\\\"砦\\\",\\\"祭\\\",\\\"斎\\\",\\\"細\\\",\\\"菜\\\",\\\"裁\\\",\\\"載\\\",\\\"際\\\",\\\"剤\\\",\\\"在\\\",\\\"材\\\",\\\"罪\\\",\\\"財\\\",\\\"冴\\\",\\\"坂\\\",\\\"阪\\\",\\\"堺\\\",\\\"榊\\\",\\\"肴\\\",\\\"咲\\\",\\\"崎\\\",\\\"埼\\\",\\\"碕\\\",\\\"鷺\\\",\\\"作\\\",\\\"削\\\",\\\"咋\\\",\\\"搾\\\",\\\"昨\\\",\\\"朔\\\",\\\"柵\\\",\\\"窄\\\",\\\"策\\\",\\\"索\\\",\\\"錯\\\",\\\"桜\\\",\\\"鮭\\\",\\\"笹\\\",\\\"匙\\\",\\\"冊\\\",\\\"刷\\\",\\\"察\\\",\\\"拶\\\",\\\"撮\\\",\\\"擦\\\",\\\"札\\\",\\\"殺\\\",\\\"薩\\\",\\\"雑\\\",\\\"皐\\\",\\\"鯖\\\",\\\"捌\\\",\\\"錆\\\",\\\"鮫\\\",\\\"皿\\\",\\\"晒\\\",\\\"三\\\",\\\"傘\\\",\\\"参\\\",\\\"山\\\",\\\"惨\\\",\\\"撒\\\",\\\"散\\\",\\\"桟\\\",\\\"燦\\\",\\\"珊\\\",\\\"産\\\",\\\"算\\\",\\\"纂\\\",\\\"蚕\\\",\\\"讃\\\",\\\"賛\\\",\\\"酸\\\",\\\"餐\\\",\\\"斬\\\",\\\"暫\\\",\\\"残\\\",\\\"仕\\\",\\\"仔\\\",\\\"伺\\\",\\\"使\\\",\\\"刺\\\",\\\"司\\\",\\\"史\\\",\\\"嗣\\\",\\\"四\\\",\\\"士\\\",\\\"始\\\",\\\"姉\\\",\\\"姿\\\",\\\"子\\\",\\\"屍\\\",\\\"市\\\",\\\"師\\\",\\\"志\\\",\\\"思\\\",\\\"指\\\",\\\"支\\\",\\\"孜\\\",\\\"斯\\\",\\\"施\\\",\\\"旨\\\",\\\"枝\\\",\\\"止\\\",\\\"死\\\",\\\"氏\\\",\\\"獅\\\",\\\"祉\\\",\\\"私\\\",\\\"糸\\\",\\\"紙\\\",\\\"紫\\\",\\\"肢\\\",\\\"脂\\\",\\\"至\\\",\\\"視\\\",\\\"詞\\\",\\\"詩\\\",\\\"試\\\",\\\"誌\\\",\\\"諮\\\",\\\"資\\\",\\\"賜\\\",\\\"雌\\\",\\\"飼\\\",\\\"歯\\\",\\\"事\\\",\\\"似\\\",\\\"侍\\\",\\\"児\\\",\\\"字\\\",\\\"寺\\\",\\\"慈\\\",\\\"持\\\",\\\"時\\\",\\\"次\\\",\\\"滋\\\",\\\"治\\\",\\\"爾\\\",\\\"璽\\\",\\\"痔\\\",\\\"磁\\\",\\\"示\\\",\\\"而\\\",\\\"耳\\\",\\\"自\\\",\\\"蒔\\\",\\\"辞\\\",\\\"汐\\\",\\\"鹿\\\",\\\"式\\\",\\\"識\\\",\\\"鴫\\\",\\\"竺\\\",\\\"軸\\\",\\\"宍\\\",\\\"雫\\\",\\\"七\\\",\\\"叱\\\",\\\"執\\\",\\\"失\\\",\\\"嫉\\\",\\\"室\\\",\\\"悉\\\",\\\"湿\\\",\\\"漆\\\",\\\"疾\\\",\\\"質\\\",\\\"実\\\",\\\"蔀\\\",\\\"篠\\\",\\\"偲\\\",\\\"柴\\\",\\\"芝\\\",\\\"屡\\\",\\\"蕊\\\",\\\"縞\\\",\\\"舎\\\",\\\"写\\\",\\\"射\\\",\\\"捨\\\",\\\"赦\\\",\\\"斜\\\",\\\"煮\\\",\\\"社\\\",\\\"紗\\\",\\\"者\\\",\\\"謝\\\",\\\"車\\\",\\\"遮\\\",\\\"蛇\\\",\\\"邪\\\",\\\"借\\\",\\\"勺\\\",\\\"尺\\\",\\\"杓\\\",\\\"灼\\\",\\\"爵\\\",\\\"酌\\\",\\\"釈\\\",\\\"錫\\\",\\\"若\\\",\\\"寂\\\",\\\"弱\\\",\\\"惹\\\",\\\"主\\\",\\\"取\\\",\\\"守\\\",\\\"手\\\",\\\"朱\\\",\\\"殊\\\",\\\"狩\\\",\\\"珠\\\",\\\"種\\\",\\\"腫\\\",\\\"趣\\\",\\\"酒\\\",\\\"首\\\",\\\"儒\\\",\\\"受\\\",\\\"呪\\\",\\\"寿\\\",\\\"授\\\",\\\"樹\\\",\\\"綬\\\",\\\"需\\\",\\\"囚\\\",\\\"収\\\",\\\"周\\\",\\\"宗\\\",\\\"就\\\",\\\"州\\\",\\\"修\\\",\\\"愁\\\",\\\"拾\\\",\\\"洲\\\",\\\"秀\\\",\\\"秋\\\",\\\"終\\\",\\\"繍\\\",\\\"習\\\",\\\"臭\\\",\\\"舟\\\",\\\"蒐\\\",\\\"衆\\\",\\\"襲\\\",\\\"讐\\\",\\\"蹴\\\",\\\"輯\\\",\\\"週\\\",\\\"酋\\\",\\\"酬\\\",\\\"集\\\",\\\"醜\\\",\\\"什\\\",\\\"住\\\",\\\"充\\\",\\\"十\\\",\\\"従\\\",\\\"戎\\\",\\\"柔\\\",\\\"汁\\\",\\\"渋\\\",\\\"獣\\\",\\\"縦\\\",\\\"重\\\",\\\"銃\\\",\\\"叔\\\",\\\"夙\\\",\\\"宿\\\",\\\"淑\\\",\\\"祝\\\",\\\"縮\\\",\\\"粛\\\",\\\"塾\\\",\\\"熟\\\",\\\"出\\\",\\\"術\\\",\\\"述\\\",\\\"俊\\\",\\\"峻\\\",\\\"春\\\",\\\"瞬\\\",\\\"竣\\\",\\\"舜\\\",\\\"駿\\\",\\\"准\\\",\\\"循\\\",\\\"旬\\\",\\\"楯\\\",\\\"殉\\\",\\\"淳\\\",\\\"準\\\",\\\"潤\\\",\\\"盾\\\",\\\"純\\\",\\\"巡\\\",\\\"遵\\\",\\\"醇\\\",\\\"順\\\",\\\"処\\\",\\\"初\\\",\\\"所\\\",\\\"暑\\\",\\\"曙\\\",\\\"渚\\\",\\\"庶\\\",\\\"緒\\\",\\\"署\\\",\\\"書\\\",\\\"薯\\\",\\\"藷\\\",\\\"諸\\\",\\\"助\\\",\\\"叙\\\",\\\"女\\\",\\\"序\\\",\\\"徐\\\",\\\"恕\\\",\\\"鋤\\\",\\\"除\\\",\\\"傷\\\",\\\"償\\\",\\\"勝\\\",\\\"匠\\\",\\\"升\\\",\\\"召\\\",\\\"哨\\\",\\\"商\\\",\\\"唱\\\",\\\"嘗\\\",\\\"奨\\\",\\\"妾\\\",\\\"娼\\\",\\\"宵\\\",\\\"将\\\",\\\"小\\\",\\\"少\\\",\\\"尚\\\",\\\"庄\\\",\\\"床\\\",\\\"廠\\\",\\\"彰\\\",\\\"承\\\",\\\"抄\\\",\\\"招\\\",\\\"掌\\\",\\\"捷\\\",\\\"昇\\\",\\\"昌\\\",\\\"昭\\\",\\\"晶\\\",\\\"松\\\",\\\"梢\\\",\\\"樟\\\",\\\"樵\\\",\\\"沼\\\",\\\"消\\\",\\\"渉\\\",\\\"湘\\\",\\\"焼\\\",\\\"焦\\\",\\\"照\\\",\\\"症\\\",\\\"省\\\",\\\"硝\\\",\\\"礁\\\",\\\"祥\\\",\\\"称\\\",\\\"章\\\",\\\"笑\\\",\\\"粧\\\",\\\"紹\\\",\\\"肖\\\",\\\"菖\\\",\\\"蒋\\\",\\\"蕉\\\",\\\"衝\\\",\\\"裳\\\",\\\"訟\\\",\\\"証\\\",\\\"詔\\\",\\\"詳\\\",\\\"象\\\",\\\"賞\\\",\\\"醤\\\",\\\"鉦\\\",\\\"鍾\\\",\\\"鐘\\\",\\\"障\\\",\\\"鞘\\\",\\\"上\\\",\\\"丈\\\",\\\"丞\\\",\\\"乗\\\",\\\"冗\\\",\\\"剰\\\",\\\"城\\\",\\\"場\\\",\\\"壌\\\",\\\"嬢\\\",\\\"常\\\",\\\"情\\\",\\\"擾\\\",\\\"条\\\",\\\"杖\\\",\\\"浄\\\",\\\"状\\\",\\\"畳\\\",\\\"穣\\\",\\\"蒸\\\",\\\"譲\\\",\\\"醸\\\",\\\"錠\\\",\\\"嘱\\\",\\\"埴\\\",\\\"飾\\\",\\\"拭\\\",\\\"植\\\",\\\"殖\\\",\\\"燭\\\",\\\"織\\\",\\\"職\\\",\\\"色\\\",\\\"触\\\",\\\"食\\\",\\\"蝕\\\",\\\"辱\\\",\\\"尻\\\",\\\"伸\\\",\\\"信\\\",\\\"侵\\\",\\\"唇\\\",\\\"娠\\\",\\\"寝\\\",\\\"審\\\",\\\"心\\\",\\\"慎\\\",\\\"振\\\",\\\"新\\\",\\\"晋\\\",\\\"森\\\",\\\"榛\\\",\\\"浸\\\",\\\"深\\\",\\\"申\\\",\\\"疹\\\",\\\"真\\\",\\\"神\\\",\\\"秦\\\",\\\"紳\\\",\\\"臣\\\",\\\"芯\\\",\\\"薪\\\",\\\"親\\\",\\\"診\\\",\\\"身\\\",\\\"辛\\\",\\\"進\\\",\\\"針\\\",\\\"震\\\",\\\"人\\\",\\\"仁\\\",\\\"刃\\\",\\\"塵\\\",\\\"壬\\\",\\\"尋\\\",\\\"甚\\\",\\\"尽\\\",\\\"腎\\\",\\\"訊\\\",\\\"迅\\\",\\\"陣\\\",\\\"靭\\\",\\\"笥\\\",\\\"諏\\\",\\\"須\\\",\\\"酢\\\",\\\"図\\\",\\\"厨\\\",\\\"逗\\\",\\\"吹\\\",\\\"垂\\\",\\\"帥\\\",\\\"推\\\",\\\"水\\\",\\\"炊\\\",\\\"睡\\\",\\\"粋\\\",\\\"翠\\\",\\\"衰\\\",\\\"遂\\\",\\\"酔\\\",\\\"錐\\\",\\\"錘\\\",\\\"随\\\",\\\"瑞\\\",\\\"髄\\\",\\\"崇\\\",\\\"嵩\\\",\\\"数\\\",\\\"枢\\\",\\\"趨\\\",\\\"雛\\\",\\\"据\\\",\\\"杉\\\",\\\"椙\\\",\\\"菅\\\",\\\"頗\\\",\\\"雀\\\",\\\"裾\\\",\\\"澄\\\",\\\"摺\\\",\\\"寸\\\",\\\"世\\\",\\\"瀬\\\",\\\"畝\\\",\\\"是\\\",\\\"凄\\\",\\\"制\\\",\\\"勢\\\",\\\"姓\\\",\\\"征\\\",\\\"性\\\",\\\"成\\\",\\\"政\\\",\\\"整\\\",\\\"星\\\",\\\"晴\\\",\\\"棲\\\",\\\"栖\\\",\\\"正\\\",\\\"清\\\",\\\"牲\\\",\\\"生\\\",\\\"盛\\\",\\\"精\\\",\\\"聖\\\",\\\"声\\\",\\\"製\\\",\\\"西\\\",\\\"誠\\\",\\\"誓\\\",\\\"請\\\",\\\"逝\\\",\\\"醒\\\",\\\"青\\\",\\\"静\\\",\\\"斉\\\",\\\"税\\\",\\\"脆\\\",\\\"隻\\\",\\\"席\\\",\\\"惜\\\",\\\"戚\\\",\\\"斥\\\",\\\"昔\\\",\\\"析\\\",\\\"石\\\",\\\"積\\\",\\\"籍\\\",\\\"績\\\",\\\"脊\\\",\\\"責\\\",\\\"赤\\\",\\\"跡\\\",\\\"蹟\\\",\\\"碩\\\",\\\"切\\\",\\\"拙\\\",\\\"接\\\",\\\"摂\\\",\\\"折\\\",\\\"設\\\",\\\"窃\\\",\\\"節\\\",\\\"説\\\",\\\"雪\\\",\\\"絶\\\",\\\"舌\\\",\\\"蝉\\\",\\\"仙\\\",\\\"先\\\",\\\"千\\\",\\\"占\\\",\\\"宣\\\",\\\"専\\\",\\\"尖\\\",\\\"川\\\",\\\"戦\\\",\\\"扇\\\",\\\"撰\\\",\\\"栓\\\",\\\"栴\\\",\\\"泉\\\",\\\"浅\\\",\\\"洗\\\",\\\"染\\\",\\\"潜\\\",\\\"煎\\\",\\\"煽\\\",\\\"旋\\\",\\\"穿\\\",\\\"箭\\\",\\\"線\\\",\\\"繊\\\",\\\"羨\\\",\\\"腺\\\",\\\"舛\\\",\\\"船\\\",\\\"薦\\\",\\\"詮\\\",\\\"賎\\\",\\\"践\\\",\\\"選\\\",\\\"遷\\\",\\\"銭\\\",\\\"銑\\\",\\\"閃\\\",\\\"鮮\\\",\\\"前\\\",\\\"善\\\",\\\"漸\\\",\\\"然\\\",\\\"全\\\",\\\"禅\\\",\\\"繕\\\",\\\"膳\\\",\\\"糎\\\",\\\"噌\\\",\\\"塑\\\",\\\"岨\\\",\\\"措\\\",\\\"曾\\\",\\\"曽\\\",\\\"楚\\\",\\\"狙\\\",\\\"疏\\\",\\\"疎\\\",\\\"礎\\\",\\\"祖\\\",\\\"租\\\",\\\"粗\\\",\\\"素\\\",\\\"組\\\",\\\"蘇\\\",\\\"訴\\\",\\\"阻\\\",\\\"遡\\\",\\\"鼠\\\",\\\"僧\\\",\\\"創\\\",\\\"双\\\",\\\"叢\\\",\\\"倉\\\",\\\"喪\\\",\\\"壮\\\",\\\"奏\\\",\\\"爽\\\",\\\"宋\\\",\\\"層\\\",\\\"匝\\\",\\\"惣\\\",\\\"想\\\",\\\"捜\\\",\\\"掃\\\",\\\"挿\\\",\\\"掻\\\",\\\"操\\\",\\\"早\\\",\\\"曹\\\",\\\"巣\\\",\\\"槍\\\",\\\"槽\\\",\\\"漕\\\",\\\"燥\\\",\\\"争\\\",\\\"痩\\\",\\\"相\\\",\\\"窓\\\",\\\"糟\\\",\\\"総\\\",\\\"綜\\\",\\\"聡\\\",\\\"草\\\",\\\"荘\\\",\\\"葬\\\",\\\"蒼\\\",\\\"藻\\\",\\\"装\\\",\\\"走\\\",\\\"送\\\",\\\"遭\\\",\\\"鎗\\\",\\\"霜\\\",\\\"騒\\\",\\\"像\\\",\\\"増\\\",\\\"憎\\\",\\\"臓\\\",\\\"蔵\\\",\\\"贈\\\",\\\"造\\\",\\\"促\\\",\\\"側\\\",\\\"則\\\",\\\"即\\\",\\\"息\\\",\\\"捉\\\",\\\"束\\\",\\\"測\\\",\\\"足\\\",\\\"速\\\",\\\"俗\\\",\\\"属\\\",\\\"賊\\\",\\\"族\\\",\\\"続\\\",\\\"卒\\\",\\\"袖\\\",\\\"其\\\",\\\"揃\\\",\\\"存\\\",\\\"孫\\\",\\\"尊\\\",\\\"損\\\",\\\"村\\\",\\\"遜\\\",\\\"他\\\",\\\"多\\\",\\\"太\\\",\\\"汰\\\",\\\"詑\\\",\\\"唾\\\",\\\"堕\\\",\\\"妥\\\",\\\"惰\\\",\\\"打\\\",\\\"柁\\\",\\\"舵\\\",\\\"楕\\\",\\\"陀\\\",\\\"駄\\\",\\\"騨\\\",\\\"体\\\",\\\"堆\\\",\\\"対\\\",\\\"耐\\\",\\\"岱\\\",\\\"帯\\\",\\\"待\\\",\\\"怠\\\",\\\"態\\\",\\\"戴\\\",\\\"替\\\",\\\"泰\\\",\\\"滞\\\",\\\"胎\\\",\\\"腿\\\",\\\"苔\\\",\\\"袋\\\",\\\"貸\\\",\\\"退\\\",\\\"逮\\\",\\\"隊\\\",\\\"黛\\\",\\\"鯛\\\",\\\"代\\\",\\\"台\\\",\\\"大\\\",\\\"第\\\",\\\"醍\\\",\\\"題\\\",\\\"鷹\\\",\\\"滝\\\",\\\"瀧\\\",\\\"卓\\\",\\\"啄\\\",\\\"宅\\\",\\\"托\\\",\\\"択\\\",\\\"拓\\\",\\\"沢\\\",\\\"濯\\\",\\\"琢\\\",\\\"託\\\",\\\"鐸\\\",\\\"濁\\\",\\\"諾\\\",\\\"茸\\\",\\\"凧\\\",\\\"蛸\\\",\\\"只\\\",\\\"叩\\\",\\\"但\\\",\\\"達\\\",\\\"辰\\\",\\\"奪\\\",\\\"脱\\\",\\\"巽\\\",\\\"竪\\\",\\\"辿\\\",\\\"棚\\\",\\\"谷\\\",\\\"狸\\\",\\\"鱈\\\",\\\"樽\\\",\\\"誰\\\",\\\"丹\\\",\\\"単\\\",\\\"嘆\\\",\\\"坦\\\",\\\"担\\\",\\\"探\\\",\\\"旦\\\",\\\"歎\\\",\\\"淡\\\",\\\"湛\\\",\\\"炭\\\",\\\"短\\\",\\\"端\\\",\\\"箪\\\",\\\"綻\\\",\\\"耽\\\",\\\"胆\\\",\\\"蛋\\\",\\\"誕\\\",\\\"鍛\\\",\\\"団\\\",\\\"壇\\\",\\\"弾\\\",\\\"断\\\",\\\"暖\\\",\\\"檀\\\",\\\"段\\\",\\\"男\\\",\\\"談\\\",\\\"値\\\",\\\"知\\\",\\\"地\\\",\\\"弛\\\",\\\"恥\\\",\\\"智\\\",\\\"池\\\",\\\"痴\\\",\\\"稚\\\",\\\"置\\\",\\\"致\\\",\\\"蜘\\\",\\\"遅\\\",\\\"馳\\\",\\\"築\\\",\\\"畜\\\",\\\"竹\\\",\\\"筑\\\",\\\"蓄\\\",\\\"逐\\\",\\\"秩\\\",\\\"窒\\\",\\\"茶\\\",\\\"嫡\\\",\\\"着\\\",\\\"中\\\",\\\"仲\\\",\\\"宙\\\",\\\"忠\\\",\\\"抽\\\",\\\"昼\\\",\\\"柱\\\",\\\"注\\\",\\\"虫\\\",\\\"衷\\\",\\\"註\\\",\\\"酎\\\",\\\"鋳\\\",\\\"駐\\\",\\\"樗\\\",\\\"瀦\\\",\\\"猪\\\",\\\"苧\\\",\\\"著\\\",\\\"貯\\\",\\\"丁\\\",\\\"兆\\\",\\\"凋\\\",\\\"喋\\\",\\\"寵\\\",\\\"帖\\\",\\\"帳\\\",\\\"庁\\\",\\\"弔\\\",\\\"張\\\",\\\"彫\\\",\\\"徴\\\",\\\"懲\\\",\\\"挑\\\",\\\"暢\\\",\\\"朝\\\",\\\"潮\\\",\\\"牒\\\",\\\"町\\\",\\\"眺\\\",\\\"聴\\\",\\\"脹\\\",\\\"腸\\\",\\\"蝶\\\",\\\"調\\\",\\\"諜\\\",\\\"超\\\",\\\"跳\\\",\\\"銚\\\",\\\"長\\\",\\\"頂\\\",\\\"鳥\\\",\\\"勅\\\",\\\"捗\\\",\\\"直\\\",\\\"朕\\\",\\\"沈\\\",\\\"珍\\\",\\\"賃\\\",\\\"鎮\\\",\\\"陳\\\",\\\"津\\\",\\\"墜\\\",\\\"椎\\\",\\\"槌\\\",\\\"追\\\",\\\"鎚\\\",\\\"痛\\\",\\\"通\\\",\\\"塚\\\",\\\"栂\\\",\\\"掴\\\",\\\"槻\\\",\\\"佃\\\",\\\"漬\\\",\\\"柘\\\",\\\"辻\\\",\\\"蔦\\\",\\\"綴\\\",\\\"鍔\\\",\\\"椿\\\",\\\"潰\\\",\\\"坪\\\",\\\"壷\\\",\\\"嬬\\\",\\\"紬\\\",\\\"爪\\\",\\\"吊\\\",\\\"釣\\\",\\\"鶴\\\",\\\"亭\\\",\\\"低\\\",\\\"停\\\",\\\"偵\\\",\\\"剃\\\",\\\"貞\\\",\\\"呈\\\",\\\"堤\\\",\\\"定\\\",\\\"帝\\\",\\\"底\\\",\\\"庭\\\",\\\"廷\\\",\\\"弟\\\",\\\"悌\\\",\\\"抵\\\",\\\"挺\\\",\\\"提\\\",\\\"梯\\\",\\\"汀\\\",\\\"碇\\\",\\\"禎\\\",\\\"程\\\",\\\"締\\\",\\\"艇\\\",\\\"訂\\\",\\\"諦\\\",\\\"蹄\\\",\\\"逓\\\",\\\"邸\\\",\\\"鄭\\\",\\\"釘\\\",\\\"鼎\\\",\\\"泥\\\",\\\"摘\\\",\\\"擢\\\",\\\"敵\\\",\\\"滴\\\",\\\"的\\\",\\\"笛\\\",\\\"適\\\",\\\"鏑\\\",\\\"溺\\\",\\\"哲\\\",\\\"徹\\\",\\\"撤\\\",\\\"轍\\\",\\\"迭\\\",\\\"鉄\\\",\\\"典\\\",\\\"填\\\",\\\"天\\\",\\\"展\\\",\\\"店\\\",\\\"添\\\",\\\"纏\\\",\\\"甜\\\",\\\"貼\\\",\\\"転\\\",\\\"顛\\\",\\\"点\\\",\\\"伝\\\",\\\"殿\\\",\\\"澱\\\",\\\"田\\\",\\\"電\\\",\\\"兎\\\",\\\"吐\\\",\\\"堵\\\",\\\"塗\\\",\\\"妬\\\",\\\"屠\\\",\\\"徒\\\",\\\"斗\\\",\\\"杜\\\",\\\"渡\\\",\\\"登\\\",\\\"菟\\\",\\\"賭\\\",\\\"途\\\",\\\"都\\\",\\\"鍍\\\",\\\"砥\\\",\\\"砺\\\",\\\"努\\\",\\\"度\\\",\\\"土\\\",\\\"奴\\\",\\\"怒\\\",\\\"倒\\\",\\\"党\\\",\\\"冬\\\",\\\"凍\\\",\\\"刀\\\",\\\"唐\\\",\\\"塔\\\",\\\"塘\\\",\\\"套\\\",\\\"宕\\\",\\\"島\\\",\\\"嶋\\\",\\\"悼\\\",\\\"投\\\",\\\"搭\\\",\\\"東\\\",\\\"桃\\\",\\\"梼\\\",\\\"棟\\\",\\\"盗\\\",\\\"淘\\\",\\\"湯\\\",\\\"涛\\\",\\\"灯\\\",\\\"燈\\\",\\\"当\\\",\\\"痘\\\",\\\"祷\\\",\\\"等\\\",\\\"答\\\",\\\"筒\\\",\\\"糖\\\",\\\"統\\\",\\\"到\\\",\\\"董\\\",\\\"蕩\\\",\\\"藤\\\",\\\"討\\\",\\\"謄\\\",\\\"豆\\\",\\\"踏\\\",\\\"逃\\\",\\\"透\\\",\\\"鐙\\\",\\\"陶\\\",\\\"頭\\\",\\\"騰\\\",\\\"闘\\\",\\\"働\\\",\\\"動\\\",\\\"同\\\",\\\"堂\\\",\\\"導\\\",\\\"憧\\\",\\\"撞\\\",\\\"洞\\\",\\\"瞳\\\",\\\"童\\\",\\\"胴\\\",\\\"萄\\\",\\\"道\\\",\\\"銅\\\",\\\"峠\\\",\\\"鴇\\\",\\\"匿\\\",\\\"得\\\",\\\"徳\\\",\\\"涜\\\",\\\"特\\\",\\\"督\\\",\\\"禿\\\",\\\"篤\\\",\\\"毒\\\",\\\"独\\\",\\\"読\\\",\\\"栃\\\",\\\"橡\\\",\\\"凸\\\",\\\"突\\\",\\\"椴\\\",\\\"届\\\",\\\"鳶\\\",\\\"苫\\\",\\\"寅\\\",\\\"酉\\\",\\\"瀞\\\",\\\"噸\\\",\\\"屯\\\",\\\"惇\\\",\\\"敦\\\",\\\"沌\\\",\\\"豚\\\",\\\"遁\\\",\\\"頓\\\",\\\"呑\\\",\\\"曇\\\",\\\"鈍\\\",\\\"奈\\\",\\\"那\\\",\\\"内\\\",\\\"乍\\\",\\\"凪\\\",\\\"薙\\\",\\\"謎\\\",\\\"灘\\\",\\\"捺\\\",\\\"鍋\\\",\\\"楢\\\",\\\"馴\\\",\\\"縄\\\",\\\"畷\\\",\\\"南\\\",\\\"楠\\\",\\\"軟\\\",\\\"難\\\",\\\"汝\\\",\\\"二\\\",\\\"尼\\\",\\\"弐\\\",\\\"迩\\\",\\\"匂\\\",\\\"賑\\\",\\\"肉\\\",\\\"虹\\\",\\\"廿\\\",\\\"日\\\",\\\"乳\\\",\\\"入\\\",\\\"如\\\",\\\"尿\\\",\\\"韮\\\",\\\"任\\\",\\\"妊\\\",\\\"忍\\\",\\\"認\\\",\\\"濡\\\",\\\"禰\\\",\\\"祢\\\",\\\"寧\\\",\\\"葱\\\",\\\"猫\\\",\\\"熱\\\",\\\"年\\\",\\\"念\\\",\\\"捻\\\",\\\"撚\\\",\\\"燃\\\",\\\"粘\\\",\\\"乃\\\",\\\"廼\\\",\\\"之\\\",\\\"埜\\\",\\\"嚢\\\",\\\"悩\\\",\\\"濃\\\",\\\"納\\\",\\\"能\\\",\\\"脳\\\",\\\"膿\\\",\\\"農\\\",\\\"覗\\\",\\\"蚤\\\",\\\"巴\\\",\\\"把\\\",\\\"播\\\",\\\"覇\\\",\\\"杷\\\",\\\"波\\\",\\\"派\\\",\\\"琶\\\",\\\"破\\\",\\\"婆\\\",\\\"罵\\\",\\\"芭\\\",\\\"馬\\\",\\\"俳\\\",\\\"廃\\\",\\\"拝\\\",\\\"排\\\",\\\"敗\\\",\\\"杯\\\",\\\"盃\\\",\\\"牌\\\",\\\"背\\\",\\\"肺\\\",\\\"輩\\\",\\\"配\\\",\\\"倍\\\",\\\"培\\\",\\\"媒\\\",\\\"梅\\\",\\\"楳\\\",\\\"煤\\\",\\\"狽\\\",\\\"買\\\",\\\"売\\\",\\\"賠\\\",\\\"陪\\\",\\\"這\\\",\\\"蝿\\\",\\\"秤\\\",\\\"矧\\\",\\\"萩\\\",\\\"伯\\\",\\\"剥\\\",\\\"博\\\",\\\"拍\\\",\\\"柏\\\",\\\"泊\\\",\\\"白\\\",\\\"箔\\\",\\\"粕\\\",\\\"舶\\\",\\\"薄\\\",\\\"迫\\\",\\\"曝\\\",\\\"漠\\\",\\\"爆\\\",\\\"縛\\\",\\\"莫\\\",\\\"駁\\\",\\\"麦\\\",\\\"函\\\",\\\"箱\\\",\\\"硲\\\",\\\"箸\\\",\\\"肇\\\",\\\"筈\\\",\\\"櫨\\\",\\\"幡\\\",\\\"肌\\\",\\\"畑\\\",\\\"畠\\\",\\\"八\\\",\\\"鉢\\\",\\\"溌\\\",\\\"発\\\",\\\"醗\\\",\\\"髪\\\",\\\"伐\\\",\\\"罰\\\",\\\"抜\\\",\\\"筏\\\",\\\"閥\\\",\\\"鳩\\\",\\\"噺\\\",\\\"塙\\\",\\\"蛤\\\",\\\"隼\\\",\\\"伴\\\",\\\"判\\\",\\\"半\\\",\\\"反\\\",\\\"叛\\\",\\\"帆\\\",\\\"搬\\\",\\\"斑\\\",\\\"板\\\",\\\"氾\\\",\\\"汎\\\",\\\"版\\\",\\\"犯\\\",\\\"班\\\",\\\"畔\\\",\\\"繁\\\",\\\"般\\\",\\\"藩\\\",\\\"販\\\",\\\"範\\\",\\\"釆\\\",\\\"煩\\\",\\\"頒\\\",\\\"飯\\\",\\\"挽\\\",\\\"晩\\\",\\\"番\\\",\\\"盤\\\",\\\"磐\\\",\\\"蕃\\\",\\\"蛮\\\",\\\"匪\\\",\\\"卑\\\",\\\"否\\\",\\\"妃\\\",\\\"庇\\\",\\\"彼\\\",\\\"悲\\\",\\\"扉\\\",\\\"批\\\",\\\"披\\\",\\\"斐\\\",\\\"比\\\",\\\"泌\\\",\\\"疲\\\",\\\"皮\\\",\\\"碑\\\",\\\"秘\\\",\\\"緋\\\",\\\"罷\\\",\\\"肥\\\",\\\"被\\\",\\\"誹\\\",\\\"費\\\",\\\"避\\\",\\\"非\\\",\\\"飛\\\",\\\"樋\\\",\\\"簸\\\",\\\"備\\\",\\\"尾\\\",\\\"微\\\",\\\"枇\\\",\\\"毘\\\",\\\"琵\\\",\\\"眉\\\",\\\"美\\\",\\\"鼻\\\",\\\"柊\\\",\\\"稗\\\",\\\"匹\\\",\\\"疋\\\",\\\"髭\\\",\\\"彦\\\",\\\"膝\\\",\\\"菱\\\",\\\"肘\\\",\\\"弼\\\",\\\"必\\\",\\\"畢\\\",\\\"筆\\\",\\\"逼\\\",\\\"桧\\\",\\\"姫\\\",\\\"媛\\\",\\\"紐\\\",\\\"百\\\",\\\"謬\\\",\\\"俵\\\",\\\"彪\\\",\\\"標\\\",\\\"氷\\\",\\\"漂\\\",\\\"瓢\\\",\\\"票\\\",\\\"表\\\",\\\"評\\\",\\\"豹\\\",\\\"廟\\\",\\\"描\\\",\\\"病\\\",\\\"秒\\\",\\\"苗\\\",\\\"錨\\\",\\\"鋲\\\",\\\"蒜\\\",\\\"蛭\\\",\\\"鰭\\\",\\\"品\\\",\\\"彬\\\",\\\"斌\\\",\\\"浜\\\",\\\"瀕\\\",\\\"貧\\\",\\\"賓\\\",\\\"頻\\\",\\\"敏\\\",\\\"瓶\\\",\\\"不\\\",\\\"付\\\",\\\"埠\\\",\\\"夫\\\",\\\"婦\\\",\\\"富\\\",\\\"冨\\\",\\\"布\\\",\\\"府\\\",\\\"怖\\\",\\\"扶\\\",\\\"敷\\\",\\\"斧\\\",\\\"普\\\",\\\"浮\\\",\\\"父\\\",\\\"符\\\",\\\"腐\\\",\\\"膚\\\",\\\"芙\\\",\\\"譜\\\",\\\"負\\\",\\\"賦\\\",\\\"赴\\\",\\\"阜\\\",\\\"附\\\",\\\"侮\\\",\\\"撫\\\",\\\"武\\\",\\\"舞\\\",\\\"葡\\\",\\\"蕪\\\",\\\"部\\\",\\\"封\\\",\\\"楓\\\",\\\"風\\\",\\\"葺\\\",\\\"蕗\\\",\\\"伏\\\",\\\"副\\\",\\\"復\\\",\\\"幅\\\",\\\"服\\\",\\\"福\\\",\\\"腹\\\",\\\"複\\\",\\\"覆\\\",\\\"淵\\\",\\\"弗\\\",\\\"払\\\",\\\"沸\\\",\\\"仏\\\",\\\"物\\\",\\\"鮒\\\",\\\"分\\\",\\\"吻\\\",\\\"噴\\\",\\\"墳\\\",\\\"憤\\\",\\\"扮\\\",\\\"焚\\\",\\\"奮\\\",\\\"粉\\\",\\\"糞\\\",\\\"紛\\\",\\\"雰\\\",\\\"文\\\",\\\"聞\\\",\\\"丙\\\",\\\"併\\\",\\\"兵\\\",\\\"塀\\\",\\\"幣\\\",\\\"平\\\",\\\"弊\\\",\\\"柄\\\",\\\"並\\\",\\\"蔽\\\",\\\"閉\\\",\\\"陛\\\",\\\"米\\\",\\\"頁\\\",\\\"僻\\\",\\\"壁\\\",\\\"癖\\\",\\\"碧\\\",\\\"別\\\",\\\"瞥\\\",\\\"蔑\\\",\\\"箆\\\",\\\"偏\\\",\\\"変\\\",\\\"片\\\",\\\"篇\\\",\\\"編\\\",\\\"辺\\\",\\\"返\\\",\\\"遍\\\",\\\"便\\\",\\\"勉\\\",\\\"娩\\\",\\\"弁\\\",\\\"鞭\\\",\\\"保\\\",\\\"舗\\\",\\\"鋪\\\",\\\"圃\\\",\\\"捕\\\",\\\"歩\\\",\\\"甫\\\",\\\"補\\\",\\\"輔\\\",\\\"穂\\\",\\\"募\\\",\\\"墓\\\",\\\"慕\\\",\\\"戊\\\",\\\"暮\\\",\\\"母\\\",\\\"簿\\\",\\\"菩\\\",\\\"倣\\\",\\\"俸\\\",\\\"包\\\",\\\"呆\\\",\\\"報\\\",\\\"奉\\\",\\\"宝\\\",\\\"峰\\\",\\\"峯\\\",\\\"崩\\\",\\\"庖\\\",\\\"抱\\\",\\\"捧\\\",\\\"放\\\",\\\"方\\\",\\\"朋\\\",\\\"法\\\",\\\"泡\\\",\\\"烹\\\",\\\"砲\\\",\\\"縫\\\",\\\"胞\\\",\\\"芳\\\",\\\"萌\\\",\\\"蓬\\\",\\\"蜂\\\",\\\"褒\\\",\\\"訪\\\",\\\"豊\\\",\\\"邦\\\",\\\"鋒\\\",\\\"飽\\\",\\\"鳳\\\",\\\"鵬\\\",\\\"乏\\\",\\\"亡\\\",\\\"傍\\\",\\\"剖\\\",\\\"坊\\\",\\\"妨\\\",\\\"帽\\\",\\\"忘\\\",\\\"忙\\\",\\\"房\\\",\\\"暴\\\",\\\"望\\\",\\\"某\\\",\\\"棒\\\",\\\"冒\\\",\\\"紡\\\",\\\"肪\\\",\\\"膨\\\",\\\"謀\\\",\\\"貌\\\",\\\"貿\\\",\\\"鉾\\\",\\\"防\\\",\\\"吠\\\",\\\"頬\\\",\\\"北\\\",\\\"僕\\\",\\\"卜\\\",\\\"墨\\\",\\\"撲\\\",\\\"朴\\\",\\\"牧\\\",\\\"睦\\\",\\\"穆\\\",\\\"釦\\\",\\\"勃\\\",\\\"没\\\",\\\"殆\\\",\\\"堀\\\",\\\"幌\\\",\\\"奔\\\",\\\"本\\\",\\\"翻\\\",\\\"凡\\\",\\\"盆\\\",\\\"摩\\\",\\\"磨\\\",\\\"魔\\\",\\\"麻\\\",\\\"埋\\\",\\\"妹\\\",\\\"昧\\\",\\\"枚\\\",\\\"毎\\\",\\\"哩\\\",\\\"槙\\\",\\\"幕\\\",\\\"膜\\\",\\\"枕\\\",\\\"鮪\\\",\\\"柾\\\",\\\"鱒\\\",\\\"桝\\\",\\\"亦\\\",\\\"俣\\\",\\\"又\\\",\\\"抹\\\",\\\"末\\\",\\\"沫\\\",\\\"迄\\\",\\\"侭\\\",\\\"繭\\\",\\\"麿\\\",\\\"万\\\",\\\"慢\\\",\\\"満\\\",\\\"漫\\\",\\\"蔓\\\",\\\"味\\\",\\\"未\\\",\\\"魅\\\",\\\"巳\\\",\\\"箕\\\",\\\"岬\\\",\\\"密\\\",\\\"蜜\\\",\\\"湊\\\",\\\"蓑\\\",\\\"稔\\\",\\\"脈\\\",\\\"妙\\\",\\\"粍\\\",\\\"民\\\",\\\"眠\\\",\\\"務\\\",\\\"夢\\\",\\\"無\\\",\\\"牟\\\",\\\"矛\\\",\\\"霧\\\",\\\"鵡\\\",\\\"椋\\\",\\\"婿\\\",\\\"娘\\\",\\\"冥\\\",\\\"名\\\",\\\"命\\\",\\\"明\\\",\\\"盟\\\",\\\"迷\\\",\\\"銘\\\",\\\"鳴\\\",\\\"姪\\\",\\\"牝\\\",\\\"滅\\\",\\\"免\\\",\\\"棉\\\",\\\"綿\\\",\\\"緬\\\",\\\"面\\\",\\\"麺\\\",\\\"摸\\\",\\\"模\\\",\\\"茂\\\",\\\"妄\\\",\\\"孟\\\",\\\"毛\\\",\\\"猛\\\",\\\"盲\\\",\\\"網\\\",\\\"耗\\\",\\\"蒙\\\",\\\"儲\\\",\\\"木\\\",\\\"黙\\\",\\\"目\\\",\\\"杢\\\",\\\"勿\\\",\\\"餅\\\",\\\"尤\\\",\\\"戻\\\",\\\"籾\\\",\\\"貰\\\",\\\"問\\\",\\\"悶\\\",\\\"紋\\\",\\\"門\\\",\\\"匁\\\",\\\"也\\\",\\\"冶\\\",\\\"夜\\\",\\\"爺\\\",\\\"耶\\\",\\\"野\\\",\\\"弥\\\",\\\"矢\\\",\\\"厄\\\",\\\"役\\\",\\\"約\\\",\\\"薬\\\",\\\"訳\\\",\\\"躍\\\",\\\"靖\\\",\\\"柳\\\",\\\"薮\\\",\\\"鑓\\\",\\\"愉\\\",\\\"愈\\\",\\\"油\\\",\\\"癒\\\",\\\"諭\\\",\\\"輸\\\",\\\"唯\\\",\\\"佑\\\",\\\"優\\\",\\\"勇\\\",\\\"友\\\",\\\"宥\\\",\\\"幽\\\",\\\"悠\\\",\\\"憂\\\",\\\"揖\\\",\\\"有\\\",\\\"柚\\\",\\\"湧\\\",\\\"涌\\\",\\\"猶\\\",\\\"猷\\\",\\\"由\\\",\\\"祐\\\",\\\"裕\\\",\\\"誘\\\",\\\"遊\\\",\\\"邑\\\",\\\"郵\\\",\\\"雄\\\",\\\"融\\\",\\\"夕\\\",\\\"予\\\",\\\"余\\\",\\\"与\\\",\\\"誉\\\",\\\"輿\\\",\\\"預\\\",\\\"傭\\\",\\\"幼\\\",\\\"妖\\\",\\\"容\\\",\\\"庸\\\",\\\"揚\\\",\\\"揺\\\",\\\"擁\\\",\\\"曜\\\",\\\"楊\\\",\\\"様\\\",\\\"洋\\\",\\\"溶\\\",\\\"熔\\\",\\\"用\\\",\\\"窯\\\",\\\"羊\\\",\\\"耀\\\",\\\"葉\\\",\\\"蓉\\\",\\\"要\\\",\\\"謡\\\",\\\"踊\\\",\\\"遥\\\",\\\"陽\\\",\\\"養\\\",\\\"慾\\\",\\\"抑\\\",\\\"欲\\\",\\\"沃\\\",\\\"浴\\\",\\\"翌\\\",\\\"翼\\\",\\\"淀\\\",\\\"羅\\\",\\\"螺\\\",\\\"裸\\\",\\\"来\\\",\\\"莱\\\",\\\"頼\\\",\\\"雷\\\",\\\"洛\\\",\\\"絡\\\",\\\"落\\\",\\\"酪\\\",\\\"乱\\\",\\\"卵\\\",\\\"嵐\\\",\\\"欄\\\",\\\"濫\\\",\\\"藍\\\",\\\"蘭\\\",\\\"覧\\\",\\\"利\\\",\\\"吏\\\",\\\"履\\\",\\\"李\\\",\\\"梨\\\",\\\"理\\\",\\\"璃\\\",\\\"痢\\\",\\\"裏\\\",\\\"裡\\\",\\\"里\\\",\\\"離\\\",\\\"陸\\\",\\\"律\\\",\\\"率\\\",\\\"立\\\",\\\"葎\\\",\\\"掠\\\",\\\"略\\\",\\\"劉\\\",\\\"流\\\",\\\"溜\\\",\\\"琉\\\",\\\"留\\\",\\\"硫\\\",\\\"粒\\\",\\\"隆\\\",\\\"竜\\\",\\\"龍\\\",\\\"侶\\\",\\\"慮\\\",\\\"旅\\\",\\\"虜\\\",\\\"了\\\",\\\"亮\\\",\\\"僚\\\",\\\"両\\\",\\\"凌\\\",\\\"寮\\\",\\\"料\\\",\\\"梁\\\",\\\"涼\\\",\\\"猟\\\",\\\"療\\\",\\\"瞭\\\",\\\"稜\\\",\\\"糧\\\",\\\"良\\\",\\\"諒\\\",\\\"遼\\\",\\\"量\\\",\\\"陵\\\",\\\"領\\\",\\\"力\\\",\\\"緑\\\",\\\"倫\\\",\\\"厘\\\",\\\"林\\\",\\\"淋\\\",\\\"燐\\\",\\\"琳\\\",\\\"臨\\\",\\\"輪\\\",\\\"隣\\\",\\\"鱗\\\",\\\"麟\\\",\\\"瑠\\\",\\\"塁\\\",\\\"涙\\\",\\\"累\\\",\\\"類\\\",\\\"令\\\",\\\"伶\\\",\\\"例\\\",\\\"冷\\\",\\\"励\\\",\\\"嶺\\\",\\\"怜\\\",\\\"玲\\\",\\\"礼\\\",\\\"苓\\\",\\\"鈴\\\",\\\"隷\\\",\\\"零\\\",\\\"霊\\\",\\\"麗\\\",\\\"齢\\\",\\\"暦\\\",\\\"歴\\\",\\\"列\\\",\\\"劣\\\",\\\"烈\\\",\\\"裂\\\",\\\"廉\\\",\\\"恋\\\",\\\"憐\\\",\\\"漣\\\",\\\"煉\\\",\\\"簾\\\",\\\"練\\\",\\\"聯\\\",\\\"蓮\\\",\\\"連\\\",\\\"錬\\\",\\\"呂\\\",\\\"魯\\\",\\\"櫓\\\",\\\"炉\\\",\\\"賂\\\",\\\"路\\\",\\\"露\\\",\\\"労\\\",\\\"婁\\\",\\\"廊\\\",\\\"弄\\\",\\\"朗\\\",\\\"楼\\\",\\\"榔\\\",\\\"浪\\\",\\\"漏\\\",\\\"牢\\\",\\\"狼\\\",\\\"篭\\\",\\\"老\\\",\\\"聾\\\",\\\"蝋\\\",\\\"郎\\\",\\\"六\\\",\\\"麓\\\",\\\"禄\\\",\\\"肋\\\",\\\"録\\\",\\\"論\\\",\\\"倭\\\",\\\"和\\\",\\\"話\\\",\\\"歪\\\",\\\"賄\\\",\\\"脇\\\",\\\"惑\\\",\\\"枠\\\",\\\"鷲\\\",\\\"亙\\\",\\\"亘\\\",\\\"鰐\\\",\\\"詫\\\",\\\"藁\\\",\\\"蕨\\\",\\\"椀\\\",\\\"湾\\\",\\\"碗\\\",\\\"腕\\\",\\\"𠮟\\\",\\\"孁\\\",\\\"孖\\\",\\\"孽\\\",\\\"宓\\\",\\\"寘\\\",\\\"寬\\\",\\\"尒\\\",\\\"尞\\\",\\\"尣\\\",\\\"尫\\\",\\\"㞍\\\",\\\"屢\\\",\\\"層\\\",\\\"屮\\\",\\\"𡚴\\\",\\\"屺\\\",\\\"岏\\\",\\\"岟\\\",\\\"岣\\\",\\\"岪\\\",\\\"岺\\\",\\\"峋\\\",\\\"峐\\\",\\\"峒\\\",\\\"峴\\\",\\\"𡸴\\\",\\\"㟢\\\",\\\"崍\\\",\\\"崧\\\",\\\"﨑\\\",\\\"嵆\\\",\\\"嵇\\\",\\\"嵓\\\",\\\"嵊\\\",\\\"嵭\\\",\\\"嶁\\\",\\\"嶠\\\",\\\"嶤\\\",\\\"嶧\\\",\\\"嶸\\\",\\\"巋\\\",\\\"吞\\\",\\\"弌\\\",\\\"丐\\\",\\\"丕\\\",\\\"个\\\",\\\"丱\\\",\\\"丶\\\",\\\"丼\\\",\\\"丿\\\",\\\"乂\\\",\\\"乖\\\",\\\"乘\\\",\\\"亂\\\",\\\"亅\\\",\\\"豫\\\",\\\"亊\\\",\\\"舒\\\",\\\"弍\\\",\\\"于\\\",\\\"亞\\\",\\\"亟\\\",\\\"亠\\\",\\\"亢\\\",\\\"亰\\\",\\\"亳\\\",\\\"亶\\\",\\\"从\\\",\\\"仍\\\",\\\"仄\\\",\\\"仆\\\",\\\"仂\\\",\\\"仗\\\",\\\"仞\\\",\\\"仭\\\",\\\"仟\\\",\\\"价\\\",\\\"伉\\\",\\\"佚\\\",\\\"估\\\",\\\"佛\\\",\\\"佝\\\",\\\"佗\\\",\\\"佇\\\",\\\"佶\\\",\\\"侈\\\",\\\"侏\\\",\\\"侘\\\",\\\"佻\\\",\\\"佩\\\",\\\"佰\\\",\\\"侑\\\",\\\"佯\\\",\\\"來\\\",\\\"侖\\\",\\\"儘\\\",\\\"俔\\\",\\\"俟\\\",\\\"俎\\\",\\\"俘\\\",\\\"俛\\\",\\\"俑\\\",\\\"俚\\\",\\\"俐\\\",\\\"俤\\\",\\\"俥\\\",\\\"倚\\\",\\\"倨\\\",\\\"倔\\\",\\\"倪\\\",\\\"倥\\\",\\\"倅\\\",\\\"伜\\\",\\\"俶\\\",\\\"倡\\\",\\\"倩\\\",\\\"倬\\\",\\\"俾\\\",\\\"俯\\\",\\\"們\\\",\\\"倆\\\",\\\"偃\\\",\\\"假\\\",\\\"會\\\",\\\"偕\\\",\\\"偐\\\",\\\"偈\\\",\\\"做\\\",\\\"偖\\\",\\\"偬\\\",\\\"偸\\\",\\\"傀\\\",\\\"傚\\\",\\\"傅\\\",\\\"傴\\\",\\\"傲\\\",\\\"僉\\\",\\\"僊\\\",\\\"傳\\\",\\\"僂\\\",\\\"僖\\\",\\\"僞\\\",\\\"僥\\\",\\\"僭\\\",\\\"僣\\\",\\\"僮\\\",\\\"價\\\",\\\"僵\\\",\\\"儉\\\",\\\"儁\\\",\\\"儂\\\",\\\"儖\\\",\\\"儕\\\",\\\"儔\\\",\\\"儚\\\",\\\"儡\\\",\\\"儺\\\",\\\"儷\\\",\\\"儼\\\",\\\"儻\\\",\\\"儿\\\",\\\"兀\\\",\\\"兒\\\",\\\"兌\\\",\\\"兔\\\",\\\"兢\\\",\\\"竸\\\",\\\"兩\\\",\\\"兪\\\",\\\"兮\\\",\\\"冀\\\",\\\"冂\\\",\\\"囘\\\",\\\"册\\\",\\\"冉\\\",\\\"冏\\\",\\\"冑\\\",\\\"冓\\\",\\\"冕\\\",\\\"冖\\\",\\\"冤\\\",\\\"冦\\\",\\\"冢\\\",\\\"冩\\\",\\\"冪\\\",\\\"冫\\\",\\\"决\\\",\\\"冱\\\",\\\"冲\\\",\\\"冰\\\",\\\"况\\\",\\\"冽\\\",\\\"凅\\\",\\\"凉\\\",\\\"凛\\\",\\\"几\\\",\\\"處\\\",\\\"凩\\\",\\\"凭\\\",\\\"凰\\\",\\\"凵\\\",\\\"凾\\\",\\\"刄\\\",\\\"刋\\\",\\\"刔\\\",\\\"刎\\\",\\\"刧\\\",\\\"刪\\\",\\\"刮\\\",\\\"刳\\\",\\\"刹\\\",\\\"剏\\\",\\\"剄\\\",\\\"剋\\\",\\\"剌\\\",\\\"剞\\\",\\\"剔\\\",\\\"剪\\\",\\\"剴\\\",\\\"剩\\\",\\\"剳\\\",\\\"剿\\\",\\\"剽\\\",\\\"劍\\\",\\\"劔\\\",\\\"劒\\\",\\\"剱\\\",\\\"劈\\\",\\\"劑\\\",\\\"辨\\\",\\\"辧\\\",\\\"劬\\\",\\\"劭\\\",\\\"劼\\\",\\\"劵\\\",\\\"勁\\\",\\\"勍\\\",\\\"勗\\\",\\\"勞\\\",\\\"勣\\\",\\\"勦\\\",\\\"飭\\\",\\\"勠\\\",\\\"勳\\\",\\\"勵\\\",\\\"勸\\\",\\\"勹\\\",\\\"匆\\\",\\\"匈\\\",\\\"甸\\\",\\\"匍\\\",\\\"匐\\\",\\\"匏\\\",\\\"匕\\\",\\\"匚\\\",\\\"匣\\\",\\\"匯\\\",\\\"匱\\\",\\\"匳\\\",\\\"匸\\\",\\\"區\\\",\\\"卆\\\",\\\"卅\\\",\\\"丗\\\",\\\"卉\\\",\\\"卍\\\",\\\"凖\\\",\\\"卞\\\",\\\"卩\\\",\\\"卮\\\",\\\"夘\\\",\\\"卻\\\",\\\"卷\\\",\\\"厂\\\",\\\"厖\\\",\\\"厠\\\",\\\"厦\\\",\\\"厥\\\",\\\"厮\\\",\\\"厰\\\",\\\"厶\\\",\\\"參\\\",\\\"簒\\\",\\\"雙\\\",\\\"叟\\\",\\\"曼\\\",\\\"燮\\\",\\\"叮\\\",\\\"叨\\\",\\\"叭\\\",\\\"叺\\\",\\\"吁\\\",\\\"吽\\\",\\\"呀\\\",\\\"听\\\",\\\"吭\\\",\\\"吼\\\",\\\"吮\\\",\\\"吶\\\",\\\"吩\\\",\\\"吝\\\",\\\"呎\\\",\\\"咏\\\",\\\"呵\\\",\\\"咎\\\",\\\"呟\\\",\\\"呱\\\",\\\"呷\\\",\\\"呰\\\",\\\"咒\\\",\\\"呻\\\",\\\"咀\\\",\\\"呶\\\",\\\"咄\\\",\\\"咐\\\",\\\"咆\\\",\\\"哇\\\",\\\"咢\\\",\\\"咸\\\",\\\"咥\\\",\\\"咬\\\",\\\"哄\\\",\\\"哈\\\",\\\"咨\\\",\\\"咫\\\",\\\"哂\\\",\\\"咤\\\",\\\"咾\\\",\\\"咼\\\",\\\"哘\\\",\\\"哥\\\",\\\"哦\\\",\\\"唏\\\",\\\"唔\\\",\\\"哽\\\",\\\"哮\\\",\\\"哭\\\",\\\"哺\\\",\\\"哢\\\",\\\"唹\\\",\\\"啀\\\",\\\"啣\\\",\\\"啌\\\",\\\"售\\\",\\\"啜\\\",\\\"啅\\\",\\\"啖\\\",\\\"啗\\\",\\\"唸\\\",\\\"唳\\\",\\\"啝\\\",\\\"喙\\\",\\\"喀\\\",\\\"咯\\\",\\\"喊\\\",\\\"喟\\\",\\\"啻\\\",\\\"啾\\\",\\\"喘\\\",\\\"喞\\\",\\\"單\\\",\\\"啼\\\",\\\"喃\\\",\\\"喩\\\",\\\"喇\\\",\\\"喨\\\",\\\"嗚\\\",\\\"嗅\\\",\\\"嗟\\\",\\\"嗄\\\",\\\"嗜\\\",\\\"嗤\\\",\\\"嗔\\\",\\\"嘔\\\",\\\"嗷\\\",\\\"嘖\\\",\\\"嗾\\\",\\\"嗽\\\",\\\"嘛\\\",\\\"嗹\\\",\\\"噎\\\",\\\"噐\\\",\\\"營\\\",\\\"嘴\\\",\\\"嘶\\\",\\\"嘲\\\",\\\"嘸\\\",\\\"噫\\\",\\\"噤\\\",\\\"嘯\\\",\\\"噬\\\",\\\"噪\\\",\\\"嚆\\\",\\\"嚀\\\",\\\"嚊\\\",\\\"嚠\\\",\\\"嚔\\\",\\\"嚏\\\",\\\"嚥\\\",\\\"嚮\\\",\\\"嚶\\\",\\\"嚴\\\",\\\"囂\\\",\\\"嚼\\\",\\\"囁\\\",\\\"囃\\\",\\\"囀\\\",\\\"囈\\\",\\\"囎\\\",\\\"囑\\\",\\\"囓\\\",\\\"囗\\\",\\\"囮\\\",\\\"囹\\\",\\\"圀\\\",\\\"囿\\\",\\\"圄\\\",\\\"圉\\\",\\\"圈\\\",\\\"國\\\",\\\"圍\\\",\\\"圓\\\",\\\"團\\\",\\\"圖\\\",\\\"嗇\\\",\\\"圜\\\",\\\"圦\\\",\\\"圷\\\",\\\"圸\\\",\\\"坎\\\",\\\"圻\\\",\\\"址\\\",\\\"坏\\\",\\\"坩\\\",\\\"埀\\\",\\\"垈\\\",\\\"坡\\\",\\\"坿\\\",\\\"垉\\\",\\\"垓\\\",\\\"垠\\\",\\\"垳\\\",\\\"垤\\\",\\\"垪\\\",\\\"垰\\\",\\\"埃\\\",\\\"埆\\\",\\\"埔\\\",\\\"埒\\\",\\\"埓\\\",\\\"堊\\\",\\\"埖\\\",\\\"埣\\\",\\\"堋\\\",\\\"堙\\\",\\\"堝\\\",\\\"塲\\\",\\\"堡\\\",\\\"塢\\\",\\\"塋\\\",\\\"塰\\\",\\\"毀\\\",\\\"塒\\\",\\\"堽\\\",\\\"塹\\\",\\\"墅\\\",\\\"墹\\\",\\\"墟\\\",\\\"墫\\\",\\\"墺\\\",\\\"壞\\\",\\\"墻\\\",\\\"墸\\\",\\\"墮\\\",\\\"壅\\\",\\\"壓\\\",\\\"壑\\\",\\\"壗\\\",\\\"壙\\\",\\\"壘\\\",\\\"壥\\\",\\\"壜\\\",\\\"壤\\\",\\\"壟\\\",\\\"壯\\\",\\\"壺\\\",\\\"壹\\\",\\\"壻\\\",\\\"壼\\\",\\\"壽\\\",\\\"夂\\\",\\\"夊\\\",\\\"夐\\\",\\\"夛\\\",\\\"梦\\\",\\\"夥\\\",\\\"夬\\\",\\\"夭\\\",\\\"夲\\\",\\\"夸\\\",\\\"夾\\\",\\\"竒\\\",\\\"奕\\\",\\\"奐\\\",\\\"奎\\\",\\\"奚\\\",\\\"奘\\\",\\\"奢\\\",\\\"奠\\\",\\\"奧\\\",\\\"奬\\\",\\\"奩\\\",\\\"奸\\\",\\\"妁\\\",\\\"妝\\\",\\\"佞\\\",\\\"侫\\\",\\\"妣\\\",\\\"妲\\\",\\\"姆\\\",\\\"姨\\\",\\\"姜\\\",\\\"妍\\\",\\\"姙\\\",\\\"姚\\\",\\\"娥\\\",\\\"娟\\\",\\\"娑\\\",\\\"娜\\\",\\\"娉\\\",\\\"娚\\\",\\\"婀\\\",\\\"婬\\\",\\\"婉\\\",\\\"娵\\\",\\\"娶\\\",\\\"婢\\\",\\\"婪\\\",\\\"媚\\\",\\\"媼\\\",\\\"媾\\\",\\\"嫋\\\",\\\"嫂\\\",\\\"媽\\\",\\\"嫣\\\",\\\"嫗\\\",\\\"嫦\\\",\\\"嫩\\\",\\\"嫖\\\",\\\"嫺\\\",\\\"嫻\\\",\\\"嬌\\\",\\\"嬋\\\",\\\"嬖\\\",\\\"嬲\\\",\\\"嫐\\\",\\\"嬪\\\",\\\"嬶\\\",\\\"嬾\\\",\\\"孃\\\",\\\"孅\\\",\\\"孀\\\",\\\"孑\\\",\\\"孕\\\",\\\"孚\\\",\\\"孛\\\",\\\"孥\\\",\\\"孩\\\",\\\"孰\\\",\\\"孳\\\",\\\"孵\\\",\\\"學\\\",\\\"斈\\\",\\\"孺\\\",\\\"宀\\\",\\\"它\\\",\\\"宦\\\",\\\"宸\\\",\\\"寃\\\",\\\"寇\\\",\\\"寉\\\",\\\"寔\\\",\\\"寐\\\",\\\"寤\\\",\\\"實\\\",\\\"寢\\\",\\\"寞\\\",\\\"寥\\\",\\\"寫\\\",\\\"寰\\\",\\\"寶\\\",\\\"寳\\\",\\\"尅\\\",\\\"將\\\",\\\"專\\\",\\\"對\\\",\\\"尓\\\",\\\"尠\\\",\\\"尢\\\",\\\"尨\\\",\\\"尸\\\",\\\"尹\\\",\\\"屁\\\",\\\"屆\\\",\\\"屎\\\",\\\"屓\\\",\\\"屐\\\",\\\"屏\\\",\\\"孱\\\",\\\"屬\\\",\\\"屮\\\",\\\"乢\\\",\\\"屶\\\",\\\"屹\\\",\\\"岌\\\",\\\"岑\\\",\\\"岔\\\",\\\"妛\\\",\\\"岫\\\",\\\"岻\\\",\\\"岶\\\",\\\"岼\\\",\\\"岷\\\",\\\"峅\\\",\\\"岾\\\",\\\"峇\\\",\\\"峙\\\",\\\"峩\\\",\\\"峽\\\",\\\"峺\\\",\\\"峭\\\",\\\"嶌\\\",\\\"峪\\\",\\\"崋\\\",\\\"崕\\\",\\\"崗\\\",\\\"嵜\\\",\\\"崟\\\",\\\"崛\\\",\\\"崑\\\",\\\"崔\\\",\\\"崢\\\",\\\"崚\\\",\\\"崙\\\",\\\"崘\\\",\\\"嵌\\\",\\\"嵒\\\",\\\"嵎\\\",\\\"嵋\\\",\\\"嵬\\\",\\\"嵳\\\",\\\"嵶\\\",\\\"嶇\\\",\\\"嶄\\\",\\\"嶂\\\",\\\"嶢\\\",\\\"嶝\\\",\\\"嶬\\\",\\\"嶮\\\",\\\"嶽\\\",\\\"嶐\\\",\\\"嶷\\\",\\\"嶼\\\",\\\"巉\\\",\\\"巍\\\",\\\"巓\\\",\\\"巒\\\",\\\"巖\\\",\\\"巛\\\",\\\"巫\\\",\\\"已\\\",\\\"巵\\\",\\\"帋\\\",\\\"帚\\\",\\\"帙\\\",\\\"帑\\\",\\\"帛\\\",\\\"帶\\\",\\\"帷\\\",\\\"幄\\\",\\\"幃\\\",\\\"幀\\\",\\\"幎\\\",\\\"幗\\\",\\\"幔\\\",\\\"幟\\\",\\\"幢\\\",\\\"幤\\\",\\\"幇\\\",\\\"幵\\\",\\\"并\\\",\\\"幺\\\",\\\"麼\\\",\\\"广\\\",\\\"庠\\\",\\\"廁\\\",\\\"廂\\\",\\\"廈\\\",\\\"廐\\\",\\\"廏\\\",\\\"廖\\\",\\\"廣\\\",\\\"廝\\\",\\\"廚\\\",\\\"廛\\\",\\\"廢\\\",\\\"廡\\\",\\\"廨\\\",\\\"廩\\\",\\\"廬\\\",\\\"廱\\\",\\\"廳\\\",\\\"廰\\\",\\\"廴\\\",\\\"廸\\\",\\\"廾\\\",\\\"弃\\\",\\\"弉\\\",\\\"彝\\\",\\\"彜\\\",\\\"弋\\\",\\\"弑\\\",\\\"弖\\\",\\\"弩\\\",\\\"弭\\\",\\\"弸\\\",\\\"彁\\\",\\\"彈\\\",\\\"彌\\\",\\\"彎\\\",\\\"弯\\\",\\\"彑\\\",\\\"彖\\\",\\\"彗\\\",\\\"彙\\\",\\\"彡\\\",\\\"彭\\\",\\\"彳\\\",\\\"彷\\\",\\\"徃\\\",\\\"徂\\\",\\\"彿\\\",\\\"徊\\\",\\\"很\\\",\\\"徑\\\",\\\"徇\\\",\\\"從\\\",\\\"徙\\\",\\\"徘\\\",\\\"徠\\\",\\\"徨\\\",\\\"徭\\\",\\\"徼\\\",\\\"忖\\\",\\\"忻\\\",\\\"忤\\\",\\\"忸\\\",\\\"忱\\\",\\\"忝\\\",\\\"悳\\\",\\\"忿\\\",\\\"怡\\\",\\\"恠\\\",\\\"怙\\\",\\\"怐\\\",\\\"怩\\\",\\\"怎\\\",\\\"怱\\\",\\\"怛\\\",\\\"怕\\\",\\\"怫\\\",\\\"怦\\\",\\\"怏\\\",\\\"怺\\\",\\\"恚\\\",\\\"恁\\\",\\\"恪\\\",\\\"恷\\\",\\\"恟\\\",\\\"恊\\\",\\\"恆\\\",\\\"恍\\\",\\\"恣\\\",\\\"恃\\\",\\\"恤\\\",\\\"恂\\\",\\\"恬\\\",\\\"恫\\\",\\\"恙\\\",\\\"悁\\\",\\\"悍\\\",\\\"惧\\\",\\\"悃\\\",\\\"悚\\\",\\\"悄\\\",\\\"悛\\\",\\\"悖\\\",\\\"悗\\\",\\\"悒\\\",\\\"悧\\\",\\\"悋\\\",\\\"惡\\\",\\\"悸\\\",\\\"惠\\\",\\\"惓\\\",\\\"悴\\\",\\\"忰\\\",\\\"悽\\\",\\\"惆\\\",\\\"悵\\\",\\\"惘\\\",\\\"慍\\\",\\\"愕\\\",\\\"愆\\\",\\\"惶\\\",\\\"惷\\\",\\\"愀\\\",\\\"惴\\\",\\\"惺\\\",\\\"愃\\\",\\\"愡\\\",\\\"惻\\\",\\\"惱\\\",\\\"愍\\\",\\\"愎\\\",\\\"慇\\\",\\\"愾\\\",\\\"愨\\\",\\\"愧\\\",\\\"慊\\\",\\\"愿\\\",\\\"愼\\\",\\\"愬\\\",\\\"愴\\\",\\\"愽\\\",\\\"慂\\\",\\\"慄\\\",\\\"慳\\\",\\\"慷\\\",\\\"慘\\\",\\\"慙\\\",\\\"慚\\\",\\\"慫\\\",\\\"慴\\\",\\\"慯\\\",\\\"慥\\\",\\\"慱\\\",\\\"慟\\\",\\\"慝\\\",\\\"慓\\\",\\\"慵\\\",\\\"憙\\\",\\\"憖\\\",\\\"憇\\\",\\\"憬\\\",\\\"憔\\\",\\\"憚\\\",\\\"憊\\\",\\\"憑\\\",\\\"憫\\\",\\\"憮\\\",\\\"懌\\\",\\\"懊\\\",\\\"應\\\",\\\"懷\\\",\\\"懈\\\",\\\"懃\\\",\\\"懆\\\",\\\"憺\\\",\\\"懋\\\",\\\"罹\\\",\\\"懍\\\",\\\"懦\\\",\\\"懣\\\",\\\"懶\\\",\\\"懺\\\",\\\"懴\\\",\\\"懿\\\",\\\"懽\\\",\\\"懼\\\",\\\"懾\\\",\\\"戀\\\",\\\"戈\\\",\\\"戉\\\",\\\"戍\\\",\\\"戌\\\",\\\"戔\\\",\\\"戛\\\",\\\"戞\\\",\\\"戡\\\",\\\"截\\\",\\\"戮\\\",\\\"戰\\\",\\\"戲\\\",\\\"戳\\\",\\\"扁\\\",\\\"扎\\\",\\\"扞\\\",\\\"扣\\\",\\\"扛\\\",\\\"扠\\\",\\\"扨\\\",\\\"扼\\\",\\\"抂\\\",\\\"抉\\\",\\\"找\\\",\\\"抒\\\",\\\"抓\\\",\\\"抖\\\",\\\"拔\\\",\\\"抃\\\",\\\"抔\\\",\\\"拗\\\",\\\"拑\\\",\\\"抻\\\",\\\"拏\\\",\\\"拿\\\",\\\"拆\\\",\\\"擔\\\",\\\"拈\\\",\\\"拜\\\",\\\"拌\\\",\\\"拊\\\",\\\"拂\\\",\\\"拇\\\",\\\"抛\\\",\\\"拉\\\",\\\"挌\\\",\\\"拮\\\",\\\"拱\\\",\\\"挧\\\",\\\"挂\\\",\\\"挈\\\",\\\"拯\\\",\\\"拵\\\",\\\"捐\\\",\\\"挾\\\",\\\"捍\\\",\\\"搜\\\",\\\"捏\\\",\\\"掖\\\",\\\"掎\\\",\\\"掀\\\",\\\"掫\\\",\\\"捶\\\",\\\"掣\\\",\\\"掏\\\",\\\"掉\\\",\\\"掟\\\",\\\"掵\\\",\\\"捫\\\",\\\"捩\\\",\\\"掾\\\",\\\"揩\\\",\\\"揀\\\",\\\"揆\\\",\\\"揣\\\",\\\"揉\\\",\\\"插\\\",\\\"揶\\\",\\\"揄\\\",\\\"搖\\\",\\\"搴\\\",\\\"搆\\\",\\\"搓\\\",\\\"搦\\\",\\\"搶\\\",\\\"攝\\\",\\\"搗\\\",\\\"搨\\\",\\\"搏\\\",\\\"摧\\\",\\\"摯\\\",\\\"摶\\\",\\\"摎\\\",\\\"攪\\\",\\\"撕\\\",\\\"撓\\\",\\\"撥\\\",\\\"撩\\\",\\\"撈\\\",\\\"撼\\\",\\\"據\\\",\\\"擒\\\",\\\"擅\\\",\\\"擇\\\",\\\"撻\\\",\\\"擘\\\",\\\"擂\\\",\\\"擱\\\",\\\"擧\\\",\\\"舉\\\",\\\"擠\\\",\\\"擡\\\",\\\"抬\\\",\\\"擣\\\",\\\"擯\\\",\\\"攬\\\",\\\"擶\\\",\\\"擴\\\",\\\"擲\\\",\\\"擺\\\",\\\"攀\\\",\\\"擽\\\",\\\"攘\\\",\\\"攜\\\",\\\"攅\\\",\\\"攤\\\",\\\"攣\\\",\\\"攫\\\",\\\"攴\\\",\\\"攵\\\",\\\"攷\\\",\\\"收\\\",\\\"攸\\\",\\\"畋\\\",\\\"效\\\",\\\"敖\\\",\\\"敕\\\",\\\"敍\\\",\\\"敘\\\",\\\"敞\\\",\\\"敝\\\",\\\"敲\\\",\\\"數\\\",\\\"斂\\\",\\\"斃\\\",\\\"變\\\",\\\"斛\\\",\\\"斟\\\",\\\"斫\\\",\\\"斷\\\",\\\"旃\\\",\\\"旆\\\",\\\"旁\\\",\\\"旄\\\",\\\"旌\\\",\\\"旒\\\",\\\"旛\\\",\\\"旙\\\",\\\"无\\\",\\\"旡\\\",\\\"旱\\\",\\\"杲\\\",\\\"昊\\\",\\\"昃\\\",\\\"旻\\\",\\\"杳\\\",\\\"昵\\\",\\\"昶\\\",\\\"昴\\\",\\\"昜\\\",\\\"晏\\\",\\\"晄\\\",\\\"晉\\\",\\\"晁\\\",\\\"晞\\\",\\\"晝\\\",\\\"晤\\\",\\\"晧\\\",\\\"晨\\\",\\\"晟\\\",\\\"晢\\\",\\\"晰\\\",\\\"暃\\\",\\\"暈\\\",\\\"暎\\\",\\\"暉\\\",\\\"暄\\\",\\\"暘\\\",\\\"暝\\\",\\\"曁\\\",\\\"暹\\\",\\\"曉\\\",\\\"暾\\\",\\\"暼\\\",\\\"曄\\\",\\\"暸\\\",\\\"曖\\\",\\\"曚\\\",\\\"曠\\\",\\\"昿\\\",\\\"曦\\\",\\\"曩\\\",\\\"曰\\\",\\\"曵\\\",\\\"曷\\\",\\\"朏\\\",\\\"朖\\\",\\\"朞\\\",\\\"朦\\\",\\\"朧\\\",\\\"霸\\\",\\\"朮\\\",\\\"朿\\\",\\\"朶\\\",\\\"杁\\\",\\\"朸\\\",\\\"朷\\\",\\\"杆\\\",\\\"杞\\\",\\\"杠\\\",\\\"杙\\\",\\\"杣\\\",\\\"杤\\\",\\\"枉\\\",\\\"杰\\\",\\\"枩\\\",\\\"杼\\\",\\\"杪\\\",\\\"枌\\\",\\\"枋\\\",\\\"枦\\\",\\\"枡\\\",\\\"枅\\\",\\\"枷\\\",\\\"柯\\\",\\\"枴\\\",\\\"柬\\\",\\\"枳\\\",\\\"柩\\\",\\\"枸\\\",\\\"柤\\\",\\\"柞\\\",\\\"柝\\\",\\\"柢\\\",\\\"柮\\\",\\\"枹\\\",\\\"柎\\\",\\\"柆\\\",\\\"柧\\\",\\\"檜\\\",\\\"栞\\\",\\\"框\\\",\\\"栩\\\",\\\"桀\\\",\\\"桍\\\",\\\"栲\\\",\\\"桎\\\",\\\"梳\\\",\\\"栫\\\",\\\"桙\\\",\\\"档\\\",\\\"桷\\\",\\\"桿\\\",\\\"梟\\\",\\\"梏\\\",\\\"梭\\\",\\\"梔\\\",\\\"條\\\",\\\"梛\\\",\\\"梃\\\",\\\"檮\\\",\\\"梹\\\",\\\"桴\\\",\\\"梵\\\",\\\"梠\\\",\\\"梺\\\",\\\"椏\\\",\\\"梍\\\",\\\"桾\\\",\\\"椁\\\",\\\"棊\\\",\\\"椈\\\",\\\"棘\\\",\\\"椢\\\",\\\"椦\\\",\\\"棡\\\",\\\"椌\\\",\\\"棍\\\",\\\"棔\\\",\\\"棧\\\",\\\"棕\\\",\\\"椶\\\",\\\"椒\\\",\\\"椄\\\",\\\"棗\\\",\\\"棣\\\",\\\"椥\\\",\\\"棹\\\",\\\"棠\\\",\\\"棯\\\",\\\"椨\\\",\\\"椪\\\",\\\"椚\\\",\\\"椣\\\",\\\"椡\\\",\\\"棆\\\",\\\"楹\\\",\\\"楷\\\",\\\"楜\\\",\\\"楸\\\",\\\"楫\\\",\\\"楔\\\",\\\"楾\\\",\\\"楮\\\",\\\"椹\\\",\\\"楴\\\",\\\"椽\\\",\\\"楙\\\",\\\"椰\\\",\\\"楡\\\",\\\"楞\\\",\\\"楝\\\",\\\"榁\\\",\\\"楪\\\",\\\"榲\\\",\\\"榮\\\",\\\"槐\\\",\\\"榿\\\",\\\"槁\\\",\\\"槓\\\",\\\"榾\\\",\\\"槎\\\",\\\"寨\\\",\\\"槊\\\",\\\"槝\\\",\\\"榻\\\",\\\"槃\\\",\\\"榧\\\",\\\"樮\\\",\\\"榑\\\",\\\"榠\\\",\\\"榜\\\",\\\"榕\\\",\\\"榴\\\",\\\"槞\\\",\\\"槨\\\",\\\"樂\\\",\\\"樛\\\",\\\"槿\\\",\\\"權\\\",\\\"槹\\\",\\\"槲\\\",\\\"槧\\\",\\\"樅\\\",\\\"榱\\\",\\\"樞\\\",\\\"槭\\\",\\\"樔\\\",\\\"槫\\\",\\\"樊\\\",\\\"樒\\\",\\\"櫁\\\",\\\"樣\\\",\\\"樓\\\",\\\"橄\\\",\\\"樌\\\",\\\"橲\\\",\\\"樶\\\",\\\"橸\\\",\\\"橇\\\",\\\"橢\\\",\\\"橙\\\",\\\"橦\\\",\\\"橈\\\",\\\"樸\\\",\\\"樢\\\",\\\"檐\\\",\\\"檍\\\",\\\"檠\\\",\\\"檄\\\",\\\"檢\\\",\\\"檣\\\",\\\"檗\\\",\\\"蘗\\\",\\\"檻\\\",\\\"櫃\\\",\\\"櫂\\\",\\\"檸\\\",\\\"檳\\\",\\\"檬\\\",\\\"櫞\\\",\\\"櫑\\\",\\\"櫟\\\",\\\"檪\\\",\\\"櫚\\\",\\\"櫪\\\",\\\"櫻\\\",\\\"欅\\\",\\\"蘖\\\",\\\"櫺\\\",\\\"欒\\\",\\\"欖\\\",\\\"鬱\\\",\\\"欟\\\",\\\"欸\\\",\\\"欷\\\",\\\"盜\\\",\\\"欹\\\",\\\"飮\\\",\\\"歇\\\",\\\"歃\\\",\\\"歉\\\",\\\"歐\\\",\\\"歙\\\",\\\"歔\\\",\\\"歛\\\",\\\"歟\\\",\\\"歡\\\",\\\"歸\\\",\\\"歹\\\",\\\"歿\\\",\\\"殀\\\",\\\"殄\\\",\\\"殃\\\",\\\"殍\\\",\\\"殘\\\",\\\"殕\\\",\\\"殞\\\",\\\"殤\\\",\\\"殪\\\",\\\"殫\\\",\\\"殯\\\",\\\"殲\\\",\\\"殱\\\",\\\"殳\\\",\\\"殷\\\",\\\"殼\\\",\\\"毆\\\",\\\"毋\\\",\\\"毓\\\",\\\"毟\\\",\\\"毬\\\",\\\"毫\\\",\\\"毳\\\",\\\"毯\\\",\\\"麾\\\",\\\"氈\\\",\\\"氓\\\",\\\"气\\\",\\\"氛\\\",\\\"氤\\\",\\\"氣\\\",\\\"汞\\\",\\\"汕\\\",\\\"汢\\\",\\\"汪\\\",\\\"沂\\\",\\\"沍\\\",\\\"沚\\\",\\\"沁\\\",\\\"沛\\\",\\\"汾\\\",\\\"汨\\\",\\\"汳\\\",\\\"沒\\\",\\\"沐\\\",\\\"泄\\\",\\\"泱\\\",\\\"泓\\\",\\\"沽\\\",\\\"泗\\\",\\\"泅\\\",\\\"泝\\\",\\\"沮\\\",\\\"沱\\\",\\\"沾\\\",\\\"沺\\\",\\\"泛\\\",\\\"泯\\\",\\\"泙\\\",\\\"泪\\\",\\\"洟\\\",\\\"衍\\\",\\\"洶\\\",\\\"洫\\\",\\\"洽\\\",\\\"洸\\\",\\\"洙\\\",\\\"洵\\\",\\\"洳\\\",\\\"洒\\\",\\\"洌\\\",\\\"浣\\\",\\\"涓\\\",\\\"浤\\\",\\\"浚\\\",\\\"浹\\\",\\\"浙\\\",\\\"涎\\\",\\\"涕\\\",\\\"濤\\\",\\\"涅\\\",\\\"淹\\\",\\\"渕\\\",\\\"渊\\\",\\\"涵\\\",\\\"淇\\\",\\\"淦\\\",\\\"涸\\\",\\\"淆\\\",\\\"淬\\\",\\\"淞\\\",\\\"淌\\\",\\\"淨\\\",\\\"淒\\\",\\\"淅\\\",\\\"淺\\\",\\\"淙\\\",\\\"淤\\\",\\\"淕\\\",\\\"淪\\\",\\\"淮\\\",\\\"渭\\\",\\\"湮\\\",\\\"渮\\\",\\\"渙\\\",\\\"湲\\\",\\\"湟\\\",\\\"渾\\\",\\\"渣\\\",\\\"湫\\\",\\\"渫\\\",\\\"湶\\\",\\\"湍\\\",\\\"渟\\\",\\\"湃\\\",\\\"渺\\\",\\\"湎\\\",\\\"渤\\\",\\\"滿\\\",\\\"渝\\\",\\\"游\\\",\\\"溂\\\",\\\"溪\\\",\\\"溘\\\",\\\"滉\\\",\\\"溷\\\",\\\"滓\\\",\\\"溽\\\",\\\"溯\\\",\\\"滄\\\",\\\"溲\\\",\\\"滔\\\",\\\"滕\\\",\\\"溏\\\",\\\"溥\\\",\\\"滂\\\",\\\"溟\\\",\\\"潁\\\",\\\"漑\\\",\\\"灌\\\",\\\"滬\\\",\\\"滸\\\",\\\"滾\\\",\\\"漿\\\",\\\"滲\\\",\\\"漱\\\",\\\"滯\\\",\\\"漲\\\",\\\"滌\\\",\\\"漾\\\",\\\"漓\\\",\\\"滷\\\",\\\"澆\\\",\\\"潺\\\",\\\"潸\\\",\\\"澁\\\",\\\"澀\\\",\\\"潯\\\",\\\"潛\\\",\\\"濳\\\",\\\"潭\\\",\\\"澂\\\",\\\"潼\\\",\\\"潘\\\",\\\"澎\\\",\\\"澑\\\",\\\"濂\\\",\\\"潦\\\",\\\"澳\\\",\\\"澣\\\",\\\"澡\\\",\\\"澤\\\",\\\"澹\\\",\\\"濆\\\",\\\"澪\\\",\\\"濟\\\",\\\"濕\\\",\\\"濬\\\",\\\"濔\\\",\\\"濘\\\",\\\"濱\\\",\\\"濮\\\",\\\"濛\\\",\\\"瀉\\\",\\\"瀋\\\",\\\"濺\\\",\\\"瀑\\\",\\\"瀁\\\",\\\"瀏\\\",\\\"濾\\\",\\\"瀛\\\",\\\"瀚\\\",\\\"潴\\\",\\\"瀝\\\",\\\"瀘\\\",\\\"瀟\\\",\\\"瀰\\\",\\\"瀾\\\",\\\"瀲\\\",\\\"灑\\\",\\\"灣\\\",\\\"炙\\\",\\\"炒\\\",\\\"炯\\\",\\\"烱\\\",\\\"炬\\\",\\\"炸\\\",\\\"炳\\\",\\\"炮\\\",\\\"烟\\\",\\\"烋\\\",\\\"烝\\\",\\\"烙\\\",\\\"焉\\\",\\\"烽\\\",\\\"焜\\\",\\\"焙\\\",\\\"煥\\\",\\\"煕\\\",\\\"熈\\\",\\\"煦\\\",\\\"煢\\\",\\\"煌\\\",\\\"煖\\\",\\\"煬\\\",\\\"熏\\\",\\\"燻\\\",\\\"熄\\\",\\\"熕\\\",\\\"熨\\\",\\\"熬\\\",\\\"燗\\\",\\\"熹\\\",\\\"熾\\\",\\\"燒\\\",\\\"燉\\\",\\\"燔\\\",\\\"燎\\\",\\\"燠\\\",\\\"燬\\\",\\\"燧\\\",\\\"燵\\\",\\\"燼\\\",\\\"燹\\\",\\\"燿\\\",\\\"爍\\\",\\\"爐\\\",\\\"爛\\\",\\\"爨\\\",\\\"爭\\\",\\\"爬\\\",\\\"爰\\\",\\\"爲\\\",\\\"爻\\\",\\\"爼\\\",\\\"爿\\\",\\\"牀\\\",\\\"牆\\\",\\\"牋\\\",\\\"牘\\\",\\\"牴\\\",\\\"牾\\\",\\\"犂\\\",\\\"犁\\\",\\\"犇\\\",\\\"犒\\\",\\\"犖\\\",\\\"犢\\\",\\\"犧\\\",\\\"犹\\\",\\\"犲\\\",\\\"狃\\\",\\\"狆\\\",\\\"狄\\\",\\\"狎\\\",\\\"狒\\\",\\\"狢\\\",\\\"狠\\\",\\\"狡\\\",\\\"狹\\\",\\\"狷\\\",\\\"倏\\\",\\\"猗\\\",\\\"猊\\\",\\\"猜\\\",\\\"猖\\\",\\\"猝\\\",\\\"猴\\\",\\\"猯\\\",\\\"猩\\\",\\\"猥\\\",\\\"猾\\\",\\\"獎\\\",\\\"獏\\\",\\\"默\\\",\\\"獗\\\",\\\"獪\\\",\\\"獨\\\",\\\"獰\\\",\\\"獸\\\",\\\"獵\\\",\\\"獻\\\",\\\"獺\\\",\\\"珈\\\",\\\"玳\\\",\\\"珎\\\",\\\"玻\\\",\\\"珀\\\",\\\"珥\\\",\\\"珮\\\",\\\"珞\\\",\\\"璢\\\",\\\"琅\\\",\\\"瑯\\\",\\\"琥\\\",\\\"珸\\\",\\\"琲\\\",\\\"琺\\\",\\\"瑕\\\",\\\"琿\\\",\\\"瑟\\\",\\\"瑙\\\",\\\"瑁\\\",\\\"瑜\\\",\\\"瑩\\\",\\\"瑰\\\",\\\"瑣\\\",\\\"瑪\\\",\\\"瑶\\\",\\\"瑾\\\",\\\"璋\\\",\\\"璞\\\",\\\"璧\\\",\\\"瓊\\\",\\\"瓏\\\",\\\"瓔\\\",\\\"珱\\\",\\\"瓠\\\",\\\"瓣\\\",\\\"瓧\\\",\\\"瓩\\\",\\\"瓮\\\",\\\"瓲\\\",\\\"瓰\\\",\\\"瓱\\\",\\\"瓸\\\",\\\"瓷\\\",\\\"甄\\\",\\\"甃\\\",\\\"甅\\\",\\\"甌\\\",\\\"甎\\\",\\\"甍\\\",\\\"甕\\\",\\\"甓\\\",\\\"甞\\\",\\\"甦\\\",\\\"甬\\\",\\\"甼\\\",\\\"畄\\\",\\\"畍\\\",\\\"畊\\\",\\\"畉\\\",\\\"畛\\\",\\\"畆\\\",\\\"畚\\\",\\\"畩\\\",\\\"畤\\\",\\\"畧\\\",\\\"畫\\\",\\\"畭\\\",\\\"畸\\\",\\\"當\\\",\\\"疆\\\",\\\"疇\\\",\\\"畴\\\",\\\"疊\\\",\\\"疉\\\",\\\"疂\\\",\\\"疔\\\",\\\"疚\\\",\\\"疝\\\",\\\"疥\\\",\\\"疣\\\",\\\"痂\\\",\\\"疳\\\",\\\"痃\\\",\\\"疵\\\",\\\"疽\\\",\\\"疸\\\",\\\"疼\\\",\\\"疱\\\",\\\"痍\\\",\\\"痊\\\",\\\"痒\\\",\\\"痙\\\",\\\"痣\\\",\\\"痞\\\",\\\"痾\\\",\\\"痿\\\",\\\"痼\\\",\\\"瘁\\\",\\\"痰\\\",\\\"痺\\\",\\\"痲\\\",\\\"痳\\\",\\\"瘋\\\",\\\"瘍\\\",\\\"瘉\\\",\\\"瘟\\\",\\\"瘧\\\",\\\"瘠\\\",\\\"瘡\\\",\\\"瘢\\\",\\\"瘤\\\",\\\"瘴\\\",\\\"瘰\\\",\\\"瘻\\\",\\\"癇\\\",\\\"癈\\\",\\\"癆\\\",\\\"癜\\\",\\\"癘\\\",\\\"癡\\\",\\\"癢\\\",\\\"癨\\\",\\\"癩\\\",\\\"癪\\\",\\\"癧\\\",\\\"癬\\\",\\\"癰\\\",\\\"癲\\\",\\\"癶\\\",\\\"癸\\\",\\\"發\\\",\\\"皀\\\",\\\"皃\\\",\\\"皈\\\",\\\"皋\\\",\\\"皎\\\",\\\"皖\\\",\\\"皓\\\",\\\"皙\\\",\\\"皚\\\",\\\"皰\\\",\\\"皴\\\",\\\"皸\\\",\\\"皹\\\",\\\"皺\\\",\\\"盂\\\",\\\"盍\\\",\\\"盖\\\",\\\"盒\\\",\\\"盞\\\",\\\"盡\\\",\\\"盥\\\",\\\"盧\\\",\\\"盪\\\",\\\"蘯\\\",\\\"盻\\\",\\\"眈\\\",\\\"眇\\\",\\\"眄\\\",\\\"眩\\\",\\\"眤\\\",\\\"眞\\\",\\\"眥\\\",\\\"眦\\\",\\\"眛\\\",\\\"眷\\\",\\\"眸\\\",\\\"睇\\\",\\\"睚\\\",\\\"睨\\\",\\\"睫\\\",\\\"睛\\\",\\\"睥\\\",\\\"睿\\\",\\\"睾\\\",\\\"睹\\\",\\\"瞎\\\",\\\"瞋\\\",\\\"瞑\\\",\\\"瞠\\\",\\\"瞞\\\",\\\"瞰\\\",\\\"瞶\\\",\\\"瞹\\\",\\\"瞿\\\",\\\"瞼\\\",\\\"瞽\\\",\\\"瞻\\\",\\\"矇\\\",\\\"矍\\\",\\\"矗\\\",\\\"矚\\\",\\\"矜\\\",\\\"矣\\\",\\\"矮\\\",\\\"矼\\\",\\\"砌\\\",\\\"砒\\\",\\\"礦\\\",\\\"砠\\\",\\\"礪\\\",\\\"硅\\\",\\\"碎\\\",\\\"硴\\\",\\\"碆\\\",\\\"硼\\\",\\\"碚\\\",\\\"碌\\\",\\\"碣\\\",\\\"碵\\\",\\\"碪\\\",\\\"碯\\\",\\\"磑\\\",\\\"磆\\\",\\\"磋\\\",\\\"磔\\\",\\\"碾\\\",\\\"碼\\\",\\\"磅\\\",\\\"磊\\\",\\\"磬\\\",\\\"磧\\\",\\\"磚\\\",\\\"磽\\\",\\\"磴\\\",\\\"礇\\\",\\\"礒\\\",\\\"礑\\\",\\\"礙\\\",\\\"礬\\\",\\\"礫\\\",\\\"祀\\\",\\\"祠\\\",\\\"祗\\\",\\\"祟\\\",\\\"祚\\\",\\\"祕\\\",\\\"祓\\\",\\\"祺\\\",\\\"祿\\\",\\\"禊\\\",\\\"禝\\\",\\\"禧\\\",\\\"齋\\\",\\\"禪\\\",\\\"禮\\\",\\\"禳\\\",\\\"禹\\\",\\\"禺\\\",\\\"秉\\\",\\\"秕\\\",\\\"秧\\\",\\\"秬\\\",\\\"秡\\\",\\\"秣\\\",\\\"稈\\\",\\\"稍\\\",\\\"稘\\\",\\\"稙\\\",\\\"稠\\\",\\\"稟\\\",\\\"禀\\\",\\\"稱\\\",\\\"稻\\\",\\\"稾\\\",\\\"稷\\\",\\\"穃\\\",\\\"穗\\\",\\\"穉\\\",\\\"穡\\\",\\\"穢\\\",\\\"穩\\\",\\\"龝\\\",\\\"穰\\\",\\\"穹\\\",\\\"穽\\\",\\\"窈\\\",\\\"窗\\\",\\\"窕\\\",\\\"窘\\\",\\\"窖\\\",\\\"窩\\\",\\\"竈\\\",\\\"窰\\\",\\\"窶\\\",\\\"竅\\\",\\\"竄\\\",\\\"窿\\\",\\\"邃\\\",\\\"竇\\\",\\\"竊\\\",\\\"竍\\\",\\\"竏\\\",\\\"竕\\\",\\\"竓\\\",\\\"站\\\",\\\"竚\\\",\\\"竝\\\",\\\"竡\\\",\\\"竢\\\",\\\"竦\\\",\\\"竭\\\",\\\"竰\\\",\\\"笂\\\",\\\"笏\\\",\\\"笊\\\",\\\"笆\\\",\\\"笳\\\",\\\"笘\\\",\\\"笙\\\",\\\"笞\\\",\\\"笵\\\",\\\"笨\\\",\\\"笶\\\",\\\"筐\\\",\\\"筺\\\",\\\"笄\\\",\\\"筍\\\",\\\"笋\\\",\\\"筌\\\",\\\"筅\\\",\\\"筵\\\",\\\"筥\\\",\\\"筴\\\",\\\"筧\\\",\\\"筰\\\",\\\"筱\\\",\\\"筬\\\",\\\"筮\\\",\\\"箝\\\",\\\"箘\\\",\\\"箟\\\",\\\"箍\\\",\\\"箜\\\",\\\"箚\\\",\\\"箋\\\",\\\"箒\\\",\\\"箏\\\",\\\"筝\\\",\\\"箙\\\",\\\"篋\\\",\\\"篁\\\",\\\"篌\\\",\\\"篏\\\",\\\"箴\\\",\\\"篆\\\",\\\"篝\\\",\\\"篩\\\",\\\"簑\\\",\\\"簔\\\",\\\"篦\\\",\\\"篥\\\",\\\"籠\\\",\\\"簀\\\",\\\"簇\\\",\\\"簓\\\",\\\"篳\\\",\\\"篷\\\",\\\"簗\\\",\\\"簍\\\",\\\"篶\\\",\\\"簣\\\",\\\"簧\\\",\\\"簪\\\",\\\"簟\\\",\\\"簷\\\",\\\"簫\\\",\\\"簽\\\",\\\"籌\\\",\\\"籃\\\",\\\"籔\\\",\\\"籏\\\",\\\"籀\\\",\\\"籐\\\",\\\"籘\\\",\\\"籟\\\",\\\"籤\\\",\\\"籖\\\",\\\"籥\\\",\\\"籬\\\",\\\"籵\\\",\\\"粃\\\",\\\"粐\\\",\\\"粤\\\",\\\"粭\\\",\\\"粢\\\",\\\"粫\\\",\\\"粡\\\",\\\"粨\\\",\\\"粳\\\",\\\"粲\\\",\\\"粱\\\",\\\"粮\\\",\\\"粹\\\",\\\"粽\\\",\\\"糀\\\",\\\"糅\\\",\\\"糂\\\",\\\"糘\\\",\\\"糒\\\",\\\"糜\\\",\\\"糢\\\",\\\"鬻\\\",\\\"糯\\\",\\\"糲\\\",\\\"糴\\\",\\\"糶\\\",\\\"糺\\\",\\\"紆\\\",\\\"紂\\\",\\\"紜\\\",\\\"紕\\\",\\\"紊\\\",\\\"絅\\\",\\\"絋\\\",\\\"紮\\\",\\\"紲\\\",\\\"紿\\\",\\\"紵\\\",\\\"絆\\\",\\\"絳\\\",\\\"絖\\\",\\\"絎\\\",\\\"絲\\\",\\\"絨\\\",\\\"絮\\\",\\\"絏\\\",\\\"絣\\\",\\\"經\\\",\\\"綉\\\",\\\"絛\\\",\\\"綏\\\",\\\"絽\\\",\\\"綛\\\",\\\"綺\\\",\\\"綮\\\",\\\"綣\\\",\\\"綵\\\",\\\"緇\\\",\\\"綽\\\",\\\"綫\\\",\\\"總\\\",\\\"綢\\\",\\\"綯\\\",\\\"緜\\\",\\\"綸\\\",\\\"綟\\\",\\\"綰\\\",\\\"緘\\\",\\\"緝\\\",\\\"緤\\\",\\\"緞\\\",\\\"緻\\\",\\\"緲\\\",\\\"緡\\\",\\\"縅\\\",\\\"縊\\\",\\\"縣\\\",\\\"縡\\\",\\\"縒\\\",\\\"縱\\\",\\\"縟\\\",\\\"縉\\\",\\\"縋\\\",\\\"縢\\\",\\\"繆\\\",\\\"繦\\\",\\\"縻\\\",\\\"縵\\\",\\\"縹\\\",\\\"繃\\\",\\\"縷\\\",\\\"縲\\\",\\\"縺\\\",\\\"繧\\\",\\\"繝\\\",\\\"繖\\\",\\\"繞\\\",\\\"繙\\\",\\\"繚\\\",\\\"繹\\\",\\\"繪\\\",\\\"繩\\\",\\\"繼\\\",\\\"繻\\\",\\\"纃\\\",\\\"緕\\\",\\\"繽\\\",\\\"辮\\\",\\\"繿\\\",\\\"纈\\\",\\\"纉\\\",\\\"續\\\",\\\"纒\\\",\\\"纐\\\",\\\"纓\\\",\\\"纔\\\",\\\"纖\\\",\\\"纎\\\",\\\"纛\\\",\\\"纜\\\",\\\"缸\\\",\\\"缺\\\",\\\"罅\\\",\\\"罌\\\",\\\"罍\\\",\\\"罎\\\",\\\"罐\\\",\\\"网\\\",\\\"罕\\\",\\\"罔\\\",\\\"罘\\\",\\\"罟\\\",\\\"罠\\\",\\\"罨\\\",\\\"罩\\\",\\\"罧\\\",\\\"罸\\\",\\\"羂\\\",\\\"羆\\\",\\\"羃\\\",\\\"羈\\\",\\\"羇\\\",\\\"羌\\\",\\\"羔\\\",\\\"羞\\\",\\\"羝\\\",\\\"羚\\\",\\\"羣\\\",\\\"羯\\\",\\\"羲\\\",\\\"羹\\\",\\\"羮\\\",\\\"羶\\\",\\\"羸\\\",\\\"譱\\\",\\\"翅\\\",\\\"翆\\\",\\\"翊\\\",\\\"翕\\\",\\\"翔\\\",\\\"翡\\\",\\\"翦\\\",\\\"翩\\\",\\\"翳\\\",\\\"翹\\\",\\\"飜\\\",\\\"耆\\\",\\\"耄\\\",\\\"耋\\\",\\\"耒\\\",\\\"耘\\\",\\\"耙\\\",\\\"耜\\\",\\\"耡\\\",\\\"耨\\\",\\\"耿\\\",\\\"耻\\\",\\\"聊\\\",\\\"聆\\\",\\\"聒\\\",\\\"聘\\\",\\\"聚\\\",\\\"聟\\\",\\\"聢\\\",\\\"聨\\\",\\\"聳\\\",\\\"聲\\\",\\\"聰\\\",\\\"聶\\\",\\\"聹\\\",\\\"聽\\\",\\\"聿\\\",\\\"肄\\\",\\\"肆\\\",\\\"肅\\\",\\\"肛\\\",\\\"肓\\\",\\\"肚\\\",\\\"肭\\\",\\\"冐\\\",\\\"肬\\\",\\\"胛\\\",\\\"胥\\\",\\\"胙\\\",\\\"胝\\\",\\\"胄\\\",\\\"胚\\\",\\\"胖\\\",\\\"脉\\\",\\\"胯\\\",\\\"胱\\\",\\\"脛\\\",\\\"脩\\\",\\\"脣\\\",\\\"脯\\\",\\\"腋\\\",\\\"隋\\\",\\\"腆\\\",\\\"脾\\\",\\\"腓\\\",\\\"腑\\\",\\\"胼\\\",\\\"腱\\\",\\\"腮\\\",\\\"腥\\\",\\\"腦\\\",\\\"腴\\\",\\\"膃\\\",\\\"膈\\\",\\\"膊\\\",\\\"膀\\\",\\\"膂\\\",\\\"膠\\\",\\\"膕\\\",\\\"膤\\\",\\\"膣\\\",\\\"腟\\\",\\\"膓\\\",\\\"膩\\\",\\\"膰\\\",\\\"膵\\\",\\\"膾\\\",\\\"膸\\\",\\\"膽\\\",\\\"臀\\\",\\\"臂\\\",\\\"膺\\\",\\\"臉\\\",\\\"臍\\\",\\\"臑\\\",\\\"臙\\\",\\\"臘\\\",\\\"臈\\\",\\\"臚\\\",\\\"臟\\\",\\\"臠\\\",\\\"臧\\\",\\\"臺\\\",\\\"臻\\\",\\\"臾\\\",\\\"舁\\\",\\\"舂\\\",\\\"舅\\\",\\\"與\\\",\\\"舊\\\",\\\"舍\\\",\\\"舐\\\",\\\"舖\\\",\\\"舩\\\",\\\"舫\\\",\\\"舸\\\",\\\"舳\\\",\\\"艀\\\",\\\"艙\\\",\\\"艘\\\",\\\"艝\\\",\\\"艚\\\",\\\"艟\\\",\\\"艤\\\",\\\"艢\\\",\\\"艨\\\",\\\"艪\\\",\\\"艫\\\",\\\"舮\\\",\\\"艱\\\",\\\"艷\\\",\\\"艸\\\",\\\"艾\\\",\\\"芍\\\",\\\"芒\\\",\\\"芫\\\",\\\"芟\\\",\\\"芻\\\",\\\"芬\\\",\\\"苡\\\",\\\"苣\\\",\\\"苟\\\",\\\"苒\\\",\\\"苴\\\",\\\"苳\\\",\\\"苺\\\",\\\"莓\\\",\\\"范\\\",\\\"苻\\\",\\\"苹\\\",\\\"苞\\\",\\\"茆\\\",\\\"苜\\\",\\\"茉\\\",\\\"苙\\\",\\\"茵\\\",\\\"茴\\\",\\\"茖\\\",\\\"茲\\\",\\\"茱\\\",\\\"荀\\\",\\\"茹\\\",\\\"荐\\\",\\\"荅\\\",\\\"茯\\\",\\\"茫\\\",\\\"茗\\\",\\\"茘\\\",\\\"莅\\\",\\\"莚\\\",\\\"莪\\\",\\\"莟\\\",\\\"莢\\\",\\\"莖\\\",\\\"茣\\\",\\\"莎\\\",\\\"莇\\\",\\\"莊\\\",\\\"荼\\\",\\\"莵\\\",\\\"荳\\\",\\\"荵\\\",\\\"莠\\\",\\\"莉\\\",\\\"莨\\\",\\\"菴\\\",\\\"萓\\\",\\\"菫\\\",\\\"菎\\\",\\\"菽\\\",\\\"萃\\\",\\\"菘\\\",\\\"萋\\\",\\\"菁\\\",\\\"菷\\\",\\\"萇\\\",\\\"菠\\\",\\\"菲\\\",\\\"萍\\\",\\\"萢\\\",\\\"萠\\\",\\\"莽\\\",\\\"萸\\\",\\\"蔆\\\",\\\"菻\\\",\\\"葭\\\",\\\"萪\\\",\\\"萼\\\",\\\"蕚\\\",\\\"蒄\\\",\\\"葷\\\",\\\"葫\\\",\\\"蒭\\\",\\\"葮\\\",\\\"蒂\\\",\\\"葩\\\",\\\"葆\\\",\\\"萬\\\",\\\"葯\\\",\\\"葹\\\",\\\"萵\\\",\\\"蓊\\\",\\\"葢\\\",\\\"蒹\\\",\\\"蒿\\\",\\\"蒟\\\",\\\"蓙\\\",\\\"蓍\\\",\\\"蒻\\\",\\\"蓚\\\",\\\"蓐\\\",\\\"蓁\\\",\\\"蓆\\\",\\\"蓖\\\",\\\"蒡\\\",\\\"蔡\\\",\\\"蓿\\\",\\\"蓴\\\",\\\"蔗\\\",\\\"蔘\\\",\\\"蔬\\\",\\\"蔟\\\",\\\"蔕\\\",\\\"蔔\\\",\\\"蓼\\\",\\\"蕀\\\",\\\"蕣\\\",\\\"蕘\\\",\\\"蕈\\\",\\\"蕁\\\",\\\"蘂\\\",\\\"蕋\\\",\\\"蕕\\\",\\\"薀\\\",\\\"薤\\\",\\\"薈\\\",\\\"薑\\\",\\\"薊\\\",\\\"薨\\\",\\\"蕭\\\",\\\"薔\\\",\\\"薛\\\",\\\"藪\\\",\\\"薇\\\",\\\"薜\\\",\\\"蕷\\\",\\\"蕾\\\",\\\"薐\\\",\\\"藉\\\",\\\"薺\\\",\\\"藏\\\",\\\"薹\\\",\\\"藐\\\",\\\"藕\\\",\\\"藝\\\",\\\"藥\\\",\\\"藜\\\",\\\"藹\\\",\\\"蘊\\\",\\\"蘓\\\",\\\"蘋\\\",\\\"藾\\\",\\\"藺\\\",\\\"蘆\\\",\\\"蘢\\\",\\\"蘚\\\",\\\"蘰\\\",\\\"蘿\\\",\\\"虍\\\",\\\"乕\\\",\\\"虔\\\",\\\"號\\\",\\\"虧\\\",\\\"虱\\\",\\\"蚓\\\",\\\"蚣\\\",\\\"蚩\\\",\\\"蚪\\\",\\\"蚋\\\",\\\"蚌\\\",\\\"蚶\\\",\\\"蚯\\\",\\\"蛄\\\",\\\"蛆\\\",\\\"蚰\\\",\\\"蛉\\\",\\\"蠣\\\",\\\"蚫\\\",\\\"蛔\\\",\\\"蛞\\\",\\\"蛩\\\",\\\"蛬\\\",\\\"蛟\\\",\\\"蛛\\\",\\\"蛯\\\",\\\"蜒\\\",\\\"蜆\\\",\\\"蜈\\\",\\\"蜀\\\",\\\"蜃\\\",\\\"蛻\\\",\\\"蜑\\\",\\\"蜉\\\",\\\"蜍\\\",\\\"蛹\\\",\\\"蜊\\\",\\\"蜴\\\",\\\"蜿\\\",\\\"蜷\\\",\\\"蜻\\\",\\\"蜥\\\",\\\"蜩\\\",\\\"蜚\\\",\\\"蝠\\\",\\\"蝟\\\",\\\"蝸\\\",\\\"蝌\\\",\\\"蝎\\\",\\\"蝴\\\",\\\"蝗\\\",\\\"蝨\\\",\\\"蝮\\\",\\\"蝙\\\",\\\"蝓\\\",\\\"蝣\\\",\\\"蝪\\\",\\\"蠅\\\",\\\"螢\\\",\\\"螟\\\",\\\"螂\\\",\\\"螯\\\",\\\"蟋\\\",\\\"螽\\\",\\\"蟀\\\",\\\"蟐\\\",\\\"雖\\\",\\\"螫\\\",\\\"蟄\\\",\\\"螳\\\",\\\"蟇\\\",\\\"蟆\\\",\\\"螻\\\",\\\"蟯\\\",\\\"蟲\\\",\\\"蟠\\\",\\\"蠏\\\",\\\"蠍\\\",\\\"蟾\\\",\\\"蟶\\\",\\\"蟷\\\",\\\"蠎\\\",\\\"蟒\\\",\\\"蠑\\\",\\\"蠖\\\",\\\"蠕\\\",\\\"蠢\\\",\\\"蠡\\\",\\\"蠱\\\",\\\"蠶\\\",\\\"蠹\\\",\\\"蠧\\\",\\\"蠻\\\",\\\"衄\\\",\\\"衂\\\",\\\"衒\\\",\\\"衙\\\",\\\"衞\\\",\\\"衢\\\",\\\"衫\\\",\\\"袁\\\",\\\"衾\\\",\\\"袞\\\",\\\"衵\\\",\\\"衽\\\",\\\"袵\\\",\\\"衲\\\",\\\"袂\\\",\\\"袗\\\",\\\"袒\\\",\\\"袮\\\",\\\"袙\\\",\\\"袢\\\",\\\"袍\\\",\\\"袤\\\",\\\"袰\\\",\\\"袿\\\",\\\"袱\\\",\\\"裃\\\",\\\"裄\\\",\\\"裔\\\",\\\"裘\\\",\\\"裙\\\",\\\"裝\\\",\\\"裹\\\",\\\"褂\\\",\\\"裼\\\",\\\"裴\\\",\\\"裨\\\",\\\"裲\\\",\\\"褄\\\",\\\"褌\\\",\\\"褊\\\",\\\"褓\\\",\\\"襃\\\",\\\"褞\\\",\\\"褥\\\",\\\"褪\\\",\\\"褫\\\",\\\"襁\\\",\\\"襄\\\",\\\"褻\\\",\\\"褶\\\",\\\"褸\\\",\\\"襌\\\",\\\"褝\\\",\\\"襠\\\",\\\"襞\\\",\\\"襦\\\",\\\"襤\\\",\\\"襭\\\",\\\"襪\\\",\\\"襯\\\",\\\"襴\\\",\\\"襷\\\",\\\"襾\\\",\\\"覃\\\",\\\"覈\\\",\\\"覊\\\",\\\"覓\\\",\\\"覘\\\",\\\"覡\\\",\\\"覩\\\",\\\"覦\\\",\\\"覬\\\",\\\"覯\\\",\\\"覲\\\",\\\"覺\\\",\\\"覽\\\",\\\"覿\\\",\\\"觀\\\",\\\"觚\\\",\\\"觜\\\",\\\"觝\\\",\\\"觧\\\",\\\"觴\\\",\\\"觸\\\",\\\"訃\\\",\\\"訖\\\",\\\"訐\\\",\\\"訌\\\",\\\"訛\\\",\\\"訝\\\",\\\"訥\\\",\\\"訶\\\",\\\"詁\\\",\\\"詛\\\",\\\"詒\\\",\\\"詆\\\",\\\"詈\\\",\\\"詼\\\",\\\"詭\\\",\\\"詬\\\",\\\"詢\\\",\\\"誅\\\",\\\"誂\\\",\\\"誄\\\",\\\"誨\\\",\\\"誡\\\",\\\"誑\\\",\\\"誥\\\",\\\"誦\\\",\\\"誚\\\",\\\"誣\\\",\\\"諄\\\",\\\"諍\\\",\\\"諂\\\",\\\"諚\\\",\\\"諫\\\",\\\"諳\\\",\\\"諧\\\",\\\"諤\\\",\\\"諱\\\",\\\"謔\\\",\\\"諠\\\",\\\"諢\\\",\\\"諷\\\",\\\"諞\\\",\\\"諛\\\",\\\"謌\\\",\\\"謇\\\",\\\"謚\\\",\\\"諡\\\",\\\"謖\\\",\\\"謐\\\",\\\"謗\\\",\\\"謠\\\",\\\"謳\\\",\\\"鞫\\\",\\\"謦\\\",\\\"謫\\\",\\\"謾\\\",\\\"謨\\\",\\\"譁\\\",\\\"譌\\\",\\\"譏\\\",\\\"譎\\\",\\\"證\\\",\\\"譖\\\",\\\"譛\\\",\\\"譚\\\",\\\"譫\\\",\\\"譟\\\",\\\"譬\\\",\\\"譯\\\",\\\"譴\\\",\\\"譽\\\",\\\"讀\\\",\\\"讌\\\",\\\"讎\\\",\\\"讒\\\",\\\"讓\\\",\\\"讖\\\",\\\"讙\\\",\\\"讚\\\",\\\"谺\\\",\\\"豁\\\",\\\"谿\\\",\\\"豈\\\",\\\"豌\\\",\\\"豎\\\",\\\"豐\\\",\\\"豕\\\",\\\"豢\\\",\\\"豬\\\",\\\"豸\\\",\\\"豺\\\",\\\"貂\\\",\\\"貉\\\",\\\"貅\\\",\\\"貊\\\",\\\"貍\\\",\\\"貎\\\",\\\"貔\\\",\\\"豼\\\",\\\"貘\\\",\\\"戝\\\",\\\"貭\\\",\\\"貪\\\",\\\"貽\\\",\\\"貲\\\",\\\"貳\\\",\\\"貮\\\",\\\"貶\\\",\\\"賈\\\",\\\"賁\\\",\\\"賤\\\",\\\"賣\\\",\\\"賚\\\",\\\"賽\\\",\\\"賺\\\",\\\"賻\\\",\\\"贄\\\",\\\"贅\\\",\\\"贊\\\",\\\"贇\\\",\\\"贏\\\",\\\"贍\\\",\\\"贐\\\",\\\"齎\\\",\\\"贓\\\",\\\"賍\\\",\\\"贔\\\",\\\"贖\\\",\\\"赧\\\",\\\"赭\\\",\\\"赱\\\",\\\"赳\\\",\\\"趁\\\",\\\"趙\\\",\\\"跂\\\",\\\"趾\\\",\\\"趺\\\",\\\"跏\\\",\\\"跚\\\",\\\"跖\\\",\\\"跌\\\",\\\"跛\\\",\\\"跋\\\",\\\"跪\\\",\\\"跫\\\",\\\"跟\\\",\\\"跣\\\",\\\"跼\\\",\\\"踈\\\",\\\"踉\\\",\\\"跿\\\",\\\"踝\\\",\\\"踞\\\",\\\"踐\\\",\\\"踟\\\",\\\"蹂\\\",\\\"踵\\\",\\\"踰\\\",\\\"踴\\\",\\\"蹊\\\",\\\"蹇\\\",\\\"蹉\\\",\\\"蹌\\\",\\\"蹐\\\",\\\"蹈\\\",\\\"蹙\\\",\\\"蹤\\\",\\\"蹠\\\",\\\"踪\\\",\\\"蹣\\\",\\\"蹕\\\",\\\"蹶\\\",\\\"蹲\\\",\\\"蹼\\\",\\\"躁\\\",\\\"躇\\\",\\\"躅\\\",\\\"躄\\\",\\\"躋\\\",\\\"躊\\\",\\\"躓\\\",\\\"躑\\\",\\\"躔\\\",\\\"躙\\\",\\\"躪\\\",\\\"躡\\\",\\\"躬\\\",\\\"躰\\\",\\\"軆\\\",\\\"躱\\\",\\\"躾\\\",\\\"軅\\\",\\\"軈\\\",\\\"軋\\\",\\\"軛\\\",\\\"軣\\\",\\\"軼\\\",\\\"軻\\\",\\\"軫\\\",\\\"軾\\\",\\\"輊\\\",\\\"輅\\\",\\\"輕\\\",\\\"輒\\\",\\\"輙\\\",\\\"輓\\\",\\\"輜\\\",\\\"輟\\\",\\\"輛\\\",\\\"輌\\\",\\\"輦\\\",\\\"輳\\\",\\\"輻\\\",\\\"輹\\\",\\\"轅\\\",\\\"轂\\\",\\\"輾\\\",\\\"轌\\\",\\\"轉\\\",\\\"轆\\\",\\\"轎\\\",\\\"轗\\\",\\\"轜\\\",\\\"轢\\\",\\\"轣\\\",\\\"轤\\\",\\\"辜\\\",\\\"辟\\\",\\\"辣\\\",\\\"辭\\\",\\\"辯\\\",\\\"辷\\\",\\\"迚\\\",\\\"迥\\\",\\\"迢\\\",\\\"迪\\\",\\\"迯\\\",\\\"邇\\\",\\\"迴\\\",\\\"逅\\\",\\\"迹\\\",\\\"迺\\\",\\\"逑\\\",\\\"逕\\\",\\\"逡\\\",\\\"逍\\\",\\\"逞\\\",\\\"逖\\\",\\\"逋\\\",\\\"逧\\\",\\\"逶\\\",\\\"逵\\\",\\\"逹\\\",\\\"迸\\\",\\\"遏\\\",\\\"遐\\\",\\\"遑\\\",\\\"遒\\\",\\\"逎\\\",\\\"遉\\\",\\\"逾\\\",\\\"遖\\\",\\\"遘\\\",\\\"遞\\\",\\\"遨\\\",\\\"遯\\\",\\\"遶\\\",\\\"隨\\\",\\\"遲\\\",\\\"邂\\\",\\\"遽\\\",\\\"邁\\\",\\\"邀\\\",\\\"邊\\\",\\\"邉\\\",\\\"邏\\\",\\\"邨\\\",\\\"邯\\\",\\\"邱\\\",\\\"邵\\\",\\\"郢\\\",\\\"郤\\\",\\\"扈\\\",\\\"郛\\\",\\\"鄂\\\",\\\"鄒\\\",\\\"鄙\\\",\\\"鄲\\\",\\\"鄰\\\",\\\"酊\\\",\\\"酖\\\",\\\"酘\\\",\\\"酣\\\",\\\"酥\\\",\\\"酩\\\",\\\"酳\\\",\\\"酲\\\",\\\"醋\\\",\\\"醉\\\",\\\"醂\\\",\\\"醢\\\",\\\"醫\\\",\\\"醯\\\",\\\"醪\\\",\\\"醵\\\",\\\"醴\\\",\\\"醺\\\",\\\"釀\\\",\\\"釁\\\",\\\"釉\\\",\\\"釋\\\",\\\"釐\\\",\\\"釖\\\",\\\"釟\\\",\\\"釡\\\",\\\"釛\\\",\\\"釼\\\",\\\"釵\\\",\\\"釶\\\",\\\"鈞\\\",\\\"釿\\\",\\\"鈔\\\",\\\"鈬\\\",\\\"鈕\\\",\\\"鈑\\\",\\\"鉞\\\",\\\"鉗\\\",\\\"鉅\\\",\\\"鉉\\\",\\\"鉤\\\",\\\"鉈\\\",\\\"銕\\\",\\\"鈿\\\",\\\"鉋\\\",\\\"鉐\\\",\\\"銜\\\",\\\"銖\\\",\\\"銓\\\",\\\"銛\\\",\\\"鉚\\\",\\\"鋏\\\",\\\"銹\\\",\\\"銷\\\",\\\"鋩\\\",\\\"錏\\\",\\\"鋺\\\",\\\"鍄\\\",\\\"錮\\\",\\\"錙\\\",\\\"錢\\\",\\\"錚\\\",\\\"錣\\\",\\\"錺\\\",\\\"錵\\\",\\\"錻\\\",\\\"鍜\\\",\\\"鍠\\\",\\\"鍼\\\",\\\"鍮\\\",\\\"鍖\\\",\\\"鎰\\\",\\\"鎬\\\",\\\"鎭\\\",\\\"鎔\\\",\\\"鎹\\\",\\\"鏖\\\",\\\"鏗\\\",\\\"鏨\\\",\\\"鏥\\\",\\\"鏘\\\",\\\"鏃\\\",\\\"鏝\\\",\\\"鏐\\\",\\\"鏈\\\",\\\"鏤\\\",\\\"鐚\\\",\\\"鐔\\\",\\\"鐓\\\",\\\"鐃\\\",\\\"鐇\\\",\\\"鐐\\\",\\\"鐶\\\",\\\"鐫\\\",\\\"鐵\\\",\\\"鐡\\\",\\\"鐺\\\",\\\"鑁\\\",\\\"鑒\\\",\\\"鑄\\\",\\\"鑛\\\",\\\"鑠\\\",\\\"鑢\\\",\\\"鑞\\\",\\\"鑪\\\",\\\"鈩\\\",\\\"鑰\\\",\\\"鑵\\\",\\\"鑷\\\",\\\"鑽\\\",\\\"鑚\\\",\\\"鑼\\\",\\\"鑾\\\",\\\"钁\\\",\\\"鑿\\\",\\\"閂\\\",\\\"閇\\\",\\\"閊\\\",\\\"閔\\\",\\\"閖\\\",\\\"閘\\\",\\\"閙\\\",\\\"閠\\\",\\\"閨\\\",\\\"閧\\\",\\\"閭\\\",\\\"閼\\\",\\\"閻\\\",\\\"閹\\\",\\\"閾\\\",\\\"闊\\\",\\\"濶\\\",\\\"闃\\\",\\\"闍\\\",\\\"闌\\\",\\\"闕\\\",\\\"闔\\\",\\\"闖\\\",\\\"關\\\",\\\"闡\\\",\\\"闥\\\",\\\"闢\\\",\\\"阡\\\",\\\"阨\\\",\\\"阮\\\",\\\"阯\\\",\\\"陂\\\",\\\"陌\\\",\\\"陏\\\",\\\"陋\\\",\\\"陷\\\",\\\"陜\\\",\\\"陞\\\",\\\"陝\\\",\\\"陟\\\",\\\"陦\\\",\\\"陲\\\",\\\"陬\\\",\\\"隍\\\",\\\"隘\\\",\\\"隕\\\",\\\"隗\\\",\\\"險\\\",\\\"隧\\\",\\\"隱\\\",\\\"隲\\\",\\\"隰\\\",\\\"隴\\\",\\\"隶\\\",\\\"隸\\\",\\\"隹\\\",\\\"雎\\\",\\\"雋\\\",\\\"雉\\\",\\\"雍\\\",\\\"襍\\\",\\\"雜\\\",\\\"霍\\\",\\\"雕\\\",\\\"雹\\\",\\\"霄\\\",\\\"霆\\\",\\\"霈\\\",\\\"霓\\\",\\\"霎\\\",\\\"霑\\\",\\\"霏\\\",\\\"霖\\\",\\\"霙\\\",\\\"霤\\\",\\\"霪\\\",\\\"霰\\\",\\\"霹\\\",\\\"霽\\\",\\\"霾\\\",\\\"靄\\\",\\\"靆\\\",\\\"靈\\\",\\\"靂\\\",\\\"靉\\\",\\\"靜\\\",\\\"靠\\\",\\\"靤\\\",\\\"靦\\\",\\\"靨\\\",\\\"勒\\\",\\\"靫\\\",\\\"靱\\\",\\\"靹\\\",\\\"鞅\\\",\\\"靼\\\",\\\"鞁\\\",\\\"靺\\\",\\\"鞆\\\",\\\"鞋\\\",\\\"鞏\\\",\\\"鞐\\\",\\\"鞜\\\",\\\"鞨\\\",\\\"鞦\\\",\\\"鞣\\\",\\\"鞳\\\",\\\"鞴\\\",\\\"韃\\\",\\\"韆\\\",\\\"韈\\\",\\\"韋\\\",\\\"韜\\\",\\\"韭\\\",\\\"齏\\\",\\\"韲\\\",\\\"竟\\\",\\\"韶\\\",\\\"韵\\\",\\\"頏\\\",\\\"頌\\\",\\\"頸\\\",\\\"頤\\\",\\\"頡\\\",\\\"頷\\\",\\\"頽\\\",\\\"顆\\\",\\\"顏\\\",\\\"顋\\\",\\\"顫\\\",\\\"顯\\\",\\\"顰\\\",\\\"顱\\\",\\\"顴\\\",\\\"顳\\\",\\\"颪\\\",\\\"颯\\\",\\\"颱\\\",\\\"颶\\\",\\\"飄\\\",\\\"飃\\\",\\\"飆\\\",\\\"飩\\\",\\\"飫\\\",\\\"餃\\\",\\\"餉\\\",\\\"餒\\\",\\\"餔\\\",\\\"餘\\\",\\\"餡\\\",\\\"餝\\\",\\\"餞\\\",\\\"餤\\\",\\\"餠\\\",\\\"餬\\\",\\\"餮\\\",\\\"餽\\\",\\\"餾\\\",\\\"饂\\\",\\\"饉\\\",\\\"饅\\\",\\\"饐\\\",\\\"饋\\\",\\\"饑\\\",\\\"饒\\\",\\\"饌\\\",\\\"饕\\\",\\\"馗\\\",\\\"馘\\\",\\\"馥\\\",\\\"馭\\\",\\\"馮\\\",\\\"馼\\\",\\\"駟\\\",\\\"駛\\\",\\\"駝\\\",\\\"駘\\\",\\\"駑\\\",\\\"駭\\\",\\\"駮\\\",\\\"駱\\\",\\\"駲\\\",\\\"駻\\\",\\\"駸\\\",\\\"騁\\\",\\\"騏\\\",\\\"騅\\\",\\\"駢\\\",\\\"騙\\\",\\\"騫\\\",\\\"騷\\\",\\\"驅\\\",\\\"驂\\\",\\\"驀\\\",\\\"驃\\\",\\\"騾\\\",\\\"驕\\\",\\\"驍\\\",\\\"驛\\\",\\\"驗\\\",\\\"驟\\\",\\\"驢\\\",\\\"驥\\\",\\\"驤\\\",\\\"驩\\\",\\\"驫\\\",\\\"驪\\\",\\\"骭\\\",\\\"骰\\\",\\\"骼\\\",\\\"髀\\\",\\\"髏\\\",\\\"髑\\\",\\\"髓\\\",\\\"體\\\",\\\"髞\\\",\\\"髟\\\",\\\"髢\\\",\\\"髣\\\",\\\"髦\\\",\\\"髯\\\",\\\"髫\\\",\\\"髮\\\",\\\"髴\\\",\\\"髱\\\",\\\"髷\\\",\\\"髻\\\",\\\"鬆\\\",\\\"鬘\\\",\\\"鬚\\\",\\\"鬟\\\",\\\"鬢\\\",\\\"鬣\\\",\\\"鬥\\\",\\\"鬧\\\",\\\"鬨\\\",\\\"鬩\\\",\\\"鬪\\\",\\\"鬮\\\",\\\"鬯\\\",\\\"鬲\\\",\\\"魄\\\",\\\"魃\\\",\\\"魏\\\",\\\"魍\\\",\\\"魎\\\",\\\"魑\\\",\\\"魘\\\",\\\"魴\\\",\\\"鮓\\\",\\\"鮃\\\",\\\"鮑\\\",\\\"鮖\\\",\\\"鮗\\\",\\\"鮟\\\",\\\"鮠\\\",\\\"鮨\\\",\\\"鮴\\\",\\\"鯀\\\",\\\"鯊\\\",\\\"鮹\\\",\\\"鯆\\\",\\\"鯏\\\",\\\"鯑\\\",\\\"鯒\\\",\\\"鯣\\\",\\\"鯢\\\",\\\"鯤\\\",\\\"鯔\\\",\\\"鯡\\\",\\\"鰺\\\",\\\"鯲\\\",\\\"鯱\\\",\\\"鯰\\\",\\\"鰕\\\",\\\"鰔\\\",\\\"鰉\\\",\\\"鰓\\\",\\\"鰌\\\",\\\"鰆\\\",\\\"鰈\\\",\\\"鰒\\\",\\\"鰊\\\",\\\"鰄\\\",\\\"鰮\\\",\\\"鰛\\\",\\\"鰥\\\",\\\"鰤\\\",\\\"鰡\\\",\\\"鰰\\\",\\\"鱇\\\",\\\"鰲\\\",\\\"鱆\\\",\\\"鰾\\\",\\\"鱚\\\",\\\"鱠\\\",\\\"鱧\\\",\\\"鱶\\\",\\\"鱸\\\",\\\"鳧\\\",\\\"鳬\\\",\\\"鳰\\\",\\\"鴉\\\",\\\"鴈\\\",\\\"鳫\\\",\\\"鴃\\\",\\\"鴆\\\",\\\"鴪\\\",\\\"鴦\\\",\\\"鶯\\\",\\\"鴣\\\",\\\"鴟\\\",\\\"鵄\\\",\\\"鴕\\\",\\\"鴒\\\",\\\"鵁\\\",\\\"鴿\\\",\\\"鴾\\\",\\\"鵆\\\",\\\"鵈\\\",\\\"鵝\\\",\\\"鵞\\\",\\\"鵤\\\",\\\"鵑\\\",\\\"鵐\\\",\\\"鵙\\\",\\\"鵲\\\",\\\"鶉\\\",\\\"鶇\\\",\\\"鶫\\\",\\\"鵯\\\",\\\"鵺\\\",\\\"鶚\\\",\\\"鶤\\\",\\\"鶩\\\",\\\"鶲\\\",\\\"鷄\\\",\\\"鷁\\\",\\\"鶻\\\",\\\"鶸\\\",\\\"鶺\\\",\\\"鷆\\\",\\\"鷏\\\",\\\"鷂\\\",\\\"鷙\\\",\\\"鷓\\\",\\\"鷸\\\",\\\"鷦\\\",\\\"鷭\\\",\\\"鷯\\\",\\\"鷽\\\",\\\"鸚\\\",\\\"鸛\\\",\\\"鸞\\\",\\\"鹵\\\",\\\"鹹\\\",\\\"鹽\\\",\\\"麁\\\",\\\"麈\\\",\\\"麋\\\",\\\"麌\\\",\\\"麒\\\",\\\"麕\\\",\\\"麑\\\",\\\"麝\\\",\\\"麥\\\",\\\"麩\\\",\\\"麸\\\",\\\"麪\\\",\\\"麭\\\",\\\"靡\\\",\\\"黌\\\",\\\"黎\\\",\\\"黏\\\",\\\"黐\\\",\\\"黔\\\",\\\"黜\\\",\\\"點\\\",\\\"黝\\\",\\\"黠\\\",\\\"黥\\\",\\\"黨\\\",\\\"黯\\\",\\\"黴\\\",\\\"黶\\\",\\\"黷\\\",\\\"黹\\\",\\\"黻\\\",\\\"黼\\\",\\\"黽\\\",\\\"鼇\\\",\\\"鼈\\\",\\\"皷\\\",\\\"鼕\\\",\\\"鼡\\\",\\\"鼬\\\",\\\"鼾\\\",\\\"齊\\\",\\\"齒\\\",\\\"齔\\\",\\\"齣\\\",\\\"齟\\\",\\\"齠\\\",\\\"齡\\\",\\\"齦\\\",\\\"齧\\\",\\\"齬\\\",\\\"齪\\\",\\\"齷\\\",\\\"齲\\\",\\\"齶\\\",\\\"龕\\\",\\\"龜\\\",\\\"龠\\\",\\\"堯\\\",\\\"槇\\\",\\\"遙\\\",\\\"瑤\\\",\\\"凜\\\",\\\"熙\\\",\\\"噓\\\",\\\"巢\\\",\\\"帔\\\",\\\"帘\\\",\\\"幘\\\",\\\"幞\\\",\\\"庾\\\",\\\"廊\\\",\\\"廋\\\",\\\"廹\\\",\\\"开\\\",\\\"异\\\",\\\"弇\\\",\\\"弝\\\",\\\"弣\\\",\\\"弴\\\",\\\"弶\\\",\\\"弽\\\",\\\"彀\\\",\\\"彅\\\",\\\"彔\\\",\\\"彘\\\",\\\"彤\\\",\\\"彧\\\",\\\"彽\\\",\\\"徉\\\",\\\"徜\\\",\\\"徧\\\",\\\"徯\\\",\\\"徵\\\",\\\"德\\\",\\\"忉\\\",\\\"忞\\\",\\\"忡\\\",\\\"忩\\\",\\\"怍\\\",\\\"怔\\\",\\\"怘\\\",\\\"怳\\\",\\\"怵\\\",\\\"恇\\\",\\\"悔\\\",\\\"悝\\\",\\\"悞\\\",\\\"惋\\\",\\\"惔\\\",\\\"惕\\\",\\\"惝\\\",\\\"惸\\\",\\\"愜\\\",\\\"愫\\\",\\\"愰\\\",\\\"愷\\\",\\\"慨\\\",\\\"憍\\\",\\\"憎\\\",\\\"憼\\\",\\\"憹\\\",\\\"懲\\\",\\\"戢\\\",\\\"戾\\\",\\\"扃\\\",\\\"扖\\\",\\\"扚\\\",\\\"扯\\\",\\\"抅\\\",\\\"拄\\\",\\\"拖\\\",\\\"拼\\\",\\\"挊\\\",\\\"挘\\\",\\\"挹\\\",\\\"捃\\\",\\\"捥\\\",\\\"捼\\\",\\\"揥\\\",\\\"揭\\\",\\\"揵\\\",\\\"搐\\\",\\\"搔\\\",\\\"搢\\\",\\\"摹\\\",\\\"摑\\\",\\\"摠\\\",\\\"摭\\\",\\\"擎\\\",\\\"撾\\\",\\\"撿\\\",\\\"㐂\\\",\\\"𠅘\\\",\\\"份\\\",\\\"仿\\\",\\\"侚\\\",\\\"俉\\\",\\\"傜\\\",\\\"儞\\\",\\\"冼\\\",\\\"㔟\\\",\\\"匇\\\",\\\"卡\\\",\\\"卬\\\",\\\"詹\\\",\\\"𠮷\\\",\\\"呍\\\",\\\"咖\\\",\\\"咜\\\",\\\"咩\\\",\\\"唎\\\",\\\"啊\\\",\\\"噲\\\",\\\"囤\\\",\\\"圳\\\",\\\"圴\\\",\\\"塚\\\",\\\"墀\\\",\\\"姤\\\",\\\"娣\\\",\\\"婕\\\",\\\"寬\\\",\\\"﨑\\\",\\\"㟢\\\",\\\"庬\\\",\\\"弴\\\",\\\"彅\\\",\\\"德\\\",\\\"怗\\\",\\\"恵\\\",\\\"愰\\\",\\\"昤\\\",\\\"曈\\\",\\\"曙\\\",\\\"曺\\\",\\\"曻\\\",\\\"桒\\\",\\\"鿄\\\",\\\"椑\\\",\\\"椻\\\",\\\"橅\\\",\\\"檑\\\",\\\"櫛\\\",\\\"𣏌\\\",\\\"𣏾\\\",\\\"𣗄\\\",\\\"毱\\\",\\\"泠\\\",\\\"洮\\\",\\\"海\\\",\\\"涿\\\",\\\"淊\\\",\\\"淸\\\",\\\"渚\\\",\\\"潞\\\",\\\"濹\\\",\\\"灤\\\",\\\"𤋮\\\",\\\"𤋮\\\",\\\"煇\\\",\\\"燁\\\",\\\"爀\\\",\\\"玟\\\",\\\"玨\\\",\\\"珉\\\",\\\"珖\\\",\\\"琛\\\",\\\"琡\\\",\\\"琢\\\",\\\"琦\\\",\\\"琪\\\",\\\"琬\\\",\\\"琹\\\",\\\"瑋\\\",\\\"㻚\\\",\\\"畵\\\",\\\"疁\\\",\\\"睲\\\",\\\"䂓\\\",\\\"磈\\\",\\\"磠\\\",\\\"祇\\\",\\\"禮\\\",\\\"鿆\\\",\\\"䄃\\\",\\\"鿅\\\",\\\"秚\\\",\\\"稞\\\",\\\"筿\\\",\\\"簱\\\",\\\"䉤\\\",\\\"綋\\\",\\\"羡\\\",\\\"脘\\\",\\\"脺\\\",\\\"舘\\\",\\\"芮\\\",\\\"葛\\\",\\\"蓜\\\",\\\"蓬\\\",\\\"蕙\\\",\\\"藎\\\",\\\"蝕\\\",\\\"蟬\\\",\\\"蠋\\\",\\\"裵\\\",\\\"角\\\",\\\"諶\\\",\\\"跎\\\",\\\"辻\\\",\\\"迶\\\",\\\"郝\\\",\\\"鄧\\\",\\\"鄭\\\",\\\"醲\\\",\\\"鈳\\\",\\\"銈\\\",\\\"錡\\\",\\\"鍈\\\",\\\"閒\\\",\\\"雞\\\",\\\"餃\\\",\\\"饀\\\",\\\"髙\\\",\\\"鯖\\\",\\\"鷗\\\",\\\"麴\\\",\\\"麵\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛌\\\",\\\"⛍\\\",\\\"❗\\\",\\\"⛏\\\",\\\"⛐\\\",\\\"⛑\\\",\\\"\\\",\\\"⛒\\\",\\\"⛕\\\",\\\"⛓\\\",\\\"⛔\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛖\\\",\\\"⛗\\\",\\\"⛘\\\",\\\"⛙\\\",\\\"⛚\\\",\\\"⛛\\\",\\\"⛜\\\",\\\"⛝\\\",\\\"⛞\\\",\\\"⛟\\\",\\\"⛠\\\",\\\"⛡\\\",\\\"⭕\\\",\\\"㉈\\\",\\\"㉉\\\",\\\"㉊\\\",\\\"㉋\\\",\\\"㉌\\\",\\\"㉍\\\",\\\"㉎\\\",\\\"㉏\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⒑\\\",\\\"⒒\\\",\\\"⒓\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⬛\\\",\\\"⬤\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⚿\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㊙\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛣\\\",\\\"⭖\\\",\\\"⭗\\\",\\\"⭘\\\",\\\"⭙\\\",\\\"☓\\\",\\\"㊋\\\",\\\"〒\\\",\\\"⛨\\\",\\\"㉆\\\",\\\"㉅\\\",\\\"⛩\\\",\\\"࿖\\\",\\\"⛪\\\",\\\"⛫\\\",\\\"⛬\\\",\\\"♨\\\",\\\"⛭\\\",\\\"⛮\\\",\\\"⛯\\\",\\\"⚓\\\",\\\"✈\\\",\\\"⛰\\\",\\\"⛱\\\",\\\"⛲\\\",\\\"⛳\\\",\\\"⛴\\\",\\\"⛵\\\",\\\"\\\",\\\"Ⓓ\\\",\\\"Ⓢ\\\",\\\"⛶\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛷\\\",\\\"⛸\\\",\\\"⛹\\\",\\\"⛺\\\",\\\"\\\",\\\"☎\\\",\\\"⛻\\\",\\\"⛼\\\",\\\"⛽\\\",\\\"⛾\\\",\\\"\\\",\\\"⛿\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"➡\\\",\\\"⬅\\\",\\\"⬆\\\",\\\"⬇\\\",\\\"⬯\\\",\\\"⬮\\\",\\\"年\\\",\\\"月\\\",\\\"日\\\",\\\"円\\\",\\\"㎡\\\",\\\"㎥\\\",\\\"㎝\\\",\\\"㎠\\\",\\\"㎤\\\",\\\"\\\",\\\"⒈\\\",\\\"⒉\\\",\\\"⒊\\\",\\\"⒋\\\",\\\"⒌\\\",\\\"⒍\\\",\\\"⒎\\\",\\\"⒏\\\",\\\"⒐\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㈳\\\",\\\"㈶\\\",\\\"㈲\\\",\\\"㈱\\\",\\\"㈹\\\",\\\"㉄\\\",\\\"▶\\\",\\\"◀\\\",\\\"〖\\\",\\\"〗\\\",\\\"⟐\\\",\\\"²\\\",\\\"³\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㉇\\\",\\\"\\\",\\\"\\\",\\\"℻\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㈪\\\",\\\"㈫\\\",\\\"㈬\\\",\\\"㈭\\\",\\\"㈮\\\",\\\"㈯\\\",\\\"㈰\\\",\\\"㈷\\\",\\\"㍾\\\",\\\"㍽\\\",\\\"㍼\\\",\\\"㍻\\\",\\\"№\\\",\\\"℡\\\",\\\"〶\\\",\\\"⚾\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"ℓ\\\",\\\"㎏\\\",\\\"㎐\\\",\\\"㏊\\\",\\\"㎞\\\",\\\"㎢\\\",\\\"㍱\\\",\\\"\\\",\\\"\\\",\\\"½\\\",\\\"↉\\\",\\\"⅓\\\",\\\"⅔\\\",\\\"¼\\\",\\\"¾\\\",\\\"⅕\\\",\\\"⅖\\\",\\\"⅗\\\",\\\"⅘\\\",\\\"⅙\\\",\\\"⅚\\\",\\\"⅐\\\",\\\"⅛\\\",\\\"⅑\\\",\\\"⅒\\\",\\\"☀\\\",\\\"☁\\\",\\\"☂\\\",\\\"⛄\\\",\\\"☖\\\",\\\"☗\\\",\\\"⛉\\\",\\\"⛊\\\",\\\"♦\\\",\\\"♥\\\",\\\"♣\\\",\\\"♠\\\",\\\"⛋\\\",\\\"⨀\\\",\\\"‼\\\",\\\"⁉\\\",\\\"⛅\\\",\\\"☔\\\",\\\"⛆\\\",\\\"☃\\\",\\\"⛇\\\",\\\"⚡\\\",\\\"⛈\\\",\\\"\\\",\\\"⚞\\\",\\\"⚟\\\",\\\"♬\\\",\\\"☎\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"Ⅰ\\\",\\\"Ⅱ\\\",\\\"Ⅲ\\\",\\\"Ⅳ\\\",\\\"Ⅴ\\\",\\\"Ⅵ\\\",\\\"Ⅶ\\\",\\\"Ⅷ\\\",\\\"Ⅸ\\\",\\\"Ⅹ\\\",\\\"Ⅺ\\\",\\\"Ⅻ\\\",\\\"⑰\\\",\\\"⑱\\\",\\\"⑲\\\",\\\"⑳\\\",\\\"⑴\\\",\\\"⑵\\\",\\\"⑶\\\",\\\"⑷\\\",\\\"⑸\\\",\\\"⑹\\\",\\\"⑺\\\",\\\"⑻\\\",\\\"⑼\\\",\\\"⑽\\\",\\\"⑾\\\",\\\"⑿\\\",\\\"㉑\\\",\\\"㉒\\\",\\\"㉓\\\",\\\"㉔\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㉕\\\",\\\"㉖\\\",\\\"㉗\\\",\\\"㉘\\\",\\\"㉙\\\",\\\"㉚\\\",\\\"①\\\",\\\"②\\\",\\\"③\\\",\\\"④\\\",\\\"⑤\\\",\\\"⑥\\\",\\\"⑦\\\",\\\"⑧\\\",\\\"⑨\\\",\\\"⑩\\\",\\\"⑪\\\",\\\"⑫\\\",\\\"⑬\\\",\\\"⑭\\\",\\\"⑮\\\",\\\"⑯\\\",\\\"❶\\\",\\\"❷\\\",\\\"❸\\\",\\\"❹\\\",\\\"❺\\\",\\\"❻\\\",\\\"❼\\\",\\\"❽\\\",\\\"❾\\\",\\\"❿\\\",\\\"⓫\\\",\\\"⓬\\\",\\\"㉛\\\",\\\"\\\"],u=[\\\"㐂\\\",\\\"\\\",\\\"份\\\",\\\"仿\\\",\\\"侚\\\",\\\"俉\\\",\\\"傜\\\",\\\"儞\\\",\\\"冼\\\",\\\"㔟\\\",\\\"匇\\\",\\\"卡\\\",\\\"卬\\\",\\\"詹\\\",\\\"\\\",\\\"呍\\\",\\\"咖\\\",\\\"咜\\\",\\\"咩\\\",\\\"唎\\\",\\\"啊\\\",\\\"噲\\\",\\\"囤\\\",\\\"圳\\\",\\\"圴\\\",\\\"塚\\\",\\\"墀\\\",\\\"姤\\\",\\\"娣\\\",\\\"婕\\\",\\\"寬\\\",\\\"﨑\\\",\\\"㟢\\\",\\\"庬\\\",\\\"弴\\\",\\\"彅\\\",\\\"德\\\",\\\"怗\\\",\\\"恵\\\",\\\"愰\\\",\\\"昤\\\",\\\"曈\\\",\\\"曙\\\",\\\"曺\\\",\\\"曻\\\",\\\"桒\\\",\\\"鿄\\\",\\\"椑\\\",\\\"椻\\\",\\\"橅\\\",\\\"檑\\\",\\\"櫛\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"毱\\\",\\\"泠\\\",\\\"洮\\\",\\\"海\\\",\\\"涿\\\",\\\"淊\\\",\\\"淸\\\",\\\"渚\\\",\\\"潞\\\",\\\"濹\\\",\\\"灤\\\",\\\"𤋮\\\",\\\"\\\",\\\"煇\\\",\\\"燁\\\",\\\"爀\\\",\\\"玟\\\",\\\"玨\\\",\\\"珉\\\",\\\"珖\\\",\\\"琛\\\",\\\"琡\\\",\\\"琢\\\",\\\"琦\\\",\\\"琪\\\",\\\"琬\\\",\\\"琹\\\",\\\"瑋\\\",\\\"㻚\\\",\\\"畵\\\",\\\"疁\\\",\\\"睲\\\",\\\"䂓\\\",\\\"磈\\\",\\\"磠\\\",\\\"祇\\\",\\\"禮\\\",\\\"鿆\\\",\\\"䄃\\\",\\\"鿅\\\",\\\"秚\\\",\\\"稞\\\",\\\"筿\\\",\\\"簱\\\",\\\"䉤\\\",\\\"綋\\\",\\\"羡\\\",\\\"脘\\\",\\\"脺\\\",\\\"舘\\\",\\\"芮\\\",\\\"葛\\\",\\\"蓜\\\",\\\"蓬\\\",\\\"蕙\\\",\\\"藎\\\",\\\"蝕\\\",\\\"蟬\\\",\\\"蠋\\\",\\\"裵\\\",\\\"角\\\",\\\"諶\\\",\\\"跎\\\",\\\"辻\\\",\\\"迶\\\",\\\"郝\\\",\\\"鄧\\\",\\\"鄭\\\",\\\"醲\\\",\\\"鈳\\\",\\\"銈\\\",\\\"錡\\\",\\\"鍈\\\",\\\"閒\\\",\\\"雞\\\",\\\"餃\\\",\\\"饀\\\",\\\"髙\\\",\\\"鯖\\\",\\\"鷗\\\",\\\"麴\\\",\\\"麵\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛌\\\",\\\"⛍\\\",\\\"❗\\\",\\\"⛏\\\",\\\"⛐\\\",\\\"⛑\\\",\\\"\\\",\\\"⛒\\\",\\\"⛕\\\",\\\"⛓\\\",\\\"⛔\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛖\\\",\\\"⛗\\\",\\\"⛘\\\",\\\"⛙\\\",\\\"⛚\\\",\\\"⛛\\\",\\\"⛜\\\",\\\"⛝\\\",\\\"⛞\\\",\\\"⛟\\\",\\\"⛠\\\",\\\"⛡\\\",\\\"⭕\\\",\\\"㉈\\\",\\\"㉉\\\",\\\"㉊\\\",\\\"㉋\\\",\\\"㉌\\\",\\\"㉍\\\",\\\"㉎\\\",\\\"㉏\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⒑\\\",\\\"⒒\\\",\\\"⒓\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⬛\\\",\\\"⬤\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⚿\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㊙\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛣\\\",\\\"⭖\\\",\\\"⭗\\\",\\\"⭘\\\",\\\"⭙\\\",\\\"☓\\\",\\\"㊋\\\",\\\"〒\\\",\\\"⛨\\\",\\\"㉆\\\",\\\"㉅\\\",\\\"⛩\\\",\\\"࿖\\\",\\\"⛪\\\",\\\"⛫\\\",\\\"⛬\\\",\\\"♨\\\",\\\"⛭\\\",\\\"⛮\\\",\\\"⛯\\\",\\\"⚓\\\",\\\"✈\\\",\\\"⛰\\\",\\\"⛱\\\",\\\"⛲\\\",\\\"⛳\\\",\\\"⛴\\\",\\\"⛵\\\",\\\"\\\",\\\"Ⓓ\\\",\\\"Ⓢ\\\",\\\"⛶\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛷\\\",\\\"⛸\\\",\\\"⛹\\\",\\\"⛺\\\",\\\"\\\",\\\"☎\\\",\\\"⛻\\\",\\\"⛼\\\",\\\"⛽\\\",\\\"⛾\\\",\\\"\\\",\\\"⛿\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"➡\\\",\\\"⬅\\\",\\\"⬆\\\",\\\"⬇\\\",\\\"⬯\\\",\\\"⬮\\\",\\\"年\\\",\\\"月\\\",\\\"日\\\",\\\"円\\\",\\\"㎡\\\",\\\"㎥\\\",\\\"㎝\\\",\\\"㎠\\\",\\\"㎤\\\",\\\"\\\",\\\"⒈\\\",\\\"⒉\\\",\\\"⒊\\\",\\\"⒋\\\",\\\"⒌\\\",\\\"⒍\\\",\\\"⒎\\\",\\\"⒏\\\",\\\"⒐\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㈳\\\",\\\"㈶\\\",\\\"㈲\\\",\\\"㈱\\\",\\\"㈹\\\",\\\"㉄\\\",\\\"▶\\\",\\\"◀\\\",\\\"〖\\\",\\\"〗\\\",\\\"⟐\\\",\\\"²\\\",\\\"³\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㉇\\\",\\\"\\\",\\\"\\\",\\\"℻\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㈪\\\",\\\"㈫\\\",\\\"㈬\\\",\\\"㈭\\\",\\\"㈮\\\",\\\"㈯\\\",\\\"㈰\\\",\\\"㈷\\\",\\\"㍾\\\",\\\"㍽\\\",\\\"㍼\\\",\\\"㍻\\\",\\\"№\\\",\\\"℡\\\",\\\"〶\\\",\\\"⚾\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"ℓ\\\",\\\"㎏\\\",\\\"㎐\\\",\\\"㏊\\\",\\\"㎞\\\",\\\"㎢\\\",\\\"㍱\\\",\\\"\\\",\\\"\\\",\\\"½\\\",\\\"↉\\\",\\\"⅓\\\",\\\"⅔\\\",\\\"¼\\\",\\\"¾\\\",\\\"⅕\\\",\\\"⅖\\\",\\\"⅗\\\",\\\"⅘\\\",\\\"⅙\\\",\\\"⅚\\\",\\\"⅐\\\",\\\"⅛\\\",\\\"⅑\\\",\\\"⅒\\\",\\\"☀\\\",\\\"☁\\\",\\\"☂\\\",\\\"⛄\\\",\\\"☖\\\",\\\"☗\\\",\\\"⛉\\\",\\\"⛊\\\",\\\"♦\\\",\\\"♥\\\",\\\"♣\\\",\\\"♠\\\",\\\"⛋\\\",\\\"⨀\\\",\\\"‼\\\",\\\"⁉\\\",\\\"⛅\\\",\\\"☔\\\",\\\"⛆\\\",\\\"☃\\\",\\\"⛇\\\",\\\"⚡\\\",\\\"⛈\\\",\\\"\\\",\\\"⚞\\\",\\\"⚟\\\",\\\"♬\\\",\\\"☎\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"Ⅰ\\\",\\\"Ⅱ\\\",\\\"Ⅲ\\\",\\\"Ⅳ\\\",\\\"Ⅴ\\\",\\\"Ⅵ\\\",\\\"Ⅶ\\\",\\\"Ⅷ\\\",\\\"Ⅸ\\\",\\\"Ⅹ\\\",\\\"Ⅺ\\\",\\\"Ⅻ\\\",\\\"⑰\\\",\\\"⑱\\\",\\\"⑲\\\",\\\"⑳\\\",\\\"⑴\\\",\\\"⑵\\\",\\\"⑶\\\",\\\"⑷\\\",\\\"⑸\\\",\\\"⑹\\\",\\\"⑺\\\",\\\"⑻\\\",\\\"⑼\\\",\\\"⑽\\\",\\\"⑾\\\",\\\"⑿\\\",\\\"㉑\\\",\\\"㉒\\\",\\\"㉓\\\",\\\"㉔\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㉕\\\",\\\"㉖\\\",\\\"㉗\\\",\\\"㉘\\\",\\\"㉙\\\",\\\"㉚\\\",\\\"①\\\",\\\"②\\\",\\\"③\\\",\\\"④\\\",\\\"⑤\\\",\\\"⑥\\\",\\\"⑦\\\",\\\"⑧\\\",\\\"⑨\\\",\\\"⑩\\\",\\\"⑪\\\",\\\"⑫\\\",\\\"⑬\\\",\\\"⑭\\\",\\\"⑮\\\",\\\"⑯\\\",\\\"❶\\\",\\\"❷\\\",\\\"❸\\\",\\\"❹\\\",\\\"❺\\\",\\\"❻\\\",\\\"❼\\\",\\\"❽\\\",\\\"❾\\\",\\\"❿\\\",\\\"⓫\\\",\\\"⓬\\\",\\\"㉛\\\",\\\"\\\"],l=[\\\"㐂\\\",\\\"𠅘\\\",\\\"份\\\",\\\"仿\\\",\\\"侚\\\",\\\"俉\\\",\\\"傜\\\",\\\"儞\\\",\\\"冼\\\",\\\"㔟\\\",\\\"匇\\\",\\\"卡\\\",\\\"卬\\\",\\\"詹\\\",\\\"𠮷\\\",\\\"呍\\\",\\\"咖\\\",\\\"咜\\\",\\\"咩\\\",\\\"唎\\\",\\\"啊\\\",\\\"噲\\\",\\\"囤\\\",\\\"圳\\\",\\\"圴\\\",\\\"塚\\\",\\\"墀\\\",\\\"姤\\\",\\\"娣\\\",\\\"婕\\\",\\\"寬\\\",\\\"﨑\\\",\\\"㟢\\\",\\\"庬\\\",\\\"弴\\\",\\\"彅\\\",\\\"德\\\",\\\"怗\\\",\\\"恵\\\",\\\"愰\\\",\\\"昤\\\",\\\"曈\\\",\\\"曙\\\",\\\"曺\\\",\\\"曻\\\",\\\"桒\\\",\\\"鿄\\\",\\\"椑\\\",\\\"椻\\\",\\\"橅\\\",\\\"檑\\\",\\\"櫛\\\",\\\"𣏌\\\",\\\"𣏾\\\",\\\"𣗄\\\",\\\"毱\\\",\\\"泠\\\",\\\"洮\\\",\\\"海\\\",\\\"涿\\\",\\\"淊\\\",\\\"淸\\\",\\\"渚\\\",\\\"潞\\\",\\\"濹\\\",\\\"灤\\\",\\\"𤋮\\\",\\\"𤋮\\\",\\\"煇\\\",\\\"燁\\\",\\\"爀\\\",\\\"玟\\\",\\\"玨\\\",\\\"珉\\\",\\\"珖\\\",\\\"琛\\\",\\\"琡\\\",\\\"琢\\\",\\\"琦\\\",\\\"琪\\\",\\\"琬\\\",\\\"琹\\\",\\\"瑋\\\",\\\"㻚\\\",\\\"畵\\\",\\\"疁\\\",\\\"睲\\\",\\\"䂓\\\",\\\"磈\\\",\\\"磠\\\",\\\"祇\\\",\\\"禮\\\",\\\"鿆\\\",\\\"䄃\\\",\\\"鿅\\\",\\\"秚\\\",\\\"稞\\\",\\\"筿\\\",\\\"簱\\\",\\\"䉤\\\",\\\"綋\\\",\\\"羡\\\",\\\"脘\\\",\\\"脺\\\",\\\"舘\\\",\\\"芮\\\",\\\"葛\\\",\\\"蓜\\\",\\\"蓬\\\",\\\"蕙\\\",\\\"藎\\\",\\\"蝕\\\",\\\"蟬\\\",\\\"蠋\\\",\\\"裵\\\",\\\"角\\\",\\\"諶\\\",\\\"跎\\\",\\\"辻\\\",\\\"迶\\\",\\\"郝\\\",\\\"鄧\\\",\\\"鄭\\\",\\\"醲\\\",\\\"鈳\\\",\\\"銈\\\",\\\"錡\\\",\\\"鍈\\\",\\\"閒\\\",\\\"雞\\\",\\\"餃\\\",\\\"饀\\\",\\\"髙\\\",\\\"鯖\\\",\\\"鷗\\\",\\\"麴\\\",\\\"麵\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛌\\\",\\\"⛍\\\",\\\"❗\\\",\\\"⛏\\\",\\\"⛐\\\",\\\"⛑\\\",\\\"\\\",\\\"⛒\\\",\\\"⛕\\\",\\\"⛓\\\",\\\"⛔\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"🅿\\\",\\\"🆊\\\",\\\"\\\",\\\"\\\",\\\"⛖\\\",\\\"⛗\\\",\\\"⛘\\\",\\\"⛙\\\",\\\"⛚\\\",\\\"⛛\\\",\\\"⛜\\\",\\\"⛝\\\",\\\"⛞\\\",\\\"⛟\\\",\\\"⛠\\\",\\\"⛡\\\",\\\"⭕\\\",\\\"㉈\\\",\\\"㉉\\\",\\\"㉊\\\",\\\"㉋\\\",\\\"㉌\\\",\\\"㉍\\\",\\\"㉎\\\",\\\"㉏\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⒑\\\",\\\"⒒\\\",\\\"⒓\\\",\\\"🅊\\\",\\\"🅌\\\",\\\"🄿\\\",\\\"🅆\\\",\\\"🅋\\\",\\\"🈐\\\",\\\"🈑\\\",\\\"🈒\\\",\\\"🈓\\\",\\\"🅂\\\",\\\"🈔\\\",\\\"🈕\\\",\\\"🈖\\\",\\\"🅍\\\",\\\"🄱\\\",\\\"🄽\\\",\\\"⬛\\\",\\\"⬤\\\",\\\"🈗\\\",\\\"🈘\\\",\\\"🈙\\\",\\\"🈚\\\",\\\"🈛\\\",\\\"⚿\\\",\\\"🈜\\\",\\\"🈝\\\",\\\"🈞\\\",\\\"🈟\\\",\\\"🈠\\\",\\\"🈡\\\",\\\"🈢\\\",\\\"🈣\\\",\\\"🈤\\\",\\\"🈥\\\",\\\"🅎\\\",\\\"㊙\\\",\\\"🈀\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛣\\\",\\\"⭖\\\",\\\"⭗\\\",\\\"⭘\\\",\\\"⭙\\\",\\\"☓\\\",\\\"㊋\\\",\\\"〒\\\",\\\"⛨\\\",\\\"㉆\\\",\\\"㉅\\\",\\\"⛩\\\",\\\"࿖\\\",\\\"⛪\\\",\\\"⛫\\\",\\\"⛬\\\",\\\"♨\\\",\\\"⛭\\\",\\\"⛮\\\",\\\"⛯\\\",\\\"⚓\\\",\\\"✈\\\",\\\"⛰\\\",\\\"⛱\\\",\\\"⛲\\\",\\\"⛳\\\",\\\"⛴\\\",\\\"⛵\\\",\\\"🅗\\\",\\\"Ⓓ\\\",\\\"Ⓢ\\\",\\\"⛶\\\",\\\"🅟\\\",\\\"🆋\\\",\\\"🆍\\\",\\\"🆌\\\",\\\"🅹\\\",\\\"⛷\\\",\\\"⛸\\\",\\\"⛹\\\",\\\"⛺\\\",\\\"🅻\\\",\\\"☎\\\",\\\"⛻\\\",\\\"⛼\\\",\\\"⛽\\\",\\\"⛾\\\",\\\"🅼\\\",\\\"⛿\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"➡\\\",\\\"⬅\\\",\\\"⬆\\\",\\\"⬇\\\",\\\"⬯\\\",\\\"⬮\\\",\\\"年\\\",\\\"月\\\",\\\"日\\\",\\\"円\\\",\\\"㎡\\\",\\\"㎥\\\",\\\"㎝\\\",\\\"㎠\\\",\\\"㎤\\\",\\\"🄀\\\",\\\"⒈\\\",\\\"⒉\\\",\\\"⒊\\\",\\\"⒋\\\",\\\"⒌\\\",\\\"⒍\\\",\\\"⒎\\\",\\\"⒏\\\",\\\"⒐\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"🄁\\\",\\\"🄂\\\",\\\"🄃\\\",\\\"🄄\\\",\\\"🄅\\\",\\\"🄆\\\",\\\"🄇\\\",\\\"🄈\\\",\\\"🄉\\\",\\\"🄊\\\",\\\"㈳\\\",\\\"㈶\\\",\\\"㈲\\\",\\\"㈱\\\",\\\"㈹\\\",\\\"㉄\\\",\\\"▶\\\",\\\"◀\\\",\\\"〖\\\",\\\"〗\\\",\\\"⟐\\\",\\\"²\\\",\\\"³\\\",\\\"🄭\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"🄬\\\",\\\"🄫\\\",\\\"㉇\\\",\\\"🆐\\\",\\\"🈦\\\",\\\"℻\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㈪\\\",\\\"㈫\\\",\\\"㈬\\\",\\\"㈭\\\",\\\"㈮\\\",\\\"㈯\\\",\\\"㈰\\\",\\\"㈷\\\",\\\"㍾\\\",\\\"㍽\\\",\\\"㍼\\\",\\\"㍻\\\",\\\"№\\\",\\\"℡\\\",\\\"〶\\\",\\\"⚾\\\",\\\"🉀\\\",\\\"🉁\\\",\\\"🉂\\\",\\\"🉃\\\",\\\"🉄\\\",\\\"🉅\\\",\\\"🉆\\\",\\\"🉇\\\",\\\"🉈\\\",\\\"🄪\\\",\\\"🈧\\\",\\\"🈨\\\",\\\"🈩\\\",\\\"🈔\\\",\\\"🈪\\\",\\\"🈫\\\",\\\"🈬\\\",\\\"🈭\\\",\\\"🈮\\\",\\\"🈯\\\",\\\"🈰\\\",\\\"🈱\\\",\\\"ℓ\\\",\\\"㎏\\\",\\\"㎐\\\",\\\"㏊\\\",\\\"㎞\\\",\\\"㎢\\\",\\\"㍱\\\",\\\"\\\",\\\"\\\",\\\"½\\\",\\\"↉\\\",\\\"⅓\\\",\\\"⅔\\\",\\\"¼\\\",\\\"¾\\\",\\\"⅕\\\",\\\"⅖\\\",\\\"⅗\\\",\\\"⅘\\\",\\\"⅙\\\",\\\"⅚\\\",\\\"⅐\\\",\\\"⅛\\\",\\\"⅑\\\",\\\"⅒\\\",\\\"☀\\\",\\\"☁\\\",\\\"☂\\\",\\\"⛄\\\",\\\"☖\\\",\\\"☗\\\",\\\"⛉\\\",\\\"⛊\\\",\\\"♦\\\",\\\"♥\\\",\\\"♣\\\",\\\"♠\\\",\\\"⛋\\\",\\\"⨀\\\",\\\"‼\\\",\\\"⁉\\\",\\\"⛅\\\",\\\"☔\\\",\\\"⛆\\\",\\\"☃\\\",\\\"⛇\\\",\\\"⚡\\\",\\\"⛈\\\",\\\"\\\",\\\"⚞\\\",\\\"⚟\\\",\\\"♬\\\",\\\"☎\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"Ⅰ\\\",\\\"Ⅱ\\\",\\\"Ⅲ\\\",\\\"Ⅳ\\\",\\\"Ⅴ\\\",\\\"Ⅵ\\\",\\\"Ⅶ\\\",\\\"Ⅷ\\\",\\\"Ⅸ\\\",\\\"Ⅹ\\\",\\\"Ⅺ\\\",\\\"Ⅻ\\\",\\\"⑰\\\",\\\"⑱\\\",\\\"⑲\\\",\\\"⑳\\\",\\\"⑴\\\",\\\"⑵\\\",\\\"⑶\\\",\\\"⑷\\\",\\\"⑸\\\",\\\"⑹\\\",\\\"⑺\\\",\\\"⑻\\\",\\\"⑼\\\",\\\"⑽\\\",\\\"⑾\\\",\\\"⑿\\\",\\\"㉑\\\",\\\"㉒\\\",\\\"㉓\\\",\\\"㉔\\\",\\\"🄐\\\",\\\"🄑\\\",\\\"🄒\\\",\\\"🄓\\\",\\\"🄔\\\",\\\"🄕\\\",\\\"🄖\\\",\\\"🄗\\\",\\\"🄘\\\",\\\"🄙\\\",\\\"🄚\\\",\\\"🄛\\\",\\\"🄜\\\",\\\"🄝\\\",\\\"🄞\\\",\\\"🄟\\\",\\\"🄠\\\",\\\"🄡\\\",\\\"🄢\\\",\\\"🄣\\\",\\\"🄤\\\",\\\"🄥\\\",\\\"🄦\\\",\\\"🄧\\\",\\\"🄨\\\",\\\"🄩\\\",\\\"㉕\\\",\\\"㉖\\\",\\\"㉗\\\",\\\"㉘\\\",\\\"㉙\\\",\\\"㉚\\\",\\\"①\\\",\\\"②\\\",\\\"③\\\",\\\"④\\\",\\\"⑤\\\",\\\"⑥\\\",\\\"⑦\\\",\\\"⑧\\\",\\\"⑨\\\",\\\"⑩\\\",\\\"⑪\\\",\\\"⑫\\\",\\\"⑬\\\",\\\"⑭\\\",\\\"⑮\\\",\\\"⑯\\\",\\\"❶\\\",\\\"❷\\\",\\\"❸\\\",\\\"❹\\\",\\\"❺\\\",\\\"❻\\\",\\\"❼\\\",\\\"❽\\\",\\\"❾\\\",\\\"❿\\\",\\\"⓫\\\",\\\"⓬\\\",\\\"㉛\\\",\\\"\\\"],f=[\\\"！\\\",\\\"＂\\\",\\\"＃\\\",\\\"＄\\\",\\\"％\\\",\\\"＆\\\",\\\"＇\\\",\\\"（\\\",\\\"）\\\",\\\"＊\\\",\\\"＋\\\",\\\"，\\\",\\\"－\\\",\\\"．\\\",\\\"／\\\",\\\"０\\\",\\\"１\\\",\\\"２\\\",\\\"３\\\",\\\"４\\\",\\\"５\\\",\\\"６\\\",\\\"７\\\",\\\"８\\\",\\\"９\\\",\\\"：\\\",\\\"；\\\",\\\"＜\\\",\\\"＝\\\",\\\"＞\\\",\\\"？\\\",\\\"＠\\\",\\\"Ａ\\\",\\\"Ｂ\\\",\\\"Ｃ\\\",\\\"Ｄ\\\",\\\"Ｅ\\\",\\\"Ｆ\\\",\\\"Ｇ\\\",\\\"Ｈ\\\",\\\"Ｉ\\\",\\\"Ｊ\\\",\\\"Ｋ\\\",\\\"Ｌ\\\",\\\"Ｍ\\\",\\\"Ｎ\\\",\\\"Ｏ\\\",\\\"Ｐ\\\",\\\"Ｑ\\\",\\\"Ｒ\\\",\\\"Ｓ\\\",\\\"Ｔ\\\",\\\"Ｕ\\\",\\\"Ｖ\\\",\\\"Ｗ\\\",\\\"Ｘ\\\",\\\"Ｙ\\\",\\\"Ｚ\\\",\\\"［\\\",\\\"￥\\\",\\\"］\\\",\\\"＾\\\",\\\"＿\\\",\\\"｀\\\",\\\"ａ\\\",\\\"ｂ\\\",\\\"ｃ\\\",\\\"ｄ\\\",\\\"ｅ\\\",\\\"ｆ\\\",\\\"ｇ\\\",\\\"ｈ\\\",\\\"ｉ\\\",\\\"ｊ\\\",\\\"ｋ\\\",\\\"ｌ\\\",\\\"ｍ\\\",\\\"ｎ\\\",\\\"ｏ\\\",\\\"ｐ\\\",\\\"ｑ\\\",\\\"ｒ\\\",\\\"ｓ\\\",\\\"ｔ\\\",\\\"ｕ\\\",\\\"ｖ\\\",\\\"ｗ\\\",\\\"ｘ\\\",\\\"ｙ\\\",\\\"ｚ\\\",\\\"｛\\\",\\\"｜\\\",\\\"｝\\\",\\\"～\\\"],d=[\\\"ぁ\\\",\\\"あ\\\",\\\"ぃ\\\",\\\"い\\\",\\\"ぅ\\\",\\\"う\\\",\\\"ぇ\\\",\\\"え\\\",\\\"ぉ\\\",\\\"お\\\",\\\"か\\\",\\\"が\\\",\\\"き\\\",\\\"ぎ\\\",\\\"く\\\",\\\"ぐ\\\",\\\"け\\\",\\\"げ\\\",\\\"こ\\\",\\\"ご\\\",\\\"さ\\\",\\\"ざ\\\",\\\"し\\\",\\\"じ\\\",\\\"す\\\",\\\"ず\\\",\\\"せ\\\",\\\"ぜ\\\",\\\"そ\\\",\\\"ぞ\\\",\\\"た\\\",\\\"だ\\\",\\\"ち\\\",\\\"ぢ\\\",\\\"っ\\\",\\\"つ\\\",\\\"づ\\\",\\\"て\\\",\\\"で\\\",\\\"と\\\",\\\"ど\\\",\\\"な\\\",\\\"に\\\",\\\"ぬ\\\",\\\"ね\\\",\\\"の\\\",\\\"は\\\",\\\"ば\\\",\\\"ぱ\\\",\\\"ひ\\\",\\\"び\\\",\\\"ぴ\\\",\\\"ふ\\\",\\\"ぶ\\\",\\\"ぷ\\\",\\\"へ\\\",\\\"べ\\\",\\\"ぺ\\\",\\\"ほ\\\",\\\"ぼ\\\",\\\"ぽ\\\",\\\"ま\\\",\\\"み\\\",\\\"む\\\",\\\"め\\\",\\\"も\\\",\\\"ゃ\\\",\\\"や\\\",\\\"ゅ\\\",\\\"ゆ\\\",\\\"ょ\\\",\\\"よ\\\",\\\"ら\\\",\\\"り\\\",\\\"る\\\",\\\"れ\\\",\\\"ろ\\\",\\\"ゎ\\\",\\\"わ\\\",\\\"ゐ\\\",\\\"ゑ\\\",\\\"を\\\",\\\"ん\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"ゝ\\\",\\\"ゞ\\\",\\\"ー\\\",\\\"。\\\",\\\"「\\\",\\\"」\\\",\\\"、\\\",\\\"・\\\"],p=[\\\"ァ\\\",\\\"ア\\\",\\\"ィ\\\",\\\"イ\\\",\\\"ゥ\\\",\\\"ウ\\\",\\\"ェ\\\",\\\"エ\\\",\\\"ォ\\\",\\\"オ\\\",\\\"カ\\\",\\\"ガ\\\",\\\"キ\\\",\\\"ギ\\\",\\\"ク\\\",\\\"グ\\\",\\\"ケ\\\",\\\"ゲ\\\",\\\"コ\\\",\\\"ゴ\\\",\\\"サ\\\",\\\"ザ\\\",\\\"シ\\\",\\\"ジ\\\",\\\"ス\\\",\\\"ズ\\\",\\\"セ\\\",\\\"ゼ\\\",\\\"ソ\\\",\\\"ゾ\\\",\\\"タ\\\",\\\"ダ\\\",\\\"チ\\\",\\\"ヂ\\\",\\\"ッ\\\",\\\"ツ\\\",\\\"ヅ\\\",\\\"テ\\\",\\\"デ\\\",\\\"ト\\\",\\\"ド\\\",\\\"ナ\\\",\\\"ニ\\\",\\\"ヌ\\\",\\\"ネ\\\",\\\"ノ\\\",\\\"ハ\\\",\\\"バ\\\",\\\"パ\\\",\\\"ヒ\\\",\\\"ビ\\\",\\\"ピ\\\",\\\"フ\\\",\\\"ブ\\\",\\\"プ\\\",\\\"ヘ\\\",\\\"ベ\\\",\\\"ペ\\\",\\\"ホ\\\",\\\"ボ\\\",\\\"ポ\\\",\\\"マ\\\",\\\"ミ\\\",\\\"ム\\\",\\\"メ\\\",\\\"モ\\\",\\\"ャ\\\",\\\"ヤ\\\",\\\"ュ\\\",\\\"ユ\\\",\\\"ョ\\\",\\\"ヨ\\\",\\\"ラ\\\",\\\"リ\\\",\\\"ル\\\",\\\"レ\\\",\\\"ロ\\\",\\\"ヮ\\\",\\\"ワ\\\",\\\"ヰ\\\",\\\"ヱ\\\",\\\"ヲ\\\",\\\"ン\\\",\\\"ヴ\\\",\\\"ヵ\\\",\\\"ヶ\\\",\\\"ヽ\\\",\\\"ヾ\\\",\\\"ー\\\",\\\"。\\\",\\\"「\\\",\\\"」\\\",\\\"、\\\",\\\"・\\\"],v=new Map([[\\\"022b6f43e2a414fd68f172da202bac9a\\\",\\\"⚞\\\"],[\\\"94fb7be756372db6b62e3e0a119083d5\\\",\\\"⚞\\\"],[\\\"12aecdea283e4d07f88b9f2b740e4f86\\\",\\\"⚟\\\"],[\\\"1a563501affbf7f5baec350a108d5505\\\",\\\"⚟\\\"],[\\\"556971570f40044fa4520df3289a1cf2\\\",\\\"⚟\\\"],[\\\"65b042886a563a771aa389b12af7bca7\\\",\\\"⚟\\\"],[\\\"bbda644d17efd3c020635ee3d90968a5\\\",\\\"｟\\\"],[\\\"5063561406195ca45f5992e3f7ad77d2\\\",\\\"｟\\\"],[\\\"9d15c0395a4738936af34308acf2d032\\\",\\\"｟\\\"],[\\\"2a063edc4770b3403f060b38166a0d4d\\\",\\\"｟\\\"],[\\\"54479aa90145b4713134b78d4fb98aa5\\\",\\\"｟\\\"],[\\\"12a2c7156da32fc972b5a451bb87b813\\\",\\\"｟\\\"],[\\\"c8d428ead557285b0b7088388b22519c\\\",\\\"｟\\\"],[\\\"7160f7419cba7acdacd23cbeb4834dbe\\\",\\\"｟\\\"],[\\\"3c49616fb9bf0b9052b30e118f8857ea\\\",\\\"｟\\\"],[\\\"71c94bb6d963e47443eac448a09d22ce\\\",\\\"｟\\\"],[\\\"7ec2179107ba4c58abb6ef92e7781365\\\",\\\"｟\\\"],[\\\"2eb49bd25d7eeada006afc0864350da4\\\",\\\"｟\\\"],[\\\"a341ee7fe8a368c9737a3341f016ac70\\\",\\\"｟\\\"],[\\\"f47048d669ac8d84eeb62477e8420f89\\\",\\\"｟\\\"],[\\\"38566b372f4c5a1aead4efa20decd079\\\",\\\"｠\\\"],[\\\"d84fc83615b75802ed422eda4ba39465\\\",\\\"｠\\\"],[\\\"5bb8b7731d9473ebd7c842334dfa24f2\\\",\\\"｠\\\"],[\\\"9ffa7e00cfc7e807a161ada460b8060c\\\",\\\"｠\\\"],[\\\"a58dc0e1271b03a5981b57a83271afa7\\\",\\\"｠\\\"],[\\\"e67210b0da0161d36b79e8c9be6a9d0c\\\",\\\"｠\\\"],[\\\"08de4be9569ebd6ac01709f552ae8a65\\\",\\\"｠\\\"],[\\\"e214599903c94c532684bdf54b62df61\\\",\\\"｠\\\"],[\\\"2a83209f8a7489081890c277397df425\\\",\\\"｠\\\"],[\\\"0294d50cea5197c8c4646d2cace3e78d\\\",\\\"｠\\\"],[\\\"0b808509e4d89a2b9d02252ca85f2e34\\\",\\\"｠\\\"],[\\\"2a74d4ad7292c858dc2bb559de67f2d9\\\",\\\"｠\\\"],[\\\"8c810b8cbe6159e837a88575bb4e6033\\\",\\\"｠\\\"],[\\\"dc66317cd6fff4f4221069a20f321fce\\\",\\\"｠\\\"],[\\\"563e1633d226c10ef4ec80638997e4a9\\\",\\\"『\\\"],[\\\"0993d5cdf910f481eeefa19e4f09d77c\\\",\\\"『\\\"],[\\\"7b80a8345c16e2d4f8ff2691e245c2b1\\\",\\\"『\\\"],[\\\"016669fa94786f9581342d47f317c02c\\\",\\\"『\\\"],[\\\"01d3eb52ab29f0eecc62ff74224fffd4\\\",\\\"『\\\"],[\\\"089aa1d87915ef8ad3c43982ac657c8c\\\",\\\"『\\\"],[\\\"30e8cb69cda3ad84e87943c4351c24b7\\\",\\\"『\\\"],[\\\"385927959c2621acf57f8d40140924f8\\\",\\\"『\\\"],[\\\"2c256506f406bac4c214318f196ad5db\\\",\\\"『\\\"],[\\\"2d3912e10113e5c7bef33df3249af4a7\\\",\\\"『\\\"],[\\\"8b6444be18f269ac615643b26f9e3041\\\",\\\"『\\\"],[\\\"9c8c1ff659b439f73c65cf4766ab2f14\\\",\\\"『\\\"],[\\\"e4caa1628ad6878f14be986761e06aaa\\\",\\\"『\\\"],[\\\"e702912587801d73d58cdb30e48debed\\\",\\\"』\\\"],[\\\"d70bb2b097f44c1ddefb93bf92bbb5cd\\\",\\\"』\\\"],[\\\"f2b927267947a75b891403f95db72005\\\",\\\"』\\\"],[\\\"4ec38a1d8d22e4df6c359f00f7ad8662\\\",\\\"』\\\"],[\\\"55c9ea9aa8eb630e5ecb793b2f85c927\\\",\\\"』\\\"],[\\\"70376e1ea05a3438a19c062ad49a7960\\\",\\\"』\\\"],[\\\"8fe7cb78ca24d1973419eecf99252a88\\\",\\\"』\\\"],[\\\"9ee59c7d2c202e0214836a0138f59e24\\\",\\\"』\\\"],[\\\"b56aaf7fc68c5e206ccbc2ee1442b3af\\\",\\\"』\\\"],[\\\"ba37f6b56d8fc8980c8236de9894fa61\\\",\\\"』\\\"],[\\\"cc9fde9238a2bf78fd1c13f65b098e77\\\",\\\"』\\\"],[\\\"f02e3e84dcd71c5d3bab2b7b4b99bd7e\\\",\\\"』\\\"],[\\\"f686e0b742abe806fccbd4d9b3fcc4cd\\\",\\\"』\\\"],[\\\"37f6ecf37a0a3ef8dff083ccc8754f81\\\",\\\"♬\\\"],[\\\"3336f18e849144658f212bd9399bec5f\\\",\\\"♬\\\"],[\\\"93efdc18683d8ecacb0a920d5f2fffb3\\\",\\\"♬\\\"],[\\\"9b8325b71aa6a000d24f88c4d7ec730d\\\",\\\"♬\\\"],[\\\"ab791ef796e6b5d66f13ed9aea3e8ab2\\\",\\\"♬\\\"],[\\\"6eb29f1917caea1cadf94f5496a4c374\\\",\\\"↱\\\"],[\\\"583134b86e7d90960f64c5b863196978\\\",\\\"➡\\\"],[\\\"4ba716a88c003ca0a069392be3b63951\\\",\\\"➡\\\"],[\\\"4e0fbe47e3ba0fd5949bda53f11b16a5\\\",\\\"➡\\\"],[\\\"61ec226a927ee80fffa12db219a43233\\\",\\\"➡\\\"],[\\\"8e5b873ac8e1bf84246b281b3548c2ff\\\",\\\"↴\\\"],[\\\"a78d9b65f46654601ce0145622164b47\\\",\\\"↴\\\"],[\\\"5d01e6804b9aaec0c276f77306888c54\\\",\\\"↴\\\"],[\\\"6168af1e81b6497fccb6b8d3226a8016\\\",\\\"↴\\\"],[\\\"4360c0b7364802b680f5a65fa415bdd6\\\",\\\"↗\\\"],[\\\"4dab788480bb9ac50d2454b58438e407\\\",\\\"↗\\\"],[\\\"bfb2d58ab8c469d2b8b5c42d81e4e3b7\\\",\\\"↗\\\"],[\\\"4c503a0873195bfe8d71c9d55669781b\\\",\\\"→\\\"],[\\\"caf36eff2cf3580cd66c5cd021ee4c09\\\",\\\"→\\\"],[\\\"f00be20caf0aaef3a6fbec90a0e71852\\\",\\\"Ⅰ\\\"],[\\\"e660e1e23a6ddc9a5d2e0e1ef7ac5b86\\\",\\\"Ⅱ\\\"],[\\\"a62583f621fb5405add08e8f0beb6db4\\\",\\\"Ⅱ\\\"],[\\\"0e761ebb18b9870383725b3712f5c8d4\\\",\\\"Ⅱ\\\"],[\\\"1f65debfbf9df96de52c6f80922b012b\\\",\\\"Ⅱ\\\"],[\\\"5c13facf2da9f38922a9419061771ed0\\\",\\\"Ⅱ\\\"],[\\\"75a65cc3171c4c7ca0141042846ab91a\\\",\\\"Ⅱ\\\"],[\\\"eae94a6301787ff7bf77786ae4424601\\\",\\\"Ⅱ\\\"],[\\\"f1add7809e18e064e4609783211c9815\\\",\\\"Ⅲ\\\"],[\\\"a7ee6f7f63d348e2b8fb7ee9503f3c5c\\\",\\\"♡\\\"],[\\\"9c8cfb5e9349b06f0939605638896f4e\\\",\\\"♥\\\"],[\\\"45ce7d6d5c779136d32d3e60e13e10cd\\\",\\\"⅕\\\"],[\\\"51f5fe58aaf460263b766e990fdbe979\\\",\\\"⅕\\\"],[\\\"db40b0a65939e462396822d5ab3c6d9c\\\",\\\"⅕\\\"],[\\\"d9e3a48d5a7c6ba6f8db18f56cf91f92\\\",\\\"⅛\\\"],[\\\"86586bcdf8f14883f846849e93ca274c\\\",\\\"⅜\\\"],[\\\"9d81f46e134081d56bc92f69eebfabd9\\\",\\\"⅒\\\"],[\\\"18dddb04a4fe9b3f5c7b79e68fb8ab4b\\\",\\\"⅒\\\"],[\\\"eff8659a150859b7b69682a023b283c1\\\",\\\"⅒\\\"],[\\\"6e5ccf08b2bc815b0923df83cf9fafa1\\\",\\\"㎠\\\"],[\\\"8a77e56517a074d3d2ba426b84a07bf4\\\",\\\"㎠\\\"],[\\\"2c381a0eab014487d50f6f8bae8f0b71\\\",\\\"㎢\\\"],[\\\"9d1a36a1bec1cd2b0b0765f93c1e4f3c\\\",\\\"㎢\\\"],[\\\"e03eb00c54de790d8cc9997527fde905\\\",\\\"㎢\\\"],[\\\"3bce2a06a6a8557082543a6c90a42fe0\\\",\\\"〽\\\"],[\\\"4898c7d9fe3a8a6f9859b0e6f85a4327\\\",\\\"〽\\\"],[\\\"98ab18764756c8ca7608e17f562b21ce\\\",\\\"〽\\\"],[\\\"3037aad230d8cdae3df6e0ebedc0db79\\\",\\\"⁉\\\"],[\\\"66e3474e6cbd8e817ba0a1f8920bf4e7\\\",\\\"⁉\\\"],[\\\"4360dd96063ce1a9660cc8437e8238e3\\\",\\\"⁈\\\"],[\\\"6ce68b7e389c5169309ee956ed0c98a8\\\",\\\"⁈\\\"],[\\\"737a19289d25d963e255f3692ded6536\\\",\\\"⁈\\\"],[\\\"14b18199bbc3f4bf65b72e316bc41d3c\\\",\\\"！\\\"],[\\\"6bf58c146b692aeb403ed1f7618a060a\\\",\\\"！\\\"],[\\\"7f12b67caaf7c8c5075b444bb2a16c70\\\",\\\"！\\\"],[\\\"bfd55f4031ad80cb7401d65937b1d5d9\\\",\\\"〜\\\"],[\\\"4a61f6f7da9e6c8e373f4112cbd453cf\\\",\\\"〜\\\"],[\\\"882ded8f0bb4cdfa4ce28a0b64056d2a\\\",\\\"〜\\\"],[\\\"7726ffbf3a6e953affe6353c24ffb085\\\",\\\"〜\\\"],[\\\"0e290ec6542b5d52c972775e3d7cfeaf\\\",\\\"－\\\"],[\\\"420f1d27972d7cc83929307fbbb6dd50\\\",\\\"－\\\"],[\\\"4aa0e459273a2fe3012d7b3d2e14e07e\\\",\\\"－\\\"],[\\\"030b487ae68da1f4da98046f4fed390f\\\",\\\"一\\\"],[\\\"21699fa18fd14735a312512dfea2bff4\\\",\\\"一\\\"],[\\\"559fc240f4efe5a1e64714ce09217a3e\\\",\\\"一\\\"],[\\\"b7352c3f33a77bc9d3fbf693efbb8095\\\",\\\"一\\\"],[\\\"fcdb30a244fb6aad5255ee2d32fdf7fc\\\",\\\"一\\\"],[\\\"15a0a0fb33aacd4ce730a9503c46df5f\\\",\\\"㊙\\\"],[\\\"9dad4982bd65fbf21525261a7efdf669\\\",\\\"㊙\\\"],[\\\"c3e68e6d08d5429e28ffd6592acf4519\\\",\\\"ゔ\\\"],[\\\"f022cfe594d6f6930d7a5b994e1a0b71\\\",\\\"凜\\\"],[\\\"407057c7b7b1a91d058d572d9a9d3aa5\\\",\\\"凜\\\"],[\\\"fc85b0622183795f89111219dfbc6281\\\",\\\"凜\\\"],[\\\"9707099e5828d97eb12ff2e6ba438558\\\",\\\"凜\\\"],[\\\"987c829b62eb31f467165827766c410d\\\",\\\"凜\\\"],[\\\"58371bb195aaa7a468c5c508351ac383\\\",\\\"凜\\\"],[\\\"32324012ed7274a15002b66ed1e464f8\\\",\\\"蜻\\\"],[\\\"0ffb731db8d4a6b711f97bbb08ed8819\\\",\\\"蜻\\\"],[\\\"d90aae9a752e9b61662a9cafa837961f\\\",\\\"祓\\\"],[\\\"23d6c6f231ac5d51f4cdaaaa26701956\\\",\\\"祓\\\"],[\\\"81cbedabd8f88d4494255b0631820dfd\\\",\\\"祓\\\"],[\\\"4185f93a5571e49433ca9c13ae588f96\\\",\\\"魎\\\"],[\\\"9ab74d6e8bda8723614017a7fce587fe\\\",\\\"魎\\\"],[\\\"e96a39a050b694e5f8aadb111420b698\\\",\\\"𠮷\\\"],[\\\"08c5eb5fac4f1d362b946689eb2e4edf\\\",\\\"𠮷\\\"],[\\\"2cef7e443c22f5835658e67749ae52d1\\\",\\\"𠮷\\\"],[\\\"4ab0dd1578c8c5fa25f45938ff0f8575\\\",\\\"𠮷\\\"],[\\\"4c392bb90a1f62796f8fba2c19b4a7de\\\",\\\"𠮷\\\"],[\\\"43856fd7c04a779e571fe24c47f02a6c\\\",\\\"髙\\\"],[\\\"265efc2a174c73ea229f9ffefa703f32\\\",\\\"髙\\\"],[\\\"5a7af09cce6b3005355e1c6c82df8858\\\",\\\"髙\\\"],[\\\"808e9b858294184933f8bf45d6291572\\\",\\\"髙\\\"],[\\\"27f0c69a76bf571d6dc25db389d20779\\\",\\\"髙\\\"],[\\\"46fb250f60436fd5f33808343893ca12\\\",\\\"髙\\\"],[\\\"8a8c4c67a6094d4dc6039e5fe931159c\\\",\\\"髙\\\"],[\\\"9257f3792fcfcd21b85524d5f86f624e\\\",\\\"髙\\\"],[\\\"d502a276d6f311449597ee9e576d9217\\\",\\\"髙\\\"],[\\\"eaa49075e50fbe1fa4b7f593dfd95620\\\",\\\"髙\\\"],[\\\"c01d2bafce469da1abbb612fdb16c1e3\\\",\\\"元\\\"],[\\\"e1ce03321fdb4eaca026a49a43e521a5\\\",\\\"元\\\"],[\\\"0cfa6c95283a90eff3733db1ac80f58a\\\",\\\"元\\\"],[\\\"52c1ad5b834821dc6b85ec27bdea1f76\\\",\\\"元\\\"],[\\\"ad088cffd260c1fccb655cae17b14803\\\",\\\"元\\\"],[\\\"a9ee52eaa5b4cc32d1891d540bfe93cc\\\",\\\"塚\\\"],[\\\"a00182f1de36aaee28cac80a3c89d067\\\",\\\"塚\\\"],[\\\"b03d44ca831a0c995116056ce23f82c5\\\",\\\"塚\\\"],[\\\"2d6b7d3b5ca6c02d94c5b48661045b7a\\\",\\\"﨑\\\"],[\\\"f5c6e02e235abd23a87f48ed6a64cdcc\\\",\\\"﨑\\\"],[\\\"e9a3b055bda7b9ae70bde4003a4c5885\\\",\\\"﨑\\\"],[\\\"cb17df533b4ebd698a038defeddecf8a\\\",\\\"﨑\\\"],[\\\"0ea39c05c35f96d5b5a48e9815974132\\\",\\\"﨑\\\"],[\\\"3f642f3778827e651c8b82a4e9f06fd3\\\",\\\"﨑\\\"],[\\\"447d8358f482a4e1d9495902ebe269b1\\\",\\\"﨑\\\"],[\\\"ca59a20f1e0ee55b74db34697f961385\\\",\\\"﨑\\\"],[\\\"d2eae5651260b39c4239bcf00c8a76c5\\\",\\\"﨑\\\"],[\\\"f55eb365a9ded45d1e620f83d9f9de26\\\",\\\"﨑\\\"],[\\\"2b385c2642704e44347f2f4db147c8fa\\\",\\\"葛\\\"],[\\\"5c3a8c3a891386a771ff8f00a239b4ba\\\",\\\"葛\\\"],[\\\"e8caa78518e2d690af54e2206c9538f8\\\",\\\"彅\\\"],[\\\"2e8659ae5e220240c5f8a97147d09df6\\\",\\\"彅\\\"],[\\\"7592e633260537c1dfa7e5af1000752a\\\",\\\"彅\\\"],[\\\"a57d3f7684c28d2a901fe6020145de32\\\",\\\"彅\\\"],[\\\"da3ab2d5da4d69c7d312c7d819e45856\\\",\\\"彅\\\"],[\\\"918e84ed41c2157aa5f5bbf9aa60514c\\\",\\\"塡\\\"],[\\\"b1e889986beb3a6518d8c2ea53547b7c\\\",\\\"塡\\\"],[\\\"d449ab392afa98c27eb817c40e2eb7ce\\\",\\\"塡\\\"],[\\\"e7158075f2976c353e4cf9247aae3abc\\\",\\\"遁\\\"],[\\\"f1a6fbb17f041cc15148163da34f541f\\\",\\\"遁\\\"],[\\\"a1779a3aaf215916fd0d8fbbb5bf5925\\\",\\\"蟬\\\"],[\\\"a3c09b57be535c0f5618d72f95884c50\\\",\\\"蟬\\\"],[\\\"4b9401a9f9a58c7d0f9c86120aa2dd23\\\",\\\"鏢\\\"],[\\\"fe00b640a48dd341573cafa94afeafa2\\\",\\\"鏢\\\"],[\\\"f4e1d8b42e3c49ea7c896049186d74bd\\\",\\\"蟜\\\"],[\\\"640130a634bd2a0f4347f933a8c5d6d6\\\",\\\"蟜\\\"],[\\\"62985aeebaec69314f03ff9d3080ada2\\\",\\\"鷗\\\"],[\\\"1bd027207977c585c5889a1e24cae94e\\\",\\\"鷗\\\"],[\\\"5c8022286d3bc941c12e9bbc475255dd\\\",\\\"鷗\\\"],[\\\"e4a837fe20dfa091e03afe4857e2482e\\\",\\\"剝\\\"],[\\\"bf2cccb40b985fe3af04281944beac1a\\\",\\\"剝\\\"],[\\\"d5451a035c4e516e5ccb9372cd533d81\\\",\\\"剝\\\"],[\\\"e13ae32f28d840df74a88432df9b122e\\\",\\\"剝\\\"],[\\\"41637d181cd99088e2120a4ec6fc18aa\\\",\\\"嬴\\\"],[\\\"de63abb1aaa44e6ab8a11470103377d5\\\",\\\"嬴\\\"],[\\\"3d32b12254e01c701c195412cb8ef37c\\\",\\\"嬴\\\"],[\\\"f67bc6318ccf43e7902df9a6f9622932\\\",\\\"嬴\\\"],[\\\"d4ce6847d78fc2f8241088b5c0be795c\\\",\\\"嬴\\\"],[\\\"c472e6ade04610e67904aca1b1fa1468\\\",\\\"麃\\\"],[\\\"db3d060943fbf888eb2fa7fd87340cba\\\",\\\"麃\\\"],[\\\"509cff0edcba46d5db30b2f2f45c49c9\\\",\\\"瘣\\\"],[\\\"4862270872e35184aab420c4d38169ad\\\",\\\"瘣\\\"],[\\\"def4d364d00d0f78577987eaebd42aef\\\",\\\"齕\\\"],[\\\"3cc113a87b49ce231a7b2ffbca4c1e18\\\",\\\"齕\\\"],[\\\"03dddff25be65f7c284ef8addb8a0a8b\\\",\\\"驁\\\"],[\\\"52aa815a5a57aff03085d31acd5afbc4\\\",\\\"驁\\\"],[\\\"4f0431c4c63a6a362646758e62521df8\\\",\\\"煖\\\"],[\\\"dbf1ab17c746c48d474b3730064ba6f2\\\",\\\"煖\\\"],[\\\"790c6b4da6a88f7f4fdb6fdab77fe045\\\",\\\"煖\\\"],[\\\"4d7ae77f2bbf9c8af03d49d466f74058\\\",\\\"煖\\\"],[\\\"0335ba124be8a9e0c501f4051ac5fcf5\\\",\\\"龐\\\"],[\\\"01d7892b430fd4362c8917ad921199b2\\\",\\\"龐\\\"],[\\\"e866fd7e605c8b7c8bf718c45a5438cf\\\",\\\"龐\\\"],[\\\"5df7d88e1e15018b3bce73e765ef72d6\\\",\\\"槌\\\"],[\\\"48478e1f69ea50c6f7709d47f15b4007\\\",\\\"槌\\\"],[\\\"4d7d276f23c92f94056b292e295ebd78\\\",\\\"神\\\"],[\\\"87d2b97034cf680cd86bc7fe7c500d93\\\",\\\"神\\\"],[\\\"f6300abbfcd6bd0db3abd41041499aaa\\\",\\\"邂\\\"],[\\\"26c476496eb73e15285527ab7c635f0b\\\",\\\"邂\\\"],[\\\"be33b9008a58bab485e17de9b2ab2626\\\",\\\"逅\\\"],[\\\"3a9b8b576fe8efca2dedc957732afa37\\\",\\\"逅\\\"],[\\\"b798637262a0c1a29c8de602d4b688c6\\\",\\\"逅\\\"],[\\\"a3785fd94f13646623554b180d08ac77\\\",\\\"德\\\"],[\\\"1f81885b0996be70410e5aa3e4aab3c6\\\",\\\"德\\\"],[\\\"88425dfcbd96fcb6d77ebb76f834d986\\\",\\\"德\\\"],[\\\"9f993f913cd0614a3a965d74e0f4c8d1\\\",\\\"德\\\"],[\\\"a8bb5f2f83d975edfc951a1e461befdc\\\",\\\"德\\\"],[\\\"cd2eadbb87d0aadf1d1cd71fed0ab02f\\\",\\\"德\\\"],[\\\"d22feeb00ace0a632e1a780682f937e8\\\",\\\"德\\\"],[\\\"c9f2fda15b722253c625aebe73f4b1d9\\\",\\\"辻\\\"],[\\\"04556b37bff1ccc2f3b395232e104934\\\",\\\"辻\\\"],[\\\"117bacaeb67e3508d23a650b98f3c143\\\",\\\"辻\\\"],[\\\"211d70374c1787c4bc62df15794a4692\\\",\\\"辻\\\"],[\\\"7ba50856c59d1de19cc9c88caaced915\\\",\\\"辻\\\"],[\\\"0d627ebf7693b13645336a88813fb7e3\\\",\\\"祀\\\"],[\\\"2c3c032660b20a485575c2d8c7d47956\\\",\\\"祀\\\"],[\\\"1aaec04e53f2978bdf0a127c01b34e9a\\\",\\\"遼\\\"],[\\\"e2c3bf09b755b0d59a8a25cba6dda273\\\",\\\"遼\\\"],[\\\"fb13879ba2f93a8b0a28b2cd5358d1ee\\\",\\\"遼\\\"],[\\\"20eff1fff8d986496b949efa604ec402\\\",\\\"誾\\\"],[\\\"8742940fcbdbd65aeff1566c1889ece7\\\",\\\"誾\\\"],[\\\"23e6ef0ecc7bbe8e9465b0b40e901c0d\\\",\\\"厓\\\"],[\\\"5a69785acb47d746fd1ae98bd511db81\\\",\\\"厓\\\"],[\\\"392b8afa18046fc06398b32a42641889\\\",\\\"你\\\"],[\\\"7ff2c821d31ef0ca7e9c430f3e659d46\\\",\\\"你\\\"],[\\\"44d8b7aacbfc1fc4c32d6526ab8012ee\\\",\\\"祠\\\"],[\\\"c9486b883ab870fc02e7a1f189454f49\\\",\\\"祠\\\"],[\\\"62e7447a02f797cf287a7a758d66563b\\\",\\\"擲\\\"],[\\\"7d767d2518431dd61e631941dea6bb5e\\\",\\\"擲\\\"],[\\\"914fa35485d5016adc8b799b0cb5e978\\\",\\\"口\\\"],[\\\"d50802fc331261feed1a140f3b70c4b3\\\",\\\"口\\\"],[\\\"eeff4833bdfc34b1cbfe6a9d98f38cb5\\\",\\\"口\\\"],[\\\"a6d6aaeaf5505676111390a52fa6be51\\\",\\\"暲\\\"],[\\\"bc534a1accc68d8876e9d47ad8d4b489\\\",\\\"暲\\\"],[\\\"b5e8cb114ccad281bcb4d86768d509df\\\",\\\"銈\\\"],[\\\"d2c0ab0242ae4ad8a08bffa71613a1a7\\\",\\\"銈\\\"],[\\\"f09031463933b2892be7ebbc501269d0\\\",\\\"蕙\\\"],[\\\"f1378529fe66a7f655031d7f5b8c4eb5\\\",\\\"蕙\\\"],[\\\"6b696a5ae7634c454aaa7dd833fdfaf9\\\",\\\"眷\\\"],[\\\"5012d099f110e5e7c0df78528686ae07\\\",\\\"榮\\\"],[\\\"bf27e95238dd789b05e38d56dc41cbf7\\\",\\\"嵓\\\"],[\\\"1d2eafa6be36dc6152cb1917cd2ac486\\\",\\\"氏\\\"],[\\\"8b1bd5636f709dfd6a95da9f463729c3\\\",\\\"柀\\\"],[\\\"0b49a77f459cf3783c5bac37a80518c5\\\",\\\"份\\\"],[\\\"8d1ba0e24b619cb4d377ddb7adb3e6fa\\\",\\\"喼\\\"],[\\\"dab4c329f3c540192f758a2e0008d275\\\",\\\"鎚\\\"],[\\\"5b6c90ad3012bfbbc2450b5ab930484d\\\",\\\"翟\\\"],[\\\"7eb78d5654f8335d0b1cf4cf78872097\\\",\\\"鄭\\\"],[\\\"c3852ea003683f2866abd56140fb5d84\\\",\\\"錆\\\"],[\\\"a78b8a79d8a32c925776c82955d168cc\\\",\\\"郭\\\"],[\\\"b6e773b060fdd575bc965369d509f4e0\\\",\\\"煉\\\"],[\\\"6d981a3b846347e2b3c9ca4d13794834\\\",\\\"桒\\\"],[\\\"d0ed8ffbc229f84dd796cdd6de36d2e4\\\",\\\"䃯\\\"],[\\\"d9aff359058ab474d552ce52e5a71ec8\\\",\\\"卿\\\"],[\\\"5417381484172c1607d7ca60765b62d2\\\",\\\"蝕\\\"],[\\\"b309cd2c649ce3ef6ea0ad2f5fc655cc\\\",\\\"這\\\"],[\\\"2a349ac3d6b94a8a64d904083fdd5c02\\\",\\\"辿\\\"],[\\\"0632283bfd909ef205b1f950e2b00f16\\\",\\\"靑\\\"],[\\\"d91c5a40619510b21610f523f9434269\\\",\\\"淸\\\"],[\\\"8dc47c6e65beb788da7ed9efd59f0934\\\",\\\"買\\\"],[\\\"e28d4c57d97fbe4a0d67aec2cc92e7c8\\\",\\\"捥\\\"],[\\\"9374173a2e4b7f1dcac75eccd5ee7e7f\\\",\\\"榊\\\"]]),b=(i(1415),new Set([\\\"⛌\\\",\\\"⛍\\\",\\\"❗\\\",\\\"⛏\\\",\\\"⛐\\\",\\\"⛑\\\",\\\"⛒\\\",\\\"⛕\\\",\\\"⛓\\\",\\\"⛔\\\",\\\"\\\",\\\"\\\",\\\"⛖\\\",\\\"⛗\\\",\\\"⛘\\\",\\\"⛙\\\",\\\"⛚\\\",\\\"⛛\\\",\\\"⛜\\\",\\\"⛝\\\",\\\"⛞\\\",\\\"⛟\\\",\\\"⛠\\\",\\\"⛡\\\",\\\"⭕\\\",\\\"㉈\\\",\\\"㉉\\\",\\\"㉊\\\",\\\"㉋\\\",\\\"㉌\\\",\\\"㉍\\\",\\\"㉎\\\",\\\"㉏\\\",\\\"⒑\\\",\\\"⒒\\\",\\\"⒓\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⬛\\\",\\\"⬤\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⚿\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㊙\\\",\\\"\\\",\\\"⛣\\\",\\\"⭖\\\",\\\"⭗\\\",\\\"⭘\\\",\\\"⭙\\\",\\\"☓\\\",\\\"㊋\\\",\\\"〒\\\",\\\"⛨\\\",\\\"㉆\\\",\\\"㉅\\\",\\\"⛩\\\",\\\"࿖\\\",\\\"⛪\\\",\\\"⛫\\\",\\\"⛬\\\",\\\"♨\\\",\\\"⛭\\\",\\\"⛮\\\",\\\"⛯\\\",\\\"⚓\\\",\\\"✈\\\",\\\"⛰\\\",\\\"⛱\\\",\\\"⛲\\\",\\\"⛳\\\",\\\"⛴\\\",\\\"⛵\\\",\\\"\\\",\\\"Ⓓ\\\",\\\"Ⓢ\\\",\\\"⛶\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"⛷\\\",\\\"⛸\\\",\\\"⛹\\\",\\\"⛺\\\",\\\"\\\",\\\"☎\\\",\\\"⛻\\\",\\\"⛼\\\",\\\"⛽\\\",\\\"⛾\\\",\\\"\\\",\\\"⛿\\\",\\\"➡\\\",\\\"⬅\\\",\\\"⬆\\\",\\\"⬇\\\",\\\"⬯\\\",\\\"⬮\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㎡\\\",\\\"㎥\\\",\\\"㎝\\\",\\\"㎠\\\",\\\"㎤\\\",\\\"\\\",\\\"⒈\\\",\\\"⒉\\\",\\\"⒊\\\",\\\"⒋\\\",\\\"⒌\\\",\\\"⒍\\\",\\\"⒎\\\",\\\"⒏\\\",\\\"⒐\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㈳\\\",\\\"㈶\\\",\\\"㈲\\\",\\\"㈱\\\",\\\"㈹\\\",\\\"㉄\\\",\\\"▶\\\",\\\"◀\\\",\\\"〖\\\",\\\"〗\\\",\\\"⟐\\\",\\\"²\\\",\\\"³\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㉇\\\",\\\"\\\",\\\"\\\",\\\"℻\\\",\\\"㈪\\\",\\\"㈫\\\",\\\"㈬\\\",\\\"㈭\\\",\\\"㈮\\\",\\\"㈯\\\",\\\"㈰\\\",\\\"㈷\\\",\\\"㍾\\\",\\\"㍽\\\",\\\"㍼\\\",\\\"㍻\\\",\\\"№\\\",\\\"℡\\\",\\\"〶\\\",\\\"⚾\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"ℓ\\\",\\\"㎏\\\",\\\"㎐\\\",\\\"㏊\\\",\\\"㎞\\\",\\\"㎢\\\",\\\"㍱\\\",\\\"½\\\",\\\"↉\\\",\\\"⅓\\\",\\\"⅔\\\",\\\"¼\\\",\\\"¾\\\",\\\"⅕\\\",\\\"⅖\\\",\\\"⅗\\\",\\\"⅘\\\",\\\"⅙\\\",\\\"⅚\\\",\\\"⅐\\\",\\\"⅛\\\",\\\"⅑\\\",\\\"⅒\\\",\\\"☀\\\",\\\"☁\\\",\\\"☂\\\",\\\"⛄\\\",\\\"☖\\\",\\\"☗\\\",\\\"⛉\\\",\\\"⛊\\\",\\\"♦\\\",\\\"♥\\\",\\\"♣\\\",\\\"♠\\\",\\\"⛋\\\",\\\"⨀\\\",\\\"‼\\\",\\\"⁉\\\",\\\"⛅\\\",\\\"☔\\\",\\\"⛆\\\",\\\"☃\\\",\\\"⛇\\\",\\\"⚡\\\",\\\"⛈\\\",\\\"⚞\\\",\\\"⚟\\\",\\\"♬\\\",\\\"\\\",\\\"Ⅰ\\\",\\\"Ⅱ\\\",\\\"Ⅲ\\\",\\\"Ⅳ\\\",\\\"Ⅴ\\\",\\\"Ⅵ\\\",\\\"Ⅶ\\\",\\\"Ⅷ\\\",\\\"Ⅸ\\\",\\\"Ⅹ\\\",\\\"Ⅺ\\\",\\\"Ⅻ\\\",\\\"⑰\\\",\\\"⑱\\\",\\\"⑲\\\",\\\"⑳\\\",\\\"⑴\\\",\\\"⑵\\\",\\\"⑶\\\",\\\"⑷\\\",\\\"⑸\\\",\\\"⑹\\\",\\\"⑺\\\",\\\"⑻\\\",\\\"⑼\\\",\\\"⑽\\\",\\\"⑾\\\",\\\"⑿\\\",\\\"㉑\\\",\\\"㉒\\\",\\\"㉓\\\",\\\"㉔\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"㉕\\\",\\\"㉖\\\",\\\"㉗\\\",\\\"㉘\\\",\\\"㉙\\\",\\\"㉚\\\",\\\"①\\\",\\\"②\\\",\\\"③\\\",\\\"④\\\",\\\"⑤\\\",\\\"⑥\\\",\\\"⑦\\\",\\\"⑧\\\",\\\"⑨\\\",\\\"⑩\\\",\\\"⑪\\\",\\\"⑫\\\",\\\"⑬\\\",\\\"⑭\\\",\\\"⑮\\\",\\\"⑯\\\",\\\"❶\\\",\\\"❷\\\",\\\"❸\\\",\\\"❹\\\",\\\"❺\\\",\\\"❻\\\",\\\"❼\\\",\\\"❽\\\",\\\"❾\\\",\\\"❿\\\",\\\"⓫\\\",\\\"⓬\\\",\\\"㉛\\\",\\\"☎\\\",\\\"⛌\\\",\\\"⛍\\\",\\\"❗\\\",\\\"⛏\\\",\\\"⛐\\\",\\\"⛑\\\",\\\"⛒\\\",\\\"⛕\\\",\\\"⛓\\\",\\\"⛔\\\",\\\"🅿\\\",\\\"🆊\\\",\\\"⛖\\\",\\\"⛗\\\",\\\"⛘\\\",\\\"⛙\\\",\\\"⛚\\\",\\\"⛛\\\",\\\"⛜\\\",\\\"⛝\\\",\\\"⛞\\\",\\\"⛟\\\",\\\"⛠\\\",\\\"⛡\\\",\\\"⭕\\\",\\\"㉈\\\",\\\"㉉\\\",\\\"㉊\\\",\\\"㉋\\\",\\\"㉌\\\",\\\"㉍\\\",\\\"㉎\\\",\\\"㉏\\\",\\\"⒑\\\",\\\"⒒\\\",\\\"⒓\\\",\\\"🅊\\\",\\\"🅌\\\",\\\"🄿\\\",\\\"🅆\\\",\\\"🅋\\\",\\\"🈐\\\",\\\"🈑\\\",\\\"🈒\\\",\\\"🈓\\\",\\\"🅂\\\",\\\"🈔\\\",\\\"🈕\\\",\\\"🈖\\\",\\\"🅍\\\",\\\"🄱\\\",\\\"🄽\\\",\\\"⬛\\\",\\\"⬤\\\",\\\"🈗\\\",\\\"🈘\\\",\\\"🈙\\\",\\\"🈚\\\",\\\"🈛\\\",\\\"⚿\\\",\\\"🈜\\\",\\\"🈝\\\",\\\"🈞\\\",\\\"🈟\\\",\\\"🈠\\\",\\\"🈡\\\",\\\"🈢\\\",\\\"🈣\\\",\\\"🈤\\\",\\\"🈥\\\",\\\"🅎\\\",\\\"㊙\\\",\\\"🈀\\\",\\\"⛣\\\",\\\"⭖\\\",\\\"⭗\\\",\\\"⭘\\\",\\\"⭙\\\",\\\"☓\\\",\\\"㊋\\\",\\\"⛨\\\",\\\"㉆\\\",\\\"㉅\\\",\\\"⛩\\\",\\\"࿖\\\",\\\"⛪\\\",\\\"⛫\\\",\\\"⛬\\\",\\\"⛭\\\",\\\"⛮\\\",\\\"⛯\\\",\\\"⚓\\\",\\\"✈\\\",\\\"⛰\\\",\\\"⛱\\\",\\\"⛲\\\",\\\"⛳\\\",\\\"⛴\\\",\\\"⛵\\\",\\\"🅗\\\",\\\"Ⓓ\\\",\\\"Ⓢ\\\",\\\"⛶\\\",\\\"🅟\\\",\\\"🆋\\\",\\\"🆍\\\",\\\"🆌\\\",\\\"🅹\\\",\\\"⛷\\\",\\\"⛸\\\",\\\"⛹\\\",\\\"⛺\\\",\\\"🅻\\\",\\\"⛻\\\",\\\"⛼\\\",\\\"⛽\\\",\\\"⛾\\\",\\\"🅼\\\",\\\"⛿\\\",\\\"➡\\\",\\\"⬅\\\",\\\"⬆\\\",\\\"⬇\\\",\\\"⬯\\\",\\\"⬮\\\",\\\"㎥\\\",\\\"㎠\\\",\\\"㎤\\\",\\\"🄀\\\",\\\"⒈\\\",\\\"⒉\\\",\\\"⒊\\\",\\\"⒋\\\",\\\"⒌\\\",\\\"⒍\\\",\\\"⒎\\\",\\\"⒏\\\",\\\"⒐\\\",\\\"🄁\\\",\\\"🄂\\\",\\\"🄃\\\",\\\"🄄\\\",\\\"🄅\\\",\\\"🄆\\\",\\\"🄇\\\",\\\"🄈\\\",\\\"🄉\\\",\\\"🄊\\\",\\\"㈳\\\",\\\"㈶\\\",\\\"㉄\\\",\\\"⟐\\\",\\\"🄭\\\",\\\"🄬\\\",\\\"🄫\\\",\\\"㉇\\\",\\\"🆐\\\",\\\"🈦\\\",\\\"℻\\\",\\\"㈪\\\",\\\"㈫\\\",\\\"㈬\\\",\\\"㈭\\\",\\\"㈮\\\",\\\"㈯\\\",\\\"㈰\\\",\\\"㈷\\\",\\\"〶\\\",\\\"⚾\\\",\\\"🉀\\\",\\\"🉁\\\",\\\"🉂\\\",\\\"🉃\\\",\\\"🉄\\\",\\\"🉅\\\",\\\"🉆\\\",\\\"🉇\\\",\\\"🉈\\\",\\\"🄪\\\",\\\"🈧\\\",\\\"🈨\\\",\\\"🈩\\\",\\\"🈔\\\",\\\"🈪\\\",\\\"🈫\\\",\\\"🈬\\\",\\\"🈭\\\",\\\"🈮\\\",\\\"🈯\\\",\\\"🈰\\\",\\\"🈱\\\",\\\"㎐\\\",\\\"㏊\\\",\\\"㎢\\\",\\\"㍱\\\",\\\"↉\\\",\\\"⅖\\\",\\\"⅗\\\",\\\"⅘\\\",\\\"⅙\\\",\\\"⅚\\\",\\\"⅐\\\",\\\"⅛\\\",\\\"⅑\\\",\\\"⅒\\\",\\\"⛄\\\",\\\"⛉\\\",\\\"⛊\\\",\\\"⛋\\\",\\\"⨀\\\",\\\"⛅\\\",\\\"☔\\\",\\\"⛆\\\",\\\"⛇\\\",\\\"⚡\\\",\\\"⛈\\\",\\\"⚞\\\",\\\"⚟\\\",\\\"⑴\\\",\\\"⑵\\\",\\\"⑶\\\",\\\"⑷\\\",\\\"⑸\\\",\\\"⑹\\\",\\\"⑺\\\",\\\"⑻\\\",\\\"⑼\\\",\\\"⑽\\\",\\\"⑾\\\",\\\"⑿\\\",\\\"🄐\\\",\\\"🄑\\\",\\\"🄒\\\",\\\"🄓\\\",\\\"🄔\\\",\\\"🄕\\\",\\\"🄖\\\",\\\"🄗\\\",\\\"🄘\\\",\\\"🄙\\\",\\\"🄚\\\",\\\"🄛\\\",\\\"🄜\\\",\\\"🄝\\\",\\\"🄞\\\",\\\"🄟\\\",\\\"🄠\\\",\\\"🄡\\\",\\\"🄢\\\",\\\"🄣\\\",\\\"🄤\\\",\\\"🄥\\\",\\\"🄦\\\",\\\"🄧\\\",\\\"🄨\\\",\\\"🄩\\\"])),g=[0,4129,8258,12387,16516,20645,24774,28903,33032,37161,41290,45419,49548,53677,57806,61935,4657,528,12915,8786,21173,17044,29431,25302,37689,33560,45947,41818,54205,50076,62463,58334,9314,13379,1056,5121,25830,29895,17572,21637,42346,46411,34088,38153,58862,62927,50604,54669,13907,9842,5649,1584,30423,26358,22165,18100,46939,42874,38681,34616,63455,59390,55197,51132,18628,22757,26758,30887,2112,6241,10242,14371,51660,55789,59790,63919,35144,39273,43274,47403,23285,19156,31415,27286,6769,2640,14899,10770,56317,52188,64447,60318,39801,35672,47931,43802,27814,31879,19684,23749,11298,15363,3168,7233,60846,64911,52716,56781,44330,48395,36200,40265,32407,28342,24277,20212,15891,11826,7761,3696,65439,61374,57309,53244,48923,44858,40793,36728,37256,33193,45514,41451,53516,49453,61774,57711,4224,161,12482,8419,20484,16421,28742,24679,33721,37784,41979,46042,49981,54044,58239,62302,689,4752,8947,13010,16949,21012,25207,29270,46570,42443,38312,34185,62830,58703,54572,50445,13538,9411,5280,1153,29798,25671,21540,17413,42971,47098,34713,38840,59231,63358,50973,55100,9939,14066,1681,5808,26199,30326,17941,22068,55628,51565,63758,59695,39368,35305,47498,43435,22596,18533,30726,26663,6336,2273,14466,10403,52093,56156,60223,64286,35833,39896,43963,48026,19061,23124,27191,31254,2801,6864,10931,14994,64814,60687,56684,52557,48554,44427,40424,36297,31782,27655,23652,19525,15522,11395,7392,3265,61215,65342,53085,57212,44955,49082,36825,40952,28183,32310,20053,24180,11923,16050,3793,7920],y=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2?arguments[2]:void 0;null==i&&(i=t.length);for(var r=0,n=e;n<i;n++)r=65535&(r<<8^g[255&(r>>8^t[n])]);return r},m=function(t,e,i,r,n,s,a,o){return 0|((h=e+t(i,r,n)+s+a|0)<<(c=o)|h>>>32-c)+i;var h,c},_=function(t,e,i){return t&e|~t&i},w=function(t,e,i){return t&i|e&~i},x=function(t,e,i){return t^e^i},A=function(t,e,i){return e^(t|~i)},C=function(t){var e=15&t;return\\\"\\\".concat(((240&t)>>4).toString(16)).concat(e.toString(16))},T=function(t){var e=64*Math.floor((t.byteLength+8)/64+1),i=new Uint8Array(e);i.set(new Uint8Array(t),0);var r=new DataView(i.buffer);r.setUint8(t.byteLength,128),r.setUint32(e-8,8*t.byteLength%Math.pow(2,32),!0),r.setUint32(e-4,8*t.byteLength/Math.pow(2,32),!0);for(var n=1732584193,s=-271733879,a=-1732584194,o=271733878,h=0;h<e;h+=64){var c=n,u=s,l=a,f=o;n=m(_,n,s,a,o,r.getUint32(h+0,!0),3614090360,7),o=m(_,o,n,s,a,r.getUint32(h+4,!0),3905402710,12),a=m(_,a,o,n,s,r.getUint32(h+8,!0),606105819,17),s=m(_,s,a,o,n,r.getUint32(h+12,!0),3250441966,22),n=m(_,n,s,a,o,r.getUint32(h+16,!0),4118548399,7),o=m(_,o,n,s,a,r.getUint32(h+20,!0),1200080426,12),a=m(_,a,o,n,s,r.getUint32(h+24,!0),2821735955,17),s=m(_,s,a,o,n,r.getUint32(h+28,!0),4249261313,22),n=m(_,n,s,a,o,r.getUint32(h+32,!0),1770035416,7),o=m(_,o,n,s,a,r.getUint32(h+36,!0),2336552879,12),a=m(_,a,o,n,s,r.getUint32(h+40,!0),4294925233,17),s=m(_,s,a,o,n,r.getUint32(h+44,!0),2304563134,22),n=m(_,n,s,a,o,r.getUint32(h+48,!0),1804603682,7),o=m(_,o,n,s,a,r.getUint32(h+52,!0),4254626195,12),a=m(_,a,o,n,s,r.getUint32(h+56,!0),2792965006,17),s=m(_,s,a,o,n,r.getUint32(h+60,!0),1236535329,22),n=m(w,n,s,a,o,r.getUint32(h+4,!0),4129170786,5),o=m(w,o,n,s,a,r.getUint32(h+24,!0),3225465664,9),a=m(w,a,o,n,s,r.getUint32(h+44,!0),643717713,14),s=m(w,s,a,o,n,r.getUint32(h+0,!0),3921069994,20),n=m(w,n,s,a,o,r.getUint32(h+20,!0),3593408605,5),o=m(w,o,n,s,a,r.getUint32(h+40,!0),38016083,9),a=m(w,a,o,n,s,r.getUint32(h+60,!0),3634488961,14),s=m(w,s,a,o,n,r.getUint32(h+16,!0),3889429448,20),n=m(w,n,s,a,o,r.getUint32(h+36,!0),568446438,5),o=m(w,o,n,s,a,r.getUint32(h+56,!0),3275163606,9),a=m(w,a,o,n,s,r.getUint32(h+12,!0),4107603335,14),s=m(w,s,a,o,n,r.getUint32(h+32,!0),1163531501,20),n=m(w,n,s,a,o,r.getUint32(h+52,!0),2850285829,5),o=m(w,o,n,s,a,r.getUint32(h+8,!0),4243563512,9),a=m(w,a,o,n,s,r.getUint32(h+28,!0),1735328473,14),s=m(w,s,a,o,n,r.getUint32(h+48,!0),2368359562,20),n=m(x,n,s,a,o,r.getUint32(h+20,!0),4294588738,4),o=m(x,o,n,s,a,r.getUint32(h+32,!0),2272392833,11),a=m(x,a,o,n,s,r.getUint32(h+44,!0),1839030562,16),s=m(x,s,a,o,n,r.getUint32(h+56,!0),4259657740,23),n=m(x,n,s,a,o,r.getUint32(h+4,!0),2763975236,4),o=m(x,o,n,s,a,r.getUint32(h+16,!0),1272893353,11),a=m(x,a,o,n,s,r.getUint32(h+28,!0),4139469664,16),s=m(x,s,a,o,n,r.getUint32(h+40,!0),3200236656,23),n=m(x,n,s,a,o,r.getUint32(h+52,!0),681279174,4),o=m(x,o,n,s,a,r.getUint32(h+0,!0),3936430074,11),a=m(x,a,o,n,s,r.getUint32(h+12,!0),3572445317,16),s=m(x,s,a,o,n,r.getUint32(h+24,!0),76029189,23),n=m(x,n,s,a,o,r.getUint32(h+36,!0),3654602809,4),o=m(x,o,n,s,a,r.getUint32(h+48,!0),3873151461,11),a=m(x,a,o,n,s,r.getUint32(h+60,!0),530742520,16),s=m(x,s,a,o,n,r.getUint32(h+8,!0),3299628645,23),n=m(A,n,s,a,o,r.getUint32(h+0,!0),4096336452,6),o=m(A,o,n,s,a,r.getUint32(h+28,!0),1126891415,10),a=m(A,a,o,n,s,r.getUint32(h+56,!0),2878612391,15),s=m(A,s,a,o,n,r.getUint32(h+20,!0),4237533241,21),n=m(A,n,s,a,o,r.getUint32(h+48,!0),1700485571,6),o=m(A,o,n,s,a,r.getUint32(h+12,!0),2399980690,10),a=m(A,a,o,n,s,r.getUint32(h+40,!0),4293915773,15),s=m(A,s,a,o,n,r.getUint32(h+4,!0),2240044497,21),n=m(A,n,s,a,o,r.getUint32(h+32,!0),1873313359,6),o=m(A,o,n,s,a,r.getUint32(h+60,!0),4264355552,10),a=m(A,a,o,n,s,r.getUint32(h+24,!0),2734768916,15),s=m(A,s,a,o,n,r.getUint32(h+52,!0),1309151649,21),n=m(A,n,s,a,o,r.getUint32(h+16,!0),4149444226,6),o=m(A,o,n,s,a,r.getUint32(h+44,!0),3174756917,10),a=m(A,a,o,n,s,r.getUint32(h+8,!0),718787259,15),s=m(A,s,a,o,n,r.getUint32(h+36,!0),3951481745,21),n=c+n|0,s=u+s|0,a=l+a|0,o=f+o|0}var d=\\\"\\\";return d+=C((255&n)>>>0),d+=C((65280&n)>>>8),d+=C((16711680&n)>>>16),d+=C((4278190080&n)>>>24),d+=C((255&s)>>>0),d+=C((65280&s)>>>8),d+=C((16711680&s)>>>16),d+=C((4278190080&s)>>>24),d+=C((255&a)>>>0),d+=C((65280&a)>>>8),d+=C((16711680&a)>>>16),d+=C((4278190080&a)>>>24),d+=C((255&o)>>>0),d+=C((65280&o)>>>8),(d+=C((16711680&o)>>>16))+C((4278190080&o)>>>24)};function k(t){return k=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\\\"function\\\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\\\"symbol\\\":typeof t},k(t)}function F(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:\\\"undefined\\\"!=typeof Symbol&&t[Symbol.iterator]||t[\\\"@@iterator\\\"];if(null!=i){var r,n,s,a,o=[],h=!0,c=!1;try{if(s=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;h=!1}else for(;!(h=(r=s.call(i)).done)&&(o.push(r.value),o.length!==e);h=!0);}catch(t){c=!0,n=t}finally{try{if(!h&&null!=i.return&&(a=i.return(),Object(a)!==a))return}finally{if(c)throw n}}return o}}(t,e)||function(t,e){if(t){if(\\\"string\\\"==typeof t)return S(t,e);var i={}.toString.call(t).slice(8,-1);return\\\"Object\\\"===i&&t.constructor&&(i=t.constructor.name),\\\"Map\\\"===i||\\\"Set\\\"===i?Array.from(t):\\\"Arguments\\\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?S(t,e):void 0}}(t,e)||function(){throw new TypeError(\\\"Invalid attempt to destructure non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\\\")}()}function S(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,r=Array(e);i<e;i++)r[i]=t[i];return r}function R(t,e){for(var i=0;i<e.length;i++){var r=e[i];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(t,I(r.key),r)}}function I(t){var e=function(t){if(\\\"object\\\"!=k(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,\\\"string\\\");if(\\\"object\\\"!=k(i))return i;throw new TypeError(\\\"@@toPrimitive must return a primitive value.\\\")}return String(t)}(t);return\\\"symbol\\\"==k(e)?e:e+\\\"\\\"}var E=null,O=function(){function t(e,i){!function(t,e){if(!(t instanceof e))throw new TypeError(\\\"Cannot call a class as a function\\\")}(this,t),this.option_canvas=null,this.render_canvas=null,this.render_text=\\\"\\\",this.GL=0,this.GR=2,this.G_BACK=[n.get(0),n.get(1),n.get(2),a.get(31)],this.DRCS_mapping=new Map([[15,new Map],[16,new Map],[17,new Map],[18,new Map],[19,new Map],[20,new Map],[21,new Map],[22,new Map],[23,new Map],[24,new Map],[25,new Map],[26,new Map],[27,new Map],[28,new Map],[29,new Map],[30,new Map]]),this.purpose_width=1920,this.purpose_height=1080,this.swf_x=1920,this.swf_y=1080,this.sdf_x=1920,this.sdf_y=1080,this.sdp_x=0,this.sdp_y=0,this.ssm_x=72,this.ssm_y=72,this.shs=8,this.svs=48,this.text_size_x=1,this.text_size_y=1,this.position_x=-1,this.position_y=-1,this.pallet=0,this.fg_color=h[this.pallet][7],this.bg_color=h[this.pallet][8],this.force_bg_color=null,this.hlc=0,this.stl=!1,this.orn=null,this.force_orn=null,this.non_spacing=\\\"\\\",this.timeElapsed=0,this.endTime=null,this.rendered=!1,this.PRA=null,this.normalFont=\\\"sans-serif\\\",this.gaijiFont=this.normalFont,this.drcsReplacement=!1,this.drcsReplaceMapping=new Map,this.useStroke=!1,this.usePUA=!1,this.pes=e,this.startTime=i}return e=t,r=[{key:\\\"setEmbeddedGlyph\\\",value:function(t){E=t}},{key:\\\"detect\\\",value:function(t,e){var i,r,n=null!==(i=null==e?void 0:e.data_identifier)&&void 0!==i?i:128,s=null!==(r=null==e?void 0:e.data_group_id)&&void 0!==r?r:1;if(t.length<=0)return!1;if(t[0]!==n)return!1;if(t.length<=2)return!1;var a=3+(15&t[2]);return!(t.length<=a||(15&(252&t[a+0])>>2)!==s||(y(t,a),0))}},{key:\\\"getRGBAColorCode\\\",value:function(t){if(null==t)return null;var e=document.createElement(\\\"canvas\\\");e.width=e.height=1;var i=e.getContext(\\\"2d\\\");if(!i)return null;i.fillStyle=t,i.fillRect(0,0,e.width,e.height);var r=F(i.getImageData(0,0,1,1).data,4),n=r[0],s=r[1],a=r[2],o=r[3],h=\\\"#\\\".concat(n.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(s.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(a.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(o.toString(16).toUpperCase().padStart(2,\\\"0\\\"));return e.width=e.height=0,h}},{key:\\\"fillAlphaColorCode\\\",value:function(t){if(null==t)return\\\"\\\";var e=Number.parseInt(t.substring(1,3),16),i=Number.parseInt(t.substring(3,5),16),r=Number.parseInt(t.substring(5,7),16);return\\\"#\\\".concat(e.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(i.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(r.toString(16).toUpperCase().padStart(2,\\\"0\\\"),\\\"FF\\\")}},{key:\\\"getRGBAfromColorCode\\\",value:function(t){if(null==t)return\\\"\\\";var e=Number.parseInt(t.substring(1,3),16),i=Number.parseInt(t.substring(3,5),16),r=Number.parseInt(t.substring(5,7),16),n=Number.parseInt(t.substring(7,9),16);return\\\"rgba(\\\".concat(e,\\\", \\\").concat(i,\\\", \\\").concat(r,\\\", \\\").concat(n/255,\\\")\\\")}}],(i=[{key:\\\"initialize\\\",value:function(){this.render_canvas=null,this.option_canvas=null,this.render_text=\\\"\\\",this.GL=0,this.GR=2,this.G_BACK=[n.get(0),n.get(1),n.get(2),a.get(31)],this.DRCS_mapping=new Map([[15,new Map],[16,new Map],[17,new Map],[18,new Map],[19,new Map],[20,new Map],[21,new Map],[22,new Map],[23,new Map],[24,new Map],[25,new Map],[26,new Map],[27,new Map],[28,new Map],[29,new Map],[30,new Map]]),this.purpose_width=1920,this.purpose_height=1080,this.swf_x=1920,this.swf_y=1080,this.sdf_x=1920,this.sdf_y=1080,this.sdp_x=0,this.sdp_y=0,this.ssm_x=72,this.ssm_y=72,this.shs=8,this.svs=48,this.text_size_x=1,this.text_size_y=1,this.position_x=-1,this.position_y=-1,this.pallet=0,this.fg_color=h[this.pallet][7],this.bg_color=h[this.pallet][8],this.force_bg_color=null,this.hlc=0,this.stl=!1,this.orn=null,this.force_orn=null,this.non_spacing=\\\"\\\",this.timeElapsed=0,this.endTime=null,this.rendered=!1,this.PRA=null,this.normalFont=\\\"sans-serif\\\",this.gaijiFont=this.normalFont,this.drcsReplacement=!1,this.drcsReplaceMapping=new Map,this.useStroke=!1,this.usePUA=!1}},{key:\\\"width\\\",value:function(){return Math.floor((this.shs+this.ssm_x)*this.text_size_x)}},{key:\\\"height\\\",value:function(){return Math.floor((this.svs+this.ssm_y)*this.text_size_y)}},{key:\\\"width_magnification\\\",value:function(){return Math.ceil(this.purpose_width/this.swf_x)}},{key:\\\"height_magnification\\\",value:function(){return Math.ceil(this.purpose_height/this.swf_y)}},{key:\\\"canvas_width\\\",value:function(){return this.swf_x*this.width_magnification()}},{key:\\\"canvas_height\\\",value:function(){return this.swf_y*this.height_magnification()}},{key:\\\"move_absolute_dot\\\",value:function(t,e){this.position_x=t,this.position_y=e}},{key:\\\"move_absolute_pos\\\",value:function(t,e){this.position_x=this.sdp_x+t*this.width(),this.position_y=this.sdp_y+(e+1)*this.height()}},{key:\\\"move_relative_pos\\\",value:function(t,e){for((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs));t<0;)this.position_x-=this.width(),t++,this.position_x<this.sdp_x&&(this.position_x=this.sdp_x+this.sdf_x-this.width(),e--);for(;t>0;)this.position_x+=this.width(),t--,this.position_x>=this.sdp_x+this.sdf_x&&(this.position_x=this.sdp_x,e++);for(;e<0;)this.position_y-=this.height(),e++;for(;e>0;)this.position_y+=this.height(),e--}},{key:\\\"move_newline\\\",value:function(){(this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),this.position_x=this.sdp_x,this.position_y=this.position_y+this.height()}},{key:\\\"render\\\",value:function(e){var i,r,n,s,a,o,h,c,u,l,f,d,p,b,g;this.initialize(),this.option_canvas=null!==(i=null==e?void 0:e.canvas)&&void 0!==i?i:null,this.force_orn=null!==(r=\\\"boolean\\\"==typeof(null==e?void 0:e.forceStrokeColor)?null==e?void 0:e.forceStrokeColor:t.getRGBAColorCode(null==e?void 0:e.forceStrokeColor))&&void 0!==r?r:null,this.force_bg_color=null!==(n=t.getRGBAColorCode(null==e?void 0:e.forceBackgroundColor))&&void 0!==n?n:null,this.purpose_width=null!==(s=null!==(a=null==e?void 0:e.width)&&void 0!==a?a:null==e||null===(o=e.canvas)||void 0===o?void 0:o.width)&&void 0!==s?s:this.purpose_width,this.purpose_height=null!==(h=null!==(c=null==e?void 0:e.height)&&void 0!==c?c:null==e||null===(u=e.canvas)||void 0===u?void 0:u.height)&&void 0!==h?h:this.purpose_height,this.normalFont=null!==(l=null==e?void 0:e.normalFont)&&void 0!==l?l:\\\"sans-serif\\\",this.gaijiFont=null!==(f=null==e?void 0:e.gaijiFont)&&void 0!==f?f:this.normalFont,this.drcsReplacement=null!==(d=null==e?void 0:e.drcsReplacement)&&void 0!==d&&d,this.drcsReplaceMapping=new Map(v);for(var y,m=Object.entries(null!==(y=null==e?void 0:e.drcsReplaceMapping)&&void 0!==y?y:{}),_=0;_<m.length;_++){var w=m[_];this.drcsReplaceMapping.set(w[0],w[1])}if(this.useStroke=null!==(p=null==e?void 0:e.useStroke)&&void 0!==p&&p,this.usePUA=null!==(b=null==e?void 0:e.usePUA)&&void 0!==b&&b,!t.detect(this.pes,e))return null;for(var x=3+(15&this.pes[2]),A=(this.pes[x+0],(this.pes[x+3]<<8)+this.pes[x+4]),C=x+9;C<x+(5+A);){this.pes[C+0];var T=this.pes[C+1],k=this.pes[C+2]<<16|this.pes[C+3]<<8|this.pes[C+4];32===T?this.parseText(C+5,C+5+k):48==T?this.parseDRCS(1,C+5,C+5+k):49==T&&this.parseDRCS(2,C+5,C+5+k),C+=5+k}if(this.option_canvas){var F=this.option_canvas.getContext(\\\"2d\\\");if(F&&(F.clearRect(0,0,this.option_canvas.width,this.option_canvas.height),this.render_canvas))if(null!=e&&e.keepAspectRatio){var S=this.option_canvas.width/this.swf_x,R=this.option_canvas.height/this.swf_y,I=Math.min(S,R),E=this.swf_x*I,O=this.swf_y*I,M=(this.option_canvas.width-E)/2,G=(this.option_canvas.height-O)/2;F.drawImage(this.render_canvas,0,0,this.render_canvas.width,this.render_canvas.height,M,G,E,O)}else F.drawImage(this.render_canvas,0,0,this.render_canvas.width,this.render_canvas.height,0,0,this.option_canvas.width,this.option_canvas.height)}return this.render_canvas&&(this.render_canvas.width=this.render_canvas.height=0,this.render_canvas=null),this.option_canvas=null,{startTime:this.startTime,endTime:null!==(g=this.endTime)&&void 0!==g?g:Number.POSITIVE_INFINITY,rendered:this.rendered,textContent:this.rendered?this.render_text:null,PRA:this.PRA}}},{key:\\\"parseText\\\",value:function(t,e){for(;t<e;)if(32<this.pes[t]&&this.pes[t]<127){var i=0,r=this.G_BACK[this.GL];if(!r)return;for(var a=0;a<r.bytes;a++)i<<=8,i|=127&this.pes[t+a];this.renderCharacter(i,r),t+=r.bytes}else if(160<this.pes[t]&&this.pes[t]<255){var c=0,u=this.G_BACK[this.GR];if(!u)return;for(var l=0;l<u.bytes;l++)c<<=8,c|=127&this.pes[t+l];this.renderCharacter(c,u),t+=u.bytes}else if(0===this.pes[t])t+=1;else if(7===this.pes[t])t+=1;else if(8===this.pes[t])this.move_relative_pos(-1,0),t+=1;else if(9===this.pes[t])this.move_relative_pos(1,0),t+=1;else if(10===this.pes[t])this.move_relative_pos(0,1),t+=1;else if(11===this.pes[t])this.move_relative_pos(0,-1),t+=1;else if(12===this.pes[t])null!=this.startTime&&this.timeElapsed>0&&(this.endTime=this.startTime+this.timeElapsed),t+=1;else if(13===this.pes[t])this.move_newline(),t+=1;else if(14===this.pes[t])this.GL=1,t+=1;else if(15===this.pes[t])this.GL=0,t+=1;else if(22===this.pes[t]){var f=63&this.pes[t+1];this.move_relative_pos(f,0),t+=2}else if(24===this.pes[t])t+=1;else if(25===this.pes[t]){var d=0,p=this.G_BACK[2];if(!p)return;for(var v=0;v<p.bytes;v++)d<<=8,d|=127&this.pes[t+1+v];this.renderCharacter(d,p),t+=1+p.bytes}else if(27===this.pes[t])if(110===this.pes[t+1])this.GL=2,t+=2;else if(111==this.pes[t+1])this.GL=3,t+=2;else if(126==this.pes[t+1])this.GR=1,t+=2;else if(125==this.pes[t+1])this.GR=2,t+=2;else if(124==this.pes[t+1])this.GR=3,t+=2;else if(40<=this.pes[t+1]&&this.pes[t+1]<=43){var b=this.pes[t+1]-40;32===this.pes[t+2]?(this.G_BACK[b]=o.get(this.pes[t+3]),t+=4):(this.G_BACK[b]=s.get(this.pes[t+2]),t+=3)}else{if(36!==this.pes[t+1])return;if(40<=this.pes[t+2]&&this.pes[t+2]<=43){var g=this.pes[t+2]-40;32===this.pes[t+3]?(this.G_BACK[g]=o.get(this.pes[t+4]),t+=5):(this.G_BACK[g]=s.get(this.pes[t+3]),t+=4)}else this.G_BACK[0]=s.get(this.pes[t+2]),t+=3}else if(28===this.pes[t]){var y=63&this.pes[t+1],m=63&this.pes[t+2];this.move_absolute_pos(m,y),t+=3}else if(29===this.pes[t]){var _=0,w=this.G_BACK[3];if(!w)return;for(var x=0;x<w.bytes;x++)_<<=8,_|=127&this.pes[t+1+x];this.renderCharacter(_,w),t+=1+w.bytes}else if(30===this.pes[t])t+=1;else if(31===this.pes[t])t+=1;else if(32===this.pes[t]){var A=n.get(0);if(!A)return;this.renderCharacter(8481,A),t+=1}else if(127===this.pes[t])t+=1;else if(128===this.pes[t])this.fg_color=h[this.pallet][0],t+=1;else if(129===this.pes[t])this.fg_color=h[this.pallet][1],t+=1;else if(130===this.pes[t])this.fg_color=h[this.pallet][2],t+=1;else if(131===this.pes[t])this.fg_color=h[this.pallet][3],t+=1;else if(132===this.pes[t])this.fg_color=h[this.pallet][4],t+=1;else if(133===this.pes[t])this.fg_color=h[this.pallet][5],t+=1;else if(134===this.pes[t])this.fg_color=h[this.pallet][6],t+=1;else if(135===this.pes[t])this.fg_color=h[this.pallet][7],t+=1;else if(136===this.pes[t])this.text_size_x=.5,this.text_size_y=.5,t+=1;else if(137===this.pes[t])this.text_size_x=.5,this.text_size_y=1,t+=1;else if(138===this.pes[t])this.text_size_x=1,this.text_size_y=1,t+=1;else{if(139===this.pes[t])return;if(144===this.pes[t]){var C=this.pes[t+1];if(32==C){var T=15&this.pes[t+2];this.pallet=T,t+=3}else{var k=15&C;64==(112&C)?this.fg_color=h[this.pallet][k]:80==(112&C)&&(this.bg_color=h[this.pallet][k]),t+=2}}else if(145===this.pes[t])t+=2;else{if(146===this.pes[t])return;if(147===this.pes[t])return;if(148===this.pes[t])return;if(149===this.pes[t])return;if(151===this.pes[t])this.hlc=15&this.pes[t+1],t+=2;else{if(152===this.pes[t])return;if(153===this.pes[t])this.stl=!1,t+=1;else if(154===this.pes[t])this.stl=!0,t+=1;else if(155===this.pes[t]){for(var F=t,S=-1,R=-1;F+1<e;)if(F+=1,32===this.pes[F])S<0&&(S=F);else if(59===this.pes[F])S<0&&R<0&&(R=F);else{if(66===this.pes[F])break;if(83===this.pes[F]){var I=t+1,E=0;if(R>=0||S<0)return;for(;I<S;)E*=10,E+=15&this.pes[I],I++;if(5===E)this.swf_x=3840,this.swf_y=2160;else if(7===E)this.swf_x=1920,this.swf_y=1080;else{if(9!=E)return;this.swf_x=1440,this.swf_y=960}break}if(84===this.pes[F])break;if(86===this.pes[F]){for(var O=t+1,M=0,G=0;O<R;)M*=10,M+=15&this.pes[O],O++;for(O++;O<S;)G*=10,G+=15&this.pes[O],O++;this.sdf_x=2*M,this.sdf_y=2*G;break}if(87===this.pes[F]){for(var B=t+1,P=0,D=0;B<R;)P*=10,P+=15&this.pes[B],B++;for(B++;B<S;)D*=10,D+=15&this.pes[B],B++;this.ssm_x=2*P,this.ssm_y=2*D;break}if(88===this.pes[F]){for(var j=t+1,L=0;j<S;)L*=10,L+=15&this.pes[j],j++;this.shs=2*L;break}if(89===this.pes[F]){for(var N=t+1,U=0;N<S;)U*=10,U+=15&this.pes[N],N++;this.svs=2*U;break}if(91===this.pes[F])break;if(92===this.pes[F])break;if(93===this.pes[F])break;if(94===this.pes[F])break;if(95===this.pes[F]){for(var z=t+1,H=0,X=0;z<R;)H*=10,H+=15&this.pes[z],z++;for(z++;z<S;)X*=10,X+=15&this.pes[z],z++;this.sdp_x=2*H,this.sdp_y=2*X;break}if(97===this.pes[F]){for(var K=t+1,V=0,$=0;K<R;)V*=10,V+=15&this.pes[K],K++;for(K++;K<S;)$*=10,$+=15&this.pes[K],K++;this.move_absolute_dot(2*V,2*$);break}if(98===this.pes[F])break;if(99===this.pes[F]){var W=this.pes[t+1];if(48==W)this.orn=null;else if(49==W){var Y=10*(15&this.pes[t+3])+(15&this.pes[t+4]),J=10*(15&this.pes[t+5])+(15&this.pes[t+6]);this.orn=h[Y][J]}break}if(100===this.pes[F])break;if(101===this.pes[F])break;if(102===this.pes[F])break;if(103===this.pes[F])break;if(104===this.pes[F]){for(var Z=t+1,q=0;Z<S;)q*=10,q+=15&this.pes[Z],Z++;this.PRA=q;break}if(105===this.pes[F])break;if(106===this.pes[F])break;if(110===this.pes[F])break;if(111===this.pes[F])break}t=F+1}else{if(157!==this.pes[t])return;if(32!=this.pes[t+1])return void this.pes[t+1];var Q=63&this.pes[t+2];this.timeElapsed+=Q/10,t+=3}}}}}},{key:\\\"parseDRCS\\\",value:function(t,e,i){for(this.pes[e+0],e+=1;e<i;){var r=this.pes[e+0]<<8|this.pes[e+1],n=this.pes[e+2];e+=3;for(var s=0;s<n;s++){this.pes[e+0];var a=15&this.pes[e+0];if(0===a||1===a){var h=this.pes[e+1]+2,c=this.pes[e+2],u=this.pes[e+3],l=h.toString(2).length-h.toString(2).replace(/0*$/,\\\"\\\").length,f=Math.floor(c*u*l/8),d=new Uint8Array(Array.prototype.slice.call(this.pes,e+4,e+4+f));if(1===t){var p,v,b=64+((3840&r)>>8),g=127&r,y=null===(p=o.get(b))||void 0===p?void 0:p.alphabet;y&&(null===(v=this.DRCS_mapping.get(y))||void 0===v||v.set(g,d))}else{var m,_=32639&r;null===(m=this.DRCS_mapping.get(15))||void 0===m||m.set(_,d)}e+=4+f}}}}},{key:\\\"renderCharacter\\\",value:function(e,i){var r;if((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),this.option_canvas){this.option_canvas&&!this.render_canvas&&(this.render_canvas=document.createElement(\\\"canvas\\\"),this.render_canvas.width=this.canvas_width(),this.render_canvas.height=this.canvas_height());var s=null===(r=this.render_canvas)||void 0===r?void 0:r.getContext(\\\"2d\\\");if(s){if(0===i.alphabet){var o=((65280&e)>>8)-33,h=(255&e)-33;if(0===o&&12<=h&&h<=17)return void(this.non_spacing=[\\\"́\\\",\\\"̀\\\",\\\"̈\\\",\\\"̂\\\",\\\"̅\\\",\\\"̲\\\"][h-12]);if(1===o&&93===h)return void(this.non_spacing+=\\\"⃝\\\")}var v;if(31!==i.alphabet&&(this.rendered=!0,s.fillStyle=t.getRGBAfromColorCode(null!==(v=this.force_bg_color)&&void 0!==v?v:this.bg_color),s.fillRect(this.position_x*this.width_magnification(),(this.position_y-this.height())*this.height_magnification(),this.width()*this.width_magnification(),this.height()*this.height_magnification()),1&this.hlc&&(s.fillStyle=t.getRGBAfromColorCode(this.fg_color),s.fillRect(this.position_x*this.width_magnification(),(this.position_y-1)*this.height_magnification(),this.width()*this.width_magnification(),1*this.height_magnification())),2&this.hlc&&(s.fillStyle=t.getRGBAfromColorCode(this.fg_color),s.fillRect((this.position_x+this.width()-1)*this.width_magnification(),(this.position_y-this.height())*this.height_magnification(),1*this.width_magnification(),this.height()*this.height_magnification())),4&this.hlc&&(s.fillStyle=t.getRGBAfromColorCode(this.fg_color),s.fillRect(this.position_x*this.width_magnification(),(this.position_y-this.height())*this.height_magnification(),this.width()*this.width_magnification(),1*this.height_magnification())),8&this.hlc&&(s.fillStyle=t.getRGBAfromColorCode(this.fg_color),s.fillRect(this.position_x*this.width_magnification(),(this.position_y-this.height())*this.height_magnification(),1*this.width_magnification(),this.height()*this.height_magnification())),this.stl&&(s.fillStyle=t.getRGBAfromColorCode(this.fg_color),s.fillRect(this.position_x*this.width_magnification(),(this.position_y-1)*this.height_magnification(),this.width()*this.width_magnification(),1*this.height_magnification()))),0===i.alphabet){var b=94*(((65280&e)>>8)-33)+((255&e)-33),g=7896;if(b<g){var y=c[b];this.renderFont(y)}else if(this.usePUA){var m=u[b-g];this.renderFont(m)}else{var _=l[b-g];this.renderFont(_)}this.move_relative_pos(1,0)}else if(1===i.alphabet){var w=f[e-33];this.renderFont(w),this.move_relative_pos(1,0)}else if(2===i.alphabet){var x=d[e-33];this.renderFont(x),this.move_relative_pos(1,0)}else if(3===i.alphabet){var A=p[e-33];this.renderFont(A),this.move_relative_pos(1,0)}else{if(31===i.alphabet)return void(96===e?(this.G_BACK=[n.get(0),n.get(1),n.get(2),a.get(31)],this.GL=0,this.GR=2):97===e?(this.G_BACK=[n.get(0),n.get(3),n.get(2),a.get(31)],this.GL=0,this.GR=2):98===e?(this.G_BACK=[n.get(0),a.get(16),n.get(2),a.get(31)],this.GL=0,this.GR=2):99===e?(this.G_BACK=[n.get(4),n.get(6),n.get(7),a.get(31)],this.GL=0,this.GR=2):100===e?(this.G_BACK=[n.get(4),n.get(5),n.get(7),a.get(31)],this.GL=0,this.GR=2):101===e?(this.G_BACK=[n.get(4),a.get(16),n.get(7),a.get(31)],this.GL=0,this.GR=2):102===e?(this.G_BACK=[a.get(16),a.get(17),a.get(18),a.get(31)],this.GL=0,this.GR=2):103===e?(this.G_BACK=[a.get(19),a.get(20),a.get(21),a.get(31)],this.GL=0,this.GR=2):104===e?(this.G_BACK=[a.get(22),a.get(23),a.get(24),a.get(31)],this.GL=0,this.GR=2):105===e?(this.G_BACK=[a.get(25),a.get(26),a.get(27),a.get(31)],this.GL=0,this.GR=2):106===e?(this.G_BACK=[a.get(28),a.get(29),a.get(30),a.get(31)],this.GL=0,this.GR=2):107===e?(this.G_BACK=[n.get(0),a.get(17),n.get(2),a.get(31)],this.GL=0,this.GR=2):108===e?(this.G_BACK=[n.get(0),a.get(18),n.get(2),a.get(31)],this.GL=0,this.GR=2):109===e?(this.G_BACK=[n.get(0),a.get(19),n.get(2),a.get(31)],this.GL=0,this.GR=2):110===e?(this.G_BACK=[n.get(3),n.get(2),n.get(1),a.get(31)],this.GL=0,this.GR=2):111===e&&(this.G_BACK=[n.get(1),n.get(4),a.get(16),a.get(31)],this.GL=0,this.GR=2));var C,k=null===(C=this.DRCS_mapping.get(i.alphabet))||void 0===C?void 0:C.get(32639&e);if(!k)return;var F=T(k.buffer);if(this.drcsReplacement&&this.drcsReplaceMapping.has(F.toLowerCase()))this.renderFont(this.drcsReplaceMapping.get(F.toLowerCase()));else if(this.drcsReplacement&&this.drcsReplaceMapping.has(F.toUpperCase()))this.renderFont(this.drcsReplaceMapping.get(F.toUpperCase()));else{var S=Math.floor(this.ssm_x*this.text_size_x/2),R=Math.floor(this.ssm_y*this.text_size_y/2),I=Math.floor(8*k.length/(S*R)),E=this.getOrnColorCode();if(E&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color)){s.fillStyle=t.getRGBAfromColorCode(E);for(var O=-2*this.height_magnification();O<=2*this.height_magnification();O++)for(var M=-2*this.width_magnification();M<=2*this.width_magnification();M++)for(var G=0;G<R;G++)for(var B=0;B<S;B++){for(var P=0,D=0;D<I;D++){var j=7-((G*S+B)*I+D)%8;P*=2,P+=(k[Math.floor(((G*S+B)*I+D)/8)]&1<<j)>>j}P>0&&s.fillRect((this.position_x-0+Math.floor(this.shs*this.text_size_x/2)+2*B)*this.width_magnification()+2*M,(this.position_y-this.height()+Math.floor(this.svs*this.text_size_y/2)+2*G)*this.height_magnification()+2*O,2*this.width_magnification(),2*this.height_magnification())}}s.fillStyle=t.getRGBAfromColorCode(this.fg_color);for(var L=0;L<R;L++)for(var N=0;N<S;N++){for(var U=0,z=0;z<I;z++){var H=7-((L*S+N)*I+z)%8;U*=2,U+=(k[Math.floor(((L*S+N)*I+z)/8)]&1<<H)>>H}U>0&&s.fillRect((this.position_x-0+Math.floor(this.shs*this.text_size_x/2)+2*N)*this.width_magnification(),(this.position_y-this.height()+Math.floor(this.svs*this.text_size_y/2)+2*L)*this.height_magnification(),2*this.width_magnification(),2*this.height_magnification())}}this.move_relative_pos(1,0)}}}}},{key:\\\"renderFont\\\",value:function(e){var i;if(e+=this.non_spacing,this.non_spacing=\\\"\\\",.5===this.text_size_x&&.5===this.text_size_y&&(d.includes(e)||p.includes(e))||(this.render_text+=e),this.render_canvas)if(null!=E&&E.has(e)){var r=E.get(e),n=r.viewBox,s=r.path;this.renderPath(n,s)}else{var a=b.has(e);a&&(e+=\\\"︎\\\");var o=null===(i=this.render_canvas)||void 0===i?void 0:i.getContext(\\\"2d\\\");if(o){var h=(this.position_x+this.width()/2)*this.width_magnification(),c=(this.position_y-this.height()/2)*this.height_magnification();o.translate(h,c),o.scale(this.text_size_x*this.width_magnification(),this.text_size_y*this.height_magnification());var u=this.getOrnColorCode();if(u&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color))if(this.useStroke)o.font=\\\"\\\".concat(this.ssm_x,\\\"px \\\").concat(a?this.gaijiFont:this.normalFont),o.strokeStyle=t.getRGBAfromColorCode(u),o.lineJoin=\\\"round\\\",o.textBaseline=\\\"middle\\\",o.textAlign=\\\"center\\\",o.lineWidth=8,o.strokeText(e,0,0);else{o.setTransform(1,0,0,1,0,0),o.translate(h,c),o.scale(this.text_size_x,this.text_size_y*this.height_magnification()/this.width_magnification());for(var l=-4*this.width_magnification();l<=4*this.width_magnification();l++)for(var f=-4*this.width_magnification();f<=4*this.width_magnification();f++)o.font=\\\"\\\".concat(this.ssm_x*this.width_magnification(),\\\"px \\\").concat(a?this.gaijiFont:this.normalFont),o.fillStyle=t.getRGBAfromColorCode(u),o.textBaseline=\\\"middle\\\",o.textAlign=\\\"center\\\",o.fillText(e,0+f,0+l);o.setTransform(1,0,0,1,0,0),o.translate(h,c),o.scale(this.text_size_x*this.width_magnification(),this.text_size_y*this.height_magnification())}o.font=\\\"\\\".concat(this.ssm_x,\\\"px \\\").concat(a?this.gaijiFont:this.normalFont),o.fillStyle=t.getRGBAfromColorCode(this.fg_color),o.textBaseline=\\\"middle\\\",o.textAlign=\\\"center\\\",o.fillText(e,0,0),o.setTransform(1,0,0,1,0,0)}}}},{key:\\\"renderPath\\\",value:function(e,i){var r;if(this.render_canvas){var n=null===(r=this.render_canvas)||void 0===r?void 0:r.getContext(\\\"2d\\\");if(n){var s=(this.position_x+this.shs/2)*this.width_magnification(),a=(this.position_y-this.height()+this.svs/2)*this.height_magnification();n.translate(s,a);var o=F(e,4),h=o[0],c=o[1],u=o[2]-h,l=o[3]-c;n.scale(this.ssm_y/u,this.ssm_y/l),n.translate(h,c);var f=this.getOrnColorCode();if(f&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color))if(this.useStroke)n.strokeStyle=t.getRGBAfromColorCode(f),n.lineJoin=\\\"round\\\",n.lineWidth=4*Math.max(u/this.ssm_y,l/this.ssm_y)*2,n.stroke(new Path2D(i));else for(var d=-4*this.width_magnification();d<=4*this.width_magnification();d++)for(var p=-4*this.width_magnification();p<=4*this.width_magnification();p++)n.translate(p,d),n.fillStyle=t.getRGBAfromColorCode(f),n.fill(new Path2D(i)),n.translate(-p,-d);n.fillStyle=t.getRGBAfromColorCode(this.fg_color),n.fill(new Path2D(i)),n.setTransform(1,0,0,1,0,0)}}}},{key:\\\"getOrnColorCode\\\",value:function(){return!0===this.force_orn?t.fillAlphaColorCode(this.bg_color):!1===this.force_orn?this.orn:null!==(e=this.force_orn)&&void 0!==e?e:this.orn;var e}}])&&R(e.prototype,i),r&&R(e,r),Object.defineProperty(e,\\\"prototype\\\",{writable:!1}),e;var e,i,r}();function M(t){return M=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\\\"function\\\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\\\"symbol\\\":typeof t},M(t)}function G(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,r=Array(e);i<e;i++)r[i]=t[i];return r}function B(t,e){if(!(t instanceof e))throw new TypeError(\\\"Cannot call a class as a function\\\")}function P(t,e){for(var i=0;i<e.length;i++){var r=e[i];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(t,j(r.key),r)}}function D(t,e,i){return e&&P(t.prototype,e),i&&P(t,i),Object.defineProperty(t,\\\"prototype\\\",{writable:!1}),t}function j(t){var e=function(t){if(\\\"object\\\"!=M(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,\\\"string\\\");if(\\\"object\\\"!=M(i))return i;throw new TypeError(\\\"@@toPrimitive must return a primitive value.\\\")}return String(t)}(t);return\\\"symbol\\\"==M(e)?e:e+\\\"\\\"}function L(t){var e=\\\"function\\\"==typeof Map?new Map:void 0;return L=function(t){if(null===t||!function(t){try{return-1!==Function.toString.call(t).indexOf(\\\"[native code]\\\")}catch(e){return\\\"function\\\"==typeof t}}(t))return t;if(\\\"function\\\"!=typeof t)throw new TypeError(\\\"Super expression must either be null or a function\\\");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,i)}function i(){return N(t,arguments,H(this).constructor)}return i.prototype=Object.create(t.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),z(i,t)},L(t)}function N(t,e,i){if(U())return Reflect.construct.apply(null,arguments);var r=[null];r.push.apply(r,e);var n=new(t.bind.apply(t,r));return i&&z(n,i.prototype),n}function U(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(U=function(){return!!t})()}function z(t,e){return z=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},z(t,e)}function H(t){return H=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},H(t)}i(113),i(8980),i(6910),i(4554),i(875),i(287),i(825);var X=function(t){function e(){return B(this,e),t=this,r=arguments,i=H(i=e),function(t,e){if(e&&(\\\"object\\\"==M(e)||\\\"function\\\"==typeof e))return e;if(void 0!==e)throw new TypeError(\\\"Derived constructors may only return object or undefined\\\");return function(t){if(void 0===t)throw new ReferenceError(\\\"this hasn't been initialised - super() hasn't been called\\\");return t}(t)}(t,U()?Reflect.construct(i,r||[],H(t).constructor):i.apply(t,r));var t,i,r}return function(t,e){if(\\\"function\\\"!=typeof e&&null!==e)throw new TypeError(\\\"Super expression must either be null or a function\\\");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,\\\"prototype\\\",{writable:!1}),e&&z(t,e)}(e,t),D(e,[{key:\\\"addCue\\\",value:function(t){this.push(t)}},{key:\\\"removeCue\\\",value:function(t){var e=this.findIndex((function(e){return e===t}));e<0||this.splice(e,1)}},{key:\\\"getCueById\\\",value:function(t){var e;return null!==(e=this.find((function(e){return e.id===t})))&&void 0!==e?e:null}}])}(L(Array)),K=function(){return D((function t(e){B(this,t),this.all=new X,this.active=new X,this.polling_handler=this.polling.bind(this),this.polling_id=null,this.cues=this.all,this.oncuechange=null,this.id=\\\"\\\",this.kind=\\\"metadata\\\",this.label=\\\"\\\",this.language=\\\"ja-JP\\\",this.mode=\\\"hidden\\\",this.inBandMetadataTrackDispatchType=\\\"\\\",this.sourceBuffer=null,this.listeners=[],this.media=e}),[{key:\\\"startPolling\\\",value:function(){this.polling_id=window.requestAnimationFrame(this.polling_handler)}},{key:\\\"stopPolling\\\",value:function(){null!=this.polling_id&&(window.cancelAnimationFrame(this.polling_id),this.polling_id=null)}},{key:\\\"polling\\\",value:function(){var t=this.active,e=this.activeCues;if(t.length!==e.length){var i=null;try{i=new CustomEvent(\\\"cuechange\\\")}catch(t){(i=document.createEvent(\\\"CustomEvent\\\")).initCustomEvent(\\\"cuechange\\\",!1,!1,{})}null!=i&&(this.dispatchEvent(i),this.oncuechange&&this.oncuechange.call(this,i))}else for(var r=0;r<e.length;r++)if(t[r]!==e[r]){var n=null;try{n=new CustomEvent(\\\"cuechange\\\")}catch(t){(n=document.createEvent(\\\"CustomEvent\\\")).initCustomEvent(\\\"cuechange\\\",!1,!1,{})}if(null!=n){this.dispatchEvent(n),this.oncuechange&&this.oncuechange.call(this,n);break}}this.polling_id=window.requestAnimationFrame(this.polling_handler)}},{key:\\\"activeCues\\\",get:function(){var t,e=this,i=N(X,function(t){if(Array.isArray(t))return G(t)}(t=this.all.filter((function(t){return t.startTime<=e.media.currentTime&&e.media.currentTime<=t.endTime})))||function(t){if(\\\"undefined\\\"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t[\\\"@@iterator\\\"])return Array.from(t)}(t)||function(t,e){if(t){if(\\\"string\\\"==typeof t)return G(t,e);var i={}.toString.call(t).slice(8,-1);return\\\"Object\\\"===i&&t.constructor&&(i=t.constructor.name),\\\"Map\\\"===i||\\\"Set\\\"===i?Array.from(t):\\\"Arguments\\\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?G(t,e):void 0}}(t)||function(){throw new TypeError(\\\"Invalid attempt to spread non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\\\")}());return i.sort((function(t,e){return t.startTime===e.startTime?-(t.endTime-e.endTime):t.startTime-e.startTime})),this.active=i,this.active}},{key:\\\"getCueById\\\",value:function(t){return this.all.getCueById(t)}},{key:\\\"addCue\\\",value:function(t){this.all.addCue(t)}},{key:\\\"removeCue\\\",value:function(t){this.all.removeCue(t)}},{key:\\\"addEventListener\\\",value:function(t,e){this.listeners.push(e)}},{key:\\\"removeEventListener\\\",value:function(t,e){var i=this.listeners.findIndex((function(t){return t===e}));i<0||this.listeners.splice(i,1)}},{key:\\\"dispatchEvent\\\",value:function(t){var e=this;return\\\"cuechange\\\"!==t.type||this.listeners.forEach((function(i){return i.call(e,t)})),!0}}])}();function V(t){return V=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\\\"function\\\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\\\"symbol\\\":typeof t},V(t)}function $(t,e){for(var i=0;i<e.length;i++){var r=e[i];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(t,W(r.key),r)}}function W(t){var e=function(t){if(\\\"object\\\"!=V(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,\\\"string\\\");if(\\\"object\\\"!=V(i))return i;throw new TypeError(\\\"@@toPrimitive must return a primitive value.\\\")}return String(t)}(t);return\\\"symbol\\\"==V(e)?e:e+\\\"\\\"}var Y=function(){return t=function t(e,i){!function(t,e){if(!(t instanceof e))throw new TypeError(\\\"Cannot call a class as a function\\\")}(this,t),this.id=\\\"\\\",this.pauseOnExit=!1,this.onenter=null,this.onexit=null,this.track=null,this.startTime=e,this.endTime=i},(e=[{key:\\\"addEventListener\\\",value:function(t,e,i){}},{key:\\\"removeEventListener\\\",value:function(t,e,i){}},{key:\\\"dispatchEvent\\\",value:function(t){return!1}}])&&$(t.prototype,e),Object.defineProperty(t,\\\"prototype\\\",{writable:!1}),t;var t,e}();function J(t,e,i){for(var r=0,n=e;n<i;n++)r<<=7,r|=127&t[n];return r}function Z(t,e,i){for(var r=\\\"\\\",n=e;n<i;n++)r+=\\\"%\\\".concat(t[n].toString(16).padStart(2,\\\"0\\\"));return r}function q(t,e,i){if(window.TextDecoder){var r=new TextDecoder(\\\"utf-8\\\"),n=new Uint8Array(Array.prototype.slice.call(t,e,i));return r.decode(n)}return window.decodeURIComponent(Z(t,e,i))}function Q(t,e,i){if(window.TextDecoder){var r=new TextDecoder(\\\"iso-8859-1\\\"),n=new Uint8Array(Array.prototype.slice.call(t,e,i));return r.decode(n)}return window.unescape(Z(t,e,i))}function tt(t){for(var e=window.atob(t),i=new Uint8Array(e.length),r=0;r<e.length;r++)i[r]=e.charCodeAt(r);return i}function et(t){return et=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\\\"function\\\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\\\"symbol\\\":typeof t},et(t)}function it(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,r)}return i}function rt(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?it(Object(i),!0).forEach((function(e){nt(t,e,i[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):it(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}function nt(t,e,i){return(e=at(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function st(t,e){for(var i=0;i<e.length;i++){var r=e[i];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(t,at(r.key),r)}}function at(t){var e=function(t){if(\\\"object\\\"!=et(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,\\\"string\\\");if(\\\"object\\\"!=et(i))return i;throw new TypeError(\\\"@@toPrimitive must return a primitive value.\\\")}return String(t)}(t);return\\\"symbol\\\"==et(e)?e:e+\\\"\\\"}var ot=function(){return t=function t(e){var i,r,n,s,a;!function(t,e){if(!(t instanceof e))throw new TypeError(\\\"Cannot call a class as a function\\\")}(this,t),this.media=null,this.id3Track=null,this.b24Track=null,this.subtitleElement=null,this.viewCanvas=null,this.rawCanvas=null,this.textContent=null,this.resizeObserver=null,this.mutationObserver=null,this.prevCurrentTime=null,this.highResTimeupdatePollingId=null,this.isShowing=!0,this.isOnSeeking=!1,this.onB24CueChangeDrawed=!1,this.onID3AddtrackHandler=this.onID3Addtrack.bind(this),this.onID3CueChangeHandler=this.onID3CueChange.bind(this),this.onB24CueChangeHandler=this.onB24CueChange.bind(this),this.onHighResTimeupdateHandler=this.onHighResTimeupdate.bind(this),this.onTimeupdateHandler=this.onTimeupdate.bind(this),this.onCanplayHandler=this.onCanplay.bind(this),this.onPlayHandler=this.onPlay.bind(this),this.onPauseHandler=this.onPause.bind(this),this.onSeekingHandler=this.onSeeking.bind(this),this.onSeekedHandler=this.onSeeked.bind(this),this.onResizeHandler=this.onResize.bind(this),this.data_identifier=null!==(i=null==e?void 0:e.data_identifier)&&void 0!==i?i:128,this.data_group_id=null!==(r=null==e?void 0:e.data_group_id)&&void 0!==r?r:1,this.rendererOption=rt(rt({},e),{},{data_identifier:this.data_identifier,data_group_id:this.data_group_id,keepAspectRatio:null===(n=null==e?void 0:e.keepAspectRatio)||void 0===n||n,enableAutoInBandMetadataTextTrackDetection:null===(s=null==e?void 0:e.enableAutoInBandMetadataTextTrackDetection)||void 0===s||s,useStroke:null===(a=null==e?void 0:e.useStroke)||void 0===a||a})},(e=[{key:\\\"attachMedia\\\",value:function(t,e){var i;this.detachMedia(),this.media=t,this.subtitleElement=null!=e?e:t.parentElement,this.media.addEventListener(\\\"canplay\\\",this.onCanplayHandler),null!==(i=this.rendererOption)&&void 0!==i&&i.useHighResTimeupdate?(this.media.addEventListener(\\\"play\\\",this.onPlayHandler),this.media.addEventListener(\\\"pause\\\",this.onPauseHandler)):this.media.addEventListener(\\\"timeupdate\\\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.setupTrack(),this.setupCanvas()}},{key:\\\"detachMedia\\\",value:function(){var t,e,i,r;this.cleanupCanvas(),this.cleanupTrack(),null===(t=this.media)||void 0===t||t.removeEventListener(\\\"canplay\\\",this.onCanplayHandler),null===(e=this.media)||void 0===e||e.removeEventListener(\\\"play\\\",this.onPlayHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\\\"pause\\\",this.onPauseHandler),this.onPause(),null===(r=this.media)||void 0===r||r.removeEventListener(\\\"timeupdate\\\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.media=this.subtitleElement=null}},{key:\\\"dispose\\\",value:function(){this.detachMedia()}},{key:\\\"getViewCanvas\\\",value:function(){return this.viewCanvas}},{key:\\\"getRawCanvas\\\",value:function(){return this.rawCanvas}},{key:\\\"getTextContent\\\",value:function(){return this.textContent}},{key:\\\"refresh\\\",value:function(){this.onResize()}},{key:\\\"show\\\",value:function(){this.isShowing=!0,this.onResize()}},{key:\\\"hide\\\",value:function(){if(this.isShowing=!1,this.viewCanvas){var t=this.viewCanvas.getContext(\\\"2d\\\");t&&t.clearRect(0,0,this.viewCanvas.width,this.viewCanvas.height)}if(this.rawCanvas){var e=this.rawCanvas.getContext(\\\"2d\\\");e&&e.clearRect(0,0,this.rawCanvas.width,this.rawCanvas.height)}}},{key:\\\"isPresent\\\",value:function(){return this.onB24CueChangeDrawed}},{key:\\\"pushRawData\\\",value:function(t,e){var i=new O(e,t).render(rt(rt({},this.rendererOption),{},{width:void 0,height:void 0}));if(null==i)return!1;var r=Number.isFinite(i.endTime)?i.endTime:Number.MAX_SAFE_INTEGER;return this.addB24Cue(t,r,e)}},{key:\\\"pushBase64Data\\\",value:function(t,e){var i=tt(e);return this.pushRawData(t,i)}},{key:\\\"pushData\\\",value:function(t,e,i){return this.pushRawData(i,e)}},{key:\\\"pushID3v2PRIVData\\\",value:function(t,e,i){return\\\"aribb24.js\\\"===e&&this.pushRawData(t,i)}},{key:\\\"pushID3v2TXXXData\\\",value:function(t,e,i){return\\\"aribb24.js\\\"===e&&this.pushBase64Data(t,i)}},{key:\\\"pushID3v2Data\\\",value:function(t,e){for(var i=!1,r=0;r<e.length;){var n=r;if(r+3>e.length)break;if(73!==e[r+0]||68!==e[r+1]||51!==e[r+2]){if(0===r){r+=5;continue}break}if((r+=6)+4>e.length)break;var s=J(e,r+0,r+4);r+=4;var a=n+3+2+1+4+s;if(a>e.length)break;for(var o=r;o<a;){var h=o;if(o+4>e.length)break;var c=Q(e,o+0,o+4);if((o+=4)+4>e.length)break;var u=J(e,o+0,o+4);o+=6;var l=h+4+4+2+u;if(l>e.length)break;if(\\\"PRIV\\\"===c){for(var f=o,d=l;0!==e[o]&&o<l;)o++;var p=Q(e,f,o),v=new Uint8Array(Array.prototype.slice.call(e,o+1,d));this.pushID3v2PRIVData(t,p,v)&&(i=!0)}else if(\\\"TXXX\\\"===c){var b=e[o+0],g=o+1;if(3===b){for(;0!==e[o]&&o<l;)o++;for(var y=o,m=o+=1;0!==e[o]&&o<l;)o++;var _=o,w=q(e,g,y),x=q(e,m,_);this.pushID3v2TXXXData(t,w,x)&&(i=!0)}else if(0===b){for(;0!==e[o]&&o<l;)o++;for(var A=o,C=o+=1;0!==e[o]&&o<l;)o++;var T=o,k=Q(e,g,A),F=Q(e,C,T);this.pushID3v2TXXXData(t,k,F)&&(i=!0)}}o=l}(r=n+3+2+1+4+s)+3>e.length||51===e[r+0]&&68===e[r+1]&&73===e[r+2]&&(r+=10)}return i}},{key:\\\"setInBandMetadataTextTrack\\\",value:function(t){var e;null===(e=this.id3Track)||void 0===e||e.removeEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler),this.id3Track=t,this.id3Track.mode=\\\"hidden\\\",this.id3Track.addEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler)}},{key:\\\"pushID3v2Cue\\\",value:function(t){if(!this.id3Track)return!1;var e=t.startTime,i=t;if(\\\"15260DFFFF49443320FF49443320000F\\\"===this.id3Track.inBandMetadataTrackDispatchType)return this.pushID3v2Data(e,new Uint8Array(i.data));if(\\\"com.apple.streaming\\\"===this.id3Track.inBandMetadataTrackDispatchType){if(\\\"PRIV\\\"===i.value.key)return this.pushID3v2PRIVData(e,i.value.info,new Uint8Array(i.value.data));if(\\\"TXXX\\\"===i.value.key)return this.pushID3v2TXXXData(e,i.value.info,i.value.data)}else if(\\\"id3\\\"===this.id3Track.label){if(\\\"PRIV\\\"===i.value.key)return this.pushID3v2PRIVData(e,i.value.info,new Uint8Array(i.value.data));if(\\\"TXXX\\\"===i.value.key)return this.pushID3v2TXXXData(e,i.value.info,i.value.data)}else if(\\\"Timed Metadata\\\"===this.id3Track.label){if(\\\"PRIV\\\"===i.frame.key)return this.pushID3v2PRIVData(e,i.frame.owner,new Uint8Array(i.frame.data));if(\\\"TXXX\\\"===i.frame.key)return this.pushID3v2TXXXData(e,i.frame.description,i.frame.data)}return!1}},{key:\\\"onID3CueChange\\\",value:function(){this.id3Track&&(this.isOnSeeking||this.onTimeupdate())}},{key:\\\"addB24Cue\\\",value:function(t,e,i){var r;if(!this.b24Track)return!1;if(!O.detect(i,this.rendererOption))return!1;var n=new(null!==(r=window.VTTCue)&&void 0!==r?r:window.TextTrackCue)(t,e,\\\"\\\");if(n.data=i,window.VTTCue)this.b24Track.addCue(n);else if(window.TextTrackCue){var s;if(Array.prototype.some.call(null!==(s=this.b24Track.cues)&&void 0!==s?s:[],(function(e){return e.startTime===t})))return!1;if(this.b24Track.cues){for(var a=[],o=this.b24Track.cues.length-1;o>=0;o--)this.b24Track.cues[o].startTime>=t&&(a.push(this.b24Track.cues[o]),this.b24Track.removeCue(this.b24Track.cues[o]));this.b24Track.addCue(n);for(var h=a.length-1;h>=0;h--)this.b24Track.addCue(a[h])}}return!0}},{key:\\\"onB24CueChange\\\",value:function(){if(this.media&&this.b24Track){if(this.viewCanvas){var t=this.viewCanvas.getContext(\\\"2d\\\");t&&t.clearRect(0,0,this.viewCanvas.width,this.viewCanvas.height)}if(this.rawCanvas){var e=this.rawCanvas.getContext(\\\"2d\\\");e&&e.clearRect(0,0,this.rawCanvas.width,this.rawCanvas.height)}if(this.b24Track.activeCues&&this.b24Track.activeCues.length>0){var i=this.b24Track.activeCues[this.b24Track.activeCues.length-1];if(i.startTime<=this.media.currentTime&&this.media.currentTime<=i.endTime&&!this.isOnSeeking){var r=new O(i.data,i.startTime),n=!1;if(this.isShowing&&this.viewCanvas){var s,a,o,h,c,u,l,f,d=r.render(rt(rt({},this.rendererOption),{},{canvas:this.viewCanvas,width:null!==(s=null===(a=this.rendererOption)||void 0===a?void 0:a.width)&&void 0!==s?s:this.viewCanvas.width,height:null!==(o=null===(h=this.rendererOption)||void 0===h?void 0:h.height)&&void 0!==o?o:this.viewCanvas.height}));null!=(null==d?void 0:d.PRA)&&(null===(l=this.rendererOption)||void 0===l||null===(f=l.PRACallback)||void 0===f||f.call(l,d.PRA)),n=null!==(c=null==d?void 0:d.rendered)&&void 0!==c&&c,this.textContent=null!==(u=null==d?void 0:d.textContent)&&void 0!==u?u:null}this.isShowing&&this.rawCanvas&&r.render(rt(rt({},this.rendererOption),{},{canvas:this.rawCanvas,width:this.rawCanvas.width,height:this.rawCanvas.height,keepAspectRatio:!0})),this.onB24CueChangeDrawed=n}else this.onB24CueChangeDrawed=!1,this.textContent=null;for(var p=this.b24Track.activeCues.length-2;p>=0;p--){var v=this.b24Track.activeCues[p];v.endTime=Math.min(v.endTime,i.startTime),v.startTime===v.endTime&&this.b24Track.removeCue(v)}}else this.onB24CueChangeDrawed=!1,this.textContent=null}else this.onB24CueChangeDrawed=!1}},{key:\\\"onHighResTimeupdate\\\",value:function(){this.onTimeupdate(),this.highResTimeupdatePollingId=window.requestAnimationFrame(this.onHighResTimeupdateHandler)}},{key:\\\"onTimeupdate\\\",value:function(){if(this.media)if(null!=this.prevCurrentTime)if(this.id3Track&&this.id3Track.cues&&0!==this.id3Track.cues.length)if(this.isOnSeeking)this.prevCurrentTime=this.media.currentTime;else if(Math.abs(this.media.currentTime-this.prevCurrentTime)>1)this.prevCurrentTime=this.media.currentTime;else{for(var t,e,i=new Y(Number.NEGATIVE_INFINITY,this.id3Track.cues[0].startTime),r=[i],n=0;n<this.id3Track.cues.length;n++)r.push(this.id3Track.cues[n]);for(var s=0,a=r.length;s+1<a;){var o=this.prevCurrentTime,h=Math.floor((s+a)/2);o<r[h].startTime?a=h:s=h}t=s;for(var c=0,u=r.length;c+1<u;){var l=this.media.currentTime,f=Math.floor((c+u)/2);l<r[f].startTime?u=f:c=f}if(e=c,null!==t&&null!==e&&t!==e){if(t<e)for(var d=e;d>t;d--){var p=r[d];if(p!==i&&this.pushID3v2Cue(p))break}else for(var v=t;v<e;v++){var b=r[v];if(b!==i&&this.pushID3v2Cue(b))break}this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime;else this.prevCurrentTime=this.media.currentTime}},{key:\\\"onCanplay\\\",value:function(){this.id3Track&&(this.id3Track.mode=\\\"hidden\\\"),this.b24Track&&(this.b24Track.mode=\\\"hidden\\\"),null!=this.media&&null==this.prevCurrentTime&&(this.prevCurrentTime=this.media.currentTime-Number.MIN_VALUE)}},{key:\\\"onPlay\\\",value:function(){null==this.highResTimeupdatePollingId&&this.onHighResTimeupdate()}},{key:\\\"onPause\\\",value:function(){null!=this.highResTimeupdatePollingId&&(window.cancelAnimationFrame(this.highResTimeupdatePollingId),this.highResTimeupdatePollingId=null)}},{key:\\\"onSeeking\\\",value:function(){this.isOnSeeking=!0,this.onB24CueChange()}},{key:\\\"onSeeked\\\",value:function(){this.isOnSeeking=!1}},{key:\\\"onResize\\\",value:function(){if(this.media){var t=window.getComputedStyle(this.media),e=Number.parseInt(t.width)*window.devicePixelRatio,i=Number.parseInt(t.height)*window.devicePixelRatio,r=this.media.videoWidth,n=this.media.videoHeight;if(this.viewCanvas&&(this.viewCanvas.width=Math.round(e),this.viewCanvas.height=Math.round(i)),this.rawCanvas&&(this.rawCanvas.width=r,this.rawCanvas.height=n),this.b24Track){if(this.viewCanvas){var s=this.viewCanvas.getContext(\\\"2d\\\");s&&s.clearRect(0,0,this.viewCanvas.width,this.viewCanvas.height)}if(this.rawCanvas){var a=this.rawCanvas.getContext(\\\"2d\\\");a&&a.clearRect(0,0,this.rawCanvas.width,this.rawCanvas.height)}if(this.onB24CueChangeDrawed&&this.b24Track.activeCues&&this.b24Track.activeCues.length>0){var o=this.b24Track.activeCues[this.b24Track.activeCues.length-1];if(o.startTime<=this.media.currentTime&&this.media.currentTime<=o.endTime&&!this.isOnSeeking){var h,c,u,l,f=new O(o.data,o.startTime);this.isShowing&&this.viewCanvas&&f.render(rt(rt({},this.rendererOption),{},{canvas:this.viewCanvas,width:null!==(h=null===(c=this.rendererOption)||void 0===c?void 0:c.width)&&void 0!==h?h:this.viewCanvas.width,height:null!==(u=null===(l=this.rendererOption)||void 0===l?void 0:l.height)&&void 0!==u?u:this.viewCanvas.height})),this.isShowing&&this.rawCanvas&&f.render(rt(rt({},this.rendererOption),{},{canvas:this.rawCanvas,width:this.rawCanvas.width,height:this.rawCanvas.height,keepAspectRatio:!0}))}}}}}},{key:\\\"onID3Addtrack\\\",value:function(t){if(this.media){var e=t.track;\\\"metadata\\\"===e.kind&&(\\\"15260DFFFF49443320FF49443320000F\\\"!==e.inBandMetadataTrackDispatchType&&\\\"com.apple.streaming\\\"!==e.inBandMetadataTrackDispatchType&&\\\"id3\\\"!==e.label||this.setInBandMetadataTextTrack(e))}}},{key:\\\"setupTrack\\\",value:function(){var t,e;if(this.media){if(null!==(t=this.rendererOption)&&void 0!==t&&t.useHighResTextTrack)this.b24Track=new K(this.media),this.b24Track.startPolling();else{for(var i=\\\"ARIB B24 Japanese (data_identifier=0x\\\".concat(this.data_identifier.toString(16),\\\", data_group_id=\\\").concat(this.data_group_id,\\\")\\\"),r=0;r<this.media.textTracks.length;r++){var n=this.media.textTracks[r];if(n.label===i){this.b24Track=n;break}}this.b24Track||(this.b24Track=this.media.addTextTrack(\\\"metadata\\\",i,\\\"ja\\\"),this.b24Track.mode=\\\"hidden\\\")}if(this.b24Track.addEventListener(\\\"cuechange\\\",this.onB24CueChangeHandler),null!==(e=this.rendererOption)&&void 0!==e&&e.enableAutoInBandMetadataTextTrackDetection){for(var s=0;s<this.media.textTracks.length;s++){var a=this.media.textTracks[s];if(\\\"metadata\\\"===a.kind&&(\\\"15260DFFFF49443320FF49443320000F\\\"===a.inBandMetadataTrackDispatchType||\\\"com.apple.streaming\\\"===a.inBandMetadataTrackDispatchType||\\\"id3\\\"===a.label)){this.setInBandMetadataTextTrack(a);break}}this.media.textTracks.addEventListener(\\\"addtrack\\\",this.onID3AddtrackHandler)}this.media.addEventListener(\\\"seeking\\\",this.onSeekingHandler),this.media.addEventListener(\\\"seeked\\\",this.onSeekedHandler)}}},{key:\\\"setupCanvas\\\",value:function(){var t,e=this;this.media&&this.subtitleElement&&(this.viewCanvas=document.createElement(\\\"canvas\\\"),this.viewCanvas.style.position=\\\"absolute\\\",this.viewCanvas.style.top=this.viewCanvas.style.left=\\\"0\\\",this.viewCanvas.style.pointerEvents=\\\"none\\\",this.viewCanvas.style.width=\\\"100%\\\",this.viewCanvas.style.height=\\\"100%\\\",null!==(t=this.rendererOption)&&void 0!==t&&t.enableRawCanvas&&(this.rawCanvas=document.createElement(\\\"canvas\\\")),this.onResize(),this.subtitleElement.appendChild(this.viewCanvas),this.media.addEventListener(\\\"resize\\\",this.onResizeHandler),window.ResizeObserver?(this.resizeObserver=new ResizeObserver((function(){e.onResize()})),this.resizeObserver.observe(this.media)):(window.addEventListener(\\\"resize\\\",this.onResizeHandler),window.MutationObserver&&(this.mutationObserver=new MutationObserver((function(){e.onResize()})),this.mutationObserver.observe(this.media,{attributes:!0,attributeFilter:[\\\"class\\\",\\\"style\\\"]}))))}},{key:\\\"cleanupTrack\\\",value:function(){var t,e,i,r,n,s;if(this.b24Track)if(null!==(s=this.rendererOption)&&void 0!==s&&s.useHighResTextTrack)this.b24Track.stopPolling();else if(this.b24Track.cues)for(var a=this.b24Track.cues.length-1;a>=0;a--)this.b24Track.removeCue(this.b24Track.cues[a]);null===(t=this.b24Track)||void 0===t||t.removeEventListener(\\\"cuechange\\\",this.onB24CueChangeHandler),null===(e=this.id3Track)||void 0===e||e.removeEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\\\"seeking\\\",this.onSeekingHandler),null===(r=this.media)||void 0===r||r.removeEventListener(\\\"seeked\\\",this.onSeekedHandler),null===(n=this.media)||void 0===n||n.textTracks.removeEventListener(\\\"addtrack\\\",this.onID3AddtrackHandler),this.b24Track=this.id3Track=null}},{key:\\\"cleanupCanvas\\\",value:function(){var t;window.removeEventListener(\\\"resize\\\",this.onResizeHandler),null===(t=this.media)||void 0===t||t.removeEventListener(\\\"resize\\\",this.onResizeHandler),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.mutationObserver&&(this.mutationObserver.disconnect(),this.mutationObserver=null),this.viewCanvas&&this.subtitleElement&&this.subtitleElement.removeChild(this.viewCanvas),this.viewCanvas&&(this.viewCanvas.width=this.viewCanvas.height=0),this.rawCanvas&&(this.rawCanvas.width=this.rawCanvas.height=0),this.viewCanvas=this.rawCanvas=null}}])&&st(t.prototype,e),Object.defineProperty(t,\\\"prototype\\\",{writable:!1}),t;var t,e}();function ht(t,e,i){for(var r=-1,n=e;n<i;n++){r^=t[n];for(var s=0;s<8;s++)1&r?r=r>>>1^3988292384:r>>>=1}return~r}function ct(t){return ct=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\\\"function\\\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\\\"symbol\\\":typeof t},ct(t)}function ut(t){return function(t){if(Array.isArray(t))return ft(t)}(t)||function(t){if(\\\"undefined\\\"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t[\\\"@@iterator\\\"])return Array.from(t)}(t)||lt(t)||function(){throw new TypeError(\\\"Invalid attempt to spread non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\\\")}()}function lt(t,e){if(t){if(\\\"string\\\"==typeof t)return ft(t,e);var i={}.toString.call(t).slice(8,-1);return\\\"Object\\\"===i&&t.constructor&&(i=t.constructor.name),\\\"Map\\\"===i||\\\"Set\\\"===i?Array.from(t):\\\"Arguments\\\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?ft(t,e):void 0}}function ft(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,r=Array(e);i<e;i++)r[i]=t[i];return r}function dt(t,e){for(var i=0;i<e.length;i++){var r=e[i];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(t,pt(r.key),r)}}function pt(t){var e=function(t){if(\\\"object\\\"!=ct(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,\\\"string\\\");if(\\\"object\\\"!=ct(i))return i;throw new TypeError(\\\"@@toPrimitive must return a primitive value.\\\")}return String(t)}(t);return\\\"symbol\\\"==ct(e)?e:e+\\\"\\\"}var vt=null,bt=function(){function t(e,i){!function(t,e){if(!(t instanceof e))throw new TypeError(\\\"Cannot call a class as a function\\\")}(this,t),this.text=\\\"\\\",this.svg=null,this.groups=new Map,this.GL=0,this.GR=2,this.G_BACK=[n.get(0),n.get(1),n.get(2),a.get(31)],this.DRCS_mapping=new Map([[15,new Map],[16,new Map],[17,new Map],[18,new Map],[19,new Map],[20,new Map],[21,new Map],[22,new Map],[23,new Map],[24,new Map],[25,new Map],[26,new Map],[27,new Map],[28,new Map],[29,new Map],[30,new Map]]),this.swf_x=1920,this.swf_y=1080,this.sdf_x=1920,this.sdf_y=1080,this.sdp_x=0,this.sdp_y=0,this.ssm_x=72,this.ssm_y=72,this.shs=8,this.svs=48,this.text_size_x=1,this.text_size_y=1,this.text_type=\\\"NSZ\\\",this.position_x=-1,this.position_y=-1,this.pallet=0,this.fg_color=h[this.pallet][7],this.bg_color=h[this.pallet][8],this.force_bg_color=null,this.hlc=0,this.prev_hlc=0,this.stl=!1,this.orn=null,this.force_orn=null,this.flc=15,this.non_spacing=\\\"\\\",this.timeElapsed=0,this.endTime=null,this.rendered=!1,this.PRA=null,this.normalFont=\\\"monospace\\\",this.gaijiFont=this.normalFont,this.drcsReplacement=!1,this.drcsReplaceMapping=new Map,this.usePUA=!1,this.pes=e,this.startTime=i}return e=t,i=[{key:\\\"width\\\",value:function(){return Math.floor((this.shs+this.ssm_x)*this.text_size_x)}},{key:\\\"height\\\",value:function(){return Math.floor((this.svs+this.ssm_y)*this.text_size_y)}},{key:\\\"move_absolute_dot\\\",value:function(t,e){this.position_x=t,this.position_y=e}},{key:\\\"move_absolute_pos\\\",value:function(t,e){this.position_x=this.sdp_x+t*this.width(),this.position_y=this.sdp_y+(e+1)*this.height()}},{key:\\\"move_relative_pos\\\",value:function(t,e){for((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs));t<0;)this.position_x-=this.width(),t++,this.position_x<this.sdp_x&&(this.position_x=this.sdp_x+this.sdf_x-this.width(),e--);for(;t>0;)this.position_x+=this.width(),t--,this.position_x>=this.sdp_x+this.sdf_x&&(this.position_x=this.sdp_x,e++);for(;e<0;)this.position_y-=this.height(),e++;for(;e>0;)this.position_y+=this.height(),e--}},{key:\\\"move_newline\\\",value:function(){(this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),this.position_x=this.sdp_x,this.position_y=this.position_y+this.height()}},{key:\\\"render\\\",value:function(e){var i,r,n,s,a,o,h,c;this.svg=null!==(i=null==e?void 0:e.svg)&&void 0!==i?i:null,this.force_orn=null!==(r=\\\"boolean\\\"==typeof(null==e?void 0:e.forceStrokeColor)?null==e?void 0:e.forceStrokeColor:t.getRGBAColorCode(null==e?void 0:e.forceStrokeColor))&&void 0!==r?r:null,this.force_bg_color=null!==(n=t.getRGBAColorCode(null==e?void 0:e.forceBackgroundColor))&&void 0!==n?n:null,this.normalFont=null!==(s=null==e?void 0:e.normalFont)&&void 0!==s?s:this.normalFont,this.gaijiFont=null!==(a=null==e?void 0:e.gaijiFont)&&void 0!==a?a:this.normalFont,this.drcsReplacement=null!==(o=null==e?void 0:e.drcsReplacement)&&void 0!==o&&o,this.drcsReplaceMapping=new Map(v);for(var u,l=Object.entries(null!==(u=null==e?void 0:e.drcsReplaceMapping)&&void 0!==u?u:{}),f=0;f<l.length;f++){var d=l[f];this.drcsReplaceMapping.set(d[0],d[1])}if(this.usePUA=null!==(h=null==e?void 0:e.usePUA)&&void 0!==h&&h,!t.detect(this.pes,e))return null;if(this.svg)for(;this.svg.firstChild;)this.svg.removeChild(this.svg.firstChild);for(var p=3+(15&this.pes[2]),b=(this.pes[p+0],(this.pes[p+3]<<8)+this.pes[p+4]),g=p+9;g<p+(5+b);){this.pes[g+0];var y=this.pes[g+1],m=this.pes[g+2]<<16|this.pes[g+3]<<8|this.pes[g+4];32===y?this.parseText(g+5,g+5+m):48==y?this.parseDRCS(1,g+5,g+5+m):49==y?this.parseDRCS(2,g+5,g+5+m):53==y&&this.parseBitmap(g+5,g+5+m),g+=5+m}return{startTime:this.startTime,endTime:null!==(c=this.endTime)&&void 0!==c?c:Number.POSITIVE_INFINITY,rendered:this.rendered,textContent:this.rendered?this.text:null,PRA:this.PRA}}},{key:\\\"parseText\\\",value:function(t,e){for(;t<e;)if(32<this.pes[t]&&this.pes[t]<127){var i=0,r=this.G_BACK[this.GL];if(!r)return;for(var a=0;a<r.bytes;a++)i<<=8,i|=127&this.pes[t+a];this.renderCharacter(i,r),t+=r.bytes}else if(160<this.pes[t]&&this.pes[t]<255){var c=0,u=this.G_BACK[this.GR];if(!u)return;for(var l=0;l<u.bytes;l++)c<<=8,c|=127&this.pes[t+l];this.renderCharacter(c,u),t+=u.bytes}else if(0===this.pes[t])t+=1;else if(7===this.pes[t])t+=1;else if(8===this.pes[t])this.move_relative_pos(-1,0),t+=1;else if(9===this.pes[t])this.move_relative_pos(1,0),t+=1;else if(10===this.pes[t])this.move_relative_pos(0,1),t+=1;else if(11===this.pes[t])this.move_relative_pos(0,-1),t+=1;else if(12===this.pes[t])null!=this.startTime&&this.timeElapsed>0&&(this.endTime=this.startTime+this.timeElapsed),t+=1;else if(13===this.pes[t])this.move_newline(),t+=1;else if(14===this.pes[t])this.GL=1,t+=1;else if(15===this.pes[t])this.GL=0,t+=1;else if(22===this.pes[t]){var f=63&this.pes[t+1];this.move_relative_pos(f,0),t+=2}else if(24===this.pes[t])t+=1;else if(25===this.pes[t]){var d=0,p=this.G_BACK[2];if(!p)return;for(var v=0;v<p.bytes;v++)d<<=8,d|=127&this.pes[t+1+v];this.renderCharacter(d,p),t+=1+p.bytes}else if(27===this.pes[t])if(110===this.pes[t+1])this.GL=2,t+=2;else if(111==this.pes[t+1])this.GL=3,t+=2;else if(126==this.pes[t+1])this.GR=1,t+=2;else if(125==this.pes[t+1])this.GR=2,t+=2;else if(124==this.pes[t+1])this.GR=3,t+=2;else if(40<=this.pes[t+1]&&this.pes[t+1]<=43){var b=this.pes[t+1]-40;32===this.pes[t+2]?(this.G_BACK[b]=o.get(this.pes[t+3]),t+=4):(this.G_BACK[b]=s.get(this.pes[t+2]),t+=3)}else{if(36!==this.pes[t+1])return;if(40<=this.pes[t+2]&&this.pes[t+2]<=43){var g=this.pes[t+2]-40;32===this.pes[t+3]?(this.G_BACK[g]=o.get(this.pes[t+4]),t+=5):(this.G_BACK[g]=s.get(this.pes[t+3]),t+=4)}else this.G_BACK[0]=s.get(this.pes[t+2]),t+=3}else if(28===this.pes[t]){var y=63&this.pes[t+1],m=63&this.pes[t+2];this.move_absolute_pos(m,y),t+=3}else if(29===this.pes[t]){var _=0,w=this.G_BACK[3];if(!w)return;for(var x=0;x<w.bytes;x++)_<<=8,_|=127&this.pes[t+1+x];this.renderCharacter(_,w),t+=1+w.bytes}else if(30===this.pes[t])t+=1;else if(31===this.pes[t])t+=1;else if(32===this.pes[t]){var A=n.get(0);if(!A)return;this.renderCharacter(8481,A),t+=1}else if(127===this.pes[t])t+=1;else if(128===this.pes[t])this.fg_color=h[this.pallet][0],t+=1;else if(129===this.pes[t])this.fg_color=h[this.pallet][1],t+=1;else if(130===this.pes[t])this.fg_color=h[this.pallet][2],t+=1;else if(131===this.pes[t])this.fg_color=h[this.pallet][3],t+=1;else if(132===this.pes[t])this.fg_color=h[this.pallet][4],t+=1;else if(133===this.pes[t])this.fg_color=h[this.pallet][5],t+=1;else if(134===this.pes[t])this.fg_color=h[this.pallet][6],t+=1;else if(135===this.pes[t])this.fg_color=h[this.pallet][7],t+=1;else if(136===this.pes[t])this.text_size_x=.5,this.text_size_y=.5,this.text_type=\\\"SSZ\\\",t+=1;else if(137===this.pes[t])this.text_size_x=.5,this.text_size_y=1,this.text_type=\\\"MSZ\\\",t+=1;else if(138===this.pes[t])this.text_size_x=1,this.text_size_y=1,this.text_type=\\\"NSZ\\\",t+=1;else{if(139===this.pes[t])return;if(144===this.pes[t]){var C=this.pes[t+1];if(32==C){var T=15&this.pes[t+2];this.pallet=T,t+=3}else{var k=15&C;64==(112&C)?this.fg_color=h[this.pallet][k]:80==(112&C)&&(this.bg_color=h[this.pallet][k]),t+=2}}else if(145===this.pes[t]){var F=15&this.pes[t+1];this.flc=F,t+=2}else{if(146===this.pes[t])return;if(147===this.pes[t])return;if(148===this.pes[t])return;if(149===this.pes[t])return;if(151===this.pes[t])this.prev_hlc=this.hlc,this.hlc=15&this.pes[t+1],t+=2;else{if(152===this.pes[t])return;if(153===this.pes[t])this.stl=!1,t+=1;else if(154===this.pes[t])this.stl=!0,t+=1;else if(155===this.pes[t]){for(var S=t,R=-1,I=-1;S+1<e;)if(S+=1,32===this.pes[S])R<0&&(R=S);else if(59===this.pes[S])R<0&&I<0&&(I=S);else{if(66===this.pes[S])break;if(83===this.pes[S]){var E=t+1,O=0;if(I>=0||R<0)return;for(;E<R;)O*=10,O+=15&this.pes[E],E++;if(5===O)this.swf_x=3840,this.swf_y=2160;else if(7===O)this.swf_x=1920,this.swf_y=1080;else{if(9!=O)return;this.swf_x=1440,this.swf_y=960}break}if(84===this.pes[S])break;if(86===this.pes[S]){for(var M=t+1,G=0,B=0;M<I;)G*=10,G+=15&this.pes[M],M++;for(M++;M<R;)B*=10,B+=15&this.pes[M],M++;this.sdf_x=2*G,this.sdf_y=2*B;break}if(87===this.pes[S]){for(var P=t+1,D=0,j=0;P<I;)D*=10,D+=15&this.pes[P],P++;for(P++;P<R;)j*=10,j+=15&this.pes[P],P++;this.ssm_x=2*D,this.ssm_y=2*j;break}if(88===this.pes[S]){for(var L=t+1,N=0;L<R;)N*=10,N+=15&this.pes[L],L++;this.shs=2*N;break}if(89===this.pes[S]){for(var U=t+1,z=0;U<R;)z*=10,z+=15&this.pes[U],U++;this.svs=2*z;break}if(91===this.pes[S])break;if(92===this.pes[S])break;if(93===this.pes[S])break;if(94===this.pes[S])break;if(95===this.pes[S]){for(var H=t+1,X=0,K=0;H<I;)X*=10,X+=15&this.pes[H],H++;for(H++;H<R;)K*=10,K+=15&this.pes[H],H++;this.sdp_x=2*X,this.sdp_y=2*K;break}if(97===this.pes[S]){for(var V=t+1,$=0,W=0;V<I;)$*=10,$+=15&this.pes[V],V++;for(V++;V<R;)W*=10,W+=15&this.pes[V],V++;this.move_absolute_dot(2*$,2*W);break}if(98===this.pes[S])break;if(99===this.pes[S]){var Y=this.pes[t+1];if(48==Y)this.orn=null;else if(49==Y){var J=10*(15&this.pes[t+3])+(15&this.pes[t+4]),Z=10*(15&this.pes[t+5])+(15&this.pes[t+6]);this.orn=h[J][Z]}break}if(100===this.pes[S])break;if(101===this.pes[S])break;if(102===this.pes[S])break;if(103===this.pes[S])break;if(104===this.pes[S]){for(var q=t+1,Q=0;q<R;)Q*=10,Q+=15&this.pes[q],q++;this.PRA=Q;break}if(105===this.pes[S])break;if(106===this.pes[S])break;if(110===this.pes[S])break;if(111===this.pes[S])break}t=S+1}else{if(157!==this.pes[t])return;if(32!=this.pes[t+1])return void this.pes[t+1];var tt=63&this.pes[t+2];this.timeElapsed+=tt/10,t+=3}}}}}},{key:\\\"parseDRCS\\\",value:function(t,e,i){for(this.pes[e+0],e+=1;e<i;){var r=this.pes[e+0]<<8|this.pes[e+1],n=this.pes[e+2];e+=3;for(var s=0;s<n;s++){this.pes[e+0];var a=15&this.pes[e+0];if(0===a||1===a){var h=this.pes[e+1]+2,c=this.pes[e+2],u=this.pes[e+3],l=h.toString(2).length-h.toString(2).replace(/0*$/,\\\"\\\").length,f=Math.floor(c*u*l/8),d=new Uint8Array(Array.prototype.slice.call(this.pes,e+4,e+4+f));if(1===t){var p,v,b=64+((3840&r)>>8),g=127&r,y=null===(p=o.get(b))||void 0===p?void 0:p.alphabet;y&&(null===(v=this.DRCS_mapping.get(y))||void 0===v||v.set(g,d))}else{var m,_=32639&r;null===(m=this.DRCS_mapping.get(15))||void 0===m||m.set(_,d)}e+=4+f}}}}},{key:\\\"renderCharacter\\\",value:function(e,i){if((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),null!==this.svg){if(0===i.alphabet){var r=((65280&e)>>8)-33,s=(255&e)-33;if(0===r&&12<=s&&s<=17)return void(this.non_spacing=[\\\"́\\\",\\\"̀\\\",\\\"̈\\\",\\\"̂\\\",\\\"̅\\\",\\\"̲\\\"][s-12]);if(1===r&&93===s)return void(this.non_spacing+=\\\"⃝\\\")}if(31!==i.alphabet){this.rendered||this.svg.setAttribute(\\\"viewBox\\\",\\\"0 0 \\\".concat(this.swf_x,\\\" \\\").concat(this.swf_y)),this.rendered=!0;var o=this.force_bg_color||this.bg_color,h=t.getAlphaFromColorCode(o);if(!this.groups.has(h)){var v=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"g\\\");v.setAttribute(\\\"opacity\\\",\\\"\\\".concat(h/255)),this.groups.set(h,v),this.svg.appendChild(v)}var b=this.groups.get(h),g=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"rect\\\");if(g.setAttribute(\\\"shape-rendering\\\",\\\"crispEdges\\\"),g.setAttribute(\\\"x\\\",\\\"\\\".concat(this.position_x)),g.setAttribute(\\\"y\\\",\\\"\\\".concat(this.position_y-this.height())),g.setAttribute(\\\"width\\\",\\\"\\\".concat(this.width()+1)),g.setAttribute(\\\"height\\\",\\\"\\\".concat(this.height()+1)),g.setAttribute(\\\"fill\\\",\\\"\\\".concat(t.getRGBfromColorCode(o))),b.appendChild(g),1&this.hlc){var y=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"line\\\");y.setAttribute(\\\"shape-rendering\\\",\\\"crispEdges\\\"),y.setAttribute(\\\"x1\\\",\\\"\\\".concat(this.position_x)),y.setAttribute(\\\"y1\\\",\\\"\\\".concat(this.position_y-1)),y.setAttribute(\\\"x2\\\",\\\"\\\".concat(this.position_x+this.width())),y.setAttribute(\\\"y2\\\",\\\"\\\".concat(this.position_y-1)),y.setAttribute(\\\"stroke\\\",\\\"\\\".concat(t.getRGBAfromColorCode(this.fg_color))),y.setAttribute(\\\"stroke-width\\\",\\\"\\\".concat(2)),this.svg.appendChild(y)}if(2&this.hlc){var m=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"line\\\");m.setAttribute(\\\"shape-rendering\\\",\\\"crispEdges\\\"),m.setAttribute(\\\"x1\\\",\\\"\\\".concat(this.position_x+this.width()-1)),m.setAttribute(\\\"y1\\\",\\\"\\\".concat(this.position_y-this.height())),m.setAttribute(\\\"x2\\\",\\\"\\\".concat(this.position_x+this.width()-1)),m.setAttribute(\\\"y2\\\",\\\"\\\".concat(this.position_y)),m.setAttribute(\\\"stroke\\\",\\\"\\\".concat(t.getRGBAfromColorCode(this.fg_color))),m.setAttribute(\\\"stroke-width\\\",\\\"\\\".concat(2)),this.svg.appendChild(m)}if(4&this.hlc){var _=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"line\\\");_.setAttribute(\\\"shape-rendering\\\",\\\"crispEdges\\\"),_.setAttribute(\\\"x1\\\",\\\"\\\".concat(this.position_x)),_.setAttribute(\\\"y1\\\",\\\"\\\".concat(this.position_y-this.height()+1)),_.setAttribute(\\\"x2\\\",\\\"\\\".concat(this.position_x+this.width())),_.setAttribute(\\\"y2\\\",\\\"\\\".concat(this.position_y-this.height()+1)),_.setAttribute(\\\"stroke\\\",\\\"\\\".concat(t.getRGBAfromColorCode(this.fg_color))),_.setAttribute(\\\"stroke-width\\\",\\\"\\\".concat(2)),this.svg.appendChild(_)}if(8&this.hlc){var w=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"line\\\");w.setAttribute(\\\"shape-rendering\\\",\\\"crispEdges\\\"),w.setAttribute(\\\"x1\\\",\\\"\\\".concat(this.position_x+1)),w.setAttribute(\\\"y1\\\",\\\"\\\".concat(this.position_y-this.height())),w.setAttribute(\\\"x2\\\",\\\"\\\".concat(this.position_x+1)),w.setAttribute(\\\"y2\\\",\\\"\\\".concat(this.position_y)),w.setAttribute(\\\"stroke\\\",\\\"\\\".concat(t.getRGBAfromColorCode(this.fg_color))),w.setAttribute(\\\"stroke-width\\\",\\\"\\\".concat(2)),this.svg.appendChild(w)}if(this.stl){var x=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"line\\\");x.setAttribute(\\\"shape-rendering\\\",\\\"crispEdges\\\"),x.setAttribute(\\\"x1\\\",\\\"\\\".concat(this.position_x)),x.setAttribute(\\\"y1\\\",\\\"\\\".concat(this.position_y-1)),x.setAttribute(\\\"x2\\\",\\\"\\\".concat(this.position_x+this.width())),x.setAttribute(\\\"y2\\\",\\\"\\\".concat(this.position_y-1)),x.setAttribute(\\\"stroke\\\",\\\"\\\".concat(t.getRGBAfromColorCode(this.fg_color))),x.setAttribute(\\\"stroke-width\\\",\\\"\\\".concat(2)),this.svg.appendChild(x)}}if(0===i.alphabet){var A=94*(((65280&e)>>8)-33)+((255&e)-33),C=7896;if(A<C){var k=c[A];this.renderFont(k)}else if(this.usePUA){var F=u[A-C];this.renderFont(F)}else{var S=l[A-C];this.renderFont(S)}this.move_relative_pos(1,0)}else if(1===i.alphabet){var R=f[e-33];this.renderFont(R),this.move_relative_pos(1,0)}else if(2===i.alphabet){var I=d[e-33];this.renderFont(I),this.move_relative_pos(1,0)}else if(3===i.alphabet){var E=p[e-33];this.renderFont(E),this.move_relative_pos(1,0)}else{if(31===i.alphabet)return void(96===e?(this.G_BACK=[n.get(0),n.get(1),n.get(2),a.get(31)],this.GL=0,this.GR=2):97===e?(this.G_BACK=[n.get(0),n.get(3),n.get(2),a.get(31)],this.GL=0,this.GR=2):98===e?(this.G_BACK=[n.get(0),a.get(16),n.get(2),a.get(31)],this.GL=0,this.GR=2):99===e?(this.G_BACK=[n.get(4),n.get(6),n.get(7),a.get(31)],this.GL=0,this.GR=2):100===e?(this.G_BACK=[n.get(4),n.get(5),n.get(7),a.get(31)],this.GL=0,this.GR=2):101===e?(this.G_BACK=[n.get(4),a.get(16),n.get(7),a.get(31)],this.GL=0,this.GR=2):102===e?(this.G_BACK=[a.get(16),a.get(17),a.get(18),a.get(31)],this.GL=0,this.GR=2):103===e?(this.G_BACK=[a.get(19),a.get(20),a.get(21),a.get(31)],this.GL=0,this.GR=2):104===e?(this.G_BACK=[a.get(22),a.get(23),a.get(24),a.get(31)],this.GL=0,this.GR=2):105===e?(this.G_BACK=[a.get(25),a.get(26),a.get(27),a.get(31)],this.GL=0,this.GR=2):106===e?(this.G_BACK=[a.get(28),a.get(29),a.get(30),a.get(31)],this.GL=0,this.GR=2):107===e?(this.G_BACK=[n.get(0),a.get(17),n.get(2),a.get(31)],this.GL=0,this.GR=2):108===e?(this.G_BACK=[n.get(0),a.get(18),n.get(2),a.get(31)],this.GL=0,this.GR=2):109===e?(this.G_BACK=[n.get(0),a.get(19),n.get(2),a.get(31)],this.GL=0,this.GR=2):110===e?(this.G_BACK=[n.get(3),n.get(2),n.get(1),a.get(31)],this.GL=0,this.GR=2):111===e&&(this.G_BACK=[n.get(1),n.get(4),a.get(16),a.get(31)],this.GL=0,this.GR=2));var O,M=null===(O=this.DRCS_mapping.get(i.alphabet))||void 0===O?void 0:O.get(32639&e);if(!M)return;var G=T(M.buffer);if(this.drcsReplacement&&this.drcsReplaceMapping.has(G.toLowerCase()))this.renderFont(this.drcsReplaceMapping.get(G.toLowerCase()));else if(this.drcsReplacement&&this.drcsReplaceMapping.has(G.toUpperCase()))this.renderFont(this.drcsReplaceMapping.get(G.toUpperCase()));else{var B=document.createElement(\\\"canvas\\\"),P=Math.floor(this.ssm_x*this.text_size_x/2),D=Math.floor(this.ssm_y*this.text_size_y/2),j=Math.floor(8*M.length/(P*D));B.width=2*(P+4),B.height=2*(D+4);var L=B.getContext(\\\"2d\\\");if(!L)return;var N=this.getOrnColorCode();if(N&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color)){L.fillStyle=t.getRGBAfromColorCode(N);for(var U=-2;U<=2;U++)for(var z=-2;z<=2;z++)for(var H=0;H<D;H++)for(var X=0;X<P;X++){for(var K=0,V=0;V<j;V++){var $=7-((H*P+X)*j+V)%8;K*=2,K+=(M[Math.floor(((H*P+X)*j+V)/8)]&1<<$)>>$}K>0&&L.fillRect(2*(2+X+z),2*(2+H+U),2,2)}}L.fillStyle=t.getRGBAfromColorCode(this.fg_color);for(var W=0;W<D;W++)for(var Y=0;Y<P;Y++){for(var J=0,Z=0;Z<j;Z++){var q=7-((W*P+Y)*j+Z)%8;J*=2,J+=(M[Math.floor(((W*P+Y)*j+Z)/8)]&1<<q)>>q}J>0&&L.fillRect(2*(2+Y),2*(2+W),2,2)}var Q=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"image\\\");if(Q.setAttribute(\\\"href\\\",B.toDataURL()),Q.setAttribute(\\\"x\\\",\\\"\\\".concat(this.position_x+Math.floor(this.shs*this.text_size_x/2)-4)),Q.setAttribute(\\\"y\\\",\\\"\\\".concat(this.position_y+Math.floor(this.svs*this.text_size_y/2)-this.height()-4)),Q.setAttribute(\\\"width\\\",\\\"\\\".concat(B.width/2*2)),Q.setAttribute(\\\"height\\\",\\\"\\\".concat(B.height/2*2)),0===this.flc){var tt=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"animate\\\");tt.setAttribute(\\\"attributeName\\\",\\\"opacity\\\"),tt.setAttribute(\\\"values\\\",\\\"1;0\\\"),tt.setAttribute(\\\"dur\\\",\\\"1s\\\"),tt.setAttribute(\\\"calcMode\\\",\\\"discrete\\\"),tt.setAttribute(\\\"repeatCount\\\",\\\"indefinite\\\"),Q.appendChild(tt)}else if(7===this.flc){var et=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"animate\\\");et.setAttribute(\\\"attributeName\\\",\\\"opacity\\\"),et.setAttribute(\\\"values\\\",\\\"0;1\\\"),et.setAttribute(\\\"dur\\\",\\\"1s\\\"),et.setAttribute(\\\"calcMode\\\",\\\"discrete\\\"),et.setAttribute(\\\"repeatCount\\\",\\\"indefinite\\\"),Q.appendChild(et)}this.svg.appendChild(Q)}this.move_relative_pos(1,0)}}}},{key:\\\"renderFont\\\",value:function(e){var i,r;e+=this.non_spacing,this.non_spacing=\\\"\\\",.5===this.text_size_x&&.5===this.text_size_y&&(d.includes(e)||p.includes(e))||(this.text+=e);var n=b.has(e),s=n?this.gaijiFont:this.normalFont;if(null!=vt&&null!==(i=vt)&&void 0!==i&&i.has(e)){var a=vt.get(e),o=a.viewBox,h=a.path;this.renderPath(o,h)}else{n&&(e+=\\\"︎\\\");var c=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"text\\\");if(c.setAttribute(\\\"x\\\",\\\"0\\\"),c.setAttribute(\\\"y\\\",\\\"0\\\"),c.setAttribute(\\\"transform\\\",\\\"scale(\\\".concat(this.text_size_x,\\\" \\\").concat(this.text_size_y,\\\") translate(\\\").concat((this.position_x+this.width()/2)/this.text_size_x,\\\" \\\").concat((this.position_y-this.height()/2)/this.text_size_y,\\\")\\\")),c.setAttribute(\\\"transform-origin\\\",\\\"0 0\\\"),c.setAttribute(\\\"font-size\\\",\\\"\\\".concat(this.ssm_x)),c.setAttribute(\\\"font-family\\\",s),c.setAttribute(\\\"dominant-baseline\\\",\\\"central\\\"),c.setAttribute(\\\"text-anchor\\\",\\\"middle\\\"),c.setAttribute(\\\"fill\\\",t.getRGBAfromColorCode(this.fg_color)),c.setAttribute(\\\"paint-order\\\",\\\"stroke\\\"),c.setAttribute(\\\"stroke-linejoin\\\",\\\"round\\\"),c.setAttribute(\\\"stroke-width\\\",this.getOrnColorCode()?\\\"\\\".concat(8):\\\"0\\\"),c.setAttribute(\\\"stroke\\\",this.getOrnColorCode()?t.getRGBAfromColorCode(this.getOrnColorCode()):\\\"transparent\\\"),c.appendChild(document.createTextNode(e)),0===this.flc){var u=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"animate\\\");u.setAttribute(\\\"attributeName\\\",\\\"opacity\\\"),u.setAttribute(\\\"values\\\",\\\"1;0\\\"),u.setAttribute(\\\"dur\\\",\\\"1s\\\"),u.setAttribute(\\\"calcMode\\\",\\\"discrete\\\"),u.setAttribute(\\\"repeatCount\\\",\\\"indefinite\\\"),c.appendChild(u)}else if(7===this.flc){var l=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"animate\\\");l.setAttribute(\\\"attributeName\\\",\\\"opacity\\\"),l.setAttribute(\\\"values\\\",\\\"0;1\\\"),l.setAttribute(\\\"dur\\\",\\\"1s\\\"),l.setAttribute(\\\"calcMode\\\",\\\"discrete\\\"),l.setAttribute(\\\"repeatCount\\\",\\\"indefinite\\\"),c.appendChild(l)}null===(r=this.svg)||void 0===r||r.appendChild(c)}}},{key:\\\"renderPath\\\",value:function(e,i){var r;document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"svg\\\").setAttribute(\\\"viewBox\\\",\\\"\\\".concat(e[0],\\\" \\\").concat(e[1],\\\" \\\").concat(e[2],\\\" \\\").concat(e[3]));var n=this.ssm_x*this.text_size_x/(e[2]-e[0]),s=this.ssm_y*this.text_size_y/(e[3]-e[1]),a=this.shs*this.text_size_x/2,o=this.svs*this.text_size_y/2,h=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"path\\\");if(h.setAttribute(\\\"d\\\",i),h.setAttribute(\\\"x\\\",\\\"0\\\"),h.setAttribute(\\\"y\\\",\\\"0\\\"),h.setAttribute(\\\"transform\\\",\\\"scale(\\\".concat(n,\\\" \\\").concat(s,\\\") translate(\\\").concat((this.position_x+a)/n,\\\" \\\").concat((this.position_y+o-this.height())/s,\\\")\\\")),h.setAttribute(\\\"transform-origin\\\",\\\"0 0\\\"),h.setAttribute(\\\"fill\\\",t.getRGBAfromColorCode(this.fg_color)),h.setAttribute(\\\"paint-order\\\",\\\"stroke\\\"),h.setAttribute(\\\"stroke-linejoin\\\",\\\"round\\\"),h.setAttribute(\\\"stroke-width\\\",this.getOrnColorCode()?\\\"\\\".concat(4/Math.min(n,s)):\\\"0\\\"),h.setAttribute(\\\"stroke\\\",this.getOrnColorCode()?t.getRGBAfromColorCode(this.getOrnColorCode()):\\\"transparent\\\"),0===this.flc){var c=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"animate\\\");c.setAttribute(\\\"attributeName\\\",\\\"opacity\\\"),c.setAttribute(\\\"values\\\",\\\"1;0\\\"),c.setAttribute(\\\"dur\\\",\\\"1s\\\"),c.setAttribute(\\\"calcMode\\\",\\\"discrete\\\"),c.setAttribute(\\\"repeatCount\\\",\\\"indefinite\\\"),h.appendChild(c)}else if(7===this.flc){var u=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"animate\\\");u.setAttribute(\\\"attributeName\\\",\\\"opacity\\\"),u.setAttribute(\\\"values\\\",\\\"0;1\\\"),u.setAttribute(\\\"dur\\\",\\\"1s\\\"),u.setAttribute(\\\"calcMode\\\",\\\"discrete\\\"),u.setAttribute(\\\"repeatCount\\\",\\\"indefinite\\\"),h.appendChild(u)}null===(r=this.svg)||void 0===r||r.appendChild(h)}},{key:\\\"parseBitmap\\\",value:function(t,e){if(null!==this.svg){this.rendered||this.svg.setAttribute(\\\"viewBox\\\",\\\"0 0 \\\".concat(this.swf_x,\\\" \\\").concat(this.swf_y)),this.rendered=!0;var i=this.pes[t]<<8|this.pes[t+1];t+=2;var r=this.pes[t]<<8|this.pes[t+1];t+=2;var n=this.pes[t];t+=1;var s=new Set(this.pes.subarray(t,t+n));if(!((t+=n)+33>e)){var a=this.pes.subarray(t,t+33),o=this.pes.subarray(t+33,e),c=new Uint8Array(a.byteLength+o.byteLength+396+140),u=new DataView(c.buffer);c.set(a,0),c.set(o,569);for(var l=0;l<8;l++)for(var f=0;f<16;f++)if(!s.has(16*l+f)){var d=h[l][f],p=Number.parseInt(d.substring(1,3),16),v=Number.parseInt(d.substring(3,5),16),b=Number.parseInt(d.substring(5,7),16),g=Number.parseInt(d.substring(7,9),16);c[41+3*(16*l+f)]=p,c[41+3*(16*l+f)+1]=v,c[41+3*(16*l+f)+2]=b,c[437+(16*l+f)]=g}u.setInt32(33,384,!1),c[37]=\\\"P\\\".charCodeAt(0),c[38]=\\\"L\\\".charCodeAt(0),c[39]=\\\"T\\\".charCodeAt(0),c[40]=\\\"E\\\".charCodeAt(0),u.setInt32(429,128,!1),c[433]=\\\"t\\\".charCodeAt(0),c[434]=\\\"R\\\".charCodeAt(0),c[435]=\\\"N\\\".charCodeAt(0),c[436]=\\\"S\\\".charCodeAt(0),u.setInt32(425,ht(c,37,425),!1),u.setInt32(565,ht(c,433,565),!1);var y=u.getInt32(16,!1),m=u.getInt32(20,!1),_=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"svg\\\");_.setAttribute(\\\"x\\\",\\\"\\\".concat(this.sdp_x)),_.setAttribute(\\\"y\\\",\\\"\\\".concat(this.sdp_y)),_.setAttribute(\\\"width\\\",\\\"\\\".concat(this.sdf_x)),_.setAttribute(\\\"height\\\",\\\"\\\".concat(this.sdf_y)),_.setAttribute(\\\"viewBox\\\",\\\"0 0 \\\".concat(this.sdf_x,\\\" \\\").concat(this.sdf_y));var w=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"image\\\");if(w.setAttribute(\\\"href\\\",\\\"data:image/png;base64,\\\"+window.btoa(String.fromCharCode.apply(String,ut(c)))),w.setAttribute(\\\"x\\\",\\\"\\\".concat(2*i)),w.setAttribute(\\\"y\\\",\\\"\\\".concat(2*r)),w.setAttribute(\\\"width\\\",\\\"\\\".concat(2*y)),w.setAttribute(\\\"height\\\",\\\"\\\".concat(2*m)),_.appendChild(w),s.size>0){for(var x=0;x<8;x++)for(var A=0;A<16;A++)if(s.has(16*x+A)){var C=h[x][A],T=Number.parseInt(C.substring(1,3),16),k=Number.parseInt(C.substring(3,5),16),F=Number.parseInt(C.substring(5,7),16),S=Number.parseInt(C.substring(7,9),16);c[41+3*(16*x+A)]=T,c[41+3*(16*x+A)+1]=k,c[41+3*(16*x+A)+2]=F,c[437+(16*x+A)]=S}else c[437+(16*x+A)]=0;u.setInt32(425,ht(c,37,425),!1),u.setInt32(565,ht(c,433,565),!1);var R=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"image\\\");R.setAttribute(\\\"href\\\",\\\"data:image/png;base64,\\\"+window.btoa(String.fromCharCode.apply(String,ut(c)))),R.setAttribute(\\\"x\\\",\\\"\\\".concat(2*i)),R.setAttribute(\\\"y\\\",\\\"\\\".concat(2*r)),R.setAttribute(\\\"width\\\",\\\"\\\".concat(2*y)),R.setAttribute(\\\"height\\\",\\\"\\\".concat(2*m));var I=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"animate\\\");I.setAttribute(\\\"attributeName\\\",\\\"opacity\\\"),I.setAttribute(\\\"values\\\",\\\"1;0\\\"),I.setAttribute(\\\"dur\\\",\\\"1s\\\"),I.setAttribute(\\\"calcMode\\\",\\\"discrete\\\"),I.setAttribute(\\\"repeatCount\\\",\\\"indefinite\\\"),R.appendChild(I),_.appendChild(R)}this.svg.appendChild(_)}}}},{key:\\\"getOrnColorCode\\\",value:function(){return!0===this.force_orn?t.fillAlphaColorCode(this.bg_color):!1===this.force_orn?this.orn:null!==(e=this.force_orn)&&void 0!==e?e:this.orn;var e}}],r=[{key:\\\"setEmbeddedGlyph\\\",value:function(t){vt=t}},{key:\\\"detect\\\",value:function(t,e){var i,r,n=null!==(i=null==e?void 0:e.data_identifier)&&void 0!==i?i:128,s=null!==(r=null==e?void 0:e.data_group_id)&&void 0!==r?r:1;if(t.length<=0)return!1;if(t[0]!==n)return!1;if(t.length<=2)return!1;var a=3+(15&t[2]);return!(t.length<=a||(15&(252&t[a+0])>>2)!==s||(y(t,a),0))}},{key:\\\"getRGBAColorCode\\\",value:function(t){if(null==t)return null;var e=document.createElement(\\\"canvas\\\");e.width=e.height=1;var i=e.getContext(\\\"2d\\\");if(!i)return null;i.fillStyle=t,i.fillRect(0,0,e.width,e.height);var r=function(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:\\\"undefined\\\"!=typeof Symbol&&t[Symbol.iterator]||t[\\\"@@iterator\\\"];if(null!=i){var r,n,s,a,o=[],h=!0,c=!1;try{if(s=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;h=!1}else for(;!(h=(r=s.call(i)).done)&&(o.push(r.value),o.length!==e);h=!0);}catch(t){c=!0,n=t}finally{try{if(!h&&null!=i.return&&(a=i.return(),Object(a)!==a))return}finally{if(c)throw n}}return o}}(t,e)||lt(t,e)||function(){throw new TypeError(\\\"Invalid attempt to destructure non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\\\")}()}(i.getImageData(0,0,1,1).data,4),n=r[0],s=r[1],a=r[2],o=r[3],h=\\\"#\\\".concat(n.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(s.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(a.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(o.toString(16).toUpperCase().padStart(2,\\\"0\\\"));return e.width=e.height=0,h}},{key:\\\"fillAlphaColorCode\\\",value:function(t){if(null==t)return\\\"\\\";var e=Number.parseInt(t.substring(1,3),16),i=Number.parseInt(t.substring(3,5),16),r=Number.parseInt(t.substring(5,7),16);return\\\"#\\\".concat(e.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(i.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(r.toString(16).toUpperCase().padStart(2,\\\"0\\\"),\\\"FF\\\")}},{key:\\\"getRGBAfromColorCode\\\",value:function(t){if(null==t)return\\\"\\\";var e=Number.parseInt(t.substring(1,3),16),i=Number.parseInt(t.substring(3,5),16),r=Number.parseInt(t.substring(5,7),16),n=Number.parseInt(t.substring(7,9),16);return\\\"rgba(\\\".concat(e,\\\", \\\").concat(i,\\\", \\\").concat(r,\\\", \\\").concat(n/255,\\\")\\\")}},{key:\\\"getRGBfromColorCode\\\",value:function(t){if(null==t)return\\\"\\\";var e=Number.parseInt(t.substring(1,3),16),i=Number.parseInt(t.substring(3,5),16),r=Number.parseInt(t.substring(5,7),16);return\\\"rgb(\\\".concat(e,\\\", \\\").concat(i,\\\", \\\").concat(r,\\\")\\\")}},{key:\\\"getAlphaFromColorCode\\\",value:function(t){return null==t?Number.NaN:Number.parseInt(t.substring(7,9),16)}}],i&&dt(e.prototype,i),r&&dt(e,r),Object.defineProperty(e,\\\"prototype\\\",{writable:!1}),e;var e,i,r}();function gt(t){return gt=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\\\"function\\\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\\\"symbol\\\":typeof t},gt(t)}function yt(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,r)}return i}function mt(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?yt(Object(i),!0).forEach((function(e){_t(t,e,i[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):yt(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}function _t(t,e,i){return(e=xt(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function wt(t,e){for(var i=0;i<e.length;i++){var r=e[i];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(t,xt(r.key),r)}}function xt(t){var e=function(t){if(\\\"object\\\"!=gt(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,\\\"string\\\");if(\\\"object\\\"!=gt(i))return i;throw new TypeError(\\\"@@toPrimitive must return a primitive value.\\\")}return String(t)}(t);return\\\"symbol\\\"==gt(e)?e:e+\\\"\\\"}var At=function(){return t=function t(e){var i,r,n,s;!function(t,e){if(!(t instanceof e))throw new TypeError(\\\"Cannot call a class as a function\\\")}(this,t),this.media=null,this.id3Track=null,this.b24Track=null,this.subtitleElement=null,this.svg=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"svg\\\"),this.textContent=null,this.prevCurrentTime=null,this.highResTimeupdatePollingId=null,this.isShowing=!0,this.isOnSeeking=!1,this.onB24CueChangeDrawed=!1,this.onID3AddtrackHandler=this.onID3Addtrack.bind(this),this.onID3CueChangeHandler=this.onID3CueChange.bind(this),this.onB24CueChangeHandler=this.onB24CueChange.bind(this),this.onHighResTimeupdateHandler=this.onHighResTimeupdate.bind(this),this.onTimeupdateHandler=this.onTimeupdate.bind(this),this.onCanplayHandler=this.onCanplay.bind(this),this.onPlayHandler=this.onPlay.bind(this),this.onPauseHandler=this.onPause.bind(this),this.onPauseAnimationHandler=this.onPauseAnimation.bind(this),this.onResumeAnimationHandler=this.onResumeAnimation.bind(this),this.onSeekingHandler=this.onSeeking.bind(this),this.onSeekedHandler=this.onSeeked.bind(this),this.data_identifier=null!==(i=null==e?void 0:e.data_identifier)&&void 0!==i?i:128,this.data_group_id=null!==(r=null==e?void 0:e.data_group_id)&&void 0!==r?r:1,this.rendererOption=mt(mt({},e),{},{data_identifier:this.data_identifier,data_group_id:this.data_group_id,keepAspectRatio:null===(n=null==e?void 0:e.keepAspectRatio)||void 0===n||n,enableAutoInBandMetadataTextTrackDetection:null===(s=null==e?void 0:e.enableAutoInBandMetadataTextTrackDetection)||void 0===s||s})},(e=[{key:\\\"attachMedia\\\",value:function(t,e){var i;this.detachMedia(),this.media=t,this.subtitleElement=null!=e?e:t.parentElement,this.media.addEventListener(\\\"canplay\\\",this.onCanplayHandler),this.media.addEventListener(\\\"play\\\",this.onResumeAnimationHandler),this.media.addEventListener(\\\"pause\\\",this.onPauseAnimationHandler),null!==(i=this.rendererOption)&&void 0!==i&&i.useHighResTimeupdate?(this.media.addEventListener(\\\"play\\\",this.onPlayHandler),this.media.addEventListener(\\\"pause\\\",this.onPauseHandler)):this.media.addEventListener(\\\"timeupdate\\\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.setupTrack(),this.setupSVG()}},{key:\\\"detachMedia\\\",value:function(){var t,e,i,r,n,s;this.cleanupSVG(),this.cleanupTrack(),null===(t=this.media)||void 0===t||t.removeEventListener(\\\"canplay\\\",this.onCanplayHandler),null===(e=this.media)||void 0===e||e.removeEventListener(\\\"play\\\",this.onPlayHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\\\"pause\\\",this.onPauseHandler),null===(r=this.media)||void 0===r||r.removeEventListener(\\\"play\\\",this.onResumeAnimationHandler),null===(n=this.media)||void 0===n||n.removeEventListener(\\\"pause\\\",this.onPauseAnimationHandler),this.onPause(),null===(s=this.media)||void 0===s||s.removeEventListener(\\\"timeupdate\\\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.media=this.subtitleElement=null}},{key:\\\"dispose\\\",value:function(){this.detachMedia()}},{key:\\\"getSVG\\\",value:function(){return this.svg}},{key:\\\"getTextContent\\\",value:function(){return this.textContent}},{key:\\\"show\\\",value:function(){this.isShowing=!0,this.svg.style.visibility=\\\"visible\\\"}},{key:\\\"hide\\\",value:function(){this.isShowing=!1,this.svg.style.visibility=\\\"hidden\\\"}},{key:\\\"isPresent\\\",value:function(){return this.onB24CueChangeDrawed}},{key:\\\"pushRawData\\\",value:function(t,e){var i=new bt(e,t).render(mt({},this.rendererOption));if(null==i)return!1;var r=Number.isFinite(i.endTime)?i.endTime:Number.MAX_SAFE_INTEGER;return this.addB24Cue(t,r,e)}},{key:\\\"pushBase64Data\\\",value:function(t,e){var i=tt(e);return this.pushRawData(t,i)}},{key:\\\"pushData\\\",value:function(t,e,i){return this.pushRawData(i,e)}},{key:\\\"pushID3v2PRIVData\\\",value:function(t,e,i){return\\\"aribb24.js\\\"===e&&this.pushRawData(t,i)}},{key:\\\"pushID3v2TXXXData\\\",value:function(t,e,i){return\\\"aribb24.js\\\"===e&&this.pushBase64Data(t,i)}},{key:\\\"pushID3v2Data\\\",value:function(t,e){for(var i=!1,r=0;r<e.length;){var n=r;if(r+3>e.length)break;if(73!==e[r+0]||68!==e[r+1]||51!==e[r+2]){if(0===r){r+=5;continue}break}if((r+=6)+4>e.length)break;var s=J(e,r+0,r+4);r+=4;var a=n+3+2+1+4+s;if(a>e.length)break;for(var o=r;o<a;){var h=o;if(o+4>e.length)break;var c=Q(e,o+0,o+4);if((o+=4)+4>e.length)break;var u=J(e,o+0,o+4);o+=6;var l=h+4+4+2+u;if(l>e.length)break;if(\\\"PRIV\\\"===c){for(var f=o,d=l;0!==e[o]&&o<l;)o++;var p=Q(e,f,o),v=new Uint8Array(Array.prototype.slice.call(e,o+1,d));this.pushID3v2PRIVData(t,p,v)&&(i=!0)}else if(\\\"TXXX\\\"===c){var b=e[o+0],g=o+1;if(3===b){for(;0!==e[o]&&o<l;)o++;for(var y=o,m=o+=1;0!==e[o]&&o<l;)o++;var _=o,w=q(e,g,y),x=q(e,m,_);this.pushID3v2TXXXData(t,w,x)&&(i=!0)}else if(0===b){for(;0!==e[o]&&o<l;)o++;for(var A=o,C=o+=1;0!==e[o]&&o<l;)o++;var T=o,k=Q(e,g,A),F=Q(e,C,T);this.pushID3v2TXXXData(t,k,F)&&(i=!0)}}o=l}(r=n+3+2+1+4+s)+3>e.length||51===e[r+0]&&68===e[r+1]&&73===e[r+2]&&(r+=10)}return i}},{key:\\\"setInBandMetadataTextTrack\\\",value:function(t){var e;null===(e=this.id3Track)||void 0===e||e.removeEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler),this.id3Track=t,this.id3Track.mode=\\\"hidden\\\",this.id3Track.addEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler)}},{key:\\\"pushID3v2Cue\\\",value:function(t){if(!this.id3Track)return!1;var e=t.startTime,i=t;if(\\\"15260DFFFF49443320FF49443320000F\\\"===this.id3Track.inBandMetadataTrackDispatchType)return this.pushID3v2Data(e,new Uint8Array(i.data));if(\\\"com.apple.streaming\\\"===this.id3Track.inBandMetadataTrackDispatchType){if(\\\"PRIV\\\"===i.value.key)return this.pushID3v2PRIVData(e,i.value.info,new Uint8Array(i.value.data));if(\\\"TXXX\\\"===i.value.key)return this.pushID3v2TXXXData(e,i.value.info,i.value.data)}else if(\\\"id3\\\"===this.id3Track.label){if(\\\"PRIV\\\"===i.value.key)return this.pushID3v2PRIVData(e,i.value.info,new Uint8Array(i.value.data));if(\\\"TXXX\\\"===i.value.key)return this.pushID3v2TXXXData(e,i.value.info,i.value.data)}else if(\\\"Timed Metadata\\\"===this.id3Track.label){if(\\\"PRIV\\\"===i.frame.key)return this.pushID3v2PRIVData(e,i.frame.owner,new Uint8Array(i.frame.data));if(\\\"TXXX\\\"===i.frame.key)return this.pushID3v2TXXXData(e,i.frame.description,i.frame.data)}return!1}},{key:\\\"onID3CueChange\\\",value:function(){this.id3Track&&(this.isOnSeeking||this.onTimeupdate())}},{key:\\\"addB24Cue\\\",value:function(t,e,i){var r;if(!this.b24Track)return!1;if(!bt.detect(i,this.rendererOption))return!1;var n=new(null!==(r=window.VTTCue)&&void 0!==r?r:window.TextTrackCue)(t,e,\\\"\\\");if(n.data=i,window.VTTCue)this.b24Track.addCue(n);else if(window.TextTrackCue){var s;if(Array.prototype.some.call(null!==(s=this.b24Track.cues)&&void 0!==s?s:[],(function(e){return e.startTime===t})))return!1;if(this.b24Track.cues){for(var a=[],o=this.b24Track.cues.length-1;o>=0;o--)this.b24Track.cues[o].startTime>=t&&(a.push(this.b24Track.cues[o]),this.b24Track.removeCue(this.b24Track.cues[o]));this.b24Track.addCue(n);for(var h=a.length-1;h>=0;h--)this.b24Track.addCue(a[h])}}return!0}},{key:\\\"onB24CueChange\\\",value:function(){if(this.media&&this.b24Track){for(;this.svg.firstChild;)this.svg.removeChild(this.svg.firstChild);if(this.b24Track.activeCues&&this.b24Track.activeCues.length>0){var t=this.b24Track.activeCues[this.b24Track.activeCues.length-1];if(t.startTime<=this.media.currentTime&&this.media.currentTime<=t.endTime&&!this.isOnSeeking){var e=new bt(t.data,t.startTime);if(this.isShowing){var i,r,n,s=e.render(mt(mt({},this.rendererOption),{},{svg:this.svg}));null!=(null==s?void 0:s.PRA)&&(null===(r=this.rendererOption)||void 0===r||null===(n=r.PRACallback)||void 0===n||n.call(r,s.PRA)),null==s||s.rendered,this.textContent=null!==(i=null==s?void 0:s.textContent)&&void 0!==i?i:null}this.onB24CueChangeDrawed=!0}else this.onB24CueChangeDrawed=!1,this.textContent=null;for(var a=this.b24Track.activeCues.length-2;a>=0;a--){var o=this.b24Track.activeCues[a];o.endTime=Math.min(o.endTime,t.startTime),o.startTime===o.endTime&&this.b24Track.removeCue(o)}}else this.onB24CueChangeDrawed=!1,this.textContent=null}else this.onB24CueChangeDrawed=!1}},{key:\\\"onHighResTimeupdate\\\",value:function(){this.onTimeupdate(),this.highResTimeupdatePollingId=window.requestAnimationFrame(this.onHighResTimeupdateHandler)}},{key:\\\"onTimeupdate\\\",value:function(){if(this.media)if(null!=this.prevCurrentTime)if(this.id3Track&&this.id3Track.cues&&0!==this.id3Track.cues.length)if(this.isOnSeeking)this.prevCurrentTime=this.media.currentTime;else if(Math.abs(this.media.currentTime-this.prevCurrentTime)>1)this.prevCurrentTime=this.media.currentTime;else{for(var t,e,i=new Y(Number.NEGATIVE_INFINITY,this.id3Track.cues[0].startTime),r=[i],n=0;n<this.id3Track.cues.length;n++)r.push(this.id3Track.cues[n]);for(var s=0,a=r.length;s+1<a;){var o=this.prevCurrentTime,h=Math.floor((s+a)/2);o<r[h].startTime?a=h:s=h}t=s;for(var c=0,u=r.length;c+1<u;){var l=this.media.currentTime,f=Math.floor((c+u)/2);l<r[f].startTime?u=f:c=f}if(e=c,null!==t&&null!==e&&t!==e){if(t<e)for(var d=e;d>t;d--){var p=r[d];if(p!==i&&this.pushID3v2Cue(p))break}else for(var v=t;v<e;v++){var b=r[v];if(b!==i&&this.pushID3v2Cue(b))break}this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime;else this.prevCurrentTime=this.media.currentTime}},{key:\\\"onCanplay\\\",value:function(){this.id3Track&&(this.id3Track.mode=\\\"hidden\\\"),this.b24Track&&(this.b24Track.mode=\\\"hidden\\\"),null!=this.media&&null==this.prevCurrentTime&&(this.prevCurrentTime=this.media.currentTime-Number.MIN_VALUE)}},{key:\\\"onPlay\\\",value:function(){null==this.highResTimeupdatePollingId&&this.onHighResTimeupdate()}},{key:\\\"onPause\\\",value:function(){null!=this.highResTimeupdatePollingId&&(window.cancelAnimationFrame(this.highResTimeupdatePollingId),this.highResTimeupdatePollingId=null)}},{key:\\\"onPauseAnimation\\\",value:function(){this.svg.pauseAnimations()}},{key:\\\"onResumeAnimation\\\",value:function(){this.svg.unpauseAnimations()}},{key:\\\"onSeeking\\\",value:function(){this.isOnSeeking=!0,this.onB24CueChange()}},{key:\\\"onSeeked\\\",value:function(){this.isOnSeeking=!1}},{key:\\\"onID3Addtrack\\\",value:function(t){if(this.media){var e=t.track;\\\"metadata\\\"===e.kind&&(\\\"15260DFFFF49443320FF49443320000F\\\"!==e.inBandMetadataTrackDispatchType&&\\\"com.apple.streaming\\\"!==e.inBandMetadataTrackDispatchType&&\\\"id3\\\"!==e.label||this.setInBandMetadataTextTrack(e))}}},{key:\\\"setupTrack\\\",value:function(){var t,e;if(this.media){if(null!==(t=this.rendererOption)&&void 0!==t&&t.useHighResTextTrack)this.b24Track=new K(this.media),this.b24Track.startPolling();else{for(var i=\\\"ARIB B24 Japanese SVG (data_identifier=0x\\\".concat(this.data_identifier.toString(16),\\\", data_group_id=\\\").concat(this.data_group_id,\\\")\\\"),r=0;r<this.media.textTracks.length;r++){var n=this.media.textTracks[r];if(n.label===i){this.b24Track=n;break}}this.b24Track||(this.b24Track=this.media.addTextTrack(\\\"metadata\\\",i,\\\"ja\\\"),this.b24Track.mode=\\\"hidden\\\")}if(this.b24Track.addEventListener(\\\"cuechange\\\",this.onB24CueChangeHandler),null!==(e=this.rendererOption)&&void 0!==e&&e.enableAutoInBandMetadataTextTrackDetection){for(var s=0;s<this.media.textTracks.length;s++){var a=this.media.textTracks[s];if(\\\"metadata\\\"===a.kind&&(\\\"15260DFFFF49443320FF49443320000F\\\"===a.inBandMetadataTrackDispatchType||\\\"com.apple.streaming\\\"===a.inBandMetadataTrackDispatchType||\\\"id3\\\"===a.label)){this.setInBandMetadataTextTrack(a);break}}this.media.textTracks.addEventListener(\\\"addtrack\\\",this.onID3AddtrackHandler)}this.media.addEventListener(\\\"seeking\\\",this.onSeekingHandler),this.media.addEventListener(\\\"seeked\\\",this.onSeekedHandler)}}},{key:\\\"setupSVG\\\",value:function(){this.media&&this.subtitleElement&&(this.svg.style.position=\\\"absolute\\\",this.svg.style.top=this.svg.style.left=\\\"0\\\",this.svg.style.pointerEvents=\\\"none\\\",this.svg.style.width=\\\"100%\\\",this.svg.style.height=\\\"100%\\\",this.subtitleElement.appendChild(this.svg))}},{key:\\\"cleanupTrack\\\",value:function(){var t,e,i,r,n,s;if(this.b24Track)if(null!==(s=this.rendererOption)&&void 0!==s&&s.useHighResTextTrack)this.b24Track.stopPolling();else if(this.b24Track.cues)for(var a=this.b24Track.cues.length-1;a>=0;a--)this.b24Track.removeCue(this.b24Track.cues[a]);null===(t=this.b24Track)||void 0===t||t.removeEventListener(\\\"cuechange\\\",this.onB24CueChangeHandler),null===(e=this.id3Track)||void 0===e||e.removeEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\\\"seeking\\\",this.onSeekingHandler),null===(r=this.media)||void 0===r||r.removeEventListener(\\\"seeked\\\",this.onSeekedHandler),null===(n=this.media)||void 0===n||n.textTracks.removeEventListener(\\\"addtrack\\\",this.onID3AddtrackHandler),this.b24Track=this.id3Track=null}},{key:\\\"cleanupSVG\\\",value:function(){for(;this.svg.firstChild;)this.svg.removeChild(this.svg.firstChild)}}])&&wt(t.prototype,e),Object.defineProperty(t,\\\"prototype\\\",{writable:!1}),t;var t,e}();function Ct(t){return Ct=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\\\"function\\\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\\\"symbol\\\":typeof t},Ct(t)}function Tt(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,r=Array(e);i<e;i++)r[i]=t[i];return r}function kt(t,e){for(var i=0;i<e.length;i++){var r=e[i];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(t,Ft(r.key),r)}}function Ft(t){var e=function(t){if(\\\"object\\\"!=Ct(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,\\\"string\\\");if(\\\"object\\\"!=Ct(i))return i;throw new TypeError(\\\"@@toPrimitive must return a primitive value.\\\")}return String(t)}(t);return\\\"symbol\\\"==Ct(e)?e:e+\\\"\\\"}var St=null,Rt=function(){function t(e,i){!function(t,e){if(!(t instanceof e))throw new TypeError(\\\"Cannot call a class as a function\\\")}(this,t),this.text=\\\"\\\",this.table=null,this.cells=null,this.GL=0,this.GR=2,this.G_BACK=[n.get(0),n.get(1),n.get(2),a.get(31)],this.DRCS_mapping=new Map([[15,new Map],[16,new Map],[17,new Map],[18,new Map],[19,new Map],[20,new Map],[21,new Map],[22,new Map],[23,new Map],[24,new Map],[25,new Map],[26,new Map],[27,new Map],[28,new Map],[29,new Map],[30,new Map]]),this.swf_x=1920,this.swf_y=1080,this.sdf_x=1920,this.sdf_y=1080,this.sdp_x=0,this.sdp_y=0,this.ssm_x=72,this.ssm_y=72,this.shs=8,this.svs=48,this.text_size_x=1,this.text_size_y=1,this.text_type=\\\"NSZ\\\",this.position_x=-1,this.position_y=-1,this.pallet=0,this.fg_color=h[this.pallet][7],this.bg_color=h[this.pallet][8],this.force_bg_color=null,this.hlc=0,this.prev_hlc=0,this.stl=!1,this.orn=null,this.force_orn=null,this.flc=15,this.non_spacing=\\\"\\\",this.timeElapsed=0,this.endTime=null,this.rendered=!1,this.PRA=null,this.normalFont=\\\"monospace\\\",this.gaijiFont=this.normalFont,this.drcsReplacement=!1,this.drcsReplaceMapping=new Map,this.usePUA=!1,this.pes=e,this.startTime=i}return e=t,r=[{key:\\\"setEmbeddedGlyph\\\",value:function(t){St=t}},{key:\\\"detect\\\",value:function(t,e){var i,r,n=null!==(i=null==e?void 0:e.data_identifier)&&void 0!==i?i:128,s=null!==(r=null==e?void 0:e.data_group_id)&&void 0!==r?r:1;if(t.length<=0)return!1;if(t[0]!==n)return!1;if(t.length<=2)return!1;var a=3+(15&t[2]);return!(t.length<=a||(15&(252&t[a+0])>>2)!==s||(y(t,a),0))}},{key:\\\"getRGBAColorCode\\\",value:function(t){if(null==t)return null;var e=document.createElement(\\\"canvas\\\");e.width=e.height=1;var i=e.getContext(\\\"2d\\\");if(!i)return null;i.fillStyle=t,i.fillRect(0,0,e.width,e.height);var r=function(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var i=null==t?null:\\\"undefined\\\"!=typeof Symbol&&t[Symbol.iterator]||t[\\\"@@iterator\\\"];if(null!=i){var r,n,s,a,o=[],h=!0,c=!1;try{if(s=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;h=!1}else for(;!(h=(r=s.call(i)).done)&&(o.push(r.value),o.length!==e);h=!0);}catch(t){c=!0,n=t}finally{try{if(!h&&null!=i.return&&(a=i.return(),Object(a)!==a))return}finally{if(c)throw n}}return o}}(t,e)||function(t,e){if(t){if(\\\"string\\\"==typeof t)return Tt(t,e);var i={}.toString.call(t).slice(8,-1);return\\\"Object\\\"===i&&t.constructor&&(i=t.constructor.name),\\\"Map\\\"===i||\\\"Set\\\"===i?Array.from(t):\\\"Arguments\\\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Tt(t,e):void 0}}(t,e)||function(){throw new TypeError(\\\"Invalid attempt to destructure non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\\\")}()}(i.getImageData(0,0,1,1).data,4),n=r[0],s=r[1],a=r[2],o=r[3],h=\\\"#\\\".concat(n.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(s.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(a.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(o.toString(16).toUpperCase().padStart(2,\\\"0\\\"));return e.width=e.height=0,h}},{key:\\\"fillAlphaColorCode\\\",value:function(t){if(null==t)return\\\"\\\";var e=Number.parseInt(t.substring(1,3),16),i=Number.parseInt(t.substring(3,5),16),r=Number.parseInt(t.substring(5,7),16);return\\\"#\\\".concat(e.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(i.toString(16).toUpperCase().padStart(2,\\\"0\\\")).concat(r.toString(16).toUpperCase().padStart(2,\\\"0\\\"),\\\"FF\\\")}},{key:\\\"getRGBAfromColorCode\\\",value:function(t){if(null==t)return\\\"\\\";var e=Number.parseInt(t.substring(1,3),16),i=Number.parseInt(t.substring(3,5),16),r=Number.parseInt(t.substring(5,7),16),n=Number.parseInt(t.substring(7,9),16);return\\\"rgba(\\\".concat(e,\\\", \\\").concat(i,\\\", \\\").concat(r,\\\", \\\").concat(n/255,\\\")\\\")}}],(i=[{key:\\\"width\\\",value:function(){return Math.floor((this.shs+this.ssm_x)*this.text_size_x)}},{key:\\\"height\\\",value:function(){return Math.floor((this.svs+this.ssm_y)*this.text_size_y)}},{key:\\\"move_absolute_dot\\\",value:function(t,e){this.position_x=t,this.position_y=e}},{key:\\\"move_absolute_pos\\\",value:function(t,e){this.position_x=this.sdp_x+t*this.width(),this.position_y=this.sdp_y+(e+1)*this.height()}},{key:\\\"move_relative_pos\\\",value:function(t,e){for((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs));t<0;)this.position_x-=this.width(),t++,this.position_x<this.sdp_x&&(this.position_x=this.sdp_x+this.sdf_x-this.width(),e--);for(;t>0;)this.position_x+=this.width(),t--,this.position_x>=this.sdp_x+this.sdf_x&&(this.position_x=this.sdp_x,e++);for(;e<0;)this.position_y-=this.height(),e++;for(;e>0;)this.position_y+=this.height(),e--}},{key:\\\"move_newline\\\",value:function(){(this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),this.position_x=this.sdp_x,this.position_y=this.position_y+this.height()}},{key:\\\"render\\\",value:function(e){var i,r,n,s,a,o,h,c;this.table=null!==(i=null==e?void 0:e.table)&&void 0!==i?i:null,this.force_orn=null!==(r=\\\"boolean\\\"==typeof(null==e?void 0:e.forceStrokeColor)?null==e?void 0:e.forceStrokeColor:t.getRGBAColorCode(null==e?void 0:e.forceStrokeColor))&&void 0!==r?r:null,this.force_bg_color=null!==(n=t.getRGBAColorCode(null==e?void 0:e.forceBackgroundColor))&&void 0!==n?n:null,this.normalFont=null!==(s=null==e?void 0:e.normalFont)&&void 0!==s?s:this.normalFont,this.gaijiFont=null!==(a=null==e?void 0:e.gaijiFont)&&void 0!==a?a:this.normalFont,this.drcsReplacement=null!==(o=null==e?void 0:e.drcsReplacement)&&void 0!==o&&o,this.drcsReplaceMapping=new Map(v);for(var u,l=Object.entries(null!==(u=null==e?void 0:e.drcsReplaceMapping)&&void 0!==u?u:{}),f=0;f<l.length;f++){var d=l[f];this.drcsReplaceMapping.set(d[0],d[1])}if(this.usePUA=null!==(h=null==e?void 0:e.usePUA)&&void 0!==h&&h,!t.detect(this.pes,e))return null;if(this.table)for(;this.table.firstChild;)this.table.removeChild(this.table.firstChild);for(var p=3+(15&this.pes[2]),b=(this.pes[p+0],(this.pes[p+3]<<8)+this.pes[p+4]),g=p+9;g<p+(5+b);){this.pes[g+0];var y=this.pes[g+1],m=this.pes[g+2]<<16|this.pes[g+3]<<8|this.pes[g+4];32===y?this.parseText(g+5,g+5+m):48==y?this.parseDRCS(1,g+5,g+5+m):49==y&&this.parseDRCS(2,g+5,g+5+m),g+=5+m}return{startTime:this.startTime,endTime:null!==(c=this.endTime)&&void 0!==c?c:Number.POSITIVE_INFINITY,rendered:this.rendered,textContent:this.rendered?this.text:null,PRA:this.PRA}}},{key:\\\"parseText\\\",value:function(t,e){for(;t<e;)if(32<this.pes[t]&&this.pes[t]<127){var i=0,r=this.G_BACK[this.GL];if(!r)return;for(var a=0;a<r.bytes;a++)i<<=8,i|=127&this.pes[t+a];this.renderCharacter(i,r),t+=r.bytes}else if(160<this.pes[t]&&this.pes[t]<255){var c=0,u=this.G_BACK[this.GR];if(!u)return;for(var l=0;l<u.bytes;l++)c<<=8,c|=127&this.pes[t+l];this.renderCharacter(c,u),t+=u.bytes}else if(0===this.pes[t])t+=1;else if(7===this.pes[t])t+=1;else if(8===this.pes[t])this.move_relative_pos(-1,0),t+=1;else if(9===this.pes[t])this.move_relative_pos(1,0),t+=1;else if(10===this.pes[t])this.move_relative_pos(0,1),t+=1;else if(11===this.pes[t])this.move_relative_pos(0,-1),t+=1;else if(12===this.pes[t])null!=this.startTime&&this.timeElapsed>0&&(this.endTime=this.startTime+this.timeElapsed),t+=1;else if(13===this.pes[t])this.move_newline(),t+=1;else if(14===this.pes[t])this.GL=1,t+=1;else if(15===this.pes[t])this.GL=0,t+=1;else if(22===this.pes[t]){var f=63&this.pes[t+1];this.move_relative_pos(f,0),t+=2}else if(24===this.pes[t])t+=1;else if(25===this.pes[t]){var d=0,p=this.G_BACK[2];if(!p)return;for(var v=0;v<p.bytes;v++)d<<=8,d|=127&this.pes[t+1+v];this.renderCharacter(d,p),t+=1+p.bytes}else if(27===this.pes[t])if(110===this.pes[t+1])this.GL=2,t+=2;else if(111==this.pes[t+1])this.GL=3,t+=2;else if(126==this.pes[t+1])this.GR=1,t+=2;else if(125==this.pes[t+1])this.GR=2,t+=2;else if(124==this.pes[t+1])this.GR=3,t+=2;else if(40<=this.pes[t+1]&&this.pes[t+1]<=43){var b=this.pes[t+1]-40;32===this.pes[t+2]?(this.G_BACK[b]=o.get(this.pes[t+3]),t+=4):(this.G_BACK[b]=s.get(this.pes[t+2]),t+=3)}else{if(36!==this.pes[t+1])return;if(40<=this.pes[t+2]&&this.pes[t+2]<=43){var g=this.pes[t+2]-40;32===this.pes[t+3]?(this.G_BACK[g]=o.get(this.pes[t+4]),t+=5):(this.G_BACK[g]=s.get(this.pes[t+3]),t+=4)}else this.G_BACK[0]=s.get(this.pes[t+2]),t+=3}else if(28===this.pes[t]){var y=63&this.pes[t+1],m=63&this.pes[t+2];this.move_absolute_pos(m,y),t+=3}else if(29===this.pes[t]){var _=0,w=this.G_BACK[3];if(!w)return;for(var x=0;x<w.bytes;x++)_<<=8,_|=127&this.pes[t+1+x];this.renderCharacter(_,w),t+=1+w.bytes}else if(30===this.pes[t])t+=1;else if(31===this.pes[t])t+=1;else if(32===this.pes[t]){var A=n.get(0);if(!A)return;this.renderCharacter(8481,A),t+=1}else if(127===this.pes[t])t+=1;else if(128===this.pes[t])this.fg_color=h[this.pallet][0],t+=1;else if(129===this.pes[t])this.fg_color=h[this.pallet][1],t+=1;else if(130===this.pes[t])this.fg_color=h[this.pallet][2],t+=1;else if(131===this.pes[t])this.fg_color=h[this.pallet][3],t+=1;else if(132===this.pes[t])this.fg_color=h[this.pallet][4],t+=1;else if(133===this.pes[t])this.fg_color=h[this.pallet][5],t+=1;else if(134===this.pes[t])this.fg_color=h[this.pallet][6],t+=1;else if(135===this.pes[t])this.fg_color=h[this.pallet][7],t+=1;else if(136===this.pes[t])this.text_size_x=.5,this.text_size_y=.5,this.text_type=\\\"SSZ\\\",t+=1;else if(137===this.pes[t])this.text_size_x=.5,this.text_size_y=1,this.text_type=\\\"MSZ\\\",t+=1;else if(138===this.pes[t])this.text_size_x=1,this.text_size_y=1,this.text_type=\\\"NSZ\\\",t+=1;else{if(139===this.pes[t])return;if(144===this.pes[t]){var C=this.pes[t+1];if(32==C){var T=15&this.pes[t+2];this.pallet=T,t+=3}else{var k=15&C;64==(112&C)?this.fg_color=h[this.pallet][k]:80==(112&C)&&(this.bg_color=h[this.pallet][k]),t+=2}}else if(145===this.pes[t]){var F=15&this.pes[t];this.flc=F,t+=2}else{if(146===this.pes[t])return;if(147===this.pes[t])return;if(148===this.pes[t])return;if(149===this.pes[t])return;if(151===this.pes[t])this.prev_hlc=this.hlc,this.hlc=15&this.pes[t+1],t+=2;else{if(152===this.pes[t])return;if(153===this.pes[t])this.stl=!1,t+=1;else if(154===this.pes[t])this.stl=!0,t+=1;else if(155===this.pes[t]){for(var S=t+1;66!==this.pes[S];){if(83===this.pes[S]){for(var R=t+1,I=0;59!=this.pes[R]&&32!=this.pes[R];)I*=10,I+=15&this.pes[R],R++;if(32!==this.pes[R])return;if(5===I)this.swf_x=3840,this.swf_y=2160;else if(7===I)this.swf_x=1920,this.swf_y=1080;else{if(9!=I)return;this.swf_x=1440,this.swf_y=960}break}if(84===this.pes[S])break;if(86===this.pes[S]){for(var E=t+1,O=0,M=0;59!=this.pes[E];)O*=10,O+=15&this.pes[E],E++;for(E++;32!=this.pes[E];)M*=10,M+=15&this.pes[E],E++;this.sdf_x=2*O,this.sdf_y=2*M;break}if(87===this.pes[S]){for(var G=t+1,B=0,P=0;59!=this.pes[G];)B*=10,B+=15&this.pes[G],G++;for(G++;32!=this.pes[G];)P*=10,P+=15&this.pes[G],G++;this.ssm_x=2*B,this.ssm_y=2*P;break}if(88===this.pes[S]){for(var D=t+1,j=0;32!=this.pes[D];)j*=10,j+=15&this.pes[D],D++;this.shs=2*j;break}if(89===this.pes[S]){for(var L=t+1,N=0;32!=this.pes[L];)N*=10,N+=15&this.pes[L],L++;this.svs=2*N;break}if(91===this.pes[S])break;if(92===this.pes[S])break;if(93===this.pes[S])break;if(94===this.pes[S])break;if(95===this.pes[S]){for(var U=t+1,z=0,H=0;59!=this.pes[U];)z*=10,z+=15&this.pes[U],U++;for(U++;32!=this.pes[U];)H*=10,H+=15&this.pes[U],U++;this.sdp_x=2*z,this.sdp_y=2*H;break}if(97===this.pes[S]){for(var X=t+1,K=0,V=0;59!=this.pes[X];)K*=10,K+=15&this.pes[X],X++;for(X++;32!=this.pes[X];)V*=10,V+=15&this.pes[X],X++;this.move_absolute_dot(2*K,2*V);break}if(98===this.pes[S])break;if(99===this.pes[S]){var $=this.pes[t+1];if(48==$)this.orn=null;else if(49==$){var W=10*(15&this.pes[t+3])+(15&this.pes[t+4]),Y=10*(15&this.pes[t+5])+(15&this.pes[t+6]);this.orn=h[W][Y]}break}if(100===this.pes[S])break;if(101===this.pes[S])break;if(102===this.pes[S])break;if(103===this.pes[S])break;if(104===this.pes[S]){for(var J=t+1,Z=0;32!=this.pes[J];)Z*=10,Z+=15&this.pes[J],J++;this.PRA=Z;break}if(105===this.pes[S])break;if(106===this.pes[S])break;if(110===this.pes[S])break;if(111===this.pes[S])break;S+=1}t=S+1}else{if(157!==this.pes[t])return;if(32!=this.pes[t+1])return void this.pes[t+1];var q=63&this.pes[t+2];this.timeElapsed+=q/10,t+=3}}}}}},{key:\\\"parseDRCS\\\",value:function(t,e,i){for(this.pes[e+0],e+=1;e<i;){var r=this.pes[e+0]<<8|this.pes[e+1],n=this.pes[e+2];e+=3;for(var s=0;s<n;s++){this.pes[e+0];var a=15&this.pes[e+0];if(0===a||1===a){var h=this.pes[e+1]+2,c=this.pes[e+2],u=this.pes[e+3],l=h.toString(2).length-h.toString(2).replace(/0*$/,\\\"\\\").length,f=Math.floor(c*u*l/8),d=new Uint8Array(Array.prototype.slice.call(this.pes,e+4,e+4+f));if(1===t){var p,v,b=64+((3840&r)>>8),g=127&r,y=null===(p=o.get(b))||void 0===p?void 0:p.alphabet;y&&(null===(v=this.DRCS_mapping.get(y))||void 0===v||v.set(g,d))}else{var m,_=32639&r;null===(m=this.DRCS_mapping.get(15))||void 0===m||m.set(_,d)}e+=4+f}}}}},{key:\\\"renderCharacter\\\",value:function(e,i){if((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),0===i.alphabet){var r=((65280&e)>>8)-33,s=(255&e)-33;if(0===r&&12<=s&&s<=17)return void(this.non_spacing=[\\\"́\\\",\\\"̀\\\",\\\"̈\\\",\\\"̂\\\",\\\"̅\\\",\\\"̲\\\"][s-12]);if(1===r&&93===s)return void(this.non_spacing+=\\\"⃝\\\")}if(null!==this.table){if(null===this.cells){this.table.parentElement&&(this.table.parentElement.style.position=\\\"absolute\\\",this.table.parentElement.style.width=\\\"\\\".concat(this.swf_x,\\\"px\\\"),this.table.parentElement.style.height=\\\"\\\".concat(this.swf_y,\\\"px\\\")),this.table.style.willChange=\\\"transform\\\",this.table.style.position=\\\"absolute\\\",this.table.style.left=\\\"\\\".concat(this.sdp_x,\\\"px\\\"),this.table.style.top=\\\"\\\".concat(this.sdp_y,\\\"px\\\"),this.table.style.width=\\\"\\\".concat(this.sdf_x,\\\"px\\\"),this.table.style.height=\\\"\\\".concat(this.sdf_y,\\\"px\\\"),this.table.style.boxSizing=\\\"border-box\\\",this.table.style.border=\\\"none\\\",this.table.style.borderCollapse=\\\"collapse\\\";for(var o=[],h=0,v=0;h<this.sdf_y;h+=Math.floor((this.ssm_y+this.svs)/2),v+=1){var b=document.createElement(\\\"tr\\\");o.push([]),b.style.position=\\\"relative\\\",b.style.height=\\\"\\\".concat(Math.floor((this.ssm_y+this.svs)/2),\\\"px\\\"),b.style.width=\\\"100%\\\",b.style.boxSizing=\\\"border-box\\\",b.style.border=\\\"none\\\";for(var g=0;g<this.sdf_x;g+=Math.floor((this.ssm_x+this.shs)/2)){var y=document.createElement(\\\"td\\\");y.style.height=\\\"\\\".concat(Math.floor((this.ssm_y+this.svs)/2),\\\"px\\\"),y.style.width=\\\"\\\".concat(Math.floor((this.ssm_x+this.shs)/2),\\\"px\\\"),y.style.padding=\\\"0px\\\",y.style.boxSizing=\\\"border-box\\\",y.style.border=\\\"none\\\",b.appendChild(y),o[v].push(y)}this.table.appendChild(b)}this.cells=o}if(31!==i.alphabet&&(this.rendered=!0),0===i.alphabet){var m=94*(((65280&e)>>8)-33)+((255&e)-33),_=7896;if(m<_){var w=c[m];this.renderFont(w)}else if(this.usePUA){var x=u[m-_];this.renderFont(x)}else{var A=l[m-_];this.renderFont(A)}this.move_relative_pos(1,0)}else if(1===i.alphabet){var C=f[e-33];this.renderFont(C),this.move_relative_pos(1,0)}else if(2===i.alphabet){var k=d[e-33];this.renderFont(k),this.move_relative_pos(1,0)}else if(3===i.alphabet){var F=p[e-33];this.renderFont(F),this.move_relative_pos(1,0)}else{if(31===i.alphabet)return void(96===e?(this.G_BACK=[n.get(0),n.get(1),n.get(2),a.get(31)],this.GL=0,this.GR=2):97===e?(this.G_BACK=[n.get(0),n.get(3),n.get(2),a.get(31)],this.GL=0,this.GR=2):98===e?(this.G_BACK=[n.get(0),a.get(16),n.get(2),a.get(31)],this.GL=0,this.GR=2):99===e?(this.G_BACK=[n.get(4),n.get(6),n.get(7),a.get(31)],this.GL=0,this.GR=2):100===e?(this.G_BACK=[n.get(4),n.get(5),n.get(7),a.get(31)],this.GL=0,this.GR=2):101===e?(this.G_BACK=[n.get(4),a.get(16),n.get(7),a.get(31)],this.GL=0,this.GR=2):102===e?(this.G_BACK=[a.get(16),a.get(17),a.get(18),a.get(31)],this.GL=0,this.GR=2):103===e?(this.G_BACK=[a.get(19),a.get(20),a.get(21),a.get(31)],this.GL=0,this.GR=2):104===e?(this.G_BACK=[a.get(22),a.get(23),a.get(24),a.get(31)],this.GL=0,this.GR=2):105===e?(this.G_BACK=[a.get(25),a.get(26),a.get(27),a.get(31)],this.GL=0,this.GR=2):106===e?(this.G_BACK=[a.get(28),a.get(29),a.get(30),a.get(31)],this.GL=0,this.GR=2):107===e?(this.G_BACK=[n.get(0),a.get(17),n.get(2),a.get(31)],this.GL=0,this.GR=2):108===e?(this.G_BACK=[n.get(0),a.get(18),n.get(2),a.get(31)],this.GL=0,this.GR=2):109===e?(this.G_BACK=[n.get(0),a.get(19),n.get(2),a.get(31)],this.GL=0,this.GR=2):110===e?(this.G_BACK=[n.get(3),n.get(2),n.get(1),a.get(31)],this.GL=0,this.GR=2):111===e&&(this.G_BACK=[n.get(1),n.get(4),a.get(16),a.get(31)],this.GL=0,this.GR=2));var S,R=null===(S=this.DRCS_mapping.get(i.alphabet))||void 0===S?void 0:S.get(32639&e);if(!R)return;var I=T(R.buffer);if(this.drcsReplacement&&this.drcsReplaceMapping.has(I.toLowerCase()))this.renderFont(this.drcsReplaceMapping.get(I.toLowerCase()));else if(this.drcsReplacement&&this.drcsReplaceMapping.has(I.toUpperCase()))this.renderFont(this.drcsReplaceMapping.get(I.toUpperCase()));else{var E=document.createElement(\\\"canvas\\\"),O=Math.floor(this.ssm_x/2),M=Math.floor(this.ssm_y/2),G=Math.floor(8*R.length/(O*M));E.width=O+4/this.text_size_x,E.height=M+4/this.text_size_y,E.style.width=\\\"\\\".concat(this.ssm_x+4/this.text_size_x*2,\\\"px\\\"),E.style.height=\\\"\\\".concat(this.ssm_y+4/this.text_size_y*2,\\\"px\\\");var B=E.getContext(\\\"2d\\\");if(!B)return;var P=this.getOrnColorCode();if(P&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color)){B.fillStyle=t.getRGBAfromColorCode(P);for(var D=-2/this.text_size_y;D<=2/this.text_size_y;D++)for(var j=-2/this.text_size_x;j<=2/this.text_size_x;j++)for(var L=0;L<M;L++)for(var N=0;N<O;N++){for(var U=0,z=0;z<G;z++){var H=7-((L*O+N)*G+z)%8;U*=2,U+=(R[Math.floor(((L*O+N)*G+z)/8)]&1<<H)>>H}U>0&&B.fillRect(2/this.text_size_x+N+j,2/this.text_size_y+L+D,1,1)}}B.fillStyle=t.getRGBAfromColorCode(this.fg_color);for(var X=0;X<M;X++)for(var K=0;K<O;K++){for(var V=0,$=0;$<G;$++){var W=7-((X*O+K)*G+$)%8;V*=2,V+=(R[Math.floor(((X*O+K)*G+$)/8)]&1<<W)>>W}V>0&&B.fillRect(2/this.text_size_x+K,2/this.text_size_y+X,1,1)}for(var Y=Math.floor(2*this.text_size_x),J=Math.floor(2*this.text_size_y),Z=Math.round((this.position_x-this.sdp_x)/(this.ssm_x+this.shs)*2),q=Math.round((this.position_y-this.height()-this.sdp_y)/(this.ssm_y+this.svs)*2),Q=0;Q<J;Q++)for(var tt=0;tt<Y;tt++){var et=this.cells[q+Q][Z+tt];if(0===Q&&0===tt){var it;et.setAttribute(\\\"rowspan\\\",\\\"\\\".concat(J)),et.setAttribute(\\\"colspan\\\",\\\"\\\".concat(Y)),et.style.textAlign=\\\"center\\\",et.style.verticalAlign=\\\"top\\\";var rt=document.createElement(\\\"div\\\");rt.appendChild(E),rt.style.display=\\\"flex\\\",rt.style.alignItems=\\\"center\\\",rt.style.justifyContent=\\\"middle\\\",rt.style.width=\\\"\\\".concat(this.ssm_x+this.shs,\\\"px\\\"),rt.style.height=\\\"\\\".concat(this.ssm_y+this.svs,\\\"px\\\"),rt.style.lineHeight=\\\"\\\".concat(this.height(),\\\"px\\\"),rt.style.fontSize=\\\"\\\".concat(this.ssm_x,\\\"px\\\"),rt.style.transform=\\\"scale(\\\".concat(this.text_size_x,\\\", \\\").concat(this.text_size_y,\\\")\\\"),rt.style.transformOrigin=\\\"0 0\\\",rt.style.marginRight=\\\"-\\\".concat(this.ssm_x+this.shs-this.width(),\\\"px\\\"),rt.style.marginBottom=\\\"-\\\".concat(this.ssm_y+this.svs-this.height(),\\\"px\\\"),rt.style.color=t.getRGBAfromColorCode(this.fg_color),1&this.hlc&&(et.style.borderBottom=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),2&this.hlc&&(et.style.borderRight=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),4&this.hlc&&(et.style.borderTop=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),8&this.hlc&&(et.style.borderLeft=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),this.stl&&(et.style.borderBottom=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),et.style.backgroundColor=t.getRGBAfromColorCode(null!==(it=this.force_bg_color)&&void 0!==it?it:this.bg_color),et.appendChild(rt)}else null!=et.parentNode&&et.parentNode.removeChild(et)}}this.move_relative_pos(1,0)}}}},{key:\\\"renderFont\\\",value:function(e){var i;if(e+=this.non_spacing,this.non_spacing=\\\"\\\",.5===this.text_size_x&&.5===this.text_size_y&&(d.includes(e)||p.includes(e))||(this.text+=e),null!==this.cells){var r=b.has(e),n=r?this.gaijiFont:this.normalFont;if(null!=St&&null!==(i=St)&&void 0!==i&&i.has(e)){var s=St.get(e),a=s.viewBox,o=s.path;this.renderPath(a,o)}else{r&&(e+=\\\"︎\\\");for(var h=Math.floor(2*this.text_size_x),c=Math.floor(2*this.text_size_y),u=Math.round((this.position_x-this.sdp_x)/(this.ssm_x+this.shs)*2),l=Math.round((this.position_y-this.height()-this.sdp_y)/(this.ssm_y+this.svs)*2),f=0;f<c;f++)for(var v=0;v<h;v++){var g=this.cells[l+f][u+v];if(0===f&&0===v){var y;g.setAttribute(\\\"rowspan\\\",\\\"\\\".concat(c)),g.setAttribute(\\\"colspan\\\",\\\"\\\".concat(h)),g.style.textAlign=\\\"center\\\",g.style.verticalAlign=\\\"top\\\";var m=document.createElement(\\\"div\\\");m.textContent=e,m.style.display=\\\"flex\\\",m.style.alignItems=\\\"center\\\",m.style.justifyContent=\\\"middle\\\",m.style.width=\\\"\\\".concat(this.ssm_x+this.shs,\\\"px\\\"),m.style.height=\\\"\\\".concat(this.ssm_y+this.svs,\\\"px\\\"),m.style.fontFamily=\\\"\\\".concat(n),m.style.lineHeight=\\\"\\\".concat(this.height(),\\\"px\\\"),m.style.fontSize=\\\"\\\".concat(this.ssm_x,\\\"px\\\"),m.style.transform=\\\"scale(\\\".concat(this.text_size_x,\\\", \\\").concat(this.text_size_y,\\\")\\\"),m.style.transformOrigin=\\\"0 0\\\",m.style.marginRight=\\\"-\\\".concat(this.ssm_x+this.shs-this.width(),\\\"px\\\"),m.style.marginBottom=\\\"-\\\".concat(this.ssm_y+this.svs-this.height(),\\\"px\\\"),m.style.color=t.getRGBAfromColorCode(this.fg_color);var _=this.getOrnColorCode();if(_&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color)){for(var w=\\\"\\\",x=!0,A=-4;A<=4;A++)for(var C=-4;C<=4;C++)0===A&&0===C||(w+=\\\"\\\".concat(x?\\\"\\\":\\\",\\\").concat(C,\\\"px \\\").concat(A,\\\"px 0 \\\").concat(t.getRGBAfromColorCode(_)),x=!1);m.style.textShadow=w}1&this.hlc&&(g.style.borderBottom=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),2&this.hlc&&(g.style.borderRight=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),4&this.hlc&&(g.style.borderTop=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),8&this.hlc&&(g.style.borderLeft=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),this.stl&&(g.style.borderBottom=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),g.style.backgroundColor=t.getRGBAfromColorCode(null!==(y=this.force_bg_color)&&void 0!==y?y:this.bg_color),g.appendChild(m)}else null!=g.parentNode&&g.parentNode.removeChild(g)}}}}},{key:\\\"renderPath\\\",value:function(e,i){if(null!==this.cells){var r=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"svg\\\");r.setAttribute(\\\"viewBox\\\",\\\"\\\".concat(e[0],\\\" \\\").concat(e[1],\\\" \\\").concat(e[2],\\\" \\\").concat(e[3])),r.style.width=\\\"\\\".concat(this.ssm_x+this.shs,\\\"px\\\"),r.style.height=\\\"\\\".concat(this.ssm_y,\\\"px\\\");var n=document.createElementNS(\\\"http://www.w3.org/2000/svg\\\",\\\"path\\\");n.setAttribute(\\\"d\\\",i),n.setAttribute(\\\"fill\\\",\\\"\\\".concat(t.getRGBAfromColorCode(this.fg_color)));var s=this.getOrnColorCode();if(!s||this.force_orn&&!0!==this.force_orn&&this.force_orn===this.fg_color)n.setAttribute(\\\"stroke\\\",\\\"transparent\\\");else{var a=4*Math.max((e[2]-e[0])/this.ssm_x,(e[3]-e[1])/this.ssm_y);n.setAttribute(\\\"stroke\\\",\\\"\\\".concat(t.getRGBAfromColorCode(s))),n.setAttribute(\\\"stroke-width\\\",\\\"\\\".concat(a))}r.appendChild(n);for(var o=Math.floor(2*this.text_size_x),h=Math.floor(2*this.text_size_y),c=Math.round((this.position_x-this.sdp_x)/(this.ssm_x+this.shs)*2),u=Math.round((this.position_y-this.height()-this.sdp_y)/(this.ssm_y+this.svs)*2),l=0;l<h;l++)for(var f=0;f<o;f++){var d=this.cells[u+l][c+f];if(0===l&&0===f){var p;d.setAttribute(\\\"rowspan\\\",\\\"\\\".concat(h)),d.setAttribute(\\\"colspan\\\",\\\"\\\".concat(o)),d.style.textAlign=\\\"center\\\",d.style.verticalAlign=\\\"top\\\";var v=document.createElement(\\\"div\\\");v.appendChild(r),v.style.display=\\\"flex\\\",v.style.alignItems=\\\"center\\\",v.style.justifyContent=\\\"middle\\\",v.style.width=\\\"\\\".concat(this.ssm_x+this.shs,\\\"px\\\"),v.style.height=\\\"\\\".concat(this.ssm_y+this.svs,\\\"px\\\"),v.style.lineHeight=\\\"\\\".concat(this.height(),\\\"px\\\"),v.style.fontSize=\\\"\\\".concat(this.ssm_x,\\\"px\\\"),v.style.transform=\\\"scale(\\\".concat(this.text_size_x,\\\", \\\").concat(this.text_size_y,\\\")\\\"),v.style.transformOrigin=\\\"0 0\\\",v.style.marginRight=\\\"-\\\".concat(this.ssm_x+this.shs-this.width(),\\\"px\\\"),v.style.marginBottom=\\\"-\\\".concat(this.ssm_y+this.svs-this.height(),\\\"px\\\"),v.style.color=t.getRGBAfromColorCode(this.fg_color),1&this.hlc&&(d.style.borderBottom=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),2&this.hlc&&(d.style.borderRight=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),4&this.hlc&&(d.style.borderTop=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),8&this.hlc&&(d.style.borderLeft=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),this.stl&&(d.style.borderBottom=\\\"1px solid \\\".concat(t.getRGBAColorCode(this.fg_color))),d.style.backgroundColor=t.getRGBAfromColorCode(null!==(p=this.force_bg_color)&&void 0!==p?p:this.bg_color),d.appendChild(v)}else null!=d.parentNode&&d.parentNode.removeChild(d)}}}},{key:\\\"getOrnColorCode\\\",value:function(){return!0===this.force_orn?t.fillAlphaColorCode(this.bg_color):!1===this.force_orn?this.orn:null!==(e=this.force_orn)&&void 0!==e?e:this.orn;var e}}])&&kt(e.prototype,i),r&&kt(e,r),Object.defineProperty(e,\\\"prototype\\\",{writable:!1}),e;var e,i,r}();function It(t){return It=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\\\"function\\\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\\\"symbol\\\":typeof t},It(t)}function Et(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,r)}return i}function Ot(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?Et(Object(i),!0).forEach((function(e){Mt(t,e,i[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):Et(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}function Mt(t,e,i){return(e=Bt(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function Gt(t,e){for(var i=0;i<e.length;i++){var r=e[i];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(t,Bt(r.key),r)}}function Bt(t){var e=function(t){if(\\\"object\\\"!=It(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,\\\"string\\\");if(\\\"object\\\"!=It(i))return i;throw new TypeError(\\\"@@toPrimitive must return a primitive value.\\\")}return String(t)}(t);return\\\"symbol\\\"==It(e)?e:e+\\\"\\\"}var Pt=function(){return t=function t(e){var i,r,n,s,a;!function(t,e){if(!(t instanceof e))throw new TypeError(\\\"Cannot call a class as a function\\\")}(this,t),this.media=null,this.id3Track=null,this.b24Track=null,this.subtitleElement=null,this.table=null,this.textContent=null,this.wrapper=null,this.resizeObserver=null,this.mutationObserver=null,this.prevCurrentTime=null,this.highResTimeupdatePollingId=null,this.isShowing=!0,this.isOnSeeking=!1,this.onB24CueChangeDrawed=!1,this.onID3AddtrackHandler=this.onID3Addtrack.bind(this),this.onID3CueChangeHandler=this.onID3CueChange.bind(this),this.onB24CueChangeHandler=this.onB24CueChange.bind(this),this.onHighResTimeupdateHandler=this.onHighResTimeupdate.bind(this),this.onTimeupdateHandler=this.onTimeupdate.bind(this),this.onCanplayHandler=this.onCanplay.bind(this),this.onPlayHandler=this.onPlay.bind(this),this.onPauseHandler=this.onPause.bind(this),this.onSeekingHandler=this.onSeeking.bind(this),this.onSeekedHandler=this.onSeeked.bind(this),this.onResizeHandler=this.onResize.bind(this),this.data_identifier=null!==(i=null==e?void 0:e.data_identifier)&&void 0!==i?i:128,this.data_group_id=null!==(r=null==e?void 0:e.data_group_id)&&void 0!==r?r:1,this.rendererOption=Ot(Ot({},e),{},{data_identifier:this.data_identifier,data_group_id:this.data_group_id,keepAspectRatio:null===(n=null==e?void 0:e.keepAspectRatio)||void 0===n||n,enableAutoInBandMetadataTextTrackDetection:null===(s=null==e?void 0:e.enableAutoInBandMetadataTextTrackDetection)||void 0===s||s,useStroke:null===(a=null==e?void 0:e.useStroke)||void 0===a||a})},(e=[{key:\\\"attachMedia\\\",value:function(t,e){var i;this.detachMedia(),this.media=t,this.subtitleElement=null!=e?e:t.parentElement,this.media.addEventListener(\\\"canplay\\\",this.onCanplayHandler),null!==(i=this.rendererOption)&&void 0!==i&&i.useHighResTimeupdate?(this.media.addEventListener(\\\"play\\\",this.onPlayHandler),this.media.addEventListener(\\\"pause\\\",this.onPauseHandler)):this.media.addEventListener(\\\"timeupdate\\\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.setupTrack(),this.setupTable()}},{key:\\\"detachMedia\\\",value:function(){var t,e,i,r;this.cleanupTable(),this.cleanupTrack(),null===(t=this.media)||void 0===t||t.removeEventListener(\\\"canplay\\\",this.onCanplayHandler),null===(e=this.media)||void 0===e||e.removeEventListener(\\\"play\\\",this.onPlayHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\\\"pause\\\",this.onPauseHandler),this.onPause(),null===(r=this.media)||void 0===r||r.removeEventListener(\\\"timeupdate\\\",this.onTimeupdateHandler),this.prevCurrentTime=null,this.media=this.subtitleElement=null}},{key:\\\"dispose\\\",value:function(){this.detachMedia()}},{key:\\\"getTextContent\\\",value:function(){return this.textContent}},{key:\\\"refresh\\\",value:function(){this.onResize()}},{key:\\\"show\\\",value:function(){this.isShowing=!0,this.table&&(this.table.style.visibility=\\\"visible\\\")}},{key:\\\"hide\\\",value:function(){this.isShowing=!1,this.table&&(this.table.style.visibility=\\\"hidden\\\")}},{key:\\\"isPresent\\\",value:function(){return this.onB24CueChangeDrawed}},{key:\\\"pushRawData\\\",value:function(t,e){var i=new Rt(e,t).render(this.rendererOption);if(null==i)return!1;var r=Number.isFinite(i.endTime)?i.endTime:Number.MAX_SAFE_INTEGER;return this.addB24Cue(t,r,e)}},{key:\\\"pushBase64Data\\\",value:function(t,e){var i=tt(e);return this.pushRawData(t,i)}},{key:\\\"pushData\\\",value:function(t,e,i){return this.pushRawData(i,e)}},{key:\\\"pushID3v2PRIVData\\\",value:function(t,e,i){return\\\"aribb24.js\\\"===e&&this.pushRawData(t,i)}},{key:\\\"pushID3v2TXXXData\\\",value:function(t,e,i){return\\\"aribb24.js\\\"===e&&this.pushBase64Data(t,i)}},{key:\\\"pushID3v2Data\\\",value:function(t,e){for(var i=!1,r=0;r<e.length;){var n=r;if(r+3>e.length)break;if(73!==e[r+0]||68!==e[r+1]||51!==e[r+2]){if(0===r){r+=5;continue}break}if((r+=6)+4>e.length)break;var s=J(e,r+0,r+4);r+=4;var a=n+3+2+1+4+s;if(a>e.length)break;for(var o=r;o<a;){var h=o;if(o+4>e.length)break;var c=Q(e,o+0,o+4);if((o+=4)+4>e.length)break;var u=J(e,o+0,o+4);o+=6;var l=h+4+4+2+u;if(l>e.length)break;if(\\\"PRIV\\\"===c){for(var f=o,d=l;0!==e[o]&&o<l;)o++;var p=Q(e,f,o),v=new Uint8Array(Array.prototype.slice.call(e,o+1,d));this.pushID3v2PRIVData(t,p,v)&&(i=!0)}else if(\\\"TXXX\\\"===c){var b=e[o+0],g=o+1;if(3===b){for(;0!==e[o]&&o<l;)o++;for(var y=o,m=o+=1;0!==e[o]&&o<l;)o++;var _=o,w=q(e,g,y),x=q(e,m,_);this.pushID3v2TXXXData(t,w,x)&&(i=!0)}else if(0===b){for(;0!==e[o]&&o<l;)o++;for(var A=o,C=o+=1;0!==e[o]&&o<l;)o++;var T=o,k=Q(e,g,A),F=Q(e,C,T);this.pushID3v2TXXXData(t,k,F)&&(i=!0)}}o=l}(r=n+3+2+1+4+s)+3>e.length||51===e[r+0]&&68===e[r+1]&&73===e[r+2]&&(r+=10)}return i}},{key:\\\"setInBandMetadataTextTrack\\\",value:function(t){var e;null===(e=this.id3Track)||void 0===e||e.removeEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler),this.id3Track=t,this.id3Track.mode=\\\"hidden\\\",this.id3Track.addEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler)}},{key:\\\"pushID3v2Cue\\\",value:function(t){if(!this.id3Track)return!1;var e=t.startTime,i=t;if(\\\"15260DFFFF49443320FF49443320000F\\\"===this.id3Track.inBandMetadataTrackDispatchType)return this.pushID3v2Data(e,new Uint8Array(i.data));if(\\\"com.apple.streaming\\\"===this.id3Track.inBandMetadataTrackDispatchType){if(\\\"PRIV\\\"===i.value.key)return this.pushID3v2PRIVData(e,i.value.info,new Uint8Array(i.value.data));if(\\\"TXXX\\\"===i.value.key)return this.pushID3v2TXXXData(e,i.value.info,i.value.data)}else if(\\\"id3\\\"===this.id3Track.label){if(\\\"PRIV\\\"===i.value.key)return this.pushID3v2PRIVData(e,i.value.info,new Uint8Array(i.value.data));if(\\\"TXXX\\\"===i.value.key)return this.pushID3v2TXXXData(e,i.value.info,i.value.data)}else if(\\\"Timed Metadata\\\"===this.id3Track.label){if(\\\"PRIV\\\"===i.frame.key)return this.pushID3v2PRIVData(e,i.frame.owner,new Uint8Array(i.frame.data));if(\\\"TXXX\\\"===i.frame.key)return this.pushID3v2TXXXData(e,i.frame.description,i.frame.data)}return!1}},{key:\\\"onID3CueChange\\\",value:function(){this.id3Track&&(this.isOnSeeking||this.onTimeupdate())}},{key:\\\"addB24Cue\\\",value:function(t,e,i){var r;if(!this.b24Track)return!1;if(!Rt.detect(i,this.rendererOption))return!1;var n=new(null!==(r=window.VTTCue)&&void 0!==r?r:window.TextTrackCue)(t,e,\\\"\\\");if(n.data=i,window.VTTCue)this.b24Track.addCue(n);else if(window.TextTrackCue){var s;if(Array.prototype.some.call(null!==(s=this.b24Track.cues)&&void 0!==s?s:[],(function(e){return e.startTime===t})))return!1;if(this.b24Track.cues){for(var a=[],o=this.b24Track.cues.length-1;o>=0;o--)this.b24Track.cues[o].startTime>=t&&(a.push(this.b24Track.cues[o]),this.b24Track.removeCue(this.b24Track.cues[o]));this.b24Track.addCue(n);for(var h=a.length-1;h>=0;h--)this.b24Track.addCue(a[h])}}return!0}},{key:\\\"onB24CueChange\\\",value:function(){if(this.media&&this.b24Track){if(this.table)for(;this.table.firstChild;)this.table.removeChild(this.table.firstChild);if(this.b24Track.activeCues&&this.b24Track.activeCues.length>0){var t=this.b24Track.activeCues[this.b24Track.activeCues.length-1];if(t.startTime<=this.media.currentTime&&this.media.currentTime<=t.endTime&&!this.isOnSeeking){var e,i,r,n,s,a=new Rt(t.data,t.startTime).render(Ot(Ot({},this.rendererOption),{},{table:null!==(e=this.table)&&void 0!==e?e:void 0}));null!=(null==a?void 0:a.PRA)&&(null===(n=this.rendererOption)||void 0===n||null===(s=n.PRACallback)||void 0===s||s.call(n,a.PRA)),null!=a&&a.rendered&&this.onResize(),this.onB24CueChangeDrawed=null!==(i=null==a?void 0:a.rendered)&&void 0!==i&&i,this.textContent=null!==(r=null==a?void 0:a.textContent)&&void 0!==r?r:null}else this.onB24CueChangeDrawed=!1,this.textContent=null;for(var o=this.b24Track.activeCues.length-2;o>=0;o--){var h=this.b24Track.activeCues[o];h.endTime=Math.min(h.endTime,t.startTime),h.startTime===h.endTime&&this.b24Track.removeCue(h)}}else this.onB24CueChangeDrawed=!1,this.textContent=null}else this.onB24CueChangeDrawed=!1}},{key:\\\"onHighResTimeupdate\\\",value:function(){this.onTimeupdate(),this.highResTimeupdatePollingId=window.requestAnimationFrame(this.onHighResTimeupdateHandler)}},{key:\\\"onTimeupdate\\\",value:function(){if(this.media)if(null!=this.prevCurrentTime)if(this.id3Track&&this.id3Track.cues&&0!==this.id3Track.cues.length)if(this.isOnSeeking)this.prevCurrentTime=this.media.currentTime;else if(Math.abs(this.media.currentTime-this.prevCurrentTime)>1)this.prevCurrentTime=this.media.currentTime;else{for(var t,e,i=new Y(Number.NEGATIVE_INFINITY,this.id3Track.cues[0].startTime),r=[i],n=0;n<this.id3Track.cues.length;n++)r.push(this.id3Track.cues[n]);for(var s=0,a=r.length;s+1<a;){var o=this.prevCurrentTime,h=Math.floor((s+a)/2);o<r[h].startTime?a=h:s=h}t=s;for(var c=0,u=r.length;c+1<u;){var l=this.media.currentTime,f=Math.floor((c+u)/2);l<r[f].startTime?u=f:c=f}if(e=c,null!==t&&null!==e&&t!==e){if(t<e)for(var d=e;d>t;d--){var p=r[d];if(p!==i&&this.pushID3v2Cue(p))break}else for(var v=t;v<e;v++){var b=r[v];if(b!==i&&this.pushID3v2Cue(b))break}this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime}else this.prevCurrentTime=this.media.currentTime;else this.prevCurrentTime=this.media.currentTime}},{key:\\\"onCanplay\\\",value:function(){this.id3Track&&(this.id3Track.mode=\\\"hidden\\\"),this.b24Track&&(this.b24Track.mode=\\\"hidden\\\"),null!=this.media&&null==this.prevCurrentTime&&(this.prevCurrentTime=this.media.currentTime-Number.MIN_VALUE)}},{key:\\\"onPlay\\\",value:function(){null==this.highResTimeupdatePollingId&&this.onHighResTimeupdate()}},{key:\\\"onPause\\\",value:function(){null!=this.highResTimeupdatePollingId&&(window.cancelAnimationFrame(this.highResTimeupdatePollingId),this.highResTimeupdatePollingId=null)}},{key:\\\"onSeeking\\\",value:function(){this.isOnSeeking=!0,this.onB24CueChange()}},{key:\\\"onSeeked\\\",value:function(){this.isOnSeeking=!1}},{key:\\\"onResize\\\",value:function(){var t;if(this.media&&this.wrapper){var e=window.getComputedStyle(this.media),i=Number.parseInt(e.width),r=Number.parseInt(e.height),n=this.wrapper.offsetWidth,s=this.wrapper.offsetHeight,a=i/n,o=r/s;if(null!==(t=this.rendererOption)&&void 0!==t&&t.keepAspectRatio){var h=Math.min(a,o);this.wrapper.style.top=\\\"\\\".concat((r-s*h)/2,\\\"px\\\"),this.wrapper.style.left=\\\"\\\".concat((i-n*h)/2,\\\"px\\\"),this.wrapper.style.transform=\\\"scale(\\\".concat(h,\\\")\\\"),this.wrapper.style.transformOrigin=\\\"0 0\\\"}else this.wrapper.style.top=\\\"0px\\\",this.wrapper.style.left=\\\"0px\\\",this.wrapper.style.transform=\\\"scale(\\\".concat(a,\\\", \\\").concat(o,\\\")\\\"),this.wrapper.style.transformOrigin=\\\"0 0\\\"}}},{key:\\\"onID3Addtrack\\\",value:function(t){if(this.media){var e=t.track;\\\"metadata\\\"===e.kind&&(\\\"15260DFFFF49443320FF49443320000F\\\"!==e.inBandMetadataTrackDispatchType&&\\\"com.apple.streaming\\\"!==e.inBandMetadataTrackDispatchType&&\\\"id3\\\"!==e.label||this.setInBandMetadataTextTrack(e))}}},{key:\\\"setupTrack\\\",value:function(){var t,e;if(this.media){if(null!==(t=this.rendererOption)&&void 0!==t&&t.useHighResTextTrack)this.b24Track=new K(this.media),this.b24Track.startPolling();else{for(var i=\\\"ARIB B24 Japanese (data_identifier=0x\\\".concat(this.data_identifier.toString(16),\\\", data_group_id=\\\").concat(this.data_group_id,\\\")\\\"),r=0;r<this.media.textTracks.length;r++){var n=this.media.textTracks[r];if(n.label===i){this.b24Track=n;break}}this.b24Track||(this.b24Track=this.media.addTextTrack(\\\"metadata\\\",i,\\\"ja\\\"),this.b24Track.mode=\\\"hidden\\\")}if(this.b24Track.addEventListener(\\\"cuechange\\\",this.onB24CueChangeHandler),null!==(e=this.rendererOption)&&void 0!==e&&e.enableAutoInBandMetadataTextTrackDetection){for(var s=0;s<this.media.textTracks.length;s++){var a=this.media.textTracks[s];if(\\\"metadata\\\"===a.kind&&(\\\"15260DFFFF49443320FF49443320000F\\\"===a.inBandMetadataTrackDispatchType||\\\"com.apple.streaming\\\"===a.inBandMetadataTrackDispatchType||\\\"id3\\\"===a.label)){this.setInBandMetadataTextTrack(a);break}}this.media.textTracks.addEventListener(\\\"addtrack\\\",this.onID3AddtrackHandler)}this.media.addEventListener(\\\"seeking\\\",this.onSeekingHandler),this.media.addEventListener(\\\"seeked\\\",this.onSeekedHandler)}}},{key:\\\"setupTable\\\",value:function(){var t=this;this.media&&this.subtitleElement&&(this.wrapper=document.createElement(\\\"div\\\"),this.table=document.createElement(\\\"table\\\"),this.wrapper.style.pointerEvents=\\\"none\\\",this.wrapper.appendChild(this.table),this.subtitleElement.appendChild(this.wrapper),this.media.addEventListener(\\\"resize\\\",this.onResizeHandler),window.ResizeObserver?(this.resizeObserver=new ResizeObserver((function(){t.onResize()})),this.resizeObserver.observe(this.media)):(window.addEventListener(\\\"resize\\\",this.onResizeHandler),window.MutationObserver&&(this.mutationObserver=new MutationObserver((function(){t.onResize()})),this.mutationObserver.observe(this.media,{attributes:!0,attributeFilter:[\\\"class\\\",\\\"style\\\"]}))))}},{key:\\\"cleanupTrack\\\",value:function(){var t,e,i,r,n,s;if(this.b24Track)if(null!==(s=this.rendererOption)&&void 0!==s&&s.useHighResTextTrack)this.b24Track.stopPolling();else if(this.b24Track.cues)for(var a=this.b24Track.cues.length-1;a>=0;a--)this.b24Track.removeCue(this.b24Track.cues[a]);null===(t=this.b24Track)||void 0===t||t.removeEventListener(\\\"cuechange\\\",this.onB24CueChangeHandler),null===(e=this.id3Track)||void 0===e||e.removeEventListener(\\\"cuechange\\\",this.onID3CueChangeHandler),null===(i=this.media)||void 0===i||i.removeEventListener(\\\"seeking\\\",this.onSeekingHandler),null===(r=this.media)||void 0===r||r.removeEventListener(\\\"seeked\\\",this.onSeekedHandler),null===(n=this.media)||void 0===n||n.textTracks.removeEventListener(\\\"addtrack\\\",this.onID3AddtrackHandler),this.b24Track=this.id3Track=null}},{key:\\\"cleanupTable\\\",value:function(){var t;window.removeEventListener(\\\"resize\\\",this.onResizeHandler),null===(t=this.media)||void 0===t||t.removeEventListener(\\\"resize\\\",this.onResizeHandler),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.mutationObserver&&(this.mutationObserver.disconnect(),this.mutationObserver=null),this.table&&this.wrapper&&this.wrapper.removeChild(this.table),this.wrapper&&this.subtitleElement&&this.subtitleElement.removeChild(this.wrapper),this.wrapper=this.table=null}}])&&Gt(t.prototype,e),Object.defineProperty(t,\\\"prototype\\\",{writable:!1}),t;var t,e}();return r}()}));\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 32\\\\\\\"><path d=\\\\\\\"M27.090 0.131h-22.731c-2.354 0-4.262 1.839-4.262 4.109v16.401c0 2.269 1.908 4.109 4.262 4.109h4.262v-2.706h8.469l-8.853 8.135 1.579 1.451 7.487-6.88h9.787c2.353 0 4.262-1.84 4.262-4.109v-16.401c0-2.27-1.909-4.109-4.262-4.109v0zM28.511 19.304c0 1.512-1.272 2.738-2.841 2.738h-8.425l-0.076-0.070-0.076 0.070h-11.311c-1.569 0-2.841-1.226-2.841-2.738v-13.696c0-1.513 1.272-2.739 2.841-2.739h19.889c1.569 0 2.841-0.142 2.841 1.37v15.064z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 512 512\\\\\\\"><path d=\\\\\\\"M11.5 280.6l192 160c20.6 17.2 52.5 2.8 52.5-24.6V96c0-27.4-31.9-41.8-52.5-24.6l-192 160c-15.3 12.8-15.3 36.4 0 49.2zm256 0l192 160c20.6 17.2 52.5 2.8 52.5-24.6V96c0-27.4-31.9-41.8-52.5-24.6l-192 160c-15.3 12.8-15.3 36.4 0 49.2z\\\\\\\"></path></svg>\\\"\",\"{{ set enableSubtitle = subtitle && subtitle.type === 'webvtt' }}\\n<video\\n    class=\\\"dplayer-video {{ if current }}dplayer-video-current{{ /if }}\\\"\\n    webkit-playsinline\\n    {{ if airplay }} x-webkit-airplay=\\\"allow\\\" {{ /if }}\\n    playsinline\\n    {{ if pic }}poster=\\\"{{ pic }}\\\"{{ /if }}\\n    {{ if crossOrigin !== null || screenshot || enableSubtitle }}crossorigin=\\\"{{ crossOrigin ? crossOrigin : 'anonymous' }}\\\"{{ /if }}\\n    {{ if preload }}preload=\\\"{{ preload }}\\\"{{ /if }}\\n    {{ if url }}src=\\\"{{ url }}\\\"{{ /if }}\\n    >\\n    {{ if enableSubtitle }}\\n    <track kind=\\\"metadata\\\" default src=\\\"{{ subtitle.url }}\\\"></track>\\n    {{ /if }}\\n</video>\\n\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 21 32\\\\\\\"><path d=\\\\\\\"M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 21 32\\\\\\\"><path d=\\\\\\\"M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528zM25.152 16q0 2.72-1.536 5.056t-4 3.36q-0.256 0.096-0.448 0.096-0.48 0-0.832-0.352t-0.32-0.8q0-0.704 0.672-1.056 1.024-0.512 1.376-0.8 1.312-0.96 2.048-2.4t0.736-3.104-0.736-3.104-2.048-2.4q-0.352-0.288-1.376-0.8-0.672-0.352-0.672-1.056 0-0.448 0.32-0.8t0.8-0.352q0.224 0 0.48 0.096 2.496 1.056 4 3.36t1.536 5.056z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 16 32\\\\\\\"><path d=\\\\\\\"M15.552 15.168q0.448 0.32 0.448 0.832 0 0.448-0.448 0.768l-13.696 8.512q-0.768 0.512-1.312 0.192t-0.544-1.28v-16.448q0-0.96 0.544-1.28t1.312 0.192z\\\\\\\"></path></svg>\\\"\",\"// Imports\\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \\\"../../node_modules/css-loader/dist/runtime/sourceMaps.js\\\";\\nimport ___CSS_LOADER_API_IMPORT___ from \\\"../../node_modules/css-loader/dist/runtime/api.js\\\";\\nimport ___CSS_LOADER_AT_RULE_IMPORT_0___ from \\\"-!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!../../node_modules/balloon-css/balloon.css\\\";\\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\\n___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_0___);\\n// Module\\n___CSS_LOADER_EXPORT___.push([module.id, `@keyframes my-face{2%{transform:translateY(1.5px) rotate(1.5deg)}4%{transform:translateY(-1.5px) rotate(-.5deg)}6%{transform:translateY(1.5px) rotate(-1.5deg)}8%{transform:translateY(-1.5px) rotate(-1.5deg)}10%{transform:translateY(2.5px) rotate(1.5deg)}12%{transform:translateY(-.5px) rotate(1.5deg)}14%{transform:translateY(-1.5px) rotate(1.5deg)}16%{transform:translateY(-.5px) rotate(-1.5deg)}18%{transform:translateY(.5px) rotate(-1.5deg)}20%{transform:translateY(-1.5px) rotate(2.5deg)}22%{transform:translateY(.5px) rotate(-1.5deg)}24%{transform:translateY(1.5px) rotate(1.5deg)}26%{transform:translateY(.5px) rotate(.5deg)}28%{transform:translateY(.5px) rotate(1.5deg)}30%{transform:translateY(-.5px) rotate(2.5deg)}32%{transform:translateY(1.5px) rotate(-.5deg)}34%{transform:translateY(1.5px) rotate(-.5deg)}36%{transform:translateY(-1.5px) rotate(2.5deg)}38%{transform:translateY(1.5px) rotate(-1.5deg)}40%{transform:translateY(-.5px) rotate(2.5deg)}42%{transform:translateY(2.5px) rotate(-1.5deg)}44%{transform:translateY(1.5px) rotate(.5deg)}46%{transform:translateY(-1.5px) rotate(2.5deg)}48%{transform:translateY(-.5px) rotate(.5deg)}50%{transform:translateY(.5px) rotate(.5deg)}52%{transform:translateY(2.5px) rotate(2.5deg)}54%{transform:translateY(-1.5px) rotate(1.5deg)}56%{transform:translateY(2.5px) rotate(2.5deg)}58%{transform:translateY(.5px) rotate(2.5deg)}60%{transform:translateY(2.5px) rotate(2.5deg)}62%{transform:translateY(-.5px) rotate(2.5deg)}64%{transform:translateY(-.5px) rotate(1.5deg)}66%{transform:translateY(1.5px) rotate(-.5deg)}68%{transform:translateY(-1.5px) rotate(-.5deg)}70%{transform:translateY(1.5px) rotate(.5deg)}72%{transform:translateY(2.5px) rotate(1.5deg)}74%{transform:translateY(-.5px) rotate(.5deg)}76%{transform:translateY(-.5px) rotate(2.5deg)}78%{transform:translateY(-.5px) rotate(1.5deg)}80%{transform:translateY(1.5px) rotate(1.5deg)}82%{transform:translateY(-.5px) rotate(.5deg)}84%{transform:translateY(1.5px) rotate(2.5deg)}86%{transform:translateY(-1.5px) rotate(-1.5deg)}88%{transform:translateY(-.5px) rotate(2.5deg)}90%{transform:translateY(2.5px) rotate(-.5deg)}92%{transform:translateY(.5px) rotate(-.5deg)}94%{transform:translateY(2.5px) rotate(.5deg)}96%{transform:translateY(-.5px) rotate(1.5deg)}98%{transform:translateY(-1.5px) rotate(-.5deg)}0%,to{transform:translate(0) rotate(0deg)}}.dplayer{line-height:1;overflow:hidden;position:relative;user-select:none;-webkit-user-select:none}.dplayer *{box-sizing:initial}.dplayer svg{height:100%;width:100%}.dplayer svg circle,.dplayer svg path{fill:#fff}.dplayer.dplayer-fulled,.dplayer.dplayer-fulled-browser{background:#000;height:100%!important;left:0;margin:0;padding:0;position:fixed;top:0;transform:translate(0);width:100%!important;z-index:100000}.dplayer.dplayer-live .dplayer-bar-wrap,.dplayer.dplayer-live .dplayer-time,.dplayer.dplayer-no-audio-switching .dplayer-setting-box .dplayer-setting-audio,.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-comment,.dplayer.dplayer-no-danmaku .dplayer-danmaku,.dplayer.dplayer-no-danmaku .dplayer-setting-box .dplayer-setting-danmaku,.dplayer.dplayer-no-danmaku .dplayer-setting-box .dplayer-setting-danunlimit,.dplayer.dplayer-no-danmaku .dplayer-setting-box .dplayer-setting-showdan{display:none}.dplayer.dplayer-live .dplayer-notice{bottom:56px}.dplayer.dplayer-live .dplayer-setting-loop,.dplayer.dplayer-live .dplayer-setting-speed{display:none}.dplayer.dplayer-live .dplayer-controller .dplayer-icons .dplayer-setting-box{height:auto;overflow-y:hidden}.dplayer.dplayer-live .dplayer-mobile-icon-backward,.dplayer.dplayer-live .dplayer-mobile-icon-forward{display:none}.dplayer.dplayer-live .dplayer-comment-setting-box,.dplayer.dplayer-live .dplayer-setting-box{bottom:58px;max-height:calc(100% - 66px)}.dplayer.dplayer-live.dplayer-mobile .dplayer-comment-setting-box,.dplayer.dplayer-live.dplayer-mobile .dplayer-setting-box{bottom:52px;max-height:calc(100% - 60px)}.dplayer.dplayer-narrow .dplayer-danmaku{font-size:18px}.dplayer.dplayer-narrow .dplayer-icon{margin:0 -3px}.dplayer.dplayer-playing .dplayer-danmaku .dplayer-danmaku-move{animation-play-state:running}.dplayer.dplayer-playing .dplayer-controller,.dplayer.dplayer-playing .dplayer-controller-mask{opacity:0}.dplayer.dplayer-playing:hover .dplayer-controller,.dplayer.dplayer-playing:hover .dplayer-controller-mask{opacity:1}.dplayer.dplayer-loading .dplayer-bezel .dplayer-loading-icon{display:block}.dplayer.dplayer-loading .dplayer-danmaku,.dplayer.dplayer-loading .dplayer-danmaku-move,.dplayer.dplayer-paused .dplayer-danmaku,.dplayer.dplayer-paused .dplayer-danmaku-move{animation-play-state:paused}.dplayer.dplayer-show-controller .dplayer-controller,.dplayer.dplayer-show-controller .dplayer-controller-mask{opacity:1}.dplayer.dplayer-fulled{height:100%!important;left:0;position:fixed!important;top:0;width:100%!important;z-index:100000}.dplayer.dplayer-fulled.dplayer-hide-controller{cursor:none}.dplayer.dplayer-fulled.dplayer-hide-controller .dplayer-controller,.dplayer.dplayer-fulled.dplayer-hide-controller .dplayer-controller-mask{opacity:0!important}.dplayer.dplayer-fulled-browser.dplayer-hide-controller{cursor:none}.dplayer.dplayer-fulled-browser.dplayer-hide-controller .dplayer-controller,.dplayer.dplayer-fulled-browser.dplayer-hide-controller .dplayer-controller-mask{opacity:0!important}.dplayer.dplayer-mobile .dplayer-controller{height:44px}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons{padding-bottom:3px;padding-top:3px}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-airplay-icon,.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-play-icon,.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-volume{display:none}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-full .dplayer-full-in-icon,.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-full .dplayer-pip-icon{display:inline-block;position:static}.dplayer.dplayer-mobile .dplayer-controller-mask{background:linear-gradient(#0000008c 78%,#000c);height:100%}.dplayer.dplayer-mobile.dplayer-playing .dplayer-controller,.dplayer.dplayer-mobile.dplayer-playing .dplayer-controller-mask{opacity:1}.dplayer.dplayer-mobile.dplayer-hide-controller .dplayer-controller-mask{opacity:0}.dplayer.dplayer-mobile.dplayer-hide-controller .dplayer-controller{opacity:0;transform:translateY(100%)}.dplayer.dplayer-mobile .dplayer-bar-wrap{bottom:35px}.dplayer.dplayer-mobile .dplayer-bar-wrap .dplayer-bar-time{display:none}.dplayer.dplayer-mobile .dplayer-comment-setting-box,.dplayer.dplayer-mobile .dplayer-setting-box{bottom:58px;max-height:calc(100% - 66px)}.dplayer.dplayer-mobile.dplayer-hide-controller .dplayer-mobile-icon-wrap{opacity:0;visibility:hidden}.dplayer.dplayer-mobile .dplayer-mobile-icon-wrap{opacity:.7;visibility:visible}.dplayer-web-fullscreen-fix{left:0;margin:0;padding:0;position:fixed;top:0}.dplayer [aria-label]{--balloon-font-size:11.5px}.dplayer [aria-label]:before{display:none}.dplayer [aria-label]:after{background:#111111b3!important;font-family:inherit!important;padding:.3em .8em!important}.dplayer [aria-label][data-balloon-pos=up]:after{margin-bottom:0!important}.dplayer-bezel{bottom:0;color:#fff;font-size:22px;left:0;pointer-events:none;position:absolute;right:0;top:0}.dplayer-bezel .dplayer-bezel-icon{background:#00000080;border-radius:50%;box-sizing:border-box;height:52px;left:50%;margin:-26px 0 0 -26px;opacity:0;padding:12px;pointer-events:none;position:absolute;top:50%;width:52px;will-change:transform}.dplayer-bezel .dplayer-bezel-icon.dplayer-bezel-transition{animation:bezel-hide .5s linear}@keyframes bezel-hide{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(2)}}.dplayer-bezel .dplayer-danloading{animation:my-face 5s ease-in-out infinite;font-size:14px;line-height:14px;margin-top:-7px;position:absolute;text-align:center;top:50%;width:100%}.dplayer-bezel .dplayer-loading-icon{display:none;height:36px;left:50%;margin:-18px 0 0 -18px;pointer-events:none;position:absolute;top:50%;width:36px}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-hide{display:none}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot{animation:dplayer-loading-dot-fade .8s ease infinite;opacity:0;transform-origin:4px 4px;will-change:transform}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-7{animation-delay:.7s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-6{animation-delay:.6s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-5{animation-delay:.5s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-4{animation-delay:.4s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-3{animation-delay:.3s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-2{animation-delay:.2s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-1{animation-delay:.1s}@keyframes dplayer-loading-dot-fade{0%{opacity:.7;transform:scale(1.2)}50%{opacity:.25;transform:scale(.9)}to{opacity:.25;transform:scale(.85)}}.dplayer-controller-mask{background:linear-gradient(#0000 15%,#000000b3);height:98px;width:100%}.dplayer-controller,.dplayer-controller-mask{bottom:0;position:absolute;transition:all .3s ease}.dplayer-controller{height:50px;left:0;padding:0 20px;right:0;user-select:none;-webkit-user-select:none}.dplayer-controller.dplayer-controller-comment .dplayer-icons{display:none}.dplayer-controller.dplayer-controller-comment .dplayer-icons.dplayer-comment-box{display:block}.dplayer-controller .dplayer-bar-wrap{-webkit-tap-highlight-color:rgba(0,0,0,0);bottom:41px;cursor:pointer;height:3px;padding:10px 0;position:absolute;width:calc(100% - 40px)}.dplayer-controller .dplayer-bar-wrap:after{content:var(--thumbnail-url);height:0;overflow:hidden;position:absolute;width:0;z-index:-1}.dplayer-controller .dplayer-bar-wrap:hover .dplayer-bar .dplayer-played .dplayer-thumb{transform:scale(1)}.dplayer-controller .dplayer-bar-wrap:hover .dplayer-highlight{display:block;height:40%;top:4px;transform:translateX(-4px);width:8px}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight{background-color:#fff;border-radius:6px;height:20%;position:absolute;text-align:center;top:5px;transform:translateX(-3px);transition:all .2s ease-in-out;width:6px;z-index:12}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover .dplayer-highlight-text{display:block}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover~.dplayer-bar-preview,.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover~.dplayer-bar-time{opacity:0}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight .dplayer-highlight-text{background-color:#0000009e;border-radius:4px;color:#fff;display:none;font-size:12px;left:50%;padding:5px 8px;position:absolute;top:-24px;transform:translateX(-50%);white-space:nowrap}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-preview{aspect-ratio:16/9;background:#131313;background-image:var(--thumbnail-url);background-repeat:no-repeat;background-size:16000px 100%;border-radius:6px;box-shadow:0 0 5px 0 #0000004d;display:none;image-rendering:-webkit-optimize-contrast;image-rendering:crisp-edges;pointer-events:none;position:absolute}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time{word-wrap:normal;background-color:#1f1f1fd9;border-radius:4px;color:#fff;font-size:12px;left:0;opacity:1;padding:6.5px 7px;pointer-events:none;position:absolute;text-align:center;top:-22px;transition:opacity .1s ease-in-out;word-break:normal;z-index:2}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time.hidden{opacity:0}.dplayer-controller .dplayer-bar-wrap .dplayer-bar{background:#fff3;cursor:pointer;height:4px;position:relative;width:100%}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-loaded{background:#fff;transition:all .5s ease}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-loaded,.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played{bottom:0;height:4px;left:0;position:absolute;top:0;will-change:width}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played .dplayer-thumb{border-radius:50%;cursor:pointer;height:11px;margin-right:-10px;margin-top:-4px;position:absolute;right:5px;top:0;transform:scale(0);transition:all .3s ease-in-out;width:11px}.dplayer-controller .dplayer-icons{-webkit-tap-highlight-color:rgba(0,0,0,0);bottom:0;height:38px;padding-bottom:6px;padding-top:6px;position:absolute}.dplayer-controller .dplayer-icons.dplayer-comment-box{bottom:0;color:#fff;display:none;height:38px;left:20px;position:absolute;right:20px;transition:all .3s ease-in-out;z-index:2}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-icon{padding:7px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-icon{left:0;position:absolute;top:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-send-icon{position:absolute;right:0;top:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-send-icon[aria-label]:after{left:14%}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input{background:none;border:none;border-radius:4px;box-sizing:border-box;color:#fff;font-family:inherit;font-size:14px;height:100%;line-height:18px;margin:0;outline:none;padding:8px 0;text-align:center;width:100%}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::placeholder{color:#fff;opacity:.8}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-moz-focus-inner{border:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-ms-clear{display:none}@media(max-width:350px){.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box{padding:9px 10px 15px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-title{font-size:12px;line-height:24px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input{font-size:12px}}.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon{padding:7px}@media(max-width:500px){.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon{padding-top:6px}}@media(max-width:350px){.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon{padding-top:7px}}.dplayer-controller .dplayer-icons.dplayer-icons-right{right:20px}.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon{padding:8px}@media(max-width:500px){.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon{padding:7px;width:38px}}@media(max-width:350px){.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon{padding:5px;width:31px}}.dplayer-controller .dplayer-icons .dplayer-time{color:#eee;font-family:inherit;font-size:13px;line-height:38px;text-shadow:0 0 2px #00000080;vertical-align:middle}@media(max-width:350px){.dplayer-controller .dplayer-icons .dplayer-time{font-size:12px}}.dplayer-controller .dplayer-icons .dplayer-live-badge{align-items:center;color:#eee;cursor:pointer;display:inline-flex;font-family:inherit;font-size:13px;height:100%;line-height:18px;text-shadow:0 0 2px #00000080;vertical-align:middle}.dplayer-controller .dplayer-icons .dplayer-live-dot{border-radius:6px;content:\\\"\\\";display:inline-block;height:6px;margin-right:5px;vertical-align:4%;width:6px}.dplayer-controller .dplayer-icons .dplayer-icon{background-color:#0000;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;height:100%;line-height:18px;outline:none;vertical-align:middle;width:40px}.dplayer-controller .dplayer-icons .dplayer-icon .dplayer-icon-content{opacity:.8;transition:all .2s ease-in-out}.dplayer-controller .dplayer-icons .dplayer-icon:hover .dplayer-icon-content{opacity:1}.dplayer-controller .dplayer-icons .dplayer-icon::-moz-focus-inner{border:0}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon{padding:10.5px 9.5px 8px}@media(max-width:500px){.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon{padding:9px 9px 8px}}@media(max-width:350px){.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon{padding:6.5px 6.5px 6px}}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-volume-icon{width:43px}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-full-icon[aria-label]:after{left:1%}@media(max-width:350px){.dplayer-controller .dplayer-icons .dplayer-icon{width:35px}}.dplayer-controller .dplayer-icons .dplayer-volume{cursor:pointer;display:inline-block;height:100%;position:relative}.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar{width:45px}.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{transform:scale(1)}.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar{width:45px}.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{transform:scale(1)}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap{display:inline-block;height:100%;margin:0 10px 0 -5px;vertical-align:middle}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar{background:#fff;height:4px;position:relative;top:17px;transition:all .3s ease-in-out;width:0}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner{bottom:0;height:100%;left:0;position:absolute;transition:all .1s ease;will-change:width}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{border-radius:50%;cursor:pointer;height:11px;margin-right:-10px;margin-top:-4px;position:absolute;right:5px;top:0;transform:scale(0);transition:all .3s ease-in-out;width:11px}.dplayer-controller .dplayer-icons .dplayer-setting,.dplayer-controller .dplayer-icons .dplayer-subtitle-btn{display:inline-block;height:100%}.dplayer-controller .dplayer-icons .dplayer-full{display:inline-block;height:100%;position:relative}.dplayer-controller .dplayer-icons .dplayer-comment{display:inline-block;height:100%}.dplayer-mobile-icon-wrap{align-items:center;display:flex;height:50px;justify-content:space-evenly;left:50%;opacity:0;pointer-events:none;position:absolute;top:50%;transform:translate(-50%,-50%);transition:all .28s ease;visibility:hidden;width:100%}.dplayer-mobile-icon-wrap .dplayer-mobile-icon{-webkit-tap-highlight-color:rgba(0,0,0,0);background-color:#0000;border:none;box-sizing:border-box;cursor:pointer;filter:drop-shadow(0 0 7px rgba(0,0,0,.5));height:50px;outline:none;pointer-events:auto;width:50px}.dplayer-mobile-icon-wrap .dplayer-mobile-icon-backward,.dplayer-mobile-icon-wrap .dplayer-mobile-icon-forward{padding:12px}.dplayer-setting-box{-webkit-tap-highlight-color:rgba(0,0,0,0);background:#1c1c1ce6;border-radius:7px;bottom:64px;box-sizing:border-box;display:flex;height:calc(100% - 72px);opacity:0;overflow-x:hidden;overflow-y:hidden;position:absolute;right:20px;transition:all .25s ease;visibility:hidden;width:210px;z-index:2}.dplayer-setting-box>div{overflow-x:hidden}.dplayer-setting-box>div.dplayer-setting-origin-panel{display:block}.dplayer-setting-box.dplayer-setting-box-open{opacity:1;visibility:visible}.dplayer-setting-box.dplayer-setting-box-quality{clip-path:inset(calc(100% - 30px*var(--quality-length) - 54px) 0 0 round 7px)!important}.dplayer-setting-box.dplayer-setting-box-quality .dplayer-setting-origin-panel{transform:translateX(-100%)}.dplayer-setting-box.dplayer-setting-box-quality .dplayer-setting-quality-panel{display:block;transform:translateX(0)}.dplayer-setting-box.dplayer-setting-box-speed{clip-path:inset(calc(100% - 30px*var(--speed-length) - 54px) 0 0 round 7px)!important}.dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-origin-panel{transform:translateX(-100%)}.dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-speed-panel{display:block;transform:translateX(0)}.dplayer-setting-box.dplayer-setting-box-audio{clip-path:inset(calc(100% - 114px) 0 0 round 7px)!important}.dplayer-setting-box.dplayer-setting-box-audio .dplayer-setting-origin-panel{transform:translateX(-100%)}.dplayer-setting-box.dplayer-setting-box-audio .dplayer-setting-audio-panel{display:block;transform:translateX(0)}.dplayer-setting-box .dplayer-label{color:#eee;display:inline-block;font-size:13px;vertical-align:middle;white-space:nowrap}.dplayer-setting-box .dplayer-label-value{color:#e0e0e0;display:inline-block;font-size:12px;margin-left:auto;margin-right:23px;vertical-align:middle;white-space:nowrap}.dplayer-setting-box .dplayer-toggle{font-size:0;height:20px;position:absolute;right:7px;text-align:center;top:5px;vertical-align:middle;width:20px}.dplayer-setting-box .dplayer-toggle input{display:none;max-height:0;max-width:0}.dplayer-setting-box .dplayer-toggle input+label{border:1px solid #dfdfdf;border-radius:10px;box-shadow:inset 0 0 0 0 #dfdfdf;box-sizing:border-box;cursor:pointer;display:inline-block;height:20px;position:relative;right:15px;transition:.25s ease;width:32px}.dplayer-setting-box .dplayer-toggle input+label:before{border-radius:15px;content:\\\"\\\";display:block;height:19px;left:-.5px;position:absolute;top:-.5px;transition:.25s ease;width:19px}.dplayer-setting-box .dplayer-toggle input+label:after{background:#fff;border-radius:15px;box-shadow:0 1px 3px #0006;content:\\\"\\\";display:block;height:18.1px;left:0;position:absolute;top:-.1px;transition:.25s ease;width:18.1px}.dplayer-setting-box .dplayer-toggle input:checked+label{border-color:var(--theme-color)}.dplayer-setting-box .dplayer-toggle input:checked+label:before{background:var(--theme-color);width:31px}.dplayer-setting-box .dplayer-toggle input:checked+label:after{left:12px}.dplayer-setting-box .dplayer-setting-audio-panel,.dplayer-setting-box .dplayer-setting-origin-panel,.dplayer-setting-box .dplayer-setting-quality-panel,.dplayer-setting-box .dplayer-setting-speed-panel{bottom:0;box-sizing:border-box;max-height:100%;overflow-y:auto;padding:7px 0;position:absolute;scrollbar-width:thin;transition:transform .25s ease;width:100%}.dplayer-setting-box .dplayer-setting-audio-panel::-webkit-scrollbar,.dplayer-setting-box .dplayer-setting-origin-panel::-webkit-scrollbar,.dplayer-setting-box .dplayer-setting-quality-panel::-webkit-scrollbar,.dplayer-setting-box .dplayer-setting-speed-panel::-webkit-scrollbar{width:6px}.dplayer-setting-box .dplayer-setting-audio-panel::-webkit-scrollbar-thumb,.dplayer-setting-box .dplayer-setting-origin-panel::-webkit-scrollbar-thumb,.dplayer-setting-box .dplayer-setting-quality-panel::-webkit-scrollbar-thumb,.dplayer-setting-box .dplayer-setting-speed-panel::-webkit-scrollbar-thumb{background:#ffffff26}.dplayer-setting-box .dplayer-setting-origin-panel{transform:translateX(0)}.dplayer-setting-box .dplayer-setting-audio-panel,.dplayer-setting-box .dplayer-setting-quality-panel,.dplayer-setting-box .dplayer-setting-speed-panel{transform:translateX(100%)}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-header,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-header,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-header{align-items:center;border-bottom:2px solid #ffffff26;box-sizing:border-box;cursor:pointer;display:flex;height:33px;margin-bottom:7px;padding-bottom:5px;padding-left:5px}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item{padding:5px}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item .dplayer-toggle{visibility:hidden}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item.dplayer-setting-speed-current .dplayer-toggle{visibility:visible}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-toggle{display:inline-block;margin-right:6px;position:static;width:22px}.dplayer-setting-box .dplayer-setting-audio-item,.dplayer-setting-box .dplayer-setting-item,.dplayer-setting-box .dplayer-setting-quality-item,.dplayer-setting-box .dplayer-setting-speed-item{align-items:center;box-sizing:border-box;cursor:pointer;display:flex;height:30px;padding:5px 10px;position:relative}.dplayer-setting-box .dplayer-setting-audio-item:hover,.dplayer-setting-box .dplayer-setting-item:hover,.dplayer-setting-box .dplayer-setting-quality-item:hover,.dplayer-setting-box .dplayer-setting-speed-item:hover{background-color:#ffffff1a}.dplayer-setting-box .dplayer-setting-danmaku{padding:5px 0}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-label{display:inline;padding:0 10px}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-label-value{font-size:12.5px;margin-right:18px}.dplayer-setting-box .dplayer-setting-danmaku:hover .dplayer-label,.dplayer-setting-box .dplayer-setting-danmaku:hover .dplayer-label-value{display:none}.dplayer-setting-box .dplayer-setting-danmaku:hover .dplayer-danmaku-bar-wrap{display:inline-block}.dplayer-setting-box .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-label,.dplayer-setting-box .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-label-value{display:none}.dplayer-setting-box .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-danmaku-bar-wrap{display:inline-block}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap{box-sizing:border-box;display:none;height:100%;padding:0 10px;vertical-align:middle;width:100%}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar{background:#fff;height:3px;position:relative;top:8.5px;transition:all .3s ease-in-out;width:100%}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner{bottom:0;height:100%;left:0;position:absolute;transition:all .05s ease;will-change:width}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner .dplayer-thumb{border-radius:50%;cursor:pointer;height:11px;margin-right:-10px;margin-top:-4px;position:absolute;right:5px;top:0;transition:all .3s ease-in-out;width:11px}.dplayer-comment-setting-box{-webkit-tap-highlight-color:rgba(0,0,0,0);background:#1c1c1ce6;border-radius:7px;bottom:64px;box-sizing:border-box;clip-path:inset(0 0 0 round 7px);font-size:14px;left:20px;max-height:calc(100% - 72px);opacity:0;overflow-y:auto;padding:10px 10px 16px;position:absolute;scrollbar-width:thin;transition:all .25s ease;visibility:hidden;width:255px;z-index:2}.dplayer-comment-setting-box::-webkit-scrollbar{width:6px}.dplayer-comment-setting-box::-webkit-scrollbar-thumb{background:#ffffff26}.dplayer-comment-setting-box.dplayer-comment-setting-open{opacity:1;visibility:visible}.dplayer-comment-setting-box input[type=radio]{display:none}.dplayer-comment-setting-box label{cursor:pointer}.dplayer-comment-setting-box .dplayer-comment-setting-title{color:#fff;font-size:13px;line-height:30px}.dplayer-comment-setting-box .dplayer-comment-setting-size,.dplayer-comment-setting-box .dplayer-comment-setting-type{font-size:0}.dplayer-comment-setting-box .dplayer-comment-setting-size.dplayer-comment-setting-size,.dplayer-comment-setting-box .dplayer-comment-setting-type.dplayer-comment-setting-size{margin-top:8px}.dplayer-comment-setting-box .dplayer-comment-setting-size .dplayer-comment-setting-title,.dplayer-comment-setting-box .dplayer-comment-setting-type .dplayer-comment-setting-title{margin-bottom:6px}.dplayer-comment-setting-box .dplayer-comment-setting-size label:nth-child(2) span,.dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(2) span{border-radius:4px 0 0 4px}.dplayer-comment-setting-box .dplayer-comment-setting-size label:nth-child(4) span,.dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(4) span{border-radius:0 4px 4px 0}.dplayer-comment-setting-box .dplayer-comment-setting-size span,.dplayer-comment-setting-box .dplayer-comment-setting-type span{border:1px solid #fff;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-size:12px;line-height:16px;margin-right:-1px;padding:4px 6px;text-align:center;width:33.6%}.dplayer-comment-setting-box .dplayer-comment-setting-size input:checked+span,.dplayer-comment-setting-box .dplayer-comment-setting-type input:checked+span{background:#e4e4e6;color:#1c1c1c}.dplayer-comment-setting-box .dplayer-comment-setting-color{font-size:0}.dplayer-comment-setting-box .dplayer-comment-setting-color .dplayer-comment-setting-color-list{display:flex;justify-content:space-between;padding:4px 0}.dplayer-comment-setting-box .dplayer-comment-setting-color .dplayer-comment-setting-color-list label{display:inline-block;font-size:0;padding:6px 0}.dplayer-comment-setting-box .dplayer-comment-setting-color .dplayer-comment-setting-color-list span{border-radius:50%;box-sizing:border-box;cursor:pointer;display:inline-block;height:22px;width:22px}.dplayer-comment-setting-box .dplayer-comment-setting-color .dplayer-comment-setting-color-list span:hover{animation:my-face 5s ease-in-out infinite}.dplayer-danmaku{aspect-ratio:16/9;bottom:0;color:#fff;font-family:inherit;font-size:29px;left:0;margin:auto;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0}.dplayer-danmaku .dplayer-danmaku-item{cursor:default;display:inline-block;font-size:var(--dplayer-danmaku-font-size);font-weight:700;opacity:var(--dplayer-danmaku-opacity);pointer-events:none;text-shadow:1.2px 1.2px 4px #000000e6;user-select:none;-webkit-user-select:none;white-space:nowrap}.dplayer-danmaku .dplayer-danmaku-item--demo{position:absolute;visibility:hidden}.dplayer-danmaku .dplayer-danmaku-item span{box-decoration-break:clone;-webkit-box-decoration-break:clone}.dplayer-danmaku .dplayer-danmaku-item.dplayer-danmaku-size-big{font-size:calc(var(--dplayer-danmaku-font-size)*1.25)}.dplayer-danmaku .dplayer-danmaku-item.dplayer-danmaku-size-small{font-size:calc(var(--dplayer-danmaku-font-size)*.8)}.dplayer-danmaku .dplayer-danmaku-right{position:absolute;right:0;transform:translateX(100%)}.dplayer-danmaku .dplayer-danmaku-right.dplayer-danmaku-move{animation-name:danmaku;animation-play-state:paused;animation-timing-function:linear}@keyframes danmaku{0%{transform:translateX(100%)}}.dplayer-danmaku .dplayer-danmaku-bottom,.dplayer-danmaku .dplayer-danmaku-top{left:50%;position:absolute;transform:translateX(-50%);visibility:hidden}.dplayer-danmaku .dplayer-danmaku-bottom.dplayer-danmaku-move,.dplayer-danmaku .dplayer-danmaku-top.dplayer-danmaku-move{animation-name:danmaku-center;animation-play-state:paused;animation-timing-function:linear}@keyframes danmaku-center{0%{visibility:visible}to{visibility:visible}}.dplayer-logo{left:20px;max-height:50px;max-width:50px;pointer-events:none;position:absolute;top:20px}.dplayer-logo img{background:none;max-height:100%;max-width:100%}.dplayer-menu{background:#1c1c1cd9;border-radius:2px;display:none;overflow:hidden;padding:5px 0;position:absolute;width:170px;z-index:3}.dplayer-menu.dplayer-menu-show{display:block}.dplayer-menu .dplayer-menu-item{box-sizing:border-box;cursor:pointer;height:30px}.dplayer-menu .dplayer-menu-item:hover{background-color:#ffffff1a}.dplayer-menu .dplayer-menu-item a{box-sizing:border-box;color:#eee;display:inline-block;font-size:13px;line-height:30px;overflow:hidden;padding:0 10px;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap;width:100%}.dplayer-menu .dplayer-menu-item a:hover{text-decoration:none}.dplayer-notice{background:#1c1c1ce6;border-radius:4px;bottom:68px;color:#fff;font-size:14px;left:20px;line-height:1.6;margin-right:20px;opacity:0;overflow:hidden;padding:12px 18px;pointer-events:none;position:absolute;transition:all .3s ease-in-out,color 0s}@media(max-width:500px){.dplayer-notice{bottom:auto!important;top:10px}}.dplayer-subtitle{bottom:40px;color:#fff;font-size:20px;left:5%;position:absolute;text-align:center;text-shadow:.5px .5px .5px #00000080;width:90%}.dplayer-subtitle.dplayer-subtitle-hide{display:none}.dplayer-mask{bottom:0;display:none;left:0;position:absolute;right:0;top:0;z-index:1}.dplayer-mask.dplayer-mask-show{display:block}.dplayer-video-wrap{align-items:center;background:#000;display:flex;font-size:0;height:100%;justify-content:center;position:relative;width:100%}.dplayer-video-wrap .dplayer-video-wrap-aspect{aspect-ratio:16/9;max-height:100%;max-width:100%;overflow:hidden;position:relative}.dplayer-video-wrap .dplayer-video-wrap-aspect .dplayer-video{display:none;max-height:100%;max-width:100%;width:99999px}.dplayer-video-wrap .dplayer-video-wrap-aspect .dplayer-video-current{display:block}.dplayer-video-wrap .dplayer-video-wrap-aspect .dplayer-video-prepare{display:none}.dplayer-info-panel{background:#1c1c1ccc;border-radius:2px;color:#fff;font-size:12px;left:10px;padding:10px;position:absolute;top:10px;width:450px}.dplayer-info-panel-hide{display:none}.dplayer-info-panel .dplayer-info-panel-close{cursor:pointer;position:absolute;right:10px;top:10px}.dplayer-info-panel .dplayer-info-panel-item>span{display:inline-block;line-height:15px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.dplayer-info-panel .dplayer-info-panel-item-title{margin-right:10px;text-align:right;width:100px}.dplayer-info-panel .dplayer-info-panel-item-data{width:320px}`, \\\"\\\",{\\\"version\\\":3,\\\"sources\\\":[\\\"webpack://./src/css/balloon.scss\\\",\\\"webpack://./src/css/global.scss\\\",\\\"webpack://./src/css/player.scss\\\",\\\"webpack://./src/css/bezel.scss\\\",\\\"webpack://./src/css/controller.scss\\\",\\\"webpack://./src/css/danmaku.scss\\\",\\\"webpack://./src/css/logo.scss\\\",\\\"webpack://./src/css/menu.scss\\\",\\\"webpack://./src/css/notice.scss\\\",\\\"webpack://./src/css/subtitle.scss\\\",\\\"webpack://./src/css/video.scss\\\",\\\"webpack://./src/css/info-panel.scss\\\"],\\\"names\\\":[],\\\"mappings\\\":\\\"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\\\",\\\"sourcesContent\\\":[\\\"@import '../../node_modules/balloon-css/balloon.css';\\\\n\\\\n.dplayer [aria-label] {\\\\n    --balloon-font-size: 11.5px;\\\\n}\\\\n\\\\n.dplayer [aria-label]:before {\\\\n    display: none;\\\\n}\\\\n\\\\n.dplayer [aria-label]:after {\\\\n    padding: .3em .8em !important;\\\\n    background: rgba(17, 17, 17, 0.7) !important;\\\\n    font-family: inherit !important;\\\\n}\\\\n\\\\n.dplayer [aria-label][data-balloon-pos=\\\\\\\"up\\\\\\\"]:after {\\\\n    margin-bottom: 0 !important;\\\\n}\\\\n\\\",\\\"@keyframes my-face {\\\\n    2% {\\\\n        transform: translate(0, 1.5px) rotate(1.5deg);\\\\n    }\\\\n    4% {\\\\n        transform: translate(0, -1.5px) rotate(-0.5deg);\\\\n    }\\\\n    6% {\\\\n        transform: translate(0, 1.5px) rotate(-1.5deg);\\\\n    }\\\\n    8% {\\\\n        transform: translate(0, -1.5px) rotate(-1.5deg);\\\\n    }\\\\n    10% {\\\\n        transform: translate(0, 2.5px) rotate(1.5deg);\\\\n    }\\\\n    12% {\\\\n        transform: translate(0, -0.5px) rotate(1.5deg);\\\\n    }\\\\n    14% {\\\\n        transform: translate(0, -1.5px) rotate(1.5deg);\\\\n    }\\\\n    16% {\\\\n        transform: translate(0, -0.5px) rotate(-1.5deg);\\\\n    }\\\\n    18% {\\\\n        transform: translate(0, 0.5px) rotate(-1.5deg);\\\\n    }\\\\n    20% {\\\\n        transform: translate(0, -1.5px) rotate(2.5deg);\\\\n    }\\\\n    22% {\\\\n        transform: translate(0, 0.5px) rotate(-1.5deg);\\\\n    }\\\\n    24% {\\\\n        transform: translate(0, 1.5px) rotate(1.5deg);\\\\n    }\\\\n    26% {\\\\n        transform: translate(0, 0.5px) rotate(0.5deg);\\\\n    }\\\\n    28% {\\\\n        transform: translate(0, 0.5px) rotate(1.5deg);\\\\n    }\\\\n    30% {\\\\n        transform: translate(0, -0.5px) rotate(2.5deg);\\\\n    }\\\\n    32% {\\\\n        transform: translate(0, 1.5px) rotate(-0.5deg);\\\\n    }\\\\n    34% {\\\\n        transform: translate(0, 1.5px) rotate(-0.5deg);\\\\n    }\\\\n    36% {\\\\n        transform: translate(0, -1.5px) rotate(2.5deg);\\\\n    }\\\\n    38% {\\\\n        transform: translate(0, 1.5px) rotate(-1.5deg);\\\\n    }\\\\n    40% {\\\\n        transform: translate(0, -0.5px) rotate(2.5deg);\\\\n    }\\\\n    42% {\\\\n        transform: translate(0, 2.5px) rotate(-1.5deg);\\\\n    }\\\\n    44% {\\\\n        transform: translate(0, 1.5px) rotate(0.5deg);\\\\n    }\\\\n    46% {\\\\n        transform: translate(0, -1.5px) rotate(2.5deg);\\\\n    }\\\\n    48% {\\\\n        transform: translate(0, -0.5px) rotate(0.5deg);\\\\n    }\\\\n    50% {\\\\n        transform: translate(0, 0.5px) rotate(0.5deg);\\\\n    }\\\\n    52% {\\\\n        transform: translate(0, 2.5px) rotate(2.5deg);\\\\n    }\\\\n    54% {\\\\n        transform: translate(0, -1.5px) rotate(1.5deg);\\\\n    }\\\\n    56% {\\\\n        transform: translate(0, 2.5px) rotate(2.5deg);\\\\n    }\\\\n    58% {\\\\n        transform: translate(0, 0.5px) rotate(2.5deg);\\\\n    }\\\\n    60% {\\\\n        transform: translate(0, 2.5px) rotate(2.5deg);\\\\n    }\\\\n    62% {\\\\n        transform: translate(0, -0.5px) rotate(2.5deg);\\\\n    }\\\\n    64% {\\\\n        transform: translate(0, -0.5px) rotate(1.5deg);\\\\n    }\\\\n    66% {\\\\n        transform: translate(0, 1.5px) rotate(-0.5deg);\\\\n    }\\\\n    68% {\\\\n        transform: translate(0, -1.5px) rotate(-0.5deg);\\\\n    }\\\\n    70% {\\\\n        transform: translate(0, 1.5px) rotate(0.5deg);\\\\n    }\\\\n    72% {\\\\n        transform: translate(0, 2.5px) rotate(1.5deg);\\\\n    }\\\\n    74% {\\\\n        transform: translate(0, -0.5px) rotate(0.5deg);\\\\n    }\\\\n    76% {\\\\n        transform: translate(0, -0.5px) rotate(2.5deg);\\\\n    }\\\\n    78% {\\\\n        transform: translate(0, -0.5px) rotate(1.5deg);\\\\n    }\\\\n    80% {\\\\n        transform: translate(0, 1.5px) rotate(1.5deg);\\\\n    }\\\\n    82% {\\\\n        transform: translate(0, -0.5px) rotate(0.5deg);\\\\n    }\\\\n    84% {\\\\n        transform: translate(0, 1.5px) rotate(2.5deg);\\\\n    }\\\\n    86% {\\\\n        transform: translate(0, -1.5px) rotate(-1.5deg);\\\\n    }\\\\n    88% {\\\\n        transform: translate(0, -0.5px) rotate(2.5deg);\\\\n    }\\\\n    90% {\\\\n        transform: translate(0, 2.5px) rotate(-0.5deg);\\\\n    }\\\\n    92% {\\\\n        transform: translate(0, 0.5px) rotate(-0.5deg);\\\\n    }\\\\n    94% {\\\\n        transform: translate(0, 2.5px) rotate(0.5deg);\\\\n    }\\\\n    96% {\\\\n        transform: translate(0, -0.5px) rotate(1.5deg);\\\\n    }\\\\n    98% {\\\\n        transform: translate(0, -1.5px) rotate(-0.5deg);\\\\n    }\\\\n    0%,\\\\n    100% {\\\\n        transform: translate(0, 0) rotate(0deg);\\\\n    }\\\\n}\\\\n\\\",\\\".dplayer {\\\\n    position: relative;\\\\n    overflow: hidden;\\\\n    user-select: none;\\\\n    -webkit-user-select: none;\\\\n    line-height: 1;\\\\n\\\\n    * {\\\\n        box-sizing: content-box;\\\\n    }\\\\n\\\\n    svg {\\\\n        width: 100%;\\\\n        height: 100%;\\\\n\\\\n        path,\\\\n        circle {\\\\n            fill: #fff;\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-fulled, &.dplayer-fulled-browser {\\\\n        width: 100% !important;\\\\n        height: 100% !important;\\\\n        background: #000;\\\\n        position: fixed;\\\\n        z-index: 100000;\\\\n        left: 0;\\\\n        top: 0;\\\\n        margin: 0;\\\\n        padding: 0;\\\\n        transform: translate(0, 0);\\\\n    }\\\\n\\\\n    &.dplayer-no-danmaku {\\\\n        .dplayer-setting-box {\\\\n            .dplayer-setting-showdan,\\\\n            .dplayer-setting-danmaku,\\\\n            .dplayer-setting-danunlimit {\\\\n                display: none;\\\\n            }\\\\n        }\\\\n\\\\n        .dplayer-controller .dplayer-icons .dplayer-comment {\\\\n            display: none;\\\\n        }\\\\n\\\\n        .dplayer-danmaku {\\\\n            display: none;\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-no-audio-switching {\\\\n        .dplayer-setting-box {\\\\n            .dplayer-setting-audio {\\\\n                display: none;\\\\n            }\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-live {\\\\n        .dplayer-time {\\\\n            display: none;\\\\n        }\\\\n        .dplayer-bar-wrap {\\\\n            display: none;\\\\n        }\\\\n        .dplayer-notice {\\\\n            bottom: 56px;\\\\n        }\\\\n        .dplayer-setting-speed {\\\\n            display: none;\\\\n        }\\\\n        .dplayer-setting-loop {\\\\n            display: none;\\\\n        }\\\\n        .dplayer-controller .dplayer-icons .dplayer-setting-box {\\\\n            height: auto;\\\\n            overflow-y: hidden;\\\\n        }\\\\n        .dplayer-mobile-icon-backward, .dplayer-mobile-icon-forward {\\\\n            display: none;\\\\n        }\\\\n\\\\n        .dplayer-setting-box, .dplayer-comment-setting-box {\\\\n            bottom: 58px;\\\\n            max-height: calc(100% - 58px - 8px);\\\\n        }\\\\n        &.dplayer-mobile {\\\\n            .dplayer-setting-box, .dplayer-comment-setting-box {\\\\n                bottom: 52px;\\\\n                max-height: calc(100% - 52px - 8px);\\\\n            }\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-narrow {\\\\n        .dplayer-danmaku {\\\\n            font-size: 18px;\\\\n        }\\\\n        .dplayer-icon {\\\\n            margin: 0 -3px;\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-playing {\\\\n        .dplayer-danmaku .dplayer-danmaku-move {\\\\n            animation-play-state: running;\\\\n        }\\\\n\\\\n        .dplayer-controller-mask {\\\\n            opacity: 0;\\\\n        }\\\\n        .dplayer-controller {\\\\n            opacity: 0;\\\\n        }\\\\n\\\\n        &:hover {\\\\n            .dplayer-controller-mask {\\\\n                opacity: 1;\\\\n            }\\\\n            .dplayer-controller {\\\\n                opacity: 1;\\\\n            }\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-loading {\\\\n        .dplayer-bezel .dplayer-loading-icon {\\\\n            display: block;\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-loading,\\\\n    &.dplayer-paused {\\\\n        .dplayer-danmaku,\\\\n        .dplayer-danmaku-move {\\\\n            animation-play-state: paused;\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-show-controller {\\\\n        .dplayer-controller-mask {\\\\n            opacity: 1;\\\\n        }\\\\n        .dplayer-controller {\\\\n            opacity: 1;\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-fulled {\\\\n        position: fixed !important;\\\\n        z-index: 100000;\\\\n        left: 0;\\\\n        top: 0;\\\\n        width: 100% !important;\\\\n        height: 100% !important;\\\\n\\\\n        &.dplayer-hide-controller {\\\\n            cursor: none;\\\\n            .dplayer-controller-mask {\\\\n                opacity: 0 !important;\\\\n            }\\\\n            .dplayer-controller {\\\\n                opacity: 0 !important;\\\\n            }\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-fulled-browser {\\\\n        &.dplayer-hide-controller {\\\\n            cursor: none;\\\\n            .dplayer-controller-mask {\\\\n                opacity: 0 !important;\\\\n            }\\\\n            .dplayer-controller {\\\\n                opacity: 0 !important;\\\\n            }\\\\n        }\\\\n    }\\\\n\\\\n    &.dplayer-mobile {\\\\n        .dplayer-controller {\\\\n            height: 44px;\\\\n            .dplayer-icons {\\\\n                padding-top: 3px;\\\\n                padding-bottom: 3px;\\\\n                .dplayer-volume,\\\\n                .dplayer-airplay-icon,\\\\n                .dplayer-play-icon {\\\\n                    display: none;\\\\n                }\\\\n                .dplayer-full .dplayer-full-in-icon {\\\\n                    position: static;\\\\n                    display: inline-block;\\\\n                }\\\\n                .dplayer-full .dplayer-pip-icon {\\\\n                    position: static;\\\\n                    display: inline-block;\\\\n                }\\\\n            }\\\\n        }\\\\n\\\\n        .dplayer-controller-mask {\\\\n            background: linear-gradient(rgba(0, 0, 0, 0.55) 78%, rgba(0, 0, 0, 0.8) 100%);\\\\n            height: 100%;\\\\n        }\\\\n\\\\n        &.dplayer-playing {\\\\n            .dplayer-controller-mask {\\\\n                opacity: 1;\\\\n            }\\\\n            .dplayer-controller {\\\\n                opacity: 1;\\\\n            }\\\\n        }\\\\n\\\\n        &.dplayer-hide-controller {\\\\n            .dplayer-controller-mask {\\\\n                opacity: 0;\\\\n            }\\\\n            .dplayer-controller {\\\\n                opacity: 0;\\\\n                transform: translateY(100%);\\\\n            }\\\\n        }\\\\n\\\\n        .dplayer-bar-wrap {\\\\n            bottom: 35px;\\\\n            .dplayer-bar-time {\\\\n                display: none;\\\\n            }\\\\n        }\\\\n\\\\n        .dplayer-setting-box, .dplayer-comment-setting-box {\\\\n            bottom: 58px;\\\\n            max-height: calc(100% - 58px - 8px);\\\\n        }\\\\n\\\\n        &.dplayer-hide-controller {\\\\n            .dplayer-mobile-icon-wrap {\\\\n                visibility: hidden;\\\\n                opacity: 0;\\\\n            }\\\\n        }\\\\n\\\\n        .dplayer-mobile-icon-wrap {\\\\n            visibility: visible;\\\\n            opacity: 0.7;\\\\n        }\\\\n    }\\\\n}\\\\n\\\\n// To hide scroll bar, apply this class to <body>\\\\n.dplayer-web-fullscreen-fix {\\\\n    position: fixed;\\\\n    top: 0;\\\\n    left: 0;\\\\n    margin: 0;\\\\n    padding: 0;\\\\n}\\\\n\\\",\\\".dplayer-bezel {\\\\n    position: absolute;\\\\n    left: 0;\\\\n    right: 0;\\\\n    top: 0;\\\\n    bottom: 0;\\\\n    font-size: 22px;\\\\n    color: #fff;\\\\n    pointer-events: none;\\\\n    .dplayer-bezel-icon {\\\\n        position: absolute;\\\\n        top: 50%;\\\\n        left: 50%;\\\\n        margin: -26px 0 0 -26px;\\\\n        height: 52px;\\\\n        width: 52px;\\\\n        padding: 12px;\\\\n        box-sizing: border-box;\\\\n        background: rgba(0, 0, 0, .5);\\\\n        border-radius: 50%;\\\\n        opacity: 0;\\\\n        pointer-events: none;\\\\n        will-change: transform;\\\\n        &.dplayer-bezel-transition {\\\\n            animation: bezel-hide .5s linear;\\\\n        }\\\\n        @keyframes bezel-hide {\\\\n            from {\\\\n                opacity: 1;\\\\n                transform: scale(1);\\\\n            }\\\\n            to {\\\\n                opacity: 0;\\\\n                transform: scale(2);\\\\n            }\\\\n        }\\\\n    }\\\\n    .dplayer-danloading {\\\\n        position: absolute;\\\\n        top: 50%;\\\\n        margin-top: -7px;\\\\n        width: 100%;\\\\n        text-align: center;\\\\n        font-size: 14px;\\\\n        line-height: 14px;\\\\n        animation: my-face 5s infinite ease-in-out;\\\\n    }\\\\n    .dplayer-loading-icon {\\\\n        display: none;\\\\n        position: absolute;\\\\n        top: 50%;\\\\n        left: 50%;\\\\n        margin: -18px 0 0 -18px;\\\\n        height: 36px;\\\\n        width: 36px;\\\\n        pointer-events: none;\\\\n        .dplayer-loading-hide {\\\\n            display: none;\\\\n        }\\\\n        .dplayer-loading-dot {\\\\n            animation: dplayer-loading-dot-fade .8s ease infinite;\\\\n            opacity: 0;\\\\n            transform-origin: 4px 4px;\\\\n            will-change: transform;\\\\n            @for $i from 7 through 1 {\\\\n                &.dplayer-loading-dot-#{$i} {\\\\n                    animation-delay: .1s * $i;\\\\n                }\\\\n            }\\\\n        }\\\\n        @keyframes dplayer-loading-dot-fade {\\\\n            0% {\\\\n                opacity: .7;\\\\n                transform: scale(1.2, 1.2);\\\\n            }\\\\n            50% {\\\\n                opacity: .25;\\\\n                transform: scale(.9, .9);\\\\n            }\\\\n            to {\\\\n                opacity: .25;\\\\n                transform: scale(.85, .85);\\\\n            }\\\\n        }\\\\n    }\\\\n}\\\\n\\\",\\\"\\\\n.dplayer-controller-mask {\\\\n    position: absolute;\\\\n    width: 100%;\\\\n    height: 98px;\\\\n    bottom: 0;\\\\n    background: linear-gradient(rgba(0, 0, 0, 0.0) 15%, rgba(0, 0, 0, 0.7) 100%);\\\\n    transition: all 0.3s ease;\\\\n}\\\\n\\\\n.dplayer-controller {\\\\n    position: absolute;\\\\n    bottom: 0;\\\\n    left: 0;\\\\n    right: 0;\\\\n    height: 50px;\\\\n    padding: 0 20px;\\\\n    user-select: none;\\\\n    -webkit-user-select: none;\\\\n    transition: all 0.3s ease;\\\\n    &.dplayer-controller-comment {\\\\n        .dplayer-icons {\\\\n            display: none;\\\\n        }\\\\n        .dplayer-icons.dplayer-comment-box {\\\\n            display: block;\\\\n        }\\\\n    }\\\\n    .dplayer-bar-wrap {\\\\n        position: absolute;\\\\n        width: calc(100% - 40px);\\\\n        height: 3px;\\\\n        bottom: 41px;\\\\n        padding: 10px 0;\\\\n        cursor: pointer;\\\\n        -webkit-tap-highlight-color: transparent;\\\\n        // for preload thumbnails\\\\n        // ref: https://stackoverflow.com/a/14390213/17124142\\\\n        &:after {\\\\n            // load thumbnails (if exists)\\\\n            content: var(--thumbnail-url);\\\\n            // hide the element\\\\n            position: absolute;\\\\n            width: 0;\\\\n            height: 0;\\\\n            overflow: hidden;\\\\n            z-index: -1;\\\\n        }\\\\n        &:hover {\\\\n            .dplayer-bar .dplayer-played .dplayer-thumb {\\\\n                transform: scale(1);\\\\n            }\\\\n            .dplayer-highlight {\\\\n                display: block;\\\\n                width: 8px;\\\\n                transform: translateX(-4px);\\\\n                top: 4px;\\\\n                height: 40%;\\\\n            }\\\\n        }\\\\n        .dplayer-highlight {\\\\n            z-index: 12;\\\\n            position: absolute;\\\\n            top: 5px;\\\\n            width: 6px;\\\\n            height: 20%;\\\\n            border-radius: 6px;\\\\n            background-color: #fff;\\\\n            text-align: center;\\\\n            transform: translateX(-3px);\\\\n            transition: all .2s ease-in-out;\\\\n            &:hover {\\\\n                .dplayer-highlight-text {\\\\n                    display: block;\\\\n                }\\\\n                &~.dplayer-bar-preview {\\\\n                    opacity: 0;\\\\n                }\\\\n                &~.dplayer-bar-time {\\\\n                    opacity: 0;\\\\n                }\\\\n            }\\\\n            .dplayer-highlight-text {\\\\n                display: none;\\\\n                position: absolute;\\\\n                left: 50%;\\\\n                top: -24px;\\\\n                padding: 5px 8px;\\\\n                background-color: rgba(0, 0, 0, .62);\\\\n                color: #fff;\\\\n                border-radius: 4px;\\\\n                font-size: 12px;\\\\n                white-space: nowrap;\\\\n                transform: translateX(-50%);\\\\n            }\\\\n        }\\\\n        .dplayer-bar-preview {\\\\n            display: none;\\\\n            position: absolute;\\\\n            aspect-ratio: 16 / 9;\\\\n            border-radius: 6px;\\\\n            background: #131313;\\\\n            background-image: var(--thumbnail-url);\\\\n            pointer-events: none;\\\\n            background-size: 16000px 100%;\\\\n            background-repeat: no-repeat;\\\\n            image-rendering: -webkit-optimize-contrast;\\\\n            image-rendering: crisp-edges;\\\\n            box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.3);\\\\n        }\\\\n        .dplayer-bar-time {\\\\n            &.hidden {\\\\n                opacity: 0;\\\\n            }\\\\n            position: absolute;\\\\n            left: 0px;\\\\n            top: -22px;\\\\n            border-radius: 4px;\\\\n            padding: 6.5px 7px;\\\\n            background-color: rgba(31, 31, 31, 0.85);\\\\n            color: #fff;\\\\n            font-size: 12px;\\\\n            text-align: center;\\\\n            opacity: 1;\\\\n            transition: opacity .1s ease-in-out;\\\\n            word-wrap: normal;\\\\n            word-break: normal;\\\\n            z-index: 2;\\\\n            pointer-events: none;\\\\n        }\\\\n        .dplayer-bar {\\\\n            position: relative;\\\\n            height: 4px;\\\\n            width: 100%;\\\\n            background: rgba(255, 255, 255, .2);\\\\n            cursor: pointer;\\\\n            .dplayer-loaded {\\\\n                position: absolute;\\\\n                left: 0;\\\\n                top: 0;\\\\n                bottom: 0;\\\\n                background: #fff;\\\\n                height: 4px;\\\\n                transition: all 0.5s ease;\\\\n                will-change: width;\\\\n            }\\\\n            .dplayer-played {\\\\n                position: absolute;\\\\n                left: 0;\\\\n                top: 0;\\\\n                bottom: 0;\\\\n                height: 4px;\\\\n                will-change: width;\\\\n                .dplayer-thumb {\\\\n                    position: absolute;\\\\n                    top: 0;\\\\n                    right: 5px;\\\\n                    margin-top: -4px;\\\\n                    margin-right: -10px;\\\\n                    height: 11px;\\\\n                    width: 11px;\\\\n                    border-radius: 50%;\\\\n                    cursor: pointer;\\\\n                    transition: all .3s ease-in-out;\\\\n                    transform: scale(0);\\\\n                }\\\\n            }\\\\n        }\\\\n    }\\\\n    .dplayer-icons {\\\\n        position: absolute;\\\\n        height: 38px;\\\\n        padding-top: 6px;\\\\n        padding-bottom: 6px;\\\\n        bottom: 0;\\\\n        -webkit-tap-highlight-color: transparent;\\\\n        &.dplayer-comment-box {\\\\n            display: none;\\\\n            position: absolute;\\\\n            transition: all .3s ease-in-out;\\\\n            z-index: 2;\\\\n            height: 38px;\\\\n            bottom: 0;\\\\n            left: 20px;\\\\n            right: 20px;\\\\n            color: #fff;\\\\n            .dplayer-icon {\\\\n                padding: 7px;\\\\n            }\\\\n            .dplayer-comment-setting-icon {\\\\n                position: absolute;\\\\n                left: 0;\\\\n                top: 0;\\\\n            }\\\\n            .dplayer-send-icon {\\\\n                position: absolute;\\\\n                right: 0;\\\\n                top: 0;\\\\n                &[aria-label]:after {\\\\n                    left: 14%;\\\\n                }\\\\n            }\\\\n            .dplayer-comment-input {\\\\n                outline: none;\\\\n                border: none;\\\\n                padding: 8px 0px;\\\\n                font-size: 14px;\\\\n                font-family: inherit;\\\\n                line-height: 18px;\\\\n                text-align: center;\\\\n                border-radius: 4px;\\\\n                background: none;\\\\n                margin: 0;\\\\n                height: 100%;\\\\n                box-sizing: border-box;\\\\n                width: 100%;\\\\n                color: #fff;\\\\n                &::placeholder {\\\\n                    color: #fff;\\\\n                    opacity: 0.8;\\\\n                }\\\\n                &::-moz-focus-inner {\\\\n                    border: 0;\\\\n                }\\\\n                &::-ms-clear {\\\\n                    display: none;\\\\n                }\\\\n            }\\\\n            @media (max-width: 350px){\\\\n                .dplayer-comment-setting-box {\\\\n                    padding: 9px 10px 15px;\\\\n                    .dplayer-comment-setting-title {\\\\n                        font-size: 12px;\\\\n                        line-height: 24px;\\\\n                    }\\\\n                }\\\\n                .dplayer-comment-input {\\\\n                    font-size: 12px;\\\\n                }\\\\n            }\\\\n        }\\\\n        &.dplayer-icons-left {\\\\n            .dplayer-icon {\\\\n                padding: 7px;\\\\n            }\\\\n            @media (max-width: 500px){\\\\n                .dplayer-icon {\\\\n                    padding-top: 6px;\\\\n                }\\\\n            }\\\\n            @media (max-width: 350px){\\\\n                .dplayer-icon {\\\\n                    padding-top: 7px;\\\\n                }\\\\n            }\\\\n        }\\\\n        &.dplayer-icons-right {\\\\n            right: 20px;\\\\n            .dplayer-icon {\\\\n                padding: 8px;\\\\n                @media (max-width: 500px){\\\\n                    & {\\\\n                        width: 38px;\\\\n                        padding: 7px;\\\\n                    }\\\\n                }\\\\n                @media (max-width: 350px){\\\\n                    & {\\\\n                        width: 31px;\\\\n                        padding: 5px;\\\\n                    }\\\\n                }\\\\n            }\\\\n        }\\\\n        .dplayer-time {\\\\n            line-height: 38px;\\\\n            color: #eee;\\\\n            text-shadow: 0 0 2px rgba(0, 0, 0, .5);\\\\n            vertical-align: middle;\\\\n            font-size: 13px;\\\\n            font-family: inherit;\\\\n            @media (max-width: 350px){\\\\n                & {\\\\n                    font-size: 12px;\\\\n                }\\\\n            }\\\\n        }\\\\n        .dplayer-live-badge {\\\\n            line-height: 18px;\\\\n            color: #eee;\\\\n            text-shadow: 0 0 2px rgba(0, 0, 0, .5);\\\\n            vertical-align: middle;\\\\n            font-size: 13px;\\\\n            cursor: pointer;\\\\n            font-family: inherit;\\\\n            height: 100%;\\\\n            display: inline-flex;\\\\n            align-items: center;\\\\n        }\\\\n        .dplayer-live-dot {\\\\n            display: inline-block;\\\\n            width: 6px;\\\\n            height: 6px;\\\\n            vertical-align: 4%;\\\\n            margin-right: 5px;\\\\n            content: '';\\\\n            border-radius: 6px;\\\\n        }\\\\n        .dplayer-icon {\\\\n            width: 40px;\\\\n            height: 100%;\\\\n            border: none;\\\\n            background-color: transparent;\\\\n            line-height: 18px;\\\\n            outline: none;\\\\n            cursor: pointer;\\\\n            vertical-align: middle;\\\\n            box-sizing: border-box;\\\\n            display: inline-block;\\\\n            .dplayer-icon-content {\\\\n                transition: all .2s ease-in-out;\\\\n                opacity: .8;\\\\n            }\\\\n            &:hover {\\\\n                .dplayer-icon-content {\\\\n                    opacity: 1;\\\\n                }\\\\n            }\\\\n            &::-moz-focus-inner {\\\\n                border: 0;\\\\n            }\\\\n            &.dplayer-comment-icon {\\\\n                padding: 10.5px 9.5px 8px;\\\\n                @media (max-width: 500px){\\\\n                    & {\\\\n                        padding: 9px 9px 8px;\\\\n                    }\\\\n                }\\\\n                @media (max-width: 350px){\\\\n                    & {\\\\n                        padding: 6.5px 6.5px 6px;\\\\n                    }\\\\n                }\\\\n            }\\\\n            &.dplayer-volume-icon {\\\\n                width: 43px;\\\\n            }\\\\n            &.dplayer-full-icon[aria-label]:after {\\\\n                left: 1%;\\\\n            }\\\\n            @media (max-width: 350px){\\\\n                & {\\\\n                    width: 35px;\\\\n                }\\\\n            }\\\\n        }\\\\n        .dplayer-volume {\\\\n            position: relative;\\\\n            display: inline-block;\\\\n            cursor: pointer;\\\\n            height: 100%;\\\\n            &:hover {\\\\n                .dplayer-volume-bar-wrap .dplayer-volume-bar {\\\\n                    width: 45px;\\\\n                }\\\\n                .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb {\\\\n                    transform: scale(1);\\\\n                }\\\\n            }\\\\n            &.dplayer-volume-active {\\\\n                .dplayer-volume-bar-wrap .dplayer-volume-bar {\\\\n                    width: 45px;\\\\n                }\\\\n                .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb {\\\\n                    transform: scale(1);\\\\n                }\\\\n            }\\\\n            .dplayer-volume-bar-wrap {\\\\n                display: inline-block;\\\\n                margin: 0 10px 0 -5px;\\\\n                vertical-align: middle;\\\\n                height: 100%;\\\\n                .dplayer-volume-bar {\\\\n                    position: relative;\\\\n                    top: 17px;\\\\n                    width: 0;\\\\n                    height: 4px;\\\\n                    background: #FFF;\\\\n                    transition: all 0.3s ease-in-out;\\\\n                    .dplayer-volume-bar-inner {\\\\n                        position: absolute;\\\\n                        bottom: 0;\\\\n                        left: 0;\\\\n                        height: 100%;\\\\n                        transition: all 0.1s ease;\\\\n                        will-change: width;\\\\n                        .dplayer-thumb {\\\\n                            position: absolute;\\\\n                            top: 0;\\\\n                            right: 5px;\\\\n                            margin-top: -4px;\\\\n                            margin-right: -10px;\\\\n                            height: 11px;\\\\n                            width: 11px;\\\\n                            border-radius: 50%;\\\\n                            cursor: pointer;\\\\n                            transition: all .3s ease-in-out;\\\\n                            transform: scale(0);\\\\n                        }\\\\n                    }\\\\n                }\\\\n            }\\\\n        }\\\\n        .dplayer-subtitle-btn {\\\\n            display: inline-block;\\\\n            height: 100%;\\\\n        }\\\\n        .dplayer-setting {\\\\n            display: inline-block;\\\\n            height: 100%;\\\\n        }\\\\n        .dplayer-full {\\\\n            display: inline-block;\\\\n            height: 100%;\\\\n            position: relative;\\\\n        }\\\\n        .dplayer-comment {\\\\n            display: inline-block;\\\\n            height: 100%;\\\\n        }\\\\n    }\\\\n}\\\\n\\\\n.dplayer-mobile-icon-wrap {\\\\n    display: flex;\\\\n    align-items: center;\\\\n    justify-content: space-evenly;\\\\n    position: absolute;\\\\n    top: 50%;\\\\n    left: 50%;\\\\n    width: 100%;\\\\n    height: 50px;\\\\n    transform: translate(-50%, -50%);\\\\n    transition: all 0.28s ease;\\\\n    opacity: 0;\\\\n    visibility: hidden;\\\\n    pointer-events: none;\\\\n\\\\n    .dplayer-mobile-icon {\\\\n        width: 50px;\\\\n        height: 50px;\\\\n        border: none;\\\\n        background-color: transparent;\\\\n        -webkit-tap-highlight-color: transparent;\\\\n        filter: drop-shadow(0 0 7px rgba(0, 0, 0, 0.5));\\\\n        box-sizing: border-box;\\\\n        cursor: pointer;\\\\n        outline: none;\\\\n        pointer-events: auto;\\\\n\\\\n        &-backward, &-forward {\\\\n            padding: 12px;\\\\n        }\\\\n    }\\\\n}\\\\n\\\\n.dplayer-setting-box {\\\\n    display: flex;\\\\n    position: absolute;\\\\n    right: 20px;\\\\n    bottom: 64px;\\\\n    width: 210px;\\\\n    height: calc(100% - 64px - 8px);\\\\n    border-radius: 7px;\\\\n    background: rgba(28, 28, 28, 0.9);\\\\n    transition: all .25s ease;\\\\n    box-sizing: border-box;\\\\n    overflow-x: hidden;\\\\n    overflow-y: hidden;\\\\n    visibility: hidden;\\\\n    opacity: 0;\\\\n    z-index: 2;\\\\n    -webkit-tap-highlight-color: transparent;\\\\n    &>div {\\\\n        overflow-x: hidden;\\\\n        &.dplayer-setting-origin-panel {\\\\n            display: block;\\\\n        }\\\\n    }\\\\n    &.dplayer-setting-box-open {\\\\n        visibility: visible;\\\\n        opacity: 1;\\\\n    }\\\\n    &.dplayer-setting-box-quality {\\\\n        clip-path: inset(calc(100% - (30px * var(--quality-length)) - 54px) 0 0 round 7px) !important;\\\\n        .dplayer-setting-origin-panel {\\\\n            transform: translateX(-100%);\\\\n        }\\\\n        .dplayer-setting-quality-panel {\\\\n            display: block;\\\\n            transform: translateX(0%);\\\\n        }\\\\n    }\\\\n    &.dplayer-setting-box-speed {\\\\n        clip-path: inset(calc(100% - (30px * var(--speed-length)) - 54px) 0 0 round 7px) !important;\\\\n        .dplayer-setting-origin-panel {\\\\n            transform: translateX(-100%);\\\\n        }\\\\n        .dplayer-setting-speed-panel {\\\\n            display: block;\\\\n            transform: translateX(0%);\\\\n        }\\\\n    }\\\\n    &.dplayer-setting-box-audio {\\\\n        clip-path: inset(calc(100% - 114px) 0 0 round 7px) !important;\\\\n        .dplayer-setting-origin-panel {\\\\n            transform: translateX(-100%);\\\\n        }\\\\n        .dplayer-setting-audio-panel {\\\\n            display: block;\\\\n            transform: translateX(0%);\\\\n        }\\\\n    }\\\\n    .dplayer-label {\\\\n        display: inline-block;\\\\n        color: #eee;\\\\n        font-size: 13px;\\\\n        vertical-align: middle;\\\\n        white-space: nowrap;\\\\n    }\\\\n    .dplayer-label-value {\\\\n        display: inline-block;\\\\n        margin-left: auto;\\\\n        margin-right: 23px;\\\\n        color: #e0e0e0;\\\\n        font-size: 12px;\\\\n        vertical-align: middle;\\\\n        white-space: nowrap;\\\\n    }\\\\n    .dplayer-toggle {\\\\n        position: absolute;\\\\n        top: 5px;\\\\n        right: 7px;\\\\n        width: 20px;\\\\n        height: 20px;\\\\n        text-align: center;\\\\n        font-size: 0;\\\\n        vertical-align: middle;\\\\n        input {\\\\n            max-height: 0;\\\\n            max-width: 0;\\\\n            display: none;\\\\n        }\\\\n        input+label {\\\\n            display: inline-block;\\\\n            position: relative;\\\\n            right: 15px;\\\\n            width: 32px;\\\\n            height: 20px;\\\\n            border-radius: 10px;\\\\n            box-sizing: border-box;\\\\n            transition: .25s ease;\\\\n            box-shadow: rgb(223, 223, 223) 0 0 0 0 inset;\\\\n            border: 1px solid rgb(223, 223, 223);\\\\n            cursor: pointer;\\\\n        }\\\\n        input+label:before {\\\\n            content: \\\\\\\"\\\\\\\";\\\\n            position: absolute;\\\\n            display: block;\\\\n            height: 19px;\\\\n            width: 19px;\\\\n            top: -0.5px;\\\\n            left: -0.5px;\\\\n            border-radius: 15px;\\\\n            transition: .25s ease;\\\\n        }\\\\n        input+label:after {\\\\n            content: \\\\\\\"\\\\\\\";\\\\n            display: block;\\\\n            position: absolute;\\\\n            height: 18.1px;\\\\n            width: 18.1px;\\\\n            top: -0.1px;\\\\n            left: 0;\\\\n            border-radius: 15px;\\\\n            background: #fff;\\\\n            transition: .25s ease;\\\\n            box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);\\\\n        }\\\\n        input:checked+label {\\\\n            border-color: var(--theme-color);\\\\n        }\\\\n        input:checked+label:before {\\\\n            width: 31px;\\\\n            background: var(--theme-color);\\\\n        }\\\\n        input:checked+label:after {\\\\n            left: 12px;\\\\n        }\\\\n    }\\\\n    .dplayer-setting-origin-panel,\\\\n    .dplayer-setting-quality-panel,\\\\n    .dplayer-setting-speed-panel,\\\\n    .dplayer-setting-audio-panel {\\\\n        position: absolute;\\\\n        bottom: 0px;\\\\n        width: 100%;\\\\n        max-height: 100%;\\\\n        padding: 7px 0;\\\\n        transition: transform .25s ease;\\\\n        box-sizing: border-box;\\\\n        scrollbar-width: thin;\\\\n        overflow-y: auto;\\\\n        &::-webkit-scrollbar {\\\\n            width: 6px;\\\\n        }\\\\n        &::-webkit-scrollbar-thumb {\\\\n            background: rgba(255, 255, 255, .15);\\\\n        }\\\\n    }\\\\n    .dplayer-setting-origin-panel {\\\\n        transform: translateX(0%);\\\\n    }\\\\n    .dplayer-setting-quality-panel,\\\\n    .dplayer-setting-speed-panel,\\\\n    .dplayer-setting-audio-panel {\\\\n        transform: translateX(100%);\\\\n        .dplayer-setting-header {\\\\n            display: flex;\\\\n            align-items: center;\\\\n            height: 33px;\\\\n            padding-left: 5px;\\\\n            padding-bottom: 5px;\\\\n            margin-bottom: 7px;\\\\n            border-bottom: 2px solid rgba(255, 255, 255, .15);\\\\n            box-sizing: border-box;\\\\n            cursor: pointer;\\\\n        }\\\\n        .dplayer-setting-quality-item,\\\\n        .dplayer-setting-speed-item,\\\\n        .dplayer-setting-audio-item {\\\\n            padding: 5px;\\\\n            .dplayer-toggle {\\\\n                visibility: hidden;\\\\n            }\\\\n            &.dplayer-setting-quality-current .dplayer-toggle,\\\\n            &.dplayer-setting-speed-current .dplayer-toggle,\\\\n            &.dplayer-setting-audio-current .dplayer-toggle {\\\\n                visibility: visible;\\\\n            }\\\\n        }\\\\n        .dplayer-toggle {\\\\n            display: inline-block;\\\\n            position: static;\\\\n            width: 22px;\\\\n            margin-right: 6px;\\\\n        }\\\\n    }\\\\n    .dplayer-setting-item,\\\\n    .dplayer-setting-quality-item,\\\\n    .dplayer-setting-speed-item,\\\\n    .dplayer-setting-audio-item {\\\\n        display: flex;\\\\n        align-items: center;\\\\n        height: 30px;\\\\n        padding: 5px 10px;\\\\n        box-sizing: border-box;\\\\n        cursor: pointer;\\\\n        position: relative;\\\\n        &:hover {\\\\n            background-color: rgba(255, 255, 255, .1);\\\\n        }\\\\n    }\\\\n    .dplayer-setting-danmaku {\\\\n        padding: 5px 0;\\\\n        .dplayer-label {\\\\n            padding: 0 10px;\\\\n            display: inline;\\\\n        }\\\\n        .dplayer-label-value {\\\\n            margin-right: 18px;\\\\n            font-size: 12.5px;\\\\n        }\\\\n        &:hover {\\\\n            .dplayer-label, .dplayer-label-value {\\\\n                display: none;\\\\n            }\\\\n            .dplayer-danmaku-bar-wrap {\\\\n                display: inline-block;\\\\n            }\\\\n        }\\\\n        &.dplayer-setting-danmaku-active {\\\\n            .dplayer-label, .dplayer-label-value {\\\\n                display: none;\\\\n            }\\\\n            .dplayer-danmaku-bar-wrap {\\\\n                display: inline-block;\\\\n            }\\\\n        }\\\\n        .dplayer-danmaku-bar-wrap {\\\\n            padding: 0 10px;\\\\n            box-sizing: border-box;\\\\n            display: none;\\\\n            vertical-align: middle;\\\\n            height: 100%;\\\\n            width: 100%;\\\\n            .dplayer-danmaku-bar {\\\\n                position: relative;\\\\n                top: 8.5px;\\\\n                width: 100%;\\\\n                height: 3px;\\\\n                background: #fff;\\\\n                transition: all 0.3s ease-in-out;\\\\n                .dplayer-danmaku-bar-inner {\\\\n                    position: absolute;\\\\n                    bottom: 0;\\\\n                    left: 0;\\\\n                    height: 100%;\\\\n                    transition: all 0.05s ease;\\\\n                    will-change: width;\\\\n                    .dplayer-thumb {\\\\n                        position: absolute;\\\\n                        top: 0;\\\\n                        right: 5px;\\\\n                        margin-top: -4px;\\\\n                        margin-right: -10px;\\\\n                        height: 11px;\\\\n                        width: 11px;\\\\n                        border-radius: 50%;\\\\n                        cursor: pointer;\\\\n                        transition: all .3s ease-in-out;\\\\n                    }\\\\n                }\\\\n            }\\\\n        }\\\\n    }\\\\n}\\\\n\\\\n.dplayer-comment-setting-box {\\\\n    position: absolute;\\\\n    left: 20px;\\\\n    bottom: 64px;\\\\n    width: 255px;\\\\n    max-height: calc(100% - 64px - 8px);\\\\n    clip-path: inset(0 0 0 round 7px);\\\\n    border-radius: 7px;\\\\n    background: rgba(28, 28, 28, 0.9);\\\\n    padding: 10px 10px 16px;\\\\n    font-size: 14px;\\\\n    transition: all .25s ease;\\\\n    scrollbar-width: thin;\\\\n    visibility: hidden;\\\\n    opacity: 0;\\\\n    box-sizing: border-box;\\\\n    overflow-y: auto;\\\\n    z-index: 2;\\\\n    -webkit-tap-highlight-color: transparent;\\\\n    &::-webkit-scrollbar {\\\\n        width: 6px;\\\\n    }\\\\n    &::-webkit-scrollbar-thumb {\\\\n        background: rgba(255, 255, 255, .15);\\\\n    }\\\\n    &.dplayer-comment-setting-open {\\\\n        visibility: visible;\\\\n        opacity: 1;\\\\n    }\\\\n    input[type=radio] {\\\\n        display: none;\\\\n    }\\\\n    label {\\\\n        cursor: pointer;\\\\n    }\\\\n    .dplayer-comment-setting-title {\\\\n        font-size: 13px;\\\\n        color: #fff;\\\\n        line-height: 30px;\\\\n    }\\\\n    .dplayer-comment-setting-type, .dplayer-comment-setting-size {\\\\n        font-size: 0;\\\\n        &.dplayer-comment-setting-size {\\\\n            margin-top: 8px;\\\\n        }\\\\n        .dplayer-comment-setting-title {\\\\n            margin-bottom: 6px;\\\\n        }\\\\n        label {\\\\n            &:nth-child(2) {\\\\n                span {\\\\n                    border-radius: 4px 0 0 4px;\\\\n                }\\\\n            }\\\\n            &:nth-child(4) {\\\\n                span {\\\\n                    border-radius: 0 4px 4px 0;\\\\n                }\\\\n            }\\\\n        }\\\\n        span {\\\\n            width: 33.6%;\\\\n            padding: 4px 6px;\\\\n            line-height: 16px;\\\\n            display: inline-block;\\\\n            font-size: 12px;\\\\n            color: #fff;\\\\n            border: 1px solid #fff;\\\\n            margin-right: -1px;\\\\n            box-sizing: border-box;\\\\n            text-align: center;\\\\n            cursor: pointer;\\\\n        }\\\\n        input:checked+span {\\\\n            background: #E4E4E6;\\\\n            color: #1c1c1c;\\\\n        }\\\\n    }\\\\n    .dplayer-comment-setting-color {\\\\n        font-size: 0;\\\\n        .dplayer-comment-setting-color-list {\\\\n            display: flex;\\\\n            justify-content: space-between;\\\\n            padding: 4px 0px;\\\\n            label {\\\\n                display: inline-block;\\\\n                font-size: 0;\\\\n                padding: 6px 0px;\\\\n            }\\\\n            span {\\\\n                display: inline-block;\\\\n                width: 22px;\\\\n                height: 22px;\\\\n                border-radius: 50%;\\\\n                box-sizing: border-box;\\\\n                cursor: pointer;\\\\n                &:hover {\\\\n                    animation: my-face 5s infinite ease-in-out;\\\\n                }\\\\n            }\\\\n        }\\\\n    }\\\\n}\\\\n\\\",\\\".dplayer-danmaku {\\\\n    position: absolute;\\\\n    top: 0;\\\\n    left: 0;\\\\n    right: 0;\\\\n    bottom: 0;\\\\n    max-width: 100%;\\\\n    max-height: 100%;\\\\n    aspect-ratio: 16/9;\\\\n    margin: auto;\\\\n    font-size: 29px;\\\\n    font-family: inherit;\\\\n    color: #fff;\\\\n    overflow: hidden;\\\\n    .dplayer-danmaku-item {\\\\n        display: inline-block;\\\\n        font-weight: bold;\\\\n        font-size: var(--dplayer-danmaku-font-size);\\\\n        opacity: var(--dplayer-danmaku-opacity);\\\\n        white-space: nowrap;\\\\n        text-shadow: 1.2px 1.2px 4px rgba(0, 0, 0, 0.9);\\\\n        cursor: default;\\\\n        user-select: none;\\\\n        -webkit-user-select: none;\\\\n        pointer-events: none;\\\\n        &--demo {\\\\n            position: absolute;\\\\n            visibility: hidden;\\\\n        }\\\\n        span {\\\\n            box-decoration-break: clone;\\\\n            -webkit-box-decoration-break: clone;\\\\n        }\\\\n        &.dplayer-danmaku-size-big {\\\\n            font-size: calc(var(--dplayer-danmaku-font-size) * 1.25);\\\\n        }\\\\n        &.dplayer-danmaku-size-small {\\\\n            font-size: calc(var(--dplayer-danmaku-font-size) * 0.8);\\\\n        }\\\\n    }\\\\n    .dplayer-danmaku-right {\\\\n        position: absolute;\\\\n        right: 0;\\\\n        transform: translateX(100%);\\\\n        &.dplayer-danmaku-move {\\\\n            animation-name: danmaku;\\\\n            animation-timing-function: linear;\\\\n            animation-play-state: paused;\\\\n        }\\\\n    }\\\\n    @keyframes danmaku {\\\\n        from {\\\\n            transform: translateX(100%);\\\\n        }\\\\n    }\\\\n    .dplayer-danmaku-top,\\\\n    .dplayer-danmaku-bottom {\\\\n        position: absolute;\\\\n        left: 50%;\\\\n        transform: translateX(-50%);\\\\n        visibility: hidden;\\\\n        &.dplayer-danmaku-move {\\\\n            animation-name: danmaku-center;\\\\n            animation-timing-function: linear;\\\\n            animation-play-state: paused;\\\\n        }\\\\n    }\\\\n    @keyframes danmaku-center {\\\\n        from {\\\\n            visibility: visible;\\\\n        }\\\\n        to {\\\\n            visibility: visible;\\\\n        }\\\\n    }\\\\n}\\\\n\\\",\\\".dplayer-logo {\\\\n    pointer-events: none;\\\\n    position: absolute;\\\\n    left: 20px;\\\\n    top: 20px;\\\\n    max-width: 50px;\\\\n    max-height: 50px;\\\\n    img {\\\\n        max-width: 100%;\\\\n        max-height: 100%;\\\\n        background: none;\\\\n    }\\\\n}\\\\n\\\",\\\".dplayer-menu {\\\\n    position: absolute;\\\\n    width: 170px;\\\\n    border-radius: 2px;\\\\n    background: rgba(28, 28, 28, 0.85);\\\\n    padding: 5px 0;\\\\n    overflow: hidden;\\\\n    z-index: 3;\\\\n    display: none;\\\\n    &.dplayer-menu-show {\\\\n        display: block;\\\\n    }\\\\n    .dplayer-menu-item {\\\\n        height: 30px;\\\\n        box-sizing: border-box;\\\\n        cursor: pointer;\\\\n        &:hover {\\\\n            background-color: rgba(255, 255, 255, .1);\\\\n        }\\\\n        a {\\\\n            display: inline-block;\\\\n            padding: 0 10px;\\\\n            line-height: 30px;\\\\n            color: #eee;\\\\n            font-size: 13px;\\\\n            display: inline-block;\\\\n            vertical-align: middle;\\\\n            width: 100%;\\\\n            box-sizing: border-box;\\\\n            white-space: nowrap;\\\\n            text-overflow: ellipsis;\\\\n            overflow: hidden;\\\\n            &:hover {\\\\n                text-decoration: none;\\\\n            }\\\\n        }\\\\n    }\\\\n}\\\\n\\\",\\\".dplayer-notice {\\\\n    position: absolute;\\\\n    bottom: 68px;\\\\n    left: 20px;\\\\n    padding: 12px 18px;\\\\n    margin-right: 20px;\\\\n    border-radius: 4px;\\\\n    background: rgba(28, 28, 28, 0.9);\\\\n    color: #fff;\\\\n    font-size: 14px;\\\\n    line-height: 1.6;\\\\n    transition: all .3s ease-in-out, color 0s;\\\\n    opacity: 0;\\\\n    overflow: hidden;\\\\n    pointer-events: none;\\\\n}\\\\n@media (max-width: 500px){\\\\n    .dplayer-notice {\\\\n        top: 10px;\\\\n        bottom: auto !important;\\\\n    }\\\\n}\\\\n\\\",\\\".dplayer-subtitle {\\\\n    position: absolute;\\\\n    bottom: 40px;\\\\n    width: 90%;\\\\n    left: 5%;\\\\n    text-align: center;\\\\n    color: #fff;\\\\n    text-shadow: 0.5px 0.5px 0.5px rgba(0, 0, 0, 0.5);\\\\n    font-size: 20px;\\\\n    &.dplayer-subtitle-hide {\\\\n        display: none;\\\\n    }\\\\n}\\\\n\\\",\\\".dplayer-mask {\\\\n    position: absolute;\\\\n    top: 0;\\\\n    bottom: 0;\\\\n    left: 0;\\\\n    right: 0;\\\\n    z-index: 1;\\\\n    display: none;\\\\n    &.dplayer-mask-show {\\\\n        display: block;\\\\n    }\\\\n}\\\\n\\\\n.dplayer-video-wrap {\\\\n    display: flex;\\\\n    position: relative;\\\\n    align-items: center;\\\\n    justify-content: center;\\\\n    background: #000;\\\\n    font-size: 0;\\\\n    width: 100%;\\\\n    height: 100%;\\\\n\\\\n    .dplayer-video-wrap-aspect {\\\\n        position: relative;\\\\n        max-width: 100%;\\\\n        max-height: 100%;\\\\n        aspect-ratio: 16 / 9;\\\\n        overflow: hidden;\\\\n\\\\n        .dplayer-video {\\\\n            width: 99999px;  // magic!!\\\\n            max-width: 100%;\\\\n            max-height: 100%;\\\\n            display: none;\\\\n        }\\\\n        .dplayer-video-current {\\\\n            display: block;\\\\n        }\\\\n        .dplayer-video-prepare {\\\\n            display: none;\\\\n        }\\\\n    }\\\\n}\\\\n\\\",\\\".dplayer-info-panel {\\\\n    position: absolute;\\\\n    top: 10px;\\\\n    left: 10px;\\\\n    width: 450px;\\\\n    background: rgba(28, 28, 28, 0.8);\\\\n    padding: 10px;\\\\n    color: #fff;\\\\n    font-size: 12px;\\\\n    border-radius: 2px;\\\\n\\\\n    &-hide {\\\\n        display: none;\\\\n    }\\\\n\\\\n    .dplayer-info-panel-close {\\\\n        cursor: pointer;\\\\n        position: absolute;\\\\n        right: 10px;\\\\n        top: 10px;\\\\n    }\\\\n\\\\n    .dplayer-info-panel-item {\\\\n        & > span {\\\\n            display: inline-block;\\\\n            vertical-align: middle;\\\\n            line-height: 15px;\\\\n            white-space: nowrap;\\\\n            text-overflow: ellipsis;\\\\n            overflow: hidden;\\\\n        }\\\\n    }\\\\n\\\\n    .dplayer-info-panel-item-title {\\\\n        width: 100px;\\\\n        text-align: right;\\\\n        margin-right: 10px;\\\\n    }\\\\n\\\\n    .dplayer-info-panel-item-data {\\\\n        width: 320px;\\\\n    }\\\\n}\\\\n\\\"],\\\"sourceRoot\\\":\\\"\\\"}]);\\n// Exports\\nexport default ___CSS_LOADER_EXPORT___;\\n\",\"module.exports = \\\"<svg version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 22 22\\\\\\\"><svg x=\\\\\\\"7\\\\\\\" y=\\\\\\\"1\\\\\\\"><circle class=\\\\\\\"dplayer-loading-dot dplayer-loading-dot-0\\\\\\\" cx=\\\\\\\"4\\\\\\\" cy=\\\\\\\"4\\\\\\\" r=\\\\\\\"2\\\\\\\"></circle></svg><svg x=\\\\\\\"11\\\\\\\" y=\\\\\\\"3\\\\\\\"><circle class=\\\\\\\"dplayer-loading-dot dplayer-loading-dot-1\\\\\\\" cx=\\\\\\\"4\\\\\\\" cy=\\\\\\\"4\\\\\\\" r=\\\\\\\"2\\\\\\\"></circle></svg><svg x=\\\\\\\"13\\\\\\\" y=\\\\\\\"7\\\\\\\"><circle class=\\\\\\\"dplayer-loading-dot dplayer-loading-dot-2\\\\\\\" cx=\\\\\\\"4\\\\\\\" cy=\\\\\\\"4\\\\\\\" r=\\\\\\\"2\\\\\\\"></circle></svg><svg x=\\\\\\\"11\\\\\\\" y=\\\\\\\"11\\\\\\\"><circle class=\\\\\\\"dplayer-loading-dot dplayer-loading-dot-3\\\\\\\" cx=\\\\\\\"4\\\\\\\" cy=\\\\\\\"4\\\\\\\" r=\\\\\\\"2\\\\\\\"></circle></svg><svg x=\\\\\\\"7\\\\\\\" y=\\\\\\\"13\\\\\\\"><circle class=\\\\\\\"dplayer-loading-dot dplayer-loading-dot-4\\\\\\\" cx=\\\\\\\"4\\\\\\\" cy=\\\\\\\"4\\\\\\\" r=\\\\\\\"2\\\\\\\"></circle></svg><svg x=\\\\\\\"3\\\\\\\" y=\\\\\\\"11\\\\\\\"><circle class=\\\\\\\"dplayer-loading-dot dplayer-loading-dot-5\\\\\\\" cx=\\\\\\\"4\\\\\\\" cy=\\\\\\\"4\\\\\\\" r=\\\\\\\"2\\\\\\\"></circle></svg><svg x=\\\\\\\"1\\\\\\\" y=\\\\\\\"7\\\\\\\"><circle class=\\\\\\\"dplayer-loading-dot dplayer-loading-dot-6\\\\\\\" cx=\\\\\\\"4\\\\\\\" cy=\\\\\\\"4\\\\\\\" r=\\\\\\\"2\\\\\\\"></circle></svg><svg x=\\\\\\\"3\\\\\\\" y=\\\\\\\"3\\\\\\\"><circle class=\\\\\\\"dplayer-loading-dot dplayer-loading-dot-7\\\\\\\" cx=\\\\\\\"4\\\\\\\" cy=\\\\\\\"4\\\\\\\" r=\\\\\\\"2\\\\\\\"></circle></svg></svg>\\\"\",\"<div class=\\\"dplayer-mask\\\"></div>\\n<div class=\\\"dplayer-video-wrap\\\">\\n    <div class=\\\"dplayer-video-wrap-aspect\\\">\\n      {{ include './video.art' video }}\\n    </div>\\n    {{ if options.logo }}\\n    <div class=\\\"dplayer-logo\\\">\\n        <img src=\\\"{{ options.logo }}\\\">\\n    </div>\\n    {{ /if }}\\n    <div class=\\\"dplayer-danmaku\\\"{{ if options.danmaku && options.danmaku.bottom }} style=\\\"margin-bottom:{{ options.danmaku.bottom }}\\\"{{ /if }}>\\n        <div class=\\\"dplayer-danmaku-item dplayer-danmaku-item--demo\\\"></div>\\n    </div>\\n    <div class=\\\"dplayer-subtitle\\\"></div>\\n    <div class=\\\"dplayer-bezel\\\">\\n        <span class=\\\"dplayer-bezel-icon\\\"></span>\\n        <span class=\\\"dplayer-danloading\\\" style=\\\"display: none\\\">{{ tran('Danmaku is loading') }}</span>\\n        <span class=\\\"dplayer-loading-icon\\\">{{@ icons.loading }}</span>\\n    </div>\\n</div>\\n<div class=\\\"dplayer-controller-mask\\\"></div>\\n<div class=\\\"dplayer-controller\\\">\\n    <div class=\\\"dplayer-icons dplayer-comment-box\\\">\\n        <button class=\\\"dplayer-icon dplayer-comment-setting-icon\\\" aria-label=\\\"{{ tran('Setting') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n            <span class=\\\"dplayer-icon-content\\\">{{@ icons.pallette }}</span>\\n        </button>\\n        <input class=\\\"dplayer-comment-input\\\" type=\\\"search\\\" enterkeyhint=\\\"send\\\" placeholder=\\\"{{ tran('Input danmaku, hit Enter') }}\\\" spellcheck=\\\"false\\\" maxlength=\\\"60\\\">\\n        <button class=\\\"dplayer-icon dplayer-send-icon\\\" aria-label=\\\"{{ tran('Send') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n            <span class=\\\"dplayer-icon-content\\\">{{@ icons.send }}</span>\\n        </button>\\n    </div>\\n    <div class=\\\"dplayer-icons dplayer-icons-left\\\">\\n        <button class=\\\"dplayer-icon dplayer-play-icon\\\">\\n            <span class=\\\"dplayer-icon-content\\\">{{@ icons.play }}</span>\\n        </button>\\n        <div class=\\\"dplayer-volume\\\">\\n            <button class=\\\"dplayer-icon dplayer-volume-icon\\\">\\n                <span class=\\\"dplayer-icon-content\\\">{{@ icons.volumeDown }}</span>\\n            </button>\\n            <div class=\\\"dplayer-volume-bar-wrap\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n                <div class=\\\"dplayer-volume-bar\\\">\\n                    <div class=\\\"dplayer-volume-bar-inner\\\" style=\\\"background: {{ options.theme }};\\\">\\n                        <span class=\\\"dplayer-thumb\\\" style=\\\"background: {{ options.theme }};\\\"></span>\\n                    </div>\\n                </div>\\n            </div>\\n        </div>\\n        <span class=\\\"dplayer-time\\\">\\n            <span class=\\\"dplayer-ptime\\\">00:00</span> /\\n            <span class=\\\"dplayer-dtime\\\">00:00</span>\\n        </span>\\n        {{ if options.live }}\\n        <span class=\\\"dplayer-live-badge\\\" aria-label=\\\"{{ tran('Synchronize') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n            <span class=\\\"dplayer-icon-content\\\">\\n                <span class=\\\"dplayer-live-dot\\\" style=\\\"background: {{ options.theme }};\\\"></span>{{ tran('Live') }}\\n            </span>\\n        </span>\\n        {{ /if }}\\n    </div>\\n    <div class=\\\"dplayer-icons dplayer-icons-right\\\">\\n        {{ if options.screenshot }}\\n        <div class=\\\"dplayer-icon dplayer-camera-icon\\\" aria-label=\\\"{{ tran('Screenshot') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n            <span class=\\\"dplayer-icon-content\\\">{{@ icons.camera }}</span>\\n        </div>\\n        {{ /if }}\\n        {{ if options.airplay }}\\n        <div class=\\\"dplayer-icon dplayer-airplay-icon\\\" aria-label=\\\"{{ tran('AirPlay') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n            <span class=\\\"dplayer-icon-content\\\">{{@ icons.airplay }}</span>\\n        </div>\\n        {{ /if }}\\n        <div class=\\\"dplayer-comment\\\">\\n            <button class=\\\"dplayer-icon dplayer-comment-icon\\\" aria-label=\\\"{{ tran('Send danmaku') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n                <span class=\\\"dplayer-icon-content\\\">{{@ icons.comment }}</span>\\n            </button>\\n        </div>\\n        {{ if options.subtitle }}\\n        <div class=\\\"dplayer-subtitle-btn\\\">\\n            <button class=\\\"dplayer-icon dplayer-subtitle-icon\\\" aria-label=\\\"{{ tran('Hide subtitle') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n                <span class=\\\"dplayer-icon-content\\\">{{@ icons.subtitle }}</span>\\n            </button>\\n        </div>\\n        {{ /if }}\\n        <div class=\\\"dplayer-setting\\\">\\n            <button class=\\\"dplayer-icon dplayer-setting-icon\\\" aria-label=\\\"{{ tran('Setting') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n                <span class=\\\"dplayer-icon-content\\\">{{@ icons.setting }}</span>\\n            </button>\\n        </div>\\n        <div class=\\\"dplayer-full\\\">\\n            <button class=\\\"dplayer-icon dplayer-pip-icon\\\" aria-label=\\\"{{ tran('Picture-in-Picture') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n                <span class=\\\"dplayer-icon-content\\\">{{@ icons.pip }}</span>\\n            </button>\\n            <button class=\\\"dplayer-icon dplayer-full-in-icon\\\" aria-label=\\\"{{ tran('Web full screen') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n                <span class=\\\"dplayer-icon-content\\\">{{@ icons.fullWeb }}</span>\\n            </button>\\n            <button class=\\\"dplayer-icon dplayer-full-icon\\\" aria-label=\\\"{{ tran('Full screen') }}\\\" data-balloon-nofocus data-balloon-pos=\\\"up\\\">\\n                <span class=\\\"dplayer-icon-content\\\">{{@ icons.full }}</span>\\n            </button>\\n        </div>\\n    </div>\\n    <div class=\\\"dplayer-bar-wrap\\\">\\n        <div class=\\\"dplayer-bar-time hidden\\\">00:00</div>\\n        <div class=\\\"dplayer-bar-preview\\\"></div>\\n        <div class=\\\"dplayer-bar\\\">\\n            <div class=\\\"dplayer-loaded\\\" style=\\\"width: 0;\\\"></div>\\n            <div class=\\\"dplayer-played\\\" style=\\\"width: 0; background: {{ options.theme }};\\\">\\n                <span class=\\\"dplayer-thumb\\\" style=\\\"background: {{ options.theme }};\\\"></span>\\n            </div>\\n        </div>\\n    </div>\\n</div>\\n<div class=\\\"dplayer-setting-box\\\" style=\\\"{{ options.video.quality ? `--quality-length:${options.video.quality.length};` : '' }} {{ options.playbackSpeed ? `--speed-length:${options.playbackSpeed.length};` : '' }}\\\">\\n    <div class=\\\"dplayer-setting-origin-panel\\\">\\n        {{ if options.video.quality }}\\n        <div class=\\\"dplayer-setting-item dplayer-setting-quality\\\">\\n            <span class=\\\"dplayer-label\\\">{{ tran('Quality') }}</span>\\n            <span class=\\\"dplayer-label-value\\\">{{ options.video.quality[options.video.defaultQuality].name }}</span>\\n            <div class=\\\"dplayer-toggle\\\">{{@ icons.right }}</div>\\n        </div>\\n        {{ /if }}\\n        <div class=\\\"dplayer-setting-item dplayer-setting-audio\\\">\\n            <span class=\\\"dplayer-label\\\">{{ tran('Audio') }}</span>\\n            <span class=\\\"dplayer-label-value\\\">{{ tran('Primary audio') }}</span>\\n            <div class=\\\"dplayer-toggle\\\">{{@ icons.right }}</div>\\n        </div>\\n        <div class=\\\"dplayer-setting-item dplayer-setting-speed\\\">\\n            <span class=\\\"dplayer-label\\\">{{ tran('Speed') }}</span>\\n            <span class=\\\"dplayer-label-value\\\">{{ tran('Normal') }}</span>\\n            <div class=\\\"dplayer-toggle\\\">{{@ icons.right }}</div>\\n        </div>\\n        <div class=\\\"dplayer-setting-item dplayer-setting-loop\\\">\\n            <span class=\\\"dplayer-label\\\">{{ tran('Loop') }}</span>\\n            <div class=\\\"dplayer-toggle\\\">\\n                <input class=\\\"dplayer-toggle-setting-input\\\" type=\\\"checkbox\\\" name=\\\"dplayer-toggle\\\">\\n                <label for=\\\"dplayer-toggle\\\" style=\\\"--theme-color:{{ options.theme }}\\\"></label>\\n            </div>\\n        </div>\\n        <div class=\\\"dplayer-setting-item dplayer-setting-showdan\\\">\\n            <span class=\\\"dplayer-label\\\">{{ tran('Show danmaku') }}</span>\\n            <div class=\\\"dplayer-toggle\\\">\\n                <input class=\\\"dplayer-showdan-setting-input\\\" type=\\\"checkbox\\\" name=\\\"dplayer-toggle-dan\\\">\\n                <label for=\\\"dplayer-toggle-dan\\\" style=\\\"--theme-color:{{ options.theme }}\\\"></label>\\n            </div>\\n        </div>\\n        <div class=\\\"dplayer-setting-item dplayer-setting-danunlimit\\\">\\n            <span class=\\\"dplayer-label\\\">{{ tran('Unlimited danmaku') }}</span>\\n            <div class=\\\"dplayer-toggle\\\">\\n                <input class=\\\"dplayer-danunlimit-setting-input\\\" type=\\\"checkbox\\\" name=\\\"dplayer-toggle-danunlimit\\\">\\n                <label for=\\\"dplayer-toggle-danunlimit\\\" style=\\\"--theme-color:{{ options.theme }}\\\"></label>\\n            </div>\\n        </div>\\n        <div class=\\\"dplayer-setting-item dplayer-setting-danmaku\\\">\\n            <span class=\\\"dplayer-label\\\">{{ tran('Opacity for danmaku') }}</span>\\n            <span class=\\\"dplayer-label-value\\\">1.0</span>\\n            <div class=\\\"dplayer-danmaku-bar-wrap\\\">\\n                <div class=\\\"dplayer-danmaku-bar\\\">\\n                    <div class=\\\"dplayer-danmaku-bar-inner\\\" style=\\\"background: {{ options.theme }};\\\">\\n                        <span class=\\\"dplayer-thumb\\\" style=\\\"background: {{ options.theme }};\\\"></span>\\n                    </div>\\n                </div>\\n            </div>\\n        </div>\\n    </div>\\n    {{ if options.video.quality }}\\n    <div class=\\\"dplayer-setting-quality-panel\\\">\\n        <div class=\\\"dplayer-setting-header dplayer-setting-quality-header\\\">\\n            <div class=\\\"dplayer-toggle\\\">{{@ icons.left }}</div>\\n            <span class=\\\"dplayer-label\\\">{{ tran('Quality') }}</span>\\n        </div>\\n        {{ each options.video.quality }}\\n            <div class=\\\"dplayer-setting-quality-item {{ $value.name === options.video.quality[options.video.defaultQuality].name ? 'dplayer-setting-quality-current' : '' }}\\\" data-index=\\\"{{ $index }}\\\">\\n                <div class=\\\"dplayer-toggle\\\">{{@ icons.check }}</div>\\n                <span class=\\\"dplayer-label\\\">{{ $value.name }}</span>\\n            </div>\\n        {{ /each }}\\n    </div>\\n    {{ /if }}\\n    <div class=\\\"dplayer-setting-speed-panel\\\">\\n        <div class=\\\"dplayer-setting-header dplayer-setting-speed-header\\\">\\n            <div class=\\\"dplayer-toggle\\\">{{@ icons.left }}</div>\\n            <span class=\\\"dplayer-label\\\">{{ tran('Speed') }}</span>\\n        </div>\\n        {{ each options.playbackSpeed }}\\n            <div class=\\\"dplayer-setting-speed-item {{ $value === 1 ? 'dplayer-setting-speed-current' : '' }}\\\" data-speed=\\\"{{ $value }}\\\">\\n                <div class=\\\"dplayer-toggle\\\">{{@ icons.check }}</div>\\n                <span class=\\\"dplayer-label\\\">{{ $value === 1 ? tran('Normal') : $value }}</span>\\n            </div>\\n        {{ /each }}\\n    </div>\\n    <div class=\\\"dplayer-setting-audio-panel\\\">\\n        <div class=\\\"dplayer-setting-header dplayer-setting-audio-header\\\">\\n            <div class=\\\"dplayer-toggle\\\">{{@ icons.left }}</div>\\n            <span class=\\\"dplayer-label\\\">{{ tran('Audio') }}</span>\\n        </div>\\n        <div class=\\\"dplayer-setting-audio-item dplayer-setting-audio-current\\\" data-audio=\\\"primary\\\">\\n            <div class=\\\"dplayer-toggle\\\">{{@ icons.check }}</div>\\n            <span class=\\\"dplayer-label\\\">{{ tran('Primary audio') }}</span>\\n        </div>\\n        <div class=\\\"dplayer-setting-audio-item\\\" data-audio=\\\"secondary\\\">\\n            <div class=\\\"dplayer-toggle\\\">{{@ icons.check }}</div>\\n            <span class=\\\"dplayer-label\\\">{{ tran('Secondary audio') }}</span>\\n        </div>\\n    </div>\\n</div>\\n<div class=\\\"dplayer-comment-setting-box\\\">\\n    <div class=\\\"dplayer-comment-setting-color\\\">\\n        <div class=\\\"dplayer-comment-setting-title\\\">{{ tran('Set danmaku color') }}</div>\\n        <div class=\\\"dplayer-comment-setting-color-list\\\">\\n            <label>\\n                <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-color-{{ index }}\\\" value=\\\"#ffeaea\\\" checked>\\n                <span style=\\\"background: #ffeaea\\\"></span>\\n            </label>\\n            <label>\\n                <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-color-{{ index }}\\\" value=\\\"#f02840\\\">\\n                <span style=\\\"background: #f02840\\\"></span>\\n            </label>\\n            <label>\\n                <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-color-{{ index }}\\\" value=\\\"#fd7e80\\\">\\n                <span style=\\\"background: #fd7e80\\\"></span>\\n            </label>\\n            <label>\\n                <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-color-{{ index }}\\\" value=\\\"#fda708\\\">\\n                <span style=\\\"background: #fda708\\\"></span>\\n            </label>\\n            <label>\\n                <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-color-{{ index }}\\\" value=\\\"#ffe133\\\">\\n                <span style=\\\"background: #ffe133\\\"></span>\\n            </label>\\n            <label>\\n                <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-color-{{ index }}\\\" value=\\\"#64dd17\\\">\\n                <span style=\\\"background: #64dd17\\\"></span>\\n            </label>\\n            <label>\\n                <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-color-{{ index }}\\\" value=\\\"#00d4f5\\\">\\n                <span style=\\\"background: #00d4f5\\\"></span>\\n            </label>\\n            <label>\\n                <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-color-{{ index }}\\\" value=\\\"#4763ff\\\">\\n                <span style=\\\"background: #4763ff\\\"></span>\\n            </label>\\n        </div>\\n    </div>\\n    <div class=\\\"dplayer-comment-setting-type\\\">\\n        <div class=\\\"dplayer-comment-setting-title\\\">{{ tran('Set danmaku type') }}</div>\\n        <label>\\n            <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-type-{{ index }}\\\" value=\\\"top\\\">\\n            <span>{{ tran('Top') }}</span>\\n        </label>\\n        <label>\\n            <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-type-{{ index }}\\\" value=\\\"right\\\" checked>\\n            <span>{{ tran('Rolling') }}</span>\\n        </label>\\n        <label>\\n            <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-type-{{ index }}\\\" value=\\\"bottom\\\">\\n            <span>{{ tran('Bottom') }}</span>\\n        </label>\\n    </div>\\n    <div class=\\\"dplayer-comment-setting-size\\\">\\n        <div class=\\\"dplayer-comment-setting-title\\\">{{ tran('Set danmaku size') }}</div>\\n        <label>\\n            <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-size-{{ index }}\\\" value=\\\"big\\\">\\n            <span>{{ tran('Big') }}</span>\\n        </label>\\n        <label>\\n            <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-size-{{ index }}\\\" value=\\\"medium\\\" checked>\\n            <span>{{ tran('Medium') }}</span>\\n        </label>\\n        <label>\\n            <input type=\\\"radio\\\" name=\\\"dplayer-danmaku-size-{{ index }}\\\" value=\\\"small\\\">\\n            <span>{{ tran('Small') }}</span>\\n        </label>\\n    </div>\\n</div>\\n<div class=\\\"dplayer-info-panel dplayer-info-panel-hide\\\">\\n    <div class=\\\"dplayer-info-panel-close\\\">[x]</div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-version\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Player Version</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-mimetype\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Mime Type</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-video-fps\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Video FPS</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-page-fps\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Page FPS</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-dropped-frames\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Dropped Frames</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-type\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Video Type</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-url\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Video URL</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-resolution\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Video Resolution</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-duration\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Video Duration</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-buffer-remain\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Buffer Remain</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n    <div class=\\\"dplayer-info-panel-item dplayer-info-panel-item-download-speed\\\">\\n        <span class=\\\"dplayer-info-panel-item-title\\\">Download Speed</span>\\n        <span class=\\\"dplayer-info-panel-item-data\\\"></span>\\n    </div>\\n</div>\\n<div class=\\\"dplayer-menu\\\">\\n    {{ each options.contextmenu }}\\n        <div class=\\\"dplayer-menu-item\\\">\\n            <a{{ if $value.link }} target=\\\"_blank\\\"{{ /if }} href=\\\"{{ $value.link || 'javascript:void(0);' }}\\\">{{ tran($value.text) }}</a>\\n        </div>\\n    {{ /each }}\\n</div>\\n<div class=\\\"dplayer-notice\\\"></div>\\n<div class=\\\"dplayer-mobile-icon-wrap\\\">\\n    <button class=\\\"dplayer-mobile-icon dplayer-mobile-icon-backward\\\">\\n        {{@ icons.backward }}\\n    </button>\\n    <button class=\\\"dplayer-mobile-icon dplayer-mobile-icon-play\\\">\\n        {{@ icons.play }}\\n    </button>\\n    <button class=\\\"dplayer-mobile-icon dplayer-mobile-icon-forward\\\">\\n        {{@ icons.forward }}\\n    </button>\\n</div>\\n\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 32\\\\\\\"><path d=\\\\\\\"M22 16l-10.105-10.6-1.895 1.987 8.211 8.613-8.211 8.612 1.895 1.988 8.211-8.613z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 32\\\\\\\"><path d=\\\\\\\"M13.725 30l3.9-5.325-3.9-1.125v6.45zM0 17.5l11.050 3.35 13.6-11.55-10.55 12.425 11.8 3.65 6.1-23.375-32 15.5z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 21 32\\\\\\\"><path d=\\\\\\\"M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528z\\\\\\\"></path></svg>\\\"\",\"\\\"use strict\\\";\\n\\n/* istanbul ignore next  */\\nfunction insertStyleElement(options) {\\n  var element = document.createElement(\\\"style\\\");\\n  options.setAttributes(element, options.attributes);\\n  options.insert(element, options.options);\\n  return element;\\n}\\nmodule.exports = insertStyleElement;\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 32\\\\\\\"><path d=\\\\\\\"M16 23c-3.309 0-6-2.691-6-6s2.691-6 6-6 6 2.691 6 6-2.691 6-6 6zM16 13c-2.206 0-4 1.794-4 4s1.794 4 4 4c2.206 0 4-1.794 4-4s-1.794-4-4-4zM27 28h-22c-1.654 0-3-1.346-3-3v-16c0-1.654 1.346-3 3-3h3c0.552 0 1 0.448 1 1s-0.448 1-1 1h-3c-0.551 0-1 0.449-1 1v16c0 0.552 0.449 1 1 1h22c0.552 0 1-0.448 1-1v-16c0-0.551-0.448-1-1-1h-11c-0.552 0-1-0.448-1-1s0.448-1 1-1h11c1.654 0 3 1.346 3 3v16c0 1.654-1.346 3-3 3zM24 10.5c0 0.828 0.672 1.5 1.5 1.5s1.5-0.672 1.5-1.5c0-0.828-0.672-1.5-1.5-1.5s-1.5 0.672-1.5 1.5zM15 4c0 0.552-0.448 1-1 1h-4c-0.552 0-1-0.448-1-1v0c0-0.552 0.448-1 1-1h4c0.552 0 1 0.448 1 1v0z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 24 24\\\\\\\"><path d=\\\\\\\"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 33\\\\\\\"><path d=\\\\\\\"M26.3,15.1H14.5v8.6h11.8V15.1z M32.2,26.6V6.4c0-1.6-1.3-2.8-2.9-2.8H2.8c-1.6,0-2.9,1.3-2.9,2.8v20.1c0,1.6,1.3,2.9,2.9,2.9h26.4C30.8,29.4,32.2,28.1,32.2,26.6z M29.2,26.6H2.8V6.4h26.4V26.6z\\\\\\\"></path></svg>\\\"\",\"\\\"use strict\\\";\\n\\nvar memo = {};\\n\\n/* istanbul ignore next  */\\nfunction getTarget(target) {\\n  if (typeof memo[target] === \\\"undefined\\\") {\\n    var styleTarget = document.querySelector(target);\\n\\n    // Special case to return head of iframe instead of iframe itself\\n    if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\\n      try {\\n        // This will throw an exception if access to iframe is blocked\\n        // due to cross-origin restrictions\\n        styleTarget = styleTarget.contentDocument.head;\\n      } catch (e) {\\n        // istanbul ignore next\\n        styleTarget = null;\\n      }\\n    }\\n    memo[target] = styleTarget;\\n  }\\n  return memo[target];\\n}\\n\\n/* istanbul ignore next  */\\nfunction insertBySelector(insert, style) {\\n  var target = getTarget(insert);\\n  if (!target) {\\n    throw new Error(\\\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\\\");\\n  }\\n  target.appendChild(style);\\n}\\nmodule.exports = insertBySelector;\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 33\\\\\\\"><path d=\\\\\\\"M6.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v4h4c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333zM30.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h4v-4c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM30.667 12c-0.8 0-1.333-0.533-1.333-1.333v-4h-4c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM1.333 12c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333h-4v4c0 0.8-0.533 1.333-1.333 1.333z\\\\\\\"></path></svg>\\\"\",\"\\\"use strict\\\";\\n\\n/* istanbul ignore next  */\\nfunction apply(styleElement, options, obj) {\\n  var css = \\\"\\\";\\n  if (obj.supports) {\\n    css += \\\"@supports (\\\".concat(obj.supports, \\\") {\\\");\\n  }\\n  if (obj.media) {\\n    css += \\\"@media \\\".concat(obj.media, \\\" {\\\");\\n  }\\n  var needLayer = typeof obj.layer !== \\\"undefined\\\";\\n  if (needLayer) {\\n    css += \\\"@layer\\\".concat(obj.layer.length > 0 ? \\\" \\\".concat(obj.layer) : \\\"\\\", \\\" {\\\");\\n  }\\n  css += obj.css;\\n  if (needLayer) {\\n    css += \\\"}\\\";\\n  }\\n  if (obj.media) {\\n    css += \\\"}\\\";\\n  }\\n  if (obj.supports) {\\n    css += \\\"}\\\";\\n  }\\n  var sourceMap = obj.sourceMap;\\n  if (sourceMap && typeof btoa !== \\\"undefined\\\") {\\n    css += \\\"\\\\n/*# sourceMappingURL=data:application/json;base64,\\\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \\\" */\\\");\\n  }\\n\\n  // For old IE\\n  /* istanbul ignore if  */\\n  options.styleTagTransform(css, styleElement, options.options);\\n}\\nfunction removeStyleElement(styleElement) {\\n  // istanbul ignore if\\n  if (styleElement.parentNode === null) {\\n    return false;\\n  }\\n  styleElement.parentNode.removeChild(styleElement);\\n}\\n\\n/* istanbul ignore next  */\\nfunction domAPI(options) {\\n  if (typeof document === \\\"undefined\\\") {\\n    return {\\n      update: function update() {},\\n      remove: function remove() {}\\n    };\\n  }\\n  var styleElement = options.insertStyleElement(options);\\n  return {\\n    update: function update(obj) {\\n      apply(styleElement, options, obj);\\n    },\\n    remove: function remove() {\\n      removeStyleElement(styleElement);\\n    }\\n  };\\n}\\nmodule.exports = domAPI;\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 512 512\\\\\\\"><path d=\\\\\\\"M500.5 231.4l-192-160C287.9 54.3 256 68.6 256 96v320c0 27.4 31.9 41.8 52.5 24.6l192-160c15.3-12.8 15.3-36.4 0-49.2zm-256 0l-192-160C31.9 54.3 0 68.6 0 96v320c0 27.4 31.9 41.8 52.5 24.6l192-160c15.3-12.8 15.3-36.4 0-49.2z\\\\\\\"></path></svg>\\\"\",\"'use strict';\\n\\n/*! art-template@runtime | https://github.com/aui/art-template */\\n\\nvar globalThis = typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : {};\\n\\nvar runtime = Object.create(globalThis);\\nvar ESCAPE_REG = /[\\\"&'<>]/;\\n\\n/**\\n * 编码模板输出的内容\\n * @param  {any}        content\\n * @return {string}\\n */\\nruntime.$escape = function (content) {\\n    return xmlEscape(toString(content));\\n};\\n\\n/**\\n * 迭代器，支持数组与对象\\n * @param {array|Object} data\\n * @param {function}     callback\\n */\\nruntime.$each = function (data, callback) {\\n    if (Array.isArray(data)) {\\n        for (var i = 0, len = data.length; i < len; i++) {\\n            callback(data[i], i);\\n        }\\n    } else {\\n        for (var _i in data) {\\n            callback(data[_i], _i);\\n        }\\n    }\\n};\\n\\n// 将目标转成字符\\nfunction toString(value) {\\n    if (typeof value !== 'string') {\\n        if (value === undefined || value === null) {\\n            value = '';\\n        } else if (typeof value === 'function') {\\n            value = toString(value.call(value));\\n        } else {\\n            value = JSON.stringify(value);\\n        }\\n    }\\n\\n    return value;\\n}\\n\\n// 编码 HTML 内容\\nfunction xmlEscape(content) {\\n    var html = '' + content;\\n    var regexResult = ESCAPE_REG.exec(html);\\n    if (!regexResult) {\\n        return content;\\n    }\\n\\n    var result = '';\\n    var i = void 0,\\n        lastIndex = void 0,\\n        char = void 0;\\n    for (i = regexResult.index, lastIndex = 0; i < html.length; i++) {\\n        switch (html.charCodeAt(i)) {\\n            case 34:\\n                char = '&#34;';\\n                break;\\n            case 38:\\n                char = '&#38;';\\n                break;\\n            case 39:\\n                char = '&#39;';\\n                break;\\n            case 60:\\n                char = '&#60;';\\n                break;\\n            case 62:\\n                char = '&#62;';\\n                break;\\n            default:\\n                continue;\\n        }\\n\\n        if (lastIndex !== i) {\\n            result += html.substring(lastIndex, i);\\n        }\\n\\n        lastIndex = i + 1;\\n        result += char;\\n    }\\n\\n    if (lastIndex !== i) {\\n        return result + html.substring(lastIndex, i);\\n    } else {\\n        return result;\\n    }\\n}\\n\\nmodule.exports = runtime;\",\"// Imports\\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \\\"../css-loader/dist/runtime/sourceMaps.js\\\";\\nimport ___CSS_LOADER_API_IMPORT___ from \\\"../css-loader/dist/runtime/api.js\\\";\\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\\n// Module\\n___CSS_LOADER_EXPORT___.push([module.id, `:root{--balloon-border-radius:2px;--balloon-color:#101010f2;--balloon-text-color:#fff;--balloon-font-size:12px;--balloon-move:4px}button[aria-label][data-balloon-pos]{overflow:visible}[aria-label][data-balloon-pos]{cursor:pointer;position:relative}[aria-label][data-balloon-pos]:after{background:var(--balloon-color);border-radius:2px;border-radius:var(--balloon-border-radius);color:var(--balloon-text-color);content:attr(aria-label);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:var(--balloon-font-size);font-style:normal;font-weight:400;padding:.5em 1em;text-indent:0;text-shadow:none;white-space:nowrap}[aria-label][data-balloon-pos]:after,[aria-label][data-balloon-pos]:before{opacity:0;pointer-events:none;position:absolute;transition:all .18s ease-out .18s;z-index:10}[aria-label][data-balloon-pos]:before{border:5px solid #0000;border-top:5px solid var(--balloon-color);content:\\\"\\\";height:0;width:0}[aria-label][data-balloon-pos]:hover:after,[aria-label][data-balloon-pos]:hover:before,[aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:after,[aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:before,[aria-label][data-balloon-pos][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-visible]:before{opacity:1;pointer-events:none}[aria-label][data-balloon-pos].font-awesome:after{font-family:FontAwesome,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif}[aria-label][data-balloon-pos][data-balloon-break]:after{white-space:pre}[aria-label][data-balloon-pos][data-balloon-break][data-balloon-length]:after{white-space:pre-line;word-break:break-word}[aria-label][data-balloon-pos][data-balloon-blunt]:after,[aria-label][data-balloon-pos][data-balloon-blunt]:before{transition:none}[aria-label][data-balloon-pos][data-balloon-pos=down]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=down]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=down][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=down][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=up][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=up][data-balloon-visible]:before{transform:translate(-50%)}[aria-label][data-balloon-pos][data-balloon-pos*=-left]:after{left:0}[aria-label][data-balloon-pos][data-balloon-pos*=-left]:before{left:5px}[aria-label][data-balloon-pos][data-balloon-pos*=-right]:after{right:0}[aria-label][data-balloon-pos][data-balloon-pos*=-right]:before{right:5px}[aria-label][data-balloon-pos][data-balloon-po*=-left]:hover:after,[aria-label][data-balloon-pos][data-balloon-po*=-left]:hover:before,[aria-label][data-balloon-pos][data-balloon-po*=-left][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-po*=-left][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos*=-right]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos*=-right]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos*=-right][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos*=-right][data-balloon-visible]:before{transform:translate(0)}[aria-label][data-balloon-pos][data-balloon-pos^=up]:after,[aria-label][data-balloon-pos][data-balloon-pos^=up]:before{bottom:100%;transform:translateY(var(--balloon-move));transform-origin:top}[aria-label][data-balloon-pos][data-balloon-pos^=up]:after{margin-bottom:10px}[aria-label][data-balloon-pos][data-balloon-pos=up]:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:before{left:50%;transform:translate(-50%,var(--balloon-move))}[aria-label][data-balloon-pos][data-balloon-pos^=down]:after,[aria-label][data-balloon-pos][data-balloon-pos^=down]:before{top:100%;transform:translateY(calc(var(--balloon-move)*-1))}[aria-label][data-balloon-pos][data-balloon-pos^=down]:after{margin-top:10px}[aria-label][data-balloon-pos][data-balloon-pos^=down]:before{border:5px solid #0000;border-bottom:5px solid var(--balloon-color);height:0;width:0}[aria-label][data-balloon-pos][data-balloon-pos=down]:after,[aria-label][data-balloon-pos][data-balloon-pos=down]:before{left:50%;transform:translate(-50%,calc(var(--balloon-move)*-1))}[aria-label][data-balloon-pos][data-balloon-pos=left]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=left]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=left][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=left][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos=right]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=right]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=right][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=right][data-balloon-visible]:before{transform:translateY(-50%)}[aria-label][data-balloon-pos][data-balloon-pos=left]:after,[aria-label][data-balloon-pos][data-balloon-pos=left]:before{right:100%;top:50%;transform:translate(var(--balloon-move),-50%)}[aria-label][data-balloon-pos][data-balloon-pos=left]:after{margin-right:10px}[aria-label][data-balloon-pos][data-balloon-pos=left]:before{border:5px solid #0000;border-left:5px solid var(--balloon-color);height:0;width:0}[aria-label][data-balloon-pos][data-balloon-pos=right]:after,[aria-label][data-balloon-pos][data-balloon-pos=right]:before{left:100%;top:50%;transform:translate(calc(var(--balloon-move)*-1),-50%)}[aria-label][data-balloon-pos][data-balloon-pos=right]:after{margin-left:10px}[aria-label][data-balloon-pos][data-balloon-pos=right]:before{border:5px solid #0000;border-right:5px solid var(--balloon-color);height:0;width:0}[aria-label][data-balloon-pos][data-balloon-length]:after{white-space:normal}[aria-label][data-balloon-pos][data-balloon-length=small]:after{width:80px}[aria-label][data-balloon-pos][data-balloon-length=medium]:after{width:150px}[aria-label][data-balloon-pos][data-balloon-length=large]:after{width:260px}[aria-label][data-balloon-pos][data-balloon-length=xlarge]:after{width:380px}@media screen and (max-width:768px){[aria-label][data-balloon-pos][data-balloon-length=xlarge]:after{width:90vw}}[aria-label][data-balloon-pos][data-balloon-length=fit]:after{width:100%}`, \\\"\\\",{\\\"version\\\":3,\\\"sources\\\":[\\\"webpack://./node_modules/balloon-css/balloon.css\\\"],\\\"names\\\":[],\\\"mappings\\\":\\\"AAAA,MACE,2BAA4B,CAC5B,yBAAuC,CACvC,yBAA0B,CAC1B,wBAAyB,CACzB,kBAAqB,CAEvB,qCACE,gBAAmB,CAErB,+BAEE,cAAe,CADf,iBACiB,CACjB,qCAUE,+BAAgC,CAChC,iBAAkB,CAElB,0CAA2C,CAD3C,+BAAgC,CAEhC,wBAAyB,CATzB,wHAAwI,CAIxI,kCAAmC,CAFnC,iBAAkB,CADlB,eAAmB,CASnB,gBAAiB,CAXjB,aAAc,CAId,gBAAiB,CASjB,kBACa,CACf,2EAlBE,SAAU,CACV,mBAAoB,CAcpB,iBAAkB,CAblB,iCAAoC,CAepC,UAWa,CAVf,sCAIE,sBAAsC,CAAtC,yCAAsC,CAItC,UAAW,CANX,QAAS,CADT,OASa,CACf,6VACE,SAAU,CACV,mBAAsB,CACxB,kDACE,oIAAuJ,CACzJ,yDACE,eAAkB,CACpB,8EACE,oBAAqB,CACrB,qBAAwB,CAC1B,mHACE,eAAkB,CAGpB,4kBACE,yBAA+B,CACjC,8DACE,MAAS,CACX,+DACE,QAAW,CACb,+DACE,OAAU,CACZ,gEACE,SAAY,CAGd,omBACE,sBAA4B,CAC9B,uHACE,WAAY,CAEZ,yCAA4C,CAD5C,oBAC8C,CAChD,2DACE,kBAAqB,CACvB,qHACE,QAAS,CACT,6CAAiD,CACnD,2HACE,QAAS,CACT,kDAAyD,CAC3D,6DACE,eAAkB,CACpB,8DAIE,sBAAyC,CAAzC,4CAAyC,CAFzC,QAAS,CADT,OAG2C,CAC7C,yHACE,QAAS,CACT,sDAA4D,CAG9D,wlBACE,0BAA+B,CACjC,yHACE,UAAW,CACX,OAAQ,CACR,6CAAiD,CACnD,4DACE,iBAAoB,CACtB,6DAIE,sBAAuC,CAAvC,0CAAuC,CAFvC,QAAS,CADT,OAGyC,CAC3C,2HACE,SAAU,CACV,OAAQ,CACR,sDAA4D,CAC9D,6DACE,gBAAmB,CACrB,8DAIE,sBAAwC,CAAxC,2CAAwC,CAFxC,QAAS,CADT,OAG0C,CAC5C,0DACE,kBAAqB,CACvB,gEACE,UAAa,CACf,iEACE,WAAc,CAChB,gEACE,WAAc,CAChB,iEACE,WAAc,CACd,oCACE,iEACE,UAAa,CAAE,CACrB,8DACE,UAAa\\\",\\\"sourcesContent\\\":[\\\":root {\\\\n  --balloon-border-radius: 2px;\\\\n  --balloon-color: rgba(16, 16, 16, 0.95);\\\\n  --balloon-text-color: #fff;\\\\n  --balloon-font-size: 12px;\\\\n  --balloon-move: 4px; }\\\\n\\\\nbutton[aria-label][data-balloon-pos] {\\\\n  overflow: visible; }\\\\n\\\\n[aria-label][data-balloon-pos] {\\\\n  position: relative;\\\\n  cursor: pointer; }\\\\n  [aria-label][data-balloon-pos]:after {\\\\n    opacity: 0;\\\\n    pointer-events: none;\\\\n    transition: all 0.18s ease-out 0.18s;\\\\n    text-indent: 0;\\\\n    font-family: -apple-system, BlinkMacSystemFont, \\\\\\\"Segoe UI\\\\\\\", Roboto, Oxygen, Ubuntu, Cantarell, \\\\\\\"Open Sans\\\\\\\", \\\\\\\"Helvetica Neue\\\\\\\", sans-serif;\\\\n    font-weight: normal;\\\\n    font-style: normal;\\\\n    text-shadow: none;\\\\n    font-size: var(--balloon-font-size);\\\\n    background: var(--balloon-color);\\\\n    border-radius: 2px;\\\\n    color: var(--balloon-text-color);\\\\n    border-radius: var(--balloon-border-radius);\\\\n    content: attr(aria-label);\\\\n    padding: .5em 1em;\\\\n    position: absolute;\\\\n    white-space: nowrap;\\\\n    z-index: 10; }\\\\n  [aria-label][data-balloon-pos]:before {\\\\n    width: 0;\\\\n    height: 0;\\\\n    border: 5px solid transparent;\\\\n    border-top-color: var(--balloon-color);\\\\n    opacity: 0;\\\\n    pointer-events: none;\\\\n    transition: all 0.18s ease-out 0.18s;\\\\n    content: \\\\\\\"\\\\\\\";\\\\n    position: absolute;\\\\n    z-index: 10; }\\\\n  [aria-label][data-balloon-pos]:hover:before, [aria-label][data-balloon-pos]:hover:after, [aria-label][data-balloon-pos][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-visible]:after, [aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:before, [aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:after {\\\\n    opacity: 1;\\\\n    pointer-events: none; }\\\\n  [aria-label][data-balloon-pos].font-awesome:after {\\\\n    font-family: FontAwesome, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; }\\\\n  [aria-label][data-balloon-pos][data-balloon-break]:after {\\\\n    white-space: pre; }\\\\n  [aria-label][data-balloon-pos][data-balloon-break][data-balloon-length]:after {\\\\n    white-space: pre-line;\\\\n    word-break: break-word; }\\\\n  [aria-label][data-balloon-pos][data-balloon-blunt]:before, [aria-label][data-balloon-pos][data-balloon-blunt]:after {\\\\n    transition: none; }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"up\\\\\\\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"up\\\\\\\"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"down\\\\\\\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"down\\\\\\\"][data-balloon-visible]:after {\\\\n    transform: translate(-50%, 0); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"up\\\\\\\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"up\\\\\\\"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"down\\\\\\\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"down\\\\\\\"][data-balloon-visible]:before {\\\\n    transform: translate(-50%, 0); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos*=\\\\\\\"-left\\\\\\\"]:after {\\\\n    left: 0; }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos*=\\\\\\\"-left\\\\\\\"]:before {\\\\n    left: 5px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos*=\\\\\\\"-right\\\\\\\"]:after {\\\\n    right: 0; }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos*=\\\\\\\"-right\\\\\\\"]:before {\\\\n    right: 5px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-po*=\\\\\\\"-left\\\\\\\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-po*=\\\\\\\"-left\\\\\\\"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos*=\\\\\\\"-right\\\\\\\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos*=\\\\\\\"-right\\\\\\\"][data-balloon-visible]:after {\\\\n    transform: translate(0, 0); }\\\\n  [aria-label][data-balloon-pos][data-balloon-po*=\\\\\\\"-left\\\\\\\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-po*=\\\\\\\"-left\\\\\\\"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos*=\\\\\\\"-right\\\\\\\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos*=\\\\\\\"-right\\\\\\\"][data-balloon-visible]:before {\\\\n    transform: translate(0, 0); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\\\\\\\"up\\\\\\\"]:before, [aria-label][data-balloon-pos][data-balloon-pos^=\\\\\\\"up\\\\\\\"]:after {\\\\n    bottom: 100%;\\\\n    transform-origin: top;\\\\n    transform: translate(0, var(--balloon-move)); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\\\\\\\"up\\\\\\\"]:after {\\\\n    margin-bottom: 10px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"up\\\\\\\"]:before, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"up\\\\\\\"]:after {\\\\n    left: 50%;\\\\n    transform: translate(-50%, var(--balloon-move)); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\\\\\\\"down\\\\\\\"]:before, [aria-label][data-balloon-pos][data-balloon-pos^=\\\\\\\"down\\\\\\\"]:after {\\\\n    top: 100%;\\\\n    transform: translate(0, calc(var(--balloon-move) * -1)); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\\\\\\\"down\\\\\\\"]:after {\\\\n    margin-top: 10px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos^=\\\\\\\"down\\\\\\\"]:before {\\\\n    width: 0;\\\\n    height: 0;\\\\n    border: 5px solid transparent;\\\\n    border-bottom-color: var(--balloon-color); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"down\\\\\\\"]:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"down\\\\\\\"]:before {\\\\n    left: 50%;\\\\n    transform: translate(-50%, calc(var(--balloon-move) * -1)); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"left\\\\\\\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"left\\\\\\\"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"right\\\\\\\"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"right\\\\\\\"][data-balloon-visible]:after {\\\\n    transform: translate(0, -50%); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"left\\\\\\\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"left\\\\\\\"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"right\\\\\\\"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"right\\\\\\\"][data-balloon-visible]:before {\\\\n    transform: translate(0, -50%); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"left\\\\\\\"]:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"left\\\\\\\"]:before {\\\\n    right: 100%;\\\\n    top: 50%;\\\\n    transform: translate(var(--balloon-move), -50%); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"left\\\\\\\"]:after {\\\\n    margin-right: 10px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"left\\\\\\\"]:before {\\\\n    width: 0;\\\\n    height: 0;\\\\n    border: 5px solid transparent;\\\\n    border-left-color: var(--balloon-color); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"right\\\\\\\"]:after, [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"right\\\\\\\"]:before {\\\\n    left: 100%;\\\\n    top: 50%;\\\\n    transform: translate(calc(var(--balloon-move) * -1), -50%); }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"right\\\\\\\"]:after {\\\\n    margin-left: 10px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-pos=\\\\\\\"right\\\\\\\"]:before {\\\\n    width: 0;\\\\n    height: 0;\\\\n    border: 5px solid transparent;\\\\n    border-right-color: var(--balloon-color); }\\\\n  [aria-label][data-balloon-pos][data-balloon-length]:after {\\\\n    white-space: normal; }\\\\n  [aria-label][data-balloon-pos][data-balloon-length=\\\\\\\"small\\\\\\\"]:after {\\\\n    width: 80px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-length=\\\\\\\"medium\\\\\\\"]:after {\\\\n    width: 150px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-length=\\\\\\\"large\\\\\\\"]:after {\\\\n    width: 260px; }\\\\n  [aria-label][data-balloon-pos][data-balloon-length=\\\\\\\"xlarge\\\\\\\"]:after {\\\\n    width: 380px; }\\\\n    @media screen and (max-width: 768px) {\\\\n      [aria-label][data-balloon-pos][data-balloon-length=\\\\\\\"xlarge\\\\\\\"]:after {\\\\n        width: 90vw; } }\\\\n  [aria-label][data-balloon-pos][data-balloon-length=\\\\\\\"fit\\\\\\\"]:after {\\\\n    width: 100%; }\\\\n\\\"],\\\"sourceRoot\\\":\\\"\\\"}]);\\n// Exports\\nexport default ___CSS_LOADER_EXPORT___;\\n\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 28\\\\\\\"><path d=\\\\\\\"M28.633 17.104c0.035 0.21 0.026 0.463-0.026 0.76s-0.14 0.598-0.262 0.904c-0.122 0.306-0.271 0.581-0.445 0.825s-0.367 0.419-0.576 0.524c-0.209 0.105-0.393 0.157-0.55 0.157s-0.332-0.035-0.524-0.105c-0.175-0.052-0.393-0.1-0.655-0.144s-0.528-0.052-0.799-0.026c-0.271 0.026-0.541 0.083-0.812 0.17s-0.502 0.236-0.694 0.445c-0.419 0.437-0.664 0.934-0.734 1.493s0.009 1.092 0.236 1.598c0.175 0.349 0.148 0.699-0.079 1.048-0.105 0.14-0.271 0.284-0.498 0.432s-0.476 0.284-0.747 0.406-0.555 0.218-0.851 0.288c-0.297 0.070-0.559 0.105-0.786 0.105-0.157 0-0.306-0.061-0.445-0.183s-0.236-0.253-0.288-0.393h-0.026c-0.192-0.541-0.52-1.009-0.982-1.402s-1-0.589-1.611-0.589c-0.594 0-1.131 0.197-1.611 0.589s-0.816 0.851-1.009 1.375c-0.087 0.21-0.218 0.362-0.393 0.458s-0.367 0.144-0.576 0.144c-0.244 0-0.52-0.044-0.825-0.131s-0.611-0.197-0.917-0.327c-0.306-0.131-0.581-0.284-0.825-0.458s-0.428-0.349-0.55-0.524c-0.087-0.122-0.135-0.266-0.144-0.432s0.057-0.397 0.197-0.694c0.192-0.402 0.266-0.86 0.223-1.375s-0.266-0.991-0.668-1.428c-0.244-0.262-0.541-0.432-0.891-0.511s-0.681-0.109-0.995-0.092c-0.367 0.017-0.742 0.087-1.127 0.21-0.244 0.070-0.489 0.052-0.734-0.052-0.192-0.070-0.371-0.231-0.537-0.485s-0.314-0.533-0.445-0.838c-0.131-0.306-0.231-0.62-0.301-0.943s-0.087-0.59-0.052-0.799c0.052-0.384 0.227-0.629 0.524-0.734 0.524-0.21 0.995-0.555 1.415-1.035s0.629-1.017 0.629-1.611c0-0.611-0.21-1.144-0.629-1.598s-0.891-0.786-1.415-0.996c-0.157-0.052-0.288-0.179-0.393-0.38s-0.157-0.406-0.157-0.616c0-0.227 0.035-0.48 0.105-0.76s0.162-0.55 0.275-0.812 0.244-0.502 0.393-0.72c0.148-0.218 0.31-0.38 0.485-0.485 0.14-0.087 0.275-0.122 0.406-0.105s0.275 0.052 0.432 0.105c0.524 0.21 1.070 0.275 1.637 0.197s1.070-0.327 1.506-0.747c0.21-0.209 0.362-0.467 0.458-0.773s0.157-0.607 0.183-0.904c0.026-0.297 0.026-0.568 0-0.812s-0.048-0.419-0.065-0.524c-0.035-0.105-0.066-0.227-0.092-0.367s-0.013-0.262 0.039-0.367c0.105-0.244 0.293-0.458 0.563-0.642s0.563-0.336 0.878-0.458c0.314-0.122 0.62-0.214 0.917-0.275s0.533-0.092 0.707-0.092c0.227 0 0.406 0.074 0.537 0.223s0.223 0.301 0.275 0.458c0.192 0.471 0.507 0.886 0.943 1.244s0.952 0.537 1.546 0.537c0.611 0 1.153-0.17 1.624-0.511s0.803-0.773 0.996-1.297c0.070-0.14 0.179-0.284 0.327-0.432s0.301-0.223 0.458-0.223c0.244 0 0.511 0.035 0.799 0.105s0.572 0.166 0.851 0.288c0.279 0.122 0.537 0.279 0.773 0.472s0.423 0.402 0.563 0.629c0.087 0.14 0.113 0.293 0.079 0.458s-0.070 0.284-0.105 0.354c-0.227 0.506-0.297 1.039-0.21 1.598s0.341 1.048 0.76 1.467c0.419 0.419 0.934 0.651 1.546 0.694s1.179-0.057 1.703-0.301c0.14-0.087 0.31-0.122 0.511-0.105s0.371 0.096 0.511 0.236c0.262 0.244 0.493 0.616 0.694 1.113s0.336 1 0.406 1.506c0.035 0.297-0.013 0.528-0.144 0.694s-0.266 0.275-0.406 0.327c-0.542 0.192-1.004 0.528-1.388 1.009s-0.576 1.026-0.576 1.637c0 0.594 0.162 1.113 0.485 1.559s0.747 0.764 1.27 0.956c0.122 0.070 0.227 0.14 0.314 0.21 0.192 0.157 0.323 0.358 0.393 0.602v0zM16.451 19.462c0.786 0 1.528-0.149 2.227-0.445s1.305-0.707 1.821-1.231c0.515-0.524 0.921-1.131 1.218-1.821s0.445-1.428 0.445-2.214c0-0.786-0.148-1.524-0.445-2.214s-0.703-1.292-1.218-1.808c-0.515-0.515-1.122-0.921-1.821-1.218s-1.441-0.445-2.227-0.445c-0.786 0-1.524 0.148-2.214 0.445s-1.292 0.703-1.808 1.218c-0.515 0.515-0.921 1.118-1.218 1.808s-0.445 1.428-0.445 2.214c0 0.786 0.149 1.524 0.445 2.214s0.703 1.297 1.218 1.821c0.515 0.524 1.118 0.934 1.808 1.231s1.428 0.445 2.214 0.445v0z\\\\\\\"></path></svg>\\\"\",\"module.exports = \\\"<svg xmlns=\\\\\\\"http://www.w3.org/2000/svg\\\\\\\" version=\\\\\\\"1.1\\\\\\\" viewBox=\\\\\\\"0 0 32 33\\\\\\\"><path d=\\\\\\\"M24.965 24.38h-18.132c-1.366 0-2.478-1.113-2.478-2.478v-11.806c0-1.364 1.111-2.478 2.478-2.478h18.132c1.366 0 2.478 1.113 2.478 2.478v11.806c0 1.364-1.11 2.478-2.478 2.478zM6.833 10.097v11.806h18.134l-0.002-11.806h-18.132zM2.478 28.928h5.952c0.684 0 1.238-0.554 1.238-1.239 0-0.684-0.554-1.238-1.238-1.238h-5.952v-5.802c0-0.684-0.554-1.239-1.238-1.239s-1.239 0.556-1.239 1.239v5.802c0 1.365 1.111 2.478 2.478 2.478zM30.761 19.412c-0.684 0-1.238 0.554-1.238 1.238v5.801h-5.951c-0.686 0-1.239 0.554-1.239 1.238 0 0.686 0.554 1.239 1.239 1.239h5.951c1.366 0 2.478-1.111 2.478-2.478v-5.801c0-0.683-0.554-1.238-1.239-1.238zM0 5.55v5.802c0 0.683 0.554 1.238 1.238 1.238s1.238-0.555 1.238-1.238v-5.802h5.952c0.684 0 1.238-0.554 1.238-1.238s-0.554-1.238-1.238-1.238h-5.951c-1.366-0.001-2.478 1.111-2.478 2.476zM32 11.35v-5.801c0-1.365-1.11-2.478-2.478-2.478h-5.951c-0.686 0-1.239 0.554-1.239 1.238s0.554 1.238 1.239 1.238h5.951v5.801c0 0.683 0.554 1.237 1.238 1.237 0.686 0.002 1.239-0.553 1.239-1.236z\\\\\\\"></path></svg>\\\"\",\"// The module cache\\nvar __webpack_module_cache__ = {};\\n\\n// The require function\\nfunction __webpack_require__(moduleId) {\\n\\t// Check if module is in cache\\n\\tvar cachedModule = __webpack_module_cache__[moduleId];\\n\\tif (cachedModule !== undefined) {\\n\\t\\treturn cachedModule.exports;\\n\\t}\\n\\t// Create a new module (and put it into the cache)\\n\\tvar module = __webpack_module_cache__[moduleId] = {\\n\\t\\tid: moduleId,\\n\\t\\t// no module.loaded needed\\n\\t\\texports: {}\\n\\t};\\n\\n\\t// Execute the module function\\n\\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\\n\\n\\t// Return the exports of the module\\n\\treturn module.exports;\\n}\\n\\n\",\"// getDefaultExport function for compatibility with non-harmony modules\\n__webpack_require__.n = (module) => {\\n\\tvar getter = module && module.__esModule ?\\n\\t\\t() => (module['default']) :\\n\\t\\t() => (module);\\n\\t__webpack_require__.d(getter, { a: getter });\\n\\treturn getter;\\n};\",\"// define getter functions for harmony exports\\n__webpack_require__.d = (exports, definition) => {\\n\\tfor(var key in definition) {\\n\\t\\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\\n\\t\\t\\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\\n\\t\\t}\\n\\t}\\n};\",\"__webpack_require__.g = (function() {\\n\\tif (typeof globalThis === 'object') return globalThis;\\n\\ttry {\\n\\t\\treturn this || new Function('return this')();\\n\\t} catch (e) {\\n\\t\\tif (typeof window === 'object') return window;\\n\\t}\\n})();\",\"__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\",\"// define __esModule on exports\\n__webpack_require__.r = (exports) => {\\n\\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\\n\\t\\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\\n\\t}\\n\\tObject.defineProperty(exports, '__esModule', { value: true });\\n};\",\"__webpack_require__.nc = undefined;\",\"\\n      import API from \\\"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\\\";\\n      import domAPI from \\\"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\\\";\\n      import insertFn from \\\"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\\\";\\n      import setAttributes from \\\"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\\\";\\n      import insertStyleElement from \\\"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\\\";\\n      import styleTagTransformFn from \\\"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\\\";\\n      import content, * as namedExport from \\\"!!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!../../node_modules/sass-loader/dist/cjs.js!./index.scss\\\";\\n      \\n      \\n\\nvar options = {};\\n\\noptions.styleTagTransform = styleTagTransformFn;\\noptions.setAttributes = setAttributes;\\n\\n      options.insert = insertFn.bind(null, \\\"head\\\");\\n    \\noptions.domAPI = domAPI;\\noptions.insertStyleElement = insertStyleElement;\\n\\nvar update = API(content, options);\\n\\n\\n\\nexport * from \\\"!!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!../../node_modules/sass-loader/dist/cjs.js!./index.scss\\\";\\n       export default content && content.locals ? content.locals : undefined;\\n\",\"import Template from './template';\\n\\nconst isMobile = /iPhone|iPad|iPod|Windows|Macintosh|Android|Mobile/i.test(navigator.userAgent) && 'ontouchend' in document;\\n\\nconst utils = {\\n    /**\\n     * Parse second to time string\\n     *\\n     * @param {Number} second\\n     * @return {String} 00:00 or 00:00:00\\n     */\\n    secondToTime: (second: number): string => {\\n        second = second || 0;\\n        if (second === 0 || second === Infinity || second.toString() === 'NaN') {\\n            return '00:00';\\n        }\\n        const add0 = (num: number): string => num < 10 ? '0' + num : '' + num;\\n        const hour = Math.floor(second / 3600);\\n        const min = Math.floor((second - hour * 3600) / 60);\\n        const sec = Math.floor(second - hour * 3600 - min * 60);\\n        return (hour > 0 ? [hour, min, sec] : [min, sec]).map(add0).join(':');\\n    },\\n\\n    /**\\n     * get video duration\\n     * compatibility: measures against video length becoming Infinity during HLS playback on native HLS player of Safari\\n     *\\n     * @param {HTMLVideoElement} video\\n     * @param {Template} template\\n     * @returns {Number}\\n     */\\n    getVideoDuration: (video: HTMLVideoElement, template: Template): number => {\\n        let duration = video.duration;\\n        if (duration === Infinity) {\\n            if (video.seekable.length > 0) {\\n                template.dtime.textContent = utils.secondToTime(video.seekable.end(0));\\n                duration = video.seekable.end(0);\\n            } else if (video.buffered.length > 0) {\\n                template.dtime.textContent = utils.secondToTime(video.buffered.end(0));\\n                duration = video.buffered.end(0);\\n            }\\n        }\\n        return duration;\\n    },\\n\\n    /**\\n     * Get the X coordinate of the pointer relative to a container element.\\n     * @param event - PointerEvent or TouchEvent.\\n     * @param container - The container to calculate relative coordinate for.\\n     * @returns The relative X coordinate in pixels.\\n     */\\n    getRelativeX: (event: PointerEvent | TouchEvent | MouseEvent, container: HTMLElement): number => {\\n        const rect = container.getBoundingClientRect();\\n        let clientX: number;\\n        if ('touches' in event) {\\n            // If TouchEvent, use changedTouches if touches is empty\\n            if (event.touches.length > 0) {\\n                clientX = event.touches[0].clientX;\\n            } else if (event.changedTouches && event.changedTouches.length > 0) {\\n                clientX = event.changedTouches[0].clientX;\\n            } else {\\n                // If both are not available, return 0 (should not happen normally)\\n                clientX = 0;\\n            }\\n        } else {\\n            clientX = event.clientX;\\n        }\\n        return clientX - rect.left;\\n    },\\n\\n    getScrollPosition(): { left: number; top: number } {\\n        return {\\n            left: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0,\\n            top: window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0,\\n        };\\n    },\\n\\n    setScrollPosition({ left = 0, top = 0 }: { left: number; top: number; }): void {\\n        if (this.isFirefox) {\\n            document.documentElement.scrollLeft = left;\\n            document.documentElement.scrollTop = top;\\n        } else {\\n            window.scrollTo(left, top);\\n        }\\n    },\\n\\n    isMobile: isMobile,\\n\\n    isFirefox: /firefox/i.test(window.navigator.userAgent),\\n\\n    // ref: https://rnwest.engineer/detect-webkit/\\n    isWebKit: (/AppleWebKit/.test(window.navigator.userAgent) && !/Chrome/.test(window.navigator.userAgent)) ||\\n        /\\\\b(iPad|iPhone|iPod)\\\\b/.test(window.navigator.userAgent),\\n\\n    storage: {\\n        set: (key: string, value: any): void => {\\n            localStorage.setItem(key, value);\\n        },\\n\\n        get: (key: string): string | null => localStorage.getItem(key),\\n    },\\n\\n    nameMap: {\\n        dragStart: isMobile ? 'touchstart' : 'mousedown',\\n        dragMove: isMobile ? 'touchmove' : 'mousemove',\\n        dragEnd: isMobile ? 'touchend' : 'mouseup',\\n    },\\n\\n    // currently not used\\n    color2Number: (color: string): number => {\\n        if (color[0] === '#') {\\n            color = color.substr(1);\\n        }\\n        if (color.length === 3) {\\n            color = `${color[0]}${color[0]}${color[1]}${color[1]}${color[2]}${color[2]}`;\\n        }\\n        return (parseInt(color, 16) + 0x000000) & 0xffffff;\\n    },\\n\\n    number2Color: (number: number): string => '#' + ('00000' + number.toString(16)).slice(-6),\\n\\n    number2Type: (number: number): string => {\\n        switch (number) {\\n            case 0:\\n                return 'right';\\n            case 1:\\n                return 'top';\\n            case 2:\\n                return 'bottom';\\n            default:\\n                return 'right';\\n        }\\n    },\\n};\\n\\nexport default utils;\\n\",\"'use strict';\\n\\nexport default function bind(fn, thisArg) {\\n  return function wrap() {\\n    return fn.apply(thisArg, arguments);\\n  };\\n}\\n\",\"'use strict';\\n\\nimport bind from './helpers/bind.js';\\n\\n// utils is a library of generic helper functions non-specific to axios\\n\\nconst {toString} = Object.prototype;\\nconst {getPrototypeOf} = Object;\\nconst {iterator, toStringTag} = Symbol;\\n\\nconst kindOf = (cache => thing => {\\n    const str = toString.call(thing);\\n    return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\\n})(Object.create(null));\\n\\nconst kindOfTest = (type) => {\\n  type = type.toLowerCase();\\n  return (thing) => kindOf(thing) === type\\n}\\n\\nconst typeOfTest = type => thing => typeof thing === type;\\n\\n/**\\n * Determine if a value is an Array\\n *\\n * @param {Object} val The value to test\\n *\\n * @returns {boolean} True if value is an Array, otherwise false\\n */\\nconst {isArray} = Array;\\n\\n/**\\n * Determine if a value is undefined\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if the value is undefined, otherwise false\\n */\\nconst isUndefined = typeOfTest('undefined');\\n\\n/**\\n * Determine if a value is a Buffer\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a Buffer, otherwise false\\n */\\nfunction isBuffer(val) {\\n  return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\\n    && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\\n}\\n\\n/**\\n * Determine if a value is an ArrayBuffer\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\\n */\\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\\n\\n\\n/**\\n * Determine if a value is a view on an ArrayBuffer\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\\n */\\nfunction isArrayBufferView(val) {\\n  let result;\\n  if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\\n    result = ArrayBuffer.isView(val);\\n  } else {\\n    result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\\n  }\\n  return result;\\n}\\n\\n/**\\n * Determine if a value is a String\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a String, otherwise false\\n */\\nconst isString = typeOfTest('string');\\n\\n/**\\n * Determine if a value is a Function\\n *\\n * @param {*} val The value to test\\n * @returns {boolean} True if value is a Function, otherwise false\\n */\\nconst isFunction = typeOfTest('function');\\n\\n/**\\n * Determine if a value is a Number\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a Number, otherwise false\\n */\\nconst isNumber = typeOfTest('number');\\n\\n/**\\n * Determine if a value is an Object\\n *\\n * @param {*} thing The value to test\\n *\\n * @returns {boolean} True if value is an Object, otherwise false\\n */\\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\\n\\n/**\\n * Determine if a value is a Boolean\\n *\\n * @param {*} thing The value to test\\n * @returns {boolean} True if value is a Boolean, otherwise false\\n */\\nconst isBoolean = thing => thing === true || thing === false;\\n\\n/**\\n * Determine if a value is a plain Object\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a plain Object, otherwise false\\n */\\nconst isPlainObject = (val) => {\\n  if (kindOf(val) !== 'object') {\\n    return false;\\n  }\\n\\n  const prototype = getPrototypeOf(val);\\n  return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);\\n}\\n\\n/**\\n * Determine if a value is an empty object (safely handles Buffers)\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is an empty object, otherwise false\\n */\\nconst isEmptyObject = (val) => {\\n  // Early return for non-objects or Buffers to prevent RangeError\\n  if (!isObject(val) || isBuffer(val)) {\\n    return false;\\n  }\\n\\n  try {\\n    return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;\\n  } catch (e) {\\n    // Fallback for any other objects that might cause RangeError with Object.keys()\\n    return false;\\n  }\\n}\\n\\n/**\\n * Determine if a value is a Date\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a Date, otherwise false\\n */\\nconst isDate = kindOfTest('Date');\\n\\n/**\\n * Determine if a value is a File\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a File, otherwise false\\n */\\nconst isFile = kindOfTest('File');\\n\\n/**\\n * Determine if a value is a Blob\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a Blob, otherwise false\\n */\\nconst isBlob = kindOfTest('Blob');\\n\\n/**\\n * Determine if a value is a FileList\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a File, otherwise false\\n */\\nconst isFileList = kindOfTest('FileList');\\n\\n/**\\n * Determine if a value is a Stream\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a Stream, otherwise false\\n */\\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\\n\\n/**\\n * Determine if a value is a FormData\\n *\\n * @param {*} thing The value to test\\n *\\n * @returns {boolean} True if value is an FormData, otherwise false\\n */\\nconst isFormData = (thing) => {\\n  let kind;\\n  return thing && (\\n    (typeof FormData === 'function' && thing instanceof FormData) || (\\n      isFunction(thing.append) && (\\n        (kind = kindOf(thing)) === 'formdata' ||\\n        // detect form-data instance\\n        (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\\n      )\\n    )\\n  )\\n}\\n\\n/**\\n * Determine if a value is a URLSearchParams object\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\\n */\\nconst isURLSearchParams = kindOfTest('URLSearchParams');\\n\\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\\n\\n/**\\n * Trim excess whitespace off the beginning and end of a string\\n *\\n * @param {String} str The String to trim\\n *\\n * @returns {String} The String freed of excess whitespace\\n */\\nconst trim = (str) => str.trim ?\\n  str.trim() : str.replace(/^[\\\\s\\\\uFEFF\\\\xA0]+|[\\\\s\\\\uFEFF\\\\xA0]+$/g, '');\\n\\n/**\\n * Iterate over an Array or an Object invoking a function for each item.\\n *\\n * If `obj` is an Array callback will be called passing\\n * the value, index, and complete array for each item.\\n *\\n * If 'obj' is an Object callback will be called passing\\n * the value, key, and complete object for each property.\\n *\\n * @param {Object|Array} obj The object to iterate\\n * @param {Function} fn The callback to invoke for each item\\n *\\n * @param {Boolean} [allOwnKeys = false]\\n * @returns {any}\\n */\\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\\n  // Don't bother if no value provided\\n  if (obj === null || typeof obj === 'undefined') {\\n    return;\\n  }\\n\\n  let i;\\n  let l;\\n\\n  // Force an array if not already something iterable\\n  if (typeof obj !== 'object') {\\n    /*eslint no-param-reassign:0*/\\n    obj = [obj];\\n  }\\n\\n  if (isArray(obj)) {\\n    // Iterate over array values\\n    for (i = 0, l = obj.length; i < l; i++) {\\n      fn.call(null, obj[i], i, obj);\\n    }\\n  } else {\\n    // Buffer check\\n    if (isBuffer(obj)) {\\n      return;\\n    }\\n\\n    // Iterate over object keys\\n    const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\\n    const len = keys.length;\\n    let key;\\n\\n    for (i = 0; i < len; i++) {\\n      key = keys[i];\\n      fn.call(null, obj[key], key, obj);\\n    }\\n  }\\n}\\n\\nfunction findKey(obj, key) {\\n  if (isBuffer(obj)){\\n    return null;\\n  }\\n\\n  key = key.toLowerCase();\\n  const keys = Object.keys(obj);\\n  let i = keys.length;\\n  let _key;\\n  while (i-- > 0) {\\n    _key = keys[i];\\n    if (key === _key.toLowerCase()) {\\n      return _key;\\n    }\\n  }\\n  return null;\\n}\\n\\nconst _global = (() => {\\n  /*eslint no-undef:0*/\\n  if (typeof globalThis !== \\\"undefined\\\") return globalThis;\\n  return typeof self !== \\\"undefined\\\" ? self : (typeof window !== 'undefined' ? window : global)\\n})();\\n\\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\\n\\n/**\\n * Accepts varargs expecting each argument to be an object, then\\n * immutably merges the properties of each object and returns result.\\n *\\n * When multiple objects contain the same key the later object in\\n * the arguments list will take precedence.\\n *\\n * Example:\\n *\\n * ```js\\n * var result = merge({foo: 123}, {foo: 456});\\n * console.log(result.foo); // outputs 456\\n * ```\\n *\\n * @param {Object} obj1 Object to merge\\n *\\n * @returns {Object} Result of all merge properties\\n */\\nfunction merge(/* obj1, obj2, obj3, ... */) {\\n  const {caseless, skipUndefined} = isContextDefined(this) && this || {};\\n  const result = {};\\n  const assignValue = (val, key) => {\\n    const targetKey = caseless && findKey(result, key) || key;\\n    if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\\n      result[targetKey] = merge(result[targetKey], val);\\n    } else if (isPlainObject(val)) {\\n      result[targetKey] = merge({}, val);\\n    } else if (isArray(val)) {\\n      result[targetKey] = val.slice();\\n    } else if (!skipUndefined || !isUndefined(val)) {\\n      result[targetKey] = val;\\n    }\\n  }\\n\\n  for (let i = 0, l = arguments.length; i < l; i++) {\\n    arguments[i] && forEach(arguments[i], assignValue);\\n  }\\n  return result;\\n}\\n\\n/**\\n * Extends object a by mutably adding to it the properties of object b.\\n *\\n * @param {Object} a The object to be extended\\n * @param {Object} b The object to copy properties from\\n * @param {Object} thisArg The object to bind function to\\n *\\n * @param {Boolean} [allOwnKeys]\\n * @returns {Object} The resulting value of object a\\n */\\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\\n  forEach(b, (val, key) => {\\n    if (thisArg && isFunction(val)) {\\n      a[key] = bind(val, thisArg);\\n    } else {\\n      a[key] = val;\\n    }\\n  }, {allOwnKeys});\\n  return a;\\n}\\n\\n/**\\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\\n *\\n * @param {string} content with BOM\\n *\\n * @returns {string} content value without BOM\\n */\\nconst stripBOM = (content) => {\\n  if (content.charCodeAt(0) === 0xFEFF) {\\n    content = content.slice(1);\\n  }\\n  return content;\\n}\\n\\n/**\\n * Inherit the prototype methods from one constructor into another\\n * @param {function} constructor\\n * @param {function} superConstructor\\n * @param {object} [props]\\n * @param {object} [descriptors]\\n *\\n * @returns {void}\\n */\\nconst inherits = (constructor, superConstructor, props, descriptors) => {\\n  constructor.prototype = Object.create(superConstructor.prototype, descriptors);\\n  constructor.prototype.constructor = constructor;\\n  Object.defineProperty(constructor, 'super', {\\n    value: superConstructor.prototype\\n  });\\n  props && Object.assign(constructor.prototype, props);\\n}\\n\\n/**\\n * Resolve object with deep prototype chain to a flat object\\n * @param {Object} sourceObj source object\\n * @param {Object} [destObj]\\n * @param {Function|Boolean} [filter]\\n * @param {Function} [propFilter]\\n *\\n * @returns {Object}\\n */\\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\\n  let props;\\n  let i;\\n  let prop;\\n  const merged = {};\\n\\n  destObj = destObj || {};\\n  // eslint-disable-next-line no-eq-null,eqeqeq\\n  if (sourceObj == null) return destObj;\\n\\n  do {\\n    props = Object.getOwnPropertyNames(sourceObj);\\n    i = props.length;\\n    while (i-- > 0) {\\n      prop = props[i];\\n      if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\\n        destObj[prop] = sourceObj[prop];\\n        merged[prop] = true;\\n      }\\n    }\\n    sourceObj = filter !== false && getPrototypeOf(sourceObj);\\n  } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\\n\\n  return destObj;\\n}\\n\\n/**\\n * Determines whether a string ends with the characters of a specified string\\n *\\n * @param {String} str\\n * @param {String} searchString\\n * @param {Number} [position= 0]\\n *\\n * @returns {boolean}\\n */\\nconst endsWith = (str, searchString, position) => {\\n  str = String(str);\\n  if (position === undefined || position > str.length) {\\n    position = str.length;\\n  }\\n  position -= searchString.length;\\n  const lastIndex = str.indexOf(searchString, position);\\n  return lastIndex !== -1 && lastIndex === position;\\n}\\n\\n\\n/**\\n * Returns new array from array like object or null if failed\\n *\\n * @param {*} [thing]\\n *\\n * @returns {?Array}\\n */\\nconst toArray = (thing) => {\\n  if (!thing) return null;\\n  if (isArray(thing)) return thing;\\n  let i = thing.length;\\n  if (!isNumber(i)) return null;\\n  const arr = new Array(i);\\n  while (i-- > 0) {\\n    arr[i] = thing[i];\\n  }\\n  return arr;\\n}\\n\\n/**\\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\\n * thing passed in is an instance of Uint8Array\\n *\\n * @param {TypedArray}\\n *\\n * @returns {Array}\\n */\\n// eslint-disable-next-line func-names\\nconst isTypedArray = (TypedArray => {\\n  // eslint-disable-next-line func-names\\n  return thing => {\\n    return TypedArray && thing instanceof TypedArray;\\n  };\\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\\n\\n/**\\n * For each entry in the object, call the function with the key and value.\\n *\\n * @param {Object<any, any>} obj - The object to iterate over.\\n * @param {Function} fn - The function to call for each entry.\\n *\\n * @returns {void}\\n */\\nconst forEachEntry = (obj, fn) => {\\n  const generator = obj && obj[iterator];\\n\\n  const _iterator = generator.call(obj);\\n\\n  let result;\\n\\n  while ((result = _iterator.next()) && !result.done) {\\n    const pair = result.value;\\n    fn.call(obj, pair[0], pair[1]);\\n  }\\n}\\n\\n/**\\n * It takes a regular expression and a string, and returns an array of all the matches\\n *\\n * @param {string} regExp - The regular expression to match against.\\n * @param {string} str - The string to search.\\n *\\n * @returns {Array<boolean>}\\n */\\nconst matchAll = (regExp, str) => {\\n  let matches;\\n  const arr = [];\\n\\n  while ((matches = regExp.exec(str)) !== null) {\\n    arr.push(matches);\\n  }\\n\\n  return arr;\\n}\\n\\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\\nconst isHTMLForm = kindOfTest('HTMLFormElement');\\n\\nconst toCamelCase = str => {\\n  return str.toLowerCase().replace(/[-_\\\\s]([a-z\\\\d])(\\\\w*)/g,\\n    function replacer(m, p1, p2) {\\n      return p1.toUpperCase() + p2;\\n    }\\n  );\\n};\\n\\n/* Creating a function that will check if an object has a property. */\\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\\n\\n/**\\n * Determine if a value is a RegExp object\\n *\\n * @param {*} val The value to test\\n *\\n * @returns {boolean} True if value is a RegExp object, otherwise false\\n */\\nconst isRegExp = kindOfTest('RegExp');\\n\\nconst reduceDescriptors = (obj, reducer) => {\\n  const descriptors = Object.getOwnPropertyDescriptors(obj);\\n  const reducedDescriptors = {};\\n\\n  forEach(descriptors, (descriptor, name) => {\\n    let ret;\\n    if ((ret = reducer(descriptor, name, obj)) !== false) {\\n      reducedDescriptors[name] = ret || descriptor;\\n    }\\n  });\\n\\n  Object.defineProperties(obj, reducedDescriptors);\\n}\\n\\n/**\\n * Makes all methods read-only\\n * @param {Object} obj\\n */\\n\\nconst freezeMethods = (obj) => {\\n  reduceDescriptors(obj, (descriptor, name) => {\\n    // skip restricted props in strict mode\\n    if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\\n      return false;\\n    }\\n\\n    const value = obj[name];\\n\\n    if (!isFunction(value)) return;\\n\\n    descriptor.enumerable = false;\\n\\n    if ('writable' in descriptor) {\\n      descriptor.writable = false;\\n      return;\\n    }\\n\\n    if (!descriptor.set) {\\n      descriptor.set = () => {\\n        throw Error('Can not rewrite read-only method \\\\'' + name + '\\\\'');\\n      };\\n    }\\n  });\\n}\\n\\nconst toObjectSet = (arrayOrString, delimiter) => {\\n  const obj = {};\\n\\n  const define = (arr) => {\\n    arr.forEach(value => {\\n      obj[value] = true;\\n    });\\n  }\\n\\n  isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\\n\\n  return obj;\\n}\\n\\nconst noop = () => {}\\n\\nconst toFiniteNumber = (value, defaultValue) => {\\n  return value != null && Number.isFinite(value = +value) ? value : defaultValue;\\n}\\n\\n\\n\\n/**\\n * If the thing is a FormData object, return true, otherwise return false.\\n *\\n * @param {unknown} thing - The thing to check.\\n *\\n * @returns {boolean}\\n */\\nfunction isSpecCompliantForm(thing) {\\n  return !!(thing && isFunction(thing.append) && thing[toStringTag] === 'FormData' && thing[iterator]);\\n}\\n\\nconst toJSONObject = (obj) => {\\n  const stack = new Array(10);\\n\\n  const visit = (source, i) => {\\n\\n    if (isObject(source)) {\\n      if (stack.indexOf(source) >= 0) {\\n        return;\\n      }\\n\\n      //Buffer check\\n      if (isBuffer(source)) {\\n        return source;\\n      }\\n\\n      if(!('toJSON' in source)) {\\n        stack[i] = source;\\n        const target = isArray(source) ? [] : {};\\n\\n        forEach(source, (value, key) => {\\n          const reducedValue = visit(value, i + 1);\\n          !isUndefined(reducedValue) && (target[key] = reducedValue);\\n        });\\n\\n        stack[i] = undefined;\\n\\n        return target;\\n      }\\n    }\\n\\n    return source;\\n  }\\n\\n  return visit(obj, 0);\\n}\\n\\nconst isAsyncFn = kindOfTest('AsyncFunction');\\n\\nconst isThenable = (thing) =>\\n  thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\\n\\n// original code\\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\\n\\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\\n  if (setImmediateSupported) {\\n    return setImmediate;\\n  }\\n\\n  return postMessageSupported ? ((token, callbacks) => {\\n    _global.addEventListener(\\\"message\\\", ({source, data}) => {\\n      if (source === _global && data === token) {\\n        callbacks.length && callbacks.shift()();\\n      }\\n    }, false);\\n\\n    return (cb) => {\\n      callbacks.push(cb);\\n      _global.postMessage(token, \\\"*\\\");\\n    }\\n  })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\\n})(\\n  typeof setImmediate === 'function',\\n  isFunction(_global.postMessage)\\n);\\n\\nconst asap = typeof queueMicrotask !== 'undefined' ?\\n  queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\\n\\n// *********************\\n\\n\\nconst isIterable = (thing) => thing != null && isFunction(thing[iterator]);\\n\\n\\nexport default {\\n  isArray,\\n  isArrayBuffer,\\n  isBuffer,\\n  isFormData,\\n  isArrayBufferView,\\n  isString,\\n  isNumber,\\n  isBoolean,\\n  isObject,\\n  isPlainObject,\\n  isEmptyObject,\\n  isReadableStream,\\n  isRequest,\\n  isResponse,\\n  isHeaders,\\n  isUndefined,\\n  isDate,\\n  isFile,\\n  isBlob,\\n  isRegExp,\\n  isFunction,\\n  isStream,\\n  isURLSearchParams,\\n  isTypedArray,\\n  isFileList,\\n  forEach,\\n  merge,\\n  extend,\\n  trim,\\n  stripBOM,\\n  inherits,\\n  toFlatObject,\\n  kindOf,\\n  kindOfTest,\\n  endsWith,\\n  toArray,\\n  forEachEntry,\\n  matchAll,\\n  isHTMLForm,\\n  hasOwnProperty,\\n  hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\\n  reduceDescriptors,\\n  freezeMethods,\\n  toObjectSet,\\n  toCamelCase,\\n  noop,\\n  toFiniteNumber,\\n  findKey,\\n  global: _global,\\n  isContextDefined,\\n  isSpecCompliantForm,\\n  toJSONObject,\\n  isAsyncFn,\\n  isThenable,\\n  setImmediate: _setImmediate,\\n  asap,\\n  isIterable\\n};\\n\",\"'use strict';\\n\\nimport utils from '../utils.js';\\n\\n/**\\n * Create an Error with the specified message, config, error code, request and response.\\n *\\n * @param {string} message The error message.\\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\\n * @param {Object} [config] The config.\\n * @param {Object} [request] The request.\\n * @param {Object} [response] The response.\\n *\\n * @returns {Error} The created error.\\n */\\nfunction AxiosError(message, code, config, request, response) {\\n  Error.call(this);\\n\\n  if (Error.captureStackTrace) {\\n    Error.captureStackTrace(this, this.constructor);\\n  } else {\\n    this.stack = (new Error()).stack;\\n  }\\n\\n  this.message = message;\\n  this.name = 'AxiosError';\\n  code && (this.code = code);\\n  config && (this.config = config);\\n  request && (this.request = request);\\n  if (response) {\\n    this.response = response;\\n    this.status = response.status ? response.status : null;\\n  }\\n}\\n\\nutils.inherits(AxiosError, Error, {\\n  toJSON: function toJSON() {\\n    return {\\n      // Standard\\n      message: this.message,\\n      name: this.name,\\n      // Microsoft\\n      description: this.description,\\n      number: this.number,\\n      // Mozilla\\n      fileName: this.fileName,\\n      lineNumber: this.lineNumber,\\n      columnNumber: this.columnNumber,\\n      stack: this.stack,\\n      // Axios\\n      config: utils.toJSONObject(this.config),\\n      code: this.code,\\n      status: this.status\\n    };\\n  }\\n});\\n\\nconst prototype = AxiosError.prototype;\\nconst descriptors = {};\\n\\n[\\n  'ERR_BAD_OPTION_VALUE',\\n  'ERR_BAD_OPTION',\\n  'ECONNABORTED',\\n  'ETIMEDOUT',\\n  'ERR_NETWORK',\\n  'ERR_FR_TOO_MANY_REDIRECTS',\\n  'ERR_DEPRECATED',\\n  'ERR_BAD_RESPONSE',\\n  'ERR_BAD_REQUEST',\\n  'ERR_CANCELED',\\n  'ERR_NOT_SUPPORT',\\n  'ERR_INVALID_URL'\\n// eslint-disable-next-line func-names\\n].forEach(code => {\\n  descriptors[code] = {value: code};\\n});\\n\\nObject.defineProperties(AxiosError, descriptors);\\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\\n\\n// eslint-disable-next-line func-names\\nAxiosError.from = (error, code, config, request, response, customProps) => {\\n  const axiosError = Object.create(prototype);\\n\\n  utils.toFlatObject(error, axiosError, function filter(obj) {\\n    return obj !== Error.prototype;\\n  }, prop => {\\n    return prop !== 'isAxiosError';\\n  });\\n\\n  const msg = error && error.message ? error.message : 'Error';\\n\\n  // Prefer explicit code; otherwise copy the low-level error's code (e.g. ECONNREFUSED)\\n  const errCode = code == null && error ? error.code : code;\\n  AxiosError.call(axiosError, msg, errCode, config, request, response);\\n\\n  // Chain the original error on the standard field; non-enumerable to avoid JSON noise\\n  if (error && axiosError.cause == null) {\\n    Object.defineProperty(axiosError, 'cause', { value: error, configurable: true });\\n  }\\n\\n  axiosError.name = (error && error.name) || 'Error';\\n\\n  customProps && Object.assign(axiosError, customProps);\\n\\n  return axiosError;\\n};\\n\\nexport default AxiosError;\\n\",\"'use strict';\\n\\nimport utils from '../utils.js';\\nimport AxiosError from '../core/AxiosError.js';\\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\\nimport PlatformFormData from '../platform/node/classes/FormData.js';\\n\\n/**\\n * Determines if the given thing is a array or js object.\\n *\\n * @param {string} thing - The object or array to be visited.\\n *\\n * @returns {boolean}\\n */\\nfunction isVisitable(thing) {\\n  return utils.isPlainObject(thing) || utils.isArray(thing);\\n}\\n\\n/**\\n * It removes the brackets from the end of a string\\n *\\n * @param {string} key - The key of the parameter.\\n *\\n * @returns {string} the key without the brackets.\\n */\\nfunction removeBrackets(key) {\\n  return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\\n}\\n\\n/**\\n * It takes a path, a key, and a boolean, and returns a string\\n *\\n * @param {string} path - The path to the current key.\\n * @param {string} key - The key of the current object being iterated over.\\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\\n *\\n * @returns {string} The path to the current key.\\n */\\nfunction renderKey(path, key, dots) {\\n  if (!path) return key;\\n  return path.concat(key).map(function each(token, i) {\\n    // eslint-disable-next-line no-param-reassign\\n    token = removeBrackets(token);\\n    return !dots && i ? '[' + token + ']' : token;\\n  }).join(dots ? '.' : '');\\n}\\n\\n/**\\n * If the array is an array and none of its elements are visitable, then it's a flat array.\\n *\\n * @param {Array<any>} arr - The array to check\\n *\\n * @returns {boolean}\\n */\\nfunction isFlatArray(arr) {\\n  return utils.isArray(arr) && !arr.some(isVisitable);\\n}\\n\\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\\n  return /^is[A-Z]/.test(prop);\\n});\\n\\n/**\\n * Convert a data object to FormData\\n *\\n * @param {Object} obj\\n * @param {?Object} [formData]\\n * @param {?Object} [options]\\n * @param {Function} [options.visitor]\\n * @param {Boolean} [options.metaTokens = true]\\n * @param {Boolean} [options.dots = false]\\n * @param {?Boolean} [options.indexes = false]\\n *\\n * @returns {Object}\\n **/\\n\\n/**\\n * It converts an object into a FormData object\\n *\\n * @param {Object<any, any>} obj - The object to convert to form data.\\n * @param {string} formData - The FormData object to append to.\\n * @param {Object<string, any>} options\\n *\\n * @returns\\n */\\nfunction toFormData(obj, formData, options) {\\n  if (!utils.isObject(obj)) {\\n    throw new TypeError('target must be an object');\\n  }\\n\\n  // eslint-disable-next-line no-param-reassign\\n  formData = formData || new (PlatformFormData || FormData)();\\n\\n  // eslint-disable-next-line no-param-reassign\\n  options = utils.toFlatObject(options, {\\n    metaTokens: true,\\n    dots: false,\\n    indexes: false\\n  }, false, function defined(option, source) {\\n    // eslint-disable-next-line no-eq-null,eqeqeq\\n    return !utils.isUndefined(source[option]);\\n  });\\n\\n  const metaTokens = options.metaTokens;\\n  // eslint-disable-next-line no-use-before-define\\n  const visitor = options.visitor || defaultVisitor;\\n  const dots = options.dots;\\n  const indexes = options.indexes;\\n  const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\\n  const useBlob = _Blob && utils.isSpecCompliantForm(formData);\\n\\n  if (!utils.isFunction(visitor)) {\\n    throw new TypeError('visitor must be a function');\\n  }\\n\\n  function convertValue(value) {\\n    if (value === null) return '';\\n\\n    if (utils.isDate(value)) {\\n      return value.toISOString();\\n    }\\n\\n    if (utils.isBoolean(value)) {\\n      return value.toString();\\n    }\\n\\n    if (!useBlob && utils.isBlob(value)) {\\n      throw new AxiosError('Blob is not supported. Use a Buffer instead.');\\n    }\\n\\n    if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\\n      return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\\n    }\\n\\n    return value;\\n  }\\n\\n  /**\\n   * Default visitor.\\n   *\\n   * @param {*} value\\n   * @param {String|Number} key\\n   * @param {Array<String|Number>} path\\n   * @this {FormData}\\n   *\\n   * @returns {boolean} return true to visit the each prop of the value recursively\\n   */\\n  function defaultVisitor(value, key, path) {\\n    let arr = value;\\n\\n    if (value && !path && typeof value === 'object') {\\n      if (utils.endsWith(key, '{}')) {\\n        // eslint-disable-next-line no-param-reassign\\n        key = metaTokens ? key : key.slice(0, -2);\\n        // eslint-disable-next-line no-param-reassign\\n        value = JSON.stringify(value);\\n      } else if (\\n        (utils.isArray(value) && isFlatArray(value)) ||\\n        ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\\n        )) {\\n        // eslint-disable-next-line no-param-reassign\\n        key = removeBrackets(key);\\n\\n        arr.forEach(function each(el, index) {\\n          !(utils.isUndefined(el) || el === null) && formData.append(\\n            // eslint-disable-next-line no-nested-ternary\\n            indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\\n            convertValue(el)\\n          );\\n        });\\n        return false;\\n      }\\n    }\\n\\n    if (isVisitable(value)) {\\n      return true;\\n    }\\n\\n    formData.append(renderKey(path, key, dots), convertValue(value));\\n\\n    return false;\\n  }\\n\\n  const stack = [];\\n\\n  const exposedHelpers = Object.assign(predicates, {\\n    defaultVisitor,\\n    convertValue,\\n    isVisitable\\n  });\\n\\n  function build(value, path) {\\n    if (utils.isUndefined(value)) return;\\n\\n    if (stack.indexOf(value) !== -1) {\\n      throw Error('Circular reference detected in ' + path.join('.'));\\n    }\\n\\n    stack.push(value);\\n\\n    utils.forEach(value, function each(el, key) {\\n      const result = !(utils.isUndefined(el) || el === null) && visitor.call(\\n        formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\\n      );\\n\\n      if (result === true) {\\n        build(el, path ? path.concat(key) : [key]);\\n      }\\n    });\\n\\n    stack.pop();\\n  }\\n\\n  if (!utils.isObject(obj)) {\\n    throw new TypeError('data must be an object');\\n  }\\n\\n  build(obj);\\n\\n  return formData;\\n}\\n\\nexport default toFormData;\\n\",\"'use strict';\\n\\nimport toFormData from './toFormData.js';\\n\\n/**\\n * It encodes a string by replacing all characters that are not in the unreserved set with\\n * their percent-encoded equivalents\\n *\\n * @param {string} str - The string to encode.\\n *\\n * @returns {string} The encoded string.\\n */\\nfunction encode(str) {\\n  const charMap = {\\n    '!': '%21',\\n    \\\"'\\\": '%27',\\n    '(': '%28',\\n    ')': '%29',\\n    '~': '%7E',\\n    '%20': '+',\\n    '%00': '\\\\x00'\\n  };\\n  return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\\n    return charMap[match];\\n  });\\n}\\n\\n/**\\n * It takes a params object and converts it to a FormData object\\n *\\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\\n *\\n * @returns {void}\\n */\\nfunction AxiosURLSearchParams(params, options) {\\n  this._pairs = [];\\n\\n  params && toFormData(params, this, options);\\n}\\n\\nconst prototype = AxiosURLSearchParams.prototype;\\n\\nprototype.append = function append(name, value) {\\n  this._pairs.push([name, value]);\\n};\\n\\nprototype.toString = function toString(encoder) {\\n  const _encode = encoder ? function(value) {\\n    return encoder.call(this, value, encode);\\n  } : encode;\\n\\n  return this._pairs.map(function each(pair) {\\n    return _encode(pair[0]) + '=' + _encode(pair[1]);\\n  }, '').join('&');\\n};\\n\\nexport default AxiosURLSearchParams;\\n\",\"'use strict';\\n\\nimport utils from '../utils.js';\\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\\n\\n/**\\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\\n * URI encoded counterparts\\n *\\n * @param {string} val The value to be encoded.\\n *\\n * @returns {string} The encoded value.\\n */\\nfunction encode(val) {\\n  return encodeURIComponent(val).\\n    replace(/%3A/gi, ':').\\n    replace(/%24/g, '$').\\n    replace(/%2C/gi, ',').\\n    replace(/%20/g, '+');\\n}\\n\\n/**\\n * Build a URL by appending params to the end\\n *\\n * @param {string} url The base of the url (e.g., http://www.google.com)\\n * @param {object} [params] The params to be appended\\n * @param {?(object|Function)} options\\n *\\n * @returns {string} The formatted url\\n */\\nexport default function buildURL(url, params, options) {\\n  /*eslint no-param-reassign:0*/\\n  if (!params) {\\n    return url;\\n  }\\n  \\n  const _encode = options && options.encode || encode;\\n\\n  if (utils.isFunction(options)) {\\n    options = {\\n      serialize: options\\n    };\\n  } \\n\\n  const serializeFn = options && options.serialize;\\n\\n  let serializedParams;\\n\\n  if (serializeFn) {\\n    serializedParams = serializeFn(params, options);\\n  } else {\\n    serializedParams = utils.isURLSearchParams(params) ?\\n      params.toString() :\\n      new AxiosURLSearchParams(params, options).toString(_encode);\\n  }\\n\\n  if (serializedParams) {\\n    const hashmarkIndex = url.indexOf(\\\"#\\\");\\n\\n    if (hashmarkIndex !== -1) {\\n      url = url.slice(0, hashmarkIndex);\\n    }\\n    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\\n  }\\n\\n  return url;\\n}\\n\",\"'use strict';\\n\\nimport utils from './../utils.js';\\n\\nclass InterceptorManager {\\n  constructor() {\\n    this.handlers = [];\\n  }\\n\\n  /**\\n   * Add a new interceptor to the stack\\n   *\\n   * @param {Function} fulfilled The function to handle `then` for a `Promise`\\n   * @param {Function} rejected The function to handle `reject` for a `Promise`\\n   *\\n   * @return {Number} An ID used to remove interceptor later\\n   */\\n  use(fulfilled, rejected, options) {\\n    this.handlers.push({\\n      fulfilled,\\n      rejected,\\n      synchronous: options ? options.synchronous : false,\\n      runWhen: options ? options.runWhen : null\\n    });\\n    return this.handlers.length - 1;\\n  }\\n\\n  /**\\n   * Remove an interceptor from the stack\\n   *\\n   * @param {Number} id The ID that was returned by `use`\\n   *\\n   * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\\n   */\\n  eject(id) {\\n    if (this.handlers[id]) {\\n      this.handlers[id] = null;\\n    }\\n  }\\n\\n  /**\\n   * Clear all interceptors from the stack\\n   *\\n   * @returns {void}\\n   */\\n  clear() {\\n    if (this.handlers) {\\n      this.handlers = [];\\n    }\\n  }\\n\\n  /**\\n   * Iterate over all the registered interceptors\\n   *\\n   * This method is particularly useful for skipping over any\\n   * interceptors that may have become `null` calling `eject`.\\n   *\\n   * @param {Function} fn The function to call for each interceptor\\n   *\\n   * @returns {void}\\n   */\\n  forEach(fn) {\\n    utils.forEach(this.handlers, function forEachHandler(h) {\\n      if (h !== null) {\\n        fn(h);\\n      }\\n    });\\n  }\\n}\\n\\nexport default InterceptorManager;\\n\",\"'use strict';\\n\\nexport default {\\n  silentJSONParsing: true,\\n  forcedJSONParsing: true,\\n  clarifyTimeoutError: false\\n};\\n\",\"import URLSearchParams from './classes/URLSearchParams.js'\\nimport FormData from './classes/FormData.js'\\nimport Blob from './classes/Blob.js'\\n\\nexport default {\\n  isBrowser: true,\\n  classes: {\\n    URLSearchParams,\\n    FormData,\\n    Blob\\n  },\\n  protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\\n};\\n\",\"'use strict';\\n\\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\\n\",\"'use strict';\\n\\nexport default typeof FormData !== 'undefined' ? FormData : null;\\n\",\"'use strict'\\n\\nexport default typeof Blob !== 'undefined' ? Blob : null\\n\",\"const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\\n\\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\\n\\n/**\\n * Determine if we're running in a standard browser environment\\n *\\n * This allows axios to run in a web worker, and react-native.\\n * Both environments support XMLHttpRequest, but not fully standard globals.\\n *\\n * web workers:\\n *  typeof window -> undefined\\n *  typeof document -> undefined\\n *\\n * react-native:\\n *  navigator.product -> 'ReactNative'\\n * nativescript\\n *  navigator.product -> 'NativeScript' or 'NS'\\n *\\n * @returns {boolean}\\n */\\nconst hasStandardBrowserEnv = hasBrowserEnv &&\\n  (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\\n\\n/**\\n * Determine if we're running in a standard browser webWorker environment\\n *\\n * Although the `isStandardBrowserEnv` method indicates that\\n * `allows axios to run in a web worker`, the WebWorker will still be\\n * filtered out due to its judgment standard\\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\\n * This leads to a problem when axios post `FormData` in webWorker\\n */\\nconst hasStandardBrowserWebWorkerEnv = (() => {\\n  return (\\n    typeof WorkerGlobalScope !== 'undefined' &&\\n    // eslint-disable-next-line no-undef\\n    self instanceof WorkerGlobalScope &&\\n    typeof self.importScripts === 'function'\\n  );\\n})();\\n\\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\\n\\nexport {\\n  hasBrowserEnv,\\n  hasStandardBrowserWebWorkerEnv,\\n  hasStandardBrowserEnv,\\n  _navigator as navigator,\\n  origin\\n}\\n\",\"import platform from './node/index.js';\\nimport * as utils from './common/utils.js';\\n\\nexport default {\\n  ...utils,\\n  ...platform\\n}\\n\",\"'use strict';\\n\\nimport utils from '../utils.js';\\n\\n/**\\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\\n *\\n * @param {string} name - The name of the property to get.\\n *\\n * @returns An array of strings.\\n */\\nfunction parsePropPath(name) {\\n  // foo[x][y][z]\\n  // foo.x.y.z\\n  // foo-x-y-z\\n  // foo x y z\\n  return utils.matchAll(/\\\\w+|\\\\[(\\\\w*)]/g, name).map(match => {\\n    return match[0] === '[]' ? '' : match[1] || match[0];\\n  });\\n}\\n\\n/**\\n * Convert an array to an object.\\n *\\n * @param {Array<any>} arr - The array to convert to an object.\\n *\\n * @returns An object with the same keys and values as the array.\\n */\\nfunction arrayToObject(arr) {\\n  const obj = {};\\n  const keys = Object.keys(arr);\\n  let i;\\n  const len = keys.length;\\n  let key;\\n  for (i = 0; i < len; i++) {\\n    key = keys[i];\\n    obj[key] = arr[key];\\n  }\\n  return obj;\\n}\\n\\n/**\\n * It takes a FormData object and returns a JavaScript object\\n *\\n * @param {string} formData The FormData object to convert to JSON.\\n *\\n * @returns {Object<string, any> | null} The converted object.\\n */\\nfunction formDataToJSON(formData) {\\n  function buildPath(path, value, target, index) {\\n    let name = path[index++];\\n\\n    if (name === '__proto__') return true;\\n\\n    const isNumericKey = Number.isFinite(+name);\\n    const isLast = index >= path.length;\\n    name = !name && utils.isArray(target) ? target.length : name;\\n\\n    if (isLast) {\\n      if (utils.hasOwnProp(target, name)) {\\n        target[name] = [target[name], value];\\n      } else {\\n        target[name] = value;\\n      }\\n\\n      return !isNumericKey;\\n    }\\n\\n    if (!target[name] || !utils.isObject(target[name])) {\\n      target[name] = [];\\n    }\\n\\n    const result = buildPath(path, value, target[name], index);\\n\\n    if (result && utils.isArray(target[name])) {\\n      target[name] = arrayToObject(target[name]);\\n    }\\n\\n    return !isNumericKey;\\n  }\\n\\n  if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\\n    const obj = {};\\n\\n    utils.forEachEntry(formData, (name, value) => {\\n      buildPath(parsePropPath(name), value, obj, 0);\\n    });\\n\\n    return obj;\\n  }\\n\\n  return null;\\n}\\n\\nexport default formDataToJSON;\\n\",\"'use strict';\\n\\nimport utils from '../utils.js';\\nimport AxiosError from '../core/AxiosError.js';\\nimport transitionalDefaults from './transitional.js';\\nimport toFormData from '../helpers/toFormData.js';\\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\\nimport platform from '../platform/index.js';\\nimport formDataToJSON from '../helpers/formDataToJSON.js';\\n\\n/**\\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\\n * of the input\\n *\\n * @param {any} rawValue - The value to be stringified.\\n * @param {Function} parser - A function that parses a string into a JavaScript object.\\n * @param {Function} encoder - A function that takes a value and returns a string.\\n *\\n * @returns {string} A stringified version of the rawValue.\\n */\\nfunction stringifySafely(rawValue, parser, encoder) {\\n  if (utils.isString(rawValue)) {\\n    try {\\n      (parser || JSON.parse)(rawValue);\\n      return utils.trim(rawValue);\\n    } catch (e) {\\n      if (e.name !== 'SyntaxError') {\\n        throw e;\\n      }\\n    }\\n  }\\n\\n  return (encoder || JSON.stringify)(rawValue);\\n}\\n\\nconst defaults = {\\n\\n  transitional: transitionalDefaults,\\n\\n  adapter: ['xhr', 'http', 'fetch'],\\n\\n  transformRequest: [function transformRequest(data, headers) {\\n    const contentType = headers.getContentType() || '';\\n    const hasJSONContentType = contentType.indexOf('application/json') > -1;\\n    const isObjectPayload = utils.isObject(data);\\n\\n    if (isObjectPayload && utils.isHTMLForm(data)) {\\n      data = new FormData(data);\\n    }\\n\\n    const isFormData = utils.isFormData(data);\\n\\n    if (isFormData) {\\n      return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\\n    }\\n\\n    if (utils.isArrayBuffer(data) ||\\n      utils.isBuffer(data) ||\\n      utils.isStream(data) ||\\n      utils.isFile(data) ||\\n      utils.isBlob(data) ||\\n      utils.isReadableStream(data)\\n    ) {\\n      return data;\\n    }\\n    if (utils.isArrayBufferView(data)) {\\n      return data.buffer;\\n    }\\n    if (utils.isURLSearchParams(data)) {\\n      headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\\n      return data.toString();\\n    }\\n\\n    let isFileList;\\n\\n    if (isObjectPayload) {\\n      if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\\n        return toURLEncodedForm(data, this.formSerializer).toString();\\n      }\\n\\n      if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\\n        const _FormData = this.env && this.env.FormData;\\n\\n        return toFormData(\\n          isFileList ? {'files[]': data} : data,\\n          _FormData && new _FormData(),\\n          this.formSerializer\\n        );\\n      }\\n    }\\n\\n    if (isObjectPayload || hasJSONContentType ) {\\n      headers.setContentType('application/json', false);\\n      return stringifySafely(data);\\n    }\\n\\n    return data;\\n  }],\\n\\n  transformResponse: [function transformResponse(data) {\\n    const transitional = this.transitional || defaults.transitional;\\n    const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\\n    const JSONRequested = this.responseType === 'json';\\n\\n    if (utils.isResponse(data) || utils.isReadableStream(data)) {\\n      return data;\\n    }\\n\\n    if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\\n      const silentJSONParsing = transitional && transitional.silentJSONParsing;\\n      const strictJSONParsing = !silentJSONParsing && JSONRequested;\\n\\n      try {\\n        return JSON.parse(data, this.parseReviver);\\n      } catch (e) {\\n        if (strictJSONParsing) {\\n          if (e.name === 'SyntaxError') {\\n            throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\\n          }\\n          throw e;\\n        }\\n      }\\n    }\\n\\n    return data;\\n  }],\\n\\n  /**\\n   * A timeout in milliseconds to abort a request. If set to 0 (default) a\\n   * timeout is not created.\\n   */\\n  timeout: 0,\\n\\n  xsrfCookieName: 'XSRF-TOKEN',\\n  xsrfHeaderName: 'X-XSRF-TOKEN',\\n\\n  maxContentLength: -1,\\n  maxBodyLength: -1,\\n\\n  env: {\\n    FormData: platform.classes.FormData,\\n    Blob: platform.classes.Blob\\n  },\\n\\n  validateStatus: function validateStatus(status) {\\n    return status >= 200 && status < 300;\\n  },\\n\\n  headers: {\\n    common: {\\n      'Accept': 'application/json, text/plain, */*',\\n      'Content-Type': undefined\\n    }\\n  }\\n};\\n\\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\\n  defaults.headers[method] = {};\\n});\\n\\nexport default defaults;\\n\",\"'use strict';\\n\\nimport utils from '../utils.js';\\nimport toFormData from './toFormData.js';\\nimport platform from '../platform/index.js';\\n\\nexport default function toURLEncodedForm(data, options) {\\n  return toFormData(data, new platform.classes.URLSearchParams(), {\\n    visitor: function(value, key, path, helpers) {\\n      if (platform.isNode && utils.isBuffer(value)) {\\n        this.append(key, value.toString('base64'));\\n        return false;\\n      }\\n\\n      return helpers.defaultVisitor.apply(this, arguments);\\n    },\\n    ...options\\n  });\\n}\\n\",\"'use strict';\\n\\nimport utils from './../utils.js';\\n\\n// RawAxiosHeaders whose duplicates are ignored by node\\n// c.f. https://nodejs.org/api/http.html#http_message_headers\\nconst ignoreDuplicateOf = utils.toObjectSet([\\n  'age', 'authorization', 'content-length', 'content-type', 'etag',\\n  'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\\n  'last-modified', 'location', 'max-forwards', 'proxy-authorization',\\n  'referer', 'retry-after', 'user-agent'\\n]);\\n\\n/**\\n * Parse headers into an object\\n *\\n * ```\\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\\n * Content-Type: application/json\\n * Connection: keep-alive\\n * Transfer-Encoding: chunked\\n * ```\\n *\\n * @param {String} rawHeaders Headers needing to be parsed\\n *\\n * @returns {Object} Headers parsed into an object\\n */\\nexport default rawHeaders => {\\n  const parsed = {};\\n  let key;\\n  let val;\\n  let i;\\n\\n  rawHeaders && rawHeaders.split('\\\\n').forEach(function parser(line) {\\n    i = line.indexOf(':');\\n    key = line.substring(0, i).trim().toLowerCase();\\n    val = line.substring(i + 1).trim();\\n\\n    if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\\n      return;\\n    }\\n\\n    if (key === 'set-cookie') {\\n      if (parsed[key]) {\\n        parsed[key].push(val);\\n      } else {\\n        parsed[key] = [val];\\n      }\\n    } else {\\n      parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\\n    }\\n  });\\n\\n  return parsed;\\n};\\n\",\"'use strict';\\n\\nimport utils from '../utils.js';\\nimport parseHeaders from '../helpers/parseHeaders.js';\\n\\nconst $internals = Symbol('internals');\\n\\nfunction normalizeHeader(header) {\\n  return header && String(header).trim().toLowerCase();\\n}\\n\\nfunction normalizeValue(value) {\\n  if (value === false || value == null) {\\n    return value;\\n  }\\n\\n  return utils.isArray(value) ? value.map(normalizeValue) : String(value);\\n}\\n\\nfunction parseTokens(str) {\\n  const tokens = Object.create(null);\\n  const tokensRE = /([^\\\\s,;=]+)\\\\s*(?:=\\\\s*([^,;]+))?/g;\\n  let match;\\n\\n  while ((match = tokensRE.exec(str))) {\\n    tokens[match[1]] = match[2];\\n  }\\n\\n  return tokens;\\n}\\n\\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\\n\\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\\n  if (utils.isFunction(filter)) {\\n    return filter.call(this, value, header);\\n  }\\n\\n  if (isHeaderNameFilter) {\\n    value = header;\\n  }\\n\\n  if (!utils.isString(value)) return;\\n\\n  if (utils.isString(filter)) {\\n    return value.indexOf(filter) !== -1;\\n  }\\n\\n  if (utils.isRegExp(filter)) {\\n    return filter.test(value);\\n  }\\n}\\n\\nfunction formatHeader(header) {\\n  return header.trim()\\n    .toLowerCase().replace(/([a-z\\\\d])(\\\\w*)/g, (w, char, str) => {\\n      return char.toUpperCase() + str;\\n    });\\n}\\n\\nfunction buildAccessors(obj, header) {\\n  const accessorName = utils.toCamelCase(' ' + header);\\n\\n  ['get', 'set', 'has'].forEach(methodName => {\\n    Object.defineProperty(obj, methodName + accessorName, {\\n      value: function(arg1, arg2, arg3) {\\n        return this[methodName].call(this, header, arg1, arg2, arg3);\\n      },\\n      configurable: true\\n    });\\n  });\\n}\\n\\nclass AxiosHeaders {\\n  constructor(headers) {\\n    headers && this.set(headers);\\n  }\\n\\n  set(header, valueOrRewrite, rewrite) {\\n    const self = this;\\n\\n    function setHeader(_value, _header, _rewrite) {\\n      const lHeader = normalizeHeader(_header);\\n\\n      if (!lHeader) {\\n        throw new Error('header name must be a non-empty string');\\n      }\\n\\n      const key = utils.findKey(self, lHeader);\\n\\n      if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\\n        self[key || _header] = normalizeValue(_value);\\n      }\\n    }\\n\\n    const setHeaders = (headers, _rewrite) =>\\n      utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\\n\\n    if (utils.isPlainObject(header) || header instanceof this.constructor) {\\n      setHeaders(header, valueOrRewrite)\\n    } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\\n      setHeaders(parseHeaders(header), valueOrRewrite);\\n    } else if (utils.isObject(header) && utils.isIterable(header)) {\\n      let obj = {}, dest, key;\\n      for (const entry of header) {\\n        if (!utils.isArray(entry)) {\\n          throw TypeError('Object iterator must return a key-value pair');\\n        }\\n\\n        obj[key = entry[0]] = (dest = obj[key]) ?\\n          (utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];\\n      }\\n\\n      setHeaders(obj, valueOrRewrite)\\n    } else {\\n      header != null && setHeader(valueOrRewrite, header, rewrite);\\n    }\\n\\n    return this;\\n  }\\n\\n  get(header, parser) {\\n    header = normalizeHeader(header);\\n\\n    if (header) {\\n      const key = utils.findKey(this, header);\\n\\n      if (key) {\\n        const value = this[key];\\n\\n        if (!parser) {\\n          return value;\\n        }\\n\\n        if (parser === true) {\\n          return parseTokens(value);\\n        }\\n\\n        if (utils.isFunction(parser)) {\\n          return parser.call(this, value, key);\\n        }\\n\\n        if (utils.isRegExp(parser)) {\\n          return parser.exec(value);\\n        }\\n\\n        throw new TypeError('parser must be boolean|regexp|function');\\n      }\\n    }\\n  }\\n\\n  has(header, matcher) {\\n    header = normalizeHeader(header);\\n\\n    if (header) {\\n      const key = utils.findKey(this, header);\\n\\n      return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\\n    }\\n\\n    return false;\\n  }\\n\\n  delete(header, matcher) {\\n    const self = this;\\n    let deleted = false;\\n\\n    function deleteHeader(_header) {\\n      _header = normalizeHeader(_header);\\n\\n      if (_header) {\\n        const key = utils.findKey(self, _header);\\n\\n        if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\\n          delete self[key];\\n\\n          deleted = true;\\n        }\\n      }\\n    }\\n\\n    if (utils.isArray(header)) {\\n      header.forEach(deleteHeader);\\n    } else {\\n      deleteHeader(header);\\n    }\\n\\n    return deleted;\\n  }\\n\\n  clear(matcher) {\\n    const keys = Object.keys(this);\\n    let i = keys.length;\\n    let deleted = false;\\n\\n    while (i--) {\\n      const key = keys[i];\\n      if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\\n        delete this[key];\\n        deleted = true;\\n      }\\n    }\\n\\n    return deleted;\\n  }\\n\\n  normalize(format) {\\n    const self = this;\\n    const headers = {};\\n\\n    utils.forEach(this, (value, header) => {\\n      const key = utils.findKey(headers, header);\\n\\n      if (key) {\\n        self[key] = normalizeValue(value);\\n        delete self[header];\\n        return;\\n      }\\n\\n      const normalized = format ? formatHeader(header) : String(header).trim();\\n\\n      if (normalized !== header) {\\n        delete self[header];\\n      }\\n\\n      self[normalized] = normalizeValue(value);\\n\\n      headers[normalized] = true;\\n    });\\n\\n    return this;\\n  }\\n\\n  concat(...targets) {\\n    return this.constructor.concat(this, ...targets);\\n  }\\n\\n  toJSON(asStrings) {\\n    const obj = Object.create(null);\\n\\n    utils.forEach(this, (value, header) => {\\n      value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\\n    });\\n\\n    return obj;\\n  }\\n\\n  [Symbol.iterator]() {\\n    return Object.entries(this.toJSON())[Symbol.iterator]();\\n  }\\n\\n  toString() {\\n    return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\\\n');\\n  }\\n\\n  getSetCookie() {\\n    return this.get(\\\"set-cookie\\\") || [];\\n  }\\n\\n  get [Symbol.toStringTag]() {\\n    return 'AxiosHeaders';\\n  }\\n\\n  static from(thing) {\\n    return thing instanceof this ? thing : new this(thing);\\n  }\\n\\n  static concat(first, ...targets) {\\n    const computed = new this(first);\\n\\n    targets.forEach((target) => computed.set(target));\\n\\n    return computed;\\n  }\\n\\n  static accessor(header) {\\n    const internals = this[$internals] = (this[$internals] = {\\n      accessors: {}\\n    });\\n\\n    const accessors = internals.accessors;\\n    const prototype = this.prototype;\\n\\n    function defineAccessor(_header) {\\n      const lHeader = normalizeHeader(_header);\\n\\n      if (!accessors[lHeader]) {\\n        buildAccessors(prototype, _header);\\n        accessors[lHeader] = true;\\n      }\\n    }\\n\\n    utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\\n\\n    return this;\\n  }\\n}\\n\\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\\n\\n// reserved names hotfix\\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\\n  let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\\n  return {\\n    get: () => value,\\n    set(headerValue) {\\n      this[mapped] = headerValue;\\n    }\\n  }\\n});\\n\\nutils.freezeMethods(AxiosHeaders);\\n\\nexport default AxiosHeaders;\\n\",\"'use strict';\\n\\nimport utils from './../utils.js';\\nimport defaults from '../defaults/index.js';\\nimport AxiosHeaders from '../core/AxiosHeaders.js';\\n\\n/**\\n * Transform the data for a request or a response\\n *\\n * @param {Array|Function} fns A single function or Array of functions\\n * @param {?Object} response The response object\\n *\\n * @returns {*} The resulting transformed data\\n */\\nexport default function transformData(fns, response) {\\n  const config = this || defaults;\\n  const context = response || config;\\n  const headers = AxiosHeaders.from(context.headers);\\n  let data = context.data;\\n\\n  utils.forEach(fns, function transform(fn) {\\n    data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\\n  });\\n\\n  headers.normalize();\\n\\n  return data;\\n}\\n\",\"'use strict';\\n\\nexport default function isCancel(value) {\\n  return !!(value && value.__CANCEL__);\\n}\\n\",\"'use strict';\\n\\nimport AxiosError from '../core/AxiosError.js';\\nimport utils from '../utils.js';\\n\\n/**\\n * A `CanceledError` is an object that is thrown when an operation is canceled.\\n *\\n * @param {string=} message The message.\\n * @param {Object=} config The config.\\n * @param {Object=} request The request.\\n *\\n * @returns {CanceledError} The created error.\\n */\\nfunction CanceledError(message, config, request) {\\n  // eslint-disable-next-line no-eq-null,eqeqeq\\n  AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\\n  this.name = 'CanceledError';\\n}\\n\\nutils.inherits(CanceledError, AxiosError, {\\n  __CANCEL__: true\\n});\\n\\nexport default CanceledError;\\n\",\"'use strict';\\n\\nimport AxiosError from './AxiosError.js';\\n\\n/**\\n * Resolve or reject a Promise based on response status.\\n *\\n * @param {Function} resolve A function that resolves the promise.\\n * @param {Function} reject A function that rejects the promise.\\n * @param {object} response The response.\\n *\\n * @returns {object} The response.\\n */\\nexport default function settle(resolve, reject, response) {\\n  const validateStatus = response.config.validateStatus;\\n  if (!response.status || !validateStatus || validateStatus(response.status)) {\\n    resolve(response);\\n  } else {\\n    reject(new AxiosError(\\n      'Request failed with status code ' + response.status,\\n      [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\\n      response.config,\\n      response.request,\\n      response\\n    ));\\n  }\\n}\\n\",\"'use strict';\\n\\n/**\\n * Calculate data maxRate\\n * @param {Number} [samplesCount= 10]\\n * @param {Number} [min= 1000]\\n * @returns {Function}\\n */\\nfunction speedometer(samplesCount, min) {\\n  samplesCount = samplesCount || 10;\\n  const bytes = new Array(samplesCount);\\n  const timestamps = new Array(samplesCount);\\n  let head = 0;\\n  let tail = 0;\\n  let firstSampleTS;\\n\\n  min = min !== undefined ? min : 1000;\\n\\n  return function push(chunkLength) {\\n    const now = Date.now();\\n\\n    const startedAt = timestamps[tail];\\n\\n    if (!firstSampleTS) {\\n      firstSampleTS = now;\\n    }\\n\\n    bytes[head] = chunkLength;\\n    timestamps[head] = now;\\n\\n    let i = tail;\\n    let bytesCount = 0;\\n\\n    while (i !== head) {\\n      bytesCount += bytes[i++];\\n      i = i % samplesCount;\\n    }\\n\\n    head = (head + 1) % samplesCount;\\n\\n    if (head === tail) {\\n      tail = (tail + 1) % samplesCount;\\n    }\\n\\n    if (now - firstSampleTS < min) {\\n      return;\\n    }\\n\\n    const passed = startedAt && now - startedAt;\\n\\n    return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\\n  };\\n}\\n\\nexport default speedometer;\\n\",\"/**\\n * Throttle decorator\\n * @param {Function} fn\\n * @param {Number} freq\\n * @return {Function}\\n */\\nfunction throttle(fn, freq) {\\n  let timestamp = 0;\\n  let threshold = 1000 / freq;\\n  let lastArgs;\\n  let timer;\\n\\n  const invoke = (args, now = Date.now()) => {\\n    timestamp = now;\\n    lastArgs = null;\\n    if (timer) {\\n      clearTimeout(timer);\\n      timer = null;\\n    }\\n    fn(...args);\\n  }\\n\\n  const throttled = (...args) => {\\n    const now = Date.now();\\n    const passed = now - timestamp;\\n    if ( passed >= threshold) {\\n      invoke(args, now);\\n    } else {\\n      lastArgs = args;\\n      if (!timer) {\\n        timer = setTimeout(() => {\\n          timer = null;\\n          invoke(lastArgs)\\n        }, threshold - passed);\\n      }\\n    }\\n  }\\n\\n  const flush = () => lastArgs && invoke(lastArgs);\\n\\n  return [throttled, flush];\\n}\\n\\nexport default throttle;\\n\",\"import speedometer from \\\"./speedometer.js\\\";\\nimport throttle from \\\"./throttle.js\\\";\\nimport utils from \\\"../utils.js\\\";\\n\\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\\n  let bytesNotified = 0;\\n  const _speedometer = speedometer(50, 250);\\n\\n  return throttle(e => {\\n    const loaded = e.loaded;\\n    const total = e.lengthComputable ? e.total : undefined;\\n    const progressBytes = loaded - bytesNotified;\\n    const rate = _speedometer(progressBytes);\\n    const inRange = loaded <= total;\\n\\n    bytesNotified = loaded;\\n\\n    const data = {\\n      loaded,\\n      total,\\n      progress: total ? (loaded / total) : undefined,\\n      bytes: progressBytes,\\n      rate: rate ? rate : undefined,\\n      estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\\n      event: e,\\n      lengthComputable: total != null,\\n      [isDownloadStream ? 'download' : 'upload']: true\\n    };\\n\\n    listener(data);\\n  }, freq);\\n}\\n\\nexport const progressEventDecorator = (total, throttled) => {\\n  const lengthComputable = total != null;\\n\\n  return [(loaded) => throttled[0]({\\n    lengthComputable,\\n    total,\\n    loaded\\n  }), throttled[1]];\\n}\\n\\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\\n\",\"import platform from '../platform/index.js';\\n\\nexport default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\\n  url = new URL(url, platform.origin);\\n\\n  return (\\n    origin.protocol === url.protocol &&\\n    origin.host === url.host &&\\n    (isMSIE || origin.port === url.port)\\n  );\\n})(\\n  new URL(platform.origin),\\n  platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\\n) : () => true;\\n\",\"import utils from './../utils.js';\\nimport platform from '../platform/index.js';\\n\\nexport default platform.hasStandardBrowserEnv ?\\n\\n  // Standard browser envs support document.cookie\\n  {\\n    write(name, value, expires, path, domain, secure) {\\n      const cookie = [name + '=' + encodeURIComponent(value)];\\n\\n      utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\\n\\n      utils.isString(path) && cookie.push('path=' + path);\\n\\n      utils.isString(domain) && cookie.push('domain=' + domain);\\n\\n      secure === true && cookie.push('secure');\\n\\n      document.cookie = cookie.join('; ');\\n    },\\n\\n    read(name) {\\n      const match = document.cookie.match(new RegExp('(^|;\\\\\\\\s*)(' + name + ')=([^;]*)'));\\n      return (match ? decodeURIComponent(match[3]) : null);\\n    },\\n\\n    remove(name) {\\n      this.write(name, '', Date.now() - 86400000);\\n    }\\n  }\\n\\n  :\\n\\n  // Non-standard browser env (web workers, react-native) lack needed support.\\n  {\\n    write() {},\\n    read() {\\n      return null;\\n    },\\n    remove() {}\\n  };\\n\\n\",\"'use strict';\\n\\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\\nimport combineURLs from '../helpers/combineURLs.js';\\n\\n/**\\n * Creates a new URL by combining the baseURL with the requestedURL,\\n * only when the requestedURL is not already an absolute URL.\\n * If the requestURL is absolute, this function returns the requestedURL untouched.\\n *\\n * @param {string} baseURL The base URL\\n * @param {string} requestedURL Absolute or relative URL to combine\\n *\\n * @returns {string} The combined full path\\n */\\nexport default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\\n  let isRelativeUrl = !isAbsoluteURL(requestedURL);\\n  if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\\n    return combineURLs(baseURL, requestedURL);\\n  }\\n  return requestedURL;\\n}\\n\",\"'use strict';\\n\\n/**\\n * Determines whether the specified URL is absolute\\n *\\n * @param {string} url The URL to test\\n *\\n * @returns {boolean} True if the specified URL is absolute, otherwise false\\n */\\nexport default function isAbsoluteURL(url) {\\n  // A URL is considered absolute if it begins with \\\"<scheme>://\\\" or \\\"//\\\" (protocol-relative URL).\\n  // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\\n  // by any combination of letters, digits, plus, period, or hyphen.\\n  return /^([a-z][a-z\\\\d+\\\\-.]*:)?\\\\/\\\\//i.test(url);\\n}\\n\",\"'use strict';\\n\\n/**\\n * Creates a new URL by combining the specified URLs\\n *\\n * @param {string} baseURL The base URL\\n * @param {string} relativeURL The relative URL\\n *\\n * @returns {string} The combined URL\\n */\\nexport default function combineURLs(baseURL, relativeURL) {\\n  return relativeURL\\n    ? baseURL.replace(/\\\\/?\\\\/$/, '') + '/' + relativeURL.replace(/^\\\\/+/, '')\\n    : baseURL;\\n}\\n\",\"'use strict';\\n\\nimport utils from '../utils.js';\\nimport AxiosHeaders from \\\"./AxiosHeaders.js\\\";\\n\\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\\n\\n/**\\n * Config-specific merge-function which creates a new config-object\\n * by merging two configuration objects together.\\n *\\n * @param {Object} config1\\n * @param {Object} config2\\n *\\n * @returns {Object} New object resulting from merging config2 to config1\\n */\\nexport default function mergeConfig(config1, config2) {\\n  // eslint-disable-next-line no-param-reassign\\n  config2 = config2 || {};\\n  const config = {};\\n\\n  function getMergedValue(target, source, prop, caseless) {\\n    if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\\n      return utils.merge.call({caseless}, target, source);\\n    } else if (utils.isPlainObject(source)) {\\n      return utils.merge({}, source);\\n    } else if (utils.isArray(source)) {\\n      return source.slice();\\n    }\\n    return source;\\n  }\\n\\n  // eslint-disable-next-line consistent-return\\n  function mergeDeepProperties(a, b, prop , caseless) {\\n    if (!utils.isUndefined(b)) {\\n      return getMergedValue(a, b, prop , caseless);\\n    } else if (!utils.isUndefined(a)) {\\n      return getMergedValue(undefined, a, prop , caseless);\\n    }\\n  }\\n\\n  // eslint-disable-next-line consistent-return\\n  function valueFromConfig2(a, b) {\\n    if (!utils.isUndefined(b)) {\\n      return getMergedValue(undefined, b);\\n    }\\n  }\\n\\n  // eslint-disable-next-line consistent-return\\n  function defaultToConfig2(a, b) {\\n    if (!utils.isUndefined(b)) {\\n      return getMergedValue(undefined, b);\\n    } else if (!utils.isUndefined(a)) {\\n      return getMergedValue(undefined, a);\\n    }\\n  }\\n\\n  // eslint-disable-next-line consistent-return\\n  function mergeDirectKeys(a, b, prop) {\\n    if (prop in config2) {\\n      return getMergedValue(a, b);\\n    } else if (prop in config1) {\\n      return getMergedValue(undefined, a);\\n    }\\n  }\\n\\n  const mergeMap = {\\n    url: valueFromConfig2,\\n    method: valueFromConfig2,\\n    data: valueFromConfig2,\\n    baseURL: defaultToConfig2,\\n    transformRequest: defaultToConfig2,\\n    transformResponse: defaultToConfig2,\\n    paramsSerializer: defaultToConfig2,\\n    timeout: defaultToConfig2,\\n    timeoutMessage: defaultToConfig2,\\n    withCredentials: defaultToConfig2,\\n    withXSRFToken: defaultToConfig2,\\n    adapter: defaultToConfig2,\\n    responseType: defaultToConfig2,\\n    xsrfCookieName: defaultToConfig2,\\n    xsrfHeaderName: defaultToConfig2,\\n    onUploadProgress: defaultToConfig2,\\n    onDownloadProgress: defaultToConfig2,\\n    decompress: defaultToConfig2,\\n    maxContentLength: defaultToConfig2,\\n    maxBodyLength: defaultToConfig2,\\n    beforeRedirect: defaultToConfig2,\\n    transport: defaultToConfig2,\\n    httpAgent: defaultToConfig2,\\n    httpsAgent: defaultToConfig2,\\n    cancelToken: defaultToConfig2,\\n    socketPath: defaultToConfig2,\\n    responseEncoding: defaultToConfig2,\\n    validateStatus: mergeDirectKeys,\\n    headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)\\n  };\\n\\n  utils.forEach(Object.keys({...config1, ...config2}), function computeConfigValue(prop) {\\n    const merge = mergeMap[prop] || mergeDeepProperties;\\n    const configValue = merge(config1[prop], config2[prop], prop);\\n    (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\\n  });\\n\\n  return config;\\n}\\n\",\"import platform from \\\"../platform/index.js\\\";\\nimport utils from \\\"../utils.js\\\";\\nimport isURLSameOrigin from \\\"./isURLSameOrigin.js\\\";\\nimport cookies from \\\"./cookies.js\\\";\\nimport buildFullPath from \\\"../core/buildFullPath.js\\\";\\nimport mergeConfig from \\\"../core/mergeConfig.js\\\";\\nimport AxiosHeaders from \\\"../core/AxiosHeaders.js\\\";\\nimport buildURL from \\\"./buildURL.js\\\";\\n\\nexport default (config) => {\\n  const newConfig = mergeConfig({}, config);\\n\\n  let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;\\n\\n  newConfig.headers = headers = AxiosHeaders.from(headers);\\n\\n  newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);\\n\\n  // HTTP basic authentication\\n  if (auth) {\\n    headers.set('Authorization', 'Basic ' +\\n      btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\\n    );\\n  }\\n\\n  if (utils.isFormData(data)) {\\n    if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\\n      headers.setContentType(undefined); // browser handles it\\n    } else if (utils.isFunction(data.getHeaders)) {\\n      // Node.js FormData (like form-data package)\\n      const formHeaders = data.getHeaders();\\n      // Only set safe headers to avoid overwriting security headers\\n      const allowedHeaders = ['content-type', 'content-length'];\\n      Object.entries(formHeaders).forEach(([key, val]) => {\\n        if (allowedHeaders.includes(key.toLowerCase())) {\\n          headers.set(key, val);\\n        }\\n      });\\n    }\\n  }  \\n\\n  // Add xsrf header\\n  // This is only done if running in a standard browser environment.\\n  // Specifically not if we're in a web worker, or react-native.\\n\\n  if (platform.hasStandardBrowserEnv) {\\n    withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\\n\\n    if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\\n      // Add xsrf header\\n      const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\\n\\n      if (xsrfValue) {\\n        headers.set(xsrfHeaderName, xsrfValue);\\n      }\\n    }\\n  }\\n\\n  return newConfig;\\n}\\n\\n\",\"import utils from './../utils.js';\\nimport settle from './../core/settle.js';\\nimport transitionalDefaults from '../defaults/transitional.js';\\nimport AxiosError from '../core/AxiosError.js';\\nimport CanceledError from '../cancel/CanceledError.js';\\nimport parseProtocol from '../helpers/parseProtocol.js';\\nimport platform from '../platform/index.js';\\nimport AxiosHeaders from '../core/AxiosHeaders.js';\\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\\nimport resolveConfig from \\\"../helpers/resolveConfig.js\\\";\\n\\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\\n\\nexport default isXHRAdapterSupported && function (config) {\\n  return new Promise(function dispatchXhrRequest(resolve, reject) {\\n    const _config = resolveConfig(config);\\n    let requestData = _config.data;\\n    const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\\n    let {responseType, onUploadProgress, onDownloadProgress} = _config;\\n    let onCanceled;\\n    let uploadThrottled, downloadThrottled;\\n    let flushUpload, flushDownload;\\n\\n    function done() {\\n      flushUpload && flushUpload(); // flush events\\n      flushDownload && flushDownload(); // flush events\\n\\n      _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\\n\\n      _config.signal && _config.signal.removeEventListener('abort', onCanceled);\\n    }\\n\\n    let request = new XMLHttpRequest();\\n\\n    request.open(_config.method.toUpperCase(), _config.url, true);\\n\\n    // Set the request timeout in MS\\n    request.timeout = _config.timeout;\\n\\n    function onloadend() {\\n      if (!request) {\\n        return;\\n      }\\n      // Prepare the response\\n      const responseHeaders = AxiosHeaders.from(\\n        'getAllResponseHeaders' in request && request.getAllResponseHeaders()\\n      );\\n      const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\\n        request.responseText : request.response;\\n      const response = {\\n        data: responseData,\\n        status: request.status,\\n        statusText: request.statusText,\\n        headers: responseHeaders,\\n        config,\\n        request\\n      };\\n\\n      settle(function _resolve(value) {\\n        resolve(value);\\n        done();\\n      }, function _reject(err) {\\n        reject(err);\\n        done();\\n      }, response);\\n\\n      // Clean up request\\n      request = null;\\n    }\\n\\n    if ('onloadend' in request) {\\n      // Use onloadend if available\\n      request.onloadend = onloadend;\\n    } else {\\n      // Listen for ready state to emulate onloadend\\n      request.onreadystatechange = function handleLoad() {\\n        if (!request || request.readyState !== 4) {\\n          return;\\n        }\\n\\n        // The request errored out and we didn't get a response, this will be\\n        // handled by onerror instead\\n        // With one exception: request that using file: protocol, most browsers\\n        // will return status as 0 even though it's a successful request\\n        if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\\n          return;\\n        }\\n        // readystate handler is calling before onerror or ontimeout handlers,\\n        // so we should call onloadend on the next 'tick'\\n        setTimeout(onloadend);\\n      };\\n    }\\n\\n    // Handle browser request cancellation (as opposed to a manual cancellation)\\n    request.onabort = function handleAbort() {\\n      if (!request) {\\n        return;\\n      }\\n\\n      reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\\n\\n      // Clean up request\\n      request = null;\\n    };\\n\\n    // Handle low level network errors\\n  request.onerror = function handleError(event) {\\n       // Browsers deliver a ProgressEvent in XHR onerror\\n       // (message may be empty; when present, surface it)\\n       // See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event\\n       const msg = event && event.message ? event.message : 'Network Error';\\n       const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);\\n       // attach the underlying event for consumers who want details\\n       err.event = event || null;\\n       reject(err);\\n       request = null;\\n    };\\n    \\n    // Handle timeout\\n    request.ontimeout = function handleTimeout() {\\n      let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\\n      const transitional = _config.transitional || transitionalDefaults;\\n      if (_config.timeoutErrorMessage) {\\n        timeoutErrorMessage = _config.timeoutErrorMessage;\\n      }\\n      reject(new AxiosError(\\n        timeoutErrorMessage,\\n        transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\\n        config,\\n        request));\\n\\n      // Clean up request\\n      request = null;\\n    };\\n\\n    // Remove Content-Type if data is undefined\\n    requestData === undefined && requestHeaders.setContentType(null);\\n\\n    // Add headers to the request\\n    if ('setRequestHeader' in request) {\\n      utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\\n        request.setRequestHeader(key, val);\\n      });\\n    }\\n\\n    // Add withCredentials to request if needed\\n    if (!utils.isUndefined(_config.withCredentials)) {\\n      request.withCredentials = !!_config.withCredentials;\\n    }\\n\\n    // Add responseType to request if needed\\n    if (responseType && responseType !== 'json') {\\n      request.responseType = _config.responseType;\\n    }\\n\\n    // Handle progress if needed\\n    if (onDownloadProgress) {\\n      ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\\n      request.addEventListener('progress', downloadThrottled);\\n    }\\n\\n    // Not all browsers support upload events\\n    if (onUploadProgress && request.upload) {\\n      ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\\n\\n      request.upload.addEventListener('progress', uploadThrottled);\\n\\n      request.upload.addEventListener('loadend', flushUpload);\\n    }\\n\\n    if (_config.cancelToken || _config.signal) {\\n      // Handle cancellation\\n      // eslint-disable-next-line func-names\\n      onCanceled = cancel => {\\n        if (!request) {\\n          return;\\n        }\\n        reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\\n        request.abort();\\n        request = null;\\n      };\\n\\n      _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\\n      if (_config.signal) {\\n        _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\\n      }\\n    }\\n\\n    const protocol = parseProtocol(_config.url);\\n\\n    if (protocol && platform.protocols.indexOf(protocol) === -1) {\\n      reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\\n      return;\\n    }\\n\\n\\n    // Send the request\\n    request.send(requestData || null);\\n  });\\n}\\n\",\"'use strict';\\n\\nexport default function parseProtocol(url) {\\n  const match = /^([-+\\\\w]{1,25})(:?\\\\/\\\\/|:)/.exec(url);\\n  return match && match[1] || '';\\n}\\n\",\"import CanceledError from \\\"../cancel/CanceledError.js\\\";\\nimport AxiosError from \\\"../core/AxiosError.js\\\";\\nimport utils from '../utils.js';\\n\\nconst composeSignals = (signals, timeout) => {\\n  const {length} = (signals = signals ? signals.filter(Boolean) : []);\\n\\n  if (timeout || length) {\\n    let controller = new AbortController();\\n\\n    let aborted;\\n\\n    const onabort = function (reason) {\\n      if (!aborted) {\\n        aborted = true;\\n        unsubscribe();\\n        const err = reason instanceof Error ? reason : this.reason;\\n        controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\\n      }\\n    }\\n\\n    let timer = timeout && setTimeout(() => {\\n      timer = null;\\n      onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\\n    }, timeout)\\n\\n    const unsubscribe = () => {\\n      if (signals) {\\n        timer && clearTimeout(timer);\\n        timer = null;\\n        signals.forEach(signal => {\\n          signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\\n        });\\n        signals = null;\\n      }\\n    }\\n\\n    signals.forEach((signal) => signal.addEventListener('abort', onabort));\\n\\n    const {signal} = controller;\\n\\n    signal.unsubscribe = () => utils.asap(unsubscribe);\\n\\n    return signal;\\n  }\\n}\\n\\nexport default composeSignals;\\n\",\"\\nexport const streamChunk = function* (chunk, chunkSize) {\\n  let len = chunk.byteLength;\\n\\n  if (!chunkSize || len < chunkSize) {\\n    yield chunk;\\n    return;\\n  }\\n\\n  let pos = 0;\\n  let end;\\n\\n  while (pos < len) {\\n    end = pos + chunkSize;\\n    yield chunk.slice(pos, end);\\n    pos = end;\\n  }\\n}\\n\\nexport const readBytes = async function* (iterable, chunkSize) {\\n  for await (const chunk of readStream(iterable)) {\\n    yield* streamChunk(chunk, chunkSize);\\n  }\\n}\\n\\nconst readStream = async function* (stream) {\\n  if (stream[Symbol.asyncIterator]) {\\n    yield* stream;\\n    return;\\n  }\\n\\n  const reader = stream.getReader();\\n  try {\\n    for (;;) {\\n      const {done, value} = await reader.read();\\n      if (done) {\\n        break;\\n      }\\n      yield value;\\n    }\\n  } finally {\\n    await reader.cancel();\\n  }\\n}\\n\\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\\n  const iterator = readBytes(stream, chunkSize);\\n\\n  let bytes = 0;\\n  let done;\\n  let _onFinish = (e) => {\\n    if (!done) {\\n      done = true;\\n      onFinish && onFinish(e);\\n    }\\n  }\\n\\n  return new ReadableStream({\\n    async pull(controller) {\\n      try {\\n        const {done, value} = await iterator.next();\\n\\n        if (done) {\\n         _onFinish();\\n          controller.close();\\n          return;\\n        }\\n\\n        let len = value.byteLength;\\n        if (onProgress) {\\n          let loadedBytes = bytes += len;\\n          onProgress(loadedBytes);\\n        }\\n        controller.enqueue(new Uint8Array(value));\\n      } catch (err) {\\n        _onFinish(err);\\n        throw err;\\n      }\\n    },\\n    cancel(reason) {\\n      _onFinish(reason);\\n      return iterator.return();\\n    }\\n  }, {\\n    highWaterMark: 2\\n  })\\n}\\n\",\"import platform from \\\"../platform/index.js\\\";\\nimport utils from \\\"../utils.js\\\";\\nimport AxiosError from \\\"../core/AxiosError.js\\\";\\nimport composeSignals from \\\"../helpers/composeSignals.js\\\";\\nimport {trackStream} from \\\"../helpers/trackStream.js\\\";\\nimport AxiosHeaders from \\\"../core/AxiosHeaders.js\\\";\\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \\\"../helpers/progressEventReducer.js\\\";\\nimport resolveConfig from \\\"../helpers/resolveConfig.js\\\";\\nimport settle from \\\"../core/settle.js\\\";\\n\\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\\n\\nconst {isFunction} = utils;\\n\\nconst globalFetchAPI = (({Request, Response}) => ({\\n  Request, Response\\n}))(utils.global);\\n\\nconst {\\n  ReadableStream, TextEncoder\\n} = utils.global;\\n\\n\\nconst test = (fn, ...args) => {\\n  try {\\n    return !!fn(...args);\\n  } catch (e) {\\n    return false\\n  }\\n}\\n\\nconst factory = (env) => {\\n  env = utils.merge.call({\\n    skipUndefined: true\\n  }, globalFetchAPI, env);\\n\\n  const {fetch: envFetch, Request, Response} = env;\\n  const isFetchSupported = envFetch ? isFunction(envFetch) : typeof fetch === 'function';\\n  const isRequestSupported = isFunction(Request);\\n  const isResponseSupported = isFunction(Response);\\n\\n  if (!isFetchSupported) {\\n    return false;\\n  }\\n\\n  const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);\\n\\n  const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\\n      ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\\n      async (str) => new Uint8Array(await new Request(str).arrayBuffer())\\n  );\\n\\n  const supportsRequestStream = isRequestSupported && isReadableStreamSupported && test(() => {\\n    let duplexAccessed = false;\\n\\n    const hasContentType = new Request(platform.origin, {\\n      body: new ReadableStream(),\\n      method: 'POST',\\n      get duplex() {\\n        duplexAccessed = true;\\n        return 'half';\\n      },\\n    }).headers.has('Content-Type');\\n\\n    return duplexAccessed && !hasContentType;\\n  });\\n\\n  const supportsResponseStream = isResponseSupported && isReadableStreamSupported &&\\n    test(() => utils.isReadableStream(new Response('').body));\\n\\n  const resolvers = {\\n    stream: supportsResponseStream && ((res) => res.body)\\n  };\\n\\n  isFetchSupported && ((() => {\\n    ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\\n      !resolvers[type] && (resolvers[type] = (res, config) => {\\n        let method = res && res[type];\\n\\n        if (method) {\\n          return method.call(res);\\n        }\\n\\n        throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\\n      })\\n    });\\n  })());\\n\\n  const getBodyLength = async (body) => {\\n    if (body == null) {\\n      return 0;\\n    }\\n\\n    if (utils.isBlob(body)) {\\n      return body.size;\\n    }\\n\\n    if (utils.isSpecCompliantForm(body)) {\\n      const _request = new Request(platform.origin, {\\n        method: 'POST',\\n        body,\\n      });\\n      return (await _request.arrayBuffer()).byteLength;\\n    }\\n\\n    if (utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\\n      return body.byteLength;\\n    }\\n\\n    if (utils.isURLSearchParams(body)) {\\n      body = body + '';\\n    }\\n\\n    if (utils.isString(body)) {\\n      return (await encodeText(body)).byteLength;\\n    }\\n  }\\n\\n  const resolveBodyLength = async (headers, body) => {\\n    const length = utils.toFiniteNumber(headers.getContentLength());\\n\\n    return length == null ? getBodyLength(body) : length;\\n  }\\n\\n  return async (config) => {\\n    let {\\n      url,\\n      method,\\n      data,\\n      signal,\\n      cancelToken,\\n      timeout,\\n      onDownloadProgress,\\n      onUploadProgress,\\n      responseType,\\n      headers,\\n      withCredentials = 'same-origin',\\n      fetchOptions\\n    } = resolveConfig(config);\\n\\n    let _fetch = envFetch || fetch;\\n\\n    responseType = responseType ? (responseType + '').toLowerCase() : 'text';\\n\\n    let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\\n\\n    let request = null;\\n\\n    const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\\n      composedSignal.unsubscribe();\\n    });\\n\\n    let requestContentLength;\\n\\n    try {\\n      if (\\n        onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\\n        (requestContentLength = await resolveBodyLength(headers, data)) !== 0\\n      ) {\\n        let _request = new Request(url, {\\n          method: 'POST',\\n          body: data,\\n          duplex: \\\"half\\\"\\n        });\\n\\n        let contentTypeHeader;\\n\\n        if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\\n          headers.setContentType(contentTypeHeader)\\n        }\\n\\n        if (_request.body) {\\n          const [onProgress, flush] = progressEventDecorator(\\n            requestContentLength,\\n            progressEventReducer(asyncDecorator(onUploadProgress))\\n          );\\n\\n          data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\\n        }\\n      }\\n\\n      if (!utils.isString(withCredentials)) {\\n        withCredentials = withCredentials ? 'include' : 'omit';\\n      }\\n\\n      // Cloudflare Workers throws when credentials are defined\\n      // see https://github.com/cloudflare/workerd/issues/902\\n      const isCredentialsSupported = isRequestSupported && \\\"credentials\\\" in Request.prototype;\\n\\n      const resolvedOptions = {\\n        ...fetchOptions,\\n        signal: composedSignal,\\n        method: method.toUpperCase(),\\n        headers: headers.normalize().toJSON(),\\n        body: data,\\n        duplex: \\\"half\\\",\\n        credentials: isCredentialsSupported ? withCredentials : undefined\\n      };\\n\\n      request = isRequestSupported && new Request(url, resolvedOptions);\\n\\n      let response = await (isRequestSupported ? _fetch(request, fetchOptions) : _fetch(url, resolvedOptions));\\n\\n      const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\\n\\n      if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\\n        const options = {};\\n\\n        ['status', 'statusText', 'headers'].forEach(prop => {\\n          options[prop] = response[prop];\\n        });\\n\\n        const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\\n\\n        const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\\n          responseContentLength,\\n          progressEventReducer(asyncDecorator(onDownloadProgress), true)\\n        ) || [];\\n\\n        response = new Response(\\n          trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\\n            flush && flush();\\n            unsubscribe && unsubscribe();\\n          }),\\n          options\\n        );\\n      }\\n\\n      responseType = responseType || 'text';\\n\\n      let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\\n\\n      !isStreamResponse && unsubscribe && unsubscribe();\\n\\n      return await new Promise((resolve, reject) => {\\n        settle(resolve, reject, {\\n          data: responseData,\\n          headers: AxiosHeaders.from(response.headers),\\n          status: response.status,\\n          statusText: response.statusText,\\n          config,\\n          request\\n        })\\n      })\\n    } catch (err) {\\n      unsubscribe && unsubscribe();\\n\\n      if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {\\n        throw Object.assign(\\n          new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\\n          {\\n            cause: err.cause || err\\n          }\\n        )\\n      }\\n\\n      throw AxiosError.from(err, err && err.code, config, request);\\n    }\\n  }\\n}\\n\\nconst seedCache = new Map();\\n\\nexport const getFetch = (config) => {\\n  let env = config ? config.env : {};\\n  const {fetch, Request, Response} = env;\\n  const seeds = [\\n    Request, Response, fetch\\n  ];\\n\\n  let len = seeds.length, i = len,\\n    seed, target, map = seedCache;\\n\\n  while (i--) {\\n    seed = seeds[i];\\n    target = map.get(seed);\\n\\n    target === undefined && map.set(seed, target = (i ? new Map() : factory(env)))\\n\\n    map = target;\\n  }\\n\\n  return target;\\n};\\n\\nconst adapter = getFetch();\\n\\nexport default adapter;\\n\",\"import utils from '../utils.js';\\nimport httpAdapter from './http.js';\\nimport xhrAdapter from './xhr.js';\\nimport * as fetchAdapter from './fetch.js';\\nimport AxiosError from \\\"../core/AxiosError.js\\\";\\n\\nconst knownAdapters = {\\n  http: httpAdapter,\\n  xhr: xhrAdapter,\\n  fetch: {\\n    get: fetchAdapter.getFetch,\\n  }\\n}\\n\\nutils.forEach(knownAdapters, (fn, value) => {\\n  if (fn) {\\n    try {\\n      Object.defineProperty(fn, 'name', {value});\\n    } catch (e) {\\n      // eslint-disable-next-line no-empty\\n    }\\n    Object.defineProperty(fn, 'adapterName', {value});\\n  }\\n});\\n\\nconst renderReason = (reason) => `- ${reason}`;\\n\\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\\n\\nexport default {\\n  getAdapter: (adapters, config) => {\\n    adapters = utils.isArray(adapters) ? adapters : [adapters];\\n\\n    const {length} = adapters;\\n    let nameOrAdapter;\\n    let adapter;\\n\\n    const rejectedReasons = {};\\n\\n    for (let i = 0; i < length; i++) {\\n      nameOrAdapter = adapters[i];\\n      let id;\\n\\n      adapter = nameOrAdapter;\\n\\n      if (!isResolvedHandle(nameOrAdapter)) {\\n        adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\\n\\n        if (adapter === undefined) {\\n          throw new AxiosError(`Unknown adapter '${id}'`);\\n        }\\n      }\\n\\n      if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {\\n        break;\\n      }\\n\\n      rejectedReasons[id || '#' + i] = adapter;\\n    }\\n\\n    if (!adapter) {\\n\\n      const reasons = Object.entries(rejectedReasons)\\n        .map(([id, state]) => `adapter ${id} ` +\\n          (state === false ? 'is not supported by the environment' : 'is not available in the build')\\n        );\\n\\n      let s = length ?\\n        (reasons.length > 1 ? 'since :\\\\n' + reasons.map(renderReason).join('\\\\n') : ' ' + renderReason(reasons[0])) :\\n        'as no adapter specified';\\n\\n      throw new AxiosError(\\n        `There is no suitable adapter to dispatch the request ` + s,\\n        'ERR_NOT_SUPPORT'\\n      );\\n    }\\n\\n    return adapter;\\n  },\\n  adapters: knownAdapters\\n}\\n\",\"// eslint-disable-next-line strict\\nexport default null;\\n\",\"'use strict';\\n\\nimport transformData from './transformData.js';\\nimport isCancel from '../cancel/isCancel.js';\\nimport defaults from '../defaults/index.js';\\nimport CanceledError from '../cancel/CanceledError.js';\\nimport AxiosHeaders from '../core/AxiosHeaders.js';\\nimport adapters from \\\"../adapters/adapters.js\\\";\\n\\n/**\\n * Throws a `CanceledError` if cancellation has been requested.\\n *\\n * @param {Object} config The config that is to be used for the request\\n *\\n * @returns {void}\\n */\\nfunction throwIfCancellationRequested(config) {\\n  if (config.cancelToken) {\\n    config.cancelToken.throwIfRequested();\\n  }\\n\\n  if (config.signal && config.signal.aborted) {\\n    throw new CanceledError(null, config);\\n  }\\n}\\n\\n/**\\n * Dispatch a request to the server using the configured adapter.\\n *\\n * @param {object} config The config that is to be used for the request\\n *\\n * @returns {Promise} The Promise to be fulfilled\\n */\\nexport default function dispatchRequest(config) {\\n  throwIfCancellationRequested(config);\\n\\n  config.headers = AxiosHeaders.from(config.headers);\\n\\n  // Transform request data\\n  config.data = transformData.call(\\n    config,\\n    config.transformRequest\\n  );\\n\\n  if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\\n    config.headers.setContentType('application/x-www-form-urlencoded', false);\\n  }\\n\\n  const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);\\n\\n  return adapter(config).then(function onAdapterResolution(response) {\\n    throwIfCancellationRequested(config);\\n\\n    // Transform response data\\n    response.data = transformData.call(\\n      config,\\n      config.transformResponse,\\n      response\\n    );\\n\\n    response.headers = AxiosHeaders.from(response.headers);\\n\\n    return response;\\n  }, function onAdapterRejection(reason) {\\n    if (!isCancel(reason)) {\\n      throwIfCancellationRequested(config);\\n\\n      // Transform response data\\n      if (reason && reason.response) {\\n        reason.response.data = transformData.call(\\n          config,\\n          config.transformResponse,\\n          reason.response\\n        );\\n        reason.response.headers = AxiosHeaders.from(reason.response.headers);\\n      }\\n    }\\n\\n    return Promise.reject(reason);\\n  });\\n}\\n\",\"export const VERSION = \\\"1.12.2\\\";\",\"'use strict';\\n\\nimport {VERSION} from '../env/data.js';\\nimport AxiosError from '../core/AxiosError.js';\\n\\nconst validators = {};\\n\\n// eslint-disable-next-line func-names\\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\\n  validators[type] = function validator(thing) {\\n    return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\\n  };\\n});\\n\\nconst deprecatedWarnings = {};\\n\\n/**\\n * Transitional option validator\\n *\\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\\n * @param {string?} version - deprecated version / removed since version\\n * @param {string?} message - some message with additional info\\n *\\n * @returns {function}\\n */\\nvalidators.transitional = function transitional(validator, version, message) {\\n  function formatMessage(opt, desc) {\\n    return '[Axios v' + VERSION + '] Transitional option \\\\'' + opt + '\\\\'' + desc + (message ? '. ' + message : '');\\n  }\\n\\n  // eslint-disable-next-line func-names\\n  return (value, opt, opts) => {\\n    if (validator === false) {\\n      throw new AxiosError(\\n        formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\\n        AxiosError.ERR_DEPRECATED\\n      );\\n    }\\n\\n    if (version && !deprecatedWarnings[opt]) {\\n      deprecatedWarnings[opt] = true;\\n      // eslint-disable-next-line no-console\\n      console.warn(\\n        formatMessage(\\n          opt,\\n          ' has been deprecated since v' + version + ' and will be removed in the near future'\\n        )\\n      );\\n    }\\n\\n    return validator ? validator(value, opt, opts) : true;\\n  };\\n};\\n\\nvalidators.spelling = function spelling(correctSpelling) {\\n  return (value, opt) => {\\n    // eslint-disable-next-line no-console\\n    console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\\n    return true;\\n  }\\n};\\n\\n/**\\n * Assert object's properties type\\n *\\n * @param {object} options\\n * @param {object} schema\\n * @param {boolean?} allowUnknown\\n *\\n * @returns {object}\\n */\\n\\nfunction assertOptions(options, schema, allowUnknown) {\\n  if (typeof options !== 'object') {\\n    throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\\n  }\\n  const keys = Object.keys(options);\\n  let i = keys.length;\\n  while (i-- > 0) {\\n    const opt = keys[i];\\n    const validator = schema[opt];\\n    if (validator) {\\n      const value = options[opt];\\n      const result = value === undefined || validator(value, opt, options);\\n      if (result !== true) {\\n        throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\\n      }\\n      continue;\\n    }\\n    if (allowUnknown !== true) {\\n      throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\\n    }\\n  }\\n}\\n\\nexport default {\\n  assertOptions,\\n  validators\\n};\\n\",\"'use strict';\\n\\nimport utils from './../utils.js';\\nimport buildURL from '../helpers/buildURL.js';\\nimport InterceptorManager from './InterceptorManager.js';\\nimport dispatchRequest from './dispatchRequest.js';\\nimport mergeConfig from './mergeConfig.js';\\nimport buildFullPath from './buildFullPath.js';\\nimport validator from '../helpers/validator.js';\\nimport AxiosHeaders from './AxiosHeaders.js';\\n\\nconst validators = validator.validators;\\n\\n/**\\n * Create a new instance of Axios\\n *\\n * @param {Object} instanceConfig The default config for the instance\\n *\\n * @return {Axios} A new instance of Axios\\n */\\nclass Axios {\\n  constructor(instanceConfig) {\\n    this.defaults = instanceConfig || {};\\n    this.interceptors = {\\n      request: new InterceptorManager(),\\n      response: new InterceptorManager()\\n    };\\n  }\\n\\n  /**\\n   * Dispatch a request\\n   *\\n   * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\\n   * @param {?Object} config\\n   *\\n   * @returns {Promise} The Promise to be fulfilled\\n   */\\n  async request(configOrUrl, config) {\\n    try {\\n      return await this._request(configOrUrl, config);\\n    } catch (err) {\\n      if (err instanceof Error) {\\n        let dummy = {};\\n\\n        Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\\n\\n        // slice off the Error: ... line\\n        const stack = dummy.stack ? dummy.stack.replace(/^.+\\\\n/, '') : '';\\n        try {\\n          if (!err.stack) {\\n            err.stack = stack;\\n            // match without the 2 top stack lines\\n          } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\\\n.+\\\\n/, ''))) {\\n            err.stack += '\\\\n' + stack\\n          }\\n        } catch (e) {\\n          // ignore the case where \\\"stack\\\" is an un-writable property\\n        }\\n      }\\n\\n      throw err;\\n    }\\n  }\\n\\n  _request(configOrUrl, config) {\\n    /*eslint no-param-reassign:0*/\\n    // Allow for axios('example/url'[, config]) a la fetch API\\n    if (typeof configOrUrl === 'string') {\\n      config = config || {};\\n      config.url = configOrUrl;\\n    } else {\\n      config = configOrUrl || {};\\n    }\\n\\n    config = mergeConfig(this.defaults, config);\\n\\n    const {transitional, paramsSerializer, headers} = config;\\n\\n    if (transitional !== undefined) {\\n      validator.assertOptions(transitional, {\\n        silentJSONParsing: validators.transitional(validators.boolean),\\n        forcedJSONParsing: validators.transitional(validators.boolean),\\n        clarifyTimeoutError: validators.transitional(validators.boolean)\\n      }, false);\\n    }\\n\\n    if (paramsSerializer != null) {\\n      if (utils.isFunction(paramsSerializer)) {\\n        config.paramsSerializer = {\\n          serialize: paramsSerializer\\n        }\\n      } else {\\n        validator.assertOptions(paramsSerializer, {\\n          encode: validators.function,\\n          serialize: validators.function\\n        }, true);\\n      }\\n    }\\n\\n    // Set config.allowAbsoluteUrls\\n    if (config.allowAbsoluteUrls !== undefined) {\\n      // do nothing\\n    } else if (this.defaults.allowAbsoluteUrls !== undefined) {\\n      config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\\n    } else {\\n      config.allowAbsoluteUrls = true;\\n    }\\n\\n    validator.assertOptions(config, {\\n      baseUrl: validators.spelling('baseURL'),\\n      withXsrfToken: validators.spelling('withXSRFToken')\\n    }, true);\\n\\n    // Set config.method\\n    config.method = (config.method || this.defaults.method || 'get').toLowerCase();\\n\\n    // Flatten headers\\n    let contextHeaders = headers && utils.merge(\\n      headers.common,\\n      headers[config.method]\\n    );\\n\\n    headers && utils.forEach(\\n      ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\\n      (method) => {\\n        delete headers[method];\\n      }\\n    );\\n\\n    config.headers = AxiosHeaders.concat(contextHeaders, headers);\\n\\n    // filter out skipped interceptors\\n    const requestInterceptorChain = [];\\n    let synchronousRequestInterceptors = true;\\n    this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\\n      if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\\n        return;\\n      }\\n\\n      synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\\n\\n      requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\\n    });\\n\\n    const responseInterceptorChain = [];\\n    this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\\n      responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\\n    });\\n\\n    let promise;\\n    let i = 0;\\n    let len;\\n\\n    if (!synchronousRequestInterceptors) {\\n      const chain = [dispatchRequest.bind(this), undefined];\\n      chain.unshift(...requestInterceptorChain);\\n      chain.push(...responseInterceptorChain);\\n      len = chain.length;\\n\\n      promise = Promise.resolve(config);\\n\\n      while (i < len) {\\n        promise = promise.then(chain[i++], chain[i++]);\\n      }\\n\\n      return promise;\\n    }\\n\\n    len = requestInterceptorChain.length;\\n\\n    let newConfig = config;\\n\\n    while (i < len) {\\n      const onFulfilled = requestInterceptorChain[i++];\\n      const onRejected = requestInterceptorChain[i++];\\n      try {\\n        newConfig = onFulfilled(newConfig);\\n      } catch (error) {\\n        onRejected.call(this, error);\\n        break;\\n      }\\n    }\\n\\n    try {\\n      promise = dispatchRequest.call(this, newConfig);\\n    } catch (error) {\\n      return Promise.reject(error);\\n    }\\n\\n    i = 0;\\n    len = responseInterceptorChain.length;\\n\\n    while (i < len) {\\n      promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\\n    }\\n\\n    return promise;\\n  }\\n\\n  getUri(config) {\\n    config = mergeConfig(this.defaults, config);\\n    const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\\n    return buildURL(fullPath, config.params, config.paramsSerializer);\\n  }\\n}\\n\\n// Provide aliases for supported request methods\\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\\n  /*eslint func-names:0*/\\n  Axios.prototype[method] = function(url, config) {\\n    return this.request(mergeConfig(config || {}, {\\n      method,\\n      url,\\n      data: (config || {}).data\\n    }));\\n  };\\n});\\n\\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\\n  /*eslint func-names:0*/\\n\\n  function generateHTTPMethod(isForm) {\\n    return function httpMethod(url, data, config) {\\n      return this.request(mergeConfig(config || {}, {\\n        method,\\n        headers: isForm ? {\\n          'Content-Type': 'multipart/form-data'\\n        } : {},\\n        url,\\n        data\\n      }));\\n    };\\n  }\\n\\n  Axios.prototype[method] = generateHTTPMethod();\\n\\n  Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\\n});\\n\\nexport default Axios;\\n\",\"'use strict';\\n\\nimport CanceledError from './CanceledError.js';\\n\\n/**\\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\\n *\\n * @param {Function} executor The executor function.\\n *\\n * @returns {CancelToken}\\n */\\nclass CancelToken {\\n  constructor(executor) {\\n    if (typeof executor !== 'function') {\\n      throw new TypeError('executor must be a function.');\\n    }\\n\\n    let resolvePromise;\\n\\n    this.promise = new Promise(function promiseExecutor(resolve) {\\n      resolvePromise = resolve;\\n    });\\n\\n    const token = this;\\n\\n    // eslint-disable-next-line func-names\\n    this.promise.then(cancel => {\\n      if (!token._listeners) return;\\n\\n      let i = token._listeners.length;\\n\\n      while (i-- > 0) {\\n        token._listeners[i](cancel);\\n      }\\n      token._listeners = null;\\n    });\\n\\n    // eslint-disable-next-line func-names\\n    this.promise.then = onfulfilled => {\\n      let _resolve;\\n      // eslint-disable-next-line func-names\\n      const promise = new Promise(resolve => {\\n        token.subscribe(resolve);\\n        _resolve = resolve;\\n      }).then(onfulfilled);\\n\\n      promise.cancel = function reject() {\\n        token.unsubscribe(_resolve);\\n      };\\n\\n      return promise;\\n    };\\n\\n    executor(function cancel(message, config, request) {\\n      if (token.reason) {\\n        // Cancellation has already been requested\\n        return;\\n      }\\n\\n      token.reason = new CanceledError(message, config, request);\\n      resolvePromise(token.reason);\\n    });\\n  }\\n\\n  /**\\n   * Throws a `CanceledError` if cancellation has been requested.\\n   */\\n  throwIfRequested() {\\n    if (this.reason) {\\n      throw this.reason;\\n    }\\n  }\\n\\n  /**\\n   * Subscribe to the cancel signal\\n   */\\n\\n  subscribe(listener) {\\n    if (this.reason) {\\n      listener(this.reason);\\n      return;\\n    }\\n\\n    if (this._listeners) {\\n      this._listeners.push(listener);\\n    } else {\\n      this._listeners = [listener];\\n    }\\n  }\\n\\n  /**\\n   * Unsubscribe from the cancel signal\\n   */\\n\\n  unsubscribe(listener) {\\n    if (!this._listeners) {\\n      return;\\n    }\\n    const index = this._listeners.indexOf(listener);\\n    if (index !== -1) {\\n      this._listeners.splice(index, 1);\\n    }\\n  }\\n\\n  toAbortSignal() {\\n    const controller = new AbortController();\\n\\n    const abort = (err) => {\\n      controller.abort(err);\\n    };\\n\\n    this.subscribe(abort);\\n\\n    controller.signal.unsubscribe = () => this.unsubscribe(abort);\\n\\n    return controller.signal;\\n  }\\n\\n  /**\\n   * Returns an object that contains a new `CancelToken` and a function that, when called,\\n   * cancels the `CancelToken`.\\n   */\\n  static source() {\\n    let cancel;\\n    const token = new CancelToken(function executor(c) {\\n      cancel = c;\\n    });\\n    return {\\n      token,\\n      cancel\\n    };\\n  }\\n}\\n\\nexport default CancelToken;\\n\",\"const HttpStatusCode = {\\n  Continue: 100,\\n  SwitchingProtocols: 101,\\n  Processing: 102,\\n  EarlyHints: 103,\\n  Ok: 200,\\n  Created: 201,\\n  Accepted: 202,\\n  NonAuthoritativeInformation: 203,\\n  NoContent: 204,\\n  ResetContent: 205,\\n  PartialContent: 206,\\n  MultiStatus: 207,\\n  AlreadyReported: 208,\\n  ImUsed: 226,\\n  MultipleChoices: 300,\\n  MovedPermanently: 301,\\n  Found: 302,\\n  SeeOther: 303,\\n  NotModified: 304,\\n  UseProxy: 305,\\n  Unused: 306,\\n  TemporaryRedirect: 307,\\n  PermanentRedirect: 308,\\n  BadRequest: 400,\\n  Unauthorized: 401,\\n  PaymentRequired: 402,\\n  Forbidden: 403,\\n  NotFound: 404,\\n  MethodNotAllowed: 405,\\n  NotAcceptable: 406,\\n  ProxyAuthenticationRequired: 407,\\n  RequestTimeout: 408,\\n  Conflict: 409,\\n  Gone: 410,\\n  LengthRequired: 411,\\n  PreconditionFailed: 412,\\n  PayloadTooLarge: 413,\\n  UriTooLong: 414,\\n  UnsupportedMediaType: 415,\\n  RangeNotSatisfiable: 416,\\n  ExpectationFailed: 417,\\n  ImATeapot: 418,\\n  MisdirectedRequest: 421,\\n  UnprocessableEntity: 422,\\n  Locked: 423,\\n  FailedDependency: 424,\\n  TooEarly: 425,\\n  UpgradeRequired: 426,\\n  PreconditionRequired: 428,\\n  TooManyRequests: 429,\\n  RequestHeaderFieldsTooLarge: 431,\\n  UnavailableForLegalReasons: 451,\\n  InternalServerError: 500,\\n  NotImplemented: 501,\\n  BadGateway: 502,\\n  ServiceUnavailable: 503,\\n  GatewayTimeout: 504,\\n  HttpVersionNotSupported: 505,\\n  VariantAlsoNegotiates: 506,\\n  InsufficientStorage: 507,\\n  LoopDetected: 508,\\n  NotExtended: 510,\\n  NetworkAuthenticationRequired: 511,\\n};\\n\\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\\n  HttpStatusCode[value] = key;\\n});\\n\\nexport default HttpStatusCode;\\n\",\"'use strict';\\n\\nimport utils from './utils.js';\\nimport bind from './helpers/bind.js';\\nimport Axios from './core/Axios.js';\\nimport mergeConfig from './core/mergeConfig.js';\\nimport defaults from './defaults/index.js';\\nimport formDataToJSON from './helpers/formDataToJSON.js';\\nimport CanceledError from './cancel/CanceledError.js';\\nimport CancelToken from './cancel/CancelToken.js';\\nimport isCancel from './cancel/isCancel.js';\\nimport {VERSION} from './env/data.js';\\nimport toFormData from './helpers/toFormData.js';\\nimport AxiosError from './core/AxiosError.js';\\nimport spread from './helpers/spread.js';\\nimport isAxiosError from './helpers/isAxiosError.js';\\nimport AxiosHeaders from \\\"./core/AxiosHeaders.js\\\";\\nimport adapters from './adapters/adapters.js';\\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\\n\\n/**\\n * Create an instance of Axios\\n *\\n * @param {Object} defaultConfig The default config for the instance\\n *\\n * @returns {Axios} A new instance of Axios\\n */\\nfunction createInstance(defaultConfig) {\\n  const context = new Axios(defaultConfig);\\n  const instance = bind(Axios.prototype.request, context);\\n\\n  // Copy axios.prototype to instance\\n  utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\\n\\n  // Copy context to instance\\n  utils.extend(instance, context, null, {allOwnKeys: true});\\n\\n  // Factory for creating new instances\\n  instance.create = function create(instanceConfig) {\\n    return createInstance(mergeConfig(defaultConfig, instanceConfig));\\n  };\\n\\n  return instance;\\n}\\n\\n// Create the default instance to be exported\\nconst axios = createInstance(defaults);\\n\\n// Expose Axios class to allow class inheritance\\naxios.Axios = Axios;\\n\\n// Expose Cancel & CancelToken\\naxios.CanceledError = CanceledError;\\naxios.CancelToken = CancelToken;\\naxios.isCancel = isCancel;\\naxios.VERSION = VERSION;\\naxios.toFormData = toFormData;\\n\\n// Expose AxiosError class\\naxios.AxiosError = AxiosError;\\n\\n// alias for CanceledError for backward compatibility\\naxios.Cancel = axios.CanceledError;\\n\\n// Expose all/spread\\naxios.all = function all(promises) {\\n  return Promise.all(promises);\\n};\\n\\naxios.spread = spread;\\n\\n// Expose isAxiosError\\naxios.isAxiosError = isAxiosError;\\n\\n// Expose mergeConfig\\naxios.mergeConfig = mergeConfig;\\n\\naxios.AxiosHeaders = AxiosHeaders;\\n\\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\\n\\naxios.getAdapter = adapters.getAdapter;\\n\\naxios.HttpStatusCode = HttpStatusCode;\\n\\naxios.default = axios;\\n\\n// this module should only have a default export\\nexport default axios\\n\",\"'use strict';\\n\\n/**\\n * Syntactic sugar for invoking a function and expanding an array for arguments.\\n *\\n * Common use case would be to use `Function.prototype.apply`.\\n *\\n *  ```js\\n *  function f(x, y, z) {}\\n *  var args = [1, 2, 3];\\n *  f.apply(null, args);\\n *  ```\\n *\\n * With `spread` this example can be re-written.\\n *\\n *  ```js\\n *  spread(function(x, y, z) {})([1, 2, 3]);\\n *  ```\\n *\\n * @param {Function} callback\\n *\\n * @returns {Function}\\n */\\nexport default function spread(callback) {\\n  return function wrap(arr) {\\n    return callback.apply(null, arr);\\n  };\\n}\\n\",\"'use strict';\\n\\nimport utils from './../utils.js';\\n\\n/**\\n * Determines whether the payload is an error thrown by Axios\\n *\\n * @param {*} payload The value to test\\n *\\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\\n */\\nexport default function isAxiosError(payload) {\\n  return utils.isObject(payload) && (payload.isAxiosError === true);\\n}\\n\",\"import axios from 'axios';\\nimport * as DPlayerType from './types';\\n\\nconst defaultApiBackend: DPlayerType.APIBackend = {\\n    send: (options) => {\\n        if (options.url === undefined) {\\n            options.error && options.error();\\n            return;\\n        }\\n        axios\\n            .post(options.url, options.data)\\n            .then((response) => {\\n                const data = response.data;\\n                if (!data || data.code !== 0) {\\n                    options.error && options.error(data && data.msg);\\n                    return;\\n                }\\n                options.success && options.success();\\n            })\\n            .catch((e) => {\\n                console.error(e);\\n                options.error && options.error();\\n            });\\n    },\\n\\n    read: (options) => {\\n        if (options.url === undefined) {\\n            options.error && options.error();\\n            return;\\n        }\\n        axios\\n            .get(options.url)\\n            .then((response) => {\\n                const data = response.data;\\n                if (!data || data.code !== 0) {\\n                    options.error && options.error(data && data.msg);\\n                    return;\\n                }\\n                if (data.data) {\\n                    options.success &&\\n                        options.success((data.data as any[][]).map((item) => ({\\n                            author: item[3],\\n                            time: item[0],\\n                            text: item[4],\\n                            color: item[2],\\n                            type: item[1],\\n                            size: (item[5] ? (((item[5] === 'big') || (item[5] === 'small')) ? item[5] : 'medium') : 'medium'),\\n                        })));\\n                } else {\\n                    options.success &&\\n                        options.success([{\\n                            author: '',\\n                            time: 0,\\n                            text: '',\\n                            color: '#ffeaea',\\n                            type: 'right',\\n                            size: 'medium',\\n                        }]);\\n                }\\n            })\\n            .catch((e) => {\\n                console.error(e);\\n                options.error && options.error();\\n            });\\n    },\\n};\\nexport default defaultApiBackend;\\n\",\"/*\\nW3C def language codes is :\\n    language-code = primary-code ( \\\"-\\\" subcode )\\n        primary-code    ISO 639-1   ( the names of language with 2 code )\\n        subcode         ISO 3166    ( the names of countries )\\n\\nNOTE: use lowercase to prevent case typo from user!\\nUse this as shown below..... */\\n\\nfunction i18n(this: any, lang: string) {\\n    this.lang = lang;\\n    if (this.lang === 'ja') {\\n        this.lang = 'ja-jp';\\n    }\\n    this.tran = (text: string, ...arg: Array<string | number>): string => {\\n        let result = text;\\n        // @ts-expect-error TS(7053): Element implicitly has an 'any' type because expre... Remove this comment to see the full error message\\n        if (tranTxt[this.lang] && tranTxt[this.lang][text]) {\\n            // @ts-expect-error TS(7053): Element implicitly has an 'any' type because expre... Remove this comment to see the full error message\\n            result = tranTxt[this.lang][text];\\n        }\\n        let i = 0;\\n        // @ts-expect-error TS(7053): Element implicitly has an 'any' type because expre... Remove this comment to see the full error message\\n        return result.replace(/%s/gi, () => arg[i++] ?? '');\\n    };\\n}\\n\\n// add translation text here\\nconst tranTxt = {\\n    'zh-cn': {\\n        'Danmaku is loading': '弹幕加载中',\\n        'Top': '顶部',\\n        'Bottom': '底部',\\n        'Rolling': '滚动',\\n        'Big': '大的',\\n        'Medium': '中等的',\\n        'Small': '小的',\\n        'Input danmaku, hit Enter': '输入弹幕, 回车发送',\\n        'About author': '关于作者',\\n        'DPlayer feedback': '播放器意见反馈',\\n        'About DPlayer': '关于 DPlayer 播放器',\\n        'Loop': '洗脑循环',\\n        'Speed': '速度',\\n        'Audio': '音频',\\n        'Primary audio': '主要音频',\\n        'Secondary audio': '辅助音频',\\n        'Opacity for danmaku': '弹幕透明度',\\n        'Normal': '正常',\\n        'Please input danmaku content': '请输入弹幕内容',\\n        'Set danmaku color': '设置弹幕颜色',\\n        'Set danmaku type': '设置弹幕类型',\\n        'Set danmaku size': '设置弹幕大小',\\n        'Show danmaku': '显示弹幕',\\n        'Video load failed': '视频加载失败',\\n        'Danmaku load failed': '弹幕加载失败',\\n        'Danmaku load partial failed': '弹幕加载部分失败',\\n        'Danmaku send failed': '弹幕发送失败',\\n        'Switching to': '正在切换至',\\n        'Switched to': '已经切换至',\\n        'Switching to quality': '正在切换至 %s 画质',\\n        'Switched to quality': '已经切换至 %s 画质',\\n        'Synchronize': '同步',\\n        'Synchronized': '同步的',\\n        'Quality': '画质',\\n        'FF': '快进',\\n        'REW': '快退',\\n        'FF progress': '快进 %s 秒',\\n        'REW progress': '快退 %s 秒',\\n        'Unlimited danmaku': '海量弹幕',\\n        'Send danmaku': '发送弹幕',\\n        'Setting': '设置',\\n        'Full screen': '全屏',\\n        'Web full screen': '页面全屏',\\n        'PIP': '画中画',\\n        'PIP not supported': '不支持画中画',\\n        'Not available': '不可用',\\n        'Send': '发送',\\n        'Screenshot': '截图',\\n        'AirPlay': '无线投屏',\\n        'Second': '秒',\\n        'Show comment': '显示弹幕',\\n        'Hide comment': '隐藏弹幕',\\n        'Show subtitle': '显示字幕',\\n        'Hide subtitle': '隐藏字幕',\\n        'Volume': '音量',\\n        'Live': '直播',\\n        'Video info': '视频统计信息',\\n    },\\n    'zh-tw': {\\n        'Danmaku is loading': '彈幕載入中',\\n        'Top': '頂部',\\n        'Bottom': '底部',\\n        'Rolling': '滾動',\\n        'Big': '大的',\\n        'Medium': '中等的',\\n        'Small': '小的',\\n        'Input danmaku, hit Enter': '輸入彈幕, Enter 發送',\\n        'About author': '關於作者',\\n        'DPlayer feedback': '播放器意見回饋',\\n        'About DPlayer': '關於 DPlayer 播放器',\\n        'Loop': '循環播放',\\n        'Speed': '速度',\\n        'Audio': '音頻',\\n        'Primary audio': '主要音頻',\\n        'Secondary audio': '輔助音頻',\\n        'Opacity for danmaku': '彈幕透明度',\\n        'Normal': '正常',\\n        'Please input danmaku content': '請輸入彈幕內容',\\n        'Set danmaku color': '設定彈幕顏色',\\n        'Set danmaku type': '設定彈幕類型',\\n        'Set danmaku size': '设置弹幕大小',\\n        'Show danmaku': '顯示彈幕',\\n        'Video load failed': '影片載入失敗',\\n        'Danmaku load failed': '彈幕載入失敗',\\n        'Danmaku load partial failed': '彈幕載入部分失敗',\\n        'Danmaku send failed': '彈幕發送失敗',\\n        'Switching to': '正在切換至',\\n        'Switched to': '已經切換至',\\n        'Switching to quality': '正在切換至 %s 畫質',\\n        'Switched to quality': '已經切換至 %s 畫質',\\n        'Synchronize': '同步',\\n        'Synchronized': '同步的',\\n        'Quality': '畫質',\\n        'FF': '快轉',\\n        'REW': '倒轉',\\n        'FF progress': '快轉 %s 秒',\\n        'REW progress': '倒轉 %s 秒',\\n        'Unlimited danmaku': '巨量彈幕',\\n        'Send danmaku': '發送彈幕',\\n        'Setting': '設定',\\n        'Full screen': '全螢幕',\\n        'Web full screen': '頁面全螢幕',\\n        'PIP': '畫中畫',\\n        'PIP not supported': '不支援畫中畫',\\n        'Not available': '不可用',\\n        'Send': '發送',\\n        'Screenshot': '截圖',\\n        'AirPlay': '無線投屏',\\n        'Second': '秒',\\n        'Show comment': '顯示彈幕',\\n        'Hide comment': '隱藏彈幕',\\n        'Show subtitle': '顯示字幕',\\n        'Hide subtitle': '隱藏字幕',\\n        'Volume': '音量',\\n        'Live': '直播',\\n        'Video info': '影片統計訊息',\\n    },\\n    'ja-jp': {\\n        'Danmaku is loading': 'コメントを読み込み中',\\n        'Top': '上固定',\\n        'Bottom': '下固定',\\n        'Rolling': 'スクロール',\\n        'Big': '大きめ',\\n        'Medium': '標準',\\n        'Small': '小さめ',\\n        'Input danmaku, hit Enter': '右のボタンを押すとコメントできます',\\n        'About author': '作者について',\\n        'DPlayer feedback': 'フィードバック',\\n        'About DPlayer': 'DPlayer について',\\n        'Loop': 'リピート再生',\\n        'Speed': '再生速度',\\n        'Audio': '音声',\\n        'Primary audio': '主音声',\\n        'Secondary audio': '副音声',\\n        'Opacity for danmaku': 'コメントの透明度',\\n        'Normal': '標準',\\n        'Please input danmaku content': 'コメント内容を入力して下さい!',\\n        'Set danmaku color': 'コメントの色',\\n        'Set danmaku type': 'コメントの位置',\\n        'Set danmaku size': 'コメントのサイズ',\\n        'Show danmaku': 'コメントを表示',\\n        'Video load failed': '動画の読み込みに失敗しました…',\\n        'Danmaku load failed': 'コメントの読み込みに失敗しました…',\\n        'Danmaku load partial failed': 'コメントの読み込みに失敗しました…',\\n        'Danmaku send failed': 'コメントの送信に失敗しました…',\\n        'Switching to': '画質を切り替えています…',\\n        'Switched to': '画質を切り替えました',\\n        'Switching to quality': '画質を %s に切り替えています…',\\n        'Switched to quality': '画質を %s 切り替えました',\\n        'Synchronize': '同期する',\\n        'Synchronized': '同期しました',\\n        'Quality': '画質',\\n        'FF': '早送り',\\n        'REW': '早戻し',\\n        'FF progress': '%s 秒早送り',\\n        'REW progress': '%s 秒早戻し',\\n        'Unlimited danmaku': 'コメントを無制限に表示',\\n        'Send danmaku': 'コメントする',\\n        'Setting': '設定',\\n        'Full screen': 'フルスクリーン',\\n        'Web full screen': 'ブラウザフルスクリーン',\\n        'PIP': 'Picture-in-Picture',\\n        'PIP not supported': 'Picture-in-Picture はサポートされていません',\\n        'Not available': '使用できません',\\n        'Send': 'コメントする',\\n        'Screenshot': 'スクリーンショット',\\n        'AirPlay': 'ワイヤレススクリーン',\\n        'Second': '秒',\\n        'Show comment': 'コメントを表示する',\\n        'Hide comment': 'コメントを表示しない',\\n        'Show subtitle': '字幕を表示する',\\n        'Hide subtitle': '字幕を表示しない',\\n        'Volume': '音量',\\n        'Live': 'Live',\\n        'Video info': '動画の統計情報',\\n    },\\n    'en': {\\n        'Danmaku is loading': 'Danmaku is loading',\\n        'Top': 'Top',\\n        'Bottom': 'Bottom',\\n        'Rolling': 'Rolling',\\n        'Big': 'Big',\\n        'Medium': 'Medium',\\n        'Small': 'Small',\\n        'Input danmaku, hit Enter': 'Input danmaku, hit Enter',\\n        'About author': 'About author',\\n        'DPlayer feedback': 'DPlayer feedback',\\n        'About DPlayer': 'About DPlayer',\\n        'Loop': 'Loop',\\n        'Speed': 'Speed',\\n        'Audio': 'Audio',\\n        'Primary audio': 'Primary audio',\\n        'Secondary audio': 'Secondary audio',\\n        'Opacity for danmaku': 'Opacity for danmaku',\\n        'Normal': 'Normal',\\n        'Please input danmaku content': 'Please input danmaku content',\\n        'Set danmaku color': 'Set danmaku color',\\n        'Set danmaku type': 'Set danmaku type',\\n        'Set danmaku size': 'Set danmaku size',\\n        'Show danmaku': 'Show danmaku',\\n        'Video load failed': 'Video load failed',\\n        'Danmaku load failed': 'Danmaku load failed',\\n        'Danmaku load partial failed': 'Danmaku load partial failed',\\n        'Danmaku send failed': 'Danmaku send failed',\\n        'Switching to': 'Switching to',\\n        'Switched to': 'Switched to',\\n        'Switching to quality': 'Switching to %s quality',\\n        'Switched to quality': 'Switched to %s quality',\\n        'Synchronize': 'Synchronize',\\n        'Synchronized': 'Synchronized',\\n        'Quality': 'Quality',\\n        'FF': 'Fast forward',\\n        'REW': 'Rewind',\\n        'FF progress': 'Fast forward %s sec',\\n        'REW progress': 'Rewind %s sec',\\n        'Unlimited danmaku': 'Unlimited danmaku',\\n        'Send danmaku': 'Send danmaku',\\n        'Setting': 'Setting',\\n        'Full screen': 'Fullscreen',\\n        'Web full screen': 'Web fullscreen',\\n        'PIP': 'Picture-in-Picture',\\n        'PIP not supported': 'Picture-in-picture is not supported',\\n        'Not available': 'Not available',\\n        'Send': 'Send',\\n        'Screenshot': 'Screenshot',\\n        'AirPlay': 'AirPlay',\\n        'Second': 'Sec',\\n        'Show comment': 'Show comment',\\n        'Hide comment': 'Hide comment',\\n        'Show subtitle': 'Show subtitle',\\n        'Hide subtitle': 'Hide subtitle',\\n        'Volume': 'Volume',\\n        'Live': 'Live',\\n        'Video info': 'Video info',\\n    },\\n};\\n\\nexport default i18n;\\n\",\"import play from '../assets/play.svg';\\nimport pause from '../assets/pause.svg';\\nimport backward from '../assets/backward.svg';\\nimport forward from '../assets/forward.svg';\\nimport volumeUp from '../assets/volume-up.svg';\\nimport volumeDown from '../assets/volume-down.svg';\\nimport volumeOff from '../assets/volume-off.svg';\\nimport full from '../assets/full.svg';\\nimport fullWeb from '../assets/full-web.svg';\\nimport pip from '../assets/pip.svg';\\nimport setting from '../assets/setting.svg';\\nimport left from '../assets/left.svg';\\nimport right from '../assets/right.svg';\\nimport check from '../assets/check.svg';\\nimport comment from '../assets/comment.svg';\\nimport commentOff from '../assets/comment-off.svg';\\nimport send from '../assets/send.svg';\\nimport pallette from '../assets/pallette.svg';\\nimport camera from '../assets/camera.svg';\\nimport airplay from '../assets/airplay.svg';\\nimport subtitle from '../assets/subtitle.svg';\\nimport loading from '../assets/loading.svg';\\n\\nconst Icons = {\\n    play: play,\\n    pause: pause,\\n    backward: backward,\\n    forward: forward,\\n    volumeUp: volumeUp,\\n    volumeDown: volumeDown,\\n    volumeOff: volumeOff,\\n    full: full,\\n    fullWeb: fullWeb,\\n    pip: pip,\\n    setting: setting,\\n    left: left,\\n    right: right,\\n    check: check,\\n    comment: comment,\\n    commentOff: commentOff,\\n    send: send,\\n    pallette: pallette,\\n    camera: camera,\\n    subtitle: subtitle,\\n    loading: loading,\\n    airplay: airplay,\\n};\\n\\nexport default Icons;\\n\",\"import Icons from './icons';\\nimport tplPlayer from '../template/player.art';\\nimport utils from './utils';\\nimport * as DPlayerType from './types';\\n\\nclass Template {\\n    container: HTMLElement;\\n    options: DPlayerType.OptionsInternal;\\n    index: number;\\n    tran: (text: string) => string;\\n\\n    volumeBar!: HTMLElement;\\n    volumeBarWrap!: HTMLElement;\\n    volumeBarWrapWrap!: HTMLElement;\\n    volumeButton!: HTMLElement;\\n    volumeButtonIcon!: HTMLElement;\\n    volumeIcon!: HTMLElement;\\n    playedBar!: HTMLElement;\\n    loadedBar!: HTMLElement;\\n    playedBarWrap!: HTMLElement;\\n    playedBarTime!: HTMLElement;\\n    danmaku!: HTMLElement;\\n    danmakuLoading!: HTMLElement;\\n    video!: HTMLVideoElement;\\n    bezel!: HTMLElement;\\n    playButton!: HTMLElement;\\n    playIcon!: HTMLElement;\\n    mobileBackwardButton!: HTMLElement;\\n    mobilePlayButton!: HTMLElement;\\n    mobileForwardButton!: HTMLElement;\\n    videoWrap!: HTMLElement;\\n    videoWrapAspect!: HTMLElement;\\n    controllerMask!: HTMLElement;\\n    ptime!: HTMLElement;\\n    settingButton!: HTMLElement;\\n    settingBox!: HTMLElement;\\n    settingOriginPanel!: HTMLElement;\\n    mask!: HTMLElement;\\n    syncButton!: HTMLElement;\\n    loop!: HTMLElement;\\n    loopToggle!: HTMLInputElement;\\n    showDanmaku!: HTMLElement;\\n    showDanmakuToggle!: HTMLInputElement;\\n    unlimitDanmaku!: HTMLElement;\\n    unlimitDanmakuToggle!: HTMLInputElement;\\n    quality!: HTMLElement;\\n    qualityValue!: HTMLElement;\\n    qualityHeader!: HTMLElement;\\n    qualityItem!: NodeListOf<HTMLElement>;\\n    speed!: HTMLElement;\\n    speedValue!: HTMLElement;\\n    speedHeader!: HTMLElement;\\n    speedItem!: NodeListOf<HTMLElement>;\\n    audio!: HTMLElement;\\n    audioValue!: HTMLElement;\\n    audioHeader!: HTMLElement;\\n    audioItem!: NodeListOf<HTMLElement>;\\n    danmakuOpacityBar!: HTMLElement;\\n    danmakuOpacityBarWrap!: HTMLElement;\\n    danmakuOpacityBarWrapWrap!: HTMLElement;\\n    danmakuOpacityBox!: HTMLElement;\\n    danmakuOpacityValue!: HTMLElement;\\n    dtime!: HTMLElement;\\n    controller!: HTMLElement;\\n    commentInput!: HTMLInputElement;\\n    commentButton!: HTMLElement;\\n    commentSettingBox!: HTMLElement;\\n    commentSettingButton!: HTMLElement;\\n    commentSettingFill!: HTMLElement;\\n    commentSendButton!: HTMLElement;\\n    commentSendFill!: HTMLElement;\\n    commentColorSettingBox!: HTMLElement;\\n    browserFullButton!: HTMLElement;\\n    webFullButton!: HTMLElement;\\n    pipButton!: HTMLElement;\\n    menu!: HTMLElement;\\n    menuItem!: NodeListOf<HTMLElement>;\\n    cameraButton!: HTMLElement;\\n    airplayButton!: HTMLElement;\\n    subtitleButton!: HTMLElement;\\n    subtitleButtonInner!: HTMLElement;\\n    subtitle!: HTMLElement;\\n    barPreview!: HTMLElement;\\n    barWrap!: HTMLElement;\\n    notice!: HTMLElement;\\n    infoPanel!: HTMLElement;\\n    infoPanelClose!: HTMLElement;\\n    infoMimeType!: HTMLElement;\\n    infoVersion!: HTMLElement;\\n    infoVideoFPS!: HTMLElement;\\n    infoPageFPS!: HTMLElement;\\n    infoDroppedFrames!: HTMLElement;\\n    infoType!: HTMLElement;\\n    infoUrl!: HTMLElement;\\n    infoResolution!: HTMLElement;\\n    infoDuration!: HTMLElement;\\n    infoBufferRemain!: HTMLElement;\\n    infoDownloadSpeed!: HTMLElement;\\n\\n    constructor(options: { container: HTMLElement; options: DPlayerType.OptionsInternal; index: number; tran: (text: string) => string; }) {\\n        this.container = options.container;\\n        this.options = options.options;\\n        this.index = options.index;\\n        this.tran = options.tran;\\n        this.init();\\n    }\\n\\n    init(): void {\\n        this.container.innerHTML = tplPlayer({\\n            options: this.options,\\n            index: this.index,\\n            tran: this.tran,\\n            icons: Icons,\\n            mobile: utils.isMobile,\\n            video: {\\n                current: true,\\n                pic: this.options.video.pic,\\n                screenshot: this.options.screenshot,\\n                airplay: this.options.airplay,\\n                preload: this.options.preload,\\n                url: this.options.video.url,\\n                subtitle: this.options.subtitle,\\n                crossOrigin: this.options.crossOrigin,\\n            },\\n        });\\n\\n        this.volumeBar = this.container.querySelector('.dplayer-volume-bar-inner')!;\\n        this.volumeBarWrap = this.container.querySelector('.dplayer-volume-bar')!;\\n        this.volumeBarWrapWrap = this.container.querySelector('.dplayer-volume-bar-wrap')!;\\n        this.volumeButton = this.container.querySelector('.dplayer-volume')!;\\n        this.volumeButtonIcon = this.container.querySelector('.dplayer-volume-icon')!;\\n        this.volumeIcon = this.container.querySelector('.dplayer-volume-icon .dplayer-icon-content')!;\\n        this.playedBar = this.container.querySelector('.dplayer-played')!;\\n        this.loadedBar = this.container.querySelector('.dplayer-loaded')!;\\n        this.playedBarWrap = this.container.querySelector('.dplayer-bar-wrap')!;\\n        this.playedBarTime = this.container.querySelector('.dplayer-bar-time')!;\\n        this.danmaku = this.container.querySelector('.dplayer-danmaku')!;\\n        this.danmakuLoading = this.container.querySelector('.dplayer-danloading')!;\\n        this.video = this.container.querySelector<HTMLVideoElement>('.dplayer-video-current')!;\\n        this.bezel = this.container.querySelector('.dplayer-bezel-icon')!;\\n        this.playButton = this.container.querySelector('.dplayer-play-icon')!;\\n        this.playIcon = this.container.querySelector('.dplayer-play-icon .dplayer-icon-content')!;\\n        this.mobileBackwardButton = this.container.querySelector('.dplayer-mobile-icon-backward')!;\\n        this.mobilePlayButton = this.container.querySelector('.dplayer-mobile-icon-play')!;\\n        this.mobileForwardButton = this.container.querySelector('.dplayer-mobile-icon-forward')!;\\n        this.videoWrap = this.container.querySelector('.dplayer-video-wrap')!;\\n        this.videoWrapAspect = this.container.querySelector('.dplayer-video-wrap-aspect')!;\\n        this.controllerMask = this.container.querySelector('.dplayer-controller-mask')!;\\n        this.ptime = this.container.querySelector('.dplayer-ptime')!;\\n        this.settingButton = this.container.querySelector('.dplayer-setting-icon')!;\\n        this.settingBox = this.container.querySelector('.dplayer-setting-box')!;\\n        this.settingOriginPanel = this.container.querySelector('.dplayer-setting-origin-panel')!;\\n        this.mask = this.container.querySelector('.dplayer-mask')!;\\n        this.syncButton = this.container.querySelector('.dplayer-live-badge')!;\\n        this.loop = this.container.querySelector('.dplayer-setting-loop')!;\\n        this.loopToggle = this.container.querySelector<HTMLInputElement>('.dplayer-setting-loop .dplayer-toggle-setting-input')!;\\n        this.showDanmaku = this.container.querySelector('.dplayer-setting-showdan')!;\\n        this.showDanmakuToggle = this.container.querySelector<HTMLInputElement>('.dplayer-showdan-setting-input')!;\\n        this.unlimitDanmaku = this.container.querySelector('.dplayer-setting-danunlimit')!;\\n        this.unlimitDanmakuToggle = this.container.querySelector<HTMLInputElement>('.dplayer-danunlimit-setting-input')!;\\n        this.quality = this.container.querySelector('.dplayer-setting-quality')!;\\n        this.qualityValue = this.container.querySelector('.dplayer-setting-quality .dplayer-label-value')!;\\n        this.qualityHeader = this.container.querySelector('.dplayer-setting-quality-header')!;\\n        this.qualityItem = this.container.querySelectorAll<HTMLElement>('.dplayer-setting-quality-item')!;\\n        this.speed = this.container.querySelector('.dplayer-setting-speed')!;\\n        this.speedValue = this.container.querySelector('.dplayer-setting-speed .dplayer-label-value')!;\\n        this.speedHeader = this.container.querySelector('.dplayer-setting-speed-header')!;\\n        this.speedItem = this.container.querySelectorAll<HTMLElement>('.dplayer-setting-speed-item')!;\\n        this.audio = this.container.querySelector('.dplayer-setting-audio')!;\\n        this.audioValue = this.container.querySelector('.dplayer-setting-audio .dplayer-label-value')!;\\n        this.audioHeader = this.container.querySelector('.dplayer-setting-audio-header')!;\\n        this.audioItem = this.container.querySelectorAll<HTMLElement>('.dplayer-setting-audio-item')!;\\n        this.danmakuOpacityBar = this.container.querySelector('.dplayer-danmaku-bar-inner')!;\\n        this.danmakuOpacityBarWrap = this.container.querySelector('.dplayer-danmaku-bar')!;\\n        this.danmakuOpacityBarWrapWrap = this.container.querySelector('.dplayer-danmaku-bar-wrap')!;\\n        this.danmakuOpacityBox = this.container.querySelector('.dplayer-setting-danmaku')!;\\n        this.danmakuOpacityValue = this.container.querySelector('.dplayer-setting-danmaku .dplayer-label-value')!;\\n        this.dtime = this.container.querySelector('.dplayer-dtime')!;\\n        this.controller = this.container.querySelector('.dplayer-controller')!;\\n        this.commentInput = this.container.querySelector<HTMLInputElement>('.dplayer-comment-input')!;\\n        this.commentButton = this.container.querySelector('.dplayer-comment-icon')!;\\n        this.commentSettingBox = this.container.querySelector('.dplayer-comment-setting-box')!;\\n        this.commentSettingButton = this.container.querySelector('.dplayer-comment-setting-icon')!;\\n        this.commentSettingFill = this.container.querySelector('.dplayer-comment-setting-icon path')!;\\n        this.commentSendButton = this.container.querySelector('.dplayer-send-icon')!;\\n        this.commentSendFill = this.container.querySelector('.dplayer-send-icon path')!;\\n        this.commentColorSettingBox = this.container.querySelector('.dplayer-comment-setting-color')!;\\n        this.browserFullButton = this.container.querySelector('.dplayer-full-icon')!;\\n        this.webFullButton = this.container.querySelector('.dplayer-full-in-icon')!;\\n        this.pipButton = this.container.querySelector('.dplayer-pip-icon')!;\\n        this.menu = this.container.querySelector('.dplayer-menu')!;\\n        this.menuItem = this.container.querySelectorAll<HTMLElement>('.dplayer-menu-item')!;\\n        this.cameraButton = this.container.querySelector('.dplayer-camera-icon')!;\\n        this.airplayButton = this.container.querySelector('.dplayer-airplay-icon')!;\\n        this.subtitleButton = this.container.querySelector('.dplayer-subtitle-icon')!;\\n        this.subtitleButtonInner = this.container.querySelector('.dplayer-subtitle-icon .dplayer-icon-content')!;\\n        this.subtitle = this.container.querySelector('.dplayer-subtitle')!;\\n        this.barPreview = this.container.querySelector('.dplayer-bar-preview')!;\\n        this.barWrap = this.container.querySelector('.dplayer-bar-wrap')!;\\n        this.notice = this.container.querySelector('.dplayer-notice')!;\\n        this.infoPanel = this.container.querySelector('.dplayer-info-panel')!;\\n        this.infoPanelClose = this.container.querySelector('.dplayer-info-panel-close')!;\\n        this.infoMimeType = this.container.querySelector('.dplayer-info-panel-item-mimetype .dplayer-info-panel-item-data')!;\\n        this.infoVersion = this.container.querySelector('.dplayer-info-panel-item-version .dplayer-info-panel-item-data')!;\\n        this.infoVideoFPS = this.container.querySelector('.dplayer-info-panel-item-video-fps .dplayer-info-panel-item-data')!;\\n        this.infoPageFPS = this.container.querySelector('.dplayer-info-panel-item-page-fps .dplayer-info-panel-item-data')!;\\n        this.infoDroppedFrames = this.container.querySelector('.dplayer-info-panel-item-dropped-frames .dplayer-info-panel-item-data')!;\\n        this.infoType = this.container.querySelector('.dplayer-info-panel-item-type .dplayer-info-panel-item-data')!;\\n        this.infoUrl = this.container.querySelector('.dplayer-info-panel-item-url .dplayer-info-panel-item-data')!;\\n        this.infoResolution = this.container.querySelector('.dplayer-info-panel-item-resolution .dplayer-info-panel-item-data')!;\\n        this.infoDuration = this.container.querySelector('.dplayer-info-panel-item-duration .dplayer-info-panel-item-data')!;\\n        this.infoBufferRemain = this.container.querySelector('.dplayer-info-panel-item-buffer-remain .dplayer-info-panel-item-data')!;\\n        this.infoDownloadSpeed = this.container.querySelector('.dplayer-info-panel-item-download-speed .dplayer-info-panel-item-data')!;\\n    }\\n}\\n\\nexport default Template;\\n\",\"import DPlayer from './player';\\nimport Events from './events';\\nimport utils from './utils';\\nimport defaultApiBackend from './api';\\nimport * as DPlayerType from './types';\\n\\ninterface DanmakuOptions {\\n    player: DPlayer,\\n    container: HTMLElement,\\n    opacity: number,\\n    callback: () => void,\\n    error: (msg: string) => void,\\n    apiBackend: DPlayerType.APIBackend,\\n    borderColor: string,\\n    fontSize: number,\\n    time: () => number,\\n    unlimited: number,\\n    speedRate: number,\\n    api: DanmakuOptionsAPI,\\n    events: Events,\\n    tran: (msg: string) => string,\\n}\\n\\ninterface DanmakuOptionsAPI {\\n    id?: string,\\n    address?: string,\\n    token?: string,\\n    maximum?: number,\\n    addition?: string[],\\n    user?: string,\\n}\\n\\nclass Danmaku {\\n    options: DanmakuOptions;\\n    player: DPlayer;\\n    container: HTMLElement;\\n    danTunnel: {\\n        right: {[key: string]: HTMLElement[]},\\n        top: {[key: string]: HTMLElement[]},\\n        bottom: {[key: string]: HTMLElement[]},\\n    };\\n    danIndex: number;\\n    danFontSize: number;\\n    dan: DPlayerType.Dan[];\\n    _opacity: number;\\n    events: Events;\\n    unlimited: boolean;\\n\\n    context: CanvasRenderingContext2D | null = null;\\n    showing: boolean;\\n    paused = false;\\n\\n    constructor(options: DanmakuOptions) {\\n        this.options = options;\\n        this.player = this.options.player;\\n        this.container = this.options.container;\\n        this.danTunnel = {\\n            right: {},\\n            top: {},\\n            bottom: {},\\n        };\\n        this.danIndex = 0;\\n        this.danFontSize = 24; // 24px\\n        this.dan = [];\\n        this.showing = true;\\n        this._opacity = this.options.opacity;\\n        this.events = this.options.events;\\n        this.unlimited = this.options.unlimited === 1;\\n        this._measure('', 0);\\n\\n        this.load();\\n    }\\n\\n    load(): void {\\n        let apiurl;\\n        if (this.options.api.address) {\\n            const apiParamsObj = Object.assign({},\\n                this.options.api.id ? { id: this.options.api.id } : {},\\n                this.options.api.maximum ? { max: this.options.api.maximum } : {},\\n            );\\n            const apiParamsStr = Object.entries(apiParamsObj)\\n                .map(([key, value]) => `${key}=${value}`)\\n                .join('&');\\n            apiurl = apiParamsStr ? `${this.options.api.address}?${apiParamsStr}` : this.options.api.address;\\n        }\\n        const endpoints = (this.options.api.addition || []).slice(0);\\n        if (apiurl) endpoints.push(apiurl);\\n        if (this.options.apiBackend !== defaultApiBackend) endpoints.push('apiBackend');\\n        this.events && this.events.trigger('danmaku_load_start', endpoints);\\n\\n        this._readAllEndpoints(endpoints, (results) => {\\n            this.dan = ([] as DPlayerType.Dan[]).concat(...results).sort((a, b) => a.time - b.time);\\n            window.requestAnimationFrame(() => {\\n                this.frame();\\n            });\\n\\n            this.options.callback();\\n\\n            this.events && this.events.trigger('danmaku_load_end');\\n        });\\n    }\\n\\n    reload(newAPI: DanmakuOptionsAPI) {\\n        this.options.api = newAPI;\\n        this.dan = [];\\n        this.clear();\\n        this.load();\\n    }\\n\\n    /**\\n     * Asynchronously read danmaku from all API endpoints\\n     */\\n    _readAllEndpoints(endpoints: string[], callback: (results: DPlayerType.Dan[][]) => void): void {\\n        const results: DPlayerType.Dan[][] = [];\\n        let errorCount = 0;\\n        let readCount = 0;\\n\\n        for (let i = 0; i < endpoints.length; ++i) {\\n            this.options.apiBackend.read({\\n                url: endpoints[i],\\n                success: (data) => {\\n                    results[i] = data;\\n\\n                    ++readCount;\\n                    if (readCount === endpoints.length) {\\n                        callback(results);\\n                    }\\n                },\\n                error: (message) => {\\n                    if (message) this.options.error(message);\\n                    results[i] = [];\\n\\n                    ++errorCount;\\n                    ++readCount;\\n                    if (readCount === endpoints.length) {\\n                        if (errorCount !== endpoints.length) {\\n                            this.options.error(this.options.tran('Danmaku load partial failed'));\\n                        } else {\\n                            this.options.error(this.options.tran('Danmaku load failed'));\\n                        }\\n                        callback(results);\\n                    }\\n                },\\n            });\\n        }\\n    }\\n\\n    send(dan: DPlayerType.DanmakuItem, callback: () => void, isCallbackOnError = false): void {\\n        const danmakuData: DPlayerType.Dan = {\\n            token: this.options.api.token,\\n            id: this.options.api.id,\\n            author: this.options.api.user,\\n            time: this.options.time(),\\n            text: dan.text,\\n            color: dan.color,\\n            type: dan.type,\\n            size: dan.size,\\n        };\\n\\n        this.options.apiBackend.send({\\n            url: this.options.api.address,\\n            data: danmakuData,\\n            success: () => {\\n                this.dan.splice(this.danIndex, 0, danmakuData);\\n                this.danIndex++;\\n                this.draw({\\n                    text: danmakuData.text,\\n                    color: danmakuData.color,\\n                    type: danmakuData.type,\\n                    size: danmakuData.size,\\n                    border: true,\\n                });\\n\\n                this.events && this.events.trigger('danmaku_send', danmakuData);\\n                callback();\\n            },\\n            error: (message) => {\\n                this.options.error(message || this.options.tran('Danmaku send failed'));\\n                if (isCallbackOnError === true) {\\n                    callback();\\n                }\\n            },\\n        });\\n    }\\n\\n    frame(): void {\\n        if (this.dan.length && !this.paused && this.showing) {\\n            let item = this.dan[this.danIndex];\\n            const dan = [];\\n            while (item && this.options.time() > (typeof item.time === 'number' ? item.time : parseFloat(item.time))) {\\n                dan.push(item);\\n                item = this.dan[++this.danIndex];\\n            }\\n            this.draw(dan);\\n        }\\n        window.requestAnimationFrame(() => {\\n            this.frame();\\n        });\\n    }\\n\\n    opacity(percentage?: number): number {\\n        if (percentage !== undefined) {\\n            this.container.style.setProperty('--dplayer-danmaku-opacity', `${percentage}`);\\n            this._opacity = percentage;\\n\\n            this.events && this.events.trigger('danmaku_opacity', this._opacity);\\n        }\\n        return this._opacity;\\n    }\\n\\n    /**\\n     * Push a danmaku into DPlayer\\n     *\\n     * @param {Object Array} dan - {text, color, type}\\n     * text - danmaku content\\n     * color - danmaku color, default: `#ffeaea`\\n     * type - danmaku type, `right` `top` `bottom`, default: `right`\\n     * size - danmaku size, `medium` `big` `small`, default: `medium`\\n     */\\n    draw(dan: DPlayerType.DanmakuItem | DPlayerType.DanmakuItem[] | DPlayerType.Dan[]): DocumentFragment | null {\\n        if (this.showing) {\\n\\n            // if the dan variable is an object, create and assign an array of only one object\\n            let danList: DPlayerType.DanmakuItem[] | DPlayerType.Dan[];\\n            if (Object.prototype.toString.call(dan) !== '[object Array]') {\\n                danList = [dan as DPlayerType.DanmakuItem];\\n            } else {\\n                danList = dan as DPlayerType.DanmakuItem[] | DPlayerType.Dan[];\\n            }\\n\\n            // adjust the font size according to the screen size\\n            const ratioRate = 1.25; // magic!\\n            let ratio = this.container.offsetWidth / 1024 * ratioRate;\\n            if (ratio >= 1) ratio = 1; // ratio should not exceed 1\\n            let itemFontSize = this.options.fontSize * ratio;\\n            const itemHeight = itemFontSize + (6 * ratio); // 6 is the vertical margin of danmaku\\n\\n            const danWidth = this.container.offsetWidth;\\n            const danHeight = this.container.offsetHeight;\\n            const itemY = danHeight / itemHeight;\\n\\n            const danItemRight = (danmakuItem: HTMLElement) => {\\n                const danmakuItemWidth = danmakuItem.offsetWidth || parseInt(danmakuItem.style.width);\\n                const danmakuItemRight =\\n                    danmakuItem.getBoundingClientRect().right || this.container.getBoundingClientRect().right + danmakuItemWidth;\\n                return this.container.getBoundingClientRect().right - danmakuItemRight;\\n            };\\n\\n            const danSpeed = (width: number) => (danWidth + width) / 5;\\n\\n            const getTunnel = (danmakuItem: HTMLElement, type: DPlayerType.DanmakuType, width: number) => {\\n                const tmp = danWidth / danSpeed(width);\\n\\n                for (let i = 0; this.unlimited || i < itemY; i++) {\\n                    const item = this.danTunnel[type][i + ''];\\n                    if (item && item.length) {\\n                        if (type !== 'right') {\\n                            continue;\\n                        }\\n                        for (let j = 0; j < item.length; j++) {\\n                            const danRight = danItemRight(item[j]) - 10;\\n                            if (danRight <= danWidth - tmp * danSpeed(parseInt(item[j].style.width)) || danRight <= 0) {\\n                                break;\\n                            }\\n                            if (j === item.length - 1) {\\n                                this.danTunnel[type][i + ''].push(danmakuItem);\\n                                danmakuItem.addEventListener('animationend', () => {\\n                                    this.danTunnel[type][i + ''].splice(0, 1);\\n                                });\\n                                return i % itemY;\\n                            }\\n                        }\\n                    } else {\\n                        this.danTunnel[type][i + ''] = [danmakuItem];\\n                        danmakuItem.addEventListener('animationend', () => {\\n                            this.danTunnel[type][i + ''].splice(0, 1);\\n                        });\\n                        return i % itemY;\\n                    }\\n                }\\n                return -1;\\n            };\\n\\n            const docFragment = document.createDocumentFragment();\\n\\n            for (let i = 0; i < danList.length; i++) {\\n\\n                const dan = danList[i];\\n\\n                // Whether the type is numeric (for compatibility)\\n                if (typeof dan.color === 'number' && isFinite(dan.color)) {\\n                    dan.color = utils.number2Color(dan.color);\\n                }\\n                if (typeof dan.type === 'number' && isFinite(dan.type)) {\\n                    dan.type = utils.number2Type(dan.type) as DPlayerType.DanmakuType;\\n                }\\n\\n                // set default danmaku color\\n                if (!dan.color) {\\n                    dan.color = '#ffeaea'; // white\\n                }\\n\\n                // set default danmaku type\\n                if (!dan.type || (dan.type !== 'right' && dan.type !== 'top' && dan.type !== 'bottom')) {\\n                    dan.type = 'right';\\n                }\\n\\n                // set default danmaku size\\n                if (!dan.size) {\\n                    dan.size = 'medium';\\n                }\\n\\n                // set danmaku size\\n                // used to calculate danmaku width\\n                // danmaku size doesn't affect itemHeight\\n                switch (dan.size) {\\n                    case 'big':\\n                        itemFontSize = itemFontSize * 1.25;\\n                        break;\\n                    case 'small':\\n                        itemFontSize = itemFontSize * 0.8;\\n                        break;\\n                }\\n\\n                const itemWidth = (() => {\\n                    let measure = 0;\\n                    // returns the width of the widest line\\n                    for (const line of dan.text.split('\\\\n')) {\\n                        const result = this._measure(line, itemFontSize);\\n                        if (result > measure) {\\n                            measure = result;\\n                        }\\n                    }\\n                    return measure;\\n                })();\\n\\n                // repeat for each line of danmaku\\n                // if danmaku type is bottom, the order must be reversed\\n                const lines = dan.text.split('\\\\n');\\n                for (const line of (dan.type === 'bottom') ? lines.reverse() : lines) {\\n\\n                    const danmakuItem = document.createElement('div');\\n                    danmakuItem.classList.add('dplayer-danmaku-item');\\n                    danmakuItem.classList.add(`dplayer-danmaku-${dan.type}`); // set danmaku type (CSS)\\n                    danmakuItem.classList.add(`dplayer-danmaku-size-${dan.size}`); // set danmaku size (CSS)\\n\\n                    // set danmaku color\\n                    danmakuItem.style.color = dan.color;\\n\\n                    // set danmaku text\\n                    if ('border' in dan && dan.border) {\\n                        const span = document.createElement('span');\\n                        span.style.border = `2px solid ${this.options.borderColor}`;\\n                        span.textContent = line;\\n                        danmakuItem.appendChild(span);\\n                    } else {\\n                        danmakuItem.textContent = line;\\n                    }\\n\\n                    // set event to remove this danmaku\\n                    danmakuItem.addEventListener('animationend', () => {\\n                        this.container.removeChild(danmakuItem);\\n                    });\\n\\n                    // ensure and adjust danmaku position\\n                    const tunnel = getTunnel(danmakuItem, dan.type, itemWidth);\\n                    switch (dan.type) {\\n                        case 'right':\\n                            if (tunnel >= 0) {\\n                                danmakuItem.style.width = itemWidth + 1 + 'px';\\n                                danmakuItem.style.top = itemHeight * tunnel + 8 + 'px';\\n                                danmakuItem.style.transform = `translateX(-${danWidth}px)`;\\n                                danmakuItem.style.willChange = 'transform';\\n                                // In Safari and the WKWebView browser on iOS/iPadOS, a rendering bug causes the\\n                                // danmaku to flicker if try to show it right away, so hide it for now.\\n                                if (utils.isWebKit) {\\n                                    danmakuItem.style.display = 'none';\\n                                }\\n                            }\\n                            break;\\n                        case 'top':\\n                            if (tunnel >= 0) {\\n                                danmakuItem.style.width = itemWidth + 1 + 'px';\\n                                danmakuItem.style.top = itemHeight * tunnel + 8 + 'px';\\n                                danmakuItem.style.willChange = 'visibility';\\n                            }\\n                            break;\\n                        case 'bottom':\\n                            if (tunnel >= 0) {\\n                                danmakuItem.style.width = itemWidth + 1 + 'px';\\n                                danmakuItem.style.bottom = itemHeight * tunnel + 8 + 'px';\\n                                danmakuItem.style.willChange = 'visibility';\\n                            }\\n                            break;\\n                        default:\\n                            console.error(`Can't handled danmaku type: ${dan.type}`);\\n                    }\\n\\n                    if (tunnel >= 0) {\\n                        // move\\n                        danmakuItem.classList.add('dplayer-danmaku-move');\\n                        danmakuItem.style.animationDuration = this._danAnimation(dan.type);\\n\\n                        // insert\\n                        docFragment.appendChild(danmakuItem);\\n\\n                        // In Safari and the WKWebView browser:\\n                        // Wait 0 seconds with setTimeout() (important!) and then unhide\\n                        if (utils.isWebKit && dan.type === 'right') {\\n                            setTimeout(() => {\\n                                danmakuItem.style.display = '';\\n                            }, 0);\\n                        }\\n                    }\\n                }\\n            }\\n\\n            // set base danmaku font size\\n            this.container.style.setProperty('--dplayer-danmaku-font-size', `${itemFontSize}px`);\\n\\n            // draw danmaku\\n            this.container.appendChild(docFragment);\\n            return docFragment;\\n        }\\n\\n        return null;\\n    }\\n\\n    play(): void {\\n        this.paused = false;\\n    }\\n\\n    pause(): void {\\n        this.paused = true;\\n    }\\n\\n    _measure(text: string, itemFontSize: number): number {\\n        if (!this.context || this.danFontSize !== itemFontSize) {\\n            this.danFontSize = itemFontSize;\\n            this.context = document.createElement('canvas').getContext('2d');\\n            this.context!.font = `bold ${this.danFontSize}px \\\"Segoe UI\\\", Arial`;\\n        }\\n\\n        // returns the width of the widest line\\n        const lines = text.split('\\\\n');\\n        let maxWidth = 0;\\n        for (let i = 0; i < lines.length; i++) {\\n            maxWidth = Math.max(maxWidth, this.context!.measureText(lines[i]).width);\\n        }\\n        return maxWidth;\\n    }\\n\\n    seek(): void {\\n        this.clear();\\n        for (let i = 0; i < this.dan.length; i++) {\\n            if (this.dan[i].time >= this.options.time()) {\\n                this.danIndex = i;\\n                break;\\n            }\\n            this.danIndex = this.dan.length;\\n        }\\n    }\\n\\n    clear(): void {\\n        this.danTunnel = {\\n            right: {},\\n            top: {},\\n            bottom: {},\\n        };\\n        this.danIndex = 0;\\n        this.options.container.innerHTML = '';\\n\\n        this.events && this.events.trigger('danmaku_clear');\\n    }\\n\\n    resize(): void {\\n        const danWidth = this.container.offsetWidth;\\n        const items = this.container.querySelectorAll<HTMLElement>('.dplayer-danmaku-item');\\n        for (let i = 0; i < items.length; i++) {\\n            items[i].style.transform = `translateX(-${danWidth}px)`;\\n        }\\n    }\\n\\n    hide(): void {\\n        this.showing = false;\\n        this.pause();\\n        this.clear();\\n\\n        this.events && this.events.trigger('danmaku_hide');\\n    }\\n\\n    show(): void {\\n        this.seek();\\n        this.showing = true;\\n        this.play();\\n\\n        this.events && this.events.trigger('danmaku_show');\\n    }\\n\\n    toggle(): void {\\n        if (this.showing) {\\n            this.hide();\\n        } else {\\n            this.show();\\n        }\\n    }\\n\\n    unlimit(boolean: boolean): void {\\n        this.unlimited = boolean;\\n    }\\n\\n    speed(rate: number): void {\\n        this.options.speedRate = rate;\\n    }\\n\\n    _danAnimation(position: DPlayerType.DanmakuType): string {\\n        const rate = this.options.speedRate;\\n        const isFullScreen =\\n            this.player.fullScreen.isFullScreen('browser') ||\\n            this.player.fullScreen.isFullScreen('web');\\n        const animations = {\\n            top: `${(isFullScreen ? 4.5 : 4) / rate}s`,\\n            right: `${(isFullScreen ? 5.5 : 5) / rate}s`,\\n            bottom: `${(isFullScreen ? 4.5 : 4) / rate}s`,\\n        };\\n        return animations[position];\\n    }\\n}\\n\\nexport default Danmaku;\\n\",\"import * as DPlayerType from './types';\\n\\nclass Events {\\n    events: {[key: string]: {callback: (info?: Event | any) => void; once: boolean}[]};\\n    videoEvents: DPlayerType.VideoEvents[];\\n    playerEvents: DPlayerType.PlayerEvents[];\\n\\n    constructor() {\\n        this.events = {};\\n\\n        this.videoEvents = [\\n            'abort',\\n            'canplay',\\n            'canplaythrough',\\n            'durationchange',\\n            'emptied',\\n            'ended',\\n            'error',\\n            'loadeddata',\\n            'loadedmetadata',\\n            'loadstart',\\n            'mozaudioavailable',\\n            'pause',\\n            'play',\\n            'playing',\\n            'progress',\\n            'ratechange',\\n            'seeked',\\n            'seeking',\\n            'stalled',\\n            'suspend',\\n            'timeupdate',\\n            'volumechange',\\n            'waiting',\\n        ];\\n        this.playerEvents = [\\n            'screenshot',\\n            'thumbnails_show',\\n            'thumbnails_hide',\\n            'danmaku_show',\\n            'danmaku_hide',\\n            'danmaku_clear',\\n            'danmaku_load_start',\\n            'danmaku_load_end',\\n            'danmaku_send',\\n            'danmaku_opacity',\\n            'contextmenu_show',\\n            'contextmenu_hide',\\n            'notice_show',\\n            'notice_hide',\\n            'quality_start',\\n            'quality_end',\\n            'destroy',\\n            'resize',\\n            'fullscreen',\\n            'fullscreen_cancel',\\n            'webfullscreen',\\n            'webfullscreen_cancel',\\n            'subtitle_show',\\n            'subtitle_hide',\\n            'subtitle_change',\\n        ];\\n    }\\n\\n    on(name: DPlayerType.Events, callback: (info?: Event | any) => void, once = false): void {\\n        if (this.type(name) && typeof callback === 'function') {\\n            if (!this.events[name]) {\\n                this.events[name] = [];\\n            }\\n            this.events[name].push({\\n                callback,\\n                once,\\n            });\\n        }\\n    }\\n\\n    off(name: DPlayerType.Events, callback: (info?: Event | any) => void): void {\\n        if (this.type(name) && typeof callback === 'function' && this.events[name]) {\\n            for (const event of this.events[name]) {\\n                if (event.callback === callback) {\\n                    this.events[name].splice(this.events[name].indexOf(event), 1);\\n                }\\n            }\\n        }\\n    }\\n\\n    trigger(name: DPlayerType.Events, info?: Event | any): void {\\n        if (this.events[name] && this.events[name].length) {\\n            for (const event of this.events[name]) {\\n                event.callback(info);\\n                if (event.once) {\\n                    this.off(name, event.callback);\\n                }\\n            }\\n        }\\n    }\\n\\n    type(name: DPlayerType.Events): 'player' | 'video' | null {\\n        if ((this.playerEvents as DPlayerType.Events[]).indexOf(name) !== -1) {\\n            return 'player';\\n        } else if ((this.videoEvents as DPlayerType.Events[]).indexOf(name) !== -1) {\\n            return 'video';\\n        }\\n\\n        console.error(`Unknown event name: ${name}`);\\n        return null;\\n    }\\n}\\n\\nexport default Events;\\n\",\"import DPlayer from './player';\\nimport utils from './utils';\\nimport * as DPlayerType from './types';\\n\\nclass FullScreen {\\n    player: DPlayer;\\n    lastScrollPosition: { left: number; top: number; };\\n    fullscreenchange: () => void;\\n\\n    constructor(player: DPlayer) {\\n        this.player = player;\\n        this.lastScrollPosition = { left: 0, top: 0 };\\n        this.player.events.on('webfullscreen', () => {\\n            this.player.resize();\\n        });\\n        this.player.events.on('webfullscreen_cancel', () => {\\n            this.player.resize();\\n            utils.setScrollPosition(this.lastScrollPosition);\\n        });\\n\\n        this.fullscreenchange = () => {\\n            this.player.resize();\\n            if (this.isFullScreen('browser')) {\\n                this.player.events.trigger('fullscreen');\\n            } else {\\n                utils.setScrollPosition(this.lastScrollPosition);\\n                this.player.container.classList.remove('dplayer-fulled-browser');\\n                this.player.events.trigger('fullscreen_cancel');\\n            }\\n        };\\n        if (this.player.container.onfullscreenchange !== undefined) {\\n            this.player.container.addEventListener('fullscreenchange', this.fullscreenchange);\\n        } else {\\n            this.player.container.addEventListener('webkitfullscreenchange', this.fullscreenchange);\\n        }\\n    }\\n\\n    isFullScreen(type: DPlayerType.FullscreenType = 'browser'): boolean {\\n        switch (type) {\\n            case 'browser': {\\n                const fullEle = document.fullscreenElement || document.webkitFullscreenElement;\\n                if (fullEle && fullEle === this.player.container) {\\n                    return true;\\n                } else {\\n                    return false;\\n                }\\n            }\\n            case 'web': {\\n                return this.player.container.classList.contains('dplayer-fulled');\\n            }\\n        }\\n    }\\n\\n    request(type: DPlayerType.FullscreenType = 'browser'): void {\\n        const anotherType = type === 'browser' ? 'web' : 'browser';\\n        const anotherTypeOn = this.isFullScreen(anotherType);\\n        if (!anotherTypeOn) {\\n            this.lastScrollPosition = utils.getScrollPosition();\\n        }\\n\\n        switch (type) {\\n            case 'browser':\\n                // unify method names\\n                this.player.container.requestFullscreen =\\n                    this.player.container.requestFullscreen || // HTML5 standard\\n                    this.player.container.webkitRequestFullscreen; // Webkit\\n                // request fullscreen\\n                if (this.player.container.requestFullscreen !== undefined) {\\n                    this.player.container.requestFullscreen();\\n                } else if (this.player.video.webkitEnterFullscreen) {\\n                    // compatibility: Fullscreen API is not supported in Safari for iOS, so fallback to video.webkitEnterFullscreen()\\n                    // only the video element is fullscreen, so if fullscreen is enabled you can only use the default controls\\n                    this.player.video.webkitEnterFullscreen();\\n                }\\n                // lock screen to landscape (if supported)\\n                if (screen.orientation) {\\n                    try {\\n                        screen.orientation.lock('landscape').catch(() => {\\n                            // pass\\n                        });\\n                    } catch (e) {\\n                        // pass\\n                    }\\n                }\\n                // video.webkitEnterFullscreen() does not dispatch the event that exit fullscreen, so the 'dplayer-fulled-browser' class is not added\\n                if (this.player.container.requestFullscreen !== undefined) {\\n                    this.player.container.classList.add('dplayer-fulled-browser');\\n                }\\n                break;\\n            case 'web':\\n                this.player.container.classList.add('dplayer-fulled');\\n                document.body.classList.add('dplayer-web-fullscreen-fix');\\n                this.player.events.trigger('webfullscreen');\\n                break;\\n        }\\n\\n        if (anotherTypeOn) {\\n            this.cancel(anotherType);\\n        }\\n    }\\n\\n    cancel(type: DPlayerType.FullscreenType = 'browser'): void {\\n        switch (type) {\\n            case 'browser':\\n                // unify method names\\n                document.exitFullscreen =\\n                    document.exitFullscreen || // HTML5 standard\\n                    document.webkitExitFullscreen; // Webkit\\n                // exit fullscreen\\n                if (document.exitFullscreen) {\\n                    document.exitFullscreen();\\n                }\\n                // unlock screen (if supported)\\n                if (screen.orientation) {\\n                    try {\\n                        screen.orientation.unlock();\\n                    } catch (e) {\\n                        // pass\\n                    }\\n                }\\n                this.player.container.classList.remove('dplayer-fulled-browser');\\n                break;\\n            case 'web':\\n                this.player.container.classList.remove('dplayer-fulled');\\n                document.body.classList.remove('dplayer-web-fullscreen-fix');\\n                this.player.events.trigger('webfullscreen_cancel');\\n                break;\\n        }\\n    }\\n\\n    toggle(type: DPlayerType.FullscreenType = 'browser'): void {\\n        if (this.isFullScreen(type)) {\\n            this.cancel(type);\\n        } else {\\n            this.request(type);\\n        }\\n    }\\n\\n    destroy(): void {\\n        this.player.container.removeEventListener('fullscreenchange', this.fullscreenchange);\\n        this.player.container.removeEventListener('webkitfullscreenchange', this.fullscreenchange);\\n    }\\n}\\n\\nexport default FullScreen;\\n\",\"import DPlayer from './player';\\nimport utils from './utils';\\n\\nclass User {\\n    storageName: {[key: string]: string};\\n    default: {[key: string]: number};\\n    data: {[key: string]: number};\\n\\n    constructor(player: DPlayer) {\\n        this.storageName = {\\n            opacity: 'dplayer-danmaku-opacity',\\n            volume: 'dplayer-volume',\\n            unlimited: 'dplayer-danmaku-unlimited',\\n            danmaku: 'dplayer-danmaku-show',\\n            subtitle: 'dplayer-subtitle-show',\\n            speed: 'dplayer-speed',\\n            loop: 'dplayer-loop',\\n        };\\n        this.default = {\\n            opacity: 1.0,\\n            volume: Object.prototype.hasOwnProperty.call(player.options, 'volume') ? player.options.volume : 1.0,\\n            unlimited: (player.options.danmaku && player.options.danmaku.unlimited ? 1 : 0) || 0,\\n            danmaku: 1,\\n            subtitle: 1,\\n            speed: 1.0,\\n            loop: player.options.loop ? 1 : 0,\\n        };\\n        this.data = {};\\n\\n        this.init();\\n    }\\n\\n    init(): void {\\n        for (const item in this.storageName) {\\n            const name = this.storageName[item];\\n            this.data[item] = parseFloat(utils.storage.get(name)! || this.default[item].toString());\\n        }\\n    }\\n\\n    get(key: 'opacity' | 'volume' | 'unlimited' | 'danmaku' | 'subtitle' | 'speed' | 'loop'): number {\\n        return this.data[key];\\n    }\\n\\n    set(key: 'opacity' | 'volume' | 'unlimited' | 'danmaku' | 'subtitle' | 'speed' | 'loop', value: number): void {\\n        this.data[key] = value;\\n        utils.storage.set(this.storageName[key], value);\\n    }\\n}\\n\\nexport default User;\\n\",\"import Events from './events';\\nimport * as DPlayerType from './types';\\n\\nclass Subtitle {\\n    container: HTMLElement;\\n    video: HTMLVideoElement;\\n    plugins: DPlayerType.Plugins;\\n    options: DPlayerType.SubtitleInternal;\\n    events: Events;\\n\\n    constructor(container: HTMLElement, video: HTMLVideoElement, plugins: DPlayerType.Plugins, options: DPlayerType.SubtitleInternal, events: Events) {\\n        this.container = container;\\n        this.video = video;\\n        this.plugins = plugins;\\n        this.options = options;\\n        this.events = events;\\n\\n        this.init();\\n    }\\n\\n    init(): void {\\n        this.container.style.fontSize = this.options.fontSize;\\n        this.container.style.bottom = this.options.bottom;\\n        this.container.style.color = this.options.color;\\n\\n        if (this.options.type === 'webvtt' && this.video.textTracks && this.video.textTracks[0]) {\\n            const track = this.video.textTracks[0];\\n\\n            track.oncuechange = () => {\\n                if (!track.activeCues) {\\n                    return;\\n                }\\n                const cue = track.activeCues[0] as VTTCue;\\n                this.container.innerHTML = '';\\n                if (cue) {\\n                    const template = document.createElement('div');\\n                    template.appendChild(cue.getCueAsHTML());\\n                    const trackHtml = template.innerHTML\\n                        .split(/\\\\r?\\\\n/)\\n                        .map((item) => `<p>${item}</p>`)\\n                        .join('');\\n                    this.container.innerHTML = trackHtml;\\n                }\\n                this.events.trigger('subtitle_change');\\n            };\\n        }\\n    }\\n\\n    show(): void {\\n        this.container.classList.remove('dplayer-subtitle-hide');\\n        // for aribb24.js (caption only)\\n        // superimpose is used to notify important breaking news, so it is inappropriate to hide it at the same time as hiding subtitles.\\n        // if you want to disable the drawing of superimpose itself, options.plugins.aribb24.disableSuperimposeRenderer should be set to true.\\n        if (this.options.type === 'aribb24' && this.plugins.aribb24Caption) {\\n            this.plugins.aribb24Caption.show();\\n        }\\n        this.events.trigger('subtitle_show');\\n    }\\n\\n    hide(): void {\\n        this.container.classList.add('dplayer-subtitle-hide');\\n        // for aribb24.js (caption only)\\n        // superimpose is used to notify important breaking news, so it is inappropriate to hide it at the same time as hiding subtitles.\\n        // if you want to disable the drawing of superimpose itself, options.plugins.aribb24.disableSuperimposeRenderer should be set to true.\\n        if (this.options.type === 'aribb24' && this.plugins.aribb24Caption) {\\n            this.plugins.aribb24Caption.hide();\\n        }\\n        this.events.trigger('subtitle_hide');\\n    }\\n\\n    toggle(): void {\\n        if (this.container.classList.contains('dplayer-subtitle-hide')) {\\n            this.show();\\n        } else {\\n            this.hide();\\n        }\\n    }\\n}\\n\\nexport default Subtitle;\\n\",\"import Template from './template';\\n\\nclass Bar {\\n    elements: {[key: string]: HTMLElement};\\n\\n    constructor(template: Template) {\\n        this.elements = {};\\n        this.elements.volume = template.volumeBar;\\n        this.elements.played = template.playedBar;\\n        this.elements.loaded = template.loadedBar;\\n        this.elements.danmaku = template.danmakuOpacityBar;\\n    }\\n\\n    /**\\n     * Update progress\\n     *\\n     * @param {String} type - Point out which bar it is\\n     * @param {Number} percentage\\n     * @param {String} direction - Point out the direction of this bar, Should be height or width\\n     */\\n    set(type: 'volume' | 'played' | 'loaded' | 'danmaku', percentage: number, direction: 'width' | 'height'): void {\\n        percentage = Math.max(percentage, 0);\\n        percentage = Math.min(percentage, 1);\\n        this.elements[type].style[direction] = percentage * 100 + '%';\\n    }\\n\\n    get(type: 'volume' | 'played' | 'loaded' | 'danmaku'): number {\\n        return parseFloat(this.elements[type].style.width) / 100;\\n    }\\n}\\n\\nexport default Bar;\\n\",\"import DPlayer from './player';\\n\\nclass Timer {\\n    player: DPlayer;\\n    types: ('loading' | 'info' | 'fps')[];\\n    enablefpsChecker!: boolean;\\n    enableinfoChecker!: boolean;\\n    enableloadingChecker!: boolean;\\n    fpsIndex!: number;\\n    fpsStart!: Date | number;\\n    fpsChecker!: number;  // dummy\\n    infoChecker!: number;\\n    loadingChecker!: number;\\n\\n    constructor(player: DPlayer) {\\n        this.player = player;\\n\\n        window.requestAnimationFrame = (() =>\\n            window.requestAnimationFrame ||\\n            window.webkitRequestAnimationFrame ||\\n            window.mozRequestAnimationFrame ||\\n            window.oRequestAnimationFrame ||\\n            window.msRequestAnimationFrame ||\\n            function (callback) {\\n                window.setTimeout(callback, 1000 / 60);\\n            })();\\n\\n        this.types = ['loading', 'info', 'fps'];\\n\\n        this.init();\\n    }\\n\\n    init(): void {\\n        this.types.map((item: 'loading' | 'info' | 'fps') => {\\n            if (item !== 'fps') {\\n                this[`init${item}Checker`]();\\n            }\\n            return item;\\n        });\\n    }\\n\\n    initloadingChecker(): void {\\n        let lastPlayPos = 0;\\n        let currentPlayPos = 0;\\n        let bufferingDetected = false;\\n        this.loadingChecker = window.setInterval(() => {\\n            if (this.enableloadingChecker) {\\n                // whether the video is buffering\\n                currentPlayPos = this.player.video.currentTime;\\n                if (!bufferingDetected && currentPlayPos === lastPlayPos && !this.player.video.paused) {\\n                    this.player.container.classList.add('dplayer-loading');\\n                    bufferingDetected = true;\\n                }\\n                if (bufferingDetected && currentPlayPos > lastPlayPos && !this.player.video.paused) {\\n                    this.player.container.classList.remove('dplayer-loading');\\n                    bufferingDetected = false;\\n                }\\n                lastPlayPos = currentPlayPos;\\n            }\\n        }, 100);\\n    }\\n\\n    initfpsChecker(): void {\\n        window.requestAnimationFrame(() => {\\n            if (this.enablefpsChecker) {\\n                this.initfpsChecker();\\n                if (!this.fpsStart) {\\n                    this.fpsStart = new Date();\\n                    this.fpsIndex = 0;\\n                } else {\\n                    this.fpsIndex++;\\n                    const fpsCurrent = new Date();\\n                    // @ts-expect-error TS(2362): The left-hand side of an arithmetic operation must... Remove this comment to see the full error message\\n                    if (fpsCurrent - this.fpsStart > 1000) {\\n                        // @ts-expect-error TS(2362): The left-hand side of an arithmetic operation must... Remove this comment to see the full error message\\n                        this.player.infoPanel.fps((this.fpsIndex / (fpsCurrent - this.fpsStart)) * 1000);\\n                        this.fpsStart = new Date();\\n                        this.fpsIndex = 0;\\n                    }\\n                }\\n            } else {\\n                this.fpsStart = 0;\\n                this.fpsIndex = 0;\\n            }\\n        });\\n    }\\n\\n    initinfoChecker(): void {\\n        this.infoChecker = window.setInterval(() => {\\n            if (this.enableinfoChecker) {\\n                this.player.infoPanel.update();\\n            }\\n        }, 1000);\\n    }\\n\\n    enable(type: 'loading' | 'info' | 'fps'): void {\\n        this[`enable${type}Checker`] = true;\\n\\n        if (type === 'fps') {\\n            this.initfpsChecker();\\n        }\\n    }\\n\\n    disable(type: 'loading' | 'info' | 'fps'): void {\\n        this[`enable${type}Checker`] = false;\\n    }\\n\\n    destroy(): void {\\n        this.types.map((item) => {\\n            this[`enable${item}Checker`] = false;\\n            this[`${item}Checker`] && window.clearInterval(this[`${item}Checker`]);\\n            return item;\\n        });\\n    }\\n}\\n\\nexport default Timer;\\n\",\"class Bezel {\\n    container: HTMLElement;\\n\\n    constructor(container: HTMLElement) {\\n        this.container = container;\\n\\n        this.container.addEventListener('animationend', () => {\\n            this.container.classList.remove('dplayer-bezel-transition');\\n        });\\n    }\\n\\n    switch(icon: string): void {\\n        this.container.innerHTML = icon;\\n        this.container.classList.add('dplayer-bezel-transition');\\n    }\\n}\\n\\nexport default Bezel;\\n\",\"import Events from './events';\\nimport DPlayer from './player';\\nimport utils from './utils';\\n\\nclass Thumbnails {\\n    player: DPlayer;\\n    container: HTMLElement;\\n    barWidth: number;\\n    events: Events;\\n    private readonly viewportWidth = 180;\\n    private readonly viewportHeight = 101;\\n    private readonly thumbnailSpace = utils.isMobile ? 6 : 26;\\n    private width: number;\\n    private height: number;\\n    private interval?: number;\\n    private totalCount: number;\\n    private columnCount: number;\\n    private magnificationScale: number;\\n\\n    constructor(options: {\\n        player: DPlayer;\\n        url: string;\\n        events: Events;\\n        interval?: number;\\n        totalCount?: number;\\n        width?: number;\\n        height?: number;\\n        columnCount?: number;\\n    }) {\\n        this.player = options.player;\\n        this.container = this.player.template.barPreview;\\n        this.barWidth = this.player.template.barWrap.offsetWidth;\\n        this.events = options.events;\\n        this.interval = options.interval;\\n\\n        // Calculate total count based on interval or use specified totalCount\\n        if (options.interval) {\\n            this.totalCount = Math.ceil(this.player.video.duration / options.interval);\\n        } else {\\n            this.totalCount = options.totalCount || 100;\\n        }\\n\\n        // Set dimensions\\n        this.width = options.width || 160;\\n        // 16:9 aspect ratio if height is not specified\\n        this.height = options.height || Math.floor(this.width * 9 / 16);\\n        this.columnCount = options.columnCount || 100;  // Default to 100 columns if not specified\\n\\n        // Calculate the magnification factor to make the thumbnail width VIEWPORT_WIDTH\\n        this.magnificationScale = this.viewportWidth / this.width;\\n\\n        // Set initial styles\\n        this.player.template.barWrap.style.setProperty('--thumbnail-url', `url(${options.url})`);  // preload thumbnails\\n        this.container.style.width = `${this.viewportWidth}px`;\\n        this.container.style.height = `${this.viewportHeight}px`;\\n        this.container.style.top = `${-this.viewportHeight - this.thumbnailSpace}px`;\\n        this.container.style.backgroundPosition = '0 0';\\n\\n        // Resize thumbnails when video duration changes\\n        this.player.on('durationchange', () => {\\n            this.resize(\\n                this.width,\\n                this.height,\\n                this.barWidth,\\n            );\\n        });\\n    }\\n\\n    resize(width: number, height: number, barWrapWidth: number): void {\\n        // Update internal dimensions\\n        this.width = width;\\n        this.height = height;\\n        this.barWidth = barWrapWidth;\\n\\n        // Recalculate the total count based on the new video duration\\n        if (this.interval) {\\n            this.totalCount = Math.ceil(this.player.video.duration / this.interval);\\n        }\\n\\n        // Calculate the number of rows\\n        const rowCount = Math.ceil(this.totalCount / this.columnCount);\\n\\n        // Calculate background-size based on the sprite image dimensions\\n        const backgroundWidth = this.columnCount * width * this.magnificationScale;\\n        const backgroundHeight = rowCount * height * this.magnificationScale;\\n\\n        // Update container styles\\n        this.container.style.width = `${this.viewportWidth}px`;\\n        this.container.style.height = `${this.viewportHeight}px`;\\n        this.container.style.top = `${-this.viewportHeight - this.thumbnailSpace}px`;\\n        this.container.style.backgroundSize = `${backgroundWidth}px ${backgroundHeight}px`;\\n    }\\n\\n    show(): void {\\n        this.container.style.display = 'block';\\n        this.events && this.events.trigger('thumbnails_show');\\n    }\\n\\n    move(position: number): void {\\n        // Calculate the current thumbnail index based on position\\n        const index = Math.max(0, Math.min(Math.floor((position / this.barWidth) * this.totalCount), this.totalCount - 1));\\n\\n        // Calculate row and column based on index\\n        const column = index % this.columnCount;\\n        const row = Math.floor(index / this.columnCount);\\n\\n        // Calculate background-position based on row and column\\n        const backgroundX = column * this.width;\\n        const backgroundY = row * this.height;\\n\\n        // Set the background position\\n        this.container.style.backgroundPosition = `-${backgroundX * this.magnificationScale}px -${backgroundY * this.magnificationScale}px`;\\n\\n        // Position the container\\n        const left = Math.min(Math.max(position - this.container.offsetWidth / 2, -10), this.barWidth - (this.viewportWidth - 10));\\n        this.container.style.left = `${left}px`;\\n    }\\n\\n    hide(): void {\\n        this.container.style.display = 'none';\\n        this.events && this.events.trigger('thumbnails_hide');\\n    }\\n}\\n\\nexport default Thumbnails;\\n\",\"import DPlayer from './player';\\nimport utils from './utils';\\nimport Thumbnails from './thumbnails';\\nimport Icons from './icons';\\n\\nclass Controller {\\n    player: DPlayer;\\n    disableAutoHide = false;\\n    autoHideTimer: number;\\n    mobileSkipTimer: number;\\n    mobileBackwardTime: number;\\n    mobileForwardTime: number;\\n    setAutoHideHandler: () => void;\\n    thumbnails: Thumbnails | null = null;\\n\\n    constructor(player: DPlayer) {\\n        this.player = player;\\n\\n        this.autoHideTimer = 0;\\n        this.mobileSkipTimer = 0;\\n        this.mobileBackwardTime = 0;\\n        this.mobileForwardTime = 0;\\n        this.setAutoHideHandler = () => this.setAutoHide();\\n        if (!utils.isMobile) {\\n            this.player.container.addEventListener('mousemove', this.setAutoHideHandler);\\n            this.player.container.addEventListener('click', this.setAutoHideHandler);\\n        } else {\\n            this.player.container.addEventListener('touchmove', this.setAutoHideHandler);\\n        }\\n        this.player.on('play', this.setAutoHideHandler);\\n        this.player.on('pause', this.setAutoHideHandler);\\n\\n        this.initPlayButton();\\n        this.initThumbnails();\\n        this.initPlayedBar();\\n        this.initFullButton();\\n        this.initPipButton();\\n        this.initSyncButton();\\n        this.initScreenshotButton();\\n        this.initSubtitleButton();\\n        this.initHighlights();\\n        this.initAirplayButton();\\n        if (!utils.isMobile) {\\n            this.initVolumeButton();\\n        }\\n    }\\n\\n    initPlayButton(): void {\\n        this.player.template.playButton.addEventListener('click', () => {\\n            this.player.toggle();\\n        });\\n\\n        this.player.template.mobilePlayButton.addEventListener('click', () => {\\n            this.player.toggle();\\n        });\\n\\n        if (!utils.isMobile) {\\n            this.player.template.videoWrap.addEventListener('click', () => {\\n                this.player.toggle();\\n            });\\n            this.player.template.controllerMask.addEventListener('click', () => {\\n                this.player.toggle();\\n            });\\n        } else {\\n            this.player.template.videoWrap.addEventListener('click', () => {\\n                this.toggle();\\n                if (this.isShow()) {\\n                    this.setAutoHide();\\n                }\\n            });\\n            this.player.template.controllerMask.addEventListener('click', () => {\\n                this.toggle();\\n                if (this.isShow()) {\\n                    this.setAutoHide();\\n                }\\n            });\\n        }\\n\\n        // REW 10s\\n        this.player.template.mobileBackwardButton.addEventListener('click', () => {\\n            this.mobileBackwardTime += 10;\\n            this.player.seek(this.player.video.currentTime - 10);\\n            this.player.notice(this.player.tran('REW progress', this.mobileBackwardTime.toFixed(0)));\\n            // extend count reset\\n            // if the REW button is not pressed within 1 second, the count will be reset automatically\\n            window.clearTimeout(this.mobileSkipTimer);\\n            this.mobileSkipTimer = window.setTimeout(() => {\\n                this.mobileBackwardTime = 0;\\n            }, 1000);\\n            this.setAutoHide();\\n        });\\n\\n        // FF 10s\\n        this.player.template.mobileForwardButton.addEventListener('click', () => {\\n            this.mobileForwardTime += 10;\\n            this.player.seek(this.player.video.currentTime + 10);\\n            this.player.notice(this.player.tran('FF progress', this.mobileForwardTime.toFixed(0)));\\n            // extend count reset\\n            // if the FF button is not pressed within 1 second, the count will be reset automatically\\n            window.clearTimeout(this.mobileSkipTimer);\\n            this.mobileSkipTimer = window.setTimeout(() => {\\n                this.mobileForwardTime = 0;\\n            }, 1000);\\n            this.setAutoHide();\\n        });\\n    }\\n\\n    initHighlights(): void {\\n        this.player.on('durationchange', () => {\\n            if (this.player.video.duration !== 1 && this.player.video.duration !== Infinity) {\\n                if (this.player.options.highlight) {\\n                    const highlights = this.player.template.playedBarWrap.querySelectorAll('.dplayer-highlight');\\n                    [].slice.call(highlights, 0).forEach((item) => {\\n                        this.player.template.playedBarWrap.removeChild(item);\\n                    });\\n                    for (let i = 0; i < this.player.options.highlight.length; i++) {\\n                        if (!this.player.options.highlight[i].text || !this.player.options.highlight[i].time) {\\n                            continue;\\n                        }\\n                        const p = document.createElement('div');\\n                        p.classList.add('dplayer-highlight');\\n                        p.style.left = (this.player.options.highlight[i].time / this.player.video.duration) * 100 + '%';\\n                        const span = document.createElement('span');\\n                        span.classList.add('dplayer-highlight-text');\\n                        span.textContent = this.player.options.highlight[i].text;\\n                        p.appendChild(span);\\n                        this.player.template.playedBarWrap.insertBefore(p, this.player.template.playedBarTime);\\n                    }\\n                }\\n            }\\n        });\\n    }\\n\\n    initThumbnails(): void {\\n        if (this.player.options.video.thumbnails) {\\n            const thumbnailsConfig = this.player.options.video.thumbnails;\\n            this.thumbnails = new Thumbnails({\\n                player: this.player,\\n                url: thumbnailsConfig.url,\\n                events: this.player.events,\\n                interval: thumbnailsConfig.interval,\\n                totalCount: thumbnailsConfig.totalCount,\\n                width: thumbnailsConfig.width,\\n                height: thumbnailsConfig.height,\\n                columnCount: thumbnailsConfig.columnCount,\\n            });\\n\\n            this.player.on('loadedmetadata', () => {\\n                const width = thumbnailsConfig.width || 160;\\n                const height = thumbnailsConfig.height || Math.floor(width * 9 / 16);\\n                this.thumbnails!.resize(\\n                    width,\\n                    height,\\n                    this.player.template.barWrap.offsetWidth,\\n                );\\n            });\\n        }\\n    }\\n\\n    initPlayedBar(): void {\\n        let paused: boolean;\\n\\n        const thumbMove = (e: Event) => {\\n            const event = e as TouchEvent | MouseEvent;\\n            e.preventDefault();\\n            let percentage = utils.getRelativeX(event, this.player.template.playedBarWrap) / this.player.template.playedBarWrap.clientWidth;\\n            percentage = Math.max(percentage, 0);\\n            percentage = Math.min(percentage, 1);\\n            this.player.bar.set('played', percentage, 'width');\\n            const duration = utils.getVideoDuration(this.player.video, this.player.template);\\n            this.player.template.ptime.textContent = utils.secondToTime(percentage * duration);\\n            this.player.container.classList.add('dplayer-seeking');\\n            if (!this.player.video.paused) {\\n                this.player.video.pause();\\n            }\\n        };\\n\\n        const thumbUp = (e: Event) => {\\n            const event = e as TouchEvent | MouseEvent;\\n            document.removeEventListener(utils.nameMap.dragEnd, thumbUp);\\n            document.removeEventListener(utils.nameMap.dragMove, thumbMove);\\n            // fallback for Document Picture-in-Picture window\\n            this.player.container.removeEventListener(utils.nameMap.dragEnd, thumbUp);\\n            this.player.container.removeEventListener(utils.nameMap.dragMove, thumbMove);\\n            let percentage = utils.getRelativeX(event, this.player.template.playedBarWrap) / this.player.template.playedBarWrap.clientWidth;\\n            percentage = Math.max(percentage, 0);\\n            percentage = Math.min(percentage, 1);\\n            this.player.bar.set('played', percentage, 'width');\\n            const duration = utils.getVideoDuration(this.player.video, this.player.template);\\n            this.player.seek(this.player.bar.get('played') * duration, true);  // hide notice\\n            if (!paused) {\\n                this.player.video.play();\\n            }\\n            this.player.container.classList.remove('dplayer-seeking');\\n        };\\n\\n        this.player.template.playedBarWrap.addEventListener(utils.nameMap.dragStart, (e: Event) => {\\n            e.preventDefault();\\n            paused = this.player.video.paused;\\n            document.addEventListener(utils.nameMap.dragMove, thumbMove, { passive: false });\\n            document.addEventListener(utils.nameMap.dragEnd, thumbUp);\\n            // fallback for Document Picture-in-Picture window\\n            this.player.container.addEventListener(utils.nameMap.dragMove, thumbMove, { passive: false });\\n            this.player.container.addEventListener(utils.nameMap.dragEnd, thumbUp);\\n        }, { passive: false });\\n\\n        this.player.template.playedBarWrap.addEventListener(utils.nameMap.dragMove, (e: Event) => {\\n            e.preventDefault();\\n            const event = e as TouchEvent | MouseEvent;\\n            const duration = utils.getVideoDuration(this.player.video, this.player.template);\\n            if (duration) {\\n                const relativeX = utils.getRelativeX(event, this.player.template.playedBarWrap);\\n                if (relativeX < 0 || relativeX > this.player.template.playedBarWrap.offsetWidth) {\\n                    return;\\n                }\\n                const time = duration * (relativeX / this.player.template.playedBarWrap.offsetWidth);\\n                if (utils.isMobile) {\\n                    this.thumbnails && this.thumbnails.show();\\n                }\\n                this.thumbnails && this.thumbnails.move(relativeX);\\n                this.player.template.playedBarTime.style.left = `${relativeX - (time >= 3600 ? 27.5 : 22.5)}px`;\\n                this.player.template.playedBarTime.textContent = utils.secondToTime(time);\\n                this.player.template.playedBarTime.classList.remove('hidden');\\n            }\\n        }, { passive: false });\\n\\n        this.player.template.playedBarWrap.addEventListener(utils.nameMap.dragEnd, () => {\\n            if (utils.isMobile) {\\n                this.thumbnails && this.thumbnails.hide();\\n            }\\n        });\\n\\n        if (!utils.isMobile) {\\n            this.player.template.playedBarWrap.addEventListener('mouseenter', () => {\\n                if (this.player.video.duration) {\\n                    this.thumbnails && this.thumbnails.show();\\n                    this.player.template.playedBarTime.classList.remove('hidden');\\n                }\\n            });\\n\\n            this.player.template.playedBarWrap.addEventListener('mouseleave', () => {\\n                if (this.player.video.duration) {\\n                    this.thumbnails && this.thumbnails.hide();\\n                    this.player.template.playedBarTime.classList.add('hidden');\\n                }\\n            });\\n        }\\n    }\\n\\n    initFullButton(): void {\\n        this.player.template.browserFullButton.addEventListener('click', () => {\\n            this.player.fullScreen.toggle('browser');\\n        });\\n\\n        this.player.template.webFullButton.addEventListener('click', () => {\\n            this.player.fullScreen.toggle('web');\\n        });\\n    }\\n\\n    initPipButton(): void {\\n        if (document.pictureInPictureEnabled) {\\n            this.player.template.pipButton.addEventListener('click', () => {\\n                if (!document.pictureInPictureElement) {\\n                    this.player.video.requestPictureInPicture().catch((reason) => {\\n                        console.error(reason);\\n                        this.player.notice(this.player.tran('PIP not supported'), undefined, undefined, '#FF6F6A');\\n                    });\\n                } else {\\n                    document.exitPictureInPicture();\\n                }\\n            });\\n        } else {\\n            this.player.template.pipButton.style.display = 'none';\\n        }\\n    }\\n\\n    initVolumeButton(): void {\\n        const vWidth = 35;\\n\\n        const volumeMove = (event: Event) => {\\n            const e = event as TouchEvent | MouseEvent;\\n            const percentage = (utils.getRelativeX(e, this.player.template.volumeBarWrap) - 5.5) / vWidth;\\n            this.player.volume(percentage);\\n        };\\n        const volumeUp = () => {\\n            document.removeEventListener(utils.nameMap.dragEnd, volumeUp);\\n            document.removeEventListener(utils.nameMap.dragMove, volumeMove);\\n            // fallback for Document Picture-in-Picture window\\n            this.player.container.removeEventListener(utils.nameMap.dragEnd, volumeUp);\\n            this.player.container.removeEventListener(utils.nameMap.dragMove, volumeMove);\\n            this.player.template.volumeButton.classList.remove('dplayer-volume-active');\\n        };\\n\\n        this.player.template.volumeBarWrapWrap.addEventListener('click', (event: Event) => {\\n            const e = event as TouchEvent | MouseEvent;\\n            const percentage = (utils.getRelativeX(e, this.player.template.volumeBarWrap) - 5.5) / vWidth;\\n            this.player.volume(percentage);\\n        });\\n        this.player.template.volumeBarWrapWrap.addEventListener(utils.nameMap.dragStart, () => {\\n            document.addEventListener(utils.nameMap.dragMove, volumeMove);\\n            document.addEventListener(utils.nameMap.dragEnd, volumeUp);\\n            // fallback for Document Picture-in-Picture window\\n            this.player.container.addEventListener(utils.nameMap.dragMove, volumeMove);\\n            this.player.container.addEventListener(utils.nameMap.dragEnd, volumeUp);\\n            this.player.template.volumeButton.classList.add('dplayer-volume-active');\\n        });\\n        this.player.template.volumeButtonIcon.addEventListener('click', () => {\\n            if (this.player.video.muted) {\\n                this.player.video.muted = false;\\n                this.player.switchVolumeIcon();\\n                this.player.bar.set('volume', this.player.volume(), 'width');\\n            } else {\\n                this.player.video.muted = true;\\n                this.player.template.volumeIcon.innerHTML = Icons.volumeOff;\\n                this.player.bar.set('volume', 0, 'width');\\n            }\\n        });\\n    }\\n\\n    initSyncButton(): void {\\n        if (this.player.options.live) {\\n            this.player.template.syncButton.addEventListener('click', () => {\\n                this.player.sync();\\n            });\\n        }\\n    }\\n\\n    initScreenshotButton(): void {\\n        if (this.player.options.screenshot) {\\n            this.player.template.cameraButton.addEventListener('click', () => {\\n                const canvas = document.createElement('canvas');\\n                canvas.width = this.player.video.videoWidth;\\n                canvas.height = this.player.video.videoHeight;\\n                canvas.getContext('2d')!.drawImage(this.player.video, 0, 0, canvas.width, canvas.height);\\n\\n                canvas.toBlob((blob) => {\\n                    if (blob === null) return;\\n\\n                    // generate download filename\\n                    const today = new Date();\\n                    const year = today.getFullYear();\\n                    const month = ('0' + (today.getMonth() + 1)).slice(-2);\\n                    const day = ('0' + today.getDate()).slice(-2);\\n                    const hour = ('0' + today.getHours()).slice(-2);\\n                    const min = ('0' + today.getMinutes()).slice(-2);\\n                    const sec = ('0' + today.getSeconds()).slice(-2);\\n                    const filename = `Capture_${year}${month}${day}-${hour}${min}${sec}.jpg`;\\n\\n                    // download screenshot\\n                    const bloburl = URL.createObjectURL(blob);\\n                    const link = document.createElement('a');\\n                    if (typeof link.download === 'undefined') {\\n                        this.player.notice('Error: Screenshot download is not supported.', undefined, undefined, '#FF6F6A');\\n                        return;\\n                    }\\n                    link.download = filename;\\n                    link.href = bloburl;\\n                    link.click();\\n                    URL.revokeObjectURL(bloburl);\\n\\n                    this.player.events.trigger('screenshot', blob);\\n\\n                // specify image type and quality\\n                }, 'image/jpeg', 1);\\n            });\\n        }\\n    }\\n\\n    initAirplayButton(): void {\\n        if (this.player.options.airplay) {\\n            if (window.WebKitPlaybackTargetAvailabilityEvent) {\\n                this.player.video.addEventListener(\\n                    'webkitplaybacktargetavailabilitychanged',\\n                    function(this: DPlayer, event: WebKitPlaybackTargetAvailabilityEvent) {\\n                        switch (event.availability) {\\n                            case 'available':\\n                                // @ts-ignore\\n                                this.template.airplayButton.disable = false;\\n                                break;\\n\\n                            default:\\n                                // @ts-ignore\\n                                this.template.airplayButton.disable = true;\\n                        }\\n\\n                        this.template.airplayButton.addEventListener(\\n                            'click',\\n                            function(this: DPlayer) {\\n                                this.video.webkitShowPlaybackTargetPicker();\\n                            }.bind(this),\\n                        );\\n                    }.bind(this.player),\\n                );\\n            } else {\\n                this.player.template.airplayButton.style.display = 'none';\\n            }\\n        }\\n    }\\n\\n    initSubtitleButton(): void {\\n        if (this.player.options.subtitle) {\\n            this.player.events.on('subtitle_show', () => {\\n                this.player.template.subtitleButton.ariaLabel = this.player.tran('Hide subtitle');\\n                this.player.template.subtitleButtonInner.style.opacity = '';\\n                this.player.user.set('subtitle', 1);\\n            });\\n            this.player.events.on('subtitle_hide', () => {\\n                this.player.template.subtitleButton.ariaLabel = this.player.tran('Show subtitle');\\n                this.player.template.subtitleButtonInner.style.opacity = '0.4';\\n                this.player.user.set('subtitle', 0);\\n            });\\n\\n            this.player.template.subtitleButton.addEventListener('click', () => {\\n                if (this.player.subtitle !== null) {\\n                    this.player.subtitle.toggle();\\n                }\\n            });\\n        }\\n    }\\n\\n    setAutoHide(time = 3000): void {\\n        this.show();\\n        window.clearTimeout(this.autoHideTimer);\\n        this.autoHideTimer = window.setTimeout(() => {\\n            if (this.player.video.played.length && !this.player.paused && !this.disableAutoHide) {\\n                this.hide();\\n            }\\n        }, time);\\n    }\\n\\n    show(): void {\\n        this.player.container.classList.remove('dplayer-hide-controller');\\n    }\\n\\n    hide() : void{\\n        this.player.container.classList.add('dplayer-hide-controller');\\n        this.player.setting.hide();\\n        this.player.comment && this.player.comment.hide();\\n    }\\n\\n    isShow(): boolean {\\n        return !this.player.container.classList.contains('dplayer-hide-controller');\\n    }\\n\\n    toggle(): void {\\n        if (this.isShow()) {\\n            this.hide();\\n        } else {\\n            this.show();\\n        }\\n    }\\n\\n    destroy(): void {\\n        if (!utils.isMobile) {\\n            this.player.container.removeEventListener('mousemove', this.setAutoHideHandler);\\n            this.player.container.removeEventListener('click', this.setAutoHideHandler);\\n        } else {\\n            this.player.container.removeEventListener('touchmove', this.setAutoHideHandler);\\n        }\\n        window.clearTimeout(this.autoHideTimer);\\n    }\\n}\\n\\nexport default Controller;\\n\",\"import DPlayer from './player';\\nimport utils from './utils';\\nimport * as DPlayerType from './types';\\n\\ndeclare let window: DPlayerType.WindowExtend;\\n\\nclass Setting {\\n    player: DPlayer;\\n    loop: boolean;\\n    showDanmaku: boolean;\\n    unlimitDanmaku: boolean;\\n    currentAudio: 'primary' | 'secondary' = 'primary';\\n    resizeObserver: ResizeObserver;\\n\\n    constructor(player: DPlayer) {\\n        this.player = player;\\n\\n        this.player.template.mask.addEventListener('click', () => {\\n            this.hide();\\n        });\\n        this.player.template.settingButton.addEventListener('click', () => {\\n            this.show();\\n        });\\n\\n        // clip setting box\\n        const clipSettingBox = () => {\\n            const settingOriginPanelHeight = this.player.template.settingOriginPanel.scrollHeight;\\n            this.player.template.settingBox.style.clipPath = `inset(calc(100% - ${settingOriginPanelHeight}px) 0 0 round 7px)`;\\n        };\\n        clipSettingBox();\\n        this.resizeObserver = new ResizeObserver(clipSettingBox);\\n        this.resizeObserver.observe(this.player.template.settingOriginPanel);\\n\\n        // quality\\n        if (this.player.options.video.quality) {\\n            this.player.template.quality.addEventListener('click', () => {\\n                this.player.template.settingBox.classList.add('dplayer-setting-box-quality');\\n            });\\n            this.player.template.qualityHeader.addEventListener('click', () => {\\n                this.player.template.settingBox.classList.remove('dplayer-setting-box-quality');\\n            });\\n            for (let i = 0; i < this.player.template.qualityItem.length; i++) {\\n                this.player.template.qualityItem[i].addEventListener('click', () => {\\n                    // currently switching\\n                    if (this.player.switchingQuality) {\\n                        return;\\n                    }\\n                    this.player.switchQuality(parseInt(this.player.template.qualityItem[i].dataset.index!));\\n                });\\n            }\\n        }\\n\\n        // speed\\n        this.player.template.speed.addEventListener('click', () => {\\n            this.player.template.settingBox.classList.add('dplayer-setting-box-speed');\\n        });\\n        this.player.template.speedHeader.addEventListener('click', () => {\\n            this.player.template.settingBox.classList.remove('dplayer-setting-box-speed');\\n        });\\n        for (let i = 0; i < this.player.template.speedItem.length; i++) {\\n            this.player.template.speedItem[i].addEventListener('click', (event: any) => {\\n                this.player.speed(parseFloat(event.target.dataset.speed));\\n            });\\n        }\\n\\n        // audio\\n        this.player.template.audio.addEventListener('click', () => {\\n            this.player.template.settingBox.classList.add('dplayer-setting-box-audio');\\n        });\\n        this.player.template.audioHeader.addEventListener('click', () => {\\n            this.player.template.settingBox.classList.remove('dplayer-setting-box-audio');\\n        });\\n        for (let i = 0; i < this.player.template.audioItem.length; i++) {\\n            this.player.template.audioItem[i].addEventListener('click', () => {\\n                // for mpegts\\n                if (this.player.plugins.mpegts && window.mpegts && this.player.plugins.mpegts instanceof window.mpegts.MSEPlayer) {\\n                    if (this.player.template.audioItem[i].dataset.audio === this.currentAudio) {\\n                        return;  // already on this audio\\n                    }\\n                    if (this.player.template.audioItem[i].dataset.audio === 'primary') {\\n                        // switch primary audio\\n                        this.currentAudio = 'primary';\\n                        this.player.template.audioItem[0].classList.add('dplayer-setting-audio-current');\\n                        this.player.template.audioItem[1].classList.remove('dplayer-setting-audio-current');\\n                        this.player.template.audioValue.textContent = this.player.tran('Primary audio');\\n                        this.player.plugins.mpegts.switchPrimaryAudio();\\n                    } else if (this.player.template.audioItem[i].dataset.audio === 'secondary') {\\n                        // switch secondary audio\\n                        this.currentAudio = 'secondary';\\n                        this.player.template.audioItem[0].classList.remove('dplayer-setting-audio-current');\\n                        this.player.template.audioItem[1].classList.add('dplayer-setting-audio-current');\\n                        this.player.template.audioValue.textContent = this.player.tran('Secondary audio');\\n                        this.player.plugins.mpegts.switchSecondaryAudio();\\n                    }\\n                    this.player.template.settingBox.classList.remove('dplayer-setting-box-audio');\\n                // for hls.js\\n                } else if (this.player.plugins.hls && window.Hls && this.player.plugins.hls instanceof window.Hls) {\\n                    const hls = this.player.plugins.hls;\\n                    if (hls.audioTracks.length <= 1) {\\n                        return;  // no multiple audio tracks\\n                    }\\n                    if (this.player.template.audioItem[i].dataset.audio === this.currentAudio) {\\n                        return;  // already on this audio\\n                    }\\n                    if (this.player.template.audioItem[i].dataset.audio === 'primary') {\\n                        // switch to primary audio track (index 0)\\n                        this.currentAudio = 'primary';\\n                        this.player.template.audioItem[0].classList.add('dplayer-setting-audio-current');\\n                        this.player.template.audioItem[1].classList.remove('dplayer-setting-audio-current');\\n                        this.player.template.audioValue.textContent = this.player.tran('Primary audio');\\n                        hls.audioTrack = 0;\\n                    } else if (this.player.template.audioItem[i].dataset.audio === 'secondary') {\\n                        // switch to secondary audio track (index 1)\\n                        this.currentAudio = 'secondary';\\n                        this.player.template.audioItem[0].classList.remove('dplayer-setting-audio-current');\\n                        this.player.template.audioItem[1].classList.add('dplayer-setting-audio-current');\\n                        this.player.template.audioValue.textContent = this.player.tran('Secondary audio');\\n                        hls.audioTrack = 1;\\n                    }\\n                    this.player.template.settingBox.classList.remove('dplayer-setting-box-audio');\\n                }\\n            });\\n        }\\n\\n        // loop\\n        this.loop = this.player.user.get('loop') === 1;\\n        this.player.template.loopToggle.checked = this.loop;\\n        this.player.template.loop.addEventListener('click', () => {\\n            this.player.template.loopToggle.checked = !this.player.template.loopToggle.checked;\\n            if (this.player.template.loopToggle.checked) {\\n                this.loop = true;\\n            } else {\\n                this.loop = false;\\n            }\\n            this.player.user.set('loop', this.loop ? 1 : 0);\\n        });\\n\\n        // show danmaku\\n        this.showDanmaku = this.player.user.get('danmaku') === 1;\\n        if (!this.showDanmaku) {\\n            this.player.danmaku && this.player.danmaku.hide();\\n        }\\n        this.player.template.showDanmakuToggle.checked = this.showDanmaku;\\n        this.player.template.showDanmaku.addEventListener('click', () => {\\n            this.player.template.showDanmakuToggle.checked = !this.player.template.showDanmakuToggle.checked;\\n            if (this.player.template.showDanmakuToggle.checked) {\\n                this.showDanmaku = true;\\n                if (this.player.danmaku !== null) {\\n                    this.player.danmaku.show();\\n                }\\n            } else {\\n                this.showDanmaku = false;\\n                if (this.player.danmaku !== null) {\\n                    this.player.danmaku.hide();\\n                }\\n            }\\n            this.player.user.set('danmaku', this.showDanmaku ? 1 : 0);\\n        });\\n\\n        // unlimit danmaku\\n        this.unlimitDanmaku = this.player.user.get('unlimited') === 1;\\n        this.player.template.unlimitDanmakuToggle.checked = this.unlimitDanmaku;\\n        this.player.template.unlimitDanmaku.addEventListener('click', () => {\\n            this.player.template.unlimitDanmakuToggle.checked = !this.player.template.unlimitDanmakuToggle.checked;\\n            if (this.player.template.unlimitDanmakuToggle.checked) {\\n                this.unlimitDanmaku = true;\\n                if (this.player.danmaku !== null) {\\n                    this.player.danmaku.unlimit(true);\\n                }\\n            } else {\\n                this.unlimitDanmaku = false;\\n                if (this.player.danmaku !== null) {\\n                    this.player.danmaku.unlimit(false);\\n                }\\n            }\\n            this.player.user.set('unlimited', this.unlimitDanmaku ? 1 : 0);\\n        });\\n\\n        // danmaku opacity\\n        if (this.player.danmaku) {\\n            this.player.on('danmaku_opacity', (percentage: number) => {\\n                this.player.bar.set('danmaku', percentage, 'width');\\n                this.player.user.set('opacity', percentage);\\n                this.player.template.danmakuOpacityValue.textContent = percentage.toFixed(1);\\n            });\\n            this.player.danmaku.opacity(this.player.user.get('opacity'));\\n            this.player.template.danmakuOpacityValue.textContent = this.player.user.get('opacity').toFixed(1);\\n\\n            const danmakuMove = (event: Event) => {\\n                const e = event as PointerEvent | TouchEvent | MouseEvent;\\n                const barWidth = this.player.template.danmakuOpacityBarWrap.clientWidth;\\n                let percentage = utils.getRelativeX(e, this.player.template.danmakuOpacityBarWrap) / barWidth;\\n                percentage = Math.max(percentage, 0);\\n                percentage = Math.min(percentage, 1);\\n                if (this.player.danmaku !== null) {\\n                    this.player.danmaku.opacity(percentage);\\n                }\\n            };\\n            const danmakuUp = () => {\\n                document.removeEventListener(utils.nameMap.dragEnd, danmakuUp);\\n                document.removeEventListener(utils.nameMap.dragMove, danmakuMove);\\n                // fallback for Document Picture-in-Picture window\\n                this.player.container.removeEventListener(utils.nameMap.dragEnd, danmakuUp);\\n                this.player.container.removeEventListener(utils.nameMap.dragMove, danmakuMove);\\n                this.player.template.danmakuOpacityBox.classList.remove('dplayer-setting-danmaku-active');\\n            };\\n\\n            this.player.template.danmakuOpacityBarWrapWrap.addEventListener('click', (event: Event) => {\\n                const e = event as PointerEvent | TouchEvent | MouseEvent;\\n                const barWidth = this.player.template.danmakuOpacityBarWrap.clientWidth;\\n                let percentage = utils.getRelativeX(e, this.player.template.danmakuOpacityBarWrap) / barWidth;\\n                percentage = Math.max(percentage, 0);\\n                percentage = Math.min(percentage, 1);\\n                if (this.player.danmaku !== null) {\\n                    this.player.danmaku.opacity(percentage);\\n                }\\n            });\\n            this.player.template.danmakuOpacityBarWrapWrap.addEventListener(utils.nameMap.dragStart, () => {\\n                document.addEventListener(utils.nameMap.dragMove, danmakuMove);\\n                document.addEventListener(utils.nameMap.dragEnd, danmakuUp);\\n                // fallback for Document Picture-in-Picture window\\n                this.player.container.addEventListener(utils.nameMap.dragMove, danmakuMove);\\n                this.player.container.addEventListener(utils.nameMap.dragEnd, danmakuUp);\\n                this.player.template.danmakuOpacityBox.classList.add('dplayer-setting-danmaku-active');\\n            });\\n        }\\n    }\\n\\n    hide(): void {\\n        this.player.template.container.classList.remove('dplayer-show-controller');\\n        this.player.template.settingBox.classList.remove('dplayer-setting-box-open');\\n        this.player.template.mask.classList.remove('dplayer-mask-show');\\n        window.setTimeout(() => {\\n            this.player.template.settingBox.classList.remove('dplayer-setting-box-speed');\\n            this.player.template.settingBox.classList.remove('dplayer-setting-box-audio');\\n        }, 300);\\n\\n        this.player.controller.disableAutoHide = false;\\n    }\\n\\n    show(): void {\\n        this.player.template.container.classList.add('dplayer-show-controller');\\n        this.player.template.settingBox.classList.add('dplayer-setting-box-open');\\n        this.player.template.mask.classList.add('dplayer-mask-show');\\n\\n        this.player.controller.disableAutoHide = true;\\n    }\\n\\n    destroy(): void {\\n        this.resizeObserver.disconnect();\\n    }\\n}\\n\\nexport default Setting;\\n\",\"import DPlayer from './player';\\nimport * as DPlayerType from './types';\\n\\nclass Comment {\\n    player: DPlayer;\\n\\n    constructor(player: DPlayer) {\\n        this.player = player;\\n\\n        this.player.template.mask.addEventListener('click', () => {\\n            this.hide();\\n        });\\n        this.player.template.commentButton.addEventListener('click', () => {\\n            this.show();\\n        });\\n        this.player.template.commentSettingButton.addEventListener('click', () => {\\n            this.toggleSetting();\\n        });\\n\\n        this.player.template.commentColorSettingBox.addEventListener('click', () => {\\n            const spanElem = this.player.template.commentColorSettingBox.querySelector('input:checked+span');\\n            if (spanElem) {\\n                const color = this.player.template.commentColorSettingBox.querySelector<HTMLInputElement>('input:checked')!.value;\\n                this.player.template.commentSettingFill.style.fill = color;\\n                this.player.template.commentInput.style.color = color;\\n                this.player.template.commentSendFill.style.fill = color;\\n            }\\n        });\\n\\n        this.player.template.commentInput.addEventListener('click', () => {\\n            this.hideSetting();\\n        });\\n        this.player.template.commentInput.addEventListener('keydown', (e) => {\\n            const event = e || window.event;\\n            if (event.keyCode === 13) {\\n                this.send();\\n            }\\n        });\\n\\n        this.player.template.commentSendButton.addEventListener('click', () => {\\n            this.send();\\n        });\\n    }\\n\\n    show(): void {\\n        this.player.controller.disableAutoHide = true;\\n        this.player.template.controller.classList.add('dplayer-controller-comment');\\n        this.player.template.mask.classList.add('dplayer-mask-show');\\n        this.player.container.classList.add('dplayer-show-controller');\\n        this.player.template.commentInput.focus();\\n    }\\n\\n    hide(): void {\\n        this.player.template.controller.classList.remove('dplayer-controller-comment');\\n        this.player.template.mask.classList.remove('dplayer-mask-show');\\n        this.player.container.classList.remove('dplayer-show-controller');\\n        this.player.controller.disableAutoHide = false;\\n        this.hideSetting();\\n    }\\n\\n    showSetting(): void {\\n        this.player.template.commentSettingBox.classList.add('dplayer-comment-setting-open');\\n    }\\n\\n    hideSetting(): void {\\n        this.player.template.commentSettingBox.classList.remove('dplayer-comment-setting-open');\\n    }\\n\\n    toggleSetting(): void {\\n        if (this.player.template.commentSettingBox.classList.contains('dplayer-comment-setting-open')) {\\n            this.hideSetting();\\n        } else {\\n            this.showSetting();\\n        }\\n    }\\n\\n    send(): void {\\n\\n        // remove focus from comment input form\\n        if (this.player.options.danmaku?.closeCommentFormAfterSend === true) {\\n            this.player.template.commentInput.blur();\\n        }\\n\\n        // text can't be empty\\n        if (!this.player.template.commentInput.value.replace(/^\\\\s+|\\\\s+$/g, '')) {\\n            this.player.notice(this.player.tran('Please input danmaku content'), undefined, undefined, '#FF6F6A');\\n            return;\\n        }\\n\\n        if (this.player.danmaku !== null) {\\n            this.player.danmaku.send(\\n                {\\n                    text: this.player.template.commentInput.value,\\n                    color: this.player.container.querySelector<HTMLInputElement>('.dplayer-comment-setting-color input:checked')!.value,\\n                    type: this.player.container.querySelector<HTMLInputElement>('.dplayer-comment-setting-type input:checked')!.value as DPlayerType.DanmakuType,\\n                    size: this.player.container.querySelector<HTMLInputElement>('.dplayer-comment-setting-size input:checked')!.value as DPlayerType.DanmakuSize,\\n                },\\n                () => {\\n                    if (this.player.options.danmaku?.closeCommentFormAfterSend === true) {\\n                        this.hide();\\n                        this.player.controller.setAutoHide(750);\\n                    }\\n                },\\n                true,\\n            );\\n        }\\n\\n        // prevent double send\\n        this.player.template.commentInput.value = '';\\n    }\\n}\\n\\nexport default Comment;\\n\",\"import DPlayer from './player';\\n\\nclass HotKey {\\n    player: DPlayer;\\n    doHotKeyHandler: (e: KeyboardEvent) => void;\\n    cancelFullScreenHandler: (e: KeyboardEvent) => void;\\n\\n    constructor(player: DPlayer) {\\n        this.player = player;\\n        this.doHotKeyHandler = this.doHotKey.bind(this);\\n        this.cancelFullScreenHandler = this.cancelFullScreen.bind(this);\\n        if (this.player.options.hotkey) {\\n            document.addEventListener('keydown', this.doHotKeyHandler);\\n        }\\n        document.addEventListener('keydown', this.cancelFullScreenHandler);\\n    }\\n\\n    doHotKey(e: KeyboardEvent): void {\\n        const tag = document.activeElement?.tagName.toUpperCase();\\n        const editable = document.activeElement?.getAttribute('contenteditable');\\n        if (tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') {\\n            const event = e || window.event;\\n            let percentage;\\n            switch (event.keyCode) {\\n                case 32:\\n                    if (this.player.focus || this.player.options.hotkey) {\\n                        event.preventDefault();\\n                        this.player.toggle();\\n                    }\\n                    break;\\n                case 37:\\n                    if (this.player.focus || this.player.options.hotkey) {\\n                        event.preventDefault();\\n                        if (event.altKey) {\\n                            this.player.seek(this.player.video.currentTime - 60);\\n                        } else if (event.shiftKey) {\\n                            this.player.seek(this.player.video.currentTime - 30);\\n                        } else if (event.ctrlKey || event.metaKey) {\\n                            this.player.seek(this.player.video.currentTime - 15);\\n                        } else {\\n                            this.player.seek(this.player.video.currentTime - 5);\\n                        }\\n                        this.player.controller.setAutoHide();\\n                    }\\n                    break;\\n                case 39:\\n                    if (this.player.focus || this.player.options.hotkey) {\\n                        event.preventDefault();\\n                        if (event.altKey) {\\n                            this.player.seek(this.player.video.currentTime + 60);\\n                        } else if (event.shiftKey) {\\n                            this.player.seek(this.player.video.currentTime + 30);\\n                        } else if (event.ctrlKey || event.metaKey) {\\n                            this.player.seek(this.player.video.currentTime + 15);\\n                        } else {\\n                            this.player.seek(this.player.video.currentTime + 5);\\n                        }\\n                        this.player.controller.setAutoHide();\\n                    }\\n                    break;\\n                case 38:\\n                    if (this.player.focus) {\\n                        event.preventDefault();\\n                        percentage = this.player.volume() + 0.1;\\n                        this.player.volume(percentage);\\n                    }\\n                    break;\\n                case 40:\\n                    if (this.player.focus) {\\n                        event.preventDefault();\\n                        percentage = this.player.volume() - 0.1;\\n                        this.player.volume(percentage);\\n                    }\\n                    break;\\n                case 70: // F\\n                    if (!event.ctrlKey && !event.metaKey) {\\n                        event.preventDefault();\\n                        this.player.fullScreen.toggle('browser');\\n                    }\\n                    break;\\n                case 87: // W\\n                    if (!event.ctrlKey && !event.metaKey) {\\n                        event.preventDefault();\\n                        this.player.fullScreen.toggle('web');\\n                    }\\n                    break;\\n                case 76: // L\\n                    if (this.player.options.live) {\\n                        event.preventDefault();\\n                        this.player.sync();\\n                    }\\n                    break;\\n                case 80: // P\\n                    if (this.player.options.pictureInPicture) {\\n                        if (document.pictureInPictureEnabled) {\\n                            event.preventDefault();\\n                            this.player.template.pipButton.click();\\n                        }\\n                    }\\n                    break;\\n                case 67: // C\\n                    if (typeof this.player.options.danmaku === 'object' && this.player.options.danmaku) {\\n                        if (!event.ctrlKey && !event.metaKey) {\\n                            event.preventDefault();\\n                            this.player.controller.show();\\n                            if (this.player.comment != null) {\\n                                this.player.comment.show();\\n                            }\\n                        }\\n                    }\\n                    break;\\n                case 68: // D\\n                    if (typeof this.player.options.danmaku === 'object' && this.player.options.danmaku) {\\n                        if (!event.ctrlKey && !event.metaKey) {\\n                            event.preventDefault();\\n                            this.player.template.showDanmaku.click();\\n                            if (this.player.template.showDanmakuToggle.checked) {\\n                                this.player.notice(`${this.player.tran('Show comment')}`);\\n                            } else {\\n                                this.player.notice(`${this.player.tran('Hide comment')}`);\\n                            }\\n                        }\\n                    }\\n                    break;\\n                case 83: // S\\n                    if (this.player.options.subtitle) {\\n                        if (!event.ctrlKey && !event.metaKey) {\\n                            event.preventDefault();\\n                            if (this.player.subtitle !== null) {\\n                                if (this.player.subtitle.container.classList.contains('dplayer-subtitle-hide')) {\\n                                    this.player.notice(`${this.player.tran('Show subtitle')}`);\\n                                } else {\\n                                    this.player.notice(`${this.player.tran('Hide subtitle')}`);\\n                                }\\n                                this.player.subtitle.toggle();\\n                            }\\n                        }\\n                    }\\n                    break;\\n            }\\n        }\\n    }\\n\\n    cancelFullScreen(e: KeyboardEvent): void {\\n        const event = e || window.event;\\n        switch (event.keyCode) {\\n            case 27:\\n                if (this.player.fullScreen.isFullScreen('web')) {\\n                    this.player.fullScreen.cancel('web');\\n                }\\n                break;\\n        }\\n    }\\n\\n    destroy(): void {\\n        if (this.player.options.hotkey) {\\n            document.removeEventListener('keydown', this.doHotKeyHandler);\\n        }\\n        document.removeEventListener('keydown', this.cancelFullScreenHandler);\\n    }\\n}\\n\\nexport default HotKey;\\n\",\"import DPlayer from './player';\\n\\nclass ContextMenu {\\n    contextmenuHandler: (e: MouseEvent) => void;\\n    player: DPlayer;\\n    shown: boolean;\\n\\n    constructor(player: DPlayer) {\\n        this.player = player;\\n        this.shown = false;\\n\\n        Array.prototype.slice.call(this.player.template.menuItem).forEach((item, index) => {\\n            if (this.player.options.contextmenu[index].click) {\\n                item.addEventListener('click', () => {\\n                    const contextmenu = this.player.options.contextmenu[index];\\n                    if (contextmenu.click) contextmenu.click(this.player);\\n                    this.hide();\\n                });\\n            }\\n        });\\n\\n        this.contextmenuHandler = (e: MouseEvent) => {\\n            const event = e || window.event;\\n            event.preventDefault();\\n\\n            if (this.shown) {\\n                this.hide();\\n                return;\\n            }\\n\\n            const clientRect = this.player.container.getBoundingClientRect();\\n            this.show(event.clientX - clientRect.left, event.clientY - clientRect.top);\\n\\n            this.player.template.mask.addEventListener('click', () => {\\n                this.hide();\\n            });\\n        };\\n        this.player.container.addEventListener('contextmenu', this.contextmenuHandler);\\n    }\\n\\n    show(x: number, y: number): void {\\n        this.player.template.menu.classList.add('dplayer-menu-show');\\n\\n        const clientRect = this.player.container.getBoundingClientRect();\\n        if (x + this.player.template.menu.offsetWidth >= clientRect.width) {\\n            this.player.template.menu.style.right = clientRect.width - x + 'px';\\n            this.player.template.menu.style.left = 'initial';\\n        } else {\\n            this.player.template.menu.style.left = x + 'px';\\n            this.player.template.menu.style.right = 'initial';\\n        }\\n        if (y + this.player.template.menu.offsetHeight >= clientRect.height) {\\n            this.player.template.menu.style.bottom = clientRect.height - y + 'px';\\n            this.player.template.menu.style.top = 'initial';\\n        } else {\\n            this.player.template.menu.style.top = y + 'px';\\n            this.player.template.menu.style.bottom = 'initial';\\n        }\\n\\n        this.player.template.mask.classList.add('dplayer-mask-show');\\n\\n        this.shown = true;\\n        this.player.events.trigger('contextmenu_show');\\n    }\\n\\n    hide(): void {\\n        this.player.template.mask.classList.remove('dplayer-mask-show');\\n        this.player.template.menu.classList.remove('dplayer-menu-show');\\n\\n        this.shown = false;\\n        this.player.events.trigger('contextmenu_hide');\\n    }\\n\\n    destroy(): void {\\n        this.player.container.removeEventListener('contextmenu', this.contextmenuHandler);\\n    }\\n}\\n\\nexport default ContextMenu;\\n\",\"/* global DPLAYER_VERSION GIT_HASH */\\nimport DPlayer from './player';\\nimport Template from './template';\\nimport Mpegts from 'mpegts.js';\\nimport FlvJs from 'flv.js';\\n\\nclass InfoPanel {\\n    player: DPlayer;\\n    container: HTMLElement;\\n    template: Template;\\n    video: HTMLVideoElement;\\n    beginTime = 0;\\n\\n    constructor(player: DPlayer) {\\n        this.player = player;\\n        this.container = player.template.infoPanel;\\n        this.template = player.template;\\n        this.video = player.video;\\n\\n        this.template.infoPanelClose.addEventListener('click', () => {\\n            this.hide();\\n        });\\n    }\\n\\n    show(): void {\\n        this.beginTime = Date.now();\\n        this.update();\\n        this.player.timer.enable('info');\\n        this.player.timer.enable('fps');\\n        this.container.classList.remove('dplayer-info-panel-hide');\\n    }\\n\\n    hide(): void {\\n        this.player.timer.disable('info');\\n        this.player.timer.disable('fps');\\n        this.container.classList.add('dplayer-info-panel-hide');\\n    }\\n\\n    toggle(): void {\\n        if (this.container.classList.contains('dplayer-info-panel-hide')) {\\n            this.show();\\n        } else {\\n            this.hide();\\n        }\\n    }\\n\\n    update(): void {\\n        // @ts-ignore\\n        this.template.infoVersion.textContent = `v${DPLAYER_VERSION} ${GIT_HASH}`;\\n        this.template.infoType.textContent = this.player.type;\\n        this.template.infoUrl.textContent = this.player.options.video.url ?? 'N/A';\\n        this.template.infoResolution.textContent = `${this.player.video.videoWidth} x ${this.player.video.videoHeight}`;\\n        this.template.infoDuration.textContent = `${this.player.video.duration}`;\\n\\n        // Dropped Frames\\n        if (this.player.video['getVideoPlaybackQuality'] != undefined) {\\n            const quality = this.player.video.getVideoPlaybackQuality();\\n            this.template.infoDroppedFrames.textContent = `${quality.droppedVideoFrames} / ${quality.totalVideoFrames}`;\\n        } else if ((this.player.video as any)['webkitDecodedFrameCount'] != undefined) {\\n            const decoded: number = (this.player.video as any)['webkitDecodedFrameCount'];\\n            const dropped: number = (this.player.video as any)['webkitDroppedFrameCount'];\\n            this.template.infoDroppedFrames.textContent = `${dropped} / ${decoded}`;\\n        } else {\\n            this.template.infoDroppedFrames.textContent = `N/A`;\\n        }\\n\\n        // Buffer Remain\\n        if (this.player.video.buffered.length > 0) {\\n            const bufferedRangeCount = this.player.video.buffered.length;\\n            const bufferRemain = this.player.video.buffered.end(bufferedRangeCount - 1) - this.player.video.currentTime;\\n            this.template.infoBufferRemain.textContent = `${bufferRemain.toFixed(3)} s`;\\n        } else {\\n            this.template.infoBufferRemain.textContent = 'N/A';\\n        }\\n\\n        // flv.js / mpegts.js related metrics\\n        if (this.player.type === 'mpegts' || this.player.type === 'flv') {\\n            const player: Mpegts.Player | Mpegts.MSEPlayer | Mpegts.NativePlayer | FlvJs.Player | undefined =\\n                this.player.plugins.mpegts || this.player.plugins.flvjs;\\n            if (player) {\\n                const mediaInfo = player.mediaInfo as Mpegts.MSEPlayerMediaInfo;\\n                const statisticsInfo = player.statisticsInfo as Mpegts.MSEPlayerStatisticsInfo;\\n                this.template.infoMimeType.textContent = mediaInfo.mimeType ?? 'N/A';\\n                this.template.infoVideoFPS.textContent = `${mediaInfo.fps?.toFixed(3) ?? 'N/A'}`;\\n                if (statisticsInfo.speed != undefined) {\\n                    this.template.infoDownloadSpeed.textContent = `${statisticsInfo.speed.toFixed(3)} KB/s`;\\n                } else {\\n                    this.template.infoDownloadSpeed.textContent = 'N/A';\\n                }\\n            }\\n        } else {\\n            this.template.infoMimeType.textContent = 'N/A';\\n            this.template.infoVideoFPS.textContent = 'N/A';\\n            this.template.infoDownloadSpeed.textContent = 'N/A';\\n        }\\n    }\\n\\n    fps(value: number): void {\\n        this.template.infoPageFPS.textContent = `${value.toFixed(1)}`;\\n    }\\n}\\n\\nexport default InfoPanel;\\n\",\"import * as aribb24js from 'aribb24.js';\\n\\nimport utils from './utils';\\nimport handleOption from './options';\\nimport i18n from './i18n';\\nimport Template from './template';\\nimport Icons from './icons';\\nimport Danmaku from './danmaku';\\nimport Events from './events';\\nimport FullScreen from './fullscreen';\\nimport User from './user';\\nimport Subtitle from './subtitle';\\nimport Bar from './bar';\\nimport Timer from './timer';\\nimport Bezel from './bezel';\\nimport Controller from './controller';\\nimport Setting from './setting';\\nimport Comment from './comment';\\nimport HotKey from './hotkey';\\nimport ContextMenu from './contextmenu';\\nimport InfoPanel from './info-panel';\\nimport tplVideo from '../template/video.art';\\nimport defaultApiBackend from './api';\\nimport * as DPlayerType from './types';\\n\\nlet index = 0;\\nconst instances: DPlayer[] = [];\\n\\ndeclare let window: DPlayerType.WindowExtend;\\n\\nclass DPlayer {\\n    bar: Bar;\\n    bezel: Bezel;\\n    comment: Comment | null = null;\\n    contextmenu: ContextMenu;\\n    controller: Controller;\\n    danmaku: Danmaku | null = null;\\n    events: Events;\\n    fullScreen: FullScreen;\\n    hotkey: HotKey;\\n    infoPanel: InfoPanel;\\n    setting: Setting;\\n    subtitle: Subtitle | null = null;\\n    template: Template;\\n    timer: Timer;\\n    user: User;\\n\\n    container: HTMLElement;\\n    containerClickFun: () => void;\\n    docClickFun: () => void;\\n    focus = false;\\n    narrow = false;\\n    noticeTime: number | null = null;\\n    options: DPlayerType.OptionsInternal;\\n    paused = false;\\n    plugins: DPlayerType.Plugins;\\n    prevVideoCurrentTime = 0;\\n    prevVideo: HTMLVideoElement | null = null;\\n    quality: DPlayerType.VideoQualityInternal | null = null;\\n    qualityIndex: number | null = null;\\n    switchingQuality = false;\\n    resizeObserver: ResizeObserver;\\n    tran: (text: string, ...arg: Array<string | number>) => string;\\n    type: DPlayerType.VideoType | string = 'auto';\\n    video: HTMLVideoElement;\\n\\n    /**\\n     * DPlayer constructor function\\n     *\\n     * @param {Object} options - See README\\n     * @constructor\\n     */\\n    constructor(options: DPlayerType.Options) {\\n        this.options = handleOption({ preload: options.video.type === 'webtorrent' ? 'none' : 'metadata', ...options });\\n\\n        if (this.options.video.quality) {\\n            this.qualityIndex = this.options.video.defaultQuality!;\\n            this.quality = this.options.video.quality[this.options.video.defaultQuality!];\\n        }\\n        // @ts-expect-error TS(7009): 'new' expression, whose target lacks a construct s... Remove this comment to see the full error message\\n        this.tran = new i18n(this.options.lang).tran;\\n        this.events = new Events();\\n        this.user = new User(this);\\n        this.container = this.options.container;\\n\\n        this.container.classList.add('dplayer');\\n        if (this.options.live) {\\n            this.container.classList.add('dplayer-live');\\n        } else {\\n            this.container.classList.remove('dplayer-live');\\n        }\\n        if (utils.isMobile) {\\n            this.container.classList.add('dplayer-mobile');\\n        }\\n        this.narrow = this.container.offsetWidth <= 500;\\n        if (this.narrow) {\\n            this.container.classList.add('dplayer-narrow');\\n        }\\n\\n        // observe container resize\\n        this.resizeObserver = new ResizeObserver((entries) => {\\n            for (const entry of entries) {\\n                if (entry.target === this.container) {\\n                    this.narrow = this.container.offsetWidth <= 500;\\n                    if (this.narrow) {\\n                        this.container.classList.add('dplayer-narrow');\\n                    } else {\\n                        this.container.classList.remove('dplayer-narrow');\\n                    }\\n                }\\n            }\\n            this.resize();\\n        });\\n        this.resizeObserver.observe(this.container);\\n\\n        this.template = new Template({\\n            container: this.container,\\n            options: this.options,\\n            index: index,\\n            tran: this.tran,\\n        });\\n\\n        this.video = this.template.video;\\n\\n        this.bar = new Bar(this.template);\\n\\n        this.bezel = new Bezel(this.template.bezel);\\n\\n        this.fullScreen = new FullScreen(this);\\n\\n        this.controller = new Controller(this);\\n\\n        this.initDanmaku(this.options.danmaku, this.options.apiBackend);\\n\\n        this.plugins = {};\\n        this.docClickFun = () => {\\n            this.focus = false;\\n        };\\n        this.containerClickFun = () => {\\n            this.focus = true;\\n        };\\n        document.addEventListener('click', this.docClickFun, true);\\n        this.container.addEventListener('click', this.containerClickFun, true);\\n\\n        this.paused = true;\\n\\n        this.timer = new Timer(this);\\n\\n        this.hotkey = new HotKey(this);\\n\\n        this.contextmenu = new ContextMenu(this);\\n\\n        this.initVideo(this.video, (this.quality && this.quality.type) || this.options.video.type);\\n\\n        this.setting = new Setting(this);\\n\\n        this.infoPanel = new InfoPanel(this);\\n\\n        if (!this.danmaku && this.options.autoplay) {\\n            this.play();\\n        }\\n\\n        index++;\\n        instances.push(this);\\n    }\\n\\n    /**\\n     * Seek video\\n     */\\n    seek(time: number, hideNotice = false): void {\\n        time = Math.max(time, 0);\\n        const duration = utils.getVideoDuration(this.video, this.template);\\n        if (duration) {\\n            time = Math.min(time, duration);\\n        }\\n        if (!hideNotice) {\\n            if (this.video.currentTime < time) {\\n\\n                this.notice(this.tran('FF progress', (time - this.video.currentTime).toFixed(0)));\\n            } else if (this.video.currentTime > time) {\\n                this.notice(this.tran('REW progress', (this.video.currentTime - time).toFixed(0)));\\n            }\\n        }\\n\\n        if (isFinite(time)) {  // ignore NaN, Infinity, -Infinity\\n            this.video.currentTime = time;\\n        }\\n\\n        if (this.danmaku) {\\n            this.danmaku.seek();\\n        }\\n\\n        this.bar.set('played', time / duration, 'width');\\n        this.template.ptime.textContent = utils.secondToTime(time);\\n    }\\n\\n    /**\\n     * Sync video (live only)\\n     */\\n    sync(quiet = false): void {\\n        if (this.options.live) {\\n            const time = utils.getVideoDuration(this.video, this.template) - this.options.liveSyncMinBufferSize;\\n            try {\\n                this.video.currentTime = time;\\n            } catch (error) {\\n                // seek failed\\n                return;\\n            }\\n\\n            if (this.danmaku) {\\n                this.danmaku.seek();\\n            }\\n\\n            this.template.ptime.textContent = utils.secondToTime(time);\\n            if (!quiet) {\\n                this.notice(this.tran('Synchronized'));\\n            }\\n        }\\n    }\\n\\n    /**\\n     * Play video\\n     */\\n    play(fromNative = false): void {\\n        this.paused = false;\\n        if (this.video.paused && !utils.isMobile) {\\n            this.bezel.switch(Icons.play);\\n        }\\n\\n        this.template.playIcon.innerHTML = Icons.pause;\\n        this.template.mobilePlayButton.innerHTML = Icons.pause;\\n\\n        // if live, sync video in advance\\n        if (this.options.live && this.options.syncWhenPlayingLive) {\\n            this.sync(true);\\n        }\\n\\n        if (!fromNative) {\\n            const playFunc = (this.type === 'mpegts' && this.plugins.mpegts && this.plugins.mpegts.play.bind(this.plugins.mpegts)) || this.video.play.bind(this.video);\\n            const playedPromise = Promise.resolve(playFunc());\\n            playedPromise\\n                .catch(() => {\\n                    this.pause();\\n                })\\n                .then(() => {\\n                    // pass\\n                });\\n        }\\n        this.timer.enable('loading');\\n        this.container.classList.remove('dplayer-paused');\\n        this.container.classList.add('dplayer-playing');\\n        if (this.danmaku) {\\n            this.danmaku.play();\\n        }\\n        if (this.options.mutex) {\\n            for (let i = 0; i < instances.length; i++) {\\n                if (this !== instances[i]) {\\n                    instances[i].pause();\\n                }\\n            }\\n        }\\n    }\\n\\n    /**\\n     * Pause video\\n     */\\n    pause(fromNative = false): void {\\n        this.paused = true;\\n        this.container.classList.remove('dplayer-loading');\\n\\n        if (!this.video.paused && !utils.isMobile) {\\n            this.bezel.switch(Icons.pause);\\n        }\\n\\n        this.template.playIcon.innerHTML = Icons.play;\\n        this.template.mobilePlayButton.innerHTML = Icons.play;\\n        if (!fromNative) {\\n            this.video.pause();\\n        }\\n        this.timer.disable('loading');\\n        this.container.classList.remove('dplayer-playing');\\n        this.container.classList.add('dplayer-paused');\\n        if (this.danmaku) {\\n            this.danmaku.pause();\\n        }\\n    }\\n\\n    switchVolumeIcon(): void {\\n        if (this.volume() >= 0.95) {\\n            this.template.volumeIcon.innerHTML = Icons.volumeUp;\\n        } else if (this.volume() > 0) {\\n            this.template.volumeIcon.innerHTML = Icons.volumeDown;\\n        } else {\\n            this.template.volumeIcon.innerHTML = Icons.volumeOff;\\n        }\\n    }\\n\\n    /**\\n     * Set volume\\n     */\\n    volume(percentage: number | string = NaN, nostorage = false, nonotice = false): number {\\n        if (typeof percentage === 'string') {\\n            percentage = parseFloat(percentage);\\n        }\\n        if (!isNaN(percentage)) {\\n            percentage = Math.max(percentage, 0);\\n            percentage = Math.min(percentage, 1);\\n            this.bar.set('volume', percentage, 'width');\\n            const formatPercentage = `${(percentage * 100).toFixed(0)}%`;\\n            this.template.volumeBarWrapWrap.ariaLabel = formatPercentage;\\n            if (!nostorage) {\\n                this.user.set('volume', percentage);\\n            }\\n            if (!nonotice) {\\n                this.notice(`${this.tran('Volume')} ${(percentage * 100).toFixed(0)}%`);\\n            }\\n\\n            this.video.volume = percentage;\\n            if (this.video.muted) {\\n                this.video.muted = false;\\n            }\\n            this.switchVolumeIcon();\\n        }\\n\\n        return this.video.volume;\\n    }\\n\\n    /**\\n     * Set volume muted\\n     */\\n    muted(muted?: boolean): boolean {\\n        if (typeof muted === 'boolean') {\\n            if (muted) {\\n                this.video.muted = true;\\n                this.template.volumeIcon.innerHTML = Icons.volumeOff;\\n                this.bar.set('volume', 0, 'width');\\n            } else {\\n                this.video.muted = false;\\n                this.switchVolumeIcon();\\n                this.bar.set('volume', this.volume(), 'width');\\n            }\\n        }\\n\\n        return this.video.muted;\\n    }\\n\\n    /**\\n     * Toggle between play and pause\\n     */\\n    toggle(): void {\\n        if (this.video.paused) {\\n            this.play();\\n        } else {\\n            this.pause();\\n        }\\n    }\\n\\n    /**\\n     * Attach event\\n     */\\n    on(name: DPlayerType.Events, callback: (info?: Event | any) => void, once = false): void {\\n        this.events.on(name, callback, once);\\n    }\\n\\n    /**\\n     * Detach event\\n     */\\n    off(name: DPlayerType.Events, callback: (info?: Event | any) => void): void {\\n        this.events.off(name, callback);\\n    }\\n\\n    /**\\n     * Switch to a new video\\n     *\\n     * @param {Object} video - new video info\\n     * @param {Object | boolean} danmakuAPI - new danmaku info\\n     * @param {Boolean} remember - whether to remember the current video time and speed\\n     */\\n    switchVideo(\\n        video: { url: string; type?: DPlayerType.VideoType | string; pic?: string; },\\n        danmakuAPI?: DPlayerType.Danmaku | boolean,\\n        remember = false,\\n        apiBackend: DPlayerType.APIBackend = defaultApiBackend,\\n    ): void {\\n        this.pause();\\n        const seek = this.video.currentTime;\\n        const speed = this.video.playbackRate;\\n        this.video.poster = video.pic ? video.pic : '';\\n        this.video.src = video.url;\\n        this.initMSE(this.video, video.type || 'auto');\\n        if (danmakuAPI) {\\n            if (this.danmaku) {\\n                if (!remember) {\\n                    this.bar.set('played', 0, 'width');\\n                    this.bar.set('loaded', 0, 'width');\\n                    this.template.ptime.textContent = '00:00';\\n                }\\n                this.template.danmaku.innerHTML = '';\\n                this.danmaku.options.apiBackend = apiBackend;\\n                if (typeof danmakuAPI === 'object') {\\n                    this.danmaku.reload({\\n                        id: danmakuAPI.id,\\n                        address: danmakuAPI.api,\\n                        token: danmakuAPI.token,\\n                        maximum: danmakuAPI.maximum,\\n                        addition: danmakuAPI.addition,\\n                        user: danmakuAPI.user,\\n                    });\\n                } else {\\n                    this.danmaku.reload({});\\n                }\\n            } else {\\n                this.initDanmaku(danmakuAPI as DPlayerType.Danmaku, apiBackend);\\n            }\\n        }\\n\\n         if (remember && !this.options.live) {\\n            if (seek !== 0) this.seek(seek);\\n            if (speed !== 1.0) this.speed(speed);\\n        }\\n    }\\n\\n    initDanmaku(danmakuAPI?: DPlayerType.Danmaku | boolean, apiBackend: DPlayerType.APIBackend = defaultApiBackend): void {\\n        if (!danmakuAPI) {\\n            this.container.classList.add('dplayer-no-danmaku');\\n            return;\\n        }\\n        this.container.classList.remove('dplayer-no-danmaku');\\n\\n        this.template.danmakuLoading.style.display = 'block';\\n        this.danmaku = new Danmaku({\\n            player: this,\\n            container: this.template.danmaku,\\n            opacity: this.user.get('opacity'),\\n            callback: () => {\\n                setTimeout(() => {\\n                    this.template.danmakuLoading.style.display = 'none';\\n\\n                    // autoplay\\n                    if (this.options.autoplay) {\\n                        this.play();\\n                    }\\n                }, 0);\\n            },\\n            error: (msg: string) => {\\n                this.notice(msg, undefined, undefined, '#FF6F6A');\\n            },\\n            apiBackend: apiBackend,\\n            borderColor: this.options.theme,\\n            fontSize: typeof danmakuAPI === 'boolean' ? 24 : danmakuAPI.fontSize || 24,\\n            time: () => this.video.currentTime,\\n            unlimited: this.user.get('unlimited'),\\n            speedRate: typeof danmakuAPI === 'boolean' ? 1 : danmakuAPI.speedRate || 1,\\n            api: typeof danmakuAPI === 'boolean' ? {} : {\\n                id: danmakuAPI.id,\\n                address: danmakuAPI.api,\\n                token: danmakuAPI.token,\\n                maximum: danmakuAPI.maximum,\\n                addition: danmakuAPI.addition,\\n                user: danmakuAPI.user,\\n            },\\n            events: this.events,\\n            tran: (msg: string) => this.tran(msg),\\n        });\\n\\n        this.comment = new Comment(this);\\n    }\\n\\n    initMSE(video: HTMLVideoElement, type: DPlayerType.VideoType | string): void {\\n        this.type = type;\\n        if (this.options.video.customType && this.options.video.customType[type]) {\\n            if (Object.prototype.toString.call(this.options.video.customType[type]) === '[object Function]') {\\n                this.options.video.customType[type](this.video, this);\\n            } else {\\n                console.error(`Illegal customType: ${type}`);\\n            }\\n        } else {\\n            if (this.type === 'auto') {\\n                if (/m3u8(#|\\\\?|$)/i.exec(video.src)) {\\n                    this.type = 'hls';\\n                } else if (/.ts(#|\\\\?|$)/i.exec(video.src)) {\\n                    this.type = 'mpegts';\\n                } else if (/.flv(#|\\\\?|$)/i.exec(video.src)) {\\n                    this.type = 'flv';\\n                } else if (/.mpd(#|\\\\?|$)/i.exec(video.src)) {\\n                    this.type = 'dash';\\n                } else {\\n                    this.type = 'normal';\\n                }\\n            }\\n            if (!(this.type === 'mpegts')) {\\n                // audio switching is enabled only when using mpegts.js\\n                this.container.classList.add('dplayer-no-audio-switching');\\n            }\\n\\n            switch (this.type) {\\n                // https://github.com/video-dev/hls.js\\n                case 'hls':\\n                    if (window.Hls) {\\n                        if (window.Hls.isSupported()) {\\n                            // if it has already been initialized, destroy it once\\n                            if (this.plugins.hls) {\\n                                // destroy aribb24 caption\\n                                if (this.plugins.aribb24Caption) {\\n                                    this.plugins.aribb24Caption.dispose();\\n                                    delete this.plugins.aribb24Caption;\\n                                }\\n                                // destroy aribb24 superimpose\\n                                if (this.plugins.aribb24Superimpose) {\\n                                    this.plugins.aribb24Superimpose.dispose();\\n                                    delete this.plugins.aribb24Superimpose;\\n                                }\\n                                this.plugins.hls.destroy();\\n                                delete this.plugins.hls;\\n                            }\\n\\n                            // initialize hls.js\\n                            const hlsOptions = this.options.pluginOptions.hls;\\n                            const hls = new window.Hls(hlsOptions);\\n                            this.plugins.hls = hls;\\n                            hls.loadSource(video.src);\\n                            hls.attachMedia(video);\\n\\n                            // Listen for audio tracks updates\\n                            hls.on(window.Hls.Events.AUDIO_TRACKS_UPDATED, () => {\\n                                if (hls.audioTracks.length >= 2) {\\n                                    // Remove no-audio-switching class if multiple audio tracks are available\\n                                    this.container.classList.remove('dplayer-no-audio-switching');\\n                                } else {\\n                                    this.container.classList.add('dplayer-no-audio-switching');\\n                                }\\n                            });\\n\\n                            // processing when destroy\\n                            this.events.on('destroy', () => {\\n                                // destroy aribb24 caption\\n                                if (this.plugins.aribb24Caption) {\\n                                    this.plugins.aribb24Caption.dispose();\\n                                    delete this.plugins.aribb24Caption;\\n                                }\\n                                // destroy aribb24 superimpose\\n                                if (this.plugins.aribb24Superimpose) {\\n                                    this.plugins.aribb24Superimpose.dispose();\\n                                    delete this.plugins.aribb24Superimpose;\\n                                }\\n                                hls.destroy();\\n                                delete this.plugins.hls;\\n                            });\\n\\n                            // initialize aribb24.js\\n                            // https://github.com/monyone/aribb24.js\\n                            if (this.options.subtitle && this.options.subtitle.type === 'aribb24') {\\n                                // set options\\n                                if (this.options.pluginOptions.aribb24 === undefined) {\\n                                    this.options.pluginOptions.aribb24 = {};\\n                                }\\n                                this.options.pluginOptions.aribb24.enableAutoInBandMetadataTextTrackDetection = false; // for hls.js\\n                                const aribb24Options = this.options.pluginOptions.aribb24;\\n\\n                                // initialize aribb24 caption\\n                                const aribb24Caption = this.plugins.aribb24Caption = new aribb24js.CanvasRenderer(\\n                                    {...aribb24Options, data_identifier: 0x80},\\n                                );\\n                                aribb24Caption.attachMedia(video);\\n                                aribb24Caption.show();\\n\\n                                // initialize aribb24 superimpose\\n                                if (this.options.pluginOptions.aribb24.disableSuperimposeRenderer !== true) {\\n                                    const aribb24Superimpose = this.plugins.aribb24Superimpose = new aribb24js.CanvasRenderer(\\n                                        {...aribb24Options, data_identifier: 0x81},\\n                                    );\\n                                    aribb24Superimpose.attachMedia(video);\\n                                    aribb24Superimpose.show();\\n                                }\\n\\n                                // push caption data into CanvasRenderer\\n                                hls.on(window.Hls.Events.FRAG_PARSING_METADATA, (event, data) => {\\n                                    for (const sample of data.samples) {\\n                                        if (this.plugins.aribb24Caption) {\\n                                            this.plugins.aribb24Caption.pushID3v2Data(sample.pts, sample.data);\\n                                        }\\n                                        if (this.plugins.aribb24Superimpose) {\\n                                            this.plugins.aribb24Superimpose.pushID3v2Data(sample.pts, sample.data);\\n                                        }\\n                                    }\\n                                });\\n                            }\\n                        } else if (video.canPlayType('application/x-mpegURL') || video.canPlayType('application/vnd.apple.mpegURL')) {\\n                            // normal playback\\n                            // if it has already been initialized, destroy it once\\n                            if (this.plugins.aribb24Caption) {\\n                                this.plugins.aribb24Caption.dispose();\\n                                delete this.plugins.aribb24Caption;\\n                            }\\n                            if (this.plugins.aribb24Superimpose) {\\n                                this.plugins.aribb24Superimpose.dispose();\\n                                delete this.plugins.aribb24Superimpose;\\n                            }\\n\\n                            // processing when destroy\\n                            this.events.on('destroy', () => {\\n                                // destroy aribb24 caption\\n                                if (this.plugins.aribb24Caption) {\\n                                    this.plugins.aribb24Caption.dispose();\\n                                    delete this.plugins.aribb24Caption;\\n                                }\\n                                // destroy aribb24 superimpose\\n                                if (this.plugins.aribb24Superimpose) {\\n                                    this.plugins.aribb24Superimpose.dispose();\\n                                    delete this.plugins.aribb24Superimpose;\\n                                }\\n                            });\\n\\n                            // initialize aribb24.js\\n                            // https://github.com/monyone/aribb24.js\\n                            if (this.options.subtitle && this.options.subtitle.type === 'aribb24') {\\n                                // set options\\n                                if (this.options.pluginOptions.aribb24 === undefined) {\\n                                    this.options.pluginOptions.aribb24 = {};\\n                                }\\n                                this.options.pluginOptions.aribb24.enableAutoInBandMetadataTextTrackDetection = true; // for Safari native HLS player\\n                                const aribb24Options = this.options.pluginOptions.aribb24;\\n\\n                                // initialize aribb24 caption\\n                                const aribb24Caption = this.plugins.aribb24Caption = new aribb24js.CanvasRenderer(\\n                                    {...aribb24Options, data_identifier: 0x80},\\n                                );\\n                                aribb24Caption.attachMedia(video);\\n                                aribb24Caption.show();\\n\\n                                // initialize aribb24 superimpose\\n                                if (this.options.pluginOptions.aribb24.disableSuperimposeRenderer !== true) {\\n                                    const aribb24Superimpose = this.plugins.aribb24Superimpose = new aribb24js.CanvasRenderer(\\n                                        {...aribb24Options, data_identifier: 0x81},\\n                                    );\\n                                    aribb24Superimpose.attachMedia(video);\\n                                    aribb24Superimpose.show();\\n                                }\\n                            }\\n                        } else {\\n                            this.notice('Error: HLS is not supported.', undefined, undefined, '#FF6F6A');\\n                        }\\n                    } else {\\n                        this.notice('Error: Can\\\\'t find hls.js.', undefined, undefined, '#FF6F6A');\\n                    }\\n                    break;\\n                // https://github.com/xqq/mpegts.js\\n                case 'mpegts':\\n                    if (window.mpegts) {\\n                        if (window.mpegts.isSupported()) {\\n                            // if it has already been initialized, destroy it once\\n                            if (this.plugins.mpegts) {\\n                                // destroy aribb24 caption\\n                                if (this.plugins.aribb24Caption) {\\n                                    this.plugins.aribb24Caption.dispose();\\n                                    delete this.plugins.aribb24Caption;\\n                                }\\n                                // destroy aribb24 superimpose\\n                                if (this.plugins.aribb24Superimpose) {\\n                                    this.plugins.aribb24Superimpose.dispose();\\n                                    delete this.plugins.aribb24Superimpose;\\n                                }\\n                                this.plugins.mpegts.unload();\\n                                this.plugins.mpegts.detachMediaElement();\\n                                this.plugins.mpegts.destroy();\\n                                delete this.plugins.mpegts;\\n                            }\\n\\n                            // initialize mpegts.js\\n                            if (this.options.pluginOptions.mpegts === undefined) {\\n                                this.options.pluginOptions.mpegts = {};\\n                            }\\n                            const mpegtsPlayer = window.mpegts.createPlayer(\\n                                Object.assign(this.options.pluginOptions.mpegts.mediaDataSource || {}, {\\n                                    type: 'mpegts',\\n                                    isLive: this.options.live,\\n                                    url: video.src,\\n                                }),\\n                                this.options.pluginOptions.mpegts.config,\\n                            );\\n                            this.plugins.mpegts = mpegtsPlayer;\\n                            mpegtsPlayer.attachMediaElement(video);\\n                            mpegtsPlayer.load();\\n\\n                            // processing when destroy\\n                            this.events.on('destroy', () => {\\n                                // destroy aribb24 caption\\n                                if (this.plugins.aribb24Caption) {\\n                                    this.plugins.aribb24Caption.dispose();\\n                                    delete this.plugins.aribb24Caption;\\n                                }\\n                                // destroy aribb24 superimpose\\n                                if (this.plugins.aribb24Superimpose) {\\n                                    this.plugins.aribb24Superimpose.dispose();\\n                                    delete this.plugins.aribb24Superimpose;\\n                                }\\n                                mpegtsPlayer.unload();\\n                                mpegtsPlayer.detachMediaElement();\\n                                mpegtsPlayer.destroy();\\n                                delete this.plugins.mpegts;\\n                            });\\n\\n                            // initialize aribb24.js\\n                            // https://github.com/monyone/aribb24.js\\n                            if (this.options.subtitle && this.options.subtitle.type === 'aribb24') {\\n                                // set options\\n                                if (this.options.pluginOptions.aribb24 === undefined) {\\n                                    this.options.pluginOptions.aribb24 = {};\\n                                }\\n                                this.options.pluginOptions.aribb24.enableAutoInBandMetadataTextTrackDetection = false; // for mpegts.js\\n                                const aribb24Options = this.options.pluginOptions.aribb24;\\n\\n                                // initialize aribb24 caption\\n                                const aribb24Caption = this.plugins.aribb24Caption = new aribb24js.CanvasRenderer(\\n                                    {...aribb24Options, data_identifier: 0x80},\\n                                );\\n                                aribb24Caption.attachMedia(video);\\n                                aribb24Caption.show();\\n\\n                                // initialize aribb24 superimpose\\n                                if (this.options.pluginOptions.aribb24.disableSuperimposeRenderer !== true) {\\n                                    const aribb24Superimpose = this.plugins.aribb24Superimpose = new aribb24js.CanvasRenderer(\\n                                        {...aribb24Options, data_identifier: 0x81},\\n                                    );\\n                                    aribb24Superimpose.attachMedia(video);\\n                                    aribb24Superimpose.show();\\n                                }\\n\\n                                // push caption data into CanvasRenderer\\n                                mpegtsPlayer.on(window.mpegts.Events.TIMED_ID3_METADATA_ARRIVED, (data) => {\\n                                    if (this.plugins.aribb24Caption) {\\n                                        this.plugins.aribb24Caption.pushID3v2Data(data.pts / 1000, data.data);\\n                                    }\\n                                    if (this.plugins.aribb24Superimpose) {\\n                                        this.plugins.aribb24Superimpose.pushID3v2Data(data.pts / 1000, data.data);\\n                                    }\\n                                });\\n                            }\\n                        } else {\\n                            this.notice('Error: mpegts.js is not supported.', undefined, undefined, '#FF6F6A');\\n                        }\\n                    } else {\\n                        this.notice('Error: Can\\\\'t find mpegts.js.', undefined, undefined, '#FF6F6A');\\n                    }\\n                    break;\\n                // https://github.com/Bilibili/flv.js\\n                case 'flv':\\n                    if (window.flvjs) {\\n                        if (window.flvjs.isSupported()) {\\n                            if (this.options.pluginOptions.flv === undefined) {\\n                                this.options.pluginOptions.flv = {};\\n                            }\\n                            const flvPlayer = window.flvjs.createPlayer(\\n                                Object.assign(this.options.pluginOptions.flv.mediaDataSource || {}, {\\n                                    type: 'flv',\\n                                    url: video.src,\\n                                }),\\n                                this.options.pluginOptions.flv.config,\\n                            );\\n                            this.plugins.flvjs = flvPlayer;\\n                            flvPlayer.attachMediaElement(video);\\n                            flvPlayer.load();\\n                            this.events.on('destroy', () => {\\n                                flvPlayer.unload();\\n                                flvPlayer.detachMediaElement();\\n                                flvPlayer.destroy();\\n                                delete this.plugins.flvjs;\\n                            });\\n                        } else {\\n                            this.notice('Error: flv.js is not supported.', undefined, undefined, '#FF6F6A');\\n                        }\\n                    } else {\\n                        this.notice('Error: Can\\\\'t find flv.js.', undefined, undefined, '#FF6F6A');\\n                    }\\n                    break;\\n                // https://github.com/Dash-Industry-Forum/dash.js\\n                case 'dash':\\n                    if (window.dashjs) {\\n                        const dashjsPlayer = window.dashjs.MediaPlayer().create();\\n                        dashjsPlayer.initialize(video, video.src, false);\\n                        const options = this.options.pluginOptions.dash;\\n                        dashjsPlayer.updateSettings(options ?? {});\\n                        this.plugins.dash = dashjsPlayer;\\n                        this.events.on('destroy', () => {\\n                            dashjsPlayer.reset();\\n                            delete this.plugins.dash;\\n                        });\\n                    } else {\\n                        this.notice('Error: Can\\\\'t find dash.js.', undefined, undefined, '#FF6F6A');\\n                    }\\n                    break;\\n\\n                // https://github.com/webtorrent/webtorrent\\n                case 'webtorrent':\\n                    if (window.WebTorrent) {\\n                        if (window.WebTorrent.WEBRTC_SUPPORT) {\\n                            this.container.classList.add('dplayer-loading');\\n                            const options = this.options.pluginOptions.webtorrent;\\n                            const client = new window.WebTorrent(options);\\n                            this.plugins.webtorrent = client;\\n                            const torrentId = video.src;\\n                            video.src = '';\\n                            video.preload = 'metadata';\\n                            video.addEventListener('durationchange', () => this.container.classList.remove('dplayer-loading'), { once: true });\\n                            client.add(torrentId, (torrent) => {\\n                                const file = torrent.files.find((file) => file.name.endsWith('.mp4'));\\n                                if (file) {\\n                                    file.renderTo(this.video, {\\n                                        autoplay: this.options.autoplay,\\n                                        controls: false,\\n                                    });\\n                                }\\n                            });\\n                            this.events.on('destroy', () => {\\n                                client.remove(torrentId);\\n                                client.destroy();\\n                                delete this.plugins.webtorrent;\\n                            });\\n                        } else {\\n                            this.notice('Error: Webtorrent is not supported.', undefined, undefined, '#FF6F6A');\\n                        }\\n                    } else {\\n                        this.notice('Error: Can\\\\'t find Webtorrent.', undefined, undefined, '#FF6F6A');\\n                    }\\n                    break;\\n            }\\n        }\\n    }\\n\\n    initVideo(video: HTMLVideoElement, type: DPlayerType.VideoType | string): void {\\n        this.initMSE(video, type);\\n\\n        /**\\n         * video events\\n         */\\n        // show video time: the metadata has loaded or changed\\n        this.on('durationchange', () => {\\n            // compatibility: Android browsers will output 1 or Infinity at first\\n            if (video.duration !== 1 && video.duration !== Infinity) {\\n                this.template.dtime.textContent = utils.secondToTime(video.duration);\\n            }\\n        });\\n\\n        // show video loaded bar: to inform interested parties of progress downloading the media\\n        this.on('progress', () => {\\n            const duration = utils.getVideoDuration(this.video, this.template);\\n            const percentage = video.buffered.length ? video.buffered.end(video.buffered.length - 1) / duration : 0;\\n            this.bar.set('loaded', percentage, 'width');\\n        });\\n\\n        // video download error: an error occurs\\n        this.on('error', () => {\\n            if (!this.video.error) {\\n                // Not a video load error, may be poster load failed, see #307\\n                return;\\n            }\\n            // quality switching failed\\n            if (this.switchingQuality) {\\n                if (this.prevVideo !== null) {\\n                    this.template.videoWrapAspect.removeChild(this.prevVideo);\\n                }\\n                this.video.classList.add('dplayer-video-current');\\n                this.prevVideo = null;\\n                this.switchingQuality = false;\\n                this.events.trigger('quality_end');\\n            }\\n            if (this.tran && this.notice && this.type !== 'webtorrent') {\\n                this.notice(this.tran('Video load failed'), -1, undefined, '#FF6F6A');\\n            }\\n            this.container.classList.remove('dplayer-loading');\\n        });\\n\\n        // video end\\n        this.on('ended', () => {\\n            this.bar.set('played', 1, 'width');\\n            if (!this.setting.loop) {\\n                this.pause();\\n            } else {\\n                this.seek(0);\\n                this.play();\\n            }\\n            if (this.danmaku) {\\n                this.danmaku.danIndex = 0;\\n            }\\n        });\\n\\n        this.on('play', () => {\\n            if (this.paused) {\\n                this.play(true);\\n            }\\n        });\\n\\n        this.on('pause', () => {\\n            if (!this.paused) {\\n                this.pause(true);\\n            }\\n        });\\n\\n        this.on('timeupdate', () => {\\n            const duration = utils.getVideoDuration(this.video, this.template);\\n            this.bar.set('played', this.video.currentTime / duration, 'width');\\n            const currentTime = utils.secondToTime(this.video.currentTime);\\n            if (this.template.ptime.textContent !== currentTime) {\\n                this.template.ptime.textContent = currentTime;\\n            }\\n        });\\n\\n        for (let i = 0; i < this.events.videoEvents.length; i++) {\\n            video.addEventListener(this.events.videoEvents[i], (event) => {\\n                this.events.trigger(this.events.videoEvents[i], event);\\n            });\\n        }\\n\\n        // restore volume setting from LocalStorage\\n        this.volume(this.user.get('volume'), true, true);\\n\\n        // restore speed setting from LocalStorage\\n        const savedSpeed = this.user.get('speed');\\n        if (savedSpeed && savedSpeed !== 1.0) {\\n            this.speed(savedSpeed);\\n        }\\n\\n        if (this.options.subtitle) {\\n            this.subtitle = new Subtitle(this.template.subtitle, this.video, this.plugins, this.options.subtitle, this.events);\\n            if (!this.user.get('subtitle')) {\\n                this.subtitle.hide();\\n            }\\n        }\\n    }\\n\\n    switchQuality(index: number): void {\\n        index = typeof index === 'string' ? parseInt(index) : index;\\n        if (this.options.video.quality === undefined || this.qualityIndex === index || this.switchingQuality) {\\n            return;\\n        } else {\\n            this.qualityIndex = index;\\n        }\\n        this.switchingQuality = true;\\n        this.quality = this.options.video.quality[index];\\n\\n        const paused = this.video.paused;\\n        this.video.pause();\\n        const videoHTML = tplVideo({\\n            current: false,\\n            pic: null,\\n            screenshot: this.options.screenshot,\\n            preload: 'auto',\\n            url: this.quality.url,\\n            subtitle: this.options.subtitle,\\n            crossOrigin: this.options.crossOrigin,\\n        });\\n        const videoEle = new DOMParser().parseFromString(videoHTML, 'text/html').body.firstChild as HTMLVideoElement;\\n        this.template.videoWrapAspect.insertBefore(videoEle, this.template.videoWrapAspect.getElementsByTagName('div')[0]);\\n        this.prevVideoCurrentTime = this.video.currentTime;\\n        this.prevVideo = this.video;\\n        this.video = videoEle;\\n        this.initVideo(this.video, this.quality.type || this.options.video.type);\\n        if (!this.options.live) {\\n            this.seek(this.prevVideoCurrentTime);\\n        }\\n        if (!paused) {\\n            this.video.play();\\n        }\\n        this.notice(this.tran('Switching to quality', this.quality.name), -1);\\n        this.container.classList.add('dplayer-loading');\\n        this.events.trigger('quality_start', this.quality);\\n\\n        this.template.qualityItem.forEach((elem) => {\\n            elem.classList.remove('dplayer-setting-quality-current');\\n            if (parseInt(elem.dataset.index!) === index) {\\n                elem.classList.add('dplayer-setting-quality-current');\\n                this.template.qualityValue.textContent = this.quality!.name;\\n                this.template.settingBox.classList.remove('dplayer-setting-box-quality');\\n            }\\n        });\\n\\n        this.on('canplay', () => {\\n            if (this.prevVideo !== null) {\\n                if (!this.options.live && this.video.currentTime !== this.prevVideoCurrentTime) {\\n                    this.seek(this.prevVideoCurrentTime);\\n                    return;\\n                }\\n                this.template.videoWrapAspect.removeChild(this.prevVideo);\\n                this.video.classList.add('dplayer-video-current');\\n                if (!paused) {\\n                    this.video.play();\\n                }\\n                this.prevVideo = null;\\n                this.notice(this.tran('Switched to quality', this.quality!.name), 1000);\\n                this.switchingQuality = false;\\n\\n                // restore speed\\n                const speed = parseFloat(this.template.settingBox.querySelector<HTMLElement>('.dplayer-setting-speed-current')!.dataset.speed!);\\n                this.speed(speed);\\n\\n                // restore audio\\n                const audio = this.template.settingBox.querySelector<HTMLElement>('.dplayer-setting-audio-current')!.dataset.audio!;\\n                if (audio === 'secondary') {\\n                    // switch secondary audio\\n                    if (window.mpegts && this.plugins.mpegts && this.plugins.mpegts instanceof window.mpegts.MSEPlayer) {\\n                        this.plugins.mpegts.switchSecondaryAudio();\\n                    // switch secondary audio for HLS\\n                    } else if (window.Hls && this.plugins.hls && this.plugins.hls instanceof window.Hls) {\\n                        const hls = this.plugins.hls;\\n                        if (hls.audioTracks.length >= 2) {\\n                            hls.audioTrack = 1;  // Switch to secondary audio track\\n                        }\\n                    }\\n                } else {\\n                    // switch primary audio for HLS\\n                    if (window.Hls && this.plugins.hls && this.plugins.hls instanceof window.Hls) {\\n                        const hls = this.plugins.hls;\\n                        if (hls.audioTracks.length >= 2) {\\n                            hls.audioTrack = 0;  // Switch to primary audio track\\n                        }\\n                    }\\n                }\\n\\n                this.container.classList.remove('dplayer-loading');\\n                this.events.trigger('quality_end');\\n            }\\n        });\\n    }\\n\\n    /**\\n     * Show notice\\n     * @param text Notice text\\n     * @param time Time to show (ms, if -1 then notice will not hide)\\n     * @param opacity Notice opacity\\n     * @param color Notice color\\n     */\\n    notice(text: string, time = 2000, opacity = 0.8, color?: string): void {\\n        this.template.notice.textContent = text;\\n        this.template.notice.style.opacity = `${opacity}`;\\n        if (color && color !== '') {\\n            this.template.notice.style.color = color;\\n        } else {\\n            this.template.notice.style.color = '';\\n        }\\n        if (this.noticeTime) {\\n            window.clearTimeout(this.noticeTime);\\n        }\\n        this.events.trigger('notice_show', text);\\n        if (time > 0) {\\n            this.noticeTime = window.setTimeout(() => {\\n                this.hideNotice();\\n            }, time);\\n        }\\n    }\\n\\n    /**\\n     * Instantly hide notice\\n     */\\n    hideNotice(): void {\\n        this.template.notice.style.opacity = '0';\\n        this.events.trigger('notice_hide');\\n    }\\n\\n    resize(): void {\\n        if (this.danmaku) {\\n            this.danmaku.resize();\\n        }\\n        if (this.plugins.aribb24Caption) {\\n            this.plugins.aribb24Caption.refresh();\\n        }\\n        if (this.plugins.aribb24Superimpose) {\\n            this.plugins.aribb24Superimpose.refresh();\\n        }\\n        if (this.controller.thumbnails) {\\n            const thumbnailsConfig = this.options.video.thumbnails;\\n            const width = thumbnailsConfig && thumbnailsConfig.width || 160;\\n            const height = thumbnailsConfig && thumbnailsConfig.height || Math.floor(width * 9 / 16);\\n            this.controller.thumbnails.resize(\\n                width,\\n                height,\\n                this.template.barWrap.offsetWidth,\\n            );\\n        }\\n        this.events.trigger('resize');\\n    }\\n\\n    speed(rate: number): void {\\n        this.video.playbackRate = rate;\\n        this.user.set('speed', rate);\\n        this.template.speedItem.forEach((elem) => {\\n            elem.classList.remove('dplayer-setting-speed-current');\\n            if (parseFloat(elem.dataset.speed!) === rate) {\\n                elem.classList.add('dplayer-setting-speed-current');\\n                if (parseFloat(elem.dataset.speed!) === 1) {\\n                    this.template.speedValue.textContent = this.tran('Normal');\\n                } else {\\n                    this.template.speedValue.textContent = `${rate}`;\\n                }\\n                this.template.settingBox.classList.remove('dplayer-setting-box-speed');\\n            }\\n        });\\n    }\\n\\n    /**\\n     * Destroy DPlayer, and it can not be used again\\n     * @param keepContainerInnerHTML If true, do not clean the innerHTML of the container\\n     */\\n    destroy(keepContainerInnerHTML = false): void {\\n        instances.splice(instances.indexOf(this), 1);\\n        this.pause();\\n        document.removeEventListener('click', this.docClickFun, true);\\n        this.container.removeEventListener('click', this.containerClickFun, true);\\n        this.fullScreen.destroy();\\n        this.hotkey.destroy();\\n        this.contextmenu.destroy();\\n        this.controller.destroy();\\n        this.timer.destroy();\\n        this.setting.destroy();\\n        this.resizeObserver.disconnect();\\n        this.video.removeAttribute('src');\\n        if (!keepContainerInnerHTML) {\\n            this.container.innerHTML = '';\\n        }\\n        this.events.trigger('destroy');\\n    }\\n\\n    static get version(): string {\\n        /* global DPLAYER_VERSION */\\n        // @ts-ignore\\n        return DPLAYER_VERSION;\\n    }\\n}\\n\\nexport default DPlayer;\\n\",\"/* global DPLAYER_VERSION */\\nimport defaultApiBackend from './api';\\nimport DPlayer from './player';\\nimport * as DPlayerType from './types';\\n\\nexport default (options: DPlayerType.Options): DPlayerType.OptionsInternal => {\\n    // default options\\n    const defaultOption: DPlayerType.Options = {\\n        container: options.container || document.querySelector<HTMLElement>('.dplayer') || undefined,\\n        live: false,\\n        liveSyncMinBufferSize: 0.8,\\n        syncWhenPlayingLive: true,\\n        autoplay: false,\\n        theme: '#b7daff',\\n        loop: false,\\n        lang: navigator.language.toLowerCase(),\\n        screenshot: false,\\n        pictureInPicture: true,\\n        airplay: true,\\n        hotkey: true,\\n        preload: 'metadata',\\n        crossOrigin: null,\\n        volume: 1.0,\\n        playbackSpeed: [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\\n        apiBackend: defaultApiBackend,\\n        video: {},\\n        contextmenu: [],\\n        mutex: true,\\n        pluginOptions: {},\\n    };\\n    for (const defaultKey in defaultOption) {\\n        if (Object.prototype.hasOwnProperty.call(defaultOption, defaultKey) && !Object.prototype.hasOwnProperty.call(options, defaultKey)) {\\n            // @ts-ignore\\n            options[defaultKey] = defaultOption[defaultKey];\\n        }\\n    }\\n    if (options.video) {\\n        !options.video.type && (options.video.type = 'auto');\\n\\n        // Process thumbnails options\\n        if (options.video.thumbnails) {\\n            // Convert string to object format\\n            if (typeof options.video.thumbnails === 'string') {\\n                options.video.thumbnails = { url: options.video.thumbnails };\\n            }\\n\\n            // Set default values\\n            !options.video.thumbnails.width && (options.video.thumbnails.width = 160);\\n            !options.video.thumbnails.columnCount && (options.video.thumbnails.columnCount = 100);\\n\\n            // Process interval and totalCount (mutually exclusive)\\n            if (options.video.thumbnails.interval) {\\n                // If interval is specified, totalCount will be calculated in Thumbnails class\\n                // when duration is available\\n                delete options.video.thumbnails.totalCount;\\n            } else if (!options.video.thumbnails.totalCount) {\\n                // If neither interval nor totalCount is specified, use default totalCount\\n                options.video.thumbnails.totalCount = 100;\\n            }\\n        }\\n    }\\n    if (typeof options.danmaku === 'object' && options.danmaku) {\\n        !options.danmaku.user && (options.danmaku.user = 'DPlayer');\\n        !options.danmaku.speedRate && (options.danmaku.speedRate = 1);\\n        !options.danmaku.fontSize && (options.danmaku.fontSize = 35);\\n        options.danmaku.closeCommentFormAfterSend !== false && (options.danmaku.closeCommentFormAfterSend = true);\\n    }\\n    if (options.subtitle) {\\n        !options.subtitle.type && (options.subtitle.type = 'webvtt');\\n        !options.subtitle.fontSize && (options.subtitle.fontSize = '20px');\\n        !options.subtitle.bottom && (options.subtitle.bottom = '40px');\\n        !options.subtitle.color && (options.subtitle.color = '#fff');\\n    }\\n\\n    if (options.video.quality) {\\n        // defaultQuality can be specified as a string\\n        if (typeof options.video.defaultQuality === 'string') {\\n            options.video.quality.forEach((quality, qualityIndex) => {\\n                if (options.video.defaultQuality === quality.name) {\\n                    options.video.defaultQuality = qualityIndex;\\n                }\\n            });\\n            // failsafe\\n            if (typeof options.video.defaultQuality === 'string') {\\n                options.video.defaultQuality = 0;\\n            }\\n        }\\n        // failsafe\\n        if (options.video.defaultQuality === undefined) {\\n            options.video.defaultQuality = 0;\\n        }\\n        options.video.type = options.video.quality[options.video.defaultQuality].type;\\n        options.video.url = options.video.quality[options.video.defaultQuality].url;\\n    }\\n\\n    if (options.lang) {\\n        options.lang = options.lang.toLowerCase();\\n    }\\n\\n    options.contextmenu = options.contextmenu!.concat([\\n        {\\n            text: 'Video info',\\n            click: (player: DPlayer) => {\\n                player.infoPanel.toggle();\\n            },\\n        },\\n        {\\n            // @ts-ignore\\n            text: `DPlayer v${DPLAYER_VERSION}`,\\n            link: 'https://github.com/tsukumijima/DPlayer',\\n        },\\n    ]);\\n\\n    const optionsInternal: DPlayerType.OptionsInternal = {\\n        container: options.container!,\\n        live: options.live!,\\n        liveSyncMinBufferSize: options.liveSyncMinBufferSize!,\\n        syncWhenPlayingLive: options.syncWhenPlayingLive!,\\n        autoplay: options.autoplay!,\\n        theme: options.theme!,\\n        loop: options.loop!,\\n        lang: options.lang!,\\n        screenshot: options.screenshot!,\\n        pictureInPicture: options.pictureInPicture!,\\n        airplay: options.airplay!,\\n        hotkey: options.hotkey!,\\n        preload: options.preload!,\\n        crossOrigin: options.crossOrigin!,\\n        volume: options.volume!,\\n        playbackSpeed: options.playbackSpeed!,\\n        logo: options.logo,  // optional\\n        apiBackend: options.apiBackend!,\\n        video: options.video as DPlayerType.VideoInternal,\\n        subtitle: options.subtitle as DPlayerType.SubtitleInternal,  // optional\\n        danmaku: options.danmaku as DPlayerType.DanmakuInternal,  // optional\\n        contextmenu: options.contextmenu!,\\n        highlight: options.highlight,  // optional\\n        mutex: options.mutex!,\\n        pluginOptions: options.pluginOptions!,\\n    };\\n\\n    return optionsInternal;\\n};\\n\",\"import '../css/index.scss';\\nimport DPlayer from './player';\\n\\nexport default DPlayer;\\nexport * as DPlayerType from './types';\\n\"],\"names\":[\"root\",\"factory\",\"exports\",\"module\",\"define\",\"amd\",\"globalThis\",\"item\",\"content\",\"cssMapping\",\"btoa\",\"base64\",\"unescape\",\"encodeURIComponent\",\"JSON\",\"stringify\",\"data\",\"concat\",\"sourceMapping\",\"join\",\"styleElement\",\"nonce\",\"setAttribute\",\"stylesInDOM\",\"getIndexByIdentifier\",\"identifier\",\"result\",\"i\",\"length\",\"modulesToDom\",\"list\",\"options\",\"idCountMap\",\"identifiers\",\"id\",\"base\",\"count\",\"indexByIdentifier\",\"obj\",\"css\",\"media\",\"sourceMap\",\"supports\",\"layer\",\"references\",\"updater\",\"addElementStyle\",\"byIndex\",\"splice\",\"push\",\"api\",\"domAPI\",\"update\",\"newObj\",\"remove\",\"lastIdentifiers\",\"newList\",\"index\",\"newLastIdentifiers\",\"_i\",\"_index\",\"styleSheet\",\"cssText\",\"firstChild\",\"removeChild\",\"appendChild\",\"document\",\"createTextNode\",\"cssWithMappingToString\",\"toString\",\"this\",\"map\",\"needLayer\",\"modules\",\"dedupe\",\"undefined\",\"alreadyImportedModules\",\"k\",\"_k\",\"t\",\"e\",\"r\",\"n\",\"s\",\"TypeError\",\"String\",\"f\",\"a\",\"o\",\"Array\",\"prototype\",\"configurable\",\"value\",\"charAt\",\"ArrayBuffer\",\"DataView\",\"Object\",\"isExtensible\",\"defineProperty\",\"h\",\"c\",\"u\",\"l\",\"d\",\"p\",\"v\",\"b\",\"g\",\"y\",\"m\",\"_\",\"w\",\"x\",\"A\",\"enforce\",\"C\",\"get\",\"T\",\"Int8Array\",\"F\",\"Uint8ClampedArray\",\"S\",\"R\",\"I\",\"E\",\"O\",\"M\",\"G\",\"B\",\"P\",\"opera\",\"D\",\"j\",\"Uint8Array\",\"Int16Array\",\"Uint16Array\",\"Int32Array\",\"Uint32Array\",\"Float32Array\",\"Float64Array\",\"L\",\"BigInt64Array\",\"BigUint64Array\",\"N\",\"U\",\"Function\",\"NATIVE_ARRAY_BUFFER_VIEWS\",\"TYPED_ARRAY_TAG\",\"aTypedArray\",\"aTypedArrayConstructor\",\"exportTypedArrayMethod\",\"exportTypedArrayStaticMethod\",\"getTypedArrayConstructor\",\"isView\",\"isTypedArray\",\"TypedArray\",\"TypedArrayPrototype\",\"PROPER\",\"CONFIGURABLE\",\"getterFor\",\"set\",\"z\",\"RangeError\",\"H\",\"X\",\"reverse\",\"K\",\"pack\",\"V\",\"unpack\",\"$\",\"W\",\"Y\",\"J\",\"Z\",\"q\",\"Q\",\"tt\",\"byteLength\",\"bytes\",\"byteOffset\",\"et\",\"it\",\"name\",\"NaN\",\"constructor\",\"rt\",\"nt\",\"setInt8\",\"getInt8\",\"setUint8\",\"unsafe\",\"type\",\"detached\",\"buffer\",\"getUint8\",\"getInt16\",\"arguments\",\"getUint16\",\"getInt32\",\"getUint32\",\"getFloat32\",\"getFloat64\",\"setInt16\",\"setUint16\",\"setInt32\",\"setUint32\",\"setFloat32\",\"setFloat64\",\"Math\",\"min\",\"copyWithin\",\"forEach\",\"next\",\"done\",\"includes\",\"indexOf\",\"filter\",\"some\",\"every\",\"find\",\"findIndex\",\"filterReject\",\"lastIndexOf\",\"foo\",\"Boolean\",\"call\",\"left\",\"right\",\"getOwnPropertyDescriptor\",\"writable\",\"slice\",\"floor\",\"return\",\"from\",\"callee\",\"fastKey\",\"getConstructor\",\"first\",\"last\",\"size\",\"that\",\"AS_ENTRIES\",\"key\",\"previous\",\"removed\",\"clear\",\"delete\",\"has\",\"add\",\"setStrong\",\"target\",\"state\",\"kind\",\"entries\",\"enable\",\"global\",\"forced\",\"getPrototypeOf\",\"enumerable\",\"getter\",\"setter\",\"nonConfigurable\",\"nonWritable\",\"createElement\",\"CSSRuleList\",\"CSSStyleDeclaration\",\"CSSValueList\",\"ClientRectList\",\"DOMRectList\",\"DOMStringList\",\"DOMTokenList\",\"DataTransferItemList\",\"FileList\",\"HTMLAllCollection\",\"HTMLCollection\",\"HTMLFormElement\",\"HTMLSelectElement\",\"MediaList\",\"MimeTypeArray\",\"NamedNodeMap\",\"NodeList\",\"PaintRequestList\",\"Plugin\",\"PluginArray\",\"SVGLengthList\",\"SVGNumberList\",\"SVGPathSegList\",\"SVGPointList\",\"SVGStringList\",\"SVGTransformList\",\"SourceBufferList\",\"StyleSheetList\",\"TextTrackCueList\",\"TextTrackList\",\"TouchList\",\"classList\",\"match\",\"test\",\"navigator\",\"userAgent\",\"process\",\"Deno\",\"versions\",\"version\",\"v8\",\"split\",\"stat\",\"dontCallGetSet\",\"sham\",\"RegExp\",\"flags\",\"exec\",\"preventExtensions\",\"apply\",\"Reflect\",\"bind\",\"hasOwnProperty\",\"EXISTS\",\"replace\",\"window\",\"self\",\"hasOwn\",\"abs\",\"pow\",\"log\",\"LN2\",\"propertyIsEnumerable\",\"inspectSource\",\"objectID\",\"weakData\",\"getOwnPropertyNames\",\"getWeakData\",\"onFreeze\",\"WeakMap\",\"facade\",\"isArray\",\"all\",\"normalize\",\"toLowerCase\",\"NATIVE\",\"POLYFILL\",\"Number\",\"isInteger\",\"isFinite\",\"stopped\",\"IS_RECORD\",\"IS_ITERATOR\",\"INTERRUPTED\",\"iterator\",\"IteratorPrototype\",\"BUGGY_SAFARI_ITERATORS\",\"values\",\"keys\",\"proto\",\"arity\",\"source\",\"fround\",\"sign\",\"ceil\",\"trunc\",\"trim\",\"parseInt\",\"Symbol\",\"write\",\"close\",\"parentWindow\",\"ActiveXObject\",\"domain\",\"style\",\"display\",\"src\",\"contentWindow\",\"open\",\"create\",\"defineProperties\",\"getOwnPropertySymbols\",\"isPrototypeOf\",\"setPrototypeOf\",\"__proto__\",\"valueOf\",\"lastIndex\",\"BROKEN_CARET\",\"raw\",\"groups\",\"sticky\",\"multiline\",\"input\",\"hasIndices\",\"ignoreCase\",\"dotAll\",\"unicode\",\"unicodeSets\",\"MISSED_STICKY\",\"UNSUPPORTED_Y\",\"mode\",\"copyright\",\"license\",\"charCodeAt\",\"codeAt\",\"start\",\"end\",\"for\",\"keyFor\",\"max\",\"BigInt\",\"round\",\"view\",\"TypedArrayConstructor\",\"random\",\"withoutSetter\",\"fill\",\"Arguments\",\"sort\",\"fromCharCode\",\"Date\",\"wrap\",\"MAX_SAFE_INTEGER\",\"getOwnPropertyDescriptors\",\"construct\",\"string\",\"padStart\",\"QObject\",\"st\",\"findChild\",\"at\",\"ot\",\"ht\",\"tag\",\"description\",\"ct\",\"ut\",\"pt\",\"lt\",\"ft\",\"dt\",\"useSetter\",\"useSimple\",\"BYTES_PER_ELEMENT\",\"toLocaleString\",\"toStringTag\",\"CanvasProvider\",\"CanvasRenderer\",\"HTMLProvider\",\"Rt\",\"HTMLRenderer\",\"Pt\",\"SVGProvider\",\"bt\",\"SVGRenderer\",\"At\",\"Map\",\"alphabet\",\"Set\",\"toPrimitive\",\"option_canvas\",\"render_canvas\",\"render_text\",\"GL\",\"GR\",\"G_BACK\",\"DRCS_mapping\",\"purpose_width\",\"purpose_height\",\"swf_x\",\"swf_y\",\"sdf_x\",\"sdf_y\",\"sdp_x\",\"sdp_y\",\"ssm_x\",\"ssm_y\",\"shs\",\"svs\",\"text_size_x\",\"text_size_y\",\"position_x\",\"position_y\",\"pallet\",\"fg_color\",\"bg_color\",\"force_bg_color\",\"hlc\",\"stl\",\"orn\",\"force_orn\",\"non_spacing\",\"timeElapsed\",\"endTime\",\"rendered\",\"PRA\",\"normalFont\",\"gaijiFont\",\"drcsReplacement\",\"drcsReplaceMapping\",\"useStroke\",\"usePUA\",\"pes\",\"startTime\",\"data_identifier\",\"data_group_id\",\"width\",\"height\",\"getContext\",\"fillStyle\",\"fillRect\",\"getImageData\",\"toUpperCase\",\"substring\",\"width_magnification\",\"height_magnification\",\"move_absolute_dot\",\"initialize\",\"canvas\",\"forceStrokeColor\",\"getRGBAColorCode\",\"forceBackgroundColor\",\"detect\",\"parseText\",\"parseDRCS\",\"clearRect\",\"keepAspectRatio\",\"drawImage\",\"POSITIVE_INFINITY\",\"textContent\",\"renderCharacter\",\"move_relative_pos\",\"move_newline\",\"move_absolute_pos\",\"canvas_width\",\"canvas_height\",\"getRGBAfromColorCode\",\"renderFont\",\"getOrnColorCode\",\"viewBox\",\"path\",\"renderPath\",\"translate\",\"scale\",\"font\",\"strokeStyle\",\"lineJoin\",\"textBaseline\",\"textAlign\",\"lineWidth\",\"strokeText\",\"setTransform\",\"fillText\",\"stroke\",\"Path2D\",\"fillAlphaColorCode\",\"ReferenceError\",\"active\",\"polling_handler\",\"polling\",\"polling_id\",\"cues\",\"oncuechange\",\"label\",\"language\",\"inBandMetadataTrackDispatchType\",\"sourceBuffer\",\"listeners\",\"requestAnimationFrame\",\"cancelAnimationFrame\",\"activeCues\",\"CustomEvent\",\"createEvent\",\"initCustomEvent\",\"dispatchEvent\",\"currentTime\",\"getCueById\",\"addCue\",\"removeCue\",\"pauseOnExit\",\"onenter\",\"onexit\",\"track\",\"TextDecoder\",\"decode\",\"decodeURIComponent\",\"atob\",\"id3Track\",\"b24Track\",\"subtitleElement\",\"viewCanvas\",\"rawCanvas\",\"resizeObserver\",\"mutationObserver\",\"prevCurrentTime\",\"highResTimeupdatePollingId\",\"isShowing\",\"isOnSeeking\",\"onB24CueChangeDrawed\",\"onID3AddtrackHandler\",\"onID3Addtrack\",\"onID3CueChangeHandler\",\"onID3CueChange\",\"onB24CueChangeHandler\",\"onB24CueChange\",\"onHighResTimeupdateHandler\",\"onHighResTimeupdate\",\"onTimeupdateHandler\",\"onTimeupdate\",\"onCanplayHandler\",\"onCanplay\",\"onPlayHandler\",\"onPlay\",\"onPauseHandler\",\"onPause\",\"onSeekingHandler\",\"onSeeking\",\"onSeekedHandler\",\"onSeeked\",\"onResizeHandler\",\"onResize\",\"rendererOption\",\"enableAutoInBandMetadataTextTrackDetection\",\"detachMedia\",\"parentElement\",\"addEventListener\",\"useHighResTimeupdate\",\"setupTrack\",\"setupCanvas\",\"cleanupCanvas\",\"cleanupTrack\",\"removeEventListener\",\"render\",\"addB24Cue\",\"pushRawData\",\"pushBase64Data\",\"pushID3v2PRIVData\",\"pushID3v2TXXXData\",\"pushID3v2Data\",\"info\",\"frame\",\"owner\",\"VTTCue\",\"TextTrackCue\",\"PRACallback\",\"NEGATIVE_INFINITY\",\"pushID3v2Cue\",\"MIN_VALUE\",\"getComputedStyle\",\"devicePixelRatio\",\"videoWidth\",\"videoHeight\",\"setInBandMetadataTextTrack\",\"useHighResTextTrack\",\"startPolling\",\"textTracks\",\"addTextTrack\",\"position\",\"top\",\"pointerEvents\",\"enableRawCanvas\",\"ResizeObserver\",\"observe\",\"MutationObserver\",\"attributes\",\"attributeFilter\",\"stopPolling\",\"disconnect\",\"vt\",\"text\",\"svg\",\"text_type\",\"prev_hlc\",\"flc\",\"parseBitmap\",\"getAlphaFromColorCode\",\"createElementNS\",\"getRGBfromColorCode\",\"toDataURL\",\"subarray\",\"gt\",\"yt\",\"mt\",\"_t\",\"xt\",\"wt\",\"onPauseAnimationHandler\",\"onPauseAnimation\",\"onResumeAnimationHandler\",\"onResumeAnimation\",\"setupSVG\",\"cleanupSVG\",\"visibility\",\"pauseAnimations\",\"unpauseAnimations\",\"Ct\",\"Tt\",\"kt\",\"Ft\",\"St\",\"table\",\"cells\",\"willChange\",\"boxSizing\",\"border\",\"borderCollapse\",\"padding\",\"verticalAlign\",\"alignItems\",\"justifyContent\",\"lineHeight\",\"fontSize\",\"transform\",\"transformOrigin\",\"marginRight\",\"marginBottom\",\"color\",\"borderBottom\",\"borderRight\",\"borderTop\",\"borderLeft\",\"backgroundColor\",\"parentNode\",\"fontFamily\",\"textShadow\",\"It\",\"Et\",\"Ot\",\"Mt\",\"Bt\",\"Gt\",\"wrapper\",\"setupTable\",\"cleanupTable\",\"offsetWidth\",\"offsetHeight\",\"___CSS_LOADER_EXPORT___\",\"element\",\"setAttributes\",\"insert\",\"memo\",\"styleTarget\",\"querySelector\",\"HTMLIFrameElement\",\"contentDocument\",\"head\",\"getTarget\",\"Error\",\"insertStyleElement\",\"styleTagTransform\",\"removeStyleElement\",\"runtime\",\"ESCAPE_REG\",\"$escape\",\"html\",\"regexResult\",\"char\",\"xmlEscape\",\"$each\",\"callback\",\"len\",\"__webpack_module_cache__\",\"__webpack_require__\",\"moduleId\",\"cachedModule\",\"__webpack_modules__\",\"__esModule\",\"definition\",\"prop\",\"nc\",\"locals\",\"isMobile\",\"utils\",\"secondToTime\",\"second\",\"Infinity\",\"hour\",\"sec\",\"num\",\"getVideoDuration\",\"video\",\"template\",\"duration\",\"seekable\",\"dtime\",\"buffered\",\"getRelativeX\",\"event\",\"container\",\"rect\",\"getBoundingClientRect\",\"clientX\",\"touches\",\"changedTouches\",\"getScrollPosition\",\"pageXOffset\",\"documentElement\",\"scrollLeft\",\"body\",\"pageYOffset\",\"scrollTop\",\"setScrollPosition\",\"isFirefox\",\"scrollTo\",\"isWebKit\",\"storage\",\"localStorage\",\"setItem\",\"getItem\",\"nameMap\",\"dragStart\",\"dragMove\",\"dragEnd\",\"color2Number\",\"substr\",\"number2Color\",\"number\",\"number2Type\",\"fn\",\"thisArg\",\"kindOf\",\"cache\",\"thing\",\"str\",\"kindOfTest\",\"typeOfTest\",\"isUndefined\",\"isBuffer\",\"val\",\"isFunction\",\"isArrayBuffer\",\"isString\",\"isNumber\",\"isObject\",\"isPlainObject\",\"isDate\",\"isFile\",\"isBlob\",\"isFileList\",\"isURLSearchParams\",\"isReadableStream\",\"isRequest\",\"isResponse\",\"isHeaders\",\"allOwnKeys\",\"findKey\",\"_key\",\"_global\",\"isContextDefined\",\"context\",\"isHTMLForm\",\"isRegExp\",\"reduceDescriptors\",\"reducer\",\"descriptors\",\"reducedDescriptors\",\"descriptor\",\"ret\",\"isAsyncFn\",\"_setImmediate\",\"setImmediateSupported\",\"setImmediate\",\"postMessageSupported\",\"postMessage\",\"token\",\"callbacks\",\"shift\",\"cb\",\"setTimeout\",\"asap\",\"queueMicrotask\",\"nextTick\",\"isFormData\",\"FormData\",\"append\",\"isArrayBufferView\",\"isBoolean\",\"isEmptyObject\",\"isStream\",\"pipe\",\"merge\",\"caseless\",\"skipUndefined\",\"assignValue\",\"targetKey\",\"extend\",\"stripBOM\",\"inherits\",\"superConstructor\",\"props\",\"assign\",\"toFlatObject\",\"sourceObj\",\"destObj\",\"propFilter\",\"merged\",\"endsWith\",\"searchString\",\"toArray\",\"arr\",\"forEachEntry\",\"_iterator\",\"pair\",\"matchAll\",\"regExp\",\"matches\",\"hasOwnProp\",\"freezeMethods\",\"toObjectSet\",\"arrayOrString\",\"delimiter\",\"toCamelCase\",\"p1\",\"p2\",\"noop\",\"toFiniteNumber\",\"defaultValue\",\"isSpecCompliantForm\",\"toJSONObject\",\"stack\",\"visit\",\"reducedValue\",\"isThenable\",\"then\",\"catch\",\"isIterable\",\"AxiosError\",\"message\",\"code\",\"config\",\"request\",\"response\",\"captureStackTrace\",\"status\",\"toJSON\",\"fileName\",\"lineNumber\",\"columnNumber\",\"error\",\"customProps\",\"axiosError\",\"msg\",\"errCode\",\"cause\",\"isVisitable\",\"removeBrackets\",\"renderKey\",\"dots\",\"predicates\",\"formData\",\"metaTokens\",\"indexes\",\"option\",\"visitor\",\"defaultVisitor\",\"useBlob\",\"Blob\",\"convertValue\",\"toISOString\",\"Buffer\",\"isFlatArray\",\"el\",\"exposedHelpers\",\"build\",\"pop\",\"encode\",\"charMap\",\"AxiosURLSearchParams\",\"params\",\"_pairs\",\"toFormData\",\"encoder\",\"_encode\",\"buildURL\",\"url\",\"serialize\",\"serializeFn\",\"serializedParams\",\"hashmarkIndex\",\"handlers\",\"use\",\"fulfilled\",\"rejected\",\"synchronous\",\"runWhen\",\"eject\",\"silentJSONParsing\",\"forcedJSONParsing\",\"clarifyTimeoutError\",\"isBrowser\",\"classes\",\"URLSearchParams\",\"protocols\",\"hasBrowserEnv\",\"_navigator\",\"hasStandardBrowserEnv\",\"product\",\"hasStandardBrowserWebWorkerEnv\",\"WorkerGlobalScope\",\"importScripts\",\"origin\",\"location\",\"href\",\"platform\",\"buildPath\",\"isNumericKey\",\"isLast\",\"arrayToObject\",\"parsePropPath\",\"defaults\",\"transitional\",\"transitionalDefaults\",\"adapter\",\"transformRequest\",\"headers\",\"contentType\",\"getContentType\",\"hasJSONContentType\",\"isObjectPayload\",\"formDataToJSON\",\"setContentType\",\"helpers\",\"isNode\",\"toURLEncodedForm\",\"formSerializer\",\"_FormData\",\"env\",\"rawValue\",\"parser\",\"parse\",\"stringifySafely\",\"transformResponse\",\"JSONRequested\",\"responseType\",\"strictJSONParsing\",\"parseReviver\",\"ERR_BAD_RESPONSE\",\"timeout\",\"xsrfCookieName\",\"xsrfHeaderName\",\"maxContentLength\",\"maxBodyLength\",\"validateStatus\",\"common\",\"method\",\"ignoreDuplicateOf\",\"$internals\",\"normalizeHeader\",\"header\",\"normalizeValue\",\"matchHeaderValue\",\"isHeaderNameFilter\",\"AxiosHeaders\",\"valueOrRewrite\",\"rewrite\",\"setHeader\",\"_value\",\"_header\",\"_rewrite\",\"lHeader\",\"setHeaders\",\"rawHeaders\",\"parsed\",\"line\",\"parseHeaders\",\"dest\",\"entry\",\"tokens\",\"tokensRE\",\"parseTokens\",\"matcher\",\"deleted\",\"deleteHeader\",\"format\",\"normalized\",\"formatHeader\",\"targets\",\"asStrings\",\"getSetCookie\",\"computed\",\"accessor\",\"accessors\",\"defineAccessor\",\"accessorName\",\"methodName\",\"arg1\",\"arg2\",\"arg3\",\"buildAccessors\",\"mapped\",\"headerValue\",\"transformData\",\"fns\",\"isCancel\",\"__CANCEL__\",\"CanceledError\",\"ERR_CANCELED\",\"settle\",\"resolve\",\"reject\",\"ERR_BAD_REQUEST\",\"samplesCount\",\"timestamps\",\"firstSampleTS\",\"tail\",\"chunkLength\",\"now\",\"startedAt\",\"bytesCount\",\"passed\",\"freq\",\"lastArgs\",\"timer\",\"timestamp\",\"threshold\",\"invoke\",\"args\",\"clearTimeout\",\"throttled\",\"flush\",\"progressEventReducer\",\"listener\",\"isDownloadStream\",\"bytesNotified\",\"_speedometer\",\"speedometer\",\"throttle\",\"loaded\",\"total\",\"lengthComputable\",\"progressBytes\",\"rate\",\"progress\",\"estimated\",\"progressEventDecorator\",\"asyncDecorator\",\"isMSIE\",\"URL\",\"protocol\",\"host\",\"port\",\"expires\",\"secure\",\"cookie\",\"toGMTString\",\"read\",\"buildFullPath\",\"baseURL\",\"requestedURL\",\"allowAbsoluteUrls\",\"isRelativeUrl\",\"relativeURL\",\"combineURLs\",\"headersToObject\",\"mergeConfig\",\"config1\",\"config2\",\"getMergedValue\",\"mergeDeepProperties\",\"valueFromConfig2\",\"defaultToConfig2\",\"mergeDirectKeys\",\"mergeMap\",\"paramsSerializer\",\"timeoutMessage\",\"withCredentials\",\"withXSRFToken\",\"onUploadProgress\",\"onDownloadProgress\",\"decompress\",\"beforeRedirect\",\"transport\",\"httpAgent\",\"httpsAgent\",\"cancelToken\",\"socketPath\",\"responseEncoding\",\"configValue\",\"newConfig\",\"auth\",\"username\",\"password\",\"getHeaders\",\"formHeaders\",\"allowedHeaders\",\"isURLSameOrigin\",\"xsrfValue\",\"cookies\",\"XMLHttpRequest\",\"Promise\",\"_config\",\"resolveConfig\",\"requestData\",\"requestHeaders\",\"onCanceled\",\"uploadThrottled\",\"downloadThrottled\",\"flushUpload\",\"flushDownload\",\"unsubscribe\",\"signal\",\"onloadend\",\"responseHeaders\",\"getAllResponseHeaders\",\"err\",\"responseText\",\"statusText\",\"onreadystatechange\",\"readyState\",\"responseURL\",\"onabort\",\"ECONNABORTED\",\"onerror\",\"ERR_NETWORK\",\"ontimeout\",\"timeoutErrorMessage\",\"ETIMEDOUT\",\"setRequestHeader\",\"upload\",\"cancel\",\"abort\",\"subscribe\",\"aborted\",\"parseProtocol\",\"send\",\"composeSignals\",\"signals\",\"controller\",\"AbortController\",\"reason\",\"streamChunk\",\"chunk\",\"chunkSize\",\"pos\",\"readStream\",\"async\",\"stream\",\"asyncIterator\",\"reader\",\"getReader\",\"trackStream\",\"onProgress\",\"onFinish\",\"iterable\",\"readBytes\",\"_onFinish\",\"ReadableStream\",\"pull\",\"loadedBytes\",\"enqueue\",\"highWaterMark\",\"globalFetchAPI\",\"Request\",\"Response\",\"TextEncoder\",\"fetch\",\"envFetch\",\"isFetchSupported\",\"isRequestSupported\",\"isResponseSupported\",\"isReadableStreamSupported\",\"encodeText\",\"arrayBuffer\",\"supportsRequestStream\",\"duplexAccessed\",\"hasContentType\",\"duplex\",\"supportsResponseStream\",\"resolvers\",\"res\",\"ERR_NOT_SUPPORT\",\"resolveBodyLength\",\"getContentLength\",\"_request\",\"getBodyLength\",\"fetchOptions\",\"_fetch\",\"composedSignal\",\"toAbortSignal\",\"requestContentLength\",\"contentTypeHeader\",\"isCredentialsSupported\",\"resolvedOptions\",\"credentials\",\"isStreamResponse\",\"responseContentLength\",\"responseData\",\"seedCache\",\"getFetch\",\"seeds\",\"seed\",\"knownAdapters\",\"http\",\"xhr\",\"xhrAdapter\",\"fetchAdapter\",\"renderReason\",\"isResolvedHandle\",\"getAdapter\",\"adapters\",\"nameOrAdapter\",\"rejectedReasons\",\"reasons\",\"throwIfCancellationRequested\",\"throwIfRequested\",\"dispatchRequest\",\"VERSION\",\"validators\",\"deprecatedWarnings\",\"validator\",\"formatMessage\",\"opt\",\"desc\",\"opts\",\"ERR_DEPRECATED\",\"console\",\"warn\",\"spelling\",\"correctSpelling\",\"assertOptions\",\"schema\",\"allowUnknown\",\"ERR_BAD_OPTION_VALUE\",\"ERR_BAD_OPTION\",\"Axios\",\"instanceConfig\",\"interceptors\",\"InterceptorManager\",\"configOrUrl\",\"dummy\",\"boolean\",\"function\",\"baseUrl\",\"withXsrfToken\",\"contextHeaders\",\"requestInterceptorChain\",\"synchronousRequestInterceptors\",\"interceptor\",\"unshift\",\"responseInterceptorChain\",\"promise\",\"chain\",\"onFulfilled\",\"onRejected\",\"getUri\",\"generateHTTPMethod\",\"isForm\",\"CancelToken\",\"executor\",\"resolvePromise\",\"_listeners\",\"onfulfilled\",\"_resolve\",\"HttpStatusCode\",\"Continue\",\"SwitchingProtocols\",\"Processing\",\"EarlyHints\",\"Ok\",\"Created\",\"Accepted\",\"NonAuthoritativeInformation\",\"NoContent\",\"ResetContent\",\"PartialContent\",\"MultiStatus\",\"AlreadyReported\",\"ImUsed\",\"MultipleChoices\",\"MovedPermanently\",\"Found\",\"SeeOther\",\"NotModified\",\"UseProxy\",\"Unused\",\"TemporaryRedirect\",\"PermanentRedirect\",\"BadRequest\",\"Unauthorized\",\"PaymentRequired\",\"Forbidden\",\"NotFound\",\"MethodNotAllowed\",\"NotAcceptable\",\"ProxyAuthenticationRequired\",\"RequestTimeout\",\"Conflict\",\"Gone\",\"LengthRequired\",\"PreconditionFailed\",\"PayloadTooLarge\",\"UriTooLong\",\"UnsupportedMediaType\",\"RangeNotSatisfiable\",\"ExpectationFailed\",\"ImATeapot\",\"MisdirectedRequest\",\"UnprocessableEntity\",\"Locked\",\"FailedDependency\",\"TooEarly\",\"UpgradeRequired\",\"PreconditionRequired\",\"TooManyRequests\",\"RequestHeaderFieldsTooLarge\",\"UnavailableForLegalReasons\",\"InternalServerError\",\"NotImplemented\",\"BadGateway\",\"ServiceUnavailable\",\"GatewayTimeout\",\"HttpVersionNotSupported\",\"VariantAlsoNegotiates\",\"InsufficientStorage\",\"LoopDetected\",\"NotExtended\",\"NetworkAuthenticationRequired\",\"axios\",\"createInstance\",\"defaultConfig\",\"instance\",\"Cancel\",\"promises\",\"spread\",\"isAxiosError\",\"payload\",\"formToJSON\",\"default\",\"defaultApiBackend\",\"post\",\"success\",\"author\",\"time\",\"tranTxt\",\"lang\",\"tran\",\"arg\",\"play\",\"pause\",\"backward\",\"forward\",\"volumeUp\",\"volumeDown\",\"volumeOff\",\"full\",\"fullWeb\",\"pip\",\"setting\",\"check\",\"comment\",\"commentOff\",\"pallette\",\"camera\",\"subtitle\",\"loading\",\"airplay\",\"volumeBar\",\"volumeBarWrap\",\"volumeBarWrapWrap\",\"volumeButton\",\"volumeButtonIcon\",\"volumeIcon\",\"playedBar\",\"loadedBar\",\"playedBarWrap\",\"playedBarTime\",\"danmaku\",\"danmakuLoading\",\"bezel\",\"playButton\",\"playIcon\",\"mobileBackwardButton\",\"mobilePlayButton\",\"mobileForwardButton\",\"videoWrap\",\"videoWrapAspect\",\"controllerMask\",\"ptime\",\"settingButton\",\"settingBox\",\"settingOriginPanel\",\"mask\",\"syncButton\",\"loop\",\"loopToggle\",\"showDanmaku\",\"showDanmakuToggle\",\"unlimitDanmaku\",\"unlimitDanmakuToggle\",\"quality\",\"qualityValue\",\"qualityHeader\",\"qualityItem\",\"speed\",\"speedValue\",\"speedHeader\",\"speedItem\",\"audio\",\"audioValue\",\"audioHeader\",\"audioItem\",\"danmakuOpacityBar\",\"danmakuOpacityBarWrap\",\"danmakuOpacityBarWrapWrap\",\"danmakuOpacityBox\",\"danmakuOpacityValue\",\"commentInput\",\"commentButton\",\"commentSettingBox\",\"commentSettingButton\",\"commentSettingFill\",\"commentSendButton\",\"commentSendFill\",\"commentColorSettingBox\",\"browserFullButton\",\"webFullButton\",\"pipButton\",\"menu\",\"menuItem\",\"cameraButton\",\"airplayButton\",\"subtitleButton\",\"subtitleButtonInner\",\"barPreview\",\"barWrap\",\"notice\",\"infoPanel\",\"infoPanelClose\",\"infoMimeType\",\"infoVersion\",\"infoVideoFPS\",\"infoPageFPS\",\"infoDroppedFrames\",\"infoType\",\"infoUrl\",\"infoResolution\",\"infoDuration\",\"infoBufferRemain\",\"infoDownloadSpeed\",\"init\",\"innerHTML\",\"icons\",\"mobile\",\"current\",\"pic\",\"screenshot\",\"preload\",\"crossOrigin\",\"querySelectorAll\",\"player\",\"danTunnel\",\"danIndex\",\"danFontSize\",\"dan\",\"_opacity\",\"events\",\"unlimited\",\"showing\",\"paused\",\"bottom\",\"opacity\",\"_measure\",\"load\",\"apiurl\",\"address\",\"apiParamsObj\",\"maximum\",\"apiParamsStr\",\"endpoints\",\"addition\",\"apiBackend\",\"trigger\",\"_readAllEndpoints\",\"results\",\"reload\",\"newAPI\",\"errorCount\",\"readCount\",\"isCallbackOnError\",\"danmakuData\",\"user\",\"draw\",\"parseFloat\",\"percentage\",\"setProperty\",\"danList\",\"ratioRate\",\"ratio\",\"itemFontSize\",\"itemHeight\",\"danWidth\",\"itemY\",\"danItemRight\",\"danmakuItem\",\"danmakuItemWidth\",\"danmakuItemRight\",\"danSpeed\",\"getTunnel\",\"tmp\",\"danRight\",\"docFragment\",\"createDocumentFragment\",\"itemWidth\",\"measure\",\"lines\",\"span\",\"borderColor\",\"tunnel\",\"animationDuration\",\"_danAnimation\",\"maxWidth\",\"measureText\",\"seek\",\"resize\",\"items\",\"hide\",\"show\",\"toggle\",\"unlimit\",\"speedRate\",\"isFullScreen\",\"fullScreen\",\"videoEvents\",\"playerEvents\",\"on\",\"once\",\"off\",\"lastScrollPosition\",\"fullscreenchange\",\"onfullscreenchange\",\"fullEle\",\"fullscreenElement\",\"webkitFullscreenElement\",\"contains\",\"anotherType\",\"anotherTypeOn\",\"requestFullscreen\",\"webkitRequestFullscreen\",\"webkitEnterFullscreen\",\"screen\",\"orientation\",\"lock\",\"exitFullscreen\",\"webkitExitFullscreen\",\"unlock\",\"destroy\",\"storageName\",\"volume\",\"plugins\",\"cue\",\"getCueAsHTML\",\"trackHtml\",\"aribb24Caption\",\"elements\",\"played\",\"direction\",\"types\",\"enablefpsChecker\",\"enableinfoChecker\",\"enableloadingChecker\",\"fpsIndex\",\"fpsStart\",\"fpsChecker\",\"infoChecker\",\"loadingChecker\",\"webkitRequestAnimationFrame\",\"mozRequestAnimationFrame\",\"oRequestAnimationFrame\",\"msRequestAnimationFrame\",\"initloadingChecker\",\"lastPlayPos\",\"currentPlayPos\",\"bufferingDetected\",\"setInterval\",\"initfpsChecker\",\"fpsCurrent\",\"fps\",\"initinfoChecker\",\"disable\",\"clearInterval\",\"icon\",\"barWidth\",\"viewportWidth\",\"viewportHeight\",\"thumbnailSpace\",\"interval\",\"totalCount\",\"columnCount\",\"magnificationScale\",\"backgroundPosition\",\"barWrapWidth\",\"rowCount\",\"backgroundWidth\",\"backgroundHeight\",\"backgroundSize\",\"move\",\"column\",\"row\",\"backgroundX\",\"backgroundY\",\"disableAutoHide\",\"autoHideTimer\",\"mobileSkipTimer\",\"mobileBackwardTime\",\"mobileForwardTime\",\"setAutoHideHandler\",\"thumbnails\",\"setAutoHide\",\"initPlayButton\",\"initThumbnails\",\"initPlayedBar\",\"initFullButton\",\"initPipButton\",\"initSyncButton\",\"initScreenshotButton\",\"initSubtitleButton\",\"initHighlights\",\"initAirplayButton\",\"initVolumeButton\",\"isShow\",\"toFixed\",\"highlight\",\"highlights\",\"insertBefore\",\"thumbnailsConfig\",\"thumbMove\",\"preventDefault\",\"clientWidth\",\"bar\",\"thumbUp\",\"passive\",\"relativeX\",\"pictureInPictureEnabled\",\"pictureInPictureElement\",\"exitPictureInPicture\",\"requestPictureInPicture\",\"volumeMove\",\"muted\",\"switchVolumeIcon\",\"live\",\"sync\",\"toBlob\",\"blob\",\"today\",\"filename\",\"getFullYear\",\"getMonth\",\"getDate\",\"getHours\",\"getMinutes\",\"getSeconds\",\"bloburl\",\"createObjectURL\",\"link\",\"download\",\"click\",\"revokeObjectURL\",\"WebKitPlaybackTargetAvailabilityEvent\",\"availability\",\"webkitShowPlaybackTargetPicker\",\"ariaLabel\",\"currentAudio\",\"clipSettingBox\",\"settingOriginPanelHeight\",\"scrollHeight\",\"clipPath\",\"switchingQuality\",\"switchQuality\",\"dataset\",\"mpegts\",\"MSEPlayer\",\"switchPrimaryAudio\",\"switchSecondaryAudio\",\"hls\",\"Hls\",\"audioTracks\",\"audioTrack\",\"checked\",\"danmakuMove\",\"danmakuUp\",\"toggleSetting\",\"hideSetting\",\"keyCode\",\"focus\",\"showSetting\",\"closeCommentFormAfterSend\",\"blur\",\"doHotKeyHandler\",\"cancelFullScreenHandler\",\"doHotKey\",\"cancelFullScreen\",\"hotkey\",\"activeElement\",\"tagName\",\"editable\",\"getAttribute\",\"altKey\",\"shiftKey\",\"ctrlKey\",\"metaKey\",\"pictureInPicture\",\"contextmenuHandler\",\"shown\",\"contextmenu\",\"clientRect\",\"clientY\",\"beginTime\",\"getVideoPlaybackQuality\",\"droppedVideoFrames\",\"totalVideoFrames\",\"decoded\",\"dropped\",\"bufferedRangeCount\",\"bufferRemain\",\"flvjs\",\"mediaInfo\",\"statisticsInfo\",\"mimeType\",\"instances\",\"containerClickFun\",\"docClickFun\",\"narrow\",\"noticeTime\",\"prevVideoCurrentTime\",\"prevVideo\",\"qualityIndex\",\"defaultOption\",\"liveSyncMinBufferSize\",\"syncWhenPlayingLive\",\"autoplay\",\"theme\",\"playbackSpeed\",\"mutex\",\"pluginOptions\",\"defaultKey\",\"defaultQuality\",\"logo\",\"initDanmaku\",\"initVideo\",\"hideNotice\",\"quiet\",\"fromNative\",\"switch\",\"playFunc\",\"nostorage\",\"nonotice\",\"isNaN\",\"formatPercentage\",\"switchVideo\",\"danmakuAPI\",\"remember\",\"playbackRate\",\"poster\",\"initMSE\",\"customType\",\"isSupported\",\"dispose\",\"aribb24Superimpose\",\"hlsOptions\",\"loadSource\",\"attachMedia\",\"Events\",\"AUDIO_TRACKS_UPDATED\",\"aribb24\",\"aribb24Options\",\"disableSuperimposeRenderer\",\"FRAG_PARSING_METADATA\",\"sample\",\"samples\",\"pts\",\"canPlayType\",\"unload\",\"detachMediaElement\",\"mpegtsPlayer\",\"createPlayer\",\"mediaDataSource\",\"isLive\",\"attachMediaElement\",\"TIMED_ID3_METADATA_ARRIVED\",\"flv\",\"flvPlayer\",\"dashjs\",\"dashjsPlayer\",\"MediaPlayer\",\"dash\",\"updateSettings\",\"reset\",\"WebTorrent\",\"WEBRTC_SUPPORT\",\"webtorrent\",\"client\",\"torrentId\",\"torrent\",\"file\",\"files\",\"renderTo\",\"controls\",\"savedSpeed\",\"videoHTML\",\"videoEle\",\"DOMParser\",\"parseFromString\",\"getElementsByTagName\",\"elem\",\"refresh\",\"keepContainerInnerHTML\",\"removeAttribute\"],\"sourceRoot\":\"\"}\n\\ No newline at end of file\n"
  },
  {
    "path": "patches/electron-devtools-installer-npm-4.0.0-ea55a28d94.patch",
    "content": "diff --git a/dist/index.js b/dist/index.js\nindex c428018df26dbeb7300644c938caf13d339c8f7b..5902353901b546296f28f50459df6126932b0527 100644\n--- a/dist/index.js\n+++ b/dist/index.js\n@@ -26,7 +26,7 @@ async function installExtension(extensionReference, options = {}) {\n     else {\n         throw new Error(`Invalid extensionReference passed in: \"${extensionReference}\"`);\n     }\n-    const installedExtension = targetSession.getAllExtensions().find((e) => e.id === chromeStoreID);\n+    const installedExtension = targetSession.extensions.getAllExtensions().find((e) => e.id === chromeStoreID);\n     if (!forceDownload && installedExtension) {\n         return installedExtension;\n     }\n@@ -47,7 +47,7 @@ async function installExtension(extensionReference, options = {}) {\n         targetSession.removeExtension(installedExtension.id);\n         await unloadPromise;\n     }\n-    return targetSession.loadExtension(extensionFolder, loadExtensionOptions);\n+    return targetSession.extensions.loadExtension(extensionFolder, loadExtensionOptions);\n }\n exports.default = installExtension;\n exports.EMBER_INSPECTOR = {\n"
  },
  {
    "path": "patches/electron-updater-npm-6.7.0-47b11bb0d4.patch",
    "content": "diff --git a/out/util.js b/out/util.js\nindex 9294ffd6ca8f02c2e0f90c663e7e9cdc02c1ac37..f52107493e2995320ee4efd0eb2a8c9bf03291a2 100644\n--- a/out/util.js\n+++ b/out/util.js\n@@ -23,7 +23,8 @@ function newUrlFromBase(pathname, baseUrl, addRandomQueryToAvoidCaching = false)\n         result.search = search;\n     }\n     else if (addRandomQueryToAvoidCaching) {\n-        result.search = `noCache=${Date.now().toString(32)}`;\n+        // use no cache header instead\n+        // result.search = `noCache=${Date.now().toString(32)}`;\n     }\n     return result;\n }\n"
  },
  {
    "path": "patches/file-stream-rotator-npm-0.6.1-eab45fb13d.patch",
    "content": "diff --git a/FileStreamRotator.js b/FileStreamRotator.js\nindex 639bb9c8f972ba672bd27d9f8b1739d1030cb44b..a12a6d93b61fe782e981027248fa10876151f65f 100644\n--- a/FileStreamRotator.js\n+++ b/FileStreamRotator.js\n@@ -12,7 +12,7 @@\n  */\n var fs = require('fs');\n var path = require('path');\n-var moment = require('moment');\n+var moment = require('moment').default || require('moment');\n var crypto = require('crypto');\n\n var EventEmitter = require('events');\n"
  },
  {
    "path": "patches/libsql-npm-0.4.7-444e260fb1.patch",
    "content": "diff --git a/index.js b/index.js\nindex 4e8423491ab51a9eb9fee22182e4ea0fcc3d3d3b..2846c5d4354c130d478dc99565b3ecd6d85b7d2e 100644\n--- a/index.js\n+++ b/index.js\n@@ -19,7 +19,11 @@ function requireNative() {\n       break;\n     }\n   }\n-  return require(`@libsql/${target}`);\n+  if (target === \"win32-arm64-msvc\") {\n+    return require(`@strongtz/win32-arm64-msvc`);\n+  } else {\n+    return require(`@libsql/${target}`);\n+  }\n }\n\n const {\n"
  },
  {
    "path": "patches/shaka-player-npm-4.13.0-5e61f852f3.patch",
    "content": "diff --git a/dist/shaka-player.compiled.d.ts b/dist/shaka-player.compiled.d.ts\nindex 0971e580f818994d0bddca4f19b142f07e9fde9b..9d5c5152684151ece456f45e4b7f47154b245833 100644\n--- a/dist/shaka-player.compiled.d.ts\n+++ b/dist/shaka-player.compiled.d.ts\n@@ -5266,3 +5266,5 @@ declare namespace shaka.extern {\n declare namespace shaka.extern {\n   type TransmuxerPlugin = ( ) => shaka.extern.Transmuxer ;\n }\n+\n+export default shaka;\ndiff --git a/dist/shaka-player.ui.d.ts b/dist/shaka-player.ui.d.ts\nindex 460e0098302810603197f520eed2bff8fe45da54..41bab00766dba05d1727d24fdd14579fb79eab71 100644\n--- a/dist/shaka-player.ui.d.ts\n+++ b/dist/shaka-player.ui.d.ts\n@@ -6011,3 +6011,5 @@ declare namespace shaka.extern {\n declare namespace shaka.ui.Watermark {\n   type Options = { alpha : number , color : string , displayDuration : number , interval : number , position : string , size : number , skip : number , text : string , transitionDuration : number , type : string } ;\n }\n+\n+export default shaka;\ndiff --git a/index.d.ts b/index.d.ts\nnew file mode 100644\nindex 0000000000000000000000000000000000000000..79f4829aeddccde2a371bfc38c860b1c3639a4a1\n--- /dev/null\n+++ b/index.d.ts\n@@ -0,0 +1,2 @@\n+<reference path=\"./dist/shaka-player.compiled.d.ts\" />\n+<reference path=\"./dist/shaka-player.ui.d.ts\" />\n\\ No newline at end of file\ndiff --git a/ui.d.ts b/ui.d.ts\nnew file mode 100644\nindex 0000000000000000000000000000000000000000..84a3be03b3928f2ae303f6e22991c5900517fd67\n--- /dev/null\n+++ b/ui.d.ts\n@@ -0,0 +1,3 @@\n+import shaka from 'shaka-player/dist/shaka-player.ui'\n+export * from 'shaka-player/dist/shaka-player.ui'\n+export default shaka;\n\\ No newline at end of file\n"
  },
  {
    "path": "pnpm-workspace.yaml",
    "content": "packages:\n  - 'packages/*'\n\nsupportedArchitectures:\n  os:\n    - current\n  cpu:\n    - current\n"
  },
  {
    "path": "resources/scripts/download.js",
    "content": "const https = require('node:https');\nconst fs = require('node:fs');\nconst path = require('node:path');\nconst { execSync } = require('node:child_process');\n\n/**\n * Downloads a file from a URL with redirect handling\n * @param {string} url The URL to download from\n * @param {string} destinationPath The path to save the file to\n * @returns {Promise<void>} Promise that resolves when download is complete\n */\nasync function downloadWithRedirects(url, destinationPath) {\n  return new Promise((resolve, reject) => {\n    const request = (url) => {\n      https\n        .get(url, (response) => {\n          if (response.statusCode === 301 || response.statusCode === 302) {\n            request(response.headers.location);\n            return;\n          }\n          if (response.statusCode !== 200) {\n            reject(new Error(`Download failed: ${response.statusCode} ${response.statusMessage}`));\n            return;\n          }\n          const file = fs.createWriteStream(destinationPath);\n          response.pipe(file);\n          file.on('finish', () => resolve());\n        })\n        .on('error', (err) => {\n          reject(err);\n        });\n    };\n    request(url);\n  });\n}\n\n/**\n * Downloads a file using PowerShell Invoke-WebRequest command\n * @param {string} url The URL to download from\n * @param {string} destinationPath The path to save the file to\n * @returns {Promise<boolean>} Promise that resolves to true if download succeeds\n */\nasync function downloadWithPowerShell(url, destinationPath) {\n  return new Promise((resolve, reject) => {\n    try {\n      // Only support windows platform for PowerShell download\n      if (process.platform !== 'win32') {\n        return reject(new Error('PowerShell download is only supported on Windows'));\n      }\n\n      const outputDir = path.dirname(destinationPath);\n      fs.mkdirSync(outputDir, { recursive: true });\n\n      // PowerShell command to download the file with progress disabled for faster download\n      const psCommand = `powershell -Command \"$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest '${url}' -OutFile '${destinationPath}'\"`;\n\n      console.log(`Downloading with PowerShell: ${url}`);\n      execSync(psCommand, { stdio: 'inherit' });\n\n      if (fs.existsSync(destinationPath)) {\n        console.log(`Download completed: ${destinationPath}`);\n        resolve(true);\n      } else {\n        reject(new Error('Download failed: File not found after download'));\n      }\n    } catch (error) {\n      reject(new Error(`PowerShell download failed: ${error.message}`));\n    }\n  });\n}\n\nmodule.exports = { downloadWithRedirects, downloadWithPowerShell };\n"
  },
  {
    "path": "resources/scripts/install-bun.js",
    "content": "const fs = require('node:fs');\nconst path = require('node:path');\nconst os = require('node:os');\nconst { execSync } = require('node:child_process');\nconst StreamZip = require('node-stream-zip');\nconst { downloadWithRedirects } = require('./download');\n\n// Base URL for downloading bun binaries\nconst BUN_RELEASE_BASE_URL = 'https://gitcode.com/CherryHQ/bun/releases/download';\n// const BUN_RELEASE_BASE_URL = 'https://github.com/oven-sh/bun/releases/download';\nconst DEFAULT_BUN_VERSION = '1.3.1'; // Default fallback version\n\n// Mapping of platform+arch to binary package name\nconst BUN_PACKAGES = {\n  'darwin-arm64': 'bun-darwin-aarch64.zip',\n  'darwin-x64': 'bun-darwin-x64.zip',\n  'win32-x64': 'bun-windows-x64.zip',\n  'win32-x64-baseline': 'bun-windows-x64-baseline.zip',\n  'win32-arm64': 'bun-windows-x64.zip',\n  'win32-arm64-baseline': 'bun-windows-x64-baseline.zip',\n  'linux-x64': 'bun-linux-x64.zip',\n  'linux-x64-baseline': 'bun-linux-x64-baseline.zip',\n  'linux-arm64': 'bun-linux-aarch64.zip',\n  // MUSL variants\n  'linux-musl-x64': 'bun-linux-x64-musl.zip',\n  'linux-musl-x64-baseline': 'bun-linux-x64-musl-baseline.zip',\n  'linux-musl-arm64': 'bun-linux-aarch64-musl.zip',\n};\n\n/**\n * Downloads and extracts the bun binary for the specified platform and architecture\n * @param {string} platform Platform to download for (e.g., 'darwin', 'win32', 'linux')\n * @param {string} arch Architecture to download for (e.g., 'x64', 'arm64')\n * @param {string} version Version of bun to download\n * @param {boolean} isMusl Whether to use MUSL variant for Linux\n * @param {boolean} isBaseline Whether to use baseline variant\n */\nasync function downloadBunBinary(platform, arch, version = DEFAULT_BUN_VERSION, isMusl = false, isBaseline = false) {\n  let platformKey = isMusl ? `${platform}-musl-${arch}` : `${platform}-${arch}`;\n  if (isBaseline) {\n    platformKey += '-baseline';\n  }\n  const packageName = BUN_PACKAGES[platformKey];\n\n  if (!packageName) {\n    console.error(`No binary available for ${platformKey}`);\n    return 101;\n  }\n\n  // Create output directory structure\n  const binDir = path.join(os.homedir(), '.zy', 'bin');\n  // Ensure directories exist\n  fs.mkdirSync(binDir, { recursive: true });\n\n  // Download URL for the specific binary\n  const downloadUrl = `${BUN_RELEASE_BASE_URL}/bun-v${version}/${packageName}`;\n  const tempdir = os.tmpdir();\n  // Create a temporary file for the downloaded binary\n  const tempFilename = path.join(tempdir, packageName);\n\n  try {\n    console.log(`Downloading bun ${version} for ${platformKey}...`);\n    console.log(`URL: ${downloadUrl}`);\n\n    // Use the new download function\n    await downloadWithRedirects(downloadUrl, tempFilename);\n\n    // Extract the zip file using adm-zip\n    console.log(`Extracting ${packageName} to ${binDir}...`);\n    // eslint-disable-next-line new-cap\n    const zip = new StreamZip.async({ file: tempFilename });\n\n    // Get all entries in the zip file\n    const entries = await zip.entries();\n\n    // Extract files directly to binDir, flattening the directory structure\n    for (const entry of Object.values(entries)) {\n      if (!entry.isDirectory) {\n        // Get just the filename without path\n        const filename = path.basename(entry.name);\n        const outputPath = path.join(binDir, filename);\n\n        console.log(`Extracting ${entry.name} -> ${filename}`);\n        await zip.extract(entry.name, outputPath);\n        // Make executable files executable on Unix-like systems\n        if (platform !== 'win32') {\n          try {\n            fs.chmodSync(outputPath, 0o755);\n          } catch {\n            console.error(`Warning: Failed to set executable permissions on ${filename}`);\n            return 102;\n          }\n        }\n        console.log(`Extracted ${entry.name} -> ${outputPath}`);\n      }\n    }\n    await zip.close();\n\n    // Clean up\n    fs.unlinkSync(tempFilename);\n    console.log(`Successfully installed bun ${version} for ${platformKey}`);\n    return 0;\n  } catch (error) {\n    let retCode = 103;\n\n    console.error(`Error installing bun for ${platformKey}: ${error.message}`);\n    // Clean up temporary file if it exists\n    if (fs.existsSync(tempFilename)) {\n      fs.unlinkSync(tempFilename);\n    }\n\n    // Check if binDir is empty and remove it if so\n    try {\n      const files = fs.readdirSync(binDir);\n      if (files.length === 0) {\n        fs.rmSync(binDir, { recursive: true });\n        console.log(`Removed empty directory: ${binDir}`);\n      }\n    } catch (cleanupError) {\n      console.warn(`Warning: Failed to clean up directory: ${cleanupError.message}`);\n      retCode = 104;\n    }\n\n    return retCode;\n  }\n}\n\n/**\n * Detects current platform and architecture\n */\nfunction detectPlatformAndArch() {\n  const platform = os.platform();\n  const arch = os.arch();\n  const isMusl = platform === 'linux' && detectIsMusl();\n  const isBaseline = platform === 'win32';\n\n  return { platform, arch, isMusl, isBaseline };\n}\n\n/**\n * Attempts to detect if running on MUSL libc\n */\nfunction detectIsMusl() {\n  try {\n    // Simple check for Alpine Linux which uses MUSL\n    const output = execSync('cat /etc/os-release').toString();\n    return output.toLowerCase().includes('alpine');\n  } catch (error) {\n    console.warn(`Could not determine if system is MUSL: ${error.message}`);\n    return false;\n  }\n}\n\n/**\n * Main function to install bun\n */\nasync function installBun() {\n  // Get the latest version if no specific version is provided\n  const version = DEFAULT_BUN_VERSION;\n  console.log(`Using bun version: ${version}`);\n\n  const { platform, arch, isMusl, isBaseline } = detectPlatformAndArch();\n\n  console.log(\n    `Installing bun ${version} for ${platform}-${arch}${isMusl ? ' (MUSL)' : ''}${isBaseline ? ' (baseline)' : ''}...`,\n  );\n\n  return await downloadBunBinary(platform, arch, version, isMusl, isBaseline);\n}\n\n// Run the installation\ninstallBun()\n  .then((retCode) => {\n    if (retCode === 0) {\n      console.log('Installation successful');\n      process.exit(0);\n    } else {\n      console.error('Installation failed');\n      process.exit(retCode);\n    }\n  })\n  .catch((error) => {\n    console.error('Installation failed:', error);\n    process.exit(100);\n  });\n"
  },
  {
    "path": "resources/scripts/install-ffmpeg.js",
    "content": "const fs = require('node:fs');\nconst path = require('node:path');\nconst os = require('node:os');\nconst zlib = require('node:zlib');\nconst sevenZip = require('node-7z');\nconst sevenZipBin = require('7zip-bin-full');\nconst { execSync } = require('node:child_process');\nconst { downloadWithRedirects } = require('./download');\n\n// Base URL for downloading ffmpeg binaries\nconst FFMPEG_RELEASE_BASE_URL = 'https://github.com/eugeneware/ffmpeg-static/releases/download';\nconst DEFAULT_FFMPEG_VERSION = 'b6.1.1';\n\nconst FFMPEG_WIN_ARM_RELEASE_BASE_URL = 'https://github.com/tordona/ffmpeg-win-arm64/releases/download';\nconst DEFAULT_FFMPEG_WIN_ARM_VERSION = '7.1.2';\n\n// Mapping of platform+arch to binary package name\nconst FFMPEG_PACKAGES = {\n  'darwin-arm64': 'ffmpeg-darwin-arm64.gz',\n  'darwin-x64': 'ffmpeg-darwin-x64.gz',\n  'win32-arm64': 'ffmpeg-7.1.2-full-static-win-arm64.7z',\n  'win32-x64': 'ffmpeg-win32-x64.gz',\n  'linux-arm64': 'ffmpeg-linux-arm64.gz',\n  'linux-ia32': 'ffmpeg-linux-ia32.gz',\n  'linux-x64': 'ffmpeg-linux-x64.gz',\n};\n\n/**\n * Extract .gz file\n */\nasync function extractGz(inputPath, outputPath) {\n  const compressed = fs.readFileSync(inputPath);\n  const decompressed = zlib.gunzipSync(compressed);\n  fs.writeFileSync(outputPath, decompressed);\n}\n\n/**\n * Extract .7z file\n */\nasync function extract7z(inputPath, outputPath) {\n  const sevenZipPath = sevenZipBin.path7z;\n  await new Promise((resolve, reject) => {\n    const stream = sevenZip.extractFull(inputPath, outputPath, { $bin: sevenZipPath });\n    stream.on('end', () => resolve());\n    stream.on('error', reject);\n  });\n}\n\n/**\n * Downloads and extracts the ffmpeg binary for the specified platform and architecture\n * @param {string} platform Platform to download for (e.g., 'darwin', 'win32', 'linux')\n * @param {string} arch Architecture to download for (e.g., 'x64', 'arm64')\n * @param {string} version Version of ffmpeg to download\n * @param {boolean} isMusl Whether to use MUSL variant for Linux\n */\nasync function downloadFFmpegBinary(platform, arch, version, isMusl = false) {\n  const platformKey = isMusl ? `${platform}-musl-${arch}` : `${platform}-${arch}`;\n  const packageName = FFMPEG_PACKAGES[platformKey];\n\n  if (!packageName) {\n    console.error(`No binary available for ${platformKey}`);\n    return 101;\n  }\n\n  // Create output directory structure\n  const binDir = path.join(os.homedir(), '.zy', 'bin');\n  // Ensure directories exist\n  fs.mkdirSync(binDir, { recursive: true });\n\n  // Download URL for the specific binary\n  let downloadUrl;\n  if (platform === 'win32' && arch === 'arm64') {\n    downloadUrl = `${FFMPEG_WIN_ARM_RELEASE_BASE_URL}/${version}/${packageName}`;\n  } else {\n    downloadUrl = `${FFMPEG_RELEASE_BASE_URL}/${version}/${packageName}`;\n  }\n\n  const tempDir = os.tmpdir();\n  const tempFilename = path.join(tempDir, packageName);\n  console.log(`Will be saved to: ${tempFilename}`);\n\n  const isGz = packageName.endsWith('.gz');\n  const is7z = packageName.endsWith('.7z');\n\n  try {\n    console.log(`Downloading ffmpeg ${version} for ${platformKey}...`);\n    console.log(`URL: ${downloadUrl}`);\n\n    await downloadWithRedirects(downloadUrl, tempFilename);\n    console.log(`Extracting ${packageName} to ${binDir}...`);\n\n    const tempExtractDir = path.join(tempDir, `ffmpeg-extract-${Date.now()}`);\n    fs.mkdirSync(tempExtractDir, { recursive: true });\n    const binaryName = platform === 'win32' ? 'ffmpeg.exe' : 'ffmpeg';\n    const outputFilePath = path.join(tempExtractDir, binaryName);\n\n    if (isGz) {\n      await extractGz(tempFilename, outputFilePath);\n    } else if (is7z) {\n      await extract7z(tempFilename, tempExtractDir);\n    }\n\n    // Find ffmpeg files and copy to binDir\n    const findAndMoveFiles = (dir) => {\n      const entries = fs.readdirSync(dir, { withFileTypes: true });\n      for (const entry of entries) {\n        const fullPath = path.join(dir, entry.name);\n        if (entry.isDirectory()) {\n          findAndMoveFiles(fullPath);\n        } else {\n          if (entry.name !== binaryName) continue;\n\n          const outputPath = path.join(binDir, entry.name);\n          fs.copyFileSync(fullPath, outputPath);\n          console.log(`Extracted ${entry.name} -> ${outputPath}`);\n\n          if (platform !== 'win32') {\n            fs.chmodSync(outputPath, 0o755);\n          }\n        }\n      }\n    };\n    findAndMoveFiles(tempExtractDir);\n\n    // Clean up temporary\n    fs.unlinkSync(tempFilename);\n    fs.rmSync(tempExtractDir, { recursive: true });\n\n    console.log(`Successfully installed ffmpeg ${version} for ${platform}-${arch}`);\n    return 0;\n  } catch (error) {\n    let retCode = 103;\n\n    console.error(`Error installing ffmpeg for ${platformKey}: ${error.message}`);\n\n    if (fs.existsSync(tempFilename)) {\n      fs.unlinkSync(tempFilename);\n    }\n\n    // Check if binDir is empty and remove it if so\n    try {\n      const files = fs.readdirSync(binDir);\n      if (files.length === 0) {\n        fs.rmSync(binDir, { recursive: true });\n        console.log(`Removed empty directory: ${binDir}`);\n      }\n    } catch (cleanupError) {\n      console.warn(`Warning: Failed to clean up directory: ${cleanupError.message}`);\n      retCode = 104;\n    }\n\n    return retCode;\n  }\n}\n\n/**\n * Detects current platform and architecture\n */\nfunction detectPlatformAndArch() {\n  const platform = os.platform();\n  const arch = os.arch();\n  const isMusl = platform === 'linux' && detectIsMusl();\n\n  return { platform, arch, isMusl };\n}\n\n/**\n * Attempts to detect if running on MUSL libc\n */\nfunction detectIsMusl() {\n  try {\n    // Simple check for Alpine Linux which uses MUSL\n    const output = execSync('cat /etc/os-release').toString();\n    return output.toLowerCase().includes('alpine');\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Main function to install ffmpeg\n */\nasync function installFFmpeg() {\n  const { platform, arch, isMusl } = detectPlatformAndArch();\n\n  // Get the latest version if no specific version is provided\n  const version = arch === 'arm64' && platform === 'win32' ? DEFAULT_FFMPEG_WIN_ARM_VERSION : DEFAULT_FFMPEG_VERSION;\n  console.log(`Installing ffmpeg ${version} for ${platform}-${arch}${isMusl ? ' (MUSL)' : ''}...`);\n\n  return await downloadFFmpegBinary(platform, arch, version, isMusl);\n}\n\n// Run the installation\ninstallFFmpeg()\n  .then((retCode) => {\n    if (retCode === 0) {\n      console.log('Installation successful');\n      process.exit(0);\n    } else {\n      console.error('Installation failed');\n      process.exit(retCode);\n    }\n  })\n  .catch((error) => {\n    console.error('Installation failed:', error);\n    process.exit(100);\n  });\n"
  },
  {
    "path": "resources/scripts/install-ffprobe.js",
    "content": "const fs = require('node:fs');\nconst path = require('node:path');\nconst os = require('node:os');\nconst zlib = require('node:zlib');\nconst sevenZip = require('node-7z');\nconst sevenZipBin = require('7zip-bin-full');\nconst { execSync } = require('node:child_process');\nconst { downloadWithRedirects } = require('./download');\n\n// Base URL for downloading ffprobe binaries\nconst FFPROBE_RELEASE_BASE_URL = 'https://github.com/eugeneware/ffmpeg-static/releases/download';\nconst DEFAULT_FFPROBE_VERSION = 'b6.1.1';\n\nconst FFPROBE_WIN_ARM_RELEASE_BASE_URL = 'https://github.com/tordona/ffmpeg-win-arm64/releases/download';\nconst DEFAULT_FFPROBE_WIN_ARM_VERSION = '7.1.2';\n\n// Mapping of platform+arch to binary package name\nconst FFPROBE_PACKAGES = {\n  'darwin-arm64': 'ffprobe-darwin-arm64.gz',\n  'darwin-x64': 'ffprobe-darwin-x64.gz',\n  'win32-arm64': 'ffmpeg-7.1.2-full-static-win-arm64.7z',\n  'win32-x64': 'ffprobe-win32-x64.gz',\n  'linux-arm64': 'ffprobe-linux-arm64.gz',\n  'linux-ia32': 'ffprobe-linux-ia32.gz',\n  'linux-x64': 'ffprobe-linux-x64.gz',\n};\n\n/**\n * Extract .gz file\n */\nasync function extractGz(inputPath, outputPath) {\n  const compressed = fs.readFileSync(inputPath);\n  const decompressed = zlib.gunzipSync(compressed);\n  fs.writeFileSync(outputPath, decompressed);\n}\n\n/**\n * Extract .7z file\n */\nasync function extract7z(inputPath, outputPath) {\n  const sevenZipPath = sevenZipBin.path7z;\n  await new Promise((resolve, reject) => {\n    const stream = sevenZip.extractFull(inputPath, outputPath, { $bin: sevenZipPath });\n    stream.on('end', () => resolve());\n    stream.on('error', reject);\n  });\n}\n\n/**\n * Downloads and extracts the ffprobe binary for the specified platform and architecture\n * @param {string} platform Platform to download for (e.g., 'darwin', 'win32', 'linux')\n * @param {string} arch Architecture to download for (e.g., 'x64', 'arm64')\n * @param {string} version Version of ffprobe to download\n * @param {boolean} isMusl Whether to use MUSL variant for Linux\n */\nasync function downloadFFprobeBinary(platform, arch, version, isMusl = false) {\n  const platformKey = isMusl ? `${platform}-musl-${arch}` : `${platform}-${arch}`;\n  const packageName = FFPROBE_PACKAGES[platformKey];\n\n  if (!packageName) {\n    console.error(`No binary available for ${platformKey}`);\n    return 101;\n  }\n\n  // Create output directory structure\n  const binDir = path.join(os.homedir(), '.zy', 'bin');\n  // Ensure directories exist\n  fs.mkdirSync(binDir, { recursive: true });\n\n  // Download URL for the specific binary\n  let downloadUrl;\n  if (platform === 'win32' && arch === 'arm64') {\n    downloadUrl = `${FFPROBE_WIN_ARM_RELEASE_BASE_URL}/${version}/${packageName}`;\n  } else {\n    downloadUrl = `${FFPROBE_RELEASE_BASE_URL}/${version}/${packageName}`;\n  }\n\n  const tempDir = os.tmpdir();\n  const tempFilename = path.join(tempDir, packageName);\n  console.log(`Will be saved to: ${tempFilename}`);\n\n  const isGz = packageName.endsWith('.gz');\n  const is7z = packageName.endsWith('.7z');\n\n  try {\n    console.log(`Downloading ffprobe ${version} for ${platformKey}...`);\n    console.log(`URL: ${downloadUrl}`);\n\n    await downloadWithRedirects(downloadUrl, tempFilename);\n    console.log(`Extracting ${packageName} to ${binDir}...`);\n\n    const tempExtractDir = path.join(tempDir, `ffprobe-extract-${Date.now()}`);\n    fs.mkdirSync(tempExtractDir, { recursive: true });\n    const binaryName = platform === 'win32' ? 'ffprobe.exe' : 'ffprobe';\n    const outputFilePath = path.join(tempExtractDir, binaryName);\n\n    if (isGz) {\n      await extractGz(tempFilename, outputFilePath);\n    } else if (is7z) {\n      await extract7z(tempFilename, tempExtractDir);\n    }\n\n    // Find ffprobe files and copy to binDir\n    const findAndMoveFiles = (dir) => {\n      const entries = fs.readdirSync(dir, { withFileTypes: true });\n      for (const entry of entries) {\n        const fullPath = path.join(dir, entry.name);\n        if (entry.isDirectory()) {\n          findAndMoveFiles(fullPath);\n        } else {\n          if (entry.name !== binaryName) continue;\n\n          const outputPath = path.join(binDir, entry.name);\n          fs.copyFileSync(fullPath, outputPath);\n          console.log(`Extracted ${entry.name} -> ${outputPath}`);\n\n          if (platform !== 'win32') {\n            fs.chmodSync(outputPath, 0o755);\n          }\n        }\n      }\n    };\n    findAndMoveFiles(tempExtractDir);\n\n    // Clean up temporary\n    fs.unlinkSync(tempFilename);\n    fs.rmSync(tempExtractDir, { recursive: true });\n\n    console.log(`Successfully installed ffprobe ${version} for ${platform}-${arch}`);\n    return 0;\n  } catch (error) {\n    let retCode = 103;\n\n    console.error(`Error installing ffprobe for ${platformKey}: ${error.message}`);\n\n    if (fs.existsSync(tempFilename)) {\n      fs.unlinkSync(tempFilename);\n    }\n\n    // Check if binDir is empty and remove it if so\n    try {\n      const files = fs.readdirSync(binDir);\n      if (files.length === 0) {\n        fs.rmSync(binDir, { recursive: true });\n        console.log(`Removed empty directory: ${binDir}`);\n      }\n    } catch (cleanupError) {\n      console.warn(`Warning: Failed to clean up directory: ${cleanupError.message}`);\n      retCode = 104;\n    }\n\n    return retCode;\n  }\n}\n\n/**\n * Detects current platform and architecture\n */\nfunction detectPlatformAndArch() {\n  const platform = os.platform();\n  const arch = os.arch();\n  const isMusl = platform === 'linux' && detectIsMusl();\n\n  return { platform, arch, isMusl };\n}\n\n/**\n * Attempts to detect if running on MUSL libc\n */\nfunction detectIsMusl() {\n  try {\n    // Simple check for Alpine Linux which uses MUSL\n    const output = execSync('cat /etc/os-release').toString();\n    return output.toLowerCase().includes('alpine');\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Main function to install ffprobe\n */\nasync function installFFprobe() {\n  const { platform, arch, isMusl } = detectPlatformAndArch();\n\n  // Get the latest version if no specific version is provided\n  const version = arch === 'arm64' && platform === 'win32' ? DEFAULT_FFPROBE_WIN_ARM_VERSION : DEFAULT_FFPROBE_VERSION;\n  console.log(`Installing ffprobe ${version} for ${platform}-${arch}${isMusl ? ' (MUSL)' : ''}...`);\n\n  return await downloadFFprobeBinary(platform, arch, version, isMusl);\n}\n\n// Run the installation\ninstallFFprobe()\n  .then((retCode) => {\n    if (retCode === 0) {\n      console.log('Installation successful');\n      process.exit(0);\n    } else {\n      console.error('Installation failed');\n      process.exit(retCode);\n    }\n  })\n  .catch((error) => {\n    console.error('Installation failed:', error);\n    process.exit(100);\n  });\n"
  },
  {
    "path": "resources/scripts/install-uv.js",
    "content": "const fs = require('node:fs');\nconst path = require('node:path');\nconst os = require('node:os');\nconst { execSync } = require('node:child_process');\nconst StreamZip = require('node-stream-zip');\nconst { downloadWithRedirects } = require('./download');\n\n// Base URL for downloading uv binaries\nconst UV_RELEASE_BASE_URL = 'https://gitcode.com/CherryHQ/uv/releases/download';\n// const UV_RELEASE_BASE_URL = 'https://github.com/astral-sh/uv/releases/download';\nconst DEFAULT_UV_VERSION = '0.9.5';\n\n// Mapping of platform+arch to binary package name\nconst UV_PACKAGES = {\n  'darwin-arm64': 'uv-aarch64-apple-darwin.tar.gz',\n  'darwin-x64': 'uv-x86_64-apple-darwin.tar.gz',\n  'win32-arm64': 'uv-aarch64-pc-windows-msvc.zip',\n  'win32-ia32': 'uv-i686-pc-windows-msvc.zip',\n  'win32-x64': 'uv-x86_64-pc-windows-msvc.zip',\n  'linux-arm64': 'uv-aarch64-unknown-linux-gnu.tar.gz',\n  'linux-ia32': 'uv-i686-unknown-linux-gnu.tar.gz',\n  'linux-ppc64': 'uv-powerpc64-unknown-linux-gnu.tar.gz',\n  'linux-ppc64le': 'uv-powerpc64le-unknown-linux-gnu.tar.gz',\n  'linux-riscv64': 'uv-riscv64gc-unknown-linux-gnu.tar.gz',\n  'linux-s390x': 'uv-s390x-unknown-linux-gnu.tar.gz',\n  'linux-x64': 'uv-x86_64-unknown-linux-gnu.tar.gz',\n  'linux-armv7l': 'uv-armv7-unknown-linux-gnueabihf.tar.gz',\n  // MUSL variants\n  'linux-musl-arm64': 'uv-aarch64-unknown-linux-musl.tar.gz',\n  'linux-musl-ia32': 'uv-i686-unknown-linux-musl.tar.gz',\n  'linux-musl-x64': 'uv-x86_64-unknown-linux-musl.tar.gz',\n  'linux-musl-armv6l': 'uv-arm-unknown-linux-musleabihf.tar.gz',\n  'linux-musl-armv7l': 'uv-armv7-unknown-linux-musleabihf.tar.gz',\n};\n\n/**\n * Downloads and extracts the uv binary for the specified platform and architecture\n * @param {string} platform Platform to download for (e.g., 'darwin', 'win32', 'linux')\n * @param {string} arch Architecture to download for (e.g., 'x64', 'arm64')\n * @param {string} version Version of uv to download\n * @param {boolean} isMusl Whether to use MUSL variant for Linux\n */\nasync function downloadUvBinary(platform, arch, version = DEFAULT_UV_VERSION, isMusl = false) {\n  const platformKey = isMusl ? `${platform}-musl-${arch}` : `${platform}-${arch}`;\n  const packageName = UV_PACKAGES[platformKey];\n\n  if (!packageName) {\n    console.error(`No binary available for ${platformKey}`);\n    return 101;\n  }\n\n  // Create output directory structure\n  const binDir = path.join(os.homedir(), '.zy', 'bin');\n  // Ensure directories exist\n  fs.mkdirSync(binDir, { recursive: true });\n\n  // Download URL for the specific binary\n  const downloadUrl = `${UV_RELEASE_BASE_URL}/${version}/${packageName}`;\n  const tempdir = os.tmpdir();\n  const tempFilename = path.join(tempdir, packageName);\n  const isTarGz = packageName.endsWith('.tar.gz');\n\n  try {\n    console.log(`Downloading uv ${version} for ${platformKey}...`);\n    console.log(`URL: ${downloadUrl}`);\n\n    await downloadWithRedirects(downloadUrl, tempFilename);\n\n    console.log(`Extracting ${packageName} to ${binDir}...`);\n\n    if (isTarGz) {\n      // Use tar command to extract tar.gz files (macOS and Linux)\n      const tempExtractDir = path.join(tempdir, `uv-extract-${Date.now()}`);\n      fs.mkdirSync(tempExtractDir, { recursive: true });\n\n      execSync(`tar -xzf \"${tempFilename}\" -C \"${tempExtractDir}\"`, { stdio: 'inherit' });\n\n      // Find all files in the extracted directory and move them to binDir\n      const findAndMoveFiles = (dir) => {\n        const entries = fs.readdirSync(dir, { withFileTypes: true });\n        for (const entry of entries) {\n          const fullPath = path.join(dir, entry.name);\n          if (entry.isDirectory()) {\n            findAndMoveFiles(fullPath);\n          } else {\n            const filename = path.basename(entry.name);\n            const outputPath = path.join(binDir, filename);\n            fs.copyFileSync(fullPath, outputPath);\n            console.log(`Extracted ${entry.name} -> ${outputPath}`);\n            // Make executable on Unix-like systems\n            fs.chmodSync(outputPath, 0o755);\n          }\n        }\n      };\n\n      findAndMoveFiles(tempExtractDir);\n\n      // Clean up temporary extraction directory\n      fs.rmSync(tempExtractDir, { recursive: true });\n    } else {\n      // Use StreamZip for zip files (Windows)\n      // eslint-disable-next-line new-cap\n      const zip = new StreamZip.async({ file: tempFilename });\n\n      // Get all entries in the zip file\n      const entries = await zip.entries();\n\n      // Extract files directly to binDir, flattening the directory structure\n      for (const entry of Object.values(entries)) {\n        if (!entry.isDirectory) {\n          // Get just the filename without path\n          const filename = path.basename(entry.name);\n          const outputPath = path.join(binDir, filename);\n\n          console.log(`Extracting ${entry.name} -> ${filename}`);\n          await zip.extract(entry.name, outputPath);\n          console.log(`Extracted ${entry.name} -> ${outputPath}`);\n        }\n      }\n\n      await zip.close();\n    }\n\n    fs.unlinkSync(tempFilename);\n    console.log(`Successfully installed uv ${version} for ${platform}-${arch}`);\n    return 0;\n  } catch (error) {\n    let retCode = 103;\n\n    console.error(`Error installing uv for ${platformKey}: ${error.message}`);\n\n    if (fs.existsSync(tempFilename)) {\n      fs.unlinkSync(tempFilename);\n    }\n\n    // Check if binDir is empty and remove it if so\n    try {\n      const files = fs.readdirSync(binDir);\n      if (files.length === 0) {\n        fs.rmSync(binDir, { recursive: true });\n        console.log(`Removed empty directory: ${binDir}`);\n      }\n    } catch (cleanupError) {\n      console.warn(`Warning: Failed to clean up directory: ${cleanupError.message}`);\n      retCode = 104;\n    }\n\n    return retCode;\n  }\n}\n\n/**\n * Detects current platform and architecture\n */\nfunction detectPlatformAndArch() {\n  const platform = os.platform();\n  const arch = os.arch();\n  const isMusl = platform === 'linux' && detectIsMusl();\n\n  return { platform, arch, isMusl };\n}\n\n/**\n * Attempts to detect if running on MUSL libc\n */\nfunction detectIsMusl() {\n  try {\n    // Simple check for Alpine Linux which uses MUSL\n    const output = execSync('cat /etc/os-release').toString();\n    return output.toLowerCase().includes('alpine');\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Main function to install uv\n */\nasync function installUv() {\n  // Get the latest version if no specific version is provided\n  const version = DEFAULT_UV_VERSION;\n  console.log(`Using uv version: ${version}`);\n\n  const { platform, arch, isMusl } = detectPlatformAndArch();\n\n  console.log(`Installing uv ${version} for ${platform}-${arch}${isMusl ? ' (MUSL)' : ''}...`);\n\n  return await downloadUvBinary(platform, arch, version, isMusl);\n}\n\n// Run the installation\ninstallUv()\n  .then((retCode) => {\n    if (retCode === 0) {\n      console.log('Installation successful');\n      process.exit(0);\n    } else {\n      console.error('Installation failed');\n      process.exit(retCode);\n    }\n  })\n  .catch((error) => {\n    console.error('Installation failed:', error);\n    process.exit(100);\n  });\n"
  },
  {
    "path": "resources/t3Catopen/cat.js",
    "content": "var e,\n  pe,\n  t = function () {\n    return (t =\n      Object.assign ||\n      function (e) {\n        for (var t, n = 1, r = arguments.length; n < r; n++)\n          for (var i in (t = arguments[n])) Object.prototype.hasOwnProperty.call(t, i) && (e[i] = t[i]);\n        return e;\n      }).apply(this, arguments);\n  },\n  n = { xml: !1, decodeEntities: !0 },\n  r = { _useHtmlParser2: !0, xmlMode: !0 };\nfunction i(e) {\n  return null != e && e.xml ? ('boolean' == typeof e.xml ? r : t(t({}, r), e.xml)) : null != e ? e : void 0;\n}\n!(function (e) {\n  ((e.Root = 'root'),\n    (e.Text = 'text'),\n    (e.Directive = 'directive'),\n    (e.Comment = 'comment'),\n    (e.Script = 'script'),\n    (e.Style = 'style'),\n    (e.Tag = 'tag'),\n    (e.CDATA = 'cdata'),\n    (e.Doctype = 'doctype'));\n})((e = e || {}));\nconst s = e.Root,\n  a = e.Text,\n  o = e.Directive,\n  c = e.Comment,\n  u = e.Script,\n  l = e.Style,\n  h = e.Tag,\n  f = e.CDATA,\n  p = e.Doctype;\nclass d {\n  constructor() {\n    ((this.parent = null), (this.prev = null), (this.next = null), (this.startIndex = null), (this.endIndex = null));\n  }\n  get parentNode() {\n    return this.parent;\n  }\n  set parentNode(e) {\n    this.parent = e;\n  }\n  get previousSibling() {\n    return this.prev;\n  }\n  set previousSibling(e) {\n    this.prev = e;\n  }\n  get nextSibling() {\n    return this.next;\n  }\n  set nextSibling(e) {\n    this.next = e;\n  }\n  cloneNode(e = !1) {\n    return L(this, e);\n  }\n}\nclass m extends d {\n  constructor(e) {\n    (super(), (this.data = e));\n  }\n  get nodeValue() {\n    return this.data;\n  }\n  set nodeValue(e) {\n    this.data = e;\n  }\n}\nclass _ extends m {\n  constructor() {\n    (super(...arguments), (this.type = e.Text));\n  }\n  get nodeType() {\n    return 3;\n  }\n}\nclass E extends m {\n  constructor() {\n    (super(...arguments), (this.type = e.Comment));\n  }\n  get nodeType() {\n    return 8;\n  }\n}\nclass T extends m {\n  constructor(t, n) {\n    (super(n), (this.name = t), (this.type = e.Directive));\n  }\n  get nodeType() {\n    return 1;\n  }\n}\nclass A extends d {\n  constructor(e) {\n    (super(), (this.children = e));\n  }\n  get firstChild() {\n    var e;\n    return null != (e = this.children[0]) ? e : null;\n  }\n  get lastChild() {\n    return 0 < this.children.length ? this.children[this.children.length - 1] : null;\n  }\n  get childNodes() {\n    return this.children;\n  }\n  set childNodes(e) {\n    this.children = e;\n  }\n}\nclass g extends A {\n  constructor() {\n    (super(...arguments), (this.type = e.CDATA));\n  }\n  get nodeType() {\n    return 4;\n  }\n}\nclass v extends A {\n  constructor() {\n    (super(...arguments), (this.type = e.Root));\n  }\n  get nodeType() {\n    return 9;\n  }\n}\nclass y extends A {\n  constructor(t, n, r = [], i = 'script' === t ? e.Script : 'style' === t ? e.Style : e.Tag) {\n    (super(r), (this.name = t), (this.attribs = n), (this.type = i));\n  }\n  get nodeType() {\n    return 1;\n  }\n  get tagName() {\n    return this.name;\n  }\n  set tagName(e) {\n    this.name = e;\n  }\n  get attributes() {\n    return Object.keys(this.attribs).map((e) => {\n      var t;\n      return {\n        name: e,\n        value: this.attribs[e],\n        namespace: null == (t = this['x-attribsNamespace']) ? void 0 : t[e],\n        prefix: null == (t = this['x-attribsPrefix']) ? void 0 : t[e],\n      };\n    });\n  }\n}\nfunction S(t) {\n  return t.type === e.Tag || t.type === e.Script || t.type === e.Style;\n}\nfunction C(t) {\n  return t.type === e.CDATA;\n}\nfunction N(t) {\n  return t.type === e.Text;\n}\nfunction b(t) {\n  return t.type === e.Comment;\n}\nfunction I(t) {\n  return t.type === e.Directive;\n}\nfunction O(t) {\n  return t.type === e.Root;\n}\nfunction k(e) {\n  return Object.prototype.hasOwnProperty.call(e, 'children');\n}\nfunction L(e, t = !1) {\n  let n;\n  if (N(e)) n = new _(e.data);\n  else if (b(e)) n = new E(e.data);\n  else if (S(e)) {\n    const r = t ? D(e.children) : [],\n      i = new y(e.name, { ...e.attribs }, r);\n    (r.forEach((e) => (e.parent = i)),\n      null != e.namespace && (i.namespace = e.namespace),\n      e['x-attribsNamespace'] && (i['x-attribsNamespace'] = { ...e['x-attribsNamespace'] }),\n      e['x-attribsPrefix'] && (i['x-attribsPrefix'] = { ...e['x-attribsPrefix'] }),\n      (n = i));\n  } else if (C(e)) {\n    const r = t ? D(e.children) : [],\n      i = new g(r);\n    (r.forEach((e) => (e.parent = i)), (n = i));\n  } else if (O(e)) {\n    const r = t ? D(e.children) : [],\n      i = new v(r);\n    (r.forEach((e) => (e.parent = i)), e['x-mode'] && (i['x-mode'] = e['x-mode']), (n = i));\n  } else {\n    if (!I(e)) throw new Error('Not implemented yet: ' + e.type);\n    {\n      const t = new T(e.name, e.data);\n      (null != e['x-name'] &&\n        ((t['x-name'] = e['x-name']), (t['x-publicId'] = e['x-publicId']), (t['x-systemId'] = e['x-systemId'])),\n        (n = t));\n    }\n  }\n  return (\n    (n.startIndex = e.startIndex),\n    (n.endIndex = e.endIndex),\n    null != e.sourceCodeLocation && (n.sourceCodeLocation = e.sourceCodeLocation),\n    n\n  );\n}\nfunction D(e) {\n  var t = e.map((e) => L(e, !0));\n  for (let e = 1; e < t.length; e++) ((t[e].prev = t[e - 1]), (t[e - 1].next = t[e]));\n  return t;\n}\nconst R = { withStartIndices: !1, withEndIndices: !1, xmlMode: !1 };\nclass w {\n  constructor(e, t, n) {\n    ((this.dom = []),\n      (this.root = new v(this.dom)),\n      (this.done = !1),\n      (this.tagStack = [this.root]),\n      (this.lastNode = null),\n      (this.parser = null),\n      'function' == typeof t && ((n = t), (t = R)),\n      'object' == typeof e && ((t = e), (e = void 0)),\n      (this.callback = null != e ? e : null),\n      (this.options = null != t ? t : R),\n      (this.elementCB = null != n ? n : null));\n  }\n  onparserinit(e) {\n    this.parser = e;\n  }\n  onreset() {\n    ((this.dom = []),\n      (this.root = new v(this.dom)),\n      (this.done = !1),\n      (this.tagStack = [this.root]),\n      (this.lastNode = null),\n      (this.parser = null));\n  }\n  onend() {\n    this.done || ((this.done = !0), (this.parser = null), this.handleCallback(null));\n  }\n  onerror(e) {\n    this.handleCallback(e);\n  }\n  onclosetag() {\n    this.lastNode = null;\n    var e = this.tagStack.pop();\n    (this.options.withEndIndices && (e.endIndex = this.parser.endIndex), this.elementCB && this.elementCB(e));\n  }\n  onopentag(t, n) {\n    var r = this.options.xmlMode ? e.Tag : void 0,\n      t = new y(t, n, void 0, r);\n    (this.addNode(t), this.tagStack.push(t));\n  }\n  ontext(t) {\n    var n = this.lastNode;\n    if (n && n.type === e.Text) ((n.data += t), this.options.withEndIndices && (n.endIndex = this.parser.endIndex));\n    else {\n      const e = new _(t);\n      (this.addNode(e), (this.lastNode = e));\n    }\n  }\n  oncomment(t) {\n    this.lastNode && this.lastNode.type === e.Comment\n      ? (this.lastNode.data += t)\n      : ((t = new E(t)), this.addNode(t), (this.lastNode = t));\n  }\n  oncommentend() {\n    this.lastNode = null;\n  }\n  oncdatastart() {\n    var e = new _(''),\n      t = new g([e]);\n    (this.addNode(t), (e.parent = t), (this.lastNode = e));\n  }\n  oncdataend() {\n    this.lastNode = null;\n  }\n  onprocessinginstruction(e, t) {\n    ((e = new T(e, t)), this.addNode(e));\n  }\n  handleCallback(e) {\n    if ('function' == typeof this.callback) this.callback(e, this.dom);\n    else if (e) throw e;\n  }\n  addNode(e) {\n    var t = this.tagStack[this.tagStack.length - 1],\n      n = t.children[t.children.length - 1];\n    (this.options.withStartIndices && (e.startIndex = this.parser.startIndex),\n      this.options.withEndIndices && (e.endIndex = this.parser.endIndex),\n      t.children.push(e),\n      n && ((e.prev = n).next = e),\n      (e.parent = t),\n      (this.lastNode = null));\n  }\n}\nconst x = /[\"&'<>$\\x80-\\uFFFF]/g,\n  M = new Map([\n    [34, '&quot;'],\n    [38, '&amp;'],\n    [39, '&apos;'],\n    [60, '&lt;'],\n    [62, '&gt;'],\n  ]),\n  P =\n    null != String.prototype.codePointAt\n      ? (e, t) => e.codePointAt(t)\n      : (e, t) =>\n          55296 == (64512 & e.charCodeAt(t))\n            ? 1024 * (e.charCodeAt(t) - 55296) + e.charCodeAt(t + 1) - 56320 + 65536\n            : e.charCodeAt(t);\nfunction B(e) {\n  let t,\n    n = '',\n    r = 0;\n  for (; null !== (t = x.exec(e)); ) {\n    var i = t.index,\n      s = e.charCodeAt(i),\n      a = M.get(s);\n    r =\n      void 0 !== a\n        ? ((n += e.substring(r, i) + a), i + 1)\n        : ((n += `${e.substring(r, i)}&#x${P(e, i).toString(16)};`), (x.lastIndex += Number(55296 == (64512 & s))));\n  }\n  return n + e.substr(r);\n}\nfunction F(e, t) {\n  return function (n) {\n    let r,\n      i = 0,\n      s = '';\n    for (; (r = e.exec(n)); )\n      (i !== r.index && (s += n.substring(i, r.index)), (s += t.get(r[0].charCodeAt(0))), (i = r.index + 1));\n    return s + n.substring(i);\n  };\n}\nconst U = F(\n    /[\"&\\u00A0]/g,\n    new Map([\n      [34, '&quot;'],\n      [38, '&amp;'],\n      [160, '&nbsp;'],\n    ]),\n  ),\n  H = F(\n    /[&<>\\u00A0]/g,\n    new Map([\n      [38, '&amp;'],\n      [60, '&lt;'],\n      [62, '&gt;'],\n      [160, '&nbsp;'],\n    ]),\n  ),\n  G = new Map(\n    [\n      'altGlyph',\n      'altGlyphDef',\n      'altGlyphItem',\n      'animateColor',\n      'animateMotion',\n      'animateTransform',\n      'clipPath',\n      'feBlend',\n      'feColorMatrix',\n      'feComponentTransfer',\n      'feComposite',\n      'feConvolveMatrix',\n      'feDiffuseLighting',\n      'feDisplacementMap',\n      'feDistantLight',\n      'feDropShadow',\n      'feFlood',\n      'feFuncA',\n      'feFuncB',\n      'feFuncG',\n      'feFuncR',\n      'feGaussianBlur',\n      'feImage',\n      'feMerge',\n      'feMergeNode',\n      'feMorphology',\n      'feOffset',\n      'fePointLight',\n      'feSpecularLighting',\n      'feSpotLight',\n      'feTile',\n      'feTurbulence',\n      'foreignObject',\n      'glyphRef',\n      'linearGradient',\n      'radialGradient',\n      'textPath',\n    ].map((e) => [e.toLowerCase(), e]),\n  ),\n  j = new Map(\n    [\n      'definitionURL',\n      'attributeName',\n      'attributeType',\n      'baseFrequency',\n      'baseProfile',\n      'calcMode',\n      'clipPathUnits',\n      'diffuseConstant',\n      'edgeMode',\n      'filterUnits',\n      'glyphRef',\n      'gradientTransform',\n      'gradientUnits',\n      'kernelMatrix',\n      'kernelUnitLength',\n      'keyPoints',\n      'keySplines',\n      'keyTimes',\n      'lengthAdjust',\n      'limitingConeAngle',\n      'markerHeight',\n      'markerUnits',\n      'markerWidth',\n      'maskContentUnits',\n      'maskUnits',\n      'numOctaves',\n      'pathLength',\n      'patternContentUnits',\n      'patternTransform',\n      'patternUnits',\n      'pointsAtX',\n      'pointsAtY',\n      'pointsAtZ',\n      'preserveAlpha',\n      'preserveAspectRatio',\n      'primitiveUnits',\n      'refX',\n      'refY',\n      'repeatCount',\n      'repeatDur',\n      'requiredExtensions',\n      'requiredFeatures',\n      'specularConstant',\n      'specularExponent',\n      'spreadMethod',\n      'startOffset',\n      'stdDeviation',\n      'stitchTiles',\n      'surfaceScale',\n      'systemLanguage',\n      'tableValues',\n      'targetX',\n      'targetY',\n      'textLength',\n      'viewBox',\n      'viewTarget',\n      'xChannelSelector',\n      'yChannelSelector',\n      'zoomAndPan',\n    ].map((e) => [e.toLowerCase(), e]),\n  ),\n  q = new Set(['style', 'script', 'xmp', 'iframe', 'noembed', 'noframes', 'plaintext', 'noscript']);\nfunction Y(e) {\n  return e.replace(/\"/g, '&quot;');\n}\nconst K = new Set([\n  'area',\n  'base',\n  'basefont',\n  'br',\n  'col',\n  'command',\n  'embed',\n  'frame',\n  'hr',\n  'img',\n  'input',\n  'isindex',\n  'keygen',\n  'link',\n  'meta',\n  'param',\n  'source',\n  'track',\n  'wbr',\n]);\nfunction W(e, t = {}) {\n  var n = 'length' in e ? e : [e];\n  let r = '';\n  for (let e = 0; e < n.length; e++) r += V(n[e], t);\n  return r;\n}\nfunction V(e, t) {\n  switch (e.type) {\n    case s:\n      return W(e.children, t);\n    case p:\n    case o:\n      return `<${e.data}>`;\n    case c:\n      return `<!--${e.data}-->`;\n    case f:\n      return `<![CDATA[${e.children[0].data}]]>`;\n    case u:\n    case l:\n    case h:\n      return (function (e, t) {\n        !(t =\n          'foreign' === t.xmlMode &&\n          ((e.name = null != (n = G.get(e.name)) ? n : e.name), e.parent) &&\n          $.has(e.parent.name)\n            ? { ...t, xmlMode: !1 }\n            : t).xmlMode &&\n          Q.has(e.name) &&\n          (t = { ...t, xmlMode: 'foreign' });\n        let r = '<' + e.name;\n        var n = (function (e, t) {\n          var n;\n          if (e) {\n            const r =\n              !1 === (null != (n = t.encodeEntities) ? n : t.decodeEntities)\n                ? Y\n                : t.xmlMode || 'utf8' !== t.encodeEntities\n                  ? B\n                  : U;\n            return Object.keys(e)\n              .map((n) => {\n                var s,\n                  i = null != (i = e[n]) ? i : '';\n                return (\n                  'foreign' === t.xmlMode && (n = null != (s = j.get(n)) ? s : n),\n                  t.emptyAttrs || t.xmlMode || '' !== i ? `${n}=\"${r(i)}\"` : n\n                );\n              })\n              .join(' ');\n          }\n        })(e.attribs, t);\n        return (\n          n && (r += ' ' + n),\n          0 === e.children.length && (t.xmlMode ? !1 !== t.selfClosingTags : t.selfClosingTags && K.has(e.name))\n            ? (t.xmlMode || (r += ' '), (r += '/>'))\n            : ((r += '>'),\n              0 < e.children.length && (r += W(e.children, t)),\n              (!t.xmlMode && K.has(e.name)) || (r += `</${e.name}>`)),\n          r\n        );\n      })(e, t);\n    case a:\n      return (function (e, t) {\n        var n,\n          r = e.data || '';\n        return !1 === (null != (n = t.encodeEntities) ? n : t.decodeEntities) ||\n          (!t.xmlMode && e.parent && q.has(e.parent.name))\n          ? r\n          : (t.xmlMode || 'utf8' !== t.encodeEntities ? B : H)(r);\n      })(e, t);\n  }\n}\nconst $ = new Set(['mi', 'mo', 'mn', 'ms', 'mtext', 'annotation-xml', 'foreignObject', 'desc', 'title']),\n  Q = new Set(['svg', 'math']);\nfunction z(e, t) {\n  return W(e, t);\n}\nfunction X(e) {\n  return Array.isArray(e) ? e.map(X).join('') : k(e) && !b(e) ? X(e.children) : N(e) ? e.data : '';\n}\nfunction Z(t) {\n  return Array.isArray(t) ? t.map(Z).join('') : k(t) && (t.type === e.Tag || C(t)) ? Z(t.children) : N(t) ? t.data : '';\n}\nfunction J(e) {\n  return k(e) ? e.children : [];\n}\nfunction ee(e) {\n  return e.parent || null;\n}\nfunction te(e) {\n  var t = ee(e);\n  if (null != t) return J(t);\n  var n = [e];\n  let { prev: r, next: i } = e;\n  for (; null != r; ) (n.unshift(r), ({ prev: r } = r));\n  for (; null != i; ) (n.push(i), ({ next: i } = i));\n  return n;\n}\nfunction ne(e) {\n  let t = e.next;\n  for (; null !== t && !S(t); ) ({ next: t } = t);\n  return t;\n}\nfunction re(e) {\n  let t = e.prev;\n  for (; null !== t && !S(t); ) ({ prev: t } = t);\n  return t;\n}\nfunction ie(e) {\n  var t, n;\n  (e.prev && (e.prev.next = e.next),\n    e.next && (e.next.prev = e.prev),\n    e.parent && 0 <= (n = (t = e.parent.children).lastIndexOf(e)) && t.splice(n, 1),\n    (e.next = null),\n    (e.prev = null),\n    (e.parent = null));\n}\nfunction se(e, t, n = !0, r = 1 / 0) {\n  return ae(e, Array.isArray(t) ? t : [t], n, r);\n}\nfunction ae(e, t, n, r) {\n  for (var i = [], s = [t], a = [0]; ; )\n    if (a[0] >= s[0].length) {\n      if (1 === a.length) return i;\n      (s.shift(), a.shift());\n    } else {\n      const t = s[0][a[0]++];\n      if (e(t) && (i.push(t), --r <= 0)) return i;\n      n && k(t) && 0 < t.children.length && (a.unshift(0), s.unshift(t.children));\n    }\n}\nfunction oe(e, t, n = !0) {\n  let r = null;\n  for (let i = 0; i < t.length && !r; i++) {\n    var s = t[i];\n    S(s) && (e(s) ? (r = s) : n && 0 < s.children.length && (r = oe(e, s.children, !0)));\n  }\n  return r;\n}\nconst ce = {\n  tag_name: (e) => ('function' == typeof e ? (t) => S(t) && e(t.name) : '*' === e ? S : (t) => S(t) && t.name === e),\n  tag_type: (e) => ('function' == typeof e ? (t) => e(t.type) : (t) => t.type === e),\n  tag_contains: (e) => ('function' == typeof e ? (t) => N(t) && e(t.data) : (t) => N(t) && t.data === e),\n};\nfunction ue(e, t) {\n  return 'function' == typeof t ? (n) => S(n) && t(n.attribs[e]) : (n) => S(n) && n.attribs[e] === t;\n}\nfunction le(e, t) {\n  return (n) => e(n) || t(n);\n}\nfunction he(e) {\n  var t = Object.keys(e).map((t) => {\n    var n = e[t];\n    return Object.prototype.hasOwnProperty.call(ce, t) ? ce[t](n) : ue(t, n);\n  });\n  return 0 === t.length ? null : t.reduce(le);\n}\nfunction fe(e, t, n = !0, r = 1 / 0) {\n  return se(ce.tag_name(e), t, n, r);\n}\nfunction de(e, t) {\n  var n = [],\n    r = [];\n  if (e === t) return 0;\n  let i = k(e) ? e : e.parent;\n  for (; i; ) (n.unshift(i), (i = i.parent));\n  for (i = k(t) ? t : t.parent; i; ) (r.unshift(i), (i = i.parent));\n  var o,\n    c,\n    u,\n    l,\n    s = Math.min(n.length, r.length);\n  let a = 0;\n  for (; a < s && n[a] === r[a]; ) a++;\n  return 0 === a\n    ? pe.DISCONNECTED\n    : ((c = (o = n[a - 1]).children),\n      (u = n[a]),\n      (l = r[a]),\n      c.indexOf(u) > c.indexOf(l)\n        ? o === t\n          ? pe.FOLLOWING | pe.CONTAINED_BY\n          : pe.FOLLOWING\n        : o === e\n          ? pe.PRECEDING | pe.CONTAINS\n          : pe.PRECEDING);\n}\nfunction me(e) {\n  return (\n    (e = e.filter((e, t, n) => !n.includes(e, t + 1))).sort((e, t) =>\n      (e = de(e, t)) & pe.PRECEDING ? -1 : e & pe.FOLLOWING ? 1 : 0,\n    ),\n    e\n  );\n}\n!(function (e) {\n  ((e[(e.DISCONNECTED = 1)] = 'DISCONNECTED'),\n    (e[(e.PRECEDING = 2)] = 'PRECEDING'),\n    (e[(e.FOLLOWING = 4)] = 'FOLLOWING'),\n    (e[(e.CONTAINS = 8)] = 'CONTAINS'),\n    (e[(e.CONTAINED_BY = 16)] = 'CONTAINED_BY'));\n})((pe = pe || {}));\nconst _e = ['url', 'type', 'lang'],\n  Ee = ['fileSize', 'bitrate', 'framerate', 'samplingrate', 'channels', 'duration', 'height', 'width'];\nfunction Te(e) {\n  return fe('media:content', e).map((e) => {\n    var t = e.attribs,\n      n = { medium: t.medium, isDefault: !!t.isDefault };\n    for (const e of _e) t[e] && (n[e] = t[e]);\n    for (const e of Ee) t[e] && (n[e] = parseInt(t[e], 10));\n    return (t.expression && (n.expression = t.expression), n);\n  });\n}\nfunction Ae(e, t) {\n  return fe(e, t, !0, 1)[0];\n}\nfunction ge(e, t, n = !1) {\n  return X(fe(e, t, n, 1)).trim();\n}\nfunction ve(e, t, n, r, i = !1) {\n  (n = ge(n, r, i)) && (e[t] = n);\n}\nfunction ye(e) {\n  return 'rss' === e || 'feed' === e || 'rdf:RDF' === e;\n}\nvar Se = Object.freeze({\n    __proto__: null,\n    isTag: S,\n    isCDATA: C,\n    isText: N,\n    isComment: b,\n    isDocument: O,\n    hasChildren: k,\n    getOuterHTML: z,\n    getInnerHTML: function (e, t) {\n      return k(e) ? e.children.map((e) => z(e, t)).join('') : '';\n    },\n    getText: function e(t) {\n      return Array.isArray(t)\n        ? t.map(e).join('')\n        : S(t)\n          ? 'br' === t.name\n            ? '\\n'\n            : e(t.children)\n          : C(t)\n            ? e(t.children)\n            : N(t)\n              ? t.data\n              : '';\n    },\n    textContent: X,\n    innerText: Z,\n    getChildren: J,\n    getParent: ee,\n    getSiblings: te,\n    getAttributeValue: function (e, t) {\n      return null == (e = e.attribs) ? void 0 : e[t];\n    },\n    hasAttrib: function (e, t) {\n      return null != e.attribs && Object.prototype.hasOwnProperty.call(e.attribs, t) && null != e.attribs[t];\n    },\n    getName: function (e) {\n      return e.name;\n    },\n    nextElementSibling: ne,\n    prevElementSibling: re,\n    removeElement: ie,\n    replaceElement: function (e, t) {\n      const n = (t.prev = e.prev);\n      n && (n.next = t);\n      var r = (t.next = e.next);\n      if ((r && (r.prev = t), (r = t.parent = e.parent))) {\n        const n = r.children;\n        ((n[n.lastIndexOf(e)] = t), (e.parent = null));\n      }\n    },\n    appendChild: function (e, t) {\n      (ie(t),\n        (t.next = null),\n        1 < (t.parent = e).children.push(t)\n          ? (((e = e.children[e.children.length - 2]).next = t).prev = e)\n          : (t.prev = null));\n    },\n    append: function (e, t) {\n      ie(t);\n      var n = e.parent,\n        r = e.next;\n      if (((t.next = r), (((t.prev = e).next = t).parent = n), r)) {\n        if (((r.prev = t), n)) {\n          const e = n.children;\n          e.splice(e.lastIndexOf(r), 0, t);\n        }\n      } else n && n.children.push(t);\n    },\n    prependChild: function (e, t) {\n      (ie(t),\n        (t.parent = e),\n        (t.prev = null),\n        1 !== e.children.unshift(t) ? (((e = e.children[1]).prev = t).next = e) : (t.next = null));\n    },\n    prepend: function (e, t) {\n      ie(t);\n      var r,\n        n = e.parent;\n      (n && (r = n.children).splice(r.indexOf(e), 0, t),\n        e.prev && (e.prev.next = t),\n        (t.parent = n),\n        (t.prev = e.prev),\n        ((t.next = e).prev = t));\n    },\n    filter: se,\n    find: ae,\n    findOneChild: function (e, t) {\n      return t.find(e);\n    },\n    findOne: oe,\n    existsOne: function e(t, n) {\n      return n.some((n) => S(n) && (t(n) || e(t, n.children)));\n    },\n    findAll: function (e, t) {\n      for (var n = [], r = [t], i = [0]; ; )\n        if (i[0] >= r[0].length) {\n          if (1 === r.length) return n;\n          (r.shift(), i.shift());\n        } else {\n          const t = r[0][i[0]++];\n          S(t) && (e(t) && n.push(t), 0 < t.children.length) && (i.unshift(0), r.unshift(t.children));\n        }\n    },\n    testElement: function (e, t) {\n      return !(e = he(e)) || e(t);\n    },\n    getElements: function (e, t, n, r = 1 / 0) {\n      return (e = he(e)) ? se(e, t, n, r) : [];\n    },\n    getElementById: function (e, t, n = !0) {\n      return (Array.isArray(t) || (t = [t]), oe(ue('id', e), t, n));\n    },\n    getElementsByTagName: fe,\n    getElementsByTagType: function (e, t, n = !0, r = 1 / 0) {\n      return se(ce.tag_type(e), t, n, r);\n    },\n    removeSubsets: function (e) {\n      let t = e.length;\n      for (; 0 <= --t; ) {\n        var n = e[t];\n        if (0 < t && 0 <= e.lastIndexOf(n, t - 1)) e.splice(t, 1);\n        else\n          for (let r = n.parent; r; r = r.parent)\n            if (e.includes(r)) {\n              e.splice(t, 1);\n              break;\n            }\n      }\n      return e;\n    },\n    get DocumentPosition() {\n      return pe;\n    },\n    compareDocumentPosition: de,\n    uniqueSort: me,\n    getFeed: function (e) {\n      return (e = Ae(ye, e))\n        ? ('feed' === e.name\n            ? function (e) {\n                var r = {\n                    type: 'atom',\n                    items: fe('entry', (e = e.children)).map((e) => {\n                      var r = { media: Te((e = e.children)) },\n                        t =\n                          (ve(r, 'id', 'id', e),\n                          ve(r, 'title', 'title', e),\n                          null == (t = Ae('link', e)) ? void 0 : t.attribs.href);\n                      return (\n                        t && (r.link = t),\n                        (t = ge('summary', e) || ge('content', e)) && (r.description = t),\n                        (t = ge('updated', e)) && (r.pubDate = new Date(t)),\n                        r\n                      );\n                    }),\n                  },\n                  t =\n                    (ve(r, 'id', 'id', e),\n                    ve(r, 'title', 'title', e),\n                    null == (t = Ae('link', e)) ? void 0 : t.attribs.href);\n                return (\n                  t && (r.link = t),\n                  ve(r, 'description', 'subtitle', e),\n                  (t = ge('updated', e)) && (r.updated = new Date(t)),\n                  ve(r, 'author', 'email', e, !0),\n                  r\n                );\n              }\n            : function (e) {\n                var t = null != (t = null == (t = Ae('channel', e.children)) ? void 0 : t.children) ? t : [],\n                  e = {\n                    type: e.name.substr(0, 3),\n                    id: '',\n                    items: fe('item', e.children).map((e) => {\n                      var n = { media: Te((e = e.children)) };\n                      return (\n                        ve(n, 'id', 'guid', e),\n                        ve(n, 'title', 'title', e),\n                        ve(n, 'link', 'link', e),\n                        ve(n, 'description', 'description', e),\n                        (e = ge('pubDate', e) || ge('dc:date', e)) && (n.pubDate = new Date(e)),\n                        n\n                      );\n                    }),\n                  },\n                  s =\n                    (ve(e, 'title', 'title', t),\n                    ve(e, 'link', 'link', t),\n                    ve(e, 'description', 'description', t),\n                    ge('lastBuildDate', t));\n                return (s && (e.updated = new Date(s)), ve(e, 'author', 'managingEditor', t, !0), e);\n              })(e)\n        : null;\n    },\n  }),\n  Ce = function () {\n    return (Ce =\n      Object.assign ||\n      function (e) {\n        for (var t, n = 1, r = arguments.length; n < r; n++)\n          for (var i in (t = arguments[n])) Object.prototype.hasOwnProperty.call(t, i) && (e[i] = t[i]);\n        return e;\n      }).apply(this, arguments);\n  };\nfunction Ne(e, t, n) {\n  return e ? e(null != t ? t : e._root.children, null, void 0, n).toString() : '';\n}\nfunction be(e, t) {\n  return Ne(\n    this,\n    (function (e) {\n      return !('object' != typeof e || null == e || 'length' in e || 'type' in e);\n    })(e)\n      ? void (t = e)\n      : e,\n    Ce(Ce(Ce({}, n), null == this ? void 0 : this._options), i(null != t ? t : {})),\n  );\n}\nfunction Ie(e) {\n  return Ne(this, e, Ce(Ce({}, this._options), { xmlMode: !0 }));\n}\nfunction Oe(e) {\n  for (var t = e || (this ? this.root() : []), n = '', r = 0; r < t.length; r++) n += X(t[r]);\n  return n;\n}\nfunction ke(e, t, r) {\n  return (\n    void 0 === r && (r = 'boolean' == typeof t && t),\n    e && 'string' == typeof e\n      ? ('boolean' == typeof t && (r = t),\n        (t = this.load(e, n, !1)),\n        r || t('script').remove(),\n        t.root()[0].children.slice())\n      : null\n  );\n}\nfunction Le() {\n  return this(this._root);\n}\nfunction De(e, t) {\n  if (t !== e) for (var n = t; n && n !== n.parent; ) if ((n = n.parent) === e) return !0;\n  return !1;\n}\nfunction Re(e, t) {\n  if (we(e) && we(t)) {\n    for (var n = e.length, r = +t.length, i = 0; i < r; i++) e[n++] = t[i];\n    return ((e.length = n), e);\n  }\n}\nfunction we(e) {\n  if (!Array.isArray(e)) {\n    if (\n      'object' != typeof e ||\n      !Object.prototype.hasOwnProperty.call(e, 'length') ||\n      'number' != typeof e.length ||\n      e.length < 0\n    )\n      return !1;\n    for (var t = 0; t < e.length; t++) if (!(t in e)) return !1;\n  }\n  return !0;\n}\nvar xe,\n  Me = Object.freeze({\n    __proto__: null,\n    html: be,\n    xml: Ie,\n    text: Oe,\n    parseHTML: ke,\n    root: Le,\n    contains: De,\n    merge: Re,\n  });\nfunction Pe(e) {\n  return null != e.cheerio;\n}\nfunction Be(e, t) {\n  for (var n = e.length, r = 0; r < n; r++) t(e[r], r);\n  return e;\n}\nfunction Fe(e) {\n  var e =\n      'length' in e\n        ? Array.prototype.map.call(e, function (e) {\n            return L(e, !0);\n          })\n        : [L(e, !0)],\n    n = new v(e);\n  return (\n    e.forEach(function (e) {\n      e.parent = n;\n    }),\n    e\n  );\n}\nfunction Ue(e) {\n  var n,\n    t = e.indexOf('<');\n  return (\n    !(t < 0 || t > e.length - 3) &&\n    (((n = e.charCodeAt(t + 1)) >= xe.LowerA && n <= xe.LowerZ) ||\n      (n >= xe.UpperA && n <= xe.UpperZ) ||\n      n === xe.Exclamation) &&\n    e.includes('>', t + 2)\n  );\n}\n!(function (e) {\n  ((e[(e.LowerA = 97)] = 'LowerA'),\n    (e[(e.LowerZ = 122)] = 'LowerZ'),\n    (e[(e.UpperA = 65)] = 'UpperA'),\n    (e[(e.UpperZ = 90)] = 'UpperZ'),\n    (e[(e.Exclamation = 33)] = 'Exclamation'));\n})((xe = xe || {}));\nvar He = Object.prototype.hasOwnProperty,\n  Ge = /\\s+/,\n  je = 'data-',\n  qe = { null: null, true: !0, false: !1 },\n  Ye =\n    /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,\n  Ke = /^{[^]*}$|^\\[[^]*]$/;\nfunction We(e, t, n) {\n  if (e && S(e))\n    return (\n      null == e.attribs && (e.attribs = {}),\n      t\n        ? He.call(e.attribs, t)\n          ? !n && Ye.test(t)\n            ? t\n            : e.attribs[t]\n          : 'option' === e.name && 'value' === t\n            ? Oe(e.children)\n            : 'input' !== e.name || ('radio' !== e.attribs.type && 'checkbox' !== e.attribs.type) || 'value' !== t\n              ? void 0\n              : 'on'\n        : e.attribs\n    );\n}\nfunction Ve(e, t, n) {\n  null === n ? Ze(e, t) : (e.attribs[t] = ''.concat(n));\n}\nfunction $e(e, t, n) {\n  return t in e ? e[t] : !n && Ye.test(t) ? void 0 !== We(e, t, !1) : We(e, t, n);\n}\nfunction Qe(e, t, n, r) {\n  t in e ? (e[t] = n) : Ve(e, t, !r && Ye.test(t) ? (n ? '' : null) : ''.concat(n));\n}\nfunction ze(e, t, n) {\n  (null == e.data && (e.data = {}),\n    'object' == typeof t ? Object.assign(e.data, t) : 'string' == typeof t && void 0 !== n && (e.data[t] = n));\n}\nfunction Xe(e, t) {\n  for (\n    var n,\n      i,\n      r =\n        null == t\n          ? (n = Object.keys(e.attribs).filter(function (e) {\n              return e.startsWith(je);\n            })).map(function (e) {\n              return e.slice(je.length).replace(/[_.-](\\w|$)/g, function (e, t) {\n                return t.toUpperCase();\n              });\n            })\n          : ((n = [je + t.replace(/[A-Z]/g, '-$&').toLowerCase()]), [t]),\n      a = 0;\n    a < n.length;\n    ++a\n  ) {\n    var o = n[a],\n      c = r[a];\n    if (He.call(e.attribs, o) && !He.call(e.data, c)) {\n      if (((i = e.attribs[o]), He.call(qe, i))) i = qe[i];\n      else if (i === String(Number(i))) i = Number(i);\n      else if (Ke.test(i))\n        try {\n          i = JSON.parse(i);\n        } catch (e) {}\n      e.data[c] = i;\n    }\n  }\n  return null == t ? e.data : i;\n}\nfunction Ze(e, t) {\n  e.attribs && He.call(e.attribs, t) && delete e.attribs[t];\n}\nfunction Je(e) {\n  return e ? e.trim().split(Ge) : [];\n}\nvar et,\n  tt,\n  nt = Object.freeze({\n    __proto__: null,\n    attr: function (e, t) {\n      if ('object' != typeof e && void 0 === t)\n        return 1 < arguments.length ? this : We(this[0], e, this.options.xmlMode);\n      if ('function' != typeof t)\n        return Be(this, function (n) {\n          S(n) &&\n            ('object' == typeof e\n              ? Object.keys(e).forEach(function (t) {\n                  var r = e[t];\n                  Ve(n, t, r);\n                })\n              : Ve(n, e, t));\n        });\n      if ('string' != typeof e) throw new Error('Bad combination of arguments.');\n      return Be(this, function (n, r) {\n        S(n) && Ve(n, e, t.call(n, r, n.attribs[e]));\n      });\n    },\n    prop: function (e, t) {\n      var r = this;\n      if ('string' == typeof e && void 0 === t) {\n        var i = this[0];\n        if (!i || !S(i)) return;\n        switch (e) {\n          case 'style':\n            var s = this.css(),\n              a = Object.keys(s);\n            return (\n              a.forEach(function (e, t) {\n                s[t] = e;\n              }),\n              (s.length = a.length),\n              s\n            );\n          case 'tagName':\n          case 'nodeName':\n            return i.name.toUpperCase();\n          case 'href':\n          case 'src':\n            return (\n              (a = null == (a = i.attribs) ? void 0 : a[e]),\n              'undefined' == typeof URL ||\n              (('href' !== e || ('a' !== i.tagName && 'link' !== i.name)) &&\n                ('src' !== e ||\n                  ('img' !== i.tagName &&\n                    'iframe' !== i.tagName &&\n                    'audio' !== i.tagName &&\n                    'video' !== i.tagName &&\n                    'source' !== i.tagName))) ||\n              void 0 === a ||\n              !this.options.baseURI\n                ? a\n                : new URL(a, this.options.baseURI).href\n            );\n          case 'innerText':\n            return Z(i);\n          case 'textContent':\n            return X(i);\n          case 'outerHTML':\n            return this.clone().wrap('<container />').parent().html();\n          case 'innerHTML':\n            return this.html();\n          default:\n            return $e(i, e, this.options.xmlMode);\n        }\n      }\n      if ('object' == typeof e || void 0 !== t) {\n        if ('function' != typeof t)\n          return Be(this, function (n) {\n            S(n) &&\n              ('object' == typeof e\n                ? Object.keys(e).forEach(function (t) {\n                    var i = e[t];\n                    Qe(n, t, i, r.options.xmlMode);\n                  })\n                : Qe(n, e, t, r.options.xmlMode));\n          });\n        if ('object' == typeof e) throw new Error('Bad combination of arguments.');\n        return Be(this, function (n, i) {\n          S(n) && Qe(n, e, t.call(n, i, $e(n, e, r.options.xmlMode)), r.options.xmlMode);\n        });\n      }\n    },\n    data: function (e, t) {\n      var r = this[0];\n      if (r && S(r))\n        return (\n          null == r.data && (r.data = {}),\n          e\n            ? 'object' == typeof e || void 0 !== t\n              ? (Be(this, function (n) {\n                  S(n) && ('object' == typeof e ? ze(n, e) : ze(n, e, t));\n                }),\n                this)\n              : He.call(r.data, e)\n                ? r.data[e]\n                : Xe(r, e)\n            : Xe(r)\n        );\n    },\n    val: function (e) {\n      var t = 0 === arguments.length,\n        n = this[0];\n      if (!n || !S(n)) return t ? void 0 : this;\n      switch (n.name) {\n        case 'textarea':\n          return this.text(e);\n        case 'select':\n          var r = this.find('option:selected');\n          if (t)\n            return this.attr('multiple')\n              ? r.toArray().map(function (e) {\n                  return Oe(e.children);\n                })\n              : r.attr('value');\n          if (null != this.attr('multiple') || 'object' != typeof e) {\n            this.find('option').removeAttr('selected');\n            for (var i = 'object' != typeof e ? [e] : e, s = 0; s < i.length; s++)\n              this.find('option[value=\"'.concat(i[s], '\"]')).attr('selected', '');\n          }\n          return this;\n        case 'input':\n        case 'option':\n          return t ? this.attr('value') : this.attr('value', e);\n      }\n    },\n    removeAttr: function (e) {\n      for (var t = Je(e), r = this, i = 0; i < t.length; i++)\n        !(function (e) {\n          Be(r, function (n) {\n            S(n) && Ze(n, t[e]);\n          });\n        })(i);\n      return this;\n    },\n    hasClass: function (e) {\n      return this.toArray().some(function (t) {\n        var n = S(t) && t.attribs.class,\n          r = -1;\n        if (n && e.length)\n          for (; -1 < (r = n.indexOf(e, r + 1)); ) {\n            var i = r + e.length;\n            if ((0 === r || Ge.test(n[r - 1])) && (i === n.length || Ge.test(n[i]))) return !0;\n          }\n        return !1;\n      });\n    },\n    addClass: function e(t) {\n      if ('function' == typeof t)\n        return Be(this, function (n, r) {\n          var i;\n          S(n) && ((i = n.attribs.class || ''), e.call([n], t.call(n, r, i)));\n        });\n      if (t && 'string' == typeof t)\n        for (var n = t.split(Ge), r = this.length, i = 0; i < r; i++) {\n          var s = this[i];\n          if (S(s)) {\n            var a = We(s, 'class', !1);\n            if (a) {\n              for (var o = ' '.concat(a, ' '), c = 0; c < n.length; c++) {\n                var u = ''.concat(n[c], ' ');\n                o.includes(' '.concat(u)) || (o += u);\n              }\n              Ve(s, 'class', o.trim());\n            } else Ve(s, 'class', n.join(' ').trim());\n          }\n        }\n      return this;\n    },\n    removeClass: function e(t) {\n      var n, r, i;\n      return 'function' == typeof t\n        ? Be(this, function (n, r) {\n            S(n) && e.call([n], t.call(n, r, n.attribs.class || ''));\n          })\n        : ((n = Je(t)),\n          (r = n.length),\n          (i = 0 === arguments.length),\n          Be(this, function (e) {\n            if (S(e))\n              if (i) e.attribs.class = '';\n              else {\n                for (var t = Je(e.attribs.class), s = !1, a = 0; a < r; a++) {\n                  var o = t.indexOf(n[a]);\n                  0 <= o && (t.splice(o, 1), (s = !0), a--);\n                }\n                s && (e.attribs.class = t.join(' '));\n              }\n          }));\n    },\n    toggleClass: function e(t, n) {\n      if ('function' == typeof t)\n        return Be(this, function (r, i) {\n          S(r) && e.call([r], t.call(r, i, r.attribs.class || '', n), n);\n        });\n      if (t && 'string' == typeof t)\n        for (\n          var r = t.split(Ge), i = r.length, s = 'boolean' == typeof n ? (n ? 1 : -1) : 0, a = this.length, o = 0;\n          o < a;\n          o++\n        ) {\n          var c = this[o];\n          if (S(c)) {\n            for (var u = Je(c.attribs.class), l = 0; l < i; l++) {\n              var h = u.indexOf(r[l]);\n              0 <= s && h < 0 ? u.push(r[l]) : s <= 0 && 0 <= h && u.splice(h, 1);\n            }\n            c.attribs.class = u.join(' ');\n          }\n        }\n      return this;\n    },\n  });\n(!(function (e) {\n  ((e.Attribute = 'attribute'),\n    (e.Pseudo = 'pseudo'),\n    (e.PseudoElement = 'pseudo-element'),\n    (e.Tag = 'tag'),\n    (e.Universal = 'universal'),\n    (e.Adjacent = 'adjacent'),\n    (e.Child = 'child'),\n    (e.Descendant = 'descendant'),\n    (e.Parent = 'parent'),\n    (e.Sibling = 'sibling'),\n    (e.ColumnCombinator = 'column-combinator'));\n})((et = et || {})),\n  (function (e) {\n    ((e.Any = 'any'),\n      (e.Element = 'element'),\n      (e.End = 'end'),\n      (e.Equals = 'equals'),\n      (e.Exists = 'exists'),\n      (e.Hyphen = 'hyphen'),\n      (e.Not = 'not'),\n      (e.Start = 'start'));\n  })((tt = tt || {})));\nconst rt = /^[^\\\\#]?(?:\\\\(?:[\\da-f]{1,6}\\s?|.)|[\\w\\-\\u00b0-\\uFFFF])+/,\n  it = /\\\\([\\da-f]{1,6}\\s?|(\\s)|.)/gi,\n  st = new Map([\n    [126, tt.Element],\n    [94, tt.Start],\n    [36, tt.End],\n    [42, tt.Any],\n    [33, tt.Not],\n    [124, tt.Hyphen],\n  ]),\n  at = new Set(['has', 'not', 'matches', 'is', 'where', 'host', 'host-context']);\nfunction ot(e) {\n  switch (e.type) {\n    case et.Adjacent:\n    case et.Child:\n    case et.Descendant:\n    case et.Parent:\n    case et.Sibling:\n    case et.ColumnCombinator:\n      return !0;\n    default:\n      return !1;\n  }\n}\nconst ct = new Set(['contains', 'icontains']);\nfunction ut(e, t, n) {\n  var r = parseInt(t, 16) - 65536;\n  return r != r || n\n    ? t\n    : r < 0\n      ? String.fromCharCode(65536 + r)\n      : String.fromCharCode((r >> 10) | 55296, (1023 & r) | 56320);\n}\nfunction lt(e) {\n  return e.replace(it, ut);\n}\nfunction ht(e) {\n  return 39 === e || 34 === e;\n}\nfunction ft(e) {\n  return 32 === e || 9 === e || 10 === e || 12 === e || 13 === e;\n}\nfunction pt(e) {\n  var t = [],\n    n = dt(t, '' + e, 0);\n  if (n < e.length) throw new Error('Unmatched selector: ' + e.slice(n));\n  return t;\n}\nfunction dt(e, t, n) {\n  let r = [];\n  function i(e) {\n    var r = t.slice(n + e).match(rt);\n    if (r) return (([r] = r), (n += e + r.length), lt(r));\n    throw new Error('Expected name, found ' + t.slice(n));\n  }\n  function s(e) {\n    for (n += e; n < t.length && ft(t.charCodeAt(n)); ) n++;\n  }\n  function a() {\n    var e = (n += 1);\n    let r = 1;\n    for (; 0 < r && n < t.length; n++) 40 !== t.charCodeAt(n) || o(n) ? 41 !== t.charCodeAt(n) || o(n) || r-- : r++;\n    if (r) throw new Error('Parenthesis not matched');\n    return lt(t.slice(e, n - 1));\n  }\n  function o(e) {\n    let n = 0;\n    for (; 92 === t.charCodeAt(--e); ) n++;\n    return 1 == (1 & n);\n  }\n  function c() {\n    if (0 < r.length && ot(r[r.length - 1])) throw new Error('Did not expect successive traversals.');\n  }\n  function u(e) {\n    0 < r.length && r[r.length - 1].type === et.Descendant ? (r[r.length - 1].type = e) : (c(), r.push({ type: e }));\n  }\n  function l(e, t) {\n    r.push({ type: et.Attribute, name: e, action: t, value: i(1), namespace: null, ignoreCase: 'quirks' });\n  }\n  function h() {\n    if ((r.length && r[r.length - 1].type === et.Descendant && r.pop(), 0 === r.length))\n      throw new Error('Empty sub-selector');\n    e.push(r);\n  }\n  if ((s(0), t.length !== n)) {\n    e: for (; n < t.length; ) {\n      const e = t.charCodeAt(n);\n      switch (e) {\n        case 32:\n        case 9:\n        case 10:\n        case 12:\n        case 13:\n          ((0 !== r.length && r[0].type === et.Descendant) || (c(), r.push({ type: et.Descendant })), s(1));\n          break;\n        case 62:\n          (u(et.Child), s(1));\n          break;\n        case 60:\n          (u(et.Parent), s(1));\n          break;\n        case 126:\n          (u(et.Sibling), s(1));\n          break;\n        case 43:\n          (u(et.Adjacent), s(1));\n          break;\n        case 46:\n          l('class', tt.Element);\n          break;\n        case 35:\n          l('id', tt.Equals);\n          break;\n        case 91: {\n          let e,\n            a = (s(1), null),\n            c =\n              (124 === t.charCodeAt(n)\n                ? (e = i(1))\n                : t.startsWith('*|', n)\n                  ? ((a = '*'), (e = i(2)))\n                  : ((e = i(0)), 124 === t.charCodeAt(n) && 61 !== t.charCodeAt(n + 1) && ((a = e), (e = i(1)))),\n              s(0),\n              tt.Exists);\n          const u = st.get(t.charCodeAt(n));\n          if (u) {\n            if (((c = u), 61 !== t.charCodeAt(n + 1))) throw new Error('Expected `=`');\n            s(2);\n          } else 61 === t.charCodeAt(n) && ((c = tt.Equals), s(1));\n          let l = '',\n            h = null;\n          if ('exists' !== c) {\n            if (ht(t.charCodeAt(n))) {\n              const e = t.charCodeAt(n);\n              let r = n + 1;\n              for (; r < t.length && (t.charCodeAt(r) !== e || o(r)); ) r += 1;\n              if (t.charCodeAt(r) !== e) throw new Error(\"Attribute value didn't end\");\n              ((l = lt(t.slice(n + 1, r))), (n = r + 1));\n            } else {\n              const e = n;\n              for (; n < t.length && ((!ft(t.charCodeAt(n)) && 93 !== t.charCodeAt(n)) || o(n)); ) n += 1;\n              l = lt(t.slice(e, n));\n            }\n            s(0);\n            const e = 32 | t.charCodeAt(n);\n            115 == e ? ((h = !1), s(1)) : 105 == e && ((h = !0), s(1));\n          }\n          if (93 !== t.charCodeAt(n)) throw new Error(\"Attribute selector didn't terminate\");\n          n += 1;\n          var f = { type: et.Attribute, name: e, action: c, value: l, namespace: a, ignoreCase: h };\n          r.push(f);\n          break;\n        }\n        case 58: {\n          if (58 === t.charCodeAt(n + 1)) {\n            r.push({ type: et.PseudoElement, name: i(2).toLowerCase(), data: 40 === t.charCodeAt(n) ? a() : null });\n            continue;\n          }\n          const e = i(1).toLowerCase();\n          let s = null;\n          if (40 === t.charCodeAt(n))\n            if (at.has(e)) {\n              if (ht(t.charCodeAt(n + 1))) throw new Error(`Pseudo-selector ${e} cannot be quoted`);\n              if (((s = []), (n = dt(s, t, n + 1)), 41 !== t.charCodeAt(n)))\n                throw new Error(`Missing closing parenthesis in :${e} (${t})`);\n              n += 1;\n            } else {\n              if (((s = a()), ct.has(e))) {\n                const e = s.charCodeAt(0);\n                e === s.charCodeAt(s.length - 1) && ht(e) && (s = s.slice(1, -1));\n              }\n              s = lt(s);\n            }\n          r.push({ type: et.Pseudo, name: e, data: s });\n          break;\n        }\n        case 44:\n          (h(), (r = []), s(1));\n          break;\n        default:\n          if (t.startsWith('/*', n)) {\n            const e = t.indexOf('*/', n + 2);\n            if (e < 0) throw new Error('Comment was not terminated');\n            ((n = e + 2), 0 === r.length && s(0));\n          } else {\n            let a,\n              o = null;\n            if (42 === e) ((n += 1), (a = '*'));\n            else if (124 === e) {\n              if (((a = ''), 124 === t.charCodeAt(n + 1))) {\n                (u(et.ColumnCombinator), s(2));\n                break;\n              }\n            } else {\n              if (!rt.test(t.slice(n))) break e;\n              a = i(0);\n            }\n            (124 === t.charCodeAt(n) &&\n              124 !== t.charCodeAt(n + 1) &&\n              ((o = a), 42 === t.charCodeAt(n + 1) ? ((a = '*'), (n += 2)) : (a = i(1))),\n              r.push('*' === a ? { type: et.Universal, namespace: o } : { type: et.Tag, name: a, namespace: o }));\n          }\n      }\n    }\n    h();\n  }\n  return n;\n}\nvar Jt,\n  mt = {\n    trueFunc: function () {\n      return !0;\n    },\n    falseFunc: function () {\n      return !1;\n    },\n  },\n  _t = mt.trueFunc;\nconst Et = new Map([\n  [et.Universal, 50],\n  [et.Tag, 30],\n  [et.Attribute, 1],\n  [et.Pseudo, 0],\n]);\nfunction Tt(e) {\n  return !Et.has(e.type);\n}\nconst At = new Map([\n  [tt.Exists, 10],\n  [tt.Equals, 8],\n  [tt.Not, 7],\n  [tt.Start, 6],\n  [tt.End, 6],\n  [tt.Any, 5],\n]);\nfunction gt(e) {\n  var t = e.map(vt);\n  for (let n = 1; n < e.length; n++) {\n    var r = t[n];\n    if (!(r < 0))\n      for (let i = n - 1; 0 <= i && r < t[i]; i--) {\n        const n = e[i + 1];\n        ((e[i + 1] = e[i]), (e[i] = n), (t[i + 1] = t[i]), (t[i] = r));\n      }\n  }\n}\nfunction vt(e) {\n  var t;\n  let r = null != (t = Et.get(e.type)) ? t : -1;\n  return (\n    e.type === et.Attribute\n      ? ((r = null != (t = At.get(e.action)) ? t : 4),\n        e.action === tt.Equals && 'id' === e.name && (r = 9),\n        e.ignoreCase && (r >>= 1))\n      : e.type === et.Pseudo &&\n        (e.data\n          ? 'has' === e.name || 'contains' === e.name\n            ? (r = 0)\n            : Array.isArray(e.data)\n              ? (r = Math.min(...e.data.map((e) => Math.min(...e.map(vt))))) < 0 && (r = 0)\n              : (r = 2)\n          : (r = 3)),\n    r\n  );\n}\nconst yt = /[-[\\]{}()*+?.,\\\\^$|#\\s]/g;\nfunction St(e) {\n  return e.replace(yt, '\\\\$&');\n}\nconst Ct = new Set([\n  'accept',\n  'accept-charset',\n  'align',\n  'alink',\n  'axis',\n  'bgcolor',\n  'charset',\n  'checked',\n  'clear',\n  'codetype',\n  'color',\n  'compact',\n  'declare',\n  'defer',\n  'dir',\n  'direction',\n  'disabled',\n  'enctype',\n  'face',\n  'frame',\n  'hreflang',\n  'http-equiv',\n  'lang',\n  'language',\n  'link',\n  'media',\n  'method',\n  'multiple',\n  'nohref',\n  'noresize',\n  'noshade',\n  'nowrap',\n  'readonly',\n  'rel',\n  'rev',\n  'rules',\n  'scope',\n  'scrolling',\n  'selected',\n  'shape',\n  'target',\n  'text',\n  'type',\n  'valign',\n  'valuetype',\n  'vlink',\n]);\nfunction Nt(e, t) {\n  return 'boolean' == typeof e.ignoreCase\n    ? e.ignoreCase\n    : 'quirks' === e.ignoreCase\n      ? !!t.quirksMode\n      : !t.xmlMode && Ct.has(e.name);\n}\nconst bt = {\n    equals(e, t, n) {\n      const r = n.adapter,\n        i = t.name;\n      let s = t.value;\n      return Nt(t, n)\n        ? ((s = s.toLowerCase()),\n          (t) => {\n            var n = r.getAttributeValue(t, i);\n            return null != n && n.length === s.length && n.toLowerCase() === s && e(t);\n          })\n        : (t) => r.getAttributeValue(t, i) === s && e(t);\n    },\n    hyphen(e, t, n) {\n      const r = n.adapter,\n        i = t.name;\n      let s = t.value;\n      const a = s.length;\n      return Nt(t, n)\n        ? ((s = s.toLowerCase()),\n          function (t) {\n            var n = r.getAttributeValue(t, i);\n            return null != n && (n.length === a || '-' === n.charAt(a)) && n.substr(0, a).toLowerCase() === s && e(t);\n          })\n        : function (t) {\n            var n = r.getAttributeValue(t, i);\n            return null != n && (n.length === a || '-' === n.charAt(a)) && n.substr(0, a) === s && e(t);\n          };\n    },\n    element(e, t, n) {\n      const r = n.adapter,\n        { name: i, value: s } = t;\n      if (/\\s/.test(s)) return mt.falseFunc;\n      const a = new RegExp(`(?:^|\\\\s)${St(s)}(?:$|\\\\s)`, Nt(t, n) ? 'i' : '');\n      return function (t) {\n        var n = r.getAttributeValue(t, i);\n        return null != n && n.length >= s.length && a.test(n) && e(t);\n      };\n    },\n    exists:\n      (e, { name: t }, { adapter: n }) =>\n      (r) =>\n        n.hasAttrib(r, t) && e(r),\n    start(e, t, n) {\n      const r = n.adapter,\n        i = t.name;\n      let s = t.value;\n      const a = s.length;\n      return 0 === a\n        ? mt.falseFunc\n        : Nt(t, n)\n          ? ((s = s.toLowerCase()),\n            (t) => {\n              var n = r.getAttributeValue(t, i);\n              return null != n && n.length >= a && n.substr(0, a).toLowerCase() === s && e(t);\n            })\n          : (t) => {\n              var n;\n              return !(null == (n = r.getAttributeValue(t, i)) || !n.startsWith(s)) && e(t);\n            };\n    },\n    end(e, t, n) {\n      const r = n.adapter,\n        i = t.name;\n      let s = t.value;\n      const a = -s.length;\n      return 0 == a\n        ? mt.falseFunc\n        : Nt(t, n)\n          ? ((s = s.toLowerCase()),\n            (t) => {\n              var n;\n              return (null == (n = r.getAttributeValue(t, i)) ? void 0 : n.substr(a).toLowerCase()) === s && e(t);\n            })\n          : (t) => {\n              var n;\n              return !(null == (n = r.getAttributeValue(t, i)) || !n.endsWith(s)) && e(t);\n            };\n    },\n    any(e, t, n) {\n      const r = n.adapter,\n        { name: i, value: s } = t;\n      if ('' === s) return mt.falseFunc;\n      if (Nt(t, n)) {\n        const t = new RegExp(St(s), 'i');\n        return function (n) {\n          var a = r.getAttributeValue(n, i);\n          return null != a && a.length >= s.length && t.test(a) && e(n);\n        };\n      }\n      return (t) => {\n        var n;\n        return !(null == (n = r.getAttributeValue(t, i)) || !n.includes(s)) && e(t);\n      };\n    },\n    not(e, t, n) {\n      const r = n.adapter,\n        i = t.name;\n      let s = t.value;\n      return '' === s\n        ? (t) => !!r.getAttributeValue(t, i) && e(t)\n        : Nt(t, n)\n          ? ((s = s.toLowerCase()),\n            (t) => {\n              var n = r.getAttributeValue(t, i);\n              return (null == n || n.length !== s.length || n.toLowerCase() !== s) && e(t);\n            })\n          : (t) => r.getAttributeValue(t, i) !== s && e(t);\n    },\n  },\n  It = new Set([9, 10, 12, 13, 32]),\n  Ot = '0'.charCodeAt(0),\n  kt = '9'.charCodeAt(0);\nfunction Lt(e) {\n  return (function (e) {\n    const t = e[0],\n      n = e[1] - 1;\n    if (n < 0 && t <= 0) return mt.falseFunc;\n    if (-1 === t) return (e) => e <= n;\n    if (0 === t) return (e) => e === n;\n    if (1 === t) return n < 0 ? mt.trueFunc : (e) => e >= n;\n    const r = Math.abs(t),\n      i = ((n % r) + r) % r;\n    return 1 < t ? (e) => e >= n && e % r == i : (e) => e <= n && e % r == i;\n  })(\n    (function (e) {\n      if ('even' === (e = e.trim().toLowerCase())) return [2, 0];\n      if ('odd' === e) return [2, 1];\n      let t = 0,\n        n = 0,\n        r = s(),\n        i = a();\n      if (\n        (t < e.length &&\n          'n' === e.charAt(t) &&\n          (t++, (n = r * (null != i ? i : 1)), o(), t < e.length ? ((r = s()), o(), (i = a())) : (r = i = 0)),\n        null === i || t < e.length)\n      )\n        throw new Error(`n-th rule couldn't be parsed ('${e}')`);\n      return [n, r * i];\n      function s() {\n        return '-' === e.charAt(t) ? (t++, -1) : ('+' === e.charAt(t) && t++, 1);\n      }\n      function a() {\n        var n = t;\n        let r = 0;\n        for (; t < e.length && e.charCodeAt(t) >= Ot && e.charCodeAt(t) <= kt; )\n          ((r = 10 * r + (e.charCodeAt(t) - Ot)), t++);\n        return t === n ? null : r;\n      }\n      function o() {\n        for (; t < e.length && It.has(e.charCodeAt(t)); ) t++;\n      }\n    })(e),\n  );\n}\nfunction Dt(e, t) {\n  return (n) => {\n    var r = t.getParent(n);\n    return null != r && t.isTag(r) && e(n);\n  };\n}\nconst Rt = {\n  contains: (e, t, { adapter: n }) =>\n    function (r) {\n      return e(r) && n.getText(r).includes(t);\n    },\n  icontains(e, t, { adapter: n }) {\n    const r = t.toLowerCase();\n    return function (t) {\n      return e(t) && n.getText(t).toLowerCase().includes(r);\n    };\n  },\n  'nth-child'(e, t, { adapter: n, equals: r }) {\n    const i = Lt(t);\n    return i === mt.falseFunc\n      ? mt.falseFunc\n      : i === mt.trueFunc\n        ? Dt(e, n)\n        : function (t) {\n            var s = n.getSiblings(t);\n            let a = 0;\n            for (let e = 0; e < s.length && !r(t, s[e]); e++) n.isTag(s[e]) && a++;\n            return i(a) && e(t);\n          };\n  },\n  'nth-last-child'(e, t, { adapter: n, equals: r }) {\n    const i = Lt(t);\n    return i === mt.falseFunc\n      ? mt.falseFunc\n      : i === mt.trueFunc\n        ? Dt(e, n)\n        : function (t) {\n            var s = n.getSiblings(t);\n            let a = 0;\n            for (let e = s.length - 1; 0 <= e && !r(t, s[e]); e--) n.isTag(s[e]) && a++;\n            return i(a) && e(t);\n          };\n  },\n  'nth-of-type'(e, t, { adapter: n, equals: r }) {\n    const i = Lt(t);\n    return i === mt.falseFunc\n      ? mt.falseFunc\n      : i === mt.trueFunc\n        ? Dt(e, n)\n        : function (t) {\n            var s = n.getSiblings(t);\n            let a = 0;\n            for (let e = 0; e < s.length; e++) {\n              const i = s[e];\n              if (r(t, i)) break;\n              n.isTag(i) && n.getName(i) === n.getName(t) && a++;\n            }\n            return i(a) && e(t);\n          };\n  },\n  'nth-last-of-type'(e, t, { adapter: n, equals: r }) {\n    const i = Lt(t);\n    return i === mt.falseFunc\n      ? mt.falseFunc\n      : i === mt.trueFunc\n        ? Dt(e, n)\n        : function (t) {\n            var s = n.getSiblings(t);\n            let a = 0;\n            for (let e = s.length - 1; 0 <= e; e--) {\n              const i = s[e];\n              if (r(t, i)) break;\n              n.isTag(i) && n.getName(i) === n.getName(t) && a++;\n            }\n            return i(a) && e(t);\n          };\n  },\n  root:\n    (e, t, { adapter: n }) =>\n    (t) => {\n      var r = n.getParent(t);\n      return (null == r || !n.isTag(r)) && e(t);\n    },\n  scope(e, t, n, r) {\n    const i = n.equals;\n    return r && 0 !== r.length\n      ? 1 === r.length\n        ? (t) => i(r[0], t) && e(t)\n        : (t) => r.includes(t) && e(t)\n      : Rt.root(e, t, n);\n  },\n  hover: wt('isHovered'),\n  visited: wt('isVisited'),\n  active: wt('isActive'),\n};\nfunction wt(e) {\n  return function (t, n, { adapter: r }) {\n    const i = r[e];\n    return 'function' != typeof i\n      ? mt.falseFunc\n      : function (e) {\n          return i(e) && t(e);\n        };\n  };\n}\nconst xt = {\n  empty: (e, { adapter: t }) => !t.getChildren(e).some((e) => t.isTag(e) || '' !== t.getText(e)),\n  'first-child'(e, { adapter: t, equals: n }) {\n    var r;\n    return t.prevElementSibling\n      ? null == t.prevElementSibling(e)\n      : null != (r = t.getSiblings(e).find((e) => t.isTag(e))) && n(e, r);\n  },\n  'last-child'(e, { adapter: t, equals: n }) {\n    var r = t.getSiblings(e);\n    for (let i = r.length - 1; 0 <= i; i--) {\n      if (n(e, r[i])) return !0;\n      if (t.isTag(r[i])) break;\n    }\n    return !1;\n  },\n  'first-of-type'(e, { adapter: t, equals: n }) {\n    var r = t.getSiblings(e),\n      i = t.getName(e);\n    for (let s = 0; s < r.length; s++) {\n      var a = r[s];\n      if (n(e, a)) return !0;\n      if (t.isTag(a) && t.getName(a) === i) break;\n    }\n    return !1;\n  },\n  'last-of-type'(e, { adapter: t, equals: n }) {\n    var r = t.getSiblings(e),\n      i = t.getName(e);\n    for (let s = r.length - 1; 0 <= s; s--) {\n      var a = r[s];\n      if (n(e, a)) return !0;\n      if (t.isTag(a) && t.getName(a) === i) break;\n    }\n    return !1;\n  },\n  'only-of-type'(e, { adapter: t, equals: n }) {\n    const r = t.getName(e);\n    return t.getSiblings(e).every((i) => n(e, i) || !t.isTag(i) || t.getName(i) !== r);\n  },\n  'only-child': (e, { adapter: t, equals: n }) => t.getSiblings(e).every((r) => n(e, r) || !t.isTag(r)),\n};\nfunction Mt(e, t, n, r) {\n  if (null === n) {\n    if (e.length > r) throw new Error(`Pseudo-class :${t} requires an argument`);\n  } else if (e.length === r) throw new Error(`Pseudo-class :${t} doesn't have any arguments`);\n}\nconst Pt = {\n    'any-link': ':is(a, area, link)[href]',\n    link: ':any-link:not(:visited)',\n    disabled:\n      ':is(\\n        :is(button, input, select, textarea, optgroup, option)[disabled],\\n        optgroup[disabled] > option,\\n        fieldset[disabled]:not(fieldset[disabled] legend:first-of-type *)\\n    )',\n    enabled: ':not(:disabled)',\n    checked: ':is(:is(input[type=radio], input[type=checkbox])[checked], option:selected)',\n    required: ':is(input, select, textarea)[required]',\n    optional: ':is(input, select, textarea):not([required])',\n    selected: 'option:is([selected], select:not([multiple]):not(:has(> option[selected])) > :first-of-type)',\n    checkbox: '[type=checkbox]',\n    file: '[type=file]',\n    password: '[type=password]',\n    radio: '[type=radio]',\n    reset: '[type=reset]',\n    image: '[type=image]',\n    submit: '[type=submit]',\n    parent: ':not(:empty)',\n    header: ':is(h1, h2, h3, h4, h5, h6)',\n    button: ':is(button, input[type=button])',\n    input: ':is(input, textarea, select, button)',\n    text: \"input:is(:not([type!='']), [type=text])\",\n  },\n  Bt = {};\nfunction Ft(e, t) {\n  var n = t.getSiblings(e);\n  return n.length <= 1 || (e = n.indexOf(e)) < 0 || e === n.length - 1 ? [] : n.slice(e + 1).filter(t.isTag);\n}\nfunction Ut(e) {\n  return {\n    xmlMode: !!e.xmlMode,\n    lowerCaseAttributeNames: !!e.lowerCaseAttributeNames,\n    lowerCaseTags: !!e.lowerCaseTags,\n    quirksMode: !!e.quirksMode,\n    cacheResults: !!e.cacheResults,\n    pseudos: e.pseudos,\n    adapter: e.adapter,\n    equals: e.equals,\n  };\n}\nconst Ht = (e, t, n, r, i) => {\n    const s = i(t, Ut(n), r);\n    return s === mt.trueFunc ? e : s === mt.falseFunc ? mt.falseFunc : (t) => s(t) && e(t);\n  },\n  Gt = {\n    is: Ht,\n    matches: Ht,\n    where: Ht,\n    not(e, t, n, r, i) {\n      const s = i(t, Ut(n), r);\n      return s === mt.falseFunc ? e : s === mt.trueFunc ? mt.falseFunc : (t) => !s(t) && e(t);\n    },\n    has(e, t, n, r, i) {\n      const s = n.adapter,\n        a = Ut(n),\n        o = ((a.relativeSelector = !0), t.some((e) => e.some(Tt)) ? [Bt] : void 0),\n        c = i(t, a, o);\n      if (c === mt.falseFunc) return mt.falseFunc;\n      const u = (function (e, t) {\n        return e === mt.falseFunc ? mt.falseFunc : (n) => t.isTag(n) && e(n);\n      })(c, s);\n      if (o && c !== mt.trueFunc) {\n        const { shouldTestNextSiblings: t = !1 } = c;\n        return (n) => {\n          if (!e(n)) return !1;\n          o[0] = n;\n          var r = s.getChildren(n),\n            n = t ? [...r, ...Ft(n, s)] : r;\n          return s.existsOne(u, n);\n        };\n      }\n      return (t) => e(t) && s.existsOne(u, s.getChildren(t));\n    },\n  };\nfunction jt(e, t) {\n  return (e = t.getParent(e)) && t.isTag(e) ? e : null;\n}\nfunction qt(e, t, n, r, i) {\n  const { adapter: s, equals: a } = n;\n  switch (t.type) {\n    case et.PseudoElement:\n      throw new Error('Pseudo-elements are not supported by css-select');\n    case et.ColumnCombinator:\n      throw new Error('Column combinators are not yet supported by css-select');\n    case et.Attribute:\n      if (null != t.namespace) throw new Error('Namespaced attributes are not yet supported by css-select');\n      return ((n.xmlMode && !n.lowerCaseAttributeNames) || (t.name = t.name.toLowerCase()), bt[t.action](e, t, n));\n    case et.Pseudo:\n      return (function (e, t, n, r, i) {\n        const { name: a, data: o } = t;\n        if (Array.isArray(o)) {\n          if (a in Gt) return Gt[a](e, o, n, r, i);\n          throw new Error(`Unknown pseudo-class :${a}(${o})`);\n        }\n        const c = null == (t = n.pseudos) ? void 0 : t[a],\n          u = 'string' == typeof c ? c : Pt[a];\n        if ('string' == typeof u) {\n          if (null != o) throw new Error(`Pseudo ${a} doesn't have any arguments`);\n          const t = pt(u);\n          return Gt.is(e, t, n, r, i);\n        }\n        if ('function' == typeof c) return (Mt(c, a, o, 1), (t) => c(t, o) && e(t));\n        if (a in Rt) return Rt[a](e, o, n, r);\n        if (a in xt) {\n          const t = xt[a];\n          return (Mt(t, a, o, 2), (r) => t(r, n, o) && e(r));\n        }\n        throw new Error('Unknown pseudo-class :' + a);\n      })(e, t, n, r, i);\n    case et.Tag: {\n      if (null != t.namespace) throw new Error('Namespaced tag names are not yet supported by css-select');\n      let r = t.name;\n      return (\n        (n.xmlMode && !n.lowerCaseTags) || (r = r.toLowerCase()),\n        function (t) {\n          return s.getName(t) === r && e(t);\n        }\n      );\n    }\n    case et.Descendant: {\n      if (!1 === n.cacheResults || 'undefined' == typeof WeakSet)\n        return function (t) {\n          let n = t;\n          for (; (n = jt(n, s)); ) if (e(n)) return !0;\n          return !1;\n        };\n      const t = new WeakSet();\n      return function (n) {\n        let r = n;\n        for (; (r = jt(r, s)); )\n          if (!t.has(r)) {\n            if (s.isTag(r) && e(r)) return !0;\n            t.add(r);\n          }\n        return !1;\n      };\n    }\n    case '_flexibleDescendant':\n      return function (t) {\n        let n = t;\n        do {\n          if (e(n)) return !0;\n        } while ((n = jt(n, s)));\n        return !1;\n      };\n    case et.Parent:\n      return function (t) {\n        return s.getChildren(t).some((t) => s.isTag(t) && e(t));\n      };\n    case et.Child:\n      return function (t) {\n        return null != (t = s.getParent(t)) && s.isTag(t) && e(t);\n      };\n    case et.Sibling:\n      return function (t) {\n        var n = s.getSiblings(t);\n        for (let r = 0; r < n.length; r++) {\n          var i = n[r];\n          if (a(t, i)) break;\n          if (s.isTag(i) && e(i)) return !0;\n        }\n        return !1;\n      };\n    case et.Adjacent:\n      return s.prevElementSibling\n        ? function (t) {\n            return null != (t = s.prevElementSibling(t)) && e(t);\n          }\n        : function (t) {\n            var n = s.getSiblings(t);\n            let r;\n            for (let e = 0; e < n.length; e++) {\n              var i = n[e];\n              if (a(t, i)) break;\n              s.isTag(i) && (r = i);\n            }\n            return !!r && e(r);\n          };\n    case et.Universal:\n      if (null != t.namespace && '*' !== t.namespace)\n        throw new Error('Namespaced universal selectors are not yet supported by css-select');\n      return e;\n  }\n}\nfunction Yt(e) {\n  return e.type === et.Pseudo && ('scope' === e.name || (Array.isArray(e.data) && e.data.some((e) => e.some(Yt))));\n}\nconst Kt = { type: et.Descendant },\n  Wt = { type: '_flexibleDescendant' },\n  Vt = { type: et.Pseudo, name: 'scope', data: null };\nfunction $t(e, t, n) {\n  (e.forEach(gt), (n = null != (r = t.context) ? r : n));\n  const i = Array.isArray(n),\n    s = n && (Array.isArray(n) ? n : [n]);\n  if (!1 !== t.relativeSelector)\n    !(function (e, { adapter: t }, n) {\n      var r = !(\n        null == n ||\n        !n.every((e) => {\n          var n = t.isTag(e) && t.getParent(e);\n          return e === Bt || (n && t.isTag(n));\n        })\n      );\n      for (const t of e) {\n        if (!(0 < t.length && Tt(t[0]) && t[0].type !== et.Descendant)) {\n          if (!r || t.some(Yt)) continue;\n          t.unshift(Kt);\n        }\n        t.unshift(Vt);\n      }\n    })(e, t, s);\n  else if (e.some((e) => 0 < e.length && Tt(e[0])))\n    throw new Error('Relative selectors are not allowed when the `relativeSelector` option is disabled');\n  let a = !1;\n  var r = e\n    .map((e) => {\n      if (2 <= e.length) {\n        const [t, n] = e;\n        t.type === et.Pseudo &&\n          'scope' === t.name &&\n          (i && n.type === et.Descendant ? (e[1] = Wt) : (n.type !== et.Adjacent && n.type !== et.Sibling) || (a = !0));\n      }\n      return (function (e, t, n) {\n        return e.reduce(\n          (e, r) => (e === mt.falseFunc ? mt.falseFunc : qt(e, r, t, n, $t)),\n          null != (e = t.rootFunc) ? e : mt.trueFunc,\n        );\n      })(e, t, s);\n    })\n    .reduce(Qt, mt.falseFunc);\n  return ((r.shouldTestNextSiblings = a), r);\n}\nfunction Qt(e, t) {\n  return t === mt.falseFunc || e === mt.trueFunc\n    ? e\n    : e === mt.falseFunc || t === mt.trueFunc\n      ? t\n      : function (n) {\n          return e(n) || t(n);\n        };\n}\nconst zt = (e, t) => e === t,\n  Xt = { adapter: Se, equals: zt },\n  Zt =\n    ((Jt = $t),\n    function (e, t, n) {\n      return (\n        (t = (function (e) {\n          var r;\n          return (\n            null == (e = null != e ? e : Xt).adapter && (e.adapter = Se),\n            null == e.equals && (e.equals = null != (r = null == (r = e.adapter) ? void 0 : r.equals) ? r : zt),\n            e\n          );\n        })(t)),\n        Jt(e, t, n)\n      );\n    });\nfunction en(e, t, n = !1) {\n  return (\n    n &&\n      (e = (function (e, t) {\n        const n = Array.isArray(e) ? e.slice(0) : [e],\n          r = n.length;\n        for (let e = 0; e < r; e++) {\n          const r = Ft(n[e], t);\n          n.push(...r);\n        }\n        return n;\n      })(e, t)),\n    Array.isArray(e) ? t.removeSubsets(e) : t.getChildren(e)\n  );\n}\nconst tn = new Set(['first', 'last', 'eq', 'gt', 'nth', 'lt', 'even', 'odd']);\nfunction nn(e) {\n  return (\n    'pseudo' === e.type &&\n    (!!tn.has(e.name) || (!('not' !== e.name || !Array.isArray(e.data)) && e.data.some((e) => e.some(nn))))\n  );\n}\nfunction rn(e) {\n  var t = [],\n    n = [];\n  for (const r of e) (r.some(nn) ? t : n).push(r);\n  return [n, t];\n}\nconst sn = { type: et.Universal, namespace: null },\n  an = { type: et.Pseudo, name: 'scope', data: null };\nfunction on(e, t, n = {}) {\n  return cn([e], t, n);\n}\nfunction cn(e, t, n = {}) {\n  var i;\n  return 'function' == typeof t\n    ? e.some(t)\n    : (([t, i] = rn(pt(t))), (0 < t.length && e.some(Zt(t, n))) || i.some((t) => 0 < hn(t, e, n).length));\n}\nfunction un(e, t, n = {}) {\n  return ln(pt(e), t, n);\n}\nfunction ln(e, t, n) {\n  if (0 === t.length) return [];\n  const [r, i] = rn(e);\n  let s;\n  if (r.length) {\n    const e = mn(t, r, n);\n    if (0 === i.length) return e;\n    e.length && (s = new Set(e));\n  }\n  for (let e = 0; e < i.length && (null == s ? void 0 : s.size) !== t.length; e++) {\n    const r = i[e],\n      a = s ? t.filter((e) => S(e) && !s.has(e)) : t;\n    if (0 === a.length) break;\n    var o = hn(r, t, n);\n    if (o.length)\n      if (s) o.forEach((e) => s.add(e));\n      else {\n        if (e === i.length - 1) return o;\n        s = new Set(o);\n      }\n  }\n  return void 0 !== s ? (s.size === t.length ? t : t.filter((e) => s.has(e))) : [];\n}\nfunction hn(e, t, n) {\n  var r, s;\n  return e.some(ot)\n    ? ((r =\n        null != (r = n.root)\n          ? r\n          : (function (e) {\n              for (; e.parent; ) e = e.parent;\n              return e;\n            })(t[0])),\n      (s = { ...n, context: t, relativeSelector: !1 }),\n      e.push(an),\n      fn(r, e, s, !0, t.length))\n    : fn(t, e, n, !1, t.length);\n}\nfunction fn(e, t, n, r, i) {\n  var s = t.findIndex(nn),\n    a = t.slice(0, s),\n    o = t[s],\n    c = t.length - 1 === s ? i : 1 / 0;\n  if (\n    0 ===\n    (c = (function (e, t, n) {\n      var r = null != t ? parseInt(t, 10) : NaN;\n      switch (e) {\n        case 'first':\n          return 1;\n        case 'nth':\n        case 'eq':\n          return isFinite(r) ? (0 <= r ? r + 1 : 1 / 0) : 0;\n        case 'lt':\n          return isFinite(r) ? (0 <= r ? Math.min(r, n) : 1 / 0) : 0;\n        case 'gt':\n          return isFinite(r) ? 1 / 0 : 0;\n        case 'odd':\n          return 2 * n;\n        case 'even':\n          return 2 * n - 1;\n        case 'last':\n        case 'not':\n          return 1 / 0;\n      }\n    })(o.name, o.data, c))\n  )\n    return [];\n  r = (\n    0 !== a.length || Array.isArray(e)\n      ? 0 === a.length\n        ? (Array.isArray(e) ? e : [e]).filter(S)\n        : r || a.some(ot)\n          ? pn(e, [a], n, c)\n          : mn(e, [a], n)\n      : J(e).filter(S)\n  ).slice(0, c);\n  let h = (function (e, t, n, r) {\n    var i = 'string' == typeof n ? parseInt(n, 10) : NaN;\n    switch (e) {\n      case 'first':\n      case 'lt':\n        return t;\n      case 'last':\n        return 0 < t.length ? [t[t.length - 1]] : t;\n      case 'nth':\n      case 'eq':\n        return isFinite(i) && Math.abs(i) < t.length ? [i < 0 ? t[t.length + i] : t[i]] : [];\n      case 'gt':\n        return isFinite(i) ? t.slice(i + 1) : [];\n      case 'even':\n        return t.filter((e, t) => t % 2 == 0);\n      case 'odd':\n        return t.filter((e, t) => t % 2 == 1);\n      case 'not': {\n        const e = new Set(ln(n, t, r));\n        return t.filter((t) => !e.has(t));\n      }\n    }\n  })(o.name, r, o.data, n);\n  if (0 === h.length || t.length === s + 1) return h;\n  if ((e = (a = t.slice(s + 1)).some(ot))) {\n    if (ot(a[0])) {\n      const e = a[0].type;\n      ((e !== et.Sibling && e !== et.Adjacent) || (h = en(h, Se, !0)), a.unshift(sn));\n    }\n    n = { ...n, relativeSelector: !1, rootFunc: (e) => h.includes(e) };\n  } else n.rootFunc && n.rootFunc !== _t && (n = { ...n, rootFunc: _t });\n  return a.some(nn) ? fn(h, a, n, !1, i) : e ? pn(h, [a], n, i) : mn(h, [a], n);\n}\nfunction pn(e, t, n, r) {\n  return dn(e, Zt(t, n, e), r);\n}\nfunction dn(e, t, n = 1 / 0) {\n  return ae((e) => S(e) && t(e), en(e, Se, t.shouldTestNextSiblings), !0, n);\n}\nfunction mn(e, t, n) {\n  return 0 === (e = (Array.isArray(e) ? e : [e]).filter(S)).length || (t = Zt(t, n)) === _t ? e : e.filter(t);\n}\nvar _n = function (e, t, n) {\n    if (n || 2 === arguments.length)\n      for (var r, i = 0, s = t.length; i < s; i++)\n        (!r && i in t) || ((r = r || Array.prototype.slice.call(t, 0, i))[i] = t[i]);\n    return e.concat(r || Array.prototype.slice.call(t));\n  },\n  En = /^\\s*[~+]/;\nfunction Tn(e) {\n  return function (t) {\n    for (var n = [], r = 1; r < arguments.length; r++) n[r - 1] = arguments[r];\n    return function (r) {\n      var s = e(t, this);\n      return (\n        r && (s = Mn(s, r, this.options.xmlMode, null == (r = this._root) ? void 0 : r[0])),\n        this._make(\n          1 < this.length && 1 < s.length\n            ? n.reduce(function (e, t) {\n                return t(e);\n              }, s)\n            : s,\n        )\n      );\n    };\n  };\n}\nvar An = Tn(function (e, t) {\n    for (var n, r = [], i = 0; i < t.length; i++) {\n      var s = e(t[i]);\n      r.push(s);\n    }\n    return (n = new Array()).concat.apply(n, r);\n  }),\n  gn = Tn(function (e, t) {\n    for (var n = [], r = 0; r < t.length; r++) {\n      var i = e(t[r]);\n      null !== i && n.push(i);\n    }\n    return n;\n  });\nfunction vn(e) {\n  for (var t = [], n = 1; n < arguments.length; n++) t[n - 1] = arguments[n];\n  var r = null,\n    i = Tn(function (e, t) {\n      var n = [];\n      return (\n        Be(t, function (t) {\n          for (var i; (i = e(t)) && (null == r || !r(i, n.length)); t = i) n.push(i);\n        }),\n        n\n      );\n    }).apply(void 0, _n([e], t, !1));\n  return function (e, t) {\n    var n = this,\n      t =\n        ((r =\n          'string' == typeof e\n            ? function (t) {\n                return on(t, e, n.options);\n              }\n            : e\n              ? xn(e)\n              : null),\n        i.call(this, t));\n    return ((r = null), t);\n  };\n}\nfunction yn(e) {\n  return Array.from(new Set(e));\n}\nvar Sn = gn(function (e) {\n    return (e = e.parent) && !O(e) ? e : null;\n  }, yn),\n  Cn = An(\n    function (e) {\n      for (var t = []; e.parent && !O(e.parent); ) (t.push(e.parent), (e = e.parent));\n      return t;\n    },\n    me,\n    function (e) {\n      return e.reverse();\n    },\n  ),\n  Nn = vn(\n    function (e) {\n      return (e = e.parent) && !O(e) ? e : null;\n    },\n    me,\n    function (e) {\n      return e.reverse();\n    },\n  ),\n  bn = gn(function (e) {\n    return ne(e);\n  }),\n  In = An(function (e) {\n    for (var t = []; e.next; ) S((e = e.next)) && t.push(e);\n    return t;\n  }, yn),\n  On = vn(function (e) {\n    return ne(e);\n  }, yn),\n  kn = gn(function (e) {\n    return re(e);\n  }),\n  Ln = An(function (e) {\n    for (var t = []; e.prev; ) S((e = e.prev)) && t.push(e);\n    return t;\n  }, yn),\n  Dn = vn(function (e) {\n    return re(e);\n  }, yn),\n  Rn = An(function (e) {\n    return te(e).filter(function (t) {\n      return S(t) && t !== e;\n    });\n  }, me),\n  wn = An(function (e) {\n    return J(e).filter(S);\n  }, yn);\nfunction xn(e) {\n  return 'function' == typeof e\n    ? function (t, n) {\n        return e.call(t, n, t);\n      }\n    : Pe(e)\n      ? function (t) {\n          return Array.prototype.includes.call(e, t);\n        }\n      : function (t) {\n          return e === t;\n        };\n}\nfunction Mn(e, t, n, r) {\n  return 'string' == typeof t ? un(t, e, { xmlMode: n, root: r }) : e.filter(xn(t));\n}\nvar Pn = Object.freeze({\n  __proto__: null,\n  find: function (e) {\n    var n, r, t;\n    return e\n      ? ((n = this.toArray()),\n        'string' != typeof e\n          ? ((r = Pe(e) ? e.toArray() : [e]),\n            this._make(\n              r.filter(function (e) {\n                return n.some(function (t) {\n                  return De(t, e);\n                });\n              }),\n            ))\n          : ((r = En.test(e) ? n : this.children().toArray()),\n            (t = {\n              context: n,\n              root: null == (t = this._root) ? void 0 : t[0],\n              xmlMode: this.options.xmlMode,\n              lowerCaseTags: this.options.lowerCaseTags,\n              lowerCaseAttributeNames: this.options.lowerCaseAttributeNames,\n              pseudos: this.options.pseudos,\n              quirksMode: this.options.quirksMode,\n            }),\n            this._make(\n              (function (e, t, n) {\n                var s;\n                return 'function' == typeof e\n                  ? dn(t, e)\n                  : (([e, s] = rn(pt(e))),\n                    (s = s.map((e) => fn(t, e, n, !0, 1 / 0))),\n                    e.length && s.push(pn(t, e, n, 1 / 0)),\n                    0 === s.length ? [] : 1 === s.length ? s[0] : me(s.reduce((e, t) => [...e, ...t])));\n              })(e, r, t),\n            )))\n      : this._make([]);\n  },\n  parent: Sn,\n  parents: Cn,\n  parentsUntil: Nn,\n  closest: function (e) {\n    var t,\n      r,\n      i,\n      n = [];\n    return (\n      e &&\n        ((r = { xmlMode: this.options.xmlMode, root: null == (t = this._root) ? void 0 : t[0] }),\n        (i =\n          'string' == typeof e\n            ? function (t) {\n                return on(t, e, r);\n              }\n            : xn(e)),\n        Be(this, function (e) {\n          for (; e && S(e); ) {\n            if (i(e, 0)) {\n              n.includes(e) || n.push(e);\n              break;\n            }\n            e = e.parent;\n          }\n        })),\n      this._make(n)\n    );\n  },\n  next: bn,\n  nextAll: In,\n  nextUntil: On,\n  prev: kn,\n  prevAll: Ln,\n  prevUntil: Dn,\n  siblings: Rn,\n  children: wn,\n  contents: function () {\n    var e = this.toArray().reduce(function (e, t) {\n      return k(t) ? e.concat(t.children) : e;\n    }, []);\n    return this._make(e);\n  },\n  each: function (e) {\n    for (var t = 0, n = this.length; t < n && !1 !== e.call(this[t], t, this[t]); ) ++t;\n    return this;\n  },\n  map: function (e) {\n    for (var t = [], n = 0; n < this.length; n++) {\n      var r = this[n];\n      null != (r = e.call(r, n, r)) && (t = t.concat(r));\n    }\n    return this._make(t);\n  },\n  filter: function (e) {\n    return this._make(Mn(this.toArray(), e, this.options.xmlMode, null == (e = this._root) ? void 0 : e[0]));\n  },\n  filterArray: Mn,\n  is: function (e) {\n    var t = this.toArray();\n    return 'string' == typeof e ? cn(t.filter(S), e, this.options) : !!e && t.some(xn(e));\n  },\n  not: function (e) {\n    var n,\n      r,\n      t = this.toArray(),\n      t =\n        'string' == typeof e\n          ? ((n = new Set(un(e, t, this.options))),\n            t.filter(function (e) {\n              return !n.has(e);\n            }))\n          : ((r = xn(e)),\n            t.filter(function (e, t) {\n              return !r(e, t);\n            }));\n    return this._make(t);\n  },\n  has: function (e) {\n    var t = this;\n    return this.filter(\n      'string' == typeof e\n        ? ':has('.concat(e, ')')\n        : function (n, r) {\n            return 0 < t._make(r).find(e).length;\n          },\n    );\n  },\n  first: function () {\n    return 1 < this.length ? this._make(this[0]) : this;\n  },\n  last: function () {\n    return 0 < this.length ? this._make(this[this.length - 1]) : this;\n  },\n  eq: function (e) {\n    return 0 == (e = +e) && this.length <= 1\n      ? this\n      : (e < 0 && (e = this.length + e), this._make(null != (e = this[e]) ? e : []));\n  },\n  get: function (e) {\n    return null == e ? this.toArray() : this[e < 0 ? this.length + e : e];\n  },\n  toArray: function () {\n    return Array.prototype.slice.call(this);\n  },\n  index: function (e) {\n    var t,\n      e =\n        null == e\n          ? ((t = this.parent().children()), this[0])\n          : 'string' == typeof e\n            ? ((t = this._make(e)), this[0])\n            : ((t = this), Pe(e) ? e[0] : e);\n    return Array.prototype.indexOf.call(t, e);\n  },\n  slice: function (e, t) {\n    return this._make(Array.prototype.slice.call(this, e, t));\n  },\n  end: function () {\n    var e;\n    return null != (e = this.prevObject) ? e : this._make([]);\n  },\n  add: function (e, t) {\n    return ((e = this._make(e, t)), (t = me(_n(_n([], this.get(), !0), e.get(), !0))), this._make(t));\n  },\n  addBack: function (e) {\n    return this.prevObject ? this.add(e ? this.prevObject.filter(e) : this.prevObject) : this;\n  },\n});\nfunction Bn(e, t) {\n  var n = Array.isArray(e) ? e : [e];\n  t ? (t.children = n) : (t = null);\n  for (var r = 0; r < n.length; r++) {\n    var i = n[r];\n    (i.parent && i.parent.children !== n && ie(i),\n      t ? ((i.prev = n[r - 1] || null), (i.next = n[r + 1] || null)) : (i.prev = i.next = null),\n      (i.parent = t));\n  }\n  return t;\n}\nvar Fn = function (e, t, n) {\n  if (n || 2 === arguments.length)\n    for (var r, i = 0, s = t.length; i < s; i++)\n      (!r && i in t) || ((r = r || Array.prototype.slice.call(t, 0, i))[i] = t[i]);\n  return e.concat(r || Array.prototype.slice.call(t));\n};\nfunction Un(e) {\n  return function () {\n    for (var t = this, n = [], r = 0; r < arguments.length; r++) n[r] = arguments[r];\n    var i = this.length - 1;\n    return Be(this, function (r, s) {\n      var a;\n      k(r) &&\n        ((a = 'function' == typeof n[0] ? n[0].call(r, s, t._render(r.children)) : n),\n        (a = t._makeDomArray(a, s < i)),\n        e(a, r.children, r));\n    });\n  };\n}\nfunction Hn(e, t, n, r, i) {\n  for (\n    var o = Fn([t, n], r, !0), c = 0 === t ? null : e[t - 1], u = t + n >= e.length ? null : e[t + n], l = 0;\n    l < r.length;\n    ++l\n  ) {\n    var p,\n      h = r[l],\n      f = h.parent;\n    (f && -1 < (p = f.children.indexOf(h)) && (f.children.splice(p, 1), i === f) && p < t && o[0]--,\n      (h.parent = i),\n      h.prev && (h.prev.next = null != (f = h.next) ? f : null),\n      h.next && (h.next.prev = null != (p = h.prev) ? p : null),\n      (h.prev = 0 === l ? c : r[l - 1]),\n      (h.next = l === r.length - 1 ? u : r[l + 1]));\n  }\n  return (c && (c.next = r[0]), u && (u.prev = r[r.length - 1]), e.splice.apply(e, o));\n}\nvar Gn = Un(function (e, t, n) {\n    Hn(t, t.length, 0, e, n);\n  }),\n  jn = Un(function (e, t, n) {\n    Hn(t, 0, 0, e, n);\n  });\nfunction qn(e) {\n  return function (t) {\n    for (var n = this.length - 1, r = this.parents().last(), i = 0; i < this.length; i++) {\n      var s = this[i],\n        a = 'function' == typeof t ? t.call(s, i, s) : 'string' != typeof t || Ue(t) ? t : r.find(t).clone();\n      if ((a = this._makeDomArray(a, i < n)[0]) && k(a)) {\n        for (var c = a, u = 0; u < c.children.length; ) {\n          var l = c.children[u];\n          S(l) ? ((c = l), (u = 0)) : u++;\n        }\n        e(s, c, [a]);\n      }\n    }\n    return this;\n  };\n}\nvar Yn = qn(function (e, t, n) {\n    var i,\n      s,\n      r = e.parent;\n    r && ((s = (i = r.children).indexOf(e)), Bn([e], t), Hn(i, s, 0, n, r));\n  }),\n  Kn = qn(function (e, t, n) {\n    k(e) && (Bn(e.children, t), Bn(n, e));\n  }),\n  Wn = Object.freeze({\n    __proto__: null,\n    _makeDomArray: function (e, t) {\n      var n = this;\n      return null == e\n        ? []\n        : Pe(e)\n          ? t\n            ? Fe(e.get())\n            : e.get()\n          : Array.isArray(e)\n            ? e.reduce(function (e, r) {\n                return e.concat(n._makeDomArray(r, t));\n              }, [])\n            : 'string' == typeof e\n              ? this._parse(e, this.options, !1, null).children\n              : t\n                ? Fe([e])\n                : [e];\n    },\n    appendTo: function (e) {\n      return ((Pe(e) ? e : this._make(e)).append(this), this);\n    },\n    prependTo: function (e) {\n      return ((Pe(e) ? e : this._make(e)).prepend(this), this);\n    },\n    append: Gn,\n    prepend: jn,\n    wrap: Yn,\n    wrapInner: Kn,\n    unwrap: function (e) {\n      var t = this;\n      return (\n        this.parent(e)\n          .not('body')\n          .each(function (e, n) {\n            t._make(n).replaceWith(n.children);\n          }),\n        this\n      );\n    },\n    wrapAll: function (e) {\n      var t = this[0];\n      if (t) {\n        for (\n          var n = this._make('function' == typeof e ? e.call(t, 0, t) : e).insertBefore(t), r = void 0, i = 0;\n          i < n.length;\n          i++\n        )\n          'tag' === n[i].type && (r = n[i]);\n        for (var s = 0; r && s < r.children.length; ) {\n          var a = r.children[s];\n          'tag' === a.type ? ((r = a), (s = 0)) : s++;\n        }\n        r && this._make(r).append(this);\n      }\n      return this;\n    },\n    after: function () {\n      for (var e = this, t = [], n = 0; n < arguments.length; n++) t[n] = arguments[n];\n      var r = this.length - 1;\n      return Be(this, function (n, i) {\n        var a,\n          o,\n          s = n.parent;\n        k(n) &&\n          s &&\n          ((o = (a = s.children).indexOf(n)) < 0 ||\n            ((n = 'function' == typeof t[0] ? t[0].call(n, i, e._render(n.children)) : t),\n            Hn(a, o + 1, 0, e._makeDomArray(n, i < r), s)));\n      });\n    },\n    insertAfter: function (e) {\n      var t = this,\n        n = ('string' == typeof e && (e = this._make(e)), this.remove(), []);\n      return (\n        this._makeDomArray(e).forEach(function (e) {\n          var s,\n            r = t.clone().toArray(),\n            i = e.parent;\n          !i || (e = (s = i.children).indexOf(e)) < 0 || (Hn(s, e + 1, 0, r, i), n.push.apply(n, r));\n        }),\n        this._make(n)\n      );\n    },\n    before: function () {\n      for (var e = this, t = [], n = 0; n < arguments.length; n++) t[n] = arguments[n];\n      var r = this.length - 1;\n      return Be(this, function (n, i) {\n        var a,\n          o,\n          s = n.parent;\n        k(n) &&\n          s &&\n          ((o = (a = s.children).indexOf(n)) < 0 ||\n            ((n = 'function' == typeof t[0] ? t[0].call(n, i, e._render(n.children)) : t),\n            Hn(a, o, 0, e._makeDomArray(n, i < r), s)));\n      });\n    },\n    insertBefore: function (e) {\n      var t = this,\n        e = this._make(e),\n        r = (this.remove(), []);\n      return (\n        Be(e, function (e) {\n          var s,\n            n = t.clone().toArray(),\n            i = e.parent;\n          !i || (e = (s = i.children).indexOf(e)) < 0 || (Hn(s, e, 0, n, i), r.push.apply(r, n));\n        }),\n        this._make(r)\n      );\n    },\n    remove: function (e) {\n      return (\n        Be(e ? this.filter(e) : this, function (e) {\n          (ie(e), (e.prev = e.next = e.parent = null));\n        }),\n        this\n      );\n    },\n    replaceWith: function (e) {\n      var t = this;\n      return Be(this, function (n, r) {\n        var s,\n          c,\n          i = n.parent;\n        i &&\n          ((s = i.children),\n          (r = 'function' == typeof e ? e.call(n, r, n) : e),\n          Bn((r = t._makeDomArray(r)), null),\n          (c = s.indexOf(n)),\n          Hn(s, c, 1, r, i),\n          r.includes(n) || (n.parent = n.prev = n.next = null));\n      });\n    },\n    empty: function () {\n      return Be(this, function (e) {\n        k(e) &&\n          (e.children.forEach(function (e) {\n            e.next = e.prev = e.parent = null;\n          }),\n          (e.children.length = 0));\n      });\n    },\n    html: function (e) {\n      var n,\n        t = this;\n      return void 0 === e\n        ? (n = this[0]) && k(n)\n          ? this._render(n.children)\n          : null\n        : Be(this, function (n) {\n            k(n) &&\n              (n.children.forEach(function (e) {\n                e.next = e.prev = e.parent = null;\n              }),\n              Bn(Pe(e) ? e.toArray() : t._parse(''.concat(e), t.options, !1, n).children, n));\n          });\n    },\n    toString: function () {\n      return this._render(this);\n    },\n    text: function (e) {\n      var t = this;\n      return void 0 === e\n        ? Oe(this)\n        : Be(\n            this,\n            'function' == typeof e\n              ? function (n, r) {\n                  return t._make(n).text(e.call(n, r, Oe([n])));\n                }\n              : function (t) {\n                  k(t) &&\n                    (t.children.forEach(function (e) {\n                      e.next = e.prev = e.parent = null;\n                    }),\n                    Bn(new _(''.concat(e)), t));\n                },\n          );\n    },\n    clone: function () {\n      return this._make(Fe(this.get()));\n    },\n  });\nfunction Vn(e, t, n, r) {\n  var i, a;\n  'string' == typeof t\n    ? ((i = $n(e)),\n      '' === (r = 'function' == typeof n ? n.call(e, r, i[t]) : n) ? delete i[t] : null != r && (i[t] = r),\n      (e.attribs.style =\n        ((a = i),\n        Object.keys(a).reduce(function (e, t) {\n          return ''\n            .concat(e)\n            .concat(e ? ' ' : '')\n            .concat(t, ': ')\n            .concat(a[t], ';');\n        }, ''))))\n    : 'object' == typeof t &&\n      Object.keys(t).forEach(function (n, r) {\n        Vn(e, n, t[n], r);\n      });\n}\nfunction $n(e, t) {\n  var n, r;\n  if (e && S(e))\n    return (\n      (n = (function (e) {\n        if (!(e = (e || '').trim())) return {};\n        for (var t, n = {}, r = 0, i = e.split(';'); r < i.length; r++) {\n          var o,\n            s = i[r],\n            a = s.indexOf(':');\n          a < 1 || a === s.length - 1\n            ? 0 < (o = s.trimEnd()).length && void 0 !== t && (n[t] += ';'.concat(o))\n            : (n[(t = s.slice(0, a).trim())] = s.slice(a + 1).trim());\n        }\n        return n;\n      })(e.attribs.style)),\n      'string' == typeof t\n        ? n[t]\n        : Array.isArray(t)\n          ? ((r = {}),\n            t.forEach(function (e) {\n              null != n[e] && (r[e] = n[e]);\n            }),\n            r)\n          : n\n    );\n}\nvar tr,\n  ar,\n  _r,\n  Tr,\n  Qn = Object.freeze({\n    __proto__: null,\n    css: function (e, t) {\n      return (null != e && null != t) || ('object' == typeof e && !Array.isArray(e))\n        ? Be(this, function (n, r) {\n            S(n) && Vn(n, e, t, r);\n          })\n        : 0 !== this.length\n          ? $n(this[0], e)\n          : void 0;\n    },\n  }),\n  zn = 'input,select,textarea,keygen',\n  Xn = /%20/g,\n  Zn = /\\r?\\n/g,\n  Jn = Object.freeze({\n    __proto__: null,\n    serialize: function () {\n      return this.serializeArray()\n        .map(function (e) {\n          return ''.concat(encodeURIComponent(e.name), '=').concat(encodeURIComponent(e.value));\n        })\n        .join('&')\n        .replace(Xn, '+');\n    },\n    serializeArray: function () {\n      var e = this;\n      return this.map(function (t, n) {\n        var r = e._make(n);\n        return (S(n) && 'form' === n.name ? r.find(zn) : r.filter(zn)).toArray();\n      })\n        .filter(\n          '[name!=\"\"]:enabled:not(:submit, :button, :image, :reset, :file):matches([checked], :not(:checkbox, :radio))',\n        )\n        .map(function (t, n) {\n          var s = (n = e._make(n)).attr('name'),\n            n = null != (n = n.val()) ? n : '';\n          return Array.isArray(n)\n            ? n.map(function (e) {\n                return { name: s, value: e.replace(Zn, '\\r\\n') };\n              })\n            : { name: s, value: n.replace(Zn, '\\r\\n') };\n        })\n        .toArray();\n    },\n  }),\n  er = function (e, t, n) {\n    if (((this.length = 0), (this.options = n), (this._root = t), e)) {\n      for (var r = 0; r < e.length; r++) this[r] = e[r];\n      this.length = e.length;\n    }\n  },\n  tr =\n    ((er.prototype.cheerio = '[cheerio object]'),\n    (er.prototype.splice = Array.prototype.splice),\n    (er.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator]),\n    Object.assign(er.prototype, nt, Pn, Wn, Qn, Jn),\n    function (e, t) {\n      return (tr =\n        Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array\n          ? function (e, t) {\n              e.__proto__ = t;\n            }\n          : function (e, t) {\n              for (var n in t) Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);\n            }))(e, t);\n    }),\n  nr = function (e, t) {\n    if ('function' != typeof t && null !== t)\n      throw new TypeError('Class extends value ' + String(t) + ' is not a constructor or null');\n    function n() {\n      this.constructor = e;\n    }\n    (tr(e, t), (e.prototype = null === t ? Object.create(t) : ((n.prototype = t.prototype), new n())));\n  },\n  rr = function () {\n    return (rr =\n      Object.assign ||\n      function (e) {\n        for (var t, n = 1, r = arguments.length; n < r; n++)\n          for (var i in (t = arguments[n])) Object.prototype.hasOwnProperty.call(t, i) && (e[i] = t[i]);\n        return e;\n      }).apply(this, arguments);\n  };\nconst ir = new Set([\n    65534, 65535, 131070, 131071, 196606, 196607, 262142, 262143, 327678, 327679, 393214, 393215, 458750, 458751,\n    524286, 524287, 589822, 589823, 655358, 655359, 720894, 720895, 786430, 786431, 851966, 851967, 917502, 917503,\n    983038, 983039, 1048574, 1048575, 1114110, 1114111,\n  ]),\n  sr = '�',\n  or =\n    ((function (e) {\n      ((e[(e.EOF = -1)] = 'EOF'),\n        (e[(e.NULL = 0)] = 'NULL'),\n        (e[(e.TABULATION = 9)] = 'TABULATION'),\n        (e[(e.CARRIAGE_RETURN = 13)] = 'CARRIAGE_RETURN'),\n        (e[(e.LINE_FEED = 10)] = 'LINE_FEED'),\n        (e[(e.FORM_FEED = 12)] = 'FORM_FEED'),\n        (e[(e.SPACE = 32)] = 'SPACE'),\n        (e[(e.EXCLAMATION_MARK = 33)] = 'EXCLAMATION_MARK'),\n        (e[(e.QUOTATION_MARK = 34)] = 'QUOTATION_MARK'),\n        (e[(e.NUMBER_SIGN = 35)] = 'NUMBER_SIGN'),\n        (e[(e.AMPERSAND = 38)] = 'AMPERSAND'),\n        (e[(e.APOSTROPHE = 39)] = 'APOSTROPHE'),\n        (e[(e.HYPHEN_MINUS = 45)] = 'HYPHEN_MINUS'),\n        (e[(e.SOLIDUS = 47)] = 'SOLIDUS'),\n        (e[(e.DIGIT_0 = 48)] = 'DIGIT_0'),\n        (e[(e.DIGIT_9 = 57)] = 'DIGIT_9'),\n        (e[(e.SEMICOLON = 59)] = 'SEMICOLON'),\n        (e[(e.LESS_THAN_SIGN = 60)] = 'LESS_THAN_SIGN'),\n        (e[(e.EQUALS_SIGN = 61)] = 'EQUALS_SIGN'),\n        (e[(e.GREATER_THAN_SIGN = 62)] = 'GREATER_THAN_SIGN'),\n        (e[(e.QUESTION_MARK = 63)] = 'QUESTION_MARK'),\n        (e[(e.LATIN_CAPITAL_A = 65)] = 'LATIN_CAPITAL_A'),\n        (e[(e.LATIN_CAPITAL_F = 70)] = 'LATIN_CAPITAL_F'),\n        (e[(e.LATIN_CAPITAL_X = 88)] = 'LATIN_CAPITAL_X'),\n        (e[(e.LATIN_CAPITAL_Z = 90)] = 'LATIN_CAPITAL_Z'),\n        (e[(e.RIGHT_SQUARE_BRACKET = 93)] = 'RIGHT_SQUARE_BRACKET'),\n        (e[(e.GRAVE_ACCENT = 96)] = 'GRAVE_ACCENT'),\n        (e[(e.LATIN_SMALL_A = 97)] = 'LATIN_SMALL_A'),\n        (e[(e.LATIN_SMALL_F = 102)] = 'LATIN_SMALL_F'),\n        (e[(e.LATIN_SMALL_X = 120)] = 'LATIN_SMALL_X'),\n        (e[(e.LATIN_SMALL_Z = 122)] = 'LATIN_SMALL_Z'),\n        (e[(e.REPLACEMENT_CHARACTER = 65533)] = 'REPLACEMENT_CHARACTER'));\n    })((ar = ar || {})),\n    '--'),\n  cr = '[CDATA[',\n  ur = 'doctype',\n  lr = 'script',\n  hr = 'public',\n  fr = 'system';\nfunction pr(e) {\n  return 55296 <= e && e <= 57343;\n}\nfunction dr(e) {\n  return (32 !== e && 10 !== e && 13 !== e && 9 !== e && 12 !== e && 1 <= e && e <= 31) || (127 <= e && e <= 159);\n}\nfunction mr(e) {\n  return (64976 <= e && e <= 65007) || ir.has(e);\n}\n!(function (e) {\n  ((e.controlCharacterInInputStream = 'control-character-in-input-stream'),\n    (e.noncharacterInInputStream = 'noncharacter-in-input-stream'),\n    (e.surrogateInInputStream = 'surrogate-in-input-stream'),\n    (e.nonVoidHtmlElementStartTagWithTrailingSolidus = 'non-void-html-element-start-tag-with-trailing-solidus'),\n    (e.endTagWithAttributes = 'end-tag-with-attributes'),\n    (e.endTagWithTrailingSolidus = 'end-tag-with-trailing-solidus'),\n    (e.unexpectedSolidusInTag = 'unexpected-solidus-in-tag'),\n    (e.unexpectedNullCharacter = 'unexpected-null-character'),\n    (e.unexpectedQuestionMarkInsteadOfTagName = 'unexpected-question-mark-instead-of-tag-name'),\n    (e.invalidFirstCharacterOfTagName = 'invalid-first-character-of-tag-name'),\n    (e.unexpectedEqualsSignBeforeAttributeName = 'unexpected-equals-sign-before-attribute-name'),\n    (e.missingEndTagName = 'missing-end-tag-name'),\n    (e.unexpectedCharacterInAttributeName = 'unexpected-character-in-attribute-name'),\n    (e.unknownNamedCharacterReference = 'unknown-named-character-reference'),\n    (e.missingSemicolonAfterCharacterReference = 'missing-semicolon-after-character-reference'),\n    (e.unexpectedCharacterAfterDoctypeSystemIdentifier = 'unexpected-character-after-doctype-system-identifier'),\n    (e.unexpectedCharacterInUnquotedAttributeValue = 'unexpected-character-in-unquoted-attribute-value'),\n    (e.eofBeforeTagName = 'eof-before-tag-name'),\n    (e.eofInTag = 'eof-in-tag'),\n    (e.missingAttributeValue = 'missing-attribute-value'),\n    (e.missingWhitespaceBetweenAttributes = 'missing-whitespace-between-attributes'),\n    (e.missingWhitespaceAfterDoctypePublicKeyword = 'missing-whitespace-after-doctype-public-keyword'),\n    (e.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers =\n      'missing-whitespace-between-doctype-public-and-system-identifiers'),\n    (e.missingWhitespaceAfterDoctypeSystemKeyword = 'missing-whitespace-after-doctype-system-keyword'),\n    (e.missingQuoteBeforeDoctypePublicIdentifier = 'missing-quote-before-doctype-public-identifier'),\n    (e.missingQuoteBeforeDoctypeSystemIdentifier = 'missing-quote-before-doctype-system-identifier'),\n    (e.missingDoctypePublicIdentifier = 'missing-doctype-public-identifier'),\n    (e.missingDoctypeSystemIdentifier = 'missing-doctype-system-identifier'),\n    (e.abruptDoctypePublicIdentifier = 'abrupt-doctype-public-identifier'),\n    (e.abruptDoctypeSystemIdentifier = 'abrupt-doctype-system-identifier'),\n    (e.cdataInHtmlContent = 'cdata-in-html-content'),\n    (e.incorrectlyOpenedComment = 'incorrectly-opened-comment'),\n    (e.eofInScriptHtmlCommentLikeText = 'eof-in-script-html-comment-like-text'),\n    (e.eofInDoctype = 'eof-in-doctype'),\n    (e.nestedComment = 'nested-comment'),\n    (e.abruptClosingOfEmptyComment = 'abrupt-closing-of-empty-comment'),\n    (e.eofInComment = 'eof-in-comment'),\n    (e.incorrectlyClosedComment = 'incorrectly-closed-comment'),\n    (e.eofInCdata = 'eof-in-cdata'),\n    (e.absenceOfDigitsInNumericCharacterReference = 'absence-of-digits-in-numeric-character-reference'),\n    (e.nullCharacterReference = 'null-character-reference'),\n    (e.surrogateCharacterReference = 'surrogate-character-reference'),\n    (e.characterReferenceOutsideUnicodeRange = 'character-reference-outside-unicode-range'),\n    (e.controlCharacterReference = 'control-character-reference'),\n    (e.noncharacterCharacterReference = 'noncharacter-character-reference'),\n    (e.missingWhitespaceBeforeDoctypeName = 'missing-whitespace-before-doctype-name'),\n    (e.missingDoctypeName = 'missing-doctype-name'),\n    (e.invalidCharacterSequenceAfterDoctypeName = 'invalid-character-sequence-after-doctype-name'),\n    (e.duplicateAttribute = 'duplicate-attribute'),\n    (e.nonConformingDoctype = 'non-conforming-doctype'),\n    (e.missingDoctype = 'missing-doctype'),\n    (e.misplacedDoctype = 'misplaced-doctype'),\n    (e.endTagWithoutMatchingOpenElement = 'end-tag-without-matching-open-element'),\n    (e.closingOfElementWithOpenChildElements = 'closing-of-element-with-open-child-elements'),\n    (e.disallowedContentInNoscriptInHead = 'disallowed-content-in-noscript-in-head'),\n    (e.openElementsLeftAfterEof = 'open-elements-left-after-eof'),\n    (e.abandonedHeadElementChild = 'abandoned-head-element-child'),\n    (e.misplacedStartTagForHeadElement = 'misplaced-start-tag-for-head-element'),\n    (e.nestedNoscriptInHead = 'nested-noscript-in-head'),\n    (e.eofInElementThatCanContainOnlyText = 'eof-in-element-that-can-contain-only-text'));\n})((_r = _r || {}));\nclass Er {\n  constructor(e) {\n    ((this.handler = e),\n      (this.html = ''),\n      (this.pos = -1),\n      (this.lastGapPos = -2),\n      (this.gapStack = []),\n      (this.skipNextNewLine = !1),\n      (this.lastChunkWritten = !1),\n      (this.endOfChunkHit = !1),\n      (this.bufferWaterline = 65536),\n      (this.isEol = !1),\n      (this.lineStartPos = 0),\n      (this.droppedBufferSize = 0),\n      (this.line = 1),\n      (this.lastErrOffset = -1));\n  }\n  get col() {\n    return this.pos - this.lineStartPos + Number(this.lastGapPos !== this.pos);\n  }\n  get offset() {\n    return this.droppedBufferSize + this.pos;\n  }\n  getError(e) {\n    var { line: t, col: n, offset: r } = this;\n    return { code: e, startLine: t, endLine: t, startCol: n, endCol: n, startOffset: r, endOffset: r };\n  }\n  _err(e) {\n    this.handler.onParseError &&\n      this.lastErrOffset !== this.offset &&\n      ((this.lastErrOffset = this.offset), this.handler.onParseError(this.getError(e)));\n  }\n  _addGap() {\n    (this.gapStack.push(this.lastGapPos), (this.lastGapPos = this.pos));\n  }\n  _processSurrogate(e) {\n    if (this.pos !== this.html.length - 1) {\n      var t = this.html.charCodeAt(this.pos + 1);\n      if (56320 <= t && t <= 57343) return (this.pos++, this._addGap(), 1024 * (e - 55296) + 9216 + t);\n    } else if (!this.lastChunkWritten) return ((this.endOfChunkHit = !0), ar.EOF);\n    return (this._err(_r.surrogateInInputStream), e);\n  }\n  willDropParsedChunk() {\n    return this.pos > this.bufferWaterline;\n  }\n  dropParsedChunk() {\n    this.willDropParsedChunk() &&\n      ((this.html = this.html.substring(this.pos)),\n      (this.lineStartPos -= this.pos),\n      (this.droppedBufferSize += this.pos),\n      (this.pos = 0),\n      (this.lastGapPos = -2),\n      (this.gapStack.length = 0));\n  }\n  write(e, t) {\n    (0 < this.html.length ? (this.html += e) : (this.html = e), (this.endOfChunkHit = !1), (this.lastChunkWritten = t));\n  }\n  insertHtmlAtCurrentPos(e) {\n    ((this.html = this.html.substring(0, this.pos + 1) + e + this.html.substring(this.pos + 1)),\n      (this.endOfChunkHit = !1));\n  }\n  startsWith(e, t) {\n    if (this.pos + e.length > this.html.length) return ((this.endOfChunkHit = !this.lastChunkWritten), !1);\n    if (t) return this.html.startsWith(e, this.pos);\n    for (let t = 0; t < e.length; t++) if ((32 | this.html.charCodeAt(this.pos + t)) !== e.charCodeAt(t)) return !1;\n    return !0;\n  }\n  peek(e) {\n    return (e = this.pos + e) >= this.html.length\n      ? ((this.endOfChunkHit = !this.lastChunkWritten), ar.EOF)\n      : (e = this.html.charCodeAt(e)) === ar.CARRIAGE_RETURN\n        ? ar.LINE_FEED\n        : e;\n  }\n  advance() {\n    if (\n      (this.pos++,\n      this.isEol && ((this.isEol = !1), this.line++, (this.lineStartPos = this.pos)),\n      this.pos >= this.html.length)\n    )\n      return ((this.endOfChunkHit = !this.lastChunkWritten), ar.EOF);\n    let e = this.html.charCodeAt(this.pos);\n    return e === ar.CARRIAGE_RETURN\n      ? ((this.isEol = !0), (this.skipNextNewLine = !0), ar.LINE_FEED)\n      : e === ar.LINE_FEED && ((this.isEol = !0), this.skipNextNewLine)\n        ? (this.line--, (this.skipNextNewLine = !1), this._addGap(), this.advance())\n        : ((this.skipNextNewLine = !1),\n          pr(e) && (e = this._processSurrogate(e)),\n          null === this.handler.onParseError ||\n            (31 < e && e < 127) ||\n            e === ar.LINE_FEED ||\n            e === ar.CARRIAGE_RETURN ||\n            (159 < e && e < 64976) ||\n            this._checkForProblematicCharacters(e),\n          e);\n  }\n  _checkForProblematicCharacters(e) {\n    dr(e) ? this._err(_r.controlCharacterInInputStream) : mr(e) && this._err(_r.noncharacterInInputStream);\n  }\n  retreat(e) {\n    for (this.pos -= e; this.pos < this.lastGapPos; ) ((this.lastGapPos = this.gapStack.pop()), this.pos--);\n    this.isEol = !1;\n  }\n}\nfunction Ar(e, t) {\n  for (let n = e.attrs.length - 1; 0 <= n; n--) if (e.attrs[n].name === t) return e.attrs[n].value;\n  return null;\n}\n!(function (e) {\n  ((e[(e.CHARACTER = 0)] = 'CHARACTER'),\n    (e[(e.NULL_CHARACTER = 1)] = 'NULL_CHARACTER'),\n    (e[(e.WHITESPACE_CHARACTER = 2)] = 'WHITESPACE_CHARACTER'),\n    (e[(e.START_TAG = 3)] = 'START_TAG'),\n    (e[(e.END_TAG = 4)] = 'END_TAG'),\n    (e[(e.COMMENT = 5)] = 'COMMENT'),\n    (e[(e.DOCTYPE = 6)] = 'DOCTYPE'),\n    (e[(e.EOF = 7)] = 'EOF'),\n    (e[(e.HIBERNATION = 8)] = 'HIBERNATION'));\n})((Tr = Tr || {}));\nvar gr =\n  'undefined' != typeof globalThis\n    ? globalThis\n    : 'undefined' != typeof window\n      ? window\n      : 'undefined' != typeof global\n        ? global\n        : 'undefined' != typeof self\n          ? self\n          : {};\nfunction vr() {\n  throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs');\n}\nfunction yr(e) {\n  return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, 'default') ? e.default : e;\n}\nfunction Sr(e, t) {\n  return (e((t = { exports: {} }), t.exports), t.exports);\n}\nvar Cr = Sr(function (e, t) {\n    (Object.defineProperty(t, '__esModule', { value: !0 }),\n      (t.default = new Uint16Array(\n        'ᵁ<Õıʊҝջאٵ۞ޢߖࠏ੊ઑඡ๭༉༦჊ረዡᐕᒝᓃᓟᔥ\\0\\0\\0\\0\\0\\0ᕫᛍᦍᰒᷝ὾⁠↰⊍⏀⏻⑂⠤⤒ⴈ⹈⿎〖㊺㘹㞬㣾㨨㩱㫠㬮ࠀEMabcfglmnoprstu\\\\bfms¦³¹ÈÏlig耻Æ䃆P耻&䀦cute耻Á䃁reve;䄂Āiyx}rc耻Â䃂;䐐r;쀀𝔄rave耻À䃀pha;䎑acr;䄀d;橓Āgp¡on;䄄f;쀀𝔸plyFunction;恡ing耻Å䃅Ācs¾Ãr;쀀𝒜ign;扔ilde耻Ã䃃ml耻Ä䃄ЀaceforsuåûþėĜĢħĪĀcrêòkslash;或Ŷöø;櫧ed;挆y;䐑ƀcrtąċĔause;戵noullis;愬a;䎒r;쀀𝔅pf;쀀𝔹eve;䋘còēmpeq;扎܀HOacdefhilorsuōőŖƀƞƢƵƷƺǜȕɳɸɾcy;䐧PY耻©䂩ƀcpyŝŢźute;䄆Ā;iŧŨ拒talDifferentialD;慅leys;愭ȀaeioƉƎƔƘron;䄌dil耻Ç䃇rc;䄈nint;戰ot;䄊ĀdnƧƭilla;䂸terDot;䂷òſi;䎧rcleȀDMPTǇǋǑǖot;抙inus;抖lus;投imes;抗oĀcsǢǸkwiseContourIntegral;戲eCurlyĀDQȃȏoubleQuote;思uote;怙ȀlnpuȞȨɇɕonĀ;eȥȦ户;橴ƀgitȯȶȺruent;扡nt;戯ourIntegral;戮ĀfrɌɎ;愂oduct;成nterClockwiseContourIntegral;戳oss;樯cr;쀀𝒞pĀ;Cʄʅ拓ap;才րDJSZacefiosʠʬʰʴʸˋ˗ˡ˦̳ҍĀ;oŹʥtrahd;椑cy;䐂cy;䐅cy;䐏ƀgrsʿ˄ˇger;怡r;憡hv;櫤Āayː˕ron;䄎;䐔lĀ;t˝˞戇a;䎔r;쀀𝔇Āaf˫̧Ācm˰̢riticalȀADGT̖̜̀̆cute;䂴oŴ̋̍;䋙bleAcute;䋝rave;䁠ilde;䋜ond;拄ferentialD;慆Ѱ̽\\0\\0\\0͔͂\\0Ѕf;쀀𝔻ƀ;DE͈͉͍䂨ot;惜qual;扐blèCDLRUVͣͲ΂ϏϢϸontourIntegraìȹoɴ͹\\0\\0ͻ»͉nArrow;懓Āeo·ΤftƀARTΐΖΡrrow;懐ightArrow;懔eåˊngĀLRΫτeftĀARγιrrow;柸ightArrow;柺ightArrow;柹ightĀATϘϞrrow;懒ee;抨pɁϩ\\0\\0ϯrrow;懑ownArrow;懕erticalBar;戥ǹABLRTaВЪаўѿͼrrowƀ;BUНОТ憓ar;椓pArrow;懵reve;䌑eft˒к\\0ц\\0ѐightVector;楐eeVector;楞ectorĀ;Bљњ憽ar;楖ightǔѧ\\0ѱeeVector;楟ectorĀ;BѺѻ懁ar;楗eeĀ;A҆҇护rrow;憧ĀctҒҗr;쀀𝒟rok;䄐ࠀNTacdfglmopqstuxҽӀӄӋӞӢӧӮӵԡԯԶՒ՝ՠեG;䅊H耻Ð䃐cute耻É䃉ƀaiyӒӗӜron;䄚rc耻Ê䃊;䐭ot;䄖r;쀀𝔈rave耻È䃈ement;戈ĀapӺӾcr;䄒tyɓԆ\\0\\0ԒmallSquare;旻erySmallSquare;斫ĀgpԦԪon;䄘f;쀀𝔼silon;䎕uĀaiԼՉlĀ;TՂՃ橵ilde;扂librium;懌Āci՗՚r;愰m;橳a;䎗ml耻Ë䃋Āipժկsts;戃onentialE;慇ʀcfiosօֈ֍ֲ׌y;䐤r;쀀𝔉lledɓ֗\\0\\0֣mallSquare;旼erySmallSquare;斪Ͱֺ\\0ֿ\\0\\0ׄf;쀀𝔽All;戀riertrf;愱cò׋؀JTabcdfgorstר׬ׯ׺؀ؒؖ؛؝أ٬ٲcy;䐃耻>䀾mmaĀ;d׷׸䎓;䏜reve;䄞ƀeiy؇،ؐdil;䄢rc;䄜;䐓ot;䄠r;쀀𝔊;拙pf;쀀𝔾eater̀EFGLSTصلَٖٛ٦qualĀ;Lؾؿ扥ess;招ullEqual;执reater;檢ess;扷lantEqual;橾ilde;扳cr;쀀𝒢;扫ЀAacfiosuڅڋږڛڞڪھۊRDcy;䐪Āctڐڔek;䋇;䁞irc;䄤r;愌lbertSpace;愋ǰگ\\0ڲf;愍izontalLine;攀Āctۃۅòکrok;䄦mpńېۘownHumðįqual;扏܀EJOacdfgmnostuۺ۾܃܇܎ܚܞܡܨ݄ݸދޏޕcy;䐕lig;䄲cy;䐁cute耻Í䃍Āiyܓܘrc耻Î䃎;䐘ot;䄰r;愑rave耻Ì䃌ƀ;apܠܯܿĀcgܴܷr;䄪inaryI;慈lieóϝǴ݉\\0ݢĀ;eݍݎ戬Āgrݓݘral;戫section;拂isibleĀCTݬݲomma;恣imes;恢ƀgptݿރވon;䄮f;쀀𝕀a;䎙cr;愐ilde;䄨ǫޚ\\0ޞcy;䐆l耻Ï䃏ʀcfosuެ޷޼߂ߐĀiyޱ޵rc;䄴;䐙r;쀀𝔍pf;쀀𝕁ǣ߇\\0ߌr;쀀𝒥rcy;䐈kcy;䐄΀HJacfosߤߨ߽߬߱ࠂࠈcy;䐥cy;䐌ppa;䎚Āey߶߻dil;䄶;䐚r;쀀𝔎pf;쀀𝕂cr;쀀𝒦րJTaceflmostࠥࠩࠬࡐࡣ঳সে্਷ੇcy;䐉耻<䀼ʀcmnpr࠷࠼ࡁࡄࡍute;䄹bda;䎛g;柪lacetrf;愒r;憞ƀaeyࡗ࡜ࡡron;䄽dil;䄻;䐛Āfsࡨ॰tԀACDFRTUVarࡾࢩࢱࣦ࣠ࣼयज़ΐ४Ānrࢃ࢏gleBracket;柨rowƀ;BR࢙࢚࢞憐ar;懤ightArrow;懆eiling;挈oǵࢷ\\0ࣃbleBracket;柦nǔࣈ\\0࣒eeVector;楡ectorĀ;Bࣛࣜ懃ar;楙loor;挊ightĀAV࣯ࣵrrow;憔ector;楎Āerँगeƀ;AVउऊऐ抣rrow;憤ector;楚iangleƀ;BEतथऩ抲ar;槏qual;抴pƀDTVषूौownVector;楑eeVector;楠ectorĀ;Bॖॗ憿ar;楘ectorĀ;B॥०憼ar;楒ightáΜs̀EFGLSTॾঋকঝঢভqualGreater;拚ullEqual;扦reater;扶ess;檡lantEqual;橽ilde;扲r;쀀𝔏Ā;eঽা拘ftarrow;懚idot;䄿ƀnpw৔ਖਛgȀLRlr৞৷ਂਐeftĀAR০৬rrow;柵ightArrow;柷ightArrow;柶eftĀarγਊightáοightáϊf;쀀𝕃erĀLRਢਬeftArrow;憙ightArrow;憘ƀchtਾੀੂòࡌ;憰rok;䅁;扪Ѐacefiosuਗ਼੝੠੷੼અઋ઎p;椅y;䐜Ādl੥੯iumSpace;恟lintrf;愳r;쀀𝔐nusPlus;戓pf;쀀𝕄cò੶;䎜ҀJacefostuણધભીଔଙඑ඗ඞcy;䐊cute;䅃ƀaey઴હાron;䅇dil;䅅;䐝ƀgswે૰଎ativeƀMTV૓૟૨ediumSpace;怋hiĀcn૦૘ë૙eryThiî૙tedĀGL૸ଆreaterGreateòٳessLesóੈLine;䀊r;쀀𝔑ȀBnptଢନଷ଺reak;恠BreakingSpace;䂠f;愕ڀ;CDEGHLNPRSTV୕ୖ୪୼஡௫ఄ౞಄ದ೘ൡඅ櫬Āou୛୤ngruent;扢pCap;扭oubleVerticalBar;戦ƀlqxஃஊ஛ement;戉ualĀ;Tஒஓ扠ilde;쀀≂̸ists;戄reater΀;EFGLSTஶஷ஽௉௓௘௥扯qual;扱ullEqual;쀀≧̸reater;쀀≫̸ess;批lantEqual;쀀⩾̸ilde;扵umpń௲௽ownHump;쀀≎̸qual;쀀≏̸eĀfsఊధtTriangleƀ;BEచఛడ拪ar;쀀⧏̸qual;括s̀;EGLSTవశ఼ౄోౘ扮qual;扰reater;扸ess;쀀≪̸lantEqual;쀀⩽̸ilde;扴estedĀGL౨౹reaterGreater;쀀⪢̸essLess;쀀⪡̸recedesƀ;ESಒಓಛ技qual;쀀⪯̸lantEqual;拠ĀeiಫಹverseElement;戌ghtTriangleƀ;BEೋೌ೒拫ar;쀀⧐̸qual;拭ĀquೝഌuareSuĀbp೨೹setĀ;E೰ೳ쀀⊏̸qual;拢ersetĀ;Eഃആ쀀⊐̸qual;拣ƀbcpഓതൎsetĀ;Eഛഞ쀀⊂⃒qual;抈ceedsȀ;ESTലള഻െ抁qual;쀀⪰̸lantEqual;拡ilde;쀀≿̸ersetĀ;E൘൛쀀⊃⃒qual;抉ildeȀ;EFT൮൯൵ൿ扁qual;扄ullEqual;扇ilde;扉erticalBar;戤cr;쀀𝒩ilde耻Ñ䃑;䎝܀Eacdfgmoprstuvලෂ෉෕ෛ෠෧෼ขภยา฿ไlig;䅒cute耻Ó䃓Āiy෎ීrc耻Ô䃔;䐞blac;䅐r;쀀𝔒rave耻Ò䃒ƀaei෮ෲ෶cr;䅌ga;䎩cron;䎟pf;쀀𝕆enCurlyĀDQฎบoubleQuote;怜uote;怘;橔Āclวฬr;쀀𝒪ash耻Ø䃘iŬื฼de耻Õ䃕es;樷ml耻Ö䃖erĀBP๋๠Āar๐๓r;怾acĀek๚๜;揞et;掴arenthesis;揜Ҁacfhilors๿ງຊຏຒດຝະ໼rtialD;戂y;䐟r;쀀𝔓i;䎦;䎠usMinus;䂱Āipຢອncareplanåڝf;愙Ȁ;eio຺ູ໠໤檻cedesȀ;EST່້໏໚扺qual;檯lantEqual;扼ilde;找me;怳Ādp໩໮uct;戏ortionĀ;aȥ໹l;戝Āci༁༆r;쀀𝒫;䎨ȀUfos༑༖༛༟OT耻\"䀢r;쀀𝔔pf;愚cr;쀀𝒬؀BEacefhiorsu༾གྷཇའཱིྦྷྪྭ႖ႩႴႾarr;椐G耻®䂮ƀcnrཎནབute;䅔g;柫rĀ;tཛྷཝ憠l;椖ƀaeyཧཬཱron;䅘dil;䅖;䐠Ā;vླྀཹ愜erseĀEUྂྙĀlq྇ྎement;戋uilibrium;懋pEquilibrium;楯r»ཹo;䎡ghtЀACDFTUVa࿁࿫࿳ဢဨၛႇϘĀnr࿆࿒gleBracket;柩rowƀ;BL࿜࿝࿡憒ar;懥eftArrow;懄eiling;按oǵ࿹\\0စbleBracket;柧nǔည\\0နeeVector;楝ectorĀ;Bဝသ懂ar;楕loor;挋Āerိ၃eƀ;AVဵံြ抢rrow;憦ector;楛iangleƀ;BEၐၑၕ抳ar;槐qual;抵pƀDTVၣၮၸownVector;楏eeVector;楜ectorĀ;Bႂႃ憾ar;楔ectorĀ;B႑႒懀ar;楓Āpuႛ႞f;愝ndImplies;楰ightarrow;懛ĀchႹႼr;愛;憱leDelayed;槴ڀHOacfhimoqstuფჱჷჽᄙᄞᅑᅖᅡᅧᆵᆻᆿĀCcჩხHcy;䐩y;䐨FTcy;䐬cute;䅚ʀ;aeiyᄈᄉᄎᄓᄗ檼ron;䅠dil;䅞rc;䅜;䐡r;쀀𝔖ortȀDLRUᄪᄴᄾᅉownArrow»ОeftArrow»࢚ightArrow»࿝pArrow;憑gma;䎣allCircle;战pf;쀀𝕊ɲᅭ\\0\\0ᅰt;戚areȀ;ISUᅻᅼᆉᆯ斡ntersection;抓uĀbpᆏᆞsetĀ;Eᆗᆘ抏qual;抑ersetĀ;Eᆨᆩ抐qual;抒nion;抔cr;쀀𝒮ar;拆ȀbcmpᇈᇛሉላĀ;sᇍᇎ拐etĀ;Eᇍᇕqual;抆ĀchᇠህeedsȀ;ESTᇭᇮᇴᇿ扻qual;檰lantEqual;扽ilde;承Tháྌ;我ƀ;esሒሓሣ拑rsetĀ;Eሜም抃qual;抇et»ሓրHRSacfhiorsሾቄ቉ቕ቞ቱቶኟዂወዑORN耻Þ䃞ADE;愢ĀHc቎ቒcy;䐋y;䐦Ābuቚቜ;䀉;䎤ƀaeyብቪቯron;䅤dil;䅢;䐢r;쀀𝔗Āeiቻ኉ǲኀ\\0ኇefore;戴a;䎘Ācn኎ኘkSpace;쀀  Space;怉ldeȀ;EFTካኬኲኼ戼qual;扃ullEqual;扅ilde;扈pf;쀀𝕋ipleDot;惛Āctዖዛr;쀀𝒯rok;䅦ૡዷጎጚጦ\\0ጬጱ\\0\\0\\0\\0\\0ጸጽ፷ᎅ\\0᏿ᐄᐊᐐĀcrዻጁute耻Ú䃚rĀ;oጇገ憟cir;楉rǣጓ\\0጖y;䐎ve;䅬Āiyጞጣrc耻Û䃛;䐣blac;䅰r;쀀𝔘rave耻Ù䃙acr;䅪Ādiፁ፩erĀBPፈ፝Āarፍፐr;䁟acĀekፗፙ;揟et;掵arenthesis;揝onĀ;P፰፱拃lus;抎Āgp፻፿on;䅲f;쀀𝕌ЀADETadps᎕ᎮᎸᏄϨᏒᏗᏳrrowƀ;BDᅐᎠᎤar;椒ownArrow;懅ownArrow;憕quilibrium;楮eeĀ;AᏋᏌ报rrow;憥ownáϳerĀLRᏞᏨeftArrow;憖ightArrow;憗iĀ;lᏹᏺ䏒on;䎥ing;䅮cr;쀀𝒰ilde;䅨ml耻Ü䃜ҀDbcdefosvᐧᐬᐰᐳᐾᒅᒊᒐᒖash;披ar;櫫y;䐒ashĀ;lᐻᐼ抩;櫦Āerᑃᑅ;拁ƀbtyᑌᑐᑺar;怖Ā;iᑏᑕcalȀBLSTᑡᑥᑪᑴar;戣ine;䁼eparator;杘ilde;所ThinSpace;怊r;쀀𝔙pf;쀀𝕍cr;쀀𝒱dash;抪ʀcefosᒧᒬᒱᒶᒼirc;䅴dge;拀r;쀀𝔚pf;쀀𝕎cr;쀀𝒲Ȁfiosᓋᓐᓒᓘr;쀀𝔛;䎞pf;쀀𝕏cr;쀀𝒳ҀAIUacfosuᓱᓵᓹᓽᔄᔏᔔᔚᔠcy;䐯cy;䐇cy;䐮cute耻Ý䃝Āiyᔉᔍrc;䅶;䐫r;쀀𝔜pf;쀀𝕐cr;쀀𝒴ml;䅸ЀHacdefosᔵᔹᔿᕋᕏᕝᕠᕤcy;䐖cute;䅹Āayᕄᕉron;䅽;䐗ot;䅻ǲᕔ\\0ᕛoWidtè૙a;䎖r;愨pf;愤cr;쀀𝒵௡ᖃᖊᖐ\\0ᖰᖶᖿ\\0\\0\\0\\0ᗆᗛᗫᙟ᙭\\0ᚕ᚛ᚲᚹ\\0ᚾcute耻á䃡reve;䄃̀;Ediuyᖜᖝᖡᖣᖨᖭ戾;쀀∾̳;房rc耻â䃢te肻´̆;䐰lig耻æ䃦Ā;r²ᖺ;쀀𝔞rave耻à䃠ĀepᗊᗖĀfpᗏᗔsym;愵èᗓha;䎱ĀapᗟcĀclᗤᗧr;䄁g;樿ɤᗰ\\0\\0ᘊʀ;adsvᗺᗻᗿᘁᘇ戧nd;橕;橜lope;橘;橚΀;elmrszᘘᘙᘛᘞᘿᙏᙙ戠;榤e»ᘙsdĀ;aᘥᘦ戡ѡᘰᘲᘴᘶᘸᘺᘼᘾ;榨;榩;榪;榫;榬;榭;榮;榯tĀ;vᙅᙆ戟bĀ;dᙌᙍ抾;榝Āptᙔᙗh;戢»¹arr;捼Āgpᙣᙧon;䄅f;쀀𝕒΀;Eaeiop዁ᙻᙽᚂᚄᚇᚊ;橰cir;橯;扊d;手s;䀧roxĀ;e዁ᚒñᚃing耻å䃥ƀctyᚡᚦᚨr;쀀𝒶;䀪mpĀ;e዁ᚯñʈilde耻ã䃣ml耻ä䃤Āciᛂᛈoninôɲnt;樑ࠀNabcdefiklnoprsu᛭ᛱᜰ᜼ᝃᝈ᝸᝽០៦ᠹᡐᜍ᤽᥈ᥰot;櫭Ācrᛶ᜞kȀcepsᜀᜅᜍᜓong;扌psilon;䏶rime;怵imĀ;e᜚᜛戽q;拍Ŷᜢᜦee;抽edĀ;gᜬᜭ挅e»ᜭrkĀ;t፜᜷brk;掶Āoyᜁᝁ;䐱quo;怞ʀcmprtᝓ᝛ᝡᝤᝨausĀ;eĊĉptyv;榰séᜌnoõēƀahwᝯ᝱ᝳ;䎲;愶een;扬r;쀀𝔟g΀costuvwឍឝឳេ៕៛៞ƀaiuបពរðݠrc;旯p»፱ƀdptឤឨឭot;樀lus;樁imes;樂ɱឹ\\0\\0ើcup;樆ar;昅riangleĀdu៍្own;施p;斳plus;樄eåᑄåᒭarow;植ƀako៭ᠦᠵĀcn៲ᠣkƀlst៺֫᠂ozenge;槫riangleȀ;dlr᠒᠓᠘᠝斴own;斾eft;旂ight;斸k;搣Ʊᠫ\\0ᠳƲᠯ\\0ᠱ;斒;斑4;斓ck;斈ĀeoᠾᡍĀ;qᡃᡆ쀀=⃥uiv;쀀≡⃥t;挐Ȁptwxᡙᡞᡧᡬf;쀀𝕓Ā;tᏋᡣom»Ꮜtie;拈؀DHUVbdhmptuvᢅᢖᢪᢻᣗᣛᣬ᣿ᤅᤊᤐᤡȀLRlrᢎᢐᢒᢔ;敗;敔;敖;敓ʀ;DUduᢡᢢᢤᢦᢨ敐;敦;敩;敤;敧ȀLRlrᢳᢵᢷᢹ;敝;敚;敜;教΀;HLRhlrᣊᣋᣍᣏᣑᣓᣕ救;敬;散;敠;敫;敢;敟ox;槉ȀLRlrᣤᣦᣨᣪ;敕;敒;攐;攌ʀ;DUduڽ᣷᣹᣻᣽;敥;敨;攬;攴inus;抟lus;択imes;抠ȀLRlrᤙᤛᤝ᤟;敛;敘;攘;攔΀;HLRhlrᤰᤱᤳᤵᤷ᤻᤹攂;敪;敡;敞;攼;攤;攜Āevģ᥂bar耻¦䂦Ȁceioᥑᥖᥚᥠr;쀀𝒷mi;恏mĀ;e᜚᜜lƀ;bhᥨᥩᥫ䁜;槅sub;柈Ŭᥴ᥾lĀ;e᥹᥺怢t»᥺pƀ;Eeįᦅᦇ;檮Ā;qۜۛೡᦧ\\0᧨ᨑᨕᨲ\\0ᨷᩐ\\0\\0᪴\\0\\0᫁\\0\\0ᬡᬮ᭍᭒\\0᯽\\0ᰌƀcpr᦭ᦲ᧝ute;䄇̀;abcdsᦿᧀᧄ᧊᧕᧙戩nd;橄rcup;橉Āau᧏᧒p;橋p;橇ot;橀;쀀∩︀Āeo᧢᧥t;恁îړȀaeiu᧰᧻ᨁᨅǰ᧵\\0᧸s;橍on;䄍dil耻ç䃧rc;䄉psĀ;sᨌᨍ橌m;橐ot;䄋ƀdmnᨛᨠᨦil肻¸ƭptyv;榲t脀¢;eᨭᨮ䂢räƲr;쀀𝔠ƀceiᨽᩀᩍy;䑇ckĀ;mᩇᩈ朓ark»ᩈ;䏇r΀;Ecefms᩟᩠ᩢᩫ᪤᪪᪮旋;槃ƀ;elᩩᩪᩭ䋆q;扗eɡᩴ\\0\\0᪈rrowĀlr᩼᪁eft;憺ight;憻ʀRSacd᪒᪔᪖᪚᪟»ཇ;擈st;抛irc;抚ash;抝nint;樐id;櫯cir;槂ubsĀ;u᪻᪼晣it»᪼ˬ᫇᫔᫺\\0ᬊonĀ;eᫍᫎ䀺Ā;qÇÆɭ᫙\\0\\0᫢aĀ;t᫞᫟䀬;䁀ƀ;fl᫨᫩᫫戁îᅠeĀmx᫱᫶ent»᫩eóɍǧ᫾\\0ᬇĀ;dኻᬂot;橭nôɆƀfryᬐᬔᬗ;쀀𝕔oäɔ脀©;sŕᬝr;愗Āaoᬥᬩrr;憵ss;朗Ācuᬲᬷr;쀀𝒸Ābpᬼ᭄Ā;eᭁᭂ櫏;櫑Ā;eᭉᭊ櫐;櫒dot;拯΀delprvw᭠᭬᭷ᮂᮬᯔ᯹arrĀlr᭨᭪;椸;椵ɰ᭲\\0\\0᭵r;拞c;拟arrĀ;p᭿ᮀ憶;椽̀;bcdosᮏᮐᮖᮡᮥᮨ截rcap;橈Āauᮛᮞp;橆p;橊ot;抍r;橅;쀀∪︀Ȁalrv᮵ᮿᯞᯣrrĀ;mᮼᮽ憷;椼yƀevwᯇᯔᯘqɰᯎ\\0\\0ᯒreã᭳uã᭵ee;拎edge;拏en耻¤䂤earrowĀlrᯮ᯳eft»ᮀight»ᮽeäᯝĀciᰁᰇoninôǷnt;戱lcty;挭ঀAHabcdefhijlorstuwz᰸᰻᰿ᱝᱩᱵᲊᲞᲬᲷ᳻᳿ᴍᵻᶑᶫᶻ᷆᷍rò΁ar;楥Ȁglrs᱈ᱍ᱒᱔ger;怠eth;愸òᄳhĀ;vᱚᱛ怐»ऊūᱡᱧarow;椏aã̕Āayᱮᱳron;䄏;䐴ƀ;ao̲ᱼᲄĀgrʿᲁr;懊tseq;橷ƀglmᲑᲔᲘ耻°䂰ta;䎴ptyv;榱ĀirᲣᲨsht;楿;쀀𝔡arĀlrᲳᲵ»ࣜ»သʀaegsv᳂͸᳖᳜᳠mƀ;oș᳊᳔ndĀ;ș᳑uit;晦amma;䏝in;拲ƀ;io᳧᳨᳸䃷de脀÷;o᳧ᳰntimes;拇nø᳷cy;䑒cɯᴆ\\0\\0ᴊrn;挞op;挍ʀlptuwᴘᴝᴢᵉᵕlar;䀤f;쀀𝕕ʀ;emps̋ᴭᴷᴽᵂqĀ;d͒ᴳot;扑inus;戸lus;戔quare;抡blebarwedgåúnƀadhᄮᵝᵧownarrowóᲃarpoonĀlrᵲᵶefôᲴighôᲶŢᵿᶅkaro÷གɯᶊ\\0\\0ᶎrn;挟op;挌ƀcotᶘᶣᶦĀryᶝᶡ;쀀𝒹;䑕l;槶rok;䄑Ādrᶰᶴot;拱iĀ;fᶺ᠖斿Āah᷀᷃ròЩaòྦangle;榦Āci᷒ᷕy;䑟grarr;柿ऀDacdefglmnopqrstuxḁḉḙḸոḼṉṡṾấắẽỡἪἷὄ὎὚ĀDoḆᴴoôᲉĀcsḎḔute耻é䃩ter;橮ȀaioyḢḧḱḶron;䄛rĀ;cḭḮ扖耻ê䃪lon;払;䑍ot;䄗ĀDrṁṅot;扒;쀀𝔢ƀ;rsṐṑṗ檚ave耻è䃨Ā;dṜṝ檖ot;檘Ȁ;ilsṪṫṲṴ檙nters;揧;愓Ā;dṹṺ檕ot;檗ƀapsẅẉẗcr;䄓tyƀ;svẒẓẕ戅et»ẓpĀ1;ẝẤĳạả;怄;怅怃ĀgsẪẬ;䅋p;怂ĀgpẴẸon;䄙f;쀀𝕖ƀalsỄỎỒrĀ;sỊị拕l;槣us;橱iƀ;lvỚớở䎵on»ớ;䏵ȀcsuvỪỳἋἣĀioữḱrc»Ḯɩỹ\\0\\0ỻíՈantĀglἂἆtr»ṝess»Ṻƀaeiἒ἖Ἒls;䀽st;扟vĀ;DȵἠD;橸parsl;槥ĀDaἯἳot;打rr;楱ƀcdiἾὁỸr;愯oô͒ĀahὉὋ;䎷耻ð䃰Āmrὓὗl耻ë䃫o;悬ƀcipὡὤὧl;䀡sôծĀeoὬὴctatioîՙnentialåչৡᾒ\\0ᾞ\\0ᾡᾧ\\0\\0ῆῌ\\0ΐ\\0ῦῪ \\0 ⁚llingdotseñṄy;䑄male;晀ƀilrᾭᾳ῁lig;耀ﬃɩᾹ\\0\\0᾽g;耀ﬀig;耀ﬄ;쀀𝔣lig;耀ﬁlig;쀀fjƀaltῙ῜ῡt;晭ig;耀ﬂns;斱of;䆒ǰ΅\\0ῳf;쀀𝕗ĀakֿῷĀ;vῼ´拔;櫙artint;樍Āao‌⁕Ācs‑⁒α‚‰‸⁅⁈\\0⁐β•‥‧‪‬\\0‮耻½䂽;慓耻¼䂼;慕;慙;慛Ƴ‴\\0‶;慔;慖ʴ‾⁁\\0\\0⁃耻¾䂾;慗;慜5;慘ƶ⁌\\0⁎;慚;慝8;慞l;恄wn;挢cr;쀀𝒻ࢀEabcdefgijlnorstv₂₉₟₥₰₴⃰⃵⃺⃿℃ℒℸ̗ℾ⅒↞Ā;lٍ₇;檌ƀcmpₐₕ₝ute;䇵maĀ;dₜ᳚䎳;檆reve;䄟Āiy₪₮rc;䄝;䐳ot;䄡Ȁ;lqsؾق₽⃉ƀ;qsؾٌ⃄lanô٥Ȁ;cdl٥⃒⃥⃕c;檩otĀ;o⃜⃝檀Ā;l⃢⃣檂;檄Ā;e⃪⃭쀀⋛︀s;檔r;쀀𝔤Ā;gٳ؛mel;愷cy;䑓Ȁ;Eajٚℌℎℐ;檒;檥;檤ȀEaesℛℝ℩ℴ;扩pĀ;p℣ℤ檊rox»ℤĀ;q℮ℯ檈Ā;q℮ℛim;拧pf;쀀𝕘Āci⅃ⅆr;愊mƀ;el٫ⅎ⅐;檎;檐茀>;cdlqr׮ⅠⅪⅮⅳⅹĀciⅥⅧ;檧r;橺ot;拗Par;榕uest;橼ʀadelsↄⅪ←ٖ↛ǰ↉\\0↎proø₞r;楸qĀlqؿ↖lesó₈ií٫Āen↣↭rtneqq;쀀≩︀Å↪ԀAabcefkosy⇄⇇⇱⇵⇺∘∝∯≨≽ròΠȀilmr⇐⇔⇗⇛rsðᒄf»․ilôکĀdr⇠⇤cy;䑊ƀ;cwࣴ⇫⇯ir;楈;憭ar;意irc;䄥ƀalr∁∎∓rtsĀ;u∉∊晥it»∊lip;怦con;抹r;쀀𝔥sĀew∣∩arow;椥arow;椦ʀamopr∺∾≃≞≣rr;懿tht;戻kĀlr≉≓eftarrow;憩ightarrow;憪f;쀀𝕙bar;怕ƀclt≯≴≸r;쀀𝒽asè⇴rok;䄧Ābp⊂⊇ull;恃hen»ᱛૡ⊣\\0⊪\\0⊸⋅⋎\\0⋕⋳\\0\\0⋸⌢⍧⍢⍿\\0⎆⎪⎴cute耻í䃭ƀ;iyݱ⊰⊵rc耻î䃮;䐸Ācx⊼⊿y;䐵cl耻¡䂡ĀfrΟ⋉;쀀𝔦rave耻ì䃬Ȁ;inoܾ⋝⋩⋮Āin⋢⋦nt;樌t;戭fin;槜ta;愩lig;䄳ƀaop⋾⌚⌝ƀcgt⌅⌈⌗r;䄫ƀelpܟ⌏⌓inåގarôܠh;䄱f;抷ed;䆵ʀ;cfotӴ⌬⌱⌽⍁are;愅inĀ;t⌸⌹戞ie;槝doô⌙ʀ;celpݗ⍌⍐⍛⍡al;抺Āgr⍕⍙eróᕣã⍍arhk;樗rod;樼Ȁcgpt⍯⍲⍶⍻y;䑑on;䄯f;쀀𝕚a;䎹uest耻¿䂿Āci⎊⎏r;쀀𝒾nʀ;EdsvӴ⎛⎝⎡ӳ;拹ot;拵Ā;v⎦⎧拴;拳Ā;iݷ⎮lde;䄩ǫ⎸\\0⎼cy;䑖l耻ï䃯̀cfmosu⏌⏗⏜⏡⏧⏵Āiy⏑⏕rc;䄵;䐹r;쀀𝔧ath;䈷pf;쀀𝕛ǣ⏬\\0⏱r;쀀𝒿rcy;䑘kcy;䑔Ѐacfghjos␋␖␢␧␭␱␵␻ppaĀ;v␓␔䎺;䏰Āey␛␠dil;䄷;䐺r;쀀𝔨reen;䄸cy;䑅cy;䑜pf;쀀𝕜cr;쀀𝓀஀ABEHabcdefghjlmnoprstuv⑰⒁⒆⒍⒑┎┽╚▀♎♞♥♹♽⚚⚲⛘❝❨➋⟀⠁⠒ƀart⑷⑺⑼rò৆òΕail;椛arr;椎Ā;gঔ⒋;檋ar;楢ॣ⒥\\0⒪\\0⒱\\0\\0\\0\\0\\0⒵Ⓔ\\0ⓆⓈⓍ\\0⓹ute;䄺mptyv;榴raîࡌbda;䎻gƀ;dlࢎⓁⓃ;榑åࢎ;檅uo耻«䂫rЀ;bfhlpst࢙ⓞⓦⓩ⓫⓮⓱⓵Ā;f࢝ⓣs;椟s;椝ë≒p;憫l;椹im;楳l;憢ƀ;ae⓿─┄檫il;椙Ā;s┉┊檭;쀀⪭︀ƀabr┕┙┝rr;椌rk;杲Āak┢┬cĀek┨┪;䁻;䁛Āes┱┳;榋lĀdu┹┻;榏;榍Ȁaeuy╆╋╖╘ron;䄾Ādi═╔il;䄼ìࢰâ┩;䐻Ȁcqrs╣╦╭╽a;椶uoĀ;rนᝆĀdu╲╷har;楧shar;楋h;憲ʀ;fgqs▋▌উ◳◿扤tʀahlrt▘▤▷◂◨rrowĀ;t࢙□aé⓶arpoonĀdu▯▴own»њp»०eftarrows;懇ightƀahs◍◖◞rrowĀ;sࣴࢧarpoonó྘quigarro÷⇰hreetimes;拋ƀ;qs▋ও◺lanôবʀ;cdgsব☊☍☝☨c;檨otĀ;o☔☕橿Ā;r☚☛檁;檃Ā;e☢☥쀀⋚︀s;檓ʀadegs☳☹☽♉♋pproøⓆot;拖qĀgq♃♅ôউgtò⒌ôছiíলƀilr♕࣡♚sht;楼;쀀𝔩Ā;Eজ♣;檑š♩♶rĀdu▲♮Ā;l॥♳;楪lk;斄cy;䑙ʀ;achtੈ⚈⚋⚑⚖rò◁orneòᴈard;楫ri;旺Āio⚟⚤dot;䅀ustĀ;a⚬⚭掰che»⚭ȀEaes⚻⚽⛉⛔;扨pĀ;p⛃⛄檉rox»⛄Ā;q⛎⛏檇Ā;q⛎⚻im;拦Ѐabnoptwz⛩⛴⛷✚✯❁❇❐Ānr⛮⛱g;柬r;懽rëࣁgƀlmr⛿✍✔eftĀar০✇ightá৲apsto;柼ightá৽parrowĀlr✥✩efô⓭ight;憬ƀafl✶✹✽r;榅;쀀𝕝us;樭imes;樴š❋❏st;戗áፎƀ;ef❗❘᠀旊nge»❘arĀ;l❤❥䀨t;榓ʀachmt❳❶❼➅➇ròࢨorneòᶌarĀ;d྘➃;業;怎ri;抿̀achiqt➘➝ੀ➢➮➻quo;怹r;쀀𝓁mƀ;egল➪➬;檍;檏Ābu┪➳oĀ;rฟ➹;怚rok;䅂萀<;cdhilqrࠫ⟒☹⟜⟠⟥⟪⟰Āci⟗⟙;檦r;橹reå◲mes;拉arr;楶uest;橻ĀPi⟵⟹ar;榖ƀ;ef⠀भ᠛旃rĀdu⠇⠍shar;楊har;楦Āen⠗⠡rtneqq;쀀≨︀Å⠞܀Dacdefhilnopsu⡀⡅⢂⢎⢓⢠⢥⢨⣚⣢⣤ઃ⣳⤂Dot;戺Ȁclpr⡎⡒⡣⡽r耻¯䂯Āet⡗⡙;時Ā;e⡞⡟朠se»⡟Ā;sျ⡨toȀ;dluျ⡳⡷⡻owîҌefôएðᏑker;斮Āoy⢇⢌mma;権;䐼ash;怔asuredangle»ᘦr;쀀𝔪o;愧ƀcdn⢯⢴⣉ro耻µ䂵Ȁ;acdᑤ⢽⣀⣄sôᚧir;櫰ot肻·Ƶusƀ;bd⣒ᤃ⣓戒Ā;uᴼ⣘;横ţ⣞⣡p;櫛ò−ðઁĀdp⣩⣮els;抧f;쀀𝕞Āct⣸⣽r;쀀𝓂pos»ᖝƀ;lm⤉⤊⤍䎼timap;抸ఀGLRVabcdefghijlmoprstuvw⥂⥓⥾⦉⦘⧚⧩⨕⨚⩘⩝⪃⪕⪤⪨⬄⬇⭄⭿⮮ⰴⱧⱼ⳩Āgt⥇⥋;쀀⋙̸Ā;v⥐௏쀀≫⃒ƀelt⥚⥲⥶ftĀar⥡⥧rrow;懍ightarrow;懎;쀀⋘̸Ā;v⥻ే쀀≪⃒ightarrow;懏ĀDd⦎⦓ash;抯ash;抮ʀbcnpt⦣⦧⦬⦱⧌la»˞ute;䅄g;쀀∠⃒ʀ;Eiop඄⦼⧀⧅⧈;쀀⩰̸d;쀀≋̸s;䅉roø඄urĀ;a⧓⧔普lĀ;s⧓ସǳ⧟\\0⧣p肻 ଷmpĀ;e௹ఀʀaeouy⧴⧾⨃⨐⨓ǰ⧹\\0⧻;橃on;䅈dil;䅆ngĀ;dൾ⨊ot;쀀⩭̸p;橂;䐽ash;怓΀;Aadqsxஒ⨩⨭⨻⩁⩅⩐rr;懗rĀhr⨳⨶k;椤Ā;oᏲᏰot;쀀≐̸uiöୣĀei⩊⩎ar;椨í஘istĀ;s஠டr;쀀𝔫ȀEest௅⩦⩹⩼ƀ;qs஼⩭௡ƀ;qs஼௅⩴lanô௢ií௪Ā;rஶ⪁»ஷƀAap⪊⪍⪑rò⥱rr;憮ar;櫲ƀ;svྍ⪜ྌĀ;d⪡⪢拼;拺cy;䑚΀AEadest⪷⪺⪾⫂⫅⫶⫹rò⥦;쀀≦̸rr;憚r;急Ȁ;fqs఻⫎⫣⫯tĀar⫔⫙rro÷⫁ightarro÷⪐ƀ;qs఻⪺⫪lanôౕĀ;sౕ⫴»శiíౝĀ;rవ⫾iĀ;eచథiäඐĀpt⬌⬑f;쀀𝕟膀¬;in⬙⬚⬶䂬nȀ;Edvஉ⬤⬨⬮;쀀⋹̸ot;쀀⋵̸ǡஉ⬳⬵;拷;拶iĀ;vಸ⬼ǡಸ⭁⭃;拾;拽ƀaor⭋⭣⭩rȀ;ast୻⭕⭚⭟lleì୻l;쀀⫽⃥;쀀∂̸lint;樔ƀ;ceಒ⭰⭳uåಥĀ;cಘ⭸Ā;eಒ⭽ñಘȀAait⮈⮋⮝⮧rò⦈rrƀ;cw⮔⮕⮙憛;쀀⤳̸;쀀↝̸ghtarrow»⮕riĀ;eೋೖ΀chimpqu⮽⯍⯙⬄୸⯤⯯Ȁ;cerല⯆ഷ⯉uå൅;쀀𝓃ortɭ⬅\\0\\0⯖ará⭖mĀ;e൮⯟Ā;q൴൳suĀbp⯫⯭å೸åഋƀbcp⯶ⰑⰙȀ;Ees⯿ⰀഢⰄ抄;쀀⫅̸etĀ;eഛⰋqĀ;qണⰀcĀ;eലⰗñസȀ;EesⰢⰣൟⰧ抅;쀀⫆̸etĀ;e൘ⰮqĀ;qൠⰣȀgilrⰽⰿⱅⱇìௗlde耻ñ䃱çృiangleĀlrⱒⱜeftĀ;eచⱚñదightĀ;eೋⱥñ೗Ā;mⱬⱭ䎽ƀ;esⱴⱵⱹ䀣ro;愖p;怇ҀDHadgilrsⲏⲔⲙⲞⲣⲰⲶⳓⳣash;抭arr;椄p;쀀≍⃒ash;抬ĀetⲨⲬ;쀀≥⃒;쀀>⃒nfin;槞ƀAetⲽⳁⳅrr;椂;쀀≤⃒Ā;rⳊⳍ쀀<⃒ie;쀀⊴⃒ĀAtⳘⳜrr;椃rie;쀀⊵⃒im;쀀∼⃒ƀAan⳰⳴ⴂrr;懖rĀhr⳺⳽k;椣Ā;oᏧᏥear;椧ቓ᪕\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0ⴭ\\0ⴸⵈⵠⵥ⵲ⶄᬇ\\0\\0ⶍⶫ\\0ⷈⷎ\\0ⷜ⸙⸫⸾⹃Ācsⴱ᪗ute耻ó䃳ĀiyⴼⵅrĀ;c᪞ⵂ耻ô䃴;䐾ʀabios᪠ⵒⵗǈⵚlac;䅑v;樸old;榼lig;䅓Ācr⵩⵭ir;榿;쀀𝔬ͯ⵹\\0\\0⵼\\0ⶂn;䋛ave耻ò䃲;槁Ābmⶈ෴ar;榵Ȁacitⶕ⶘ⶥⶨrò᪀Āir⶝ⶠr;榾oss;榻nå๒;槀ƀaeiⶱⶵⶹcr;䅍ga;䏉ƀcdnⷀⷅǍron;䎿;榶pf;쀀𝕠ƀaelⷔ⷗ǒr;榷rp;榹΀;adiosvⷪⷫⷮ⸈⸍⸐⸖戨rò᪆Ȁ;efmⷷⷸ⸂⸅橝rĀ;oⷾⷿ愴f»ⷿ耻ª䂪耻º䂺gof;抶r;橖lope;橗;橛ƀclo⸟⸡⸧ò⸁ash耻ø䃸l;折iŬⸯ⸴de耻õ䃵esĀ;aǛ⸺s;樶ml耻ö䃶bar;挽ૡ⹞\\0⹽\\0⺀⺝\\0⺢⺹\\0\\0⻋ຜ\\0⼓\\0\\0⼫⾼\\0⿈rȀ;astЃ⹧⹲຅脀¶;l⹭⹮䂶leìЃɩ⹸\\0\\0⹻m;櫳;櫽y;䐿rʀcimpt⺋⺏⺓ᡥ⺗nt;䀥od;䀮il;怰enk;怱r;쀀𝔭ƀimo⺨⺰⺴Ā;v⺭⺮䏆;䏕maô੶ne;明ƀ;tv⺿⻀⻈䏀chfork»´;䏖Āau⻏⻟nĀck⻕⻝kĀ;h⇴⻛;愎ö⇴sҀ;abcdemst⻳⻴ᤈ⻹⻽⼄⼆⼊⼎䀫cir;樣ir;樢Āouᵀ⼂;樥;橲n肻±ຝim;樦wo;樧ƀipu⼙⼠⼥ntint;樕f;쀀𝕡nd耻£䂣Ԁ;Eaceinosu່⼿⽁⽄⽇⾁⾉⾒⽾⾶;檳p;檷uå໙Ā;c໎⽌̀;acens່⽙⽟⽦⽨⽾pproø⽃urlyeñ໙ñ໎ƀaes⽯⽶⽺pprox;檹qq;檵im;拨iíໟmeĀ;s⾈ຮ怲ƀEas⽸⾐⽺ð⽵ƀdfp໬⾙⾯ƀals⾠⾥⾪lar;挮ine;挒urf;挓Ā;t໻⾴ï໻rel;抰Āci⿀⿅r;쀀𝓅;䏈ncsp;怈̀fiopsu⿚⋢⿟⿥⿫⿱r;쀀𝔮pf;쀀𝕢rime;恗cr;쀀𝓆ƀaeo⿸〉〓tĀei⿾々rnionóڰnt;樖stĀ;e【】䀿ñἙô༔઀ABHabcdefhilmnoprstux぀けさすムㄎㄫㅇㅢㅲㆎ㈆㈕㈤㈩㉘㉮㉲㊐㊰㊷ƀartぇおがròႳòϝail;検aròᱥar;楤΀cdenqrtとふへみわゔヌĀeuねぱ;쀀∽̱te;䅕iãᅮmptyv;榳gȀ;del࿑らるろ;榒;榥å࿑uo耻»䂻rր;abcfhlpstw࿜ガクシスゼゾダッデナp;極Ā;f࿠ゴs;椠;椳s;椞ë≝ð✮l;楅im;楴l;憣;憝Āaiパフil;椚oĀ;nホボ戶aló༞ƀabrョリヮrò៥rk;杳ĀakンヽcĀekヹ・;䁽;䁝Āes㄂㄄;榌lĀduㄊㄌ;榎;榐Ȁaeuyㄗㄜㄧㄩron;䅙Ādiㄡㄥil;䅗ì࿲âヺ;䑀Ȁclqsㄴㄷㄽㅄa;椷dhar;楩uoĀ;rȎȍh;憳ƀacgㅎㅟངlȀ;ipsླྀㅘㅛႜnåႻarôྩt;断ƀilrㅩဣㅮsht;楽;쀀𝔯ĀaoㅷㆆrĀduㅽㅿ»ѻĀ;l႑ㆄ;楬Ā;vㆋㆌ䏁;䏱ƀgns㆕ㇹㇼht̀ahlrstㆤㆰ㇂㇘㇤㇮rrowĀ;t࿜ㆭaéトarpoonĀduㆻㆿowîㅾp»႒eftĀah㇊㇐rrowó࿪arpoonóՑightarrows;應quigarro÷ニhreetimes;拌g;䋚ingdotseñἲƀahm㈍㈐㈓rò࿪aòՑ;怏oustĀ;a㈞㈟掱che»㈟mid;櫮Ȁabpt㈲㈽㉀㉒Ānr㈷㈺g;柭r;懾rëဃƀafl㉇㉊㉎r;榆;쀀𝕣us;樮imes;樵Āap㉝㉧rĀ;g㉣㉤䀩t;榔olint;樒arò㇣Ȁachq㉻㊀Ⴜ㊅quo;怺r;쀀𝓇Ābu・㊊oĀ;rȔȓƀhir㊗㊛㊠reåㇸmes;拊iȀ;efl㊪ၙᠡ㊫方tri;槎luhar;楨;愞ൡ㋕㋛㋟㌬㌸㍱\\0㍺㎤\\0\\0㏬㏰\\0㐨㑈㑚㒭㒱㓊㓱\\0㘖\\0\\0㘳cute;䅛quï➺Ԁ;Eaceinpsyᇭ㋳㋵㋿㌂㌋㌏㌟㌦㌩;檴ǰ㋺\\0㋼;檸on;䅡uåᇾĀ;dᇳ㌇il;䅟rc;䅝ƀEas㌖㌘㌛;檶p;檺im;择olint;樓iíሄ;䑁otƀ;be㌴ᵇ㌵担;橦΀Aacmstx㍆㍊㍗㍛㍞㍣㍭rr;懘rĀhr㍐㍒ë∨Ā;oਸ਼਴t耻§䂧i;䀻war;椩mĀin㍩ðnuóñt;朶rĀ;o㍶⁕쀀𝔰Ȁacoy㎂㎆㎑㎠rp;景Āhy㎋㎏cy;䑉;䑈rtɭ㎙\\0\\0㎜iäᑤaraì⹯耻­䂭Āgm㎨㎴maƀ;fv㎱㎲㎲䏃;䏂Ѐ;deglnprካ㏅㏉㏎㏖㏞㏡㏦ot;橪Ā;q኱ኰĀ;E㏓㏔檞;檠Ā;E㏛㏜檝;檟e;扆lus;樤arr;楲aròᄽȀaeit㏸㐈㐏㐗Āls㏽㐄lsetmé㍪hp;樳parsl;槤Ādlᑣ㐔e;挣Ā;e㐜㐝檪Ā;s㐢㐣檬;쀀⪬︀ƀflp㐮㐳㑂tcy;䑌Ā;b㐸㐹䀯Ā;a㐾㐿槄r;挿f;쀀𝕤aĀdr㑍ЂesĀ;u㑔㑕晠it»㑕ƀcsu㑠㑹㒟Āau㑥㑯pĀ;sᆈ㑫;쀀⊓︀pĀ;sᆴ㑵;쀀⊔︀uĀbp㑿㒏ƀ;esᆗᆜ㒆etĀ;eᆗ㒍ñᆝƀ;esᆨᆭ㒖etĀ;eᆨ㒝ñᆮƀ;afᅻ㒦ְrť㒫ֱ»ᅼaròᅈȀcemt㒹㒾㓂㓅r;쀀𝓈tmîñiì㐕aræᆾĀar㓎㓕rĀ;f㓔ឿ昆Āan㓚㓭ightĀep㓣㓪psiloîỠhé⺯s»⡒ʀbcmnp㓻㕞ሉ㖋㖎Ҁ;Edemnprs㔎㔏㔑㔕㔞㔣㔬㔱㔶抂;櫅ot;檽Ā;dᇚ㔚ot;櫃ult;櫁ĀEe㔨㔪;櫋;把lus;檿arr;楹ƀeiu㔽㕒㕕tƀ;en㔎㕅㕋qĀ;qᇚ㔏eqĀ;q㔫㔨m;櫇Ābp㕚㕜;櫕;櫓c̀;acensᇭ㕬㕲㕹㕻㌦pproø㋺urlyeñᇾñᇳƀaes㖂㖈㌛pproø㌚qñ㌗g;晪ڀ123;Edehlmnps㖩㖬㖯ሜ㖲㖴㗀㗉㗕㗚㗟㗨㗭耻¹䂹耻²䂲耻³䂳;櫆Āos㖹㖼t;檾ub;櫘Ā;dሢ㗅ot;櫄sĀou㗏㗒l;柉b;櫗arr;楻ult;櫂ĀEe㗤㗦;櫌;抋lus;櫀ƀeiu㗴㘉㘌tƀ;enሜ㗼㘂qĀ;qሢ㖲eqĀ;q㗧㗤m;櫈Ābp㘑㘓;櫔;櫖ƀAan㘜㘠㘭rr;懙rĀhr㘦㘨ë∮Ā;oਫ਩war;椪lig耻ß䃟௡㙑㙝㙠ዎ㙳㙹\\0㙾㛂\\0\\0\\0\\0\\0㛛㜃\\0㜉㝬\\0\\0\\0㞇ɲ㙖\\0\\0㙛get;挖;䏄rë๟ƀaey㙦㙫㙰ron;䅥dil;䅣;䑂lrec;挕r;쀀𝔱Ȁeiko㚆㚝㚵㚼ǲ㚋\\0㚑eĀ4fኄኁaƀ;sv㚘㚙㚛䎸ym;䏑Ācn㚢㚲kĀas㚨㚮pproø዁im»ኬsðኞĀas㚺㚮ð዁rn耻þ䃾Ǭ̟㛆⋧es膀×;bd㛏㛐㛘䃗Ā;aᤏ㛕r;樱;樰ƀeps㛡㛣㜀á⩍Ȁ;bcf҆㛬㛰㛴ot;挶ir;櫱Ā;o㛹㛼쀀𝕥rk;櫚á㍢rime;怴ƀaip㜏㜒㝤dåቈ΀adempst㜡㝍㝀㝑㝗㝜㝟ngleʀ;dlqr㜰㜱㜶㝀㝂斵own»ᶻeftĀ;e⠀㜾ñम;扜ightĀ;e㊪㝋ñၚot;旬inus;樺lus;樹b;槍ime;樻ezium;揢ƀcht㝲㝽㞁Āry㝷㝻;쀀𝓉;䑆cy;䑛rok;䅧Āio㞋㞎xô᝷headĀlr㞗㞠eftarro÷ࡏightarrow»ཝऀAHabcdfghlmoprstuw㟐㟓㟗㟤㟰㟼㠎㠜㠣㠴㡑㡝㡫㢩㣌㣒㣪㣶ròϭar;楣Ācr㟜㟢ute耻ú䃺òᅐrǣ㟪\\0㟭y;䑞ve;䅭Āiy㟵㟺rc耻û䃻;䑃ƀabh㠃㠆㠋ròᎭlac;䅱aòᏃĀir㠓㠘sht;楾;쀀𝔲rave耻ù䃹š㠧㠱rĀlr㠬㠮»ॗ»ႃlk;斀Āct㠹㡍ɯ㠿\\0\\0㡊rnĀ;e㡅㡆挜r»㡆op;挏ri;旸Āal㡖㡚cr;䅫肻¨͉Āgp㡢㡦on;䅳f;쀀𝕦̀adhlsuᅋ㡸㡽፲㢑㢠ownáᎳarpoonĀlr㢈㢌efô㠭ighô㠯iƀ;hl㢙㢚㢜䏅»ᏺon»㢚parrows;懈ƀcit㢰㣄㣈ɯ㢶\\0\\0㣁rnĀ;e㢼㢽挝r»㢽op;挎ng;䅯ri;旹cr;쀀𝓊ƀdir㣙㣝㣢ot;拰lde;䅩iĀ;f㜰㣨»᠓Āam㣯㣲rò㢨l耻ü䃼angle;榧ހABDacdeflnoprsz㤜㤟㤩㤭㦵㦸㦽㧟㧤㧨㧳㧹㧽㨁㨠ròϷarĀ;v㤦㤧櫨;櫩asèϡĀnr㤲㤷grt;榜΀eknprst㓣㥆㥋㥒㥝㥤㦖appá␕othinçẖƀhir㓫⻈㥙opô⾵Ā;hᎷ㥢ïㆍĀiu㥩㥭gmá㎳Ābp㥲㦄setneqĀ;q㥽㦀쀀⊊︀;쀀⫋︀setneqĀ;q㦏㦒쀀⊋︀;쀀⫌︀Āhr㦛㦟etá㚜iangleĀlr㦪㦯eft»थight»ၑy;䐲ash»ံƀelr㧄㧒㧗ƀ;beⷪ㧋㧏ar;抻q;扚lip;拮Ābt㧜ᑨaòᑩr;쀀𝔳tré㦮suĀbp㧯㧱»ജ»൙pf;쀀𝕧roð໻tré㦴Ācu㨆㨋r;쀀𝓋Ābp㨐㨘nĀEe㦀㨖»㥾nĀEe㦒㨞»㦐igzag;榚΀cefoprs㨶㨻㩖㩛㩔㩡㩪irc;䅵Ādi㩀㩑Ābg㩅㩉ar;機eĀ;qᗺ㩏;扙erp;愘r;쀀𝔴pf;쀀𝕨Ā;eᑹ㩦atèᑹcr;쀀𝓌ૣណ㪇\\0㪋\\0㪐㪛\\0\\0㪝㪨㪫㪯\\0\\0㫃㫎\\0㫘ៜ៟tré៑r;쀀𝔵ĀAa㪔㪗ròσrò৶;䎾ĀAa㪡㪤ròθrò৫að✓is;拻ƀdptឤ㪵㪾Āfl㪺ឩ;쀀𝕩imåឲĀAa㫇㫊ròώròਁĀcq㫒ីr;쀀𝓍Āpt៖㫜ré។Ѐacefiosu㫰㫽㬈㬌㬑㬕㬛㬡cĀuy㫶㫻te耻ý䃽;䑏Āiy㬂㬆rc;䅷;䑋n耻¥䂥r;쀀𝔶cy;䑗pf;쀀𝕪cr;쀀𝓎Ācm㬦㬩y;䑎l耻ÿ䃿Ԁacdefhiosw㭂㭈㭔㭘㭤㭩㭭㭴㭺㮀cute;䅺Āay㭍㭒ron;䅾;䐷ot;䅼Āet㭝㭡træᕟa;䎶r;쀀𝔷cy;䐶grarr;懝pf;쀀𝕫cr;쀀𝓏Ājn㮅㮇;怍j;怌'\n          .split('')\n          .map(function (e) {\n            return e.charCodeAt(0);\n          }),\n      )));\n  }),\n  Nr =\n    (yr(Cr),\n    Sr(function (e, t) {\n      (Object.defineProperty(t, '__esModule', { value: !0 }),\n        (t.default = new Uint16Array(\n          'Ȁaglq\\t\u0015\u0018\u001bɭ\u000f\\0\\0\u0012p;䀦os;䀧t;䀾t;䀼uot;䀢'.split('').map(function (e) {\n            return e.charCodeAt(0);\n          }),\n        )));\n    })),\n  br =\n    (yr(Nr),\n    Sr(function (e, t) {\n      (Object.defineProperty(t, '__esModule', { value: !0 }), (t.replaceCodePoint = t.fromCodePoint = void 0));\n      var n,\n        r = new Map([\n          [0, 65533],\n          [128, 8364],\n          [130, 8218],\n          [131, 402],\n          [132, 8222],\n          [133, 8230],\n          [134, 8224],\n          [135, 8225],\n          [136, 710],\n          [137, 8240],\n          [138, 352],\n          [139, 8249],\n          [140, 338],\n          [142, 381],\n          [145, 8216],\n          [146, 8217],\n          [147, 8220],\n          [148, 8221],\n          [149, 8226],\n          [150, 8211],\n          [151, 8212],\n          [152, 732],\n          [153, 8482],\n          [154, 353],\n          [155, 8250],\n          [156, 339],\n          [158, 382],\n          [159, 376],\n        ]);\n      function i(e) {\n        var t;\n        return (55296 <= e && e <= 57343) || 1114111 < e ? 65533 : null != (t = r.get(e)) ? t : e;\n      }\n      ((t.fromCodePoint =\n        null != (n = String.fromCodePoint)\n          ? n\n          : function (e) {\n              var t = '';\n              return (\n                65535 < e &&\n                  ((e -= 65536), (t += String.fromCharCode(((e >>> 10) & 1023) | 55296)), (e = 56320 | (1023 & e))),\n                t + String.fromCharCode(e)\n              );\n            }),\n        (t.replaceCodePoint = i),\n        (t.default = function (e) {\n          return (0, t.fromCodePoint)(i(e));\n        }));\n    })),\n  Ir = (yr(br), br.replaceCodePoint, br.fromCodePoint, Cr),\n  Or = Nr,\n  kr = br,\n  Lr = Sr(function (e, t) {\n    var n =\n        (gr && gr.__createBinding) ||\n        (Object.create\n          ? function (e, t, n, r) {\n              void 0 === r && (r = n);\n              var i = Object.getOwnPropertyDescriptor(t, n);\n              ((i && !('get' in i ? !t.__esModule : i.writable || i.configurable)) ||\n                (i = {\n                  enumerable: !0,\n                  get: function () {\n                    return t[n];\n                  },\n                }),\n                Object.defineProperty(e, r, i));\n            }\n          : function (e, t, n, r) {\n              e[(r = void 0 === r ? n : r)] = t[n];\n            }),\n      r =\n        (gr && gr.__setModuleDefault) ||\n        (Object.create\n          ? function (e, t) {\n              Object.defineProperty(e, 'default', { enumerable: !0, value: t });\n            }\n          : function (e, t) {\n              e.default = t;\n            }),\n      i =\n        (gr && gr.__importStar) ||\n        function (e) {\n          if (e && e.__esModule) return e;\n          var t = {};\n          if (null != e) for (var i in e) 'default' !== i && Object.prototype.hasOwnProperty.call(e, i) && n(t, e, i);\n          return (r(t, e), t);\n        },\n      s =\n        (gr && gr.__importDefault) ||\n        function (e) {\n          return e && e.__esModule ? e : { default: e };\n        },\n      a =\n        (Object.defineProperty(t, '__esModule', { value: !0 }),\n        (t.decodeXML =\n          t.decodeHTMLStrict =\n          t.decodeHTMLAttribute =\n          t.decodeHTML =\n          t.determineBranch =\n          t.EntityDecoder =\n          t.DecodingMode =\n          t.BinTrieFlags =\n          t.fromCodePoint =\n          t.replaceCodePoint =\n          t.decodeCodePoint =\n          t.xmlDecodeTree =\n          t.htmlDecodeTree =\n            void 0),\n        s(Ir)),\n      s = ((t.htmlDecodeTree = a.default), s(Or)),\n      c = ((t.xmlDecodeTree = s.default), i(kr));\n    t.decodeCodePoint = c.default;\n    var u,\n      h,\n      f,\n      p,\n      l = kr;\n    function d(e) {\n      return e >= u.ZERO && e <= u.NINE;\n    }\n    (Object.defineProperty(t, 'replaceCodePoint', {\n      enumerable: !0,\n      get: function () {\n        return l.replaceCodePoint;\n      },\n    }),\n      Object.defineProperty(t, 'fromCodePoint', {\n        enumerable: !0,\n        get: function () {\n          return l.fromCodePoint;\n        },\n      }),\n      (function (e) {\n        ((e[(e.NUM = 35)] = 'NUM'),\n          (e[(e.SEMI = 59)] = 'SEMI'),\n          (e[(e.EQUALS = 61)] = 'EQUALS'),\n          (e[(e.ZERO = 48)] = 'ZERO'),\n          (e[(e.NINE = 57)] = 'NINE'),\n          (e[(e.LOWER_A = 97)] = 'LOWER_A'),\n          (e[(e.LOWER_F = 102)] = 'LOWER_F'),\n          (e[(e.LOWER_X = 120)] = 'LOWER_X'),\n          (e[(e.LOWER_Z = 122)] = 'LOWER_Z'),\n          (e[(e.UPPER_A = 65)] = 'UPPER_A'),\n          (e[(e.UPPER_F = 70)] = 'UPPER_F'),\n          (e[(e.UPPER_Z = 90)] = 'UPPER_Z'));\n      })((u = {})),\n      (function (e) {\n        ((e[(e.VALUE_LENGTH = 49152)] = 'VALUE_LENGTH'),\n          (e[(e.BRANCH_LENGTH = 16256)] = 'BRANCH_LENGTH'),\n          (e[(e.JUMP_TABLE = 127)] = 'JUMP_TABLE'));\n      })((h = t.BinTrieFlags || (t.BinTrieFlags = {}))),\n      (function (e) {\n        ((e[(e.EntityStart = 0)] = 'EntityStart'),\n          (e[(e.NumericStart = 1)] = 'NumericStart'),\n          (e[(e.NumericDecimal = 2)] = 'NumericDecimal'),\n          (e[(e.NumericHex = 3)] = 'NumericHex'),\n          (e[(e.NamedEntity = 4)] = 'NamedEntity'));\n      })((f = {})),\n      (function (e) {\n        ((e[(e.Legacy = 0)] = 'Legacy'), (e[(e.Strict = 1)] = 'Strict'), (e[(e.Attribute = 2)] = 'Attribute'));\n      })((p = t.DecodingMode || (t.DecodingMode = {}))));\n    var _ = (function () {\n      function e(e, t, n) {\n        ((this.decodeTree = e),\n          (this.emitCodePoint = t),\n          (this.errors = n),\n          (this.state = f.EntityStart),\n          (this.consumed = 1),\n          (this.result = 0),\n          (this.treeIndex = 0),\n          (this.excess = 1),\n          (this.decodeMode = p.Strict));\n      }\n      return (\n        (e.prototype.startEntity = function (e) {\n          ((this.decodeMode = e),\n            (this.state = f.EntityStart),\n            (this.result = 0),\n            (this.treeIndex = 0),\n            (this.excess = 1),\n            (this.consumed = 1));\n        }),\n        (e.prototype.write = function (e, t) {\n          switch (this.state) {\n            case f.EntityStart:\n              return e.charCodeAt(t) === u.NUM\n                ? ((this.state = f.NumericStart), (this.consumed += 1), this.stateNumericStart(e, t + 1))\n                : ((this.state = f.NamedEntity), this.stateNamedEntity(e, t));\n            case f.NumericStart:\n              return this.stateNumericStart(e, t);\n            case f.NumericDecimal:\n              return this.stateNumericDecimal(e, t);\n            case f.NumericHex:\n              return this.stateNumericHex(e, t);\n            case f.NamedEntity:\n              return this.stateNamedEntity(e, t);\n          }\n        }),\n        (e.prototype.stateNumericStart = function (e, t) {\n          return t >= e.length\n            ? -1\n            : (32 | e.charCodeAt(t)) === u.LOWER_X\n              ? ((this.state = f.NumericHex), (this.consumed += 1), this.stateNumericHex(e, t + 1))\n              : ((this.state = f.NumericDecimal), this.stateNumericDecimal(e, t));\n        }),\n        (e.prototype.addToNumericResult = function (e, t, n, r) {\n          t !== n &&\n            ((n -= t),\n            (this.result = this.result * Math.pow(r, n) + parseInt(e.substr(t, n), r)),\n            (this.consumed += n));\n        }),\n        (e.prototype.stateNumericHex = function (e, t) {\n          for (var r = t; t < e.length; ) {\n            var i = e.charCodeAt(t);\n            if (!(d(i) || (i >= u.UPPER_A && i <= u.UPPER_F) || (u.LOWER_A <= i && i <= u.LOWER_F)))\n              return (this.addToNumericResult(e, r, t, 16), this.emitNumericEntity(i, 3));\n            t += 1;\n          }\n          return (this.addToNumericResult(e, r, t, 16), -1);\n        }),\n        (e.prototype.stateNumericDecimal = function (e, t) {\n          for (var n = t; t < e.length; ) {\n            var r = e.charCodeAt(t);\n            if (!d(r)) return (this.addToNumericResult(e, n, t, 10), this.emitNumericEntity(r, 2));\n            t += 1;\n          }\n          return (this.addToNumericResult(e, n, t, 10), -1);\n        }),\n        (e.prototype.emitNumericEntity = function (e, t) {\n          if (this.consumed <= t)\n            return (null != (t = this.errors) && t.absenceOfDigitsInNumericCharacterReference(this.consumed), 0);\n          if (e === u.SEMI) this.consumed += 1;\n          else if (this.decodeMode === p.Strict) return 0;\n          return (\n            this.emitCodePoint((0, c.replaceCodePoint)(this.result), this.consumed),\n            this.errors &&\n              (e !== u.SEMI && this.errors.missingSemicolonAfterCharacterReference(),\n              this.errors.validateNumericCharacterReference(this.result)),\n            this.consumed\n          );\n        }),\n        (e.prototype.stateNamedEntity = function (e, t) {\n          for (\n            var n = this.decodeTree, r = n[this.treeIndex], i = (r & h.VALUE_LENGTH) >> 14;\n            t < e.length;\n            t++, this.excess++\n          ) {\n            var s = e.charCodeAt(t);\n            if (((this.treeIndex = T(n, r, this.treeIndex + Math.max(1, i), s)), this.treeIndex < 0))\n              return 0 === this.result ||\n                (this.decodeMode === p.Attribute &&\n                  (0 === i ||\n                    s === u.EQUALS ||\n                    (function (e) {\n                      return (u.UPPER_A <= e && e <= u.UPPER_Z) || (u.LOWER_A <= e && e <= u.LOWER_Z) || d(e);\n                    })(s)))\n                ? 0\n                : this.emitNotTerminatedNamedEntity();\n            if (0 != (i = ((r = n[this.treeIndex]) & h.VALUE_LENGTH) >> 14)) {\n              if (s === u.SEMI) return this.emitNamedEntityData(this.treeIndex, i, this.consumed + this.excess);\n              this.decodeMode !== p.Strict &&\n                ((this.result = this.treeIndex), (this.consumed += this.excess), (this.excess = 0));\n            }\n          }\n          return -1;\n        }),\n        (e.prototype.emitNotTerminatedNamedEntity = function () {\n          var t = this.result,\n            n = (this.decodeTree[t] & h.VALUE_LENGTH) >> 14;\n          return (\n            this.emitNamedEntityData(t, n, this.consumed),\n            null != (t = this.errors) && t.missingSemicolonAfterCharacterReference(),\n            this.consumed\n          );\n        }),\n        (e.prototype.emitNamedEntityData = function (e, t, n) {\n          var r = this.decodeTree;\n          return (\n            this.emitCodePoint(1 === t ? r[e] & ~h.VALUE_LENGTH : r[e + 1], n),\n            3 === t && this.emitCodePoint(r[e + 2], n),\n            n\n          );\n        }),\n        (e.prototype.end = function () {\n          var e;\n          switch (this.state) {\n            case f.NamedEntity:\n              return 0 === this.result || (this.decodeMode === p.Attribute && this.result !== this.treeIndex)\n                ? 0\n                : this.emitNotTerminatedNamedEntity();\n            case f.NumericDecimal:\n              return this.emitNumericEntity(0, 2);\n            case f.NumericHex:\n              return this.emitNumericEntity(0, 3);\n            case f.NumericStart:\n              return (null != (e = this.errors) && e.absenceOfDigitsInNumericCharacterReference(this.consumed), 0);\n            case f.EntityStart:\n              return 0;\n          }\n        }),\n        e\n      );\n    })();\n    function E(e) {\n      var t = '',\n        n = new _(e, function (e) {\n          return (t += (0, c.fromCodePoint)(e));\n        });\n      return function (e, r) {\n        for (var i = 0, s = 0; 0 <= (s = e.indexOf('&', s)); ) {\n          ((t += e.slice(i, s)), n.startEntity(r));\n          var a = n.write(e, s + 1);\n          if (a < 0) {\n            i = s + n.end();\n            break;\n          }\n          ((i = s + a), (s = 0 === a ? i + 1 : i));\n        }\n        var o = t + e.slice(i);\n        return ((t = ''), o);\n      };\n    }\n    function T(e, t, n, r) {\n      var i = (t & h.BRANCH_LENGTH) >> 7,\n        t = t & h.JUMP_TABLE;\n      if (0 == i) return 0 != t && r === t ? n : -1;\n      if (t) return (t = r - t) < 0 || i <= t ? -1 : e[n + t] - 1;\n      for (var o = n, c = o + i - 1; o <= c; ) {\n        var u = (o + c) >>> 1,\n          l = e[u];\n        if (l < r) o = 1 + u;\n        else {\n          if (!(r < l)) return e[u + i];\n          c = u - 1;\n        }\n      }\n      return -1;\n    }\n    ((t.EntityDecoder = _), (t.determineBranch = T));\n    var A = E(a.default),\n      g = E(s.default);\n    ((t.decodeHTML = function (e, t) {\n      return (void 0 === t && (t = p.Legacy), A(e, t));\n    }),\n      (t.decodeHTMLAttribute = function (e) {\n        return A(e, p.Attribute);\n      }),\n      (t.decodeHTMLStrict = function (e) {\n        return A(e, p.Strict);\n      }),\n      (t.decodeXML = function (e) {\n        return g(e, p.Strict);\n      }));\n  }),\n  Dr = (yr(Lr), Lr.decodeXML, Lr.decodeHTMLStrict, Lr.decodeHTMLAttribute, Lr.decodeHTML, Lr.determineBranch),\n  Rr = (Lr.EntityDecoder, Lr.DecodingMode, Lr.BinTrieFlags),\n  wr = Lr.fromCodePoint,\n  xr = Lr.replaceCodePoint;\nLr.decodeCodePoint;\nvar Mr,\n  Pr,\n  Br,\n  Fr,\n  Ur,\n  Qr,\n  _i,\n  Yi,\n  Hr = Lr.xmlDecodeTree,\n  Gr = Lr.htmlDecodeTree;\n(!(function (e) {\n  ((e.HTML = 'http://www.w3.org/1999/xhtml'),\n    (e.MATHML = 'http://www.w3.org/1998/Math/MathML'),\n    (e.SVG = 'http://www.w3.org/2000/svg'),\n    (e.XLINK = 'http://www.w3.org/1999/xlink'),\n    (e.XML = 'http://www.w3.org/XML/1998/namespace'),\n    (e.XMLNS = 'http://www.w3.org/2000/xmlns/'));\n})((Mr = Mr || {})),\n  (function (e) {\n    ((e.TYPE = 'type'),\n      (e.ACTION = 'action'),\n      (e.ENCODING = 'encoding'),\n      (e.PROMPT = 'prompt'),\n      (e.NAME = 'name'),\n      (e.COLOR = 'color'),\n      (e.FACE = 'face'),\n      (e.SIZE = 'size'));\n  })((Pr = Pr || {})),\n  (function (e) {\n    ((e.NO_QUIRKS = 'no-quirks'), (e.QUIRKS = 'quirks'), (e.LIMITED_QUIRKS = 'limited-quirks'));\n  })((Br = Br || {})),\n  (function (e) {\n    ((e.A = 'a'),\n      (e.ADDRESS = 'address'),\n      (e.ANNOTATION_XML = 'annotation-xml'),\n      (e.APPLET = 'applet'),\n      (e.AREA = 'area'),\n      (e.ARTICLE = 'article'),\n      (e.ASIDE = 'aside'),\n      (e.B = 'b'),\n      (e.BASE = 'base'),\n      (e.BASEFONT = 'basefont'),\n      (e.BGSOUND = 'bgsound'),\n      (e.BIG = 'big'),\n      (e.BLOCKQUOTE = 'blockquote'),\n      (e.BODY = 'body'),\n      (e.BR = 'br'),\n      (e.BUTTON = 'button'),\n      (e.CAPTION = 'caption'),\n      (e.CENTER = 'center'),\n      (e.CODE = 'code'),\n      (e.COL = 'col'),\n      (e.COLGROUP = 'colgroup'),\n      (e.DD = 'dd'),\n      (e.DESC = 'desc'),\n      (e.DETAILS = 'details'),\n      (e.DIALOG = 'dialog'),\n      (e.DIR = 'dir'),\n      (e.DIV = 'div'),\n      (e.DL = 'dl'),\n      (e.DT = 'dt'),\n      (e.EM = 'em'),\n      (e.EMBED = 'embed'),\n      (e.FIELDSET = 'fieldset'),\n      (e.FIGCAPTION = 'figcaption'),\n      (e.FIGURE = 'figure'),\n      (e.FONT = 'font'),\n      (e.FOOTER = 'footer'),\n      (e.FOREIGN_OBJECT = 'foreignObject'),\n      (e.FORM = 'form'),\n      (e.FRAME = 'frame'),\n      (e.FRAMESET = 'frameset'),\n      (e.H1 = 'h1'),\n      (e.H2 = 'h2'),\n      (e.H3 = 'h3'),\n      (e.H4 = 'h4'),\n      (e.H5 = 'h5'),\n      (e.H6 = 'h6'),\n      (e.HEAD = 'head'),\n      (e.HEADER = 'header'),\n      (e.HGROUP = 'hgroup'),\n      (e.HR = 'hr'),\n      (e.HTML = 'html'),\n      (e.I = 'i'),\n      (e.IMG = 'img'),\n      (e.IMAGE = 'image'),\n      (e.INPUT = 'input'),\n      (e.IFRAME = 'iframe'),\n      (e.KEYGEN = 'keygen'),\n      (e.LABEL = 'label'),\n      (e.LI = 'li'),\n      (e.LINK = 'link'),\n      (e.LISTING = 'listing'),\n      (e.MAIN = 'main'),\n      (e.MALIGNMARK = 'malignmark'),\n      (e.MARQUEE = 'marquee'),\n      (e.MATH = 'math'),\n      (e.MENU = 'menu'),\n      (e.META = 'meta'),\n      (e.MGLYPH = 'mglyph'),\n      (e.MI = 'mi'),\n      (e.MO = 'mo'),\n      (e.MN = 'mn'),\n      (e.MS = 'ms'),\n      (e.MTEXT = 'mtext'),\n      (e.NAV = 'nav'),\n      (e.NOBR = 'nobr'),\n      (e.NOFRAMES = 'noframes'),\n      (e.NOEMBED = 'noembed'),\n      (e.NOSCRIPT = 'noscript'),\n      (e.OBJECT = 'object'),\n      (e.OL = 'ol'),\n      (e.OPTGROUP = 'optgroup'),\n      (e.OPTION = 'option'),\n      (e.P = 'p'),\n      (e.PARAM = 'param'),\n      (e.PLAINTEXT = 'plaintext'),\n      (e.PRE = 'pre'),\n      (e.RB = 'rb'),\n      (e.RP = 'rp'),\n      (e.RT = 'rt'),\n      (e.RTC = 'rtc'),\n      (e.RUBY = 'ruby'),\n      (e.S = 's'),\n      (e.SCRIPT = 'script'),\n      (e.SECTION = 'section'),\n      (e.SELECT = 'select'),\n      (e.SOURCE = 'source'),\n      (e.SMALL = 'small'),\n      (e.SPAN = 'span'),\n      (e.STRIKE = 'strike'),\n      (e.STRONG = 'strong'),\n      (e.STYLE = 'style'),\n      (e.SUB = 'sub'),\n      (e.SUMMARY = 'summary'),\n      (e.SUP = 'sup'),\n      (e.TABLE = 'table'),\n      (e.TBODY = 'tbody'),\n      (e.TEMPLATE = 'template'),\n      (e.TEXTAREA = 'textarea'),\n      (e.TFOOT = 'tfoot'),\n      (e.TD = 'td'),\n      (e.TH = 'th'),\n      (e.THEAD = 'thead'),\n      (e.TITLE = 'title'),\n      (e.TR = 'tr'),\n      (e.TRACK = 'track'),\n      (e.TT = 'tt'),\n      (e.U = 'u'),\n      (e.UL = 'ul'),\n      (e.SVG = 'svg'),\n      (e.VAR = 'var'),\n      (e.WBR = 'wbr'),\n      (e.XMP = 'xmp'));\n  })((Fr = Fr || {})),\n  (function (e) {\n    ((e[(e.UNKNOWN = 0)] = 'UNKNOWN'),\n      (e[(e.A = 1)] = 'A'),\n      (e[(e.ADDRESS = 2)] = 'ADDRESS'),\n      (e[(e.ANNOTATION_XML = 3)] = 'ANNOTATION_XML'),\n      (e[(e.APPLET = 4)] = 'APPLET'),\n      (e[(e.AREA = 5)] = 'AREA'),\n      (e[(e.ARTICLE = 6)] = 'ARTICLE'),\n      (e[(e.ASIDE = 7)] = 'ASIDE'),\n      (e[(e.B = 8)] = 'B'),\n      (e[(e.BASE = 9)] = 'BASE'),\n      (e[(e.BASEFONT = 10)] = 'BASEFONT'),\n      (e[(e.BGSOUND = 11)] = 'BGSOUND'),\n      (e[(e.BIG = 12)] = 'BIG'),\n      (e[(e.BLOCKQUOTE = 13)] = 'BLOCKQUOTE'),\n      (e[(e.BODY = 14)] = 'BODY'),\n      (e[(e.BR = 15)] = 'BR'),\n      (e[(e.BUTTON = 16)] = 'BUTTON'),\n      (e[(e.CAPTION = 17)] = 'CAPTION'),\n      (e[(e.CENTER = 18)] = 'CENTER'),\n      (e[(e.CODE = 19)] = 'CODE'),\n      (e[(e.COL = 20)] = 'COL'),\n      (e[(e.COLGROUP = 21)] = 'COLGROUP'),\n      (e[(e.DD = 22)] = 'DD'),\n      (e[(e.DESC = 23)] = 'DESC'),\n      (e[(e.DETAILS = 24)] = 'DETAILS'),\n      (e[(e.DIALOG = 25)] = 'DIALOG'),\n      (e[(e.DIR = 26)] = 'DIR'),\n      (e[(e.DIV = 27)] = 'DIV'),\n      (e[(e.DL = 28)] = 'DL'),\n      (e[(e.DT = 29)] = 'DT'),\n      (e[(e.EM = 30)] = 'EM'),\n      (e[(e.EMBED = 31)] = 'EMBED'),\n      (e[(e.FIELDSET = 32)] = 'FIELDSET'),\n      (e[(e.FIGCAPTION = 33)] = 'FIGCAPTION'),\n      (e[(e.FIGURE = 34)] = 'FIGURE'),\n      (e[(e.FONT = 35)] = 'FONT'),\n      (e[(e.FOOTER = 36)] = 'FOOTER'),\n      (e[(e.FOREIGN_OBJECT = 37)] = 'FOREIGN_OBJECT'),\n      (e[(e.FORM = 38)] = 'FORM'),\n      (e[(e.FRAME = 39)] = 'FRAME'),\n      (e[(e.FRAMESET = 40)] = 'FRAMESET'),\n      (e[(e.H1 = 41)] = 'H1'),\n      (e[(e.H2 = 42)] = 'H2'),\n      (e[(e.H3 = 43)] = 'H3'),\n      (e[(e.H4 = 44)] = 'H4'),\n      (e[(e.H5 = 45)] = 'H5'),\n      (e[(e.H6 = 46)] = 'H6'),\n      (e[(e.HEAD = 47)] = 'HEAD'),\n      (e[(e.HEADER = 48)] = 'HEADER'),\n      (e[(e.HGROUP = 49)] = 'HGROUP'),\n      (e[(e.HR = 50)] = 'HR'),\n      (e[(e.HTML = 51)] = 'HTML'),\n      (e[(e.I = 52)] = 'I'),\n      (e[(e.IMG = 53)] = 'IMG'),\n      (e[(e.IMAGE = 54)] = 'IMAGE'),\n      (e[(e.INPUT = 55)] = 'INPUT'),\n      (e[(e.IFRAME = 56)] = 'IFRAME'),\n      (e[(e.KEYGEN = 57)] = 'KEYGEN'),\n      (e[(e.LABEL = 58)] = 'LABEL'),\n      (e[(e.LI = 59)] = 'LI'),\n      (e[(e.LINK = 60)] = 'LINK'),\n      (e[(e.LISTING = 61)] = 'LISTING'),\n      (e[(e.MAIN = 62)] = 'MAIN'),\n      (e[(e.MALIGNMARK = 63)] = 'MALIGNMARK'),\n      (e[(e.MARQUEE = 64)] = 'MARQUEE'),\n      (e[(e.MATH = 65)] = 'MATH'),\n      (e[(e.MENU = 66)] = 'MENU'),\n      (e[(e.META = 67)] = 'META'),\n      (e[(e.MGLYPH = 68)] = 'MGLYPH'),\n      (e[(e.MI = 69)] = 'MI'),\n      (e[(e.MO = 70)] = 'MO'),\n      (e[(e.MN = 71)] = 'MN'),\n      (e[(e.MS = 72)] = 'MS'),\n      (e[(e.MTEXT = 73)] = 'MTEXT'),\n      (e[(e.NAV = 74)] = 'NAV'),\n      (e[(e.NOBR = 75)] = 'NOBR'),\n      (e[(e.NOFRAMES = 76)] = 'NOFRAMES'),\n      (e[(e.NOEMBED = 77)] = 'NOEMBED'),\n      (e[(e.NOSCRIPT = 78)] = 'NOSCRIPT'),\n      (e[(e.OBJECT = 79)] = 'OBJECT'),\n      (e[(e.OL = 80)] = 'OL'),\n      (e[(e.OPTGROUP = 81)] = 'OPTGROUP'),\n      (e[(e.OPTION = 82)] = 'OPTION'),\n      (e[(e.P = 83)] = 'P'),\n      (e[(e.PARAM = 84)] = 'PARAM'),\n      (e[(e.PLAINTEXT = 85)] = 'PLAINTEXT'),\n      (e[(e.PRE = 86)] = 'PRE'),\n      (e[(e.RB = 87)] = 'RB'),\n      (e[(e.RP = 88)] = 'RP'),\n      (e[(e.RT = 89)] = 'RT'),\n      (e[(e.RTC = 90)] = 'RTC'),\n      (e[(e.RUBY = 91)] = 'RUBY'),\n      (e[(e.S = 92)] = 'S'),\n      (e[(e.SCRIPT = 93)] = 'SCRIPT'),\n      (e[(e.SECTION = 94)] = 'SECTION'),\n      (e[(e.SELECT = 95)] = 'SELECT'),\n      (e[(e.SOURCE = 96)] = 'SOURCE'),\n      (e[(e.SMALL = 97)] = 'SMALL'),\n      (e[(e.SPAN = 98)] = 'SPAN'),\n      (e[(e.STRIKE = 99)] = 'STRIKE'),\n      (e[(e.STRONG = 100)] = 'STRONG'),\n      (e[(e.STYLE = 101)] = 'STYLE'),\n      (e[(e.SUB = 102)] = 'SUB'),\n      (e[(e.SUMMARY = 103)] = 'SUMMARY'),\n      (e[(e.SUP = 104)] = 'SUP'),\n      (e[(e.TABLE = 105)] = 'TABLE'),\n      (e[(e.TBODY = 106)] = 'TBODY'),\n      (e[(e.TEMPLATE = 107)] = 'TEMPLATE'),\n      (e[(e.TEXTAREA = 108)] = 'TEXTAREA'),\n      (e[(e.TFOOT = 109)] = 'TFOOT'),\n      (e[(e.TD = 110)] = 'TD'),\n      (e[(e.TH = 111)] = 'TH'),\n      (e[(e.THEAD = 112)] = 'THEAD'),\n      (e[(e.TITLE = 113)] = 'TITLE'),\n      (e[(e.TR = 114)] = 'TR'),\n      (e[(e.TRACK = 115)] = 'TRACK'),\n      (e[(e.TT = 116)] = 'TT'),\n      (e[(e.U = 117)] = 'U'),\n      (e[(e.UL = 118)] = 'UL'),\n      (e[(e.SVG = 119)] = 'SVG'),\n      (e[(e.VAR = 120)] = 'VAR'),\n      (e[(e.WBR = 121)] = 'WBR'),\n      (e[(e.XMP = 122)] = 'XMP'));\n  })((Ur = Ur || {})));\nconst jr = new Map([\n  [Fr.A, Ur.A],\n  [Fr.ADDRESS, Ur.ADDRESS],\n  [Fr.ANNOTATION_XML, Ur.ANNOTATION_XML],\n  [Fr.APPLET, Ur.APPLET],\n  [Fr.AREA, Ur.AREA],\n  [Fr.ARTICLE, Ur.ARTICLE],\n  [Fr.ASIDE, Ur.ASIDE],\n  [Fr.B, Ur.B],\n  [Fr.BASE, Ur.BASE],\n  [Fr.BASEFONT, Ur.BASEFONT],\n  [Fr.BGSOUND, Ur.BGSOUND],\n  [Fr.BIG, Ur.BIG],\n  [Fr.BLOCKQUOTE, Ur.BLOCKQUOTE],\n  [Fr.BODY, Ur.BODY],\n  [Fr.BR, Ur.BR],\n  [Fr.BUTTON, Ur.BUTTON],\n  [Fr.CAPTION, Ur.CAPTION],\n  [Fr.CENTER, Ur.CENTER],\n  [Fr.CODE, Ur.CODE],\n  [Fr.COL, Ur.COL],\n  [Fr.COLGROUP, Ur.COLGROUP],\n  [Fr.DD, Ur.DD],\n  [Fr.DESC, Ur.DESC],\n  [Fr.DETAILS, Ur.DETAILS],\n  [Fr.DIALOG, Ur.DIALOG],\n  [Fr.DIR, Ur.DIR],\n  [Fr.DIV, Ur.DIV],\n  [Fr.DL, Ur.DL],\n  [Fr.DT, Ur.DT],\n  [Fr.EM, Ur.EM],\n  [Fr.EMBED, Ur.EMBED],\n  [Fr.FIELDSET, Ur.FIELDSET],\n  [Fr.FIGCAPTION, Ur.FIGCAPTION],\n  [Fr.FIGURE, Ur.FIGURE],\n  [Fr.FONT, Ur.FONT],\n  [Fr.FOOTER, Ur.FOOTER],\n  [Fr.FOREIGN_OBJECT, Ur.FOREIGN_OBJECT],\n  [Fr.FORM, Ur.FORM],\n  [Fr.FRAME, Ur.FRAME],\n  [Fr.FRAMESET, Ur.FRAMESET],\n  [Fr.H1, Ur.H1],\n  [Fr.H2, Ur.H2],\n  [Fr.H3, Ur.H3],\n  [Fr.H4, Ur.H4],\n  [Fr.H5, Ur.H5],\n  [Fr.H6, Ur.H6],\n  [Fr.HEAD, Ur.HEAD],\n  [Fr.HEADER, Ur.HEADER],\n  [Fr.HGROUP, Ur.HGROUP],\n  [Fr.HR, Ur.HR],\n  [Fr.HTML, Ur.HTML],\n  [Fr.I, Ur.I],\n  [Fr.IMG, Ur.IMG],\n  [Fr.IMAGE, Ur.IMAGE],\n  [Fr.INPUT, Ur.INPUT],\n  [Fr.IFRAME, Ur.IFRAME],\n  [Fr.KEYGEN, Ur.KEYGEN],\n  [Fr.LABEL, Ur.LABEL],\n  [Fr.LI, Ur.LI],\n  [Fr.LINK, Ur.LINK],\n  [Fr.LISTING, Ur.LISTING],\n  [Fr.MAIN, Ur.MAIN],\n  [Fr.MALIGNMARK, Ur.MALIGNMARK],\n  [Fr.MARQUEE, Ur.MARQUEE],\n  [Fr.MATH, Ur.MATH],\n  [Fr.MENU, Ur.MENU],\n  [Fr.META, Ur.META],\n  [Fr.MGLYPH, Ur.MGLYPH],\n  [Fr.MI, Ur.MI],\n  [Fr.MO, Ur.MO],\n  [Fr.MN, Ur.MN],\n  [Fr.MS, Ur.MS],\n  [Fr.MTEXT, Ur.MTEXT],\n  [Fr.NAV, Ur.NAV],\n  [Fr.NOBR, Ur.NOBR],\n  [Fr.NOFRAMES, Ur.NOFRAMES],\n  [Fr.NOEMBED, Ur.NOEMBED],\n  [Fr.NOSCRIPT, Ur.NOSCRIPT],\n  [Fr.OBJECT, Ur.OBJECT],\n  [Fr.OL, Ur.OL],\n  [Fr.OPTGROUP, Ur.OPTGROUP],\n  [Fr.OPTION, Ur.OPTION],\n  [Fr.P, Ur.P],\n  [Fr.PARAM, Ur.PARAM],\n  [Fr.PLAINTEXT, Ur.PLAINTEXT],\n  [Fr.PRE, Ur.PRE],\n  [Fr.RB, Ur.RB],\n  [Fr.RP, Ur.RP],\n  [Fr.RT, Ur.RT],\n  [Fr.RTC, Ur.RTC],\n  [Fr.RUBY, Ur.RUBY],\n  [Fr.S, Ur.S],\n  [Fr.SCRIPT, Ur.SCRIPT],\n  [Fr.SECTION, Ur.SECTION],\n  [Fr.SELECT, Ur.SELECT],\n  [Fr.SOURCE, Ur.SOURCE],\n  [Fr.SMALL, Ur.SMALL],\n  [Fr.SPAN, Ur.SPAN],\n  [Fr.STRIKE, Ur.STRIKE],\n  [Fr.STRONG, Ur.STRONG],\n  [Fr.STYLE, Ur.STYLE],\n  [Fr.SUB, Ur.SUB],\n  [Fr.SUMMARY, Ur.SUMMARY],\n  [Fr.SUP, Ur.SUP],\n  [Fr.TABLE, Ur.TABLE],\n  [Fr.TBODY, Ur.TBODY],\n  [Fr.TEMPLATE, Ur.TEMPLATE],\n  [Fr.TEXTAREA, Ur.TEXTAREA],\n  [Fr.TFOOT, Ur.TFOOT],\n  [Fr.TD, Ur.TD],\n  [Fr.TH, Ur.TH],\n  [Fr.THEAD, Ur.THEAD],\n  [Fr.TITLE, Ur.TITLE],\n  [Fr.TR, Ur.TR],\n  [Fr.TRACK, Ur.TRACK],\n  [Fr.TT, Ur.TT],\n  [Fr.U, Ur.U],\n  [Fr.UL, Ur.UL],\n  [Fr.SVG, Ur.SVG],\n  [Fr.VAR, Ur.VAR],\n  [Fr.WBR, Ur.WBR],\n  [Fr.XMP, Ur.XMP],\n]);\nfunction qr(e) {\n  return null != (e = jr.get(e)) ? e : Ur.UNKNOWN;\n}\nconst Yr = Ur,\n  Kr = {\n    [Mr.HTML]: new Set([\n      Yr.ADDRESS,\n      Yr.APPLET,\n      Yr.AREA,\n      Yr.ARTICLE,\n      Yr.ASIDE,\n      Yr.BASE,\n      Yr.BASEFONT,\n      Yr.BGSOUND,\n      Yr.BLOCKQUOTE,\n      Yr.BODY,\n      Yr.BR,\n      Yr.BUTTON,\n      Yr.CAPTION,\n      Yr.CENTER,\n      Yr.COL,\n      Yr.COLGROUP,\n      Yr.DD,\n      Yr.DETAILS,\n      Yr.DIR,\n      Yr.DIV,\n      Yr.DL,\n      Yr.DT,\n      Yr.EMBED,\n      Yr.FIELDSET,\n      Yr.FIGCAPTION,\n      Yr.FIGURE,\n      Yr.FOOTER,\n      Yr.FORM,\n      Yr.FRAME,\n      Yr.FRAMESET,\n      Yr.H1,\n      Yr.H2,\n      Yr.H3,\n      Yr.H4,\n      Yr.H5,\n      Yr.H6,\n      Yr.HEAD,\n      Yr.HEADER,\n      Yr.HGROUP,\n      Yr.HR,\n      Yr.HTML,\n      Yr.IFRAME,\n      Yr.IMG,\n      Yr.INPUT,\n      Yr.LI,\n      Yr.LINK,\n      Yr.LISTING,\n      Yr.MAIN,\n      Yr.MARQUEE,\n      Yr.MENU,\n      Yr.META,\n      Yr.NAV,\n      Yr.NOEMBED,\n      Yr.NOFRAMES,\n      Yr.NOSCRIPT,\n      Yr.OBJECT,\n      Yr.OL,\n      Yr.P,\n      Yr.PARAM,\n      Yr.PLAINTEXT,\n      Yr.PRE,\n      Yr.SCRIPT,\n      Yr.SECTION,\n      Yr.SELECT,\n      Yr.SOURCE,\n      Yr.STYLE,\n      Yr.SUMMARY,\n      Yr.TABLE,\n      Yr.TBODY,\n      Yr.TD,\n      Yr.TEMPLATE,\n      Yr.TEXTAREA,\n      Yr.TFOOT,\n      Yr.TH,\n      Yr.THEAD,\n      Yr.TITLE,\n      Yr.TR,\n      Yr.TRACK,\n      Yr.UL,\n      Yr.WBR,\n      Yr.XMP,\n    ]),\n    [Mr.MATHML]: new Set([Yr.MI, Yr.MO, Yr.MN, Yr.MS, Yr.MTEXT, Yr.ANNOTATION_XML]),\n    [Mr.SVG]: new Set([Yr.TITLE, Yr.FOREIGN_OBJECT, Yr.DESC]),\n    [Mr.XLINK]: new Set(),\n    [Mr.XML]: new Set(),\n    [Mr.XMLNS]: new Set(),\n  };\nfunction Wr(e) {\n  return e === Yr.H1 || e === Yr.H2 || e === Yr.H3 || e === Yr.H4 || e === Yr.H5 || e === Yr.H6;\n}\nconst Vr = new Set([Fr.STYLE, Fr.SCRIPT, Fr.XMP, Fr.IFRAME, Fr.NOEMBED, Fr.NOFRAMES, Fr.PLAINTEXT]),\n  $r = new Map([\n    [128, 8364],\n    [130, 8218],\n    [131, 402],\n    [132, 8222],\n    [133, 8230],\n    [134, 8224],\n    [135, 8225],\n    [136, 710],\n    [137, 8240],\n    [138, 352],\n    [139, 8249],\n    [140, 338],\n    [142, 381],\n    [145, 8216],\n    [146, 8217],\n    [147, 8220],\n    [148, 8221],\n    [149, 8226],\n    [150, 8211],\n    [151, 8212],\n    [152, 732],\n    [153, 8482],\n    [154, 353],\n    [155, 8250],\n    [156, 339],\n    [158, 382],\n    [159, 376],\n  ]),\n  zr =\n    ((function (e) {\n      ((e[(e.DATA = 0)] = 'DATA'),\n        (e[(e.RCDATA = 1)] = 'RCDATA'),\n        (e[(e.RAWTEXT = 2)] = 'RAWTEXT'),\n        (e[(e.SCRIPT_DATA = 3)] = 'SCRIPT_DATA'),\n        (e[(e.PLAINTEXT = 4)] = 'PLAINTEXT'),\n        (e[(e.TAG_OPEN = 5)] = 'TAG_OPEN'),\n        (e[(e.END_TAG_OPEN = 6)] = 'END_TAG_OPEN'),\n        (e[(e.TAG_NAME = 7)] = 'TAG_NAME'),\n        (e[(e.RCDATA_LESS_THAN_SIGN = 8)] = 'RCDATA_LESS_THAN_SIGN'),\n        (e[(e.RCDATA_END_TAG_OPEN = 9)] = 'RCDATA_END_TAG_OPEN'),\n        (e[(e.RCDATA_END_TAG_NAME = 10)] = 'RCDATA_END_TAG_NAME'),\n        (e[(e.RAWTEXT_LESS_THAN_SIGN = 11)] = 'RAWTEXT_LESS_THAN_SIGN'),\n        (e[(e.RAWTEXT_END_TAG_OPEN = 12)] = 'RAWTEXT_END_TAG_OPEN'),\n        (e[(e.RAWTEXT_END_TAG_NAME = 13)] = 'RAWTEXT_END_TAG_NAME'),\n        (e[(e.SCRIPT_DATA_LESS_THAN_SIGN = 14)] = 'SCRIPT_DATA_LESS_THAN_SIGN'),\n        (e[(e.SCRIPT_DATA_END_TAG_OPEN = 15)] = 'SCRIPT_DATA_END_TAG_OPEN'),\n        (e[(e.SCRIPT_DATA_END_TAG_NAME = 16)] = 'SCRIPT_DATA_END_TAG_NAME'),\n        (e[(e.SCRIPT_DATA_ESCAPE_START = 17)] = 'SCRIPT_DATA_ESCAPE_START'),\n        (e[(e.SCRIPT_DATA_ESCAPE_START_DASH = 18)] = 'SCRIPT_DATA_ESCAPE_START_DASH'),\n        (e[(e.SCRIPT_DATA_ESCAPED = 19)] = 'SCRIPT_DATA_ESCAPED'),\n        (e[(e.SCRIPT_DATA_ESCAPED_DASH = 20)] = 'SCRIPT_DATA_ESCAPED_DASH'),\n        (e[(e.SCRIPT_DATA_ESCAPED_DASH_DASH = 21)] = 'SCRIPT_DATA_ESCAPED_DASH_DASH'),\n        (e[(e.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN = 22)] = 'SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN'),\n        (e[(e.SCRIPT_DATA_ESCAPED_END_TAG_OPEN = 23)] = 'SCRIPT_DATA_ESCAPED_END_TAG_OPEN'),\n        (e[(e.SCRIPT_DATA_ESCAPED_END_TAG_NAME = 24)] = 'SCRIPT_DATA_ESCAPED_END_TAG_NAME'),\n        (e[(e.SCRIPT_DATA_DOUBLE_ESCAPE_START = 25)] = 'SCRIPT_DATA_DOUBLE_ESCAPE_START'),\n        (e[(e.SCRIPT_DATA_DOUBLE_ESCAPED = 26)] = 'SCRIPT_DATA_DOUBLE_ESCAPED'),\n        (e[(e.SCRIPT_DATA_DOUBLE_ESCAPED_DASH = 27)] = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH'),\n        (e[(e.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH = 28)] = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH'),\n        (e[(e.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN = 29)] = 'SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN'),\n        (e[(e.SCRIPT_DATA_DOUBLE_ESCAPE_END = 30)] = 'SCRIPT_DATA_DOUBLE_ESCAPE_END'),\n        (e[(e.BEFORE_ATTRIBUTE_NAME = 31)] = 'BEFORE_ATTRIBUTE_NAME'),\n        (e[(e.ATTRIBUTE_NAME = 32)] = 'ATTRIBUTE_NAME'),\n        (e[(e.AFTER_ATTRIBUTE_NAME = 33)] = 'AFTER_ATTRIBUTE_NAME'),\n        (e[(e.BEFORE_ATTRIBUTE_VALUE = 34)] = 'BEFORE_ATTRIBUTE_VALUE'),\n        (e[(e.ATTRIBUTE_VALUE_DOUBLE_QUOTED = 35)] = 'ATTRIBUTE_VALUE_DOUBLE_QUOTED'),\n        (e[(e.ATTRIBUTE_VALUE_SINGLE_QUOTED = 36)] = 'ATTRIBUTE_VALUE_SINGLE_QUOTED'),\n        (e[(e.ATTRIBUTE_VALUE_UNQUOTED = 37)] = 'ATTRIBUTE_VALUE_UNQUOTED'),\n        (e[(e.AFTER_ATTRIBUTE_VALUE_QUOTED = 38)] = 'AFTER_ATTRIBUTE_VALUE_QUOTED'),\n        (e[(e.SELF_CLOSING_START_TAG = 39)] = 'SELF_CLOSING_START_TAG'),\n        (e[(e.BOGUS_COMMENT = 40)] = 'BOGUS_COMMENT'),\n        (e[(e.MARKUP_DECLARATION_OPEN = 41)] = 'MARKUP_DECLARATION_OPEN'),\n        (e[(e.COMMENT_START = 42)] = 'COMMENT_START'),\n        (e[(e.COMMENT_START_DASH = 43)] = 'COMMENT_START_DASH'),\n        (e[(e.COMMENT = 44)] = 'COMMENT'),\n        (e[(e.COMMENT_LESS_THAN_SIGN = 45)] = 'COMMENT_LESS_THAN_SIGN'),\n        (e[(e.COMMENT_LESS_THAN_SIGN_BANG = 46)] = 'COMMENT_LESS_THAN_SIGN_BANG'),\n        (e[(e.COMMENT_LESS_THAN_SIGN_BANG_DASH = 47)] = 'COMMENT_LESS_THAN_SIGN_BANG_DASH'),\n        (e[(e.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH = 48)] = 'COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH'),\n        (e[(e.COMMENT_END_DASH = 49)] = 'COMMENT_END_DASH'),\n        (e[(e.COMMENT_END = 50)] = 'COMMENT_END'),\n        (e[(e.COMMENT_END_BANG = 51)] = 'COMMENT_END_BANG'),\n        (e[(e.DOCTYPE = 52)] = 'DOCTYPE'),\n        (e[(e.BEFORE_DOCTYPE_NAME = 53)] = 'BEFORE_DOCTYPE_NAME'),\n        (e[(e.DOCTYPE_NAME = 54)] = 'DOCTYPE_NAME'),\n        (e[(e.AFTER_DOCTYPE_NAME = 55)] = 'AFTER_DOCTYPE_NAME'),\n        (e[(e.AFTER_DOCTYPE_PUBLIC_KEYWORD = 56)] = 'AFTER_DOCTYPE_PUBLIC_KEYWORD'),\n        (e[(e.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER = 57)] = 'BEFORE_DOCTYPE_PUBLIC_IDENTIFIER'),\n        (e[(e.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED = 58)] = 'DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED'),\n        (e[(e.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED = 59)] = 'DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED'),\n        (e[(e.AFTER_DOCTYPE_PUBLIC_IDENTIFIER = 60)] = 'AFTER_DOCTYPE_PUBLIC_IDENTIFIER'),\n        (e[(e.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS = 61)] = 'BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS'),\n        (e[(e.AFTER_DOCTYPE_SYSTEM_KEYWORD = 62)] = 'AFTER_DOCTYPE_SYSTEM_KEYWORD'),\n        (e[(e.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER = 63)] = 'BEFORE_DOCTYPE_SYSTEM_IDENTIFIER'),\n        (e[(e.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED = 64)] = 'DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED'),\n        (e[(e.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED = 65)] = 'DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED'),\n        (e[(e.AFTER_DOCTYPE_SYSTEM_IDENTIFIER = 66)] = 'AFTER_DOCTYPE_SYSTEM_IDENTIFIER'),\n        (e[(e.BOGUS_DOCTYPE = 67)] = 'BOGUS_DOCTYPE'),\n        (e[(e.CDATA_SECTION = 68)] = 'CDATA_SECTION'),\n        (e[(e.CDATA_SECTION_BRACKET = 69)] = 'CDATA_SECTION_BRACKET'),\n        (e[(e.CDATA_SECTION_END = 70)] = 'CDATA_SECTION_END'),\n        (e[(e.CHARACTER_REFERENCE = 71)] = 'CHARACTER_REFERENCE'),\n        (e[(e.NAMED_CHARACTER_REFERENCE = 72)] = 'NAMED_CHARACTER_REFERENCE'),\n        (e[(e.AMBIGUOUS_AMPERSAND = 73)] = 'AMBIGUOUS_AMPERSAND'),\n        (e[(e.NUMERIC_CHARACTER_REFERENCE = 74)] = 'NUMERIC_CHARACTER_REFERENCE'),\n        (e[(e.HEXADEMICAL_CHARACTER_REFERENCE_START = 75)] = 'HEXADEMICAL_CHARACTER_REFERENCE_START'),\n        (e[(e.HEXADEMICAL_CHARACTER_REFERENCE = 76)] = 'HEXADEMICAL_CHARACTER_REFERENCE'),\n        (e[(e.DECIMAL_CHARACTER_REFERENCE = 77)] = 'DECIMAL_CHARACTER_REFERENCE'),\n        (e[(e.NUMERIC_CHARACTER_REFERENCE_END = 78)] = 'NUMERIC_CHARACTER_REFERENCE_END'));\n    })((Qr = Qr || {})),\n    {\n      DATA: Qr.DATA,\n      RCDATA: Qr.RCDATA,\n      RAWTEXT: Qr.RAWTEXT,\n      SCRIPT_DATA: Qr.SCRIPT_DATA,\n      PLAINTEXT: Qr.PLAINTEXT,\n      CDATA_SECTION: Qr.CDATA_SECTION,\n    });\nfunction Xr(e) {\n  return e >= ar.DIGIT_0 && e <= ar.DIGIT_9;\n}\nfunction Zr(e) {\n  return e >= ar.LATIN_CAPITAL_A && e <= ar.LATIN_CAPITAL_Z;\n}\nfunction Jr(e) {\n  return (\n    (function (e) {\n      return e >= ar.LATIN_SMALL_A && e <= ar.LATIN_SMALL_Z;\n    })(e) || Zr(e)\n  );\n}\nfunction ei(e) {\n  return Jr(e) || Xr(e);\n}\nfunction ti(e) {\n  return e >= ar.LATIN_CAPITAL_A && e <= ar.LATIN_CAPITAL_F;\n}\nfunction ni(e) {\n  return e >= ar.LATIN_SMALL_A && e <= ar.LATIN_SMALL_F;\n}\nfunction ri(e) {\n  return e + 32;\n}\nfunction ii(e) {\n  return e === ar.SPACE || e === ar.LINE_FEED || e === ar.TABULATION || e === ar.FORM_FEED;\n}\nfunction si(e) {\n  return ii(e) || e === ar.SOLIDUS || e === ar.GREATER_THAN_SIGN;\n}\nclass ai {\n  constructor(e, t) {\n    ((this.options = e),\n      (this.handler = t),\n      (this.paused = !1),\n      (this.inLoop = !1),\n      (this.inForeignNode = !1),\n      (this.lastStartTagName = ''),\n      (this.active = !1),\n      (this.state = Qr.DATA),\n      (this.returnState = Qr.DATA),\n      (this.charRefCode = -1),\n      (this.consumedAfterSnapshot = -1),\n      (this.currentCharacterToken = null),\n      (this.currentToken = null),\n      (this.currentAttr = { name: '', value: '' }),\n      (this.preprocessor = new Er(t)),\n      (this.currentLocation = this.getCurrentLocation(-1)));\n  }\n  _err(e) {\n    var t, n;\n    null != (n = (t = this.handler).onParseError) && n.call(t, this.preprocessor.getError(e));\n  }\n  getCurrentLocation(e) {\n    return this.options.sourceCodeLocationInfo\n      ? {\n          startLine: this.preprocessor.line,\n          startCol: this.preprocessor.col - e,\n          startOffset: this.preprocessor.offset - e,\n          endLine: -1,\n          endCol: -1,\n          endOffset: -1,\n        }\n      : null;\n  }\n  _runParsingLoop() {\n    if (!this.inLoop) {\n      for (this.inLoop = !0; this.active && !this.paused; ) {\n        this.consumedAfterSnapshot = 0;\n        var e = this._consume();\n        this._ensureHibernation() || this._callState(e);\n      }\n      this.inLoop = !1;\n    }\n  }\n  pause() {\n    this.paused = !0;\n  }\n  resume(e) {\n    if (!this.paused) throw new Error('Parser was already resumed');\n    ((this.paused = !1), this.inLoop || (this._runParsingLoop(), this.paused) || null == e || e());\n  }\n  write(e, t, n) {\n    ((this.active = !0), this.preprocessor.write(e, t), this._runParsingLoop(), this.paused || null == n || n());\n  }\n  insertHtmlAtCurrentPos(e) {\n    ((this.active = !0), this.preprocessor.insertHtmlAtCurrentPos(e), this._runParsingLoop());\n  }\n  _ensureHibernation() {\n    return !(!this.preprocessor.endOfChunkHit || (this._unconsume(this.consumedAfterSnapshot), (this.active = !1)));\n  }\n  _consume() {\n    return (this.consumedAfterSnapshot++, this.preprocessor.advance());\n  }\n  _unconsume(e) {\n    ((this.consumedAfterSnapshot -= e), this.preprocessor.retreat(e));\n  }\n  _reconsumeInState(e, t) {\n    ((this.state = e), this._callState(t));\n  }\n  _advanceBy(e) {\n    this.consumedAfterSnapshot += e;\n    for (let t = 0; t < e; t++) this.preprocessor.advance();\n  }\n  _consumeSequenceIfMatch(e, t) {\n    return !!this.preprocessor.startsWith(e, t) && (this._advanceBy(e.length - 1), !0);\n  }\n  _createStartTagToken() {\n    this.currentToken = {\n      type: Tr.START_TAG,\n      tagName: '',\n      tagID: Ur.UNKNOWN,\n      selfClosing: !1,\n      ackSelfClosing: !1,\n      attrs: [],\n      location: this.getCurrentLocation(1),\n    };\n  }\n  _createEndTagToken() {\n    this.currentToken = {\n      type: Tr.END_TAG,\n      tagName: '',\n      tagID: Ur.UNKNOWN,\n      selfClosing: !1,\n      ackSelfClosing: !1,\n      attrs: [],\n      location: this.getCurrentLocation(2),\n    };\n  }\n  _createCommentToken(e) {\n    this.currentToken = { type: Tr.COMMENT, data: '', location: this.getCurrentLocation(e) };\n  }\n  _createDoctypeToken(e) {\n    this.currentToken = {\n      type: Tr.DOCTYPE,\n      name: e,\n      forceQuirks: !1,\n      publicId: null,\n      systemId: null,\n      location: this.currentLocation,\n    };\n  }\n  _createCharacterToken(e, t) {\n    this.currentCharacterToken = { type: e, chars: t, location: this.currentLocation };\n  }\n  _createAttr(e) {\n    ((this.currentAttr = { name: e, value: '' }), (this.currentLocation = this.getCurrentLocation(0)));\n  }\n  _leaveAttrName() {\n    var e,\n      n = this.currentToken;\n    null === Ar(n, this.currentAttr.name)\n      ? (n.attrs.push(this.currentAttr),\n        n.location &&\n          this.currentLocation &&\n          (((null != (e = (n = n.location).attrs) ? e : (n.attrs = Object.create(null)))[this.currentAttr.name] =\n            this.currentLocation),\n          this._leaveAttrValue()))\n      : this._err(_r.duplicateAttribute);\n  }\n  _leaveAttrValue() {\n    this.currentLocation &&\n      ((this.currentLocation.endLine = this.preprocessor.line),\n      (this.currentLocation.endCol = this.preprocessor.col),\n      (this.currentLocation.endOffset = this.preprocessor.offset));\n  }\n  prepareToken(e) {\n    (this._emitCurrentCharacterToken(e.location),\n      (this.currentToken = null),\n      e.location &&\n        ((e.location.endLine = this.preprocessor.line),\n        (e.location.endCol = this.preprocessor.col + 1),\n        (e.location.endOffset = this.preprocessor.offset + 1)),\n      (this.currentLocation = this.getCurrentLocation(-1)));\n  }\n  emitCurrentTagToken() {\n    var e = this.currentToken;\n    (this.prepareToken(e),\n      (e.tagID = qr(e.tagName)),\n      e.type === Tr.START_TAG\n        ? ((this.lastStartTagName = e.tagName), this.handler.onStartTag(e))\n        : (0 < e.attrs.length && this._err(_r.endTagWithAttributes),\n          e.selfClosing && this._err(_r.endTagWithTrailingSolidus),\n          this.handler.onEndTag(e)),\n      this.preprocessor.dropParsedChunk());\n  }\n  emitCurrentComment(e) {\n    (this.prepareToken(e), this.handler.onComment(e), this.preprocessor.dropParsedChunk());\n  }\n  emitCurrentDoctype(e) {\n    (this.prepareToken(e), this.handler.onDoctype(e), this.preprocessor.dropParsedChunk());\n  }\n  _emitCurrentCharacterToken(e) {\n    if (this.currentCharacterToken) {\n      switch (\n        (e &&\n          this.currentCharacterToken.location &&\n          ((this.currentCharacterToken.location.endLine = e.startLine),\n          (this.currentCharacterToken.location.endCol = e.startCol),\n          (this.currentCharacterToken.location.endOffset = e.startOffset)),\n        this.currentCharacterToken.type)\n      ) {\n        case Tr.CHARACTER:\n          this.handler.onCharacter(this.currentCharacterToken);\n          break;\n        case Tr.NULL_CHARACTER:\n          this.handler.onNullCharacter(this.currentCharacterToken);\n          break;\n        case Tr.WHITESPACE_CHARACTER:\n          this.handler.onWhitespaceCharacter(this.currentCharacterToken);\n      }\n      this.currentCharacterToken = null;\n    }\n  }\n  _emitEOFToken() {\n    var e = this.getCurrentLocation(0);\n    (e && ((e.endLine = e.startLine), (e.endCol = e.startCol), (e.endOffset = e.startOffset)),\n      this._emitCurrentCharacterToken(e),\n      this.handler.onEof({ type: Tr.EOF, location: e }),\n      (this.active = !1));\n  }\n  _appendCharToCurrentCharacterToken(e, t) {\n    if (this.currentCharacterToken) {\n      if (this.currentCharacterToken.type === e) return void (this.currentCharacterToken.chars += t);\n      ((this.currentLocation = this.getCurrentLocation(0)),\n        this._emitCurrentCharacterToken(this.currentLocation),\n        this.preprocessor.dropParsedChunk());\n    }\n    this._createCharacterToken(e, t);\n  }\n  _emitCodePoint(e) {\n    var t = ii(e) ? Tr.WHITESPACE_CHARACTER : e === ar.NULL ? Tr.NULL_CHARACTER : Tr.CHARACTER;\n    this._appendCharToCurrentCharacterToken(t, String.fromCodePoint(e));\n  }\n  _emitChars(e) {\n    this._appendCharToCurrentCharacterToken(Tr.CHARACTER, e);\n  }\n  _matchNamedCharacterReference(e) {\n    let t = null,\n      n = 0,\n      r = !1;\n    for (let s = 0, a = Gr[0]; 0 <= s && !((s = Dr(Gr, a, s + 1, e)) < 0); e = this._consume()) {\n      n += 1;\n      var o = (a = Gr[s]) & Rr.VALUE_LENGTH;\n      if (o) {\n        const a = (o >> 14) - 1;\n        if (\n          (e !== ar.SEMICOLON &&\n          this._isCharacterReferenceInAttribute() &&\n          ((o = this.preprocessor.peek(1)) === ar.EQUALS_SIGN || ei(o))\n            ? ((t = [ar.AMPERSAND]), (s += a))\n            : ((t = 0 == a ? [Gr[s] & ~Rr.VALUE_LENGTH] : 1 == a ? [Gr[++s]] : [Gr[++s], Gr[++s]]),\n              (n = 0),\n              (r = e !== ar.SEMICOLON)),\n          0 == a)\n        ) {\n          this._consume();\n          break;\n        }\n      }\n    }\n    return (\n      this._unconsume(n),\n      r && !this.preprocessor.endOfChunkHit && this._err(_r.missingSemicolonAfterCharacterReference),\n      this._unconsume(1),\n      t\n    );\n  }\n  _isCharacterReferenceInAttribute() {\n    return (\n      this.returnState === Qr.ATTRIBUTE_VALUE_DOUBLE_QUOTED ||\n      this.returnState === Qr.ATTRIBUTE_VALUE_SINGLE_QUOTED ||\n      this.returnState === Qr.ATTRIBUTE_VALUE_UNQUOTED\n    );\n  }\n  _flushCodePointConsumedAsCharacterReference(e) {\n    this._isCharacterReferenceInAttribute()\n      ? (this.currentAttr.value += String.fromCodePoint(e))\n      : this._emitCodePoint(e);\n  }\n  _callState(e) {\n    switch (this.state) {\n      case Qr.DATA:\n        this._stateData(e);\n        break;\n      case Qr.RCDATA:\n        this._stateRcdata(e);\n        break;\n      case Qr.RAWTEXT:\n        this._stateRawtext(e);\n        break;\n      case Qr.SCRIPT_DATA:\n        this._stateScriptData(e);\n        break;\n      case Qr.PLAINTEXT:\n        this._statePlaintext(e);\n        break;\n      case Qr.TAG_OPEN:\n        this._stateTagOpen(e);\n        break;\n      case Qr.END_TAG_OPEN:\n        this._stateEndTagOpen(e);\n        break;\n      case Qr.TAG_NAME:\n        this._stateTagName(e);\n        break;\n      case Qr.RCDATA_LESS_THAN_SIGN:\n        this._stateRcdataLessThanSign(e);\n        break;\n      case Qr.RCDATA_END_TAG_OPEN:\n        this._stateRcdataEndTagOpen(e);\n        break;\n      case Qr.RCDATA_END_TAG_NAME:\n        this._stateRcdataEndTagName(e);\n        break;\n      case Qr.RAWTEXT_LESS_THAN_SIGN:\n        this._stateRawtextLessThanSign(e);\n        break;\n      case Qr.RAWTEXT_END_TAG_OPEN:\n        this._stateRawtextEndTagOpen(e);\n        break;\n      case Qr.RAWTEXT_END_TAG_NAME:\n        this._stateRawtextEndTagName(e);\n        break;\n      case Qr.SCRIPT_DATA_LESS_THAN_SIGN:\n        this._stateScriptDataLessThanSign(e);\n        break;\n      case Qr.SCRIPT_DATA_END_TAG_OPEN:\n        this._stateScriptDataEndTagOpen(e);\n        break;\n      case Qr.SCRIPT_DATA_END_TAG_NAME:\n        this._stateScriptDataEndTagName(e);\n        break;\n      case Qr.SCRIPT_DATA_ESCAPE_START:\n        this._stateScriptDataEscapeStart(e);\n        break;\n      case Qr.SCRIPT_DATA_ESCAPE_START_DASH:\n        this._stateScriptDataEscapeStartDash(e);\n        break;\n      case Qr.SCRIPT_DATA_ESCAPED:\n        this._stateScriptDataEscaped(e);\n        break;\n      case Qr.SCRIPT_DATA_ESCAPED_DASH:\n        this._stateScriptDataEscapedDash(e);\n        break;\n      case Qr.SCRIPT_DATA_ESCAPED_DASH_DASH:\n        this._stateScriptDataEscapedDashDash(e);\n        break;\n      case Qr.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN:\n        this._stateScriptDataEscapedLessThanSign(e);\n        break;\n      case Qr.SCRIPT_DATA_ESCAPED_END_TAG_OPEN:\n        this._stateScriptDataEscapedEndTagOpen(e);\n        break;\n      case Qr.SCRIPT_DATA_ESCAPED_END_TAG_NAME:\n        this._stateScriptDataEscapedEndTagName(e);\n        break;\n      case Qr.SCRIPT_DATA_DOUBLE_ESCAPE_START:\n        this._stateScriptDataDoubleEscapeStart(e);\n        break;\n      case Qr.SCRIPT_DATA_DOUBLE_ESCAPED:\n        this._stateScriptDataDoubleEscaped(e);\n        break;\n      case Qr.SCRIPT_DATA_DOUBLE_ESCAPED_DASH:\n        this._stateScriptDataDoubleEscapedDash(e);\n        break;\n      case Qr.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH:\n        this._stateScriptDataDoubleEscapedDashDash(e);\n        break;\n      case Qr.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN:\n        this._stateScriptDataDoubleEscapedLessThanSign(e);\n        break;\n      case Qr.SCRIPT_DATA_DOUBLE_ESCAPE_END:\n        this._stateScriptDataDoubleEscapeEnd(e);\n        break;\n      case Qr.BEFORE_ATTRIBUTE_NAME:\n        this._stateBeforeAttributeName(e);\n        break;\n      case Qr.ATTRIBUTE_NAME:\n        this._stateAttributeName(e);\n        break;\n      case Qr.AFTER_ATTRIBUTE_NAME:\n        this._stateAfterAttributeName(e);\n        break;\n      case Qr.BEFORE_ATTRIBUTE_VALUE:\n        this._stateBeforeAttributeValue(e);\n        break;\n      case Qr.ATTRIBUTE_VALUE_DOUBLE_QUOTED:\n        this._stateAttributeValueDoubleQuoted(e);\n        break;\n      case Qr.ATTRIBUTE_VALUE_SINGLE_QUOTED:\n        this._stateAttributeValueSingleQuoted(e);\n        break;\n      case Qr.ATTRIBUTE_VALUE_UNQUOTED:\n        this._stateAttributeValueUnquoted(e);\n        break;\n      case Qr.AFTER_ATTRIBUTE_VALUE_QUOTED:\n        this._stateAfterAttributeValueQuoted(e);\n        break;\n      case Qr.SELF_CLOSING_START_TAG:\n        this._stateSelfClosingStartTag(e);\n        break;\n      case Qr.BOGUS_COMMENT:\n        this._stateBogusComment(e);\n        break;\n      case Qr.MARKUP_DECLARATION_OPEN:\n        this._stateMarkupDeclarationOpen(e);\n        break;\n      case Qr.COMMENT_START:\n        this._stateCommentStart(e);\n        break;\n      case Qr.COMMENT_START_DASH:\n        this._stateCommentStartDash(e);\n        break;\n      case Qr.COMMENT:\n        this._stateComment(e);\n        break;\n      case Qr.COMMENT_LESS_THAN_SIGN:\n        this._stateCommentLessThanSign(e);\n        break;\n      case Qr.COMMENT_LESS_THAN_SIGN_BANG:\n        this._stateCommentLessThanSignBang(e);\n        break;\n      case Qr.COMMENT_LESS_THAN_SIGN_BANG_DASH:\n        this._stateCommentLessThanSignBangDash(e);\n        break;\n      case Qr.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH:\n        this._stateCommentLessThanSignBangDashDash(e);\n        break;\n      case Qr.COMMENT_END_DASH:\n        this._stateCommentEndDash(e);\n        break;\n      case Qr.COMMENT_END:\n        this._stateCommentEnd(e);\n        break;\n      case Qr.COMMENT_END_BANG:\n        this._stateCommentEndBang(e);\n        break;\n      case Qr.DOCTYPE:\n        this._stateDoctype(e);\n        break;\n      case Qr.BEFORE_DOCTYPE_NAME:\n        this._stateBeforeDoctypeName(e);\n        break;\n      case Qr.DOCTYPE_NAME:\n        this._stateDoctypeName(e);\n        break;\n      case Qr.AFTER_DOCTYPE_NAME:\n        this._stateAfterDoctypeName(e);\n        break;\n      case Qr.AFTER_DOCTYPE_PUBLIC_KEYWORD:\n        this._stateAfterDoctypePublicKeyword(e);\n        break;\n      case Qr.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER:\n        this._stateBeforeDoctypePublicIdentifier(e);\n        break;\n      case Qr.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED:\n        this._stateDoctypePublicIdentifierDoubleQuoted(e);\n        break;\n      case Qr.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED:\n        this._stateDoctypePublicIdentifierSingleQuoted(e);\n        break;\n      case Qr.AFTER_DOCTYPE_PUBLIC_IDENTIFIER:\n        this._stateAfterDoctypePublicIdentifier(e);\n        break;\n      case Qr.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS:\n        this._stateBetweenDoctypePublicAndSystemIdentifiers(e);\n        break;\n      case Qr.AFTER_DOCTYPE_SYSTEM_KEYWORD:\n        this._stateAfterDoctypeSystemKeyword(e);\n        break;\n      case Qr.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER:\n        this._stateBeforeDoctypeSystemIdentifier(e);\n        break;\n      case Qr.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED:\n        this._stateDoctypeSystemIdentifierDoubleQuoted(e);\n        break;\n      case Qr.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED:\n        this._stateDoctypeSystemIdentifierSingleQuoted(e);\n        break;\n      case Qr.AFTER_DOCTYPE_SYSTEM_IDENTIFIER:\n        this._stateAfterDoctypeSystemIdentifier(e);\n        break;\n      case Qr.BOGUS_DOCTYPE:\n        this._stateBogusDoctype(e);\n        break;\n      case Qr.CDATA_SECTION:\n        this._stateCdataSection(e);\n        break;\n      case Qr.CDATA_SECTION_BRACKET:\n        this._stateCdataSectionBracket(e);\n        break;\n      case Qr.CDATA_SECTION_END:\n        this._stateCdataSectionEnd(e);\n        break;\n      case Qr.CHARACTER_REFERENCE:\n        this._stateCharacterReference(e);\n        break;\n      case Qr.NAMED_CHARACTER_REFERENCE:\n        this._stateNamedCharacterReference(e);\n        break;\n      case Qr.AMBIGUOUS_AMPERSAND:\n        this._stateAmbiguousAmpersand(e);\n        break;\n      case Qr.NUMERIC_CHARACTER_REFERENCE:\n        this._stateNumericCharacterReference(e);\n        break;\n      case Qr.HEXADEMICAL_CHARACTER_REFERENCE_START:\n        this._stateHexademicalCharacterReferenceStart(e);\n        break;\n      case Qr.HEXADEMICAL_CHARACTER_REFERENCE:\n        this._stateHexademicalCharacterReference(e);\n        break;\n      case Qr.DECIMAL_CHARACTER_REFERENCE:\n        this._stateDecimalCharacterReference(e);\n        break;\n      case Qr.NUMERIC_CHARACTER_REFERENCE_END:\n        this._stateNumericCharacterReferenceEnd(e);\n        break;\n      default:\n        throw new Error('Unknown state');\n    }\n  }\n  _stateData(e) {\n    switch (e) {\n      case ar.LESS_THAN_SIGN:\n        this.state = Qr.TAG_OPEN;\n        break;\n      case ar.AMPERSAND:\n        ((this.returnState = Qr.DATA), (this.state = Qr.CHARACTER_REFERENCE));\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), this._emitCodePoint(e));\n        break;\n      case ar.EOF:\n        this._emitEOFToken();\n        break;\n      default:\n        this._emitCodePoint(e);\n    }\n  }\n  _stateRcdata(e) {\n    switch (e) {\n      case ar.AMPERSAND:\n        ((this.returnState = Qr.RCDATA), (this.state = Qr.CHARACTER_REFERENCE));\n        break;\n      case ar.LESS_THAN_SIGN:\n        this.state = Qr.RCDATA_LESS_THAN_SIGN;\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), this._emitChars(sr));\n        break;\n      case ar.EOF:\n        this._emitEOFToken();\n        break;\n      default:\n        this._emitCodePoint(e);\n    }\n  }\n  _stateRawtext(e) {\n    switch (e) {\n      case ar.LESS_THAN_SIGN:\n        this.state = Qr.RAWTEXT_LESS_THAN_SIGN;\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), this._emitChars(sr));\n        break;\n      case ar.EOF:\n        this._emitEOFToken();\n        break;\n      default:\n        this._emitCodePoint(e);\n    }\n  }\n  _stateScriptData(e) {\n    switch (e) {\n      case ar.LESS_THAN_SIGN:\n        this.state = Qr.SCRIPT_DATA_LESS_THAN_SIGN;\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), this._emitChars(sr));\n        break;\n      case ar.EOF:\n        this._emitEOFToken();\n        break;\n      default:\n        this._emitCodePoint(e);\n    }\n  }\n  _statePlaintext(e) {\n    switch (e) {\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), this._emitChars(sr));\n        break;\n      case ar.EOF:\n        this._emitEOFToken();\n        break;\n      default:\n        this._emitCodePoint(e);\n    }\n  }\n  _stateTagOpen(e) {\n    if (Jr(e)) (this._createStartTagToken(), (this.state = Qr.TAG_NAME), this._stateTagName(e));\n    else\n      switch (e) {\n        case ar.EXCLAMATION_MARK:\n          this.state = Qr.MARKUP_DECLARATION_OPEN;\n          break;\n        case ar.SOLIDUS:\n          this.state = Qr.END_TAG_OPEN;\n          break;\n        case ar.QUESTION_MARK:\n          (this._err(_r.unexpectedQuestionMarkInsteadOfTagName),\n            this._createCommentToken(1),\n            (this.state = Qr.BOGUS_COMMENT),\n            this._stateBogusComment(e));\n          break;\n        case ar.EOF:\n          (this._err(_r.eofBeforeTagName), this._emitChars('<'), this._emitEOFToken());\n          break;\n        default:\n          (this._err(_r.invalidFirstCharacterOfTagName),\n            this._emitChars('<'),\n            (this.state = Qr.DATA),\n            this._stateData(e));\n      }\n  }\n  _stateEndTagOpen(e) {\n    if (Jr(e)) (this._createEndTagToken(), (this.state = Qr.TAG_NAME), this._stateTagName(e));\n    else\n      switch (e) {\n        case ar.GREATER_THAN_SIGN:\n          (this._err(_r.missingEndTagName), (this.state = Qr.DATA));\n          break;\n        case ar.EOF:\n          (this._err(_r.eofBeforeTagName), this._emitChars('</'), this._emitEOFToken());\n          break;\n        default:\n          (this._err(_r.invalidFirstCharacterOfTagName),\n            this._createCommentToken(2),\n            (this.state = Qr.BOGUS_COMMENT),\n            this._stateBogusComment(e));\n      }\n  }\n  _stateTagName(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n        this.state = Qr.BEFORE_ATTRIBUTE_NAME;\n        break;\n      case ar.SOLIDUS:\n        this.state = Qr.SELF_CLOSING_START_TAG;\n        break;\n      case ar.GREATER_THAN_SIGN:\n        ((this.state = Qr.DATA), this.emitCurrentTagToken());\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), (t.tagName += sr));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInTag), this._emitEOFToken());\n        break;\n      default:\n        t.tagName += String.fromCodePoint(Zr(e) ? ri(e) : e);\n    }\n  }\n  _stateRcdataLessThanSign(e) {\n    e === ar.SOLIDUS\n      ? (this.state = Qr.RCDATA_END_TAG_OPEN)\n      : (this._emitChars('<'), (this.state = Qr.RCDATA), this._stateRcdata(e));\n  }\n  _stateRcdataEndTagOpen(e) {\n    Jr(e)\n      ? ((this.state = Qr.RCDATA_END_TAG_NAME), this._stateRcdataEndTagName(e))\n      : (this._emitChars('</'), (this.state = Qr.RCDATA), this._stateRcdata(e));\n  }\n  handleSpecialEndTag(e) {\n    if (!this.preprocessor.startsWith(this.lastStartTagName, !1)) return !this._ensureHibernation();\n    switch (\n      (this._createEndTagToken(),\n      (this.currentToken.tagName = this.lastStartTagName),\n      this.preprocessor.peek(this.lastStartTagName.length))\n    ) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n        return (this._advanceBy(this.lastStartTagName.length), (this.state = Qr.BEFORE_ATTRIBUTE_NAME), !1);\n      case ar.SOLIDUS:\n        return (this._advanceBy(this.lastStartTagName.length), (this.state = Qr.SELF_CLOSING_START_TAG), !1);\n      case ar.GREATER_THAN_SIGN:\n        return (this._advanceBy(this.lastStartTagName.length), this.emitCurrentTagToken(), (this.state = Qr.DATA), !1);\n      default:\n        return !this._ensureHibernation();\n    }\n  }\n  _stateRcdataEndTagName(e) {\n    this.handleSpecialEndTag(e) && (this._emitChars('</'), (this.state = Qr.RCDATA), this._stateRcdata(e));\n  }\n  _stateRawtextLessThanSign(e) {\n    e === ar.SOLIDUS\n      ? (this.state = Qr.RAWTEXT_END_TAG_OPEN)\n      : (this._emitChars('<'), (this.state = Qr.RAWTEXT), this._stateRawtext(e));\n  }\n  _stateRawtextEndTagOpen(e) {\n    Jr(e)\n      ? ((this.state = Qr.RAWTEXT_END_TAG_NAME), this._stateRawtextEndTagName(e))\n      : (this._emitChars('</'), (this.state = Qr.RAWTEXT), this._stateRawtext(e));\n  }\n  _stateRawtextEndTagName(e) {\n    this.handleSpecialEndTag(e) && (this._emitChars('</'), (this.state = Qr.RAWTEXT), this._stateRawtext(e));\n  }\n  _stateScriptDataLessThanSign(e) {\n    switch (e) {\n      case ar.SOLIDUS:\n        this.state = Qr.SCRIPT_DATA_END_TAG_OPEN;\n        break;\n      case ar.EXCLAMATION_MARK:\n        ((this.state = Qr.SCRIPT_DATA_ESCAPE_START), this._emitChars('<!'));\n        break;\n      default:\n        (this._emitChars('<'), (this.state = Qr.SCRIPT_DATA), this._stateScriptData(e));\n    }\n  }\n  _stateScriptDataEndTagOpen(e) {\n    Jr(e)\n      ? ((this.state = Qr.SCRIPT_DATA_END_TAG_NAME), this._stateScriptDataEndTagName(e))\n      : (this._emitChars('</'), (this.state = Qr.SCRIPT_DATA), this._stateScriptData(e));\n  }\n  _stateScriptDataEndTagName(e) {\n    this.handleSpecialEndTag(e) && (this._emitChars('</'), (this.state = Qr.SCRIPT_DATA), this._stateScriptData(e));\n  }\n  _stateScriptDataEscapeStart(e) {\n    e === ar.HYPHEN_MINUS\n      ? ((this.state = Qr.SCRIPT_DATA_ESCAPE_START_DASH), this._emitChars('-'))\n      : ((this.state = Qr.SCRIPT_DATA), this._stateScriptData(e));\n  }\n  _stateScriptDataEscapeStartDash(e) {\n    e === ar.HYPHEN_MINUS\n      ? ((this.state = Qr.SCRIPT_DATA_ESCAPED_DASH_DASH), this._emitChars('-'))\n      : ((this.state = Qr.SCRIPT_DATA), this._stateScriptData(e));\n  }\n  _stateScriptDataEscaped(e) {\n    switch (e) {\n      case ar.HYPHEN_MINUS:\n        ((this.state = Qr.SCRIPT_DATA_ESCAPED_DASH), this._emitChars('-'));\n        break;\n      case ar.LESS_THAN_SIGN:\n        this.state = Qr.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN;\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), this._emitChars(sr));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInScriptHtmlCommentLikeText), this._emitEOFToken());\n        break;\n      default:\n        this._emitCodePoint(e);\n    }\n  }\n  _stateScriptDataEscapedDash(e) {\n    switch (e) {\n      case ar.HYPHEN_MINUS:\n        ((this.state = Qr.SCRIPT_DATA_ESCAPED_DASH_DASH), this._emitChars('-'));\n        break;\n      case ar.LESS_THAN_SIGN:\n        this.state = Qr.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN;\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), (this.state = Qr.SCRIPT_DATA_ESCAPED), this._emitChars(sr));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInScriptHtmlCommentLikeText), this._emitEOFToken());\n        break;\n      default:\n        ((this.state = Qr.SCRIPT_DATA_ESCAPED), this._emitCodePoint(e));\n    }\n  }\n  _stateScriptDataEscapedDashDash(e) {\n    switch (e) {\n      case ar.HYPHEN_MINUS:\n        this._emitChars('-');\n        break;\n      case ar.LESS_THAN_SIGN:\n        this.state = Qr.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN;\n        break;\n      case ar.GREATER_THAN_SIGN:\n        ((this.state = Qr.SCRIPT_DATA), this._emitChars('>'));\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), (this.state = Qr.SCRIPT_DATA_ESCAPED), this._emitChars(sr));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInScriptHtmlCommentLikeText), this._emitEOFToken());\n        break;\n      default:\n        ((this.state = Qr.SCRIPT_DATA_ESCAPED), this._emitCodePoint(e));\n    }\n  }\n  _stateScriptDataEscapedLessThanSign(e) {\n    e === ar.SOLIDUS\n      ? (this.state = Qr.SCRIPT_DATA_ESCAPED_END_TAG_OPEN)\n      : Jr(e)\n        ? (this._emitChars('<'),\n          (this.state = Qr.SCRIPT_DATA_DOUBLE_ESCAPE_START),\n          this._stateScriptDataDoubleEscapeStart(e))\n        : (this._emitChars('<'), (this.state = Qr.SCRIPT_DATA_ESCAPED), this._stateScriptDataEscaped(e));\n  }\n  _stateScriptDataEscapedEndTagOpen(e) {\n    Jr(e)\n      ? ((this.state = Qr.SCRIPT_DATA_ESCAPED_END_TAG_NAME), this._stateScriptDataEscapedEndTagName(e))\n      : (this._emitChars('</'), (this.state = Qr.SCRIPT_DATA_ESCAPED), this._stateScriptDataEscaped(e));\n  }\n  _stateScriptDataEscapedEndTagName(e) {\n    this.handleSpecialEndTag(e) &&\n      (this._emitChars('</'), (this.state = Qr.SCRIPT_DATA_ESCAPED), this._stateScriptDataEscaped(e));\n  }\n  _stateScriptDataDoubleEscapeStart(e) {\n    if (this.preprocessor.startsWith(lr, !1) && si(this.preprocessor.peek(lr.length))) {\n      this._emitCodePoint(e);\n      for (let e = 0; e < lr.length; e++) this._emitCodePoint(this._consume());\n      this.state = Qr.SCRIPT_DATA_DOUBLE_ESCAPED;\n    } else this._ensureHibernation() || ((this.state = Qr.SCRIPT_DATA_ESCAPED), this._stateScriptDataEscaped(e));\n  }\n  _stateScriptDataDoubleEscaped(e) {\n    switch (e) {\n      case ar.HYPHEN_MINUS:\n        ((this.state = Qr.SCRIPT_DATA_DOUBLE_ESCAPED_DASH), this._emitChars('-'));\n        break;\n      case ar.LESS_THAN_SIGN:\n        ((this.state = Qr.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN), this._emitChars('<'));\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), this._emitChars(sr));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInScriptHtmlCommentLikeText), this._emitEOFToken());\n        break;\n      default:\n        this._emitCodePoint(e);\n    }\n  }\n  _stateScriptDataDoubleEscapedDash(e) {\n    switch (e) {\n      case ar.HYPHEN_MINUS:\n        ((this.state = Qr.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH), this._emitChars('-'));\n        break;\n      case ar.LESS_THAN_SIGN:\n        ((this.state = Qr.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN), this._emitChars('<'));\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), (this.state = Qr.SCRIPT_DATA_DOUBLE_ESCAPED), this._emitChars(sr));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInScriptHtmlCommentLikeText), this._emitEOFToken());\n        break;\n      default:\n        ((this.state = Qr.SCRIPT_DATA_DOUBLE_ESCAPED), this._emitCodePoint(e));\n    }\n  }\n  _stateScriptDataDoubleEscapedDashDash(e) {\n    switch (e) {\n      case ar.HYPHEN_MINUS:\n        this._emitChars('-');\n        break;\n      case ar.LESS_THAN_SIGN:\n        ((this.state = Qr.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN), this._emitChars('<'));\n        break;\n      case ar.GREATER_THAN_SIGN:\n        ((this.state = Qr.SCRIPT_DATA), this._emitChars('>'));\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), (this.state = Qr.SCRIPT_DATA_DOUBLE_ESCAPED), this._emitChars(sr));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInScriptHtmlCommentLikeText), this._emitEOFToken());\n        break;\n      default:\n        ((this.state = Qr.SCRIPT_DATA_DOUBLE_ESCAPED), this._emitCodePoint(e));\n    }\n  }\n  _stateScriptDataDoubleEscapedLessThanSign(e) {\n    e === ar.SOLIDUS\n      ? ((this.state = Qr.SCRIPT_DATA_DOUBLE_ESCAPE_END), this._emitChars('/'))\n      : ((this.state = Qr.SCRIPT_DATA_DOUBLE_ESCAPED), this._stateScriptDataDoubleEscaped(e));\n  }\n  _stateScriptDataDoubleEscapeEnd(e) {\n    if (this.preprocessor.startsWith(lr, !1) && si(this.preprocessor.peek(lr.length))) {\n      this._emitCodePoint(e);\n      for (let e = 0; e < lr.length; e++) this._emitCodePoint(this._consume());\n      this.state = Qr.SCRIPT_DATA_ESCAPED;\n    } else\n      this._ensureHibernation() ||\n        ((this.state = Qr.SCRIPT_DATA_DOUBLE_ESCAPED), this._stateScriptDataDoubleEscaped(e));\n  }\n  _stateBeforeAttributeName(e) {\n    switch (e) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n        break;\n      case ar.SOLIDUS:\n      case ar.GREATER_THAN_SIGN:\n      case ar.EOF:\n        ((this.state = Qr.AFTER_ATTRIBUTE_NAME), this._stateAfterAttributeName(e));\n        break;\n      case ar.EQUALS_SIGN:\n        (this._err(_r.unexpectedEqualsSignBeforeAttributeName),\n          this._createAttr('='),\n          (this.state = Qr.ATTRIBUTE_NAME));\n        break;\n      default:\n        (this._createAttr(''), (this.state = Qr.ATTRIBUTE_NAME), this._stateAttributeName(e));\n    }\n  }\n  _stateAttributeName(e) {\n    switch (e) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n      case ar.SOLIDUS:\n      case ar.GREATER_THAN_SIGN:\n      case ar.EOF:\n        (this._leaveAttrName(), (this.state = Qr.AFTER_ATTRIBUTE_NAME), this._stateAfterAttributeName(e));\n        break;\n      case ar.EQUALS_SIGN:\n        (this._leaveAttrName(), (this.state = Qr.BEFORE_ATTRIBUTE_VALUE));\n        break;\n      case ar.QUOTATION_MARK:\n      case ar.APOSTROPHE:\n      case ar.LESS_THAN_SIGN:\n        (this._err(_r.unexpectedCharacterInAttributeName), (this.currentAttr.name += String.fromCodePoint(e)));\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), (this.currentAttr.name += sr));\n        break;\n      default:\n        this.currentAttr.name += String.fromCodePoint(Zr(e) ? ri(e) : e);\n    }\n  }\n  _stateAfterAttributeName(e) {\n    switch (e) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n        break;\n      case ar.SOLIDUS:\n        this.state = Qr.SELF_CLOSING_START_TAG;\n        break;\n      case ar.EQUALS_SIGN:\n        this.state = Qr.BEFORE_ATTRIBUTE_VALUE;\n        break;\n      case ar.GREATER_THAN_SIGN:\n        ((this.state = Qr.DATA), this.emitCurrentTagToken());\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInTag), this._emitEOFToken());\n        break;\n      default:\n        (this._createAttr(''), (this.state = Qr.ATTRIBUTE_NAME), this._stateAttributeName(e));\n    }\n  }\n  _stateBeforeAttributeValue(e) {\n    switch (e) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n        break;\n      case ar.QUOTATION_MARK:\n        this.state = Qr.ATTRIBUTE_VALUE_DOUBLE_QUOTED;\n        break;\n      case ar.APOSTROPHE:\n        this.state = Qr.ATTRIBUTE_VALUE_SINGLE_QUOTED;\n        break;\n      case ar.GREATER_THAN_SIGN:\n        (this._err(_r.missingAttributeValue), (this.state = Qr.DATA), this.emitCurrentTagToken());\n        break;\n      default:\n        ((this.state = Qr.ATTRIBUTE_VALUE_UNQUOTED), this._stateAttributeValueUnquoted(e));\n    }\n  }\n  _stateAttributeValueDoubleQuoted(e) {\n    switch (e) {\n      case ar.QUOTATION_MARK:\n        this.state = Qr.AFTER_ATTRIBUTE_VALUE_QUOTED;\n        break;\n      case ar.AMPERSAND:\n        ((this.returnState = Qr.ATTRIBUTE_VALUE_DOUBLE_QUOTED), (this.state = Qr.CHARACTER_REFERENCE));\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), (this.currentAttr.value += sr));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInTag), this._emitEOFToken());\n        break;\n      default:\n        this.currentAttr.value += String.fromCodePoint(e);\n    }\n  }\n  _stateAttributeValueSingleQuoted(e) {\n    switch (e) {\n      case ar.APOSTROPHE:\n        this.state = Qr.AFTER_ATTRIBUTE_VALUE_QUOTED;\n        break;\n      case ar.AMPERSAND:\n        ((this.returnState = Qr.ATTRIBUTE_VALUE_SINGLE_QUOTED), (this.state = Qr.CHARACTER_REFERENCE));\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), (this.currentAttr.value += sr));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInTag), this._emitEOFToken());\n        break;\n      default:\n        this.currentAttr.value += String.fromCodePoint(e);\n    }\n  }\n  _stateAttributeValueUnquoted(e) {\n    switch (e) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n        (this._leaveAttrValue(), (this.state = Qr.BEFORE_ATTRIBUTE_NAME));\n        break;\n      case ar.AMPERSAND:\n        ((this.returnState = Qr.ATTRIBUTE_VALUE_UNQUOTED), (this.state = Qr.CHARACTER_REFERENCE));\n        break;\n      case ar.GREATER_THAN_SIGN:\n        (this._leaveAttrValue(), (this.state = Qr.DATA), this.emitCurrentTagToken());\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), (this.currentAttr.value += sr));\n        break;\n      case ar.QUOTATION_MARK:\n      case ar.APOSTROPHE:\n      case ar.LESS_THAN_SIGN:\n      case ar.EQUALS_SIGN:\n      case ar.GRAVE_ACCENT:\n        (this._err(_r.unexpectedCharacterInUnquotedAttributeValue),\n          (this.currentAttr.value += String.fromCodePoint(e)));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInTag), this._emitEOFToken());\n        break;\n      default:\n        this.currentAttr.value += String.fromCodePoint(e);\n    }\n  }\n  _stateAfterAttributeValueQuoted(e) {\n    switch (e) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n        (this._leaveAttrValue(), (this.state = Qr.BEFORE_ATTRIBUTE_NAME));\n        break;\n      case ar.SOLIDUS:\n        (this._leaveAttrValue(), (this.state = Qr.SELF_CLOSING_START_TAG));\n        break;\n      case ar.GREATER_THAN_SIGN:\n        (this._leaveAttrValue(), (this.state = Qr.DATA), this.emitCurrentTagToken());\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInTag), this._emitEOFToken());\n        break;\n      default:\n        (this._err(_r.missingWhitespaceBetweenAttributes),\n          (this.state = Qr.BEFORE_ATTRIBUTE_NAME),\n          this._stateBeforeAttributeName(e));\n    }\n  }\n  _stateSelfClosingStartTag(e) {\n    switch (e) {\n      case ar.GREATER_THAN_SIGN:\n        ((this.currentToken.selfClosing = !0), (this.state = Qr.DATA), this.emitCurrentTagToken());\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInTag), this._emitEOFToken());\n        break;\n      default:\n        (this._err(_r.unexpectedSolidusInTag),\n          (this.state = Qr.BEFORE_ATTRIBUTE_NAME),\n          this._stateBeforeAttributeName(e));\n    }\n  }\n  _stateBogusComment(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.GREATER_THAN_SIGN:\n        ((this.state = Qr.DATA), this.emitCurrentComment(t));\n        break;\n      case ar.EOF:\n        (this.emitCurrentComment(t), this._emitEOFToken());\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), (t.data += sr));\n        break;\n      default:\n        t.data += String.fromCodePoint(e);\n    }\n  }\n  _stateMarkupDeclarationOpen(e) {\n    this._consumeSequenceIfMatch(or, !0)\n      ? (this._createCommentToken(or.length + 1), (this.state = Qr.COMMENT_START))\n      : this._consumeSequenceIfMatch(ur, !1)\n        ? ((this.currentLocation = this.getCurrentLocation(ur.length + 1)), (this.state = Qr.DOCTYPE))\n        : this._consumeSequenceIfMatch(cr, !0)\n          ? this.inForeignNode\n            ? (this.state = Qr.CDATA_SECTION)\n            : (this._err(_r.cdataInHtmlContent),\n              this._createCommentToken(cr.length + 1),\n              (this.currentToken.data = '[CDATA['),\n              (this.state = Qr.BOGUS_COMMENT))\n          : this._ensureHibernation() ||\n            (this._err(_r.incorrectlyOpenedComment),\n            this._createCommentToken(2),\n            (this.state = Qr.BOGUS_COMMENT),\n            this._stateBogusComment(e));\n  }\n  _stateCommentStart(e) {\n    switch (e) {\n      case ar.HYPHEN_MINUS:\n        this.state = Qr.COMMENT_START_DASH;\n        break;\n      case ar.GREATER_THAN_SIGN: {\n        (this._err(_r.abruptClosingOfEmptyComment), (this.state = Qr.DATA));\n        const e = this.currentToken;\n        this.emitCurrentComment(e);\n        break;\n      }\n      default:\n        ((this.state = Qr.COMMENT), this._stateComment(e));\n    }\n  }\n  _stateCommentStartDash(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.HYPHEN_MINUS:\n        this.state = Qr.COMMENT_END;\n        break;\n      case ar.GREATER_THAN_SIGN:\n        (this._err(_r.abruptClosingOfEmptyComment), (this.state = Qr.DATA), this.emitCurrentComment(t));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInComment), this.emitCurrentComment(t), this._emitEOFToken());\n        break;\n      default:\n        ((t.data += '-'), (this.state = Qr.COMMENT), this._stateComment(e));\n    }\n  }\n  _stateComment(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.HYPHEN_MINUS:\n        this.state = Qr.COMMENT_END_DASH;\n        break;\n      case ar.LESS_THAN_SIGN:\n        ((t.data += '<'), (this.state = Qr.COMMENT_LESS_THAN_SIGN));\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), (t.data += sr));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInComment), this.emitCurrentComment(t), this._emitEOFToken());\n        break;\n      default:\n        t.data += String.fromCodePoint(e);\n    }\n  }\n  _stateCommentLessThanSign(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.EXCLAMATION_MARK:\n        ((t.data += '!'), (this.state = Qr.COMMENT_LESS_THAN_SIGN_BANG));\n        break;\n      case ar.LESS_THAN_SIGN:\n        t.data += '<';\n        break;\n      default:\n        ((this.state = Qr.COMMENT), this._stateComment(e));\n    }\n  }\n  _stateCommentLessThanSignBang(e) {\n    e === ar.HYPHEN_MINUS\n      ? (this.state = Qr.COMMENT_LESS_THAN_SIGN_BANG_DASH)\n      : ((this.state = Qr.COMMENT), this._stateComment(e));\n  }\n  _stateCommentLessThanSignBangDash(e) {\n    e === ar.HYPHEN_MINUS\n      ? (this.state = Qr.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH)\n      : ((this.state = Qr.COMMENT_END_DASH), this._stateCommentEndDash(e));\n  }\n  _stateCommentLessThanSignBangDashDash(e) {\n    (e !== ar.GREATER_THAN_SIGN && e !== ar.EOF && this._err(_r.nestedComment),\n      (this.state = Qr.COMMENT_END),\n      this._stateCommentEnd(e));\n  }\n  _stateCommentEndDash(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.HYPHEN_MINUS:\n        this.state = Qr.COMMENT_END;\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInComment), this.emitCurrentComment(t), this._emitEOFToken());\n        break;\n      default:\n        ((t.data += '-'), (this.state = Qr.COMMENT), this._stateComment(e));\n    }\n  }\n  _stateCommentEnd(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.GREATER_THAN_SIGN:\n        ((this.state = Qr.DATA), this.emitCurrentComment(t));\n        break;\n      case ar.EXCLAMATION_MARK:\n        this.state = Qr.COMMENT_END_BANG;\n        break;\n      case ar.HYPHEN_MINUS:\n        t.data += '-';\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInComment), this.emitCurrentComment(t), this._emitEOFToken());\n        break;\n      default:\n        ((t.data += '--'), (this.state = Qr.COMMENT), this._stateComment(e));\n    }\n  }\n  _stateCommentEndBang(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.HYPHEN_MINUS:\n        ((t.data += '--!'), (this.state = Qr.COMMENT_END_DASH));\n        break;\n      case ar.GREATER_THAN_SIGN:\n        (this._err(_r.incorrectlyClosedComment), (this.state = Qr.DATA), this.emitCurrentComment(t));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInComment), this.emitCurrentComment(t), this._emitEOFToken());\n        break;\n      default:\n        ((t.data += '--!'), (this.state = Qr.COMMENT), this._stateComment(e));\n    }\n  }\n  _stateDoctype(e) {\n    switch (e) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n        this.state = Qr.BEFORE_DOCTYPE_NAME;\n        break;\n      case ar.GREATER_THAN_SIGN:\n        ((this.state = Qr.BEFORE_DOCTYPE_NAME), this._stateBeforeDoctypeName(e));\n        break;\n      case ar.EOF: {\n        (this._err(_r.eofInDoctype), this._createDoctypeToken(null));\n        const e = this.currentToken;\n        ((e.forceQuirks = !0), this.emitCurrentDoctype(e), this._emitEOFToken());\n        break;\n      }\n      default:\n        (this._err(_r.missingWhitespaceBeforeDoctypeName),\n          (this.state = Qr.BEFORE_DOCTYPE_NAME),\n          this._stateBeforeDoctypeName(e));\n    }\n  }\n  _stateBeforeDoctypeName(e) {\n    if (Zr(e)) (this._createDoctypeToken(String.fromCharCode(ri(e))), (this.state = Qr.DOCTYPE_NAME));\n    else\n      switch (e) {\n        case ar.SPACE:\n        case ar.LINE_FEED:\n        case ar.TABULATION:\n        case ar.FORM_FEED:\n          break;\n        case ar.NULL:\n          (this._err(_r.unexpectedNullCharacter), this._createDoctypeToken(sr), (this.state = Qr.DOCTYPE_NAME));\n          break;\n        case ar.GREATER_THAN_SIGN: {\n          (this._err(_r.missingDoctypeName), this._createDoctypeToken(null));\n          const e = this.currentToken;\n          ((e.forceQuirks = !0), this.emitCurrentDoctype(e), (this.state = Qr.DATA));\n          break;\n        }\n        case ar.EOF: {\n          (this._err(_r.eofInDoctype), this._createDoctypeToken(null));\n          const e = this.currentToken;\n          ((e.forceQuirks = !0), this.emitCurrentDoctype(e), this._emitEOFToken());\n          break;\n        }\n        default:\n          (this._createDoctypeToken(String.fromCodePoint(e)), (this.state = Qr.DOCTYPE_NAME));\n      }\n  }\n  _stateDoctypeName(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n        this.state = Qr.AFTER_DOCTYPE_NAME;\n        break;\n      case ar.GREATER_THAN_SIGN:\n        ((this.state = Qr.DATA), this.emitCurrentDoctype(t));\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), (t.name += sr));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInDoctype), (t.forceQuirks = !0), this.emitCurrentDoctype(t), this._emitEOFToken());\n        break;\n      default:\n        t.name += String.fromCodePoint(Zr(e) ? ri(e) : e);\n    }\n  }\n  _stateAfterDoctypeName(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n        break;\n      case ar.GREATER_THAN_SIGN:\n        ((this.state = Qr.DATA), this.emitCurrentDoctype(t));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInDoctype), (t.forceQuirks = !0), this.emitCurrentDoctype(t), this._emitEOFToken());\n        break;\n      default:\n        this._consumeSequenceIfMatch(hr, !1)\n          ? (this.state = Qr.AFTER_DOCTYPE_PUBLIC_KEYWORD)\n          : this._consumeSequenceIfMatch(fr, !1)\n            ? (this.state = Qr.AFTER_DOCTYPE_SYSTEM_KEYWORD)\n            : this._ensureHibernation() ||\n              (this._err(_r.invalidCharacterSequenceAfterDoctypeName),\n              (t.forceQuirks = !0),\n              (this.state = Qr.BOGUS_DOCTYPE),\n              this._stateBogusDoctype(e));\n    }\n  }\n  _stateAfterDoctypePublicKeyword(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n        this.state = Qr.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER;\n        break;\n      case ar.QUOTATION_MARK:\n        (this._err(_r.missingWhitespaceAfterDoctypePublicKeyword),\n          (t.publicId = ''),\n          (this.state = Qr.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED));\n        break;\n      case ar.APOSTROPHE:\n        (this._err(_r.missingWhitespaceAfterDoctypePublicKeyword),\n          (t.publicId = ''),\n          (this.state = Qr.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED));\n        break;\n      case ar.GREATER_THAN_SIGN:\n        (this._err(_r.missingDoctypePublicIdentifier),\n          (t.forceQuirks = !0),\n          (this.state = Qr.DATA),\n          this.emitCurrentDoctype(t));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInDoctype), (t.forceQuirks = !0), this.emitCurrentDoctype(t), this._emitEOFToken());\n        break;\n      default:\n        (this._err(_r.missingQuoteBeforeDoctypePublicIdentifier),\n          (t.forceQuirks = !0),\n          (this.state = Qr.BOGUS_DOCTYPE),\n          this._stateBogusDoctype(e));\n    }\n  }\n  _stateBeforeDoctypePublicIdentifier(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n        break;\n      case ar.QUOTATION_MARK:\n        ((t.publicId = ''), (this.state = Qr.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED));\n        break;\n      case ar.APOSTROPHE:\n        ((t.publicId = ''), (this.state = Qr.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED));\n        break;\n      case ar.GREATER_THAN_SIGN:\n        (this._err(_r.missingDoctypePublicIdentifier),\n          (t.forceQuirks = !0),\n          (this.state = Qr.DATA),\n          this.emitCurrentDoctype(t));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInDoctype), (t.forceQuirks = !0), this.emitCurrentDoctype(t), this._emitEOFToken());\n        break;\n      default:\n        (this._err(_r.missingQuoteBeforeDoctypePublicIdentifier),\n          (t.forceQuirks = !0),\n          (this.state = Qr.BOGUS_DOCTYPE),\n          this._stateBogusDoctype(e));\n    }\n  }\n  _stateDoctypePublicIdentifierDoubleQuoted(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.QUOTATION_MARK:\n        this.state = Qr.AFTER_DOCTYPE_PUBLIC_IDENTIFIER;\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), (t.publicId += sr));\n        break;\n      case ar.GREATER_THAN_SIGN:\n        (this._err(_r.abruptDoctypePublicIdentifier),\n          (t.forceQuirks = !0),\n          this.emitCurrentDoctype(t),\n          (this.state = Qr.DATA));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInDoctype), (t.forceQuirks = !0), this.emitCurrentDoctype(t), this._emitEOFToken());\n        break;\n      default:\n        t.publicId += String.fromCodePoint(e);\n    }\n  }\n  _stateDoctypePublicIdentifierSingleQuoted(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.APOSTROPHE:\n        this.state = Qr.AFTER_DOCTYPE_PUBLIC_IDENTIFIER;\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), (t.publicId += sr));\n        break;\n      case ar.GREATER_THAN_SIGN:\n        (this._err(_r.abruptDoctypePublicIdentifier),\n          (t.forceQuirks = !0),\n          this.emitCurrentDoctype(t),\n          (this.state = Qr.DATA));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInDoctype), (t.forceQuirks = !0), this.emitCurrentDoctype(t), this._emitEOFToken());\n        break;\n      default:\n        t.publicId += String.fromCodePoint(e);\n    }\n  }\n  _stateAfterDoctypePublicIdentifier(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n        this.state = Qr.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS;\n        break;\n      case ar.GREATER_THAN_SIGN:\n        ((this.state = Qr.DATA), this.emitCurrentDoctype(t));\n        break;\n      case ar.QUOTATION_MARK:\n        (this._err(_r.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers),\n          (t.systemId = ''),\n          (this.state = Qr.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED));\n        break;\n      case ar.APOSTROPHE:\n        (this._err(_r.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers),\n          (t.systemId = ''),\n          (this.state = Qr.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInDoctype), (t.forceQuirks = !0), this.emitCurrentDoctype(t), this._emitEOFToken());\n        break;\n      default:\n        (this._err(_r.missingQuoteBeforeDoctypeSystemIdentifier),\n          (t.forceQuirks = !0),\n          (this.state = Qr.BOGUS_DOCTYPE),\n          this._stateBogusDoctype(e));\n    }\n  }\n  _stateBetweenDoctypePublicAndSystemIdentifiers(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n        break;\n      case ar.GREATER_THAN_SIGN:\n        (this.emitCurrentDoctype(t), (this.state = Qr.DATA));\n        break;\n      case ar.QUOTATION_MARK:\n        ((t.systemId = ''), (this.state = Qr.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED));\n        break;\n      case ar.APOSTROPHE:\n        ((t.systemId = ''), (this.state = Qr.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInDoctype), (t.forceQuirks = !0), this.emitCurrentDoctype(t), this._emitEOFToken());\n        break;\n      default:\n        (this._err(_r.missingQuoteBeforeDoctypeSystemIdentifier),\n          (t.forceQuirks = !0),\n          (this.state = Qr.BOGUS_DOCTYPE),\n          this._stateBogusDoctype(e));\n    }\n  }\n  _stateAfterDoctypeSystemKeyword(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n        this.state = Qr.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER;\n        break;\n      case ar.QUOTATION_MARK:\n        (this._err(_r.missingWhitespaceAfterDoctypeSystemKeyword),\n          (t.systemId = ''),\n          (this.state = Qr.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED));\n        break;\n      case ar.APOSTROPHE:\n        (this._err(_r.missingWhitespaceAfterDoctypeSystemKeyword),\n          (t.systemId = ''),\n          (this.state = Qr.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED));\n        break;\n      case ar.GREATER_THAN_SIGN:\n        (this._err(_r.missingDoctypeSystemIdentifier),\n          (t.forceQuirks = !0),\n          (this.state = Qr.DATA),\n          this.emitCurrentDoctype(t));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInDoctype), (t.forceQuirks = !0), this.emitCurrentDoctype(t), this._emitEOFToken());\n        break;\n      default:\n        (this._err(_r.missingQuoteBeforeDoctypeSystemIdentifier),\n          (t.forceQuirks = !0),\n          (this.state = Qr.BOGUS_DOCTYPE),\n          this._stateBogusDoctype(e));\n    }\n  }\n  _stateBeforeDoctypeSystemIdentifier(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n        break;\n      case ar.QUOTATION_MARK:\n        ((t.systemId = ''), (this.state = Qr.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED));\n        break;\n      case ar.APOSTROPHE:\n        ((t.systemId = ''), (this.state = Qr.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED));\n        break;\n      case ar.GREATER_THAN_SIGN:\n        (this._err(_r.missingDoctypeSystemIdentifier),\n          (t.forceQuirks = !0),\n          (this.state = Qr.DATA),\n          this.emitCurrentDoctype(t));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInDoctype), (t.forceQuirks = !0), this.emitCurrentDoctype(t), this._emitEOFToken());\n        break;\n      default:\n        (this._err(_r.missingQuoteBeforeDoctypeSystemIdentifier),\n          (t.forceQuirks = !0),\n          (this.state = Qr.BOGUS_DOCTYPE),\n          this._stateBogusDoctype(e));\n    }\n  }\n  _stateDoctypeSystemIdentifierDoubleQuoted(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.QUOTATION_MARK:\n        this.state = Qr.AFTER_DOCTYPE_SYSTEM_IDENTIFIER;\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), (t.systemId += sr));\n        break;\n      case ar.GREATER_THAN_SIGN:\n        (this._err(_r.abruptDoctypeSystemIdentifier),\n          (t.forceQuirks = !0),\n          this.emitCurrentDoctype(t),\n          (this.state = Qr.DATA));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInDoctype), (t.forceQuirks = !0), this.emitCurrentDoctype(t), this._emitEOFToken());\n        break;\n      default:\n        t.systemId += String.fromCodePoint(e);\n    }\n  }\n  _stateDoctypeSystemIdentifierSingleQuoted(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.APOSTROPHE:\n        this.state = Qr.AFTER_DOCTYPE_SYSTEM_IDENTIFIER;\n        break;\n      case ar.NULL:\n        (this._err(_r.unexpectedNullCharacter), (t.systemId += sr));\n        break;\n      case ar.GREATER_THAN_SIGN:\n        (this._err(_r.abruptDoctypeSystemIdentifier),\n          (t.forceQuirks = !0),\n          this.emitCurrentDoctype(t),\n          (this.state = Qr.DATA));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInDoctype), (t.forceQuirks = !0), this.emitCurrentDoctype(t), this._emitEOFToken());\n        break;\n      default:\n        t.systemId += String.fromCodePoint(e);\n    }\n  }\n  _stateAfterDoctypeSystemIdentifier(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.SPACE:\n      case ar.LINE_FEED:\n      case ar.TABULATION:\n      case ar.FORM_FEED:\n        break;\n      case ar.GREATER_THAN_SIGN:\n        (this.emitCurrentDoctype(t), (this.state = Qr.DATA));\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInDoctype), (t.forceQuirks = !0), this.emitCurrentDoctype(t), this._emitEOFToken());\n        break;\n      default:\n        (this._err(_r.unexpectedCharacterAfterDoctypeSystemIdentifier),\n          (this.state = Qr.BOGUS_DOCTYPE),\n          this._stateBogusDoctype(e));\n    }\n  }\n  _stateBogusDoctype(e) {\n    var t = this.currentToken;\n    switch (e) {\n      case ar.GREATER_THAN_SIGN:\n        (this.emitCurrentDoctype(t), (this.state = Qr.DATA));\n        break;\n      case ar.NULL:\n        this._err(_r.unexpectedNullCharacter);\n        break;\n      case ar.EOF:\n        (this.emitCurrentDoctype(t), this._emitEOFToken());\n    }\n  }\n  _stateCdataSection(e) {\n    switch (e) {\n      case ar.RIGHT_SQUARE_BRACKET:\n        this.state = Qr.CDATA_SECTION_BRACKET;\n        break;\n      case ar.EOF:\n        (this._err(_r.eofInCdata), this._emitEOFToken());\n        break;\n      default:\n        this._emitCodePoint(e);\n    }\n  }\n  _stateCdataSectionBracket(e) {\n    e === ar.RIGHT_SQUARE_BRACKET\n      ? (this.state = Qr.CDATA_SECTION_END)\n      : (this._emitChars(']'), (this.state = Qr.CDATA_SECTION), this._stateCdataSection(e));\n  }\n  _stateCdataSectionEnd(e) {\n    switch (e) {\n      case ar.GREATER_THAN_SIGN:\n        this.state = Qr.DATA;\n        break;\n      case ar.RIGHT_SQUARE_BRACKET:\n        this._emitChars(']');\n        break;\n      default:\n        (this._emitChars(']]'), (this.state = Qr.CDATA_SECTION), this._stateCdataSection(e));\n    }\n  }\n  _stateCharacterReference(e) {\n    e === ar.NUMBER_SIGN\n      ? (this.state = Qr.NUMERIC_CHARACTER_REFERENCE)\n      : ei(e)\n        ? ((this.state = Qr.NAMED_CHARACTER_REFERENCE), this._stateNamedCharacterReference(e))\n        : (this._flushCodePointConsumedAsCharacterReference(ar.AMPERSAND), this._reconsumeInState(this.returnState, e));\n  }\n  _stateNamedCharacterReference(e) {\n    var t = this._matchNamedCharacterReference(e);\n    if (!this._ensureHibernation())\n      if (t) {\n        for (let e = 0; e < t.length; e++) this._flushCodePointConsumedAsCharacterReference(t[e]);\n        this.state = this.returnState;\n      } else (this._flushCodePointConsumedAsCharacterReference(ar.AMPERSAND), (this.state = Qr.AMBIGUOUS_AMPERSAND));\n  }\n  _stateAmbiguousAmpersand(e) {\n    ei(e)\n      ? this._flushCodePointConsumedAsCharacterReference(e)\n      : (e === ar.SEMICOLON && this._err(_r.unknownNamedCharacterReference),\n        this._reconsumeInState(this.returnState, e));\n  }\n  _stateNumericCharacterReference(e) {\n    ((this.charRefCode = 0),\n      e === ar.LATIN_SMALL_X || e === ar.LATIN_CAPITAL_X\n        ? (this.state = Qr.HEXADEMICAL_CHARACTER_REFERENCE_START)\n        : Xr(e)\n          ? ((this.state = Qr.DECIMAL_CHARACTER_REFERENCE), this._stateDecimalCharacterReference(e))\n          : (this._err(_r.absenceOfDigitsInNumericCharacterReference),\n            this._flushCodePointConsumedAsCharacterReference(ar.AMPERSAND),\n            this._flushCodePointConsumedAsCharacterReference(ar.NUMBER_SIGN),\n            this._reconsumeInState(this.returnState, e)));\n  }\n  _stateHexademicalCharacterReferenceStart(e) {\n    !(function (e) {\n      return Xr(e) || ti(e) || ni(e);\n    })(e)\n      ? (this._err(_r.absenceOfDigitsInNumericCharacterReference),\n        this._flushCodePointConsumedAsCharacterReference(ar.AMPERSAND),\n        this._flushCodePointConsumedAsCharacterReference(ar.NUMBER_SIGN),\n        this._unconsume(2),\n        (this.state = this.returnState))\n      : ((this.state = Qr.HEXADEMICAL_CHARACTER_REFERENCE), this._stateHexademicalCharacterReference(e));\n  }\n  _stateHexademicalCharacterReference(e) {\n    ti(e)\n      ? (this.charRefCode = 16 * this.charRefCode + e - 55)\n      : ni(e)\n        ? (this.charRefCode = 16 * this.charRefCode + e - 87)\n        : Xr(e)\n          ? (this.charRefCode = 16 * this.charRefCode + e - 48)\n          : e === ar.SEMICOLON\n            ? (this.state = Qr.NUMERIC_CHARACTER_REFERENCE_END)\n            : (this._err(_r.missingSemicolonAfterCharacterReference),\n              (this.state = Qr.NUMERIC_CHARACTER_REFERENCE_END),\n              this._stateNumericCharacterReferenceEnd(e));\n  }\n  _stateDecimalCharacterReference(e) {\n    Xr(e)\n      ? (this.charRefCode = 10 * this.charRefCode + e - 48)\n      : e === ar.SEMICOLON\n        ? (this.state = Qr.NUMERIC_CHARACTER_REFERENCE_END)\n        : (this._err(_r.missingSemicolonAfterCharacterReference),\n          (this.state = Qr.NUMERIC_CHARACTER_REFERENCE_END),\n          this._stateNumericCharacterReferenceEnd(e));\n  }\n  _stateNumericCharacterReferenceEnd(e) {\n    if (this.charRefCode === ar.NULL)\n      (this._err(_r.nullCharacterReference), (this.charRefCode = ar.REPLACEMENT_CHARACTER));\n    else if (1114111 < this.charRefCode)\n      (this._err(_r.characterReferenceOutsideUnicodeRange), (this.charRefCode = ar.REPLACEMENT_CHARACTER));\n    else if (pr(this.charRefCode))\n      (this._err(_r.surrogateCharacterReference), (this.charRefCode = ar.REPLACEMENT_CHARACTER));\n    else if (mr(this.charRefCode)) this._err(_r.noncharacterCharacterReference);\n    else if (dr(this.charRefCode) || this.charRefCode === ar.CARRIAGE_RETURN) {\n      this._err(_r.controlCharacterReference);\n      const e = $r.get(this.charRefCode);\n      void 0 !== e && (this.charRefCode = e);\n    }\n    (this._flushCodePointConsumedAsCharacterReference(this.charRefCode), this._reconsumeInState(this.returnState, e));\n  }\n}\nconst oi = new Set([Ur.DD, Ur.DT, Ur.LI, Ur.OPTGROUP, Ur.OPTION, Ur.P, Ur.RB, Ur.RP, Ur.RT, Ur.RTC]),\n  ci = new Set([...oi, Ur.CAPTION, Ur.COLGROUP, Ur.TBODY, Ur.TD, Ur.TFOOT, Ur.TH, Ur.THEAD, Ur.TR]),\n  ui = new Map([\n    [Ur.APPLET, Mr.HTML],\n    [Ur.CAPTION, Mr.HTML],\n    [Ur.HTML, Mr.HTML],\n    [Ur.MARQUEE, Mr.HTML],\n    [Ur.OBJECT, Mr.HTML],\n    [Ur.TABLE, Mr.HTML],\n    [Ur.TD, Mr.HTML],\n    [Ur.TEMPLATE, Mr.HTML],\n    [Ur.TH, Mr.HTML],\n    [Ur.ANNOTATION_XML, Mr.MATHML],\n    [Ur.MI, Mr.MATHML],\n    [Ur.MN, Mr.MATHML],\n    [Ur.MO, Mr.MATHML],\n    [Ur.MS, Mr.MATHML],\n    [Ur.MTEXT, Mr.MATHML],\n    [Ur.DESC, Mr.SVG],\n    [Ur.FOREIGN_OBJECT, Mr.SVG],\n    [Ur.TITLE, Mr.SVG],\n  ]),\n  li = [Ur.H1, Ur.H2, Ur.H3, Ur.H4, Ur.H5, Ur.H6],\n  hi = [Ur.TR, Ur.TEMPLATE, Ur.HTML],\n  fi = [Ur.TBODY, Ur.TFOOT, Ur.THEAD, Ur.TEMPLATE, Ur.HTML],\n  pi = [Ur.TABLE, Ur.TEMPLATE, Ur.HTML],\n  di = [Ur.TD, Ur.TH];\nclass mi {\n  get currentTmplContentOrNode() {\n    return this._isInTemplate() ? this.treeAdapter.getTemplateContent(this.current) : this.current;\n  }\n  constructor(e, t, n) {\n    ((this.treeAdapter = t),\n      (this.handler = n),\n      (this.items = []),\n      (this.tagIDs = []),\n      (this.stackTop = -1),\n      (this.tmplCount = 0),\n      (this.currentTagId = Ur.UNKNOWN),\n      (this.current = e));\n  }\n  _indexOf(e) {\n    return this.items.lastIndexOf(e, this.stackTop);\n  }\n  _isInTemplate() {\n    return this.currentTagId === Ur.TEMPLATE && this.treeAdapter.getNamespaceURI(this.current) === Mr.HTML;\n  }\n  _updateCurrentElement() {\n    ((this.current = this.items[this.stackTop]), (this.currentTagId = this.tagIDs[this.stackTop]));\n  }\n  push(e, t) {\n    (this.stackTop++,\n      (this.items[this.stackTop] = e),\n      (this.current = e),\n      (this.tagIDs[this.stackTop] = t),\n      (this.currentTagId = t),\n      this._isInTemplate() && this.tmplCount++,\n      this.handler.onItemPush(e, t, !0));\n  }\n  pop() {\n    var e = this.current;\n    (0 < this.tmplCount && this._isInTemplate() && this.tmplCount--,\n      this.stackTop--,\n      this._updateCurrentElement(),\n      this.handler.onItemPop(e, !0));\n  }\n  replace(e, t) {\n    ((e = this._indexOf(e)), (this.items[e] = t), e === this.stackTop && (this.current = t));\n  }\n  insertAfter(e, t, n) {\n    ((e = this._indexOf(e) + 1),\n      this.items.splice(e, 0, t),\n      this.tagIDs.splice(e, 0, n),\n      this.stackTop++,\n      e === this.stackTop && this._updateCurrentElement(),\n      this.handler.onItemPush(this.current, this.currentTagId, e === this.stackTop));\n  }\n  popUntilTagNamePopped(e) {\n    let t = this.stackTop + 1;\n    for (\n      ;\n      0 < (t = this.tagIDs.lastIndexOf(e, t - 1)) && this.treeAdapter.getNamespaceURI(this.items[t]) !== Mr.HTML;\n    );\n    this.shortenToLength(t < 0 ? 0 : t);\n  }\n  shortenToLength(e) {\n    for (; this.stackTop >= e; ) {\n      var t = this.current;\n      (0 < this.tmplCount && this._isInTemplate() && --this.tmplCount,\n        this.stackTop--,\n        this._updateCurrentElement(),\n        this.handler.onItemPop(t, this.stackTop < e));\n    }\n  }\n  popUntilElementPopped(e) {\n    ((e = this._indexOf(e)), this.shortenToLength(e < 0 ? 0 : e));\n  }\n  popUntilPopped(e, t) {\n    ((e = this._indexOfTagNames(e, t)), this.shortenToLength(e < 0 ? 0 : e));\n  }\n  popUntilNumberedHeaderPopped() {\n    this.popUntilPopped(li, Mr.HTML);\n  }\n  popUntilTableCellPopped() {\n    this.popUntilPopped(di, Mr.HTML);\n  }\n  popAllUpToHtmlElement() {\n    ((this.tmplCount = 0), this.shortenToLength(1));\n  }\n  _indexOfTagNames(e, t) {\n    for (let n = this.stackTop; 0 <= n; n--)\n      if (e.includes(this.tagIDs[n]) && this.treeAdapter.getNamespaceURI(this.items[n]) === t) return n;\n    return -1;\n  }\n  clearBackTo(e, t) {\n    ((e = this._indexOfTagNames(e, t)), this.shortenToLength(e + 1));\n  }\n  clearBackToTableContext() {\n    this.clearBackTo(pi, Mr.HTML);\n  }\n  clearBackToTableBodyContext() {\n    this.clearBackTo(fi, Mr.HTML);\n  }\n  clearBackToTableRowContext() {\n    this.clearBackTo(hi, Mr.HTML);\n  }\n  remove(e) {\n    var t = this._indexOf(e);\n    0 <= t &&\n      (t === this.stackTop\n        ? this.pop()\n        : (this.items.splice(t, 1),\n          this.tagIDs.splice(t, 1),\n          this.stackTop--,\n          this._updateCurrentElement(),\n          this.handler.onItemPop(e, !1)));\n  }\n  tryPeekProperlyNestedBodyElement() {\n    return 1 <= this.stackTop && this.tagIDs[1] === Ur.BODY ? this.items[1] : null;\n  }\n  contains(e) {\n    return -1 < this._indexOf(e);\n  }\n  getCommonAncestor(e) {\n    return 0 <= (e = this._indexOf(e) - 1) ? this.items[e] : null;\n  }\n  isRootHtmlElementCurrent() {\n    return 0 === this.stackTop && this.tagIDs[0] === Ur.HTML;\n  }\n  hasInScope(e) {\n    for (let t = this.stackTop; 0 <= t; t--) {\n      var n = this.tagIDs[t],\n        r = this.treeAdapter.getNamespaceURI(this.items[t]);\n      if (n === e && r === Mr.HTML) return !0;\n      if (ui.get(n) === r) return !1;\n    }\n    return !0;\n  }\n  hasNumberedHeaderInScope() {\n    for (let e = this.stackTop; 0 <= e; e--) {\n      var t = this.tagIDs[e],\n        n = this.treeAdapter.getNamespaceURI(this.items[e]);\n      if (Wr(t) && n === Mr.HTML) return !0;\n      if (ui.get(t) === n) return !1;\n    }\n    return !0;\n  }\n  hasInListItemScope(e) {\n    for (let t = this.stackTop; 0 <= t; t--) {\n      var n = this.tagIDs[t],\n        r = this.treeAdapter.getNamespaceURI(this.items[t]);\n      if (n === e && r === Mr.HTML) return !0;\n      if (((n === Ur.UL || n === Ur.OL) && r === Mr.HTML) || ui.get(n) === r) return !1;\n    }\n    return !0;\n  }\n  hasInButtonScope(e) {\n    for (let t = this.stackTop; 0 <= t; t--) {\n      var n = this.tagIDs[t],\n        r = this.treeAdapter.getNamespaceURI(this.items[t]);\n      if (n === e && r === Mr.HTML) return !0;\n      if ((n === Ur.BUTTON && r === Mr.HTML) || ui.get(n) === r) return !1;\n    }\n    return !0;\n  }\n  hasInTableScope(e) {\n    for (let t = this.stackTop; 0 <= t; t--) {\n      var n = this.tagIDs[t];\n      if (this.treeAdapter.getNamespaceURI(this.items[t]) === Mr.HTML) {\n        if (n === e) return !0;\n        if (n === Ur.TABLE || n === Ur.TEMPLATE || n === Ur.HTML) return !1;\n      }\n    }\n    return !0;\n  }\n  hasTableBodyContextInTableScope() {\n    for (let e = this.stackTop; 0 <= e; e--) {\n      var t = this.tagIDs[e];\n      if (this.treeAdapter.getNamespaceURI(this.items[e]) === Mr.HTML) {\n        if (t === Ur.TBODY || t === Ur.THEAD || t === Ur.TFOOT) return !0;\n        if (t === Ur.TABLE || t === Ur.HTML) return !1;\n      }\n    }\n    return !0;\n  }\n  hasInSelectScope(e) {\n    for (let t = this.stackTop; 0 <= t; t--) {\n      var n = this.tagIDs[t];\n      if (this.treeAdapter.getNamespaceURI(this.items[t]) === Mr.HTML) {\n        if (n === e) return !0;\n        if (n !== Ur.OPTION && n !== Ur.OPTGROUP) return !1;\n      }\n    }\n    return !0;\n  }\n  generateImpliedEndTags() {\n    for (; oi.has(this.currentTagId); ) this.pop();\n  }\n  generateImpliedEndTagsThoroughly() {\n    for (; ci.has(this.currentTagId); ) this.pop();\n  }\n  generateImpliedEndTagsWithExclusion(e) {\n    for (; this.currentTagId !== e && ci.has(this.currentTagId); ) this.pop();\n  }\n}\n!(function (e) {\n  ((e[(e.Marker = 0)] = 'Marker'), (e[(e.Element = 1)] = 'Element'));\n})((_i = _i || {}));\nconst Ei = { type: _i.Marker };\nclass Ti {\n  constructor(e) {\n    ((this.treeAdapter = e), (this.entries = []), (this.bookmark = null));\n  }\n  _getNoahArkConditionCandidates(e, t) {\n    var n = [],\n      r = t.length,\n      i = this.treeAdapter.getTagName(e),\n      s = this.treeAdapter.getNamespaceURI(e);\n    for (let e = 0; e < this.entries.length; e++) {\n      const t = this.entries[e];\n      if (t.type === _i.Marker) break;\n      var a = t.element;\n      if (this.treeAdapter.getTagName(a) === i && this.treeAdapter.getNamespaceURI(a) === s) {\n        const t = this.treeAdapter.getAttrList(a);\n        t.length === r && n.push({ idx: e, attrs: t });\n      }\n    }\n    return n;\n  }\n  _ensureNoahArkCondition(e) {\n    if (!(this.entries.length < 3)) {\n      var t = this.treeAdapter.getAttrList(e),\n        n = this._getNoahArkConditionCandidates(e, t);\n      if (!(n.length < 3)) {\n        const r = new Map(t.map((e) => [e.name, e.value]));\n        let i = 0;\n        for (let e = 0; e < n.length; e++) {\n          const t = n[e];\n          t.attrs.every((e) => r.get(e.name) === e.value) && 3 <= (i += 1) && this.entries.splice(t.idx, 1);\n        }\n      }\n    }\n  }\n  insertMarker() {\n    this.entries.unshift(Ei);\n  }\n  pushElement(e, t) {\n    (this._ensureNoahArkCondition(e), this.entries.unshift({ type: _i.Element, element: e, token: t }));\n  }\n  insertElementAfterBookmark(e, t) {\n    var n = this.entries.indexOf(this.bookmark);\n    this.entries.splice(n, 0, { type: _i.Element, element: e, token: t });\n  }\n  removeEntry(e) {\n    0 <= (e = this.entries.indexOf(e)) && this.entries.splice(e, 1);\n  }\n  clearToLastMarker() {\n    var e = this.entries.indexOf(Ei);\n    0 <= e ? this.entries.splice(0, e + 1) : (this.entries.length = 0);\n  }\n  getElementEntryInScopeWithTagName(e) {\n    var t = this.entries.find((t) => t.type === _i.Marker || this.treeAdapter.getTagName(t.element) === e);\n    return t && t.type === _i.Element ? t : null;\n  }\n  getElementEntry(e) {\n    return this.entries.find((t) => t.type === _i.Element && t.element === e);\n  }\n}\nfunction Ai(e) {\n  return { nodeName: '#text', value: e, parentNode: null };\n}\nconst gi = {\n    createDocument: () => ({ nodeName: '#document', mode: Br.NO_QUIRKS, childNodes: [] }),\n    createDocumentFragment: () => ({ nodeName: '#document-fragment', childNodes: [] }),\n    createElement: (e, t, n) => ({\n      nodeName: e,\n      tagName: e,\n      attrs: n,\n      namespaceURI: t,\n      childNodes: [],\n      parentNode: null,\n    }),\n    createCommentNode: (e) => ({ nodeName: '#comment', data: e, parentNode: null }),\n    appendChild(e, t) {\n      (e.childNodes.push(t), (t.parentNode = e));\n    },\n    insertBefore(e, t, n) {\n      ((n = e.childNodes.indexOf(n)), e.childNodes.splice(n, 0, t), (t.parentNode = e));\n    },\n    setTemplateContent(e, t) {\n      e.content = t;\n    },\n    getTemplateContent: (e) => e.content,\n    setDocumentType(e, t, n, r) {\n      const i = e.childNodes.find((e) => '#documentType' === e.nodeName);\n      if (i) ((i.name = t), (i.publicId = n), (i.systemId = r));\n      else {\n        const i = { nodeName: '#documentType', name: t, publicId: n, systemId: r, parentNode: null };\n        gi.appendChild(e, i);\n      }\n    },\n    setDocumentMode(e, t) {\n      e.mode = t;\n    },\n    getDocumentMode: (e) => e.mode,\n    detachNode(e) {\n      var t;\n      e.parentNode &&\n        ((t = e.parentNode.childNodes.indexOf(e)), e.parentNode.childNodes.splice(t, 1), (e.parentNode = null));\n    },\n    insertText(e, t) {\n      if (0 < e.childNodes.length) {\n        var n = e.childNodes[e.childNodes.length - 1];\n        if (gi.isTextNode(n)) return void (n.value += t);\n      }\n      gi.appendChild(e, Ai(t));\n    },\n    insertTextBefore(e, t, n) {\n      var r = e.childNodes[e.childNodes.indexOf(n) - 1];\n      r && gi.isTextNode(r) ? (r.value += t) : gi.insertBefore(e, Ai(t), n);\n    },\n    adoptAttributes(e, t) {\n      var n = new Set(e.attrs.map((e) => e.name));\n      for (let r = 0; r < t.length; r++) n.has(t[r].name) || e.attrs.push(t[r]);\n    },\n    getFirstChild: (e) => e.childNodes[0],\n    getChildNodes: (e) => e.childNodes,\n    getParentNode: (e) => e.parentNode,\n    getAttrList: (e) => e.attrs,\n    getTagName: (e) => e.tagName,\n    getNamespaceURI: (e) => e.namespaceURI,\n    getTextNodeContent: (e) => e.value,\n    getCommentNodeContent: (e) => e.data,\n    getDocumentTypeNodeName: (e) => e.name,\n    getDocumentTypeNodePublicId: (e) => e.publicId,\n    getDocumentTypeNodeSystemId: (e) => e.systemId,\n    isTextNode: (e) => '#text' === e.nodeName,\n    isCommentNode: (e) => '#comment' === e.nodeName,\n    isDocumentTypeNode: (e) => '#documentType' === e.nodeName,\n    isElementNode: (e) => Object.prototype.hasOwnProperty.call(e, 'tagName'),\n    setNodeSourceCodeLocation(e, t) {\n      e.sourceCodeLocation = t;\n    },\n    getNodeSourceCodeLocation: (e) => e.sourceCodeLocation,\n    updateNodeSourceCodeLocation(e, t) {\n      e.sourceCodeLocation = { ...e.sourceCodeLocation, ...t };\n    },\n  },\n  vi = 'html',\n  yi = 'about:legacy-compat',\n  Si = 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd',\n  Ci = [\n    '+//silmaril//dtd html pro v0r11 19970101//',\n    '-//as//dtd html 3.0 aswedit + extensions//',\n    '-//advasoft ltd//dtd html 3.0 aswedit + extensions//',\n    '-//ietf//dtd html 2.0 level 1//',\n    '-//ietf//dtd html 2.0 level 2//',\n    '-//ietf//dtd html 2.0 strict level 1//',\n    '-//ietf//dtd html 2.0 strict level 2//',\n    '-//ietf//dtd html 2.0 strict//',\n    '-//ietf//dtd html 2.0//',\n    '-//ietf//dtd html 2.1e//',\n    '-//ietf//dtd html 3.0//',\n    '-//ietf//dtd html 3.2 final//',\n    '-//ietf//dtd html 3.2//',\n    '-//ietf//dtd html 3//',\n    '-//ietf//dtd html level 0//',\n    '-//ietf//dtd html level 1//',\n    '-//ietf//dtd html level 2//',\n    '-//ietf//dtd html level 3//',\n    '-//ietf//dtd html strict level 0//',\n    '-//ietf//dtd html strict level 1//',\n    '-//ietf//dtd html strict level 2//',\n    '-//ietf//dtd html strict level 3//',\n    '-//ietf//dtd html strict//',\n    '-//ietf//dtd html//',\n    '-//metrius//dtd metrius presentational//',\n    '-//microsoft//dtd internet explorer 2.0 html strict//',\n    '-//microsoft//dtd internet explorer 2.0 html//',\n    '-//microsoft//dtd internet explorer 2.0 tables//',\n    '-//microsoft//dtd internet explorer 3.0 html strict//',\n    '-//microsoft//dtd internet explorer 3.0 html//',\n    '-//microsoft//dtd internet explorer 3.0 tables//',\n    '-//netscape comm. corp.//dtd html//',\n    '-//netscape comm. corp.//dtd strict html//',\n    \"-//o'reilly and associates//dtd html 2.0//\",\n    \"-//o'reilly and associates//dtd html extended 1.0//\",\n    \"-//o'reilly and associates//dtd html extended relaxed 1.0//\",\n    '-//sq//dtd html 2.0 hotmetal + extensions//',\n    '-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//',\n    '-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//',\n    '-//spyglass//dtd html 2.0 extended//',\n    '-//sun microsystems corp.//dtd hotjava html//',\n    '-//sun microsystems corp.//dtd hotjava strict html//',\n    '-//w3c//dtd html 3 1995-03-24//',\n    '-//w3c//dtd html 3.2 draft//',\n    '-//w3c//dtd html 3.2 final//',\n    '-//w3c//dtd html 3.2//',\n    '-//w3c//dtd html 3.2s draft//',\n    '-//w3c//dtd html 4.0 frameset//',\n    '-//w3c//dtd html 4.0 transitional//',\n    '-//w3c//dtd html experimental 19960712//',\n    '-//w3c//dtd html experimental 970421//',\n    '-//w3c//dtd w3 html//',\n    '-//w3o//dtd w3 html 3.0//',\n    '-//webtechs//dtd mozilla html 2.0//',\n    '-//webtechs//dtd mozilla html//',\n  ],\n  Ni = [...Ci, '-//w3c//dtd html 4.01 frameset//', '-//w3c//dtd html 4.01 transitional//'],\n  bi = new Set(['-//w3o//dtd w3 html strict 3.0//en//', '-/w3c/dtd html 4.0 transitional/en', 'html']),\n  Ii = ['-//w3c//dtd xhtml 1.0 frameset//', '-//w3c//dtd xhtml 1.0 transitional//'],\n  Oi = [...Ii, '-//w3c//dtd html 4.01 frameset//', '-//w3c//dtd html 4.01 transitional//'];\nfunction ki(e, t) {\n  return t.some((t) => e.startsWith(t));\n}\nconst Li = { TEXT_HTML: 'text/html', APPLICATION_XML: 'application/xhtml+xml' },\n  Di = 'definitionurl',\n  Ri = 'definitionURL',\n  wi = new Map(\n    [\n      'attributeName',\n      'attributeType',\n      'baseFrequency',\n      'baseProfile',\n      'calcMode',\n      'clipPathUnits',\n      'diffuseConstant',\n      'edgeMode',\n      'filterUnits',\n      'glyphRef',\n      'gradientTransform',\n      'gradientUnits',\n      'kernelMatrix',\n      'kernelUnitLength',\n      'keyPoints',\n      'keySplines',\n      'keyTimes',\n      'lengthAdjust',\n      'limitingConeAngle',\n      'markerHeight',\n      'markerUnits',\n      'markerWidth',\n      'maskContentUnits',\n      'maskUnits',\n      'numOctaves',\n      'pathLength',\n      'patternContentUnits',\n      'patternTransform',\n      'patternUnits',\n      'pointsAtX',\n      'pointsAtY',\n      'pointsAtZ',\n      'preserveAlpha',\n      'preserveAspectRatio',\n      'primitiveUnits',\n      'refX',\n      'refY',\n      'repeatCount',\n      'repeatDur',\n      'requiredExtensions',\n      'requiredFeatures',\n      'specularConstant',\n      'specularExponent',\n      'spreadMethod',\n      'startOffset',\n      'stdDeviation',\n      'stitchTiles',\n      'surfaceScale',\n      'systemLanguage',\n      'tableValues',\n      'targetX',\n      'targetY',\n      'textLength',\n      'viewBox',\n      'viewTarget',\n      'xChannelSelector',\n      'yChannelSelector',\n      'zoomAndPan',\n    ].map((e) => [e.toLowerCase(), e]),\n  ),\n  xi = new Map([\n    ['xlink:actuate', { prefix: 'xlink', name: 'actuate', namespace: Mr.XLINK }],\n    ['xlink:arcrole', { prefix: 'xlink', name: 'arcrole', namespace: Mr.XLINK }],\n    ['xlink:href', { prefix: 'xlink', name: 'href', namespace: Mr.XLINK }],\n    ['xlink:role', { prefix: 'xlink', name: 'role', namespace: Mr.XLINK }],\n    ['xlink:show', { prefix: 'xlink', name: 'show', namespace: Mr.XLINK }],\n    ['xlink:title', { prefix: 'xlink', name: 'title', namespace: Mr.XLINK }],\n    ['xlink:type', { prefix: 'xlink', name: 'type', namespace: Mr.XLINK }],\n    ['xml:base', { prefix: 'xml', name: 'base', namespace: Mr.XML }],\n    ['xml:lang', { prefix: 'xml', name: 'lang', namespace: Mr.XML }],\n    ['xml:space', { prefix: 'xml', name: 'space', namespace: Mr.XML }],\n    ['xmlns', { prefix: '', name: 'xmlns', namespace: Mr.XMLNS }],\n    ['xmlns:xlink', { prefix: 'xmlns', name: 'xlink', namespace: Mr.XMLNS }],\n  ]),\n  Mi = new Map(\n    [\n      'altGlyph',\n      'altGlyphDef',\n      'altGlyphItem',\n      'animateColor',\n      'animateMotion',\n      'animateTransform',\n      'clipPath',\n      'feBlend',\n      'feColorMatrix',\n      'feComponentTransfer',\n      'feComposite',\n      'feConvolveMatrix',\n      'feDiffuseLighting',\n      'feDisplacementMap',\n      'feDistantLight',\n      'feFlood',\n      'feFuncA',\n      'feFuncB',\n      'feFuncG',\n      'feFuncR',\n      'feGaussianBlur',\n      'feImage',\n      'feMerge',\n      'feMergeNode',\n      'feMorphology',\n      'feOffset',\n      'fePointLight',\n      'feSpecularLighting',\n      'feSpotLight',\n      'feTile',\n      'feTurbulence',\n      'foreignObject',\n      'glyphRef',\n      'linearGradient',\n      'radialGradient',\n      'textPath',\n    ].map((e) => [e.toLowerCase(), e]),\n  ),\n  Pi = new Set([\n    Ur.B,\n    Ur.BIG,\n    Ur.BLOCKQUOTE,\n    Ur.BODY,\n    Ur.BR,\n    Ur.CENTER,\n    Ur.CODE,\n    Ur.DD,\n    Ur.DIV,\n    Ur.DL,\n    Ur.DT,\n    Ur.EM,\n    Ur.EMBED,\n    Ur.H1,\n    Ur.H2,\n    Ur.H3,\n    Ur.H4,\n    Ur.H5,\n    Ur.H6,\n    Ur.HEAD,\n    Ur.HR,\n    Ur.I,\n    Ur.IMG,\n    Ur.LI,\n    Ur.LISTING,\n    Ur.MENU,\n    Ur.META,\n    Ur.NOBR,\n    Ur.OL,\n    Ur.P,\n    Ur.PRE,\n    Ur.RUBY,\n    Ur.S,\n    Ur.SMALL,\n    Ur.SPAN,\n    Ur.STRONG,\n    Ur.STRIKE,\n    Ur.SUB,\n    Ur.SUP,\n    Ur.TABLE,\n    Ur.TT,\n    Ur.U,\n    Ur.UL,\n    Ur.VAR,\n  ]);\nfunction Bi(e) {\n  for (let t = 0; t < e.attrs.length; t++)\n    if (e.attrs[t].name === Di) {\n      e.attrs[t].name = Ri;\n      break;\n    }\n}\nfunction Fi(e) {\n  for (let t = 0; t < e.attrs.length; t++) {\n    var n = wi.get(e.attrs[t].name);\n    null != n && (e.attrs[t].name = n);\n  }\n}\nfunction Ui(e) {\n  for (let t = 0; t < e.attrs.length; t++) {\n    var n = xi.get(e.attrs[t].name);\n    n && ((e.attrs[t].prefix = n.prefix), (e.attrs[t].name = n.name), (e.attrs[t].namespace = n.namespace));\n  }\n}\nfunction Hi(e, t, n, r) {\n  return (\n    ((!r || r === Mr.HTML) &&\n      (function (e, t, n) {\n        if (t === Mr.MATHML && e === Ur.ANNOTATION_XML)\n          for (let e = 0; e < n.length; e++)\n            if (n[e].name === Pr.ENCODING) {\n              const t = n[e].value.toLowerCase();\n              return t === Li.TEXT_HTML || t === Li.APPLICATION_XML;\n            }\n        return t === Mr.SVG && (e === Ur.FOREIGN_OBJECT || e === Ur.DESC || e === Ur.TITLE);\n      })(e, t, n)) ||\n    ((!r || r === Mr.MATHML) &&\n      (function (e, t) {\n        return t === Mr.MATHML && (e === Ur.MI || e === Ur.MO || e === Ur.MN || e === Ur.MS || e === Ur.MTEXT);\n      })(e, t))\n  );\n}\nconst Gi = 'hidden',\n  ji = 8,\n  qi = 3,\n  Ki =\n    ((function (e) {\n      ((e[(e.INITIAL = 0)] = 'INITIAL'),\n        (e[(e.BEFORE_HTML = 1)] = 'BEFORE_HTML'),\n        (e[(e.BEFORE_HEAD = 2)] = 'BEFORE_HEAD'),\n        (e[(e.IN_HEAD = 3)] = 'IN_HEAD'),\n        (e[(e.IN_HEAD_NO_SCRIPT = 4)] = 'IN_HEAD_NO_SCRIPT'),\n        (e[(e.AFTER_HEAD = 5)] = 'AFTER_HEAD'),\n        (e[(e.IN_BODY = 6)] = 'IN_BODY'),\n        (e[(e.TEXT = 7)] = 'TEXT'),\n        (e[(e.IN_TABLE = 8)] = 'IN_TABLE'),\n        (e[(e.IN_TABLE_TEXT = 9)] = 'IN_TABLE_TEXT'),\n        (e[(e.IN_CAPTION = 10)] = 'IN_CAPTION'),\n        (e[(e.IN_COLUMN_GROUP = 11)] = 'IN_COLUMN_GROUP'),\n        (e[(e.IN_TABLE_BODY = 12)] = 'IN_TABLE_BODY'),\n        (e[(e.IN_ROW = 13)] = 'IN_ROW'),\n        (e[(e.IN_CELL = 14)] = 'IN_CELL'),\n        (e[(e.IN_SELECT = 15)] = 'IN_SELECT'),\n        (e[(e.IN_SELECT_IN_TABLE = 16)] = 'IN_SELECT_IN_TABLE'),\n        (e[(e.IN_TEMPLATE = 17)] = 'IN_TEMPLATE'),\n        (e[(e.AFTER_BODY = 18)] = 'AFTER_BODY'),\n        (e[(e.IN_FRAMESET = 19)] = 'IN_FRAMESET'),\n        (e[(e.AFTER_FRAMESET = 20)] = 'AFTER_FRAMESET'),\n        (e[(e.AFTER_AFTER_BODY = 21)] = 'AFTER_AFTER_BODY'),\n        (e[(e.AFTER_AFTER_FRAMESET = 22)] = 'AFTER_AFTER_FRAMESET'));\n    })((Yi = Yi || {})),\n    { startLine: -1, startCol: -1, startOffset: -1, endLine: -1, endCol: -1, endOffset: -1 }),\n  Wi = new Set([Ur.TABLE, Ur.TBODY, Ur.TFOOT, Ur.THEAD, Ur.TR]),\n  Vi = { scriptingEnabled: !0, sourceCodeLocationInfo: !1, treeAdapter: gi, onParseError: null };\nclass $i {\n  constructor(e, t, n = null, r = null) {\n    ((this.fragmentContext = n),\n      (this.scriptHandler = r),\n      (this.currentToken = null),\n      (this.stopped = !1),\n      (this.insertionMode = Yi.INITIAL),\n      (this.originalInsertionMode = Yi.INITIAL),\n      (this.headElement = null),\n      (this.formElement = null),\n      (this.currentNotInHTML = !1),\n      (this.tmplInsertionModeStack = []),\n      (this.pendingCharacterTokens = []),\n      (this.hasNonWhitespacePendingCharacterToken = !1),\n      (this.framesetOk = !0),\n      (this.skipNextNewLine = !1),\n      (this.fosterParentingEnabled = !1),\n      (this.options = { ...Vi, ...e }),\n      (this.treeAdapter = this.options.treeAdapter),\n      (this.onParseError = this.options.onParseError),\n      this.onParseError && (this.options.sourceCodeLocationInfo = !0),\n      (this.document = null != t ? t : this.treeAdapter.createDocument()),\n      (this.tokenizer = new ai(this.options, this)),\n      (this.activeFormattingElements = new Ti(this.treeAdapter)),\n      (this.fragmentContextID = n ? qr(this.treeAdapter.getTagName(n)) : Ur.UNKNOWN),\n      this._setContextModes(null != n ? n : this.document, this.fragmentContextID),\n      (this.openElements = new mi(this.document, this.treeAdapter, this)));\n  }\n  static parse(e, t) {\n    return ((t = new this(t)).tokenizer.write(e, !0), t.document);\n  }\n  static getFragmentParser(e, t) {\n    var t = { ...Vi, ...t },\n      r =\n        (null == e && (e = t.treeAdapter.createElement(Fr.TEMPLATE, Mr.HTML, [])),\n        t.treeAdapter.createElement('documentmock', Mr.HTML, []));\n    return (\n      (t = new this(t, r, e)).fragmentContextID === Ur.TEMPLATE && t.tmplInsertionModeStack.unshift(Yi.IN_TEMPLATE),\n      t._initTokenizerForFragmentParsing(),\n      t._insertFakeRootElement(),\n      t._resetInsertionMode(),\n      t._findFormInFragmentContext(),\n      t\n    );\n  }\n  getFragment() {\n    var e = this.treeAdapter.getFirstChild(this.document),\n      t = this.treeAdapter.createDocumentFragment();\n    return (this._adoptNodes(e, t), t);\n  }\n  _err(e, t, n) {\n    this.onParseError &&\n      ((t = {\n        code: t,\n        startLine: (e = null != (t = e.location) ? t : Ki).startLine,\n        startCol: e.startCol,\n        startOffset: e.startOffset,\n        endLine: n ? e.startLine : e.endLine,\n        endCol: n ? e.startCol : e.endCol,\n        endOffset: n ? e.startOffset : e.endOffset,\n      }),\n      this.onParseError(t));\n  }\n  onItemPush(e, t, n) {\n    var r, i;\n    (null != (i = (r = this.treeAdapter).onItemPush) && i.call(r, e),\n      n && 0 < this.openElements.stackTop && this._setContextModes(e, t));\n  }\n  onItemPop(e, t) {\n    var n, r;\n    if (\n      (this.options.sourceCodeLocationInfo && this._setEndLocation(e, this.currentToken),\n      null != (r = (n = this.treeAdapter).onItemPop) && r.call(n, e, this.openElements.current),\n      t)\n    ) {\n      let e, t;\n      (0 === this.openElements.stackTop && this.fragmentContext\n        ? ((e = this.fragmentContext), (t = this.fragmentContextID))\n        : ({ current: e, currentTagId: t } = this.openElements),\n        this._setContextModes(e, t));\n    }\n  }\n  _setContextModes(e, t) {\n    var n = e === this.document || this.treeAdapter.getNamespaceURI(e) === Mr.HTML;\n    ((this.currentNotInHTML = !n), (this.tokenizer.inForeignNode = !n && !this._isIntegrationPoint(t, e)));\n  }\n  _switchToTextParsing(e, t) {\n    (this._insertElement(e, Mr.HTML),\n      (this.tokenizer.state = t),\n      (this.originalInsertionMode = this.insertionMode),\n      (this.insertionMode = Yi.TEXT));\n  }\n  switchToPlaintextParsing() {\n    ((this.insertionMode = Yi.TEXT), (this.originalInsertionMode = Yi.IN_BODY), (this.tokenizer.state = zr.PLAINTEXT));\n  }\n  _getAdjustedCurrentElement() {\n    return 0 === this.openElements.stackTop && this.fragmentContext ? this.fragmentContext : this.openElements.current;\n  }\n  _findFormInFragmentContext() {\n    let e = this.fragmentContext;\n    for (; e; ) {\n      if (this.treeAdapter.getTagName(e) === Fr.FORM) {\n        this.formElement = e;\n        break;\n      }\n      e = this.treeAdapter.getParentNode(e);\n    }\n  }\n  _initTokenizerForFragmentParsing() {\n    if (this.fragmentContext && this.treeAdapter.getNamespaceURI(this.fragmentContext) === Mr.HTML)\n      switch (this.fragmentContextID) {\n        case Ur.TITLE:\n        case Ur.TEXTAREA:\n          this.tokenizer.state = zr.RCDATA;\n          break;\n        case Ur.STYLE:\n        case Ur.XMP:\n        case Ur.IFRAME:\n        case Ur.NOEMBED:\n        case Ur.NOFRAMES:\n        case Ur.NOSCRIPT:\n          this.tokenizer.state = zr.RAWTEXT;\n          break;\n        case Ur.SCRIPT:\n          this.tokenizer.state = zr.SCRIPT_DATA;\n          break;\n        case Ur.PLAINTEXT:\n          this.tokenizer.state = zr.PLAINTEXT;\n      }\n  }\n  _setDocumentType(e) {\n    const t = e.name || '',\n      n = e.publicId || '',\n      r = e.systemId || '';\n    if ((this.treeAdapter.setDocumentType(this.document, t, n, r), e.location)) {\n      const t = this.treeAdapter.getChildNodes(this.document).find((e) => this.treeAdapter.isDocumentTypeNode(e));\n      t && this.treeAdapter.setNodeSourceCodeLocation(t, e.location);\n    }\n  }\n  _attachElementToTree(e, t) {\n    if (\n      (this.options.sourceCodeLocationInfo &&\n        ((t = t && { ...t, startTag: t }), this.treeAdapter.setNodeSourceCodeLocation(e, t)),\n      this._shouldFosterParentOnInsertion())\n    )\n      this._fosterParentElement(e);\n    else {\n      const t = this.openElements.currentTmplContentOrNode;\n      this.treeAdapter.appendChild(t, e);\n    }\n  }\n  _appendElement(e, t) {\n    ((t = this.treeAdapter.createElement(e.tagName, t, e.attrs)), this._attachElementToTree(t, e.location));\n  }\n  _insertElement(e, t) {\n    ((t = this.treeAdapter.createElement(e.tagName, t, e.attrs)),\n      this._attachElementToTree(t, e.location),\n      this.openElements.push(t, e.tagID));\n  }\n  _insertFakeElement(e, t) {\n    ((e = this.treeAdapter.createElement(e, Mr.HTML, [])),\n      this._attachElementToTree(e, null),\n      this.openElements.push(e, t));\n  }\n  _insertTemplate(e) {\n    var t = this.treeAdapter.createElement(e.tagName, Mr.HTML, e.attrs),\n      n = this.treeAdapter.createDocumentFragment();\n    (this.treeAdapter.setTemplateContent(t, n),\n      this._attachElementToTree(t, e.location),\n      this.openElements.push(t, e.tagID),\n      this.options.sourceCodeLocationInfo && this.treeAdapter.setNodeSourceCodeLocation(n, null));\n  }\n  _insertFakeRootElement() {\n    var e = this.treeAdapter.createElement(Fr.HTML, Mr.HTML, []);\n    (this.options.sourceCodeLocationInfo && this.treeAdapter.setNodeSourceCodeLocation(e, null),\n      this.treeAdapter.appendChild(this.openElements.current, e),\n      this.openElements.push(e, Ur.HTML));\n  }\n  _appendCommentNode(e, t) {\n    var n = this.treeAdapter.createCommentNode(e.data);\n    (this.treeAdapter.appendChild(t, n),\n      this.options.sourceCodeLocationInfo && this.treeAdapter.setNodeSourceCodeLocation(n, e.location));\n  }\n  _insertCharacters(e) {\n    let t, n;\n    if (\n      (this._shouldFosterParentOnInsertion()\n        ? (({ parent: t, beforeElement: n } = this._findFosterParentingLocation()),\n          n ? this.treeAdapter.insertTextBefore(t, e.chars, n) : this.treeAdapter.insertText(t, e.chars))\n        : ((t = this.openElements.currentTmplContentOrNode), this.treeAdapter.insertText(t, e.chars)),\n      e.location)\n    ) {\n      var r = this.treeAdapter.getChildNodes(t),\n        i = n ? r.lastIndexOf(n) : r.length,\n        i = r[i - 1];\n      if (this.treeAdapter.getNodeSourceCodeLocation(i)) {\n        const { endLine: t, endCol: n, endOffset: r } = e.location;\n        this.treeAdapter.updateNodeSourceCodeLocation(i, { endLine: t, endCol: n, endOffset: r });\n      } else this.options.sourceCodeLocationInfo && this.treeAdapter.setNodeSourceCodeLocation(i, e.location);\n    }\n  }\n  _adoptNodes(e, t) {\n    for (let n = this.treeAdapter.getFirstChild(e); n; n = this.treeAdapter.getFirstChild(e))\n      (this.treeAdapter.detachNode(n), this.treeAdapter.appendChild(t, n));\n  }\n  _setEndLocation(e, t) {\n    var n, r;\n    this.treeAdapter.getNodeSourceCodeLocation(e) &&\n      t.location &&\n      ((n = t.location),\n      (r = this.treeAdapter.getTagName(e)),\n      (r =\n        t.type === Tr.END_TAG && r === t.tagName\n          ? { endTag: { ...n }, endLine: n.endLine, endCol: n.endCol, endOffset: n.endOffset }\n          : { endLine: n.startLine, endCol: n.startCol, endOffset: n.startOffset }),\n      this.treeAdapter.updateNodeSourceCodeLocation(e, r));\n  }\n  shouldProcessStartTagTokenInForeignContent(e) {\n    if (!this.currentNotInHTML) return !1;\n    let t, n;\n    return (\n      0 === this.openElements.stackTop && this.fragmentContext\n        ? ((t = this.fragmentContext), (n = this.fragmentContextID))\n        : ({ current: t, currentTagId: n } = this.openElements),\n      (e.tagID !== Ur.SVG ||\n        this.treeAdapter.getTagName(t) !== Fr.ANNOTATION_XML ||\n        this.treeAdapter.getNamespaceURI(t) !== Mr.MATHML) &&\n        (this.tokenizer.inForeignNode ||\n          ((e.tagID === Ur.MGLYPH || e.tagID === Ur.MALIGNMARK) && !this._isIntegrationPoint(n, t, Mr.HTML)))\n    );\n  }\n  _processToken(e) {\n    switch (e.type) {\n      case Tr.CHARACTER:\n        this.onCharacter(e);\n        break;\n      case Tr.NULL_CHARACTER:\n        this.onNullCharacter(e);\n        break;\n      case Tr.COMMENT:\n        this.onComment(e);\n        break;\n      case Tr.DOCTYPE:\n        this.onDoctype(e);\n        break;\n      case Tr.START_TAG:\n        this._processStartTag(e);\n        break;\n      case Tr.END_TAG:\n        this.onEndTag(e);\n        break;\n      case Tr.EOF:\n        this.onEof(e);\n        break;\n      case Tr.WHITESPACE_CHARACTER:\n        this.onWhitespaceCharacter(e);\n    }\n  }\n  _isIntegrationPoint(e, t, n) {\n    return Hi(e, this.treeAdapter.getNamespaceURI(t), this.treeAdapter.getAttrList(t), n);\n  }\n  _reconstructActiveFormattingElements() {\n    const e = this.activeFormattingElements.entries.length;\n    if (e) {\n      var t = this.activeFormattingElements.entries.findIndex(\n        (e) => e.type === _i.Marker || this.openElements.contains(e.element),\n      );\n      for (let n = t < 0 ? e - 1 : t - 1; 0 <= n; n--) {\n        const e = this.activeFormattingElements.entries[n];\n        (this._insertElement(e.token, this.treeAdapter.getNamespaceURI(e.element)),\n          (e.element = this.openElements.current));\n      }\n    }\n  }\n  _closeTableCell() {\n    (this.openElements.generateImpliedEndTags(),\n      this.openElements.popUntilTableCellPopped(),\n      this.activeFormattingElements.clearToLastMarker(),\n      (this.insertionMode = Yi.IN_ROW));\n  }\n  _closePElement() {\n    (this.openElements.generateImpliedEndTagsWithExclusion(Ur.P), this.openElements.popUntilTagNamePopped(Ur.P));\n  }\n  _resetInsertionMode() {\n    for (let e = this.openElements.stackTop; 0 <= e; e--)\n      switch (0 === e && this.fragmentContext ? this.fragmentContextID : this.openElements.tagIDs[e]) {\n        case Ur.TR:\n          return void (this.insertionMode = Yi.IN_ROW);\n        case Ur.TBODY:\n        case Ur.THEAD:\n        case Ur.TFOOT:\n          return void (this.insertionMode = Yi.IN_TABLE_BODY);\n        case Ur.CAPTION:\n          return void (this.insertionMode = Yi.IN_CAPTION);\n        case Ur.COLGROUP:\n          return void (this.insertionMode = Yi.IN_COLUMN_GROUP);\n        case Ur.TABLE:\n          return void (this.insertionMode = Yi.IN_TABLE);\n        case Ur.BODY:\n          return void (this.insertionMode = Yi.IN_BODY);\n        case Ur.FRAMESET:\n          return void (this.insertionMode = Yi.IN_FRAMESET);\n        case Ur.SELECT:\n          return void this._resetInsertionModeForSelect(e);\n        case Ur.TEMPLATE:\n          return void (this.insertionMode = this.tmplInsertionModeStack[0]);\n        case Ur.HTML:\n          return void (this.insertionMode = this.headElement ? Yi.AFTER_HEAD : Yi.BEFORE_HEAD);\n        case Ur.TD:\n        case Ur.TH:\n          if (0 < e) return void (this.insertionMode = Yi.IN_CELL);\n          break;\n        case Ur.HEAD:\n          if (0 < e) return void (this.insertionMode = Yi.IN_HEAD);\n      }\n    this.insertionMode = Yi.IN_BODY;\n  }\n  _resetInsertionModeForSelect(e) {\n    if (0 < e)\n      for (let t = e - 1; 0 < t; t--) {\n        const e = this.openElements.tagIDs[t];\n        if (e === Ur.TEMPLATE) break;\n        if (e === Ur.TABLE) return void (this.insertionMode = Yi.IN_SELECT_IN_TABLE);\n      }\n    this.insertionMode = Yi.IN_SELECT;\n  }\n  _isElementCausesFosterParenting(e) {\n    return Wi.has(e);\n  }\n  _shouldFosterParentOnInsertion() {\n    return this.fosterParentingEnabled && this._isElementCausesFosterParenting(this.openElements.currentTagId);\n  }\n  _findFosterParentingLocation() {\n    for (let e = this.openElements.stackTop; 0 <= e; e--) {\n      var t = this.openElements.items[e];\n      switch (this.openElements.tagIDs[e]) {\n        case Ur.TEMPLATE:\n          if (this.treeAdapter.getNamespaceURI(t) === Mr.HTML)\n            return { parent: this.treeAdapter.getTemplateContent(t), beforeElement: null };\n          break;\n        case Ur.TABLE:\n          var n = this.treeAdapter.getParentNode(t);\n          return n ? { parent: n, beforeElement: t } : { parent: this.openElements.items[e - 1], beforeElement: null };\n      }\n    }\n    return { parent: this.openElements.items[0], beforeElement: null };\n  }\n  _fosterParentElement(e) {\n    var t = this._findFosterParentingLocation();\n    t.beforeElement\n      ? this.treeAdapter.insertBefore(t.parent, e, t.beforeElement)\n      : this.treeAdapter.appendChild(t.parent, e);\n  }\n  _isSpecialElement(e, t) {\n    return ((e = this.treeAdapter.getNamespaceURI(e)), Kr[e].has(t));\n  }\n  onCharacter(e) {\n    if (((this.skipNextNewLine = !1), this.tokenizer.inForeignNode))\n      !(function (e, t) {\n        (e._insertCharacters(t), (e.framesetOk = !1));\n      })(this, e);\n    else\n      switch (this.insertionMode) {\n        case Yi.INITIAL:\n          is(this, e);\n          break;\n        case Yi.BEFORE_HTML:\n          ss(this, e);\n          break;\n        case Yi.BEFORE_HEAD:\n          as(this, e);\n          break;\n        case Yi.IN_HEAD:\n          us(this, e);\n          break;\n        case Yi.IN_HEAD_NO_SCRIPT:\n          ls(this, e);\n          break;\n        case Yi.AFTER_HEAD:\n          hs(this, e);\n          break;\n        case Yi.IN_BODY:\n        case Yi.IN_CAPTION:\n        case Yi.IN_CELL:\n        case Yi.IN_TEMPLATE:\n          ds(this, e);\n          break;\n        case Yi.TEXT:\n        case Yi.IN_SELECT:\n        case Yi.IN_SELECT_IN_TABLE:\n          this._insertCharacters(e);\n          break;\n        case Yi.IN_TABLE:\n        case Yi.IN_TABLE_BODY:\n        case Yi.IN_ROW:\n          Ss(this, e);\n          break;\n        case Yi.IN_TABLE_TEXT:\n          Os(this, e);\n          break;\n        case Yi.IN_COLUMN_GROUP:\n          Rs(this, e);\n          break;\n        case Yi.AFTER_BODY:\n          Gs(this, e);\n          break;\n        case Yi.AFTER_AFTER_BODY:\n          js(this, e);\n      }\n  }\n  onNullCharacter(e) {\n    if (((this.skipNextNewLine = !1), this.tokenizer.inForeignNode))\n      !(function (e, t) {\n        ((t.chars = sr), e._insertCharacters(t));\n      })(this, e);\n    else\n      switch (this.insertionMode) {\n        case Yi.INITIAL:\n          is(this, e);\n          break;\n        case Yi.BEFORE_HTML:\n          ss(this, e);\n          break;\n        case Yi.BEFORE_HEAD:\n          as(this, e);\n          break;\n        case Yi.IN_HEAD:\n          us(this, e);\n          break;\n        case Yi.IN_HEAD_NO_SCRIPT:\n          ls(this, e);\n          break;\n        case Yi.AFTER_HEAD:\n          hs(this, e);\n          break;\n        case Yi.TEXT:\n          this._insertCharacters(e);\n          break;\n        case Yi.IN_TABLE:\n        case Yi.IN_TABLE_BODY:\n        case Yi.IN_ROW:\n          Ss(this, e);\n          break;\n        case Yi.IN_COLUMN_GROUP:\n          Rs(this, e);\n          break;\n        case Yi.AFTER_BODY:\n          Gs(this, e);\n          break;\n        case Yi.AFTER_AFTER_BODY:\n          js(this, e);\n      }\n  }\n  onComment(e) {\n    if (((this.skipNextNewLine = !1), this.currentNotInHTML)) ns(this, e);\n    else\n      switch (this.insertionMode) {\n        case Yi.INITIAL:\n        case Yi.BEFORE_HTML:\n        case Yi.BEFORE_HEAD:\n        case Yi.IN_HEAD:\n        case Yi.IN_HEAD_NO_SCRIPT:\n        case Yi.AFTER_HEAD:\n        case Yi.IN_BODY:\n        case Yi.IN_TABLE:\n        case Yi.IN_CAPTION:\n        case Yi.IN_COLUMN_GROUP:\n        case Yi.IN_TABLE_BODY:\n        case Yi.IN_ROW:\n        case Yi.IN_CELL:\n        case Yi.IN_SELECT:\n        case Yi.IN_SELECT_IN_TABLE:\n        case Yi.IN_TEMPLATE:\n        case Yi.IN_FRAMESET:\n        case Yi.AFTER_FRAMESET:\n          ns(this, e);\n          break;\n        case Yi.IN_TABLE_TEXT:\n          ks(this, e);\n          break;\n        case Yi.AFTER_BODY:\n          !(function (e, t) {\n            e._appendCommentNode(t, e.openElements.items[0]);\n          })(this, e);\n          break;\n        case Yi.AFTER_AFTER_BODY:\n        case Yi.AFTER_AFTER_FRAMESET:\n          !(function (e, t) {\n            e._appendCommentNode(t, e.document);\n          })(this, e);\n      }\n  }\n  onDoctype(e) {\n    switch (((this.skipNextNewLine = !1), this.insertionMode)) {\n      case Yi.INITIAL:\n        !(function (e, t) {\n          e._setDocumentType(t);\n          var n = t.forceQuirks\n            ? Br.QUIRKS\n            : (function (e) {\n                if (e.name !== vi) return Br.QUIRKS;\n                var t = e.systemId;\n                if (t && t.toLowerCase() === Si) return Br.QUIRKS;\n                let n = e.publicId;\n                if (null !== n) {\n                  if (((n = n.toLowerCase()), bi.has(n))) return Br.QUIRKS;\n                  let e = null === t ? Ni : Ci;\n                  if (ki(n, e)) return Br.QUIRKS;\n                  if (((e = null === t ? Ii : Oi), ki(n, e))) return Br.LIMITED_QUIRKS;\n                }\n                return Br.NO_QUIRKS;\n              })(t);\n          (!(function (e) {\n            return e.name === vi && null === e.publicId && (null === e.systemId || e.systemId === yi);\n          })(t) && e._err(t, _r.nonConformingDoctype),\n            e.treeAdapter.setDocumentMode(e.document, n),\n            (e.insertionMode = Yi.BEFORE_HTML));\n        })(this, e);\n        break;\n      case Yi.BEFORE_HEAD:\n      case Yi.IN_HEAD:\n      case Yi.IN_HEAD_NO_SCRIPT:\n      case Yi.AFTER_HEAD:\n        this._err(e, _r.misplacedDoctype);\n        break;\n      case Yi.IN_TABLE_TEXT:\n        ks(this, e);\n    }\n  }\n  onStartTag(e) {\n    ((this.skipNextNewLine = !1),\n      (this.currentToken = e),\n      this._processStartTag(e),\n      e.selfClosing && !e.ackSelfClosing && this._err(e, _r.nonVoidHtmlElementStartTagWithTrailingSolidus));\n  }\n  _processStartTag(e) {\n    this.shouldProcessStartTagTokenInForeignContent(e)\n      ? (function (e, t) {\n          var n;\n          !(function (e) {\n            var t = e.tagID;\n            return (\n              (t === Ur.FONT && e.attrs.some(({ name: e }) => e === Pr.COLOR || e === Pr.SIZE || e === Pr.FACE)) ||\n              Pi.has(t)\n            );\n          })(t)\n            ? ((n = e._getAdjustedCurrentElement()),\n              (n = e.treeAdapter.getNamespaceURI(n)) === Mr.MATHML\n                ? Bi(t)\n                : n === Mr.SVG &&\n                  ((function (e) {\n                    var t = Mi.get(e.tagName);\n                    null != t && ((e.tagName = t), (e.tagID = qr(e.tagName)));\n                  })(t),\n                  Fi(t)),\n              Ui(t),\n              t.selfClosing ? e._appendElement(t, n) : e._insertElement(t, n),\n              (t.ackSelfClosing = !0))\n            : (qs(e), e._startTagOutsideForeignContent(t));\n        })(this, e)\n      : this._startTagOutsideForeignContent(e);\n  }\n  _startTagOutsideForeignContent(e) {\n    switch (this.insertionMode) {\n      case Yi.INITIAL:\n        is(this, e);\n        break;\n      case Yi.BEFORE_HTML:\n        !(function (e, t) {\n          t.tagID === Ur.HTML ? (e._insertElement(t, Mr.HTML), (e.insertionMode = Yi.BEFORE_HEAD)) : ss(e, t);\n        })(this, e);\n        break;\n      case Yi.BEFORE_HEAD:\n        !(function (e, t) {\n          switch (t.tagID) {\n            case Ur.HTML:\n              As(e, t);\n              break;\n            case Ur.HEAD:\n              (e._insertElement(t, Mr.HTML), (e.headElement = e.openElements.current), (e.insertionMode = Yi.IN_HEAD));\n              break;\n            default:\n              as(e, t);\n          }\n        })(this, e);\n        break;\n      case Yi.IN_HEAD:\n        os(this, e);\n        break;\n      case Yi.IN_HEAD_NO_SCRIPT:\n        !(function (e, t) {\n          switch (t.tagID) {\n            case Ur.HTML:\n              As(e, t);\n              break;\n            case Ur.BASEFONT:\n            case Ur.BGSOUND:\n            case Ur.HEAD:\n            case Ur.LINK:\n            case Ur.META:\n            case Ur.NOFRAMES:\n            case Ur.STYLE:\n              os(e, t);\n              break;\n            case Ur.NOSCRIPT:\n              e._err(t, _r.nestedNoscriptInHead);\n              break;\n            default:\n              ls(e, t);\n          }\n        })(this, e);\n        break;\n      case Yi.AFTER_HEAD:\n        !(function (e, t) {\n          switch (t.tagID) {\n            case Ur.HTML:\n              As(e, t);\n              break;\n            case Ur.BODY:\n              (e._insertElement(t, Mr.HTML), (e.framesetOk = !1), (e.insertionMode = Yi.IN_BODY));\n              break;\n            case Ur.FRAMESET:\n              (e._insertElement(t, Mr.HTML), (e.insertionMode = Yi.IN_FRAMESET));\n              break;\n            case Ur.BASE:\n            case Ur.BASEFONT:\n            case Ur.BGSOUND:\n            case Ur.LINK:\n            case Ur.META:\n            case Ur.NOFRAMES:\n            case Ur.SCRIPT:\n            case Ur.STYLE:\n            case Ur.TEMPLATE:\n            case Ur.TITLE:\n              (e._err(t, _r.abandonedHeadElementChild),\n                e.openElements.push(e.headElement, Ur.HEAD),\n                os(e, t),\n                e.openElements.remove(e.headElement));\n              break;\n            case Ur.HEAD:\n              e._err(t, _r.misplacedStartTagForHeadElement);\n              break;\n            default:\n              hs(e, t);\n          }\n        })(this, e);\n        break;\n      case Yi.IN_BODY:\n        As(this, e);\n        break;\n      case Yi.IN_TABLE:\n        Cs(this, e);\n        break;\n      case Yi.IN_TABLE_TEXT:\n        ks(this, e);\n        break;\n      case Yi.IN_CAPTION:\n        !(function (e, t) {\n          var n = t.tagID;\n          Ls.has(n)\n            ? e.openElements.hasInTableScope(Ur.CAPTION) &&\n              (e.openElements.generateImpliedEndTags(),\n              e.openElements.popUntilTagNamePopped(Ur.CAPTION),\n              e.activeFormattingElements.clearToLastMarker(),\n              (e.insertionMode = Yi.IN_TABLE),\n              Cs(e, t))\n            : As(e, t);\n        })(this, e);\n        break;\n      case Yi.IN_COLUMN_GROUP:\n        Ds(this, e);\n        break;\n      case Yi.IN_TABLE_BODY:\n        ws(this, e);\n        break;\n      case Yi.IN_ROW:\n        Ms(this, e);\n        break;\n      case Yi.IN_CELL:\n        !(function (e, t) {\n          var n = t.tagID;\n          Ls.has(n)\n            ? (e.openElements.hasInTableScope(Ur.TD) || e.openElements.hasInTableScope(Ur.TH)) &&\n              (e._closeTableCell(), Ms(e, t))\n            : As(e, t);\n        })(this, e);\n        break;\n      case Yi.IN_SELECT:\n        Bs(this, e);\n        break;\n      case Yi.IN_SELECT_IN_TABLE:\n        !(function (e, t) {\n          var n = t.tagID;\n          n === Ur.CAPTION ||\n          n === Ur.TABLE ||\n          n === Ur.TBODY ||\n          n === Ur.TFOOT ||\n          n === Ur.THEAD ||\n          n === Ur.TR ||\n          n === Ur.TD ||\n          n === Ur.TH\n            ? (e.openElements.popUntilTagNamePopped(Ur.SELECT), e._resetInsertionMode(), e._processStartTag(t))\n            : Bs(e, t);\n        })(this, e);\n        break;\n      case Yi.IN_TEMPLATE:\n        !(function (e, t) {\n          switch (t.tagID) {\n            case Ur.BASE:\n            case Ur.BASEFONT:\n            case Ur.BGSOUND:\n            case Ur.LINK:\n            case Ur.META:\n            case Ur.NOFRAMES:\n            case Ur.SCRIPT:\n            case Ur.STYLE:\n            case Ur.TEMPLATE:\n            case Ur.TITLE:\n              os(e, t);\n              break;\n            case Ur.CAPTION:\n            case Ur.COLGROUP:\n            case Ur.TBODY:\n            case Ur.TFOOT:\n            case Ur.THEAD:\n              ((e.tmplInsertionModeStack[0] = Yi.IN_TABLE), (e.insertionMode = Yi.IN_TABLE), Cs(e, t));\n              break;\n            case Ur.COL:\n              ((e.tmplInsertionModeStack[0] = Yi.IN_COLUMN_GROUP), (e.insertionMode = Yi.IN_COLUMN_GROUP), Ds(e, t));\n              break;\n            case Ur.TR:\n              ((e.tmplInsertionModeStack[0] = Yi.IN_TABLE_BODY), (e.insertionMode = Yi.IN_TABLE_BODY), ws(e, t));\n              break;\n            case Ur.TD:\n            case Ur.TH:\n              ((e.tmplInsertionModeStack[0] = Yi.IN_ROW), (e.insertionMode = Yi.IN_ROW), Ms(e, t));\n              break;\n            default:\n              ((e.tmplInsertionModeStack[0] = Yi.IN_BODY), (e.insertionMode = Yi.IN_BODY), As(e, t));\n          }\n        })(this, e);\n        break;\n      case Yi.AFTER_BODY:\n        !(function (e, t) {\n          (t.tagID === Ur.HTML ? As : Gs)(e, t);\n        })(this, e);\n        break;\n      case Yi.IN_FRAMESET:\n        !(function (e, t) {\n          switch (t.tagID) {\n            case Ur.HTML:\n              As(e, t);\n              break;\n            case Ur.FRAMESET:\n              e._insertElement(t, Mr.HTML);\n              break;\n            case Ur.FRAME:\n              (e._appendElement(t, Mr.HTML), (t.ackSelfClosing = !0));\n              break;\n            case Ur.NOFRAMES:\n              os(e, t);\n          }\n        })(this, e);\n        break;\n      case Yi.AFTER_FRAMESET:\n        !(function (e, t) {\n          switch (t.tagID) {\n            case Ur.HTML:\n              As(e, t);\n              break;\n            case Ur.NOFRAMES:\n              os(e, t);\n          }\n        })(this, e);\n        break;\n      case Yi.AFTER_AFTER_BODY:\n        !(function (e, t) {\n          (t.tagID === Ur.HTML ? As : js)(e, t);\n        })(this, e);\n        break;\n      case Yi.AFTER_AFTER_FRAMESET:\n        !(function (e, t) {\n          switch (t.tagID) {\n            case Ur.HTML:\n              As(e, t);\n              break;\n            case Ur.NOFRAMES:\n              os(e, t);\n          }\n        })(this, e);\n    }\n  }\n  onEndTag(e) {\n    ((this.skipNextNewLine = !1),\n      (this.currentToken = e),\n      this.currentNotInHTML\n        ? (function (e, t) {\n            if (t.tagID === Ur.P || t.tagID === Ur.BR) return (qs(e), e._endTagOutsideForeignContent(t));\n            for (let n = e.openElements.stackTop; 0 < n; n--) {\n              var r = e.openElements.items[n];\n              if (e.treeAdapter.getNamespaceURI(r) === Mr.HTML) {\n                e._endTagOutsideForeignContent(t);\n                break;\n              }\n              if ((r = e.treeAdapter.getTagName(r)).toLowerCase() === t.tagName) {\n                ((t.tagName = r), e.openElements.shortenToLength(n));\n                break;\n              }\n            }\n          })(this, e)\n        : this._endTagOutsideForeignContent(e));\n  }\n  _endTagOutsideForeignContent(e) {\n    switch (this.insertionMode) {\n      case Yi.INITIAL:\n        is(this, e);\n        break;\n      case Yi.BEFORE_HTML:\n        !(function (e, t) {\n          var n = t.tagID;\n          (n !== Ur.HTML && n !== Ur.HEAD && n !== Ur.BODY && n !== Ur.BR) || ss(e, t);\n        })(this, e);\n        break;\n      case Yi.BEFORE_HEAD:\n        !(function (e, t) {\n          var n = t.tagID;\n          n === Ur.HEAD || n === Ur.BODY || n === Ur.HTML || n === Ur.BR\n            ? as(e, t)\n            : e._err(t, _r.endTagWithoutMatchingOpenElement);\n        })(this, e);\n        break;\n      case Yi.IN_HEAD:\n        !(function (e, t) {\n          switch (t.tagID) {\n            case Ur.HEAD:\n              (e.openElements.pop(), (e.insertionMode = Yi.AFTER_HEAD));\n              break;\n            case Ur.BODY:\n            case Ur.BR:\n            case Ur.HTML:\n              us(e, t);\n              break;\n            case Ur.TEMPLATE:\n              cs(e, t);\n              break;\n            default:\n              e._err(t, _r.endTagWithoutMatchingOpenElement);\n          }\n        })(this, e);\n        break;\n      case Yi.IN_HEAD_NO_SCRIPT:\n        !(function (e, t) {\n          switch (t.tagID) {\n            case Ur.NOSCRIPT:\n              (e.openElements.pop(), (e.insertionMode = Yi.IN_HEAD));\n              break;\n            case Ur.BR:\n              ls(e, t);\n              break;\n            default:\n              e._err(t, _r.endTagWithoutMatchingOpenElement);\n          }\n        })(this, e);\n        break;\n      case Yi.AFTER_HEAD:\n        !(function (e, t) {\n          switch (t.tagID) {\n            case Ur.BODY:\n            case Ur.HTML:\n            case Ur.BR:\n              hs(e, t);\n              break;\n            case Ur.TEMPLATE:\n              cs(e, t);\n              break;\n            default:\n              e._err(t, _r.endTagWithoutMatchingOpenElement);\n          }\n        })(this, e);\n        break;\n      case Yi.IN_BODY:\n        vs(this, e);\n        break;\n      case Yi.TEXT:\n        !(function (e, t) {\n          (t.tagID === Ur.SCRIPT && null != (t = e.scriptHandler) && t.call(e, e.openElements.current),\n            e.openElements.pop(),\n            (e.insertionMode = e.originalInsertionMode));\n        })(this, e);\n        break;\n      case Yi.IN_TABLE:\n        Ns(this, e);\n        break;\n      case Yi.IN_TABLE_TEXT:\n        ks(this, e);\n        break;\n      case Yi.IN_CAPTION:\n        !(function (e, t) {\n          var n = t.tagID;\n          switch (n) {\n            case Ur.CAPTION:\n            case Ur.TABLE:\n              e.openElements.hasInTableScope(Ur.CAPTION) &&\n                (e.openElements.generateImpliedEndTags(),\n                e.openElements.popUntilTagNamePopped(Ur.CAPTION),\n                e.activeFormattingElements.clearToLastMarker(),\n                (e.insertionMode = Yi.IN_TABLE),\n                n === Ur.TABLE) &&\n                Ns(e, t);\n              break;\n            case Ur.BODY:\n            case Ur.COL:\n            case Ur.COLGROUP:\n            case Ur.HTML:\n            case Ur.TBODY:\n            case Ur.TD:\n            case Ur.TFOOT:\n            case Ur.TH:\n            case Ur.THEAD:\n            case Ur.TR:\n              break;\n            default:\n              vs(e, t);\n          }\n        })(this, e);\n        break;\n      case Yi.IN_COLUMN_GROUP:\n        !(function (e, t) {\n          switch (t.tagID) {\n            case Ur.COLGROUP:\n              e.openElements.currentTagId === Ur.COLGROUP && (e.openElements.pop(), (e.insertionMode = Yi.IN_TABLE));\n              break;\n            case Ur.TEMPLATE:\n              cs(e, t);\n              break;\n            case Ur.COL:\n              break;\n            default:\n              Rs(e, t);\n          }\n        })(this, e);\n        break;\n      case Yi.IN_TABLE_BODY:\n        xs(this, e);\n        break;\n      case Yi.IN_ROW:\n        Ps(this, e);\n        break;\n      case Yi.IN_CELL:\n        !(function (e, t) {\n          var n = t.tagID;\n          switch (n) {\n            case Ur.TD:\n            case Ur.TH:\n              e.openElements.hasInTableScope(n) &&\n                (e.openElements.generateImpliedEndTags(),\n                e.openElements.popUntilTagNamePopped(n),\n                e.activeFormattingElements.clearToLastMarker(),\n                (e.insertionMode = Yi.IN_ROW));\n              break;\n            case Ur.TABLE:\n            case Ur.TBODY:\n            case Ur.TFOOT:\n            case Ur.THEAD:\n            case Ur.TR:\n              e.openElements.hasInTableScope(n) && (e._closeTableCell(), Ps(e, t));\n              break;\n            case Ur.BODY:\n            case Ur.CAPTION:\n            case Ur.COL:\n            case Ur.COLGROUP:\n            case Ur.HTML:\n              break;\n            default:\n              vs(e, t);\n          }\n        })(this, e);\n        break;\n      case Yi.IN_SELECT:\n        Fs(this, e);\n        break;\n      case Yi.IN_SELECT_IN_TABLE:\n        !(function (e, t) {\n          var n = t.tagID;\n          n === Ur.CAPTION ||\n          n === Ur.TABLE ||\n          n === Ur.TBODY ||\n          n === Ur.TFOOT ||\n          n === Ur.THEAD ||\n          n === Ur.TR ||\n          n === Ur.TD ||\n          n === Ur.TH\n            ? e.openElements.hasInTableScope(n) &&\n              (e.openElements.popUntilTagNamePopped(Ur.SELECT), e._resetInsertionMode(), e.onEndTag(t))\n            : Fs(e, t);\n        })(this, e);\n        break;\n      case Yi.IN_TEMPLATE:\n        !(function (e, t) {\n          t.tagID === Ur.TEMPLATE && cs(e, t);\n        })(this, e);\n        break;\n      case Yi.AFTER_BODY:\n        Hs(this, e);\n        break;\n      case Yi.IN_FRAMESET:\n        !(function (e, t) {\n          t.tagID !== Ur.FRAMESET ||\n            e.openElements.isRootHtmlElementCurrent() ||\n            (e.openElements.pop(), e.fragmentContext) ||\n            e.openElements.currentTagId === Ur.FRAMESET ||\n            (e.insertionMode = Yi.AFTER_FRAMESET);\n        })(this, e);\n        break;\n      case Yi.AFTER_FRAMESET:\n        !(function (e, t) {\n          t.tagID === Ur.HTML && (e.insertionMode = Yi.AFTER_AFTER_FRAMESET);\n        })(this, e);\n        break;\n      case Yi.AFTER_AFTER_BODY:\n        js(this, e);\n    }\n  }\n  onEof(e) {\n    switch (this.insertionMode) {\n      case Yi.INITIAL:\n        is(this, e);\n        break;\n      case Yi.BEFORE_HTML:\n        ss(this, e);\n        break;\n      case Yi.BEFORE_HEAD:\n        as(this, e);\n        break;\n      case Yi.IN_HEAD:\n        us(this, e);\n        break;\n      case Yi.IN_HEAD_NO_SCRIPT:\n        ls(this, e);\n        break;\n      case Yi.AFTER_HEAD:\n        hs(this, e);\n        break;\n      case Yi.IN_BODY:\n      case Yi.IN_TABLE:\n      case Yi.IN_CAPTION:\n      case Yi.IN_COLUMN_GROUP:\n      case Yi.IN_TABLE_BODY:\n      case Yi.IN_ROW:\n      case Yi.IN_CELL:\n      case Yi.IN_SELECT:\n      case Yi.IN_SELECT_IN_TABLE:\n        ys(this, e);\n        break;\n      case Yi.TEXT:\n        !(function (e, t) {\n          (e._err(t, _r.eofInElementThatCanContainOnlyText),\n            e.openElements.pop(),\n            (e.insertionMode = e.originalInsertionMode),\n            e.onEof(t));\n        })(this, e);\n        break;\n      case Yi.IN_TABLE_TEXT:\n        ks(this, e);\n        break;\n      case Yi.IN_TEMPLATE:\n        Us(this, e);\n        break;\n      case Yi.AFTER_BODY:\n      case Yi.IN_FRAMESET:\n      case Yi.AFTER_FRAMESET:\n      case Yi.AFTER_AFTER_BODY:\n      case Yi.AFTER_AFTER_FRAMESET:\n        rs(this, e);\n    }\n  }\n  onWhitespaceCharacter(e) {\n    if (this.skipNextNewLine && ((this.skipNextNewLine = !1), e.chars.charCodeAt(0) === ar.LINE_FEED)) {\n      if (1 === e.chars.length) return;\n      e.chars = e.chars.substr(1);\n    }\n    if (this.tokenizer.inForeignNode) this._insertCharacters(e);\n    else\n      switch (this.insertionMode) {\n        case Yi.IN_HEAD:\n        case Yi.IN_HEAD_NO_SCRIPT:\n        case Yi.AFTER_HEAD:\n        case Yi.TEXT:\n        case Yi.IN_COLUMN_GROUP:\n        case Yi.IN_SELECT:\n        case Yi.IN_SELECT_IN_TABLE:\n        case Yi.IN_FRAMESET:\n        case Yi.AFTER_FRAMESET:\n          this._insertCharacters(e);\n          break;\n        case Yi.IN_BODY:\n        case Yi.IN_CAPTION:\n        case Yi.IN_CELL:\n        case Yi.IN_TEMPLATE:\n        case Yi.AFTER_BODY:\n        case Yi.AFTER_AFTER_BODY:\n        case Yi.AFTER_AFTER_FRAMESET:\n          ps(this, e);\n          break;\n        case Yi.IN_TABLE:\n        case Yi.IN_TABLE_BODY:\n        case Yi.IN_ROW:\n          Ss(this, e);\n          break;\n        case Yi.IN_TABLE_TEXT:\n          Is(this, e);\n      }\n  }\n}\nfunction Qi(e, t) {\n  let n = e.activeFormattingElements.getElementEntryInScopeWithTagName(t.tagName);\n  return (\n    n\n      ? e.openElements.contains(n.element)\n        ? e.openElements.hasInScope(t.tagID) || (n = null)\n        : (e.activeFormattingElements.removeEntry(n), (n = null))\n      : gs(e, t),\n    n\n  );\n}\nfunction zi(e, t) {\n  let n = null,\n    r = e.openElements.stackTop;\n  for (; 0 <= r; r--) {\n    var i = e.openElements.items[r];\n    if (i === t.element) break;\n    e._isSpecialElement(i, e.openElements.tagIDs[r]) && (n = i);\n  }\n  return (n || (e.openElements.shortenToLength(r < 0 ? 0 : r), e.activeFormattingElements.removeEntry(t)), n);\n}\nfunction Xi(e, t, n) {\n  let r = t,\n    i = e.openElements.getCommonAncestor(t);\n  for (let s = 0, a = i; a !== n; s++, a = i) {\n    i = e.openElements.getCommonAncestor(a);\n    const n = e.activeFormattingElements.getElementEntry(a),\n      o = n && s >= qi;\n    !n || o\n      ? (o && e.activeFormattingElements.removeEntry(n), e.openElements.remove(a))\n      : ((a = Zi(e, n)),\n        r === t && (e.activeFormattingElements.bookmark = n),\n        e.treeAdapter.detachNode(r),\n        e.treeAdapter.appendChild(a, r),\n        (r = a));\n  }\n  return r;\n}\nfunction Zi(e, t) {\n  var n = e.treeAdapter.getNamespaceURI(t.element),\n    n = e.treeAdapter.createElement(t.token.tagName, n, t.token.attrs);\n  return (e.openElements.replace(t.element, n), (t.element = n));\n}\nfunction Ji(e, t, n) {\n  var i,\n    r = qr(e.treeAdapter.getTagName(t));\n  e._isElementCausesFosterParenting(r)\n    ? e._fosterParentElement(n)\n    : ((i = e.treeAdapter.getNamespaceURI(t)),\n      r === Ur.TEMPLATE && i === Mr.HTML && (t = e.treeAdapter.getTemplateContent(t)),\n      e.treeAdapter.appendChild(t, n));\n}\nfunction es(e, t, n) {\n  var r = e.treeAdapter.getNamespaceURI(n.element),\n    i = n.token,\n    r = e.treeAdapter.createElement(i.tagName, r, i.attrs);\n  (e._adoptNodes(t, r),\n    e.treeAdapter.appendChild(t, r),\n    e.activeFormattingElements.insertElementAfterBookmark(r, i),\n    e.activeFormattingElements.removeEntry(n),\n    e.openElements.remove(n.element),\n    e.openElements.insertAfter(t, r, i.tagID));\n}\nfunction ts(e, t) {\n  for (let n = 0; n < ji; n++) {\n    const n = Qi(e, t);\n    if (!n) break;\n    var r = zi(e, n);\n    if (!r) break;\n    e.activeFormattingElements.bookmark = n;\n    var i = Xi(e, r, n.element),\n      s = e.openElements.getCommonAncestor(n.element);\n    (e.treeAdapter.detachNode(i), s && Ji(e, s, i), es(e, r, n));\n  }\n}\nfunction ns(e, t) {\n  e._appendCommentNode(t, e.openElements.currentTmplContentOrNode);\n}\nfunction rs(e, t) {\n  if (((e.stopped = !0), t.location)) {\n    var n = e.fragmentContext ? 0 : 2;\n    for (let r = e.openElements.stackTop; r >= n; r--) e._setEndLocation(e.openElements.items[r], t);\n    if (!e.fragmentContext && 0 <= e.openElements.stackTop) {\n      const n = e.openElements.items[0],\n        r = e.treeAdapter.getNodeSourceCodeLocation(n);\n      if (r && !r.endTag && (e._setEndLocation(n, t), 1 <= e.openElements.stackTop)) {\n        const n = e.openElements.items[1],\n          r = e.treeAdapter.getNodeSourceCodeLocation(n);\n        r && !r.endTag && e._setEndLocation(n, t);\n      }\n    }\n  }\n}\nfunction is(e, t) {\n  (e._err(t, _r.missingDoctype, !0),\n    e.treeAdapter.setDocumentMode(e.document, Br.QUIRKS),\n    (e.insertionMode = Yi.BEFORE_HTML),\n    e._processToken(t));\n}\nfunction ss(e, t) {\n  (e._insertFakeRootElement(), (e.insertionMode = Yi.BEFORE_HEAD), e._processToken(t));\n}\nfunction as(e, t) {\n  (e._insertFakeElement(Fr.HEAD, Ur.HEAD),\n    (e.headElement = e.openElements.current),\n    (e.insertionMode = Yi.IN_HEAD),\n    e._processToken(t));\n}\nfunction os(e, t) {\n  switch (t.tagID) {\n    case Ur.HTML:\n      As(e, t);\n      break;\n    case Ur.BASE:\n    case Ur.BASEFONT:\n    case Ur.BGSOUND:\n    case Ur.LINK:\n    case Ur.META:\n      (e._appendElement(t, Mr.HTML), (t.ackSelfClosing = !0));\n      break;\n    case Ur.TITLE:\n      e._switchToTextParsing(t, zr.RCDATA);\n      break;\n    case Ur.NOSCRIPT:\n      e.options.scriptingEnabled\n        ? e._switchToTextParsing(t, zr.RAWTEXT)\n        : (e._insertElement(t, Mr.HTML), (e.insertionMode = Yi.IN_HEAD_NO_SCRIPT));\n      break;\n    case Ur.NOFRAMES:\n    case Ur.STYLE:\n      e._switchToTextParsing(t, zr.RAWTEXT);\n      break;\n    case Ur.SCRIPT:\n      e._switchToTextParsing(t, zr.SCRIPT_DATA);\n      break;\n    case Ur.TEMPLATE:\n      (e._insertTemplate(t),\n        e.activeFormattingElements.insertMarker(),\n        (e.framesetOk = !1),\n        (e.insertionMode = Yi.IN_TEMPLATE),\n        e.tmplInsertionModeStack.unshift(Yi.IN_TEMPLATE));\n      break;\n    case Ur.HEAD:\n      e._err(t, _r.misplacedStartTagForHeadElement);\n      break;\n    default:\n      us(e, t);\n  }\n}\nfunction cs(e, t) {\n  0 < e.openElements.tmplCount\n    ? (e.openElements.generateImpliedEndTagsThoroughly(),\n      e.openElements.currentTagId !== Ur.TEMPLATE && e._err(t, _r.closingOfElementWithOpenChildElements),\n      e.openElements.popUntilTagNamePopped(Ur.TEMPLATE),\n      e.activeFormattingElements.clearToLastMarker(),\n      e.tmplInsertionModeStack.shift(),\n      e._resetInsertionMode())\n    : e._err(t, _r.endTagWithoutMatchingOpenElement);\n}\nfunction us(e, t) {\n  (e.openElements.pop(), (e.insertionMode = Yi.AFTER_HEAD), e._processToken(t));\n}\nfunction ls(e, t) {\n  var n = t.type === Tr.EOF ? _r.openElementsLeftAfterEof : _r.disallowedContentInNoscriptInHead;\n  (e._err(t, n), e.openElements.pop(), (e.insertionMode = Yi.IN_HEAD), e._processToken(t));\n}\nfunction hs(e, t) {\n  (e._insertFakeElement(Fr.BODY, Ur.BODY), (e.insertionMode = Yi.IN_BODY), fs(e, t));\n}\nfunction fs(e, t) {\n  switch (t.type) {\n    case Tr.CHARACTER:\n      ds(e, t);\n      break;\n    case Tr.WHITESPACE_CHARACTER:\n      ps(e, t);\n      break;\n    case Tr.COMMENT:\n      ns(e, t);\n      break;\n    case Tr.START_TAG:\n      As(e, t);\n      break;\n    case Tr.END_TAG:\n      vs(e, t);\n      break;\n    case Tr.EOF:\n      ys(e, t);\n  }\n}\nfunction ps(e, t) {\n  (e._reconstructActiveFormattingElements(), e._insertCharacters(t));\n}\nfunction ds(e, t) {\n  (e._reconstructActiveFormattingElements(), e._insertCharacters(t), (e.framesetOk = !1));\n}\nfunction ms(e, t) {\n  (e._reconstructActiveFormattingElements(),\n    e._appendElement(t, Mr.HTML),\n    (e.framesetOk = !1),\n    (t.ackSelfClosing = !0));\n}\nfunction _s(e) {\n  return null != (e = Ar(e, Pr.TYPE)) && e.toLowerCase() === Gi;\n}\nfunction Es(e, t) {\n  e._switchToTextParsing(t, zr.RAWTEXT);\n}\nfunction Ts(e, t) {\n  (e._reconstructActiveFormattingElements(), e._insertElement(t, Mr.HTML));\n}\nfunction As(e, t) {\n  switch (t.tagID) {\n    case Ur.I:\n    case Ur.S:\n    case Ur.B:\n    case Ur.U:\n    case Ur.EM:\n    case Ur.TT:\n    case Ur.BIG:\n    case Ur.CODE:\n    case Ur.FONT:\n    case Ur.SMALL:\n    case Ur.STRIKE:\n    case Ur.STRONG:\n      !(function (e, t) {\n        (e._reconstructActiveFormattingElements(),\n          e._insertElement(t, Mr.HTML),\n          e.activeFormattingElements.pushElement(e.openElements.current, t));\n      })(e, t);\n      break;\n    case Ur.A:\n      !(function (e, t) {\n        var n = e.activeFormattingElements.getElementEntryInScopeWithTagName(Fr.A);\n        (n && (ts(e, t), e.openElements.remove(n.element), e.activeFormattingElements.removeEntry(n)),\n          e._reconstructActiveFormattingElements(),\n          e._insertElement(t, Mr.HTML),\n          e.activeFormattingElements.pushElement(e.openElements.current, t));\n      })(e, t);\n      break;\n    case Ur.H1:\n    case Ur.H2:\n    case Ur.H3:\n    case Ur.H4:\n    case Ur.H5:\n    case Ur.H6:\n      !(function (e, t) {\n        (e.openElements.hasInButtonScope(Ur.P) && e._closePElement(),\n          Wr(e.openElements.currentTagId) && e.openElements.pop(),\n          e._insertElement(t, Mr.HTML));\n      })(e, t);\n      break;\n    case Ur.P:\n    case Ur.DL:\n    case Ur.OL:\n    case Ur.UL:\n    case Ur.DIV:\n    case Ur.DIR:\n    case Ur.NAV:\n    case Ur.MAIN:\n    case Ur.MENU:\n    case Ur.ASIDE:\n    case Ur.CENTER:\n    case Ur.FIGURE:\n    case Ur.FOOTER:\n    case Ur.HEADER:\n    case Ur.HGROUP:\n    case Ur.DIALOG:\n    case Ur.DETAILS:\n    case Ur.ADDRESS:\n    case Ur.ARTICLE:\n    case Ur.SECTION:\n    case Ur.SUMMARY:\n    case Ur.FIELDSET:\n    case Ur.BLOCKQUOTE:\n    case Ur.FIGCAPTION:\n      !(function (e, t) {\n        (e.openElements.hasInButtonScope(Ur.P) && e._closePElement(), e._insertElement(t, Mr.HTML));\n      })(e, t);\n      break;\n    case Ur.LI:\n    case Ur.DD:\n    case Ur.DT:\n      !(function (e, t) {\n        e.framesetOk = !1;\n        var n = t.tagID;\n        for (let t = e.openElements.stackTop; 0 <= t; t--) {\n          var r = e.openElements.tagIDs[t];\n          if ((n === Ur.LI && r === Ur.LI) || ((n === Ur.DD || n === Ur.DT) && (r === Ur.DD || r === Ur.DT))) {\n            (e.openElements.generateImpliedEndTagsWithExclusion(r), e.openElements.popUntilTagNamePopped(r));\n            break;\n          }\n          if (r !== Ur.ADDRESS && r !== Ur.DIV && r !== Ur.P && e._isSpecialElement(e.openElements.items[t], r)) break;\n        }\n        (e.openElements.hasInButtonScope(Ur.P) && e._closePElement(), e._insertElement(t, Mr.HTML));\n      })(e, t);\n      break;\n    case Ur.BR:\n    case Ur.IMG:\n    case Ur.WBR:\n    case Ur.AREA:\n    case Ur.EMBED:\n    case Ur.KEYGEN:\n      ms(e, t);\n      break;\n    case Ur.HR:\n      !(function (e, t) {\n        (e.openElements.hasInButtonScope(Ur.P) && e._closePElement(),\n          e._appendElement(t, Mr.HTML),\n          (e.framesetOk = !1),\n          (t.ackSelfClosing = !0));\n      })(e, t);\n      break;\n    case Ur.RB:\n    case Ur.RTC:\n      !(function (e, t) {\n        (e.openElements.hasInScope(Ur.RUBY) && e.openElements.generateImpliedEndTags(), e._insertElement(t, Mr.HTML));\n      })(e, t);\n      break;\n    case Ur.RT:\n    case Ur.RP:\n      !(function (e, t) {\n        (e.openElements.hasInScope(Ur.RUBY) && e.openElements.generateImpliedEndTagsWithExclusion(Ur.RTC),\n          e._insertElement(t, Mr.HTML));\n      })(e, t);\n      break;\n    case Ur.PRE:\n    case Ur.LISTING:\n      !(function (e, t) {\n        (e.openElements.hasInButtonScope(Ur.P) && e._closePElement(),\n          e._insertElement(t, Mr.HTML),\n          (e.skipNextNewLine = !0),\n          (e.framesetOk = !1));\n      })(e, t);\n      break;\n    case Ur.XMP:\n      !(function (e, t) {\n        (e.openElements.hasInButtonScope(Ur.P) && e._closePElement(),\n          e._reconstructActiveFormattingElements(),\n          (e.framesetOk = !1),\n          e._switchToTextParsing(t, zr.RAWTEXT));\n      })(e, t);\n      break;\n    case Ur.SVG:\n      !(function (e, t) {\n        (e._reconstructActiveFormattingElements(),\n          Fi(t),\n          Ui(t),\n          t.selfClosing ? e._appendElement(t, Mr.SVG) : e._insertElement(t, Mr.SVG),\n          (t.ackSelfClosing = !0));\n      })(e, t);\n      break;\n    case Ur.HTML:\n      !(function (e, t) {\n        0 === e.openElements.tmplCount && e.treeAdapter.adoptAttributes(e.openElements.items[0], t.attrs);\n      })(e, t);\n      break;\n    case Ur.BASE:\n    case Ur.LINK:\n    case Ur.META:\n    case Ur.STYLE:\n    case Ur.TITLE:\n    case Ur.SCRIPT:\n    case Ur.BGSOUND:\n    case Ur.BASEFONT:\n    case Ur.TEMPLATE:\n      os(e, t);\n      break;\n    case Ur.BODY:\n      !(function (e, t) {\n        var n = e.openElements.tryPeekProperlyNestedBodyElement();\n        n && 0 === e.openElements.tmplCount && ((e.framesetOk = !1), e.treeAdapter.adoptAttributes(n, t.attrs));\n      })(e, t);\n      break;\n    case Ur.FORM:\n      !(function (e, t) {\n        var n = 0 < e.openElements.tmplCount;\n        (e.formElement && !n) ||\n          (e.openElements.hasInButtonScope(Ur.P) && e._closePElement(), e._insertElement(t, Mr.HTML), n) ||\n          (e.formElement = e.openElements.current);\n      })(e, t);\n      break;\n    case Ur.NOBR:\n      !(function (e, t) {\n        (e._reconstructActiveFormattingElements(),\n          e.openElements.hasInScope(Ur.NOBR) && (ts(e, t), e._reconstructActiveFormattingElements()),\n          e._insertElement(t, Mr.HTML),\n          e.activeFormattingElements.pushElement(e.openElements.current, t));\n      })(e, t);\n      break;\n    case Ur.MATH:\n      !(function (e, t) {\n        (e._reconstructActiveFormattingElements(),\n          Bi(t),\n          Ui(t),\n          t.selfClosing ? e._appendElement(t, Mr.MATHML) : e._insertElement(t, Mr.MATHML),\n          (t.ackSelfClosing = !0));\n      })(e, t);\n      break;\n    case Ur.TABLE:\n      !(function (e, t) {\n        (e.treeAdapter.getDocumentMode(e.document) !== Br.QUIRKS &&\n          e.openElements.hasInButtonScope(Ur.P) &&\n          e._closePElement(),\n          e._insertElement(t, Mr.HTML),\n          (e.framesetOk = !1),\n          (e.insertionMode = Yi.IN_TABLE));\n      })(e, t);\n      break;\n    case Ur.INPUT:\n      !(function (e, t) {\n        (e._reconstructActiveFormattingElements(),\n          e._appendElement(t, Mr.HTML),\n          _s(t) || (e.framesetOk = !1),\n          (t.ackSelfClosing = !0));\n      })(e, t);\n      break;\n    case Ur.PARAM:\n    case Ur.TRACK:\n    case Ur.SOURCE:\n      !(function (e, t) {\n        (e._appendElement(t, Mr.HTML), (t.ackSelfClosing = !0));\n      })(e, t);\n      break;\n    case Ur.IMAGE:\n      !(function (e, t) {\n        ((t.tagName = Fr.IMG), (t.tagID = Ur.IMG), ms(e, t));\n      })(e, t);\n      break;\n    case Ur.BUTTON:\n      !(function (e, t) {\n        (e.openElements.hasInScope(Ur.BUTTON) &&\n          (e.openElements.generateImpliedEndTags(), e.openElements.popUntilTagNamePopped(Ur.BUTTON)),\n          e._reconstructActiveFormattingElements(),\n          e._insertElement(t, Mr.HTML),\n          (e.framesetOk = !1));\n      })(e, t);\n      break;\n    case Ur.APPLET:\n    case Ur.OBJECT:\n    case Ur.MARQUEE:\n      !(function (e, t) {\n        (e._reconstructActiveFormattingElements(),\n          e._insertElement(t, Mr.HTML),\n          e.activeFormattingElements.insertMarker(),\n          (e.framesetOk = !1));\n      })(e, t);\n      break;\n    case Ur.IFRAME:\n      !(function (e, t) {\n        ((e.framesetOk = !1), e._switchToTextParsing(t, zr.RAWTEXT));\n      })(e, t);\n      break;\n    case Ur.SELECT:\n      !(function (e, t) {\n        (e._reconstructActiveFormattingElements(),\n          e._insertElement(t, Mr.HTML),\n          (e.framesetOk = !1),\n          (e.insertionMode =\n            e.insertionMode === Yi.IN_TABLE ||\n            e.insertionMode === Yi.IN_CAPTION ||\n            e.insertionMode === Yi.IN_TABLE_BODY ||\n            e.insertionMode === Yi.IN_ROW ||\n            e.insertionMode === Yi.IN_CELL\n              ? Yi.IN_SELECT_IN_TABLE\n              : Yi.IN_SELECT));\n      })(e, t);\n      break;\n    case Ur.OPTION:\n    case Ur.OPTGROUP:\n      !(function (e, t) {\n        (e.openElements.currentTagId === Ur.OPTION && e.openElements.pop(),\n          e._reconstructActiveFormattingElements(),\n          e._insertElement(t, Mr.HTML));\n      })(e, t);\n      break;\n    case Ur.NOEMBED:\n      Es(e, t);\n      break;\n    case Ur.FRAMESET:\n      !(function (e, t) {\n        var n = e.openElements.tryPeekProperlyNestedBodyElement();\n        e.framesetOk &&\n          n &&\n          (e.treeAdapter.detachNode(n),\n          e.openElements.popAllUpToHtmlElement(),\n          e._insertElement(t, Mr.HTML),\n          (e.insertionMode = Yi.IN_FRAMESET));\n      })(e, t);\n      break;\n    case Ur.TEXTAREA:\n      !(function (e, t) {\n        (e._insertElement(t, Mr.HTML),\n          (e.skipNextNewLine = !0),\n          (e.tokenizer.state = zr.RCDATA),\n          (e.originalInsertionMode = e.insertionMode),\n          (e.framesetOk = !1),\n          (e.insertionMode = Yi.TEXT));\n      })(e, t);\n      break;\n    case Ur.NOSCRIPT:\n      (e.options.scriptingEnabled ? Es : Ts)(e, t);\n      break;\n    case Ur.PLAINTEXT:\n      !(function (e, t) {\n        (e.openElements.hasInButtonScope(Ur.P) && e._closePElement(),\n          e._insertElement(t, Mr.HTML),\n          (e.tokenizer.state = zr.PLAINTEXT));\n      })(e, t);\n      break;\n    case Ur.COL:\n    case Ur.TH:\n    case Ur.TD:\n    case Ur.TR:\n    case Ur.HEAD:\n    case Ur.FRAME:\n    case Ur.TBODY:\n    case Ur.TFOOT:\n    case Ur.THEAD:\n    case Ur.CAPTION:\n    case Ur.COLGROUP:\n      break;\n    default:\n      Ts(e, t);\n  }\n}\nfunction gs(e, t) {\n  var n = t.tagName,\n    r = t.tagID;\n  for (let t = e.openElements.stackTop; 0 < t; t--) {\n    var i = e.openElements.items[t],\n      s = e.openElements.tagIDs[t];\n    if (r === s && (r !== Ur.UNKNOWN || e.treeAdapter.getTagName(i) === n)) {\n      (e.openElements.generateImpliedEndTagsWithExclusion(r),\n        e.openElements.stackTop >= t && e.openElements.shortenToLength(t));\n      break;\n    }\n    if (e._isSpecialElement(i, s)) break;\n  }\n}\nfunction vs(e, t) {\n  switch (t.tagID) {\n    case Ur.A:\n    case Ur.B:\n    case Ur.I:\n    case Ur.S:\n    case Ur.U:\n    case Ur.EM:\n    case Ur.TT:\n    case Ur.BIG:\n    case Ur.CODE:\n    case Ur.FONT:\n    case Ur.NOBR:\n    case Ur.SMALL:\n    case Ur.STRIKE:\n    case Ur.STRONG:\n      ts(e, t);\n      break;\n    case Ur.P:\n      !(function (e) {\n        (e.openElements.hasInButtonScope(Ur.P) || e._insertFakeElement(Fr.P, Ur.P), e._closePElement());\n      })(e);\n      break;\n    case Ur.DL:\n    case Ur.UL:\n    case Ur.OL:\n    case Ur.DIR:\n    case Ur.DIV:\n    case Ur.NAV:\n    case Ur.PRE:\n    case Ur.MAIN:\n    case Ur.MENU:\n    case Ur.ASIDE:\n    case Ur.BUTTON:\n    case Ur.CENTER:\n    case Ur.FIGURE:\n    case Ur.FOOTER:\n    case Ur.HEADER:\n    case Ur.HGROUP:\n    case Ur.DIALOG:\n    case Ur.ADDRESS:\n    case Ur.ARTICLE:\n    case Ur.DETAILS:\n    case Ur.SECTION:\n    case Ur.SUMMARY:\n    case Ur.LISTING:\n    case Ur.FIELDSET:\n    case Ur.BLOCKQUOTE:\n    case Ur.FIGCAPTION:\n      !(function (e, t) {\n        ((t = t.tagID),\n          e.openElements.hasInScope(t) &&\n            (e.openElements.generateImpliedEndTags(), e.openElements.popUntilTagNamePopped(t)));\n      })(e, t);\n      break;\n    case Ur.LI:\n      !(function (e) {\n        e.openElements.hasInListItemScope(Ur.LI) &&\n          (e.openElements.generateImpliedEndTagsWithExclusion(Ur.LI), e.openElements.popUntilTagNamePopped(Ur.LI));\n      })(e);\n      break;\n    case Ur.DD:\n    case Ur.DT:\n      !(function (e, t) {\n        ((t = t.tagID),\n          e.openElements.hasInScope(t) &&\n            (e.openElements.generateImpliedEndTagsWithExclusion(t), e.openElements.popUntilTagNamePopped(t)));\n      })(e, t);\n      break;\n    case Ur.H1:\n    case Ur.H2:\n    case Ur.H3:\n    case Ur.H4:\n    case Ur.H5:\n    case Ur.H6:\n      !(function (e) {\n        e.openElements.hasNumberedHeaderInScope() &&\n          (e.openElements.generateImpliedEndTags(), e.openElements.popUntilNumberedHeaderPopped());\n      })(e);\n      break;\n    case Ur.BR:\n      !(function (e) {\n        (e._reconstructActiveFormattingElements(),\n          e._insertFakeElement(Fr.BR, Ur.BR),\n          e.openElements.pop(),\n          (e.framesetOk = !1));\n      })(e);\n      break;\n    case Ur.BODY:\n      !(function (e, t) {\n        var n;\n        e.openElements.hasInScope(Ur.BODY) &&\n          ((e.insertionMode = Yi.AFTER_BODY), e.options.sourceCodeLocationInfo) &&\n          (n = e.openElements.tryPeekProperlyNestedBodyElement()) &&\n          e._setEndLocation(n, t);\n      })(e, t);\n      break;\n    case Ur.HTML:\n      !(function (e, t) {\n        e.openElements.hasInScope(Ur.BODY) && ((e.insertionMode = Yi.AFTER_BODY), Hs(e, t));\n      })(e, t);\n      break;\n    case Ur.FORM:\n      !(function (e) {\n        var t = 0 < e.openElements.tmplCount,\n          n = e.formElement;\n        (t || (e.formElement = null),\n          (n || t) &&\n            e.openElements.hasInScope(Ur.FORM) &&\n            (e.openElements.generateImpliedEndTags(),\n            t ? e.openElements.popUntilTagNamePopped(Ur.FORM) : n && e.openElements.remove(n)));\n      })(e);\n      break;\n    case Ur.APPLET:\n    case Ur.OBJECT:\n    case Ur.MARQUEE:\n      !(function (e, t) {\n        ((t = t.tagID),\n          e.openElements.hasInScope(t) &&\n            (e.openElements.generateImpliedEndTags(),\n            e.openElements.popUntilTagNamePopped(t),\n            e.activeFormattingElements.clearToLastMarker()));\n      })(e, t);\n      break;\n    case Ur.TEMPLATE:\n      cs(e, t);\n      break;\n    default:\n      gs(e, t);\n  }\n}\nfunction ys(e, t) {\n  (0 < e.tmplInsertionModeStack.length ? Us : rs)(e, t);\n}\nfunction Ss(e, t) {\n  if (Wi.has(e.openElements.currentTagId))\n    switch (\n      ((e.pendingCharacterTokens.length = 0),\n      (e.hasNonWhitespacePendingCharacterToken = !1),\n      (e.originalInsertionMode = e.insertionMode),\n      (e.insertionMode = Yi.IN_TABLE_TEXT),\n      t.type)\n    ) {\n      case Tr.CHARACTER:\n        Os(e, t);\n        break;\n      case Tr.WHITESPACE_CHARACTER:\n        Is(e, t);\n    }\n  else bs(e, t);\n}\nfunction Cs(e, t) {\n  switch (t.tagID) {\n    case Ur.TD:\n    case Ur.TH:\n    case Ur.TR:\n      !(function (e, t) {\n        (e.openElements.clearBackToTableContext(),\n          e._insertFakeElement(Fr.TBODY, Ur.TBODY),\n          (e.insertionMode = Yi.IN_TABLE_BODY),\n          ws(e, t));\n      })(e, t);\n      break;\n    case Ur.STYLE:\n    case Ur.SCRIPT:\n    case Ur.TEMPLATE:\n      os(e, t);\n      break;\n    case Ur.COL:\n      !(function (e, t) {\n        (e.openElements.clearBackToTableContext(),\n          e._insertFakeElement(Fr.COLGROUP, Ur.COLGROUP),\n          (e.insertionMode = Yi.IN_COLUMN_GROUP),\n          Ds(e, t));\n      })(e, t);\n      break;\n    case Ur.FORM:\n      !(function (e, t) {\n        e.formElement ||\n          0 !== e.openElements.tmplCount ||\n          (e._insertElement(t, Mr.HTML), (e.formElement = e.openElements.current), e.openElements.pop());\n      })(e, t);\n      break;\n    case Ur.TABLE:\n      !(function (e, t) {\n        e.openElements.hasInTableScope(Ur.TABLE) &&\n          (e.openElements.popUntilTagNamePopped(Ur.TABLE), e._resetInsertionMode(), e._processStartTag(t));\n      })(e, t);\n      break;\n    case Ur.TBODY:\n    case Ur.TFOOT:\n    case Ur.THEAD:\n      !(function (e, t) {\n        (e.openElements.clearBackToTableContext(), e._insertElement(t, Mr.HTML), (e.insertionMode = Yi.IN_TABLE_BODY));\n      })(e, t);\n      break;\n    case Ur.INPUT:\n      !(function (e, t) {\n        (_s(t) ? e._appendElement(t, Mr.HTML) : bs(e, t), (t.ackSelfClosing = !0));\n      })(e, t);\n      break;\n    case Ur.CAPTION:\n      !(function (e, t) {\n        (e.openElements.clearBackToTableContext(),\n          e.activeFormattingElements.insertMarker(),\n          e._insertElement(t, Mr.HTML),\n          (e.insertionMode = Yi.IN_CAPTION));\n      })(e, t);\n      break;\n    case Ur.COLGROUP:\n      !(function (e, t) {\n        (e.openElements.clearBackToTableContext(),\n          e._insertElement(t, Mr.HTML),\n          (e.insertionMode = Yi.IN_COLUMN_GROUP));\n      })(e, t);\n      break;\n    default:\n      bs(e, t);\n  }\n}\nfunction Ns(e, t) {\n  switch (t.tagID) {\n    case Ur.TABLE:\n      e.openElements.hasInTableScope(Ur.TABLE) &&\n        (e.openElements.popUntilTagNamePopped(Ur.TABLE), e._resetInsertionMode());\n      break;\n    case Ur.TEMPLATE:\n      cs(e, t);\n      break;\n    case Ur.BODY:\n    case Ur.CAPTION:\n    case Ur.COL:\n    case Ur.COLGROUP:\n    case Ur.HTML:\n    case Ur.TBODY:\n    case Ur.TD:\n    case Ur.TFOOT:\n    case Ur.TH:\n    case Ur.THEAD:\n    case Ur.TR:\n      break;\n    default:\n      bs(e, t);\n  }\n}\nfunction bs(e, t) {\n  var n = e.fosterParentingEnabled;\n  ((e.fosterParentingEnabled = !0), fs(e, t), (e.fosterParentingEnabled = n));\n}\nfunction Is(e, t) {\n  e.pendingCharacterTokens.push(t);\n}\nfunction Os(e, t) {\n  (e.pendingCharacterTokens.push(t), (e.hasNonWhitespacePendingCharacterToken = !0));\n}\nfunction ks(e, t) {\n  let n = 0;\n  if (e.hasNonWhitespacePendingCharacterToken)\n    for (; n < e.pendingCharacterTokens.length; n++) bs(e, e.pendingCharacterTokens[n]);\n  else for (; n < e.pendingCharacterTokens.length; n++) e._insertCharacters(e.pendingCharacterTokens[n]);\n  ((e.insertionMode = e.originalInsertionMode), e._processToken(t));\n}\nconst Ls = new Set([Ur.CAPTION, Ur.COL, Ur.COLGROUP, Ur.TBODY, Ur.TD, Ur.TFOOT, Ur.TH, Ur.THEAD, Ur.TR]);\nfunction Ds(e, t) {\n  switch (t.tagID) {\n    case Ur.HTML:\n      As(e, t);\n      break;\n    case Ur.COL:\n      (e._appendElement(t, Mr.HTML), (t.ackSelfClosing = !0));\n      break;\n    case Ur.TEMPLATE:\n      os(e, t);\n      break;\n    default:\n      Rs(e, t);\n  }\n}\nfunction Rs(e, t) {\n  e.openElements.currentTagId === Ur.COLGROUP &&\n    (e.openElements.pop(), (e.insertionMode = Yi.IN_TABLE), e._processToken(t));\n}\nfunction ws(e, t) {\n  switch (t.tagID) {\n    case Ur.TR:\n      (e.openElements.clearBackToTableBodyContext(), e._insertElement(t, Mr.HTML), (e.insertionMode = Yi.IN_ROW));\n      break;\n    case Ur.TH:\n    case Ur.TD:\n      (e.openElements.clearBackToTableBodyContext(),\n        e._insertFakeElement(Fr.TR, Ur.TR),\n        (e.insertionMode = Yi.IN_ROW),\n        Ms(e, t));\n      break;\n    case Ur.CAPTION:\n    case Ur.COL:\n    case Ur.COLGROUP:\n    case Ur.TBODY:\n    case Ur.TFOOT:\n    case Ur.THEAD:\n      e.openElements.hasTableBodyContextInTableScope() &&\n        (e.openElements.clearBackToTableBodyContext(), e.openElements.pop(), (e.insertionMode = Yi.IN_TABLE), Cs(e, t));\n      break;\n    default:\n      Cs(e, t);\n  }\n}\nfunction xs(e, t) {\n  var n = t.tagID;\n  switch (t.tagID) {\n    case Ur.TBODY:\n    case Ur.TFOOT:\n    case Ur.THEAD:\n      e.openElements.hasInTableScope(n) &&\n        (e.openElements.clearBackToTableBodyContext(), e.openElements.pop(), (e.insertionMode = Yi.IN_TABLE));\n      break;\n    case Ur.TABLE:\n      e.openElements.hasTableBodyContextInTableScope() &&\n        (e.openElements.clearBackToTableBodyContext(), e.openElements.pop(), (e.insertionMode = Yi.IN_TABLE), Ns(e, t));\n      break;\n    case Ur.BODY:\n    case Ur.CAPTION:\n    case Ur.COL:\n    case Ur.COLGROUP:\n    case Ur.HTML:\n    case Ur.TD:\n    case Ur.TH:\n    case Ur.TR:\n      break;\n    default:\n      Ns(e, t);\n  }\n}\nfunction Ms(e, t) {\n  switch (t.tagID) {\n    case Ur.TH:\n    case Ur.TD:\n      (e.openElements.clearBackToTableRowContext(),\n        e._insertElement(t, Mr.HTML),\n        (e.insertionMode = Yi.IN_CELL),\n        e.activeFormattingElements.insertMarker());\n      break;\n    case Ur.CAPTION:\n    case Ur.COL:\n    case Ur.COLGROUP:\n    case Ur.TBODY:\n    case Ur.TFOOT:\n    case Ur.THEAD:\n    case Ur.TR:\n      e.openElements.hasInTableScope(Ur.TR) &&\n        (e.openElements.clearBackToTableRowContext(),\n        e.openElements.pop(),\n        (e.insertionMode = Yi.IN_TABLE_BODY),\n        ws(e, t));\n      break;\n    default:\n      Cs(e, t);\n  }\n}\nfunction Ps(e, t) {\n  switch (t.tagID) {\n    case Ur.TR:\n      e.openElements.hasInTableScope(Ur.TR) &&\n        (e.openElements.clearBackToTableRowContext(), e.openElements.pop(), (e.insertionMode = Yi.IN_TABLE_BODY));\n      break;\n    case Ur.TABLE:\n      e.openElements.hasInTableScope(Ur.TR) &&\n        (e.openElements.clearBackToTableRowContext(),\n        e.openElements.pop(),\n        (e.insertionMode = Yi.IN_TABLE_BODY),\n        xs(e, t));\n      break;\n    case Ur.TBODY:\n    case Ur.TFOOT:\n    case Ur.THEAD:\n      (e.openElements.hasInTableScope(t.tagID) || e.openElements.hasInTableScope(Ur.TR)) &&\n        (e.openElements.clearBackToTableRowContext(),\n        e.openElements.pop(),\n        (e.insertionMode = Yi.IN_TABLE_BODY),\n        xs(e, t));\n      break;\n    case Ur.BODY:\n    case Ur.CAPTION:\n    case Ur.COL:\n    case Ur.COLGROUP:\n    case Ur.HTML:\n    case Ur.TD:\n    case Ur.TH:\n      break;\n    default:\n      Ns(e, t);\n  }\n}\nfunction Bs(e, t) {\n  switch (t.tagID) {\n    case Ur.HTML:\n      As(e, t);\n      break;\n    case Ur.OPTION:\n      (e.openElements.currentTagId === Ur.OPTION && e.openElements.pop(), e._insertElement(t, Mr.HTML));\n      break;\n    case Ur.OPTGROUP:\n      (e.openElements.currentTagId === Ur.OPTION && e.openElements.pop(),\n        e.openElements.currentTagId === Ur.OPTGROUP && e.openElements.pop(),\n        e._insertElement(t, Mr.HTML));\n      break;\n    case Ur.INPUT:\n    case Ur.KEYGEN:\n    case Ur.TEXTAREA:\n    case Ur.SELECT:\n      e.openElements.hasInSelectScope(Ur.SELECT) &&\n        (e.openElements.popUntilTagNamePopped(Ur.SELECT), e._resetInsertionMode(), t.tagID !== Ur.SELECT) &&\n        e._processStartTag(t);\n      break;\n    case Ur.SCRIPT:\n    case Ur.TEMPLATE:\n      os(e, t);\n  }\n}\nfunction Fs(e, t) {\n  switch (t.tagID) {\n    case Ur.OPTGROUP:\n      (0 < e.openElements.stackTop &&\n        e.openElements.currentTagId === Ur.OPTION &&\n        e.openElements.tagIDs[e.openElements.stackTop - 1] === Ur.OPTGROUP &&\n        e.openElements.pop(),\n        e.openElements.currentTagId === Ur.OPTGROUP && e.openElements.pop());\n      break;\n    case Ur.OPTION:\n      e.openElements.currentTagId === Ur.OPTION && e.openElements.pop();\n      break;\n    case Ur.SELECT:\n      e.openElements.hasInSelectScope(Ur.SELECT) &&\n        (e.openElements.popUntilTagNamePopped(Ur.SELECT), e._resetInsertionMode());\n      break;\n    case Ur.TEMPLATE:\n      cs(e, t);\n  }\n}\nfunction Us(e, t) {\n  0 < e.openElements.tmplCount\n    ? (e.openElements.popUntilTagNamePopped(Ur.TEMPLATE),\n      e.activeFormattingElements.clearToLastMarker(),\n      e.tmplInsertionModeStack.shift(),\n      e._resetInsertionMode(),\n      e.onEof(t))\n    : rs(e, t);\n}\nfunction Hs(e, t) {\n  var n, r;\n  t.tagID === Ur.HTML\n    ? (e.fragmentContext || (e.insertionMode = Yi.AFTER_AFTER_BODY),\n      e.options.sourceCodeLocationInfo &&\n        e.openElements.tagIDs[0] === Ur.HTML &&\n        (e._setEndLocation(e.openElements.items[0], t),\n        !(r = e.openElements.items[1]) ||\n          (null != (n = e.treeAdapter.getNodeSourceCodeLocation(r)) && n.endTag) ||\n          e._setEndLocation(r, t)))\n    : Gs(e, t);\n}\nfunction Gs(e, t) {\n  ((e.insertionMode = Yi.IN_BODY), fs(e, t));\n}\nfunction js(e, t) {\n  ((e.insertionMode = Yi.IN_BODY), fs(e, t));\n}\nfunction qs(e) {\n  for (\n    ;\n    e.treeAdapter.getNamespaceURI(e.openElements.current) !== Mr.HTML &&\n    !e._isIntegrationPoint(e.openElements.currentTagId, e.openElements.current);\n  )\n    e.openElements.pop();\n}\nvar Ys = Sr(function (e, t) {\n    (Object.defineProperty(t, '__esModule', { value: !0 }),\n      (t.escapeText =\n        t.escapeAttribute =\n        t.escapeUTF8 =\n        t.escape =\n        t.encodeXML =\n        t.getCodePoint =\n        t.xmlReplacer =\n          void 0),\n      (t.xmlReplacer = /[\"&'<>$\\x80-\\uFFFF]/g));\n    var n = new Map([\n      [34, '&quot;'],\n      [38, '&amp;'],\n      [39, '&apos;'],\n      [60, '&lt;'],\n      [62, '&gt;'],\n    ]);\n    function r(e) {\n      for (var i = '', s = 0; null !== (r = t.xmlReplacer.exec(e)); )\n        var r = r.index,\n          o = e.charCodeAt(r),\n          c = n.get(o),\n          s =\n            void 0 !== c\n              ? ((i += e.substring(s, r) + c), r + 1)\n              : ((i += ''.concat(e.substring(s, r), '&#x').concat((0, t.getCodePoint)(e, r).toString(16), ';')),\n                (t.xmlReplacer.lastIndex += Number(55296 == (64512 & o))));\n      return i + e.substr(s);\n    }\n    function i(e, t) {\n      return function (n) {\n        for (var r, i = 0, s = ''; (r = e.exec(n)); )\n          (i !== r.index && (s += n.substring(i, r.index)), (s += t.get(r[0].charCodeAt(0))), (i = r.index + 1));\n        return s + n.substring(i);\n      };\n    }\n    ((t.getCodePoint =\n      null != String.prototype.codePointAt\n        ? function (e, t) {\n            return e.codePointAt(t);\n          }\n        : function (e, t) {\n            return 55296 == (64512 & e.charCodeAt(t))\n              ? 1024 * (e.charCodeAt(t) - 55296) + e.charCodeAt(t + 1) - 56320 + 65536\n              : e.charCodeAt(t);\n          }),\n      (t.encodeXML = r),\n      (t.escape = r),\n      (t.escapeUTF8 = i(/[&<>'\"]/g, n)),\n      (t.escapeAttribute = i(\n        /[\"&\\u00A0]/g,\n        new Map([\n          [34, '&quot;'],\n          [38, '&amp;'],\n          [160, '&nbsp;'],\n        ]),\n      )),\n      (t.escapeText = i(\n        /[&<>\\u00A0]/g,\n        new Map([\n          [38, '&amp;'],\n          [60, '&lt;'],\n          [62, '&gt;'],\n          [160, '&nbsp;'],\n        ]),\n      )));\n  }),\n  Ks = (yr(Ys), Ys.escapeText),\n  Ws = Ys.escapeAttribute;\n(Ys.escapeUTF8, Ys.escape, Ys.encodeXML, Ys.getCodePoint, Ys.xmlReplacer);\nconst Vs = new Set([\n    Fr.AREA,\n    Fr.BASE,\n    Fr.BASEFONT,\n    Fr.BGSOUND,\n    Fr.BR,\n    Fr.COL,\n    Fr.EMBED,\n    Fr.FRAME,\n    Fr.HR,\n    Fr.IMG,\n    Fr.INPUT,\n    Fr.KEYGEN,\n    Fr.LINK,\n    Fr.META,\n    Fr.PARAM,\n    Fr.SOURCE,\n    Fr.TRACK,\n    Fr.WBR,\n  ]),\n  $s = { treeAdapter: gi, scriptingEnabled: !0 };\nfunction Qs(e, t) {\n  return zs(e, { ...$s, ...t });\n}\nfunction zs(e, t) {\n  return t.treeAdapter.isElementNode(e)\n    ? (function (e, t) {\n        var n = t.treeAdapter.getTagName(e);\n        return (\n          `<${n}${(function (e, { treeAdapter: t }) {\n            let n = '';\n            for (const r of t.getAttrList(e)) {\n              if (((n += ' '), r.namespace))\n                switch (r.namespace) {\n                  case Mr.XML:\n                    n += 'xml:' + r.name;\n                    break;\n                  case Mr.XMLNS:\n                    ('xmlns' !== r.name && (n += 'xmlns:'), (n += r.name));\n                    break;\n                  case Mr.XLINK:\n                    n += 'xlink:' + r.name;\n                    break;\n                  default:\n                    n += r.prefix + ':' + r.name;\n                }\n              else n += r.name;\n              n += `=\"${Ws(r.value)}\"`;\n            }\n            return n;\n          })(e, t)}>` +\n          ((function (e, t) {\n            return (\n              t.treeAdapter.isElementNode(e) &&\n              t.treeAdapter.getNamespaceURI(e) === Mr.HTML &&\n              Vs.has(t.treeAdapter.getTagName(e))\n            );\n          })(e, t)\n            ? ''\n            : (function (e, t) {\n                let n = '';\n                var e =\n                    t.treeAdapter.isElementNode(e) &&\n                    t.treeAdapter.getTagName(e) === Fr.TEMPLATE &&\n                    t.treeAdapter.getNamespaceURI(e) === Mr.HTML\n                      ? t.treeAdapter.getTemplateContent(e)\n                      : e,\n                  i = t.treeAdapter.getChildNodes(e);\n                if (i) for (const e of i) n += zs(e, t);\n                return n;\n              })(e, t) + `</${n}>`)\n        );\n      })(e, t)\n    : t.treeAdapter.isTextNode(e)\n      ? (function (e, t) {\n          var n = t.treeAdapter,\n            r = n.getTextNodeContent(e),\n            s = (e = n.getParentNode(e)) && n.isElementNode(e) && n.getTagName(e);\n          return s &&\n            n.getNamespaceURI(e) === Mr.HTML &&\n            ((n = s), (e = t.scriptingEnabled), Vr.has(n) || (e && n === Fr.NOSCRIPT))\n            ? r\n            : Ks(r);\n        })(e, t)\n      : t.treeAdapter.isCommentNode(e)\n        ? (function (e, { treeAdapter: t }) {\n            return `<!--${t.getCommentNodeContent(e)}-->`;\n          })(e, t)\n        : t.treeAdapter.isDocumentTypeNode(e)\n          ? (function (e, { treeAdapter: t }) {\n              return `<!DOCTYPE ${t.getDocumentTypeNodeName(e)}>`;\n            })(e, t)\n          : '';\n}\nfunction Xs(e) {\n  return new _(e);\n}\nfunction Zs(e) {\n  var t = e.includes('\"') ? \"'\" : '\"';\n  return t + e + t;\n}\nconst Js = {\n  isCommentNode: b,\n  isElementNode: S,\n  isTextNode: N,\n  createDocument() {\n    var e = new v([]);\n    return ((e['x-mode'] = Br.NO_QUIRKS), e);\n  },\n  createDocumentFragment: () => new v([]),\n  createElement(e, t, n) {\n    var r = Object.create(null),\n      i = Object.create(null),\n      s = Object.create(null);\n    for (let e = 0; e < n.length; e++) {\n      const t = n[e].name;\n      ((r[t] = n[e].value), (i[t] = n[e].namespace), (s[t] = n[e].prefix));\n    }\n    return (((e = new y(e, r, [])).namespace = t), (e['x-attribsNamespace'] = i), (e['x-attribsPrefix'] = s), e);\n  },\n  createCommentNode: (e) => new E(e),\n  appendChild(e, t) {\n    var n = e.children[e.children.length - 1];\n    (n && ((n.next = t).prev = n), e.children.push(t), (t.parent = e));\n  },\n  insertBefore(e, t, n) {\n    var r = e.children.indexOf(n),\n      i = n.prev;\n    (i && ((i.next = t).prev = i), ((n.prev = t).next = n), e.children.splice(r, 0, t), (t.parent = e));\n  },\n  setTemplateContent(e, t) {\n    Js.appendChild(e, t);\n  },\n  getTemplateContent: (e) => e.children[0],\n  setDocumentType(e, t, n, r) {\n    var i = (function (e, t, n) {\n      let r = '!DOCTYPE ';\n      return (e && (r += e), t ? (r += ' PUBLIC ' + Zs(t)) : n && (r += ' SYSTEM'), n && (r += ' ' + Zs(n)), r);\n    })(t, n, r);\n    let s = e.children.find((e) => I(e) && '!doctype' === e.name);\n    (s ? (s.data = null != i ? i : null) : ((s = new T('!doctype', i)), Js.appendChild(e, s)),\n      (s['x-name'] = null != t ? t : void 0),\n      (s['x-publicId'] = null != n ? n : void 0),\n      (s['x-systemId'] = null != r ? r : void 0));\n  },\n  setDocumentMode(e, t) {\n    e['x-mode'] = t;\n  },\n  getDocumentMode: (e) => e['x-mode'],\n  detachNode(e) {\n    var t, n, r;\n    e.parent &&\n      ((t = e.parent.children.indexOf(e)),\n      ({ prev: n, next: r } = e),\n      (e.prev = null),\n      (e.next = null),\n      n && (n.next = r),\n      r && (r.prev = n),\n      e.parent.children.splice(t, 1),\n      (e.parent = null));\n  },\n  insertText(e, t) {\n    var n = e.children[e.children.length - 1];\n    n && N(n) ? (n.data += t) : Js.appendChild(e, Xs(t));\n  },\n  insertTextBefore(e, t, n) {\n    var r = e.children[e.children.indexOf(n) - 1];\n    r && N(r) ? (r.data += t) : Js.insertBefore(e, Xs(t), n);\n  },\n  adoptAttributes(e, t) {\n    for (let n = 0; n < t.length; n++) {\n      var r = t[n].name;\n      void 0 === e.attribs[r] &&\n        ((e.attribs[r] = t[n].value),\n        (e['x-attribsNamespace'][r] = t[n].namespace),\n        (e['x-attribsPrefix'][r] = t[n].prefix));\n    }\n  },\n  getFirstChild: (e) => e.children[0],\n  getChildNodes: (e) => e.children,\n  getParentNode: (e) => e.parent,\n  getAttrList: (e) => e.attributes,\n  getTagName: (e) => e.name,\n  getNamespaceURI: (e) => e.namespace,\n  getTextNodeContent: (e) => e.data,\n  getCommentNodeContent: (e) => e.data,\n  getDocumentTypeNodeName(e) {\n    return null != (e = e['x-name']) ? e : '';\n  },\n  getDocumentTypeNodePublicId(e) {\n    return null != (e = e['x-publicId']) ? e : '';\n  },\n  getDocumentTypeNodeSystemId(e) {\n    return null != (e = e['x-systemId']) ? e : '';\n  },\n  isDocumentTypeNode: (e) => I(e) && '!doctype' === e.name,\n  setNodeSourceCodeLocation(e, t) {\n    (t && ((e.startIndex = t.startOffset), (e.endIndex = t.endOffset)), (e.sourceCodeLocation = t));\n  },\n  getNodeSourceCodeLocation: (e) => e.sourceCodeLocation,\n  updateNodeSourceCodeLocation(e, t) {\n    (null != t.endOffset && (e.endIndex = t.endOffset), (e.sourceCodeLocation = { ...e.sourceCodeLocation, ...t }));\n  },\n};\nvar ea = function (e, t, n) {\n  if (n || 2 === arguments.length)\n    for (var r, i = 0, s = t.length; i < s; i++)\n      (!r && i in t) || ((r = r || Array.prototype.slice.call(t, 0, i))[i] = t[i]);\n  return e.concat(r || Array.prototype.slice.call(t));\n};\nfunction ta(e, t, n, r) {\n  return (\n    (t = {\n      scriptingEnabled: 'boolean' != typeof t.scriptingEnabled || t.scriptingEnabled,\n      treeAdapter: Js,\n      sourceCodeLocationInfo: t.sourceCodeLocationInfo,\n    }),\n    n\n      ? (function (e, t) {\n          return $i.parse(e, t);\n        })(e, t)\n      : (function (e, t, n) {\n          return (\n            'string' == typeof e && ((n = t), (t = e), (e = null)),\n            (e = $i.getFragmentParser(e, n)).tokenizer.write(t, !0),\n            e.getFragment()\n          );\n        })(r, e, t)\n  );\n}\nvar na,\n  ra,\n  ia,\n  sa = { treeAdapter: Js };\nfunction aa(e) {\n  return e === na.Space || e === na.NewLine || e === na.Tab || e === na.FormFeed || e === na.CarriageReturn;\n}\nfunction oa(e) {\n  return e === na.Slash || e === na.Gt || aa(e);\n}\nfunction ca(e) {\n  return e >= na.Zero && e <= na.Nine;\n}\n(!(function (e) {\n  ((e[(e.Tab = 9)] = 'Tab'),\n    (e[(e.NewLine = 10)] = 'NewLine'),\n    (e[(e.FormFeed = 12)] = 'FormFeed'),\n    (e[(e.CarriageReturn = 13)] = 'CarriageReturn'),\n    (e[(e.Space = 32)] = 'Space'),\n    (e[(e.ExclamationMark = 33)] = 'ExclamationMark'),\n    (e[(e.Number = 35)] = 'Number'),\n    (e[(e.Amp = 38)] = 'Amp'),\n    (e[(e.SingleQuote = 39)] = 'SingleQuote'),\n    (e[(e.DoubleQuote = 34)] = 'DoubleQuote'),\n    (e[(e.Dash = 45)] = 'Dash'),\n    (e[(e.Slash = 47)] = 'Slash'),\n    (e[(e.Zero = 48)] = 'Zero'),\n    (e[(e.Nine = 57)] = 'Nine'),\n    (e[(e.Semi = 59)] = 'Semi'),\n    (e[(e.Lt = 60)] = 'Lt'),\n    (e[(e.Eq = 61)] = 'Eq'),\n    (e[(e.Gt = 62)] = 'Gt'),\n    (e[(e.Questionmark = 63)] = 'Questionmark'),\n    (e[(e.UpperA = 65)] = 'UpperA'),\n    (e[(e.LowerA = 97)] = 'LowerA'),\n    (e[(e.UpperF = 70)] = 'UpperF'),\n    (e[(e.LowerF = 102)] = 'LowerF'),\n    (e[(e.UpperZ = 90)] = 'UpperZ'),\n    (e[(e.LowerZ = 122)] = 'LowerZ'),\n    (e[(e.LowerX = 120)] = 'LowerX'),\n    (e[(e.OpeningSquareBracket = 91)] = 'OpeningSquareBracket'));\n})((na = na || {})),\n  (function (e) {\n    ((e[(e.Text = 1)] = 'Text'),\n      (e[(e.BeforeTagName = 2)] = 'BeforeTagName'),\n      (e[(e.InTagName = 3)] = 'InTagName'),\n      (e[(e.InSelfClosingTag = 4)] = 'InSelfClosingTag'),\n      (e[(e.BeforeClosingTagName = 5)] = 'BeforeClosingTagName'),\n      (e[(e.InClosingTagName = 6)] = 'InClosingTagName'),\n      (e[(e.AfterClosingTagName = 7)] = 'AfterClosingTagName'),\n      (e[(e.BeforeAttributeName = 8)] = 'BeforeAttributeName'),\n      (e[(e.InAttributeName = 9)] = 'InAttributeName'),\n      (e[(e.AfterAttributeName = 10)] = 'AfterAttributeName'),\n      (e[(e.BeforeAttributeValue = 11)] = 'BeforeAttributeValue'),\n      (e[(e.InAttributeValueDq = 12)] = 'InAttributeValueDq'),\n      (e[(e.InAttributeValueSq = 13)] = 'InAttributeValueSq'),\n      (e[(e.InAttributeValueNq = 14)] = 'InAttributeValueNq'),\n      (e[(e.BeforeDeclaration = 15)] = 'BeforeDeclaration'),\n      (e[(e.InDeclaration = 16)] = 'InDeclaration'),\n      (e[(e.InProcessingInstruction = 17)] = 'InProcessingInstruction'),\n      (e[(e.BeforeComment = 18)] = 'BeforeComment'),\n      (e[(e.CDATASequence = 19)] = 'CDATASequence'),\n      (e[(e.InSpecialComment = 20)] = 'InSpecialComment'),\n      (e[(e.InCommentLike = 21)] = 'InCommentLike'),\n      (e[(e.BeforeSpecialS = 22)] = 'BeforeSpecialS'),\n      (e[(e.SpecialStartSequence = 23)] = 'SpecialStartSequence'),\n      (e[(e.InSpecialTag = 24)] = 'InSpecialTag'),\n      (e[(e.BeforeEntity = 25)] = 'BeforeEntity'),\n      (e[(e.BeforeNumericEntity = 26)] = 'BeforeNumericEntity'),\n      (e[(e.InNamedEntity = 27)] = 'InNamedEntity'),\n      (e[(e.InNumericEntity = 28)] = 'InNumericEntity'),\n      (e[(e.InHexEntity = 29)] = 'InHexEntity'));\n  })((ra = ra || {})),\n  (function (e) {\n    ((e[(e.NoValue = 0)] = 'NoValue'),\n      (e[(e.Unquoted = 1)] = 'Unquoted'),\n      (e[(e.Single = 2)] = 'Single'),\n      (e[(e.Double = 3)] = 'Double'));\n  })((ia = ia || {})));\nconst ua = {\n  Cdata: new Uint8Array([67, 68, 65, 84, 65, 91]),\n  CdataEnd: new Uint8Array([93, 93, 62]),\n  CommentEnd: new Uint8Array([45, 45, 62]),\n  ScriptEnd: new Uint8Array([60, 47, 115, 99, 114, 105, 112, 116]),\n  StyleEnd: new Uint8Array([60, 47, 115, 116, 121, 108, 101]),\n  TitleEnd: new Uint8Array([60, 47, 116, 105, 116, 108, 101]),\n};\nclass la {\n  constructor({ xmlMode: e = !1, decodeEntities: t = !0 }, n) {\n    ((this.cbs = n),\n      (this.state = ra.Text),\n      (this.buffer = ''),\n      (this.sectionStart = 0),\n      (this.index = 0),\n      (this.baseState = ra.Text),\n      (this.isSpecial = !1),\n      (this.running = !0),\n      (this.offset = 0),\n      (this.currentSequence = void 0),\n      (this.sequenceIndex = 0),\n      (this.trieIndex = 0),\n      (this.trieCurrent = 0),\n      (this.entityResult = 0),\n      (this.entityExcess = 0),\n      (this.xmlMode = e),\n      (this.decodeEntities = t),\n      (this.entityTrie = e ? Hr : Gr));\n  }\n  reset() {\n    ((this.state = ra.Text),\n      (this.buffer = ''),\n      (this.sectionStart = 0),\n      (this.index = 0),\n      (this.baseState = ra.Text),\n      (this.currentSequence = void 0),\n      (this.running = !0),\n      (this.offset = 0));\n  }\n  write(e) {\n    ((this.offset += this.buffer.length), (this.buffer = e), this.parse());\n  }\n  end() {\n    this.running && this.finish();\n  }\n  pause() {\n    this.running = !1;\n  }\n  resume() {\n    ((this.running = !0), this.index < this.buffer.length + this.offset && this.parse());\n  }\n  getIndex() {\n    return this.index;\n  }\n  getSectionStart() {\n    return this.sectionStart;\n  }\n  stateText(e) {\n    e === na.Lt || (!this.decodeEntities && this.fastForwardTo(na.Lt))\n      ? (this.index > this.sectionStart && this.cbs.ontext(this.sectionStart, this.index),\n        (this.state = ra.BeforeTagName),\n        (this.sectionStart = this.index))\n      : this.decodeEntities && e === na.Amp && (this.state = ra.BeforeEntity);\n  }\n  stateSpecialStartSequence(e) {\n    var t = this.sequenceIndex === this.currentSequence.length;\n    if (t ? oa(e) : (32 | e) === this.currentSequence[this.sequenceIndex]) {\n      if (!t) return void this.sequenceIndex++;\n    } else this.isSpecial = !1;\n    ((this.sequenceIndex = 0), (this.state = ra.InTagName), this.stateInTagName(e));\n  }\n  stateInSpecialTag(e) {\n    if (this.sequenceIndex === this.currentSequence.length) {\n      if (e === na.Gt || aa(e)) {\n        var t = this.index - this.currentSequence.length;\n        if (this.sectionStart < t) {\n          const e = this.index;\n          ((this.index = t), this.cbs.ontext(this.sectionStart, t), (this.index = e));\n        }\n        return ((this.isSpecial = !1), (this.sectionStart = 2 + t), void this.stateInClosingTagName(e));\n      }\n      this.sequenceIndex = 0;\n    }\n    (32 | e) === this.currentSequence[this.sequenceIndex]\n      ? (this.sequenceIndex += 1)\n      : 0 === this.sequenceIndex\n        ? this.currentSequence === ua.TitleEnd\n          ? this.decodeEntities && e === na.Amp && (this.state = ra.BeforeEntity)\n          : this.fastForwardTo(na.Lt) && (this.sequenceIndex = 1)\n        : (this.sequenceIndex = Number(e === na.Lt));\n  }\n  stateCDATASequence(e) {\n    e === ua.Cdata[this.sequenceIndex]\n      ? ++this.sequenceIndex === ua.Cdata.length &&\n        ((this.state = ra.InCommentLike),\n        (this.currentSequence = ua.CdataEnd),\n        (this.sequenceIndex = 0),\n        (this.sectionStart = this.index + 1))\n      : ((this.sequenceIndex = 0), (this.state = ra.InDeclaration), this.stateInDeclaration(e));\n  }\n  fastForwardTo(e) {\n    for (; ++this.index < this.buffer.length + this.offset; )\n      if (this.buffer.charCodeAt(this.index - this.offset) === e) return !0;\n    return ((this.index = this.buffer.length + this.offset - 1), !1);\n  }\n  stateInCommentLike(e) {\n    e === this.currentSequence[this.sequenceIndex]\n      ? ++this.sequenceIndex === this.currentSequence.length &&\n        (this.currentSequence === ua.CdataEnd\n          ? this.cbs.oncdata(this.sectionStart, this.index, 2)\n          : this.cbs.oncomment(this.sectionStart, this.index, 2),\n        (this.sequenceIndex = 0),\n        (this.sectionStart = this.index + 1),\n        (this.state = ra.Text))\n      : 0 === this.sequenceIndex\n        ? this.fastForwardTo(this.currentSequence[0]) && (this.sequenceIndex = 1)\n        : e !== this.currentSequence[this.sequenceIndex - 1] && (this.sequenceIndex = 0);\n  }\n  isTagStartChar(e) {\n    return this.xmlMode\n      ? !oa(e)\n      : (function (e) {\n          return (e >= na.LowerA && e <= na.LowerZ) || (e >= na.UpperA && e <= na.UpperZ);\n        })(e);\n  }\n  startSpecial(e, t) {\n    ((this.isSpecial = !0),\n      (this.currentSequence = e),\n      (this.sequenceIndex = t),\n      (this.state = ra.SpecialStartSequence));\n  }\n  stateBeforeTagName(e) {\n    var t;\n    e === na.ExclamationMark\n      ? ((this.state = ra.BeforeDeclaration), (this.sectionStart = this.index + 1))\n      : e === na.Questionmark\n        ? ((this.state = ra.InProcessingInstruction), (this.sectionStart = this.index + 1))\n        : this.isTagStartChar(e)\n          ? ((t = 32 | e),\n            (this.sectionStart = this.index),\n            this.xmlMode || t !== ua.TitleEnd[2]\n              ? (this.state = this.xmlMode || t !== ua.ScriptEnd[2] ? ra.InTagName : ra.BeforeSpecialS)\n              : this.startSpecial(ua.TitleEnd, 3))\n          : e === na.Slash\n            ? (this.state = ra.BeforeClosingTagName)\n            : ((this.state = ra.Text), this.stateText(e));\n  }\n  stateInTagName(e) {\n    oa(e) &&\n      (this.cbs.onopentagname(this.sectionStart, this.index),\n      (this.sectionStart = -1),\n      (this.state = ra.BeforeAttributeName),\n      this.stateBeforeAttributeName(e));\n  }\n  stateBeforeClosingTagName(e) {\n    aa(e) ||\n      (e === na.Gt\n        ? (this.state = ra.Text)\n        : ((this.state = this.isTagStartChar(e) ? ra.InClosingTagName : ra.InSpecialComment),\n          (this.sectionStart = this.index)));\n  }\n  stateInClosingTagName(e) {\n    (e !== na.Gt && !aa(e)) ||\n      (this.cbs.onclosetag(this.sectionStart, this.index),\n      (this.sectionStart = -1),\n      (this.state = ra.AfterClosingTagName),\n      this.stateAfterClosingTagName(e));\n  }\n  stateAfterClosingTagName(e) {\n    (e !== na.Gt && !this.fastForwardTo(na.Gt)) ||\n      ((this.state = ra.Text), (this.baseState = ra.Text), (this.sectionStart = this.index + 1));\n  }\n  stateBeforeAttributeName(e) {\n    e === na.Gt\n      ? (this.cbs.onopentagend(this.index),\n        this.isSpecial ? ((this.state = ra.InSpecialTag), (this.sequenceIndex = 0)) : (this.state = ra.Text),\n        (this.baseState = this.state),\n        (this.sectionStart = this.index + 1))\n      : e === na.Slash\n        ? (this.state = ra.InSelfClosingTag)\n        : aa(e) || ((this.state = ra.InAttributeName), (this.sectionStart = this.index));\n  }\n  stateInSelfClosingTag(e) {\n    e === na.Gt\n      ? (this.cbs.onselfclosingtag(this.index),\n        (this.state = ra.Text),\n        (this.baseState = ra.Text),\n        (this.sectionStart = this.index + 1),\n        (this.isSpecial = !1))\n      : aa(e) || ((this.state = ra.BeforeAttributeName), this.stateBeforeAttributeName(e));\n  }\n  stateInAttributeName(e) {\n    (e !== na.Eq && !oa(e)) ||\n      (this.cbs.onattribname(this.sectionStart, this.index),\n      (this.sectionStart = -1),\n      (this.state = ra.AfterAttributeName),\n      this.stateAfterAttributeName(e));\n  }\n  stateAfterAttributeName(e) {\n    e === na.Eq\n      ? (this.state = ra.BeforeAttributeValue)\n      : e === na.Slash || e === na.Gt\n        ? (this.cbs.onattribend(ia.NoValue, this.index),\n          (this.state = ra.BeforeAttributeName),\n          this.stateBeforeAttributeName(e))\n        : aa(e) ||\n          (this.cbs.onattribend(ia.NoValue, this.index),\n          (this.state = ra.InAttributeName),\n          (this.sectionStart = this.index));\n  }\n  stateBeforeAttributeValue(e) {\n    e === na.DoubleQuote\n      ? ((this.state = ra.InAttributeValueDq), (this.sectionStart = this.index + 1))\n      : e === na.SingleQuote\n        ? ((this.state = ra.InAttributeValueSq), (this.sectionStart = this.index + 1))\n        : aa(e) ||\n          ((this.sectionStart = this.index),\n          (this.state = ra.InAttributeValueNq),\n          this.stateInAttributeValueNoQuotes(e));\n  }\n  handleInAttributeValue(e, t) {\n    e === t || (!this.decodeEntities && this.fastForwardTo(t))\n      ? (this.cbs.onattribdata(this.sectionStart, this.index),\n        (this.sectionStart = -1),\n        this.cbs.onattribend(t === na.DoubleQuote ? ia.Double : ia.Single, this.index),\n        (this.state = ra.BeforeAttributeName))\n      : this.decodeEntities && e === na.Amp && ((this.baseState = this.state), (this.state = ra.BeforeEntity));\n  }\n  stateInAttributeValueDoubleQuotes(e) {\n    this.handleInAttributeValue(e, na.DoubleQuote);\n  }\n  stateInAttributeValueSingleQuotes(e) {\n    this.handleInAttributeValue(e, na.SingleQuote);\n  }\n  stateInAttributeValueNoQuotes(e) {\n    aa(e) || e === na.Gt\n      ? (this.cbs.onattribdata(this.sectionStart, this.index),\n        (this.sectionStart = -1),\n        this.cbs.onattribend(ia.Unquoted, this.index),\n        (this.state = ra.BeforeAttributeName),\n        this.stateBeforeAttributeName(e))\n      : this.decodeEntities && e === na.Amp && ((this.baseState = this.state), (this.state = ra.BeforeEntity));\n  }\n  stateBeforeDeclaration(e) {\n    e === na.OpeningSquareBracket\n      ? ((this.state = ra.CDATASequence), (this.sequenceIndex = 0))\n      : (this.state = e === na.Dash ? ra.BeforeComment : ra.InDeclaration);\n  }\n  stateInDeclaration(e) {\n    (e !== na.Gt && !this.fastForwardTo(na.Gt)) ||\n      (this.cbs.ondeclaration(this.sectionStart, this.index),\n      (this.state = ra.Text),\n      (this.sectionStart = this.index + 1));\n  }\n  stateInProcessingInstruction(e) {\n    (e !== na.Gt && !this.fastForwardTo(na.Gt)) ||\n      (this.cbs.onprocessinginstruction(this.sectionStart, this.index),\n      (this.state = ra.Text),\n      (this.sectionStart = this.index + 1));\n  }\n  stateBeforeComment(e) {\n    e === na.Dash\n      ? ((this.state = ra.InCommentLike),\n        (this.currentSequence = ua.CommentEnd),\n        (this.sequenceIndex = 2),\n        (this.sectionStart = this.index + 1))\n      : (this.state = ra.InDeclaration);\n  }\n  stateInSpecialComment(e) {\n    (e !== na.Gt && !this.fastForwardTo(na.Gt)) ||\n      (this.cbs.oncomment(this.sectionStart, this.index, 0),\n      (this.state = ra.Text),\n      (this.sectionStart = this.index + 1));\n  }\n  stateBeforeSpecialS(e) {\n    var t = 32 | e;\n    t === ua.ScriptEnd[3]\n      ? this.startSpecial(ua.ScriptEnd, 4)\n      : t === ua.StyleEnd[3]\n        ? this.startSpecial(ua.StyleEnd, 4)\n        : ((this.state = ra.InTagName), this.stateInTagName(e));\n  }\n  stateBeforeEntity(e) {\n    ((this.entityExcess = 1),\n      (this.entityResult = 0),\n      e === na.Number\n        ? (this.state = ra.BeforeNumericEntity)\n        : e !== na.Amp &&\n          ((this.trieIndex = 0),\n          (this.trieCurrent = this.entityTrie[0]),\n          (this.state = ra.InNamedEntity),\n          this.stateInNamedEntity(e)));\n  }\n  stateInNamedEntity(e) {\n    if (\n      ((this.entityExcess += 1),\n      (this.trieIndex = Dr(this.entityTrie, this.trieCurrent, this.trieIndex + 1, e)),\n      this.trieIndex < 0)\n    )\n      (this.emitNamedEntity(), this.index--);\n    else {\n      this.trieCurrent = this.entityTrie[this.trieIndex];\n      var t = this.trieCurrent & Rr.VALUE_LENGTH;\n      if (t)\n        if (((t = (t >> 14) - 1), this.allowLegacyEntity() || e === na.Semi)) {\n          const e = this.index - this.entityExcess + 1;\n          (e > this.sectionStart && this.emitPartial(this.sectionStart, e),\n            (this.entityResult = this.trieIndex),\n            (this.trieIndex += t),\n            (this.entityExcess = 0),\n            (this.sectionStart = this.index + 1),\n            0 == t && this.emitNamedEntity());\n        } else this.trieIndex += t;\n    }\n  }\n  emitNamedEntity() {\n    if (((this.state = this.baseState), 0 !== this.entityResult))\n      switch ((this.entityTrie[this.entityResult] & Rr.VALUE_LENGTH) >> 14) {\n        case 1:\n          this.emitCodePoint(this.entityTrie[this.entityResult] & ~Rr.VALUE_LENGTH);\n          break;\n        case 2:\n          this.emitCodePoint(this.entityTrie[this.entityResult + 1]);\n          break;\n        case 3:\n          (this.emitCodePoint(this.entityTrie[this.entityResult + 1]),\n            this.emitCodePoint(this.entityTrie[this.entityResult + 2]));\n      }\n  }\n  stateBeforeNumericEntity(e) {\n    (32 | e) === na.LowerX\n      ? (this.entityExcess++, (this.state = ra.InHexEntity))\n      : ((this.state = ra.InNumericEntity), this.stateInNumericEntity(e));\n  }\n  emitNumericEntity(e) {\n    var t = this.index - this.entityExcess - 1;\n    (2 + t + Number(this.state === ra.InHexEntity) !== this.index &&\n      (t > this.sectionStart && this.emitPartial(this.sectionStart, t),\n      (this.sectionStart = this.index + Number(e)),\n      this.emitCodePoint(xr(this.entityResult))),\n      (this.state = this.baseState));\n  }\n  stateInNumericEntity(e) {\n    e === na.Semi\n      ? this.emitNumericEntity(!0)\n      : ca(e)\n        ? ((this.entityResult = 10 * this.entityResult + (e - na.Zero)), this.entityExcess++)\n        : (this.allowLegacyEntity() ? this.emitNumericEntity(!1) : (this.state = this.baseState), this.index--);\n  }\n  stateInHexEntity(e) {\n    e === na.Semi\n      ? this.emitNumericEntity(!0)\n      : ca(e)\n        ? ((this.entityResult = 16 * this.entityResult + (e - na.Zero)), this.entityExcess++)\n        : (function (e) {\n              return (e >= na.UpperA && e <= na.UpperF) || (e >= na.LowerA && e <= na.LowerF);\n            })(e)\n          ? ((this.entityResult = 16 * this.entityResult + ((32 | e) - na.LowerA + 10)), this.entityExcess++)\n          : (this.allowLegacyEntity() ? this.emitNumericEntity(!1) : (this.state = this.baseState), this.index--);\n  }\n  allowLegacyEntity() {\n    return !this.xmlMode && (this.baseState === ra.Text || this.baseState === ra.InSpecialTag);\n  }\n  cleanup() {\n    this.running &&\n      this.sectionStart !== this.index &&\n      (this.state === ra.Text || (this.state === ra.InSpecialTag && 0 === this.sequenceIndex)\n        ? (this.cbs.ontext(this.sectionStart, this.index), (this.sectionStart = this.index))\n        : (this.state !== ra.InAttributeValueDq &&\n            this.state !== ra.InAttributeValueSq &&\n            this.state !== ra.InAttributeValueNq) ||\n          (this.cbs.onattribdata(this.sectionStart, this.index), (this.sectionStart = this.index)));\n  }\n  shouldContinue() {\n    return this.index < this.buffer.length + this.offset && this.running;\n  }\n  parse() {\n    for (; this.shouldContinue(); ) {\n      var e = this.buffer.charCodeAt(this.index - this.offset);\n      switch (this.state) {\n        case ra.Text:\n          this.stateText(e);\n          break;\n        case ra.SpecialStartSequence:\n          this.stateSpecialStartSequence(e);\n          break;\n        case ra.InSpecialTag:\n          this.stateInSpecialTag(e);\n          break;\n        case ra.CDATASequence:\n          this.stateCDATASequence(e);\n          break;\n        case ra.InAttributeValueDq:\n          this.stateInAttributeValueDoubleQuotes(e);\n          break;\n        case ra.InAttributeName:\n          this.stateInAttributeName(e);\n          break;\n        case ra.InCommentLike:\n          this.stateInCommentLike(e);\n          break;\n        case ra.InSpecialComment:\n          this.stateInSpecialComment(e);\n          break;\n        case ra.BeforeAttributeName:\n          this.stateBeforeAttributeName(e);\n          break;\n        case ra.InTagName:\n          this.stateInTagName(e);\n          break;\n        case ra.InClosingTagName:\n          this.stateInClosingTagName(e);\n          break;\n        case ra.BeforeTagName:\n          this.stateBeforeTagName(e);\n          break;\n        case ra.AfterAttributeName:\n          this.stateAfterAttributeName(e);\n          break;\n        case ra.InAttributeValueSq:\n          this.stateInAttributeValueSingleQuotes(e);\n          break;\n        case ra.BeforeAttributeValue:\n          this.stateBeforeAttributeValue(e);\n          break;\n        case ra.BeforeClosingTagName:\n          this.stateBeforeClosingTagName(e);\n          break;\n        case ra.AfterClosingTagName:\n          this.stateAfterClosingTagName(e);\n          break;\n        case ra.BeforeSpecialS:\n          this.stateBeforeSpecialS(e);\n          break;\n        case ra.InAttributeValueNq:\n          this.stateInAttributeValueNoQuotes(e);\n          break;\n        case ra.InSelfClosingTag:\n          this.stateInSelfClosingTag(e);\n          break;\n        case ra.InDeclaration:\n          this.stateInDeclaration(e);\n          break;\n        case ra.BeforeDeclaration:\n          this.stateBeforeDeclaration(e);\n          break;\n        case ra.BeforeComment:\n          this.stateBeforeComment(e);\n          break;\n        case ra.InProcessingInstruction:\n          this.stateInProcessingInstruction(e);\n          break;\n        case ra.InNamedEntity:\n          this.stateInNamedEntity(e);\n          break;\n        case ra.BeforeEntity:\n          this.stateBeforeEntity(e);\n          break;\n        case ra.InHexEntity:\n          this.stateInHexEntity(e);\n          break;\n        case ra.InNumericEntity:\n          this.stateInNumericEntity(e);\n          break;\n        default:\n          this.stateBeforeNumericEntity(e);\n      }\n      this.index++;\n    }\n    this.cleanup();\n  }\n  finish() {\n    (this.state === ra.InNamedEntity && this.emitNamedEntity(),\n      this.sectionStart < this.index && this.handleTrailingData(),\n      this.cbs.onend());\n  }\n  handleTrailingData() {\n    var e = this.buffer.length + this.offset;\n    this.state === ra.InCommentLike\n      ? this.currentSequence === ua.CdataEnd\n        ? this.cbs.oncdata(this.sectionStart, e, 0)\n        : this.cbs.oncomment(this.sectionStart, e, 0)\n      : (this.state === ra.InNumericEntity && this.allowLegacyEntity()) ||\n          (this.state === ra.InHexEntity && this.allowLegacyEntity())\n        ? this.emitNumericEntity(!1)\n        : this.state !== ra.InTagName &&\n          this.state !== ra.BeforeAttributeName &&\n          this.state !== ra.BeforeAttributeValue &&\n          this.state !== ra.AfterAttributeName &&\n          this.state !== ra.InAttributeName &&\n          this.state !== ra.InAttributeValueSq &&\n          this.state !== ra.InAttributeValueDq &&\n          this.state !== ra.InAttributeValueNq &&\n          this.state !== ra.InClosingTagName &&\n          this.cbs.ontext(this.sectionStart, e);\n  }\n  emitPartial(e, t) {\n    this.baseState !== ra.Text && this.baseState !== ra.InSpecialTag\n      ? this.cbs.onattribdata(e, t)\n      : this.cbs.ontext(e, t);\n  }\n  emitCodePoint(e) {\n    this.baseState !== ra.Text && this.baseState !== ra.InSpecialTag\n      ? this.cbs.onattribentity(e)\n      : this.cbs.ontextentity(e);\n  }\n}\nconst ha = new Set(['input', 'option', 'optgroup', 'select', 'button', 'datalist', 'textarea']),\n  fa = new Set(['p']),\n  pa = new Set(['thead', 'tbody']),\n  da = new Set(['dd', 'dt']),\n  ma = new Set(['rt', 'rp']),\n  _a = new Map([\n    ['tr', new Set(['tr', 'th', 'td'])],\n    ['th', new Set(['th'])],\n    ['td', new Set(['thead', 'th', 'td'])],\n    ['body', new Set(['head', 'link', 'script'])],\n    ['li', new Set(['li'])],\n    ['p', fa],\n    ['h1', fa],\n    ['h2', fa],\n    ['h3', fa],\n    ['h4', fa],\n    ['h5', fa],\n    ['h6', fa],\n    ['select', ha],\n    ['input', ha],\n    ['output', ha],\n    ['button', ha],\n    ['datalist', ha],\n    ['textarea', ha],\n    ['option', new Set(['option'])],\n    ['optgroup', new Set(['optgroup', 'option'])],\n    ['dd', da],\n    ['dt', da],\n    ['address', fa],\n    ['article', fa],\n    ['aside', fa],\n    ['blockquote', fa],\n    ['details', fa],\n    ['div', fa],\n    ['dl', fa],\n    ['fieldset', fa],\n    ['figcaption', fa],\n    ['figure', fa],\n    ['footer', fa],\n    ['form', fa],\n    ['header', fa],\n    ['hr', fa],\n    ['main', fa],\n    ['nav', fa],\n    ['ol', fa],\n    ['pre', fa],\n    ['section', fa],\n    ['table', fa],\n    ['ul', fa],\n    ['rt', ma],\n    ['rp', ma],\n    ['tbody', pa],\n    ['tfoot', pa],\n  ]),\n  Ea = new Set([\n    'area',\n    'base',\n    'basefont',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'frame',\n    'hr',\n    'img',\n    'input',\n    'isindex',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr',\n  ]),\n  Ta = new Set(['math', 'svg']),\n  Aa = new Set(['mi', 'mo', 'mn', 'ms', 'mtext', 'annotation-xml', 'foreignobject', 'desc', 'title']),\n  ga = /\\s|\\//;\nclass va {\n  constructor(e, t = {}) {\n    ((this.options = t),\n      (this.startIndex = 0),\n      (this.endIndex = 0),\n      (this.openTagStart = 0),\n      (this.tagname = ''),\n      (this.attribname = ''),\n      (this.attribvalue = ''),\n      (this.attribs = null),\n      (this.stack = []),\n      (this.foreignContext = []),\n      (this.buffers = []),\n      (this.bufferOffset = 0),\n      (this.writeIndex = 0),\n      (this.ended = !1),\n      (this.cbs = null != e ? e : {}),\n      (this.lowerCaseTagNames = null != (e = t.lowerCaseTags) ? e : !t.xmlMode),\n      (this.lowerCaseAttributeNames = null != (e = t.lowerCaseAttributeNames) ? e : !t.xmlMode),\n      (this.tokenizer = new (null != (e = t.Tokenizer) ? e : la)(this.options, this)),\n      null != (e = (t = this.cbs).onparserinit) && e.call(t, this));\n  }\n  ontext(e, t) {\n    var n,\n      r,\n      e = this.getSlice(e, t);\n    ((this.endIndex = t - 1), null != (r = (n = this.cbs).ontext) && r.call(n, e), (this.startIndex = t));\n  }\n  ontextentity(e) {\n    var t,\n      n,\n      r = this.tokenizer.getSectionStart();\n    ((this.endIndex = r - 1), null != (n = (t = this.cbs).ontext) && n.call(t, wr(e)), (this.startIndex = r));\n  }\n  isVoidElement(e) {\n    return !this.options.xmlMode && Ea.has(e);\n  }\n  onopentagname(e, t) {\n    this.endIndex = t;\n    let n = this.getSlice(e, t);\n    (this.lowerCaseTagNames && (n = n.toLowerCase()), this.emitOpenTag(n));\n  }\n  emitOpenTag(e) {\n    ((this.openTagStart = this.startIndex), (this.tagname = e));\n    var t,\n      n,\n      r,\n      i,\n      s = !this.options.xmlMode && _a.get(e);\n    if (s)\n      for (; 0 < this.stack.length && s.has(this.stack[this.stack.length - 1]); ) {\n        const e = this.stack.pop();\n        null != (n = (t = this.cbs).onclosetag) && n.call(t, e, !0);\n      }\n    (this.isVoidElement(e) ||\n      (this.stack.push(e), Ta.has(e) ? this.foreignContext.push(!0) : Aa.has(e) && this.foreignContext.push(!1)),\n      null != (i = (r = this.cbs).onopentagname) && i.call(r, e),\n      this.cbs.onopentag && (this.attribs = {}));\n  }\n  endOpenTag(e) {\n    var t, n;\n    ((this.startIndex = this.openTagStart),\n      this.attribs &&\n        (null != (n = (t = this.cbs).onopentag) && n.call(t, this.tagname, this.attribs, e), (this.attribs = null)),\n      this.cbs.onclosetag && this.isVoidElement(this.tagname) && this.cbs.onclosetag(this.tagname, !0),\n      (this.tagname = ''));\n  }\n  onopentagend(e) {\n    ((this.endIndex = e), this.endOpenTag(!1), (this.startIndex = e + 1));\n  }\n  onclosetag(e, t) {\n    var r;\n    this.endIndex = t;\n    let c = this.getSlice(e, t);\n    if (\n      (this.lowerCaseTagNames && (c = c.toLowerCase()),\n      (Ta.has(c) || Aa.has(c)) && this.foreignContext.pop(),\n      this.isVoidElement(c))\n    )\n      this.options.xmlMode ||\n        'br' !== c ||\n        (null != (r = (e = this.cbs).onopentagname) && r.call(e, 'br'),\n        null != (e = (r = this.cbs).onopentag) && e.call(r, 'br', {}, !0),\n        null == (r = (e = this.cbs).onclosetag)) ||\n        r.call(e, 'br', !1);\n    else {\n      const e = this.stack.lastIndexOf(c);\n      if (-1 !== e)\n        if (this.cbs.onclosetag) {\n          let t = this.stack.length - e;\n          for (; t--; ) this.cbs.onclosetag(this.stack.pop(), 0 !== t);\n        } else this.stack.length = e;\n      else this.options.xmlMode || 'p' !== c || (this.emitOpenTag('p'), this.closeCurrentTag(!0));\n    }\n    this.startIndex = t + 1;\n  }\n  onselfclosingtag(e) {\n    ((this.endIndex = e),\n      this.options.xmlMode || this.options.recognizeSelfClosing || this.foreignContext[this.foreignContext.length - 1]\n        ? (this.closeCurrentTag(!1), (this.startIndex = e + 1))\n        : this.onopentagend(e));\n  }\n  closeCurrentTag(e) {\n    var t,\n      n,\n      r = this.tagname;\n    (this.endOpenTag(e),\n      this.stack[this.stack.length - 1] === r &&\n        (null != (n = (t = this.cbs).onclosetag) && n.call(t, r, !e), this.stack.pop()));\n  }\n  onattribname(e, t) {\n    ((this.startIndex = e),\n      (e = this.getSlice(e, t)),\n      (this.attribname = this.lowerCaseAttributeNames ? e.toLowerCase() : e));\n  }\n  onattribdata(e, t) {\n    this.attribvalue += this.getSlice(e, t);\n  }\n  onattribentity(e) {\n    this.attribvalue += wr(e);\n  }\n  onattribend(e, t) {\n    var r;\n    ((this.endIndex = t),\n      null != (r = (t = this.cbs).onattribute) &&\n        r.call(\n          t,\n          this.attribname,\n          this.attribvalue,\n          e === ia.Double ? '\"' : e === ia.Single ? \"'\" : e === ia.NoValue ? void 0 : null,\n        ),\n      this.attribs &&\n        !Object.prototype.hasOwnProperty.call(this.attribs, this.attribname) &&\n        (this.attribs[this.attribname] = this.attribvalue),\n      (this.attribvalue = ''));\n  }\n  getInstructionName(e) {\n    var t = e.search(ga);\n    let n = t < 0 ? e : e.substr(0, t);\n    return (n = this.lowerCaseTagNames ? n.toLowerCase() : n);\n  }\n  ondeclaration(e, t) {\n    this.endIndex = t;\n    var n = this.getSlice(e, t);\n    if (this.cbs.onprocessinginstruction) {\n      const e = this.getInstructionName(n);\n      this.cbs.onprocessinginstruction('!' + e, '!' + n);\n    }\n    this.startIndex = t + 1;\n  }\n  onprocessinginstruction(e, t) {\n    this.endIndex = t;\n    var n = this.getSlice(e, t);\n    if (this.cbs.onprocessinginstruction) {\n      const e = this.getInstructionName(n);\n      this.cbs.onprocessinginstruction('?' + e, '?' + n);\n    }\n    this.startIndex = t + 1;\n  }\n  oncomment(e, t, n) {\n    var i, r;\n    ((this.endIndex = t),\n      null != (i = (r = this.cbs).oncomment) && i.call(r, this.getSlice(e, t - n)),\n      null != (r = (i = this.cbs).oncommentend) && r.call(i),\n      (this.startIndex = t + 1));\n  }\n  oncdata(e, t, n) {\n    this.endIndex = t;\n    var i,\n      e = this.getSlice(e, t - n);\n    (this.options.xmlMode || this.options.recognizeCDATA\n      ? (null != (i = (n = this.cbs).oncdatastart) && i.call(n),\n        null != (n = (i = this.cbs).ontext) && n.call(i, e),\n        null != (i = (n = this.cbs).oncdataend) && i.call(n))\n      : (null != (n = (i = this.cbs).oncomment) && n.call(i, `[CDATA[${e}]]`),\n        null != (i = (n = this.cbs).oncommentend) && i.call(n)),\n      (this.startIndex = t + 1));\n  }\n  onend() {\n    var e, t;\n    if (this.cbs.onclosetag) {\n      this.endIndex = this.startIndex;\n      for (let e = this.stack.length; 0 < e; this.cbs.onclosetag(this.stack[--e], !0));\n    }\n    null != (t = (e = this.cbs).onend) && t.call(e);\n  }\n  reset() {\n    var t, e;\n    (null != (t = (e = this.cbs).onreset) && t.call(e),\n      this.tokenizer.reset(),\n      (this.tagname = ''),\n      (this.attribname = ''),\n      (this.attribs = null),\n      (this.stack.length = 0),\n      (this.startIndex = 0),\n      (this.endIndex = 0),\n      null != (e = (t = this.cbs).onparserinit) && e.call(t, this),\n      (this.buffers.length = 0),\n      (this.bufferOffset = 0),\n      (this.writeIndex = 0),\n      (this.ended = !1));\n  }\n  parseComplete(e) {\n    (this.reset(), this.end(e));\n  }\n  getSlice(e, t) {\n    for (; e - this.bufferOffset >= this.buffers[0].length; ) this.shiftBuffer();\n    let n = this.buffers[0].slice(e - this.bufferOffset, t - this.bufferOffset);\n    for (; t - this.bufferOffset > this.buffers[0].length; )\n      (this.shiftBuffer(), (n += this.buffers[0].slice(0, t - this.bufferOffset)));\n    return n;\n  }\n  shiftBuffer() {\n    ((this.bufferOffset += this.buffers[0].length), this.writeIndex--, this.buffers.shift());\n  }\n  write(e) {\n    var t, n;\n    this.ended\n      ? null != (n = (t = this.cbs).onerror) && n.call(t, new Error('.write() after done!'))\n      : (this.buffers.push(e), this.tokenizer.running && (this.tokenizer.write(e), this.writeIndex++));\n  }\n  end(e) {\n    var t, n;\n    this.ended\n      ? null != (n = (t = this.cbs).onerror) && n.call(t, new Error('.end() after done!'))\n      : (e && this.write(e), (this.ended = !0), this.tokenizer.end());\n  }\n  pause() {\n    this.tokenizer.pause();\n  }\n  resume() {\n    for (this.tokenizer.resume(); this.tokenizer.running && this.writeIndex < this.buffers.length; )\n      this.tokenizer.write(this.buffers[this.writeIndex++]);\n    this.ended && this.tokenizer.end();\n  }\n  parseChunk(e) {\n    this.write(e);\n  }\n  done(e) {\n    this.end(e);\n  }\n}\nvar ya,\n  Sa =\n    'undefined' != typeof global\n      ? global\n      : 'undefined' != typeof self\n        ? self\n        : 'undefined' != typeof window\n          ? window\n          : {};\nfunction Ca(e) {\n  if (Object.keys) return Object.keys(e);\n  var n,\n    t = [];\n  for (n in e) t.push(n);\n  return t;\n}\nfunction Na(e, t) {\n  if (e.forEach) return e.forEach(t);\n  for (var n = 0; n < e.length; n++) t(e[n], n, e);\n}\nfunction ba() {\n  try {\n    return (\n      Object.defineProperty({}, '_', {}),\n      function (e, t, n) {\n        Object.defineProperty(e, t, { writable: !0, enumerable: !1, configurable: !0, value: n });\n      }\n    );\n  } catch (e) {\n    return function (e, t, n) {\n      e[t] = n;\n    };\n  }\n}\nvar Ia = [\n  'Array',\n  'Boolean',\n  'Date',\n  'Error',\n  'EvalError',\n  'Function',\n  'Infinity',\n  'JSON',\n  'Math',\n  'NaN',\n  'Number',\n  'Object',\n  'RangeError',\n  'ReferenceError',\n  'RegExp',\n  'String',\n  'SyntaxError',\n  'TypeError',\n  'URIError',\n  'decodeURI',\n  'decodeURIComponent',\n  'encodeURI',\n  'encodeURIComponent',\n  'escape',\n  'eval',\n  'isFinite',\n  'isNaN',\n  'parseFloat',\n  'parseInt',\n  'undefined',\n  'unescape',\n];\nfunction Oa() {}\nfunction ka(e) {\n  if (!(this instanceof ka)) return new ka(e);\n  this.code = e;\n}\nfunction La(e) {\n  var t;\n  return Da(e)\n    ? e\n    : ((t = new Oa()),\n      'object' == typeof e &&\n        Na(Ca(e), function (n) {\n          t[n] = e[n];\n        }),\n      t);\n}\nfunction Da(e) {\n  return e instanceof Oa;\n}\n((Oa.prototype = {}),\n  (ka.prototype.runInContext = function (e) {\n    var t, n, r, s, i;\n    if (e instanceof Oa)\n      return Sa.document\n        ? ((t = Sa.document.createElement('iframe')).style || (t.style = {}),\n          (t.style.display = 'none'),\n          Sa.document.body.appendChild(t),\n          (r = (n = t.contentWindow).eval),\n          (i = n.execScript),\n          !r && i && (i.call(n, 'null'), (r = n.eval)),\n          Na(Ca(e), function (t) {\n            n[t] = e[t];\n          }),\n          Na(Ia, function (t) {\n            e[t] && (n[t] = e[t]);\n          }),\n          (s = Ca(n)),\n          (i = r.call(n, this.code)),\n          Na(Ca(n), function (t) {\n            (t in e ||\n              -1 ===\n                (function (e, t) {\n                  if (wa) return e.indexOf(t);\n                  for (var n = 0; n < e.length; ++n) if (e[n] === t) return n;\n                  return -1;\n                })(s, t)) &&\n              (e[t] = n[t]);\n          }),\n          Na(Ia, function (t) {\n            var s;\n            t in e || ((s = n[t]), (ya = 'function' != typeof ya ? ba : ya)(e, t, s));\n          }),\n          Sa.document.body.removeChild(t),\n          i)\n        : (function (e, t) {\n            var n = Ca(Sa);\n            return (\n              n.push('with (this.__ctx__){return eval(this.__code__)}'),\n              Function.apply(null, n).apply({ __code__: e, __ctx__: t })\n            );\n          })(this.code, e);\n    throw new TypeError(\"needs a 'context' argument.\");\n  }),\n  (ka.prototype.runInThisContext = function () {\n    return new Function('code', 'return eval(code);').call(Sa, this.code);\n  }),\n  (ka.prototype.runInNewContext = function (e) {\n    var t = La(e),\n      n = this.runInContext(t);\n    return (\n      e &&\n        Na(Ca(t), function (n) {\n          e[n] = t[n];\n        }),\n      n\n    );\n  }));\nvar Ra = {\n    runInContext: function (e, t, n) {\n      return new ka(e).runInContext(t, n);\n    },\n    isContext: Da,\n    createContext: La,\n    createScript: function (e) {\n      return new ka(e);\n    },\n    Script: ka,\n    runInThisContext: function (e, t) {\n      return new ka(e).runInThisContext(t);\n    },\n    runInNewContext: function (e, t, n) {\n      return new ka(e).runInNewContext(t, n);\n    },\n  },\n  wa = [].indexOf;\nconst xa = Object.prototype.hasOwnProperty;\nfunction Ma(e, t) {\n  return ((e = e.slice()).push(t), e);\n}\nfunction Pa(e, t) {\n  return ((t = t.slice()).unshift(e), t);\n}\nclass Ba extends Error {\n  constructor(e) {\n    (super('JSONPath should not be called with \"new\" (it prevents return of (unwrapped) scalar values)'),\n      (this.avoidNew = !0),\n      (this.value = e),\n      (this.name = 'NewError'));\n  }\n}\nfunction Fa(e, t, n, r, i) {\n  if (!(this instanceof Fa))\n    try {\n      return new Fa(e, t, n, r, i);\n    } catch (e) {\n      if (e.avoidNew) return e.value;\n      throw e;\n    }\n  'string' == typeof e && ((i = r), (r = n), (n = t), (t = e), (e = null));\n  var s = e && 'object' == typeof e;\n  if (\n    ((this.json = (e = e || {}).json || n),\n    (this.path = e.path || t),\n    (this.resultType = e.resultType || 'value'),\n    (this.flatten = e.flatten || !1),\n    (this.wrap = !xa.call(e, 'wrap') || e.wrap),\n    (this.sandbox = e.sandbox || {}),\n    (this.preventEval = e.preventEval || !1),\n    (this.parent = e.parent || null),\n    (this.parentProperty = e.parentProperty || null),\n    (this.callback = e.callback || r || null),\n    (this.otherTypeCallback =\n      e.otherTypeCallback ||\n      i ||\n      function () {\n        throw new TypeError('You must supply an otherTypeCallback callback option with the @other() operator.');\n      }),\n    !1 !== e.autostart)\n  ) {\n    const r = { path: s ? e.path : t },\n      i = (s ? 'json' in e && (r.json = e.json) : (r.json = n), this.evaluate(r));\n    if (i && 'object' == typeof i) return i;\n    throw new Ba(i);\n  }\n}\n((Fa.prototype.evaluate = function (e, t, n, r) {\n  let i = this.parent,\n    s = this.parentProperty,\n    { flatten: a, wrap: o } = this;\n  if (\n    ((this.currResultType = this.resultType),\n    (this.currPreventEval = this.preventEval),\n    (this.currSandbox = this.sandbox),\n    (n = n || this.callback),\n    (this.currOtherTypeCallback = r || this.otherTypeCallback),\n    (t = t || this.json),\n    (e = e || this.path) && 'object' == typeof e && !Array.isArray(e))\n  ) {\n    if (!e.path && '' !== e.path)\n      throw new TypeError(\n        'You must supply a \"path\" property when providing an object argument to JSONPath.evaluate().',\n      );\n    if (!xa.call(e, 'json'))\n      throw new TypeError(\n        'You must supply a \"json\" property when providing an object argument to JSONPath.evaluate().',\n      );\n    ((t = e.json),\n      (a = xa.call(e, 'flatten') ? e.flatten : a),\n      (this.currResultType = xa.call(e, 'resultType') ? e.resultType : this.currResultType),\n      (this.currSandbox = xa.call(e, 'sandbox') ? e.sandbox : this.currSandbox),\n      (o = xa.call(e, 'wrap') ? e.wrap : o),\n      (this.currPreventEval = xa.call(e, 'preventEval') ? e.preventEval : this.currPreventEval),\n      (n = xa.call(e, 'callback') ? e.callback : n),\n      (this.currOtherTypeCallback = xa.call(e, 'otherTypeCallback') ? e.otherTypeCallback : this.currOtherTypeCallback),\n      (i = xa.call(e, 'parent') ? e.parent : i),\n      (s = xa.call(e, 'parentProperty') ? e.parentProperty : s),\n      (e = e.path));\n  }\n  if (((i = i || null), (s = s || null), ((e = Array.isArray(e) ? Fa.toPathString(e) : e) || '' === e) && t))\n    return (\n      '$' === (r = Fa.toPathArray(e))[0] && 1 < r.length && r.shift(),\n      (this._hasParentSelector = null),\n      (e = this._trace(r, t, ['$'], i, s, n).filter(function (e) {\n        return e && !e.isParentSelector;\n      })).length\n        ? o || 1 !== e.length || e[0].hasArrExpr\n          ? e.reduce(\n              (e, t) => ((t = this._getPreferredOutput(t)), a && Array.isArray(t) ? (e = e.concat(t)) : e.push(t), e),\n              [],\n            )\n          : this._getPreferredOutput(e[0])\n        : o\n          ? []\n          : void 0\n    );\n}),\n  (Fa.prototype._getPreferredOutput = function (e) {\n    const t = this.currResultType;\n    switch (t) {\n      case 'all': {\n        const t = Array.isArray(e.path) ? e.path : Fa.toPathArray(e.path);\n        return (\n          (e.pointer = Fa.toPointer(t)),\n          (e.path = 'string' == typeof e.path ? e.path : Fa.toPathString(e.path)),\n          e\n        );\n      }\n      case 'value':\n      case 'parent':\n      case 'parentProperty':\n        return e[t];\n      case 'path':\n        return Fa.toPathString(e[t]);\n      case 'pointer':\n        return Fa.toPointer(e.path);\n      default:\n        throw new TypeError('Unknown result type');\n    }\n  }),\n  (Fa.prototype._handleCallback = function (e, t, n) {\n    var r;\n    t &&\n      ((r = this._getPreferredOutput(e)),\n      (e.path = 'string' == typeof e.path ? e.path : Fa.toPathString(e.path)),\n      t(r, n, e));\n  }),\n  (Fa.prototype._trace = function (e, t, n, r, i, s, a, o) {\n    let c;\n    if (!e.length)\n      return (\n        (c = { path: n, value: t, parent: r, parentProperty: i, hasArrExpr: a }),\n        this._handleCallback(c, s, 'value'),\n        c\n      );\n    const u = e[0],\n      l = e.slice(1),\n      h = [];\n    function f(e) {\n      Array.isArray(e)\n        ? e.forEach((e) => {\n            h.push(e);\n          })\n        : h.push(e);\n    }\n    if (('string' != typeof u || o) && t && xa.call(t, u)) f(this._trace(l, t[u], Ma(n, u), t, u, s, a));\n    else if ('*' === u)\n      this._walk(t, (e) => {\n        f(this._trace(l, t[e], Ma(n, e), t, e, s, !0, !0));\n      });\n    else if ('..' === u)\n      (f(this._trace(l, t, n, r, i, s, a)),\n        this._walk(t, (r) => {\n          'object' == typeof t[r] && f(this._trace(e.slice(), t[r], Ma(n, r), t, r, s, !0));\n        }));\n    else {\n      if ('^' === u) return ((this._hasParentSelector = !0), { path: n.slice(0, -1), expr: l, isParentSelector: !0 });\n      if ('~' === u)\n        return (\n          (c = { path: Ma(n, u), value: i, parent: r, parentProperty: null }),\n          this._handleCallback(c, s, 'property'),\n          c\n        );\n      if ('$' === u) f(this._trace(l, t, n, null, null, s, a));\n      else if (/^(-?\\d*):(-?\\d*):?(\\d*)$/u.test(u)) f(this._slice(u, l, t, n, r, i, s));\n      else if (0 === u.indexOf('?(')) {\n        if (this.currPreventEval) throw new Error('Eval [?(expr)] prevented in JSONPath expression.');\n        const e = u.replace(/^\\?\\((.*?)\\)$/u, '$1');\n        this._walk(t, (a) => {\n          this._eval(e, t[a], a, n, r, i) && f(this._trace(l, t[a], Ma(n, a), t, a, s, !0));\n        });\n      } else if ('(' === u[0]) {\n        if (this.currPreventEval) throw new Error('Eval [(expr)] prevented in JSONPath expression.');\n        f(this._trace(Pa(this._eval(u, t, n[n.length - 1], n.slice(0, -1), r, i), l), t, n, r, i, s, a));\n      } else if ('@' === u[0]) {\n        let e = !1;\n        const a = u.slice(1, -2);\n        switch (a) {\n          case 'scalar':\n            (t && ['object', 'function'].includes(typeof t)) || (e = !0);\n            break;\n          case 'boolean':\n          case 'string':\n          case 'undefined':\n          case 'function':\n            typeof t === a && (e = !0);\n            break;\n          case 'integer':\n            !Number.isFinite(t) || t % 1 || (e = !0);\n            break;\n          case 'number':\n            Number.isFinite(t) && (e = !0);\n            break;\n          case 'nonFinite':\n            'number' != typeof t || Number.isFinite(t) || (e = !0);\n            break;\n          case 'object':\n            t && typeof t === a && (e = !0);\n            break;\n          case 'array':\n            Array.isArray(t) && (e = !0);\n            break;\n          case 'other':\n            e = this.currOtherTypeCallback(t, n, r, i);\n            break;\n          case 'null':\n            null === t && (e = !0);\n            break;\n          default:\n            throw new TypeError('Unknown value type ' + a);\n        }\n        if (e)\n          return ((c = { path: n, value: t, parent: r, parentProperty: i }), this._handleCallback(c, s, 'value'), c);\n      } else if ('`' === u[0] && t && xa.call(t, u.slice(1))) {\n        const e = u.slice(1);\n        f(this._trace(l, t[e], Ma(n, e), t, e, s, a, !0));\n      } else if (u.includes(',')) {\n        const e = u.split(',');\n        for (const a of e) f(this._trace(Pa(a, l), t, n, r, i, s, !0));\n      } else !o && t && xa.call(t, u) && f(this._trace(l, t[u], Ma(n, u), t, u, s, a, !0));\n    }\n    if (this._hasParentSelector)\n      for (let e = 0; e < h.length; e++) {\n        const n = h[e];\n        if (n && n.isParentSelector) {\n          const o = this._trace(n.expr, t, n.path, r, i, s, a);\n          if (Array.isArray(o)) {\n            h[e] = o[0];\n            const t = o.length;\n            for (let n = 1; n < t; n++) (e++, h.splice(e, 0, o[n]));\n          } else h[e] = o;\n        }\n      }\n    return h;\n  }),\n  (Fa.prototype._walk = function (e, t) {\n    if (Array.isArray(e)) {\n      var n = e.length;\n      for (let e = 0; e < n; e++) t(e);\n    } else\n      e &&\n        'object' == typeof e &&\n        Object.keys(e).forEach((e) => {\n          t(e);\n        });\n  }),\n  (Fa.prototype._slice = function (e, t, n, r, i, s, a) {\n    if (Array.isArray(n)) {\n      var o = n.length,\n        u = ((e = e.split(':'))[2] && Number.parseInt(e[2])) || 1,\n        l = (e[0] && Number.parseInt(e[0])) || 0,\n        h = (e[1] && Number.parseInt(e[1])) || o,\n        l = l < 0 ? Math.max(0, l + o) : Math.min(o, l),\n        h = h < 0 ? Math.max(0, h + o) : Math.min(o, h);\n      const f = [];\n      for (let e = l; e < h; e += u)\n        this._trace(Pa(e, t), n, r, i, s, a, !0).forEach((e) => {\n          f.push(e);\n        });\n      return f;\n    }\n  }),\n  (Fa.prototype._eval = function (e, t, n, r, i, s) {\n    if (\n      ((this.currSandbox._$_parentProperty = s),\n      (this.currSandbox._$_parent = i),\n      (this.currSandbox._$_property = n),\n      (this.currSandbox._$_root = this.json),\n      (this.currSandbox._$_v = t),\n      (s = e.includes('@path')) && (this.currSandbox._$_path = Fa.toPathString(r.concat([n]))),\n      !Fa.cache[(i = 'script:' + e)])\n    ) {\n      let t = e\n        .replace(/@parentProperty/gu, '_$_parentProperty')\n        .replace(/@parent/gu, '_$_parent')\n        .replace(/@property/gu, '_$_property')\n        .replace(/@root/gu, '_$_root')\n        .replace(/@([.\\s)[])/gu, '_$_v$1');\n      (s && (t = t.replace(/@path/gu, '_$_path')), (Fa.cache[i] = new this.vm.Script(t)));\n    }\n    try {\n      return Fa.cache[i].runInNewContext(this.currSandbox);\n    } catch (t) {\n      throw new Error('jsonPath: ' + t.message + ': ' + e);\n    }\n  }),\n  (Fa.cache = {}),\n  (Fa.toPathString = function (e) {\n    var t = e,\n      n = t.length;\n    let r = '$';\n    for (let e = 1; e < n; e++)\n      /^(~|\\^|@.*?\\(\\))$/u.test(t[e]) || (r += /^[0-9*]+$/u.test(t[e]) ? '[' + t[e] + ']' : \"['\" + t[e] + \"']\");\n    return r;\n  }),\n  (Fa.toPointer = function (e) {\n    var t = e,\n      n = t.length;\n    let r = '';\n    for (let e = 1; e < n; e++)\n      /^(~|\\^|@.*?\\(\\))$/u.test(t[e]) || (r += '/' + t[e].toString().replace(/~/gu, '~0').replace(/\\//gu, '~1'));\n    return r;\n  }),\n  (Fa.toPathArray = function (e) {\n    var t = Fa.cache;\n    if (!t[e]) {\n      const n = [],\n        r = e\n          .replace(\n            /@(?:null|boolean|number|string|integer|undefined|nonFinite|scalar|array|object|function|other)\\(\\)/gu,\n            ';$&;',\n          )\n          .replace(/[['](\\??\\(.*?\\))[\\]']/gu, function (e, t) {\n            return '[#' + (n.push(t) - 1) + ']';\n          })\n          .replace(/\\[['\"]([^'\\]]*)['\"]\\]/gu, function (e, t) {\n            return \"['\" + t.replace(/\\./gu, '%@%').replace(/~/gu, '%%@@%%') + \"']\";\n          })\n          .replace(/~/gu, ';~;')\n          .replace(/['\"]?\\.['\"]?(?![^[]*\\])|\\[['\"]?/gu, ';')\n          .replace(/%@%/gu, '.')\n          .replace(/%%@@%%/gu, '~')\n          .replace(/(?:;)?(\\^+)(?:;)?/gu, function (e, t) {\n            return ';' + t.split('').join(';') + ';';\n          })\n          .replace(/;;;|;;/gu, ';..;')\n          .replace(/;$|'?\\]|'$/gu, ''),\n        i = r.split(';').map(function (e) {\n          var t = e.match(/#(\\d+)/u);\n          return t && t[1] ? n[t[1]] : e;\n        });\n      t[e] = i;\n    }\n    return t[e].concat();\n  }),\n  (Fa.prototype.vm = Ra));\nvar Ua = Sr(function (e) {\n  var t = Array.prototype,\n    n = Object.prototype,\n    r = { '&': '&amp;', '\"': '&quot;', \"'\": '&#39;', '<': '&lt;', '>': '&gt;' },\n    i = /[&\"'<>]/g,\n    s = (e.exports = {});\n  function a(e, t) {\n    return n.hasOwnProperty.call(e, t);\n  }\n  function o(e) {\n    return r[e];\n  }\n  function c(e, t, n) {\n    var r, i, a, s, o;\n    return (\n      e instanceof Error && (e = (i = e).name + ': ' + i.message),\n      Object.setPrototypeOf\n        ? ((r = new Error(e)), Object.setPrototypeOf(r, c.prototype))\n        : ((r = this), Object.defineProperty(r, 'message', { enumerable: !1, writable: !0, value: e })),\n      Object.defineProperty(r, 'name', { value: 'Template render error' }),\n      Error.captureStackTrace && Error.captureStackTrace(r, this.constructor),\n      (s = i\n        ? ((a = Object.getOwnPropertyDescriptor(i, 'stack')) &&\n            (a.get ||\n              function () {\n                return a.value;\n              })) ||\n          function () {\n            return i.stack;\n          }\n        : ((o = new Error(e).stack),\n          function () {\n            return o;\n          })),\n      Object.defineProperty(r, 'stack', {\n        get: function () {\n          return s.call(r);\n        },\n      }),\n      Object.defineProperty(r, 'cause', { value: i }),\n      (r.lineno = t),\n      (r.colno = n),\n      (r.firstUpdate = !0),\n      (r.Update = function (e) {\n        return (\n          (e = '(' + (e || 'unknown path') + ')'),\n          this.firstUpdate &&\n            (this.lineno && this.colno\n              ? (e += ' [Line ' + this.lineno + ', Column ' + this.colno + ']')\n              : this.lineno && (e += ' [Line ' + this.lineno + ']')),\n          (e += '\\n '),\n          this.firstUpdate && (e += ' '),\n          (this.message = e + (this.message || '')),\n          (this.firstUpdate = !1),\n          this\n        );\n      }),\n      r\n    );\n  }\n  function u(e) {\n    return '[object Function]' === n.toString.call(e);\n  }\n  function l(e) {\n    return '[object Array]' === n.toString.call(e);\n  }\n  function h(e) {\n    return '[object String]' === n.toString.call(e);\n  }\n  function f(e) {\n    return '[object Object]' === n.toString.call(e);\n  }\n  function p(e) {\n    var t = (function (e) {\n      return e ? ('string' == typeof e ? e.split('.') : [e]) : [];\n    })(e);\n    return function (e) {\n      for (var n = e, r = 0; r < t.length; r++) {\n        var i = t[r];\n        if (!a(n, i)) return;\n        n = n[i];\n      }\n      return n;\n    };\n  }\n  function d(e) {\n    return Array.prototype.slice.call(e);\n  }\n  function m(e, t, n) {\n    return Array.prototype.indexOf.call(e || [], t, n);\n  }\n  function _(e) {\n    var n,\n      t = [];\n    for (n in e) a(e, n) && t.push(n);\n    return t;\n  }\n  ((s.hasOwnProp = a),\n    (s._prettifyError = function (e, t, n) {\n      return (\n        (n = n.Update ? n : new s.TemplateError(n)).Update(e),\n        t || ((e = n), ((n = new Error(e.message)).name = e.name)),\n        n\n      );\n    }),\n    Object.setPrototypeOf\n      ? Object.setPrototypeOf(c.prototype, Error.prototype)\n      : (c.prototype = Object.create(Error.prototype, { constructor: { value: c } })),\n    (s.TemplateError = c),\n    (s.escape = function (e) {\n      return e.replace(i, o);\n    }),\n    (s.isFunction = u),\n    (s.isArray = l),\n    (s.isString = h),\n    (s.isObject = f),\n    (s.getAttrGetter = p),\n    (s.groupBy = function (e, t, n) {\n      for (var r = {}, i = u(t) ? t : p(t), s = 0; s < e.length; s++) {\n        var a = e[s],\n          o = i(a, s);\n        if (void 0 === o && !0 === n) throw new TypeError('groupby: attribute \"' + t + '\" resolved to undefined');\n        (r[o] || (r[o] = [])).push(a);\n      }\n      return r;\n    }),\n    (s.toArray = d),\n    (s.without = function (e) {\n      var t = [];\n      if (e) for (var n = e.length, r = d(arguments).slice(1), i = -1; ++i < n; ) -1 === m(r, e[i]) && t.push(e[i]);\n      return t;\n    }),\n    (s.repeat = function (e, t) {\n      for (var n = '', r = 0; r < t; r++) n += e;\n      return n;\n    }),\n    (s.each = function (e, n, r) {\n      if (null != e)\n        if (t.forEach && e.forEach === t.forEach) e.forEach(n, r);\n        else if (e.length === +e.length) for (var i = 0, s = e.length; i < s; i++) n.call(r, e[i], i, e);\n    }),\n    (s.map = function (e, n) {\n      var r = [];\n      if (null != e) {\n        if (t.map && e.map === t.map) return e.map(n);\n        for (var i = 0; i < e.length; i++) r[r.length] = n(e[i], i);\n        e.length === +e.length && (r.length = e.length);\n      }\n      return r;\n    }),\n    (s.asyncIter = function (e, t, n) {\n      var r = -1;\n      !(function i() {\n        ++r < e.length ? t(e[r], r, i, n) : n();\n      })();\n    }),\n    (s.asyncFor = function (e, t, n) {\n      var r = _(e || {}),\n        i = r.length,\n        s = -1;\n      !(function a() {\n        var o = r[++s];\n        s < i ? t(o, e[o], s, i, a) : n();\n      })();\n    }),\n    (s.indexOf = m),\n    (s.keys = _),\n    (s._entries = function (e) {\n      return _(e).map(function (t) {\n        return [t, e[t]];\n      });\n    }),\n    (s._values = function (e) {\n      return _(e).map(function (t) {\n        return e[t];\n      });\n    }),\n    (s._assign = s.extend =\n      function (e, t) {\n        return (\n          (e = e || {}),\n          _(t).forEach(function (n) {\n            e[n] = t[n];\n          }),\n          e\n        );\n      }),\n    (s.inOperator = function (e, t) {\n      if (l(t) || h(t)) return -1 !== t.indexOf(e);\n      if (f(t)) return e in t;\n      throw new Error('Cannot use \"in\" operator to search for \"' + e + '\" in unexpected types.');\n    }));\n});\nfunction Ha() {\n  throw new Error('setTimeout has not been defined');\n}\nfunction Ga() {\n  throw new Error('clearTimeout has not been defined');\n}\nvar ja = Ha,\n  qa = Ga;\nfunction Ya(e) {\n  if (ja === setTimeout) return setTimeout(e, 0);\n  if ((ja === Ha || !ja) && setTimeout) return (ja = setTimeout)(e, 0);\n  try {\n    return ja(e, 0);\n  } catch (t) {\n    try {\n      return ja.call(null, e, 0);\n    } catch (t) {\n      return ja.call(this, e, 0);\n    }\n  }\n}\n('function' == typeof Sa.setTimeout && (ja = setTimeout), 'function' == typeof Sa.clearTimeout && (qa = clearTimeout));\nvar Ka,\n  Wa = [],\n  Va = !1,\n  $a = -1;\nfunction Qa() {\n  Va && Ka && ((Va = !1), Ka.length ? (Wa = Ka.concat(Wa)) : ($a = -1), Wa.length) && za();\n}\nfunction za() {\n  if (!Va) {\n    var e = Ya(Qa);\n    Va = !0;\n    for (var t = Wa.length; t; ) {\n      for (Ka = Wa, Wa = []; ++$a < t; ) Ka && Ka[$a].run();\n      (($a = -1), (t = Wa.length));\n    }\n    ((Ka = null),\n      (Va = !1),\n      (function (e) {\n        if (qa === clearTimeout) return clearTimeout(e);\n        if ((qa === Ga || !qa) && clearTimeout) return (qa = clearTimeout)(e);\n        try {\n          qa(e);\n        } catch (t) {\n          try {\n            return qa.call(null, e);\n          } catch (t) {\n            return qa.call(this, e);\n          }\n        }\n      })(e));\n  }\n}\nfunction Xa(e, t) {\n  ((this.fun = e), (this.array = t));\n}\nfunction Za() {}\nXa.prototype.run = function () {\n  this.fun.apply(null, this.array);\n};\nvar Ja = Za,\n  eo = Za,\n  to = Za,\n  no = Za,\n  ro = Za,\n  io = Za,\n  so = Za,\n  ao = Sa.performance || {},\n  oo =\n    ao.now ||\n    ao.mozNow ||\n    ao.msNow ||\n    ao.oNow ||\n    ao.webkitNow ||\n    function () {\n      return new Date().getTime();\n    },\n  co = new Date(),\n  uo = {\n    nextTick: function (e) {\n      var t = new Array(arguments.length - 1);\n      if (1 < arguments.length) for (var n = 1; n < arguments.length; n++) t[n - 1] = arguments[n];\n      (Wa.push(new Xa(e, t)), 1 !== Wa.length || Va || Ya(za));\n    },\n    title: 'browser',\n    browser: !0,\n    env: {},\n    argv: [],\n    version: '',\n    versions: {},\n    on: Ja,\n    addListener: eo,\n    once: to,\n    off: no,\n    removeListener: ro,\n    removeAllListeners: io,\n    emit: so,\n    binding: function (e) {\n      throw new Error('process.binding is not supported');\n    },\n    cwd: function () {\n      return '/';\n    },\n    chdir: function (e) {\n      throw new Error('process.chdir is not supported');\n    },\n    umask: function () {\n      return 0;\n    },\n    hrtime: function (e) {\n      var t = 0.001 * oo.call(ao),\n        n = Math.floor(t),\n        t = Math.floor((t % 1) * 1e9);\n      return (e && ((n -= e[0]), (t -= e[1]) < 0) && (n--, (t += 1e9)), [n, t]);\n    },\n    platform: 'browser',\n    release: {},\n    config: {},\n    uptime: function () {\n      return (new Date() - co) / 1e3;\n    },\n  };\nfunction lo() {}\nfunction ho() {\n  ho.init.call(this);\n}\nfunction fo(e) {\n  return void 0 === e._maxListeners ? ho.defaultMaxListeners : e._maxListeners;\n}\nfunction po(e, t, n, r) {\n  var s, a;\n  if ('function' != typeof n) throw new TypeError('\"listener\" argument must be a function');\n  return (\n    (s = e._events)\n      ? (s.newListener && (e.emit('newListener', t, n.listener || n), (s = e._events)), (a = s[t]))\n      : ((s = e._events = new lo()), (e._eventsCount = 0)),\n    a\n      ? ('function' == typeof a ? (a = s[t] = r ? [n, a] : [a, n]) : r ? a.unshift(n) : a.push(n),\n        !a.warned &&\n          (r = fo(e)) &&\n          0 < r &&\n          a.length > r &&\n          ((a.warned = !0),\n          ((r = new Error(\n            'Possible EventEmitter memory leak detected. ' +\n              a.length +\n              ' ' +\n              t +\n              ' listeners added. Use emitter.setMaxListeners() to increase limit',\n          )).name = 'MaxListenersExceededWarning'),\n          (r.emitter = e),\n          (r.type = t),\n          (r.count = a.length),\n          (function (e) {\n            'function' == typeof console.warn ? console.warn(e) : console.log(e);\n          })(r)))\n      : ((a = s[t] = n), ++e._eventsCount),\n    e\n  );\n}\nfunction mo(e, t, n) {\n  var r = !1;\n  function i() {\n    (e.removeListener(t, i), r || ((r = !0), n.apply(e, arguments)));\n  }\n  return ((i.listener = n), i);\n}\nfunction _o(e) {\n  var t = this._events;\n  if (t) {\n    if ('function' == typeof (t = t[e])) return 1;\n    if (t) return t.length;\n  }\n  return 0;\n}\nfunction Eo(e, t) {\n  for (var n = new Array(t); t--; ) n[t] = e[t];\n  return n;\n}\nfunction To() {\n  var e;\n  (ho.call(this),\n    (this.__emitError =\n      ((e = this),\n      function (t) {\n        e.emit('error', t);\n      })));\n}\nfunction Ao() {\n  return new To();\n}\n((lo.prototype = Object.create(null)),\n  ((ho.EventEmitter = ho).usingDomains = !1),\n  (ho.prototype.domain = void 0),\n  (ho.prototype._events = void 0),\n  (ho.prototype._maxListeners = void 0),\n  (ho.defaultMaxListeners = 10),\n  (ho.init = function () {\n    ((this.domain = null),\n      ho.usingDomains && (void 0).active,\n      (this._events && this._events !== Object.getPrototypeOf(this)._events) ||\n        ((this._events = new lo()), (this._eventsCount = 0)),\n      (this._maxListeners = this._maxListeners || void 0));\n  }),\n  (ho.prototype.setMaxListeners = function (e) {\n    if ('number' != typeof e || e < 0 || isNaN(e)) throw new TypeError('\"n\" argument must be a positive number');\n    return ((this._maxListeners = e), this);\n  }),\n  (ho.prototype.getMaxListeners = function () {\n    return fo(this);\n  }),\n  (ho.prototype.emit = function (e) {\n    var n,\n      r,\n      i,\n      s,\n      a,\n      c = 'error' === e;\n    if ((a = this._events)) c = c && null == a.error;\n    else if (!c) return !1;\n    if (((o = this.domain), c)) {\n      if (((c = arguments[1]), o))\n        return (\n          ((c = c || new Error('Uncaught, unspecified \"error\" event')).domainEmitter = this),\n          (c.domain = o),\n          (c.domainThrown = !1),\n          o.emit('error', c),\n          !1\n        );\n      if (c instanceof Error) throw c;\n      var o = new Error('Uncaught, unspecified \"error\" event. (' + c + ')');\n      throw ((o.context = c), o);\n    }\n    if (!(n = a[e])) return !1;\n    var l = 'function' == typeof n;\n    switch ((r = arguments.length)) {\n      case 1:\n        !(function (e, n) {\n          if (l) e.call(n);\n          else for (var r = e.length, i = Eo(e, r), s = 0; s < r; ++s) i[s].call(n);\n        })(n, this);\n        break;\n      case 2:\n        !(function (e, t, n, r) {\n          if (t) e.call(n, r);\n          else for (var i = e.length, s = Eo(e, i), a = 0; a < i; ++a) s[a].call(n, r);\n        })(n, l, this, arguments[1]);\n        break;\n      case 3:\n        !(function (e, t, n, r, i) {\n          if (t) e.call(n, r, i);\n          else for (var s = e.length, a = Eo(e, s), o = 0; o < s; ++o) a[o].call(n, r, i);\n        })(n, l, this, arguments[1], arguments[2]);\n        break;\n      case 4:\n        !(function (e, t, n, r, i, s) {\n          if (t) e.call(n, r, i, s);\n          else for (var a = e.length, o = Eo(e, a), c = 0; c < a; ++c) o[c].call(n, r, i, s);\n        })(n, l, this, arguments[1], arguments[2], arguments[3]);\n        break;\n      default:\n        for (i = new Array(r - 1), s = 1; s < r; s++) i[s - 1] = arguments[s];\n        !(function (e, n, r) {\n          if (l) e.apply(n, r);\n          else for (var i = e.length, s = Eo(e, i), a = 0; a < i; ++a) s[a].apply(n, r);\n        })(n, this, i);\n    }\n    return !0;\n  }),\n  (ho.prototype.addListener = function (e, t) {\n    return po(this, e, t, !1);\n  }),\n  (ho.prototype.on = ho.prototype.addListener),\n  (ho.prototype.prependListener = function (e, t) {\n    return po(this, e, t, !0);\n  }),\n  (ho.prototype.once = function (e, t) {\n    if ('function' != typeof t) throw new TypeError('\"listener\" argument must be a function');\n    return (this.on(e, mo(this, e, t)), this);\n  }),\n  (ho.prototype.prependOnceListener = function (e, t) {\n    if ('function' != typeof t) throw new TypeError('\"listener\" argument must be a function');\n    return (this.prependListener(e, mo(this, e, t)), this);\n  }),\n  (ho.prototype.removeListener = function (e, t) {\n    var n, r, i, s, a;\n    if ('function' != typeof t) throw new TypeError('\"listener\" argument must be a function');\n    if ((r = this._events) && (n = r[e]))\n      if (n === t || (n.listener && n.listener === t))\n        0 == --this._eventsCount\n          ? (this._events = new lo())\n          : (delete r[e], r.removeListener && this.emit('removeListener', e, n.listener || t));\n      else if ('function' != typeof n) {\n        for (i = -1, s = n.length; 0 < s--; )\n          if (n[s] === t || (n[s].listener && n[s].listener === t)) {\n            ((a = n[s].listener), (i = s));\n            break;\n          }\n        if (i < 0) return this;\n        if (1 === n.length) {\n          if (((n[0] = void 0), 0 == --this._eventsCount)) return ((this._events = new lo()), this);\n          delete r[e];\n        } else\n          !(function (e, t) {\n            for (var n = t, r = n + 1, i = e.length; r < i; n += 1, r += 1) e[n] = e[r];\n            e.pop();\n          })(n, i);\n        r.removeListener && this.emit('removeListener', e, a || t);\n      }\n    return this;\n  }),\n  (ho.prototype.removeAllListeners = function (e) {\n    var t, n;\n    if ((n = this._events))\n      if (n.removeListener) {\n        if (0 === arguments.length) {\n          for (var r, i = Object.keys(n), s = 0; s < i.length; ++s)\n            'removeListener' !== (r = i[s]) && this.removeAllListeners(r);\n          (this.removeAllListeners('removeListener'), (this._events = new lo()), (this._eventsCount = 0));\n        } else if ('function' == typeof (t = n[e])) this.removeListener(e, t);\n        else if (t) for (; this.removeListener(e, t[t.length - 1]), t[0]; );\n      } else\n        0 === arguments.length\n          ? ((this._events = new lo()), (this._eventsCount = 0))\n          : n[e] && (0 == --this._eventsCount ? (this._events = new lo()) : delete n[e]);\n    return this;\n  }),\n  (ho.prototype.listeners = function (e) {\n    var n = this._events;\n    return (n = n && n[e])\n      ? 'function' == typeof n\n        ? [n.listener || n]\n        : (function (e) {\n            for (var t = new Array(e.length), n = 0; n < t.length; ++n) t[n] = e[n].listener || e[n];\n            return t;\n          })(n)\n      : [];\n  }),\n  (ho.listenerCount = function (e, t) {\n    return 'function' == typeof e.listenerCount ? e.listenerCount(t) : _o.call(e, t);\n  }),\n  (ho.prototype.listenerCount = _o),\n  (ho.prototype.eventNames = function () {\n    return 0 < this._eventsCount ? Reflect.ownKeys(this._events) : [];\n  }),\n  ('function' == typeof Object.create\n    ? function (e, t) {\n        ((e.super_ = t),\n          (e.prototype = Object.create(t.prototype, {\n            constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 },\n          })));\n      }\n    : function (e, t) {\n        function n() {}\n        ((e.super_ = t), (n.prototype = t.prototype), (e.prototype = new n()), (e.prototype.constructor = e));\n      })(To, ho),\n  (To.prototype.add = function (e) {\n    e.on('error', this.__emitError);\n  }),\n  (To.prototype.remove = function (e) {\n    e.removeListener('error', this.__emitError);\n  }),\n  (To.prototype.bind = function (e) {\n    var t = this.__emitError;\n    return function () {\n      var n = Array.prototype.slice.call(arguments);\n      try {\n        e.apply(null, n);\n      } catch (e) {\n        t(e);\n      }\n    };\n  }),\n  (To.prototype.intercept = function (e) {\n    var t = this.__emitError;\n    return function (n) {\n      if (n) t(n);\n      else {\n        var r = Array.prototype.slice.call(arguments, 1);\n        try {\n          e.apply(null, r);\n        } catch (n) {\n          t(n);\n        }\n      }\n    };\n  }),\n  (To.prototype.run = function (e) {\n    var t = this.__emitError;\n    try {\n      e();\n    } catch (e) {\n      t(e);\n    }\n    return this;\n  }),\n  (To.prototype.dispose = function () {\n    return (this.removeAllListeners(), this);\n  }),\n  (To.prototype.enter = To.prototype.exit =\n    function () {\n      return this;\n    }));\nvar go,\n  vo = { Domain: To, createDomain: Ao, create: Ao },\n  yo = 'function' == typeof setImmediate,\n  So = Co;\nfunction Co(e) {\n  (No.length || (Lo(), (bo = !0)), (No[No.length] = e));\n}\nvar No = [],\n  bo = !1,\n  Io = 0,\n  Oo = 1024;\nfunction ko() {\n  for (; Io < No.length; ) {\n    var e = Io;\n    if (((Io += 1), No[e].call(), Oo < Io)) {\n      for (var t = 0, n = No.length - Io; t < n; t++) No[t] = No[t + Io];\n      ((No.length -= Io), (Io = 0));\n    }\n  }\n  ((No.length = 0), (Io = 0), (bo = !1));\n}\nfunction Lo() {\n  var e = uo.domain;\n  (e && ((go = go || vo).active = uo.domain = null),\n    bo && yo ? setImmediate(ko) : uo.nextTick(ko),\n    e && (go.active = uo.domain = e));\n}\nCo.requestFlush = Lo;\nvar Do = [],\n  Ro = function (e) {\n    var t = Do.length ? Do.pop() : new wo();\n    ((t.task = e), (t.domain = uo.domain), So(t));\n  };\nfunction wo() {\n  ((this.task = null), (this.domain = null));\n}\nwo.prototype.call = function () {\n  this.domain && this.domain.enter();\n  var e = !0;\n  try {\n    (this.task.call(), (e = !1), this.domain && this.domain.exit());\n  } finally {\n    (e && So.requestFlush(), (this.task = null), (this.domain = null), Do.push(this));\n  }\n};\nvar xo = Sr(function (e) {\n    function n() {\n      var e = Array.prototype.slice.call(arguments);\n      'function' == typeof e[0] && e[0].apply(null, e.splice(1));\n    }\n    function r(e) {\n      'function' == typeof setImmediate\n        ? setImmediate(e)\n        : void 0 !== uo && uo.nextTick\n          ? uo.nextTick(e)\n          : setTimeout(e, 0);\n    }\n    function s(e, t, s) {\n      var c,\n        a = s ? r : n;\n      return (\n        (t = t || function () {}),\n        i(e)\n          ? e.length\n            ? void (c = function (e) {\n                return function (n) {\n                  var r, i;\n                  n\n                    ? (t.apply(null, arguments), (t = function () {}))\n                    : ((r = Array.prototype.slice.call(arguments, 1)),\n                      (i = e.next()) ? r.push(c(i)) : r.push(t),\n                      a(function () {\n                        e.apply(null, r);\n                      }));\n                };\n              })(\n                (function (e) {\n                  var t = function (n) {\n                    function r() {\n                      return (e.length && e[n].apply(null, arguments), r.next());\n                    }\n                    return (\n                      (r.next = function () {\n                        return n < e.length - 1 ? t(n + 1) : null;\n                      }),\n                      r\n                    );\n                  };\n                  return t(0);\n                })(e),\n              )()\n            : t()\n          : ((s = new Error('First argument to waterfall must be an array of functions')), t(s))\n      );\n    }\n    var t = gr,\n      i =\n        Array.isArray ||\n        function (e) {\n          return '[object Array]' === Object.prototype.toString.call(e);\n        };\n    e.exports ? (e.exports = s) : (t.waterfall = s);\n  }),\n  Mo = ' \\n\\t\\r ',\n  Po = '()[]{}%*-+~/#,:|.<>=!',\n  Bo = 'string',\n  Fo = 'whitespace',\n  Uo = 'data',\n  Ho = 'block-start',\n  Go = 'block-end',\n  jo = 'variable-start',\n  qo = 'variable-end',\n  Yo = 'comment',\n  Ko = 'left-paren',\n  Wo = 'right-paren',\n  Vo = 'left-bracket',\n  $o = 'right-bracket',\n  Qo = 'left-curly',\n  zo = 'right-curly',\n  Xo = 'operator',\n  Zo = 'comma',\n  Jo = 'colon',\n  ec = 'tilde',\n  tc = 'pipe',\n  nc = 'float',\n  rc = 'boolean',\n  ic = 'none',\n  sc = 'symbol',\n  ac = 'regex';\nfunction oc(e, t, n, r) {\n  return { type: e, value: t, lineno: n, colno: r };\n}\nvar cc = (function () {\n    function e(e, t) {\n      ((this.str = e),\n        (this.index = 0),\n        (this.len = e.length),\n        (this.lineno = 0),\n        (this.colno = 0),\n        (this.in_code = !1),\n        (e = (t = t || {}).tags || {}),\n        (this.tags = {\n          BLOCK_START: e.blockStart || '{%',\n          BLOCK_END: e.blockEnd || '%}',\n          VARIABLE_START: e.variableStart || '{{',\n          VARIABLE_END: e.variableEnd || '}}',\n          COMMENT_START: e.commentStart || '{#',\n          COMMENT_END: e.commentEnd || '#}',\n        }),\n        (this.trimBlocks = !!t.trimBlocks),\n        (this.lstripBlocks = !!t.lstripBlocks));\n    }\n    var t = e.prototype;\n    return (\n      (t.nextToken = function () {\n        var t = this.lineno,\n          n = this.colno;\n        if (this.in_code) {\n          var r = this.current();\n          if (this.isFinished()) return null;\n          if ('\"' === r || \"'\" === r) return oc(Bo, this._parseString(r), t, n);\n          if ((e = this._extract(Mo))) return oc(Fo, e, t, n);\n          if ((e = (e = this._extractString(this.tags.BLOCK_END)) || this._extractString('-' + this.tags.BLOCK_END)))\n            return (\n              (this.in_code = !1),\n              this.trimBlocks &&\n                ('\\n' === (r = this.current())\n                  ? this.forward()\n                  : '\\r' === r && (this.forward(), '\\n' === (r = this.current()) ? this.forward() : this.back())),\n              oc(Go, e, t, n)\n            );\n          if (\n            (e = (e = this._extractString(this.tags.VARIABLE_END)) || this._extractString('-' + this.tags.VARIABLE_END))\n          )\n            return ((this.in_code = !1), oc(qo, e, t, n));\n          if ('r' === r && '/' === this.str.charAt(this.index + 1)) {\n            this.forwardN(2);\n            for (var i = ''; !this.isFinished(); ) {\n              if ('/' === this.current() && '\\\\' !== this.previous()) {\n                this.forward();\n                break;\n              }\n              ((i += this.current()), this.forward());\n            }\n            for (var s = ['g', 'i', 'm', 'y'], a = ''; !this.isFinished() && -1 !== s.indexOf(this.current()); )\n              ((a += this.current()), this.forward());\n            return oc(ac, { body: i, flags: a }, t, n);\n          }\n          if (-1 !== Po.indexOf(r)) {\n            this.forward();\n            var o,\n              c = ['==', '===', '!=', '!==', '<=', '>=', '//', '**'],\n              u = r + this.current();\n            switch (\n              (-1 !== Ua.indexOf(c, u) &&\n                (this.forward(), -1 !== Ua.indexOf(c, (r = u) + this.current())) &&\n                ((r = u + this.current()), this.forward()),\n              r)\n            ) {\n              case '(':\n                o = Ko;\n                break;\n              case ')':\n                o = Wo;\n                break;\n              case '[':\n                o = Vo;\n                break;\n              case ']':\n                o = $o;\n                break;\n              case '{':\n                o = Qo;\n                break;\n              case '}':\n                o = zo;\n                break;\n              case ',':\n                o = Zo;\n                break;\n              case ':':\n                o = Jo;\n                break;\n              case '~':\n                o = ec;\n                break;\n              case '|':\n                o = tc;\n                break;\n              default:\n                o = Xo;\n            }\n            return oc(o, r, t, n);\n          }\n          if ((e = this._extractUntil(Mo + Po)).match(/^[-+]?[0-9]+$/))\n            return '.' === this.current()\n              ? (this.forward(), (c = this._extract('0123456789')), oc(nc, e + '.' + c, t, n))\n              : oc('int', e, t, n);\n          if (e.match(/^(true|false)$/)) return oc(rc, e, t, n);\n          if ('none' === e) return oc(ic, e, t, n);\n          if ('null' === e) return oc(ic, e, t, n);\n          if (e) return oc(sc, e, t, n);\n          throw new Error('Unexpected value while parsing: ' + e);\n        }\n        var h,\n          f =\n            this.tags.BLOCK_START.charAt(0) +\n            this.tags.VARIABLE_START.charAt(0) +\n            this.tags.COMMENT_START.charAt(0) +\n            this.tags.COMMENT_END.charAt(0);\n        if (this.isFinished()) return null;\n        if ((e = (e = this._extractString(this.tags.BLOCK_START + '-')) || this._extractString(this.tags.BLOCK_START)))\n          return ((this.in_code = !0), oc(Ho, e, t, n));\n        if (\n          (e =\n            (e = this._extractString(this.tags.VARIABLE_START + '-')) || this._extractString(this.tags.VARIABLE_START))\n        )\n          return ((this.in_code = !0), oc(jo, e, t, n));\n        var e = '',\n          p = !1;\n        for (\n          this._matches(this.tags.COMMENT_START) && ((p = !0), (e = this._extractString(this.tags.COMMENT_START)));\n          null !== (h = this._extractUntil(f));\n        ) {\n          if (\n            ((e += h),\n            (this._matches(this.tags.BLOCK_START) ||\n              this._matches(this.tags.VARIABLE_START) ||\n              this._matches(this.tags.COMMENT_START)) &&\n              !p)\n          ) {\n            if (this.lstripBlocks && this._matches(this.tags.BLOCK_START) && 0 < this.colno && this.colno <= e.length) {\n              var d = e.slice(-this.colno);\n              if (/^\\s+$/.test(d) && !(e = e.slice(0, -this.colno)).length) return this.nextToken();\n            }\n            break;\n          }\n          if (this._matches(this.tags.COMMENT_END)) {\n            if (!p) throw new Error('unexpected end of comment');\n            e += this._extractString(this.tags.COMMENT_END);\n            break;\n          }\n          ((e += this.current()), this.forward());\n        }\n        if (null === h && p) throw new Error('expected end of comment, got end of file');\n        return oc(p ? Yo : Uo, e, t, n);\n      }),\n      (t._parseString = function (e) {\n        this.forward();\n        for (var t = ''; !this.isFinished() && this.current() !== e; ) {\n          var n = this.current();\n          if ('\\\\' === n)\n            switch ((this.forward(), this.current())) {\n              case 'n':\n                t += '\\n';\n                break;\n              case 't':\n                t += '\\t';\n                break;\n              case 'r':\n                t += '\\r';\n                break;\n              default:\n                t += this.current();\n            }\n          else t += n;\n          this.forward();\n        }\n        return (this.forward(), t);\n      }),\n      (t._matches = function (e) {\n        return this.index + e.length > this.len ? null : this.str.slice(this.index, this.index + e.length) === e;\n      }),\n      (t._extractString = function (e) {\n        return this._matches(e) ? (this.forwardN(e.length), e) : null;\n      }),\n      (t._extractUntil = function (e) {\n        return this._extractMatching(!0, e || '');\n      }),\n      (t._extract = function (e) {\n        return this._extractMatching(!1, e);\n      }),\n      (t._extractMatching = function (e, t) {\n        if (this.isFinished()) return null;\n        var n = t.indexOf(this.current());\n        if ((e && -1 === n) || (!e && -1 !== n)) {\n          var r = this.current();\n          this.forward();\n          for (var i = t.indexOf(this.current()); ((e && -1 === i) || (!e && -1 !== i)) && !this.isFinished(); )\n            ((r += this.current()), this.forward(), (i = t.indexOf(this.current())));\n          return r;\n        }\n        return '';\n      }),\n      (t._extractRegex = function (e) {\n        return (e = this.currentStr().match(e)) ? (this.forwardN(e[0].length), e) : null;\n      }),\n      (t.isFinished = function () {\n        return this.index >= this.len;\n      }),\n      (t.forwardN = function (e) {\n        for (var t = 0; t < e; t++) this.forward();\n      }),\n      (t.forward = function () {\n        (this.index++, '\\n' === this.previous() ? (this.lineno++, (this.colno = 0)) : this.colno++);\n      }),\n      (t.backN = function (e) {\n        for (var t = 0; t < e; t++) this.back();\n      }),\n      (t.back = function () {\n        var e;\n        (this.index--,\n          '\\n' === this.current()\n            ? (this.lineno--,\n              (e = this.src.lastIndexOf('\\n', this.index - 1)),\n              (this.colno = -1 === e ? this.index : this.index - e))\n            : this.colno--);\n      }),\n      (t.current = function () {\n        return this.isFinished() ? '' : this.str.charAt(this.index);\n      }),\n      (t.currentStr = function () {\n        return this.isFinished() ? '' : this.str.substr(this.index);\n      }),\n      (t.previous = function () {\n        return this.str.charAt(this.index - 1);\n      }),\n      e\n    );\n  })(),\n  uc = {\n    lex: function (e, t) {\n      return new cc(e, t);\n    },\n    TOKEN_STRING: Bo,\n    TOKEN_WHITESPACE: Fo,\n    TOKEN_DATA: Uo,\n    TOKEN_BLOCK_START: Ho,\n    TOKEN_BLOCK_END: Go,\n    TOKEN_VARIABLE_START: jo,\n    TOKEN_VARIABLE_END: qo,\n    TOKEN_COMMENT: Yo,\n    TOKEN_LEFT_PAREN: Ko,\n    TOKEN_RIGHT_PAREN: Wo,\n    TOKEN_LEFT_BRACKET: Vo,\n    TOKEN_RIGHT_BRACKET: $o,\n    TOKEN_LEFT_CURLY: Qo,\n    TOKEN_RIGHT_CURLY: zo,\n    TOKEN_OPERATOR: Xo,\n    TOKEN_COMMA: Zo,\n    TOKEN_COLON: Jo,\n    TOKEN_TILDE: ec,\n    TOKEN_PIPE: tc,\n    TOKEN_INT: 'int',\n    TOKEN_FLOAT: nc,\n    TOKEN_BOOLEAN: rc,\n    TOKEN_NONE: ic,\n    TOKEN_SYMBOL: sc,\n    TOKEN_SPECIAL: 'special',\n    TOKEN_REGEX: ac,\n  };\nfunction lc(e, t) {\n  for (var s, n = 0; n < t.length; n++) {\n    var r = t[n];\n    ((r.enumerable = r.enumerable || !1),\n      (r.configurable = !0),\n      'value' in r && (r.writable = !0),\n      Object.defineProperty(\n        e,\n        'symbol' ==\n          typeof (s = (function (e) {\n            if ('object' != typeof e || null === e) return e;\n            var n = e[Symbol.toPrimitive];\n            if (void 0 === n) return String(e);\n            if ('object' != typeof (n = n.call(e, 'string'))) return n;\n            throw new TypeError('@@toPrimitive must return a primitive value.');\n          })(r.key))\n          ? s\n          : String(s),\n        r,\n      ));\n  }\n}\nfunction hc(e, t, n) {\n  return (t && lc(e.prototype, t), n && lc(e, n), Object.defineProperty(e, 'prototype', { writable: !1 }), e);\n}\nfunction fc(e, t) {\n  ((e.prototype = Object.create(t.prototype)), pc((e.prototype.constructor = e), t));\n}\nfunction pc(e, t) {\n  return (pc = Object.setPrototypeOf\n    ? Object.setPrototypeOf.bind()\n    : function (e, t) {\n        return ((e.__proto__ = t), e);\n      })(e, t);\n}\nfunction dc(e, t, n) {\n  ((n = n || {}),\n    Ua.keys(n).forEach(function (t) {\n      n[t] = (function (e, t) {\n        return 'function' != typeof e || 'function' != typeof t\n          ? t\n          : function () {\n              var n = this.parent,\n                r = ((this.parent = e), t.apply(this, arguments));\n              return ((this.parent = n), r);\n            };\n      })(e.prototype[t], n[t]);\n    }));\n  var r = (function (e) {\n    function n() {\n      return e.apply(this, arguments) || this;\n    }\n    return (\n      fc(n, e),\n      hc(n, [\n        {\n          key: 'typename',\n          get: function () {\n            return t;\n          },\n        },\n      ]),\n      n\n    );\n  })(e);\n  return (Ua._assign(r.prototype, n), r);\n}\nvar mc = (function () {\n    function e() {\n      this.init.apply(this, arguments);\n    }\n    return (\n      (e.prototype.init = function () {}),\n      (e.extend = function (e, t) {\n        return ('object' == typeof e && ((t = e), (e = 'anonymous')), dc(this, e, t));\n      }),\n      hc(e, [\n        {\n          key: 'typename',\n          get: function () {\n            return this.constructor.name;\n          },\n        },\n      ]),\n      e\n    );\n  })(),\n  _c = (function (e) {\n    function t() {\n      var n;\n      return ((n = e.call(this) || this).init.apply(n, arguments), n);\n    }\n    return (\n      fc(t, e),\n      (t.prototype.init = function () {}),\n      (t.extend = function (e, t) {\n        return ('object' == typeof e && ((t = e), (e = 'anonymous')), dc(this, e, t));\n      }),\n      hc(t, [\n        {\n          key: 'typename',\n          get: function () {\n            return this.constructor.name;\n          },\n        },\n      ]),\n      t\n    );\n  })(ho),\n  Ec = { Obj: mc, EmitterObj: _c };\nfunction Tc(e, t) {\n  for (var s, n = 0; n < t.length; n++) {\n    var r = t[n];\n    ((r.enumerable = r.enumerable || !1),\n      (r.configurable = !0),\n      'value' in r && (r.writable = !0),\n      Object.defineProperty(\n        e,\n        'symbol' ==\n          typeof (s = (function (e) {\n            if ('object' != typeof e || null === e) return e;\n            var n = e[Symbol.toPrimitive];\n            if (void 0 === n) return String(e);\n            if ('object' != typeof (n = n.call(e, 'string'))) return n;\n            throw new TypeError('@@toPrimitive must return a primitive value.');\n          })(r.key))\n          ? s\n          : String(s),\n        r,\n      ));\n  }\n}\nfunction Ac(e, t, n) {\n  return (t && Tc(e.prototype, t), n && Tc(e, n), Object.defineProperty(e, 'prototype', { writable: !1 }), e);\n}\nfunction gc(e, t) {\n  ((e.prototype = Object.create(t.prototype)), vc((e.prototype.constructor = e), t));\n}\nfunction vc(e, t) {\n  return (vc = Object.setPrototypeOf\n    ? Object.setPrototypeOf.bind()\n    : function (e, t) {\n        return ((e.__proto__ = t), e);\n      })(e, t);\n}\nfunction yc(e, t, n) {\n  (e instanceof t && n.push(e), e instanceof Sc && e.findAll(t, n));\n}\nvar Sc = (function (e) {\n    function t() {\n      return e.apply(this, arguments) || this;\n    }\n    gc(t, e);\n    var n = t.prototype;\n    return (\n      (n.init = function (e, t) {\n        for (var n = arguments, r = this, i = arguments.length, s = new Array(2 < i ? i - 2 : 0), a = 2; a < i; a++)\n          s[a - 2] = arguments[a];\n        ((this.lineno = e),\n          (this.colno = t),\n          this.fields.forEach(function (e, t) {\n            r[e] = t = void 0 === (t = n[t + 2]) ? null : t;\n          }));\n      }),\n      (n.findAll = function (e, t) {\n        var n = this;\n        return (\n          (t = t || []),\n          this instanceof Nc\n            ? this.children.forEach(function (n) {\n                return yc(n, e, t);\n              })\n            : this.fields.forEach(function (r) {\n                return yc(n[r], e, t);\n              }),\n          t\n        );\n      }),\n      (n.iterFields = function (e) {\n        var t = this;\n        this.fields.forEach(function (n) {\n          e(t[n], n);\n        });\n      }),\n      t\n    );\n  })(Ec.Obj),\n  Cc = (function (e) {\n    function t() {\n      return e.apply(this, arguments) || this;\n    }\n    return (\n      gc(t, e),\n      Ac(t, [\n        {\n          key: 'typename',\n          get: function () {\n            return 'Value';\n          },\n        },\n        {\n          key: 'fields',\n          get: function () {\n            return ['value'];\n          },\n        },\n      ]),\n      t\n    );\n  })(Sc),\n  Nc = (function (e) {\n    function t() {\n      return e.apply(this, arguments) || this;\n    }\n    gc(t, e);\n    var n = t.prototype;\n    return (\n      (n.init = function (t, n, r) {\n        e.prototype.init.call(this, t, n, r || []);\n      }),\n      (n.addChild = function (e) {\n        this.children.push(e);\n      }),\n      Ac(t, [\n        {\n          key: 'typename',\n          get: function () {\n            return 'NodeList';\n          },\n        },\n        {\n          key: 'fields',\n          get: function () {\n            return ['children'];\n          },\n        },\n      ]),\n      t\n    );\n  })(Sc),\n  bc = Nc.extend('Root'),\n  Ic = Cc.extend('Literal'),\n  Oc = Cc.extend('Symbol'),\n  kc = Nc.extend('Group'),\n  Lc = Nc.extend('Array'),\n  Dc = Sc.extend('Pair', { fields: ['key', 'value'] }),\n  Rc = Nc.extend('Dict'),\n  wc = Sc.extend('LookupVal', { fields: ['target', 'val'] }),\n  xc = Sc.extend('If', { fields: ['cond', 'body', 'else_'] }),\n  Mc = xc.extend('IfAsync'),\n  Pc = Sc.extend('InlineIf', { fields: ['cond', 'body', 'else_'] }),\n  Bc = Sc.extend('For', { fields: ['arr', 'name', 'body', 'else_'] }),\n  Fc = Bc.extend('AsyncEach'),\n  Uc = Bc.extend('AsyncAll'),\n  Hc = Sc.extend('Macro', { fields: ['name', 'args', 'body'] }),\n  Gc = Hc.extend('Caller'),\n  jc = Sc.extend('Import', { fields: ['template', 'target', 'withContext'] }),\n  qc = (function (e) {\n    function t() {\n      return e.apply(this, arguments) || this;\n    }\n    return (\n      gc(t, e),\n      (t.prototype.init = function (t, n, r, i, s) {\n        e.prototype.init.call(this, t, n, r, i || new Nc(), s);\n      }),\n      Ac(t, [\n        {\n          key: 'typename',\n          get: function () {\n            return 'FromImport';\n          },\n        },\n        {\n          key: 'fields',\n          get: function () {\n            return ['template', 'names', 'withContext'];\n          },\n        },\n      ]),\n      t\n    );\n  })(Sc),\n  Yc = Sc.extend('FunCall', { fields: ['name', 'args'] }),\n  Kc = Yc.extend('Filter'),\n  Wc = Kc.extend('FilterAsync', { fields: ['name', 'args', 'symbol'] }),\n  Vc = Rc.extend('KeywordArgs'),\n  $c = Sc.extend('Block', { fields: ['name', 'body'] }),\n  Qc = Sc.extend('Super', { fields: ['blockName', 'symbol'] }),\n  zc = Sc.extend('TemplateRef', { fields: ['template'] }).extend('Extends'),\n  Xc = Sc.extend('Include', { fields: ['template', 'ignoreMissing'] }),\n  Zc = Sc.extend('Set', { fields: ['targets', 'value'] }),\n  Jc = Sc.extend('Switch', { fields: ['expr', 'cases', 'default'] }),\n  eu = Sc.extend('Case', { fields: ['cond', 'body'] }),\n  tu = Nc.extend('Output'),\n  nu = Sc.extend('Capture', { fields: ['body'] }),\n  ru = Ic.extend('TemplateData'),\n  iu = Sc.extend('UnaryOp', { fields: ['target'] }),\n  su = Sc.extend('BinOp', { fields: ['left', 'right'] }),\n  au = su.extend('In'),\n  ou = su.extend('Is'),\n  cu = su.extend('Or'),\n  uu = su.extend('And'),\n  lu = iu.extend('Not'),\n  hu = su.extend('Add'),\n  fu = su.extend('Concat'),\n  pu = su.extend('Sub'),\n  du = su.extend('Mul'),\n  mu = su.extend('Div'),\n  _u = su.extend('FloorDiv'),\n  Eu = su.extend('Mod'),\n  Tu = su.extend('Pow'),\n  Au = iu.extend('Neg'),\n  gu = iu.extend('Pos'),\n  vu = Sc.extend('Compare', { fields: ['expr', 'ops'] }),\n  yu = Sc.extend('CompareOperand', { fields: ['expr', 'type'] }),\n  Su = Sc.extend('CallExtension', {\n    init: function (e, t, n, r) {\n      (this.parent(),\n        (this.extName = e.__name || e),\n        (this.prop = t),\n        (this.args = n || new Nc()),\n        (this.contentArgs = r || []),\n        (this.autoescape = e.autoescape));\n    },\n    fields: ['extName', 'prop', 'args', 'contentArgs'],\n  }),\n  Cu = Su.extend('CallExtensionAsync');\nfunction Nu(e, t, n) {\n  var r = e.split('\\n');\n  r.forEach(function (e, i) {\n    (e && ((n && 0 < i) || !n) && process.stdout.write(' '.repeat(t)),\n      (i = i === r.length - 1 ? '' : '\\n'),\n      process.stdout.write(e + i));\n  });\n}\nvar bu = {\n  Node: Sc,\n  Root: bc,\n  NodeList: Nc,\n  Value: Cc,\n  Literal: Ic,\n  Symbol: Oc,\n  Group: kc,\n  Array: Lc,\n  Pair: Dc,\n  Dict: Rc,\n  Output: tu,\n  Capture: nu,\n  TemplateData: ru,\n  If: xc,\n  IfAsync: Mc,\n  InlineIf: Pc,\n  For: Bc,\n  AsyncEach: Fc,\n  AsyncAll: Uc,\n  Macro: Hc,\n  Caller: Gc,\n  Import: jc,\n  FromImport: qc,\n  FunCall: Yc,\n  Filter: Kc,\n  FilterAsync: Wc,\n  KeywordArgs: Vc,\n  Block: $c,\n  Super: Qc,\n  Extends: zc,\n  Include: Xc,\n  Set: Zc,\n  Switch: Jc,\n  Case: eu,\n  LookupVal: wc,\n  BinOp: su,\n  In: au,\n  Is: ou,\n  Or: cu,\n  And: uu,\n  Not: lu,\n  Add: hu,\n  Concat: fu,\n  Sub: pu,\n  Mul: du,\n  Div: mu,\n  FloorDiv: _u,\n  Mod: Eu,\n  Pow: Tu,\n  Neg: Au,\n  Pos: gu,\n  Compare: vu,\n  CompareOperand: yu,\n  CallExtension: Su,\n  CallExtensionAsync: Cu,\n  printNodes: function e(t, n) {\n    var r, i;\n    ((n = n || 0),\n      Nu(t.typename + ': ', n),\n      t instanceof Nc\n        ? (Nu('\\n'),\n          t.children.forEach(function (t) {\n            e(t, n + 2);\n          }))\n        : t instanceof Su\n          ? (Nu(t.extName + '.' + t.prop + '\\n'),\n            t.args && e(t.args, n + 2),\n            t.contentArgs &&\n              t.contentArgs.forEach(function (t) {\n                e(t, n + 2);\n              }))\n          : ((r = []),\n            (i = null),\n            t.iterFields(function (e, t) {\n              e instanceof Sc ? r.push([t, e]) : ((i = i || {})[t] = e);\n            }),\n            i ? Nu(JSON.stringify(i, null, 2) + '\\n', null, !0) : Nu('\\n'),\n            r.forEach(function (t) {\n              var r = t[0],\n                t = t[1];\n              (Nu('[' + r + '] =>', n + 2), e(t, n + 4));\n            })));\n  },\n};\nfunction Iu(e, t) {\n  return (Iu = Object.setPrototypeOf\n    ? Object.setPrototypeOf.bind()\n    : function (e, t) {\n        return ((e.__proto__ = t), e);\n      })(e, t);\n}\n(bu.Node,\n  bu.Root,\n  bu.NodeList,\n  bu.Value,\n  bu.Literal,\n  bu.Group,\n  bu.Pair,\n  bu.Dict,\n  bu.Output,\n  bu.Capture,\n  bu.TemplateData,\n  bu.If,\n  bu.IfAsync,\n  bu.InlineIf,\n  bu.For,\n  bu.AsyncEach,\n  bu.AsyncAll,\n  bu.Macro,\n  bu.Caller,\n  bu.Import,\n  bu.FromImport,\n  bu.FunCall,\n  bu.Filter,\n  bu.FilterAsync,\n  bu.KeywordArgs,\n  bu.Block,\n  bu.Super,\n  bu.Extends,\n  bu.Include,\n  bu.Switch,\n  bu.Case,\n  bu.LookupVal,\n  bu.BinOp,\n  bu.In,\n  bu.Is,\n  bu.Or,\n  bu.And,\n  bu.Not,\n  bu.Add,\n  bu.Concat,\n  bu.Sub,\n  bu.Mul,\n  bu.Div,\n  bu.FloorDiv,\n  bu.Mod,\n  bu.Pow,\n  bu.Neg,\n  bu.Pos,\n  bu.Compare,\n  bu.CompareOperand,\n  bu.CallExtension,\n  bu.CallExtensionAsync,\n  bu.printNodes);\nvar Ou = (function (e) {\n    var n;\n    function r() {\n      return e.apply(this, arguments) || this;\n    }\n    ((n = e), ((t = r).prototype = Object.create(n.prototype)), Iu((t.prototype.constructor = t), n));\n    var t = r.prototype;\n    return (\n      (t.init = function (e) {\n        ((this.tokens = e),\n          (this.peeked = null),\n          (this.breakOnBlocks = null),\n          (this.dropLeadingWhitespace = !1),\n          (this.extensions = []));\n      }),\n      (t.nextToken = function (e) {\n        var t;\n        if (this.peeked) {\n          if (e || this.peeked.type !== uc.TOKEN_WHITESPACE) return ((t = this.peeked), (this.peeked = null), t);\n          this.peeked = null;\n        }\n        if (((t = this.tokens.nextToken()), !e))\n          for (; t && t.type === uc.TOKEN_WHITESPACE; ) t = this.tokens.nextToken();\n        return t;\n      }),\n      (t.peekToken = function () {\n        return ((this.peeked = this.peeked || this.nextToken()), this.peeked);\n      }),\n      (t.pushToken = function (e) {\n        if (this.peeked) throw new Error('pushToken: can only push one token on between reads');\n        this.peeked = e;\n      }),\n      (t.error = function (e, t, n) {\n        var r;\n        return (\n          (void 0 !== t && void 0 !== n) || ((t = (r = this.peekToken() || {}).lineno), (n = r.colno)),\n          void 0 !== t && (t += 1),\n          void 0 !== n && (n += 1),\n          new Ua.TemplateError(e, t, n)\n        );\n      }),\n      (t.fail = function (e, t, n) {\n        throw this.error(e, t, n);\n      }),\n      (t.skip = function (e) {\n        var t = this.nextToken();\n        return !(!t || t.type !== e) || (this.pushToken(t), !1);\n      }),\n      (t.expect = function (e) {\n        var t = this.nextToken();\n        return (t.type !== e && this.fail('expected ' + e + ', got ' + t.type, t.lineno, t.colno), t);\n      }),\n      (t.skipValue = function (e, t) {\n        var n = this.nextToken();\n        return !(!n || n.type !== e || n.value !== t) || (this.pushToken(n), !1);\n      }),\n      (t.skipSymbol = function (e) {\n        return this.skipValue(uc.TOKEN_SYMBOL, e);\n      }),\n      (t.advanceAfterBlockEnd = function (e) {\n        var t;\n        return (\n          e ||\n            ((t = this.peekToken()) || this.fail('unexpected end of file'),\n            t.type !== uc.TOKEN_SYMBOL &&\n              this.fail('advanceAfterBlockEnd: expected symbol token or explicit name to be passed'),\n            (e = this.nextToken().value)),\n          (t = this.nextToken()) && t.type === uc.TOKEN_BLOCK_END\n            ? '-' === t.value.charAt(0) && (this.dropLeadingWhitespace = !0)\n            : this.fail('expected block end in ' + e + ' statement'),\n          t\n        );\n      }),\n      (t.advanceAfterVariableEnd = function () {\n        var e = this.nextToken();\n        e && e.type === uc.TOKEN_VARIABLE_END\n          ? (this.dropLeadingWhitespace =\n              '-' === e.value.charAt(e.value.length - this.tokens.tags.VARIABLE_END.length - 1))\n          : (this.pushToken(e), this.fail('expected variable end'));\n      }),\n      (t.parseFor = function () {\n        var e,\n          t,\n          n = this.peekToken();\n        if (\n          (this.skipSymbol('for')\n            ? ((e = new bu.For(n.lineno, n.colno)), (t = 'endfor'))\n            : this.skipSymbol('asyncEach')\n              ? ((e = new bu.AsyncEach(n.lineno, n.colno)), (t = 'endeach'))\n              : this.skipSymbol('asyncAll')\n                ? ((e = new bu.AsyncAll(n.lineno, n.colno)), (t = 'endall'))\n                : this.fail('parseFor: expected for{Async}', n.lineno, n.colno),\n          (e.name = this.parsePrimary()),\n          e.name instanceof bu.Symbol || this.fail('parseFor: variable name expected for loop'),\n          this.peekToken().type === uc.TOKEN_COMMA)\n        ) {\n          var r = e.name;\n          for (e.name = new bu.Array(r.lineno, r.colno), e.name.addChild(r); this.skip(uc.TOKEN_COMMA); ) {\n            var i = this.parsePrimary();\n            e.name.addChild(i);\n          }\n        }\n        return (\n          this.skipSymbol('in') || this.fail('parseFor: expected \"in\" keyword for loop', n.lineno, n.colno),\n          (e.arr = this.parseExpression()),\n          this.advanceAfterBlockEnd(n.value),\n          (e.body = this.parseUntilBlocks(t, 'else')),\n          this.skipSymbol('else') && (this.advanceAfterBlockEnd('else'), (e.else_ = this.parseUntilBlocks(t))),\n          this.advanceAfterBlockEnd(),\n          e\n        );\n      }),\n      (t.parseMacro = function () {\n        var e = this.peekToken(),\n          t = (this.skipSymbol('macro') || this.fail('expected macro'), this.parsePrimary(!0)),\n          n = this.parseSignature(),\n          t = new bu.Macro(e.lineno, e.colno, t, n);\n        return (\n          this.advanceAfterBlockEnd(e.value),\n          (t.body = this.parseUntilBlocks('endmacro')),\n          this.advanceAfterBlockEnd(),\n          t\n        );\n      }),\n      (t.parseCall = function () {\n        var e = this.peekToken(),\n          t = (this.skipSymbol('call') || this.fail('expected call'), this.parseSignature(!0) || new bu.NodeList()),\n          n = this.parsePrimary(),\n          r = (this.advanceAfterBlockEnd(e.value), this.parseUntilBlocks('endcall')),\n          i = (this.advanceAfterBlockEnd(), new bu.Symbol(e.lineno, e.colno, 'caller')),\n          t = new bu.Caller(e.lineno, e.colno, i, t, r);\n        return (\n          (r = n.args.children)[r.length - 1] instanceof bu.KeywordArgs || r.push(new bu.KeywordArgs()),\n          r[r.length - 1].addChild(new bu.Pair(e.lineno, e.colno, i, t)),\n          new bu.Output(e.lineno, e.colno, [n])\n        );\n      }),\n      (t.parseWithContext = function () {\n        var e = this.peekToken(),\n          t = null;\n        return (\n          this.skipSymbol('with') ? (t = !0) : this.skipSymbol('without') && (t = !1),\n          null === t ||\n            this.skipSymbol('context') ||\n            this.fail('parseFrom: expected context after with/without', e.lineno, e.colno),\n          t\n        );\n      }),\n      (t.parseImport = function () {\n        var e = this.peekToken(),\n          t =\n            (this.skipSymbol('import') || this.fail('parseImport: expected import', e.lineno, e.colno),\n            this.parseExpression()),\n          n =\n            (this.skipSymbol('as') || this.fail('parseImport: expected \"as\" keyword', e.lineno, e.colno),\n            this.parseExpression()),\n          r = this.parseWithContext(),\n          t = new bu.Import(e.lineno, e.colno, t, n, r);\n        return (this.advanceAfterBlockEnd(e.value), t);\n      }),\n      (t.parseFrom = function () {\n        var e = this.peekToken(),\n          t = (this.skipSymbol('from') || this.fail('parseFrom: expected from'), this.parseExpression());\n        this.skipSymbol('import') || this.fail('parseFrom: expected import', e.lineno, e.colno);\n        for (var n, r = new bu.NodeList(); ; ) {\n          var a,\n            i = this.peekToken();\n          if (i.type === uc.TOKEN_BLOCK_END) {\n            (r.children.length || this.fail('parseFrom: Expected at least one import name', e.lineno, e.colno),\n              '-' === i.value.charAt(0) && (this.dropLeadingWhitespace = !0),\n              this.nextToken());\n            break;\n          }\n          (0 < r.children.length &&\n            !this.skip(uc.TOKEN_COMMA) &&\n            this.fail('parseFrom: expected comma', e.lineno, e.colno),\n            '_' === (i = this.parsePrimary()).value.charAt(0) &&\n              this.fail('parseFrom: names starting with an underscore cannot be imported', i.lineno, i.colno),\n            this.skipSymbol('as')\n              ? ((a = this.parsePrimary()), r.addChild(new bu.Pair(i.lineno, i.colno, i, a)))\n              : r.addChild(i),\n            (n = this.parseWithContext()));\n        }\n        return new bu.FromImport(e.lineno, e.colno, t, r, n);\n      }),\n      (t.parseBlock = function () {\n        var e = this.peekToken(),\n          t =\n            (this.skipSymbol('block') || this.fail('parseBlock: expected block', e.lineno, e.colno),\n            new bu.Block(e.lineno, e.colno));\n        return (\n          (t.name = this.parsePrimary()),\n          t.name instanceof bu.Symbol || this.fail('parseBlock: variable name expected', e.lineno, e.colno),\n          this.advanceAfterBlockEnd(e.value),\n          (t.body = this.parseUntilBlocks('endblock')),\n          this.skipSymbol('endblock'),\n          this.skipSymbol(t.name.value),\n          (e = this.peekToken()) || this.fail('parseBlock: expected endblock, got end of file'),\n          this.advanceAfterBlockEnd(e.value),\n          t\n        );\n      }),\n      (t.parseExtends = function () {\n        var e = 'extends',\n          t = this.peekToken();\n        return (\n          this.skipSymbol(e) || this.fail('parseTemplateRef: expected ' + e),\n          ((e = new bu.Extends(t.lineno, t.colno)).template = this.parseExpression()),\n          this.advanceAfterBlockEnd(t.value),\n          e\n        );\n      }),\n      (t.parseInclude = function () {\n        var e = 'include',\n          t = this.peekToken();\n        return (\n          this.skipSymbol(e) || this.fail('parseInclude: expected ' + e),\n          ((e = new bu.Include(t.lineno, t.colno)).template = this.parseExpression()),\n          this.skipSymbol('ignore') && this.skipSymbol('missing') && (e.ignoreMissing = !0),\n          this.advanceAfterBlockEnd(t.value),\n          e\n        );\n      }),\n      (t.parseIf = function () {\n        var e,\n          t = this.peekToken();\n        switch (\n          (this.skipSymbol('if') || this.skipSymbol('elif') || this.skipSymbol('elseif')\n            ? (e = new bu.If(t.lineno, t.colno))\n            : this.skipSymbol('ifAsync')\n              ? (e = new bu.IfAsync(t.lineno, t.colno))\n              : this.fail('parseIf: expected if, elif, or elseif', t.lineno, t.colno),\n          (e.cond = this.parseExpression()),\n          this.advanceAfterBlockEnd(t.value),\n          (e.body = this.parseUntilBlocks('elif', 'elseif', 'else', 'endif')),\n          (t = this.peekToken()) && t.value)\n        ) {\n          case 'elseif':\n          case 'elif':\n            e.else_ = this.parseIf();\n            break;\n          case 'else':\n            (this.advanceAfterBlockEnd(), (e.else_ = this.parseUntilBlocks('endif')), this.advanceAfterBlockEnd());\n            break;\n          case 'endif':\n            ((e.else_ = null), this.advanceAfterBlockEnd());\n            break;\n          default:\n            this.fail('parseIf: expected elif, else, or endif, got end of file');\n        }\n        return e;\n      }),\n      (t.parseSet = function () {\n        var e = this.peekToken();\n        this.skipSymbol('set') || this.fail('parseSet: expected set', e.lineno, e.colno);\n        for (\n          var t, n = new bu.Set(e.lineno, e.colno, []);\n          (t = this.parsePrimary()) && (n.targets.push(t), this.skip(uc.TOKEN_COMMA));\n        );\n        return (\n          this.skipValue(uc.TOKEN_OPERATOR, '=')\n            ? ((n.value = this.parseExpression()), this.advanceAfterBlockEnd(e.value))\n            : this.skip(uc.TOKEN_BLOCK_END)\n              ? ((n.body = new bu.Capture(e.lineno, e.colno, this.parseUntilBlocks('endset'))),\n                (n.value = null),\n                this.advanceAfterBlockEnd())\n              : this.fail('parseSet: expected = or block end in set tag', e.lineno, e.colno),\n          n\n        );\n      }),\n      (t.parseSwitch = function () {\n        var e = 'switch',\n          t = 'endswitch',\n          n = 'case',\n          r = 'default',\n          i = this.peekToken(),\n          s =\n            (this.skipSymbol(e) ||\n              this.skipSymbol(n) ||\n              this.skipSymbol(r) ||\n              this.fail('parseSwitch: expected \"switch,\" \"case\" or \"default\"', i.lineno, i.colno),\n            this.parseExpression());\n        (this.advanceAfterBlockEnd(e), this.parseUntilBlocks(n, r, t));\n        var a,\n          o = this.peekToken(),\n          c = [];\n        do {\n          this.skipSymbol(n);\n          var u = this.parseExpression(),\n            l = (this.advanceAfterBlockEnd(e), this.parseUntilBlocks(n, r, t));\n        } while ((c.push(new bu.Case(o.line, o.col, u, l)), (o = this.peekToken()) && o.value === n));\n        switch (o.value) {\n          case r:\n            (this.advanceAfterBlockEnd(), (a = this.parseUntilBlocks(t)), this.advanceAfterBlockEnd());\n            break;\n          case t:\n            this.advanceAfterBlockEnd();\n            break;\n          default:\n            this.fail('parseSwitch: expected \"case,\" \"default\" or \"endswitch,\" got EOF.');\n        }\n        return new bu.Switch(i.lineno, i.colno, s, c, a);\n      }),\n      (t.parseStatement = function () {\n        var e = this.peekToken();\n        if (\n          (e.type !== uc.TOKEN_SYMBOL && this.fail('tag name expected', e.lineno, e.colno),\n          this.breakOnBlocks && -1 !== Ua.indexOf(this.breakOnBlocks, e.value))\n        )\n          return null;\n        switch (e.value) {\n          case 'raw':\n            return this.parseRaw();\n          case 'verbatim':\n            return this.parseRaw('verbatim');\n          case 'if':\n          case 'ifAsync':\n            return this.parseIf();\n          case 'for':\n          case 'asyncEach':\n          case 'asyncAll':\n            return this.parseFor();\n          case 'block':\n            return this.parseBlock();\n          case 'extends':\n            return this.parseExtends();\n          case 'include':\n            return this.parseInclude();\n          case 'set':\n            return this.parseSet();\n          case 'macro':\n            return this.parseMacro();\n          case 'call':\n            return this.parseCall();\n          case 'import':\n            return this.parseImport();\n          case 'from':\n            return this.parseFrom();\n          case 'filter':\n            return this.parseFilterStatement();\n          case 'switch':\n            return this.parseSwitch();\n          default:\n            if (this.extensions.length)\n              for (var t = 0; t < this.extensions.length; t++) {\n                var n = this.extensions[t];\n                if (-1 !== Ua.indexOf(n.tags || [], e.value)) return n.parse(this, bu, uc);\n              }\n            this.fail('unknown block tag: ' + e.value, e.lineno, e.colno);\n        }\n      }),\n      (t.parseRaw = function (e) {\n        for (\n          var t = 'end' + (e = e || 'raw'),\n            n = new RegExp('([\\\\s\\\\S]*?){%\\\\s*(' + e + '|' + t + ')\\\\s*(?=%})%}'),\n            r = 1,\n            i = '',\n            a = this.advanceAfterBlockEnd();\n          (s = this.tokens._extractRegex(n)) && 0 < r;\n        ) {\n          var o = s[0],\n            c = s[1],\n            s = s[2];\n          (s === e ? (r += 1) : s === t && --r,\n            0 === r ? ((i += c), this.tokens.backN(o.length - c.length)) : (i += o));\n        }\n        return new bu.Output(a.lineno, a.colno, [new bu.TemplateData(a.lineno, a.colno, i)]);\n      }),\n      (t.parsePostfix = function (e) {\n        for (var t, n = this.peekToken(); n; ) {\n          if (n.type === uc.TOKEN_LEFT_PAREN) e = new bu.FunCall(n.lineno, n.colno, e, this.parseSignature());\n          else if (n.type === uc.TOKEN_LEFT_BRACKET)\n            (1 < (t = this.parseAggregate()).children.length && this.fail('invalid index'),\n              (e = new bu.LookupVal(n.lineno, n.colno, e, t.children[0])));\n          else {\n            if (n.type !== uc.TOKEN_OPERATOR || '.' !== n.value) break;\n            this.nextToken();\n            var r = this.nextToken();\n            (r.type !== uc.TOKEN_SYMBOL &&\n              this.fail('expected name as lookup value, got ' + r.value, r.lineno, r.colno),\n              (t = new bu.Literal(r.lineno, r.colno, r.value)),\n              (e = new bu.LookupVal(n.lineno, n.colno, e, t)));\n          }\n          n = this.peekToken();\n        }\n        return e;\n      }),\n      (t.parseExpression = function () {\n        return this.parseInlineIf();\n      }),\n      (t.parseInlineIf = function () {\n        var t,\n          n,\n          e = this.parseOr();\n        return (\n          this.skipSymbol('if') &&\n            ((t = this.parseOr()),\n            (n = e),\n            ((e = new bu.InlineIf(e.lineno, e.colno)).body = n),\n            (e.cond = t),\n            this.skipSymbol('else') ? (e.else_ = this.parseOr()) : (e.else_ = null)),\n          e\n        );\n      }),\n      (t.parseOr = function () {\n        for (var e = this.parseAnd(); this.skipSymbol('or'); )\n          var t = this.parseAnd(), e = new bu.Or(e.lineno, e.colno, e, t);\n        return e;\n      }),\n      (t.parseAnd = function () {\n        for (var e = this.parseNot(); this.skipSymbol('and'); )\n          var t = this.parseNot(), e = new bu.And(e.lineno, e.colno, e, t);\n        return e;\n      }),\n      (t.parseNot = function () {\n        var e = this.peekToken();\n        return this.skipSymbol('not') ? new bu.Not(e.lineno, e.colno, this.parseNot()) : this.parseIn();\n      }),\n      (t.parseIn = function () {\n        for (var e = this.parseIs(); ; ) {\n          var t = this.nextToken();\n          if (!t) break;\n          var n = t.type === uc.TOKEN_SYMBOL && 'not' === t.value;\n          if ((n || this.pushToken(t), !this.skipSymbol('in'))) {\n            n && this.pushToken(t);\n            break;\n          }\n          ((t = this.parseIs()), (e = new bu.In(e.lineno, e.colno, e, t)), n && (e = new bu.Not(e.lineno, e.colno, e)));\n        }\n        return e;\n      }),\n      (t.parseIs = function () {\n        var t,\n          n,\n          e = this.parseCompare();\n        return this.skipSymbol('is') &&\n          ((t = this.skipSymbol('not')), (n = this.parseCompare()), (e = new bu.Is(e.lineno, e.colno, e, n)), t)\n          ? new bu.Not(e.lineno, e.colno, e)\n          : e;\n      }),\n      (t.parseCompare = function () {\n        for (var e = ['==', '===', '!=', '!==', '<', '>', '<=', '>='], t = this.parseConcat(), n = []; ; ) {\n          var r = this.nextToken();\n          if (!r) break;\n          if (-1 === e.indexOf(r.value)) {\n            this.pushToken(r);\n            break;\n          }\n          n.push(new bu.CompareOperand(r.lineno, r.colno, this.parseConcat(), r.value));\n        }\n        return n.length ? new bu.Compare(n[0].lineno, n[0].colno, t, n) : t;\n      }),\n      (t.parseConcat = function () {\n        for (var e = this.parseAdd(); this.skipValue(uc.TOKEN_TILDE, '~'); )\n          var t = this.parseAdd(), e = new bu.Concat(e.lineno, e.colno, e, t);\n        return e;\n      }),\n      (t.parseAdd = function () {\n        for (var e = this.parseSub(); this.skipValue(uc.TOKEN_OPERATOR, '+'); )\n          var t = this.parseSub(), e = new bu.Add(e.lineno, e.colno, e, t);\n        return e;\n      }),\n      (t.parseSub = function () {\n        for (var e = this.parseMul(); this.skipValue(uc.TOKEN_OPERATOR, '-'); )\n          var t = this.parseMul(), e = new bu.Sub(e.lineno, e.colno, e, t);\n        return e;\n      }),\n      (t.parseMul = function () {\n        for (var e = this.parseDiv(); this.skipValue(uc.TOKEN_OPERATOR, '*'); )\n          var t = this.parseDiv(), e = new bu.Mul(e.lineno, e.colno, e, t);\n        return e;\n      }),\n      (t.parseDiv = function () {\n        for (var e = this.parseFloorDiv(); this.skipValue(uc.TOKEN_OPERATOR, '/'); )\n          var t = this.parseFloorDiv(), e = new bu.Div(e.lineno, e.colno, e, t);\n        return e;\n      }),\n      (t.parseFloorDiv = function () {\n        for (var e = this.parseMod(); this.skipValue(uc.TOKEN_OPERATOR, '//'); )\n          var t = this.parseMod(), e = new bu.FloorDiv(e.lineno, e.colno, e, t);\n        return e;\n      }),\n      (t.parseMod = function () {\n        for (var e = this.parsePow(); this.skipValue(uc.TOKEN_OPERATOR, '%'); )\n          var t = this.parsePow(), e = new bu.Mod(e.lineno, e.colno, e, t);\n        return e;\n      }),\n      (t.parsePow = function () {\n        for (var e = this.parseUnary(); this.skipValue(uc.TOKEN_OPERATOR, '**'); )\n          var t = this.parseUnary(), e = new bu.Pow(e.lineno, e.colno, e, t);\n        return e;\n      }),\n      (t.parseUnary = function (e) {\n        var n = this.peekToken(),\n          n = this.skipValue(uc.TOKEN_OPERATOR, '-')\n            ? new bu.Neg(n.lineno, n.colno, this.parseUnary(!0))\n            : this.skipValue(uc.TOKEN_OPERATOR, '+')\n              ? new bu.Pos(n.lineno, n.colno, this.parseUnary(!0))\n              : this.parsePrimary();\n        return e ? n : this.parseFilter(n);\n      }),\n      (t.parsePrimary = function (e) {\n        var t,\n          n = this.nextToken();\n        if (\n          (n\n            ? n.type === uc.TOKEN_STRING\n              ? (t = n.value)\n              : n.type === uc.TOKEN_INT\n                ? (t = parseInt(n.value, 10))\n                : n.type === uc.TOKEN_FLOAT\n                  ? (t = parseFloat(n.value))\n                  : n.type === uc.TOKEN_BOOLEAN\n                    ? 'true' === n.value\n                      ? (t = !0)\n                      : 'false' === n.value\n                        ? (t = !1)\n                        : this.fail('invalid boolean: ' + n.value, n.lineno, n.colno)\n                    : n.type === uc.TOKEN_NONE\n                      ? (t = null)\n                      : n.type === uc.TOKEN_REGEX && (t = new RegExp(n.value.body, n.value.flags))\n            : this.fail('expected expression, got end of file'),\n          (t =\n            void 0 !== t\n              ? new bu.Literal(n.lineno, n.colno, t)\n              : n.type === uc.TOKEN_SYMBOL\n                ? new bu.Symbol(n.lineno, n.colno, n.value)\n                : (this.pushToken(n), this.parseAggregate())),\n          (t = e ? t : this.parsePostfix(t)))\n        )\n          return t;\n        throw this.error('unexpected token: ' + n.value, n.lineno, n.colno);\n      }),\n      (t.parseFilterName = function () {\n        for (var e = this.expect(uc.TOKEN_SYMBOL), t = e.value; this.skipValue(uc.TOKEN_OPERATOR, '.'); )\n          t += '.' + this.expect(uc.TOKEN_SYMBOL).value;\n        return new bu.Symbol(e.lineno, e.colno, t);\n      }),\n      (t.parseFilterArgs = function (e) {\n        return this.peekToken().type === uc.TOKEN_LEFT_PAREN ? this.parsePostfix(e).args.children : [];\n      }),\n      (t.parseFilter = function (e) {\n        for (; this.skip(uc.TOKEN_PIPE); ) {\n          var t = this.parseFilterName();\n          e = new bu.Filter(\n            t.lineno,\n            t.colno,\n            t,\n            new bu.NodeList(t.lineno, t.colno, [e].concat(this.parseFilterArgs(e))),\n          );\n        }\n        return e;\n      }),\n      (t.parseFilterStatement = function () {\n        var e = this.peekToken(),\n          t = (this.skipSymbol('filter') || this.fail('parseFilterStatement: expected filter'), this.parseFilterName()),\n          n = this.parseFilterArgs(t),\n          e =\n            (this.advanceAfterBlockEnd(e.value), new bu.Capture(t.lineno, t.colno, this.parseUntilBlocks('endfilter'))),\n          e =\n            (this.advanceAfterBlockEnd(),\n            new bu.Filter(t.lineno, t.colno, t, new bu.NodeList(t.lineno, t.colno, [e].concat(n))));\n        return new bu.Output(t.lineno, t.colno, [e]);\n      }),\n      (t.parseAggregate = function () {\n        var e,\n          t = this.nextToken();\n        switch (t.type) {\n          case uc.TOKEN_LEFT_PAREN:\n            e = new bu.Group(t.lineno, t.colno);\n            break;\n          case uc.TOKEN_LEFT_BRACKET:\n            e = new bu.Array(t.lineno, t.colno);\n            break;\n          case uc.TOKEN_LEFT_CURLY:\n            e = new bu.Dict(t.lineno, t.colno);\n            break;\n          default:\n            return null;\n        }\n        for (;;) {\n          var i,\n            n = this.peekToken().type;\n          if (n === uc.TOKEN_RIGHT_PAREN || n === uc.TOKEN_RIGHT_BRACKET || n === uc.TOKEN_RIGHT_CURLY) {\n            this.nextToken();\n            break;\n          }\n          (0 < e.children.length &&\n            (this.skip(uc.TOKEN_COMMA) ||\n              this.fail('parseAggregate: expected comma after expression', t.lineno, t.colno)),\n            e instanceof bu.Dict\n              ? ((n = this.parsePrimary()),\n                this.skip(uc.TOKEN_COLON) ||\n                  this.fail('parseAggregate: expected colon after dict key', t.lineno, t.colno),\n                (i = this.parseExpression()),\n                e.addChild(new bu.Pair(n.lineno, n.colno, n, i)))\n              : ((n = this.parseExpression()), e.addChild(n)));\n        }\n        return e;\n      }),\n      (t.parseSignature = function (e, t) {\n        var n = this.peekToken();\n        if (!t && n.type !== uc.TOKEN_LEFT_PAREN) {\n          if (e) return null;\n          this.fail('expected arguments', n.lineno, n.colno);\n        }\n        n.type === uc.TOKEN_LEFT_PAREN && (n = this.nextToken());\n        for (var a, r = new bu.NodeList(n.lineno, n.colno), i = new bu.KeywordArgs(n.lineno, n.colno), s = !1; ; ) {\n          if (((n = this.peekToken()), !t && n.type === uc.TOKEN_RIGHT_PAREN)) {\n            this.nextToken();\n            break;\n          }\n          if (t && n.type === uc.TOKEN_BLOCK_END) break;\n          (s && !this.skip(uc.TOKEN_COMMA)\n            ? this.fail('parseSignature: expected comma after expression', n.lineno, n.colno)\n            : ((a = this.parseExpression()),\n              this.skipValue(uc.TOKEN_OPERATOR, '=')\n                ? i.addChild(new bu.Pair(a.lineno, a.colno, a, this.parseExpression()))\n                : r.addChild(a)),\n            (s = !0));\n        }\n        return (i.children.length && r.addChild(i), r);\n      }),\n      (t.parseUntilBlocks = function () {\n        for (var e = this.breakOnBlocks, t = arguments.length, n = new Array(t), r = 0; r < t; r++) n[r] = arguments[r];\n        this.breakOnBlocks = n;\n        var i = this.parse();\n        return ((this.breakOnBlocks = e), i);\n      }),\n      (t.parseNodes = function () {\n        for (var e, t = []; (e = this.nextToken()); )\n          if (e.type === uc.TOKEN_DATA) {\n            var n = e.value,\n              r = this.peekToken(),\n              i = r && r.value;\n            (this.dropLeadingWhitespace && ((n = n.replace(/^\\s*/, '')), (this.dropLeadingWhitespace = !1)),\n              r &&\n                ((r.type === uc.TOKEN_BLOCK_START && '-' === i.charAt(i.length - 1)) ||\n                  (r.type === uc.TOKEN_VARIABLE_START && '-' === i.charAt(this.tokens.tags.VARIABLE_START.length)) ||\n                  (r.type === uc.TOKEN_COMMENT && '-' === i.charAt(this.tokens.tags.COMMENT_START.length))) &&\n                (n = n.replace(/\\s*$/, '')),\n              t.push(new bu.Output(e.lineno, e.colno, [new bu.TemplateData(e.lineno, e.colno, n)])));\n          } else if (e.type === uc.TOKEN_BLOCK_START) {\n            if (((this.dropLeadingWhitespace = !1), !(r = this.parseStatement()))) break;\n            t.push(r);\n          } else\n            e.type === uc.TOKEN_VARIABLE_START\n              ? ((i = this.parseExpression()),\n                (this.dropLeadingWhitespace = !1),\n                this.advanceAfterVariableEnd(),\n                t.push(new bu.Output(e.lineno, e.colno, [i])))\n              : e.type === uc.TOKEN_COMMENT\n                ? (this.dropLeadingWhitespace =\n                    '-' === e.value.charAt(e.value.length - this.tokens.tags.COMMENT_END.length - 1))\n                : this.fail('Unexpected token at top-level: ' + e.type, e.lineno, e.colno);\n        return t;\n      }),\n      (t.parse = function () {\n        return new bu.NodeList(0, 0, this.parseNodes());\n      }),\n      (t.parseAsRoot = function () {\n        return new bu.Root(0, 0, this.parseNodes());\n      }),\n      r\n    );\n  })(Ec.Obj),\n  ku = {\n    parse: function (e, t, n) {\n      return ((e = new Ou(uc.lex(e, n))), void 0 !== t && (e.extensions = t), e.parseAsRoot());\n    },\n    Parser: Ou,\n  },\n  Lu = 0;\nfunction Du() {\n  return 'hole_' + Lu++;\n}\nfunction Ru(e, t) {\n  for (var n = null, r = 0; r < e.length; r++) {\n    var i = t(e[r]);\n    i !== e[r] && ((n = n || e.slice())[r] = i);\n  }\n  return n || e;\n}\nfunction wu(e, t, n) {\n  if (!(e instanceof bu.Node)) return e;\n  if (!n) {\n    var r = t(e);\n    if (r && r !== e) return r;\n  }\n  var a;\n  return (\n    e instanceof bu.NodeList\n      ? (r = Ru(e.children, function (e) {\n          return wu(e, t, n);\n        })) !== e.children && (e = new bu[e.typename](e.lineno, e.colno, r))\n      : e instanceof bu.CallExtension\n        ? ((r = wu(e.args, t, n)),\n          (a = Ru(e.contentArgs, function (e) {\n            return wu(e, t, n);\n          })),\n          (r === e.args && a === e.contentArgs) || (e = new bu[e.typename](e.extName, e.prop, r, a)))\n        : (a = Ru(\n            (r = e.fields.map(function (t) {\n              return e[t];\n            })),\n            function (e) {\n              return wu(e, t, n);\n            },\n          )) !== r &&\n          ((e = new bu[e.typename](e.lineno, e.colno)),\n          a.forEach(function (t, n) {\n            e[e.fields[n]] = t;\n          })),\n    (n && t(e)) || e\n  );\n}\nfunction xu(e, t) {\n  return wu(e, t, !0);\n}\nfunction Mu(e, t, n) {\n  var r = [],\n    i = xu(n ? e[n] : e, function (e) {\n      var n;\n      return e instanceof bu.Block\n        ? e\n        : (((e instanceof bu.Filter && -1 !== Ua.indexOf(t, e.name.value)) || e instanceof bu.CallExtensionAsync) &&\n            ((n = new bu.Symbol(e.lineno, e.colno, Du())),\n            r.push(new bu.FilterAsync(e.lineno, e.colno, e.name, e.args, n))),\n          n);\n    });\n  return (n ? (e[n] = i) : (e = i), r.length ? (r.push(e), new bu.NodeList(e.lineno, e.colno, r)) : e);\n}\nfunction Pu(e, t) {\n  return (function (e) {\n    return xu(e, function (e) {\n      if (e instanceof bu.If || e instanceof bu.For) {\n        var t = !1;\n        if (\n          (wu(e, function (e) {\n            if (\n              e instanceof bu.FilterAsync ||\n              e instanceof bu.IfAsync ||\n              e instanceof bu.AsyncEach ||\n              e instanceof bu.AsyncAll ||\n              e instanceof bu.CallExtensionAsync\n            )\n              return ((t = !0), e);\n          }),\n          t)\n        )\n          return e instanceof bu.If\n            ? new bu.IfAsync(e.lineno, e.colno, e.cond, e.body, e.else_)\n            : e instanceof bu.For && !(e instanceof bu.AsyncAll)\n              ? new bu.AsyncEach(e.lineno, e.colno, e.arr, e.name, e.body, e.else_)\n              : void 0;\n      }\n    });\n  })(\n    (function (e) {\n      return wu(e, function (e) {\n        var t, n;\n        e instanceof bu.Block &&\n          ((t = !1),\n          (n = Du()),\n          (e.body = wu(e.body, function (e) {\n            if (e instanceof bu.FunCall && 'super' === e.name.value)\n              return ((t = !0), new bu.Symbol(e.lineno, e.colno, n));\n          })),\n          t) &&\n          e.body.children.unshift(new bu.Super(0, 0, e.name, new bu.Symbol(0, 0, n)));\n      });\n    })(\n      (function (e, t) {\n        return xu(e, function (e) {\n          return e instanceof bu.Output\n            ? Mu(e, t)\n            : e instanceof bu.Set\n              ? Mu(e, t, 'value')\n              : e instanceof bu.For\n                ? Mu(e, t, 'arr')\n                : e instanceof bu.If\n                  ? Mu(e, t, 'cond')\n                  : e instanceof bu.CallExtension\n                    ? Mu(e, t, 'args')\n                    : void 0;\n        });\n      })(e, t),\n    ),\n  );\n}\nvar Bu = {\n    transform: function (e, t) {\n      return Pu(e, t || []);\n    },\n  },\n  Fu = Array.from,\n  Uu = 'function' == typeof Symbol && Symbol.iterator && 'function' == typeof Fu,\n  Hu = (function () {\n    function e(e, t) {\n      ((this.variables = Object.create(null)), (this.parent = e), (this.topLevel = !1), (this.isolateWrites = t));\n    }\n    var t = e.prototype;\n    return (\n      (t.set = function (e, t, n) {\n        var r = e.split('.'),\n          i = this.variables,\n          s = this;\n        if (n && (s = this.resolve(r[0], !0))) s.set(e, t);\n        else {\n          for (var a = 0; a < r.length - 1; a++) {\n            var o = r[a];\n            (i[o] || (i[o] = {}), (i = i[o]));\n          }\n          i[r[r.length - 1]] = t;\n        }\n      }),\n      (t.get = function (e) {\n        return void 0 !== (e = this.variables[e]) ? e : null;\n      }),\n      (t.lookup = function (e) {\n        var t = this.parent,\n          n = this.variables[e];\n        return void 0 !== n ? n : t && t.lookup(e);\n      }),\n      (t.resolve = function (e, t) {\n        return (\n          (t = t && this.isolateWrites ? void 0 : this.parent),\n          void 0 !== this.variables[e] ? this : t && t.resolve(e)\n        );\n      }),\n      (t.push = function (t) {\n        return new e(this, t);\n      }),\n      (t.pop = function () {\n        return this.parent;\n      }),\n      e\n    );\n  })();\nfunction Gu(e) {\n  return e && Object.prototype.hasOwnProperty.call(e, '__keywords');\n}\nfunction ju(e) {\n  var t = e.length;\n  return 0 === t ? 0 : Gu(e[t - 1]) ? t - 1 : t;\n}\nfunction qu(e) {\n  if ('string' != typeof e) return e;\n  ((this.val = e),\n    (this.val = e),\n    Object.defineProperty(this, 'length', { writable: !0, configurable: !0, value: e.length }));\n}\n((qu.prototype = Object.create(String.prototype, { length: { writable: !0, configurable: !0, value: 0 } })),\n  (qu.prototype.valueOf = function () {\n    return this.val;\n  }),\n  (qu.prototype.toString = function () {\n    return this.val;\n  }));\nvar Yu = {\n  Frame: Hu,\n  makeMacro: function (e, t, n) {\n    return function () {\n      for (var r = arguments.length, i = new Array(r), s = 0; s < r; s++) i[s] = arguments[s];\n      var o = ju(i),\n        c = (function () {\n          var t = i.length;\n          return t && Gu((t = i[t - 1])) ? t : {};\n        })();\n      if (o > e.length)\n        ((a = i.slice(0, e.length)),\n          i.slice(a.length, o).forEach(function (e, n) {\n            n < t.length && (c[t[n]] = e);\n          }),\n          a.push(c));\n      else if (o < e.length) {\n        for (var a = i.slice(0, o), u = o; u < e.length; u++) {\n          var l = e[u];\n          (a.push(c[l]), delete c[l]);\n        }\n        a.push(c);\n      } else a = i;\n      return n.apply(this, a);\n    };\n  },\n  makeKeywordArgs: function (e) {\n    return ((e.__keywords = !0), e);\n  },\n  numArgs: ju,\n  suppressValue: function (e, t) {\n    return ((e = null != e ? e : ''), !t || e instanceof qu ? e : Ua.escape(e.toString()));\n  },\n  ensureDefined: function (e, t, n) {\n    if (null == e) throw new Ua.TemplateError('attempted to output null or undefined value', t + 1, n + 1);\n    return e;\n  },\n  memberLookup: function (e, t) {\n    if (null != e)\n      return 'function' == typeof e[t]\n        ? function () {\n            for (var n = arguments.length, r = new Array(n), i = 0; i < n; i++) r[i] = arguments[i];\n            return e[t].apply(e, r);\n          }\n        : e[t];\n  },\n  contextOrFrameLookup: function (e, t, n) {\n    return void 0 !== (t = t.lookup(n)) ? t : e.lookup(n);\n  },\n  callWrap: function (e, t, n, r) {\n    if (!e) throw new Error('Unable to call `' + t + '`, which is undefined or falsey');\n    if ('function' != typeof e) throw new Error('Unable to call `' + t + '`, which is not a function');\n    return e.apply(n, r);\n  },\n  handleError: function (e, t, n) {\n    return e.lineno ? e : new Ua.TemplateError(e, t, n);\n  },\n  isArray: Ua.isArray,\n  keys: Ua.keys,\n  SafeString: qu,\n  copySafeness: function (e, t) {\n    return e instanceof qu ? new qu(t) : t.toString();\n  },\n  markSafe: function (e) {\n    var t = typeof e;\n    return 'string' == t\n      ? new qu(e)\n      : 'function' != t\n        ? e\n        : function (t) {\n            var n = e.apply(this, arguments);\n            return 'string' == typeof n ? new qu(n) : n;\n          };\n  },\n  asyncEach: function (e, t, n, r) {\n    var i;\n    Ua.isArray(e)\n      ? ((i = e.length),\n        Ua.asyncIter(\n          e,\n          function (e, r, s) {\n            switch (t) {\n              case 1:\n                n(e, r, i, s);\n                break;\n              case 2:\n                n(e[0], e[1], r, i, s);\n                break;\n              case 3:\n                n(e[0], e[1], e[2], r, i, s);\n                break;\n              default:\n                (e.push(r, i, s), n.apply(this, e));\n            }\n          },\n          r,\n        ))\n      : Ua.asyncFor(\n          e,\n          function (e, t, r, i, s) {\n            n(e, t, r, i, s);\n          },\n          r,\n        );\n  },\n  asyncAll: function (e, t, n, r) {\n    var a = 0;\n    function o(e, t) {\n      (a++, (s[e] = t), a === i && r(null, s.join('')));\n    }\n    if (Ua.isArray(e))\n      if (((i = e.length), (s = new Array(i)), 0 === i)) r(null, '');\n      else\n        for (var c = 0; c < e.length; c++) {\n          var u = e[c];\n          switch (t) {\n            case 1:\n              n(u, c, i, o);\n              break;\n            case 2:\n              n(u[0], u[1], c, i, o);\n              break;\n            case 3:\n              n(u[0], u[1], u[2], c, i, o);\n              break;\n            default:\n              (u.push(c, i, o), n.apply(this, u));\n          }\n        }\n    else {\n      var l = Ua.keys(e || {}),\n        i = l.length,\n        s = new Array(i);\n      if (0 === i) r(null, '');\n      else\n        for (var h = 0; h < l.length; h++) {\n          var f = l[h];\n          n(f, e[f], h, i, o);\n        }\n    }\n  },\n  inOperator: Ua.inOperator,\n  fromIterator: function (e) {\n    return 'object' == typeof e && null !== e && !Ua.isArray(e) && Uu && Symbol.iterator in e ? Fu(e) : e;\n  },\n};\nfunction Ku(e, t) {\n  return (Ku = Object.setPrototypeOf\n    ? Object.setPrototypeOf.bind()\n    : function (e, t) {\n        return ((e.__proto__ = t), e);\n      })(e, t);\n}\n(Yu.Frame,\n  Yu.makeMacro,\n  Yu.makeKeywordArgs,\n  Yu.numArgs,\n  Yu.suppressValue,\n  Yu.ensureDefined,\n  Yu.memberLookup,\n  Yu.contextOrFrameLookup,\n  Yu.callWrap,\n  Yu.handleError,\n  Yu.isArray,\n  Yu.keys,\n  Yu.SafeString,\n  Yu.copySafeness,\n  Yu.markSafe,\n  Yu.asyncEach,\n  Yu.asyncAll,\n  Yu.inOperator,\n  Yu.fromIterator);\nvar Wu = Ua.TemplateError,\n  Vu = Yu.Frame,\n  $u = { '==': '==', '===': '===', '!=': '!=', '!==': '!==', '<': '<', '>': '>', '<=': '<=', '>=': '>=' },\n  Qu = (function (e) {\n    var n;\n    function r() {\n      return e.apply(this, arguments) || this;\n    }\n    ((n = e), ((t = r).prototype = Object.create(n.prototype)), Ku((t.prototype.constructor = t), n));\n    var t = r.prototype;\n    return (\n      (t.init = function (e, t) {\n        ((this.templateName = e),\n          (this.codebuf = []),\n          (this.lastId = 0),\n          (this.buffer = null),\n          (this.bufferStack = []),\n          (this._scopeClosers = ''),\n          (this.inBlock = !1),\n          (this.throwOnUndefined = t));\n      }),\n      (t.fail = function (e, t, n) {\n        throw (void 0 !== t && (t += 1), void 0 !== n && (n += 1), new Wu(e, t, n));\n      }),\n      (t._pushBuffer = function () {\n        var e = this._tmpid();\n        return (this.bufferStack.push(this.buffer), (this.buffer = e), this._emit('var ' + this.buffer + ' = \"\";'), e);\n      }),\n      (t._popBuffer = function () {\n        this.buffer = this.bufferStack.pop();\n      }),\n      (t._emit = function (e) {\n        this.codebuf.push(e);\n      }),\n      (t._emitLine = function (e) {\n        this._emit(e + '\\n');\n      }),\n      (t._emitLines = function () {\n        for (var e = this, t = arguments.length, n = new Array(t), r = 0; r < t; r++) n[r] = arguments[r];\n        n.forEach(function (t) {\n          return e._emitLine(t);\n        });\n      }),\n      (t._emitFuncBegin = function (e, t) {\n        ((this.buffer = 'output'),\n          (this._scopeClosers = ''),\n          this._emitLine('function ' + t + '(env, context, frame, runtime, cb) {'),\n          this._emitLine('var lineno = ' + e.lineno + ';'),\n          this._emitLine('var colno = ' + e.colno + ';'),\n          this._emitLine('var ' + this.buffer + ' = \"\";'),\n          this._emitLine('try {'));\n      }),\n      (t._emitFuncEnd = function (e) {\n        (e || this._emitLine('cb(null, ' + this.buffer + ');'),\n          this._closeScopeLevels(),\n          this._emitLine('} catch (e) {'),\n          this._emitLine('  cb(runtime.handleError(e, lineno, colno));'),\n          this._emitLine('}'),\n          this._emitLine('}'),\n          (this.buffer = null));\n      }),\n      (t._addScopeLevel = function () {\n        this._scopeClosers += '})';\n      }),\n      (t._closeScopeLevels = function () {\n        (this._emitLine(this._scopeClosers + ';'), (this._scopeClosers = ''));\n      }),\n      (t._withScopedSyntax = function (e) {\n        var t = this._scopeClosers;\n        ((this._scopeClosers = ''), e.call(this), this._closeScopeLevels(), (this._scopeClosers = t));\n      }),\n      (t._makeCallback = function (e) {\n        var t = this._tmpid();\n        return 'function(' + t + (e ? ',' + e : '') + ') {\\nif(' + t + ') { cb(' + t + '); return; }';\n      }),\n      (t._tmpid = function () {\n        return (this.lastId++, 't_' + this.lastId);\n      }),\n      (t._templateName = function () {\n        return null == this.templateName ? 'undefined' : JSON.stringify(this.templateName);\n      }),\n      (t._compileChildren = function (e, t) {\n        var n = this;\n        e.children.forEach(function (e) {\n          n.compile(e, t);\n        });\n      }),\n      (t._compileAggregate = function (e, t, n, r) {\n        var i = this;\n        (n && this._emit(n),\n          e.children.forEach(function (e, n) {\n            (0 < n && i._emit(','), i.compile(e, t));\n          }),\n          r && this._emit(r));\n      }),\n      (t._compileExpression = function (e, t) {\n        (this.assertType(\n          e,\n          bu.Literal,\n          bu.Symbol,\n          bu.Group,\n          bu.Array,\n          bu.Dict,\n          bu.FunCall,\n          bu.Caller,\n          bu.Filter,\n          bu.LookupVal,\n          bu.Compare,\n          bu.InlineIf,\n          bu.In,\n          bu.Is,\n          bu.And,\n          bu.Or,\n          bu.Not,\n          bu.Add,\n          bu.Concat,\n          bu.Sub,\n          bu.Mul,\n          bu.Div,\n          bu.FloorDiv,\n          bu.Mod,\n          bu.Pow,\n          bu.Neg,\n          bu.Pos,\n          bu.Compare,\n          bu.NodeList,\n        ),\n          this.compile(e, t));\n      }),\n      (t.assertType = function (e) {\n        for (var t = arguments.length, n = new Array(1 < t ? t - 1 : 0), r = 1; r < t; r++) n[r - 1] = arguments[r];\n        n.some(function (t) {\n          return e instanceof t;\n        }) || this.fail('assertType: invalid type: ' + e.typename, e.lineno, e.colno);\n      }),\n      (t.compileCallExtension = function (e, t, n) {\n        var r = this,\n          i = e.args,\n          s = e.contentArgs,\n          a = 'boolean' != typeof e.autoescape || e.autoescape;\n        (n || this._emit(this.buffer + ' += runtime.suppressValue('),\n          this._emit('env.getExtension(\"' + e.extName + '\")[\"' + e.prop + '\"]('),\n          this._emit('context'),\n          (i || s) && this._emit(','),\n          i &&\n            (i instanceof bu.NodeList ||\n              this.fail('compileCallExtension: arguments must be a NodeList, use `parser.parseSignature`'),\n            i.children.forEach(function (e, n) {\n              (r._compileExpression(e, t), (n === i.children.length - 1 && !s.length) || r._emit(','));\n            })),\n          s.length &&\n            s.forEach(function (e, n) {\n              var i;\n              (0 < n && r._emit(','),\n                e\n                  ? (r._emitLine('function(cb) {'),\n                    r._emitLine('if(!cb) { cb = function(err) { if(err) { throw err; }}}'),\n                    (i = r._pushBuffer()),\n                    r._withScopedSyntax(function () {\n                      (r.compile(e, t), r._emitLine('cb(null, ' + i + ');'));\n                    }),\n                    r._popBuffer(),\n                    r._emitLine('return ' + i + ';'),\n                    r._emitLine('}'))\n                  : r._emit('null'));\n            }),\n          n\n            ? ((e = this._tmpid()),\n              this._emitLine(', ' + this._makeCallback(e)),\n              this._emitLine(this.buffer + ' += runtime.suppressValue(' + e + ', ' + a + ' && env.opts.autoescape);'),\n              this._addScopeLevel())\n            : (this._emit(')'), this._emit(', ' + a + ' && env.opts.autoescape);\\n')));\n      }),\n      (t.compileCallExtensionAsync = function (e, t) {\n        this.compileCallExtension(e, t, !0);\n      }),\n      (t.compileNodeList = function (e, t) {\n        this._compileChildren(e, t);\n      }),\n      (t.compileLiteral = function (e) {\n        var t;\n        'string' == typeof e.value\n          ? ((t = (t = (t = (t = (t = (t = e.value.replace(/\\\\/g, '\\\\\\\\')).replace(/\"/g, '\\\\\"')).replace(\n              /\\n/g,\n              '\\\\n',\n            )).replace(/\\r/g, '\\\\r')).replace(/\\t/g, '\\\\t')).replace(/\\u2028/g, '\\\\u2028')),\n            this._emit('\"' + t + '\"'))\n          : null === e.value\n            ? this._emit('null')\n            : this._emit(e.value.toString());\n      }),\n      (t.compileSymbol = function (e, t) {\n        ((e = e.value),\n          (t = t.lookup(e)) ? this._emit(t) : this._emit('runtime.contextOrFrameLookup(context, frame, \"' + e + '\")'));\n      }),\n      (t.compileGroup = function (e, t) {\n        this._compileAggregate(e, t, '(', ')');\n      }),\n      (t.compileArray = function (e, t) {\n        this._compileAggregate(e, t, '[', ']');\n      }),\n      (t.compileDict = function (e, t) {\n        this._compileAggregate(e, t, '{', '}');\n      }),\n      (t.compilePair = function (e, t) {\n        var n = e.key,\n          e = e.value;\n        (n instanceof bu.Symbol\n          ? (n = new bu.Literal(n.lineno, n.colno, n.value))\n          : (n instanceof bu.Literal && 'string' == typeof n.value) ||\n            this.fail('compilePair: Dict keys must be strings or names', n.lineno, n.colno),\n          this.compile(n, t),\n          this._emit(': '),\n          this._compileExpression(e, t));\n      }),\n      (t.compileInlineIf = function (e, t) {\n        (this._emit('('),\n          this.compile(e.cond, t),\n          this._emit('?'),\n          this.compile(e.body, t),\n          this._emit(':'),\n          null !== e.else_ ? this.compile(e.else_, t) : this._emit('\"\"'),\n          this._emit(')'));\n      }),\n      (t.compileIn = function (e, t) {\n        (this._emit('runtime.inOperator('),\n          this.compile(e.left, t),\n          this._emit(','),\n          this.compile(e.right, t),\n          this._emit(')'));\n      }),\n      (t.compileIs = function (e, t) {\n        var n = (e.right.name || e.right).value;\n        (this._emit('env.getTest(\"' + n + '\").call(context, '),\n          this.compile(e.left, t),\n          e.right.args && (this._emit(','), this.compile(e.right.args, t)),\n          this._emit(') === true'));\n      }),\n      (t._binOpEmitter = function (e, t, n) {\n        (this.compile(e.left, t), this._emit(n), this.compile(e.right, t));\n      }),\n      (t.compileOr = function (e, t) {\n        return this._binOpEmitter(e, t, ' || ');\n      }),\n      (t.compileAnd = function (e, t) {\n        return this._binOpEmitter(e, t, ' && ');\n      }),\n      (t.compileAdd = function (e, t) {\n        return this._binOpEmitter(e, t, ' + ');\n      }),\n      (t.compileConcat = function (e, t) {\n        return this._binOpEmitter(e, t, ' + \"\" + ');\n      }),\n      (t.compileSub = function (e, t) {\n        return this._binOpEmitter(e, t, ' - ');\n      }),\n      (t.compileMul = function (e, t) {\n        return this._binOpEmitter(e, t, ' * ');\n      }),\n      (t.compileDiv = function (e, t) {\n        return this._binOpEmitter(e, t, ' / ');\n      }),\n      (t.compileMod = function (e, t) {\n        return this._binOpEmitter(e, t, ' % ');\n      }),\n      (t.compileNot = function (e, t) {\n        (this._emit('!'), this.compile(e.target, t));\n      }),\n      (t.compileFloorDiv = function (e, t) {\n        (this._emit('Math.floor('),\n          this.compile(e.left, t),\n          this._emit(' / '),\n          this.compile(e.right, t),\n          this._emit(')'));\n      }),\n      (t.compilePow = function (e, t) {\n        (this._emit('Math.pow('), this.compile(e.left, t), this._emit(', '), this.compile(e.right, t), this._emit(')'));\n      }),\n      (t.compileNeg = function (e, t) {\n        (this._emit('-'), this.compile(e.target, t));\n      }),\n      (t.compilePos = function (e, t) {\n        (this._emit('+'), this.compile(e.target, t));\n      }),\n      (t.compileCompare = function (e, t) {\n        var n = this;\n        (this.compile(e.expr, t),\n          e.ops.forEach(function (e) {\n            (n._emit(' ' + $u[e.type] + ' '), n.compile(e.expr, t));\n          }));\n      }),\n      (t.compileLookupVal = function (e, t) {\n        (this._emit('runtime.memberLookup(('),\n          this._compileExpression(e.target, t),\n          this._emit('),'),\n          this._compileExpression(e.val, t),\n          this._emit(')'));\n      }),\n      (t._getNodeName = function (e) {\n        switch (e.typename) {\n          case 'Symbol':\n            return e.value;\n          case 'FunCall':\n            return 'the return value of (' + this._getNodeName(e.name) + ')';\n          case 'LookupVal':\n            return this._getNodeName(e.target) + '[\"' + this._getNodeName(e.val) + '\"]';\n          case 'Literal':\n            return e.value.toString();\n          default:\n            return '--expression--';\n        }\n      }),\n      (t.compileFunCall = function (e, t) {\n        (this._emit('(lineno = ' + e.lineno + ', colno = ' + e.colno + ', '),\n          this._emit('runtime.callWrap('),\n          this._compileExpression(e.name, t),\n          this._emit(', \"' + this._getNodeName(e.name).replace(/\"/g, '\\\\\"') + '\", context, '),\n          this._compileAggregate(e.args, t, '[', '])'),\n          this._emit(')'));\n      }),\n      (t.compileFilter = function (e, t) {\n        var n = e.name;\n        (this.assertType(n, bu.Symbol),\n          this._emit('env.getFilter(\"' + n.value + '\").call(context, '),\n          this._compileAggregate(e.args, t),\n          this._emit(')'));\n      }),\n      (t.compileFilterAsync = function (e, t) {\n        var n = e.name,\n          r = e.symbol.value;\n        (this.assertType(n, bu.Symbol),\n          t.set(r, r),\n          this._emit('env.getFilter(\"' + n.value + '\").call(context, '),\n          this._compileAggregate(e.args, t),\n          this._emitLine(', ' + this._makeCallback(r)),\n          this._addScopeLevel());\n      }),\n      (t.compileKeywordArgs = function (e, t) {\n        (this._emit('runtime.makeKeywordArgs('), this.compileDict(e, t), this._emit(')'));\n      }),\n      (t.compileSet = function (e, t) {\n        var n = this,\n          r = [];\n        (e.targets.forEach(function (e) {\n          ((e = e.value), null == (e = t.lookup(e)) && ((e = n._tmpid()), n._emitLine('var ' + e + ';')), r.push(e));\n        }),\n          e.value\n            ? (this._emit(r.join(' = ') + ' = '), this._compileExpression(e.value, t))\n            : (this._emit(r.join(' = ') + ' = '), this.compile(e.body, t)),\n          this._emitLine(';'),\n          e.targets.forEach(function (e, t) {\n            ((e = e.value),\n              n._emitLine('frame.set(\"' + e + '\", ' + (t = r[t]) + ', true);'),\n              n._emitLine('if(frame.topLevel) {'),\n              n._emitLine('context.setVariable(\"' + e + '\", ' + t + ');'),\n              n._emitLine('}'),\n              '_' !== e.charAt(0) &&\n                (n._emitLine('if(frame.topLevel) {'),\n                n._emitLine('context.addExport(\"' + e + '\", ' + t + ');'),\n                n._emitLine('}')));\n          }));\n      }),\n      (t.compileSwitch = function (e, t) {\n        var n = this;\n        (this._emit('switch ('),\n          this.compile(e.expr, t),\n          this._emit(') {'),\n          e.cases.forEach(function (e, r) {\n            (n._emit('case '),\n              n.compile(e.cond, t),\n              n._emit(': '),\n              n.compile(e.body, t),\n              e.body.children.length && n._emitLine('break;'));\n          }),\n          e.default && (this._emit('default:'), this.compile(e.default, t)),\n          this._emit('}'));\n      }),\n      (t.compileIf = function (e, t, n) {\n        var r = this;\n        (this._emit('if('),\n          this._compileExpression(e.cond, t),\n          this._emitLine(') {'),\n          this._withScopedSyntax(function () {\n            (r.compile(e.body, t), n && r._emit('cb()'));\n          }),\n          e.else_\n            ? (this._emitLine('}\\nelse {'),\n              this._withScopedSyntax(function () {\n                (r.compile(e.else_, t), n && r._emit('cb()'));\n              }))\n            : n && (this._emitLine('}\\nelse {'), this._emit('cb()')),\n          this._emitLine('}'));\n      }),\n      (t.compileIfAsync = function (e, t) {\n        (this._emit('(function(cb) {'),\n          this.compileIf(e, t, !0),\n          this._emit('})(' + this._makeCallback()),\n          this._addScopeLevel());\n      }),\n      (t._emitLoopBindings = function (e, t, n, r) {\n        var i = this;\n        [\n          { name: 'index', val: n + ' + 1' },\n          { name: 'index0', val: n },\n          { name: 'revindex', val: r + ' - ' + n },\n          { name: 'revindex0', val: r + ' - ' + n + ' - 1' },\n          { name: 'first', val: n + ' === 0' },\n          { name: 'last', val: n + ' === ' + r + ' - 1' },\n          { name: 'length', val: r },\n        ].forEach(function (e) {\n          i._emitLine('frame.set(\"loop.' + e.name + '\", ' + e.val + ');');\n        });\n      }),\n      (t.compileFor = function (e, t) {\n        var a,\n          u,\n          l,\n          o,\n          n = this,\n          r = this._tmpid(),\n          i = this._tmpid(),\n          s = this._tmpid();\n        ((t = t.push()),\n          this._emitLine('frame = frame.push();'),\n          this._emit('var ' + s + ' = '),\n          this._compileExpression(e.arr, t),\n          this._emitLine(';'),\n          this._emit('if(' + s + ') {'),\n          this._emitLine(s + ' = runtime.fromIterator(' + s + ');'),\n          e.name instanceof bu.Array\n            ? (this._emitLine('var ' + r + ';'),\n              this._emitLine('if(runtime.isArray(' + s + ')) {'),\n              this._emitLine('var ' + i + ' = ' + s + '.length;'),\n              this._emitLine('for(' + r + '=0; ' + r + ' < ' + s + '.length; ' + r + '++) {'),\n              e.name.children.forEach(function (i, a) {\n                var o = n._tmpid();\n                (n._emitLine('var ' + o + ' = ' + s + '[' + r + '][' + a + '];'),\n                  n._emitLine('frame.set(\"' + i + '\", ' + s + '[' + r + '][' + a + ']);'),\n                  t.set(e.name.children[a].value, o));\n              }),\n              this._emitLoopBindings(e, s, r, i),\n              this._withScopedSyntax(function () {\n                n.compile(e.body, t);\n              }),\n              this._emitLine('}'),\n              this._emitLine('} else {'),\n              (o = (a = e.name.children)[0]),\n              (a = a[1]),\n              (u = this._tmpid()),\n              (l = this._tmpid()),\n              t.set(o.value, u),\n              t.set(a.value, l),\n              this._emitLine(r + ' = -1;'),\n              this._emitLine('var ' + i + ' = runtime.keys(' + s + ').length;'),\n              this._emitLine('for(var ' + u + ' in ' + s + ') {'),\n              this._emitLine(r + '++;'),\n              this._emitLine('var ' + l + ' = ' + s + '[' + u + '];'),\n              this._emitLine('frame.set(\"' + o.value + '\", ' + u + ');'),\n              this._emitLine('frame.set(\"' + a.value + '\", ' + l + ');'),\n              this._emitLoopBindings(e, s, r, i),\n              this._withScopedSyntax(function () {\n                n.compile(e.body, t);\n              }),\n              this._emitLine('}'))\n            : ((o = this._tmpid()),\n              t.set(e.name.value, o),\n              this._emitLine('var ' + i + ' = ' + s + '.length;'),\n              this._emitLine('for(var ' + r + '=0; ' + r + ' < ' + s + '.length; ' + r + '++) {'),\n              this._emitLine('var ' + o + ' = ' + s + '[' + r + '];'),\n              this._emitLine('frame.set(\"' + e.name.value + '\", ' + o + ');'),\n              this._emitLoopBindings(e, s, r, i),\n              this._withScopedSyntax(function () {\n                n.compile(e.body, t);\n              })),\n          this._emitLine('}'),\n          this._emitLine('}'),\n          e.else_ && (this._emitLine('if (!' + i + ') {'), this.compile(e.else_, t), this._emitLine('}')),\n          this._emitLine('frame = frame.pop();'));\n      }),\n      (t._compileAsyncLoop = function (e, t, n) {\n        var c,\n          r = this,\n          i = this._tmpid(),\n          s = this._tmpid(),\n          a = this._tmpid(),\n          o = n ? 'asyncAll' : 'asyncEach',\n          o =\n            ((t = t.push()),\n            this._emitLine('frame = frame.push();'),\n            this._emit('var ' + a + ' = runtime.fromIterator('),\n            this._compileExpression(e.arr, t),\n            this._emitLine(');'),\n            e.name instanceof bu.Array\n              ? ((c = e.name.children.length),\n                this._emit('runtime.' + o + '(' + a + ', ' + c + ', function('),\n                e.name.children.forEach(function (e) {\n                  r._emit(e.value + ',');\n                }),\n                this._emit(i + ',' + s + ',next) {'),\n                e.name.children.forEach(function (e) {\n                  ((e = e.value), t.set(e, e), r._emitLine('frame.set(\"' + e + '\", ' + e + ');'));\n                }))\n              : ((c = e.name.value),\n                this._emitLine('runtime.' + o + '(' + a + ', 1, function(' + c + ', ' + i + ', ' + s + ',next) {'),\n                this._emitLine('frame.set(\"' + c + '\", ' + c + ');'),\n                t.set(c, c)),\n            this._emitLoopBindings(e, a, i, s),\n            this._withScopedSyntax(function () {\n              var s;\n              (n && (s = r._pushBuffer()),\n                r.compile(e.body, t),\n                r._emitLine('next(' + i + (s ? ',' + s : '') + ');'),\n                n && r._popBuffer());\n            }),\n            this._tmpid());\n        (this._emitLine('}, ' + this._makeCallback(o)),\n          this._addScopeLevel(),\n          n && this._emitLine(this.buffer + ' += ' + o + ';'),\n          e.else_ && (this._emitLine('if (!' + a + '.length) {'), this.compile(e.else_, t), this._emitLine('}')),\n          this._emitLine('frame = frame.pop();'));\n      }),\n      (t.compileAsyncEach = function (e, t) {\n        this._compileAsyncLoop(e, t);\n      }),\n      (t.compileAsyncAll = function (e, t) {\n        this._compileAsyncLoop(e, t, !0);\n      }),\n      (t._compileMacro = function (e, t) {\n        var n = this,\n          r = [],\n          i = null,\n          s = 'macro_' + this._tmpid(),\n          a = void 0 !== t,\n          c =\n            (e.args.children.forEach(function (t, s) {\n              s === e.args.children.length - 1 && t instanceof bu.Dict\n                ? (i = t)\n                : (n.assertType(t, bu.Symbol), r.push(t));\n            }),\n            [].concat(\n              r.map(function (e) {\n                return 'l_' + e.value;\n              }),\n              ['kwargs'],\n            )),\n          u = r.map(function (e) {\n            return '\"' + e.value + '\"';\n          }),\n          l = ((i && i.children) || []).map(function (e) {\n            return '\"' + e.key.value + '\"';\n          }),\n          o = a ? t.push(!0) : new Vu(),\n          t =\n            (this._emitLines(\n              'var ' + s + ' = runtime.makeMacro(',\n              '[' + u.join(', ') + '], ',\n              '[' + l.join(', ') + '], ',\n              'function (' + c.join(', ') + ') {',\n              'var callerFrame = frame;',\n              'frame = ' + (a ? 'frame.push(true);' : 'new runtime.Frame();'),\n              'kwargs = kwargs || {};',\n              'if (Object.prototype.hasOwnProperty.call(kwargs, \"caller\")) {',\n              'frame.set(\"caller\", kwargs.caller); }',\n            ),\n            r.forEach(function (e) {\n              (n._emitLine('frame.set(\"' + e.value + '\", l_' + e.value + ');'), o.set(e.value, 'l_' + e.value));\n            }),\n            i &&\n              i.children.forEach(function (e) {\n                var t = e.key.value;\n                (n._emit('frame.set(\"' + t + '\", '),\n                  n._emit('Object.prototype.hasOwnProperty.call(kwargs, \"' + t + '\")'),\n                  n._emit(' ? kwargs[\"' + t + '\"] : '),\n                  n._compileExpression(e.value, o),\n                  n._emit(');'));\n              }),\n            this._pushBuffer());\n        return (\n          this._withScopedSyntax(function () {\n            n.compile(e.body, o);\n          }),\n          this._emitLine('frame = ' + (a ? 'frame.pop();' : 'callerFrame;')),\n          this._emitLine('return new runtime.SafeString(' + t + ');'),\n          this._emitLine('});'),\n          this._popBuffer(),\n          s\n        );\n      }),\n      (t.compileMacro = function (e, t) {\n        var n = this._compileMacro(e),\n          r = e.name.value;\n        (t.set(r, n),\n          t.parent\n            ? this._emitLine('frame.set(\"' + r + '\", ' + n + ');')\n            : ('_' !== e.name.value.charAt(0) && this._emitLine('context.addExport(\"' + r + '\");'),\n              this._emitLine('context.setVariable(\"' + r + '\", ' + n + ');')));\n      }),\n      (t.compileCaller = function (e, t) {\n        (this._emit('(function (){'), (e = this._compileMacro(e, t)), this._emit('return ' + e + ';})()'));\n      }),\n      (t._compileGetTemplate = function (e, t, n, r) {\n        var i = this._tmpid(),\n          s = this._templateName(),\n          a = this._makeCallback(i),\n          n = n ? 'true' : 'false',\n          r = r ? 'true' : 'false';\n        return (\n          this._emit('env.getTemplate('),\n          this._compileExpression(e.template, t),\n          this._emitLine(', ' + n + ', ' + s + ', ' + r + ', ' + a),\n          i\n        );\n      }),\n      (t.compileImport = function (e, t) {\n        var n = e.target.value,\n          r = this._compileGetTemplate(e, t, !1, !1);\n        (this._addScopeLevel(),\n          this._emitLine(\n            r + '.getExported(' + (e.withContext ? 'context.getVariables(), frame, ' : '') + this._makeCallback(r),\n          ),\n          this._addScopeLevel(),\n          t.set(n, r),\n          t.parent\n            ? this._emitLine('frame.set(\"' + n + '\", ' + r + ');')\n            : this._emitLine('context.setVariable(\"' + n + '\", ' + r + ');'));\n      }),\n      (t.compileFromImport = function (e, t) {\n        var n = this,\n          r = this._compileGetTemplate(e, t, !1, !1);\n        (this._addScopeLevel(),\n          this._emitLine(\n            r + '.getExported(' + (e.withContext ? 'context.getVariables(), frame, ' : '') + this._makeCallback(r),\n          ),\n          this._addScopeLevel(),\n          e.names.children.forEach(function (e) {\n            var i,\n              a = n._tmpid(),\n              e = e instanceof bu.Pair ? ((i = e.key.value), e.value.value) : (i = e.value);\n            (n._emitLine('if(Object.prototype.hasOwnProperty.call(' + r + ', \"' + i + '\")) {'),\n              n._emitLine('var ' + a + ' = ' + r + '.' + i + ';'),\n              n._emitLine('} else {'),\n              n._emitLine('cb(new Error(\"cannot import \\'' + i + '\\'\")); return;'),\n              n._emitLine('}'),\n              t.set(e, a),\n              t.parent\n                ? n._emitLine('frame.set(\"' + e + '\", ' + a + ');')\n                : n._emitLine('context.setVariable(\"' + e + '\", ' + a + ');'));\n          }));\n      }),\n      (t.compileBlock = function (e) {\n        var t = this._tmpid();\n        (this.inBlock || this._emit('(parentTemplate ? function(e, c, f, r, cb) { cb(\"\"); } : '),\n          this._emit('context.getBlock(\"' + e.name.value + '\")'),\n          this.inBlock || this._emit(')'),\n          this._emitLine('(env, context, frame, runtime, ' + this._makeCallback(t)),\n          this._emitLine(this.buffer + ' += ' + t + ';'),\n          this._addScopeLevel());\n      }),\n      (t.compileSuper = function (e, t) {\n        var n = e.blockName.value,\n          e = e.symbol.value,\n          i = this._makeCallback(e);\n        (this._emitLine('context.getSuper(env, \"' + n + '\", b_' + n + ', frame, runtime, ' + i),\n          this._emitLine(e + ' = runtime.markSafe(' + e + ');'),\n          this._addScopeLevel(),\n          t.set(e, e));\n      }),\n      (t.compileExtends = function (e, t) {\n        var n = this._tmpid(),\n          e = this._compileGetTemplate(e, t, !0, !1);\n        (this._emitLine('parentTemplate = ' + e),\n          this._emitLine('for(var ' + n + ' in parentTemplate.blocks) {'),\n          this._emitLine('context.addBlock(' + n + ', parentTemplate.blocks[' + n + ']);'),\n          this._emitLine('}'),\n          this._addScopeLevel());\n      }),\n      (t.compileInclude = function (e, t) {\n        (this._emitLine('var tasks = [];'),\n          this._emitLine('tasks.push('),\n          this._emitLine('function(callback) {'),\n          (t = this._compileGetTemplate(e, t, !1, e.ignoreMissing)),\n          this._emitLine('callback(null,' + t + ');});'),\n          this._emitLine('});'),\n          (e = this._tmpid()),\n          this._emitLine('tasks.push('),\n          this._emitLine('function(template, callback){'),\n          this._emitLine('template.render(context.getVariables(), frame, ' + this._makeCallback(e)),\n          this._emitLine('callback(null,' + e + ');});'),\n          this._emitLine('});'),\n          this._emitLine('tasks.push('),\n          this._emitLine('function(result, callback){'),\n          this._emitLine(this.buffer + ' += result;'),\n          this._emitLine('callback(null);'),\n          this._emitLine('});'),\n          this._emitLine('env.waterfall(tasks, function(){'),\n          this._addScopeLevel());\n      }),\n      (t.compileTemplateData = function (e, t) {\n        this.compileLiteral(e, t);\n      }),\n      (t.compileCapture = function (e, t) {\n        var n = this,\n          r = this.buffer;\n        ((this.buffer = 'output'),\n          this._emitLine('(function() {'),\n          this._emitLine('var output = \"\";'),\n          this._withScopedSyntax(function () {\n            n.compile(e.body, t);\n          }),\n          this._emitLine('return output;'),\n          this._emitLine('})()'),\n          (this.buffer = r));\n      }),\n      (t.compileOutput = function (e, t) {\n        var n = this;\n        e.children.forEach(function (r) {\n          r instanceof bu.TemplateData\n            ? r.value && (n._emit(n.buffer + ' += '), n.compileLiteral(r, t), n._emitLine(';'))\n            : (n._emit(n.buffer + ' += runtime.suppressValue('),\n              n.throwOnUndefined && n._emit('runtime.ensureDefined('),\n              n.compile(r, t),\n              n.throwOnUndefined && n._emit(',' + e.lineno + ',' + e.colno + ')'),\n              n._emit(', env.opts.autoescape);\\n'));\n        });\n      }),\n      (t.compileRoot = function (e, t) {\n        var n = this,\n          r =\n            (t && this.fail(\"compileRoot: root node can't have frame\"),\n            (t = new Vu()),\n            this._emitFuncBegin(e, 'root'),\n            this._emitLine('var parentTemplate = null;'),\n            this._compileChildren(e, t),\n            this._emitLine('if(parentTemplate) {'),\n            this._emitLine('parentTemplate.rootRenderFunc(env, context, frame, runtime, cb);'),\n            this._emitLine('} else {'),\n            this._emitLine('cb(null, ' + this.buffer + ');'),\n            this._emitLine('}'),\n            this._emitFuncEnd(!0),\n            (this.inBlock = !0),\n            []);\n        ((t = e.findAll(bu.Block)).forEach(function (e, t) {\n          var i = e.name.value;\n          if (-1 !== r.indexOf(i)) throw new Error('Block \"' + i + '\" defined more than once.');\n          (r.push(i),\n            n._emitFuncBegin(e, 'b_' + i),\n            (i = new Vu()),\n            n._emitLine('var frame = frame.push(true);'),\n            n.compile(e.body, i),\n            n._emitFuncEnd());\n        }),\n          this._emitLine('return {'),\n          t.forEach(function (e, t) {\n            ((e = 'b_' + e.name.value), n._emitLine(e + ': ' + e + ','));\n          }),\n          this._emitLine('root: root\\n};'));\n      }),\n      (t.compile = function (e, t) {\n        var n = this['compile' + e.typename];\n        n ? n.call(this, e, t) : this.fail('compile: Cannot compile node: ' + e.typename, e.lineno, e.colno);\n      }),\n      (t.getCode = function () {\n        return this.codebuf.join('');\n      }),\n      r\n    );\n  })(Ec.Obj),\n  zu = {\n    compile: function (e, t, n, r, i) {\n      var s = new Qu(r, (i = void 0 === i ? {} : i).throwOnUndefined),\n        e = (n || [])\n          .map(function (e) {\n            return e.preprocess;\n          })\n          .filter(function (e) {\n            return !!e;\n          })\n          .reduce(function (e, t) {\n            return t(e);\n          }, e);\n      return (s.compile(Bu.transform(ku.parse(e, n, i), t, r)), s.getCode());\n    },\n    Compiler: Qu,\n  },\n  Xu = Sr(function (e) {\n    function n(e, t) {\n      return null == e || !1 === e ? t : e;\n    }\n    function r(e) {\n      return e != e;\n    }\n    function i(e) {\n      var t = (e = n(e, '')).toLowerCase();\n      return Yu.copySafeness(e, t.charAt(0).toUpperCase() + t.slice(1));\n    }\n    function s(e) {\n      if (Ua.isString(e)) return e.split('');\n      if (Ua.isObject(e))\n        return Ua._entries(e || {}).map(function (e) {\n          return { key: e[0], value: e[1] };\n        });\n      if (Ua.isArray(e)) return e;\n      throw new Ua.TemplateError('list filter: type not iterable');\n    }\n    function a(e) {\n      return function (t, n, r) {\n        var i = this,\n          s = i.env.getTest((n = void 0 === n ? 'truthy' : n));\n        return Ua.toArray(t).filter(function (t) {\n          return s.call(i, t, r) === e;\n        });\n      };\n    }\n    function o(e) {\n      return Yu.copySafeness(e, e.replace(/^\\s*|\\s*$/g, ''));\n    }\n    (((e = e.exports = {}).abs = Math.abs),\n      (e.batch = function (e, t, n) {\n        for (var i = [], s = [], r = 0; r < e.length; r++)\n          (r % t == 0 && s.length && (i.push(s), (s = [])), s.push(e[r]));\n        if (s.length) {\n          if (n) for (r = s.length; r < t; r++) s.push(n);\n          i.push(s);\n        }\n        return i;\n      }),\n      (e.capitalize = i),\n      (e.center = function (e, t) {\n        var i;\n        return (e = n(e, '')).length >= (t = t || 80)\n          ? e\n          : ((t -= e.length),\n            (i = Ua.repeat(' ', t / 2 - (t % 2))),\n            (t = Ua.repeat(' ', t / 2)),\n            Yu.copySafeness(e, i + e + t));\n      }),\n      (e.default = function (e, t, n) {\n        return n ? e || t : void 0 !== e ? e : t;\n      }),\n      (e.dictsort = function (e, t, n) {\n        if (!Ua.isObject(e)) throw new Ua.TemplateError('dictsort filter: val must be an object');\n        var r,\n          s,\n          i = [];\n        for (s in e) i.push([s, e[s]]);\n        if (void 0 === n || 'key' === n) r = 0;\n        else {\n          if ('value' !== n) throw new Ua.TemplateError('dictsort filter: You can only sort by either key or value');\n          r = 1;\n        }\n        return (\n          i.sort(function (e, n) {\n            return (\n              (e = e[r]),\n              (n = n[r]),\n              t || (Ua.isString(e) && (e = e.toUpperCase()), Ua.isString(n) && (n = n.toUpperCase())),\n              n < e ? 1 : e === n ? 0 : -1\n            );\n          }),\n          i\n        );\n      }),\n      (e.dump = function (e, t) {\n        return JSON.stringify(e, null, t);\n      }),\n      (e.escape = function (e) {\n        return e instanceof Yu.SafeString ? e : Yu.markSafe(Ua.escape((e = null == e ? '' : e).toString()));\n      }),\n      (e.safe = function (e) {\n        return e instanceof Yu.SafeString ? e : Yu.markSafe((e = null == e ? '' : e).toString());\n      }),\n      (e.first = function (e) {\n        return e[0];\n      }),\n      (e.forceescape = function (e) {\n        return Yu.markSafe(Ua.escape((e = null == e ? '' : e).toString()));\n      }),\n      (e.groupby = function (e, t) {\n        return Ua.groupBy(e, t, this.env.opts.throwOnUndefined);\n      }),\n      (e.indent = function (e, t, r) {\n        if ('' === (e = n(e, ''))) return '';\n        t = t || 4;\n        var i = e.split('\\n'),\n          s = Ua.repeat(' ', t),\n          t = i\n            .map(function (e, t) {\n              return 0 !== t || r ? '' + s + e : e;\n            })\n            .join('\\n');\n        return Yu.copySafeness(e, t);\n      }),\n      (e.join = function (e, t, n) {\n        return (\n          (t = t || ''),\n          (e = n\n            ? Ua.map(e, function (e) {\n                return e[n];\n              })\n            : e).join(t)\n        );\n      }),\n      (e.last = function (e) {\n        return e[e.length - 1];\n      }),\n      (e.length = function (e) {\n        return void 0 !== (e = n(e, ''))\n          ? ('function' == typeof Map && e instanceof Map) || ('function' == typeof Set && e instanceof Set)\n            ? e.size\n            : (!Ua.isObject(e) || e instanceof Yu.SafeString ? e : Ua.keys(e)).length\n          : 0;\n      }),\n      (e.list = s),\n      (e.lower = function (e) {\n        return (e = n(e, '')).toLowerCase();\n      }),\n      (e.nl2br = function (e) {\n        return null == e ? '' : Yu.copySafeness(e, e.replace(/\\r\\n|\\n/g, '<br />\\n'));\n      }),\n      (e.random = function (e) {\n        return e[Math.floor(Math.random() * e.length)];\n      }),\n      (e.reject = a(!1)),\n      (e.rejectattr = function (e, t) {\n        return e.filter(function (e) {\n          return !e[t];\n        });\n      }),\n      (e.select = a(!0)),\n      (e.selectattr = function (e, t) {\n        return e.filter(function (e) {\n          return !!e[t];\n        });\n      }),\n      (e.replace = function (e, t, n, r) {\n        var i = e;\n        if (t instanceof RegExp) return e.replace(t, n);\n        void 0 === r && (r = -1);\n        var s = '';\n        if ('number' == typeof t) t = '' + t;\n        else if ('string' != typeof t) return e;\n        if ('string' != typeof (e = 'number' == typeof e ? '' + e : e) && !(e instanceof Yu.SafeString)) return e;\n        if ('' === t) return ((s = n + e.split('').join(n) + n), Yu.copySafeness(e, s));\n        var a = e.indexOf(t);\n        if (0 === r || -1 === a) return e;\n        for (var o = 0, c = 0; -1 < a && (-1 === r || c < r); )\n          ((s += e.substring(o, a) + n), (o = a + t.length), c++, (a = e.indexOf(t, o)));\n        return (o < e.length && (s += e.substring(o)), Yu.copySafeness(i, s));\n      }),\n      (e.reverse = function (e) {\n        var t;\n        return (\n          (t = Ua.isString(e)\n            ? s(e)\n            : Ua.map(e, function (e) {\n                return e;\n              })).reverse(),\n          Ua.isString(e) ? Yu.copySafeness(e, t.join('')) : t\n        );\n      }),\n      (e.round = function (e, t, n) {\n        return (\n          (t = t || 0),\n          (t = Math.pow(10, t)),\n          ('ceil' === n ? Math.ceil : 'floor' === n ? Math.floor : Math.round)(e * t) / t\n        );\n      }),\n      (e.slice = function (e, t, n) {\n        for (var r = Math.floor(e.length / t), i = e.length % t, s = [], a = 0, o = 0; o < t; o++) {\n          var c = a + o * r;\n          (o < i && a++, (c = e.slice(c, a + (o + 1) * r)), n && i <= o && c.push(n), s.push(c));\n        }\n        return s;\n      }),\n      (e.sum = function (e, t, n) {\n        return (\n          (n = void 0 === n ? 0 : n) +\n          (e = t\n            ? Ua.map(e, function (e) {\n                return e[t];\n              })\n            : e).reduce(function (e, t) {\n            return e + t;\n          }, 0)\n        );\n      }),\n      (e.sort = Yu.makeMacro(['value', 'reverse', 'case_sensitive', 'attribute'], [], function (e, t, n, r) {\n        var i = this,\n          e = Ua.map(e, function (e) {\n            return e;\n          }),\n          a = Ua.getAttrGetter(r);\n        return (\n          e.sort(function (e, s) {\n            if (\n              ((e = r ? a(e) : e),\n              (s = r ? a(s) : s),\n              i.env.opts.throwOnUndefined && r && (void 0 === e || void 0 === s))\n            )\n              throw new TypeError('sort: attribute \"' + r + '\" resolved to undefined');\n            return (\n              !n && Ua.isString(e) && Ua.isString(s) && ((e = e.toLowerCase()), (s = s.toLowerCase())),\n              e < s ? (t ? 1 : -1) : s < e ? (t ? -1 : 1) : 0\n            );\n          }),\n          e\n        );\n      })),\n      (e.string = function (e) {\n        return Yu.copySafeness(e, e);\n      }),\n      (e.striptags = function (e, t) {\n        var r = o((e = n(e, '')).replace(/<\\/?([a-z][a-z0-9]*)\\b[^>]*>|<!--[\\s\\S]*?-->/gi, '')),\n          t = t\n            ? r\n                .replace(/^ +| +$/gm, '')\n                .replace(/ +/g, ' ')\n                .replace(/(\\r\\n)/g, '\\n')\n                .replace(/\\n\\n\\n+/g, '\\n\\n')\n            : r.replace(/\\s+/gi, ' ');\n        return Yu.copySafeness(e, t);\n      }),\n      (e.title = function (e) {\n        var t = (e = n(e, '')).split(' ').map(i);\n        return Yu.copySafeness(e, t.join(' '));\n      }),\n      (e.trim = o),\n      (e.truncate = function (e, t, r, i) {\n        var s = e;\n        return (e = n(e, '')).length <= (t = t || 255)\n          ? e\n          : ((e = r ? e.substring(0, t) : (-1 === (r = e.lastIndexOf(' ', t)) && (r = t), e.substring(0, r))),\n            Yu.copySafeness(s, (e += null != i ? i : '...')));\n      }),\n      (e.upper = function (e) {\n        return (e = n(e, '')).toUpperCase();\n      }),\n      (e.urlencode = function (e) {\n        var t = encodeURIComponent;\n        return Ua.isString(e)\n          ? t(e)\n          : (Ua.isArray(e) ? e : Ua._entries(e))\n              .map(function (e) {\n                var n = e[0],\n                  e = e[1];\n                return t(n) + '=' + t(e);\n              })\n              .join('&');\n      }));\n    var c = /^(?:\\(|<|&lt;)?(.*?)(?:\\.|,|\\)|\\n|&gt;)?$/,\n      u = /^[\\w.!#$%&'*+\\-\\/=?\\^`{|}~]+@[a-z\\d\\-]+(\\.[a-z\\d\\-]+)+$/i,\n      l = /^https?:\\/\\/.*$/,\n      h = /^www\\./,\n      f = /\\.(?:org|net|com)(?:\\:|\\/|$)/,\n      p =\n        ((e.urlize = function (e, t, n) {\n          r(t) && (t = 1 / 0);\n          var i = !0 === n ? ' rel=\"nofollow\"' : '';\n          return e\n            .split(/(\\s+)/)\n            .filter(function (e) {\n              return e && e.length;\n            })\n            .map(function (e) {\n              var n = e.match(c),\n                s = (n = n ? n[1] : e).substr(0, t);\n              return l.test(n)\n                ? '<a href=\"' + n + '\"' + i + '>' + s + '</a>'\n                : h.test(n)\n                  ? '<a href=\"http://' + n + '\"' + i + '>' + s + '</a>'\n                  : u.test(n)\n                    ? '<a href=\"mailto:' + n + '\">' + n + '</a>'\n                    : f.test(n)\n                      ? '<a href=\"http://' + n + '\"' + i + '>' + s + '</a>'\n                      : e;\n            })\n            .join('');\n        }),\n        (e.wordcount = function (e) {\n          return (e = (e = n(e, '')) ? e.match(/\\w+/g) : null) ? e.length : null;\n        }),\n        (e.float = function (e, t) {\n          return r((e = parseFloat(e))) ? t : e;\n        }),\n        Yu.makeMacro(['value', 'default', 'base'], [], function (e, t, n) {\n          return (void 0 === n && (n = 10), r((e = parseInt(e, n))) ? t : e);\n        }));\n    ((e.int = p), (e.d = e.default), (e.e = e.escape));\n  }),\n  Zu = {};\nfunction Ju(e, t) {\n  for (var n = 0, r = e.length - 1; 0 <= r; r--) {\n    var i = e[r];\n    '.' === i ? e.splice(r, 1) : '..' === i ? (e.splice(r, 1), n++) : n && (e.splice(r, 1), n--);\n  }\n  if (t) for (; n--; ) e.unshift('..');\n  return e;\n}\nvar el = /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/,\n  tl = function (e) {\n    return el.exec(e).slice(1);\n  };\nfunction nl() {\n  for (var e = '', t = !1, n = arguments.length - 1; -1 <= n && !t; n--) {\n    var r = 0 <= n ? arguments[n] : '/';\n    if ('string' != typeof r) throw new TypeError('Arguments to path.resolve must be strings');\n    r && ((e = r + '/' + e), (t = '/' === r.charAt(0)));\n  }\n  return (\n    (t ? '/' : '') +\n      Ju(\n        al(e.split('/'), function (e) {\n          return !!e;\n        }),\n        !t,\n      ).join('/') || '.'\n  );\n}\nfunction rl(e) {\n  var t = il(e),\n    n = '/' === ol(e, -1);\n  return (\n    (e =\n      (e = Ju(\n        al(e.split('/'), function (e) {\n          return !!e;\n        }),\n        !t,\n      ).join('/')) || t\n        ? e\n        : '.') &&\n      n &&\n      (e += '/'),\n    (t ? '/' : '') + e\n  );\n}\nfunction il(e) {\n  return '/' === e.charAt(0);\n}\nvar sl = {\n  extname: function (e) {\n    return tl(e)[3];\n  },\n  basename: function (e, t) {\n    return ((e = tl(e)[2]), t && e.substr(-1 * t.length) === t ? e.substr(0, e.length - t.length) : e);\n  },\n  dirname: function (e) {\n    var n = (e = tl(e))[0],\n      e = e[1];\n    return n || e ? n + (e && e.substr(0, e.length - 1)) : '.';\n  },\n  sep: '/',\n  delimiter: ':',\n  relative: function (e, t) {\n    function n(e) {\n      for (var t = 0; t < e.length && '' === e[t]; t++);\n      for (var n = e.length - 1; 0 <= n && '' === e[n]; n--);\n      return n < t ? [] : e.slice(t, n - t + 1);\n    }\n    ((e = nl(e).substr(1)), (t = nl(t).substr(1)));\n    for (var r = n(e.split('/')), i = n(t.split('/')), s = Math.min(r.length, i.length), a = s, o = 0; o < s; o++)\n      if (r[o] !== i[o]) {\n        a = o;\n        break;\n      }\n    for (var c = [], o = a; o < r.length; o++) c.push('..');\n    return (c = c.concat(i.slice(a))).join('/');\n  },\n  join: function () {\n    return rl(\n      al(Array.prototype.slice.call(arguments, 0), function (e, t) {\n        if ('string' != typeof e) throw new TypeError('Arguments to path.join must be strings');\n        return e;\n      }).join('/'),\n    );\n  },\n  isAbsolute: il,\n  normalize: rl,\n  resolve: nl,\n};\nfunction al(e, t) {\n  if (e.filter) return e.filter(t);\n  for (var n = [], r = 0; r < e.length; r++) t(e[r], r, e) && n.push(e[r]);\n  return n;\n}\nvar ol =\n  'b' === 'ab'.substr(-1)\n    ? function (e, t, n) {\n        return e.substr(t, n);\n      }\n    : function (e, t, n) {\n        return (t < 0 && (t = e.length + t), e.substr(t, n));\n      };\nfunction cl(e, t) {\n  return (cl = Object.setPrototypeOf\n    ? Object.setPrototypeOf.bind()\n    : function (e, t) {\n        return ((e.__proto__ = t), e);\n      })(e, t);\n}\nvar ul = (function (e) {\n  var n;\n  function r() {\n    return e.apply(this, arguments) || this;\n  }\n  ((n = e), ((t = r).prototype = Object.create(n.prototype)), cl((t.prototype.constructor = t), n));\n  var t = r.prototype;\n  return (\n    (t.resolve = function (e, t) {\n      return sl.resolve(sl.dirname(e), t);\n    }),\n    (t.isRelative = function (e) {\n      return 0 === e.indexOf('./') || 0 === e.indexOf('../');\n    }),\n    r\n  );\n})(Ec.EmitterObj);\nfunction ll(e, t) {\n  return (ll = Object.setPrototypeOf\n    ? Object.setPrototypeOf.bind()\n    : function (e, t) {\n        return ((e.__proto__ = t), e);\n      })(e, t);\n}\nvar hl = (function (e) {\n  var t, n;\n  function r(t) {\n    var n;\n    return (((n = e.call(this) || this).precompiled = t || {}), n);\n  }\n  return (\n    (n = e),\n    ((t = r).prototype = Object.create(n.prototype)),\n    ll((t.prototype.constructor = t), n),\n    (r.prototype.getSource = function (e) {\n      return this.precompiled[e] ? { src: { type: 'code', obj: this.precompiled[e] }, path: e } : null;\n    }),\n    r\n  );\n})(ul);\nfunction fl(e, t) {\n  ((e.prototype = Object.create(t.prototype)), pl((e.prototype.constructor = e), t));\n}\nfunction pl(e, t) {\n  return (pl = Object.setPrototypeOf\n    ? Object.setPrototypeOf.bind()\n    : function (e, t) {\n        return ((e.__proto__ = t), e);\n      })(e, t);\n}\nvar dl = hl,\n  ml = (function (e) {\n    function t(t, n) {\n      var r = e.call(this) || this;\n      return (\n        'boolean' == typeof n &&\n          console.log(\n            '[nunjucks] Warning: you passed a boolean as the second argument to FileSystemLoader, but it now takes an options object. See http://mozilla.github.io/nunjucks/api.html#filesystemloader',\n          ),\n        (n = n || {}),\n        (r.pathsToNames = {}),\n        (r.noCache = !!n.noCache),\n        t ? ((t = Array.isArray(t) ? t : [t]), (r.searchPaths = t.map(sl.normalize))) : (r.searchPaths = ['.']),\n        n.watch,\n        r\n      );\n    }\n    return (\n      fl(t, e),\n      (t.prototype.getSource = function (e) {\n        for (var t = null, n = this.searchPaths, r = 0; r < n.length; r++) {\n          var i = sl.resolve(n[r]),\n            s = sl.resolve(n[r], e);\n          if (0 === s.indexOf(i) && Zu.existsSync(s)) {\n            t = s;\n            break;\n          }\n        }\n        if (!t) return null;\n        this.pathsToNames[t] = e;\n        var a = { src: Zu.readFileSync(t, 'utf-8'), path: t, noCache: this.noCache };\n        return (this.emit('load', e, a), a);\n      }),\n      t\n    );\n  })(ul),\n  _l = {\n    FileSystemLoader: ml,\n    PrecompiledLoader: dl,\n    NodeResolveLoader: (function (e) {\n      function t(t) {\n        var n;\n        return ((t = t || {}), ((n = e.call(this) || this).pathsToNames = {}), (n.noCache = !!t.noCache), t.watch, n);\n      }\n      return (\n        fl(t, e),\n        (t.prototype.getSource = function (e) {\n          if (/^\\.?\\.?(\\/|\\\\)/.test(e)) return null;\n          if (/^[A-Z]:/.test(e)) return null;\n          try {\n            t = vr.resolve(e);\n          } catch (e) {\n            return null;\n          }\n          this.pathsToNames[t] = e;\n          var t = { src: Zu.readFileSync(t, 'utf-8'), path: t, noCache: this.noCache };\n          return (this.emit('load', e, t), t);\n        }),\n        t\n      );\n    })(ul),\n  },\n  El = Sr(function (e, t) {\n    var n = Yu.SafeString;\n    ((t.callable = function (e) {\n      return 'function' == typeof e;\n    }),\n      (t.defined = function (e) {\n        return void 0 !== e;\n      }),\n      (t.divisibleby = function (e, t) {\n        return e % t == 0;\n      }),\n      (t.escaped = function (e) {\n        return e instanceof n;\n      }),\n      (t.equalto = function (e, t) {\n        return e === t;\n      }),\n      (t.eq = t.equalto),\n      (t.sameas = t.equalto),\n      (t.even = function (e) {\n        return e % 2 == 0;\n      }),\n      (t.falsy = function (e) {\n        return !e;\n      }),\n      (t.ge = function (e, t) {\n        return t <= e;\n      }),\n      (t.greaterthan = function (e, t) {\n        return t < e;\n      }),\n      (t.gt = t.greaterthan),\n      (t.le = function (e, t) {\n        return e <= t;\n      }),\n      (t.lessthan = function (e, t) {\n        return e < t;\n      }),\n      (t.lt = t.lessthan),\n      (t.lower = function (e) {\n        return e.toLowerCase() === e;\n      }),\n      (t.ne = function (e, t) {\n        return e !== t;\n      }),\n      (t.null = function (e) {\n        return null === e;\n      }),\n      (t.number = function (e) {\n        return 'number' == typeof e;\n      }),\n      (t.odd = function (e) {\n        return e % 2 == 1;\n      }),\n      (t.string = function (e) {\n        return 'string' == typeof e;\n      }),\n      (t.truthy = function (e) {\n        return !!e;\n      }),\n      (t.undefined = function (e) {\n        return void 0 === e;\n      }),\n      (t.upper = function (e) {\n        return e.toUpperCase() === e;\n      }),\n      (t.iterable = function (e) {\n        return 'undefined' != typeof Symbol ? !!e[Symbol.iterator] : Array.isArray(e) || 'string' == typeof e;\n      }),\n      (t.mapping = function (e) {\n        var t = null != e && 'object' == typeof e && !Array.isArray(e);\n        return Set ? t && !(e instanceof Set) : t;\n      }));\n  }),\n  Tl =\n    (El.callable,\n    El.defined,\n    El.divisibleby,\n    El.escaped,\n    El.equalto,\n    El.eq,\n    El.sameas,\n    El.even,\n    El.falsy,\n    El.ge,\n    El.greaterthan,\n    El.gt,\n    El.le,\n    El.lessthan,\n    El.lt,\n    El.lower,\n    El.ne,\n    El.number,\n    El.odd,\n    El.string,\n    El.truthy,\n    El.undefined,\n    El.upper,\n    El.iterable,\n    El.mapping,\n    function () {\n      return {\n        range: function (e, t, n) {\n          var r = [];\n          if (0 < (n = void 0 === t ? ((t = e), (e = 0), 1) : n || 1)) for (var i = e; i < t; i += n) r.push(i);\n          else for (var s = e; t < s; s += n) r.push(s);\n          return r;\n        },\n        cycler: function () {\n          return (\n            (e = Array.prototype.slice.call(arguments)),\n            (t = -1),\n            {\n              current: null,\n              reset: function () {\n                ((t = -1), (this.current = null));\n              },\n              next: function () {\n                return (++t >= e.length && (t = 0), (this.current = e[t]), this.current);\n              },\n            }\n          );\n          var e, t;\n        },\n        joiner: function (e) {\n          e = e || ',';\n          var t = !0;\n          return function () {\n            var n = t ? '' : e;\n            return ((t = !1), n);\n          };\n        },\n      };\n    });\nfunction Al(e, t) {\n  ((e.prototype = Object.create(t.prototype)), gl((e.prototype.constructor = e), t));\n}\nfunction gl(e, t) {\n  return (gl = Object.setPrototypeOf\n    ? Object.setPrototypeOf.bind()\n    : function (e, t) {\n        return ((e.__proto__ = t), e);\n      })(e, t);\n}\nvar vl = _l.FileSystemLoader,\n  yl = _l.WebLoader,\n  Sl = _l.PrecompiledLoader,\n  Cl = Ec.Obj,\n  Nl = Ec.EmitterObj,\n  bl = Yu.handleError,\n  Il = Yu.Frame;\nfunction Ol(e, t, n) {\n  Ro(function () {\n    e(t, n);\n  });\n}\nvar kl = {\n    type: 'code',\n    obj: {\n      root: function (e, t, n, r, i) {\n        try {\n          i(null, '');\n        } catch (e) {\n          i(bl(e, null, null));\n        }\n      },\n    },\n  },\n  Ll = (function (e) {\n    function t() {\n      return e.apply(this, arguments) || this;\n    }\n    Al(t, e);\n    var n = t.prototype;\n    return (\n      (n.init = function (e, t) {\n        var n = this;\n        ((t = this.opts = t || {}),\n          (this.opts.dev = !!t.dev),\n          (this.opts.autoescape = null == t.autoescape || t.autoescape),\n          (this.opts.throwOnUndefined = !!t.throwOnUndefined),\n          (this.opts.trimBlocks = !!t.trimBlocks),\n          (this.opts.lstripBlocks = !!t.lstripBlocks),\n          (this.loaders = []),\n          e\n            ? (this.loaders = Ua.isArray(e) ? e : [e])\n            : vl\n              ? (this.loaders = [new vl('views')])\n              : yl && (this.loaders = [new yl('/views')]),\n          'undefined' != typeof window &&\n            window.nunjucksPrecompiled &&\n            this.loaders.unshift(new Sl(window.nunjucksPrecompiled)),\n          this._initLoaders(),\n          (this.globals = Tl()),\n          (this.filters = {}),\n          (this.tests = {}),\n          (this.asyncFilters = []),\n          (this.extensions = {}),\n          (this.extensionsList = []),\n          Ua._entries(Xu).forEach(function (e) {\n            var t = e[0],\n              e = e[1];\n            return n.addFilter(t, e);\n          }),\n          Ua._entries(El).forEach(function (e) {\n            var t = e[0],\n              e = e[1];\n            return n.addTest(t, e);\n          }));\n      }),\n      (n._initLoaders = function () {\n        var e = this;\n        this.loaders.forEach(function (t) {\n          ((t.cache = {}),\n            'function' == typeof t.on &&\n              (t.on('update', function (n, r) {\n                ((t.cache[n] = null), e.emit('update', n, r, t));\n              }),\n              t.on('load', function (n, r) {\n                e.emit('load', n, r, t);\n              })));\n        });\n      }),\n      (n.invalidateCache = function () {\n        this.loaders.forEach(function (e) {\n          e.cache = {};\n        });\n      }),\n      (n.addExtension = function (e, t) {\n        return ((t.__name = e), (this.extensions[e] = t), this.extensionsList.push(t), this);\n      }),\n      (n.removeExtension = function (e) {\n        var t = this.getExtension(e);\n        t && ((this.extensionsList = Ua.without(this.extensionsList, t)), delete this.extensions[e]);\n      }),\n      (n.getExtension = function (e) {\n        return this.extensions[e];\n      }),\n      (n.hasExtension = function (e) {\n        return !!this.extensions[e];\n      }),\n      (n.addGlobal = function (e, t) {\n        return ((this.globals[e] = t), this);\n      }),\n      (n.getGlobal = function (e) {\n        if (void 0 === this.globals[e]) throw new Error('global not found: ' + e);\n        return this.globals[e];\n      }),\n      (n.addFilter = function (e, t, n) {\n        return (n && this.asyncFilters.push(e), (this.filters[e] = t), this);\n      }),\n      (n.getFilter = function (e) {\n        if (this.filters[e]) return this.filters[e];\n        throw new Error('filter not found: ' + e);\n      }),\n      (n.addTest = function (e, t) {\n        return ((this.tests[e] = t), this);\n      }),\n      (n.getTest = function (e) {\n        if (this.tests[e]) return this.tests[e];\n        throw new Error('test not found: ' + e);\n      }),\n      (n.resolveTemplate = function (e, t, n) {\n        return e.isRelative && t && e.isRelative(n) && e.resolve ? e.resolve(t, n) : n;\n      }),\n      (n.getTemplate = function (e, t, n, r, i) {\n        var s,\n          a = this,\n          o = this,\n          c = null;\n        if (\n          (e && e.raw && (e = e.raw),\n          Ua.isFunction(n) && ((i = n), (n = null), (t = t || !1)),\n          Ua.isFunction(t) && ((i = t), (t = !1)),\n          e instanceof Rl)\n        )\n          c = e;\n        else {\n          if ('string' != typeof e) throw new Error('template names must be a string: ' + e);\n          for (var u = 0; u < this.loaders.length; u++) {\n            var l = this.loaders[u];\n            if ((c = l.cache[this.resolveTemplate(l, n, e)])) break;\n          }\n        }\n        return c\n          ? (t && c.compile(), i ? void i(null, c) : c)\n          : (Ua.asyncIter(\n              this.loaders,\n              function (t, r, i, s) {\n                function a(e, n) {\n                  e ? s(e) : n ? ((n.loader = t), s(null, n)) : i();\n                }\n                ((e = o.resolveTemplate(t, n, e)), t.async ? t.getSource(e, a) : a(null, t.getSource(e)));\n              },\n              function (n, o) {\n                if ((n = o || n || r ? n : new Error('template not found: ' + e))) {\n                  if (i) return void i(n);\n                  throw n;\n                }\n                var c;\n                (o\n                  ? ((c = new Rl(o.src, a, o.path, t)), o.noCache || (o.loader.cache[e] = c))\n                  : (c = new Rl(kl, a, '', t)),\n                  i ? i(null, c) : (s = c));\n              },\n            ),\n            s);\n      }),\n      (n.express = function (e) {\n        return (function (e, t) {\n          function n(e, t) {\n            if (\n              ((this.name = e),\n              (this.path = e),\n              (this.defaultEngine = t.defaultEngine),\n              (this.ext = sl.extname(e)),\n              !this.ext && !this.defaultEngine)\n            )\n              throw new Error('No default engine was specified and no extension was provided.');\n            this.ext || (this.name += this.ext = ('.' !== this.defaultEngine[0] ? '.' : '') + this.defaultEngine);\n          }\n          return (\n            (n.prototype.render = function (t, n) {\n              e.render(this.name, t, n);\n            }),\n            t.set('view', n),\n            t.set('nunjucksEnv', e),\n            e\n          );\n        })(this, e);\n      }),\n      (n.render = function (e, t, n) {\n        Ua.isFunction(t) && ((n = t), (t = null));\n        var r = null;\n        return (\n          this.getTemplate(e, function (e, i) {\n            if (e && n) Ol(n, e);\n            else {\n              if (e) throw e;\n              r = i.render(t, n);\n            }\n          }),\n          r\n        );\n      }),\n      (n.renderString = function (e, t, n, r) {\n        return (Ua.isFunction(n) && ((r = n), (n = {})), new Rl(e, this, (n = n || {}).path).render(t, r));\n      }),\n      (n.waterfall = function (e, t, n) {\n        return xo(e, t, n);\n      }),\n      t\n    );\n  })(Nl),\n  Dl = (function (e) {\n    function t() {\n      return e.apply(this, arguments) || this;\n    }\n    Al(t, e);\n    var n = t.prototype;\n    return (\n      (n.init = function (e, t, n) {\n        var r = this;\n        ((this.env = n || new Ll()),\n          (this.ctx = Ua.extend({}, e)),\n          (this.blocks = {}),\n          (this.exported = []),\n          Ua.keys(t).forEach(function (e) {\n            r.addBlock(e, t[e]);\n          }));\n      }),\n      (n.lookup = function (e) {\n        return (e in this.env.globals && !(e in this.ctx) ? this.env.globals : this.ctx)[e];\n      }),\n      (n.setVariable = function (e, t) {\n        this.ctx[e] = t;\n      }),\n      (n.getVariables = function () {\n        return this.ctx;\n      }),\n      (n.addBlock = function (e, t) {\n        return ((this.blocks[e] = this.blocks[e] || []), this.blocks[e].push(t), this);\n      }),\n      (n.getBlock = function (e) {\n        if (this.blocks[e]) return this.blocks[e][0];\n        throw new Error('unknown block \"' + e + '\"');\n      }),\n      (n.getSuper = function (e, t, n, r, i, s) {\n        var n = Ua.indexOf(this.blocks[t] || [], n),\n          o = this.blocks[t][n + 1];\n        if (-1 === n || !o) throw new Error('no super block available for \"' + t + '\"');\n        o(e, this, r, i, s);\n      }),\n      (n.addExport = function (e) {\n        this.exported.push(e);\n      }),\n      (n.getExported = function () {\n        var e = this,\n          t = {};\n        return (\n          this.exported.forEach(function (n) {\n            t[n] = e.ctx[n];\n          }),\n          t\n        );\n      }),\n      t\n    );\n  })(Cl),\n  Rl = (function (e) {\n    function t() {\n      return e.apply(this, arguments) || this;\n    }\n    Al(t, e);\n    var n = t.prototype;\n    return (\n      (n.init = function (e, t, n, r) {\n        if (((this.env = t || new Ll()), Ua.isObject(e)))\n          switch (e.type) {\n            case 'code':\n              this.tmplProps = e.obj;\n              break;\n            case 'string':\n              this.tmplStr = e.obj;\n              break;\n            default:\n              throw new Error('Unexpected template object type ' + e.type + \"; expected 'code', or 'string'\");\n          }\n        else {\n          if (!Ua.isString(e)) throw new Error('src must be a string or an object describing the source');\n          this.tmplStr = e;\n        }\n        if (((this.path = n), r))\n          try {\n            this._compile();\n          } catch (e) {\n            throw Ua._prettifyError(this.path, this.env.opts.dev, e);\n          }\n        else this.compiled = !1;\n      }),\n      (n.render = function (e, t, n) {\n        var r = this,\n          i = ('function' == typeof e ? ((n = e), (e = {})) : 'function' == typeof t && ((n = t), (t = null)), !t);\n        try {\n          this.compile();\n        } catch (e) {\n          var s = Ua._prettifyError(this.path, this.env.opts.dev, e);\n          if (n) return Ol(n, s);\n          throw s;\n        }\n        var s = new Dl(e || {}, this.blocks, this.env),\n          c = (((t = t ? t.push(!0) : new Il()).topLevel = !0), null),\n          u = !1;\n        return (\n          this.rootRenderFunc(this.env, s, t, Yu, function (e, t) {\n            if (!u || !n || void 0 === t)\n              if ((e && ((e = Ua._prettifyError(r.path, r.env.opts.dev, e)), (u = !0)), n)) i ? Ol(n, e, t) : n(e, t);\n              else {\n                if (e) throw e;\n                c = t;\n              }\n          }),\n          c\n        );\n      }),\n      (n.getExported = function (e, t, n) {\n        ('function' == typeof e && ((n = e), (e = {})), 'function' == typeof t && ((n = t), (t = null)));\n        try {\n          this.compile();\n        } catch (e) {\n          if (n) return n(e);\n          throw e;\n        }\n        (t = t ? t.push() : new Il()).topLevel = !0;\n        var i = new Dl(e || {}, this.blocks, this.env);\n        this.rootRenderFunc(this.env, i, t, Yu, function (e) {\n          e ? n(e, null) : n(null, i.getExported());\n        });\n      }),\n      (n.compile = function () {\n        this.compiled || this._compile();\n      }),\n      (n._compile = function () {\n        var t =\n          this.tmplProps ||\n          ((t = zu.compile(this.tmplStr, this.env.asyncFilters, this.env.extensionsList, this.path, this.env.opts)),\n          new Function(t)());\n        ((this.blocks = this._getBlocks(t)), (this.rootRenderFunc = t.root), (this.compiled = !0));\n      }),\n      (n._getBlocks = function (e) {\n        var t = {};\n        return (\n          Ua.keys(e).forEach(function (n) {\n            'b_' === n.slice(0, 2) && (t[n.slice(2)] = e[n]);\n          }),\n          t\n        );\n      }),\n      t\n    );\n  })(Cl),\n  wl = { Environment: Ll, Template: Rl };\nUa._prettifyError;\nvar xl,\n  Ml = wl.Environment;\nfunction Pl(e, t) {\n  var n;\n  return (\n    (t = t || {}),\n    Ua.isObject(e) && ((t = e), (e = null)),\n    _l.FileSystemLoader\n      ? (n = new _l.FileSystemLoader(e, { watch: t.watch, noCache: t.noCache }))\n      : _l.WebLoader && (n = new _l.WebLoader(e, { useCache: t.web && t.web.useCache, async: t.web && t.web.async })),\n    (xl = new Ml(n, t)),\n    t && t.express && xl.express(t.express),\n    xl\n  );\n}\n(_l.FileSystemLoader, _l.NodeResolveLoader, _l.PrecompiledLoader, _l.WebLoader);\nvar Bl = function (e, t, n) {\n  return (xl || Pl(), xl.renderString(e, t, n));\n};\nconst Fl = 1e3,\n  Ul = 6e4,\n  Hl = 36e5,\n  Gl = 'millisecond',\n  jl = 'second',\n  ql = 'minute',\n  Yl = 'hour',\n  Kl = 'day',\n  Wl = 'week',\n  Vl = 'month',\n  $l = 'quarter',\n  Ql = 'year',\n  zl = 'date',\n  Xl = 'Invalid Date',\n  Zl = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,\n  Jl = /\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;\nvar eh = {\n  name: 'en',\n  weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n  months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n  ordinal: (e) => {\n    var t = ['th', 'st', 'nd', 'rd'],\n      n = e % 100;\n    return `[${e}${t[(n - 20) % 10] || t[n] || t[0]}]`;\n  },\n};\nconst th = (e, t, n) => {\n    var r = String(e);\n    return !r || r.length >= t ? e : '' + Array(t + 1 - r.length).join(n) + e;\n  },\n  nh = (e, t) => {\n    var n, r, i;\n    return e.date() < t.date()\n      ? -nh(t, e)\n      : ((n = 12 * (t.year() - e.year()) + (t.month() - e.month())),\n        (i = t - (r = e.clone().add(n, Vl)) < 0),\n        (e = e.clone().add(n + (i ? -1 : 1), Vl)),\n        +(-(n + (t - r) / (i ? r - e : e - r)) || 0));\n  };\nvar rh = {\n  s: th,\n  z: (e) => {\n    var e = -e.utcOffset(),\n      n = Math.abs(e),\n      r = Math.floor(n / 60),\n      n = n % 60;\n    return (e <= 0 ? '+' : '-') + th(r, 2, '0') + ':' + th(n, 2, '0');\n  },\n  m: nh,\n  a: (e) => (e < 0 ? Math.ceil(e) || 0 : Math.floor(e)),\n  p: (e) =>\n    ({ M: Vl, y: Ql, w: Wl, d: Kl, D: zl, h: Yl, m: ql, s: jl, ms: Gl, Q: $l })[e] ||\n    String(e || '')\n      .toLowerCase()\n      .replace(/s$/, ''),\n  u: (e) => void 0 === e,\n};\nlet ih = 'en';\nconst sh = {},\n  ah = ((sh[ih] = eh), (e) => e instanceof lh),\n  oh = (e, t, n) => {\n    let r;\n    if (!e) return ih;\n    if ('string' == typeof e) {\n      const n = e.toLowerCase();\n      if ((sh[n] && (r = n), t && ((sh[n] = t), (r = n)), (t = e.split('-')), !r && 1 < t.length)) return oh(t[0]);\n    } else {\n      const t = e.name;\n      ((sh[t] = e), (r = t));\n    }\n    return (!n && r && (ih = r), r || (!n && ih));\n  },\n  ch = function (e, t) {\n    var n;\n    return ah(e) ? e.clone() : (((n = 'object' == typeof t ? t : {}).date = e), (n.args = arguments), new lh(n));\n  },\n  uh = rh;\n((uh.l = oh), (uh.i = ah), (uh.w = (e, t) => ch(e, { locale: t.$L, utc: t.$u, x: t.$x, $offset: t.$offset })));\nclass lh {\n  constructor(e) {\n    ((this.$L = oh(e.locale, null, !0)), this.parse(e));\n  }\n  parse(e) {\n    ((this.$d = ((e) => {\n      const { date: t, utc: n } = e;\n      if (null === t) return new Date(NaN);\n      if (uh.u(t)) return new Date();\n      if (!(t instanceof Date || 'string' != typeof t || /Z$/i.test(t))) {\n        const e = t.match(Zl);\n        if (e) {\n          const t = e[2] - 1 || 0,\n            r = (e[7] || '0').substring(0, 3);\n          return n\n            ? new Date(Date.UTC(e[1], t, e[3] || 1, e[4] || 0, e[5] || 0, e[6] || 0, r))\n            : new Date(e[1], t, e[3] || 1, e[4] || 0, e[5] || 0, e[6] || 0, r);\n        }\n      }\n      return new Date(t);\n    })(e)),\n      (this.$x = e.x || {}),\n      this.init());\n  }\n  init() {\n    var e = this.$d;\n    ((this.$y = e.getFullYear()),\n      (this.$M = e.getMonth()),\n      (this.$D = e.getDate()),\n      (this.$W = e.getDay()),\n      (this.$H = e.getHours()),\n      (this.$m = e.getMinutes()),\n      (this.$s = e.getSeconds()),\n      (this.$ms = e.getMilliseconds()));\n  }\n  $utils() {\n    return uh;\n  }\n  isValid() {\n    return !(this.$d.toString() === Xl);\n  }\n  isSame(e, t) {\n    return ((e = ch(e)), this.startOf(t) <= e && e <= this.endOf(t));\n  }\n  isAfter(e, t) {\n    return ch(e) < this.startOf(t);\n  }\n  isBefore(e, t) {\n    return this.endOf(t) < ch(e);\n  }\n  $g(e, t, n) {\n    return uh.u(e) ? this[t] : this.set(n, e);\n  }\n  unix() {\n    return Math.floor(this.valueOf() / 1e3);\n  }\n  valueOf() {\n    return this.$d.getTime();\n  }\n  startOf(e, t) {\n    const n = !!uh.u(t) || t,\n      r = uh.p(e),\n      i = (e, t) => (\n        (t = uh.w(this.$u ? Date.UTC(this.$y, t, e) : new Date(this.$y, t, e), this)),\n        n ? t : t.endOf(Kl)\n      ),\n      s = (e, t) =>\n        uh.w(this.toDate()[e].apply(this.toDate('s'), (n ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(t)), this),\n      { $W: a, $M: o, $D: c } = this,\n      u = 'set' + (this.$u ? 'UTC' : '');\n    switch (r) {\n      case Ql:\n        return n ? i(1, 0) : i(31, 11);\n      case Vl:\n        return n ? i(1, o) : i(0, o + 1);\n      case Wl: {\n        const e = this.$locale().weekStart || 0,\n          t = (a < e ? a + 7 : a) - e;\n        return i(n ? c - t : c + (6 - t), o);\n      }\n      case Kl:\n      case zl:\n        return s(u + 'Hours', 0);\n      case Yl:\n        return s(u + 'Minutes', 1);\n      case ql:\n        return s(u + 'Seconds', 2);\n      case jl:\n        return s(u + 'Milliseconds', 3);\n      default:\n        return this.clone();\n    }\n  }\n  endOf(e) {\n    return this.startOf(e, !1);\n  }\n  $set(e, t) {\n    var e = uh.p(e),\n      r = 'set' + (this.$u ? 'UTC' : ''),\n      r = {\n        [Kl]: r + 'Date',\n        [zl]: r + 'Date',\n        [Vl]: r + 'Month',\n        [Ql]: r + 'FullYear',\n        [Yl]: r + 'Hours',\n        [ql]: r + 'Minutes',\n        [jl]: r + 'Seconds',\n        [Gl]: r + 'Milliseconds',\n      }[e],\n      t = e === Kl ? this.$D + (t - this.$W) : t;\n    if (e === Vl || e === Ql) {\n      const e = this.clone().set(zl, 1);\n      (e.$d[r](t), e.init(), (this.$d = e.set(zl, Math.min(this.$D, e.daysInMonth())).$d));\n    } else r && this.$d[r](t);\n    return (this.init(), this);\n  }\n  set(e, t) {\n    return this.clone().$set(e, t);\n  }\n  get(e) {\n    return this[uh.p(e)]();\n  }\n  add(e, t) {\n    e = Number(e);\n    var r = (t) => {\n      var n = ch(this);\n      return uh.w(n.date(n.date() + Math.round(t * e)), this);\n    };\n    return (t = uh.p(t)) === Vl\n      ? this.set(Vl, this.$M + e)\n      : t === Ql\n        ? this.set(Ql, this.$y + e)\n        : t === Kl\n          ? r(1)\n          : t === Wl\n            ? r(7)\n            : ((r = { [ql]: Ul, [Yl]: Hl, [jl]: Fl }[t] || 1), (t = this.$d.getTime() + e * r), uh.w(t, this));\n  }\n  subtract(e, t) {\n    return this.add(-1 * e, t);\n  }\n  format(e) {\n    var t = this.$locale();\n    if (!this.isValid()) return t.invalidDate || Xl;\n    const n = e || 'YYYY-MM-DDTHH:mm:ssZ',\n      r = uh.z(this),\n      { $H: i, $m: s, $M: a } = this,\n      { weekdays: o, months: c, meridiem: u } = t,\n      l = (e, t, r, i) => (e && (e[t] || e(this, n))) || r[t].slice(0, i),\n      h = (e) => uh.s(i % 12 || 12, e, '0'),\n      f = u || ((e, t, n) => ((e = e < 12 ? 'AM' : 'PM'), n ? e.toLowerCase() : e)),\n      p = {\n        YY: String(this.$y).slice(-2),\n        YYYY: this.$y,\n        M: a + 1,\n        MM: uh.s(a + 1, 2, '0'),\n        MMM: l(t.monthsShort, a, c, 3),\n        MMMM: l(c, a),\n        D: this.$D,\n        DD: uh.s(this.$D, 2, '0'),\n        d: String(this.$W),\n        dd: l(t.weekdaysMin, this.$W, o, 2),\n        ddd: l(t.weekdaysShort, this.$W, o, 3),\n        dddd: o[this.$W],\n        H: String(i),\n        HH: uh.s(i, 2, '0'),\n        h: h(1),\n        hh: h(2),\n        a: f(i, s, !0),\n        A: f(i, s, !1),\n        m: String(s),\n        mm: uh.s(s, 2, '0'),\n        s: String(this.$s),\n        ss: uh.s(this.$s, 2, '0'),\n        SSS: uh.s(this.$ms, 3, '0'),\n        Z: r,\n      };\n    return n.replace(Jl, (e, t) => t || p[e] || r.replace(':', ''));\n  }\n  utcOffset() {\n    return 15 * -Math.round(this.$d.getTimezoneOffset() / 15);\n  }\n  diff(e, t, n) {\n    var t = uh.p(t),\n      s = ((e = ch(e)).utcOffset() - this.utcOffset()) * Ul,\n      a = this - e,\n      e = uh.m(this, e),\n      e =\n        {\n          [Ql]: e / 12,\n          [Vl]: e,\n          [$l]: e / 3,\n          [Wl]: (a - s) / 6048e5,\n          [Kl]: (a - s) / 864e5,\n          [Yl]: a / Hl,\n          [ql]: a / Ul,\n          [jl]: a / Fl,\n        }[t] || a;\n    return n ? e : uh.a(e);\n  }\n  daysInMonth() {\n    return this.endOf(Vl).$D;\n  }\n  $locale() {\n    return sh[this.$L];\n  }\n  locale(e, t) {\n    var n;\n    return e ? ((n = this.clone()), (e = oh(e, t, !0)) && (n.$L = e), n) : this.$L;\n  }\n  clone() {\n    return uh.w(this.$d, this);\n  }\n  toDate() {\n    return new Date(this.valueOf());\n  }\n  toJSON() {\n    return this.isValid() ? this.toISOString() : null;\n  }\n  toISOString() {\n    return this.$d.toISOString();\n  }\n  toString() {\n    return this.$d.toUTCString();\n  }\n}\nconst hh = lh.prototype;\n((ch.prototype = hh),\n  [\n    ['$ms', Gl],\n    ['$s', jl],\n    ['$m', ql],\n    ['$H', Yl],\n    ['$W', Kl],\n    ['$M', Vl],\n    ['$y', Ql],\n    ['$D', zl],\n  ].forEach((e) => {\n    hh[e[1]] = function (t) {\n      return this.$g(t, e[0], e[1]);\n    };\n  }),\n  (ch.extend = (e, t) => (e.$i || (e(t, lh, ch), (e.$i = !0)), ch)),\n  (ch.locale = oh),\n  (ch.isDayjs = ah),\n  (ch.unix = (e) => ch(1e3 * e)),\n  (ch.en = sh[ih]),\n  (ch.Ls = sh),\n  (ch.p = {}));\nvar fh = Sr(function (e) {\n    function r(e) {\n      return (e && ((e = e.toString().replace(n.pluses, '%20')), (e = decodeURIComponent(e))), e);\n    }\n    function i(e) {\n      var t,\n        i,\n        s,\n        a,\n        o,\n        c,\n        u,\n        l = [];\n      if (null != e && '' !== e)\n        for (\n          u = (i = (e = (t = 0) === e.indexOf('?') ? e.substring(1) : e).toString().split(n.query_separator)).length;\n          t < u;\n          t++\n        )\n          0 !== (a = (s = i[t]).indexOf('=')) &&\n            ((o = r(s.substring(0, a))), (c = r(s.substring(a + 1))), l.push(-1 === a ? [s, null] : [o, c]));\n      return l;\n    }\n    function s(e) {\n      ((this.uriParts = (function (e) {\n        var t = n.uri_parser.exec(e || ''),\n          r = {};\n        return (\n          [\n            'source',\n            'protocol',\n            'authority',\n            'userInfo',\n            'user',\n            'password',\n            'host',\n            'port',\n            'isColonUri',\n            'relative',\n            'path',\n            'directory',\n            'file',\n            'query',\n            'anchor',\n          ].forEach(function (e, n) {\n            r[e] = t[n] || '';\n          }),\n          r\n        );\n      })(e)),\n        (this.queryPairs = i(this.uriParts.query)),\n        (this.hasAuthorityPrefixUserPref = null));\n    }\n    var n = {\n      starts_with_slashes: /^\\/+/,\n      ends_with_slashes: /\\/+$/,\n      pluses: /\\+/g,\n      query_separator: /[&;]/,\n      uri_parser:\n        /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@\\/]*)(?::([^:@\\/]*))?)?@)?(\\[[0-9a-fA-F:.]+\\]|[^:\\/?#]*)(?::(\\d+|(?=:)))?(:)?)((((?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/,\n    };\n    (Array.prototype.forEach ||\n      (Array.prototype.forEach = function (e, t) {\n        var n, r;\n        if (null == this) throw new TypeError(' this is null or not defined');\n        var a,\n          i = Object(this),\n          s = i.length >>> 0;\n        if ('function' != typeof e) throw new TypeError(e + ' is not a function');\n        for (1 < arguments.length && (n = t), r = 0; r < s; ) (r in i && ((a = i[r]), e.call(n, a, r, i)), r++);\n      }),\n      ['protocol', 'userInfo', 'host', 'port', 'path', 'anchor'].forEach(function (e) {\n        s.prototype[e] = function (t) {\n          return (void 0 !== t && (this.uriParts[e] = t), this.uriParts[e]);\n        };\n      }),\n      (s.prototype.hasAuthorityPrefix = function (e) {\n        return (\n          void 0 !== e && (this.hasAuthorityPrefixUserPref = e),\n          null === this.hasAuthorityPrefixUserPref\n            ? -1 !== this.uriParts.source.indexOf('//')\n            : this.hasAuthorityPrefixUserPref\n        );\n      }),\n      (s.prototype.isColonUri = function (e) {\n        if (void 0 === e) return !!this.uriParts.isColonUri;\n        this.uriParts.isColonUri = !!e;\n      }),\n      (s.prototype.query = function (e, t) {\n        var n,\n          r,\n          s,\n          a = '',\n          o = void 0 === t || t;\n        for (void 0 !== e && (this.queryPairs = i(e)), n = 0, s = this.queryPairs.length; n < s; n++)\n          ((r = this.queryPairs[n]),\n            0 < a.length && (a += '&'),\n            null === r[1]\n              ? (a += r[0])\n              : ((a = a + r[0] + '='), void 0 !== r[1] && (a += o ? encodeURIComponent(r[1]) : r[1])));\n        return 0 < a.length ? '?' + a : a;\n      }),\n      (s.prototype.getQueryParamValue = function (e) {\n        for (var t, n = 0, r = this.queryPairs.length; n < r; n++) if (e === (t = this.queryPairs[n])[0]) return t[1];\n      }),\n      (s.prototype.getQueryParamValues = function (e) {\n        for (var n, i = [], t = 0, r = this.queryPairs.length; t < r; t++)\n          e === (n = this.queryPairs[t])[0] && i.push(n[1]);\n        return i;\n      }),\n      (s.prototype.deleteQueryParam = function (e, t) {\n        for (var i, s, a, c = [], n = 0, o = this.queryPairs.length; n < o; n++)\n          ((s = r((i = this.queryPairs[n])[0]) === r(e)),\n            (a = i[1] === t),\n            ((1 !== arguments.length || s) && (2 !== arguments.length || (s && a))) || c.push(i));\n        return ((this.queryPairs = c), this);\n      }),\n      (s.prototype.addQueryParam = function (e, t, n) {\n        return (\n          3 === arguments.length && -1 !== n\n            ? ((n = Math.min(n, this.queryPairs.length)), this.queryPairs.splice(n, 0, [e, t]))\n            : 0 < arguments.length && this.queryPairs.push([e, t]),\n          this\n        );\n      }),\n      (s.prototype.hasQueryParam = function (e) {\n        for (var n = this.queryPairs.length, t = 0; t < n; t++) if (this.queryPairs[t][0] == e) return !0;\n        return !1;\n      }),\n      (s.prototype.replaceQueryParam = function (e, t, n) {\n        var i,\n          s,\n          a = -1,\n          o = this.queryPairs.length;\n        if (3 === arguments.length) {\n          for (i = 0; i < o; i++)\n            if (r((s = this.queryPairs[i])[0]) === r(e) && decodeURIComponent(s[1]) === r(n)) {\n              a = i;\n              break;\n            }\n          0 <= a && this.deleteQueryParam(e, r(n)).addQueryParam(e, t, a);\n        } else {\n          for (i = 0; i < o; i++)\n            if (r((s = this.queryPairs[i])[0]) === r(e)) {\n              a = i;\n              break;\n            }\n          (this.deleteQueryParam(e), this.addQueryParam(e, t, a));\n        }\n        return this;\n      }),\n      ['protocol', 'hasAuthorityPrefix', 'isColonUri', 'userInfo', 'host', 'port', 'path', 'query', 'anchor'].forEach(\n        function (e) {\n          var t = 'set' + e.charAt(0).toUpperCase() + e.slice(1);\n          s.prototype[t] = function (t) {\n            return (this[e](t), this);\n          };\n        },\n      ),\n      (s.prototype.scheme = function () {\n        var e = '';\n        return (\n          this.protocol()\n            ? ((e += this.protocol()),\n              this.protocol().indexOf(':') !== this.protocol().length - 1 && (e += ':'),\n              (e += '//'))\n            : this.hasAuthorityPrefix() && this.host() && (e += '//'),\n          e\n        );\n      }),\n      (s.prototype.origin = function () {\n        var e = this.scheme();\n        return (\n          this.userInfo() &&\n            this.host() &&\n            ((e += this.userInfo()), this.userInfo().indexOf('@') !== this.userInfo().length - 1) &&\n            (e += '@'),\n          this.host() &&\n            ((e += this.host()), this.port() || (this.path() && this.path().substr(0, 1).match(/[0-9]/))) &&\n            (e += ':' + this.port()),\n          e\n        );\n      }),\n      (s.prototype.addTrailingSlash = function () {\n        var e = this.path() || '';\n        return ('/' !== e.substr(-1) && this.path(e + '/'), this);\n      }),\n      (s.prototype.toString = function (e) {\n        var t,\n          r = this.origin();\n        return (\n          this.isColonUri()\n            ? this.path() && (r += ':' + this.path())\n            : this.path()\n              ? ((t = this.path()),\n                n.ends_with_slashes.test(r) || n.starts_with_slashes.test(t)\n                  ? (r && r.replace(n.ends_with_slashes, '/'), (t = t.replace(n.starts_with_slashes, '/')))\n                  : (r += '/'),\n                (r += t))\n              : this.host() && (this.query(void 0, e).toString() || this.anchor()) && (r += '/'),\n          this.query(void 0, e).toString() && (r += this.query(void 0, e).toString()),\n          this.anchor() && (0 !== this.anchor().indexOf('#') && (r += '#'), (r += this.anchor())),\n          r\n        );\n      }),\n      (s.prototype.clone = function () {\n        return new s(this.toString());\n      }),\n      (e.exports = s));\n  }),\n  ph = Sr(function (e, t) {\n    !function () {\n      var n,\n        r = 'Expected a function',\n        i = '__lodash_hash_undefined__',\n        s = '__lodash_placeholder__',\n        o = 32,\n        u = 128,\n        h = 1 / 0,\n        f = 9007199254740991,\n        p = NaN,\n        d = 4294967295,\n        m = [\n          ['ary', u],\n          ['bind', 1],\n          ['bindKey', 2],\n          ['curry', 8],\n          ['curryRight', 16],\n          ['flip', 512],\n          ['partial', o],\n          ['partialRight', 64],\n          ['rearg', 256],\n        ],\n        _ = '[object Arguments]',\n        E = '[object Array]',\n        T = '[object Boolean]',\n        A = '[object Date]',\n        g = '[object Error]',\n        v = '[object Function]',\n        y = '[object GeneratorFunction]',\n        S = '[object Map]',\n        C = '[object Number]',\n        N = '[object Object]',\n        b = '[object Promise]',\n        I = '[object RegExp]',\n        O = '[object Set]',\n        k = '[object String]',\n        L = '[object Symbol]',\n        D = '[object WeakMap]',\n        R = '[object ArrayBuffer]',\n        w = '[object DataView]',\n        x = '[object Float32Array]',\n        M = '[object Float64Array]',\n        P = '[object Int8Array]',\n        B = '[object Int16Array]',\n        F = '[object Int32Array]',\n        U = '[object Uint8Array]',\n        H = '[object Uint8ClampedArray]',\n        G = '[object Uint16Array]',\n        j = '[object Uint32Array]',\n        q = /\\b__p \\+= '';/g,\n        Y = /\\b(__p \\+=) '' \\+/g,\n        K = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g,\n        W = /&(?:amp|lt|gt|quot|#39);/g,\n        V = /[&<>\"']/g,\n        $ = RegExp(W.source),\n        Q = RegExp(V.source),\n        z = /<%-([\\s\\S]+?)%>/g,\n        X = /<%([\\s\\S]+?)%>/g,\n        Z = /<%=([\\s\\S]+?)%>/g,\n        J = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n        ee = /^\\w*$/,\n        te = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,\n        ne = /[\\\\^$.*+?()[\\]{}|]/g,\n        re = RegExp(ne.source),\n        ie = /^\\s+/,\n        se = /\\s/,\n        ae = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n        oe = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n        ce = /,? & /,\n        ue = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g,\n        le = /[()=,{}\\[\\]\\/\\s]/,\n        he = /\\\\(\\\\)?/g,\n        fe = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g,\n        pe = /\\w*$/,\n        de = /^[-+]0x[0-9a-f]+$/i,\n        me = /^0b[01]+$/i,\n        _e = /^\\[object .+?Constructor\\]$/,\n        Ee = /^0o[0-7]+$/i,\n        Te = /^(?:0|[1-9]\\d*)$/,\n        Ae = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g,\n        ge = /($^)/,\n        ve = /['\\n\\r\\u2028\\u2029\\\\]/g,\n        ye = '\\\\ud800-\\\\udfff',\n        Se = '\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff',\n        Ce = '\\\\u2700-\\\\u27bf',\n        be = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n        Ie = '\\\\ufe0e\\\\ufe0f',\n        Le = '[' + ye + ']',\n        De =\n          '[' +\n          (Oe =\n            '\\\\xac\\\\xb1\\\\xd7\\\\xf7\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\\\\u2000-\\\\u206f \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000') +\n          ']',\n        Re = '[' + Se + ']',\n        xe = '[' + Ce + ']',\n        Me = '[' + (Ne = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff') + ']',\n        He = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n        je = '\\\\u200d',\n        qe = '(?:' + Me + '|' + (Oe = '[^' + ye + Oe + '\\\\d+' + Ce + Ne + be + ']') + ')',\n        Oe = '(?:' + (be = '[' + be + ']') + '|' + Oe + ')',\n        Ke = \"(?:['’](?:d|ll|m|re|s|t|ve))?\",\n        We = \"(?:['’](?:D|LL|M|RE|S|T|VE))?\",\n        $e =\n          ($e = '[' + Ie + ']?') +\n          (Ve = '(?:' + Re + '|' + (Ce = '\\\\ud83c[\\\\udffb-\\\\udfff]') + ')?') +\n          '(?:' +\n          je +\n          '(?:' +\n          [(Ne = '[^' + ye + ']'), (Ue = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}'), He].join('|') +\n          ')' +\n          $e +\n          Ve +\n          ')*',\n        Ve = '(?:' + [xe, Ue, He].join('|') + ')' + $e,\n        xe = '(?:' + [Ne + Re + '?', Re, Ue, He, Le].join('|') + ')',\n        Ze = RegExp(\"['’]\", 'g'),\n        Je = RegExp(Re, 'g'),\n        et = RegExp(Ce + '(?=' + Ce + ')|' + xe + $e, 'g'),\n        tt = RegExp(\n          [\n            be + '?' + Me + '+' + Ke + '(?=' + [De, be, '$'].join('|') + ')',\n            Oe + '+' + We + '(?=' + [De, be + qe, '$'].join('|') + ')',\n            be + '?' + qe + '+' + Ke,\n            be + '+' + We,\n            '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n            '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n            '\\\\d+',\n            Ve,\n          ].join('|'),\n          'g',\n        ),\n        nt = RegExp('[' + je + ye + Se + Ie + ']'),\n        rt = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,\n        it = [\n          'Array',\n          'Buffer',\n          'DataView',\n          'Date',\n          'Error',\n          'Float32Array',\n          'Float64Array',\n          'Function',\n          'Int8Array',\n          'Int16Array',\n          'Int32Array',\n          'Map',\n          'Math',\n          'Object',\n          'Promise',\n          'RegExp',\n          'Set',\n          'String',\n          'Symbol',\n          'TypeError',\n          'Uint8Array',\n          'Uint8ClampedArray',\n          'Uint16Array',\n          'Uint32Array',\n          'WeakMap',\n          '_',\n          'clearTimeout',\n          'isFinite',\n          'parseInt',\n          'setTimeout',\n        ],\n        st = -1,\n        at = {},\n        ot =\n          ((at[x] = at[M] = at[P] = at[B] = at[F] = at[U] = at[H] = at[G] = at[j] = !0),\n          (at[_] =\n            at[E] =\n            at[R] =\n            at[T] =\n            at[w] =\n            at[A] =\n            at[g] =\n            at[v] =\n            at[S] =\n            at[C] =\n            at[N] =\n            at[I] =\n            at[O] =\n            at[k] =\n            at[D] =\n              !1),\n          {}),\n        ct =\n          ((ot[_] =\n            ot[E] =\n            ot[R] =\n            ot[w] =\n            ot[T] =\n            ot[A] =\n            ot[x] =\n            ot[M] =\n            ot[P] =\n            ot[B] =\n            ot[F] =\n            ot[S] =\n            ot[C] =\n            ot[N] =\n            ot[I] =\n            ot[O] =\n            ot[k] =\n            ot[L] =\n            ot[U] =\n            ot[H] =\n            ot[G] =\n            ot[j] =\n              !0),\n          (ot[g] = ot[v] = ot[D] = !1),\n          { '\\\\': '\\\\', \"'\": \"'\", '\\n': 'n', '\\r': 'r', '\\u2028': 'u2028', '\\u2029': 'u2029' }),\n        ut = parseFloat,\n        lt = parseInt,\n        Ne = 'object' == typeof gr && gr && gr.Object === Object && gr,\n        Ue = 'object' == typeof self && self && self.Object === Object && self,\n        pt = Ne || Ue || Function('return this')(),\n        mt = (He = t && !t.nodeType && t) && e && !e.nodeType && e,\n        _t = mt && mt.exports === He,\n        Et = _t && Ne.process,\n        At =\n          (Le = (function () {\n            try {\n              return (mt && mt.require && mt.require('util').types) || (Et && Et.binding && Et.binding('util'));\n            } catch (e) {}\n          })()) && Le.isArrayBuffer,\n        gt = Le && Le.isDate,\n        vt = Le && Le.isMap,\n        yt = Le && Le.isRegExp,\n        St = Le && Le.isSet,\n        Ct = Le && Le.isTypedArray;\n      function Nt(e, t, n) {\n        switch (n.length) {\n          case 0:\n            return e.call(t);\n          case 1:\n            return e.call(t, n[0]);\n          case 2:\n            return e.call(t, n[0], n[1]);\n          case 3:\n            return e.call(t, n[0], n[1], n[2]);\n        }\n        return e.apply(t, n);\n      }\n      function bt(e, t, n, r) {\n        for (var i = -1, s = null == e ? 0 : e.length; ++i < s; ) {\n          var a = e[i];\n          t(r, a, n(a), e);\n        }\n        return r;\n      }\n      function It(e, t) {\n        for (var n = -1, r = null == e ? 0 : e.length; ++n < r && !1 !== t(e[n], n, e); );\n        return e;\n      }\n      function kt(e, t) {\n        for (var n = -1, r = null == e ? 0 : e.length; ++n < r; ) if (!t(e[n], n, e)) return !1;\n        return !0;\n      }\n      function Lt(e, t) {\n        for (var n = -1, r = null == e ? 0 : e.length, i = 0, s = []; ++n < r; ) {\n          var a = e[n];\n          t(a, n, e) && (s[i++] = a);\n        }\n        return s;\n      }\n      function Dt(e, t) {\n        return !(null == e || !e.length) && -1 < Gt(e, t, 0);\n      }\n      function Rt(e, t, n) {\n        for (var r = -1, i = null == e ? 0 : e.length; ++r < i; ) if (n(t, e[r])) return !0;\n        return !1;\n      }\n      function wt(e, t) {\n        for (var n = -1, r = null == e ? 0 : e.length, i = Array(r); ++n < r; ) i[n] = t(e[n], n, e);\n        return i;\n      }\n      function xt(e, t) {\n        for (var n = -1, r = t.length, i = e.length; ++n < r; ) e[i + n] = t[n];\n        return e;\n      }\n      function Mt(e, t, n, r) {\n        var i = -1,\n          s = null == e ? 0 : e.length;\n        for (r && s && (n = e[++i]); ++i < s; ) n = t(n, e[i], i, e);\n        return n;\n      }\n      function Pt(e, t, n, r) {\n        var i = null == e ? 0 : e.length;\n        for (r && i && (n = e[--i]); i--; ) n = t(n, e[i], i, e);\n        return n;\n      }\n      function Bt(e, t) {\n        for (var n = -1, r = null == e ? 0 : e.length; ++n < r; ) if (t(e[n], n, e)) return !0;\n        return !1;\n      }\n      var Ft = Kt('length');\n      function Ut(e, t, n) {\n        var r;\n        return (\n          n(e, function (e, n, i) {\n            if (t(e, n, i)) return ((r = n), !1);\n          }),\n          r\n        );\n      }\n      function Ht(e, t, n, r) {\n        for (var i = e.length, s = n + (r ? 1 : -1); r ? s-- : ++s < i; ) if (t(e[s], s, e)) return s;\n        return -1;\n      }\n      function Gt(e, t, n) {\n        return t == t\n          ? (function (e, t, n) {\n              for (var r = n - 1, i = e.length; ++r < i; ) if (e[r] === t) return r;\n              return -1;\n            })(e, t, n)\n          : Ht(e, qt, n);\n      }\n      function jt(e, t, n, r) {\n        for (var i = n - 1, s = e.length; ++i < s; ) if (r(e[i], t)) return i;\n        return -1;\n      }\n      function qt(e) {\n        return e != e;\n      }\n      function Yt(e, t) {\n        var n = null == e ? 0 : e.length;\n        return n ? $t(e, t) / n : p;\n      }\n      function Kt(e) {\n        return function (t) {\n          return null == t ? n : t[e];\n        };\n      }\n      function Wt(e) {\n        return function (t) {\n          return null == e ? n : e[t];\n        };\n      }\n      function Vt(e, t, n, r, i) {\n        return (\n          i(e, function (e, i, s) {\n            n = r ? ((r = !1), e) : t(n, e, i, s);\n          }),\n          n\n        );\n      }\n      function $t(e, t) {\n        for (var r, i = -1, s = e.length; ++i < s; ) {\n          var a = t(e[i]);\n          a !== n && (r = r === n ? a : r + a);\n        }\n        return r;\n      }\n      function Qt(e, t) {\n        for (var n = -1, r = Array(e); ++n < e; ) r[n] = t(n);\n        return r;\n      }\n      function zt(e) {\n        return e && e.slice(0, dn(e) + 1).replace(ie, '');\n      }\n      function Xt(e) {\n        return function (t) {\n          return e(t);\n        };\n      }\n      function Zt(e, t) {\n        return wt(t, function (t) {\n          return e[t];\n        });\n      }\n      function Jt(e, t) {\n        return e.has(t);\n      }\n      function en(e, t) {\n        for (var n = -1, r = e.length; ++n < r && -1 < Gt(t, e[n], 0); );\n        return n;\n      }\n      function tn(e, t) {\n        for (var n = e.length; n-- && -1 < Gt(t, e[n], 0); );\n        return n;\n      }\n      var nn = Wt({\n          À: 'A',\n          Á: 'A',\n          Â: 'A',\n          Ã: 'A',\n          Ä: 'A',\n          Å: 'A',\n          à: 'a',\n          á: 'a',\n          â: 'a',\n          ã: 'a',\n          ä: 'a',\n          å: 'a',\n          Ç: 'C',\n          ç: 'c',\n          Ð: 'D',\n          ð: 'd',\n          È: 'E',\n          É: 'E',\n          Ê: 'E',\n          Ë: 'E',\n          è: 'e',\n          é: 'e',\n          ê: 'e',\n          ë: 'e',\n          Ì: 'I',\n          Í: 'I',\n          Î: 'I',\n          Ï: 'I',\n          ì: 'i',\n          í: 'i',\n          î: 'i',\n          ï: 'i',\n          Ñ: 'N',\n          ñ: 'n',\n          Ò: 'O',\n          Ó: 'O',\n          Ô: 'O',\n          Õ: 'O',\n          Ö: 'O',\n          Ø: 'O',\n          ò: 'o',\n          ó: 'o',\n          ô: 'o',\n          õ: 'o',\n          ö: 'o',\n          ø: 'o',\n          Ù: 'U',\n          Ú: 'U',\n          Û: 'U',\n          Ü: 'U',\n          ù: 'u',\n          ú: 'u',\n          û: 'u',\n          ü: 'u',\n          Ý: 'Y',\n          ý: 'y',\n          ÿ: 'y',\n          Æ: 'Ae',\n          æ: 'ae',\n          Þ: 'Th',\n          þ: 'th',\n          ß: 'ss',\n          Ā: 'A',\n          Ă: 'A',\n          Ą: 'A',\n          ā: 'a',\n          ă: 'a',\n          ą: 'a',\n          Ć: 'C',\n          Ĉ: 'C',\n          Ċ: 'C',\n          Č: 'C',\n          ć: 'c',\n          ĉ: 'c',\n          ċ: 'c',\n          č: 'c',\n          Ď: 'D',\n          Đ: 'D',\n          ď: 'd',\n          đ: 'd',\n          Ē: 'E',\n          Ĕ: 'E',\n          Ė: 'E',\n          Ę: 'E',\n          Ě: 'E',\n          ē: 'e',\n          ĕ: 'e',\n          ė: 'e',\n          ę: 'e',\n          ě: 'e',\n          Ĝ: 'G',\n          Ğ: 'G',\n          Ġ: 'G',\n          Ģ: 'G',\n          ĝ: 'g',\n          ğ: 'g',\n          ġ: 'g',\n          ģ: 'g',\n          Ĥ: 'H',\n          Ħ: 'H',\n          ĥ: 'h',\n          ħ: 'h',\n          Ĩ: 'I',\n          Ī: 'I',\n          Ĭ: 'I',\n          Į: 'I',\n          İ: 'I',\n          ĩ: 'i',\n          ī: 'i',\n          ĭ: 'i',\n          į: 'i',\n          ı: 'i',\n          Ĵ: 'J',\n          ĵ: 'j',\n          Ķ: 'K',\n          ķ: 'k',\n          ĸ: 'k',\n          Ĺ: 'L',\n          Ļ: 'L',\n          Ľ: 'L',\n          Ŀ: 'L',\n          Ł: 'L',\n          ĺ: 'l',\n          ļ: 'l',\n          ľ: 'l',\n          ŀ: 'l',\n          ł: 'l',\n          Ń: 'N',\n          Ņ: 'N',\n          Ň: 'N',\n          Ŋ: 'N',\n          ń: 'n',\n          ņ: 'n',\n          ň: 'n',\n          ŋ: 'n',\n          Ō: 'O',\n          Ŏ: 'O',\n          Ő: 'O',\n          ō: 'o',\n          ŏ: 'o',\n          ő: 'o',\n          Ŕ: 'R',\n          Ŗ: 'R',\n          Ř: 'R',\n          ŕ: 'r',\n          ŗ: 'r',\n          ř: 'r',\n          Ś: 'S',\n          Ŝ: 'S',\n          Ş: 'S',\n          Š: 'S',\n          ś: 's',\n          ŝ: 's',\n          ş: 's',\n          š: 's',\n          Ţ: 'T',\n          Ť: 'T',\n          Ŧ: 'T',\n          ţ: 't',\n          ť: 't',\n          ŧ: 't',\n          Ũ: 'U',\n          Ū: 'U',\n          Ŭ: 'U',\n          Ů: 'U',\n          Ű: 'U',\n          Ų: 'U',\n          ũ: 'u',\n          ū: 'u',\n          ŭ: 'u',\n          ů: 'u',\n          ű: 'u',\n          ų: 'u',\n          Ŵ: 'W',\n          ŵ: 'w',\n          Ŷ: 'Y',\n          ŷ: 'y',\n          Ÿ: 'Y',\n          Ź: 'Z',\n          Ż: 'Z',\n          Ž: 'Z',\n          ź: 'z',\n          ż: 'z',\n          ž: 'z',\n          Ĳ: 'IJ',\n          ĳ: 'ij',\n          Œ: 'Oe',\n          œ: 'oe',\n          ŉ: \"'n\",\n          ſ: 's',\n        }),\n        rn = Wt({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' });\n      function sn(e) {\n        return '\\\\' + ct[e];\n      }\n      function an(e) {\n        return nt.test(e);\n      }\n      function on(e) {\n        var t = -1,\n          n = Array(e.size);\n        return (\n          e.forEach(function (e, r) {\n            n[++t] = [r, e];\n          }),\n          n\n        );\n      }\n      function cn(e, t) {\n        return function (n) {\n          return e(t(n));\n        };\n      }\n      function un(e, t) {\n        for (var n = -1, r = e.length, i = 0, a = []; ++n < r; ) {\n          var o = e[n];\n          (o !== t && o !== s) || ((e[n] = s), (a[i++] = n));\n        }\n        return a;\n      }\n      function ln(e) {\n        var t = -1,\n          n = Array(e.size);\n        return (\n          e.forEach(function (e) {\n            n[++t] = e;\n          }),\n          n\n        );\n      }\n      function fn(e) {\n        return (\n          an(e)\n            ? function (e) {\n                for (var t = (et.lastIndex = 0); et.test(e); ) ++t;\n                return t;\n              }\n            : Ft\n        )(e);\n      }\n      function pn(e) {\n        return an(e)\n          ? (function (e) {\n              return e.match(et) || [];\n            })(e)\n          : e.split('');\n      }\n      function dn(e) {\n        for (var t = e.length; t-- && se.test(e.charAt(t)); );\n        return t;\n      }\n      var mn = Wt({ '&amp;': '&', '&lt;': '<', '&gt;': '>', '&quot;': '\"', '&#39;': \"'\" }),\n        _n = (function e(t) {\n          var ye = (t = null == t ? pt : _n.defaults(pt.Object(), t, _n.pick(pt, it))).Array,\n            Se = t.Date,\n            Ce = t.Error,\n            Ne = t.Function,\n            be = t.Math,\n            Ie = t.Object,\n            Oe = t.RegExp,\n            ke = t.String,\n            Le = t.TypeError,\n            De = ye.prototype,\n            Re = Ne.prototype,\n            we = Ie.prototype,\n            xe = t['__core-js_shared__'],\n            Me = Re.toString,\n            Pe = we.hasOwnProperty,\n            Be = 0,\n            Fe = (Re = /[^.]+$/.exec((xe && xe.keys && xe.keys.IE_PROTO) || '')) ? 'Symbol(src)_1.' + Re : '',\n            Ue = we.toString,\n            He = Me.call(Ie),\n            Ge = pt._,\n            je = Oe(\n              '^' +\n                Me.call(Pe)\n                  .replace(ne, '\\\\$&')\n                  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') +\n                '$',\n            ),\n            Re = _t ? t.Buffer : n,\n            Ye = t.Symbol,\n            Ke = t.Uint8Array,\n            We = Re ? Re.allocUnsafe : n,\n            Ve = cn(Ie.getPrototypeOf, Ie),\n            $e = Ie.create,\n            Qe = we.propertyIsEnumerable,\n            ze = De.splice,\n            Xe = Ye ? Ye.isConcatSpreadable : n,\n            et = Ye ? Ye.iterator : n,\n            nt = Ye ? Ye.toStringTag : n,\n            ct = (function () {\n              try {\n                var e = fs(Ie, 'defineProperty');\n                return (e({}, '', {}), e);\n              } catch (e) {}\n            })(),\n            ht = t.clearTimeout !== pt.clearTimeout && t.clearTimeout,\n            ft = Se && Se.now !== pt.Date.now && Se.now,\n            dt = t.setTimeout !== pt.setTimeout && t.setTimeout,\n            mt = be.ceil,\n            Et = be.floor,\n            Tt = Ie.getOwnPropertySymbols,\n            Re = Re ? Re.isBuffer : n,\n            Wt = t.isFinite,\n            En = De.join,\n            Tn = cn(Ie.keys, Ie),\n            An = be.max,\n            gn = be.min,\n            vn = Se.now,\n            yn = t.parseInt,\n            Sn = be.random,\n            Cn = De.reverse,\n            Se = fs(t, 'DataView'),\n            bn = fs(t, 'Map'),\n            In = fs(t, 'Promise'),\n            On = fs(t, 'Set'),\n            t = fs(t, 'WeakMap'),\n            Ln = fs(Ie, 'create'),\n            Dn = t && new t(),\n            Rn = {},\n            wn = Fs(Se),\n            xn = Fs(bn),\n            Mn = Fs(In),\n            Pn = Fs(On),\n            Bn = Fs(t),\n            Un = (Ye = Ye ? Ye.prototype : n) ? Ye.valueOf : n,\n            Hn = Ye ? Ye.toString : n;\n          function Gn(e) {\n            if (to(e) && !Ya(e) && !(e instanceof Kn)) {\n              if (e instanceof Yn) return e;\n              if (Pe.call(e, '__wrapped__')) return Us(e);\n            }\n            return new Yn(e);\n          }\n          var jn = (function () {\n            function e() {}\n            return function (t) {\n              return eo(t) ? ($e ? $e(t) : ((e.prototype = t), (t = new e()), (e.prototype = n), t)) : {};\n            };\n          })();\n          function qn() {}\n          function Yn(e, t) {\n            ((this.__wrapped__ = e),\n              (this.__actions__ = []),\n              (this.__chain__ = !!t),\n              (this.__index__ = 0),\n              (this.__values__ = n));\n          }\n          function Kn(e) {\n            ((this.__wrapped__ = e),\n              (this.__actions__ = []),\n              (this.__dir__ = 1),\n              (this.__filtered__ = !1),\n              (this.__iteratees__ = []),\n              (this.__takeCount__ = d),\n              (this.__views__ = []));\n          }\n          function Wn(e) {\n            var t = -1,\n              n = null == e ? 0 : e.length;\n            for (this.clear(); ++t < n; ) {\n              var r = e[t];\n              this.set(r[0], r[1]);\n            }\n          }\n          function Vn(e) {\n            var t = -1,\n              n = null == e ? 0 : e.length;\n            for (this.clear(); ++t < n; ) {\n              var r = e[t];\n              this.set(r[0], r[1]);\n            }\n          }\n          function $n(e) {\n            var t = -1,\n              n = null == e ? 0 : e.length;\n            for (this.clear(); ++t < n; ) {\n              var r = e[t];\n              this.set(r[0], r[1]);\n            }\n          }\n          function Qn(e) {\n            var t = -1,\n              n = null == e ? 0 : e.length;\n            for (this.__data__ = new $n(); ++t < n; ) this.add(e[t]);\n          }\n          function zn(e) {\n            ((e = this.__data__ = new Vn(e)), (this.size = e.size));\n          }\n          function Xn(e, t) {\n            var u,\n              n = Ya(e),\n              r = !n && qa(e),\n              i = !n && !r && $a(e),\n              s = !n && !r && !i && uo(e),\n              a = n || r || i || s,\n              o = a ? Qt(e.length, ke) : [],\n              c = o.length;\n            for (u in e)\n              (!t && !Pe.call(e, u)) ||\n                (a &&\n                  ('length' == u ||\n                    (i && ('offset' == u || 'parent' == u)) ||\n                    (s && ('buffer' == u || 'byteLength' == u || 'byteOffset' == u)) ||\n                    As(u, c))) ||\n                o.push(u);\n            return o;\n          }\n          function Zn(e) {\n            var t = e.length;\n            return t ? e[Qr(0, t - 1)] : n;\n          }\n          function tr(e, t, r) {\n            ((r === n || Ha(e[t], r)) && (r !== n || t in e)) || ar(e, t, r);\n          }\n          function nr(e, t, r) {\n            var i = e[t];\n            (Pe.call(e, t) && Ha(i, r) && (r !== n || t in e)) || ar(e, t, r);\n          }\n          function rr(e, t) {\n            for (var n = e.length; n--; ) if (Ha(e[n][0], t)) return n;\n            return -1;\n          }\n          function ir(e, t, n, r) {\n            return (\n              pr(e, function (e, i, s) {\n                t(r, e, n(e), s);\n              }),\n              r\n            );\n          }\n          function sr(e, t) {\n            return e && Di(t, Ro(t), e);\n          }\n          function ar(e, t, n) {\n            '__proto__' == t && ct\n              ? ct(e, t, { configurable: !0, enumerable: !0, value: n, writable: !0 })\n              : (e[t] = n);\n          }\n          function or(e, t) {\n            for (var r = -1, i = t.length, s = ye(i), a = null == e; ++r < i; ) s[r] = a ? n : Io(e, t[r]);\n            return s;\n          }\n          function cr(e, t, r) {\n            return e != e || (r !== n && (e = e <= r ? e : r), t === n) || t <= e ? e : t;\n          }\n          function ur(e, t, r, i, s, a) {\n            var o,\n              c = 1 & t,\n              u = 2 & t,\n              l = 4 & t;\n            if ((o = r ? (s ? r(e, i, s, a) : r(e)) : o) === n) {\n              if (!eo(e)) return e;\n              if ((i = Ya(e))) {\n                if (\n                  ((o = (function (e) {\n                    var t = e.length,\n                      n = new e.constructor(t);\n                    return (\n                      t && 'string' == typeof e[0] && Pe.call(e, 'index') && ((n.index = e.index), (n.input = e.input)),\n                      n\n                    );\n                  })(e)),\n                  !c)\n                )\n                  return Li(e, o);\n              } else {\n                var f = ms(e),\n                  p = f == v || f == y;\n                if ($a(e)) return Ci(e, c);\n                if (f == N || f == _ || (p && !s)) {\n                  if (((o = u || p ? {} : Es(e)), !c))\n                    return u\n                      ? (function (e, t) {\n                          return Di(e, ds(e), t);\n                        })(\n                          e,\n                          (function (e, t) {\n                            return e && Di(t, wo(t), e);\n                          })(o, e),\n                        )\n                      : (function (e, t) {\n                          return Di(e, ps(e), t);\n                        })(e, sr(o, e));\n                } else {\n                  if (!ot[f]) return s ? e : {};\n                  o = (function (e, n) {\n                    var r = e.constructor;\n                    switch (f) {\n                      case R:\n                        return Ni(e);\n                      case T:\n                      case A:\n                        return new r(+e);\n                      case w:\n                        return (function (e, t) {\n                          return ((t = n ? Ni(e.buffer) : e.buffer), new e.constructor(t, e.byteOffset, e.byteLength));\n                        })(e);\n                      case x:\n                      case M:\n                      case P:\n                      case B:\n                      case F:\n                      case U:\n                      case H:\n                      case G:\n                      case j:\n                        return bi(e, n);\n                      case S:\n                        return new r();\n                      case C:\n                      case k:\n                        return new r(e);\n                      case I:\n                        return (function (e) {\n                          var t = new e.constructor(e.source, pe.exec(e));\n                          return ((t.lastIndex = e.lastIndex), t);\n                        })(e);\n                      case O:\n                        return new r();\n                      case L:\n                        return Un ? Ie(Un.call(e)) : {};\n                    }\n                  })(e, c);\n                }\n              }\n              if ((p = (a = a || new zn()).get(e))) return p;\n              (a.set(e, o),\n                ao(e)\n                  ? e.forEach(function (n) {\n                      o.add(ur(n, t, r, n, e, a));\n                    })\n                  : no(e) &&\n                    e.forEach(function (n, i) {\n                      o.set(i, ur(n, t, r, i, e, a));\n                    }));\n              var m = i ? n : (l ? (u ? ss : is) : u ? wo : Ro)(e);\n              It(m || e, function (n, i) {\n                (m && (n = e[(i = n)]), nr(o, i, ur(n, t, r, i, e, a)));\n              });\n            }\n            return o;\n          }\n          function lr(e, t, r) {\n            var i = r.length;\n            if (null == e) return !i;\n            for (e = Ie(e); i--; ) {\n              var s = r[i],\n                a = t[s],\n                o = e[s];\n              if ((o === n && !(s in e)) || !a(o)) return !1;\n            }\n            return !0;\n          }\n          function hr(e, t, i) {\n            if ('function' != typeof e) throw new Le(r);\n            return Ds(function () {\n              e.apply(n, i);\n            }, t);\n          }\n          function fr(e, t, n, r) {\n            var i = -1,\n              s = Dt,\n              a = !0,\n              o = e.length,\n              c = [],\n              u = t.length;\n            if (o) {\n              (n && (t = wt(t, Xt(n))),\n                r ? ((s = Rt), (a = !1)) : 200 <= t.length && ((s = Jt), (a = !1), (t = new Qn(t))));\n              e: for (; ++i < o; ) {\n                var l = e[i],\n                  h = null == n ? l : n(l),\n                  l = r || 0 !== l ? l : 0;\n                if (a && h == h) {\n                  for (var f = u; f--; ) if (t[f] === h) continue e;\n                  c.push(l);\n                } else s(t, h, r) || c.push(l);\n              }\n            }\n            return c;\n          }\n          ((Gn.templateSettings = { escape: z, evaluate: X, interpolate: Z, variable: '', imports: { _: Gn } }),\n            ((Gn.prototype = qn.prototype).constructor = Gn),\n            ((Yn.prototype = jn(qn.prototype)).constructor = Yn),\n            ((Kn.prototype = jn(qn.prototype)).constructor = Kn),\n            (Wn.prototype.clear = function () {\n              ((this.__data__ = Ln ? Ln(null) : {}), (this.size = 0));\n            }),\n            (Wn.prototype.delete = function (e) {\n              return ((e = this.has(e) && delete this.__data__[e]), (this.size -= e ? 1 : 0), e);\n            }),\n            (Wn.prototype.get = function (e) {\n              var r,\n                t = this.__data__;\n              return Ln ? ((r = t[e]) === i ? n : r) : Pe.call(t, e) ? t[e] : n;\n            }),\n            (Wn.prototype.has = function (e) {\n              var t = this.__data__;\n              return Ln ? t[e] !== n : Pe.call(t, e);\n            }),\n            (Wn.prototype.set = function (e, t) {\n              var r = this.__data__;\n              return ((this.size += this.has(e) ? 0 : 1), (r[e] = Ln && t === n ? i : t), this);\n            }),\n            (Vn.prototype.clear = function () {\n              ((this.__data__ = []), (this.size = 0));\n            }),\n            (Vn.prototype.delete = function (e) {\n              var t = this.__data__;\n              return !((e = rr(t, e)) < 0 || (e == t.length - 1 ? t.pop() : ze.call(t, e, 1), --this.size, 0));\n            }),\n            (Vn.prototype.get = function (e) {\n              var t = this.__data__;\n              return (e = rr(t, e)) < 0 ? n : t[e][1];\n            }),\n            (Vn.prototype.has = function (e) {\n              return -1 < rr(this.__data__, e);\n            }),\n            (Vn.prototype.set = function (e, t) {\n              var n = this.__data__,\n                r = rr(n, e);\n              return (r < 0 ? (++this.size, n.push([e, t])) : (n[r][1] = t), this);\n            }),\n            ($n.prototype.clear = function () {\n              ((this.size = 0), (this.__data__ = { hash: new Wn(), map: new (bn || Vn)(), string: new Wn() }));\n            }),\n            ($n.prototype.delete = function (e) {\n              return ((e = ls(this, e).delete(e)), (this.size -= e ? 1 : 0), e);\n            }),\n            ($n.prototype.get = function (e) {\n              return ls(this, e).get(e);\n            }),\n            ($n.prototype.has = function (e) {\n              return ls(this, e).has(e);\n            }),\n            ($n.prototype.set = function (e, t) {\n              var n = ls(this, e),\n                r = n.size;\n              return (n.set(e, t), (this.size += n.size == r ? 0 : 1), this);\n            }),\n            (Qn.prototype.add = Qn.prototype.push =\n              function (e) {\n                return (this.__data__.set(e, i), this);\n              }),\n            (Qn.prototype.has = function (e) {\n              return this.__data__.has(e);\n            }),\n            (zn.prototype.clear = function () {\n              ((this.__data__ = new Vn()), (this.size = 0));\n            }),\n            (zn.prototype.delete = function (e) {\n              var t = this.__data__,\n                e = t.delete(e);\n              return ((this.size = t.size), e);\n            }),\n            (zn.prototype.get = function (e) {\n              return this.__data__.get(e);\n            }),\n            (zn.prototype.has = function (e) {\n              return this.__data__.has(e);\n            }),\n            (zn.prototype.set = function (e, t) {\n              var n = this.__data__;\n              if (n instanceof Vn) {\n                var r = n.__data__;\n                if (!bn || r.length < 199) return (r.push([e, t]), (this.size = ++n.size), this);\n                n = this.__data__ = new $n(r);\n              }\n              return (n.set(e, t), (this.size = n.size), this);\n            }));\n          var pr = xi(vr),\n            dr = xi(yr, !0);\n          function _r(e, t, r) {\n            for (var i = -1, s = e.length; ++i < s; ) {\n              var c,\n                u,\n                a = e[i],\n                o = t(a);\n              null != o && (c === n ? o == o && !co(o) : r(o, c)) && ((c = o), (u = a));\n            }\n            return u;\n          }\n          function Er(e, t) {\n            var n = [];\n            return (\n              pr(e, function (e, r, i) {\n                t(e, r, i) && n.push(e);\n              }),\n              n\n            );\n          }\n          function Tr(e, t, n, r, i) {\n            var s = -1,\n              a = e.length;\n            for (n = n || Ts, i = i || []; ++s < a; ) {\n              var o = e[s];\n              0 < t && n(o) ? (1 < t ? Tr(o, t - 1, n, r, i) : xt(i, o)) : r || (i[i.length] = o);\n            }\n            return i;\n          }\n          var Ar = Mi(),\n            gr = Mi(!0);\n          function vr(e, t) {\n            return e && Ar(e, t, Ro);\n          }\n          function yr(e, t) {\n            return e && gr(e, t, Ro);\n          }\n          function Sr(e, t) {\n            return Lt(t, function (t) {\n              return Xa(e[t]);\n            });\n          }\n          function Cr(e, t) {\n            for (var r = 0, i = (t = gi(t, e)).length; null != e && r < i; ) e = e[Bs(t[r++])];\n            return r && r == i ? e : n;\n          }\n          function Nr(e, t, n) {\n            return ((t = t(e)), Ya(e) ? t : xt(t, n(e)));\n          }\n          function br(e) {\n            return null == e\n              ? e === n\n                ? '[object Undefined]'\n                : '[object Null]'\n              : (nt && nt in Ie(e)\n                  ? function (e) {\n                      var t = Pe.call(e, nt),\n                        r = e[nt];\n                      try {\n                        e[nt] = n;\n                        var i = !0;\n                      } catch (e) {}\n                      var s = Ue.call(e);\n                      return (i && (t ? (e[nt] = r) : delete e[nt]), s);\n                    }\n                  : function (e) {\n                      return Ue.call(e);\n                    })(e);\n          }\n          function Ir(e, t) {\n            return t < e;\n          }\n          function Or(e, t) {\n            return null != e && Pe.call(e, t);\n          }\n          function kr(e, t) {\n            return null != e && t in Ie(e);\n          }\n          function Lr(e, t, r) {\n            for (var i = r ? Rt : Dt, s = e[0].length, a = e.length, o = a, c = ye(a), u = 1 / 0, l = []; o--; ) {\n              var h = e[o];\n              (o && t && (h = wt(h, Xt(t))),\n                (u = gn(h.length, u)),\n                (c[o] = !r && (t || (120 <= s && 120 <= h.length)) ? new Qn(o && h) : n));\n            }\n            var h = e[0],\n              f = -1,\n              p = c[0];\n            e: for (; ++f < s && l.length < u; ) {\n              var d = h[f],\n                m = t ? t(d) : d,\n                d = r || 0 !== d ? d : 0;\n              if (!(p ? Jt(p, m) : i(l, m, r))) {\n                for (o = a; --o; ) {\n                  var _ = c[o];\n                  if (!(_ ? Jt(_, m) : i(e[o], m, r))) continue e;\n                }\n                (p && p.push(m), l.push(d));\n              }\n            }\n            return l;\n          }\n          function Dr(e, t, r) {\n            return null == (t = null == (e = Os(e, (t = gi(t, e)))) ? e : e[Bs(zs(t))]) ? n : Nt(t, e, r);\n          }\n          function Rr(e) {\n            return to(e) && br(e) == _;\n          }\n          function wr(e, t, r, i, s) {\n            return (\n              e === t ||\n              (null == e || null == t || (!to(e) && !to(t))\n                ? e != e && t != t\n                : (function (e, t, r, i, s, a) {\n                    var o = Ya(e),\n                      c = Ya(t),\n                      u = o ? E : ms(e),\n                      c = c ? E : ms(t),\n                      h = (u = u == _ ? N : u) == N,\n                      f = (c = c == _ ? N : c) == N;\n                    if ((c = u == c) && $a(e)) {\n                      if (!$a(t)) return !1;\n                      h = !(o = !0);\n                    }\n                    return c && !h\n                      ? ((a = a || new zn()),\n                        o || uo(e)\n                          ? ns(e, t, r, i, s, a)\n                          : (function (e, t, n, r, i, s, a) {\n                              switch (n) {\n                                case w:\n                                  if (e.byteLength != t.byteLength || e.byteOffset != t.byteOffset) return !1;\n                                  ((e = e.buffer), (t = t.buffer));\n                                case R:\n                                  return !(e.byteLength != t.byteLength || !s(new Ke(e), new Ke(t)));\n                                case T:\n                                case A:\n                                case C:\n                                  return Ha(+e, +t);\n                                case g:\n                                  return e.name == t.name && e.message == t.message;\n                                case I:\n                                case k:\n                                  return e == t + '';\n                                case S:\n                                  var o = on;\n                                case O:\n                                  var u,\n                                    o = o || ln;\n                                  return e.size == t.size || 1 & r\n                                    ? (u = a.get(e))\n                                      ? u == t\n                                      : ((r |= 2), a.set(e, t), (u = ns(o(e), o(t), r, i, s, a)), a.delete(e), u)\n                                    : !1;\n                                case L:\n                                  if (Un) return Un.call(e) == Un.call(t);\n                              }\n                              return !1;\n                            })(e, t, u, r, i, s, a))\n                      : 1 & r || ((o = h && Pe.call(e, '__wrapped__')), (u = f && Pe.call(t, '__wrapped__')), !o && !u)\n                        ? c &&\n                          (function (e, t, r, i, s, a) {\n                            var o = 1 & r,\n                              c = is(e),\n                              u = c.length;\n                            if (u != is(t).length && !o) return !1;\n                            for (var f = u; f--; ) {\n                              var p = c[f];\n                              if (!(o ? p in t : Pe.call(t, p))) return !1;\n                            }\n                            var d = a.get(e),\n                              m = a.get(t);\n                            if (d && m) return d == t && m == e;\n                            for (var _ = !0, E = (a.set(e, t), a.set(t, e), o); ++f < u; ) {\n                              var g,\n                                T = e[(p = c[f])],\n                                A = t[p];\n                              if (\n                                !((g = i ? (o ? i(A, T, p, t, e, a) : i(T, A, p, e, t, a)) : g) === n\n                                  ? T === A || s(T, A, r, i, a)\n                                  : g)\n                              ) {\n                                _ = !1;\n                                break;\n                              }\n                              E = E || 'constructor' == p;\n                            }\n                            return (\n                              _ &&\n                                !E &&\n                                (d = e.constructor) != (m = t.constructor) &&\n                                'constructor' in e &&\n                                'constructor' in t &&\n                                !(\n                                  'function' == typeof d &&\n                                  d instanceof d &&\n                                  'function' == typeof m &&\n                                  m instanceof m\n                                ) &&\n                                (_ = !1),\n                              a.delete(e),\n                              a.delete(t),\n                              _\n                            );\n                          })(e, t, r, i, s, (a = a || new zn()))\n                        : s(o ? e.value() : e, u ? t.value() : t, r, i, (a = a || new zn()));\n                  })(e, t, r, i, wr, s))\n            );\n          }\n          function xr(e, t, r, i) {\n            var s = r.length,\n              a = s,\n              o = !i;\n            if (null == e) return !a;\n            for (e = Ie(e); s--; ) {\n              var c = r[s];\n              if (o && c[2] ? c[1] !== e[c[0]] : !(c[0] in e)) return !1;\n            }\n            for (; ++s < a; ) {\n              var u = (c = r[s])[0],\n                l = e[u],\n                h = c[1];\n              if (o && c[2]) {\n                if (l === n && !(u in e)) return !1;\n              } else {\n                var p,\n                  f = new zn();\n                if (!((p = i ? i(l, h, u, e, t, f) : p) === n ? wr(h, l, 3, i, f) : p)) return !1;\n              }\n            }\n            return !0;\n          }\n          function Mr(e) {\n            return (\n              !(\n                !eo(e) ||\n                (function (e) {\n                  return Fe && Fe in e;\n                })(e)\n              ) && (Xa(e) ? je : _e).test(Fs(e))\n            );\n          }\n          function Pr(e) {\n            return 'function' == typeof e\n              ? e\n              : null == e\n                ? ic\n                : 'object' == typeof e\n                  ? Ya(e)\n                    ? jr(e[0], e[1])\n                    : Gr(e)\n                  : pc(e);\n          }\n          function Br(e) {\n            if (!Cs(e)) return Tn(e);\n            var n,\n              t = [];\n            for (n in Ie(e)) Pe.call(e, n) && 'constructor' != n && t.push(n);\n            return t;\n          }\n          function Ur(e, t) {\n            return e < t;\n          }\n          function Hr(e, t) {\n            var n = -1,\n              r = Wa(e) ? ye(e.length) : [];\n            return (\n              pr(e, function (e, i, s) {\n                r[++n] = t(e, i, s);\n              }),\n              r\n            );\n          }\n          function Gr(e) {\n            var t = hs(e);\n            return 1 == t.length && t[0][2]\n              ? bs(t[0][0], t[0][1])\n              : function (n) {\n                  return n === e || xr(n, e, t);\n                };\n          }\n          function jr(e, t) {\n            return vs(e) && Ns(t)\n              ? bs(Bs(e), t)\n              : function (r) {\n                  var i = Io(r, e);\n                  return i === n && i === t ? Oo(r, e) : wr(t, i, 3);\n                };\n          }\n          function qr(e, t, r, i, s) {\n            e !== t &&\n              Ar(\n                t,\n                function (a, o) {\n                  var c;\n                  ((s = s || new zn()),\n                    eo(a)\n                      ? (function (e, t, r, i, s, a, o) {\n                          var p,\n                            d,\n                            m,\n                            c = ks(e, r),\n                            u = ks(t, r),\n                            l = o.get(u);\n                          (l ||\n                            ((t = (l = a ? a(c, u, r + '', e, t, o) : n) === n) &&\n                              ((d = !(p = Ya(u)) && $a(u)),\n                              (m = !p && !d && uo(u)),\n                              (l = u),\n                              p || d || m\n                                ? (l = Ya(c) ? c : Va(c) ? Li(c) : d ? Ci(u, !(t = !1)) : m ? bi(u, !(t = !1)) : [])\n                                : io(u) || qa(u)\n                                  ? qa((l = c))\n                                    ? (l = To(c))\n                                    : (eo(c) && !Xa(c)) || (l = Es(u))\n                                  : (t = !1)),\n                            t && (o.set(u, l), s(l, u, i, a, o), o.delete(u))),\n                            tr(e, r, l));\n                        })(e, t, o, r, qr, i, s)\n                      : ((c = i ? i(ks(e, o), a, o + '', e, t, s) : n), tr(e, o, c === n ? a : c)));\n                },\n                wo,\n              );\n          }\n          function Yr(e, t) {\n            var r = e.length;\n            if (r) return As((t += t < 0 ? r : 0), r) ? e[t] : n;\n          }\n          function Kr(e, t, n) {\n            t = t.length\n              ? wt(t, function (e) {\n                  return Ya(e)\n                    ? function (t) {\n                        return Cr(t, 1 === e.length ? e[0] : e);\n                      }\n                    : e;\n                })\n              : [ic];\n            var r = -1;\n            return (\n              (t = wt(t, Xt(us()))),\n              (function (e, t) {\n                var n = e.length;\n                for (e.sort(t); n--; ) e[n] = e[n].value;\n                return e;\n              })(\n                Hr(e, function (e, n, i) {\n                  return {\n                    criteria: wt(t, function (t) {\n                      return t(e);\n                    }),\n                    index: ++r,\n                    value: e,\n                  };\n                }),\n                function (e, t) {\n                  return (function (e, t, n) {\n                    for (var r = -1, i = e.criteria, s = t.criteria, a = i.length, o = n.length; ++r < a; ) {\n                      var c = Ii(i[r], s[r]);\n                      if (c) return o <= r ? c : c * ('desc' == n[r] ? -1 : 1);\n                    }\n                    return e.index - t.index;\n                  })(e, t, n);\n                },\n              )\n            );\n          }\n          function Wr(e, t, n) {\n            for (var r = -1, i = t.length, s = {}; ++r < i; ) {\n              var a = t[r],\n                o = Cr(e, a);\n              n(o, a) && ei(s, gi(a, e), o);\n            }\n            return s;\n          }\n          function Vr(e, t, n, r) {\n            var i = r ? jt : Gt,\n              s = -1,\n              a = t.length,\n              o = e;\n            for (e === t && (t = Li(t)), n && (o = wt(e, Xt(n))); ++s < a; )\n              for (var c = 0, u = t[s], l = n ? n(u) : u; -1 < (c = i(o, l, c, r)); )\n                (o !== e && ze.call(o, c, 1), ze.call(e, c, 1));\n            return e;\n          }\n          function $r(e, t) {\n            for (var n = e ? t.length : 0, r = n - 1; n--; ) {\n              var s,\n                i = t[n];\n              (n != r && i === s) || (As((s = i)) ? ze.call(e, i, 1) : fi(e, i));\n            }\n          }\n          function Qr(e, t) {\n            return e + Et(Sn() * (t - e + 1));\n          }\n          function zr(e, t) {\n            var n = '';\n            if (!(!e || t < 1 || f < t)) for (; t % 2 && (n += e), (t = Et(t / 2)) && (e += e), t; );\n            return n;\n          }\n          function Xr(e, t) {\n            return Rs(Is(e, t, ic), e + '');\n          }\n          function ei(e, t, r, i) {\n            if (eo(e))\n              for (var s = -1, a = (t = gi(t, e)).length, o = a - 1, c = e; null != c && ++s < a; ) {\n                var h,\n                  u = Bs(t[s]),\n                  l = r;\n                if ('__proto__' === u || 'constructor' === u || 'prototype' === u) return e;\n                (nr(\n                  c,\n                  u,\n                  (l =\n                    s != o && ((h = c[u]), (l = i ? i(h, u, c) : n) === n) ? (eo(h) ? h : As(t[s + 1]) ? [] : {}) : l),\n                ),\n                  (c = c[u]));\n              }\n            return e;\n          }\n          var ti = Dn\n              ? function (e, t) {\n                  return (Dn.set(e, t), e);\n                }\n              : ic,\n            Ye = ct\n              ? function (e, t) {\n                  return ct(e, 'toString', { configurable: !0, enumerable: !1, value: tc(t), writable: !0 });\n                }\n              : ic;\n          function ii(e, t, n) {\n            var r = -1,\n              i = e.length;\n            ((n = i < n ? i : n) < 0 && (n += i),\n              (i = n < (t = t < 0 ? (i < -t ? 0 : i + t) : t) ? 0 : (n - t) >>> 0),\n              (t >>>= 0));\n            for (var s = ye(i); ++r < i; ) s[r] = e[r + t];\n            return s;\n          }\n          function ai(e, t, n) {\n            var r = 0,\n              i = null == e ? r : e.length;\n            if ('number' == typeof t && t == t && i <= 2147483647) {\n              for (; r < i; ) {\n                var s = (r + i) >>> 1,\n                  a = e[s];\n                null !== a && !co(a) && (n ? a <= t : a < t) ? (r = 1 + s) : (i = s);\n              }\n              return i;\n            }\n            return oi(e, t, ic, n);\n          }\n          function oi(e, t, r, i) {\n            var s = 0,\n              a = null == e ? 0 : e.length;\n            if (0 === a) return 0;\n            for (var o = (t = r(t)) != t, c = null === t, u = co(t), l = t === n; s < a; ) {\n              var h = Et((s + a) / 2),\n                f = r(e[h]),\n                p = f !== n,\n                d = null === f,\n                m = f == f,\n                _ = co(f);\n              (\n                o\n                  ? i || m\n                  : l\n                    ? m && (i || p)\n                    : c\n                      ? m && p && (i || !d)\n                      : u\n                        ? m && p && !d && (i || !_)\n                        : !d && !_ && (i ? f <= t : f < t)\n              )\n                ? (s = h + 1)\n                : (a = h);\n            }\n            return gn(a, 4294967294);\n          }\n          function ci(e, t) {\n            for (var n = -1, r = e.length, i = 0, s = []; ++n < r; ) {\n              var c,\n                a = e[n],\n                o = t ? t(a) : a;\n              (n && Ha(o, c)) || ((c = o), (s[i++] = 0 === a ? 0 : a));\n            }\n            return s;\n          }\n          function ui(e) {\n            return 'number' == typeof e ? e : co(e) ? p : +e;\n          }\n          function li(e) {\n            var t;\n            return 'string' == typeof e\n              ? e\n              : Ya(e)\n                ? wt(e, li) + ''\n                : co(e)\n                  ? Hn\n                    ? Hn.call(e)\n                    : ''\n                  : '0' == (t = e + '') && 1 / e == -1 / 0\n                    ? '-0'\n                    : t;\n          }\n          function hi(e, t, n) {\n            var r = -1,\n              i = Dt,\n              s = e.length,\n              a = !0,\n              o = [],\n              c = o;\n            if (n) ((a = !1), (i = Rt));\n            else if (200 <= s) {\n              var u = t ? null : zi(e);\n              if (u) return ln(u);\n              ((a = !1), (i = Jt), (c = new Qn()));\n            } else c = t ? [] : o;\n            e: for (; ++r < s; ) {\n              var l = e[r],\n                h = t ? t(l) : l,\n                l = n || 0 !== l ? l : 0;\n              if (a && h == h) {\n                for (var f = c.length; f--; ) if (c[f] === h) continue e;\n                (t && c.push(h), o.push(l));\n              } else i(c, h, n) || (c !== o && c.push(h), o.push(l));\n            }\n            return o;\n          }\n          function fi(e, t) {\n            return null == (e = Os(e, (t = gi(t, e)))) || delete e[Bs(zs(t))];\n          }\n          function pi(e, t, n, r) {\n            return ei(e, t, n(Cr(e, t)), r);\n          }\n          function di(e, t, n, r) {\n            for (var i = e.length, s = r ? i : -1; (r ? s-- : ++s < i) && t(e[s], s, e); );\n            return n ? ii(e, r ? 0 : s, r ? s + 1 : i) : ii(e, r ? s + 1 : 0, r ? i : s);\n          }\n          function mi(e, t) {\n            var n = e;\n            return Mt(\n              t,\n              function (e, t) {\n                return t.func.apply(t.thisArg, xt([e], t.args));\n              },\n              e instanceof Kn ? e.value() : n,\n            );\n          }\n          function _i(e, t, n) {\n            var r = e.length;\n            if (r < 2) return r ? hi(e[0]) : [];\n            for (var i = -1, s = ye(r); ++i < r; )\n              for (var a = e[i], o = -1; ++o < r; ) o != i && (s[i] = fr(s[i] || a, e[o], t, n));\n            return hi(Tr(s, 1), t, n);\n          }\n          function Ei(e, t, r) {\n            for (var i = -1, s = e.length, a = t.length, o = {}; ++i < s; ) {\n              var c = i < a ? t[i] : n;\n              r(o, e[i], c);\n            }\n            return o;\n          }\n          function Ti(e) {\n            return Va(e) ? e : [];\n          }\n          function Ai(e) {\n            return 'function' == typeof e ? e : ic;\n          }\n          function gi(e, t) {\n            return Ya(e) ? e : vs(e, t) ? [e] : Ps(Ao(e));\n          }\n          var vi = Xr;\n          function yi(e, t, r) {\n            var i = e.length;\n            return ((r = r === n ? i : r), !t && i <= r ? e : ii(e, t, r));\n          }\n          var Si =\n            ht ||\n            function (e) {\n              return pt.clearTimeout(e);\n            };\n          function Ci(e, t) {\n            return t ? e.slice() : ((t = e.length), (t = We ? We(t) : new e.constructor(t)), e.copy(t), t);\n          }\n          function Ni(e) {\n            var t = new e.constructor(e.byteLength);\n            return (new Ke(t).set(new Ke(e)), t);\n          }\n          function bi(e, t) {\n            return ((t = t ? Ni(e.buffer) : e.buffer), new e.constructor(t, e.byteOffset, e.length));\n          }\n          function Ii(e, t) {\n            if (e !== t) {\n              var r = e !== n,\n                i = null === e,\n                s = e == e,\n                a = co(e),\n                o = t !== n,\n                c = null === t,\n                u = t == t,\n                l = co(t);\n              if ((!c && !l && !a && t < e) || (a && o && u && !c && !l) || (i && o && u) || (!r && u) || !s) return 1;\n              if ((!i && !a && !l && e < t) || (l && r && s && !i && !a) || (c && r && s) || (!o && s) || !u) return -1;\n            }\n            return 0;\n          }\n          function Oi(e, t, n, r) {\n            for (\n              var i = -1, s = e.length, a = n.length, o = -1, c = t.length, u = An(s - a, 0), l = ye(c + u), h = !r;\n              ++o < c;\n            )\n              l[o] = t[o];\n            for (; ++i < a; ) (h || i < s) && (l[n[i]] = e[i]);\n            for (; u--; ) l[o++] = e[i++];\n            return l;\n          }\n          function ki(e, t, n, r) {\n            for (\n              var i = -1,\n                s = e.length,\n                a = -1,\n                o = n.length,\n                c = -1,\n                u = t.length,\n                l = An(s - o, 0),\n                h = ye(l + u),\n                f = !r;\n              ++i < l;\n            )\n              h[i] = e[i];\n            for (var p = i; ++c < u; ) h[p + c] = t[c];\n            for (; ++a < o; ) (f || i < s) && (h[p + n[a]] = e[i++]);\n            return h;\n          }\n          function Li(e, t) {\n            var n = -1,\n              r = e.length;\n            for (t = t || ye(r); ++n < r; ) t[n] = e[n];\n            return t;\n          }\n          function Di(e, t, r, i) {\n            var s = !r;\n            r = r || {};\n            for (var a = -1, o = t.length; ++a < o; ) {\n              var c = t[a],\n                u = i ? i(r[c], e[c], c, r, e) : n;\n              (s ? ar : nr)(r, c, u === n ? e[c] : u);\n            }\n            return r;\n          }\n          function Ri(e, t) {\n            return function (n, r) {\n              var i = Ya(n) ? bt : ir,\n                s = t ? t() : {};\n              return i(n, e, us(r, 2), s);\n            };\n          }\n          function wi(e) {\n            return Xr(function (t, r) {\n              var i = -1,\n                s = r.length,\n                a = 1 < s ? r[s - 1] : n,\n                o = 2 < s ? r[2] : n,\n                a = 3 < e.length && 'function' == typeof a ? (s--, a) : n;\n              for (o && gs(r[0], r[1], o) && ((a = s < 3 ? n : a), (s = 1)), t = Ie(t); ++i < s; ) {\n                var c = r[i];\n                c && e(t, c, i, a);\n              }\n              return t;\n            });\n          }\n          function xi(e, t) {\n            return function (n, r) {\n              if (null != n) {\n                if (!Wa(n)) return e(n, r);\n                for (var i = n.length, s = t ? i : -1, a = Ie(n); (t ? s-- : ++s < i) && !1 !== r(a[s], s, a); );\n              }\n              return n;\n            };\n          }\n          function Mi(e) {\n            return function (t, n, r) {\n              for (var i = -1, s = Ie(t), a = r(t), o = a.length; o--; ) {\n                var c = a[e ? o : ++i];\n                if (!1 === n(s[c], c, s)) break;\n              }\n              return t;\n            };\n          }\n          function Pi(e) {\n            return function (t) {\n              var i = (r = an((t = Ao(t))) ? pn(t) : n) ? r[0] : t.charAt(0),\n                r = r ? yi(r, 1).join('') : t.slice(1);\n              return i[e]() + r;\n            };\n          }\n          function Bi(e) {\n            return function (t) {\n              return Mt(Zo(Yo(t).replace(Ze, '')), e, '');\n            };\n          }\n          function Fi(e) {\n            return function () {\n              var t = arguments;\n              switch (t.length) {\n                case 0:\n                  return new e();\n                case 1:\n                  return new e(t[0]);\n                case 2:\n                  return new e(t[0], t[1]);\n                case 3:\n                  return new e(t[0], t[1], t[2]);\n                case 4:\n                  return new e(t[0], t[1], t[2], t[3]);\n                case 5:\n                  return new e(t[0], t[1], t[2], t[3], t[4]);\n                case 6:\n                  return new e(t[0], t[1], t[2], t[3], t[4], t[5]);\n                case 7:\n                  return new e(t[0], t[1], t[2], t[3], t[4], t[5], t[6]);\n              }\n              var n = jn(e.prototype),\n                r = e.apply(n, t);\n              return eo(r) ? r : n;\n            };\n          }\n          function Ui(e) {\n            return function (t, r, i) {\n              var a,\n                s = Ie(t);\n              return (\n                Wa(t) ||\n                  ((a = us(r, 3)),\n                  (t = Ro(t)),\n                  (r = function (e) {\n                    return a(s[e], e, s);\n                  })),\n                -1 < (r = e(t, r, i)) ? s[a ? t[r] : r] : n\n              );\n            };\n          }\n          function Hi(e) {\n            return rs(function (t) {\n              var i = t.length,\n                s = i,\n                a = Yn.prototype.thru;\n              for (e && t.reverse(); s--; ) {\n                var o = t[s];\n                if ('function' != typeof o) throw new Le(r);\n                a && !c && 'wrapper' == os(o) && (c = new Yn([], !0));\n              }\n              for (s = c ? s : i; ++s < i; )\n                var u = os((o = t[s])),\n                  l = 'wrapper' == u ? as(o) : n,\n                  c =\n                    l && ys(l[0]) && 424 == l[1] && !l[4].length && 1 == l[9]\n                      ? c[os(l[0])].apply(c, l[3])\n                      : 1 == o.length && ys(o)\n                        ? c[u]()\n                        : c.thru(o);\n              return function () {\n                var e = arguments,\n                  n = e[0];\n                if (c && 1 == e.length && Ya(n)) return c.plant(n).value();\n                for (var r = 0, s = i ? t[r].apply(this, e) : n; ++r < i; ) s = t[r].call(this, s);\n                return s;\n              };\n            });\n          }\n          function Gi(e, t, r, i, s, a, o, c, l, h) {\n            var f = t & u,\n              p = 1 & t,\n              d = 2 & t,\n              m = 24 & t,\n              _ = 512 & t,\n              E = d ? n : Fi(e);\n            return function u() {\n              for (var v, y, T = arguments.length, A = ye(T), g = T; g--; ) A[g] = arguments[g];\n              return (\n                m &&\n                  (y = (function (e, t) {\n                    for (var n = e.length, r = 0; n--; ) e[n] === t && ++r;\n                    return r;\n                  })(A, (v = cs(u)))),\n                i && (A = Oi(A, i, s, m)),\n                a && (A = ki(A, a, o, m)),\n                (T -= y),\n                m && T < h\n                  ? ((y = un(A, v)), $i(e, t, Gi, u.placeholder, r, A, y, c, l, h - T))\n                  : ((v = p ? r : this),\n                    (y = d ? v[e] : e),\n                    (T = A.length),\n                    c\n                      ? (A = (function (e, t) {\n                          for (var r = e.length, i = gn(t.length, r), s = Li(e); i--; ) {\n                            var a = t[i];\n                            e[i] = As(a, r) ? s[a] : n;\n                          }\n                          return e;\n                        })(A, c))\n                      : _ && 1 < T && A.reverse(),\n                    f && l < T && (A.length = l),\n                    (y = this && this !== pt && this instanceof u ? E || Fi(y) : y).apply(v, A))\n              );\n            };\n          }\n          function ji(e, t) {\n            return function (n, r) {\n              return (function (e, t, n, r) {\n                return (\n                  vr(e, function (e, i, s) {\n                    t(r, n(e), i, s);\n                  }),\n                  r\n                );\n              })(n, e, t(r), {});\n            };\n          }\n          function qi(e, t) {\n            return function (r, i) {\n              var s;\n              if (r === n && i === n) return t;\n              if ((r !== n && (s = r), i !== n)) {\n                if (s === n) return i;\n                ((i = ('string' == typeof r || 'string' == typeof i ? ((r = li(r)), li) : ((r = ui(r)), ui))(i)),\n                  (s = e(r, i)));\n              }\n              return s;\n            };\n          }\n          function Yi(e) {\n            return rs(function (t) {\n              return (\n                (t = wt(t, Xt(us()))),\n                Xr(function (n) {\n                  var r = this;\n                  return e(t, function (e) {\n                    return Nt(e, r, n);\n                  });\n                })\n              );\n            });\n          }\n          function Ki(e, t) {\n            var r = (t = t === n ? ' ' : li(t)).length;\n            return r < 2\n              ? r\n                ? zr(t, e)\n                : t\n              : ((r = zr(t, mt(e / fn(t)))), an(t) ? yi(pn(r), 0, e).join('') : r.slice(0, e));\n          }\n          function Wi(e) {\n            return function (t, r, i) {\n              return (\n                i && 'number' != typeof i && gs(t, r, i) && (r = i = n),\n                (t = po(t)),\n                r === n ? ((r = t), (t = 0)) : (r = po(r)),\n                (function (e, t, n, r) {\n                  for (var i = -1, s = An(mt((t - e) / (n || 1)), 0), a = ye(s); s--; )\n                    ((a[r ? s : ++i] = e), (e += n));\n                  return a;\n                })(t, r, (i = i === n ? (t < r ? 1 : -1) : po(i)), e)\n              );\n            };\n          }\n          function Vi(e) {\n            return function (t, n) {\n              return (('string' == typeof t && 'string' == typeof n) || ((t = Eo(t)), (n = Eo(n))), e(t, n));\n            };\n          }\n          function $i(e, t, r, i, s, a, u, l, h, f) {\n            var p = 8 & t,\n              s =\n                (4 & (t = (t | (p ? o : 64)) & ~(p ? 64 : o)) || (t &= -4),\n                [e, t, s, p ? a : n, p ? u : n, p ? n : a, p ? n : u, l, h, f]),\n              a = r.apply(n, s);\n            return (ys(e) && Ls(a, s), (a.placeholder = i), ws(a, e, t));\n          }\n          function Qi(e) {\n            var t = be[e];\n            return function (e, n) {\n              var r;\n              return (\n                (e = Eo(e)),\n                (n = null == n ? 0 : gn(mo(n), 292)) && Wt(e)\n                  ? ((r = (Ao(e) + 'e').split('e')),\n                    +((r = (Ao(t(r[0] + 'e' + (+r[1] + n))) + 'e').split('e'))[0] + 'e' + (+r[1] - n)))\n                  : t(e)\n              );\n            };\n          }\n          var zi =\n            On && 1 / ln(new On([, -0]))[1] == h\n              ? function (e) {\n                  return new On(e);\n                }\n              : uc;\n          function Xi(e) {\n            return function (t) {\n              var n = ms(t);\n              return n == S\n                ? on(t)\n                : n == O\n                  ? (function (e) {\n                      var t = -1,\n                        n = Array(e.size);\n                      return (\n                        e.forEach(function (e) {\n                          n[++t] = [e, e];\n                        }),\n                        n\n                      );\n                    })(t)\n                  : (function (e, t) {\n                      return wt(t, function (t) {\n                        return [t, e[t]];\n                      });\n                    })(t, e(t));\n            };\n          }\n          function Zi(e, t, i, h, f, p, d, m) {\n            var E,\n              A,\n              T,\n              _ = 2 & t;\n            if (_ || 'function' == typeof e)\n              return (\n                (E = h ? h.length : 0) || ((t &= -97), (h = f = n)),\n                (d = d === n ? d : An(mo(d), 0)),\n                (m = m === n ? m : mo(m)),\n                (E -= f ? f.length : 0),\n                64 & t && ((T = h), (A = f), (h = f = n)),\n                (T = [e, t, i, h, f, T, A, p, d, m]),\n                (A = _ ? n : as(e)) &&\n                  (function (e, t) {\n                    var h,\n                      n = e[1],\n                      r = t[1],\n                      i = n | r,\n                      o =\n                        (r == u && 8 == n) ||\n                        (r == u && 256 == n && e[7].length <= t[8]) ||\n                        (384 == r && t[7].length <= t[8] && 8 == n);\n                    (i < 131 || o) &&\n                      (1 & r && ((e[2] = t[2]), (i |= 1 & n ? 0 : 4)),\n                      (o = t[3]) && ((h = e[3]), (e[3] = h ? Oi(h, o, t[4]) : o), (e[4] = h ? un(e[3], s) : t[4])),\n                      (o = t[5]) && ((h = e[5]), (e[5] = h ? ki(h, o, t[6]) : o), (e[6] = h ? un(e[5], s) : t[6])),\n                      (o = t[7]) && (e[7] = o),\n                      r & u && (e[8] = null == e[8] ? t[8] : gn(e[8], t[8])),\n                      null == e[9] && (e[9] = t[9]),\n                      (e[0] = t[0]),\n                      (e[1] = i));\n                  })(T, A),\n                (e = T[0]),\n                (t = T[1]),\n                (i = T[2]),\n                (h = T[3]),\n                (f = T[4]),\n                !(m = T[9] = T[9] === n ? (_ ? 0 : e.length) : An(T[9] - E, 0)) && 24 & t && (t &= -25),\n                (p =\n                  t && 1 != t\n                    ? 8 == t || 16 == t\n                      ? (function (e, t, r) {\n                          var i = Fi(e);\n                          return function s() {\n                            for (var a = arguments.length, o = ye(a), c = a, u = cs(s); c--; ) o[c] = arguments[c];\n                            return (a -= (u = a < 3 && o[0] !== u && o[a - 1] !== u ? [] : un(o, u)).length) < r\n                              ? $i(e, t, Gi, s.placeholder, n, o, u, n, n, r - a)\n                              : Nt(this && this !== pt && this instanceof s ? i : e, this, o);\n                          };\n                        })(e, t, m)\n                      : (t != o && 33 != t) || f.length\n                        ? Gi.apply(n, T)\n                        : (function (e, t, n, r) {\n                            var i = 1 & t,\n                              s = Fi(e);\n                            return function t() {\n                              for (\n                                var a = -1,\n                                  o = arguments.length,\n                                  c = -1,\n                                  u = r.length,\n                                  l = ye(u + o),\n                                  h = this && this !== pt && this instanceof t ? s : e;\n                                ++c < u;\n                              )\n                                l[c] = r[c];\n                              for (; o--; ) l[c++] = arguments[++a];\n                              return Nt(h, i ? n : this, l);\n                            };\n                          })(e, t, i, h)\n                    : (function (e, t, n) {\n                        var r = 1 & t,\n                          i = Fi(e);\n                        return function t() {\n                          return (this && this !== pt && this instanceof t ? i : e).apply(r ? n : this, arguments);\n                        };\n                      })(e, t, i)),\n                ws((A ? ti : Ls)(p, T), e, t)\n              );\n            throw new Le(r);\n          }\n          function Ji(e, t, r, i) {\n            return e === n || (Ha(e, we[r]) && !Pe.call(i, r)) ? t : e;\n          }\n          function es(e, t, r, i, s, a) {\n            return (eo(e) && eo(t) && (a.set(t, e), qr(e, t, n, es, a), a.delete(t)), e);\n          }\n          function ts(e) {\n            return io(e) ? n : e;\n          }\n          function ns(e, t, r, i, s, a) {\n            var o = 1 & r,\n              c = e.length;\n            if (c != (u = t.length) && !(o && c < u)) return !1;\n            var u = a.get(e),\n              h = a.get(t);\n            if (u && h) return u == t && h == e;\n            var f = -1,\n              p = !0,\n              d = 2 & r ? new Qn() : n;\n            for (a.set(e, t), a.set(t, e); ++f < c; ) {\n              var E,\n                m = e[f],\n                _ = t[f];\n              if ((E = i ? (o ? i(_, m, f, t, e, a) : i(m, _, f, e, t, a)) : E) !== n) {\n                if (E) continue;\n                p = !1;\n                break;\n              }\n              if (d) {\n                if (\n                  !Bt(t, function (e, t) {\n                    return !Jt(d, t) && (m === e || s(m, e, r, i, a)) && d.push(t);\n                  })\n                ) {\n                  p = !1;\n                  break;\n                }\n              } else if (m !== _ && !s(m, _, r, i, a)) {\n                p = !1;\n                break;\n              }\n            }\n            return (a.delete(e), a.delete(t), p);\n          }\n          function rs(e) {\n            return Rs(Is(e, n, Ks), e + '');\n          }\n          function is(e) {\n            return Nr(e, Ro, ps);\n          }\n          function ss(e) {\n            return Nr(e, wo, ds);\n          }\n          var as = Dn\n            ? function (e) {\n                return Dn.get(e);\n              }\n            : uc;\n          function os(e) {\n            for (var t = e.name + '', n = Rn[t], r = Pe.call(Rn, t) ? n.length : 0; r--; ) {\n              var i = n[r],\n                s = i.func;\n              if (null == s || s == e) return i.name;\n            }\n            return t;\n          }\n          function cs(e) {\n            return (Pe.call(Gn, 'placeholder') ? Gn : e).placeholder;\n          }\n          function us() {\n            var e = (e = Gn.iteratee || sc) === sc ? Pr : e;\n            return arguments.length ? e(arguments[0], arguments[1]) : e;\n          }\n          function ls(e, t) {\n            var r,\n              e = e.__data__;\n            return (\n              'string' == (r = typeof t) || 'number' == r || 'symbol' == r || 'boolean' == r\n                ? '__proto__' !== t\n                : null === t\n            )\n              ? e['string' == typeof t ? 'string' : 'hash']\n              : e.map;\n          }\n          function hs(e) {\n            for (var t = Ro(e), n = t.length; n--; ) {\n              var r = t[n],\n                i = e[r];\n              t[n] = [r, i, Ns(i)];\n            }\n            return t;\n          }\n          function fs(e, t) {\n            return Mr(\n              (e = (function (e, t) {\n                return null == e ? n : e[t];\n              })(e, t)),\n            )\n              ? e\n              : n;\n          }\n          var ps = Tt\n              ? function (e) {\n                  return null == e\n                    ? []\n                    : ((e = Ie(e)),\n                      Lt(Tt(e), function (t) {\n                        return Qe.call(e, t);\n                      }));\n                }\n              : _c,\n            ds = Tt\n              ? function (e) {\n                  for (var t = []; e; ) (xt(t, ps(e)), (e = Ve(e)));\n                  return t;\n                }\n              : _c,\n            ms = br;\n          function _s(e, t, n) {\n            for (var r = -1, i = (t = gi(t, e)).length, s = !1; ++r < i; ) {\n              var a = Bs(t[r]);\n              if (!(s = null != e && n(e, a))) break;\n              e = e[a];\n            }\n            return s || ++r != i ? s : !!(i = null == e ? 0 : e.length) && Ja(i) && As(a, i) && (Ya(e) || qa(e));\n          }\n          function Es(e) {\n            return 'function' != typeof e.constructor || Cs(e) ? {} : jn(Ve(e));\n          }\n          function Ts(e) {\n            return Ya(e) || qa(e) || !!(Xe && e && e[Xe]);\n          }\n          function As(e, t) {\n            var n = typeof e;\n            return (\n              !!(t = null == t ? f : t) &&\n              ('number' == n || ('symbol' != n && Te.test(e))) &&\n              -1 < e &&\n              e % 1 == 0 &&\n              e < t\n            );\n          }\n          function gs(e, t, n) {\n            var r;\n            return (\n              !!eo(n) &&\n              !!('number' == (r = typeof t) ? Wa(n) && As(t, n.length) : 'string' == r && t in n) &&\n              Ha(n[t], e)\n            );\n          }\n          function vs(e, t) {\n            var n;\n            return (\n              !Ya(e) &&\n              ('number' == (n = typeof e) ||\n                'symbol' == n ||\n                'boolean' == n ||\n                null == e ||\n                co(e) ||\n                ee.test(e) ||\n                !J.test(e) ||\n                (null != t && e in Ie(t)))\n            );\n          }\n          function ys(e) {\n            var t = os(e),\n              n = Gn[t];\n            return 'function' == typeof n && t in Kn.prototype && (e === n || ((t = as(n)) && e === t[0]));\n          }\n          ((Se && ms(new Se(new ArrayBuffer(1))) != w) ||\n            (bn && ms(new bn()) != S) ||\n            (In && ms(In.resolve()) != b) ||\n            (On && ms(new On()) != O) ||\n            (t && ms(new t()) != D)) &&\n            (ms = function (e) {\n              var t = br(e);\n              if ((e = (e = t == N ? e.constructor : n) ? Fs(e) : ''))\n                switch (e) {\n                  case wn:\n                    return w;\n                  case xn:\n                    return S;\n                  case Mn:\n                    return b;\n                  case Pn:\n                    return O;\n                  case Bn:\n                    return D;\n                }\n              return t;\n            });\n          var Ss = xe ? Xa : Ec;\n          function Cs(e) {\n            var t = e && e.constructor;\n            return e === (('function' == typeof t && t.prototype) || we);\n          }\n          function Ns(e) {\n            return e == e && !eo(e);\n          }\n          function bs(e, t) {\n            return function (r) {\n              return null != r && r[e] === t && (t !== n || e in Ie(r));\n            };\n          }\n          function Is(e, t, r) {\n            return (\n              (t = An(t === n ? e.length - 1 : t, 0)),\n              function () {\n                for (var n = arguments, i = -1, s = An(n.length - t, 0), a = ye(s); ++i < s; ) a[i] = n[t + i];\n                for (var i = -1, o = ye(t + 1); ++i < t; ) o[i] = n[i];\n                return ((o[t] = r(a)), Nt(e, this, o));\n              }\n            );\n          }\n          function Os(e, t) {\n            return t.length < 2 ? e : Cr(e, ii(t, 0, -1));\n          }\n          function ks(e, t) {\n            if (('constructor' !== t || 'function' != typeof e[t]) && '__proto__' != t) return e[t];\n          }\n          var Ls = xs(ti),\n            Ds =\n              dt ||\n              function (e, t) {\n                return pt.setTimeout(e, t);\n              },\n            Rs = xs(Ye);\n          function ws(e, t, n) {\n            var r = t + '';\n            return Rs(\n              e,\n              (function (e, t) {\n                var r,\n                  n = t.length;\n                return n\n                  ? ((t[(r = n - 1)] = (1 < n ? '& ' : '') + t[r]),\n                    (t = t.join(2 < n ? ', ' : ' ')),\n                    e.replace(ae, '{\\n/* [wrapped with ' + t + '] */\\n'))\n                  : e;\n              })(\n                r,\n                (function (e, t) {\n                  return (\n                    It(m, function (n) {\n                      var r = '_.' + n[0];\n                      t & n[1] && !Dt(e, r) && e.push(r);\n                    }),\n                    e.sort()\n                  );\n                })(\n                  (function () {\n                    var t = r.match(oe);\n                    return t ? t[1].split(ce) : [];\n                  })(),\n                  n,\n                ),\n              ),\n            );\n          }\n          function xs(e) {\n            var t = 0,\n              r = 0;\n            return function () {\n              var i = vn(),\n                s = 16 - (i - r);\n              if (((r = i), 0 < s)) {\n                if (800 <= ++t) return arguments[0];\n              } else t = 0;\n              return e.apply(n, arguments);\n            };\n          }\n          function Ms(e, t) {\n            var r = -1,\n              i = e.length,\n              s = i - 1;\n            for (t = t === n ? i : t; ++r < t; ) {\n              var a = Qr(r, s),\n                o = e[a];\n              ((e[a] = e[r]), (e[r] = o));\n            }\n            return ((e.length = t), e);\n          }\n          var Ps = (function () {\n            var t = xa(\n                function (e) {\n                  var t = [];\n                  return (\n                    46 === e.charCodeAt(0) && t.push(''),\n                    e.replace(te, function (e, n, r, i) {\n                      t.push(r ? i.replace(he, '$1') : n || e);\n                    }),\n                    t\n                  );\n                },\n                function (e) {\n                  return (500 === n.size && n.clear(), e);\n                },\n              ),\n              n = t.cache;\n            return t;\n          })();\n          function Bs(e) {\n            var t;\n            return 'string' == typeof e || co(e) ? e : '0' == (t = e + '') && 1 / e == -1 / 0 ? '-0' : t;\n          }\n          function Fs(e) {\n            if (null != e) {\n              try {\n                return Me.call(e);\n              } catch (e) {}\n              try {\n                return e + '';\n              } catch (e) {}\n            }\n            return '';\n          }\n          function Us(e) {\n            var t;\n            return e instanceof Kn\n              ? e.clone()\n              : (((t = new Yn(e.__wrapped__, e.__chain__)).__actions__ = Li(e.__actions__)),\n                (t.__index__ = e.__index__),\n                (t.__values__ = e.__values__),\n                t);\n          }\n          function qs(e, t, n) {\n            var r = null == e ? 0 : e.length;\n            return r ? ((n = null == n ? 0 : mo(n)) < 0 && (n = An(r + n, 0)), Ht(e, us(t, 3), n)) : -1;\n          }\n          function Ys(e, t, r) {\n            var s,\n              i = null == e ? 0 : e.length;\n            return i\n              ? ((s = i - 1),\n                r !== n && ((s = mo(r)), (s = r < 0 ? An(i + s, 0) : gn(s, i - 1))),\n                Ht(e, us(t, 3), s, !0))\n              : -1;\n          }\n          function Ks(e) {\n            return null != e && e.length ? Tr(e, 1) : [];\n          }\n          function Ws(e) {\n            return e && e.length ? e[0] : n;\n          }\n          function zs(e) {\n            var t = null == e ? 0 : e.length;\n            return t ? e[t - 1] : n;\n          }\n          function Zs(e, t) {\n            return e && e.length && t && t.length ? Vr(e, t) : e;\n          }\n          ((ht = Xr(function (e, t) {\n            return Va(e) ? fr(e, Tr(t, 1, Va, !0)) : [];\n          })),\n            (Se = Xr(function (e, t) {\n              var r = zs(t);\n              return (Va(r) && (r = n), Va(e) ? fr(e, Tr(t, 1, Va, !0), us(r, 2)) : []);\n            })),\n            (In = Xr(function (e, t) {\n              var r = zs(t);\n              return (Va(r) && (r = n), Va(e) ? fr(e, Tr(t, 1, Va, !0), n, r) : []);\n            })),\n            (t = Xr(function (e) {\n              var t = wt(e, Ti);\n              return t.length && t[0] === e[0] ? Lr(t) : [];\n            })),\n            (xe = Xr(function (e) {\n              var t = zs(e),\n                r = wt(e, Ti);\n              return (t === zs(r) ? (t = n) : r.pop(), r.length && r[0] === e[0] ? Lr(r, us(t, 2)) : []);\n            })),\n            (dt = Xr(function (e) {\n              var t = zs(e),\n                r = wt(e, Ti);\n              return ((t = 'function' == typeof t ? t : n) && r.pop(), r.length && r[0] === e[0] ? Lr(r, n, t) : []);\n            })),\n            (Ye = Xr(Zs)));\n          var Js = rs(function (e, t) {\n            var n = null == e ? 0 : e.length,\n              r = or(e, t);\n            return (\n              $r(\n                e,\n                wt(t, function (e) {\n                  return As(e, n) ? +e : e;\n                }).sort(Ii),\n              ),\n              r\n            );\n          });\n          function ea(e) {\n            return null == e ? e : Cn.call(e);\n          }\n          var ta = Xr(function (e) {\n              return hi(Tr(e, 1, Va, !0));\n            }),\n            na = Xr(function (e) {\n              var t = zs(e);\n              return (Va(t) && (t = n), hi(Tr(e, 1, Va, !0), us(t, 2)));\n            }),\n            ra = Xr(function (e) {\n              var t = 'function' == typeof (t = zs(e)) ? t : n;\n              return hi(Tr(e, 1, Va, !0), n, t);\n            });\n          function ia(e) {\n            var t;\n            return e && e.length\n              ? ((t = 0),\n                (e = Lt(e, function (e) {\n                  if (Va(e)) return ((t = An(e.length, t)), !0);\n                })),\n                Qt(t, function (t) {\n                  return wt(e, Kt(t));\n                }))\n              : [];\n          }\n          function sa(e, t) {\n            return e && e.length\n              ? ((e = ia(e)),\n                null == t\n                  ? e\n                  : wt(e, function (e) {\n                      return Nt(t, n, e);\n                    }))\n              : [];\n          }\n          var aa = Xr(function (e, t) {\n              return Va(e) ? fr(e, t) : [];\n            }),\n            oa = Xr(function (e) {\n              return _i(Lt(e, Va));\n            }),\n            ca = Xr(function (e) {\n              var t = zs(e);\n              return (Va(t) && (t = n), _i(Lt(e, Va), us(t, 2)));\n            }),\n            ua = Xr(function (e) {\n              var t = 'function' == typeof (t = zs(e)) ? t : n;\n              return _i(Lt(e, Va), n, t);\n            }),\n            la = Xr(ia),\n            ha = Xr(function (e) {\n              var t = 'function' == typeof (t = 1 < (t = e.length) ? e[t - 1] : n) ? (e.pop(), t) : n;\n              return sa(e, t);\n            });\n          function fa(e) {\n            return (((e = Gn(e)).__chain__ = !0), e);\n          }\n          function pa(e, t) {\n            return t(e);\n          }\n          var da = rs(function (e) {\n              function s(t) {\n                return or(t, e);\n              }\n              var t = e.length,\n                r = t ? e[0] : 0,\n                i = this.__wrapped__;\n              return !(1 < t || this.__actions__.length) && i instanceof Kn && As(r)\n                ? ((i = i.slice(r, +r + (t ? 1 : 0))).__actions__.push({ func: pa, args: [s], thisArg: n }),\n                  new Yn(i, this.__chain__).thru(function (e) {\n                    return (t && !e.length && e.push(n), e);\n                  }))\n                : this.thru(s);\n            }),\n            ma = Ri(function (e, t, n) {\n              Pe.call(e, n) ? ++e[n] : ar(e, n, 1);\n            }),\n            _a = Ui(qs),\n            Ea = Ui(Ys);\n          function Ta(e, t) {\n            return (Ya(e) ? It : pr)(e, us(t, 3));\n          }\n          function Aa(e, t) {\n            return (\n              Ya(e)\n                ? function (e, t) {\n                    for (var n = null == e ? 0 : e.length; n-- && !1 !== t(e[n], n, e); );\n                    return e;\n                  }\n                : dr\n            )(e, us(t, 3));\n          }\n          var ga = Ri(function (e, t, n) {\n              Pe.call(e, n) ? e[n].push(t) : ar(e, n, [t]);\n            }),\n            va = Xr(function (e, t, n) {\n              var r = -1,\n                i = 'function' == typeof t,\n                s = Wa(e) ? ye(e.length) : [];\n              return (\n                pr(e, function (e) {\n                  s[++r] = i ? Nt(t, e, n) : Dr(e, t, n);\n                }),\n                s\n              );\n            }),\n            ya = Ri(function (e, t, n) {\n              ar(e, n, t);\n            });\n          function Sa(e, t) {\n            return (Ya(e) ? wt : Hr)(e, us(t, 3));\n          }\n          var Ca = Ri(\n              function (e, t, n) {\n                e[n ? 0 : 1].push(t);\n              },\n              function () {\n                return [[], []];\n              },\n            ),\n            Na = Xr(function (e, t) {\n              var n;\n              return null == e\n                ? []\n                : (1 < (n = t.length) && gs(e, t[0], t[1]) ? (t = []) : 2 < n && gs(t[0], t[1], t[2]) && (t = [t[0]]),\n                  Kr(e, Tr(t, 1), []));\n            }),\n            ba =\n              ft ||\n              function () {\n                return pt.Date.now();\n              };\n          function Ia(e, t, r) {\n            return ((t = r ? n : t), (t = e && null == t ? e.length : t), Zi(e, u, n, n, n, n, t));\n          }\n          function Oa(e, t) {\n            var i;\n            if ('function' != typeof t) throw new Le(r);\n            return (\n              (e = mo(e)),\n              function () {\n                return (0 < --e && (i = t.apply(this, arguments)), e <= 1 && (t = n), i);\n              }\n            );\n          }\n          var ka = Xr(function (e, t, n) {\n              var i,\n                r = 1;\n              return (n.length && ((i = un(n, cs(ka))), (r |= o)), Zi(e, r, t, n, i));\n            }),\n            La = Xr(function (e, t, n) {\n              var i,\n                r = 3;\n              return (n.length && ((i = un(n, cs(La))), (r |= o)), Zi(t, r, e, n, i));\n            });\n          function Da(e, t, i) {\n            var s,\n              a,\n              o,\n              c,\n              u,\n              l,\n              h = 0,\n              f = !1,\n              p = !1,\n              d = !0;\n            if ('function' != typeof e) throw new Le(r);\n            function m(t) {\n              var r = s,\n                i = a;\n              return ((s = a = n), (h = t), (c = e.apply(i, r)));\n            }\n            function _(e) {\n              var r = e - l;\n              return l === n || t <= r || r < 0 || (p && o <= e - h);\n            }\n            function E() {\n              var e = ba();\n              if (_(e)) return T(e);\n              u = Ds(\n                E,\n                (function (e) {\n                  var n = t - (e - l);\n                  return p ? gn(n, o - (e - h)) : n;\n                })(e),\n              );\n            }\n            function T(e) {\n              return ((u = n), d && s ? m(e) : ((s = a = n), c));\n            }\n            function A() {\n              var e = ba(),\n                r = _(e);\n              if (((s = arguments), (a = this), (l = e), r)) {\n                if (u === n)\n                  return (function (e) {\n                    return ((h = e), (u = Ds(E, t)), f ? m(e) : c);\n                  })(l);\n                if (p) return (Si(u), (u = Ds(E, t)), m(l));\n              }\n              return (u === n && (u = Ds(E, t)), c);\n            }\n            return (\n              (t = Eo(t) || 0),\n              eo(i) &&\n                ((f = !!i.leading),\n                (o = (p = 'maxWait' in i) ? An(Eo(i.maxWait) || 0, t) : o),\n                (d = 'trailing' in i ? !!i.trailing : d)),\n              (A.cancel = function () {\n                (u !== n && Si(u), (h = 0), (s = l = a = u = n));\n              }),\n              (A.flush = function () {\n                return u === n ? c : T(ba());\n              }),\n              A\n            );\n          }\n          var ft = Xr(function (e, t) {\n              return hr(e, 1, t);\n            }),\n            wa = Xr(function (e, t, n) {\n              return hr(e, Eo(t) || 0, n);\n            });\n          function xa(e, t) {\n            if ('function' != typeof e || (null != t && 'function' != typeof t)) throw new Le(r);\n            function n() {\n              var r = arguments,\n                i = t ? t.apply(this, r) : r[0],\n                s = n.cache;\n              return s.has(i) ? s.get(i) : ((r = e.apply(this, r)), (n.cache = s.set(i, r) || s), r);\n            }\n            return ((n.cache = new (xa.Cache || $n)()), n);\n          }\n          function Ma(e) {\n            if ('function' != typeof e) throw new Le(r);\n            return function () {\n              var t = arguments;\n              switch (t.length) {\n                case 0:\n                  return !e.call(this);\n                case 1:\n                  return !e.call(this, t[0]);\n                case 2:\n                  return !e.call(this, t[0], t[1]);\n                case 3:\n                  return !e.call(this, t[0], t[1], t[2]);\n              }\n              return !e.apply(this, t);\n            };\n          }\n          xa.Cache = $n;\n          var vi = vi(function (e, t) {\n              var n = (t = 1 == t.length && Ya(t[0]) ? wt(t[0], Xt(us())) : wt(Tr(t, 1), Xt(us()))).length;\n              return Xr(function (r) {\n                for (var i = -1, s = gn(r.length, n); ++i < s; ) r[i] = t[i].call(this, r[i]);\n                return Nt(e, this, r);\n              });\n            }),\n            Ba = Xr(function (e, t) {\n              var r = un(t, cs(Ba));\n              return Zi(e, o, n, t, r);\n            }),\n            Fa = Xr(function (e, t) {\n              var r = un(t, cs(Fa));\n              return Zi(e, 64, n, t, r);\n            }),\n            Ua = rs(function (e, t) {\n              return Zi(e, 256, n, n, n, t);\n            });\n          function Ha(e, t) {\n            return e === t || (e != e && t != t);\n          }\n          var Ga = Vi(Ir),\n            ja = Vi(function (e, t) {\n              return t <= e;\n            }),\n            qa = Rr(\n              (function () {\n                return arguments;\n              })(),\n            )\n              ? Rr\n              : function (e) {\n                  return to(e) && Pe.call(e, 'callee') && !Qe.call(e, 'callee');\n                },\n            Ya = ye.isArray,\n            Ka = At\n              ? Xt(At)\n              : function (e) {\n                  return to(e) && br(e) == R;\n                };\n          function Wa(e) {\n            return null != e && Ja(e.length) && !Xa(e);\n          }\n          function Va(e) {\n            return to(e) && Wa(e);\n          }\n          var $a = Re || Ec,\n            Re = gt\n              ? Xt(gt)\n              : function (e) {\n                  return to(e) && br(e) == A;\n                };\n          function za(e) {\n            var t;\n            return (\n              !!to(e) &&\n              ((t = br(e)) == g ||\n                '[object DOMException]' == t ||\n                ('string' == typeof e.message && 'string' == typeof e.name && !io(e)))\n            );\n          }\n          function Xa(e) {\n            return !!eo(e) && ((e = br(e)) == v || e == y || '[object AsyncFunction]' == e || '[object Proxy]' == e);\n          }\n          function Za(e) {\n            return 'number' == typeof e && e == mo(e);\n          }\n          function Ja(e) {\n            return 'number' == typeof e && -1 < e && e % 1 == 0 && e <= f;\n          }\n          function eo(e) {\n            var t = typeof e;\n            return null != e && ('object' == t || 'function' == t);\n          }\n          function to(e) {\n            return null != e && 'object' == typeof e;\n          }\n          var no = vt\n            ? Xt(vt)\n            : function (e) {\n                return to(e) && ms(e) == S;\n              };\n          function ro(e) {\n            return 'number' == typeof e || (to(e) && br(e) == C);\n          }\n          function io(e) {\n            return (\n              !(!to(e) || br(e) != N) &&\n              (null === (e = Ve(e)) ||\n                ('function' == typeof (e = Pe.call(e, 'constructor') && e.constructor) &&\n                  e instanceof e &&\n                  Me.call(e) == He))\n            );\n          }\n          var so = yt\n              ? Xt(yt)\n              : function (e) {\n                  return to(e) && br(e) == I;\n                },\n            ao = St\n              ? Xt(St)\n              : function (e) {\n                  return to(e) && ms(e) == O;\n                };\n          function oo(e) {\n            return 'string' == typeof e || (!Ya(e) && to(e) && br(e) == k);\n          }\n          function co(e) {\n            return 'symbol' == typeof e || (to(e) && br(e) == L);\n          }\n          var uo = Ct\n              ? Xt(Ct)\n              : function (e) {\n                  return to(e) && Ja(e.length) && !!at[br(e)];\n                },\n            lo = Vi(Ur),\n            ho = Vi(function (e, t) {\n              return e <= t;\n            });\n          function fo(e) {\n            var t;\n            return e\n              ? Wa(e)\n                ? (oo(e) ? pn : Li)(e)\n                : et && e[et]\n                  ? (function (e) {\n                      for (var t, n = []; !(t = e.next()).done; ) n.push(t.value);\n                      return n;\n                    })(e[et]())\n                  : ((t = ms(e)) == S ? on : t == O ? ln : Go)(e)\n              : [];\n          }\n          function po(e) {\n            return e\n              ? (e = Eo(e)) === h || e === -1 / 0\n                ? 17976931348623157e292 * (e < 0 ? -1 : 1)\n                : e == e\n                  ? e\n                  : 0\n              : 0 === e\n                ? e\n                : 0;\n          }\n          function mo(e) {\n            var n = (e = po(e)) % 1;\n            return e == e ? (n ? e - n : e) : 0;\n          }\n          function _o(e) {\n            return e ? cr(mo(e), 0, d) : 0;\n          }\n          function Eo(e) {\n            if ('number' == typeof e) return e;\n            if (co(e)) return p;\n            if (\n              'string' !=\n              typeof (e = eo(e) ? (eo((t = 'function' == typeof e.valueOf ? e.valueOf() : e)) ? t + '' : t) : e)\n            )\n              return 0 === e ? e : +e;\n            e = zt(e);\n            var t = me.test(e);\n            return t || Ee.test(e) ? lt(e.slice(2), t ? 2 : 8) : de.test(e) ? p : +e;\n          }\n          function To(e) {\n            return Di(e, wo(e));\n          }\n          function Ao(e) {\n            return null == e ? '' : li(e);\n          }\n          var go = wi(function (e, t) {\n              if (Cs(t) || Wa(t)) Di(t, Ro(t), e);\n              else for (var n in t) Pe.call(t, n) && nr(e, n, t[n]);\n            }),\n            vo = wi(function (e, t) {\n              Di(t, wo(t), e);\n            }),\n            yo = wi(function (e, t, n, r) {\n              Di(t, wo(t), e, r);\n            }),\n            So = wi(function (e, t, n, r) {\n              Di(t, Ro(t), e, r);\n            }),\n            Co = rs(or),\n            No = Xr(function (e, t) {\n              e = Ie(e);\n              var r = -1,\n                i = t.length,\n                s = 2 < i ? t[2] : n;\n              for (s && gs(t[0], t[1], s) && (i = 1); ++r < i; )\n                for (var a = t[r], o = wo(a), c = -1, u = o.length; ++c < u; ) {\n                  var l = o[c],\n                    h = e[l];\n                  (h === n || (Ha(h, we[l]) && !Pe.call(e, l))) && (e[l] = a[l]);\n                }\n              return e;\n            }),\n            bo = Xr(function (e) {\n              return (e.push(n, es), Nt(Mo, n, e));\n            });\n          function Io(e, t, r) {\n            return (e = null == e ? n : Cr(e, t)) === n ? r : e;\n          }\n          function Oo(e, t) {\n            return null != e && _s(e, t, kr);\n          }\n          var ko = ji(function (e, t, n) {\n              e[(t = null != t && 'function' != typeof t.toString ? Ue.call(t) : t)] = n;\n            }, tc(ic)),\n            Lo = ji(function (e, t, n) {\n              (null != t && 'function' != typeof t.toString && (t = Ue.call(t)),\n                Pe.call(e, t) ? e[t].push(n) : (e[t] = [n]));\n            }, us),\n            Do = Xr(Dr);\n          function Ro(e) {\n            return (Wa(e) ? Xn : Br)(e);\n          }\n          function wo(e) {\n            return Wa(e)\n              ? Xn(e, !0)\n              : (function (e) {\n                  if (!eo(e))\n                    return (function (e) {\n                      var t = [];\n                      if (null != e) for (var n in Ie(e)) t.push(n);\n                      return t;\n                    })(e);\n                  var r,\n                    t = Cs(e),\n                    n = [];\n                  for (r in e) ('constructor' != r || (!t && Pe.call(e, r))) && n.push(r);\n                  return n;\n                })(e);\n          }\n          var xo = wi(function (e, t, n) {\n              qr(e, t, n);\n            }),\n            Mo = wi(function (e, t, n, r) {\n              qr(e, t, n, r);\n            }),\n            Po = rs(function (e, t) {\n              var n = {};\n              if (null != e) {\n                var r = !1;\n                ((t = wt(t, function (t) {\n                  return ((t = gi(t, e)), (r = r || 1 < t.length), t);\n                })),\n                  Di(e, ss(e), n),\n                  r && (n = ur(n, 7, ts)));\n                for (var i = t.length; i--; ) fi(n, t[i]);\n              }\n              return n;\n            }),\n            Bo = rs(function (e, t) {\n              return null == e\n                ? {}\n                : (function (e, t) {\n                    return Wr(e, t, function (t, n) {\n                      return Oo(e, n);\n                    });\n                  })(e, t);\n            });\n          function Fo(e, t) {\n            var n;\n            return null == e\n              ? {}\n              : ((n = wt(ss(e), function (e) {\n                  return [e];\n                })),\n                (t = us(t)),\n                Wr(e, n, function (e, n) {\n                  return t(e, n[0]);\n                }));\n          }\n          var Uo = Xi(Ro),\n            Ho = Xi(wo);\n          function Go(e) {\n            return null == e ? [] : Zt(e, Ro(e));\n          }\n          var jo = Bi(function (e, t, n) {\n            return ((t = t.toLowerCase()), e + (n ? qo(t) : t));\n          });\n          function qo(e) {\n            return Xo(Ao(e).toLowerCase());\n          }\n          function Yo(e) {\n            return (e = Ao(e)) && e.replace(Ae, nn).replace(Je, '');\n          }\n          var Ko = Bi(function (e, t, n) {\n              return e + (n ? '-' : '') + t.toLowerCase();\n            }),\n            Wo = Bi(function (e, t, n) {\n              return e + (n ? ' ' : '') + t.toLowerCase();\n            }),\n            Vo = Pi('toLowerCase'),\n            $o = Bi(function (e, t, n) {\n              return e + (n ? '_' : '') + t.toLowerCase();\n            }),\n            Qo = Bi(function (e, t, n) {\n              return e + (n ? ' ' : '') + Xo(t);\n            }),\n            zo = Bi(function (e, t, n) {\n              return e + (n ? ' ' : '') + t.toUpperCase();\n            }),\n            Xo = Pi('toUpperCase');\n          function Zo(e, t, r) {\n            return (\n              (e = Ao(e)),\n              (t = r ? n : t) === n\n                ? ((function (e) {\n                    return rt.test(e);\n                  })(e)\n                    ? function (e) {\n                        return e.match(tt) || [];\n                      }\n                    : function (e) {\n                        return e.match(ue) || [];\n                      })(e)\n                : e.match(t) || []\n            );\n          }\n          var Jo = Xr(function (e, t) {\n              try {\n                return Nt(e, n, t);\n              } catch (e) {\n                return za(e) ? e : new Ce(e);\n              }\n            }),\n            ec = rs(function (e, t) {\n              return (\n                It(t, function (t) {\n                  ((t = Bs(t)), ar(e, t, ka(e[t], e)));\n                }),\n                e\n              );\n            });\n          function tc(e) {\n            return function () {\n              return e;\n            };\n          }\n          var nc = Hi(),\n            rc = Hi(!0);\n          function ic(e) {\n            return e;\n          }\n          function sc(e) {\n            return Pr('function' == typeof e ? e : ur(e, 1));\n          }\n          var ac = Xr(function (e, t) {\n              return function (n) {\n                return Dr(n, e, t);\n              };\n            }),\n            oc = Xr(function (e, t) {\n              return function (n) {\n                return Dr(e, n, t);\n              };\n            });\n          function cc(e, t, n) {\n            var r = Ro(t),\n              i = Sr(t, r),\n              s =\n                (null != n || (eo(t) && (i.length || !r.length)) || ((n = t), (t = e), (e = this), (i = Sr(t, Ro(t)))),\n                !(eo(n) && 'chain' in n && !n.chain)),\n              a = Xa(e);\n            return (\n              It(i, function (n) {\n                var r = t[n];\n                ((e[n] = r),\n                  a &&\n                    (e.prototype[n] = function () {\n                      var n,\n                        t = this.__chain__;\n                      return s || t\n                        ? (((n = e(this.__wrapped__)).__actions__ = Li(this.__actions__)).push({\n                            func: r,\n                            args: arguments,\n                            thisArg: e,\n                          }),\n                          (n.__chain__ = t),\n                          n)\n                        : r.apply(e, xt([this.value()], arguments));\n                    }));\n              }),\n              e\n            );\n          }\n          function uc() {}\n          var lc = Yi(wt),\n            hc = Yi(kt),\n            fc = Yi(Bt);\n          function pc(e) {\n            return vs(e)\n              ? Kt(Bs(e))\n              : (function (e) {\n                  return function (t) {\n                    return Cr(t, e);\n                  };\n                })(e);\n          }\n          var dc = Wi(),\n            mc = Wi(!0);\n          function _c() {\n            return [];\n          }\n          function Ec() {\n            return !1;\n          }\n          var yc,\n            Tc = qi(function (e, t) {\n              return e + t;\n            }, 0),\n            Ac = Qi('ceil'),\n            gc = qi(function (e, t) {\n              return e / t;\n            }, 1),\n            vc = Qi('floor'),\n            Sc = qi(function (e, t) {\n              return e * t;\n            }, 1),\n            Cc = Qi('round'),\n            Nc = qi(function (e, t) {\n              return e - t;\n            }, 0);\n          return (\n            (Gn.after = function (e, t) {\n              if ('function' != typeof t) throw new Le(r);\n              return (\n                (e = mo(e)),\n                function () {\n                  if (--e < 1) return t.apply(this, arguments);\n                }\n              );\n            }),\n            (Gn.ary = Ia),\n            (Gn.assign = go),\n            (Gn.assignIn = vo),\n            (Gn.assignInWith = yo),\n            (Gn.assignWith = So),\n            (Gn.at = Co),\n            (Gn.before = Oa),\n            (Gn.bind = ka),\n            (Gn.bindAll = ec),\n            (Gn.bindKey = La),\n            (Gn.castArray = function () {\n              var e;\n              return arguments.length ? (Ya((e = arguments[0])) ? e : [e]) : [];\n            }),\n            (Gn.chain = fa),\n            (Gn.chunk = function (e, t, r) {\n              t = (r ? gs(e, t, r) : t === n) ? 1 : An(mo(t), 0);\n              var i = null == e ? 0 : e.length;\n              if (!i || t < 1) return [];\n              for (var s = 0, a = 0, o = ye(mt(i / t)); s < i; ) o[a++] = ii(e, s, (s += t));\n              return o;\n            }),\n            (Gn.compact = function (e) {\n              for (var t = -1, n = null == e ? 0 : e.length, r = 0, i = []; ++t < n; ) {\n                var s = e[t];\n                s && (i[r++] = s);\n              }\n              return i;\n            }),\n            (Gn.concat = function () {\n              var e = arguments.length;\n              if (!e) return [];\n              for (var t = ye(e - 1), n = arguments[0], r = e; r--; ) t[r - 1] = arguments[r];\n              return xt(Ya(n) ? Li(n) : [n], Tr(t, 1));\n            }),\n            (Gn.cond = function (e) {\n              var t = null == e ? 0 : e.length,\n                n = us();\n              return (\n                (e = t\n                  ? wt(e, function (e) {\n                      if ('function' != typeof e[1]) throw new Le(r);\n                      return [n(e[0]), e[1]];\n                    })\n                  : []),\n                Xr(function (n) {\n                  for (var r = -1; ++r < t; ) {\n                    var i = e[r];\n                    if (Nt(i[0], this, n)) return Nt(i[1], this, n);\n                  }\n                })\n              );\n            }),\n            (Gn.conforms = function (e) {\n              return (function (e) {\n                var t = Ro(e);\n                return function (n) {\n                  return lr(n, e, t);\n                };\n              })(ur(e, 1));\n            }),\n            (Gn.constant = tc),\n            (Gn.countBy = ma),\n            (Gn.create = function (e, t) {\n              return ((e = jn(e)), null == t ? e : sr(e, t));\n            }),\n            (Gn.curry = function e(t, r, i) {\n              return (((t = Zi(t, 8, n, n, n, n, n, (r = i ? n : r))).placeholder = e.placeholder), t);\n            }),\n            (Gn.curryRight = function e(t, r, i) {\n              return (((t = Zi(t, 16, n, n, n, n, n, (r = i ? n : r))).placeholder = e.placeholder), t);\n            }),\n            (Gn.debounce = Da),\n            (Gn.defaults = No),\n            (Gn.defaultsDeep = bo),\n            (Gn.defer = ft),\n            (Gn.delay = wa),\n            (Gn.difference = ht),\n            (Gn.differenceBy = Se),\n            (Gn.differenceWith = In),\n            (Gn.drop = function (e, t, r) {\n              var i = null == e ? 0 : e.length;\n              return i ? ii(e, (t = r || t === n ? 1 : mo(t)) < 0 ? 0 : t, i) : [];\n            }),\n            (Gn.dropRight = function (e, t, r) {\n              var i = null == e ? 0 : e.length;\n              return i ? ii(e, 0, (t = i - (r || t === n ? 1 : mo(t))) < 0 ? 0 : t) : [];\n            }),\n            (Gn.dropRightWhile = function (e, t) {\n              return e && e.length ? di(e, us(t, 3), !0, !0) : [];\n            }),\n            (Gn.dropWhile = function (e, t) {\n              return e && e.length ? di(e, us(t, 3), !0) : [];\n            }),\n            (Gn.fill = function (e, t, r, i) {\n              var s = null == e ? 0 : e.length;\n              return s\n                ? (r && 'number' != typeof r && gs(e, t, r) && ((r = 0), (i = s)),\n                  (function (e, t, r, i) {\n                    var s = e.length;\n                    for (\n                      (r = mo(r)) < 0 && (r = s < -r ? 0 : s + r),\n                        (i = i === n || s < i ? s : mo(i)) < 0 && (i += s),\n                        i = i < r ? 0 : _o(i);\n                      r < i;\n                    )\n                      e[r++] = t;\n                    return e;\n                  })(e, t, r, i))\n                : [];\n            }),\n            (Gn.filter = function (e, t) {\n              return (Ya(e) ? Lt : Er)(e, us(t, 3));\n            }),\n            (Gn.flatMap = function (e, t) {\n              return Tr(Sa(e, t), 1);\n            }),\n            (Gn.flatMapDeep = function (e, t) {\n              return Tr(Sa(e, t), h);\n            }),\n            (Gn.flatMapDepth = function (e, t, r) {\n              return ((r = r === n ? 1 : mo(r)), Tr(Sa(e, t), r));\n            }),\n            (Gn.flatten = Ks),\n            (Gn.flattenDeep = function (e) {\n              return null != e && e.length ? Tr(e, h) : [];\n            }),\n            (Gn.flattenDepth = function (e, t) {\n              return null != e && e.length ? Tr(e, (t = t === n ? 1 : mo(t))) : [];\n            }),\n            (Gn.flip = function (e) {\n              return Zi(e, 512);\n            }),\n            (Gn.flow = nc),\n            (Gn.flowRight = rc),\n            (Gn.fromPairs = function (e) {\n              for (var t = -1, n = null == e ? 0 : e.length, r = {}; ++t < n; ) {\n                var i = e[t];\n                r[i[0]] = i[1];\n              }\n              return r;\n            }),\n            (Gn.functions = function (e) {\n              return null == e ? [] : Sr(e, Ro(e));\n            }),\n            (Gn.functionsIn = function (e) {\n              return null == e ? [] : Sr(e, wo(e));\n            }),\n            (Gn.groupBy = ga),\n            (Gn.initial = function (e) {\n              return null != e && e.length ? ii(e, 0, -1) : [];\n            }),\n            (Gn.intersection = t),\n            (Gn.intersectionBy = xe),\n            (Gn.intersectionWith = dt),\n            (Gn.invert = ko),\n            (Gn.invertBy = Lo),\n            (Gn.invokeMap = va),\n            (Gn.iteratee = sc),\n            (Gn.keyBy = ya),\n            (Gn.keys = Ro),\n            (Gn.keysIn = wo),\n            (Gn.map = Sa),\n            (Gn.mapKeys = function (e, t) {\n              var n = {};\n              return (\n                (t = us(t, 3)),\n                vr(e, function (e, r, i) {\n                  ar(n, t(e, r, i), e);\n                }),\n                n\n              );\n            }),\n            (Gn.mapValues = function (e, t) {\n              var n = {};\n              return (\n                (t = us(t, 3)),\n                vr(e, function (e, r, i) {\n                  ar(n, r, t(e, r, i));\n                }),\n                n\n              );\n            }),\n            (Gn.matches = function (e) {\n              return Gr(ur(e, 1));\n            }),\n            (Gn.matchesProperty = function (e, t) {\n              return jr(e, ur(t, 1));\n            }),\n            (Gn.memoize = xa),\n            (Gn.merge = xo),\n            (Gn.mergeWith = Mo),\n            (Gn.method = ac),\n            (Gn.methodOf = oc),\n            (Gn.mixin = cc),\n            (Gn.negate = Ma),\n            (Gn.nthArg = function (e) {\n              return (\n                (e = mo(e)),\n                Xr(function (t) {\n                  return Yr(t, e);\n                })\n              );\n            }),\n            (Gn.omit = Po),\n            (Gn.omitBy = function (e, t) {\n              return Fo(e, Ma(us(t)));\n            }),\n            (Gn.once = function (e) {\n              return Oa(2, e);\n            }),\n            (Gn.orderBy = function (e, t, r, i) {\n              return null == e\n                ? []\n                : Kr(e, (t = Ya(t) ? t : null == t ? [] : [t]), (r = Ya((r = i ? n : r)) ? r : null == r ? [] : [r]));\n            }),\n            (Gn.over = lc),\n            (Gn.overArgs = vi),\n            (Gn.overEvery = hc),\n            (Gn.overSome = fc),\n            (Gn.partial = Ba),\n            (Gn.partialRight = Fa),\n            (Gn.partition = Ca),\n            (Gn.pick = Bo),\n            (Gn.pickBy = Fo),\n            (Gn.property = pc),\n            (Gn.propertyOf = function (e) {\n              return function (t) {\n                return null == e ? n : Cr(e, t);\n              };\n            }),\n            (Gn.pull = Ye),\n            (Gn.pullAll = Zs),\n            (Gn.pullAllBy = function (e, t, n) {\n              return e && e.length && t && t.length ? Vr(e, t, us(n, 2)) : e;\n            }),\n            (Gn.pullAllWith = function (e, t, r) {\n              return e && e.length && t && t.length ? Vr(e, t, n, r) : e;\n            }),\n            (Gn.pullAt = Js),\n            (Gn.range = dc),\n            (Gn.rangeRight = mc),\n            (Gn.rearg = Ua),\n            (Gn.reject = function (e, t) {\n              return (Ya(e) ? Lt : Er)(e, Ma(us(t, 3)));\n            }),\n            (Gn.remove = function (e, t) {\n              var n = [];\n              if (e && e.length) {\n                var r = -1,\n                  i = [],\n                  s = e.length;\n                for (t = us(t, 3); ++r < s; ) {\n                  var a = e[r];\n                  t(a, r, e) && (n.push(a), i.push(r));\n                }\n                $r(e, i);\n              }\n              return n;\n            }),\n            (Gn.rest = function (e, t) {\n              if ('function' != typeof e) throw new Le(r);\n              return Xr(e, (t = t === n ? t : mo(t)));\n            }),\n            (Gn.reverse = ea),\n            (Gn.sampleSize = function (e, t, r) {\n              return (\n                (t = (r ? gs(e, t, r) : t === n) ? 1 : mo(t)),\n                (Ya(e)\n                  ? function (e, t) {\n                      return Ms(Li(e), cr(t, 0, e.length));\n                    }\n                  : function (e, t) {\n                      return Ms((e = Go(e)), cr(t, 0, e.length));\n                    })(e, t)\n              );\n            }),\n            (Gn.set = function (e, t, n) {\n              return null == e ? e : ei(e, t, n);\n            }),\n            (Gn.setWith = function (e, t, r, i) {\n              return ((i = 'function' == typeof i ? i : n), null == e ? e : ei(e, t, r, i));\n            }),\n            (Gn.shuffle = function (e) {\n              return (\n                Ya(e)\n                  ? function (e) {\n                      return Ms(Li(e));\n                    }\n                  : function (e) {\n                      return Ms(Go(e));\n                    }\n              )(e);\n            }),\n            (Gn.slice = function (e, t, r) {\n              var i = null == e ? 0 : e.length;\n              return i\n                ? ((r =\n                    r && 'number' != typeof r && gs(e, t, r)\n                      ? ((t = 0), i)\n                      : ((t = null == t ? 0 : mo(t)), r === n ? i : mo(r))),\n                  ii(e, t, r))\n                : [];\n            }),\n            (Gn.sortBy = Na),\n            (Gn.sortedUniq = function (e) {\n              return e && e.length ? ci(e) : [];\n            }),\n            (Gn.sortedUniqBy = function (e, t) {\n              return e && e.length ? ci(e, us(t, 2)) : [];\n            }),\n            (Gn.split = function (e, t, r) {\n              return (\n                r && 'number' != typeof r && gs(e, t, r) && (t = r = n),\n                (r = r === n ? d : r >>> 0)\n                  ? (e = Ao(e)) && ('string' == typeof t || (null != t && !so(t))) && !(t = li(t)) && an(e)\n                    ? yi(pn(e), 0, r)\n                    : e.split(t, r)\n                  : []\n              );\n            }),\n            (Gn.spread = function (e, t) {\n              if ('function' != typeof e) throw new Le(r);\n              return (\n                (t = null == t ? 0 : An(mo(t), 0)),\n                Xr(function (n) {\n                  var r = n[t],\n                    n = yi(n, 0, t);\n                  return (r && xt(n, r), Nt(e, this, n));\n                })\n              );\n            }),\n            (Gn.tail = function (e) {\n              var t = null == e ? 0 : e.length;\n              return t ? ii(e, 1, t) : [];\n            }),\n            (Gn.take = function (e, t, r) {\n              return e && e.length ? ii(e, 0, (t = r || t === n ? 1 : mo(t)) < 0 ? 0 : t) : [];\n            }),\n            (Gn.takeRight = function (e, t, r) {\n              var i = null == e ? 0 : e.length;\n              return i ? ii(e, (t = i - (r || t === n ? 1 : mo(t))) < 0 ? 0 : t, i) : [];\n            }),\n            (Gn.takeRightWhile = function (e, t) {\n              return e && e.length ? di(e, us(t, 3), !1, !0) : [];\n            }),\n            (Gn.takeWhile = function (e, t) {\n              return e && e.length ? di(e, us(t, 3)) : [];\n            }),\n            (Gn.tap = function (e, t) {\n              return (t(e), e);\n            }),\n            (Gn.throttle = function (e, t, n) {\n              var i = !0,\n                s = !0;\n              if ('function' != typeof e) throw new Le(r);\n              return (\n                eo(n) && ((i = 'leading' in n ? !!n.leading : i), (s = 'trailing' in n ? !!n.trailing : s)),\n                Da(e, t, { leading: i, maxWait: t, trailing: s })\n              );\n            }),\n            (Gn.thru = pa),\n            (Gn.toArray = fo),\n            (Gn.toPairs = Uo),\n            (Gn.toPairsIn = Ho),\n            (Gn.toPath = function (e) {\n              return Ya(e) ? wt(e, Bs) : co(e) ? [e] : Li(Ps(Ao(e)));\n            }),\n            (Gn.toPlainObject = To),\n            (Gn.transform = function (e, t, n) {\n              var s,\n                r = Ya(e),\n                i = r || $a(e) || uo(e);\n              return (\n                (t = us(t, 4)),\n                null == n && ((s = e && e.constructor), (n = i ? (r ? new s() : []) : eo(e) && Xa(s) ? jn(Ve(e)) : {})),\n                (i ? It : vr)(e, function (e, r, i) {\n                  return t(n, e, r, i);\n                }),\n                n\n              );\n            }),\n            (Gn.unary = function (e) {\n              return Ia(e, 1);\n            }),\n            (Gn.union = ta),\n            (Gn.unionBy = na),\n            (Gn.unionWith = ra),\n            (Gn.uniq = function (e) {\n              return e && e.length ? hi(e) : [];\n            }),\n            (Gn.uniqBy = function (e, t) {\n              return e && e.length ? hi(e, us(t, 2)) : [];\n            }),\n            (Gn.uniqWith = function (e, t) {\n              return ((t = 'function' == typeof t ? t : n), e && e.length ? hi(e, n, t) : []);\n            }),\n            (Gn.unset = function (e, t) {\n              return null == e || fi(e, t);\n            }),\n            (Gn.unzip = ia),\n            (Gn.unzipWith = sa),\n            (Gn.update = function (e, t, n) {\n              return null == e ? e : pi(e, t, Ai(n));\n            }),\n            (Gn.updateWith = function (e, t, r, i) {\n              return ((i = 'function' == typeof i ? i : n), null == e ? e : pi(e, t, Ai(r), i));\n            }),\n            (Gn.values = Go),\n            (Gn.valuesIn = function (e) {\n              return null == e ? [] : Zt(e, wo(e));\n            }),\n            (Gn.without = aa),\n            (Gn.words = Zo),\n            (Gn.wrap = function (e, t) {\n              return Ba(Ai(t), e);\n            }),\n            (Gn.xor = oa),\n            (Gn.xorBy = ca),\n            (Gn.xorWith = ua),\n            (Gn.zip = la),\n            (Gn.zipObject = function (e, t) {\n              return Ei(e || [], t || [], nr);\n            }),\n            (Gn.zipObjectDeep = function (e, t) {\n              return Ei(e || [], t || [], ei);\n            }),\n            (Gn.zipWith = ha),\n            (Gn.entries = Uo),\n            (Gn.entriesIn = Ho),\n            (Gn.extend = vo),\n            (Gn.extendWith = yo),\n            cc(Gn, Gn),\n            (Gn.add = Tc),\n            (Gn.attempt = Jo),\n            (Gn.camelCase = jo),\n            (Gn.capitalize = qo),\n            (Gn.ceil = Ac),\n            (Gn.clamp = function (e, t, r) {\n              return (\n                r === n && ((r = t), (t = n)),\n                r !== n && (r = (r = Eo(r)) == r ? r : 0),\n                t !== n && (t = (t = Eo(t)) == t ? t : 0),\n                cr(Eo(e), t, r)\n              );\n            }),\n            (Gn.clone = function (e) {\n              return ur(e, 4);\n            }),\n            (Gn.cloneDeep = function (e) {\n              return ur(e, 5);\n            }),\n            (Gn.cloneDeepWith = function (e, t) {\n              return ur(e, 5, (t = 'function' == typeof t ? t : n));\n            }),\n            (Gn.cloneWith = function (e, t) {\n              return ur(e, 4, (t = 'function' == typeof t ? t : n));\n            }),\n            (Gn.conformsTo = function (e, t) {\n              return null == t || lr(e, t, Ro(t));\n            }),\n            (Gn.deburr = Yo),\n            (Gn.defaultTo = function (e, t) {\n              return null == e || e != e ? t : e;\n            }),\n            (Gn.divide = gc),\n            (Gn.endsWith = function (e, t, r) {\n              ((e = Ao(e)), (t = li(t)));\n              var i = e.length,\n                i = (r = r === n ? i : cr(mo(r), 0, i));\n              return 0 <= (r -= t.length) && e.slice(r, i) == t;\n            }),\n            (Gn.eq = Ha),\n            (Gn.escape = function (e) {\n              return (e = Ao(e)) && Q.test(e) ? e.replace(V, rn) : e;\n            }),\n            (Gn.escapeRegExp = function (e) {\n              return (e = Ao(e)) && re.test(e) ? e.replace(ne, '\\\\$&') : e;\n            }),\n            (Gn.every = function (e, t, r) {\n              return (\n                Ya(e)\n                  ? kt\n                  : function (e, t) {\n                      var n = !0;\n                      return (\n                        pr(e, function (e, r, i) {\n                          return (n = !!t(e, r, i));\n                        }),\n                        n\n                      );\n                    }\n              )(e, us((t = r && gs(e, t, r) ? n : t), 3));\n            }),\n            (Gn.find = _a),\n            (Gn.findIndex = qs),\n            (Gn.findKey = function (e, t) {\n              return Ut(e, us(t, 3), vr);\n            }),\n            (Gn.findLast = Ea),\n            (Gn.findLastIndex = Ys),\n            (Gn.findLastKey = function (e, t) {\n              return Ut(e, us(t, 3), yr);\n            }),\n            (Gn.floor = vc),\n            (Gn.forEach = Ta),\n            (Gn.forEachRight = Aa),\n            (Gn.forIn = function (e, t) {\n              return null == e ? e : Ar(e, us(t, 3), wo);\n            }),\n            (Gn.forInRight = function (e, t) {\n              return null == e ? e : gr(e, us(t, 3), wo);\n            }),\n            (Gn.forOwn = function (e, t) {\n              return e && vr(e, us(t, 3));\n            }),\n            (Gn.forOwnRight = function (e, t) {\n              return e && yr(e, us(t, 3));\n            }),\n            (Gn.get = Io),\n            (Gn.gt = Ga),\n            (Gn.gte = ja),\n            (Gn.has = function (e, t) {\n              return null != e && _s(e, t, Or);\n            }),\n            (Gn.hasIn = Oo),\n            (Gn.head = Ws),\n            (Gn.identity = ic),\n            (Gn.includes = function (e, t, n, r) {\n              return (\n                (e = Wa(e) ? e : Go(e)),\n                (n = n && !r ? mo(n) : 0),\n                (r = e.length),\n                n < 0 && (n = An(r + n, 0)),\n                oo(e) ? n <= r && -1 < e.indexOf(t, n) : !!r && -1 < Gt(e, t, n)\n              );\n            }),\n            (Gn.indexOf = function (e, t, n) {\n              var r = null == e ? 0 : e.length;\n              return r ? Gt(e, t, (e = (e = null == n ? 0 : mo(n)) < 0 ? An(r + e, 0) : e)) : -1;\n            }),\n            (Gn.inRange = function (e, t, r) {\n              return (\n                (t = po(t)),\n                r === n ? ((r = t), (t = 0)) : (r = po(r)),\n                (function (e, t, n) {\n                  return e >= gn(t, n) && e < An(t, n);\n                })((e = Eo(e)), t, r)\n              );\n            }),\n            (Gn.invoke = Do),\n            (Gn.isArguments = qa),\n            (Gn.isArray = Ya),\n            (Gn.isArrayBuffer = Ka),\n            (Gn.isArrayLike = Wa),\n            (Gn.isArrayLikeObject = Va),\n            (Gn.isBoolean = function (e) {\n              return !0 === e || !1 === e || (to(e) && br(e) == T);\n            }),\n            (Gn.isBuffer = $a),\n            (Gn.isDate = Re),\n            (Gn.isElement = function (e) {\n              return to(e) && 1 === e.nodeType && !io(e);\n            }),\n            (Gn.isEmpty = function (e) {\n              if (null != e) {\n                if (\n                  Wa(e) &&\n                  (Ya(e) || 'string' == typeof e || 'function' == typeof e.splice || $a(e) || uo(e) || qa(e))\n                )\n                  return !e.length;\n                var n,\n                  t = ms(e);\n                if (t == S || t == O) return !e.size;\n                if (Cs(e)) return !Br(e).length;\n                for (n in e) if (Pe.call(e, n)) return !1;\n              }\n              return !0;\n            }),\n            (Gn.isEqual = function (e, t) {\n              return wr(e, t);\n            }),\n            (Gn.isEqualWith = function (e, t, r) {\n              var i = (r = 'function' == typeof r ? r : n) ? r(e, t) : n;\n              return i === n ? wr(e, t, n, r) : !!i;\n            }),\n            (Gn.isError = za),\n            (Gn.isFinite = function (e) {\n              return 'number' == typeof e && Wt(e);\n            }),\n            (Gn.isFunction = Xa),\n            (Gn.isInteger = Za),\n            (Gn.isLength = Ja),\n            (Gn.isMap = no),\n            (Gn.isMatch = function (e, t) {\n              return e === t || xr(e, t, hs(t));\n            }),\n            (Gn.isMatchWith = function (e, t, r) {\n              return ((r = 'function' == typeof r ? r : n), xr(e, t, hs(t), r));\n            }),\n            (Gn.isNaN = function (e) {\n              return ro(e) && e != +e;\n            }),\n            (Gn.isNative = function (e) {\n              if (Ss(e)) throw new Ce('Unsupported core-js use. Try https://npms.io/search?q=ponyfill.');\n              return Mr(e);\n            }),\n            (Gn.isNil = function (e) {\n              return null == e;\n            }),\n            (Gn.isNull = function (e) {\n              return null === e;\n            }),\n            (Gn.isNumber = ro),\n            (Gn.isObject = eo),\n            (Gn.isObjectLike = to),\n            (Gn.isPlainObject = io),\n            (Gn.isRegExp = so),\n            (Gn.isSafeInteger = function (e) {\n              return Za(e) && -9007199254740991 <= e && e <= f;\n            }),\n            (Gn.isSet = ao),\n            (Gn.isString = oo),\n            (Gn.isSymbol = co),\n            (Gn.isTypedArray = uo),\n            (Gn.isUndefined = function (e) {\n              return e === n;\n            }),\n            (Gn.isWeakMap = function (e) {\n              return to(e) && ms(e) == D;\n            }),\n            (Gn.isWeakSet = function (e) {\n              return to(e) && '[object WeakSet]' == br(e);\n            }),\n            (Gn.join = function (e, t) {\n              return null == e ? '' : En.call(e, t);\n            }),\n            (Gn.kebabCase = Ko),\n            (Gn.last = zs),\n            (Gn.lastIndexOf = function (e, t, r) {\n              var s,\n                i = null == e ? 0 : e.length;\n              return i\n                ? ((s = i),\n                  r !== n && (s = (s = mo(r)) < 0 ? An(i + s, 0) : gn(s, i - 1)),\n                  t == t\n                    ? (function (e, t) {\n                        for (var r = s + 1; r--; ) if (e[r] === t) return r;\n                        return r;\n                      })(e, t)\n                    : Ht(e, qt, s, !0))\n                : -1;\n            }),\n            (Gn.lowerCase = Wo),\n            (Gn.lowerFirst = Vo),\n            (Gn.lt = lo),\n            (Gn.lte = ho),\n            (Gn.max = function (e) {\n              return e && e.length ? _r(e, ic, Ir) : n;\n            }),\n            (Gn.maxBy = function (e, t) {\n              return e && e.length ? _r(e, us(t, 2), Ir) : n;\n            }),\n            (Gn.mean = function (e) {\n              return Yt(e, ic);\n            }),\n            (Gn.meanBy = function (e, t) {\n              return Yt(e, us(t, 2));\n            }),\n            (Gn.min = function (e) {\n              return e && e.length ? _r(e, ic, Ur) : n;\n            }),\n            (Gn.minBy = function (e, t) {\n              return e && e.length ? _r(e, us(t, 2), Ur) : n;\n            }),\n            (Gn.stubArray = _c),\n            (Gn.stubFalse = Ec),\n            (Gn.stubObject = function () {\n              return {};\n            }),\n            (Gn.stubString = function () {\n              return '';\n            }),\n            (Gn.stubTrue = function () {\n              return !0;\n            }),\n            (Gn.multiply = Sc),\n            (Gn.nth = function (e, t) {\n              return e && e.length ? Yr(e, mo(t)) : n;\n            }),\n            (Gn.noConflict = function () {\n              return (pt._ === this && (pt._ = Ge), this);\n            }),\n            (Gn.noop = uc),\n            (Gn.now = ba),\n            (Gn.pad = function (e, t, n) {\n              e = Ao(e);\n              var r = (t = mo(t)) ? fn(e) : 0;\n              return !t || t <= r ? e : Ki(Et((t = (t - r) / 2)), n) + e + Ki(mt(t), n);\n            }),\n            (Gn.padEnd = function (e, t, n) {\n              e = Ao(e);\n              var r = (t = mo(t)) ? fn(e) : 0;\n              return t && r < t ? e + Ki(t - r, n) : e;\n            }),\n            (Gn.padStart = function (e, t, n) {\n              e = Ao(e);\n              var r = (t = mo(t)) ? fn(e) : 0;\n              return t && r < t ? Ki(t - r, n) + e : e;\n            }),\n            (Gn.parseInt = function (e, t, n) {\n              return ((t = n || null == t ? 0 : t && +t), yn(Ao(e).replace(ie, ''), t || 0));\n            }),\n            (Gn.random = function (e, t, r) {\n              var i;\n              return (\n                r && 'boolean' != typeof r && gs(e, t, r) && (t = r = n),\n                r === n && ('boolean' == typeof t ? ((r = t), (t = n)) : 'boolean' == typeof e && ((r = e), (e = n))),\n                e === n && t === n ? ((e = 0), (t = 1)) : ((e = po(e)), t === n ? ((t = e), (e = 0)) : (t = po(t))),\n                t < e && ((i = e), (e = t), (t = i)),\n                r || e % 1 || t % 1\n                  ? ((i = Sn()), gn(e + i * (t - e + ut('1e-' + ((i + '').length - 1))), t))\n                  : Qr(e, t)\n              );\n            }),\n            (Gn.reduce = function (e, t, n) {\n              var r = Ya(e) ? Mt : Vt,\n                i = arguments.length < 3;\n              return r(e, us(t, 4), n, i, pr);\n            }),\n            (Gn.reduceRight = function (e, t, n) {\n              var r = Ya(e) ? Pt : Vt,\n                i = arguments.length < 3;\n              return r(e, us(t, 4), n, i, dr);\n            }),\n            (Gn.repeat = function (e, t, r) {\n              return ((t = (r ? gs(e, t, r) : t === n) ? 1 : mo(t)), zr(Ao(e), t));\n            }),\n            (Gn.replace = function () {\n              var e = arguments,\n                t = Ao(e[0]);\n              return e.length < 3 ? t : t.replace(e[1], e[2]);\n            }),\n            (Gn.result = function (e, t, r) {\n              var i = -1,\n                s = (t = gi(t, e)).length;\n              for (s || ((s = 1), (e = n)); ++i < s; ) {\n                var a = null == e ? n : e[Bs(t[i])];\n                (a === n && ((i = s), (a = r)), (e = Xa(a) ? a.call(e) : a));\n              }\n              return e;\n            }),\n            (Gn.round = Cc),\n            (Gn.runInContext = e),\n            (Gn.sample = function (e) {\n              return (\n                Ya(e)\n                  ? Zn\n                  : function (e) {\n                      return Zn(Go(e));\n                    }\n              )(e);\n            }),\n            (Gn.size = function (e) {\n              var t;\n              return null == e\n                ? 0\n                : Wa(e)\n                  ? oo(e)\n                    ? fn(e)\n                    : e.length\n                  : (t = ms(e)) == S || t == O\n                    ? e.size\n                    : Br(e).length;\n            }),\n            (Gn.snakeCase = $o),\n            (Gn.some = function (e, t, r) {\n              return (\n                Ya(e)\n                  ? Bt\n                  : function (e, t) {\n                      var n;\n                      return (\n                        pr(e, function (e, r, i) {\n                          return !(n = t(e, r, i));\n                        }),\n                        !!n\n                      );\n                    }\n              )(e, us((t = r && gs(e, t, r) ? n : t), 3));\n            }),\n            (Gn.sortedIndex = function (e, t) {\n              return ai(e, t);\n            }),\n            (Gn.sortedIndexBy = function (e, t, n) {\n              return oi(e, t, us(n, 2));\n            }),\n            (Gn.sortedIndexOf = function (e, t) {\n              var n = null == e ? 0 : e.length;\n              if (n) {\n                var r = ai(e, t);\n                if (r < n && Ha(e[r], t)) return r;\n              }\n              return -1;\n            }),\n            (Gn.sortedLastIndex = function (e, t) {\n              return ai(e, t, !0);\n            }),\n            (Gn.sortedLastIndexBy = function (e, t, n) {\n              return oi(e, t, us(n, 2), !0);\n            }),\n            (Gn.sortedLastIndexOf = function (e, t) {\n              if (null != e && e.length) {\n                var n = ai(e, t, !0) - 1;\n                if (Ha(e[n], t)) return n;\n              }\n              return -1;\n            }),\n            (Gn.startCase = Qo),\n            (Gn.startsWith = function (e, t, n) {\n              return (\n                (e = Ao(e)),\n                (n = null == n ? 0 : cr(mo(n), 0, e.length)),\n                (t = li(t)),\n                e.slice(n, n + t.length) == t\n              );\n            }),\n            (Gn.subtract = Nc),\n            (Gn.sum = function (e) {\n              return e && e.length ? $t(e, ic) : 0;\n            }),\n            (Gn.sumBy = function (e, t) {\n              return e && e.length ? $t(e, us(t, 2)) : 0;\n            }),\n            (Gn.template = function (e, t, r) {\n              var i = Gn.templateSettings;\n              (r && gs(e, t, r) && (t = n), (e = Ao(e)), (t = yo({}, t, i, Ji)));\n              var s,\n                a,\n                c = Ro((r = yo({}, t.imports, i.imports, Ji))),\n                u = Zt(r, c),\n                l = 0,\n                i = t.interpolate || ge,\n                f = \"__p += '\",\n                r = Oe(\n                  (t.escape || ge).source +\n                    '|' +\n                    i.source +\n                    '|' +\n                    (i === Z ? fe : ge).source +\n                    '|' +\n                    (t.evaluate || ge).source +\n                    '|$',\n                  'g',\n                ),\n                d =\n                  '//# sourceURL=' +\n                  (Pe.call(t, 'sourceURL')\n                    ? (t.sourceURL + '').replace(/\\s/g, ' ')\n                    : 'lodash.templateSources[' + ++st + ']') +\n                  '\\n';\n              if (\n                (e.replace(r, function (t, n, r, i, o, c) {\n                  return (\n                    (r = r || i),\n                    (f += e.slice(l, c).replace(ve, sn)),\n                    n && ((s = !0), (f += \"' +\\n__e(\" + n + \") +\\n'\")),\n                    o && ((a = !0), (f += \"';\\n\" + o + \";\\n__p += '\")),\n                    r && (f += \"' +\\n((__t = (\" + r + \")) == null ? '' : __t) +\\n'\"),\n                    (l = c + t.length),\n                    t\n                  );\n                }),\n                (f += \"';\\n\"),\n                (i = Pe.call(t, 'variable') && t.variable))\n              ) {\n                if (le.test(i)) throw new Ce('Invalid `variable` option passed into `_.template`');\n              } else f = 'with (obj) {\\n' + f + '\\n}\\n';\n              if (\n                ((f = (a ? f.replace(q, '') : f).replace(Y, '$1').replace(K, '$1;')),\n                (f =\n                  'function(' +\n                  (i || 'obj') +\n                  ') {\\n' +\n                  (i ? '' : 'obj || (obj = {});\\n') +\n                  \"var __t, __p = ''\" +\n                  (s ? ', __e = _.escape' : '') +\n                  (a ? \", __j = Array.prototype.join;\\nfunction print() { __p += __j.call(arguments, '') }\\n\" : ';\\n') +\n                  f +\n                  'return __p\\n}'),\n                ((r = Jo(function () {\n                  return Ne(c, d + 'return ' + f).apply(n, u);\n                })).source = f),\n                za(r))\n              )\n                throw r;\n              return r;\n            }),\n            (Gn.times = function (e, t) {\n              if ((e = mo(e)) < 1 || f < e) return [];\n              var n = d,\n                r = gn(e, d);\n              for (t = us(t), e -= d, r = Qt(r, t); ++n < e; ) t(n);\n              return r;\n            }),\n            (Gn.toFinite = po),\n            (Gn.toInteger = mo),\n            (Gn.toLength = _o),\n            (Gn.toLower = function (e) {\n              return Ao(e).toLowerCase();\n            }),\n            (Gn.toNumber = Eo),\n            (Gn.toSafeInteger = function (e) {\n              return e ? cr(mo(e), -9007199254740991, f) : 0 === e ? e : 0;\n            }),\n            (Gn.toString = Ao),\n            (Gn.toUpper = function (e) {\n              return Ao(e).toUpperCase();\n            }),\n            (Gn.trim = function (e, t, r) {\n              return (e = Ao(e)) && (r || t === n)\n                ? zt(e)\n                : e && (t = li(t))\n                  ? yi((r = pn(e)), en(r, (t = pn(t))), tn(r, t) + 1).join('')\n                  : e;\n            }),\n            (Gn.trimEnd = function (e, t, r) {\n              return (e = Ao(e)) && (r || t === n)\n                ? e.slice(0, dn(e) + 1)\n                : e && (t = li(t))\n                  ? yi((r = pn(e)), 0, tn(r, pn(t)) + 1).join('')\n                  : e;\n            }),\n            (Gn.trimStart = function (e, t, r) {\n              return (e = Ao(e)) && (r || t === n)\n                ? e.replace(ie, '')\n                : e && (t = li(t))\n                  ? yi((r = pn(e)), en(r, pn(t))).join('')\n                  : e;\n            }),\n            (Gn.truncate = function (e, t) {\n              var s,\n                r = 30,\n                i = '...',\n                t =\n                  (eo(t) &&\n                    ((s = 'separator' in t ? t.separator : s),\n                    (r = 'length' in t ? mo(t.length) : r),\n                    (i = 'omission' in t ? li(t.omission) : i)),\n                  (e = Ao(e)).length);\n              if ((t = an(e) ? (o = pn(e)).length : t) <= r) return e;\n              if ((t = r - fn(i)) < 1) return i;\n              var o,\n                r = o ? yi(o, 0, t).join('') : e.slice(0, t);\n              if (s !== n)\n                if ((o && (t += r.length - t), so(s))) {\n                  if (e.slice(t).search(s)) {\n                    var l,\n                      h = r;\n                    for ((s = s.global ? s : Oe(s.source, Ao(pe.exec(s)) + 'g')).lastIndex = 0; (l = s.exec(h)); )\n                      var f = l.index;\n                    r = r.slice(0, f === n ? t : f);\n                  }\n                } else e.indexOf(li(s), t) != t && -1 < (o = r.lastIndexOf(s)) && (r = r.slice(0, o));\n              return r + i;\n            }),\n            (Gn.unescape = function (e) {\n              return (e = Ao(e)) && $.test(e) ? e.replace(W, mn) : e;\n            }),\n            (Gn.uniqueId = function (e) {\n              var t = ++Be;\n              return Ao(e) + t;\n            }),\n            (Gn.upperCase = zo),\n            (Gn.upperFirst = Xo),\n            (Gn.each = Ta),\n            (Gn.eachRight = Aa),\n            (Gn.first = Ws),\n            cc(\n              Gn,\n              ((yc = {}),\n              vr(Gn, function (e, t) {\n                Pe.call(Gn.prototype, t) || (yc[t] = e);\n              }),\n              yc),\n              { chain: !1 },\n            ),\n            (Gn.VERSION = '4.17.21'),\n            It(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function (e) {\n              Gn[e].placeholder = Gn;\n            }),\n            It(['drop', 'take'], function (e, t) {\n              ((Kn.prototype[e] = function (r) {\n                r = r === n ? 1 : An(mo(r), 0);\n                var i = this.__filtered__ && !t ? new Kn(this) : this.clone();\n                return (\n                  i.__filtered__\n                    ? (i.__takeCount__ = gn(r, i.__takeCount__))\n                    : i.__views__.push({ size: gn(r, d), type: e + (i.__dir__ < 0 ? 'Right' : '') }),\n                  i\n                );\n              }),\n                (Kn.prototype[e + 'Right'] = function (t) {\n                  return this.reverse()[e](t).reverse();\n                }));\n            }),\n            It(['filter', 'map', 'takeWhile'], function (e, t) {\n              var n = t + 1,\n                r = 1 == n || 3 == n;\n              Kn.prototype[e] = function (e) {\n                var t = this.clone();\n                return (\n                  t.__iteratees__.push({ iteratee: us(e, 3), type: n }),\n                  (t.__filtered__ = t.__filtered__ || r),\n                  t\n                );\n              };\n            }),\n            It(['head', 'last'], function (e, t) {\n              var n = 'take' + (t ? 'Right' : '');\n              Kn.prototype[e] = function () {\n                return this[n](1).value()[0];\n              };\n            }),\n            It(['initial', 'tail'], function (e, t) {\n              var n = 'drop' + (t ? '' : 'Right');\n              Kn.prototype[e] = function () {\n                return this.__filtered__ ? new Kn(this) : this[n](1);\n              };\n            }),\n            (Kn.prototype.compact = function () {\n              return this.filter(ic);\n            }),\n            (Kn.prototype.find = function (e) {\n              return this.filter(e).head();\n            }),\n            (Kn.prototype.findLast = function (e) {\n              return this.reverse().find(e);\n            }),\n            (Kn.prototype.invokeMap = Xr(function (e, t) {\n              return 'function' == typeof e\n                ? new Kn(this)\n                : this.map(function (n) {\n                    return Dr(n, e, t);\n                  });\n            })),\n            (Kn.prototype.reject = function (e) {\n              return this.filter(Ma(us(e)));\n            }),\n            (Kn.prototype.slice = function (e, t) {\n              e = mo(e);\n              var r = this;\n              return r.__filtered__ && (0 < e || t < 0)\n                ? new Kn(r)\n                : (e < 0 ? (r = r.takeRight(-e)) : e && (r = r.drop(e)),\n                  t !== n ? ((t = mo(t)) < 0 ? r.dropRight(-t) : r.take(t - e)) : r);\n            }),\n            (Kn.prototype.takeRightWhile = function (e) {\n              return this.reverse().takeWhile(e).reverse();\n            }),\n            (Kn.prototype.toArray = function () {\n              return this.take(d);\n            }),\n            vr(Kn.prototype, function (e, t) {\n              var r = /^(?:filter|find|map|reject)|While$/.test(t),\n                i = /^(?:head|last)$/.test(t),\n                s = Gn[i ? 'take' + ('last' == t ? 'Right' : '') : t],\n                a = i || /^find/.test(t);\n              s &&\n                (Gn.prototype[t] = function () {\n                  function h(e) {\n                    return ((e = s.apply(Gn, xt([e], o))), i && f ? e[0] : e);\n                  }\n                  var _,\n                    t = this.__wrapped__,\n                    o = i ? [1] : arguments,\n                    c = t instanceof Kn,\n                    u = o[0],\n                    l = c || Ya(t),\n                    f = (l && r && 'function' == typeof u && 1 != u.length && (c = l = !1), this.__chain__),\n                    u = !!this.__actions__.length,\n                    d = a && !f,\n                    c = c && !u;\n                  return !a && l\n                    ? ((t = c ? t : new Kn(this)),\n                      (_ = e.apply(t, o)).__actions__.push({ func: pa, args: [h], thisArg: n }),\n                      new Yn(_, f))\n                    : d && c\n                      ? e.apply(this, o)\n                      : ((_ = this.thru(h)), d ? (i ? _.value()[0] : _.value()) : _);\n                });\n            }),\n            It(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function (e) {\n              var t = De[e],\n                n = /^(?:push|sort|unshift)$/.test(e) ? 'tap' : 'thru',\n                r = /^(?:pop|shift)$/.test(e);\n              Gn.prototype[e] = function () {\n                var i,\n                  e = arguments;\n                return r && !this.__chain__\n                  ? ((i = this.value()), t.apply(Ya(i) ? i : [], e))\n                  : this[n](function (n) {\n                      return t.apply(Ya(n) ? n : [], e);\n                    });\n              };\n            }),\n            vr(Kn.prototype, function (e, t) {\n              var r,\n                n = Gn[t];\n              n && ((r = n.name + ''), Pe.call(Rn, r) || (Rn[r] = []), Rn[r].push({ name: t, func: n }));\n            }),\n            (Rn[Gi(n, 2).name] = [{ name: 'wrapper', func: n }]),\n            (Kn.prototype.clone = function () {\n              var e = new Kn(this.__wrapped__);\n              return (\n                (e.__actions__ = Li(this.__actions__)),\n                (e.__dir__ = this.__dir__),\n                (e.__filtered__ = this.__filtered__),\n                (e.__iteratees__ = Li(this.__iteratees__)),\n                (e.__takeCount__ = this.__takeCount__),\n                (e.__views__ = Li(this.__views__)),\n                e\n              );\n            }),\n            (Kn.prototype.reverse = function () {\n              var e;\n              return (\n                this.__filtered__\n                  ? (((e = new Kn(this)).__dir__ = -1), (e.__filtered__ = !0))\n                  : ((e = this.clone()).__dir__ *= -1),\n                e\n              );\n            }),\n            (Kn.prototype.value = function () {\n              var e = this.__wrapped__.value(),\n                t = this.__dir__,\n                n = Ya(e),\n                r = t < 0,\n                i = n ? e.length : 0,\n                s = (function (e, t, n) {\n                  for (var r = -1, i = n.length; ++r < i; ) {\n                    var s = n[r],\n                      a = s.size;\n                    switch (s.type) {\n                      case 'drop':\n                        e += a;\n                        break;\n                      case 'dropRight':\n                        t -= a;\n                        break;\n                      case 'take':\n                        t = gn(t, e + a);\n                        break;\n                      case 'takeRight':\n                        e = An(e, t - a);\n                    }\n                  }\n                  return { start: e, end: t };\n                })(0, i, this.__views__),\n                a = s.start,\n                c = (s = s.end) - a,\n                u = r ? s : a - 1,\n                l = this.__iteratees__,\n                h = l.length,\n                f = 0,\n                p = gn(c, this.__takeCount__);\n              if (!n || (!r && i == c && p == c)) return mi(e, this.__actions__);\n              var d = [];\n              e: for (; c-- && f < p; ) {\n                for (var m = -1, _ = e[(u += t)]; ++m < h; ) {\n                  var T = (E = l[m]).iteratee,\n                    E = E.type,\n                    T = T(_);\n                  if (2 == E) _ = T;\n                  else if (!T) {\n                    if (1 == E) continue e;\n                    break e;\n                  }\n                }\n                d[f++] = _;\n              }\n              return d;\n            }),\n            (Gn.prototype.at = da),\n            (Gn.prototype.chain = function () {\n              return fa(this);\n            }),\n            (Gn.prototype.commit = function () {\n              return new Yn(this.value(), this.__chain__);\n            }),\n            (Gn.prototype.next = function () {\n              this.__values__ === n && (this.__values__ = fo(this.value()));\n              var e = this.__index__ >= this.__values__.length;\n              return { done: e, value: e ? n : this.__values__[this.__index__++] };\n            }),\n            (Gn.prototype.plant = function (e) {\n              for (var t, r = this; r instanceof qn; )\n                var i = Us(r),\n                  s = ((i.__index__ = 0), (i.__values__ = n), t ? (s.__wrapped__ = i) : (t = i), i),\n                  r = r.__wrapped__;\n              return ((s.__wrapped__ = e), t);\n            }),\n            (Gn.prototype.reverse = function () {\n              var e = this.__wrapped__;\n              return e instanceof Kn\n                ? ((e = (e = this.__actions__.length ? new Kn(this) : e).reverse()).__actions__.push({\n                    func: pa,\n                    args: [ea],\n                    thisArg: n,\n                  }),\n                  new Yn(e, this.__chain__))\n                : this.thru(ea);\n            }),\n            (Gn.prototype.toJSON =\n              Gn.prototype.valueOf =\n              Gn.prototype.value =\n                function () {\n                  return mi(this.__wrapped__, this.__actions__);\n                }),\n            (Gn.prototype.first = Gn.prototype.head),\n            et &&\n              (Gn.prototype[et] = function () {\n                return this;\n              }),\n            Gn\n          );\n        })();\n      mt ? (((mt.exports = _n)._ = _n), (He._ = _n)) : (pt._ = _n);\n    }.call(gr);\n  }),\n  dh = Sr(function (e, t) {\n    e.exports = (function (e) {\n      var n;\n      if (\n        ('undefined' != typeof window && window.crypto && (n = window.crypto),\n        'undefined' != typeof self && self.crypto && (n = self.crypto),\n        !(n =\n          !(n =\n            !(n = 'undefined' != typeof globalThis && globalThis.crypto ? globalThis.crypto : n) &&\n            'undefined' != typeof window &&\n            window.msCrypto\n              ? window.msCrypto\n              : n) &&\n          void 0 !== gr &&\n          gr.crypto\n            ? gr.crypto\n            : n))\n      )\n        try {\n          n = Zu;\n        } catch (e) {}\n      function r() {\n        if (n) {\n          if ('function' == typeof n.getRandomValues)\n            try {\n              return n.getRandomValues(new Uint32Array(1))[0];\n            } catch (e) {}\n          if ('function' == typeof n.randomBytes)\n            try {\n              return n.randomBytes(4).readInt32LE();\n            } catch (e) {}\n        }\n        throw new Error('Native crypto module could not be used to get secure random number.');\n      }\n      var i =\n          Object.create ||\n          (function () {\n            function e() {}\n            return function (t) {\n              return ((e.prototype = t), (t = new e()), (e.prototype = null), t);\n            };\n          })(),\n        s = {},\n        a = (s.lib = {}),\n        o = (a.Base = {\n          extend: function (e) {\n            var t = i(this);\n            return (\n              e && t.mixIn(e),\n              (t.hasOwnProperty('init') && this.init !== t.init) ||\n                (t.init = function () {\n                  t.$super.init.apply(this, arguments);\n                }),\n              ((t.init.prototype = t).$super = this),\n              t\n            );\n          },\n          create: function () {\n            var e = this.extend();\n            return (e.init.apply(e, arguments), e);\n          },\n          init: function () {},\n          mixIn: function (e) {\n            for (var t in e) e.hasOwnProperty(t) && (this[t] = e[t]);\n            e.hasOwnProperty('toString') && (this.toString = e.toString);\n          },\n          clone: function () {\n            return this.init.prototype.extend(this);\n          },\n        }),\n        c = (a.WordArray = o.extend({\n          init: function (e, n) {\n            ((e = this.words = e || []), (this.sigBytes = null != n ? n : 4 * e.length));\n          },\n          toString: function (e) {\n            return (e || l).stringify(this);\n          },\n          concat: function (e) {\n            var t = this.words,\n              n = e.words,\n              r = this.sigBytes,\n              i = e.sigBytes;\n            if ((this.clamp(), r % 4))\n              for (var s = 0; s < i; s++) {\n                var a = (n[s >>> 2] >>> (24 - (s % 4) * 8)) & 255;\n                t[(r + s) >>> 2] |= a << (24 - ((r + s) % 4) * 8);\n              }\n            else for (var o = 0; o < i; o += 4) t[(r + o) >>> 2] = n[o >>> 2];\n            return ((this.sigBytes += i), this);\n          },\n          clamp: function () {\n            var t = this.words,\n              n = this.sigBytes;\n            ((t[n >>> 2] &= 4294967295 << (32 - (n % 4) * 8)), (t.length = e.ceil(n / 4)));\n          },\n          clone: function () {\n            var e = o.clone.call(this);\n            return ((e.words = this.words.slice(0)), e);\n          },\n          random: function (e) {\n            for (var t = [], n = 0; n < e; n += 4) t.push(r());\n            return new c.init(t, e);\n          },\n        })),\n        u = (s.enc = {}),\n        l = (u.Hex = {\n          stringify: function (e) {\n            for (var t = e.words, n = e.sigBytes, r = [], i = 0; i < n; i++) {\n              var s = (t[i >>> 2] >>> (24 - (i % 4) * 8)) & 255;\n              (r.push((s >>> 4).toString(16)), r.push((15 & s).toString(16)));\n            }\n            return r.join('');\n          },\n          parse: function (e) {\n            for (var t = e.length, n = [], r = 0; r < t; r += 2)\n              n[r >>> 3] |= parseInt(e.substr(r, 2), 16) << (24 - (r % 8) * 4);\n            return new c.init(n, t / 2);\n          },\n        }),\n        h = (u.Latin1 = {\n          stringify: function (e) {\n            for (var t = e.words, n = e.sigBytes, r = [], i = 0; i < n; i++) {\n              var s = (t[i >>> 2] >>> (24 - (i % 4) * 8)) & 255;\n              r.push(String.fromCharCode(s));\n            }\n            return r.join('');\n          },\n          parse: function (e) {\n            for (var t = e.length, n = [], r = 0; r < t; r++)\n              n[r >>> 2] |= (255 & e.charCodeAt(r)) << (24 - (r % 4) * 8);\n            return new c.init(n, t);\n          },\n        }),\n        f = (u.Utf8 = {\n          stringify: function (e) {\n            try {\n              return decodeURIComponent(escape(h.stringify(e)));\n            } catch (e) {\n              throw new Error('Malformed UTF-8 data');\n            }\n          },\n          parse: function (e) {\n            return h.parse(unescape(encodeURIComponent(e)));\n          },\n        }),\n        p = (a.BufferedBlockAlgorithm = o.extend({\n          reset: function () {\n            ((this._data = new c.init()), (this._nDataBytes = 0));\n          },\n          _append: function (e) {\n            ('string' == typeof e && (e = f.parse(e)), this._data.concat(e), (this._nDataBytes += e.sigBytes));\n          },\n          _process: function (t) {\n            var n,\n              r = this._data,\n              i = r.words,\n              s = r.sigBytes,\n              a = this.blockSize,\n              o = s / (4 * a),\n              u = (t ? e.ceil(o) : e.max((0 | o) - this._minBufferSize, 0)) * a,\n              t = e.min(4 * u, s);\n            if (u) {\n              for (var h = 0; h < u; h += a) this._doProcessBlock(i, h);\n              ((n = i.splice(0, u)), (r.sigBytes -= t));\n            }\n            return new c.init(n, t);\n          },\n          clone: function () {\n            var e = o.clone.call(this);\n            return ((e._data = this._data.clone()), e);\n          },\n          _minBufferSize: 0,\n        })),\n        d =\n          ((a.Hasher = p.extend({\n            cfg: o.extend(),\n            init: function (e) {\n              ((this.cfg = this.cfg.extend(e)), this.reset());\n            },\n            reset: function () {\n              (p.reset.call(this), this._doReset());\n            },\n            update: function (e) {\n              return (this._append(e), this._process(), this);\n            },\n            finalize: function (e) {\n              return (e && this._append(e), this._doFinalize());\n            },\n            blockSize: 16,\n            _createHelper: function (e) {\n              return function (t, n) {\n                return new e.init(n).finalize(t);\n              };\n            },\n            _createHmacHelper: function (e) {\n              return function (t, n) {\n                return new d.HMAC.init(e, n).finalize(t);\n              };\n            },\n          })),\n          (s.algo = {}));\n      return s;\n    })(Math);\n  }),\n  mh =\n    (Sr(function (e, t) {\n      var s, a, i;\n      e.exports =\n        ((i = (e = dh).lib),\n        (s = i.Base),\n        (a = i.WordArray),\n        ((i = e.x64 = {}).Word = s.extend({\n          init: function (e, t) {\n            ((this.high = e), (this.low = t));\n          },\n        })),\n        (i.WordArray = s.extend({\n          init: function (e, t) {\n            ((e = this.words = e || []), (this.sigBytes = null != t ? t : 8 * e.length));\n          },\n          toX32: function () {\n            for (var e = this.words, t = e.length, n = [], r = 0; r < t; r++) {\n              var i = e[r];\n              (n.push(i.high), n.push(i.low));\n            }\n            return a.create(n, this.sigBytes);\n          },\n          clone: function () {\n            for (var e = s.clone.call(this), t = (e.words = this.words.slice(0)), n = t.length, r = 0; r < n; r++)\n              t[r] = t[r].clone();\n            return e;\n          },\n        })),\n        e);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        ((n = dh),\n        (function () {\n          var e, t;\n          'function' == typeof ArrayBuffer &&\n            ((e = n.lib.WordArray),\n            (t = e.init),\n            ((e.init = function (e) {\n              if (\n                (e =\n                  (e = e instanceof ArrayBuffer ? new Uint8Array(e) : e) instanceof Int8Array ||\n                  ('undefined' != typeof Uint8ClampedArray && e instanceof Uint8ClampedArray) ||\n                  e instanceof Int16Array ||\n                  e instanceof Uint16Array ||\n                  e instanceof Int32Array ||\n                  e instanceof Uint32Array ||\n                  e instanceof Float32Array ||\n                  e instanceof Float64Array\n                    ? new Uint8Array(e.buffer, e.byteOffset, e.byteLength)\n                    : e) instanceof Uint8Array\n              ) {\n                for (var n = e.byteLength, r = [], i = 0; i < n; i++) r[i >>> 2] |= e[i] << (24 - (i % 4) * 8);\n                t.call(this, r, n);\n              } else t.apply(this, arguments);\n            }).prototype = e));\n        })(),\n        n.lib.WordArray);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        ((n = dh),\n        (function () {\n          var t = n.lib.WordArray,\n            r = n.enc;\n          function i(e) {\n            return ((e << 8) & 4278255360) | ((e >>> 8) & 16711935);\n          }\n          ((r.Utf16 = r.Utf16BE =\n            {\n              stringify: function (e) {\n                for (var t = e.words, n = e.sigBytes, r = [], i = 0; i < n; i += 2) {\n                  var s = (t[i >>> 2] >>> (16 - (i % 4) * 8)) & 65535;\n                  r.push(String.fromCharCode(s));\n                }\n                return r.join('');\n              },\n              parse: function (e) {\n                for (var n = e.length, r = [], i = 0; i < n; i++) r[i >>> 1] |= e.charCodeAt(i) << (16 - (i % 2) * 16);\n                return t.create(r, 2 * n);\n              },\n            }),\n            (r.Utf16LE = {\n              stringify: function (e) {\n                for (var t = e.words, n = e.sigBytes, r = [], s = 0; s < n; s += 2) {\n                  var a = i((t[s >>> 2] >>> (16 - (s % 4) * 8)) & 65535);\n                  r.push(String.fromCharCode(a));\n                }\n                return r.join('');\n              },\n              parse: function (e) {\n                for (var n = e.length, r = [], s = 0; s < n; s++)\n                  r[s >>> 1] |= i(e.charCodeAt(s) << (16 - (s % 2) * 16));\n                return t.create(r, 2 * n);\n              },\n            }));\n        })(),\n        n.enc.Utf16);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        ((n = dh),\n        (function () {\n          var e = n,\n            t = e.lib.WordArray;\n          function r(e, n, r) {\n            for (var o, i = [], s = 0, a = 0; a < n; a++)\n              a % 4 &&\n                ((o = (r[e.charCodeAt(a - 1)] << ((a % 4) * 2)) | (r[e.charCodeAt(a)] >>> (6 - (a % 4) * 2))),\n                (i[s >>> 2] |= o << (24 - (s % 4) * 8)),\n                s++);\n            return t.create(i, s);\n          }\n          e.enc.Base64 = {\n            stringify: function (e) {\n              var t = e.words,\n                n = e.sigBytes,\n                r = this._map;\n              e.clamp();\n              for (var i = [], s = 0; s < n; s += 3)\n                for (\n                  var a =\n                      (((t[s >>> 2] >>> (24 - (s % 4) * 8)) & 255) << 16) |\n                      (((t[(s + 1) >>> 2] >>> (24 - ((s + 1) % 4) * 8)) & 255) << 8) |\n                      ((t[(s + 2) >>> 2] >>> (24 - ((s + 2) % 4) * 8)) & 255),\n                    o = 0;\n                  o < 4 && s + 0.75 * o < n;\n                  o++\n                )\n                  i.push(r.charAt((a >>> (6 * (3 - o))) & 63));\n              var c = r.charAt(64);\n              if (c) for (; i.length % 4; ) i.push(c);\n              return i.join('');\n            },\n            parse: function (e) {\n              var t = e.length,\n                n = this._map;\n              if (!(i = this._reverseMap))\n                for (var i = (this._reverseMap = []), s = 0; s < n.length; s++) i[n.charCodeAt(s)] = s;\n              var a = n.charAt(64);\n              return (a && -1 !== (a = e.indexOf(a)) && (t = a), r(e, t, i));\n            },\n            _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n          };\n        })(),\n        n.enc.Base64);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        ((n = dh),\n        (function () {\n          var e = n,\n            t = e.lib.WordArray;\n          function r(e, n, r) {\n            for (var o, i = [], s = 0, a = 0; a < n; a++)\n              a % 4 &&\n                ((o = (r[e.charCodeAt(a - 1)] << ((a % 4) * 2)) | (r[e.charCodeAt(a)] >>> (6 - (a % 4) * 2))),\n                (i[s >>> 2] |= o << (24 - (s % 4) * 8)),\n                s++);\n            return t.create(i, s);\n          }\n          e.enc.Base64url = {\n            stringify: function (e, t = !0) {\n              var n = e.words,\n                r = e.sigBytes,\n                i = t ? this._safe_map : this._map;\n              e.clamp();\n              for (var s = [], a = 0; a < r; a += 3)\n                for (\n                  var o =\n                      (((n[a >>> 2] >>> (24 - (a % 4) * 8)) & 255) << 16) |\n                      (((n[(a + 1) >>> 2] >>> (24 - ((a + 1) % 4) * 8)) & 255) << 8) |\n                      ((n[(a + 2) >>> 2] >>> (24 - ((a + 2) % 4) * 8)) & 255),\n                    c = 0;\n                  c < 4 && a + 0.75 * c < r;\n                  c++\n                )\n                  s.push(i.charAt((o >>> (6 * (3 - c))) & 63));\n              var u = i.charAt(64);\n              if (u) for (; s.length % 4; ) s.push(u);\n              return s.join('');\n            },\n            parse: function (e, t = !0) {\n              var n = e.length,\n                i = t ? this._safe_map : this._map;\n              if (!(s = this._reverseMap))\n                for (var s = (this._reverseMap = []), a = 0; a < i.length; a++) s[i.charCodeAt(a)] = a;\n              return ((t = i.charAt(64)) && -1 !== (t = e.indexOf(t)) && (n = t), r(e, n, s));\n            },\n            _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n            _safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',\n          };\n        })(),\n        n.enc.Base64url);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        ((n = dh),\n        (function (e) {\n          var t = n,\n            i = (r = t.lib).WordArray,\n            s = r.Hasher,\n            r = t.algo,\n            o = [],\n            r =\n              ((function () {\n                for (var t = 0; t < 64; t++) o[t] = (4294967296 * e.abs(e.sin(t + 1))) | 0;\n              })(),\n              (r.MD5 = s.extend({\n                _doReset: function () {\n                  this._hash = new i.init([1732584193, 4023233417, 2562383102, 271733878]);\n                },\n                _doProcessBlock: function (e, t) {\n                  for (var n = 0; n < 16; n++) {\n                    var r = t + n,\n                      i = e[r];\n                    e[r] = (16711935 & ((i << 8) | (i >>> 24))) | (4278255360 & ((i << 24) | (i >>> 8)));\n                  }\n                  var s = this._hash.words,\n                    a = e[t + 0],\n                    c = e[t + 1],\n                    p = e[t + 2],\n                    d = e[t + 3],\n                    m = e[t + 4],\n                    _ = e[t + 5],\n                    E = e[t + 6],\n                    T = e[t + 7],\n                    A = e[t + 8],\n                    g = e[t + 9],\n                    v = e[t + 10],\n                    y = e[t + 11],\n                    S = e[t + 12],\n                    C = e[t + 13],\n                    N = e[t + 14],\n                    b = e[t + 15],\n                    I = u(s[0], (O = s[1]), (k = s[2]), (L = s[3]), a, 7, o[0]),\n                    L = u(L, I, O, k, c, 12, o[1]),\n                    k = u(k, L, I, O, p, 17, o[2]),\n                    O = u(O, k, L, I, d, 22, o[3]),\n                    I = u(I, O, k, L, m, 7, o[4]),\n                    L = u(L, I, O, k, _, 12, o[5]),\n                    k = u(k, L, I, O, E, 17, o[6]),\n                    O = u(O, k, L, I, T, 22, o[7]);\n                  ((I = u(I, O, k, L, A, 7, o[8])),\n                    (L = u(L, I, O, k, g, 12, o[9])),\n                    (k = u(k, L, I, O, v, 17, o[10])),\n                    (O = u(O, k, L, I, y, 22, o[11])),\n                    (I = u(I, O, k, L, S, 7, o[12])),\n                    (L = u(L, I, O, k, C, 12, o[13])),\n                    (k = u(k, L, I, O, N, 17, o[14])),\n                    (I = l(I, (O = u(O, k, L, I, b, 22, o[15])), k, L, c, 5, o[16])),\n                    (L = l(L, I, O, k, E, 9, o[17])),\n                    (k = l(k, L, I, O, y, 14, o[18])),\n                    (O = l(O, k, L, I, a, 20, o[19])),\n                    (I = l(I, O, k, L, _, 5, o[20])),\n                    (L = l(L, I, O, k, v, 9, o[21])),\n                    (k = l(k, L, I, O, b, 14, o[22])),\n                    (O = l(O, k, L, I, m, 20, o[23])),\n                    (I = l(I, O, k, L, g, 5, o[24])),\n                    (L = l(L, I, O, k, N, 9, o[25])),\n                    (k = l(k, L, I, O, d, 14, o[26])),\n                    (O = l(O, k, L, I, A, 20, o[27])),\n                    (I = l(I, O, k, L, C, 5, o[28])),\n                    (L = l(L, I, O, k, p, 9, o[29])),\n                    (k = l(k, L, I, O, T, 14, o[30])),\n                    (I = h(I, (O = l(O, k, L, I, S, 20, o[31])), k, L, _, 4, o[32])),\n                    (L = h(L, I, O, k, A, 11, o[33])),\n                    (k = h(k, L, I, O, y, 16, o[34])),\n                    (O = h(O, k, L, I, N, 23, o[35])),\n                    (I = h(I, O, k, L, c, 4, o[36])),\n                    (L = h(L, I, O, k, m, 11, o[37])),\n                    (k = h(k, L, I, O, T, 16, o[38])),\n                    (O = h(O, k, L, I, v, 23, o[39])),\n                    (I = h(I, O, k, L, C, 4, o[40])),\n                    (L = h(L, I, O, k, a, 11, o[41])),\n                    (k = h(k, L, I, O, d, 16, o[42])),\n                    (O = h(O, k, L, I, E, 23, o[43])),\n                    (I = h(I, O, k, L, g, 4, o[44])),\n                    (L = h(L, I, O, k, S, 11, o[45])),\n                    (k = h(k, L, I, O, b, 16, o[46])),\n                    (I = f(I, (O = h(O, k, L, I, p, 23, o[47])), k, L, a, 6, o[48])),\n                    (L = f(L, I, O, k, T, 10, o[49])),\n                    (k = f(k, L, I, O, N, 15, o[50])),\n                    (O = f(O, k, L, I, _, 21, o[51])),\n                    (I = f(I, O, k, L, S, 6, o[52])),\n                    (L = f(L, I, O, k, d, 10, o[53])),\n                    (k = f(k, L, I, O, v, 15, o[54])),\n                    (O = f(O, k, L, I, c, 21, o[55])),\n                    (I = f(I, O, k, L, A, 6, o[56])),\n                    (L = f(L, I, O, k, b, 10, o[57])),\n                    (k = f(k, L, I, O, E, 15, o[58])),\n                    (O = f(O, k, L, I, C, 21, o[59])),\n                    (I = f(I, O, k, L, m, 6, o[60])),\n                    (L = f(L, I, O, k, y, 10, o[61])),\n                    (k = f(k, L, I, O, p, 15, o[62])),\n                    (O = f(O, k, L, I, g, 21, o[63])),\n                    (s[0] = (s[0] + I) | 0),\n                    (s[1] = (s[1] + O) | 0),\n                    (s[2] = (s[2] + k) | 0),\n                    (s[3] = (s[3] + L) | 0));\n                },\n                _doFinalize: function () {\n                  var t = this._data,\n                    n = t.words,\n                    r = 8 * this._nDataBytes,\n                    i = 8 * t.sigBytes,\n                    s = ((n[i >>> 5] |= 128 << (24 - (i % 32))), e.floor(r / 4294967296));\n                  ((n[15 + (((64 + i) >>> 9) << 4)] =\n                    (16711935 & ((s << 8) | (s >>> 24))) | (4278255360 & ((s << 24) | (s >>> 8)))),\n                    (n[14 + (((64 + i) >>> 9) << 4)] =\n                      (16711935 & ((r << 8) | (r >>> 24))) | (4278255360 & ((r << 24) | (r >>> 8)))),\n                    (t.sigBytes = 4 * (n.length + 1)),\n                    this._process());\n                  for (var c = (s = this._hash).words, u = 0; u < 4; u++) {\n                    var l = c[u];\n                    c[u] = (16711935 & ((l << 8) | (l >>> 24))) | (4278255360 & ((l << 24) | (l >>> 8)));\n                  }\n                  return s;\n                },\n                clone: function () {\n                  var e = s.clone.call(this);\n                  return ((e._hash = this._hash.clone()), e);\n                },\n              })));\n          function u(e, t, n, r, i, s, a) {\n            return (((e = e + ((t & n) | (~t & r)) + i + a) << s) | (e >>> (32 - s))) + t;\n          }\n          function l(e, t, n, r, i, s, a) {\n            return (((e = e + ((t & r) | (n & ~r)) + i + a) << s) | (e >>> (32 - s))) + t;\n          }\n          function h(e, t, n, r, i, s, a) {\n            return (((e = e + (t ^ n ^ r) + i + a) << s) | (e >>> (32 - s))) + t;\n          }\n          function f(e, t, n, r, i, s, a) {\n            return (((e = e + (n ^ (t | ~r)) + i + a) << s) | (e >>> (32 - s))) + t;\n          }\n          ((t.MD5 = s._createHelper(r)), (t.HmacMD5 = s._createHmacHelper(r)));\n        })(Math),\n        n.MD5);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        ((n = dh),\n        (function () {\n          var e = n,\n            r = (t = e.lib).WordArray,\n            i = t.Hasher,\n            t = e.algo,\n            a = [],\n            t = (t.SHA1 = i.extend({\n              _doReset: function () {\n                this._hash = new r.init([1732584193, 4023233417, 2562383102, 271733878, 3285377520]);\n              },\n              _doProcessBlock: function (e, t) {\n                for (var n = this._hash.words, r = n[0], i = n[1], s = n[2], o = n[3], c = n[4], u = 0; u < 80; u++) {\n                  a[u] = u < 16 ? 0 | e[t + u] : ((l = a[u - 3] ^ a[u - 8] ^ a[u - 14] ^ a[u - 16]) << 1) | (l >>> 31);\n                  var l = ((r << 5) | (r >>> 27)) + c + a[u];\n                  ((l +=\n                    u < 20\n                      ? 1518500249 + ((i & s) | (~i & o))\n                      : u < 40\n                        ? 1859775393 + (i ^ s ^ o)\n                        : u < 60\n                          ? ((i & s) | (i & o) | (s & o)) - 1894007588\n                          : (i ^ s ^ o) - 899497514),\n                    (c = o),\n                    (o = s),\n                    (s = (i << 30) | (i >>> 2)),\n                    (i = r),\n                    (r = l));\n                }\n                ((n[0] = (n[0] + r) | 0),\n                  (n[1] = (n[1] + i) | 0),\n                  (n[2] = (n[2] + s) | 0),\n                  (n[3] = (n[3] + o) | 0),\n                  (n[4] = (n[4] + c) | 0));\n              },\n              _doFinalize: function () {\n                var e = this._data,\n                  t = e.words,\n                  n = 8 * this._nDataBytes,\n                  r = 8 * e.sigBytes;\n                return (\n                  (t[r >>> 5] |= 128 << (24 - (r % 32))),\n                  (t[14 + (((64 + r) >>> 9) << 4)] = Math.floor(n / 4294967296)),\n                  (t[15 + (((64 + r) >>> 9) << 4)] = n),\n                  (e.sigBytes = 4 * t.length),\n                  this._process(),\n                  this._hash\n                );\n              },\n              clone: function () {\n                var e = i.clone.call(this);\n                return ((e._hash = this._hash.clone()), e);\n              },\n            }));\n          ((e.SHA1 = i._createHelper(t)), (e.HmacSHA1 = i._createHmacHelper(t)));\n        })(),\n        n.SHA1);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        ((n = dh),\n        (function (e) {\n          var t = n,\n            i = (r = t.lib).WordArray,\n            s = r.Hasher,\n            r = t.algo,\n            o = [],\n            c = [],\n            u =\n              ((function () {\n                function n(e) {\n                  return (4294967296 * (e - (0 | e))) | 0;\n                }\n                for (var r = 2, i = 0; i < 64; )\n                  (!(function (t) {\n                    for (var n = e.sqrt(t), r = 2; r <= n; r++) if (!(t % r)) return;\n                    return 1;\n                  })(r) || (i < 8 && (o[i] = n(e.pow(r, 0.5))), (c[i] = n(e.pow(r, 1 / 3))), i++),\n                    r++);\n              })(),\n              []),\n            r = (r.SHA256 = s.extend({\n              _doReset: function () {\n                this._hash = new i.init(o.slice(0));\n              },\n              _doProcessBlock: function (e, t) {\n                for (\n                  var n = this._hash.words,\n                    r = n[0],\n                    i = n[1],\n                    s = n[2],\n                    a = n[3],\n                    o = n[4],\n                    l = n[5],\n                    h = n[6],\n                    f = n[7],\n                    p = 0;\n                  p < 64;\n                  p++\n                ) {\n                  u[p] =\n                    p < 16\n                      ? 0 | e[t + p]\n                      : ((((d = u[p - 15]) << 25) | (d >>> 7)) ^ ((d << 14) | (d >>> 18)) ^ (d >>> 3)) +\n                        u[p - 7] +\n                        ((((d = u[p - 2]) << 15) | (d >>> 17)) ^ ((d << 13) | (d >>> 19)) ^ (d >>> 10)) +\n                        u[p - 16];\n                  var d = (r & i) ^ (r & s) ^ (i & s),\n                    g =\n                      f +\n                      (((o << 26) | (o >>> 6)) ^ ((o << 21) | (o >>> 11)) ^ ((o << 7) | (o >>> 25))) +\n                      ((o & l) ^ (~o & h)) +\n                      c[p] +\n                      u[p],\n                    f = h,\n                    h = l,\n                    l = o,\n                    o = (a + g) | 0,\n                    a = s,\n                    s = i,\n                    i = r,\n                    r = (g + ((((r << 30) | (r >>> 2)) ^ ((r << 19) | (r >>> 13)) ^ ((r << 10) | (r >>> 22))) + d)) | 0;\n                }\n                ((n[0] = (n[0] + r) | 0),\n                  (n[1] = (n[1] + i) | 0),\n                  (n[2] = (n[2] + s) | 0),\n                  (n[3] = (n[3] + a) | 0),\n                  (n[4] = (n[4] + o) | 0),\n                  (n[5] = (n[5] + l) | 0),\n                  (n[6] = (n[6] + h) | 0),\n                  (n[7] = (n[7] + f) | 0));\n              },\n              _doFinalize: function () {\n                var t = this._data,\n                  n = t.words,\n                  r = 8 * this._nDataBytes,\n                  i = 8 * t.sigBytes;\n                return (\n                  (n[i >>> 5] |= 128 << (24 - (i % 32))),\n                  (n[14 + (((64 + i) >>> 9) << 4)] = e.floor(r / 4294967296)),\n                  (n[15 + (((64 + i) >>> 9) << 4)] = r),\n                  (t.sigBytes = 4 * n.length),\n                  this._process(),\n                  this._hash\n                );\n              },\n              clone: function () {\n                var e = s.clone.call(this);\n                return ((e._hash = this._hash.clone()), e);\n              },\n            }));\n          ((t.SHA256 = s._createHelper(r)), (t.HmacSHA256 = s._createHmacHelper(r)));\n        })(Math),\n        n.SHA256);\n    }),\n    Sr(function (e, t) {\n      var n, r, s, i;\n      e.exports =\n        ((r = (n = e = dh).lib.WordArray),\n        (i = n.algo),\n        (s = i.SHA256),\n        (i = i.SHA224 =\n          s.extend({\n            _doReset: function () {\n              this._hash = new r.init([\n                3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, 1694076839, 3204075428,\n              ]);\n            },\n            _doFinalize: function () {\n              var e = s._doFinalize.call(this);\n              return ((e.sigBytes -= 4), e);\n            },\n          })),\n        (n.SHA224 = s._createHelper(i)),\n        (n.HmacSHA224 = s._createHmacHelper(i)),\n        e.SHA224);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        ((n = dh),\n        (function () {\n          var e = n,\n            t = e.lib.Hasher,\n            i = (r = e.x64).Word,\n            s = r.WordArray,\n            r = e.algo;\n          function o() {\n            return i.create.apply(i, arguments);\n          }\n          var c = [\n              o(1116352408, 3609767458),\n              o(1899447441, 602891725),\n              o(3049323471, 3964484399),\n              o(3921009573, 2173295548),\n              o(961987163, 4081628472),\n              o(1508970993, 3053834265),\n              o(2453635748, 2937671579),\n              o(2870763221, 3664609560),\n              o(3624381080, 2734883394),\n              o(310598401, 1164996542),\n              o(607225278, 1323610764),\n              o(1426881987, 3590304994),\n              o(1925078388, 4068182383),\n              o(2162078206, 991336113),\n              o(2614888103, 633803317),\n              o(3248222580, 3479774868),\n              o(3835390401, 2666613458),\n              o(4022224774, 944711139),\n              o(264347078, 2341262773),\n              o(604807628, 2007800933),\n              o(770255983, 1495990901),\n              o(1249150122, 1856431235),\n              o(1555081692, 3175218132),\n              o(1996064986, 2198950837),\n              o(2554220882, 3999719339),\n              o(2821834349, 766784016),\n              o(2952996808, 2566594879),\n              o(3210313671, 3203337956),\n              o(3336571891, 1034457026),\n              o(3584528711, 2466948901),\n              o(113926993, 3758326383),\n              o(338241895, 168717936),\n              o(666307205, 1188179964),\n              o(773529912, 1546045734),\n              o(1294757372, 1522805485),\n              o(1396182291, 2643833823),\n              o(1695183700, 2343527390),\n              o(1986661051, 1014477480),\n              o(2177026350, 1206759142),\n              o(2456956037, 344077627),\n              o(2730485921, 1290863460),\n              o(2820302411, 3158454273),\n              o(3259730800, 3505952657),\n              o(3345764771, 106217008),\n              o(3516065817, 3606008344),\n              o(3600352804, 1432725776),\n              o(4094571909, 1467031594),\n              o(275423344, 851169720),\n              o(430227734, 3100823752),\n              o(506948616, 1363258195),\n              o(659060556, 3750685593),\n              o(883997877, 3785050280),\n              o(958139571, 3318307427),\n              o(1322822218, 3812723403),\n              o(1537002063, 2003034995),\n              o(1747873779, 3602036899),\n              o(1955562222, 1575990012),\n              o(2024104815, 1125592928),\n              o(2227730452, 2716904306),\n              o(2361852424, 442776044),\n              o(2428436474, 593698344),\n              o(2756734187, 3733110249),\n              o(3204031479, 2999351573),\n              o(3329325298, 3815920427),\n              o(3391569614, 3928383900),\n              o(3515267271, 566280711),\n              o(3940187606, 3454069534),\n              o(4118630271, 4000239992),\n              o(116418474, 1914138554),\n              o(174292421, 2731055270),\n              o(289380356, 3203993006),\n              o(460393269, 320620315),\n              o(685471733, 587496836),\n              o(852142971, 1086792851),\n              o(1017036298, 365543100),\n              o(1126000580, 2618297676),\n              o(1288033470, 3409855158),\n              o(1501505948, 4234509866),\n              o(1607167915, 987167468),\n              o(1816402316, 1246189591),\n            ],\n            u = [],\n            r =\n              ((function () {\n                for (var e = 0; e < 80; e++) u[e] = o();\n              })(),\n              (r.SHA512 = t.extend({\n                _doReset: function () {\n                  this._hash = new s.init([\n                    new i.init(1779033703, 4089235720),\n                    new i.init(3144134277, 2227873595),\n                    new i.init(1013904242, 4271175723),\n                    new i.init(2773480762, 1595750129),\n                    new i.init(1359893119, 2917565137),\n                    new i.init(2600822924, 725511199),\n                    new i.init(528734635, 4215389547),\n                    new i.init(1541459225, 327033209),\n                  ]);\n                },\n                _doProcessBlock: function (e, t) {\n                  for (\n                    var r = (n = this._hash.words)[0],\n                      i = n[1],\n                      s = n[2],\n                      a = n[3],\n                      o = n[4],\n                      l = n[5],\n                      h = n[6],\n                      n = n[7],\n                      p = r.high,\n                      d = r.low,\n                      m = i.high,\n                      _ = i.low,\n                      E = s.high,\n                      T = s.low,\n                      A = a.high,\n                      g = a.low,\n                      v = o.high,\n                      y = o.low,\n                      S = l.high,\n                      C = l.low,\n                      N = h.high,\n                      b = h.low,\n                      I = n.high,\n                      O = n.low,\n                      k = p,\n                      L = d,\n                      D = m,\n                      R = _,\n                      w = E,\n                      x = T,\n                      M = A,\n                      P = g,\n                      B = v,\n                      F = y,\n                      U = S,\n                      H = C,\n                      G = N,\n                      j = b,\n                      q = I,\n                      Y = O,\n                      K = 0;\n                    K < 80;\n                    K++\n                  ) {\n                    var W,\n                      V,\n                      $ = u[K];\n                    K < 16\n                      ? ((V = $.high = 0 | e[t + 2 * K]), (W = $.low = 0 | e[t + 2 * K + 1]))\n                      : ((z = (Q = u[K - 15]).high),\n                        (Q = Q.low),\n                        (te = (ee = u[K - 2]).high),\n                        (ee = ee.low),\n                        (V =\n                          (V =\n                            (V =\n                              (((z >>> 1) | (Q << 31)) ^ ((z >>> 8) | (Q << 24)) ^ (z >>> 7)) +\n                              (se = u[K - 7]).high +\n                              ((W =\n                                (Q = ((Q >>> 1) | (z << 31)) ^ ((Q >>> 8) | (z << 24)) ^ ((Q >>> 7) | (z << 25))) +\n                                se.low) >>>\n                                0 <\n                              Q >>> 0\n                                ? 1\n                                : 0)) +\n                            (((te >>> 19) | (ee << 13)) ^ ((te << 3) | (ee >>> 29)) ^ (te >>> 6)) +\n                            ((W += z =\n                              ((ee >>> 19) | (te << 13)) ^ ((ee << 3) | (te >>> 29)) ^ ((ee >>> 6) | (te << 26))) >>>\n                              0 <\n                            z >>> 0\n                              ? 1\n                              : 0)) +\n                          (se = u[K - 16]).high +\n                          ((W += Q = se.low) >>> 0 < Q >>> 0 ? 1 : 0)),\n                        ($.high = V),\n                        ($.low = W));\n                    var he,\n                      ee = (B & U) ^ (~B & G),\n                      te = (F & H) ^ (~F & j),\n                      z = (k & D) ^ (k & w) ^ (D & w),\n                      se = ((L >>> 28) | (k << 4)) ^ ((L << 30) | (k >>> 2)) ^ ((L << 25) | (k >>> 7)),\n                      Q = c[K],\n                      $ = Q.high,\n                      ye = Q.low,\n                      Se =\n                        q +\n                        (((B >>> 14) | (F << 18)) ^ ((B >>> 18) | (F << 14)) ^ ((B << 23) | (F >>> 9))) +\n                        ((he = Y + (((F >>> 14) | (B << 18)) ^ ((F >>> 18) | (B << 14)) ^ ((F << 23) | (B >>> 9)))) >>>\n                          0 <\n                        Y >>> 0\n                          ? 1\n                          : 0),\n                      Ce = se + ((L & R) ^ (L & x) ^ (R & x)),\n                      q = G,\n                      Y = j,\n                      G = U,\n                      j = H,\n                      U = B,\n                      H = F,\n                      B =\n                        (M +\n                          (Se =\n                            Se +\n                            ee +\n                            ((he += te) >>> 0 < te >>> 0 ? 1 : 0) +\n                            $ +\n                            ((he += ye) >>> 0 < ye >>> 0 ? 1 : 0) +\n                            V +\n                            ((he += W) >>> 0 < W >>> 0 ? 1 : 0)) +\n                          ((F = (P + he) | 0) >>> 0 < P >>> 0 ? 1 : 0)) |\n                        0,\n                      M = w,\n                      P = x,\n                      w = D,\n                      x = R,\n                      D = k,\n                      R = L,\n                      k =\n                        (Se +\n                          ((((k >>> 28) | (L << 4)) ^ ((k << 30) | (L >>> 2)) ^ ((k << 25) | (L >>> 7))) +\n                            z +\n                            (Ce >>> 0 < se >>> 0 ? 1 : 0)) +\n                          ((L = (he + Ce) | 0) >>> 0 < he >>> 0 ? 1 : 0)) |\n                        0;\n                  }\n                  ((d = r.low = d + L),\n                    (r.high = p + k + (d >>> 0 < L >>> 0 ? 1 : 0)),\n                    (_ = i.low = _ + R),\n                    (i.high = m + D + (_ >>> 0 < R >>> 0 ? 1 : 0)),\n                    (T = s.low = T + x),\n                    (s.high = E + w + (T >>> 0 < x >>> 0 ? 1 : 0)),\n                    (g = a.low = g + P),\n                    (a.high = A + M + (g >>> 0 < P >>> 0 ? 1 : 0)),\n                    (y = o.low = y + F),\n                    (o.high = v + B + (y >>> 0 < F >>> 0 ? 1 : 0)),\n                    (C = l.low = C + H),\n                    (l.high = S + U + (C >>> 0 < H >>> 0 ? 1 : 0)),\n                    (b = h.low = b + j),\n                    (h.high = N + G + (b >>> 0 < j >>> 0 ? 1 : 0)),\n                    (O = n.low = O + Y),\n                    (n.high = I + q + (O >>> 0 < Y >>> 0 ? 1 : 0)));\n                },\n                _doFinalize: function () {\n                  var e = this._data,\n                    t = e.words,\n                    n = 8 * this._nDataBytes,\n                    r = 8 * e.sigBytes;\n                  return (\n                    (t[r >>> 5] |= 128 << (24 - (r % 32))),\n                    (t[30 + (((128 + r) >>> 10) << 5)] = Math.floor(n / 4294967296)),\n                    (t[31 + (((128 + r) >>> 10) << 5)] = n),\n                    (e.sigBytes = 4 * t.length),\n                    this._process(),\n                    this._hash.toX32()\n                  );\n                },\n                clone: function () {\n                  var e = t.clone.call(this);\n                  return ((e._hash = this._hash.clone()), e);\n                },\n                blockSize: 32,\n              })));\n          ((e.SHA512 = t._createHelper(r)), (e.HmacSHA512 = t._createHmacHelper(r)));\n        })(),\n        n.SHA512);\n    }),\n    Sr(function (e, t) {\n      var n, i, s, o, r;\n      e.exports =\n        ((r = (n = e = dh).x64),\n        (i = r.Word),\n        (s = r.WordArray),\n        (r = n.algo),\n        (o = r.SHA512),\n        (r = r.SHA384 =\n          o.extend({\n            _doReset: function () {\n              this._hash = new s.init([\n                new i.init(3418070365, 3238371032),\n                new i.init(1654270250, 914150663),\n                new i.init(2438529370, 812702999),\n                new i.init(355462360, 4144912697),\n                new i.init(1731405415, 4290775857),\n                new i.init(2394180231, 1750603025),\n                new i.init(3675008525, 1694076839),\n                new i.init(1203062813, 3204075428),\n              ]);\n            },\n            _doFinalize: function () {\n              var e = o._doFinalize.call(this);\n              return ((e.sigBytes -= 16), e);\n            },\n          })),\n        (n.SHA384 = o._createHelper(r)),\n        (n.HmacSHA384 = o._createHmacHelper(r)),\n        e.SHA384);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        ((n = dh),\n        (function (e) {\n          var t = n,\n            i = (r = t.lib).WordArray,\n            s = r.Hasher,\n            a = t.x64.Word,\n            r = t.algo,\n            c = [],\n            u = [],\n            l = [],\n            h =\n              ((function () {\n                for (var e = 1, t = 0, n = 0; n < 24; n++) {\n                  c[e + 5 * t] = (((n + 1) * (n + 2)) / 2) % 64;\n                  var r = (2 * e + 3 * t) % 5,\n                    e = t % 5,\n                    t = r;\n                }\n                for (e = 0; e < 5; e++) for (t = 0; t < 5; t++) u[e + 5 * t] = t + ((2 * e + 3 * t) % 5) * 5;\n                for (var i = 1, s = 0; s < 24; s++) {\n                  for (var p, o = 0, h = 0, f = 0; f < 7; f++)\n                    (1 & i && ((p = (1 << f) - 1) < 32 ? (h ^= 1 << p) : (o ^= 1 << (p - 32))),\n                      128 & i ? (i = (i << 1) ^ 113) : (i <<= 1));\n                  l[s] = a.create(o, h);\n                }\n              })(),\n              []),\n            r =\n              ((function () {\n                for (var e = 0; e < 25; e++) h[e] = a.create();\n              })(),\n              (r.SHA3 = s.extend({\n                cfg: s.cfg.extend({ outputLength: 512 }),\n                _doReset: function () {\n                  for (var e = (this._state = []), t = 0; t < 25; t++) e[t] = new a.init();\n                  this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;\n                },\n                _doProcessBlock: function (e, t) {\n                  for (var n = this._state, r = this.blockSize / 2, i = 0; i < r; i++) {\n                    var s = e[t + 2 * i],\n                      a = e[t + 2 * i + 1],\n                      s = (16711935 & ((s << 8) | (s >>> 24))) | (4278255360 & ((s << 24) | (s >>> 8)));\n                    (((O = n[i]).high ^= (16711935 & ((a << 8) | (a >>> 24))) | (4278255360 & ((a << 24) | (a >>> 8)))),\n                      (O.low ^= s));\n                  }\n                  for (var o = 0; o < 24; o++) {\n                    for (var f = 0; f < 5; f++) {\n                      for (var p = 0, d = 0, m = 0; m < 5; m++) ((p ^= (O = n[f + 5 * m]).high), (d ^= O.low));\n                      var _ = h[f];\n                      ((_.high = p), (_.low = d));\n                    }\n                    for (f = 0; f < 5; f++)\n                      for (\n                        var E = h[(f + 4) % 5],\n                          A = (T = h[(f + 1) % 5]).high,\n                          T = T.low,\n                          p = E.high ^ ((A << 1) | (T >>> 31)),\n                          d = E.low ^ ((T << 1) | (A >>> 31)),\n                          m = 0;\n                        m < 5;\n                        m++\n                      )\n                        (((O = n[f + 5 * m]).high ^= p), (O.low ^= d));\n                    for (var v = 1; v < 25; v++) {\n                      var y = (O = n[v]).high,\n                        S = O.low,\n                        C = c[v];\n                      ((d =\n                        C < 32\n                          ? ((p = (y << C) | (S >>> (32 - C))), (S << C) | (y >>> (32 - C)))\n                          : ((p = (S << (C - 32)) | (y >>> (64 - C))), (y << (C - 32)) | (S >>> (64 - C)))),\n                        ((y = h[u[v]]).high = p),\n                        (y.low = d));\n                    }\n                    var b = h[0],\n                      I = n[0];\n                    for (b.high = I.high, b.low = I.low, f = 0; f < 5; f++)\n                      for (m = 0; m < 5; m++) {\n                        var O = n[(v = f + 5 * m)],\n                          k = h[v],\n                          L = h[((f + 1) % 5) + 5 * m],\n                          D = h[((f + 2) % 5) + 5 * m];\n                        ((O.high = k.high ^ (~L.high & D.high)), (O.low = k.low ^ (~L.low & D.low)));\n                      }\n                    (((O = n[0]).high ^= (b = l[o]).high), (O.low ^= b.low));\n                  }\n                },\n                _doFinalize: function () {\n                  var t = this._data,\n                    n = t.words,\n                    r = (this._nDataBytes, 8 * t.sigBytes),\n                    s = 32 * this.blockSize;\n                  ((n[r >>> 5] |= 1 << (24 - (r % 32))),\n                    (n[((e.ceil((1 + r) / s) * s) >>> 5) - 1] |= 128),\n                    (t.sigBytes = 4 * n.length),\n                    this._process());\n                  for (var a = this._state, c = (r = this.cfg.outputLength / 8) / 8, u = [], l = 0; l < c; l++) {\n                    var f = (h = a[l]).high,\n                      h = h.low,\n                      f = (16711935 & ((f << 8) | (f >>> 24))) | (4278255360 & ((f << 24) | (f >>> 8)));\n                    (u.push((16711935 & ((h << 8) | (h >>> 24))) | (4278255360 & ((h << 24) | (h >>> 8)))), u.push(f));\n                  }\n                  return new i.init(u, r);\n                },\n                clone: function () {\n                  for (var e = s.clone.call(this), t = (e._state = this._state.slice(0)), n = 0; n < 25; n++)\n                    t[n] = t[n].clone();\n                  return e;\n                },\n              })));\n          ((t.SHA3 = s._createHelper(r)), (t.HmacSHA3 = s._createHmacHelper(r)));\n        })(Math),\n        n.SHA3);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        ((n = dh),\n        (function () {\n          var t = n,\n            i = (r = t.lib).WordArray,\n            s = r.Hasher,\n            r = t.algo,\n            o = i.create([\n              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,\n              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,\n              6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13,\n            ]),\n            c = i.create([\n              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,\n              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,\n              14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11,\n            ]),\n            u = i.create([\n              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,\n              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,\n              8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6,\n            ]),\n            l = i.create([\n              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,\n              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,\n              12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11,\n            ]),\n            h = i.create([0, 1518500249, 1859775393, 2400959708, 2840853838]),\n            f = i.create([1352829926, 1548603684, 1836072691, 2053994217, 0]),\n            r = (r.RIPEMD160 = s.extend({\n              _doReset: function () {\n                this._hash = i.create([1732584193, 4023233417, 2562383102, 271733878, 3285377520]);\n              },\n              _doProcessBlock: function (e, t) {\n                for (var n = 0; n < 16; n++) {\n                  var r = t + n,\n                    i = e[r];\n                  e[r] = (16711935 & ((i << 8) | (i >>> 24))) | (4278255360 & ((i << 24) | (i >>> 8)));\n                }\n                for (\n                  var s,\n                    a,\n                    p,\n                    g,\n                    v,\n                    I,\n                    O = this._hash.words,\n                    k = h.words,\n                    L = f.words,\n                    D = o.words,\n                    R = c.words,\n                    w = u.words,\n                    x = l.words,\n                    y = (s = O[0]),\n                    S = (a = O[1]),\n                    C = (p = O[2]),\n                    N = (g = O[3]),\n                    b = (v = O[4]),\n                    n = 0;\n                  n < 80;\n                  n += 1\n                )\n                  ((I =\n                    ((I = A(\n                      (I =\n                        ((I = (s + e[t + D[n]]) | 0) +\n                          (n < 16\n                            ? (a ^ p ^ g) + k[0]\n                            : n < 32\n                              ? m(a, p, g) + k[1]\n                              : n < 48\n                                ? ((a | ~p) ^ g) + k[2]\n                                : n < 64\n                                  ? E(a, p, g) + k[3]\n                                  : (a ^ (p | ~g)) + k[4])) |\n                        0),\n                      w[n],\n                    )) +\n                      v) |\n                    0),\n                    (s = v),\n                    (v = g),\n                    (g = A(p, 10)),\n                    (p = a),\n                    (a = I),\n                    (I =\n                      ((I = A(\n                        (I =\n                          ((I = (y + e[t + R[n]]) | 0) +\n                            (n < 16\n                              ? (S ^ (C | ~N)) + L[0]\n                              : n < 32\n                                ? E(S, C, N) + L[1]\n                                : n < 48\n                                  ? ((S | ~C) ^ N) + L[2]\n                                  : n < 64\n                                    ? m(S, C, N) + L[3]\n                                    : (S ^ C ^ N) + L[4])) |\n                          0),\n                        x[n],\n                      )) +\n                        b) |\n                      0),\n                    (y = b),\n                    (b = N),\n                    (N = A(C, 10)),\n                    (C = S),\n                    (S = I));\n                ((I = (O[1] + p + N) | 0),\n                  (O[1] = (O[2] + g + b) | 0),\n                  (O[2] = (O[3] + v + y) | 0),\n                  (O[3] = (O[4] + s + S) | 0),\n                  (O[4] = (O[0] + a + C) | 0),\n                  (O[0] = I));\n              },\n              _doFinalize: function () {\n                var e = this._data,\n                  t = e.words,\n                  n = 8 * this._nDataBytes,\n                  r = 8 * e.sigBytes;\n                ((t[r >>> 5] |= 128 << (24 - (r % 32))),\n                  (t[14 + (((64 + r) >>> 9) << 4)] =\n                    (16711935 & ((n << 8) | (n >>> 24))) | (4278255360 & ((n << 24) | (n >>> 8)))),\n                  (e.sigBytes = 4 * (t.length + 1)),\n                  this._process());\n                for (var s = (r = this._hash).words, a = 0; a < 5; a++) {\n                  var o = s[a];\n                  s[a] = (16711935 & ((o << 8) | (o >>> 24))) | (4278255360 & ((o << 24) | (o >>> 8)));\n                }\n                return r;\n              },\n              clone: function () {\n                var e = s.clone.call(this);\n                return ((e._hash = this._hash.clone()), e);\n              },\n            }));\n          function m(e, t, n) {\n            return (e & t) | (~e & n);\n          }\n          function E(e, t, n) {\n            return (e & n) | (t & ~n);\n          }\n          function A(e, t) {\n            return (e << t) | (e >>> (32 - t));\n          }\n          ((t.RIPEMD160 = s._createHelper(r)), (t.HmacRIPEMD160 = s._createHmacHelper(r)));\n        })(),\n        n.RIPEMD160);\n    }),\n    Sr(function (e, t) {\n      var i;\n      e.exports =\n        ((e = dh.lib.Base),\n        (i = dh.enc.Utf8),\n        void (dh.algo.HMAC = e.extend({\n          init: function (e, t) {\n            ((e = this._hasher = new e.init()), 'string' == typeof t && (t = i.parse(t)));\n            var n = e.blockSize,\n              r = 4 * n;\n            (t = t.sigBytes > r ? e.finalize(t) : t).clamp();\n            for (\n              var e = (this._oKey = t.clone()), t = (this._iKey = t.clone()), o = e.words, c = t.words, u = 0;\n              u < n;\n              u++\n            )\n              ((o[u] ^= 1549556828), (c[u] ^= 909522486));\n            ((e.sigBytes = t.sigBytes = r), this.reset());\n          },\n          reset: function () {\n            var e = this._hasher;\n            (e.reset(), e.update(this._iKey));\n          },\n          update: function (e) {\n            return (this._hasher.update(e), this);\n          },\n          finalize: function (e) {\n            var t = this._hasher,\n              e = t.finalize(e);\n            return (t.reset(), t.finalize(this._oKey.clone().concat(e)));\n          },\n        })));\n    }),\n    Sr(function (e, t) {\n      var n, i, s, r, o, c, u;\n      e.exports =\n        ((i = (r = (n = e = dh).lib).Base),\n        (s = r.WordArray),\n        (o = (r = n.algo).SHA1),\n        (c = r.HMAC),\n        (u = r.PBKDF2 =\n          i.extend({\n            cfg: i.extend({ keySize: 4, hasher: o, iterations: 1 }),\n            init: function (e) {\n              this.cfg = this.cfg.extend(e);\n            },\n            compute: function (e, t) {\n              for (\n                var n = this.cfg,\n                  r = c.create(n.hasher, e),\n                  i = s.create(),\n                  a = s.create([1]),\n                  o = i.words,\n                  u = a.words,\n                  l = n.keySize,\n                  h = n.iterations;\n                o.length < l;\n              ) {\n                var f = r.update(t).finalize(a);\n                r.reset();\n                for (var p = f.words, d = p.length, m = f, _ = 1; _ < h; _++) {\n                  ((m = r.finalize(m)), r.reset());\n                  for (var E = m.words, T = 0; T < d; T++) p[T] ^= E[T];\n                }\n                (i.concat(f), u[0]++);\n              }\n              return ((i.sigBytes = 4 * l), i);\n            },\n          })),\n        (n.PBKDF2 = function (e, t, n) {\n          return u.create(n).compute(e, t);\n        }),\n        e.PBKDF2);\n    }),\n    Sr(function (e, t) {\n      var n, i, s, r, o, c;\n      e.exports =\n        ((i = (r = (n = e = dh).lib).Base),\n        (s = r.WordArray),\n        (o = (r = n.algo).MD5),\n        (c = r.EvpKDF =\n          i.extend({\n            cfg: i.extend({ keySize: 4, hasher: o, iterations: 1 }),\n            init: function (e) {\n              this.cfg = this.cfg.extend(e);\n            },\n            compute: function (e, t) {\n              for (\n                var n,\n                  r = this.cfg,\n                  i = r.hasher.create(),\n                  a = s.create(),\n                  o = a.words,\n                  c = r.keySize,\n                  u = r.iterations;\n                o.length < c;\n              ) {\n                (n && i.update(n), (n = i.update(e).finalize(t)), i.reset());\n                for (var l = 1; l < u; l++) ((n = i.finalize(n)), i.reset());\n                a.concat(n);\n              }\n              return ((a.sigBytes = 4 * c), a);\n            },\n          })),\n        (n.EvpKDF = function (e, t, n) {\n          return c.create(n).compute(e, t);\n        }),\n        e.EvpKDF);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports = void (\n        (n = dh).lib.Cipher ||\n        (function () {\n          var t = n,\n            r = t.lib,\n            i = r.Base,\n            s = r.WordArray,\n            a = r.BufferedBlockAlgorithm,\n            c = ((o = t.enc).Utf8, o.Base64),\n            u = t.algo.EvpKDF,\n            l = (r.Cipher = a.extend({\n              cfg: i.extend(),\n              createEncryptor: function (e, t) {\n                return this.create(this._ENC_XFORM_MODE, e, t);\n              },\n              createDecryptor: function (e, t) {\n                return this.create(this._DEC_XFORM_MODE, e, t);\n              },\n              init: function (e, t, n) {\n                ((this.cfg = this.cfg.extend(n)), (this._xformMode = e), (this._key = t), this.reset());\n              },\n              reset: function () {\n                (a.reset.call(this), this._doReset());\n              },\n              process: function (e) {\n                return (this._append(e), this._process());\n              },\n              finalize: function (e) {\n                return (e && this._append(e), this._doFinalize());\n              },\n              keySize: 4,\n              ivSize: 4,\n              _ENC_XFORM_MODE: 1,\n              _DEC_XFORM_MODE: 2,\n              _createHelper: function (t) {\n                return {\n                  encrypt: function (n, r, i) {\n                    return e(r).encrypt(t, n, r, i);\n                  },\n                  decrypt: function (n, r, i) {\n                    return e(r).decrypt(t, n, r, i);\n                  },\n                };\n              },\n            })),\n            o =\n              ((r.StreamCipher = l.extend({\n                _doFinalize: function () {\n                  return this._process(!0);\n                },\n                blockSize: 1,\n              })),\n              (t.mode = {})),\n            f = (r.BlockCipherMode = i.extend({\n              createEncryptor: function (e, t) {\n                return this.Encryptor.create(e, t);\n              },\n              createDecryptor: function (e, t) {\n                return this.Decryptor.create(e, t);\n              },\n              init: function (e, t) {\n                ((this._cipher = e), (this._iv = t));\n              },\n            })),\n            o = (o.CBC = (function () {\n              var t = f.extend();\n              function n(t, n, r) {\n                var i,\n                  s = this._iv;\n                s ? ((i = s), (this._iv = void 0)) : (i = this._prevBlock);\n                for (var a = 0; a < r; a++) t[n + a] ^= i[a];\n              }\n              return (\n                (t.Encryptor = t.extend({\n                  processBlock: function (e, t) {\n                    var r = this._cipher,\n                      i = r.blockSize;\n                    (n.call(this, e, t, i), r.encryptBlock(e, t), (this._prevBlock = e.slice(t, t + i)));\n                  },\n                })),\n                (t.Decryptor = t.extend({\n                  processBlock: function (e, t) {\n                    var r = this._cipher,\n                      i = r.blockSize,\n                      s = e.slice(t, t + i);\n                    (r.decryptBlock(e, t), n.call(this, e, t, i), (this._prevBlock = s));\n                  },\n                })),\n                t\n              );\n            })()),\n            d = ((t.pad = {}).Pkcs7 = {\n              pad: function (e, t) {\n                for (\n                  var r = (t = 4 * t) - (e.sigBytes % t), i = (r << 24) | (r << 16) | (r << 8) | r, a = [], o = 0;\n                  o < r;\n                  o += 4\n                )\n                  a.push(i);\n                ((t = s.create(a, r)), e.concat(t));\n              },\n              unpad: function (e) {\n                var t = 255 & e.words[(e.sigBytes - 1) >>> 2];\n                e.sigBytes -= t;\n              },\n            }),\n            m =\n              ((r.BlockCipher = l.extend({\n                cfg: l.cfg.extend({ mode: o, padding: d }),\n                reset: function () {\n                  l.reset.call(this);\n                  var e,\n                    n = (t = this.cfg).iv,\n                    t = t.mode;\n                  (this._xformMode == this._ENC_XFORM_MODE\n                    ? (e = t.createEncryptor)\n                    : ((e = t.createDecryptor), (this._minBufferSize = 1)),\n                    this._mode && this._mode.__creator == e\n                      ? this._mode.init(this, n && n.words)\n                      : ((this._mode = e.call(t, this, n && n.words)), (this._mode.__creator = e)));\n                },\n                _doProcessBlock: function (e, t) {\n                  this._mode.processBlock(e, t);\n                },\n                _doFinalize: function () {\n                  var e,\n                    t = this.cfg.padding;\n                  return (\n                    this._xformMode == this._ENC_XFORM_MODE\n                      ? (t.pad(this._data, this.blockSize), (e = this._process(!0)))\n                      : ((e = this._process(!0)), t.unpad(e)),\n                    e\n                  );\n                },\n                blockSize: 4,\n              })),\n              (r.CipherParams = i.extend({\n                init: function (e) {\n                  this.mixIn(e);\n                },\n                toString: function (e) {\n                  return (e || this.formatter).stringify(this);\n                },\n              }))),\n            o = ((t.format = {}).OpenSSL = {\n              stringify: function (e) {\n                var t = e.ciphertext;\n                return ((e = e.salt) ? s.create([1398893684, 1701076831]).concat(e).concat(t) : t).toString(c);\n              },\n              parse: function (e) {\n                var t,\n                  r = (e = c.parse(e)).words;\n                return (\n                  1398893684 == r[0] &&\n                    1701076831 == r[1] &&\n                    ((t = s.create(r.slice(2, 4))), r.splice(0, 4), (e.sigBytes -= 16)),\n                  m.create({ ciphertext: e, salt: t })\n                );\n              },\n            }),\n            E = (r.SerializableCipher = i.extend({\n              cfg: i.extend({ format: o }),\n              encrypt: function (e, t, n, r) {\n                r = this.cfg.extend(r);\n                var t = (i = e.createEncryptor(n, r)).finalize(t),\n                  i = i.cfg;\n                return m.create({\n                  ciphertext: t,\n                  key: n,\n                  iv: i.iv,\n                  algorithm: e,\n                  mode: i.mode,\n                  padding: i.padding,\n                  blockSize: e.blockSize,\n                  formatter: r.format,\n                });\n              },\n              decrypt: function (e, t, n, r) {\n                return (\n                  (r = this.cfg.extend(r)),\n                  (t = this._parse(t, r.format)),\n                  e.createDecryptor(n, r).finalize(t.ciphertext)\n                );\n              },\n              _parse: function (e, t) {\n                return 'string' == typeof e ? t.parse(e, this) : e;\n              },\n            })),\n            d = ((t.kdf = {}).OpenSSL = {\n              execute: function (e, t, n, r) {\n                return (\n                  (r = r || s.random(8)),\n                  (e = u.create({ keySize: t + n }).compute(e, r)),\n                  (n = s.create(e.words.slice(t), 4 * n)),\n                  (e.sigBytes = 4 * t),\n                  m.create({ key: e, iv: n, salt: r })\n                );\n              },\n            }),\n            A = (r.PasswordBasedCipher = E.extend({\n              cfg: E.cfg.extend({ kdf: d }),\n              encrypt: function (e, t, n, r) {\n                return (\n                  (n = (r = this.cfg.extend(r)).kdf.execute(n, e.keySize, e.ivSize)),\n                  (r.iv = n.iv),\n                  (e = E.encrypt.call(this, e, t, n.key, r)).mixIn(n),\n                  e\n                );\n              },\n              decrypt: function (e, t, n, r) {\n                return (\n                  (r = this.cfg.extend(r)),\n                  (t = this._parse(t, r.format)),\n                  (n = r.kdf.execute(n, e.keySize, e.ivSize, t.salt)),\n                  (r.iv = n.iv),\n                  E.decrypt.call(this, e, t, n.key, r)\n                );\n              },\n            }));\n          function e(e) {\n            return 'string' == typeof e ? A : E;\n          }\n        })()\n      );\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        (((n = dh).mode.CFB = (function () {\n          var e = n.lib.BlockCipherMode.extend();\n          function t(e, t, n, r) {\n            var i,\n              s = this._iv;\n            (s ? ((i = s.slice(0)), (this._iv = void 0)) : (i = this._prevBlock), r.encryptBlock(i, 0));\n            for (var a = 0; a < n; a++) e[t + a] ^= i[a];\n          }\n          return (\n            (e.Encryptor = e.extend({\n              processBlock: function (e, n) {\n                var r = this._cipher,\n                  i = r.blockSize;\n                (t.call(this, e, n, i, r), (this._prevBlock = e.slice(n, n + i)));\n              },\n            })),\n            (e.Decryptor = e.extend({\n              processBlock: function (e, n) {\n                var r = this._cipher,\n                  i = r.blockSize,\n                  s = e.slice(n, n + i);\n                (t.call(this, e, n, i, r), (this._prevBlock = s));\n              },\n            })),\n            e\n          );\n        })()),\n        n.mode.CFB);\n    }),\n    Sr(function (e, t) {\n      var n, r;\n      e.exports =\n        (((e = dh).mode.CTR =\n          ((r = (n = e.lib.BlockCipherMode.extend()).Encryptor =\n            n.extend({\n              processBlock: function (e, t) {\n                var n = this._cipher,\n                  r = n.blockSize,\n                  i = this._iv,\n                  s = this._counter,\n                  a = (i && ((s = this._counter = i.slice(0)), (this._iv = void 0)), s.slice(0));\n                (n.encryptBlock(a, 0), (s[r - 1] = (s[r - 1] + 1) | 0));\n                for (var o = 0; o < r; o++) e[t + o] ^= a[o];\n              },\n            })),\n          (n.Decryptor = r),\n          n)),\n        e.mode.CTR);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        (((n = dh).mode.CTRGladman = (function () {\n          var e = n.lib.BlockCipherMode.extend();\n          function t(e) {\n            var t, n, r;\n            return (\n              255 == ((e >> 24) & 255)\n                ? ((n = (e >> 8) & 255),\n                  (r = 255 & e),\n                  255 == (t = (e >> 16) & 255)\n                    ? ((t = 0), 255 === n ? ((n = 0), 255 === r ? (r = 0) : ++r) : ++n)\n                    : ++t,\n                  (e = 0),\n                  (e = (e += t << 16) + (n << 8) + r))\n                : (e += 1 << 24),\n              e\n            );\n          }\n          function r(e) {\n            0 === (e[0] = t(e[0])) && (e[1] = t(e[1]));\n          }\n          var i = (e.Encryptor = e.extend({\n            processBlock: function (e, t) {\n              var n = this._cipher,\n                i = n.blockSize,\n                s = this._iv,\n                a = this._counter,\n                o = (s && ((a = this._counter = s.slice(0)), (this._iv = void 0)), r(a), a.slice(0));\n              n.encryptBlock(o, 0);\n              for (var c = 0; c < i; c++) e[t + c] ^= o[c];\n            },\n          }));\n          return ((e.Decryptor = i), e);\n        })()),\n        n.mode.CTRGladman);\n    }),\n    Sr(function (e, t) {\n      var n, r;\n      e.exports =\n        (((e = dh).mode.OFB =\n          ((r = (n = e.lib.BlockCipherMode.extend()).Encryptor =\n            n.extend({\n              processBlock: function (e, t) {\n                var n = this._cipher,\n                  r = n.blockSize,\n                  i = this._iv,\n                  s = this._keystream;\n                (i && ((s = this._keystream = i.slice(0)), (this._iv = void 0)), n.encryptBlock(s, 0));\n                for (var a = 0; a < r; a++) e[t + a] ^= s[a];\n              },\n            })),\n          (n.Decryptor = r),\n          n)),\n        e.mode.OFB);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        (((e = dh).mode.ECB =\n          (((n = e.lib.BlockCipherMode.extend()).Encryptor = n.extend({\n            processBlock: function (e, t) {\n              this._cipher.encryptBlock(e, t);\n            },\n          })),\n          (n.Decryptor = n.extend({\n            processBlock: function (e, t) {\n              this._cipher.decryptBlock(e, t);\n            },\n          })),\n          n)),\n        e.mode.ECB);\n    }),\n    Sr(function (e, t) {\n      e.exports =\n        ((dh.pad.AnsiX923 = {\n          pad: function (e, t) {\n            var n = (n = e.sigBytes) + (t = (t = 4 * t) - (n % t)) - 1;\n            (e.clamp(), (e.words[n >>> 2] |= t << (24 - (n % 4) * 8)), (e.sigBytes += t));\n          },\n          unpad: function (e) {\n            var t = 255 & e.words[(e.sigBytes - 1) >>> 2];\n            e.sigBytes -= t;\n          },\n        }),\n        dh.pad.Ansix923);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        (((n = dh).pad.Iso10126 = {\n          pad: function (e, t) {\n            ((t = (t *= 4) - (e.sigBytes % t)),\n              e.concat(n.lib.WordArray.random(t - 1)).concat(n.lib.WordArray.create([t << 24], 1)));\n          },\n          unpad: function (e) {\n            var t = 255 & e.words[(e.sigBytes - 1) >>> 2];\n            e.sigBytes -= t;\n          },\n        }),\n        n.pad.Iso10126);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        (((n = dh).pad.Iso97971 = {\n          pad: function (e, t) {\n            (e.concat(n.lib.WordArray.create([2147483648], 1)), n.pad.ZeroPadding.pad(e, t));\n          },\n          unpad: function (e) {\n            (n.pad.ZeroPadding.unpad(e), e.sigBytes--);\n          },\n        }),\n        n.pad.Iso97971);\n    }),\n    Sr(function (e, t) {\n      e.exports =\n        ((dh.pad.ZeroPadding = {\n          pad: function (e, t) {\n            ((t *= 4), e.clamp(), (e.sigBytes += t - (e.sigBytes % t || t)));\n          },\n          unpad: function (e) {\n            for (var t = e.words, n = e.sigBytes - 1, n = e.sigBytes - 1; 0 <= n; n--)\n              if ((t[n >>> 2] >>> (24 - (n % 4) * 8)) & 255) {\n                e.sigBytes = n + 1;\n                break;\n              }\n          },\n        }),\n        dh.pad.ZeroPadding);\n    }),\n    Sr(function (e, t) {\n      e.exports = ((dh.pad.NoPadding = { pad: function () {}, unpad: function () {} }), dh.pad.NoPadding);\n    }),\n    Sr(function (e, t) {\n      var r, i;\n      e.exports =\n        ((r = (e = dh).lib.CipherParams),\n        (i = e.enc.Hex),\n        (e.format.Hex = {\n          stringify: function (e) {\n            return e.ciphertext.toString(i);\n          },\n          parse: function (e) {\n            return ((e = i.parse(e)), r.create({ ciphertext: e }));\n          },\n        }),\n        e.format.Hex);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        ((n = dh),\n        (function () {\n          var e = n,\n            t = e.lib.BlockCipher,\n            r = e.algo,\n            i = [],\n            s = [],\n            a = [],\n            o = [],\n            c = [],\n            u = [],\n            l = [],\n            h = [],\n            f = [],\n            p = [],\n            d =\n              ((function () {\n                for (var e = [], t = 0; t < 256; t++) e[t] = t < 128 ? t << 1 : (t << 1) ^ 283;\n                for (var n = 0, r = 0, t = 0; t < 256; t++) {\n                  var d = r ^ (r << 1) ^ (r << 2) ^ (r << 3) ^ (r << 4),\n                    m = ((i[n] = d = (d >>> 8) ^ (255 & d) ^ 99), e[(s[d] = n)]),\n                    _ = e[m],\n                    E = e[_],\n                    T = (257 * e[d]) ^ (16843008 * d);\n                  ((a[n] = (T << 24) | (T >>> 8)),\n                    (o[n] = (T << 16) | (T >>> 16)),\n                    (c[n] = (T << 8) | (T >>> 24)),\n                    (u[n] = T),\n                    (l[d] = ((T = (16843009 * E) ^ (65537 * _) ^ (257 * m) ^ (16843008 * n)) << 24) | (T >>> 8)),\n                    (h[d] = (T << 16) | (T >>> 16)),\n                    (f[d] = (T << 8) | (T >>> 24)),\n                    (p[d] = T),\n                    n ? ((n = m ^ e[e[e[E ^ m]]]), (r ^= e[e[r]])) : (n = r = 1));\n                }\n              })(),\n              [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54]),\n            r = (r.AES = t.extend({\n              _doReset: function () {\n                if (!this._nRounds || this._keyPriorReset !== this._key) {\n                  for (\n                    var e = (this._keyPriorReset = this._key),\n                      t = e.words,\n                      n = e.sigBytes / 4,\n                      r = 4 * (1 + (this._nRounds = 6 + n)),\n                      s = (this._keySchedule = []),\n                      a = 0;\n                    a < r;\n                    a++\n                  )\n                    a < n\n                      ? (s[a] = t[a])\n                      : ((u = s[a - 1]),\n                        a % n\n                          ? 6 < n &&\n                            a % n == 4 &&\n                            (u =\n                              (i[u >>> 24] << 24) |\n                              (i[(u >>> 16) & 255] << 16) |\n                              (i[(u >>> 8) & 255] << 8) |\n                              i[255 & u])\n                          : ((u =\n                              (i[(u = (u << 8) | (u >>> 24)) >>> 24] << 24) |\n                              (i[(u >>> 16) & 255] << 16) |\n                              (i[(u >>> 8) & 255] << 8) |\n                              i[255 & u]),\n                            (u ^= d[(a / n) | 0] << 24)),\n                        (s[a] = s[a - n] ^ u));\n                  for (var o = (this._invKeySchedule = []), c = 0; c < r; c++) {\n                    var a = r - c,\n                      u = c % 4 ? s[a] : s[a - 4];\n                    o[c] =\n                      c < 4 || a <= 4\n                        ? u\n                        : l[i[u >>> 24]] ^ h[i[(u >>> 16) & 255]] ^ f[i[(u >>> 8) & 255]] ^ p[i[255 & u]];\n                  }\n                }\n              },\n              encryptBlock: function (e, t) {\n                this._doCryptBlock(e, t, this._keySchedule, a, o, c, u, i);\n              },\n              decryptBlock: function (e, t) {\n                var n = e[t + 1];\n                ((e[t + 1] = e[t + 3]),\n                  (e[t + 3] = n),\n                  this._doCryptBlock(e, t, this._invKeySchedule, l, h, f, p, s),\n                  (n = e[t + 1]),\n                  (e[t + 1] = e[t + 3]),\n                  (e[t + 3] = n));\n              },\n              _doCryptBlock: function (e, t, n, r, i, s, a, o) {\n                for (\n                  var c = this._nRounds,\n                    u = e[t] ^ n[0],\n                    l = e[t + 1] ^ n[1],\n                    h = e[t + 2] ^ n[2],\n                    f = e[t + 3] ^ n[3],\n                    p = 4,\n                    d = 1;\n                  d < c;\n                  d++\n                )\n                  var m = r[u >>> 24] ^ i[(l >>> 16) & 255] ^ s[(h >>> 8) & 255] ^ a[255 & f] ^ n[p++],\n                    _ = r[l >>> 24] ^ i[(h >>> 16) & 255] ^ s[(f >>> 8) & 255] ^ a[255 & u] ^ n[p++],\n                    E = r[h >>> 24] ^ i[(f >>> 16) & 255] ^ s[(u >>> 8) & 255] ^ a[255 & l] ^ n[p++],\n                    T = r[f >>> 24] ^ i[(u >>> 16) & 255] ^ s[(l >>> 8) & 255] ^ a[255 & h] ^ n[p++],\n                    u = m,\n                    l = _,\n                    h = E,\n                    f = T;\n                ((m =\n                  ((o[u >>> 24] << 24) | (o[(l >>> 16) & 255] << 16) | (o[(h >>> 8) & 255] << 8) | o[255 & f]) ^\n                  n[p++]),\n                  (_ =\n                    ((o[l >>> 24] << 24) | (o[(h >>> 16) & 255] << 16) | (o[(f >>> 8) & 255] << 8) | o[255 & u]) ^\n                    n[p++]),\n                  (E =\n                    ((o[h >>> 24] << 24) | (o[(f >>> 16) & 255] << 16) | (o[(u >>> 8) & 255] << 8) | o[255 & l]) ^\n                    n[p++]),\n                  (T =\n                    ((o[f >>> 24] << 24) | (o[(u >>> 16) & 255] << 16) | (o[(l >>> 8) & 255] << 8) | o[255 & h]) ^\n                    n[p++]),\n                  (e[t] = m),\n                  (e[t + 1] = _),\n                  (e[t + 2] = E),\n                  (e[t + 3] = T));\n              },\n              keySize: 8,\n            }));\n          e.AES = t._createHelper(r);\n        })(),\n        n.AES);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        ((n = dh),\n        (function () {\n          var e = n,\n            r = (t = e.lib).WordArray,\n            t = t.BlockCipher,\n            s = e.algo,\n            a = [\n              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,\n              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,\n              12, 4,\n            ],\n            o = [\n              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,\n              47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32,\n            ],\n            c = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28],\n            u = [\n              {\n                0: 8421888,\n                268435456: 32768,\n                536870912: 8421378,\n                805306368: 2,\n                1073741824: 512,\n                1342177280: 8421890,\n                1610612736: 8389122,\n                1879048192: 8388608,\n                2147483648: 514,\n                2415919104: 8389120,\n                2684354560: 33280,\n                2952790016: 8421376,\n                3221225472: 32770,\n                3489660928: 8388610,\n                3758096384: 0,\n                4026531840: 33282,\n                134217728: 0,\n                402653184: 8421890,\n                671088640: 33282,\n                939524096: 32768,\n                1207959552: 8421888,\n                1476395008: 512,\n                1744830464: 8421378,\n                2013265920: 2,\n                2281701376: 8389120,\n                2550136832: 33280,\n                2818572288: 8421376,\n                3087007744: 8389122,\n                3355443200: 8388610,\n                3623878656: 32770,\n                3892314112: 514,\n                4160749568: 8388608,\n                1: 32768,\n                268435457: 2,\n                536870913: 8421888,\n                805306369: 8388608,\n                1073741825: 8421378,\n                1342177281: 33280,\n                1610612737: 512,\n                1879048193: 8389122,\n                2147483649: 8421890,\n                2415919105: 8421376,\n                2684354561: 8388610,\n                2952790017: 33282,\n                3221225473: 514,\n                3489660929: 8389120,\n                3758096385: 32770,\n                4026531841: 0,\n                134217729: 8421890,\n                402653185: 8421376,\n                671088641: 8388608,\n                939524097: 512,\n                1207959553: 32768,\n                1476395009: 8388610,\n                1744830465: 2,\n                2013265921: 33282,\n                2281701377: 32770,\n                2550136833: 8389122,\n                2818572289: 514,\n                3087007745: 8421888,\n                3355443201: 8389120,\n                3623878657: 0,\n                3892314113: 33280,\n                4160749569: 8421378,\n              },\n              {\n                0: 1074282512,\n                16777216: 16384,\n                33554432: 524288,\n                50331648: 1074266128,\n                67108864: 1073741840,\n                83886080: 1074282496,\n                100663296: 1073758208,\n                117440512: 16,\n                134217728: 540672,\n                150994944: 1073758224,\n                167772160: 1073741824,\n                184549376: 540688,\n                201326592: 524304,\n                218103808: 0,\n                234881024: 16400,\n                251658240: 1074266112,\n                8388608: 1073758208,\n                25165824: 540688,\n                41943040: 16,\n                58720256: 1073758224,\n                75497472: 1074282512,\n                92274688: 1073741824,\n                109051904: 524288,\n                125829120: 1074266128,\n                142606336: 524304,\n                159383552: 0,\n                176160768: 16384,\n                192937984: 1074266112,\n                209715200: 1073741840,\n                226492416: 540672,\n                243269632: 1074282496,\n                260046848: 16400,\n                268435456: 0,\n                285212672: 1074266128,\n                301989888: 1073758224,\n                318767104: 1074282496,\n                335544320: 1074266112,\n                352321536: 16,\n                369098752: 540688,\n                385875968: 16384,\n                402653184: 16400,\n                419430400: 524288,\n                436207616: 524304,\n                452984832: 1073741840,\n                469762048: 540672,\n                486539264: 1073758208,\n                503316480: 1073741824,\n                520093696: 1074282512,\n                276824064: 540688,\n                293601280: 524288,\n                310378496: 1074266112,\n                327155712: 16384,\n                343932928: 1073758208,\n                360710144: 1074282512,\n                377487360: 16,\n                394264576: 1073741824,\n                411041792: 1074282496,\n                427819008: 1073741840,\n                444596224: 1073758224,\n                461373440: 524304,\n                478150656: 0,\n                494927872: 16400,\n                511705088: 1074266128,\n                528482304: 540672,\n              },\n              {\n                0: 260,\n                1048576: 0,\n                2097152: 67109120,\n                3145728: 65796,\n                4194304: 65540,\n                5242880: 67108868,\n                6291456: 67174660,\n                7340032: 67174400,\n                8388608: 67108864,\n                9437184: 67174656,\n                10485760: 65792,\n                11534336: 67174404,\n                12582912: 67109124,\n                13631488: 65536,\n                14680064: 4,\n                15728640: 256,\n                524288: 67174656,\n                1572864: 67174404,\n                2621440: 0,\n                3670016: 67109120,\n                4718592: 67108868,\n                5767168: 65536,\n                6815744: 65540,\n                7864320: 260,\n                8912896: 4,\n                9961472: 256,\n                11010048: 67174400,\n                12058624: 65796,\n                13107200: 65792,\n                14155776: 67109124,\n                15204352: 67174660,\n                16252928: 67108864,\n                16777216: 67174656,\n                17825792: 65540,\n                18874368: 65536,\n                19922944: 67109120,\n                20971520: 256,\n                22020096: 67174660,\n                23068672: 67108868,\n                24117248: 0,\n                25165824: 67109124,\n                26214400: 67108864,\n                27262976: 4,\n                28311552: 65792,\n                29360128: 67174400,\n                30408704: 260,\n                31457280: 65796,\n                32505856: 67174404,\n                17301504: 67108864,\n                18350080: 260,\n                19398656: 67174656,\n                20447232: 0,\n                21495808: 65540,\n                22544384: 67109120,\n                23592960: 256,\n                24641536: 67174404,\n                25690112: 65536,\n                26738688: 67174660,\n                27787264: 65796,\n                28835840: 67108868,\n                29884416: 67109124,\n                30932992: 67174400,\n                31981568: 4,\n                33030144: 65792,\n              },\n              {\n                0: 2151682048,\n                65536: 2147487808,\n                131072: 4198464,\n                196608: 2151677952,\n                262144: 0,\n                327680: 4198400,\n                393216: 2147483712,\n                458752: 4194368,\n                524288: 2147483648,\n                589824: 4194304,\n                655360: 64,\n                720896: 2147487744,\n                786432: 2151678016,\n                851968: 4160,\n                917504: 4096,\n                983040: 2151682112,\n                32768: 2147487808,\n                98304: 64,\n                163840: 2151678016,\n                229376: 2147487744,\n                294912: 4198400,\n                360448: 2151682112,\n                425984: 0,\n                491520: 2151677952,\n                557056: 4096,\n                622592: 2151682048,\n                688128: 4194304,\n                753664: 4160,\n                819200: 2147483648,\n                884736: 4194368,\n                950272: 4198464,\n                1015808: 2147483712,\n                1048576: 4194368,\n                1114112: 4198400,\n                1179648: 2147483712,\n                1245184: 0,\n                1310720: 4160,\n                1376256: 2151678016,\n                1441792: 2151682048,\n                1507328: 2147487808,\n                1572864: 2151682112,\n                1638400: 2147483648,\n                1703936: 2151677952,\n                1769472: 4198464,\n                1835008: 2147487744,\n                1900544: 4194304,\n                1966080: 64,\n                2031616: 4096,\n                1081344: 2151677952,\n                1146880: 2151682112,\n                1212416: 0,\n                1277952: 4198400,\n                1343488: 4194368,\n                1409024: 2147483648,\n                1474560: 2147487808,\n                1540096: 64,\n                1605632: 2147483712,\n                1671168: 4096,\n                1736704: 2147487744,\n                1802240: 2151678016,\n                1867776: 4160,\n                1933312: 2151682048,\n                1998848: 4194304,\n                2064384: 4198464,\n              },\n              {\n                0: 128,\n                4096: 17039360,\n                8192: 262144,\n                12288: 536870912,\n                16384: 537133184,\n                20480: 16777344,\n                24576: 553648256,\n                28672: 262272,\n                32768: 16777216,\n                36864: 537133056,\n                40960: 536871040,\n                45056: 553910400,\n                49152: 553910272,\n                53248: 0,\n                57344: 17039488,\n                61440: 553648128,\n                2048: 17039488,\n                6144: 553648256,\n                10240: 128,\n                14336: 17039360,\n                18432: 262144,\n                22528: 537133184,\n                26624: 553910272,\n                30720: 536870912,\n                34816: 537133056,\n                38912: 0,\n                43008: 553910400,\n                47104: 16777344,\n                51200: 536871040,\n                55296: 553648128,\n                59392: 16777216,\n                63488: 262272,\n                65536: 262144,\n                69632: 128,\n                73728: 536870912,\n                77824: 553648256,\n                81920: 16777344,\n                86016: 553910272,\n                90112: 537133184,\n                94208: 16777216,\n                98304: 553910400,\n                102400: 553648128,\n                106496: 17039360,\n                110592: 537133056,\n                114688: 262272,\n                118784: 536871040,\n                122880: 0,\n                126976: 17039488,\n                67584: 553648256,\n                71680: 16777216,\n                75776: 17039360,\n                79872: 537133184,\n                83968: 536870912,\n                88064: 17039488,\n                92160: 128,\n                96256: 553910272,\n                100352: 262272,\n                104448: 553910400,\n                108544: 0,\n                112640: 553648128,\n                116736: 16777344,\n                120832: 262144,\n                124928: 537133056,\n                129024: 536871040,\n              },\n              {\n                0: 268435464,\n                256: 8192,\n                512: 270532608,\n                768: 270540808,\n                1024: 268443648,\n                1280: 2097152,\n                1536: 2097160,\n                1792: 268435456,\n                2048: 0,\n                2304: 268443656,\n                2560: 2105344,\n                2816: 8,\n                3072: 270532616,\n                3328: 2105352,\n                3584: 8200,\n                3840: 270540800,\n                128: 270532608,\n                384: 270540808,\n                640: 8,\n                896: 2097152,\n                1152: 2105352,\n                1408: 268435464,\n                1664: 268443648,\n                1920: 8200,\n                2176: 2097160,\n                2432: 8192,\n                2688: 268443656,\n                2944: 270532616,\n                3200: 0,\n                3456: 270540800,\n                3712: 2105344,\n                3968: 268435456,\n                4096: 268443648,\n                4352: 270532616,\n                4608: 270540808,\n                4864: 8200,\n                5120: 2097152,\n                5376: 268435456,\n                5632: 268435464,\n                5888: 2105344,\n                6144: 2105352,\n                6400: 0,\n                6656: 8,\n                6912: 270532608,\n                7168: 8192,\n                7424: 268443656,\n                7680: 270540800,\n                7936: 2097160,\n                4224: 8,\n                4480: 2105344,\n                4736: 2097152,\n                4992: 268435464,\n                5248: 268443648,\n                5504: 8200,\n                5760: 270540808,\n                6016: 270532608,\n                6272: 270540800,\n                6528: 270532616,\n                6784: 8192,\n                7040: 2105352,\n                7296: 2097160,\n                7552: 0,\n                7808: 268435456,\n                8064: 268443656,\n              },\n              {\n                0: 1048576,\n                16: 33555457,\n                32: 1024,\n                48: 1049601,\n                64: 34604033,\n                80: 0,\n                96: 1,\n                112: 34603009,\n                128: 33555456,\n                144: 1048577,\n                160: 33554433,\n                176: 34604032,\n                192: 34603008,\n                208: 1025,\n                224: 1049600,\n                240: 33554432,\n                8: 34603009,\n                24: 0,\n                40: 33555457,\n                56: 34604032,\n                72: 1048576,\n                88: 33554433,\n                104: 33554432,\n                120: 1025,\n                136: 1049601,\n                152: 33555456,\n                168: 34603008,\n                184: 1048577,\n                200: 1024,\n                216: 34604033,\n                232: 1,\n                248: 1049600,\n                256: 33554432,\n                272: 1048576,\n                288: 33555457,\n                304: 34603009,\n                320: 1048577,\n                336: 33555456,\n                352: 34604032,\n                368: 1049601,\n                384: 1025,\n                400: 34604033,\n                416: 1049600,\n                432: 1,\n                448: 0,\n                464: 34603008,\n                480: 33554433,\n                496: 1024,\n                264: 1049600,\n                280: 33555457,\n                296: 34603009,\n                312: 1,\n                328: 33554432,\n                344: 1048576,\n                360: 1025,\n                376: 34604032,\n                392: 33554433,\n                408: 34603008,\n                424: 0,\n                440: 34604033,\n                456: 1049601,\n                472: 1024,\n                488: 33555456,\n                504: 1048577,\n              },\n              {\n                0: 134219808,\n                1: 131072,\n                2: 134217728,\n                3: 32,\n                4: 131104,\n                5: 134350880,\n                6: 134350848,\n                7: 2048,\n                8: 134348800,\n                9: 134219776,\n                10: 133120,\n                11: 134348832,\n                12: 2080,\n                13: 0,\n                14: 134217760,\n                15: 133152,\n                2147483648: 2048,\n                2147483649: 134350880,\n                2147483650: 134219808,\n                2147483651: 134217728,\n                2147483652: 134348800,\n                2147483653: 133120,\n                2147483654: 133152,\n                2147483655: 32,\n                2147483656: 134217760,\n                2147483657: 2080,\n                2147483658: 131104,\n                2147483659: 134350848,\n                2147483660: 0,\n                2147483661: 134348832,\n                2147483662: 134219776,\n                2147483663: 131072,\n                16: 133152,\n                17: 134350848,\n                18: 32,\n                19: 2048,\n                20: 134219776,\n                21: 134217760,\n                22: 134348832,\n                23: 131072,\n                24: 0,\n                25: 131104,\n                26: 134348800,\n                27: 134219808,\n                28: 134350880,\n                29: 133120,\n                30: 2080,\n                31: 134217728,\n                2147483664: 131072,\n                2147483665: 2048,\n                2147483666: 134348832,\n                2147483667: 133152,\n                2147483668: 32,\n                2147483669: 134348800,\n                2147483670: 134217728,\n                2147483671: 134219808,\n                2147483672: 134350880,\n                2147483673: 134217760,\n                2147483674: 134219776,\n                2147483675: 0,\n                2147483676: 133120,\n                2147483677: 2080,\n                2147483678: 131104,\n                2147483679: 134350848,\n              },\n            ],\n            l = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679],\n            h = (s.DES = t.extend({\n              _doReset: function () {\n                for (var e = this._key.words, t = [], n = 0; n < 56; n++) {\n                  var r = a[n] - 1;\n                  t[n] = (e[r >>> 5] >>> (31 - (r % 32))) & 1;\n                }\n                for (var i = (this._subKeys = []), s = 0; s < 16; s++) {\n                  for (var u = (i[s] = []), l = c[s], n = 0; n < 24; n++)\n                    ((u[(n / 6) | 0] |= t[(o[n] - 1 + l) % 28] << (31 - (n % 6))),\n                      (u[4 + ((n / 6) | 0)] |= t[28 + ((o[n + 24] - 1 + l) % 28)] << (31 - (n % 6))));\n                  for (u[0] = (u[0] << 1) | (u[0] >>> 31), n = 1; n < 7; n++) u[n] = u[n] >>> (4 * (n - 1) + 3);\n                  u[7] = (u[7] << 5) | (u[7] >>> 27);\n                }\n                var h = (this._invSubKeys = []);\n                for (n = 0; n < 16; n++) h[n] = i[15 - n];\n              },\n              encryptBlock: function (e, t) {\n                this._doCryptBlock(e, t, this._subKeys);\n              },\n              decryptBlock: function (e, t) {\n                this._doCryptBlock(e, t, this._invSubKeys);\n              },\n              _doCryptBlock: function (e, t, n) {\n                ((this._lBlock = e[t]),\n                  (this._rBlock = e[t + 1]),\n                  f.call(this, 4, 252645135),\n                  f.call(this, 16, 65535),\n                  p.call(this, 2, 858993459),\n                  p.call(this, 8, 16711935),\n                  f.call(this, 1, 1431655765));\n                for (var r = 0; r < 16; r++) {\n                  for (var i = n[r], s = this._lBlock, a = this._rBlock, o = 0, c = 0; c < 8; c++)\n                    o |= u[c][((a ^ i[c]) & l[c]) >>> 0];\n                  ((this._lBlock = a), (this._rBlock = s ^ o));\n                }\n                var h = this._lBlock;\n                ((this._lBlock = this._rBlock),\n                  (this._rBlock = h),\n                  f.call(this, 1, 1431655765),\n                  p.call(this, 8, 16711935),\n                  p.call(this, 2, 858993459),\n                  f.call(this, 16, 65535),\n                  f.call(this, 4, 252645135),\n                  (e[t] = this._lBlock),\n                  (e[t + 1] = this._rBlock));\n              },\n              keySize: 2,\n              ivSize: 2,\n              blockSize: 2,\n            }));\n          function f(e, t) {\n            ((t = ((this._lBlock >>> e) ^ this._rBlock) & t), (this._rBlock ^= t), (this._lBlock ^= t << e));\n          }\n          function p(e, t) {\n            ((t = ((this._rBlock >>> e) ^ this._lBlock) & t), (this._lBlock ^= t), (this._rBlock ^= t << e));\n          }\n          ((e.DES = t._createHelper(h)),\n            (s = s.TripleDES =\n              t.extend({\n                _doReset: function () {\n                  if (2 !== (e = this._key.words).length && 4 !== e.length && e.length < 6)\n                    throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.');\n                  var t = e.slice(0, 2),\n                    n = e.length < 4 ? e.slice(0, 2) : e.slice(2, 4),\n                    e = e.length < 6 ? e.slice(0, 2) : e.slice(4, 6);\n                  ((this._des1 = h.createEncryptor(r.create(t))),\n                    (this._des2 = h.createEncryptor(r.create(n))),\n                    (this._des3 = h.createEncryptor(r.create(e))));\n                },\n                encryptBlock: function (e, t) {\n                  (this._des1.encryptBlock(e, t), this._des2.decryptBlock(e, t), this._des3.encryptBlock(e, t));\n                },\n                decryptBlock: function (e, t) {\n                  (this._des3.decryptBlock(e, t), this._des2.encryptBlock(e, t), this._des1.decryptBlock(e, t));\n                },\n                keySize: 6,\n                ivSize: 2,\n                blockSize: 2,\n              })),\n            (e.TripleDES = t._createHelper(s)));\n        })(),\n        n.TripleDES);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        ((n = dh),\n        (function () {\n          var e = n,\n            t = e.lib.StreamCipher,\n            r = e.algo,\n            i = (r.RC4 = t.extend({\n              _doReset: function () {\n                for (var e = this._key, t = e.words, n = e.sigBytes, r = (this._S = []), i = 0; i < 256; i++) r[i] = i;\n                for (var i = 0, s = 0; i < 256; i++) {\n                  var a = (t[(a = i % n) >>> 2] >>> (24 - (a % 4) * 8)) & 255,\n                    s = (s + r[i] + a) % 256,\n                    a = r[i];\n                  ((r[i] = r[s]), (r[s] = a));\n                }\n                this._i = this._j = 0;\n              },\n              _doProcessBlock: function (e, t) {\n                e[t] ^= s.call(this);\n              },\n              keySize: 8,\n              ivSize: 0,\n            }));\n          function s() {\n            for (var e = this._S, t = this._i, n = this._j, r = 0, i = 0; i < 4; i++) {\n              var n = (n + e[(t = (t + 1) % 256)]) % 256,\n                s = e[t];\n              ((e[t] = e[n]), (e[n] = s), (r |= e[(e[t] + e[n]) % 256] << (24 - 8 * i)));\n            }\n            return ((this._i = t), (this._j = n), r);\n          }\n          ((e.RC4 = t._createHelper(i)),\n            (r = r.RC4Drop =\n              i.extend({\n                cfg: i.cfg.extend({ drop: 192 }),\n                _doReset: function () {\n                  i._doReset.call(this);\n                  for (var e = this.cfg.drop; 0 < e; e--) s.call(this);\n                },\n              })),\n            (e.RC4Drop = t._createHelper(r)));\n        })(),\n        n.RC4);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        ((n = dh),\n        (function () {\n          var e = n,\n            t = e.lib.StreamCipher,\n            r = e.algo,\n            i = [],\n            s = [],\n            a = [],\n            r = (r.Rabbit = t.extend({\n              _doReset: function () {\n                for (var e = this._key.words, t = this.cfg.iv, n = 0; n < 4; n++)\n                  e[n] = (16711935 & ((e[n] << 8) | (e[n] >>> 24))) | (4278255360 & ((e[n] << 24) | (e[n] >>> 8)));\n                for (\n                  var r = (this._X = [\n                      e[0],\n                      (e[3] << 16) | (e[2] >>> 16),\n                      e[1],\n                      (e[0] << 16) | (e[3] >>> 16),\n                      e[2],\n                      (e[1] << 16) | (e[0] >>> 16),\n                      e[3],\n                      (e[2] << 16) | (e[1] >>> 16),\n                    ]),\n                    i = (this._C = [\n                      (e[2] << 16) | (e[2] >>> 16),\n                      (4294901760 & e[0]) | (65535 & e[1]),\n                      (e[3] << 16) | (e[3] >>> 16),\n                      (4294901760 & e[1]) | (65535 & e[2]),\n                      (e[0] << 16) | (e[0] >>> 16),\n                      (4294901760 & e[2]) | (65535 & e[3]),\n                      (e[1] << 16) | (e[1] >>> 16),\n                      (4294901760 & e[3]) | (65535 & e[0]),\n                    ]),\n                    n = (this._b = 0);\n                  n < 4;\n                  n++\n                )\n                  c.call(this);\n                for (n = 0; n < 8; n++) i[n] ^= r[(n + 4) & 7];\n                if (t) {\n                  var a = (t = t.words)[0],\n                    h =\n                      ((a = (16711935 & ((a << 8) | (a >>> 24))) | (4278255360 & ((a << 24) | (a >>> 8)))) >>> 16) |\n                      (4294901760 &\n                        (t = (16711935 & (((t = t[1]) << 8) | (t >>> 24))) | (4278255360 & ((t << 24) | (t >>> 8))))),\n                    f = (t << 16) | (65535 & a);\n                  for (\n                    i[0] ^= a, i[1] ^= h, i[2] ^= t, i[3] ^= f, i[4] ^= a, i[5] ^= h, i[6] ^= t, i[7] ^= f, n = 0;\n                    n < 4;\n                    n++\n                  )\n                    c.call(this);\n                }\n              },\n              _doProcessBlock: function (e, t) {\n                var n = this._X;\n                (c.call(this),\n                  (i[0] = n[0] ^ (n[5] >>> 16) ^ (n[3] << 16)),\n                  (i[1] = n[2] ^ (n[7] >>> 16) ^ (n[5] << 16)),\n                  (i[2] = n[4] ^ (n[1] >>> 16) ^ (n[7] << 16)),\n                  (i[3] = n[6] ^ (n[3] >>> 16) ^ (n[1] << 16)));\n                for (var r = 0; r < 4; r++)\n                  ((i[r] = (16711935 & ((i[r] << 8) | (i[r] >>> 24))) | (4278255360 & ((i[r] << 24) | (i[r] >>> 8)))),\n                    (e[t + r] ^= i[r]));\n              },\n              blockSize: 4,\n              ivSize: 2,\n            }));\n          function c() {\n            for (var e = this._X, t = this._C, n = 0; n < 8; n++) s[n] = t[n];\n            for (\n              t[0] = (t[0] + 1295307597 + this._b) | 0,\n                t[1] = (t[1] + 3545052371 + (t[0] >>> 0 < s[0] >>> 0 ? 1 : 0)) | 0,\n                t[2] = (t[2] + 886263092 + (t[1] >>> 0 < s[1] >>> 0 ? 1 : 0)) | 0,\n                t[3] = (t[3] + 1295307597 + (t[2] >>> 0 < s[2] >>> 0 ? 1 : 0)) | 0,\n                t[4] = (t[4] + 3545052371 + (t[3] >>> 0 < s[3] >>> 0 ? 1 : 0)) | 0,\n                t[5] = (t[5] + 886263092 + (t[4] >>> 0 < s[4] >>> 0 ? 1 : 0)) | 0,\n                t[6] = (t[6] + 1295307597 + (t[5] >>> 0 < s[5] >>> 0 ? 1 : 0)) | 0,\n                t[7] = (t[7] + 3545052371 + (t[6] >>> 0 < s[6] >>> 0 ? 1 : 0)) | 0,\n                this._b = t[7] >>> 0 < s[7] >>> 0 ? 1 : 0,\n                n = 0;\n              n < 8;\n              n++\n            ) {\n              var r = e[n] + t[n],\n                i = 65535 & r,\n                o = r >>> 16;\n              a[n] =\n                (((((i * i) >>> 17) + i * o) >>> 15) + o * o) ^\n                ((((4294901760 & r) * r) | 0) + (((65535 & r) * r) | 0));\n            }\n            ((e[0] = (a[0] + ((a[7] << 16) | (a[7] >>> 16)) + ((a[6] << 16) | (a[6] >>> 16))) | 0),\n              (e[1] = (a[1] + ((a[0] << 8) | (a[0] >>> 24)) + a[7]) | 0),\n              (e[2] = (a[2] + ((a[1] << 16) | (a[1] >>> 16)) + ((a[0] << 16) | (a[0] >>> 16))) | 0),\n              (e[3] = (a[3] + ((a[2] << 8) | (a[2] >>> 24)) + a[1]) | 0),\n              (e[4] = (a[4] + ((a[3] << 16) | (a[3] >>> 16)) + ((a[2] << 16) | (a[2] >>> 16))) | 0),\n              (e[5] = (a[5] + ((a[4] << 8) | (a[4] >>> 24)) + a[3]) | 0),\n              (e[6] = (a[6] + ((a[5] << 16) | (a[5] >>> 16)) + ((a[4] << 16) | (a[4] >>> 16))) | 0),\n              (e[7] = (a[7] + ((a[6] << 8) | (a[6] >>> 24)) + a[5]) | 0));\n          }\n          e.Rabbit = t._createHelper(r);\n        })(),\n        n.Rabbit);\n    }),\n    Sr(function (e, t) {\n      var n;\n      e.exports =\n        ((n = dh),\n        (function () {\n          var e = n,\n            t = e.lib.StreamCipher,\n            r = e.algo,\n            i = [],\n            s = [],\n            a = [],\n            r = (r.RabbitLegacy = t.extend({\n              _doReset: function () {\n                for (\n                  var e = this._key.words,\n                    t = this.cfg.iv,\n                    n = (this._X = [\n                      e[0],\n                      (e[3] << 16) | (e[2] >>> 16),\n                      e[1],\n                      (e[0] << 16) | (e[3] >>> 16),\n                      e[2],\n                      (e[1] << 16) | (e[0] >>> 16),\n                      e[3],\n                      (e[2] << 16) | (e[1] >>> 16),\n                    ]),\n                    r = (this._C = [\n                      (e[2] << 16) | (e[2] >>> 16),\n                      (4294901760 & e[0]) | (65535 & e[1]),\n                      (e[3] << 16) | (e[3] >>> 16),\n                      (4294901760 & e[1]) | (65535 & e[2]),\n                      (e[0] << 16) | (e[0] >>> 16),\n                      (4294901760 & e[2]) | (65535 & e[3]),\n                      (e[1] << 16) | (e[1] >>> 16),\n                      (4294901760 & e[3]) | (65535 & e[0]),\n                    ]),\n                    i = (this._b = 0);\n                  i < 4;\n                  i++\n                )\n                  c.call(this);\n                for (i = 0; i < 8; i++) r[i] ^= n[(i + 4) & 7];\n                if (t) {\n                  var h =\n                      ((t =\n                        (16711935 & (((t = (e = t.words)[0]) << 8) | (t >>> 24))) |\n                        (4278255360 & ((t << 24) | (t >>> 8)))) >>>\n                        16) |\n                      (4294901760 &\n                        (e = (16711935 & (((e = e[1]) << 8) | (e >>> 24))) | (4278255360 & ((e << 24) | (e >>> 8))))),\n                    f = (e << 16) | (65535 & t);\n                  for (\n                    r[0] ^= t, r[1] ^= h, r[2] ^= e, r[3] ^= f, r[4] ^= t, r[5] ^= h, r[6] ^= e, r[7] ^= f, i = 0;\n                    i < 4;\n                    i++\n                  )\n                    c.call(this);\n                }\n              },\n              _doProcessBlock: function (e, t) {\n                var n = this._X;\n                (c.call(this),\n                  (i[0] = n[0] ^ (n[5] >>> 16) ^ (n[3] << 16)),\n                  (i[1] = n[2] ^ (n[7] >>> 16) ^ (n[5] << 16)),\n                  (i[2] = n[4] ^ (n[1] >>> 16) ^ (n[7] << 16)),\n                  (i[3] = n[6] ^ (n[3] >>> 16) ^ (n[1] << 16)));\n                for (var r = 0; r < 4; r++)\n                  ((i[r] = (16711935 & ((i[r] << 8) | (i[r] >>> 24))) | (4278255360 & ((i[r] << 24) | (i[r] >>> 8)))),\n                    (e[t + r] ^= i[r]));\n              },\n              blockSize: 4,\n              ivSize: 2,\n            }));\n          function c() {\n            for (var e = this._X, t = this._C, n = 0; n < 8; n++) s[n] = t[n];\n            for (\n              t[0] = (t[0] + 1295307597 + this._b) | 0,\n                t[1] = (t[1] + 3545052371 + (t[0] >>> 0 < s[0] >>> 0 ? 1 : 0)) | 0,\n                t[2] = (t[2] + 886263092 + (t[1] >>> 0 < s[1] >>> 0 ? 1 : 0)) | 0,\n                t[3] = (t[3] + 1295307597 + (t[2] >>> 0 < s[2] >>> 0 ? 1 : 0)) | 0,\n                t[4] = (t[4] + 3545052371 + (t[3] >>> 0 < s[3] >>> 0 ? 1 : 0)) | 0,\n                t[5] = (t[5] + 886263092 + (t[4] >>> 0 < s[4] >>> 0 ? 1 : 0)) | 0,\n                t[6] = (t[6] + 1295307597 + (t[5] >>> 0 < s[5] >>> 0 ? 1 : 0)) | 0,\n                t[7] = (t[7] + 3545052371 + (t[6] >>> 0 < s[6] >>> 0 ? 1 : 0)) | 0,\n                this._b = t[7] >>> 0 < s[7] >>> 0 ? 1 : 0,\n                n = 0;\n              n < 8;\n              n++\n            ) {\n              var r = e[n] + t[n],\n                i = 65535 & r,\n                o = r >>> 16;\n              a[n] =\n                (((((i * i) >>> 17) + i * o) >>> 15) + o * o) ^\n                ((((4294901760 & r) * r) | 0) + (((65535 & r) * r) | 0));\n            }\n            ((e[0] = (a[0] + ((a[7] << 16) | (a[7] >>> 16)) + ((a[6] << 16) | (a[6] >>> 16))) | 0),\n              (e[1] = (a[1] + ((a[0] << 8) | (a[0] >>> 24)) + a[7]) | 0),\n              (e[2] = (a[2] + ((a[1] << 16) | (a[1] >>> 16)) + ((a[0] << 16) | (a[0] >>> 16))) | 0),\n              (e[3] = (a[3] + ((a[2] << 8) | (a[2] >>> 24)) + a[1]) | 0),\n              (e[4] = (a[4] + ((a[3] << 16) | (a[3] >>> 16)) + ((a[2] << 16) | (a[2] >>> 16))) | 0),\n              (e[5] = (a[5] + ((a[4] << 8) | (a[4] >>> 24)) + a[3]) | 0),\n              (e[6] = (a[6] + ((a[5] << 16) | (a[5] >>> 16)) + ((a[4] << 16) | (a[4] >>> 16))) | 0),\n              (e[7] = (a[7] + ((a[6] << 8) | (a[6] >>> 24)) + a[5]) | 0));\n          }\n          e.RabbitLegacy = t._createHelper(r);\n        })(),\n        n.RabbitLegacy);\n    }),\n    Sr(function (e, t) {\n      e.exports = dh;\n    })),\n  _h = function (t, n, r, i) {\n    return 'string' == typeof (t = 'undefined' != typeof Buffer && Buffer.isBuffer(t) ? t.toString() : t)\n      ? (function (e, t, n, r) {\n          return t.xmlMode || t._useHtmlParser2\n            ? (function (e, t) {\n                var n = new w(void 0, t);\n                return (new va(n, t).end(e), n.root);\n              })(e, t)\n            : ta(e, t, n, r);\n        })(t, n, r, i)\n      : ((n = t), !Array.isArray(n) && O(n) ? n : (Bn(n, (r = new v([]))), r));\n  },\n  Eh = (function (e) {\n    return function r(s, a, o) {\n      if ((void 0 === o && (o = !0), null == s)) throw new Error('cheerio.load() expects a string');\n      var c = rr(rr({}, n), i(a)),\n        u = e(s, c, o, null),\n        l = (function (n) {\n          function r() {\n            return (null !== n && n.apply(this, arguments)) || this;\n          }\n          return (\n            nr(r, n),\n            (r.prototype._make = function (e, t) {\n              return (((e = h(e, t)).prevObject = this), e);\n            }),\n            (r.prototype._parse = function (t, n, r, i) {\n              return e(t, n, r, i);\n            }),\n            (r.prototype._render = function (e) {\n              return (function (e, t) {\n                return t.xmlMode || t._useHtmlParser2\n                  ? W(e, t)\n                  : (function (e) {\n                      for (var t, n = ('length' in e) ? e : [e], r = 0; r < n.length; r += 1)\n                        O((s = n[r])) && (t = Array.prototype.splice).call.apply(t, ea([n, r, 1], s.children, !1));\n                      for (var s, i = '', r = 0; r < n.length; r += 1) i += Qs((s = n[r]), sa);\n                      return i;\n                    })(e);\n              })(e, this.options);\n            }),\n            r\n          );\n        })(er);\n      function h(t, n, r, s) {\n        if ((void 0 === r && (r = u), t && Pe(t))) return t;\n        if (\n          ((s = rr(rr({}, c), i(s))),\n          ((r = Pe((r = 'string' == typeof r ? [e(r, s, !1, null)] : 'length' in r ? r : [r]))\n            ? r\n            : new l(r, null, s))._root = r),\n          !t)\n        )\n          return new l(void 0, r, s);\n        var p =\n            'string' == typeof t && Ue(t)\n              ? e(t, s, !1, null).children\n              : t.name || 'root' === t.type || 'text' === t.type || 'comment' === t.type\n                ? [t]\n                : Array.isArray(t)\n                  ? t\n                  : void 0,\n          d = new l(p, r, s);\n        if (p) return d;\n        if ('string' != typeof t) throw new Error('Unexpected type of selector');\n        return (\n          (p = t),\n          (t = n\n            ? 'string' == typeof n\n              ? Ue(n)\n                ? new l([e(n, s, !1, null)], r, s)\n                : ((p = ''.concat(n, ' ').concat(p)), r)\n              : Pe(n)\n                ? n\n                : new l(Array.isArray(n) ? n : [n], r, s)\n            : r)\n            ? t.find(p)\n            : d\n        );\n      }\n      return (Object.assign(h, Me, { load: r, _root: u, _options: c, fn: l.prototype, prototype: l.prototype }), h);\n    };\n  })(_h);\nfunction Th(e, t) {\n  return Fa({ path: e, json: t });\n}\nfunction Ah(e) {\n  return Fa(e);\n}\nfunction gh(e, t) {\n  return Bl(e, t);\n}\nvar vh = ch,\n  yh = fh,\n  Sh = ph,\n  Ch = mh,\n  Nh = Eh([]),\n  bh = De,\n  Ih = Re,\n  Oh = ke,\n  kh = Le;\nexport {\n  Ch as Crypto,\n  yh as Uri,\n  Sh as _,\n  Nh as cheerio,\n  bh as contains,\n  vh as dayjs,\n  be as html,\n  gh as jinja2,\n  Th as jp,\n  Ah as jpo,\n  Eh as load,\n  Ih as merge,\n  Oh as parseHTML,\n  kh as root,\n  Oe as text,\n  Ie as xml,\n};\n"
  },
  {
    "path": "resources/t3Catopen/crypto-js.js",
    "content": "(function (root, factory) {\n  if (typeof exports === 'object') {\n    // CommonJS\n    module.exports = exports = factory();\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD\n    define([], factory);\n  } else {\n    // Global (browser)\n    globalThis.CryptoJS = factory();\n  }\n})(this, function () {\n  /*globals window, global, require*/\n\n  /**\n   * CryptoJS core components.\n   */\n  var CryptoJS =\n    CryptoJS ||\n    (function (Math, undefined) {\n      var crypto;\n\n      // Native crypto from window (Browser)\n      if (typeof window !== 'undefined' && window.crypto) {\n        crypto = window.crypto;\n      }\n\n      // Native crypto in web worker (Browser)\n      if (typeof self !== 'undefined' && self.crypto) {\n        crypto = self.crypto;\n      }\n\n      // Native crypto from worker\n      if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n        crypto = globalThis.crypto;\n      }\n\n      // Native (experimental IE 11) crypto from window (Browser)\n      if (!crypto && typeof window !== 'undefined' && window.msCrypto) {\n        crypto = window.msCrypto;\n      }\n\n      // Native crypto from global (NodeJS)\n      if (!crypto && typeof global !== 'undefined' && global.crypto) {\n        crypto = global.crypto;\n      }\n\n      // Native crypto import via require (NodeJS)\n      if (!crypto && typeof require === 'function') {\n        try {\n          crypto = require('crypto');\n        } catch (err) {}\n      }\n\n      /*\n       * Cryptographically secure pseudorandom number generator\n       *\n       * As Math.random() is cryptographically not safe to use\n       */\n      var cryptoSecureRandomInt = function () {\n        if (crypto) {\n          // Use getRandomValues method (Browser)\n          if (typeof crypto.getRandomValues === 'function') {\n            try {\n              return crypto.getRandomValues(new Uint32Array(1))[0];\n            } catch (err) {}\n          }\n\n          // Use randomBytes method (NodeJS)\n          if (typeof crypto.randomBytes === 'function') {\n            try {\n              return crypto.randomBytes(4).readInt32LE();\n            } catch (err) {}\n          }\n        }\n\n        throw new Error('Native crypto module could not be used to get secure random number.');\n      };\n\n      /*\n\t     * Local polyfill of Object.create\n\n\t     */\n      var create =\n        Object.create ||\n        (function () {\n          function F() {}\n\n          return function (obj) {\n            var subtype;\n\n            F.prototype = obj;\n\n            subtype = new F();\n\n            F.prototype = null;\n\n            return subtype;\n          };\n        })();\n\n      /**\n       * CryptoJS namespace.\n       */\n      var C = {};\n\n      /**\n       * Library namespace.\n       */\n      var C_lib = (C.lib = {});\n\n      /**\n       * Base object for prototypal inheritance.\n       */\n      var Base = (C_lib.Base = (function () {\n        return {\n          /**\n           * Creates a new object that inherits from this object.\n           *\n           * @param {Object} overrides Properties to copy into the new object.\n           *\n           * @return {Object} The new object.\n           *\n           * @static\n           *\n           * @example\n           *\n           *     var MyType = CryptoJS.lib.Base.extend({\n           *         field: 'value',\n           *\n           *         method: function () {\n           *         }\n           *     });\n           */\n          extend: function (overrides) {\n            // Spawn\n            var subtype = create(this);\n\n            // Augment\n            if (overrides) {\n              subtype.mixIn(overrides);\n            }\n\n            // Create default initializer\n            if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n              subtype.init = function () {\n                subtype.$super.init.apply(this, arguments);\n              };\n            }\n\n            // Initializer's prototype is the subtype object\n            subtype.init.prototype = subtype;\n\n            // Reference supertype\n            subtype.$super = this;\n\n            return subtype;\n          },\n\n          /**\n           * Extends this object and runs the init method.\n           * Arguments to create() will be passed to init().\n           *\n           * @return {Object} The new object.\n           *\n           * @static\n           *\n           * @example\n           *\n           *     var instance = MyType.create();\n           */\n          create: function () {\n            var instance = this.extend();\n            instance.init.apply(instance, arguments);\n\n            return instance;\n          },\n\n          /**\n           * Initializes a newly created object.\n           * Override this method to add some logic when your objects are created.\n           *\n           * @example\n           *\n           *     var MyType = CryptoJS.lib.Base.extend({\n           *         init: function () {\n           *             // ...\n           *         }\n           *     });\n           */\n          init: function () {},\n\n          /**\n           * Copies properties into this object.\n           *\n           * @param {Object} properties The properties to mix in.\n           *\n           * @example\n           *\n           *     MyType.mixIn({\n           *         field: 'value'\n           *     });\n           */\n          mixIn: function (properties) {\n            for (var propertyName in properties) {\n              if (properties.hasOwnProperty(propertyName)) {\n                this[propertyName] = properties[propertyName];\n              }\n            }\n\n            // IE won't copy toString using the loop above\n            if (properties.hasOwnProperty('toString')) {\n              this.toString = properties.toString;\n            }\n          },\n\n          /**\n           * Creates a copy of this object.\n           *\n           * @return {Object} The clone.\n           *\n           * @example\n           *\n           *     var clone = instance.clone();\n           */\n          clone: function () {\n            return this.init.prototype.extend(this);\n          },\n        };\n      })());\n\n      /**\n       * An array of 32-bit words.\n       *\n       * @property {Array} words The array of 32-bit words.\n       * @property {number} sigBytes The number of significant bytes in this word array.\n       */\n      var WordArray = (C_lib.WordArray = Base.extend({\n        /**\n         * Initializes a newly created word array.\n         *\n         * @param {Array} words (Optional) An array of 32-bit words.\n         * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n         *\n         * @example\n         *\n         *     var wordArray = CryptoJS.lib.WordArray.create();\n         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n         */\n        init: function (words, sigBytes) {\n          words = this.words = words || [];\n\n          if (sigBytes != undefined) {\n            this.sigBytes = sigBytes;\n          } else {\n            this.sigBytes = words.length * 4;\n          }\n        },\n\n        /**\n         * Converts this word array to a string.\n         *\n         * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n         *\n         * @return {string} The stringified word array.\n         *\n         * @example\n         *\n         *     var string = wordArray + '';\n         *     var string = wordArray.toString();\n         *     var string = wordArray.toString(CryptoJS.enc.Utf8);\n         */\n        toString: function (encoder) {\n          return (encoder || Hex).stringify(this);\n        },\n\n        /**\n         * Concatenates a word array to this word array.\n         *\n         * @param {WordArray} wordArray The word array to append.\n         *\n         * @return {WordArray} This word array.\n         *\n         * @example\n         *\n         *     wordArray1.concat(wordArray2);\n         */\n        concat: function (wordArray) {\n          // Shortcuts\n          var thisWords = this.words;\n          var thatWords = wordArray.words;\n          var thisSigBytes = this.sigBytes;\n          var thatSigBytes = wordArray.sigBytes;\n\n          // Clamp excess bits\n          this.clamp();\n\n          // Concat\n          if (thisSigBytes % 4) {\n            // Copy one byte at a time\n            for (var i = 0; i < thatSigBytes; i++) {\n              var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n              thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n            }\n          } else {\n            // Copy one word at a time\n            for (var j = 0; j < thatSigBytes; j += 4) {\n              thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2];\n            }\n          }\n          this.sigBytes += thatSigBytes;\n\n          // Chainable\n          return this;\n        },\n\n        /**\n         * Removes insignificant bits.\n         *\n         * @example\n         *\n         *     wordArray.clamp();\n         */\n        clamp: function () {\n          // Shortcuts\n          var words = this.words;\n          var sigBytes = this.sigBytes;\n\n          // Clamp\n          words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n          words.length = Math.ceil(sigBytes / 4);\n        },\n\n        /**\n         * Creates a copy of this word array.\n         *\n         * @return {WordArray} The clone.\n         *\n         * @example\n         *\n         *     var clone = wordArray.clone();\n         */\n        clone: function () {\n          var clone = Base.clone.call(this);\n          clone.words = this.words.slice(0);\n\n          return clone;\n        },\n\n        /**\n         * Creates a word array filled with random bytes.\n         *\n         * @param {number} nBytes The number of random bytes to generate.\n         *\n         * @return {WordArray} The random word array.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var wordArray = CryptoJS.lib.WordArray.random(16);\n         */\n        random: function (nBytes) {\n          var words = [];\n\n          for (var i = 0; i < nBytes; i += 4) {\n            words.push(cryptoSecureRandomInt());\n          }\n\n          return new WordArray.init(words, nBytes);\n        },\n      }));\n\n      /**\n       * Encoder namespace.\n       */\n      var C_enc = (C.enc = {});\n\n      /**\n       * Hex encoding strategy.\n       */\n      var Hex = (C_enc.Hex = {\n        /**\n         * Converts a word array to a hex string.\n         *\n         * @param {WordArray} wordArray The word array.\n         *\n         * @return {string} The hex string.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n         */\n        stringify: function (wordArray) {\n          // Shortcuts\n          var words = wordArray.words;\n          var sigBytes = wordArray.sigBytes;\n\n          // Convert\n          var hexChars = [];\n          for (var i = 0; i < sigBytes; i++) {\n            var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n            hexChars.push((bite >>> 4).toString(16));\n            hexChars.push((bite & 0x0f).toString(16));\n          }\n\n          return hexChars.join('');\n        },\n\n        /**\n         * Converts a hex string to a word array.\n         *\n         * @param {string} hexStr The hex string.\n         *\n         * @return {WordArray} The word array.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var wordArray = CryptoJS.enc.Hex.parse(hexString);\n         */\n        parse: function (hexStr) {\n          // Shortcut\n          var hexStrLength = hexStr.length;\n\n          // Convert\n          var words = [];\n          for (var i = 0; i < hexStrLength; i += 2) {\n            words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n          }\n\n          return new WordArray.init(words, hexStrLength / 2);\n        },\n      });\n\n      /**\n       * Latin1 encoding strategy.\n       */\n      var Latin1 = (C_enc.Latin1 = {\n        /**\n         * Converts a word array to a Latin1 string.\n         *\n         * @param {WordArray} wordArray The word array.\n         *\n         * @return {string} The Latin1 string.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n         */\n        stringify: function (wordArray) {\n          // Shortcuts\n          var words = wordArray.words;\n          var sigBytes = wordArray.sigBytes;\n\n          // Convert\n          var latin1Chars = [];\n          for (var i = 0; i < sigBytes; i++) {\n            var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n            latin1Chars.push(String.fromCharCode(bite));\n          }\n\n          return latin1Chars.join('');\n        },\n\n        /**\n         * Converts a Latin1 string to a word array.\n         *\n         * @param {string} latin1Str The Latin1 string.\n         *\n         * @return {WordArray} The word array.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n         */\n        parse: function (latin1Str) {\n          // Shortcut\n          var latin1StrLength = latin1Str.length;\n\n          // Convert\n          var words = [];\n          for (var i = 0; i < latin1StrLength; i++) {\n            words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n          }\n\n          return new WordArray.init(words, latin1StrLength);\n        },\n      });\n\n      /**\n       * UTF-8 encoding strategy.\n       */\n      var Utf8 = (C_enc.Utf8 = {\n        /**\n         * Converts a word array to a UTF-8 string.\n         *\n         * @param {WordArray} wordArray The word array.\n         *\n         * @return {string} The UTF-8 string.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n         */\n        stringify: function (wordArray) {\n          try {\n            return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n          } catch (e) {\n            throw new Error('Malformed UTF-8 data');\n          }\n        },\n\n        /**\n         * Converts a UTF-8 string to a word array.\n         *\n         * @param {string} utf8Str The UTF-8 string.\n         *\n         * @return {WordArray} The word array.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n         */\n        parse: function (utf8Str) {\n          return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n        },\n      });\n\n      /**\n       * Abstract buffered block algorithm template.\n       *\n       * The property blockSize must be implemented in a concrete subtype.\n       *\n       * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n       */\n      var BufferedBlockAlgorithm = (C_lib.BufferedBlockAlgorithm = Base.extend({\n        /**\n         * Resets this block algorithm's data buffer to its initial state.\n         *\n         * @example\n         *\n         *     bufferedBlockAlgorithm.reset();\n         */\n        reset: function () {\n          // Initial values\n          this._data = new WordArray.init();\n          this._nDataBytes = 0;\n        },\n\n        /**\n         * Adds new data to this block algorithm's buffer.\n         *\n         * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n         *\n         * @example\n         *\n         *     bufferedBlockAlgorithm._append('data');\n         *     bufferedBlockAlgorithm._append(wordArray);\n         */\n        _append: function (data) {\n          // Convert string to WordArray, else assume WordArray already\n          if (typeof data == 'string') {\n            data = Utf8.parse(data);\n          }\n\n          // Append\n          this._data.concat(data);\n          this._nDataBytes += data.sigBytes;\n        },\n\n        /**\n         * Processes available data blocks.\n         *\n         * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n         *\n         * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n         *\n         * @return {WordArray} The processed data.\n         *\n         * @example\n         *\n         *     var processedData = bufferedBlockAlgorithm._process();\n         *     var processedData = bufferedBlockAlgorithm._process(!!'flush');\n         */\n        _process: function (doFlush) {\n          var processedWords;\n\n          // Shortcuts\n          var data = this._data;\n          var dataWords = data.words;\n          var dataSigBytes = data.sigBytes;\n          var blockSize = this.blockSize;\n          var blockSizeBytes = blockSize * 4;\n\n          // Count blocks ready\n          var nBlocksReady = dataSigBytes / blockSizeBytes;\n          if (doFlush) {\n            // Round up to include partial blocks\n            nBlocksReady = Math.ceil(nBlocksReady);\n          } else {\n            // Round down to include only full blocks,\n            // less the number of blocks that must remain in the buffer\n            nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n          }\n\n          // Count words ready\n          var nWordsReady = nBlocksReady * blockSize;\n\n          // Count bytes ready\n          var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n          // Process blocks\n          if (nWordsReady) {\n            for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n              // Perform concrete-algorithm logic\n              this._doProcessBlock(dataWords, offset);\n            }\n\n            // Remove processed words\n            processedWords = dataWords.splice(0, nWordsReady);\n            data.sigBytes -= nBytesReady;\n          }\n\n          // Return processed words\n          return new WordArray.init(processedWords, nBytesReady);\n        },\n\n        /**\n         * Creates a copy of this object.\n         *\n         * @return {Object} The clone.\n         *\n         * @example\n         *\n         *     var clone = bufferedBlockAlgorithm.clone();\n         */\n        clone: function () {\n          var clone = Base.clone.call(this);\n          clone._data = this._data.clone();\n\n          return clone;\n        },\n\n        _minBufferSize: 0,\n      }));\n\n      /**\n       * Abstract hasher template.\n       *\n       * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n       */\n      var Hasher = (C_lib.Hasher = BufferedBlockAlgorithm.extend({\n        /**\n         * Configuration options.\n         */\n        cfg: Base.extend(),\n\n        /**\n         * Initializes a newly created hasher.\n         *\n         * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n         *\n         * @example\n         *\n         *     var hasher = CryptoJS.algo.SHA256.create();\n         */\n        init: function (cfg) {\n          // Apply config defaults\n          this.cfg = this.cfg.extend(cfg);\n\n          // Set initial values\n          this.reset();\n        },\n\n        /**\n         * Resets this hasher to its initial state.\n         *\n         * @example\n         *\n         *     hasher.reset();\n         */\n        reset: function () {\n          // Reset data buffer\n          BufferedBlockAlgorithm.reset.call(this);\n\n          // Perform concrete-hasher logic\n          this._doReset();\n        },\n\n        /**\n         * Updates this hasher with a message.\n         *\n         * @param {WordArray|string} messageUpdate The message to append.\n         *\n         * @return {Hasher} This hasher.\n         *\n         * @example\n         *\n         *     hasher.update('message');\n         *     hasher.update(wordArray);\n         */\n        update: function (messageUpdate) {\n          // Append\n          this._append(messageUpdate);\n\n          // Update the hash\n          this._process();\n\n          // Chainable\n          return this;\n        },\n\n        /**\n         * Finalizes the hash computation.\n         * Note that the finalize operation is effectively a destructive, read-once operation.\n         *\n         * @param {WordArray|string} messageUpdate (Optional) A final message update.\n         *\n         * @return {WordArray} The hash.\n         *\n         * @example\n         *\n         *     var hash = hasher.finalize();\n         *     var hash = hasher.finalize('message');\n         *     var hash = hasher.finalize(wordArray);\n         */\n        finalize: function (messageUpdate) {\n          // Final message update\n          if (messageUpdate) {\n            this._append(messageUpdate);\n          }\n\n          // Perform concrete-hasher logic\n          var hash = this._doFinalize();\n\n          return hash;\n        },\n\n        blockSize: 512 / 32,\n\n        /**\n         * Creates a shortcut function to a hasher's object interface.\n         *\n         * @param {Hasher} hasher The hasher to create a helper for.\n         *\n         * @return {Function} The shortcut function.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n         */\n        _createHelper: function (hasher) {\n          return function (message, cfg) {\n            return new hasher.init(cfg).finalize(message);\n          };\n        },\n\n        /**\n         * Creates a shortcut function to the HMAC's object interface.\n         *\n         * @param {Hasher} hasher The hasher to use in this HMAC helper.\n         *\n         * @return {Function} The shortcut function.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n         */\n        _createHmacHelper: function (hasher) {\n          return function (message, key) {\n            return new C_algo.HMAC.init(hasher, key).finalize(message);\n          };\n        },\n      }));\n\n      /**\n       * Algorithm namespace.\n       */\n      var C_algo = (C.algo = {});\n\n      return C;\n    })(Math);\n\n  (function (undefined) {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var Base = C_lib.Base;\n    var X32WordArray = C_lib.WordArray;\n\n    /**\n     * x64 namespace.\n     */\n    var C_x64 = (C.x64 = {});\n\n    /**\n     * A 64-bit word.\n     */\n    var X64Word = (C_x64.Word = Base.extend({\n      /**\n       * Initializes a newly created 64-bit word.\n       *\n       * @param {number} high The high 32 bits.\n       * @param {number} low The low 32 bits.\n       *\n       * @example\n       *\n       *     var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\n       */\n      init: function (high, low) {\n        this.high = high;\n        this.low = low;\n      },\n\n      /**\n       * Bitwise NOTs this word.\n       *\n       * @return {X64Word} A new x64-Word object after negating.\n       *\n       * @example\n       *\n       *     var negated = x64Word.not();\n       */\n      // not: function () {\n      // var high = ~this.high;\n      // var low = ~this.low;\n\n      // return X64Word.create(high, low);\n      // },\n\n      /**\n       * Bitwise ANDs this word with the passed word.\n       *\n       * @param {X64Word} word The x64-Word to AND with this word.\n       *\n       * @return {X64Word} A new x64-Word object after ANDing.\n       *\n       * @example\n       *\n       *     var anded = x64Word.and(anotherX64Word);\n       */\n      // and: function (word) {\n      // var high = this.high & word.high;\n      // var low = this.low & word.low;\n\n      // return X64Word.create(high, low);\n      // },\n\n      /**\n       * Bitwise ORs this word with the passed word.\n       *\n       * @param {X64Word} word The x64-Word to OR with this word.\n       *\n       * @return {X64Word} A new x64-Word object after ORing.\n       *\n       * @example\n       *\n       *     var ored = x64Word.or(anotherX64Word);\n       */\n      // or: function (word) {\n      // var high = this.high | word.high;\n      // var low = this.low | word.low;\n\n      // return X64Word.create(high, low);\n      // },\n\n      /**\n       * Bitwise XORs this word with the passed word.\n       *\n       * @param {X64Word} word The x64-Word to XOR with this word.\n       *\n       * @return {X64Word} A new x64-Word object after XORing.\n       *\n       * @example\n       *\n       *     var xored = x64Word.xor(anotherX64Word);\n       */\n      // xor: function (word) {\n      // var high = this.high ^ word.high;\n      // var low = this.low ^ word.low;\n\n      // return X64Word.create(high, low);\n      // },\n\n      /**\n       * Shifts this word n bits to the left.\n       *\n       * @param {number} n The number of bits to shift.\n       *\n       * @return {X64Word} A new x64-Word object after shifting.\n       *\n       * @example\n       *\n       *     var shifted = x64Word.shiftL(25);\n       */\n      // shiftL: function (n) {\n      // if (n < 32) {\n      // var high = (this.high << n) | (this.low >>> (32 - n));\n      // var low = this.low << n;\n      // } else {\n      // var high = this.low << (n - 32);\n      // var low = 0;\n      // }\n\n      // return X64Word.create(high, low);\n      // },\n\n      /**\n       * Shifts this word n bits to the right.\n       *\n       * @param {number} n The number of bits to shift.\n       *\n       * @return {X64Word} A new x64-Word object after shifting.\n       *\n       * @example\n       *\n       *     var shifted = x64Word.shiftR(7);\n       */\n      // shiftR: function (n) {\n      // if (n < 32) {\n      // var low = (this.low >>> n) | (this.high << (32 - n));\n      // var high = this.high >>> n;\n      // } else {\n      // var low = this.high >>> (n - 32);\n      // var high = 0;\n      // }\n\n      // return X64Word.create(high, low);\n      // },\n\n      /**\n       * Rotates this word n bits to the left.\n       *\n       * @param {number} n The number of bits to rotate.\n       *\n       * @return {X64Word} A new x64-Word object after rotating.\n       *\n       * @example\n       *\n       *     var rotated = x64Word.rotL(25);\n       */\n      // rotL: function (n) {\n      // return this.shiftL(n).or(this.shiftR(64 - n));\n      // },\n\n      /**\n       * Rotates this word n bits to the right.\n       *\n       * @param {number} n The number of bits to rotate.\n       *\n       * @return {X64Word} A new x64-Word object after rotating.\n       *\n       * @example\n       *\n       *     var rotated = x64Word.rotR(7);\n       */\n      // rotR: function (n) {\n      // return this.shiftR(n).or(this.shiftL(64 - n));\n      // },\n\n      /**\n       * Adds this word with the passed word.\n       *\n       * @param {X64Word} word The x64-Word to add with this word.\n       *\n       * @return {X64Word} A new x64-Word object after adding.\n       *\n       * @example\n       *\n       *     var added = x64Word.add(anotherX64Word);\n       */\n      // add: function (word) {\n      // var low = (this.low + word.low) | 0;\n      // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\n      // var high = (this.high + word.high + carry) | 0;\n\n      // return X64Word.create(high, low);\n      // }\n    }));\n\n    /**\n     * An array of 64-bit words.\n     *\n     * @property {Array} words The array of CryptoJS.x64.Word objects.\n     * @property {number} sigBytes The number of significant bytes in this word array.\n     */\n    var X64WordArray = (C_x64.WordArray = Base.extend({\n      /**\n       * Initializes a newly created word array.\n       *\n       * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\n       * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n       *\n       * @example\n       *\n       *     var wordArray = CryptoJS.x64.WordArray.create();\n       *\n       *     var wordArray = CryptoJS.x64.WordArray.create([\n       *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n       *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n       *     ]);\n       *\n       *     var wordArray = CryptoJS.x64.WordArray.create([\n       *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n       *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n       *     ], 10);\n       */\n      init: function (words, sigBytes) {\n        words = this.words = words || [];\n\n        if (sigBytes != undefined) {\n          this.sigBytes = sigBytes;\n        } else {\n          this.sigBytes = words.length * 8;\n        }\n      },\n\n      /**\n       * Converts this 64-bit word array to a 32-bit word array.\n       *\n       * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\n       *\n       * @example\n       *\n       *     var x32WordArray = x64WordArray.toX32();\n       */\n      toX32: function () {\n        // Shortcuts\n        var x64Words = this.words;\n        var x64WordsLength = x64Words.length;\n\n        // Convert\n        var x32Words = [];\n        for (var i = 0; i < x64WordsLength; i++) {\n          var x64Word = x64Words[i];\n          x32Words.push(x64Word.high);\n          x32Words.push(x64Word.low);\n        }\n\n        return X32WordArray.create(x32Words, this.sigBytes);\n      },\n\n      /**\n       * Creates a copy of this word array.\n       *\n       * @return {X64WordArray} The clone.\n       *\n       * @example\n       *\n       *     var clone = x64WordArray.clone();\n       */\n      clone: function () {\n        var clone = Base.clone.call(this);\n\n        // Clone \"words\" array\n        var words = (clone.words = this.words.slice(0));\n\n        // Clone each X64Word object\n        var wordsLength = words.length;\n        for (var i = 0; i < wordsLength; i++) {\n          words[i] = words[i].clone();\n        }\n\n        return clone;\n      },\n    }));\n  })();\n\n  (function () {\n    // Check if typed arrays are supported\n    if (typeof ArrayBuffer != 'function') {\n      return;\n    }\n\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var WordArray = C_lib.WordArray;\n\n    // Reference original init\n    var superInit = WordArray.init;\n\n    // Augment WordArray.init to handle typed arrays\n    var subInit = (WordArray.init = function (typedArray) {\n      // Convert buffers to uint8\n      if (typedArray instanceof ArrayBuffer) {\n        typedArray = new Uint8Array(typedArray);\n      }\n\n      // Convert other array views to uint8\n      if (\n        typedArray instanceof Int8Array ||\n        (typeof Uint8ClampedArray !== 'undefined' && typedArray instanceof Uint8ClampedArray) ||\n        typedArray instanceof Int16Array ||\n        typedArray instanceof Uint16Array ||\n        typedArray instanceof Int32Array ||\n        typedArray instanceof Uint32Array ||\n        typedArray instanceof Float32Array ||\n        typedArray instanceof Float64Array\n      ) {\n        typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n      }\n\n      // Handle Uint8Array\n      if (typedArray instanceof Uint8Array) {\n        // Shortcut\n        var typedArrayByteLength = typedArray.byteLength;\n\n        // Extract bytes\n        var words = [];\n        for (var i = 0; i < typedArrayByteLength; i++) {\n          words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);\n        }\n\n        // Initialize this word array\n        superInit.call(this, words, typedArrayByteLength);\n      } else {\n        // Else call normal init\n        superInit.apply(this, arguments);\n      }\n    });\n\n    subInit.prototype = WordArray;\n  })();\n\n  (function () {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var WordArray = C_lib.WordArray;\n    var C_enc = C.enc;\n\n    /**\n     * UTF-16 BE encoding strategy.\n     */\n    var Utf16BE =\n      (C_enc.Utf16 =\n      C_enc.Utf16BE =\n        {\n          /**\n           * Converts a word array to a UTF-16 BE string.\n           *\n           * @param {WordArray} wordArray The word array.\n           *\n           * @return {string} The UTF-16 BE string.\n           *\n           * @static\n           *\n           * @example\n           *\n           *     var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);\n           */\n          stringify: function (wordArray) {\n            // Shortcuts\n            var words = wordArray.words;\n            var sigBytes = wordArray.sigBytes;\n\n            // Convert\n            var utf16Chars = [];\n            for (var i = 0; i < sigBytes; i += 2) {\n              var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;\n              utf16Chars.push(String.fromCharCode(codePoint));\n            }\n\n            return utf16Chars.join('');\n          },\n\n          /**\n           * Converts a UTF-16 BE string to a word array.\n           *\n           * @param {string} utf16Str The UTF-16 BE string.\n           *\n           * @return {WordArray} The word array.\n           *\n           * @static\n           *\n           * @example\n           *\n           *     var wordArray = CryptoJS.enc.Utf16.parse(utf16String);\n           */\n          parse: function (utf16Str) {\n            // Shortcut\n            var utf16StrLength = utf16Str.length;\n\n            // Convert\n            var words = [];\n            for (var i = 0; i < utf16StrLength; i++) {\n              words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);\n            }\n\n            return WordArray.create(words, utf16StrLength * 2);\n          },\n        });\n\n    /**\n     * UTF-16 LE encoding strategy.\n     */\n    C_enc.Utf16LE = {\n      /**\n       * Converts a word array to a UTF-16 LE string.\n       *\n       * @param {WordArray} wordArray The word array.\n       *\n       * @return {string} The UTF-16 LE string.\n       *\n       * @static\n       *\n       * @example\n       *\n       *     var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);\n       */\n      stringify: function (wordArray) {\n        // Shortcuts\n        var words = wordArray.words;\n        var sigBytes = wordArray.sigBytes;\n\n        // Convert\n        var utf16Chars = [];\n        for (var i = 0; i < sigBytes; i += 2) {\n          var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);\n          utf16Chars.push(String.fromCharCode(codePoint));\n        }\n\n        return utf16Chars.join('');\n      },\n\n      /**\n       * Converts a UTF-16 LE string to a word array.\n       *\n       * @param {string} utf16Str The UTF-16 LE string.\n       *\n       * @return {WordArray} The word array.\n       *\n       * @static\n       *\n       * @example\n       *\n       *     var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);\n       */\n      parse: function (utf16Str) {\n        // Shortcut\n        var utf16StrLength = utf16Str.length;\n\n        // Convert\n        var words = [];\n        for (var i = 0; i < utf16StrLength; i++) {\n          words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));\n        }\n\n        return WordArray.create(words, utf16StrLength * 2);\n      },\n    };\n\n    function swapEndian(word) {\n      return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);\n    }\n  })();\n\n  (function () {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var WordArray = C_lib.WordArray;\n    var C_enc = C.enc;\n\n    /**\n     * Base64 encoding strategy.\n     */\n    var Base64 = (C_enc.Base64 = {\n      /**\n       * Converts a word array to a Base64 string.\n       *\n       * @param {WordArray} wordArray The word array.\n       *\n       * @return {string} The Base64 string.\n       *\n       * @static\n       *\n       * @example\n       *\n       *     var base64String = CryptoJS.enc.Base64.stringify(wordArray);\n       */\n      stringify: function (wordArray) {\n        // Shortcuts\n        var words = wordArray.words;\n        var sigBytes = wordArray.sigBytes;\n        var map = this._map;\n\n        // Clamp excess bits\n        wordArray.clamp();\n\n        // Convert\n        var base64Chars = [];\n        for (var i = 0; i < sigBytes; i += 3) {\n          var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n          var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n          var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n          var triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n          for (var j = 0; j < 4 && i + j * 0.75 < sigBytes; j++) {\n            base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n          }\n        }\n\n        // Add padding\n        var paddingChar = map.charAt(64);\n        if (paddingChar) {\n          while (base64Chars.length % 4) {\n            base64Chars.push(paddingChar);\n          }\n        }\n\n        return base64Chars.join('');\n      },\n\n      /**\n       * Converts a Base64 string to a word array.\n       *\n       * @param {string} base64Str The Base64 string.\n       *\n       * @return {WordArray} The word array.\n       *\n       * @static\n       *\n       * @example\n       *\n       *     var wordArray = CryptoJS.enc.Base64.parse(base64String);\n       */\n      parse: function (base64Str) {\n        // Shortcuts\n        var base64StrLength = base64Str.length;\n        var map = this._map;\n        var reverseMap = this._reverseMap;\n\n        if (!reverseMap) {\n          reverseMap = this._reverseMap = [];\n          for (var j = 0; j < map.length; j++) {\n            reverseMap[map.charCodeAt(j)] = j;\n          }\n        }\n\n        // Ignore padding\n        var paddingChar = map.charAt(64);\n        if (paddingChar) {\n          var paddingIndex = base64Str.indexOf(paddingChar);\n          if (paddingIndex !== -1) {\n            base64StrLength = paddingIndex;\n          }\n        }\n\n        // Convert\n        return parseLoop(base64Str, base64StrLength, reverseMap);\n      },\n\n      _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n    });\n\n    function parseLoop(base64Str, base64StrLength, reverseMap) {\n      var words = [];\n      var nBytes = 0;\n      for (var i = 0; i < base64StrLength; i++) {\n        if (i % 4) {\n          var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n          var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n          var bitsCombined = bits1 | bits2;\n          words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n          nBytes++;\n        }\n      }\n      return WordArray.create(words, nBytes);\n    }\n  })();\n\n  (function () {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var WordArray = C_lib.WordArray;\n    var C_enc = C.enc;\n\n    /**\n     * Base64url encoding strategy.\n     */\n    var Base64url = (C_enc.Base64url = {\n      /**\n       * Converts a word array to a Base64url string.\n       *\n       * @param {WordArray} wordArray The word array.\n       *\n       * @param {boolean} urlSafe Whether to use url safe\n       *\n       * @return {string} The Base64url string.\n       *\n       * @static\n       *\n       * @example\n       *\n       *     var base64String = CryptoJS.enc.Base64url.stringify(wordArray);\n       */\n      stringify: function (wordArray, urlSafe = true) {\n        // Shortcuts\n        var words = wordArray.words;\n        var sigBytes = wordArray.sigBytes;\n        var map = urlSafe ? this._safe_map : this._map;\n\n        // Clamp excess bits\n        wordArray.clamp();\n\n        // Convert\n        var base64Chars = [];\n        for (var i = 0; i < sigBytes; i += 3) {\n          var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n          var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n          var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n          var triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n          for (var j = 0; j < 4 && i + j * 0.75 < sigBytes; j++) {\n            base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n          }\n        }\n\n        // Add padding\n        var paddingChar = map.charAt(64);\n        if (paddingChar) {\n          while (base64Chars.length % 4) {\n            base64Chars.push(paddingChar);\n          }\n        }\n\n        return base64Chars.join('');\n      },\n\n      /**\n       * Converts a Base64url string to a word array.\n       *\n       * @param {string} base64Str The Base64url string.\n       *\n       * @param {boolean} urlSafe Whether to use url safe\n       *\n       * @return {WordArray} The word array.\n       *\n       * @static\n       *\n       * @example\n       *\n       *     var wordArray = CryptoJS.enc.Base64url.parse(base64String);\n       */\n      parse: function (base64Str, urlSafe = true) {\n        // Shortcuts\n        var base64StrLength = base64Str.length;\n        var map = urlSafe ? this._safe_map : this._map;\n        var reverseMap = this._reverseMap;\n\n        if (!reverseMap) {\n          reverseMap = this._reverseMap = [];\n          for (var j = 0; j < map.length; j++) {\n            reverseMap[map.charCodeAt(j)] = j;\n          }\n        }\n\n        // Ignore padding\n        var paddingChar = map.charAt(64);\n        if (paddingChar) {\n          var paddingIndex = base64Str.indexOf(paddingChar);\n          if (paddingIndex !== -1) {\n            base64StrLength = paddingIndex;\n          }\n        }\n\n        // Convert\n        return parseLoop(base64Str, base64StrLength, reverseMap);\n      },\n\n      _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n      _safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',\n    });\n\n    function parseLoop(base64Str, base64StrLength, reverseMap) {\n      var words = [];\n      var nBytes = 0;\n      for (var i = 0; i < base64StrLength; i++) {\n        if (i % 4) {\n          var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n          var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n          var bitsCombined = bits1 | bits2;\n          words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n          nBytes++;\n        }\n      }\n      return WordArray.create(words, nBytes);\n    }\n  })();\n\n  (function (Math) {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var WordArray = C_lib.WordArray;\n    var Hasher = C_lib.Hasher;\n    var C_algo = C.algo;\n\n    // Constants table\n    var T = [];\n\n    // Compute constants\n    (function () {\n      for (var i = 0; i < 64; i++) {\n        T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\n      }\n    })();\n\n    /**\n     * MD5 hash algorithm.\n     */\n    var MD5 = (C_algo.MD5 = Hasher.extend({\n      _doReset: function () {\n        this._hash = new WordArray.init([0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476]);\n      },\n\n      _doProcessBlock: function (M, offset) {\n        // Swap endian\n        for (var i = 0; i < 16; i++) {\n          // Shortcuts\n          var offset_i = offset + i;\n          var M_offset_i = M[offset_i];\n\n          M[offset_i] =\n            (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |\n            (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00);\n        }\n\n        // Shortcuts\n        var H = this._hash.words;\n\n        var M_offset_0 = M[offset + 0];\n        var M_offset_1 = M[offset + 1];\n        var M_offset_2 = M[offset + 2];\n        var M_offset_3 = M[offset + 3];\n        var M_offset_4 = M[offset + 4];\n        var M_offset_5 = M[offset + 5];\n        var M_offset_6 = M[offset + 6];\n        var M_offset_7 = M[offset + 7];\n        var M_offset_8 = M[offset + 8];\n        var M_offset_9 = M[offset + 9];\n        var M_offset_10 = M[offset + 10];\n        var M_offset_11 = M[offset + 11];\n        var M_offset_12 = M[offset + 12];\n        var M_offset_13 = M[offset + 13];\n        var M_offset_14 = M[offset + 14];\n        var M_offset_15 = M[offset + 15];\n\n        // Working varialbes\n        var a = H[0];\n        var b = H[1];\n        var c = H[2];\n        var d = H[3];\n\n        // Computation\n        a = FF(a, b, c, d, M_offset_0, 7, T[0]);\n        d = FF(d, a, b, c, M_offset_1, 12, T[1]);\n        c = FF(c, d, a, b, M_offset_2, 17, T[2]);\n        b = FF(b, c, d, a, M_offset_3, 22, T[3]);\n        a = FF(a, b, c, d, M_offset_4, 7, T[4]);\n        d = FF(d, a, b, c, M_offset_5, 12, T[5]);\n        c = FF(c, d, a, b, M_offset_6, 17, T[6]);\n        b = FF(b, c, d, a, M_offset_7, 22, T[7]);\n        a = FF(a, b, c, d, M_offset_8, 7, T[8]);\n        d = FF(d, a, b, c, M_offset_9, 12, T[9]);\n        c = FF(c, d, a, b, M_offset_10, 17, T[10]);\n        b = FF(b, c, d, a, M_offset_11, 22, T[11]);\n        a = FF(a, b, c, d, M_offset_12, 7, T[12]);\n        d = FF(d, a, b, c, M_offset_13, 12, T[13]);\n        c = FF(c, d, a, b, M_offset_14, 17, T[14]);\n        b = FF(b, c, d, a, M_offset_15, 22, T[15]);\n\n        a = GG(a, b, c, d, M_offset_1, 5, T[16]);\n        d = GG(d, a, b, c, M_offset_6, 9, T[17]);\n        c = GG(c, d, a, b, M_offset_11, 14, T[18]);\n        b = GG(b, c, d, a, M_offset_0, 20, T[19]);\n        a = GG(a, b, c, d, M_offset_5, 5, T[20]);\n        d = GG(d, a, b, c, M_offset_10, 9, T[21]);\n        c = GG(c, d, a, b, M_offset_15, 14, T[22]);\n        b = GG(b, c, d, a, M_offset_4, 20, T[23]);\n        a = GG(a, b, c, d, M_offset_9, 5, T[24]);\n        d = GG(d, a, b, c, M_offset_14, 9, T[25]);\n        c = GG(c, d, a, b, M_offset_3, 14, T[26]);\n        b = GG(b, c, d, a, M_offset_8, 20, T[27]);\n        a = GG(a, b, c, d, M_offset_13, 5, T[28]);\n        d = GG(d, a, b, c, M_offset_2, 9, T[29]);\n        c = GG(c, d, a, b, M_offset_7, 14, T[30]);\n        b = GG(b, c, d, a, M_offset_12, 20, T[31]);\n\n        a = HH(a, b, c, d, M_offset_5, 4, T[32]);\n        d = HH(d, a, b, c, M_offset_8, 11, T[33]);\n        c = HH(c, d, a, b, M_offset_11, 16, T[34]);\n        b = HH(b, c, d, a, M_offset_14, 23, T[35]);\n        a = HH(a, b, c, d, M_offset_1, 4, T[36]);\n        d = HH(d, a, b, c, M_offset_4, 11, T[37]);\n        c = HH(c, d, a, b, M_offset_7, 16, T[38]);\n        b = HH(b, c, d, a, M_offset_10, 23, T[39]);\n        a = HH(a, b, c, d, M_offset_13, 4, T[40]);\n        d = HH(d, a, b, c, M_offset_0, 11, T[41]);\n        c = HH(c, d, a, b, M_offset_3, 16, T[42]);\n        b = HH(b, c, d, a, M_offset_6, 23, T[43]);\n        a = HH(a, b, c, d, M_offset_9, 4, T[44]);\n        d = HH(d, a, b, c, M_offset_12, 11, T[45]);\n        c = HH(c, d, a, b, M_offset_15, 16, T[46]);\n        b = HH(b, c, d, a, M_offset_2, 23, T[47]);\n\n        a = II(a, b, c, d, M_offset_0, 6, T[48]);\n        d = II(d, a, b, c, M_offset_7, 10, T[49]);\n        c = II(c, d, a, b, M_offset_14, 15, T[50]);\n        b = II(b, c, d, a, M_offset_5, 21, T[51]);\n        a = II(a, b, c, d, M_offset_12, 6, T[52]);\n        d = II(d, a, b, c, M_offset_3, 10, T[53]);\n        c = II(c, d, a, b, M_offset_10, 15, T[54]);\n        b = II(b, c, d, a, M_offset_1, 21, T[55]);\n        a = II(a, b, c, d, M_offset_8, 6, T[56]);\n        d = II(d, a, b, c, M_offset_15, 10, T[57]);\n        c = II(c, d, a, b, M_offset_6, 15, T[58]);\n        b = II(b, c, d, a, M_offset_13, 21, T[59]);\n        a = II(a, b, c, d, M_offset_4, 6, T[60]);\n        d = II(d, a, b, c, M_offset_11, 10, T[61]);\n        c = II(c, d, a, b, M_offset_2, 15, T[62]);\n        b = II(b, c, d, a, M_offset_9, 21, T[63]);\n\n        // Intermediate hash value\n        H[0] = (H[0] + a) | 0;\n        H[1] = (H[1] + b) | 0;\n        H[2] = (H[2] + c) | 0;\n        H[3] = (H[3] + d) | 0;\n      },\n\n      _doFinalize: function () {\n        // Shortcuts\n        var data = this._data;\n        var dataWords = data.words;\n\n        var nBitsTotal = this._nDataBytes * 8;\n        var nBitsLeft = data.sigBytes * 8;\n\n        // Add padding\n        dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32));\n\n        var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);\n        var nBitsTotalL = nBitsTotal;\n        dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] =\n          (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) |\n          (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00);\n        dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] =\n          (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) |\n          (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00);\n\n        data.sigBytes = (dataWords.length + 1) * 4;\n\n        // Hash final blocks\n        this._process();\n\n        // Shortcuts\n        var hash = this._hash;\n        var H = hash.words;\n\n        // Swap endian\n        for (var i = 0; i < 4; i++) {\n          // Shortcut\n          var H_i = H[i];\n\n          H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);\n        }\n\n        // Return final computed hash\n        return hash;\n      },\n\n      clone: function () {\n        var clone = Hasher.clone.call(this);\n        clone._hash = this._hash.clone();\n\n        return clone;\n      },\n    }));\n\n    function FF(a, b, c, d, x, s, t) {\n      var n = a + ((b & c) | (~b & d)) + x + t;\n      return ((n << s) | (n >>> (32 - s))) + b;\n    }\n\n    function GG(a, b, c, d, x, s, t) {\n      var n = a + ((b & d) | (c & ~d)) + x + t;\n      return ((n << s) | (n >>> (32 - s))) + b;\n    }\n\n    function HH(a, b, c, d, x, s, t) {\n      var n = a + (b ^ c ^ d) + x + t;\n      return ((n << s) | (n >>> (32 - s))) + b;\n    }\n\n    function II(a, b, c, d, x, s, t) {\n      var n = a + (c ^ (b | ~d)) + x + t;\n      return ((n << s) | (n >>> (32 - s))) + b;\n    }\n\n    /**\n     * Shortcut function to the hasher's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     *\n     * @return {WordArray} The hash.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hash = CryptoJS.MD5('message');\n     *     var hash = CryptoJS.MD5(wordArray);\n     */\n    C.MD5 = Hasher._createHelper(MD5);\n\n    /**\n     * Shortcut function to the HMAC's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     * @param {WordArray|string} key The secret key.\n     *\n     * @return {WordArray} The HMAC.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hmac = CryptoJS.HmacMD5(message, key);\n     */\n    C.HmacMD5 = Hasher._createHmacHelper(MD5);\n  })(Math);\n\n  (function () {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var WordArray = C_lib.WordArray;\n    var Hasher = C_lib.Hasher;\n    var C_algo = C.algo;\n\n    // Reusable object\n    var W = [];\n\n    /**\n     * SHA-1 hash algorithm.\n     */\n    var SHA1 = (C_algo.SHA1 = Hasher.extend({\n      _doReset: function () {\n        this._hash = new WordArray.init([0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]);\n      },\n\n      _doProcessBlock: function (M, offset) {\n        // Shortcut\n        var H = this._hash.words;\n\n        // Working variables\n        var a = H[0];\n        var b = H[1];\n        var c = H[2];\n        var d = H[3];\n        var e = H[4];\n\n        // Computation\n        for (var i = 0; i < 80; i++) {\n          if (i < 16) {\n            W[i] = M[offset + i] | 0;\n          } else {\n            var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n            W[i] = (n << 1) | (n >>> 31);\n          }\n\n          var t = ((a << 5) | (a >>> 27)) + e + W[i];\n          if (i < 20) {\n            t += ((b & c) | (~b & d)) + 0x5a827999;\n          } else if (i < 40) {\n            t += (b ^ c ^ d) + 0x6ed9eba1;\n          } else if (i < 60) {\n            t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;\n          } else /* if (i < 80) */ {\n            t += (b ^ c ^ d) - 0x359d3e2a;\n          }\n\n          e = d;\n          d = c;\n          c = (b << 30) | (b >>> 2);\n          b = a;\n          a = t;\n        }\n\n        // Intermediate hash value\n        H[0] = (H[0] + a) | 0;\n        H[1] = (H[1] + b) | 0;\n        H[2] = (H[2] + c) | 0;\n        H[3] = (H[3] + d) | 0;\n        H[4] = (H[4] + e) | 0;\n      },\n\n      _doFinalize: function () {\n        // Shortcuts\n        var data = this._data;\n        var dataWords = data.words;\n\n        var nBitsTotal = this._nDataBytes * 8;\n        var nBitsLeft = data.sigBytes * 8;\n\n        // Add padding\n        dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32));\n        dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n        dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n        data.sigBytes = dataWords.length * 4;\n\n        // Hash final blocks\n        this._process();\n\n        // Return final computed hash\n        return this._hash;\n      },\n\n      clone: function () {\n        var clone = Hasher.clone.call(this);\n        clone._hash = this._hash.clone();\n\n        return clone;\n      },\n    }));\n\n    /**\n     * Shortcut function to the hasher's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     *\n     * @return {WordArray} The hash.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hash = CryptoJS.SHA1('message');\n     *     var hash = CryptoJS.SHA1(wordArray);\n     */\n    C.SHA1 = Hasher._createHelper(SHA1);\n\n    /**\n     * Shortcut function to the HMAC's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     * @param {WordArray|string} key The secret key.\n     *\n     * @return {WordArray} The HMAC.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hmac = CryptoJS.HmacSHA1(message, key);\n     */\n    C.HmacSHA1 = Hasher._createHmacHelper(SHA1);\n  })();\n\n  (function (Math) {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var WordArray = C_lib.WordArray;\n    var Hasher = C_lib.Hasher;\n    var C_algo = C.algo;\n\n    // Initialization and round constants tables\n    var H = [];\n    var K = [];\n\n    // Compute constants\n    (function () {\n      function isPrime(n) {\n        var sqrtN = Math.sqrt(n);\n        for (var factor = 2; factor <= sqrtN; factor++) {\n          if (!(n % factor)) {\n            return false;\n          }\n        }\n\n        return true;\n      }\n\n      function getFractionalBits(n) {\n        return ((n - (n | 0)) * 0x100000000) | 0;\n      }\n\n      var n = 2;\n      var nPrime = 0;\n      while (nPrime < 64) {\n        if (isPrime(n)) {\n          if (nPrime < 8) {\n            H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\n          }\n          K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\n\n          nPrime++;\n        }\n\n        n++;\n      }\n    })();\n\n    // Reusable object\n    var W = [];\n\n    /**\n     * SHA-256 hash algorithm.\n     */\n    var SHA256 = (C_algo.SHA256 = Hasher.extend({\n      _doReset: function () {\n        this._hash = new WordArray.init(H.slice(0));\n      },\n\n      _doProcessBlock: function (M, offset) {\n        // Shortcut\n        var H = this._hash.words;\n\n        // Working variables\n        var a = H[0];\n        var b = H[1];\n        var c = H[2];\n        var d = H[3];\n        var e = H[4];\n        var f = H[5];\n        var g = H[6];\n        var h = H[7];\n\n        // Computation\n        for (var i = 0; i < 64; i++) {\n          if (i < 16) {\n            W[i] = M[offset + i] | 0;\n          } else {\n            var gamma0x = W[i - 15];\n            var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ ((gamma0x << 14) | (gamma0x >>> 18)) ^ (gamma0x >>> 3);\n\n            var gamma1x = W[i - 2];\n            var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ ((gamma1x << 13) | (gamma1x >>> 19)) ^ (gamma1x >>> 10);\n\n            W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\n          }\n\n          var ch = (e & f) ^ (~e & g);\n          var maj = (a & b) ^ (a & c) ^ (b & c);\n\n          var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\n          var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));\n\n          var t1 = h + sigma1 + ch + K[i] + W[i];\n          var t2 = sigma0 + maj;\n\n          h = g;\n          g = f;\n          f = e;\n          e = (d + t1) | 0;\n          d = c;\n          c = b;\n          b = a;\n          a = (t1 + t2) | 0;\n        }\n\n        // Intermediate hash value\n        H[0] = (H[0] + a) | 0;\n        H[1] = (H[1] + b) | 0;\n        H[2] = (H[2] + c) | 0;\n        H[3] = (H[3] + d) | 0;\n        H[4] = (H[4] + e) | 0;\n        H[5] = (H[5] + f) | 0;\n        H[6] = (H[6] + g) | 0;\n        H[7] = (H[7] + h) | 0;\n      },\n\n      _doFinalize: function () {\n        // Shortcuts\n        var data = this._data;\n        var dataWords = data.words;\n\n        var nBitsTotal = this._nDataBytes * 8;\n        var nBitsLeft = data.sigBytes * 8;\n\n        // Add padding\n        dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32));\n        dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n        dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n        data.sigBytes = dataWords.length * 4;\n\n        // Hash final blocks\n        this._process();\n\n        // Return final computed hash\n        return this._hash;\n      },\n\n      clone: function () {\n        var clone = Hasher.clone.call(this);\n        clone._hash = this._hash.clone();\n\n        return clone;\n      },\n    }));\n\n    /**\n     * Shortcut function to the hasher's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     *\n     * @return {WordArray} The hash.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hash = CryptoJS.SHA256('message');\n     *     var hash = CryptoJS.SHA256(wordArray);\n     */\n    C.SHA256 = Hasher._createHelper(SHA256);\n\n    /**\n     * Shortcut function to the HMAC's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     * @param {WordArray|string} key The secret key.\n     *\n     * @return {WordArray} The HMAC.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hmac = CryptoJS.HmacSHA256(message, key);\n     */\n    C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\n  })(Math);\n\n  (function () {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var WordArray = C_lib.WordArray;\n    var C_algo = C.algo;\n    var SHA256 = C_algo.SHA256;\n\n    /**\n     * SHA-224 hash algorithm.\n     */\n    var SHA224 = (C_algo.SHA224 = SHA256.extend({\n      _doReset: function () {\n        this._hash = new WordArray.init([\n          0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n        ]);\n      },\n\n      _doFinalize: function () {\n        var hash = SHA256._doFinalize.call(this);\n\n        hash.sigBytes -= 4;\n\n        return hash;\n      },\n    }));\n\n    /**\n     * Shortcut function to the hasher's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     *\n     * @return {WordArray} The hash.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hash = CryptoJS.SHA224('message');\n     *     var hash = CryptoJS.SHA224(wordArray);\n     */\n    C.SHA224 = SHA256._createHelper(SHA224);\n\n    /**\n     * Shortcut function to the HMAC's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     * @param {WordArray|string} key The secret key.\n     *\n     * @return {WordArray} The HMAC.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hmac = CryptoJS.HmacSHA224(message, key);\n     */\n    C.HmacSHA224 = SHA256._createHmacHelper(SHA224);\n  })();\n\n  (function () {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var Hasher = C_lib.Hasher;\n    var C_x64 = C.x64;\n    var X64Word = C_x64.Word;\n    var X64WordArray = C_x64.WordArray;\n    var C_algo = C.algo;\n\n    function X64Word_create() {\n      return X64Word.create.apply(X64Word, arguments);\n    }\n\n    // Constants\n    var K = [\n      X64Word_create(0x428a2f98, 0xd728ae22),\n      X64Word_create(0x71374491, 0x23ef65cd),\n      X64Word_create(0xb5c0fbcf, 0xec4d3b2f),\n      X64Word_create(0xe9b5dba5, 0x8189dbbc),\n      X64Word_create(0x3956c25b, 0xf348b538),\n      X64Word_create(0x59f111f1, 0xb605d019),\n      X64Word_create(0x923f82a4, 0xaf194f9b),\n      X64Word_create(0xab1c5ed5, 0xda6d8118),\n      X64Word_create(0xd807aa98, 0xa3030242),\n      X64Word_create(0x12835b01, 0x45706fbe),\n      X64Word_create(0x243185be, 0x4ee4b28c),\n      X64Word_create(0x550c7dc3, 0xd5ffb4e2),\n      X64Word_create(0x72be5d74, 0xf27b896f),\n      X64Word_create(0x80deb1fe, 0x3b1696b1),\n      X64Word_create(0x9bdc06a7, 0x25c71235),\n      X64Word_create(0xc19bf174, 0xcf692694),\n      X64Word_create(0xe49b69c1, 0x9ef14ad2),\n      X64Word_create(0xefbe4786, 0x384f25e3),\n      X64Word_create(0x0fc19dc6, 0x8b8cd5b5),\n      X64Word_create(0x240ca1cc, 0x77ac9c65),\n      X64Word_create(0x2de92c6f, 0x592b0275),\n      X64Word_create(0x4a7484aa, 0x6ea6e483),\n      X64Word_create(0x5cb0a9dc, 0xbd41fbd4),\n      X64Word_create(0x76f988da, 0x831153b5),\n      X64Word_create(0x983e5152, 0xee66dfab),\n      X64Word_create(0xa831c66d, 0x2db43210),\n      X64Word_create(0xb00327c8, 0x98fb213f),\n      X64Word_create(0xbf597fc7, 0xbeef0ee4),\n      X64Word_create(0xc6e00bf3, 0x3da88fc2),\n      X64Word_create(0xd5a79147, 0x930aa725),\n      X64Word_create(0x06ca6351, 0xe003826f),\n      X64Word_create(0x14292967, 0x0a0e6e70),\n      X64Word_create(0x27b70a85, 0x46d22ffc),\n      X64Word_create(0x2e1b2138, 0x5c26c926),\n      X64Word_create(0x4d2c6dfc, 0x5ac42aed),\n      X64Word_create(0x53380d13, 0x9d95b3df),\n      X64Word_create(0x650a7354, 0x8baf63de),\n      X64Word_create(0x766a0abb, 0x3c77b2a8),\n      X64Word_create(0x81c2c92e, 0x47edaee6),\n      X64Word_create(0x92722c85, 0x1482353b),\n      X64Word_create(0xa2bfe8a1, 0x4cf10364),\n      X64Word_create(0xa81a664b, 0xbc423001),\n      X64Word_create(0xc24b8b70, 0xd0f89791),\n      X64Word_create(0xc76c51a3, 0x0654be30),\n      X64Word_create(0xd192e819, 0xd6ef5218),\n      X64Word_create(0xd6990624, 0x5565a910),\n      X64Word_create(0xf40e3585, 0x5771202a),\n      X64Word_create(0x106aa070, 0x32bbd1b8),\n      X64Word_create(0x19a4c116, 0xb8d2d0c8),\n      X64Word_create(0x1e376c08, 0x5141ab53),\n      X64Word_create(0x2748774c, 0xdf8eeb99),\n      X64Word_create(0x34b0bcb5, 0xe19b48a8),\n      X64Word_create(0x391c0cb3, 0xc5c95a63),\n      X64Word_create(0x4ed8aa4a, 0xe3418acb),\n      X64Word_create(0x5b9cca4f, 0x7763e373),\n      X64Word_create(0x682e6ff3, 0xd6b2b8a3),\n      X64Word_create(0x748f82ee, 0x5defb2fc),\n      X64Word_create(0x78a5636f, 0x43172f60),\n      X64Word_create(0x84c87814, 0xa1f0ab72),\n      X64Word_create(0x8cc70208, 0x1a6439ec),\n      X64Word_create(0x90befffa, 0x23631e28),\n      X64Word_create(0xa4506ceb, 0xde82bde9),\n      X64Word_create(0xbef9a3f7, 0xb2c67915),\n      X64Word_create(0xc67178f2, 0xe372532b),\n      X64Word_create(0xca273ece, 0xea26619c),\n      X64Word_create(0xd186b8c7, 0x21c0c207),\n      X64Word_create(0xeada7dd6, 0xcde0eb1e),\n      X64Word_create(0xf57d4f7f, 0xee6ed178),\n      X64Word_create(0x06f067aa, 0x72176fba),\n      X64Word_create(0x0a637dc5, 0xa2c898a6),\n      X64Word_create(0x113f9804, 0xbef90dae),\n      X64Word_create(0x1b710b35, 0x131c471b),\n      X64Word_create(0x28db77f5, 0x23047d84),\n      X64Word_create(0x32caab7b, 0x40c72493),\n      X64Word_create(0x3c9ebe0a, 0x15c9bebc),\n      X64Word_create(0x431d67c4, 0x9c100d4c),\n      X64Word_create(0x4cc5d4be, 0xcb3e42b6),\n      X64Word_create(0x597f299c, 0xfc657e2a),\n      X64Word_create(0x5fcb6fab, 0x3ad6faec),\n      X64Word_create(0x6c44198c, 0x4a475817),\n    ];\n\n    // Reusable objects\n    var W = [];\n    (function () {\n      for (var i = 0; i < 80; i++) {\n        W[i] = X64Word_create();\n      }\n    })();\n\n    /**\n     * SHA-512 hash algorithm.\n     */\n    var SHA512 = (C_algo.SHA512 = Hasher.extend({\n      _doReset: function () {\n        this._hash = new X64WordArray.init([\n          new X64Word.init(0x6a09e667, 0xf3bcc908),\n          new X64Word.init(0xbb67ae85, 0x84caa73b),\n          new X64Word.init(0x3c6ef372, 0xfe94f82b),\n          new X64Word.init(0xa54ff53a, 0x5f1d36f1),\n          new X64Word.init(0x510e527f, 0xade682d1),\n          new X64Word.init(0x9b05688c, 0x2b3e6c1f),\n          new X64Word.init(0x1f83d9ab, 0xfb41bd6b),\n          new X64Word.init(0x5be0cd19, 0x137e2179),\n        ]);\n      },\n\n      _doProcessBlock: function (M, offset) {\n        // Shortcuts\n        var H = this._hash.words;\n\n        var H0 = H[0];\n        var H1 = H[1];\n        var H2 = H[2];\n        var H3 = H[3];\n        var H4 = H[4];\n        var H5 = H[5];\n        var H6 = H[6];\n        var H7 = H[7];\n\n        var H0h = H0.high;\n        var H0l = H0.low;\n        var H1h = H1.high;\n        var H1l = H1.low;\n        var H2h = H2.high;\n        var H2l = H2.low;\n        var H3h = H3.high;\n        var H3l = H3.low;\n        var H4h = H4.high;\n        var H4l = H4.low;\n        var H5h = H5.high;\n        var H5l = H5.low;\n        var H6h = H6.high;\n        var H6l = H6.low;\n        var H7h = H7.high;\n        var H7l = H7.low;\n\n        // Working variables\n        var ah = H0h;\n        var al = H0l;\n        var bh = H1h;\n        var bl = H1l;\n        var ch = H2h;\n        var cl = H2l;\n        var dh = H3h;\n        var dl = H3l;\n        var eh = H4h;\n        var el = H4l;\n        var fh = H5h;\n        var fl = H5l;\n        var gh = H6h;\n        var gl = H6l;\n        var hh = H7h;\n        var hl = H7l;\n\n        // Rounds\n        for (var i = 0; i < 80; i++) {\n          var Wil;\n          var Wih;\n\n          // Shortcut\n          var Wi = W[i];\n\n          // Extend message\n          if (i < 16) {\n            Wih = Wi.high = M[offset + i * 2] | 0;\n            Wil = Wi.low = M[offset + i * 2 + 1] | 0;\n          } else {\n            // Gamma0\n            var gamma0x = W[i - 15];\n            var gamma0xh = gamma0x.high;\n            var gamma0xl = gamma0x.low;\n            var gamma0h =\n              ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\n            var gamma0l =\n              ((gamma0xl >>> 1) | (gamma0xh << 31)) ^\n              ((gamma0xl >>> 8) | (gamma0xh << 24)) ^\n              ((gamma0xl >>> 7) | (gamma0xh << 25));\n\n            // Gamma1\n            var gamma1x = W[i - 2];\n            var gamma1xh = gamma1x.high;\n            var gamma1xl = gamma1x.low;\n            var gamma1h =\n              ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\n            var gamma1l =\n              ((gamma1xl >>> 19) | (gamma1xh << 13)) ^\n              ((gamma1xl << 3) | (gamma1xh >>> 29)) ^\n              ((gamma1xl >>> 6) | (gamma1xh << 26));\n\n            // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\n            var Wi7 = W[i - 7];\n            var Wi7h = Wi7.high;\n            var Wi7l = Wi7.low;\n\n            var Wi16 = W[i - 16];\n            var Wi16h = Wi16.high;\n            var Wi16l = Wi16.low;\n\n            Wil = gamma0l + Wi7l;\n            Wih = gamma0h + Wi7h + (Wil >>> 0 < gamma0l >>> 0 ? 1 : 0);\n            Wil = Wil + gamma1l;\n            Wih = Wih + gamma1h + (Wil >>> 0 < gamma1l >>> 0 ? 1 : 0);\n            Wil = Wil + Wi16l;\n            Wih = Wih + Wi16h + (Wil >>> 0 < Wi16l >>> 0 ? 1 : 0);\n\n            Wi.high = Wih;\n            Wi.low = Wil;\n          }\n\n          var chh = (eh & fh) ^ (~eh & gh);\n          var chl = (el & fl) ^ (~el & gl);\n          var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\n          var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\n\n          var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\n          var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\n          var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\n          var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\n\n          // t1 = h + sigma1 + ch + K[i] + W[i]\n          var Ki = K[i];\n          var Kih = Ki.high;\n          var Kil = Ki.low;\n\n          var t1l = hl + sigma1l;\n          var t1h = hh + sigma1h + (t1l >>> 0 < hl >>> 0 ? 1 : 0);\n          var t1l = t1l + chl;\n          var t1h = t1h + chh + (t1l >>> 0 < chl >>> 0 ? 1 : 0);\n          var t1l = t1l + Kil;\n          var t1h = t1h + Kih + (t1l >>> 0 < Kil >>> 0 ? 1 : 0);\n          var t1l = t1l + Wil;\n          var t1h = t1h + Wih + (t1l >>> 0 < Wil >>> 0 ? 1 : 0);\n\n          // t2 = sigma0 + maj\n          var t2l = sigma0l + majl;\n          var t2h = sigma0h + majh + (t2l >>> 0 < sigma0l >>> 0 ? 1 : 0);\n\n          // Update working variables\n          hh = gh;\n          hl = gl;\n          gh = fh;\n          gl = fl;\n          fh = eh;\n          fl = el;\n          el = (dl + t1l) | 0;\n          eh = (dh + t1h + (el >>> 0 < dl >>> 0 ? 1 : 0)) | 0;\n          dh = ch;\n          dl = cl;\n          ch = bh;\n          cl = bl;\n          bh = ah;\n          bl = al;\n          al = (t1l + t2l) | 0;\n          ah = (t1h + t2h + (al >>> 0 < t1l >>> 0 ? 1 : 0)) | 0;\n        }\n\n        // Intermediate hash value\n        H0l = H0.low = H0l + al;\n        H0.high = H0h + ah + (H0l >>> 0 < al >>> 0 ? 1 : 0);\n        H1l = H1.low = H1l + bl;\n        H1.high = H1h + bh + (H1l >>> 0 < bl >>> 0 ? 1 : 0);\n        H2l = H2.low = H2l + cl;\n        H2.high = H2h + ch + (H2l >>> 0 < cl >>> 0 ? 1 : 0);\n        H3l = H3.low = H3l + dl;\n        H3.high = H3h + dh + (H3l >>> 0 < dl >>> 0 ? 1 : 0);\n        H4l = H4.low = H4l + el;\n        H4.high = H4h + eh + (H4l >>> 0 < el >>> 0 ? 1 : 0);\n        H5l = H5.low = H5l + fl;\n        H5.high = H5h + fh + (H5l >>> 0 < fl >>> 0 ? 1 : 0);\n        H6l = H6.low = H6l + gl;\n        H6.high = H6h + gh + (H6l >>> 0 < gl >>> 0 ? 1 : 0);\n        H7l = H7.low = H7l + hl;\n        H7.high = H7h + hh + (H7l >>> 0 < hl >>> 0 ? 1 : 0);\n      },\n\n      _doFinalize: function () {\n        // Shortcuts\n        var data = this._data;\n        var dataWords = data.words;\n\n        var nBitsTotal = this._nDataBytes * 8;\n        var nBitsLeft = data.sigBytes * 8;\n\n        // Add padding\n        dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32));\n        dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\n        dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\n        data.sigBytes = dataWords.length * 4;\n\n        // Hash final blocks\n        this._process();\n\n        // Convert hash to 32-bit word array before returning\n        var hash = this._hash.toX32();\n\n        // Return final computed hash\n        return hash;\n      },\n\n      clone: function () {\n        var clone = Hasher.clone.call(this);\n        clone._hash = this._hash.clone();\n\n        return clone;\n      },\n\n      blockSize: 1024 / 32,\n    }));\n\n    /**\n     * Shortcut function to the hasher's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     *\n     * @return {WordArray} The hash.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hash = CryptoJS.SHA512('message');\n     *     var hash = CryptoJS.SHA512(wordArray);\n     */\n    C.SHA512 = Hasher._createHelper(SHA512);\n\n    /**\n     * Shortcut function to the HMAC's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     * @param {WordArray|string} key The secret key.\n     *\n     * @return {WordArray} The HMAC.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hmac = CryptoJS.HmacSHA512(message, key);\n     */\n    C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\n  })();\n\n  (function () {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_x64 = C.x64;\n    var X64Word = C_x64.Word;\n    var X64WordArray = C_x64.WordArray;\n    var C_algo = C.algo;\n    var SHA512 = C_algo.SHA512;\n\n    /**\n     * SHA-384 hash algorithm.\n     */\n    var SHA384 = (C_algo.SHA384 = SHA512.extend({\n      _doReset: function () {\n        this._hash = new X64WordArray.init([\n          new X64Word.init(0xcbbb9d5d, 0xc1059ed8),\n          new X64Word.init(0x629a292a, 0x367cd507),\n          new X64Word.init(0x9159015a, 0x3070dd17),\n          new X64Word.init(0x152fecd8, 0xf70e5939),\n          new X64Word.init(0x67332667, 0xffc00b31),\n          new X64Word.init(0x8eb44a87, 0x68581511),\n          new X64Word.init(0xdb0c2e0d, 0x64f98fa7),\n          new X64Word.init(0x47b5481d, 0xbefa4fa4),\n        ]);\n      },\n\n      _doFinalize: function () {\n        var hash = SHA512._doFinalize.call(this);\n\n        hash.sigBytes -= 16;\n\n        return hash;\n      },\n    }));\n\n    /**\n     * Shortcut function to the hasher's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     *\n     * @return {WordArray} The hash.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hash = CryptoJS.SHA384('message');\n     *     var hash = CryptoJS.SHA384(wordArray);\n     */\n    C.SHA384 = SHA512._createHelper(SHA384);\n\n    /**\n     * Shortcut function to the HMAC's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     * @param {WordArray|string} key The secret key.\n     *\n     * @return {WordArray} The HMAC.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hmac = CryptoJS.HmacSHA384(message, key);\n     */\n    C.HmacSHA384 = SHA512._createHmacHelper(SHA384);\n  })();\n\n  (function (Math) {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var WordArray = C_lib.WordArray;\n    var Hasher = C_lib.Hasher;\n    var C_x64 = C.x64;\n    var X64Word = C_x64.Word;\n    var C_algo = C.algo;\n\n    // Constants tables\n    var RHO_OFFSETS = [];\n    var PI_INDEXES = [];\n    var ROUND_CONSTANTS = [];\n\n    // Compute Constants\n    (function () {\n      // Compute rho offset constants\n      var x = 1,\n        y = 0;\n      for (var t = 0; t < 24; t++) {\n        RHO_OFFSETS[x + 5 * y] = (((t + 1) * (t + 2)) / 2) % 64;\n\n        var newX = y % 5;\n        var newY = (2 * x + 3 * y) % 5;\n        x = newX;\n        y = newY;\n      }\n\n      // Compute pi index constants\n      for (var x = 0; x < 5; x++) {\n        for (var y = 0; y < 5; y++) {\n          PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;\n        }\n      }\n\n      // Compute round constants\n      var LFSR = 0x01;\n      for (var i = 0; i < 24; i++) {\n        var roundConstantMsw = 0;\n        var roundConstantLsw = 0;\n\n        for (var j = 0; j < 7; j++) {\n          if (LFSR & 0x01) {\n            var bitPosition = (1 << j) - 1;\n            if (bitPosition < 32) {\n              roundConstantLsw ^= 1 << bitPosition;\n            } else /* if (bitPosition >= 32) */ {\n              roundConstantMsw ^= 1 << (bitPosition - 32);\n            }\n          }\n\n          // Compute next LFSR\n          if (LFSR & 0x80) {\n            // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1\n            LFSR = (LFSR << 1) ^ 0x71;\n          } else {\n            LFSR <<= 1;\n          }\n        }\n\n        ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);\n      }\n    })();\n\n    // Reusable objects for temporary values\n    var T = [];\n    (function () {\n      for (var i = 0; i < 25; i++) {\n        T[i] = X64Word.create();\n      }\n    })();\n\n    /**\n     * SHA-3 hash algorithm.\n     */\n    var SHA3 = (C_algo.SHA3 = Hasher.extend({\n      /**\n       * Configuration options.\n       *\n       * @property {number} outputLength\n       *   The desired number of bits in the output hash.\n       *   Only values permitted are: 224, 256, 384, 512.\n       *   Default: 512\n       */\n      cfg: Hasher.cfg.extend({\n        outputLength: 512,\n      }),\n\n      _doReset: function () {\n        var state = (this._state = []);\n        for (var i = 0; i < 25; i++) {\n          state[i] = new X64Word.init();\n        }\n\n        this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;\n      },\n\n      _doProcessBlock: function (M, offset) {\n        // Shortcuts\n        var state = this._state;\n        var nBlockSizeLanes = this.blockSize / 2;\n\n        // Absorb\n        for (var i = 0; i < nBlockSizeLanes; i++) {\n          // Shortcuts\n          var M2i = M[offset + 2 * i];\n          var M2i1 = M[offset + 2 * i + 1];\n\n          // Swap endian\n          M2i = (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00);\n          M2i1 = (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00);\n\n          // Absorb message into state\n          var lane = state[i];\n          lane.high ^= M2i1;\n          lane.low ^= M2i;\n        }\n\n        // Rounds\n        for (var round = 0; round < 24; round++) {\n          // Theta\n          for (var x = 0; x < 5; x++) {\n            // Mix column lanes\n            var tMsw = 0,\n              tLsw = 0;\n            for (var y = 0; y < 5; y++) {\n              var lane = state[x + 5 * y];\n              tMsw ^= lane.high;\n              tLsw ^= lane.low;\n            }\n\n            // Temporary values\n            var Tx = T[x];\n            Tx.high = tMsw;\n            Tx.low = tLsw;\n          }\n          for (var x = 0; x < 5; x++) {\n            // Shortcuts\n            var Tx4 = T[(x + 4) % 5];\n            var Tx1 = T[(x + 1) % 5];\n            var Tx1Msw = Tx1.high;\n            var Tx1Lsw = Tx1.low;\n\n            // Mix surrounding columns\n            var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));\n            var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));\n            for (var y = 0; y < 5; y++) {\n              var lane = state[x + 5 * y];\n              lane.high ^= tMsw;\n              lane.low ^= tLsw;\n            }\n          }\n\n          // Rho Pi\n          for (var laneIndex = 1; laneIndex < 25; laneIndex++) {\n            var tMsw;\n            var tLsw;\n\n            // Shortcuts\n            var lane = state[laneIndex];\n            var laneMsw = lane.high;\n            var laneLsw = lane.low;\n            var rhoOffset = RHO_OFFSETS[laneIndex];\n\n            // Rotate lanes\n            if (rhoOffset < 32) {\n              tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));\n              tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));\n            } else /* if (rhoOffset >= 32) */ {\n              tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));\n              tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));\n            }\n\n            // Transpose lanes\n            var TPiLane = T[PI_INDEXES[laneIndex]];\n            TPiLane.high = tMsw;\n            TPiLane.low = tLsw;\n          }\n\n          // Rho pi at x = y = 0\n          var T0 = T[0];\n          var state0 = state[0];\n          T0.high = state0.high;\n          T0.low = state0.low;\n\n          // Chi\n          for (var x = 0; x < 5; x++) {\n            for (var y = 0; y < 5; y++) {\n              // Shortcuts\n              var laneIndex = x + 5 * y;\n              var lane = state[laneIndex];\n              var TLane = T[laneIndex];\n              var Tx1Lane = T[((x + 1) % 5) + 5 * y];\n              var Tx2Lane = T[((x + 2) % 5) + 5 * y];\n\n              // Mix rows\n              lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);\n              lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low);\n            }\n          }\n\n          // Iota\n          var lane = state[0];\n          var roundConstant = ROUND_CONSTANTS[round];\n          lane.high ^= roundConstant.high;\n          lane.low ^= roundConstant.low;\n        }\n      },\n\n      _doFinalize: function () {\n        // Shortcuts\n        var data = this._data;\n        var dataWords = data.words;\n        var nBitsTotal = this._nDataBytes * 8;\n        var nBitsLeft = data.sigBytes * 8;\n        var blockSizeBits = this.blockSize * 32;\n\n        // Add padding\n        dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - (nBitsLeft % 32));\n        dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;\n        data.sigBytes = dataWords.length * 4;\n\n        // Hash final blocks\n        this._process();\n\n        // Shortcuts\n        var state = this._state;\n        var outputLengthBytes = this.cfg.outputLength / 8;\n        var outputLengthLanes = outputLengthBytes / 8;\n\n        // Squeeze\n        var hashWords = [];\n        for (var i = 0; i < outputLengthLanes; i++) {\n          // Shortcuts\n          var lane = state[i];\n          var laneMsw = lane.high;\n          var laneLsw = lane.low;\n\n          // Swap endian\n          laneMsw =\n            (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00);\n          laneLsw =\n            (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00);\n\n          // Squeeze state to retrieve hash\n          hashWords.push(laneLsw);\n          hashWords.push(laneMsw);\n        }\n\n        // Return final computed hash\n        return new WordArray.init(hashWords, outputLengthBytes);\n      },\n\n      clone: function () {\n        var clone = Hasher.clone.call(this);\n\n        var state = (clone._state = this._state.slice(0));\n        for (var i = 0; i < 25; i++) {\n          state[i] = state[i].clone();\n        }\n\n        return clone;\n      },\n    }));\n\n    /**\n     * Shortcut function to the hasher's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     *\n     * @return {WordArray} The hash.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hash = CryptoJS.SHA3('message');\n     *     var hash = CryptoJS.SHA3(wordArray);\n     */\n    C.SHA3 = Hasher._createHelper(SHA3);\n\n    /**\n     * Shortcut function to the HMAC's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     * @param {WordArray|string} key The secret key.\n     *\n     * @return {WordArray} The HMAC.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hmac = CryptoJS.HmacSHA3(message, key);\n     */\n    C.HmacSHA3 = Hasher._createHmacHelper(SHA3);\n  })(Math);\n\n  /** @preserve\n\t(c) 2012 by Cédric Mesnil. All rights reserved.\n\n\tRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n\t    - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\t    - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n\tTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t*/\n\n  (function (Math) {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var WordArray = C_lib.WordArray;\n    var Hasher = C_lib.Hasher;\n    var C_algo = C.algo;\n\n    // Constants table\n    var _zl = WordArray.create([\n      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,\n      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,\n      7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13,\n    ]);\n    var _zr = WordArray.create([\n      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,\n      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,\n      4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11,\n    ]);\n    var _sl = WordArray.create([\n      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,\n      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,\n      15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6,\n    ]);\n    var _sr = WordArray.create([\n      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,\n      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,\n      12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11,\n    ]);\n\n    var _hl = WordArray.create([0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e]);\n    var _hr = WordArray.create([0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000]);\n\n    /**\n     * RIPEMD160 hash algorithm.\n     */\n    var RIPEMD160 = (C_algo.RIPEMD160 = Hasher.extend({\n      _doReset: function () {\n        this._hash = WordArray.create([0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]);\n      },\n\n      _doProcessBlock: function (M, offset) {\n        // Swap endian\n        for (var i = 0; i < 16; i++) {\n          // Shortcuts\n          var offset_i = offset + i;\n          var M_offset_i = M[offset_i];\n\n          // Swap\n          M[offset_i] =\n            (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |\n            (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00);\n        }\n        // Shortcut\n        var H = this._hash.words;\n        var hl = _hl.words;\n        var hr = _hr.words;\n        var zl = _zl.words;\n        var zr = _zr.words;\n        var sl = _sl.words;\n        var sr = _sr.words;\n\n        // Working variables\n        var al, bl, cl, dl, el;\n        var ar, br, cr, dr, er;\n\n        ar = al = H[0];\n        br = bl = H[1];\n        cr = cl = H[2];\n        dr = dl = H[3];\n        er = el = H[4];\n        // Computation\n        var t;\n        for (var i = 0; i < 80; i += 1) {\n          t = (al + M[offset + zl[i]]) | 0;\n          if (i < 16) {\n            t += f1(bl, cl, dl) + hl[0];\n          } else if (i < 32) {\n            t += f2(bl, cl, dl) + hl[1];\n          } else if (i < 48) {\n            t += f3(bl, cl, dl) + hl[2];\n          } else if (i < 64) {\n            t += f4(bl, cl, dl) + hl[3];\n          } else {\n            // if (i<80) {\n            t += f5(bl, cl, dl) + hl[4];\n          }\n          t = t | 0;\n          t = rotl(t, sl[i]);\n          t = (t + el) | 0;\n          al = el;\n          el = dl;\n          dl = rotl(cl, 10);\n          cl = bl;\n          bl = t;\n\n          t = (ar + M[offset + zr[i]]) | 0;\n          if (i < 16) {\n            t += f5(br, cr, dr) + hr[0];\n          } else if (i < 32) {\n            t += f4(br, cr, dr) + hr[1];\n          } else if (i < 48) {\n            t += f3(br, cr, dr) + hr[2];\n          } else if (i < 64) {\n            t += f2(br, cr, dr) + hr[3];\n          } else {\n            // if (i<80) {\n            t += f1(br, cr, dr) + hr[4];\n          }\n          t = t | 0;\n          t = rotl(t, sr[i]);\n          t = (t + er) | 0;\n          ar = er;\n          er = dr;\n          dr = rotl(cr, 10);\n          cr = br;\n          br = t;\n        }\n        // Intermediate hash value\n        t = (H[1] + cl + dr) | 0;\n        H[1] = (H[2] + dl + er) | 0;\n        H[2] = (H[3] + el + ar) | 0;\n        H[3] = (H[4] + al + br) | 0;\n        H[4] = (H[0] + bl + cr) | 0;\n        H[0] = t;\n      },\n\n      _doFinalize: function () {\n        // Shortcuts\n        var data = this._data;\n        var dataWords = data.words;\n\n        var nBitsTotal = this._nDataBytes * 8;\n        var nBitsLeft = data.sigBytes * 8;\n\n        // Add padding\n        dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32));\n        dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] =\n          (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) |\n          (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00);\n        data.sigBytes = (dataWords.length + 1) * 4;\n\n        // Hash final blocks\n        this._process();\n\n        // Shortcuts\n        var hash = this._hash;\n        var H = hash.words;\n\n        // Swap endian\n        for (var i = 0; i < 5; i++) {\n          // Shortcut\n          var H_i = H[i];\n\n          // Swap\n          H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);\n        }\n\n        // Return final computed hash\n        return hash;\n      },\n\n      clone: function () {\n        var clone = Hasher.clone.call(this);\n        clone._hash = this._hash.clone();\n\n        return clone;\n      },\n    }));\n\n    function f1(x, y, z) {\n      return x ^ y ^ z;\n    }\n\n    function f2(x, y, z) {\n      return (x & y) | (~x & z);\n    }\n\n    function f3(x, y, z) {\n      return (x | ~y) ^ z;\n    }\n\n    function f4(x, y, z) {\n      return (x & z) | (y & ~z);\n    }\n\n    function f5(x, y, z) {\n      return x ^ (y | ~z);\n    }\n\n    function rotl(x, n) {\n      return (x << n) | (x >>> (32 - n));\n    }\n\n    /**\n     * Shortcut function to the hasher's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     *\n     * @return {WordArray} The hash.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hash = CryptoJS.RIPEMD160('message');\n     *     var hash = CryptoJS.RIPEMD160(wordArray);\n     */\n    C.RIPEMD160 = Hasher._createHelper(RIPEMD160);\n\n    /**\n     * Shortcut function to the HMAC's object interface.\n     *\n     * @param {WordArray|string} message The message to hash.\n     * @param {WordArray|string} key The secret key.\n     *\n     * @return {WordArray} The HMAC.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var hmac = CryptoJS.HmacRIPEMD160(message, key);\n     */\n    C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);\n  })(Math);\n\n  (function () {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var Base = C_lib.Base;\n    var C_enc = C.enc;\n    var Utf8 = C_enc.Utf8;\n    var C_algo = C.algo;\n\n    /**\n     * HMAC algorithm.\n     */\n    var HMAC = (C_algo.HMAC = Base.extend({\n      /**\n       * Initializes a newly created HMAC.\n       *\n       * @param {Hasher} hasher The hash algorithm to use.\n       * @param {WordArray|string} key The secret key.\n       *\n       * @example\n       *\n       *     var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n       */\n      init: function (hasher, key) {\n        // Init hasher\n        hasher = this._hasher = new hasher.init();\n\n        // Convert string to WordArray, else assume WordArray already\n        if (typeof key == 'string') {\n          key = Utf8.parse(key);\n        }\n\n        // Shortcuts\n        var hasherBlockSize = hasher.blockSize;\n        var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n        // Allow arbitrary length keys\n        if (key.sigBytes > hasherBlockSizeBytes) {\n          key = hasher.finalize(key);\n        }\n\n        // Clamp excess bits\n        key.clamp();\n\n        // Clone key for inner and outer pads\n        var oKey = (this._oKey = key.clone());\n        var iKey = (this._iKey = key.clone());\n\n        // Shortcuts\n        var oKeyWords = oKey.words;\n        var iKeyWords = iKey.words;\n\n        // XOR keys with pad constants\n        for (var i = 0; i < hasherBlockSize; i++) {\n          oKeyWords[i] ^= 0x5c5c5c5c;\n          iKeyWords[i] ^= 0x36363636;\n        }\n        oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n        // Set initial values\n        this.reset();\n      },\n\n      /**\n       * Resets this HMAC to its initial state.\n       *\n       * @example\n       *\n       *     hmacHasher.reset();\n       */\n      reset: function () {\n        // Shortcut\n        var hasher = this._hasher;\n\n        // Reset\n        hasher.reset();\n        hasher.update(this._iKey);\n      },\n\n      /**\n       * Updates this HMAC with a message.\n       *\n       * @param {WordArray|string} messageUpdate The message to append.\n       *\n       * @return {HMAC} This HMAC instance.\n       *\n       * @example\n       *\n       *     hmacHasher.update('message');\n       *     hmacHasher.update(wordArray);\n       */\n      update: function (messageUpdate) {\n        this._hasher.update(messageUpdate);\n\n        // Chainable\n        return this;\n      },\n\n      /**\n       * Finalizes the HMAC computation.\n       * Note that the finalize operation is effectively a destructive, read-once operation.\n       *\n       * @param {WordArray|string} messageUpdate (Optional) A final message update.\n       *\n       * @return {WordArray} The HMAC.\n       *\n       * @example\n       *\n       *     var hmac = hmacHasher.finalize();\n       *     var hmac = hmacHasher.finalize('message');\n       *     var hmac = hmacHasher.finalize(wordArray);\n       */\n      finalize: function (messageUpdate) {\n        // Shortcut\n        var hasher = this._hasher;\n\n        // Compute HMAC\n        var innerHash = hasher.finalize(messageUpdate);\n        hasher.reset();\n        var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n        return hmac;\n      },\n    }));\n  })();\n\n  (function () {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var Base = C_lib.Base;\n    var WordArray = C_lib.WordArray;\n    var C_algo = C.algo;\n    var SHA1 = C_algo.SHA1;\n    var HMAC = C_algo.HMAC;\n\n    /**\n     * Password-Based Key Derivation Function 2 algorithm.\n     */\n    var PBKDF2 = (C_algo.PBKDF2 = Base.extend({\n      /**\n       * Configuration options.\n       *\n       * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n       * @property {Hasher} hasher The hasher to use. Default: SHA1\n       * @property {number} iterations The number of iterations to perform. Default: 1\n       */\n      cfg: Base.extend({\n        keySize: 128 / 32,\n        hasher: SHA1,\n        iterations: 1,\n      }),\n\n      /**\n       * Initializes a newly created key derivation function.\n       *\n       * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n       *\n       * @example\n       *\n       *     var kdf = CryptoJS.algo.PBKDF2.create();\n       *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });\n       *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });\n       */\n      init: function (cfg) {\n        this.cfg = this.cfg.extend(cfg);\n      },\n\n      /**\n       * Computes the Password-Based Key Derivation Function 2.\n       *\n       * @param {WordArray|string} password The password.\n       * @param {WordArray|string} salt A salt.\n       *\n       * @return {WordArray} The derived key.\n       *\n       * @example\n       *\n       *     var key = kdf.compute(password, salt);\n       */\n      compute: function (password, salt) {\n        // Shortcut\n        var cfg = this.cfg;\n\n        // Init HMAC\n        var hmac = HMAC.create(cfg.hasher, password);\n\n        // Initial values\n        var derivedKey = WordArray.create();\n        var blockIndex = WordArray.create([0x00000001]);\n\n        // Shortcuts\n        var derivedKeyWords = derivedKey.words;\n        var blockIndexWords = blockIndex.words;\n        var keySize = cfg.keySize;\n        var iterations = cfg.iterations;\n\n        // Generate key\n        while (derivedKeyWords.length < keySize) {\n          var block = hmac.update(salt).finalize(blockIndex);\n          hmac.reset();\n\n          // Shortcuts\n          var blockWords = block.words;\n          var blockWordsLength = blockWords.length;\n\n          // Iterations\n          var intermediate = block;\n          for (var i = 1; i < iterations; i++) {\n            intermediate = hmac.finalize(intermediate);\n            hmac.reset();\n\n            // Shortcut\n            var intermediateWords = intermediate.words;\n\n            // XOR intermediate with block\n            for (var j = 0; j < blockWordsLength; j++) {\n              blockWords[j] ^= intermediateWords[j];\n            }\n          }\n\n          derivedKey.concat(block);\n          blockIndexWords[0]++;\n        }\n        derivedKey.sigBytes = keySize * 4;\n\n        return derivedKey;\n      },\n    }));\n\n    /**\n     * Computes the Password-Based Key Derivation Function 2.\n     *\n     * @param {WordArray|string} password The password.\n     * @param {WordArray|string} salt A salt.\n     * @param {Object} cfg (Optional) The configuration options to use for this computation.\n     *\n     * @return {WordArray} The derived key.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var key = CryptoJS.PBKDF2(password, salt);\n     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });\n     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });\n     */\n    C.PBKDF2 = function (password, salt, cfg) {\n      return PBKDF2.create(cfg).compute(password, salt);\n    };\n  })();\n\n  (function () {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var Base = C_lib.Base;\n    var WordArray = C_lib.WordArray;\n    var C_algo = C.algo;\n    var MD5 = C_algo.MD5;\n\n    /**\n     * This key derivation function is meant to conform with EVP_BytesToKey.\n     * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n     */\n    var EvpKDF = (C_algo.EvpKDF = Base.extend({\n      /**\n       * Configuration options.\n       *\n       * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n       * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n       * @property {number} iterations The number of iterations to perform. Default: 1\n       */\n      cfg: Base.extend({\n        keySize: 128 / 32,\n        hasher: MD5,\n        iterations: 1,\n      }),\n\n      /**\n       * Initializes a newly created key derivation function.\n       *\n       * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n       *\n       * @example\n       *\n       *     var kdf = CryptoJS.algo.EvpKDF.create();\n       *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n       *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n       */\n      init: function (cfg) {\n        this.cfg = this.cfg.extend(cfg);\n      },\n\n      /**\n       * Derives a key from a password.\n       *\n       * @param {WordArray|string} password The password.\n       * @param {WordArray|string} salt A salt.\n       *\n       * @return {WordArray} The derived key.\n       *\n       * @example\n       *\n       *     var key = kdf.compute(password, salt);\n       */\n      compute: function (password, salt) {\n        var block;\n\n        // Shortcut\n        var cfg = this.cfg;\n\n        // Init hasher\n        var hasher = cfg.hasher.create();\n\n        // Initial values\n        var derivedKey = WordArray.create();\n\n        // Shortcuts\n        var derivedKeyWords = derivedKey.words;\n        var keySize = cfg.keySize;\n        var iterations = cfg.iterations;\n\n        // Generate key\n        while (derivedKeyWords.length < keySize) {\n          if (block) {\n            hasher.update(block);\n          }\n          block = hasher.update(password).finalize(salt);\n          hasher.reset();\n\n          // Iterations\n          for (var i = 1; i < iterations; i++) {\n            block = hasher.finalize(block);\n            hasher.reset();\n          }\n\n          derivedKey.concat(block);\n        }\n        derivedKey.sigBytes = keySize * 4;\n\n        return derivedKey;\n      },\n    }));\n\n    /**\n     * Derives a key from a password.\n     *\n     * @param {WordArray|string} password The password.\n     * @param {WordArray|string} salt A salt.\n     * @param {Object} cfg (Optional) The configuration options to use for this computation.\n     *\n     * @return {WordArray} The derived key.\n     *\n     * @static\n     *\n     * @example\n     *\n     *     var key = CryptoJS.EvpKDF(password, salt);\n     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n     */\n    C.EvpKDF = function (password, salt, cfg) {\n      return EvpKDF.create(cfg).compute(password, salt);\n    };\n  })();\n\n  /**\n   * Cipher core components.\n   */\n  CryptoJS.lib.Cipher ||\n    (function (undefined) {\n      // Shortcuts\n      var C = CryptoJS;\n      var C_lib = C.lib;\n      var Base = C_lib.Base;\n      var WordArray = C_lib.WordArray;\n      var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\n      var C_enc = C.enc;\n      var Utf8 = C_enc.Utf8;\n      var Base64 = C_enc.Base64;\n      var C_algo = C.algo;\n      var EvpKDF = C_algo.EvpKDF;\n\n      /**\n       * Abstract base cipher template.\n       *\n       * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n       * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n       * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n       * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n       */\n      var Cipher = (C_lib.Cipher = BufferedBlockAlgorithm.extend({\n        /**\n         * Configuration options.\n         *\n         * @property {WordArray} iv The IV to use for this operation.\n         */\n        cfg: Base.extend(),\n\n        /**\n         * Creates this cipher in encryption mode.\n         *\n         * @param {WordArray} key The key.\n         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n         *\n         * @return {Cipher} A cipher instance.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n         */\n        createEncryptor: function (key, cfg) {\n          return this.create(this._ENC_XFORM_MODE, key, cfg);\n        },\n\n        /**\n         * Creates this cipher in decryption mode.\n         *\n         * @param {WordArray} key The key.\n         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n         *\n         * @return {Cipher} A cipher instance.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n         */\n        createDecryptor: function (key, cfg) {\n          return this.create(this._DEC_XFORM_MODE, key, cfg);\n        },\n\n        /**\n         * Initializes a newly created cipher.\n         *\n         * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n         * @param {WordArray} key The key.\n         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n         *\n         * @example\n         *\n         *     var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\n         */\n        init: function (xformMode, key, cfg) {\n          // Apply config defaults\n          this.cfg = this.cfg.extend(cfg);\n\n          // Store transform mode and key\n          this._xformMode = xformMode;\n          this._key = key;\n\n          // Set initial values\n          this.reset();\n        },\n\n        /**\n         * Resets this cipher to its initial state.\n         *\n         * @example\n         *\n         *     cipher.reset();\n         */\n        reset: function () {\n          // Reset data buffer\n          BufferedBlockAlgorithm.reset.call(this);\n\n          // Perform concrete-cipher logic\n          this._doReset();\n        },\n\n        /**\n         * Adds data to be encrypted or decrypted.\n         *\n         * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n         *\n         * @return {WordArray} The data after processing.\n         *\n         * @example\n         *\n         *     var encrypted = cipher.process('data');\n         *     var encrypted = cipher.process(wordArray);\n         */\n        process: function (dataUpdate) {\n          // Append\n          this._append(dataUpdate);\n\n          // Process available blocks\n          return this._process();\n        },\n\n        /**\n         * Finalizes the encryption or decryption process.\n         * Note that the finalize operation is effectively a destructive, read-once operation.\n         *\n         * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n         *\n         * @return {WordArray} The data after final processing.\n         *\n         * @example\n         *\n         *     var encrypted = cipher.finalize();\n         *     var encrypted = cipher.finalize('data');\n         *     var encrypted = cipher.finalize(wordArray);\n         */\n        finalize: function (dataUpdate) {\n          // Final data update\n          if (dataUpdate) {\n            this._append(dataUpdate);\n          }\n\n          // Perform concrete-cipher logic\n          var finalProcessedData = this._doFinalize();\n\n          return finalProcessedData;\n        },\n\n        keySize: 128 / 32,\n\n        ivSize: 128 / 32,\n\n        _ENC_XFORM_MODE: 1,\n\n        _DEC_XFORM_MODE: 2,\n\n        /**\n         * Creates shortcut functions to a cipher's object interface.\n         *\n         * @param {Cipher} cipher The cipher to create a helper for.\n         *\n         * @return {Object} An object with encrypt and decrypt shortcut functions.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n         */\n        _createHelper: (function () {\n          function selectCipherStrategy(key) {\n            if (typeof key == 'string') {\n              return PasswordBasedCipher;\n            } else {\n              return SerializableCipher;\n            }\n          }\n\n          return function (cipher) {\n            return {\n              encrypt: function (message, key, cfg) {\n                return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\n              },\n\n              decrypt: function (ciphertext, key, cfg) {\n                return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\n              },\n            };\n          };\n        })(),\n      }));\n\n      /**\n       * Abstract base stream cipher template.\n       *\n       * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n       */\n      var StreamCipher = (C_lib.StreamCipher = Cipher.extend({\n        _doFinalize: function () {\n          // Process partial blocks\n          var finalProcessedBlocks = this._process(!!'flush');\n\n          return finalProcessedBlocks;\n        },\n\n        blockSize: 1,\n      }));\n\n      /**\n       * Mode namespace.\n       */\n      var C_mode = (C.mode = {});\n\n      /**\n       * Abstract base block cipher mode template.\n       */\n      var BlockCipherMode = (C_lib.BlockCipherMode = Base.extend({\n        /**\n         * Creates this mode for encryption.\n         *\n         * @param {Cipher} cipher A block cipher instance.\n         * @param {Array} iv The IV words.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n         */\n        createEncryptor: function (cipher, iv) {\n          return this.Encryptor.create(cipher, iv);\n        },\n\n        /**\n         * Creates this mode for decryption.\n         *\n         * @param {Cipher} cipher A block cipher instance.\n         * @param {Array} iv The IV words.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n         */\n        createDecryptor: function (cipher, iv) {\n          return this.Decryptor.create(cipher, iv);\n        },\n\n        /**\n         * Initializes a newly created mode.\n         *\n         * @param {Cipher} cipher A block cipher instance.\n         * @param {Array} iv The IV words.\n         *\n         * @example\n         *\n         *     var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n         */\n        init: function (cipher, iv) {\n          this._cipher = cipher;\n          this._iv = iv;\n        },\n      }));\n\n      /**\n       * Cipher Block Chaining mode.\n       */\n      var CBC = (C_mode.CBC = (function () {\n        /**\n         * Abstract base CBC mode.\n         */\n        var CBC = BlockCipherMode.extend();\n\n        /**\n         * CBC encryptor.\n         */\n        CBC.Encryptor = CBC.extend({\n          /**\n           * Processes the data block at offset.\n           *\n           * @param {Array} words The data words to operate on.\n           * @param {number} offset The offset where the block starts.\n           *\n           * @example\n           *\n           *     mode.processBlock(data.words, offset);\n           */\n          processBlock: function (words, offset) {\n            // Shortcuts\n            var cipher = this._cipher;\n            var blockSize = cipher.blockSize;\n\n            // XOR and encrypt\n            xorBlock.call(this, words, offset, blockSize);\n            cipher.encryptBlock(words, offset);\n\n            // Remember this block to use with next block\n            this._prevBlock = words.slice(offset, offset + blockSize);\n          },\n        });\n\n        /**\n         * CBC decryptor.\n         */\n        CBC.Decryptor = CBC.extend({\n          /**\n           * Processes the data block at offset.\n           *\n           * @param {Array} words The data words to operate on.\n           * @param {number} offset The offset where the block starts.\n           *\n           * @example\n           *\n           *     mode.processBlock(data.words, offset);\n           */\n          processBlock: function (words, offset) {\n            // Shortcuts\n            var cipher = this._cipher;\n            var blockSize = cipher.blockSize;\n\n            // Remember this block to use with next block\n            var thisBlock = words.slice(offset, offset + blockSize);\n\n            // Decrypt and XOR\n            cipher.decryptBlock(words, offset);\n            xorBlock.call(this, words, offset, blockSize);\n\n            // This block becomes the previous block\n            this._prevBlock = thisBlock;\n          },\n        });\n\n        function xorBlock(words, offset, blockSize) {\n          var block;\n\n          // Shortcut\n          var iv = this._iv;\n\n          // Choose mixing block\n          if (iv) {\n            block = iv;\n\n            // Remove IV for subsequent blocks\n            this._iv = undefined;\n          } else {\n            block = this._prevBlock;\n          }\n\n          // XOR blocks\n          for (var i = 0; i < blockSize; i++) {\n            words[offset + i] ^= block[i];\n          }\n        }\n\n        return CBC;\n      })());\n\n      /**\n       * Padding namespace.\n       */\n      var C_pad = (C.pad = {});\n\n      /**\n       * PKCS #5/7 padding strategy.\n       */\n      var Pkcs7 = (C_pad.Pkcs7 = {\n        /**\n         * Pads data using the algorithm defined in PKCS #5/7.\n         *\n         * @param {WordArray} data The data to pad.\n         * @param {number} blockSize The multiple that the data should be padded to.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n         */\n        pad: function (data, blockSize) {\n          // Shortcut\n          var blockSizeBytes = blockSize * 4;\n\n          // Count padding bytes\n          var nPaddingBytes = blockSizeBytes - (data.sigBytes % blockSizeBytes);\n\n          // Create padding word\n          var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;\n\n          // Create padding\n          var paddingWords = [];\n          for (var i = 0; i < nPaddingBytes; i += 4) {\n            paddingWords.push(paddingWord);\n          }\n          var padding = WordArray.create(paddingWords, nPaddingBytes);\n\n          // Add padding\n          data.concat(padding);\n        },\n\n        /**\n         * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n         *\n         * @param {WordArray} data The data to unpad.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     CryptoJS.pad.Pkcs7.unpad(wordArray);\n         */\n        unpad: function (data) {\n          // Get number of padding bytes from last byte\n          var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n          // Remove padding\n          data.sigBytes -= nPaddingBytes;\n        },\n      });\n\n      /**\n       * Abstract base block cipher template.\n       *\n       * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n       */\n      var BlockCipher = (C_lib.BlockCipher = Cipher.extend({\n        /**\n         * Configuration options.\n         *\n         * @property {Mode} mode The block mode to use. Default: CBC\n         * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n         */\n        cfg: Cipher.cfg.extend({\n          mode: CBC,\n          padding: Pkcs7,\n        }),\n\n        reset: function () {\n          var modeCreator;\n\n          // Reset cipher\n          Cipher.reset.call(this);\n\n          // Shortcuts\n          var cfg = this.cfg;\n          var iv = cfg.iv;\n          var mode = cfg.mode;\n\n          // Reset block mode\n          if (this._xformMode == this._ENC_XFORM_MODE) {\n            modeCreator = mode.createEncryptor;\n          } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n            modeCreator = mode.createDecryptor;\n            // Keep at least one block in the buffer for unpadding\n            this._minBufferSize = 1;\n          }\n\n          if (this._mode && this._mode.__creator == modeCreator) {\n            this._mode.init(this, iv && iv.words);\n          } else {\n            this._mode = modeCreator.call(mode, this, iv && iv.words);\n            this._mode.__creator = modeCreator;\n          }\n        },\n\n        _doProcessBlock: function (words, offset) {\n          this._mode.processBlock(words, offset);\n        },\n\n        _doFinalize: function () {\n          var finalProcessedBlocks;\n\n          // Shortcut\n          var padding = this.cfg.padding;\n\n          // Finalize\n          if (this._xformMode == this._ENC_XFORM_MODE) {\n            // Pad data\n            padding.pad(this._data, this.blockSize);\n\n            // Process final blocks\n            finalProcessedBlocks = this._process(!!'flush');\n          } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n            // Process final blocks\n            finalProcessedBlocks = this._process(!!'flush');\n\n            // Unpad data\n            padding.unpad(finalProcessedBlocks);\n          }\n\n          return finalProcessedBlocks;\n        },\n\n        blockSize: 128 / 32,\n      }));\n\n      /**\n       * A collection of cipher parameters.\n       *\n       * @property {WordArray} ciphertext The raw ciphertext.\n       * @property {WordArray} key The key to this ciphertext.\n       * @property {WordArray} iv The IV used in the ciphering operation.\n       * @property {WordArray} salt The salt used with a key derivation function.\n       * @property {Cipher} algorithm The cipher algorithm.\n       * @property {Mode} mode The block mode used in the ciphering operation.\n       * @property {Padding} padding The padding scheme used in the ciphering operation.\n       * @property {number} blockSize The block size of the cipher.\n       * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\n       */\n      var CipherParams = (C_lib.CipherParams = Base.extend({\n        /**\n         * Initializes a newly created cipher params object.\n         *\n         * @param {Object} cipherParams An object with any of the possible cipher parameters.\n         *\n         * @example\n         *\n         *     var cipherParams = CryptoJS.lib.CipherParams.create({\n         *         ciphertext: ciphertextWordArray,\n         *         key: keyWordArray,\n         *         iv: ivWordArray,\n         *         salt: saltWordArray,\n         *         algorithm: CryptoJS.algo.AES,\n         *         mode: CryptoJS.mode.CBC,\n         *         padding: CryptoJS.pad.PKCS7,\n         *         blockSize: 4,\n         *         formatter: CryptoJS.format.OpenSSL\n         *     });\n         */\n        init: function (cipherParams) {\n          this.mixIn(cipherParams);\n        },\n\n        /**\n         * Converts this cipher params object to a string.\n         *\n         * @param {Format} formatter (Optional) The formatting strategy to use.\n         *\n         * @return {string} The stringified cipher params.\n         *\n         * @throws Error If neither the formatter nor the default formatter is set.\n         *\n         * @example\n         *\n         *     var string = cipherParams + '';\n         *     var string = cipherParams.toString();\n         *     var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n         */\n        toString: function (formatter) {\n          return (formatter || this.formatter).stringify(this);\n        },\n      }));\n\n      /**\n       * Format namespace.\n       */\n      var C_format = (C.format = {});\n\n      /**\n       * OpenSSL formatting strategy.\n       */\n      var OpenSSLFormatter = (C_format.OpenSSL = {\n        /**\n         * Converts a cipher params object to an OpenSSL-compatible string.\n         *\n         * @param {CipherParams} cipherParams The cipher params object.\n         *\n         * @return {string} The OpenSSL-compatible string.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n         */\n        stringify: function (cipherParams) {\n          var wordArray;\n\n          // Shortcuts\n          var ciphertext = cipherParams.ciphertext;\n          var salt = cipherParams.salt;\n\n          // Format\n          if (salt) {\n            wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n          } else {\n            wordArray = ciphertext;\n          }\n\n          return wordArray.toString(Base64);\n        },\n\n        /**\n         * Converts an OpenSSL-compatible string to a cipher params object.\n         *\n         * @param {string} openSSLStr The OpenSSL-compatible string.\n         *\n         * @return {CipherParams} The cipher params object.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n         */\n        parse: function (openSSLStr) {\n          var salt;\n\n          // Parse base64\n          var ciphertext = Base64.parse(openSSLStr);\n\n          // Shortcut\n          var ciphertextWords = ciphertext.words;\n\n          // Test for salt\n          if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\n            // Extract salt\n            salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n            // Remove salt from ciphertext\n            ciphertextWords.splice(0, 4);\n            ciphertext.sigBytes -= 16;\n          }\n\n          return CipherParams.create({ ciphertext: ciphertext, salt: salt });\n        },\n      });\n\n      /**\n       * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n       */\n      var SerializableCipher = (C_lib.SerializableCipher = Base.extend({\n        /**\n         * Configuration options.\n         *\n         * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\n         */\n        cfg: Base.extend({\n          format: OpenSSLFormatter,\n        }),\n\n        /**\n         * Encrypts a message.\n         *\n         * @param {Cipher} cipher The cipher algorithm to use.\n         * @param {WordArray|string} message The message to encrypt.\n         * @param {WordArray} key The key.\n         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n         *\n         * @return {CipherParams} A cipher params object.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\n         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n         */\n        encrypt: function (cipher, message, key, cfg) {\n          // Apply config defaults\n          cfg = this.cfg.extend(cfg);\n\n          // Encrypt\n          var encryptor = cipher.createEncryptor(key, cfg);\n          var ciphertext = encryptor.finalize(message);\n\n          // Shortcut\n          var cipherCfg = encryptor.cfg;\n\n          // Create and return serializable cipher params\n          return CipherParams.create({\n            ciphertext: ciphertext,\n            key: key,\n            iv: cipherCfg.iv,\n            algorithm: cipher,\n            mode: cipherCfg.mode,\n            padding: cipherCfg.padding,\n            blockSize: cipher.blockSize,\n            formatter: cfg.format,\n          });\n        },\n\n        /**\n         * Decrypts serialized ciphertext.\n         *\n         * @param {Cipher} cipher The cipher algorithm to use.\n         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n         * @param {WordArray} key The key.\n         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n         *\n         * @return {WordArray} The plaintext.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n         */\n        decrypt: function (cipher, ciphertext, key, cfg) {\n          // Apply config defaults\n          cfg = this.cfg.extend(cfg);\n\n          // Convert string to CipherParams\n          ciphertext = this._parse(ciphertext, cfg.format);\n\n          // Decrypt\n          var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\n\n          return plaintext;\n        },\n\n        /**\n         * Converts serialized ciphertext to CipherParams,\n         * else assumed CipherParams already and returns ciphertext unchanged.\n         *\n         * @param {CipherParams|string} ciphertext The ciphertext.\n         * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n         *\n         * @return {CipherParams} The unserialized ciphertext.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\n         */\n        _parse: function (ciphertext, format) {\n          if (typeof ciphertext == 'string') {\n            return format.parse(ciphertext, this);\n          } else {\n            return ciphertext;\n          }\n        },\n      }));\n\n      /**\n       * Key derivation function namespace.\n       */\n      var C_kdf = (C.kdf = {});\n\n      /**\n       * OpenSSL key derivation function.\n       */\n      var OpenSSLKdf = (C_kdf.OpenSSL = {\n        /**\n         * Derives a key and IV from a password.\n         *\n         * @param {string} password The password to derive from.\n         * @param {number} keySize The size in words of the key to generate.\n         * @param {number} ivSize The size in words of the IV to generate.\n         * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n         *\n         * @return {CipherParams} A cipher params object with the key, IV, and salt.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n         */\n        execute: function (password, keySize, ivSize, salt) {\n          // Generate random salt\n          if (!salt) {\n            salt = WordArray.random(64 / 8);\n          }\n\n          // Derive key and IV\n          var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\n\n          // Separate key and IV\n          var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n          key.sigBytes = keySize * 4;\n\n          // Return params\n          return CipherParams.create({ key: key, iv: iv, salt: salt });\n        },\n      });\n\n      /**\n       * A serializable cipher wrapper that derives the key from a password,\n       * and returns ciphertext as a serializable cipher params object.\n       */\n      var PasswordBasedCipher = (C_lib.PasswordBasedCipher = SerializableCipher.extend({\n        /**\n         * Configuration options.\n         *\n         * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\n         */\n        cfg: SerializableCipher.cfg.extend({\n          kdf: OpenSSLKdf,\n        }),\n\n        /**\n         * Encrypts a message using a password.\n         *\n         * @param {Cipher} cipher The cipher algorithm to use.\n         * @param {WordArray|string} message The message to encrypt.\n         * @param {string} password The password.\n         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n         *\n         * @return {CipherParams} A cipher params object.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\n         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n         */\n        encrypt: function (cipher, message, password, cfg) {\n          // Apply config defaults\n          cfg = this.cfg.extend(cfg);\n\n          // Derive key and other params\n          var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);\n\n          // Add IV to config\n          cfg.iv = derivedParams.iv;\n\n          // Encrypt\n          var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\n\n          // Mix in derived params\n          ciphertext.mixIn(derivedParams);\n\n          return ciphertext;\n        },\n\n        /**\n         * Decrypts serialized ciphertext using a password.\n         *\n         * @param {Cipher} cipher The cipher algorithm to use.\n         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n         * @param {string} password The password.\n         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n         *\n         * @return {WordArray} The plaintext.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\n         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\n         */\n        decrypt: function (cipher, ciphertext, password, cfg) {\n          // Apply config defaults\n          cfg = this.cfg.extend(cfg);\n\n          // Convert string to CipherParams\n          ciphertext = this._parse(ciphertext, cfg.format);\n\n          // Derive key and other params\n          var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);\n\n          // Add IV to config\n          cfg.iv = derivedParams.iv;\n\n          // Decrypt\n          var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\n\n          return plaintext;\n        },\n      }));\n    })();\n\n  /**\n   * Cipher Feedback block mode.\n   */\n  CryptoJS.mode.CFB = (function () {\n    var CFB = CryptoJS.lib.BlockCipherMode.extend();\n\n    CFB.Encryptor = CFB.extend({\n      processBlock: function (words, offset) {\n        // Shortcuts\n        var cipher = this._cipher;\n        var blockSize = cipher.blockSize;\n\n        generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\n\n        // Remember this block to use with next block\n        this._prevBlock = words.slice(offset, offset + blockSize);\n      },\n    });\n\n    CFB.Decryptor = CFB.extend({\n      processBlock: function (words, offset) {\n        // Shortcuts\n        var cipher = this._cipher;\n        var blockSize = cipher.blockSize;\n\n        // Remember this block to use with next block\n        var thisBlock = words.slice(offset, offset + blockSize);\n\n        generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\n\n        // This block becomes the previous block\n        this._prevBlock = thisBlock;\n      },\n    });\n\n    function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {\n      var keystream;\n\n      // Shortcut\n      var iv = this._iv;\n\n      // Generate keystream\n      if (iv) {\n        keystream = iv.slice(0);\n\n        // Remove IV for subsequent blocks\n        this._iv = undefined;\n      } else {\n        keystream = this._prevBlock;\n      }\n      cipher.encryptBlock(keystream, 0);\n\n      // Encrypt\n      for (var i = 0; i < blockSize; i++) {\n        words[offset + i] ^= keystream[i];\n      }\n    }\n\n    return CFB;\n  })();\n\n  /**\n   * Counter block mode.\n   */\n  CryptoJS.mode.CTR = (function () {\n    var CTR = CryptoJS.lib.BlockCipherMode.extend();\n\n    var Encryptor = (CTR.Encryptor = CTR.extend({\n      processBlock: function (words, offset) {\n        // Shortcuts\n        var cipher = this._cipher;\n        var blockSize = cipher.blockSize;\n        var iv = this._iv;\n        var counter = this._counter;\n\n        // Generate keystream\n        if (iv) {\n          counter = this._counter = iv.slice(0);\n\n          // Remove IV for subsequent blocks\n          this._iv = undefined;\n        }\n        var keystream = counter.slice(0);\n        cipher.encryptBlock(keystream, 0);\n\n        // Increment counter\n        counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0;\n\n        // Encrypt\n        for (var i = 0; i < blockSize; i++) {\n          words[offset + i] ^= keystream[i];\n        }\n      },\n    }));\n\n    CTR.Decryptor = Encryptor;\n\n    return CTR;\n  })();\n\n  /** @preserve\n   * Counter block mode compatible with  Dr Brian Gladman fileenc.c\n   * derived from CryptoJS.mode.CTR\n   * Jan Hruby jhruby.web@gmail.com\n   */\n  CryptoJS.mode.CTRGladman = (function () {\n    var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();\n\n    function incWord(word) {\n      if (((word >> 24) & 0xff) === 0xff) {\n        //overflow\n        var b1 = (word >> 16) & 0xff;\n        var b2 = (word >> 8) & 0xff;\n        var b3 = word & 0xff;\n\n        if (b1 === 0xff) // overflow b1\n        {\n          b1 = 0;\n          if (b2 === 0xff) {\n            b2 = 0;\n            if (b3 === 0xff) {\n              b3 = 0;\n            } else {\n              ++b3;\n            }\n          } else {\n            ++b2;\n          }\n        } else {\n          ++b1;\n        }\n\n        word = 0;\n        word += b1 << 16;\n        word += b2 << 8;\n        word += b3;\n      } else {\n        word += 0x01 << 24;\n      }\n      return word;\n    }\n\n    function incCounter(counter) {\n      if ((counter[0] = incWord(counter[0])) === 0) {\n        // encr_data in fileenc.c from  Dr Brian Gladman's counts only with DWORD j < 8\n        counter[1] = incWord(counter[1]);\n      }\n      return counter;\n    }\n\n    var Encryptor = (CTRGladman.Encryptor = CTRGladman.extend({\n      processBlock: function (words, offset) {\n        // Shortcuts\n        var cipher = this._cipher;\n        var blockSize = cipher.blockSize;\n        var iv = this._iv;\n        var counter = this._counter;\n\n        // Generate keystream\n        if (iv) {\n          counter = this._counter = iv.slice(0);\n\n          // Remove IV for subsequent blocks\n          this._iv = undefined;\n        }\n\n        incCounter(counter);\n\n        var keystream = counter.slice(0);\n        cipher.encryptBlock(keystream, 0);\n\n        // Encrypt\n        for (var i = 0; i < blockSize; i++) {\n          words[offset + i] ^= keystream[i];\n        }\n      },\n    }));\n\n    CTRGladman.Decryptor = Encryptor;\n\n    return CTRGladman;\n  })();\n\n  /**\n   * Output Feedback block mode.\n   */\n  CryptoJS.mode.OFB = (function () {\n    var OFB = CryptoJS.lib.BlockCipherMode.extend();\n\n    var Encryptor = (OFB.Encryptor = OFB.extend({\n      processBlock: function (words, offset) {\n        // Shortcuts\n        var cipher = this._cipher;\n        var blockSize = cipher.blockSize;\n        var iv = this._iv;\n        var keystream = this._keystream;\n\n        // Generate keystream\n        if (iv) {\n          keystream = this._keystream = iv.slice(0);\n\n          // Remove IV for subsequent blocks\n          this._iv = undefined;\n        }\n        cipher.encryptBlock(keystream, 0);\n\n        // Encrypt\n        for (var i = 0; i < blockSize; i++) {\n          words[offset + i] ^= keystream[i];\n        }\n      },\n    }));\n\n    OFB.Decryptor = Encryptor;\n\n    return OFB;\n  })();\n\n  /**\n   * Electronic Codebook block mode.\n   */\n  CryptoJS.mode.ECB = (function () {\n    var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n    ECB.Encryptor = ECB.extend({\n      processBlock: function (words, offset) {\n        this._cipher.encryptBlock(words, offset);\n      },\n    });\n\n    ECB.Decryptor = ECB.extend({\n      processBlock: function (words, offset) {\n        this._cipher.decryptBlock(words, offset);\n      },\n    });\n\n    return ECB;\n  })();\n\n  /**\n   * ANSI X.923 padding strategy.\n   */\n  CryptoJS.pad.AnsiX923 = {\n    pad: function (data, blockSize) {\n      // Shortcuts\n      var dataSigBytes = data.sigBytes;\n      var blockSizeBytes = blockSize * 4;\n\n      // Count padding bytes\n      var nPaddingBytes = blockSizeBytes - (dataSigBytes % blockSizeBytes);\n\n      // Compute last byte position\n      var lastBytePos = dataSigBytes + nPaddingBytes - 1;\n\n      // Pad\n      data.clamp();\n      data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);\n      data.sigBytes += nPaddingBytes;\n    },\n\n    unpad: function (data) {\n      // Get number of padding bytes from last byte\n      var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n      // Remove padding\n      data.sigBytes -= nPaddingBytes;\n    },\n  };\n\n  /**\n   * ISO 10126 padding strategy.\n   */\n  CryptoJS.pad.Iso10126 = {\n    pad: function (data, blockSize) {\n      // Shortcut\n      var blockSizeBytes = blockSize * 4;\n\n      // Count padding bytes\n      var nPaddingBytes = blockSizeBytes - (data.sigBytes % blockSizeBytes);\n\n      // Pad\n      data\n        .concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1))\n        .concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));\n    },\n\n    unpad: function (data) {\n      // Get number of padding bytes from last byte\n      var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n      // Remove padding\n      data.sigBytes -= nPaddingBytes;\n    },\n  };\n\n  /**\n   * ISO/IEC 9797-1 Padding Method 2.\n   */\n  CryptoJS.pad.Iso97971 = {\n    pad: function (data, blockSize) {\n      // Add 0x80 byte\n      data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));\n\n      // Zero pad the rest\n      CryptoJS.pad.ZeroPadding.pad(data, blockSize);\n    },\n\n    unpad: function (data) {\n      // Remove zero padding\n      CryptoJS.pad.ZeroPadding.unpad(data);\n\n      // Remove one more byte -- the 0x80 byte\n      data.sigBytes--;\n    },\n  };\n\n  /**\n   * Zero padding strategy.\n   */\n  CryptoJS.pad.ZeroPadding = {\n    pad: function (data, blockSize) {\n      // Shortcut\n      var blockSizeBytes = blockSize * 4;\n\n      // Pad\n      data.clamp();\n      data.sigBytes += blockSizeBytes - (data.sigBytes % blockSizeBytes || blockSizeBytes);\n    },\n\n    unpad: function (data) {\n      // Shortcut\n      var dataWords = data.words;\n\n      // Unpad\n      var i = data.sigBytes - 1;\n      for (var i = data.sigBytes - 1; i >= 0; i--) {\n        if ((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff) {\n          data.sigBytes = i + 1;\n          break;\n        }\n      }\n    },\n  };\n\n  /**\n   * A noop padding strategy.\n   */\n  CryptoJS.pad.NoPadding = {\n    pad: function () {},\n\n    unpad: function () {},\n  };\n\n  (function (undefined) {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var CipherParams = C_lib.CipherParams;\n    var C_enc = C.enc;\n    var Hex = C_enc.Hex;\n    var C_format = C.format;\n\n    var HexFormatter = (C_format.Hex = {\n      /**\n       * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.\n       *\n       * @param {CipherParams} cipherParams The cipher params object.\n       *\n       * @return {string} The hexadecimally encoded string.\n       *\n       * @static\n       *\n       * @example\n       *\n       *     var hexString = CryptoJS.format.Hex.stringify(cipherParams);\n       */\n      stringify: function (cipherParams) {\n        return cipherParams.ciphertext.toString(Hex);\n      },\n\n      /**\n       * Converts a hexadecimally encoded ciphertext string to a cipher params object.\n       *\n       * @param {string} input The hexadecimally encoded string.\n       *\n       * @return {CipherParams} The cipher params object.\n       *\n       * @static\n       *\n       * @example\n       *\n       *     var cipherParams = CryptoJS.format.Hex.parse(hexString);\n       */\n      parse: function (input) {\n        var ciphertext = Hex.parse(input);\n        return CipherParams.create({ ciphertext: ciphertext });\n      },\n    });\n  })();\n\n  (function () {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var BlockCipher = C_lib.BlockCipher;\n    var C_algo = C.algo;\n\n    // Lookup tables\n    var SBOX = [];\n    var INV_SBOX = [];\n    var SUB_MIX_0 = [];\n    var SUB_MIX_1 = [];\n    var SUB_MIX_2 = [];\n    var SUB_MIX_3 = [];\n    var INV_SUB_MIX_0 = [];\n    var INV_SUB_MIX_1 = [];\n    var INV_SUB_MIX_2 = [];\n    var INV_SUB_MIX_3 = [];\n\n    // Compute lookup tables\n    (function () {\n      // Compute double table\n      var d = [];\n      for (var i = 0; i < 256; i++) {\n        if (i < 128) {\n          d[i] = i << 1;\n        } else {\n          d[i] = (i << 1) ^ 0x11b;\n        }\n      }\n\n      // Walk GF(2^8)\n      var x = 0;\n      var xi = 0;\n      for (var i = 0; i < 256; i++) {\n        // Compute sbox\n        var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n        sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n        SBOX[x] = sx;\n        INV_SBOX[sx] = x;\n\n        // Compute multiplication\n        var x2 = d[x];\n        var x4 = d[x2];\n        var x8 = d[x4];\n\n        // Compute sub bytes, mix columns tables\n        var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n        SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n        SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n        SUB_MIX_2[x] = (t << 8) | (t >>> 24);\n        SUB_MIX_3[x] = t;\n\n        // Compute inv sub bytes, inv mix columns tables\n        var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n        INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n        INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n        INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\n        INV_SUB_MIX_3[sx] = t;\n\n        // Compute next counter\n        if (!x) {\n          x = xi = 1;\n        } else {\n          x = x2 ^ d[d[d[x8 ^ x2]]];\n          xi ^= d[d[xi]];\n        }\n      }\n    })();\n\n    // Precomputed Rcon lookup\n    var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n    /**\n     * AES block cipher algorithm.\n     */\n    var AES = (C_algo.AES = BlockCipher.extend({\n      _doReset: function () {\n        var t;\n\n        // Skip reset of nRounds has been set before and key did not change\n        if (this._nRounds && this._keyPriorReset === this._key) {\n          return;\n        }\n\n        // Shortcuts\n        var key = (this._keyPriorReset = this._key);\n        var keyWords = key.words;\n        var keySize = key.sigBytes / 4;\n\n        // Compute number of rounds\n        var nRounds = (this._nRounds = keySize + 6);\n\n        // Compute number of key schedule rows\n        var ksRows = (nRounds + 1) * 4;\n\n        // Compute key schedule\n        var keySchedule = (this._keySchedule = []);\n        for (var ksRow = 0; ksRow < ksRows; ksRow++) {\n          if (ksRow < keySize) {\n            keySchedule[ksRow] = keyWords[ksRow];\n          } else {\n            t = keySchedule[ksRow - 1];\n\n            if (!(ksRow % keySize)) {\n              // Rot word\n              t = (t << 8) | (t >>> 24);\n\n              // Sub word\n              t =\n                (SBOX[t >>> 24] << 24) |\n                (SBOX[(t >>> 16) & 0xff] << 16) |\n                (SBOX[(t >>> 8) & 0xff] << 8) |\n                SBOX[t & 0xff];\n\n              // Mix Rcon\n              t ^= RCON[(ksRow / keySize) | 0] << 24;\n            } else if (keySize > 6 && ksRow % keySize == 4) {\n              // Sub word\n              t =\n                (SBOX[t >>> 24] << 24) |\n                (SBOX[(t >>> 16) & 0xff] << 16) |\n                (SBOX[(t >>> 8) & 0xff] << 8) |\n                SBOX[t & 0xff];\n            }\n\n            keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n          }\n        }\n\n        // Compute inv key schedule\n        var invKeySchedule = (this._invKeySchedule = []);\n        for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\n          var ksRow = ksRows - invKsRow;\n\n          if (invKsRow % 4) {\n            var t = keySchedule[ksRow];\n          } else {\n            var t = keySchedule[ksRow - 4];\n          }\n\n          if (invKsRow < 4 || ksRow <= 4) {\n            invKeySchedule[invKsRow] = t;\n          } else {\n            invKeySchedule[invKsRow] =\n              INV_SUB_MIX_0[SBOX[t >>> 24]] ^\n              INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\n              INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^\n              INV_SUB_MIX_3[SBOX[t & 0xff]];\n          }\n        }\n      },\n\n      encryptBlock: function (M, offset) {\n        this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\n      },\n\n      decryptBlock: function (M, offset) {\n        // Swap 2nd and 4th rows\n        var t = M[offset + 1];\n        M[offset + 1] = M[offset + 3];\n        M[offset + 3] = t;\n\n        this._doCryptBlock(\n          M,\n          offset,\n          this._invKeySchedule,\n          INV_SUB_MIX_0,\n          INV_SUB_MIX_1,\n          INV_SUB_MIX_2,\n          INV_SUB_MIX_3,\n          INV_SBOX,\n        );\n\n        // Inv swap 2nd and 4th rows\n        var t = M[offset + 1];\n        M[offset + 1] = M[offset + 3];\n        M[offset + 3] = t;\n      },\n\n      _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n        // Shortcut\n        var nRounds = this._nRounds;\n\n        // Get input, add round key\n        var s0 = M[offset] ^ keySchedule[0];\n        var s1 = M[offset + 1] ^ keySchedule[1];\n        var s2 = M[offset + 2] ^ keySchedule[2];\n        var s3 = M[offset + 3] ^ keySchedule[3];\n\n        // Key schedule row counter\n        var ksRow = 4;\n\n        // Rounds\n        for (var round = 1; round < nRounds; round++) {\n          // Shift rows, sub bytes, mix columns, add round key\n          var t0 =\n            SUB_MIX_0[s0 >>> 24] ^\n            SUB_MIX_1[(s1 >>> 16) & 0xff] ^\n            SUB_MIX_2[(s2 >>> 8) & 0xff] ^\n            SUB_MIX_3[s3 & 0xff] ^\n            keySchedule[ksRow++];\n          var t1 =\n            SUB_MIX_0[s1 >>> 24] ^\n            SUB_MIX_1[(s2 >>> 16) & 0xff] ^\n            SUB_MIX_2[(s3 >>> 8) & 0xff] ^\n            SUB_MIX_3[s0 & 0xff] ^\n            keySchedule[ksRow++];\n          var t2 =\n            SUB_MIX_0[s2 >>> 24] ^\n            SUB_MIX_1[(s3 >>> 16) & 0xff] ^\n            SUB_MIX_2[(s0 >>> 8) & 0xff] ^\n            SUB_MIX_3[s1 & 0xff] ^\n            keySchedule[ksRow++];\n          var t3 =\n            SUB_MIX_0[s3 >>> 24] ^\n            SUB_MIX_1[(s0 >>> 16) & 0xff] ^\n            SUB_MIX_2[(s1 >>> 8) & 0xff] ^\n            SUB_MIX_3[s2 & 0xff] ^\n            keySchedule[ksRow++];\n\n          // Update state\n          s0 = t0;\n          s1 = t1;\n          s2 = t2;\n          s3 = t3;\n        }\n\n        // Shift rows, sub bytes, add round key\n        var t0 =\n          ((SBOX[s0 >>> 24] << 24) |\n            (SBOX[(s1 >>> 16) & 0xff] << 16) |\n            (SBOX[(s2 >>> 8) & 0xff] << 8) |\n            SBOX[s3 & 0xff]) ^\n          keySchedule[ksRow++];\n        var t1 =\n          ((SBOX[s1 >>> 24] << 24) |\n            (SBOX[(s2 >>> 16) & 0xff] << 16) |\n            (SBOX[(s3 >>> 8) & 0xff] << 8) |\n            SBOX[s0 & 0xff]) ^\n          keySchedule[ksRow++];\n        var t2 =\n          ((SBOX[s2 >>> 24] << 24) |\n            (SBOX[(s3 >>> 16) & 0xff] << 16) |\n            (SBOX[(s0 >>> 8) & 0xff] << 8) |\n            SBOX[s1 & 0xff]) ^\n          keySchedule[ksRow++];\n        var t3 =\n          ((SBOX[s3 >>> 24] << 24) |\n            (SBOX[(s0 >>> 16) & 0xff] << 16) |\n            (SBOX[(s1 >>> 8) & 0xff] << 8) |\n            SBOX[s2 & 0xff]) ^\n          keySchedule[ksRow++];\n\n        // Set output\n        M[offset] = t0;\n        M[offset + 1] = t1;\n        M[offset + 2] = t2;\n        M[offset + 3] = t3;\n      },\n\n      keySize: 256 / 32,\n    }));\n\n    /**\n     * Shortcut functions to the cipher's object interface.\n     *\n     * @example\n     *\n     *     var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n     *     var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n     */\n    C.AES = BlockCipher._createHelper(AES);\n  })();\n\n  (function () {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var WordArray = C_lib.WordArray;\n    var BlockCipher = C_lib.BlockCipher;\n    var C_algo = C.algo;\n\n    // Permuted Choice 1 constants\n    var PC1 = [\n      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,\n      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,\n    ];\n\n    // Permuted Choice 2 constants\n    var PC2 = [\n      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,\n      30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32,\n    ];\n\n    // Cumulative bit shift constants\n    var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];\n\n    // SBOXes and round permutation constants\n    var SBOX_P = [\n      {\n        0x0: 0x808200,\n        0x10000000: 0x8000,\n        0x20000000: 0x808002,\n        0x30000000: 0x2,\n        0x40000000: 0x200,\n        0x50000000: 0x808202,\n        0x60000000: 0x800202,\n        0x70000000: 0x800000,\n        0x80000000: 0x202,\n        0x90000000: 0x800200,\n        0xa0000000: 0x8200,\n        0xb0000000: 0x808000,\n        0xc0000000: 0x8002,\n        0xd0000000: 0x800002,\n        0xe0000000: 0x0,\n        0xf0000000: 0x8202,\n        0x8000000: 0x0,\n        0x18000000: 0x808202,\n        0x28000000: 0x8202,\n        0x38000000: 0x8000,\n        0x48000000: 0x808200,\n        0x58000000: 0x200,\n        0x68000000: 0x808002,\n        0x78000000: 0x2,\n        0x88000000: 0x800200,\n        0x98000000: 0x8200,\n        0xa8000000: 0x808000,\n        0xb8000000: 0x800202,\n        0xc8000000: 0x800002,\n        0xd8000000: 0x8002,\n        0xe8000000: 0x202,\n        0xf8000000: 0x800000,\n        0x1: 0x8000,\n        0x10000001: 0x2,\n        0x20000001: 0x808200,\n        0x30000001: 0x800000,\n        0x40000001: 0x808002,\n        0x50000001: 0x8200,\n        0x60000001: 0x200,\n        0x70000001: 0x800202,\n        0x80000001: 0x808202,\n        0x90000001: 0x808000,\n        0xa0000001: 0x800002,\n        0xb0000001: 0x8202,\n        0xc0000001: 0x202,\n        0xd0000001: 0x800200,\n        0xe0000001: 0x8002,\n        0xf0000001: 0x0,\n        0x8000001: 0x808202,\n        0x18000001: 0x808000,\n        0x28000001: 0x800000,\n        0x38000001: 0x200,\n        0x48000001: 0x8000,\n        0x58000001: 0x800002,\n        0x68000001: 0x2,\n        0x78000001: 0x8202,\n        0x88000001: 0x8002,\n        0x98000001: 0x800202,\n        0xa8000001: 0x202,\n        0xb8000001: 0x808200,\n        0xc8000001: 0x800200,\n        0xd8000001: 0x0,\n        0xe8000001: 0x8200,\n        0xf8000001: 0x808002,\n      },\n      {\n        0x0: 0x40084010,\n        0x1000000: 0x4000,\n        0x2000000: 0x80000,\n        0x3000000: 0x40080010,\n        0x4000000: 0x40000010,\n        0x5000000: 0x40084000,\n        0x6000000: 0x40004000,\n        0x7000000: 0x10,\n        0x8000000: 0x84000,\n        0x9000000: 0x40004010,\n        0xa000000: 0x40000000,\n        0xb000000: 0x84010,\n        0xc000000: 0x80010,\n        0xd000000: 0x0,\n        0xe000000: 0x4010,\n        0xf000000: 0x40080000,\n        0x800000: 0x40004000,\n        0x1800000: 0x84010,\n        0x2800000: 0x10,\n        0x3800000: 0x40004010,\n        0x4800000: 0x40084010,\n        0x5800000: 0x40000000,\n        0x6800000: 0x80000,\n        0x7800000: 0x40080010,\n        0x8800000: 0x80010,\n        0x9800000: 0x0,\n        0xa800000: 0x4000,\n        0xb800000: 0x40080000,\n        0xc800000: 0x40000010,\n        0xd800000: 0x84000,\n        0xe800000: 0x40084000,\n        0xf800000: 0x4010,\n        0x10000000: 0x0,\n        0x11000000: 0x40080010,\n        0x12000000: 0x40004010,\n        0x13000000: 0x40084000,\n        0x14000000: 0x40080000,\n        0x15000000: 0x10,\n        0x16000000: 0x84010,\n        0x17000000: 0x4000,\n        0x18000000: 0x4010,\n        0x19000000: 0x80000,\n        0x1a000000: 0x80010,\n        0x1b000000: 0x40000010,\n        0x1c000000: 0x84000,\n        0x1d000000: 0x40004000,\n        0x1e000000: 0x40000000,\n        0x1f000000: 0x40084010,\n        0x10800000: 0x84010,\n        0x11800000: 0x80000,\n        0x12800000: 0x40080000,\n        0x13800000: 0x4000,\n        0x14800000: 0x40004000,\n        0x15800000: 0x40084010,\n        0x16800000: 0x10,\n        0x17800000: 0x40000000,\n        0x18800000: 0x40084000,\n        0x19800000: 0x40000010,\n        0x1a800000: 0x40004010,\n        0x1b800000: 0x80010,\n        0x1c800000: 0x0,\n        0x1d800000: 0x4010,\n        0x1e800000: 0x40080010,\n        0x1f800000: 0x84000,\n      },\n      {\n        0x0: 0x104,\n        0x100000: 0x0,\n        0x200000: 0x4000100,\n        0x300000: 0x10104,\n        0x400000: 0x10004,\n        0x500000: 0x4000004,\n        0x600000: 0x4010104,\n        0x700000: 0x4010000,\n        0x800000: 0x4000000,\n        0x900000: 0x4010100,\n        0xa00000: 0x10100,\n        0xb00000: 0x4010004,\n        0xc00000: 0x4000104,\n        0xd00000: 0x10000,\n        0xe00000: 0x4,\n        0xf00000: 0x100,\n        0x80000: 0x4010100,\n        0x180000: 0x4010004,\n        0x280000: 0x0,\n        0x380000: 0x4000100,\n        0x480000: 0x4000004,\n        0x580000: 0x10000,\n        0x680000: 0x10004,\n        0x780000: 0x104,\n        0x880000: 0x4,\n        0x980000: 0x100,\n        0xa80000: 0x4010000,\n        0xb80000: 0x10104,\n        0xc80000: 0x10100,\n        0xd80000: 0x4000104,\n        0xe80000: 0x4010104,\n        0xf80000: 0x4000000,\n        0x1000000: 0x4010100,\n        0x1100000: 0x10004,\n        0x1200000: 0x10000,\n        0x1300000: 0x4000100,\n        0x1400000: 0x100,\n        0x1500000: 0x4010104,\n        0x1600000: 0x4000004,\n        0x1700000: 0x0,\n        0x1800000: 0x4000104,\n        0x1900000: 0x4000000,\n        0x1a00000: 0x4,\n        0x1b00000: 0x10100,\n        0x1c00000: 0x4010000,\n        0x1d00000: 0x104,\n        0x1e00000: 0x10104,\n        0x1f00000: 0x4010004,\n        0x1080000: 0x4000000,\n        0x1180000: 0x104,\n        0x1280000: 0x4010100,\n        0x1380000: 0x0,\n        0x1480000: 0x10004,\n        0x1580000: 0x4000100,\n        0x1680000: 0x100,\n        0x1780000: 0x4010004,\n        0x1880000: 0x10000,\n        0x1980000: 0x4010104,\n        0x1a80000: 0x10104,\n        0x1b80000: 0x4000004,\n        0x1c80000: 0x4000104,\n        0x1d80000: 0x4010000,\n        0x1e80000: 0x4,\n        0x1f80000: 0x10100,\n      },\n      {\n        0x0: 0x80401000,\n        0x10000: 0x80001040,\n        0x20000: 0x401040,\n        0x30000: 0x80400000,\n        0x40000: 0x0,\n        0x50000: 0x401000,\n        0x60000: 0x80000040,\n        0x70000: 0x400040,\n        0x80000: 0x80000000,\n        0x90000: 0x400000,\n        0xa0000: 0x40,\n        0xb0000: 0x80001000,\n        0xc0000: 0x80400040,\n        0xd0000: 0x1040,\n        0xe0000: 0x1000,\n        0xf0000: 0x80401040,\n        0x8000: 0x80001040,\n        0x18000: 0x40,\n        0x28000: 0x80400040,\n        0x38000: 0x80001000,\n        0x48000: 0x401000,\n        0x58000: 0x80401040,\n        0x68000: 0x0,\n        0x78000: 0x80400000,\n        0x88000: 0x1000,\n        0x98000: 0x80401000,\n        0xa8000: 0x400000,\n        0xb8000: 0x1040,\n        0xc8000: 0x80000000,\n        0xd8000: 0x400040,\n        0xe8000: 0x401040,\n        0xf8000: 0x80000040,\n        0x100000: 0x400040,\n        0x110000: 0x401000,\n        0x120000: 0x80000040,\n        0x130000: 0x0,\n        0x140000: 0x1040,\n        0x150000: 0x80400040,\n        0x160000: 0x80401000,\n        0x170000: 0x80001040,\n        0x180000: 0x80401040,\n        0x190000: 0x80000000,\n        0x1a0000: 0x80400000,\n        0x1b0000: 0x401040,\n        0x1c0000: 0x80001000,\n        0x1d0000: 0x400000,\n        0x1e0000: 0x40,\n        0x1f0000: 0x1000,\n        0x108000: 0x80400000,\n        0x118000: 0x80401040,\n        0x128000: 0x0,\n        0x138000: 0x401000,\n        0x148000: 0x400040,\n        0x158000: 0x80000000,\n        0x168000: 0x80001040,\n        0x178000: 0x40,\n        0x188000: 0x80000040,\n        0x198000: 0x1000,\n        0x1a8000: 0x80001000,\n        0x1b8000: 0x80400040,\n        0x1c8000: 0x1040,\n        0x1d8000: 0x80401000,\n        0x1e8000: 0x400000,\n        0x1f8000: 0x401040,\n      },\n      {\n        0x0: 0x80,\n        0x1000: 0x1040000,\n        0x2000: 0x40000,\n        0x3000: 0x20000000,\n        0x4000: 0x20040080,\n        0x5000: 0x1000080,\n        0x6000: 0x21000080,\n        0x7000: 0x40080,\n        0x8000: 0x1000000,\n        0x9000: 0x20040000,\n        0xa000: 0x20000080,\n        0xb000: 0x21040080,\n        0xc000: 0x21040000,\n        0xd000: 0x0,\n        0xe000: 0x1040080,\n        0xf000: 0x21000000,\n        0x800: 0x1040080,\n        0x1800: 0x21000080,\n        0x2800: 0x80,\n        0x3800: 0x1040000,\n        0x4800: 0x40000,\n        0x5800: 0x20040080,\n        0x6800: 0x21040000,\n        0x7800: 0x20000000,\n        0x8800: 0x20040000,\n        0x9800: 0x0,\n        0xa800: 0x21040080,\n        0xb800: 0x1000080,\n        0xc800: 0x20000080,\n        0xd800: 0x21000000,\n        0xe800: 0x1000000,\n        0xf800: 0x40080,\n        0x10000: 0x40000,\n        0x11000: 0x80,\n        0x12000: 0x20000000,\n        0x13000: 0x21000080,\n        0x14000: 0x1000080,\n        0x15000: 0x21040000,\n        0x16000: 0x20040080,\n        0x17000: 0x1000000,\n        0x18000: 0x21040080,\n        0x19000: 0x21000000,\n        0x1a000: 0x1040000,\n        0x1b000: 0x20040000,\n        0x1c000: 0x40080,\n        0x1d000: 0x20000080,\n        0x1e000: 0x0,\n        0x1f000: 0x1040080,\n        0x10800: 0x21000080,\n        0x11800: 0x1000000,\n        0x12800: 0x1040000,\n        0x13800: 0x20040080,\n        0x14800: 0x20000000,\n        0x15800: 0x1040080,\n        0x16800: 0x80,\n        0x17800: 0x21040000,\n        0x18800: 0x40080,\n        0x19800: 0x21040080,\n        0x1a800: 0x0,\n        0x1b800: 0x21000000,\n        0x1c800: 0x1000080,\n        0x1d800: 0x40000,\n        0x1e800: 0x20040000,\n        0x1f800: 0x20000080,\n      },\n      {\n        0x0: 0x10000008,\n        0x100: 0x2000,\n        0x200: 0x10200000,\n        0x300: 0x10202008,\n        0x400: 0x10002000,\n        0x500: 0x200000,\n        0x600: 0x200008,\n        0x700: 0x10000000,\n        0x800: 0x0,\n        0x900: 0x10002008,\n        0xa00: 0x202000,\n        0xb00: 0x8,\n        0xc00: 0x10200008,\n        0xd00: 0x202008,\n        0xe00: 0x2008,\n        0xf00: 0x10202000,\n        0x80: 0x10200000,\n        0x180: 0x10202008,\n        0x280: 0x8,\n        0x380: 0x200000,\n        0x480: 0x202008,\n        0x580: 0x10000008,\n        0x680: 0x10002000,\n        0x780: 0x2008,\n        0x880: 0x200008,\n        0x980: 0x2000,\n        0xa80: 0x10002008,\n        0xb80: 0x10200008,\n        0xc80: 0x0,\n        0xd80: 0x10202000,\n        0xe80: 0x202000,\n        0xf80: 0x10000000,\n        0x1000: 0x10002000,\n        0x1100: 0x10200008,\n        0x1200: 0x10202008,\n        0x1300: 0x2008,\n        0x1400: 0x200000,\n        0x1500: 0x10000000,\n        0x1600: 0x10000008,\n        0x1700: 0x202000,\n        0x1800: 0x202008,\n        0x1900: 0x0,\n        0x1a00: 0x8,\n        0x1b00: 0x10200000,\n        0x1c00: 0x2000,\n        0x1d00: 0x10002008,\n        0x1e00: 0x10202000,\n        0x1f00: 0x200008,\n        0x1080: 0x8,\n        0x1180: 0x202000,\n        0x1280: 0x200000,\n        0x1380: 0x10000008,\n        0x1480: 0x10002000,\n        0x1580: 0x2008,\n        0x1680: 0x10202008,\n        0x1780: 0x10200000,\n        0x1880: 0x10202000,\n        0x1980: 0x10200008,\n        0x1a80: 0x2000,\n        0x1b80: 0x202008,\n        0x1c80: 0x200008,\n        0x1d80: 0x0,\n        0x1e80: 0x10000000,\n        0x1f80: 0x10002008,\n      },\n      {\n        0x0: 0x100000,\n        0x10: 0x2000401,\n        0x20: 0x400,\n        0x30: 0x100401,\n        0x40: 0x2100401,\n        0x50: 0x0,\n        0x60: 0x1,\n        0x70: 0x2100001,\n        0x80: 0x2000400,\n        0x90: 0x100001,\n        0xa0: 0x2000001,\n        0xb0: 0x2100400,\n        0xc0: 0x2100000,\n        0xd0: 0x401,\n        0xe0: 0x100400,\n        0xf0: 0x2000000,\n        0x8: 0x2100001,\n        0x18: 0x0,\n        0x28: 0x2000401,\n        0x38: 0x2100400,\n        0x48: 0x100000,\n        0x58: 0x2000001,\n        0x68: 0x2000000,\n        0x78: 0x401,\n        0x88: 0x100401,\n        0x98: 0x2000400,\n        0xa8: 0x2100000,\n        0xb8: 0x100001,\n        0xc8: 0x400,\n        0xd8: 0x2100401,\n        0xe8: 0x1,\n        0xf8: 0x100400,\n        0x100: 0x2000000,\n        0x110: 0x100000,\n        0x120: 0x2000401,\n        0x130: 0x2100001,\n        0x140: 0x100001,\n        0x150: 0x2000400,\n        0x160: 0x2100400,\n        0x170: 0x100401,\n        0x180: 0x401,\n        0x190: 0x2100401,\n        0x1a0: 0x100400,\n        0x1b0: 0x1,\n        0x1c0: 0x0,\n        0x1d0: 0x2100000,\n        0x1e0: 0x2000001,\n        0x1f0: 0x400,\n        0x108: 0x100400,\n        0x118: 0x2000401,\n        0x128: 0x2100001,\n        0x138: 0x1,\n        0x148: 0x2000000,\n        0x158: 0x100000,\n        0x168: 0x401,\n        0x178: 0x2100400,\n        0x188: 0x2000001,\n        0x198: 0x2100000,\n        0x1a8: 0x0,\n        0x1b8: 0x2100401,\n        0x1c8: 0x100401,\n        0x1d8: 0x400,\n        0x1e8: 0x2000400,\n        0x1f8: 0x100001,\n      },\n      {\n        0x0: 0x8000820,\n        0x1: 0x20000,\n        0x2: 0x8000000,\n        0x3: 0x20,\n        0x4: 0x20020,\n        0x5: 0x8020820,\n        0x6: 0x8020800,\n        0x7: 0x800,\n        0x8: 0x8020000,\n        0x9: 0x8000800,\n        0xa: 0x20800,\n        0xb: 0x8020020,\n        0xc: 0x820,\n        0xd: 0x0,\n        0xe: 0x8000020,\n        0xf: 0x20820,\n        0x80000000: 0x800,\n        0x80000001: 0x8020820,\n        0x80000002: 0x8000820,\n        0x80000003: 0x8000000,\n        0x80000004: 0x8020000,\n        0x80000005: 0x20800,\n        0x80000006: 0x20820,\n        0x80000007: 0x20,\n        0x80000008: 0x8000020,\n        0x80000009: 0x820,\n        0x8000000a: 0x20020,\n        0x8000000b: 0x8020800,\n        0x8000000c: 0x0,\n        0x8000000d: 0x8020020,\n        0x8000000e: 0x8000800,\n        0x8000000f: 0x20000,\n        0x10: 0x20820,\n        0x11: 0x8020800,\n        0x12: 0x20,\n        0x13: 0x800,\n        0x14: 0x8000800,\n        0x15: 0x8000020,\n        0x16: 0x8020020,\n        0x17: 0x20000,\n        0x18: 0x0,\n        0x19: 0x20020,\n        0x1a: 0x8020000,\n        0x1b: 0x8000820,\n        0x1c: 0x8020820,\n        0x1d: 0x20800,\n        0x1e: 0x820,\n        0x1f: 0x8000000,\n        0x80000010: 0x20000,\n        0x80000011: 0x800,\n        0x80000012: 0x8020020,\n        0x80000013: 0x20820,\n        0x80000014: 0x20,\n        0x80000015: 0x8020000,\n        0x80000016: 0x8000000,\n        0x80000017: 0x8000820,\n        0x80000018: 0x8020820,\n        0x80000019: 0x8000020,\n        0x8000001a: 0x8000800,\n        0x8000001b: 0x0,\n        0x8000001c: 0x20800,\n        0x8000001d: 0x820,\n        0x8000001e: 0x20020,\n        0x8000001f: 0x8020800,\n      },\n    ];\n\n    // Masks that select the SBOX input\n    var SBOX_MASK = [0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000, 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f];\n\n    /**\n     * DES block cipher algorithm.\n     */\n    var DES = (C_algo.DES = BlockCipher.extend({\n      _doReset: function () {\n        // Shortcuts\n        var key = this._key;\n        var keyWords = key.words;\n\n        // Select 56 bits according to PC1\n        var keyBits = [];\n        for (var i = 0; i < 56; i++) {\n          var keyBitPos = PC1[i] - 1;\n          keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - (keyBitPos % 32))) & 1;\n        }\n\n        // Assemble 16 subkeys\n        var subKeys = (this._subKeys = []);\n        for (var nSubKey = 0; nSubKey < 16; nSubKey++) {\n          // Create subkey\n          var subKey = (subKeys[nSubKey] = []);\n\n          // Shortcut\n          var bitShift = BIT_SHIFTS[nSubKey];\n\n          // Select 48 bits according to PC2\n          for (var i = 0; i < 24; i++) {\n            // Select from the left 28 key bits\n            subKey[(i / 6) | 0] |= keyBits[(PC2[i] - 1 + bitShift) % 28] << (31 - (i % 6));\n\n            // Select from the right 28 key bits\n            subKey[4 + ((i / 6) | 0)] |= keyBits[28 + ((PC2[i + 24] - 1 + bitShift) % 28)] << (31 - (i % 6));\n          }\n\n          // Since each subkey is applied to an expanded 32-bit input,\n          // the subkey can be broken into 8 values scaled to 32-bits,\n          // which allows the key to be used without expansion\n          subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);\n          for (var i = 1; i < 7; i++) {\n            subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);\n          }\n          subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);\n        }\n\n        // Compute inverse subkeys\n        var invSubKeys = (this._invSubKeys = []);\n        for (var i = 0; i < 16; i++) {\n          invSubKeys[i] = subKeys[15 - i];\n        }\n      },\n\n      encryptBlock: function (M, offset) {\n        this._doCryptBlock(M, offset, this._subKeys);\n      },\n\n      decryptBlock: function (M, offset) {\n        this._doCryptBlock(M, offset, this._invSubKeys);\n      },\n\n      _doCryptBlock: function (M, offset, subKeys) {\n        // Get input\n        this._lBlock = M[offset];\n        this._rBlock = M[offset + 1];\n\n        // Initial permutation\n        exchangeLR.call(this, 4, 0x0f0f0f0f);\n        exchangeLR.call(this, 16, 0x0000ffff);\n        exchangeRL.call(this, 2, 0x33333333);\n        exchangeRL.call(this, 8, 0x00ff00ff);\n        exchangeLR.call(this, 1, 0x55555555);\n\n        // Rounds\n        for (var round = 0; round < 16; round++) {\n          // Shortcuts\n          var subKey = subKeys[round];\n          var lBlock = this._lBlock;\n          var rBlock = this._rBlock;\n\n          // Feistel function\n          var f = 0;\n          for (var i = 0; i < 8; i++) {\n            f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];\n          }\n          this._lBlock = rBlock;\n          this._rBlock = lBlock ^ f;\n        }\n\n        // Undo swap from last round\n        var t = this._lBlock;\n        this._lBlock = this._rBlock;\n        this._rBlock = t;\n\n        // Final permutation\n        exchangeLR.call(this, 1, 0x55555555);\n        exchangeRL.call(this, 8, 0x00ff00ff);\n        exchangeRL.call(this, 2, 0x33333333);\n        exchangeLR.call(this, 16, 0x0000ffff);\n        exchangeLR.call(this, 4, 0x0f0f0f0f);\n\n        // Set output\n        M[offset] = this._lBlock;\n        M[offset + 1] = this._rBlock;\n      },\n\n      keySize: 64 / 32,\n\n      ivSize: 64 / 32,\n\n      blockSize: 64 / 32,\n    }));\n\n    // Swap bits across the left and right words\n    function exchangeLR(offset, mask) {\n      var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;\n      this._rBlock ^= t;\n      this._lBlock ^= t << offset;\n    }\n\n    function exchangeRL(offset, mask) {\n      var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;\n      this._lBlock ^= t;\n      this._rBlock ^= t << offset;\n    }\n\n    /**\n     * Shortcut functions to the cipher's object interface.\n     *\n     * @example\n     *\n     *     var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);\n     *     var plaintext  = CryptoJS.DES.decrypt(ciphertext, key, cfg);\n     */\n    C.DES = BlockCipher._createHelper(DES);\n\n    /**\n     * Triple-DES block cipher algorithm.\n     */\n    var TripleDES = (C_algo.TripleDES = BlockCipher.extend({\n      _doReset: function () {\n        // Shortcuts\n        var key = this._key;\n        var keyWords = key.words;\n        // Make sure the key length is valid (64, 128 or >= 192 bit)\n        if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) {\n          throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.');\n        }\n\n        // Extend the key according to the keying options defined in 3DES standard\n        var key1 = keyWords.slice(0, 2);\n        var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4);\n        var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6);\n\n        // Create DES instances\n        this._des1 = DES.createEncryptor(WordArray.create(key1));\n        this._des2 = DES.createEncryptor(WordArray.create(key2));\n        this._des3 = DES.createEncryptor(WordArray.create(key3));\n      },\n\n      encryptBlock: function (M, offset) {\n        this._des1.encryptBlock(M, offset);\n        this._des2.decryptBlock(M, offset);\n        this._des3.encryptBlock(M, offset);\n      },\n\n      decryptBlock: function (M, offset) {\n        this._des3.decryptBlock(M, offset);\n        this._des2.encryptBlock(M, offset);\n        this._des1.decryptBlock(M, offset);\n      },\n\n      keySize: 192 / 32,\n\n      ivSize: 64 / 32,\n\n      blockSize: 64 / 32,\n    }));\n\n    /**\n     * Shortcut functions to the cipher's object interface.\n     *\n     * @example\n     *\n     *     var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);\n     *     var plaintext  = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);\n     */\n    C.TripleDES = BlockCipher._createHelper(TripleDES);\n  })();\n\n  (function () {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var StreamCipher = C_lib.StreamCipher;\n    var C_algo = C.algo;\n\n    /**\n     * RC4 stream cipher algorithm.\n     */\n    var RC4 = (C_algo.RC4 = StreamCipher.extend({\n      _doReset: function () {\n        // Shortcuts\n        var key = this._key;\n        var keyWords = key.words;\n        var keySigBytes = key.sigBytes;\n\n        // Init sbox\n        var S = (this._S = []);\n        for (var i = 0; i < 256; i++) {\n          S[i] = i;\n        }\n\n        // Key setup\n        for (var i = 0, j = 0; i < 256; i++) {\n          var keyByteIndex = i % keySigBytes;\n          var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;\n\n          j = (j + S[i] + keyByte) % 256;\n\n          // Swap\n          var t = S[i];\n          S[i] = S[j];\n          S[j] = t;\n        }\n\n        // Counters\n        this._i = this._j = 0;\n      },\n\n      _doProcessBlock: function (M, offset) {\n        M[offset] ^= generateKeystreamWord.call(this);\n      },\n\n      keySize: 256 / 32,\n\n      ivSize: 0,\n    }));\n\n    function generateKeystreamWord() {\n      // Shortcuts\n      var S = this._S;\n      var i = this._i;\n      var j = this._j;\n\n      // Generate keystream word\n      var keystreamWord = 0;\n      for (var n = 0; n < 4; n++) {\n        i = (i + 1) % 256;\n        j = (j + S[i]) % 256;\n\n        // Swap\n        var t = S[i];\n        S[i] = S[j];\n        S[j] = t;\n\n        keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);\n      }\n\n      // Update counters\n      this._i = i;\n      this._j = j;\n\n      return keystreamWord;\n    }\n\n    /**\n     * Shortcut functions to the cipher's object interface.\n     *\n     * @example\n     *\n     *     var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);\n     *     var plaintext  = CryptoJS.RC4.decrypt(ciphertext, key, cfg);\n     */\n    C.RC4 = StreamCipher._createHelper(RC4);\n\n    /**\n     * Modified RC4 stream cipher algorithm.\n     */\n    var RC4Drop = (C_algo.RC4Drop = RC4.extend({\n      /**\n       * Configuration options.\n       *\n       * @property {number} drop The number of keystream words to drop. Default 192\n       */\n      cfg: RC4.cfg.extend({\n        drop: 192,\n      }),\n\n      _doReset: function () {\n        RC4._doReset.call(this);\n\n        // Drop\n        for (var i = this.cfg.drop; i > 0; i--) {\n          generateKeystreamWord.call(this);\n        }\n      },\n    }));\n\n    /**\n     * Shortcut functions to the cipher's object interface.\n     *\n     * @example\n     *\n     *     var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);\n     *     var plaintext  = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);\n     */\n    C.RC4Drop = StreamCipher._createHelper(RC4Drop);\n  })();\n\n  (function () {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var StreamCipher = C_lib.StreamCipher;\n    var C_algo = C.algo;\n\n    // Reusable objects\n    var S = [];\n    var C_ = [];\n    var G = [];\n\n    /**\n     * Rabbit stream cipher algorithm\n     */\n    var Rabbit = (C_algo.Rabbit = StreamCipher.extend({\n      _doReset: function () {\n        // Shortcuts\n        var K = this._key.words;\n        var iv = this.cfg.iv;\n\n        // Swap endian\n        for (var i = 0; i < 4; i++) {\n          K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) | (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00);\n        }\n\n        // Generate initial state values\n        var X = (this._X = [\n          K[0],\n          (K[3] << 16) | (K[2] >>> 16),\n          K[1],\n          (K[0] << 16) | (K[3] >>> 16),\n          K[2],\n          (K[1] << 16) | (K[0] >>> 16),\n          K[3],\n          (K[2] << 16) | (K[1] >>> 16),\n        ]);\n\n        // Generate initial counter values\n        var C = (this._C = [\n          (K[2] << 16) | (K[2] >>> 16),\n          (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\n          (K[3] << 16) | (K[3] >>> 16),\n          (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\n          (K[0] << 16) | (K[0] >>> 16),\n          (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\n          (K[1] << 16) | (K[1] >>> 16),\n          (K[3] & 0xffff0000) | (K[0] & 0x0000ffff),\n        ]);\n\n        // Carry bit\n        this._b = 0;\n\n        // Iterate the system four times\n        for (var i = 0; i < 4; i++) {\n          nextState.call(this);\n        }\n\n        // Modify the counters\n        for (var i = 0; i < 8; i++) {\n          C[i] ^= X[(i + 4) & 7];\n        }\n\n        // IV setup\n        if (iv) {\n          // Shortcuts\n          var IV = iv.words;\n          var IV_0 = IV[0];\n          var IV_1 = IV[1];\n\n          // Generate four subvectors\n          var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);\n          var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);\n          var i1 = (i0 >>> 16) | (i2 & 0xffff0000);\n          var i3 = (i2 << 16) | (i0 & 0x0000ffff);\n\n          // Modify counter values\n          C[0] ^= i0;\n          C[1] ^= i1;\n          C[2] ^= i2;\n          C[3] ^= i3;\n          C[4] ^= i0;\n          C[5] ^= i1;\n          C[6] ^= i2;\n          C[7] ^= i3;\n\n          // Iterate the system four times\n          for (var i = 0; i < 4; i++) {\n            nextState.call(this);\n          }\n        }\n      },\n\n      _doProcessBlock: function (M, offset) {\n        // Shortcut\n        var X = this._X;\n\n        // Iterate the system\n        nextState.call(this);\n\n        // Generate four keystream words\n        S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\n        S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\n        S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\n        S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\n\n        for (var i = 0; i < 4; i++) {\n          // Swap endian\n          S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);\n\n          // Encrypt\n          M[offset + i] ^= S[i];\n        }\n      },\n\n      blockSize: 128 / 32,\n\n      ivSize: 64 / 32,\n    }));\n\n    function nextState() {\n      // Shortcuts\n      var X = this._X;\n      var C = this._C;\n\n      // Save old counter values\n      for (var i = 0; i < 8; i++) {\n        C_[i] = C[i];\n      }\n\n      // Calculate new counter values\n      C[0] = (C[0] + 0x4d34d34d + this._b) | 0;\n      C[1] = (C[1] + 0xd34d34d3 + (C[0] >>> 0 < C_[0] >>> 0 ? 1 : 0)) | 0;\n      C[2] = (C[2] + 0x34d34d34 + (C[1] >>> 0 < C_[1] >>> 0 ? 1 : 0)) | 0;\n      C[3] = (C[3] + 0x4d34d34d + (C[2] >>> 0 < C_[2] >>> 0 ? 1 : 0)) | 0;\n      C[4] = (C[4] + 0xd34d34d3 + (C[3] >>> 0 < C_[3] >>> 0 ? 1 : 0)) | 0;\n      C[5] = (C[5] + 0x34d34d34 + (C[4] >>> 0 < C_[4] >>> 0 ? 1 : 0)) | 0;\n      C[6] = (C[6] + 0x4d34d34d + (C[5] >>> 0 < C_[5] >>> 0 ? 1 : 0)) | 0;\n      C[7] = (C[7] + 0xd34d34d3 + (C[6] >>> 0 < C_[6] >>> 0 ? 1 : 0)) | 0;\n      this._b = C[7] >>> 0 < C_[7] >>> 0 ? 1 : 0;\n\n      // Calculate the g-values\n      for (var i = 0; i < 8; i++) {\n        var gx = X[i] + C[i];\n\n        // Construct high and low argument for squaring\n        var ga = gx & 0xffff;\n        var gb = gx >>> 16;\n\n        // Calculate high and low result of squaring\n        var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\n        var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\n\n        // High XOR low\n        G[i] = gh ^ gl;\n      }\n\n      // Calculate new state values\n      X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\n      X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;\n      X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\n      X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;\n      X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\n      X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;\n      X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\n      X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;\n    }\n\n    /**\n     * Shortcut functions to the cipher's object interface.\n     *\n     * @example\n     *\n     *     var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);\n     *     var plaintext  = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);\n     */\n    C.Rabbit = StreamCipher._createHelper(Rabbit);\n  })();\n\n  (function () {\n    // Shortcuts\n    var C = CryptoJS;\n    var C_lib = C.lib;\n    var StreamCipher = C_lib.StreamCipher;\n    var C_algo = C.algo;\n\n    // Reusable objects\n    var S = [];\n    var C_ = [];\n    var G = [];\n\n    /**\n     * Rabbit stream cipher algorithm.\n     *\n     * This is a legacy version that neglected to convert the key to little-endian.\n     * This error doesn't affect the cipher's security,\n     * but it does affect its compatibility with other implementations.\n     */\n    var RabbitLegacy = (C_algo.RabbitLegacy = StreamCipher.extend({\n      _doReset: function () {\n        // Shortcuts\n        var K = this._key.words;\n        var iv = this.cfg.iv;\n\n        // Generate initial state values\n        var X = (this._X = [\n          K[0],\n          (K[3] << 16) | (K[2] >>> 16),\n          K[1],\n          (K[0] << 16) | (K[3] >>> 16),\n          K[2],\n          (K[1] << 16) | (K[0] >>> 16),\n          K[3],\n          (K[2] << 16) | (K[1] >>> 16),\n        ]);\n\n        // Generate initial counter values\n        var C = (this._C = [\n          (K[2] << 16) | (K[2] >>> 16),\n          (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\n          (K[3] << 16) | (K[3] >>> 16),\n          (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\n          (K[0] << 16) | (K[0] >>> 16),\n          (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\n          (K[1] << 16) | (K[1] >>> 16),\n          (K[3] & 0xffff0000) | (K[0] & 0x0000ffff),\n        ]);\n\n        // Carry bit\n        this._b = 0;\n\n        // Iterate the system four times\n        for (var i = 0; i < 4; i++) {\n          nextState.call(this);\n        }\n\n        // Modify the counters\n        for (var i = 0; i < 8; i++) {\n          C[i] ^= X[(i + 4) & 7];\n        }\n\n        // IV setup\n        if (iv) {\n          // Shortcuts\n          var IV = iv.words;\n          var IV_0 = IV[0];\n          var IV_1 = IV[1];\n\n          // Generate four subvectors\n          var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);\n          var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);\n          var i1 = (i0 >>> 16) | (i2 & 0xffff0000);\n          var i3 = (i2 << 16) | (i0 & 0x0000ffff);\n\n          // Modify counter values\n          C[0] ^= i0;\n          C[1] ^= i1;\n          C[2] ^= i2;\n          C[3] ^= i3;\n          C[4] ^= i0;\n          C[5] ^= i1;\n          C[6] ^= i2;\n          C[7] ^= i3;\n\n          // Iterate the system four times\n          for (var i = 0; i < 4; i++) {\n            nextState.call(this);\n          }\n        }\n      },\n\n      _doProcessBlock: function (M, offset) {\n        // Shortcut\n        var X = this._X;\n\n        // Iterate the system\n        nextState.call(this);\n\n        // Generate four keystream words\n        S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\n        S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\n        S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\n        S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\n\n        for (var i = 0; i < 4; i++) {\n          // Swap endian\n          S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);\n\n          // Encrypt\n          M[offset + i] ^= S[i];\n        }\n      },\n\n      blockSize: 128 / 32,\n\n      ivSize: 64 / 32,\n    }));\n\n    function nextState() {\n      // Shortcuts\n      var X = this._X;\n      var C = this._C;\n\n      // Save old counter values\n      for (var i = 0; i < 8; i++) {\n        C_[i] = C[i];\n      }\n\n      // Calculate new counter values\n      C[0] = (C[0] + 0x4d34d34d + this._b) | 0;\n      C[1] = (C[1] + 0xd34d34d3 + (C[0] >>> 0 < C_[0] >>> 0 ? 1 : 0)) | 0;\n      C[2] = (C[2] + 0x34d34d34 + (C[1] >>> 0 < C_[1] >>> 0 ? 1 : 0)) | 0;\n      C[3] = (C[3] + 0x4d34d34d + (C[2] >>> 0 < C_[2] >>> 0 ? 1 : 0)) | 0;\n      C[4] = (C[4] + 0xd34d34d3 + (C[3] >>> 0 < C_[3] >>> 0 ? 1 : 0)) | 0;\n      C[5] = (C[5] + 0x34d34d34 + (C[4] >>> 0 < C_[4] >>> 0 ? 1 : 0)) | 0;\n      C[6] = (C[6] + 0x4d34d34d + (C[5] >>> 0 < C_[5] >>> 0 ? 1 : 0)) | 0;\n      C[7] = (C[7] + 0xd34d34d3 + (C[6] >>> 0 < C_[6] >>> 0 ? 1 : 0)) | 0;\n      this._b = C[7] >>> 0 < C_[7] >>> 0 ? 1 : 0;\n\n      // Calculate the g-values\n      for (var i = 0; i < 8; i++) {\n        var gx = X[i] + C[i];\n\n        // Construct high and low argument for squaring\n        var ga = gx & 0xffff;\n        var gb = gx >>> 16;\n\n        // Calculate high and low result of squaring\n        var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\n        var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\n\n        // High XOR low\n        G[i] = gh ^ gl;\n      }\n\n      // Calculate new state values\n      X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\n      X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;\n      X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\n      X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;\n      X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\n      X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;\n      X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\n      X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;\n    }\n\n    /**\n     * Shortcut functions to the cipher's object interface.\n     *\n     * @example\n     *\n     *     var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);\n     *     var plaintext  = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);\n     */\n    C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);\n  })();\n\n  return CryptoJS;\n});\n"
  },
  {
    "path": "resources/t3Catopen/http.js",
    "content": "let req = (url, options) =>\n  http(\n    url,\n    Object.assign(\n      {\n        async: false,\n      },\n      options,\n    ),\n  );\n\nfunction http(url, options = {}) {\n  if (options?.async === false) return _http(url, options);\n  return new Promise((resolve) =>\n    _http(\n      url,\n      Object.assign(\n        {\n          complete: (res) => resolve(res),\n        },\n        options,\n      ),\n    ),\n  ).catch((err) => {\n    console.error(err.name, err.message, err.stack);\n    return {\n      ok: false,\n      status: 500,\n      url,\n    };\n  });\n}\n"
  },
  {
    "path": "resources/t3Catopen/mod.js",
    "content": "const peq = new Uint32Array(0x10000);\nconst myers_32 = (a, b) => {\n  const n = a.length;\n  const m = b.length;\n  const lst = 1 << (n - 1);\n  let pv = -1;\n  let mv = 0;\n  let sc = n;\n  let i = n;\n  while (i--) {\n    peq[a.charCodeAt(i)] |= 1 << i;\n  }\n  for (i = 0; i < m; i++) {\n    let eq = peq[b.charCodeAt(i)];\n    const xv = eq | mv;\n    eq |= ((eq & pv) + pv) ^ pv;\n    mv |= ~(eq | pv);\n    pv &= eq;\n    if (mv & lst) {\n      sc++;\n    }\n    if (pv & lst) {\n      sc--;\n    }\n    mv = (mv << 1) | 1;\n    pv = (pv << 1) | ~(xv | mv);\n    mv &= xv;\n  }\n  i = n;\n  while (i--) {\n    peq[a.charCodeAt(i)] = 0;\n  }\n  return sc;\n};\nconst myers_x = (b, a) => {\n  const n = a.length;\n  const m = b.length;\n  const mhc = [];\n  const phc = [];\n  const hsize = Math.ceil(n / 32);\n  const vsize = Math.ceil(m / 32);\n  for (let i = 0; i < hsize; i++) {\n    phc[i] = -1;\n    mhc[i] = 0;\n  }\n  let j = 0;\n  for (; j < vsize - 1; j++) {\n    let mv = 0;\n    let pv = -1;\n    const start = j * 32;\n    const vlen = Math.min(32, m) + start;\n    for (let k = start; k < vlen; k++) {\n      peq[b.charCodeAt(k)] |= 1 << k;\n    }\n    for (let i = 0; i < n; i++) {\n      const eq = peq[a.charCodeAt(i)];\n      const pb = (phc[(i / 32) | 0] >>> i) & 1;\n      const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n      const xv = eq | mv;\n      const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n      let ph = mv | ~(xh | pv);\n      let mh = pv & xh;\n      if ((ph >>> 31) ^ pb) {\n        phc[(i / 32) | 0] ^= 1 << i;\n      }\n      if ((mh >>> 31) ^ mb) {\n        mhc[(i / 32) | 0] ^= 1 << i;\n      }\n      ph = (ph << 1) | pb;\n      mh = (mh << 1) | mb;\n      pv = mh | ~(xv | ph);\n      mv = ph & xv;\n    }\n    for (let k = start; k < vlen; k++) {\n      peq[b.charCodeAt(k)] = 0;\n    }\n  }\n  let mv = 0;\n  let pv = -1;\n  const start = j * 32;\n  const vlen = Math.min(32, m - start) + start;\n  for (let k = start; k < vlen; k++) {\n    peq[b.charCodeAt(k)] |= 1 << k;\n  }\n  let score = m;\n  for (let i = 0; i < n; i++) {\n    const eq = peq[a.charCodeAt(i)];\n    const pb = (phc[(i / 32) | 0] >>> i) & 1;\n    const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n    const xv = eq | mv;\n    const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n    let ph = mv | ~(xh | pv);\n    let mh = pv & xh;\n    score += (ph >>> (m - 1)) & 1;\n    score -= (mh >>> (m - 1)) & 1;\n    if ((ph >>> 31) ^ pb) {\n      phc[(i / 32) | 0] ^= 1 << i;\n    }\n    if ((mh >>> 31) ^ mb) {\n      mhc[(i / 32) | 0] ^= 1 << i;\n    }\n    ph = (ph << 1) | pb;\n    mh = (mh << 1) | mb;\n    pv = mh | ~(xv | ph);\n    mv = ph & xv;\n  }\n  for (let k = start; k < vlen; k++) {\n    peq[b.charCodeAt(k)] = 0;\n  }\n  return score;\n};\nconst distance = (a, b) => {\n  if (a.length < b.length) {\n    const tmp = b;\n    b = a;\n    a = tmp;\n  }\n  if (b.length === 0) {\n    return a.length;\n  }\n  if (a.length <= 32) {\n    return myers_32(a, b);\n  }\n  return myers_x(a, b);\n};\nconst closest = (str, arr) => {\n  let min_distance = Infinity;\n  let min_index = 0;\n  for (let i = 0; i < arr.length; i++) {\n    const dist = distance(str, arr[i]);\n    if (dist < min_distance) {\n      min_distance = dist;\n      min_index = i;\n    }\n  }\n  return arr[min_index];\n};\nexport { closest, distance };\n"
  },
  {
    "path": "resources/t3Catopen/similarity.js",
    "content": "function compareTwoStrings(first, second) {\n  if ((first = first.replace(/\\s+/g, '')) === (second = second.replace(/\\s+/g, ''))) return 1;\n  if (first.length < 2 || second.length < 2) return 0;\n  var firstBigrams = new Map();\n  for (let i = 0; i < first.length - 1; i++) {\n    var bigram = first.substring(i, i + 2),\n      count = firstBigrams.has(bigram) ? firstBigrams.get(bigram) + 1 : 1;\n    firstBigrams.set(bigram, count);\n  }\n  let intersectionSize = 0;\n  for (let i = 0; i < second.length - 1; i++) {\n    const bigram = second.substring(i, i + 2),\n      count = firstBigrams.has(bigram) ? firstBigrams.get(bigram) : 0;\n    0 < count && (firstBigrams.set(bigram, count - 1), intersectionSize++);\n  }\n  return (2 * intersectionSize) / (first.length + second.length - 2);\n}\nfunction findBestMatch(mainString, targetStrings) {\n  var ratings = [];\n  let bestMatchIndex = 0;\n  for (let i = 0; i < targetStrings.length; i++) {\n    var currentTargetString = targetStrings[i],\n      currentRating = compareTwoStrings(mainString, currentTargetString);\n    (ratings.push({ target: currentTargetString, rating: currentRating }),\n      currentRating > ratings[bestMatchIndex].rating && (bestMatchIndex = i));\n  }\n  return { ratings: ratings, bestMatch: ratings[bestMatchIndex], bestMatchIndex: bestMatchIndex };\n}\nfunction lcs(str1, str2) {\n  if (!str1 || !str2) return { length: 0, sequence: '', offset: 0 };\n  for (\n    var sequence = '',\n      str1Length = str1.length,\n      str2Length = str2.length,\n      num = new Array(str1Length),\n      maxlen = 0,\n      lastSubsBegin = 0,\n      i = 0;\n    i < str1Length;\n    i++\n  ) {\n    for (var subArray = new Array(str2Length), j = 0; j < str2Length; j++) subArray[j] = 0;\n    num[i] = subArray;\n  }\n  for (var thisSubsBegin = null, i = 0; i < str1Length; i++)\n    for (j = 0; j < str2Length; j++)\n      str1[i] !== str2[j]\n        ? (num[i][j] = 0)\n        : ((num[i][j] = 0 === i || 0 === j ? 1 : 1 + num[i - 1][j - 1]),\n          num[i][j] > maxlen &&\n            ((maxlen = num[i][j]),\n            lastSubsBegin === (thisSubsBegin = i - num[i][j] + 1)\n              ? (sequence += str1[i])\n              : ((lastSubsBegin = thisSubsBegin),\n                (sequence = ''),\n                (sequence += str1.substr(lastSubsBegin, i + 1 - lastSubsBegin)))));\n  return { length: maxlen, sequence: sequence, offset: thisSubsBegin };\n}\nfunction findBestLCS(mainString, targetStrings) {\n  var results = [];\n  let bestMatchIndex = 0;\n  for (let i = 0; i < targetStrings.length; i++) {\n    var currentTargetString = targetStrings[i],\n      currentLCS = lcs(mainString, currentTargetString);\n    (results.push({ target: currentTargetString, lcs: currentLCS }),\n      currentLCS.length > results[bestMatchIndex].lcs.length && (bestMatchIndex = i));\n  }\n  return { allLCS: results, bestMatch: results[bestMatchIndex], bestMatchIndex: bestMatchIndex };\n}\nexport { compareTwoStrings, findBestMatch, findBestLCS };\n"
  },
  {
    "path": "resources/t3Catopen/sortName.js",
    "content": "var strChineseFirstPY =\n  'YDYQSXMWZSSXJBYMGCCZQPSSQBYCDSCDQLDYLYBSSJGYZZJJFKCCLZDHWDWZJLJPFYYNWJJTMYHZWZHFLZPPQHGSCYYYNJQYXXGJHHSDSJNKKTMOMLCRXYPSNQSECCQZGGLLYJLMYZZSECYKYYHQWJSSGGYXYZYJWWKDJHYCHMYXJTLXJYQBYXZLDWRDJRWYSRLDZJPCBZJJBRCFTLECZSTZFXXZHTRQHYBDLYCZSSYMMRFMYQZPWWJJYFCRWFDFZQPYDDWYXKYJAWJFFXYPSFTZYHHYZYSWCJYXSCLCXXWZZXNBGNNXBXLZSZSBSGPYSYZDHMDZBQBZCWDZZYYTZHBTSYYBZGNTNXQYWQSKBPHHLXGYBFMJEBJHHGQTJCYSXSTKZHLYCKGLYSMZXYALMELDCCXGZYRJXSDLTYZCQKCNNJWHJTZZCQLJSTSTBNXBTYXCEQXGKWJYFLZQLYHYXSPSFXLMPBYSXXXYDJCZYLLLSJXFHJXPJBTFFYABYXBHZZBJYZLWLCZGGBTSSMDTJZXPTHYQTGLJSCQFZKJZJQNLZWLSLHDZBWJNCJZYZSQQYCQYRZCJJWYBRTWPYFTWEXCSKDZCTBZHYZZYYJXZCFFZZMJYXXSDZZOTTBZLQWFCKSZSXFYRLNYJMBDTHJXSQQCCSBXYYTSYFBXDZTGBCNSLCYZZPSAZYZZSCJCSHZQYDXLBPJLLMQXTYDZXSQJTZPXLCGLQTZWJBHCTSYJSFXYEJJTLBGXSXJMYJQQPFZASYJNTYDJXKJCDJSZCBARTDCLYJQMWNQNCLLLKBYBZZSYHQQLTWLCCXTXLLZNTYLNEWYZYXCZXXGRKRMTCNDNJTSYYSSDQDGHSDBJGHRWRQLYBGLXHLGTGXBQJDZPYJSJYJCTMRNYMGRZJCZGJMZMGXMPRYXKJNYMSGMZJYMKMFXMLDTGFBHCJHKYLPFMDXLQJJSMTQGZSJLQDLDGJYCALCMZCSDJLLNXDJFFFFJCZFMZFFPFKHKGDPSXKTACJDHHZDDCRRCFQYJKQCCWJDXHWJLYLLZGCFCQDSMLZPBJJPLSBCJGGDCKKDEZSQCCKJGCGKDJTJDLZYCXKLQSCGJCLTFPCQCZGWPJDQYZJJBYJHSJDZWGFSJGZKQCCZLLPSPKJGQJHZZLJPLGJGJJTHJJYJZCZMLZLYQBGJWMLJKXZDZNJQSYZMLJLLJKYWXMKJLHSKJGBMCLYYMKXJQLBMLLKMDXXKWYXYSLMLPSJQQJQXYXFJTJDXMXXLLCXQBSYJBGWYMBGGBCYXPJYGPEPFGDJGBHBNSQJYZJKJKHXQFGQZKFHYGKHDKLLSDJQXPQYKYBNQSXQNSZSWHBSXWHXWBZZXDMNSJBSBKBBZKLYLXGWXDRWYQZMYWSJQLCJXXJXKJEQXSCYETLZHLYYYSDZPAQYZCMTLSHTZCFYZYXYLJSDCJQAGYSLCQLYYYSHMRQQKLDXZSCSSSYDYCJYSFSJBFRSSZQSBXXPXJYSDRCKGJLGDKZJZBDKTCSYQPYHSTCLDJDHMXMCGXYZHJDDTMHLTXZXYLYMOHYJCLTYFBQQXPFBDFHHTKSQHZYYWCNXXCRWHOWGYJLEGWDQCWGFJYCSNTMYTOLBYGWQWESJPWNMLRYDZSZTXYQPZGCWXHNGPYXSHMYQJXZTDPPBFYHZHTJYFDZWKGKZBLDNTSXHQEEGZZYLZMMZYJZGXZXKHKSTXNXXWYLYAPSTHXDWHZYMPXAGKYDXBHNHXKDPJNMYHYLPMGOCSLNZHKXXLPZZLBMLSFBHHGYGYYGGBHSCYAQTYWLXTZQCEZYDQDQMMHTKLLSZHLSJZWFYHQSWSCWLQAZYNYTLSXTHAZNKZZSZZLAXXZWWCTGQQTDDYZTCCHYQZFLXPSLZYGPZSZNGLNDQTBDLXGTCTAJDKYWNSYZLJHHZZCWNYYZYWMHYCHHYXHJKZWSXHZYXLYSKQYSPSLYZWMYPPKBYGLKZHTYXAXQSYSHXASMCHKDSCRSWJPWXSGZJLWWSCHSJHSQNHCSEGNDAQTBAALZZMSSTDQJCJKTSCJAXPLGGXHHGXXZCXPDMMHLDGTYBYSJMXHMRCPXXJZCKZXSHMLQXXTTHXWZFKHCCZDYTCJYXQHLXDHYPJQXYLSYYDZOZJNYXQEZYSQYAYXWYPDGXDDXSPPYZNDLTWRHXYDXZZJHTCXMCZLHPYYYYMHZLLHNXMYLLLMDCPPXHMXDKYCYRDLTXJCHHZZXZLCCLYLNZSHZJZZLNNRLWHYQSNJHXYNTTTKYJPYCHHYEGKCTTWLGQRLGGTGTYGYHPYHYLQYQGCWYQKPYYYTTTTLHYHLLTYTTSPLKYZXGZWGPYDSSZZDQXSKCQNMJJZZBXYQMJRTFFBTKHZKBXLJJKDXJTLBWFZPPTKQTZTGPDGNTPJYFALQMKGXBDCLZFHZCLLLLADPMXDJHLCCLGYHDZFGYDDGCYYFGYDXKSSEBDHYKDKDKHNAXXYBPBYYHXZQGAFFQYJXDMLJCSQZLLPCHBSXGJYNDYBYQSPZWJLZKSDDTACTBXZDYZYPJZQSJNKKTKNJDJGYYPGTLFYQKASDNTCYHBLWDZHBBYDWJRYGKZYHEYYFJMSDTYFZJJHGCXPLXHLDWXXJKYTCYKSSSMTWCTTQZLPBSZDZWZXGZAGYKTYWXLHLSPBCLLOQMMZSSLCMBJCSZZKYDCZJGQQDSMCYTZQQLWZQZXSSFPTTFQMDDZDSHDTDWFHTDYZJYQJQKYPBDJYYXTLJHDRQXXXHAYDHRJLKLYTWHLLRLLRCXYLBWSRSZZSYMKZZHHKYHXKSMDSYDYCJPBZBSQLFCXXXNXKXWYWSDZYQOGGQMMYHCDZTTFJYYBGSTTTYBYKJDHKYXBELHTYPJQNFXFDYKZHQKZBYJTZBXHFDXKDASWTAWAJLDYJSFHBLDNNTNQJTJNCHXFJSRFWHZFMDRYJYJWZPDJKZYJYMPCYZNYNXFBYTFYFWYGDBNZZZDNYTXZEMMQBSQEHXFZMBMFLZZSRXYMJGSXWZJSPRYDJSJGXHJJGLJJYNZZJXHGXKYMLPYYYCXYTWQZSWHWLYRJLPXSLSXMFSWWKLCTNXNYNPSJSZHDZEPTXMYYWXYYSYWLXJQZQXZDCLEEELMCPJPCLWBXSQHFWWTFFJTNQJHJQDXHWLBYZNFJLALKYYJLDXHHYCSTYYWNRJYXYWTRMDRQHWQCMFJDYZMHMYYXJWMYZQZXTLMRSPWWCHAQBXYGZYPXYYRRCLMPYMGKSJSZYSRMYJSNXTPLNBAPPYPYLXYYZKYNLDZYJZCZNNLMZHHARQMPGWQTZMXXMLLHGDZXYHXKYXYCJMFFYYHJFSBSSQLXXNDYCANNMTCJCYPRRNYTYQNYYMBMSXNDLYLYSLJRLXYSXQMLLYZLZJJJKYZZCSFBZXXMSTBJGNXYZHLXNMCWSCYZYFZLXBRNNNYLBNRTGZQYSATSWRYHYJZMZDHZGZDWYBSSCSKXSYHYTXXGCQGXZZSHYXJSCRHMKKBXCZJYJYMKQHZJFNBHMQHYSNJNZYBKNQMCLGQHWLZNZSWXKHLJHYYBQLBFCDSXDLDSPFZPSKJYZWZXZDDXJSMMEGJSCSSMGCLXXKYYYLNYPWWWGYDKZJGGGZGGSYCKNJWNJPCXBJJTQTJWDSSPJXZXNZXUMELPXFSXTLLXCLJXJJLJZXCTPSWXLYDHLYQRWHSYCSQYYBYAYWJJJQFWQCQQCJQGXALDBZZYJGKGXPLTZYFXJLTPADKYQHPMATLCPDCKBMTXYBHKLENXDLEEGQDYMSAWHZMLJTWYGXLYQZLJEEYYBQQFFNLYXRDSCTGJGXYYNKLLYQKCCTLHJLQMKKZGCYYGLLLJDZGYDHZWXPYSJBZKDZGYZZHYWYFQYTYZSZYEZZLYMHJJHTSMQWYZLKYYWZCSRKQYTLTDXWCTYJKLWSQZWBDCQYNCJSRSZJLKCDCDTLZZZACQQZZDDXYPLXZBQJYLZLLLQDDZQJYJYJZYXNYYYNYJXKXDAZWYRDLJYYYRJLXLLDYXJCYWYWNQCCLDDNYYYNYCKCZHXXCCLGZQJGKWPPCQQJYSBZZXYJSQPXJPZBSBDSFNSFPZXHDWZTDWPPTFLZZBZDMYYPQJRSDZSQZSQXBDGCPZSWDWCSQZGMDHZXMWWFYBPDGPHTMJTHZSMMBGZMBZJCFZWFZBBZMQCFMBDMCJXLGPNJBBXGYHYYJGPTZGZMQBQTCGYXJXLWZKYDPDYMGCFTPFXYZTZXDZXTGKMTYBBCLBJASKYTSSQYYMSZXFJEWLXLLSZBQJJJAKLYLXLYCCTSXMCWFKKKBSXLLLLJYXTYLTJYYTDPJHNHNNKBYQNFQYYZBYYESSESSGDYHFHWTCJBSDZZTFDMXHCNJZYMQWSRYJDZJQPDQBBSTJGGFBKJBXTGQHNGWJXJGDLLTHZHHYYYYYYSXWTYYYCCBDBPYPZYCCZYJPZYWCBDLFWZCWJDXXHYHLHWZZXJTCZLCDPXUJCZZZLYXJJTXPHFXWPYWXZPTDZZBDZCYHJHMLXBQXSBYLRDTGJRRCTTTHYTCZWMXFYTWWZCWJWXJYWCSKYBZSCCTZQNHXNWXXKHKFHTSWOCCJYBCMPZZYKBNNZPBZHHZDLSYDDYTYFJPXYNGFXBYQXCBHXCPSXTYZDMKYSNXSXLHKMZXLYHDHKWHXXSSKQYHHCJYXGLHZXCSNHEKDTGZXQYPKDHEXTYKCNYMYYYPKQYYYKXZLTHJQTBYQHXBMYHSQCKWWYLLHCYYLNNEQXQWMCFBDCCMLJGGXDQKTLXKGNQCDGZJWYJJLYHHQTTTNWCHMXCXWHWSZJYDJCCDBQCDGDNYXZTHCQRXCBHZTQCBXWGQWYYBXHMBYMYQTYEXMQKYAQYRGYZSLFYKKQHYSSQYSHJGJCNXKZYCXSBXYXHYYLSTYCXQTHYSMGSCPMMGCCCCCMTZTASMGQZJHKLOSQYLSWTMXSYQKDZLJQQYPLSYCZTCQQPBBQJZCLPKHQZYYXXDTDDTSJCXFFLLCHQXMJLWCJCXTSPYCXNDTJSHJWXDQQJSKXYAMYLSJHMLALYKXCYYDMNMDQMXMCZNNCYBZKKYFLMCHCMLHXRCJJHSYLNMTJZGZGYWJXSRXCWJGJQHQZDQJDCJJZKJKGDZQGJJYJYLXZXXCDQHHHEYTMHLFSBDJSYYSHFYSTCZQLPBDRFRZTZYKYWHSZYQKWDQZRKMSYNBCRXQBJYFAZPZZEDZCJYWBCJWHYJBQSZYWRYSZPTDKZPFPBNZTKLQYHBBZPNPPTYZZYBQNYDCPJMMCYCQMCYFZZDCMNLFPBPLNGQJTBTTNJZPZBBZNJKLJQYLNBZQHKSJZNGGQSZZKYXSHPZSNBCGZKDDZQANZHJKDRTLZLSWJLJZLYWTJNDJZJHXYAYNCBGTZCSSQMNJPJYTYSWXZFKWJQTKHTZPLBHSNJZSYZBWZZZZLSYLSBJHDWWQPSLMMFBJDWAQYZTCJTBNNWZXQXCDSLQGDSDPDZHJTQQPSWLYYJZLGYXYZLCTCBJTKTYCZJTQKBSJLGMGZDMCSGPYNJZYQYYKNXRPWSZXMTNCSZZYXYBYHYZAXYWQCJTLLCKJJTJHGDXDXYQYZZBYWDLWQCGLZGJGQRQZCZSSBCRPCSKYDZNXJSQGXSSJMYDNSTZTPBDLTKZWXQWQTZEXNQCZGWEZKSSBYBRTSSSLCCGBPSZQSZLCCGLLLZXHZQTHCZMQGYZQZNMCOCSZJMMZSQPJYGQLJYJPPLDXRGZYXCCSXHSHGTZNLZWZKJCXTCFCJXLBMQBCZZWPQDNHXLJCTHYZLGYLNLSZZPCXDSCQQHJQKSXZPBAJYEMSMJTZDXLCJYRYYNWJBNGZZTMJXLTBSLYRZPYLSSCNXPHLLHYLLQQZQLXYMRSYCXZLMMCZLTZSDWTJJLLNZGGQXPFSKYGYGHBFZPDKMWGHCXMSGDXJMCJZDYCABXJDLNBCDQYGSKYDQTXDJJYXMSZQAZDZFSLQXYJSJZYLBTXXWXQQZBJZUFBBLYLWDSLJHXJYZJWTDJCZFQZQZZDZSXZZQLZCDZFJHYSPYMPQZMLPPLFFXJJNZZYLSJEYQZFPFZKSYWJJJHRDJZZXTXXGLGHYDXCSKYSWMMZCWYBAZBJKSHFHJCXMHFQHYXXYZFTSJYZFXYXPZLCHMZMBXHZZSXYFYMNCWDABAZLXKTCSHHXKXJJZJSTHYGXSXYYHHHJWXKZXSSBZZWHHHCWTZZZPJXSNXQQJGZYZYWLLCWXZFXXYXYHXMKYYSWSQMNLNAYCYSPMJKHWCQHYLAJJMZXHMMCNZHBHXCLXTJPLTXYJHDYYLTTXFSZHYXXSJBJYAYRSMXYPLCKDUYHLXRLNLLSTYZYYQYGYHHSCCSMZCTZQXKYQFPYYRPFFLKQUNTSZLLZMWWTCQQYZWTLLMLMPWMBZSSTZRBPDDTLQJJBXZCSRZQQYGWCSXFWZLXCCRSZDZMCYGGDZQSGTJSWLJMYMMZYHFBJDGYXCCPSHXNZCSBSJYJGJMPPWAFFYFNXHYZXZYLREMZGZCYZSSZDLLJCSQFNXZKPTXZGXJJGFMYYYSNBTYLBNLHPFZDCYFBMGQRRSSSZXYSGTZRNYDZZCDGPJAFJFZKNZBLCZSZPSGCYCJSZLMLRSZBZZLDLSLLYSXSQZQLYXZLSKKBRXBRBZCYCXZZZEEYFGKLZLYYHGZSGZLFJHGTGWKRAAJYZKZQTSSHJJXDCYZUYJLZYRZDQQHGJZXSSZBYKJPBFRTJXLLFQWJHYLQTYMBLPZDXTZYGBDHZZRBGXHWNJTJXLKSCFSMWLSDQYSJTXKZSCFWJLBXFTZLLJZLLQBLSQMQQCGCZFPBPHZCZJLPYYGGDTGWDCFCZQYYYQYSSCLXZSKLZZZGFFCQNWGLHQYZJJCZLQZZYJPJZZBPDCCMHJGXDQDGDLZQMFGPSYTSDYFWWDJZJYSXYYCZCYHZWPBYKXRYLYBHKJKSFXTZJMMCKHLLTNYYMSYXYZPYJQYCSYCWMTJJKQYRHLLQXPSGTLYYCLJSCPXJYZFNMLRGJJTYZBXYZMSJYJHHFZQMSYXRSZCWTLRTQZSSTKXGQKGSPTGCZNJSJCQCXHMXGGZTQYDJKZDLBZSXJLHYQGGGTHQSZPYHJHHGYYGKGGCWJZZYLCZLXQSFTGZSLLLMLJSKCTBLLZZSZMMNYTPZSXQHJCJYQXYZXZQZCPSHKZZYSXCDFGMWQRLLQXRFZTLYSTCTMJCXJJXHJNXTNRZTZFQYHQGLLGCXSZSJDJLJCYDSJTLNYXHSZXCGJZYQPYLFHDJSBPCCZHJJJQZJQDYBSSLLCMYTTMQTBHJQNNYGKYRQYQMZGCJKPDCGMYZHQLLSLLCLMHOLZGDYYFZSLJCQZLYLZQJESHNYLLJXGJXLYSYYYXNBZLJSSZCQQCJYLLZLTJYLLZLLBNYLGQCHXYYXOXCXQKYJXXXYKLXSXXYQXCYKQXQCSGYXXYQXYGYTQOHXHXPYXXXULCYEYCHZZCBWQBBWJQZSCSZSSLZYLKDESJZWMYMCYTSDSXXSCJPQQSQYLYYZYCMDJDZYWCBTJSYDJKCYDDJLBDJJSODZYSYXQQYXDHHGQQYQHDYXWGMMMAJDYBBBPPBCMUUPLJZSMTXERXJMHQNUTPJDCBSSMSSSTKJTSSMMTRCPLZSZMLQDSDMJMQPNQDXCFYNBFSDQXYXHYAYKQYDDLQYYYSSZBYDSLNTFQTZQPZMCHDHCZCWFDXTMYQSPHQYYXSRGJCWTJTZZQMGWJJTJHTQJBBHWZPXXHYQFXXQYWYYHYSCDYDHHQMNMTMWCPBSZPPZZGLMZFOLLCFWHMMSJZTTDHZZYFFYTZZGZYSKYJXQYJZQBHMBZZLYGHGFMSHPZFZSNCLPBQSNJXZSLXXFPMTYJYGBXLLDLXPZJYZJYHHZCYWHJYLSJEXFSZZYWXKZJLUYDTMLYMQJPWXYHXSKTQJEZRPXXZHHMHWQPWQLYJJQJJZSZCPHJLCHHNXJLQWZJHBMZYXBDHHYPZLHLHLGFWLCHYYTLHJXCJMSCPXSTKPNHQXSRTYXXTESYJCTLSSLSTDLLLWWYHDHRJZSFGXTSYCZYNYHTDHWJSLHTZDQDJZXXQHGYLTZPHCSQFCLNJTCLZPFSTPDYNYLGMJLLYCQHYSSHCHYLHQYQTMZYPBYWRFQYKQSYSLZDQJMPXYYSSRHZJNYWTQDFZBWWTWWRXCWHGYHXMKMYYYQMSMZHNGCEPMLQQMTCWCTMMPXJPJJHFXYYZSXZHTYBMSTSYJTTQQQYYLHYNPYQZLCYZHZWSMYLKFJXLWGXYPJYTYSYXYMZCKTTWLKSMZSYLMPWLZWXWQZSSAQSYXYRHSSNTSRAPXCPWCMGDXHXZDZYFJHGZTTSBJHGYZSZYSMYCLLLXBTYXHBBZJKSSDMALXHYCFYGMQYPJYCQXJLLLJGSLZGQLYCJCCZOTYXMTMTTLLWTGPXYMZMKLPSZZZXHKQYSXCTYJZYHXSHYXZKXLZWPSQPYHJWPJPWXQQYLXSDHMRSLZZYZWTTCYXYSZZSHBSCCSTPLWSSCJCHNLCGCHSSPHYLHFHHXJSXYLLNYLSZDHZXYLSXLWZYKCLDYAXZCMDDYSPJTQJZLNWQPSSSWCTSTSZLBLNXSMNYYMJQBQHRZWTYYDCHQLXKPZWBGQYBKFCMZWPZLLYYLSZYDWHXPSBCMLJBSCGBHXLQHYRLJXYSWXWXZSLDFHLSLYNJLZYFLYJYCDRJLFSYZFSLLCQYQFGJYHYXZLYLMSTDJCYHBZLLNWLXXYGYYHSMGDHXXHHLZZJZXCZZZCYQZFNGWPYLCPKPYYPMCLQKDGXZGGWQBDXZZKZFBXXLZXJTPJPTTBYTSZZDWSLCHZHSLTYXHQLHYXXXYYZYSWTXZKHLXZXZPYHGCHKCFSYHUTJRLXFJXPTZTWHPLYXFCRHXSHXKYXXYHZQDXQWULHYHMJTBFLKHTXCWHJFWJCFPQRYQXCYYYQYGRPYWSGSUNGWCHKZDXYFLXXHJJBYZWTSXXNCYJJYMSWZJQRMHXZWFQSYLZJZGBHYNSLBGTTCSYBYXXWXYHXYYXNSQYXMQYWRGYQLXBBZLJSYLPSYTJZYHYZAWLRORJMKSCZJXXXYXCHDYXRYXXJDTSQFXLYLTSFFYXLMTYJMJUYYYXLTZCSXQZQHZXLYYXZHDNBRXXXJCTYHLBRLMBRLLAXKYLLLJLYXXLYCRYLCJTGJCMTLZLLCYZZPZPCYAWHJJFYBDYYZSMPCKZDQYQPBPCJPDCYZMDPBCYYDYCNNPLMTMLRMFMMGWYZBSJGYGSMZQQQZTXMKQWGXLLPJGZBQCDJJJFPKJKCXBLJMSWMDTQJXLDLPPBXCWRCQFBFQJCZAHZGMYKPHYYHZYKNDKZMBPJYXPXYHLFPNYYGXJDBKXNXHJMZJXSTRSTLDXSKZYSYBZXJLXYSLBZYSLHXJPFXPQNBYLLJQKYGZMCYZZYMCCSLCLHZFWFWYXZMWSXTYNXJHPYYMCYSPMHYSMYDYSHQYZCHMJJMZCAAGCFJBBHPLYZYLXXSDJGXDHKXXTXXNBHRMLYJSLTXMRHNLXQJXYZLLYSWQGDLBJHDCGJYQYCMHWFMJYBMBYJYJWYMDPWHXQLDYGPDFXXBCGJSPCKRSSYZJMSLBZZJFLJJJLGXZGYXYXLSZQYXBEXYXHGCXBPLDYHWETTWWCJMBTXCHXYQXLLXFLYXLLJLSSFWDPZSMYJCLMWYTCZPCHQEKCQBWLCQYDPLQPPQZQFJQDJHYMMCXTXDRMJWRHXCJZYLQXDYYNHYYHRSLSRSYWWZJYMTLTLLGTQCJZYABTCKZCJYCCQLJZQXALMZYHYWLWDXZXQDLLQSHGPJFJLJHJABCQZDJGTKHSSTCYJLPSWZLXZXRWGLDLZRLZXTGSLLLLZLYXXWGDZYGBDPHZPBRLWSXQBPFDWOFMWHLYPCBJCCLDMBZPBZZLCYQXLDOMZBLZWPDWYYGDSTTHCSQSCCRSSSYSLFYBFNTYJSZDFNDPDHDZZMBBLSLCMYFFGTJJQWFTMTPJWFNLBZCMMJTGBDZLQLPYFHYYMJYLSDCHDZJWJCCTLJCLDTLJJCPDDSQDSSZYBNDBJLGGJZXSXNLYCYBJXQYCBYLZCFZPPGKCXZDZFZTJJFJSJXZBNZYJQTTYJYHTYCZHYMDJXTTMPXSPLZCDWSLSHXYPZGTFMLCJTYCBPMGDKWYCYZCDSZZYHFLYCTYGWHKJYYLSJCXGYWJCBLLCSNDDBTZBSCLYZCZZSSQDLLMQYYHFSLQLLXFTYHABXGWNYWYYPLLSDLDLLBJCYXJZMLHLJDXYYQYTDLLLBUGBFDFBBQJZZMDPJHGCLGMJJPGAEHHBWCQXAXHHHZCHXYPHJAXHLPHJPGPZJQCQZGJJZZUZDMQYYBZZPHYHYBWHAZYJHYKFGDPFQSDLZMLJXKXGALXZDAGLMDGXMWZQYXXDXXPFDMMSSYMPFMDMMKXKSYZYSHDZKXSYSMMZZZMSYDNZZCZXFPLSTMZDNMXCKJMZTYYMZMZZMSXHHDCZJEMXXKLJSTLWLSQLYJZLLZJSSDPPMHNLZJCZYHMXXHGZCJMDHXTKGRMXFWMCGMWKDTKSXQMMMFZZYDKMSCLCMPCGMHSPXQPZDSSLCXKYXTWLWJYAHZJGZQMCSNXYYMMPMLKJXMHLMLQMXCTKZMJQYSZJSYSZHSYJZJCDAJZYBSDQJZGWZQQXFKDMSDJLFWEHKZQKJPEYPZYSZCDWYJFFMZZYLTTDZZEFMZLBNPPLPLPEPSZALLTYLKCKQZKGENQLWAGYXYDPXLHSXQQWQCQXQCLHYXXMLYCCWLYMQYSKGCHLCJNSZKPYZKCQZQLJPDMDZHLASXLBYDWQLWDNBQCRYDDZTJYBKBWSZDXDTNPJDTCTQDFXQQMGNXECLTTBKPWSLCTYQLPWYZZKLPYGZCQQPLLKCCYLPQMZCZQCLJSLQZDJXLDDHPZQDLJJXZQDXYZQKZLJCYQDYJPPYPQYKJYRMPCBYMCXKLLZLLFQPYLLLMBSGLCYSSLRSYSQTMXYXZQZFDZUYSYZTFFMZZSMZQHZSSCCMLYXWTPZGXZJGZGSJSGKDDHTQGGZLLBJDZLCBCHYXYZHZFYWXYZYMSDBZZYJGTSMTFXQYXQSTDGSLNXDLRYZZLRYYLXQHTXSRTZNGZXBNQQZFMYKMZJBZYMKBPNLYZPBLMCNQYZZZSJZHJCTZKHYZZJRDYZHNPXGLFZTLKGJTCTSSYLLGZRZBBQZZKLPKLCZYSSUYXBJFPNJZZXCDWXZYJXZZDJJKGGRSRJKMSMZJLSJYWQSKYHQJSXPJZZZLSNSHRNYPZTWCHKLPSRZLZXYJQXQKYSJYCZTLQZYBBYBWZPQDWWYZCYTJCJXCKCWDKKZXSGKDZXWWYYJQYYTCYTDLLXWKCZKKLCCLZCQQDZLQLCSFQCHQHSFSMQZZLNBJJZBSJHTSZDYSJQJPDLZCDCWJKJZZLPYCGMZWDJJBSJQZSYZYHHXJPBJYDSSXDZNCGLQMBTSFSBPDZDLZNFGFJGFSMPXJQLMBLGQCYYXBQKDJJQYRFKZTJDHCZKLBSDZCFJTPLLJGXHYXZCSSZZXSTJYGKGCKGYOQXJPLZPBPGTGYJZGHZQZZLBJLSQFZGKQQJZGYCZBZQTLDXRJXBSXXPZXHYZYCLWDXJJHXMFDZPFZHQHQMQGKSLYHTYCGFRZGNQXCLPDLBZCSCZQLLJBLHBZCYPZZPPDYMZZSGYHCKCPZJGSLJLNSCDSLDLXBMSTLDDFJMKDJDHZLZXLSZQPQPGJLLYBDSZGQLBZLSLKYYHZTTNTJYQTZZPSZQZTLLJTYYLLQLLQYZQLBDZLSLYYZYMDFSZSNHLXZNCZQZPBWSKRFBSYZMTHBLGJPMCZZLSTLXSHTCSYZLZBLFEQHLXFLCJLYLJQCBZLZJHHSSTBRMHXZHJZCLXFNBGXGTQJCZTMSFZKJMSSNXLJKBHSJXNTNLZDNTLMSJXGZJYJCZXYJYJWRWWQNZTNFJSZPZSHZJFYRDJSFSZJZBJFZQZZHZLXFYSBZQLZSGYFTZDCSZXZJBQMSZKJRHYJZCKMJKHCHGTXKXQGLXPXFXTRTYLXJXHDTSJXHJZJXZWZLCQSBTXWXGXTXXHXFTSDKFJHZYJFJXRZSDLLLTQSQQZQWZXSYQTWGWBZCGZLLYZBCLMQQTZHZXZXLJFRMYZFLXYSQXXJKXRMQDZDMMYYBSQBHGZMWFWXGMXLZPYYTGZYCCDXYZXYWGSYJYZNBHPZJSQSYXSXRTFYZGRHZTXSZZTHCBFCLSYXZLZQMZLMPLMXZJXSFLBYZMYQHXJSXRXSQZZZSSLYFRCZJRCRXHHZXQYDYHXSJJHZCXZBTYNSYSXJBQLPXZQPYMLXZKYXLXCJLCYSXXZZLXDLLLJJYHZXGYJWKJRWYHCPSGNRZLFZWFZZNSXGXFLZSXZZZBFCSYJDBRJKRDHHGXJLJJTGXJXXSTJTJXLYXQFCSGSWMSBCTLQZZWLZZKXJMLTMJYHSDDBXGZHDLBMYJFRZFSGCLYJBPMLYSMSXLSZJQQHJZFXGFQFQBPXZGYYQXGZTCQWYLTLGWSGWHRLFSFGZJMGMGBGTJFSYZZGZYZAFLSSPMLPFLCWBJZCLJJMZLPJJLYMQDMYYYFBGYGYZMLYZDXQYXRQQQHSYYYQXYLJTYXFSFSLLGNQCYHYCWFHCCCFXPYLYPLLZYXXXXXKQHHXSHJZCFZSCZJXCPZWHHHHHAPYLQALPQAFYHXDYLUKMZQGGGDDESRNNZLTZGCHYPPYSQJJHCLLJTOLNJPZLJLHYMHEYDYDSQYCDDHGZUNDZCLZYZLLZNTNYZGSLHSLPJJBDGWXPCDUTJCKLKCLWKLLCASSTKZZDNQNTTLYYZSSYSSZZRYLJQKCQDHHCRXRZYDGRGCWCGZQFFFPPJFZYNAKRGYWYQPQXXFKJTSZZXSWZDDFBBXTBGTZKZNPZZPZXZPJSZBMQHKCYXYLDKLJNYPKYGHGDZJXXEAHPNZKZTZCMXCXMMJXNKSZQNMNLWBWWXJKYHCPSTMCSQTZJYXTPCTPDTNNPGLLLZSJLSPBLPLQHDTNJNLYYRSZFFJFQWDPHZDWMRZCCLODAXNSSNYZRESTYJWJYJDBCFXNMWTTBYLWSTSZGYBLJPXGLBOCLHPCBJLTMXZLJYLZXCLTPNCLCKXTPZJSWCYXSFYSZDKNTLBYJCYJLLSTGQCBXRYZXBXKLYLHZLQZLNZCXWJZLJZJNCJHXMNZZGJZZXTZJXYCYYCXXJYYXJJXSSSJSTSSTTPPGQTCSXWZDCSYFPTFBFHFBBLZJCLZZDBXGCXLQPXKFZFLSYLTUWBMQJHSZBMDDBCYSCCLDXYCDDQLYJJWMQLLCSGLJJSYFPYYCCYLTJANTJJPWYCMMGQYYSXDXQMZHSZXPFTWWZQSWQRFKJLZJQQYFBRXJHHFWJJZYQAZMYFRHCYYBYQWLPEXCCZSTYRLTTDMQLYKMBBGMYYJPRKZNPBSXYXBHYZDJDNGHPMFSGMWFZMFQMMBCMZZCJJLCNUXYQLMLRYGQZCYXZLWJGCJCGGMCJNFYZZJHYCPRRCMTZQZXHFQGTJXCCJEAQCRJYHPLQLSZDJRBCQHQDYRHYLYXJSYMHZYDWLDFRYHBPYDTSSCNWBXGLPZMLZZTQSSCPJMXXYCSJYTYCGHYCJWYRXXLFEMWJNMKLLSWTXHYYYNCMMCWJDQDJZGLLJWJRKHPZGGFLCCSCZMCBLTBHBQJXQDSPDJZZGKGLFQYWBZYZJLTSTDHQHCTCBCHFLQMPWDSHYYTQWCNZZJTLBYMBPDYYYXSQKXWYYFLXXNCWCXYPMAELYKKJMZZZBRXYYQJFLJPFHHHYTZZXSGQQMHSPGDZQWBWPJHZJDYSCQWZKTXXSQLZYYMYSDZGRXCKKUJLWPYSYSCSYZLRMLQSYLJXBCXTLWDQZPCYCYKPPPNSXFYZJJRCEMHSZMSXLXGLRWGCSTLRSXBZGBZGZTCPLUJLSLYLYMTXMTZPALZXPXJTJWTCYYZLBLXBZLQMYLXPGHDSLSSDMXMBDZZSXWHAMLCZCPJMCNHJYSNSYGCHSKQMZZQDLLKABLWJXSFMOCDXJRRLYQZKJMYBYQLYHETFJZFRFKSRYXFJTWDSXXSYSQJYSLYXWJHSNLXYYXHBHAWHHJZXWMYLJCSSLKYDZTXBZSYFDXGXZJKHSXXYBSSXDPYNZWRPTQZCZENYGCXQFJYKJBZMLJCMQQXUOXSLYXXLYLLJDZBTYMHPFSTTQQWLHOKYBLZZALZXQLHZWRRQHLSTMYPYXJJXMQSJFNBXYXYJXXYQYLTHYLQYFMLKLJTMLLHSZWKZHLJMLHLJKLJSTLQXYLMBHHLNLZXQJHXCFXXLHYHJJGBYZZKBXSCQDJQDSUJZYYHZHHMGSXCSYMXFEBCQWWRBPYYJQTYZCYQYQQZYHMWFFHGZFRJFCDPXNTQYZPDYKHJLFRZXPPXZDBBGZQSTLGDGYLCQMLCHHMFYWLZYXKJLYPQHSYWMQQGQZMLZJNSQXJQSYJYCBEHSXFSZPXZWFLLBCYYJDYTDTHWZSFJMQQYJLMQXXLLDTTKHHYBFPWTYYSQQWNQWLGWDEBZWCMYGCULKJXTMXMYJSXHYBRWFYMWFRXYQMXYSZTZZTFYKMLDHQDXWYYNLCRYJBLPSXCXYWLSPRRJWXHQYPHTYDNXHHMMYWYTZCSQMTSSCCDALWZTCPQPYJLLQZYJSWXMZZMMYLMXCLMXCZMXMZSQTZPPQQBLPGXQZHFLJJHYTJSRXWZXSCCDLXTYJDCQJXSLQYCLZXLZZXMXQRJMHRHZJBHMFLJLMLCLQNLDXZLLLPYPSYJYSXCQQDCMQJZZXHNPNXZMEKMXHYKYQLXSXTXJYYHWDCWDZHQYYBGYBCYSCFGPSJNZDYZZJZXRZRQJJYMCANYRJTLDPPYZBSTJKXXZYPFDWFGZZRPYMTNGXZQBYXNBUFNQKRJQZMJEGRZGYCLKXZDSKKNSXKCLJSPJYYZLQQJYBZSSQLLLKJXTBKTYLCCDDBLSPPFYLGYDTZJYQGGKQTTFZXBDKTYYHYBBFYTYYBCLPDYTGDHRYRNJSPTCSNYJQHKLLLZSLYDXXWBCJQSPXBPJZJCJDZFFXXBRMLAZHCSNDLBJDSZBLPRZTSWSBXBCLLXXLZDJZSJPYLYXXYFTFFFBHJJXGBYXJPMMMPSSJZJMTLYZJXSWXTYLEDQPJMYGQZJGDJLQJWJQLLSJGJGYGMSCLJJXDTYGJQJQJCJZCJGDZZSXQGSJGGCXHQXSNQLZZBXHSGZXCXYLJXYXYYDFQQJHJFXDHCTXJYRXYSQTJXYEFYYSSYYJXNCYZXFXMSYSZXYYSCHSHXZZZGZZZGFJDLTYLNPZGYJYZYYQZPBXQBDZTZCZYXXYHHSQXSHDHGQHJHGYWSZTMZMLHYXGEBTYLZKQWYTJZRCLEKYSTDBCYKQQSAYXCJXWWGSBHJYZYDHCSJKQCXSWXFLTYNYZPZCCZJQTZWJQDZZZQZLJJXLSBHPYXXPSXSHHEZTXFPTLQYZZXHYTXNCFZYYHXGNXMYWXTZSJPTHHGYMXMXQZXTSBCZYJYXXTYYZYPCQLMMSZMJZZLLZXGXZAAJZYXJMZXWDXZSXZDZXLEYJJZQBHZWZZZQTZPSXZTDSXJJJZNYAZPHXYYSRNQDTHZHYYKYJHDZXZLSWCLYBZYECWCYCRYLCXNHZYDZYDYJDFRJJHTRSQTXYXJRJHOJYNXELXSFSFJZGHPZSXZSZDZCQZBYYKLSGSJHCZSHDGQGXYZGXCHXZJWYQWGYHKSSEQZZNDZFKWYSSTCLZSTSYMCDHJXXYWEYXCZAYDMPXMDSXYBSQMJMZJMTZQLPJYQZCGQHXJHHLXXHLHDLDJQCLDWBSXFZZYYSCHTYTYYBHECXHYKGJPXHHYZJFXHWHBDZFYZBCAPNPGNYDMSXHMMMMAMYNBYJTMPXYYMCTHJBZYFCGTYHWPHFTWZZEZSBZEGPFMTSKFTYCMHFLLHGPZJXZJGZJYXZSBBQSCZZLZCCSTPGXMJSFTCCZJZDJXCYBZLFCJSYZFGSZLYBCWZZBYZDZYPSWYJZXZBDSYUXLZZBZFYGCZXBZHZFTPBGZGEJBSTGKDMFHYZZJHZLLZZGJQZLSFDJSSCBZGPDLFZFZSZYZYZSYGCXSNXXCHCZXTZZLJFZGQSQYXZJQDCCZTQCDXZJYQJQCHXZTDLGSCXZSYQJQTZWLQDQZTQCHQQJZYEZZZPBWKDJFCJPZTYPQYQTTYNLMBDKTJZPQZQZZFPZSBNJLGYJDXJDZZKZGQKXDLPZJTCJDQBXDJQJSTCKNXBXZMSLYJCQMTJQWWCJQNJNLLLHJCWQTBZQYDZCZPZZDZYDDCYZZZCCJTTJFZDPRRTZTJDCQTQZDTJNPLZBCLLCTZSXKJZQZPZLBZRBTJDCXFCZDBCCJJLTQQPLDCGZDBBZJCQDCJWYNLLZYZCCDWLLXWZLXRXNTQQCZXKQLSGDFQTDDGLRLAJJTKUYMKQLLTZYTDYYCZGJWYXDXFRSKSTQTENQMRKQZHHQKDLDAZFKYPBGGPZREBZZYKZZSPEGJXGYKQZZZSLYSYYYZWFQZYLZZLZHWCHKYPQGNPGBLPLRRJYXCCSYYHSFZFYBZYYTGZXYLXCZWXXZJZBLFFLGSKHYJZEYJHLPLLLLCZGXDRZELRHGKLZZYHZLYQSZZJZQLJZFLNBHGWLCZCFJYSPYXZLZLXGCCPZBLLCYBBBBUBBCBPCRNNZCZYRBFSRLDCGQYYQXYGMQZWTZYTYJXYFWTEHZZJYWLCCNTZYJJZDEDPZDZTSYQJHDYMBJNYJZLXTSSTPHNDJXXBYXQTZQDDTJTDYYTGWSCSZQFLSHLGLBCZPHDLYZJYCKWTYTYLBNYTSDSYCCTYSZYYEBHEXHQDTWNYGYCLXTSZYSTQMYGZAZCCSZZDSLZCLZRQXYYELJSBYMXSXZTEMBBLLYYLLYTDQYSHYMRQWKFKBFXNXSBYCHXBWJYHTQBPBSBWDZYLKGZSKYHXQZJXHXJXGNLJKZLYYCDXLFYFGHLJGJYBXQLYBXQPQGZTZPLNCYPXDJYQYDYMRBESJYYHKXXSTMXRCZZYWXYQYBMCLLYZHQYZWQXDBXBZWZMSLPDMYSKFMZKLZCYQYCZLQXFZZYDQZPZYGYJYZMZXDZFYFYTTQTZHGSPCZMLCCYTZXJCYTJMKSLPZHYSNZLLYTPZCTZZCKTXDHXXTQCYFKSMQCCYYAZHTJPCYLZLYJBJXTPNYLJYYNRXSYLMMNXJSMYBCSYSYLZYLXJJQYLDZLPQBFZZBLFNDXQKCZFYWHGQMRDSXYCYTXNQQJZYYPFZXDYZFPRXEJDGYQBXRCNFYYQPGHYJDYZXGRHTKYLNWDZNTSMPKLBTHBPYSZBZTJZSZZJTYYXZPHSSZZBZCZPTQFZMYFLYPYBBJQXZMXXDJMTSYSKKBJZXHJCKLPSMKYJZCXTMLJYXRZZQSLXXQPYZXMKYXXXJCLJPRMYYGADYSKQLSNDHYZKQXZYZTCGHZTLMLWZYBWSYCTBHJHJFCWZTXWYTKZLXQSHLYJZJXTMPLPYCGLTBZZTLZJCYJGDTCLKLPLLQPJMZPAPXYZLKKTKDZCZZBNZDYDYQZJYJGMCTXLTGXSZLMLHBGLKFWNWZHDXUHLFMKYSLGXDTWWFRJEJZTZHYDXYKSHWFZCQSHKTMQQHTZHYMJDJSKHXZJZBZZXYMPAGQMSTPXLSKLZYNWRTSQLSZBPSPSGZWYHTLKSSSWHZZLYYTNXJGMJSZSUFWNLSOZTXGXLSAMMLBWLDSZYLAKQCQCTMYCFJBSLXCLZZCLXXKSBZQCLHJPSQPLSXXCKSLNHPSFQQYTXYJZLQLDXZQJZDYYDJNZPTUZDSKJFSLJHYLZSQZLBTXYDGTQFDBYAZXDZHZJNHHQBYKNXJJQCZMLLJZKSPLDYCLBBLXKLELXJLBQYCXJXGCNLCQPLZLZYJTZLJGYZDZPLTQCSXFDMNYCXGBTJDCZNBGBQYQJWGKFHTNPYQZQGBKPBBYZMTJDYTBLSQMPSXTBNPDXKLEMYYCJYNZCTLDYKZZXDDXHQSHDGMZSJYCCTAYRZLPYLTLKXSLZCGGEXCLFXLKJRTLQJAQZNCMBYDKKCXGLCZJZXJHPTDJJMZQYKQSECQZDSHHADMLZFMMZBGNTJNNLGBYJBRBTMLBYJDZXLCJLPLDLPCQDHLXZLYCBLCXZZJADJLNZMMSSSMYBHBSQKBHRSXXJMXSDZNZPXLGBRHWGGFCXGMSKLLTSJYYCQLTSKYWYYHYWXBXQYWPYWYKQLSQPTNTKHQCWDQKTWPXXHCPTHTWUMSSYHBWCRWXHJMKMZNGWTMLKFGHKJYLSYYCXWHYECLQHKQHTTQKHFZLDXQWYZYYDESBPKYRZPJFYYZJCEQDZZDLATZBBFJLLCXDLMJSSXEGYGSJQXCWBXSSZPDYZCXDNYXPPZYDLYJCZPLTXLSXYZYRXCYYYDYLWWNZSAHJSYQYHGYWWAXTJZDAXYSRLTDPSSYYFNEJDXYZHLXLLLZQZSJNYQYQQXYJGHZGZCYJCHZLYCDSHWSHJZYJXCLLNXZJJYYXNFXMWFPYLCYLLABWDDHWDXJMCXZTZPMLQZHSFHZYNZTLLDYWLSLXHYMMYLMBWWKYXYADTXYLLDJPYBPWUXJMWMLLSAFDLLYFLBHHHBQQLTZJCQJLDJTFFKMMMBYTHYGDCQRDDWRQJXNBYSNWZDBYYTBJHPYBYTTJXAAHGQDQTMYSTQXKBTZPKJLZRBEQQSSMJJBDJOTGTBXPGBKTLHQXJJJCTHXQDWJLWRFWQGWSHCKRYSWGFTGYGBXSDWDWRFHWYTJJXXXJYZYSLPYYYPAYXHYDQKXSHXYXGSKQHYWFDDDPPLCJLQQEEWXKSYYKDYPLTJTHKJLTCYYHHJTTPLTZZCDLTHQKZXQYSTEEYWYYZYXXYYSTTJKLLPZMCYHQGXYHSRMBXPLLNQYDQHXSXXWGDQBSHYLLPJJJTHYJKYPPTHYYKTYEZYENMDSHLCRPQFDGFXZPSFTLJXXJBSWYYSKSFLXLPPLBBBLBSFXFYZBSJSSYLPBBFFFFSSCJDSTZSXZRYYSYFFSYZYZBJTBCTSBSDHRTJJBYTCXYJEYLXCBNEBJDSYXYKGSJZBXBYTFZWGENYHHTHZHHXFWGCSTBGXKLSXYWMTMBYXJSTZSCDYQRCYTWXZFHMYMCXLZNSDJTTTXRYCFYJSBSDYERXJLJXBBDEYNJGHXGCKGSCYMBLXJMSZNSKGXFBNBPTHFJAAFXYXFPXMYPQDTZCXZZPXRSYWZDLYBBKTYQPQJPZYPZJZNJPZJLZZFYSBTTSLMPTZRTDXQSJEHBZYLZDHLJSQMLHTXTJECXSLZZSPKTLZKQQYFSYGYWPCPQFHQHYTQXZKRSGTTSQCZLPTXCDYYZXSQZSLXLZMYCPCQBZYXHBSXLZDLTCDXTYLZJYYZPZYZLTXJSJXHLPMYTXCQRBLZSSFJZZTNJYTXMYJHLHPPLCYXQJQQKZZSCPZKSWALQSBLCCZJSXGWWWYGYKTJBBZTDKHXHKGTGPBKQYSLPXPJCKBMLLXDZSTBKLGGQKQLSBKKTFXRMDKBFTPZFRTBBRFERQGXYJPZSSTLBZTPSZQZSJDHLJQLZBPMSMMSXLQQNHKNBLRDDNXXDHDDJCYYGYLXGZLXSYGMQQGKHBPMXYXLYTQWLWGCPBMQXCYZYDRJBHTDJYHQSHTMJSBYPLWHLZFFNYPMHXXHPLTBQPFBJWQDBYGPNZTPFZJGSDDTQSHZEAWZZYLLTYYBWJKXXGHLFKXDJTMSZSQYNZGGSWQSPHTLSSKMCLZXYSZQZXNCJDQGZDLFNYKLJCJLLZLMZZNHYDSSHTHZZLZZBBHQZWWYCRZHLYQQJBEYFXXXWHSRXWQHWPSLMSSKZTTYGYQQWRSLALHMJTQJSMXQBJJZJXZYZKXBYQXBJXSHZTSFJLXMXZXFGHKZSZGGYLCLSARJYHSLLLMZXELGLXYDJYTLFBHBPNLYZFBBHPTGJKWETZHKJJXZXXGLLJLSTGSHJJYQLQZFKCGNNDJSSZFDBCTWWSEQFHQJBSAQTGYPQLBXBMMYWXGSLZHGLZGQYFLZBYFZJFRYSFMBYZHQGFWZSYFYJJPHZBYYZFFWODGRLMFTWLBZGYCQXCDJYGZYYYYTYTYDWEGAZYHXJLZYYHLRMGRXXZCLHNELJJTJTPWJYBJJBXJJTJTEEKHWSLJPLPSFYZPQQBDLQJJTYYQLYZKDKSQJYYQZLDQTGJQYZJSUCMRYQTHTEJMFCTYHYPKMHYZWJDQFHYYXWSHCTXRLJHQXHCCYYYJLTKTTYTMXGTCJTZAYYOCZLYLBSZYWJYTSJYHBYSHFJLYGJXXTMZYYLTXXYPZLXYJZYZYYPNHMYMDYYLBLHLSYYQQLLNJJYMSOYQBZGDLYXYLCQYXTSZEGXHZGLHWBLJHEYXTWQMAKBPQCGYSHHEGQCMWYYWLJYJHYYZLLJJYLHZYHMGSLJLJXCJJYCLYCJPCPZJZJMMYLCQLNQLJQJSXYJMLSZLJQLYCMMHCFMMFPQQMFYLQMCFFQMMMMHMZNFHHJGTTHHKHSLNCHHYQDXTMMQDCYZYXYQMYQYLTDCYYYZAZZCYMZYDLZFFFMMYCQZWZZMABTBYZTDMNZZGGDFTYPCGQYTTSSFFWFDTZQSSYSTWXJHXYTSXXYLBYQHWWKXHZXWZNNZZJZJJQJCCCHYYXBZXZCYZTLLCQXYNJYCYYCYNZZQYYYEWYCZDCJYCCHYJLBTZYYCQWMPWPYMLGKDLDLGKQQBGYCHJXY';\n//此处收录了375个多音字\nvar oMultiDiff = {\n  19969: 'DZ',\n  19975: 'WM',\n  19988: 'QJ',\n  20048: 'YL',\n  20056: 'SC',\n  20060: 'NM',\n  20094: 'QG',\n  20127: 'QJ',\n  20167: 'QC',\n  20193: 'YG',\n  20250: 'KH',\n  20256: 'ZC',\n  20282: 'SC',\n  20285: 'QJG',\n  20291: 'TD',\n  20314: 'YD',\n  20340: 'NE',\n  20375: 'TD',\n  20389: 'YJ',\n  20391: 'CZ',\n  20415: 'PB',\n  20446: 'YS',\n  20447: 'SQ',\n  20504: 'TC',\n  20608: 'KG',\n  20854: 'QJ',\n  20857: 'ZC',\n  20911: 'PF',\n  20504: 'TC',\n  20608: 'KG',\n  20854: 'QJ',\n  20857: 'ZC',\n  20911: 'PF',\n  20985: 'AW',\n  21032: 'PB',\n  21048: 'XQ',\n  21049: 'SC',\n  21089: 'YS',\n  21119: 'JC',\n  21242: 'SB',\n  21273: 'SC',\n  21305: 'YP',\n  21306: 'QO',\n  21330: 'ZC',\n  21333: 'SDC',\n  21345: 'QK',\n  21378: 'CA',\n  21397: 'SC',\n  21414: 'XS',\n  21442: 'SC',\n  21477: 'JG',\n  21480: 'TD',\n  21484: 'ZS',\n  21494: 'YX',\n  21505: 'YX',\n  21512: 'HG',\n  21523: 'XH',\n  21537: 'PB',\n  21542: 'PF',\n  21549: 'KH',\n  21571: 'E',\n  21574: 'DA',\n  21588: 'TD',\n  21589: 'O',\n  21618: 'ZC',\n  21621: 'KHA',\n  21632: 'ZJ',\n  21654: 'KG',\n  21679: 'LKG',\n  21683: 'KH',\n  21710: 'A',\n  21719: 'YH',\n  21734: 'WOE',\n  21769: 'A',\n  21780: 'WN',\n  21804: 'XH',\n  21834: 'A',\n  21899: 'ZD',\n  21903: 'RN',\n  21908: 'WO',\n  21939: 'ZC',\n  21956: 'SA',\n  21964: 'YA',\n  21970: 'TD',\n  22003: 'A',\n  22031: 'JG',\n  22040: 'XS',\n  22060: 'ZC',\n  22066: 'ZC',\n  22079: 'MH',\n  22129: 'XJ',\n  22179: 'XA',\n  22237: 'NJ',\n  22244: 'TD',\n  22280: 'JQ',\n  22300: 'YH',\n  22313: 'XW',\n  22331: 'YQ',\n  22343: 'YJ',\n  22351: 'PH',\n  22395: 'DC',\n  22412: 'TD',\n  22484: 'PB',\n  22500: 'PB',\n  22534: 'ZD',\n  22549: 'DH',\n  22561: 'PB',\n  22612: 'TD',\n  22771: 'KQ',\n  22831: 'HB',\n  22841: 'JG',\n  22855: 'QJ',\n  22865: 'XQ',\n  23013: 'ML',\n  23081: 'WM',\n  23487: 'SX',\n  23558: 'QJ',\n  23561: 'YW',\n  23586: 'YW',\n  23614: 'YW',\n  23615: 'SN',\n  23631: 'PB',\n  23646: 'ZS',\n  23663: 'ZT',\n  23673: 'YG',\n  23762: 'TD',\n  23769: 'ZS',\n  23780: 'QJ',\n  23884: 'QK',\n  24055: 'XH',\n  24113: 'DC',\n  24162: 'ZC',\n  24191: 'GA',\n  24273: 'QJ',\n  24324: 'NL',\n  24377: 'TD',\n  24378: 'QJ',\n  24439: 'PF',\n  24554: 'ZS',\n  24683: 'TD',\n  24694: 'WE',\n  24733: 'LK',\n  24925: 'TN',\n  25094: 'ZG',\n  25100: 'XQ',\n  25103: 'XH',\n  25153: 'PB',\n  25170: 'PB',\n  25179: 'KG',\n  25203: 'PB',\n  25240: 'ZS',\n  25282: 'FB',\n  25303: 'NA',\n  25324: 'KG',\n  25341: 'ZY',\n  25373: 'WZ',\n  25375: 'XJ',\n  25384: 'A',\n  25457: 'A',\n  25528: 'SD',\n  25530: 'SC',\n  25552: 'TD',\n  25774: 'ZC',\n  25874: 'ZC',\n  26044: 'YW',\n  26080: 'WM',\n  26292: 'PB',\n  26333: 'PB',\n  26355: 'ZY',\n  26366: 'CZ',\n  26397: 'ZC',\n  26399: 'QJ',\n  26415: 'ZS',\n  26451: 'SB',\n  26526: 'ZC',\n  26552: 'JG',\n  26561: 'TD',\n  26588: 'JG',\n  26597: 'CZ',\n  26629: 'ZS',\n  26638: 'YL',\n  26646: 'XQ',\n  26653: 'KG',\n  26657: 'XJ',\n  26727: 'HG',\n  26894: 'ZC',\n  26937: 'ZS',\n  26946: 'ZC',\n  26999: 'KJ',\n  27099: 'KJ',\n  27449: 'YQ',\n  27481: 'XS',\n  27542: 'ZS',\n  27663: 'ZS',\n  27748: 'TS',\n  27784: 'SC',\n  27788: 'ZD',\n  27795: 'TD',\n  27812: 'O',\n  27850: 'PB',\n  27852: 'MB',\n  27895: 'SL',\n  27898: 'PL',\n  27973: 'QJ',\n  27981: 'KH',\n  27986: 'HX',\n  27994: 'XJ',\n  28044: 'YC',\n  28065: 'WG',\n  28177: 'SM',\n  28267: 'QJ',\n  28291: 'KH',\n  28337: 'ZQ',\n  28463: 'TL',\n  28548: 'DC',\n  28601: 'TD',\n  28689: 'PB',\n  28805: 'JG',\n  28820: 'QG',\n  28846: 'PB',\n  28952: 'TD',\n  28975: 'ZC',\n  29100: 'A',\n  29325: 'QJ',\n  29575: 'SL',\n  29602: 'FB',\n  30010: 'TD',\n  30044: 'CX',\n  30058: 'PF',\n  30091: 'YSP',\n  30111: 'YN',\n  30229: 'XJ',\n  30427: 'SC',\n  30465: 'SX',\n  30631: 'YQ',\n  30655: 'QJ',\n  30684: 'QJG',\n  30707: 'SD',\n  30729: 'XH',\n  30796: 'LG',\n  30917: 'PB',\n  31074: 'NM',\n  31085: 'JZ',\n  31109: 'SC',\n  31181: 'ZC',\n  31192: 'MLB',\n  31293: 'JQ',\n  31400: 'YX',\n  31584: 'YJ',\n  31896: 'ZN',\n  31909: 'ZY',\n  31995: 'XJ',\n  32321: 'PF',\n  32327: 'ZY',\n  32418: 'HG',\n  32420: 'XQ',\n  32421: 'HG',\n  32438: 'LG',\n  32473: 'GJ',\n  32488: 'TD',\n  32521: 'QJ',\n  32527: 'PB',\n  32562: 'ZSQ',\n  32564: 'JZ',\n  32735: 'ZD',\n  32793: 'PB',\n  33071: 'PF',\n  33098: 'XL',\n  33100: 'YA',\n  33152: 'PB',\n  33261: 'CX',\n  33324: 'BP',\n  33333: 'TD',\n  33406: 'YA',\n  33426: 'WM',\n  33432: 'PB',\n  33445: 'JG',\n  33486: 'ZN',\n  33493: 'TS',\n  33507: 'QJ',\n  33540: 'QJ',\n  33544: 'ZC',\n  33564: 'XQ',\n  33617: 'YT',\n  33632: 'QJ',\n  33636: 'XH',\n  33637: 'YX',\n  33694: 'WG',\n  33705: 'PF',\n  33728: 'YW',\n  33882: 'SR',\n  34067: 'WM',\n  34074: 'YW',\n  34121: 'QJ',\n  34255: 'ZC',\n  34259: 'XL',\n  34425: 'JH',\n  34430: 'XH',\n  34485: 'KH',\n  34503: 'YS',\n  34532: 'HG',\n  34552: 'XS',\n  34558: 'YE',\n  34593: 'ZL',\n  34660: 'YQ',\n  34892: 'XH',\n  34928: 'SC',\n  34999: 'QJ',\n  35048: 'PB',\n  35059: 'SC',\n  35098: 'ZC',\n  35203: 'TQ',\n  35265: 'JX',\n  35299: 'JX',\n  35782: 'SZ',\n  35828: 'YS',\n  35830: 'E',\n  35843: 'TD',\n  35895: 'YG',\n  35977: 'MH',\n  36158: 'JG',\n  36228: 'QJ',\n  36426: 'XQ',\n  36466: 'DC',\n  36710: 'JC',\n  36711: 'ZYG',\n  36767: 'PB',\n  36866: 'SK',\n  36951: 'YW',\n  37034: 'YX',\n  37063: 'XH',\n  37218: 'ZC',\n  37325: 'ZC',\n  38063: 'PB',\n  38079: 'TD',\n  38085: 'QY',\n  38107: 'DC',\n  38116: 'TD',\n  38123: 'YD',\n  38224: 'HG',\n  38241: 'XTC',\n  38271: 'ZC',\n  38415: 'YE',\n  38426: 'KH',\n  38461: 'YD',\n  38463: 'AE',\n  38466: 'PB',\n  38477: 'XJ',\n  38518: 'YT',\n  38551: 'WK',\n  38585: 'ZC',\n  38704: 'XS',\n  38739: 'LJ',\n  38761: 'GJ',\n  38808: 'SQ',\n  39048: 'JG',\n  39049: 'XJ',\n  39052: 'HG',\n  39076: 'CZ',\n  39271: 'XT',\n  39534: 'TD',\n  39552: 'TD',\n  39584: 'PB',\n  39647: 'SB',\n  39730: 'LG',\n  39748: 'TPB',\n  40109: 'ZQ',\n  40479: 'ND',\n  40516: 'HG',\n  40536: 'HG',\n  40583: 'QJ',\n  40765: 'YQ',\n  40784: 'QJ',\n  40840: 'YK',\n  40863: 'QJG',\n};\n\nfunction checkCh(ch) {\n  var uni = ch.charCodeAt(0);\n  //如果不在汉字处理范围之内,返回原字符,也可以调用自己的处理函数\n  if (uni > 40869 || uni < 19968) return ch; //dealWithOthers(ch);\n  //检查是否是多音字,是按多音字处理,不是就直接在strChineseFirstPY字符串中找对应的首字母\n  return oMultiDiff[uni] ? oMultiDiff[uni] : strChineseFirstPY.charAt(uni - 19968);\n}\n\nfunction mkRslt(arr) {\n  var arrRslt = [''];\n  for (var i = 0, len = arr.length; i < len; i++) {\n    var str = arr[i];\n    var strlen = str.length;\n    if (strlen == 1) {\n      for (var k = 0; k < arrRslt.length; k++) {\n        arrRslt[k] += str;\n      }\n    } else {\n      var tmpArr = arrRslt.slice(0);\n      arrRslt = [];\n      for (k = 0; k < strlen; k++) {\n        //复制一个相同的arrRslt\n        var tmp = tmpArr.slice(0);\n        //把当前字符str[k]添加到每个元素末尾\n        for (var j = 0; j < tmp.length; j++) {\n          tmp[j] += str.charAt(k);\n        }\n        //把复制并修改后的数组连接到arrRslt上\n        arrRslt = arrRslt.concat(tmp);\n      }\n    }\n  }\n  return arrRslt;\n}\n//两端去空格函数\nString.prototype.trim = function () {\n  return this.replace(/(^\\s*)|(\\s*$)/g, '');\n};\n\n//参数——中文字符串\n//返回值——拼音首字母串数组\nexport function getFirstLetterList(str) {\n  if (typeof str != 'string') throw new Error(-1, '请传入字符串类型的参数!');\n  var arrResult = new Array(); //保存中间结果的数组\n  for (var i = 0, len = str.length; i < len; i++) {\n    //获得unicode码\n    var ch = str.charAt(i);\n    //检查该unicode码是否在处理范围之内,在则返回该码对映汉字的拼音首字母,不在则调用其它函数处理\n    arrResult.push(checkCh(ch));\n  }\n  //处理arrResult,返回所有可能的拼音首字母串数组\n  return mkRslt(arrResult);\n}\n\n// 判断字符串是否全是中文\nfunction isAllChinese(str) {\n  return /^[\\u4E00-\\u9FA5]+$/.test(str);\n}\n\n// 判断字符是否为中文\nfunction isChinese(char) {\n  return /^[\\u4E00-\\u9FA5]$/.test(char);\n}\n\n// 中文拼音名称排序\nexport const sortListByCN = (vodList, key, order) => {\n  if (!key) {\n    return vodList;\n  }\n  order = order || 'asc'; // 默认正序\n  let ASCarr = vodList.sort((a, b) => {\n    a = a[key];\n    b = b[key];\n    // 数字排在字符串前面\n    if (typeof a === 'number' && typeof b === 'string') {\n      return -1;\n    }\n\n    if (typeof a === 'string' && typeof b === 'number') {\n      return 1;\n    }\n\n    // 当存在非数字时\n    if (isNaN(a) || isNaN(b)) {\n      // 全汉字的排在非全汉字的后面\n      if (isAllChinese(a) && !isAllChinese(b)) {\n        return 1;\n      }\n\n      if (!isAllChinese(a) && isAllChinese(b)) {\n        return -1;\n      }\n\n      // 存在非数字的数据时，都转为字符串进行比较\n      a = a.toString();\n      b = b.toString();\n\n      let result = 0;\n\n      // 依次比较两个字符串的各项字符\n      for (let index = 0; index < (a.length - b.length ? b.length : a.length); index++) {\n        // 汉字排在非汉字的后面\n        if (!isChinese(a[index]) && isChinese(b[index])) {\n          result = -1;\n        }\n\n        if (isChinese(a[index]) && !isChinese(b[index])) {\n          result = 1;\n        }\n\n        // 若两个汉字进行比较，则比较他们的拼音首字母\n        if (isChinese(a[index]) && isChinese(b[index])) {\n          let pinyinA = getFirstLetterList(a[index]).toString();\n          let pinyinB = getFirstLetterList(b[index]).toString();\n\n          result = pinyinA.localeCompare(pinyinB, 'zh-Hans-CN', { sensitivity: 'accent' });\n        }\n\n        // 若已经比较出结果，则跳出循环，不再继续比较剩余字符\n        if (result !== 0) {\n          break;\n        }\n      }\n\n      // 只要有一个无法转换为数字——转换为字符串进行比较——先按字符排序，然后按照数字排序\n      return result || a.toString().localeCompare(b.toString(), 'zh-Hans-CN', { sensitivity: 'accent' });\n    } else {\n      // 都能转换为数字——转换为数字进行比较——从小到大排序\n      return Number(a) - Number(b);\n    }\n  });\n  if (order === 'desc') {\n    ASCarr.reverse();\n  }\n  return ASCarr;\n};\n\n// 首字母开头排序\nexport const sortListByFirst = (vodList, key) => {\n  key = key || 'vod_name';\n  // 名字以特殊符号开头的应用列表\n  const symbol_list = [];\n  // 名字以中文开头的应用列表\n  const cn_list = [];\n  // 名字以英文开头的应用列表\n  const en_list = [];\n  // 名字以数字开头的应用列表\n  const num_list = [];\n\n  vodList.forEach((vod) => {\n    const { vod_name } = vod;\n    //通过正则进行数据分类\n    if (/[\\u4e00-\\u9fa5]/.test(vod_name[0])) {\n      cn_list.push(vod);\n    } else if (/[a-zA-Z]/.test(vod_name[0])) {\n      en_list.push(vod);\n    } else if (/[\\d]/.test(vod_name[0])) {\n      num_list.push(vod);\n    } else {\n      symbol_list.push(vod);\n    }\n  });\n  //按照要求的方式进行数据排序重组\n  const newList = [\n    ...cn_list.sort((a, b) => a.vod_name[0]?.localeCompare(b.vod_name[0])),\n    ...en_list.sort((a, b) => a.vod_name[0].localeCompare(b.vod_name[0])), //localeCompare可以不区分大小写的进行排序\n    ...num_list.sort((a, b) => a.vod_name[0] - b.vod_name[0]),\n    ...symbol_list.sort((a, b) => a.vod_name[0] - b.vod_name[0]),\n  ];\n  return newList;\n};\n"
  },
  {
    "path": "resources/t3Catopen/spider.js",
    "content": "import * as spider from '%s';\n\nif (!globalThis.__JS_SPIDER__) {\n  if (spider.__jsEvalReturn) {\n    globalThis.req = http;\n    globalThis.__JS_SPIDER__ = spider.__jsEvalReturn();\n  } else if (spider.default) {\n    globalThis.__JS_SPIDER__ = typeof spider.default === 'function' ? spider.default() : spider.default;\n  }\n}\n"
  },
  {
    "path": "resources/t3PyBase/__tests__/demo.py",
    "content": "import re,sys,json,urllib3\nfrom base.spider import Spider\nurllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)\nsys.path.append('..')\n\nclass Spider(Spider):\n    host = 'https://example.com'\n    headers = {}\n\n    def homeContent(self, filter):\n        print(1,2,3)\n        print()\n        self.a = {'class':[{'type_id':'1','type_name':'电影'},{'type_id':'2','type_name':'电视剧'},{'type_id':'3','type_name':'综艺'},{'type_id':'5','type_name':'动漫'},{'type_id':'4','type_name':'纪录片'},{'type_id':'6','type_name':'短剧'},{'type_id':'7','type_name':'特别节目'},{'type_id':'8','type_name':'少儿内容'}]}\n        print(self.a)\n        return self.a\n\n    def homeVideoContent(self):\n        return []\n\n    def categoryContent(self, tid, pg, filter, extend):\n        return {'list': [], 'pagecount':10, 'page': pg}\n\n    def searchContent(self, key, quick, pg='1'):\n        return {'list': [], 'page': pg}\n\n    def detailContent(self, ids):\n        return {'list': []}\n\n    def playerContent(self, flag, vid, vip_flags):\n        return { 'jx': 0, 'parse': 0, 'url': '', 'header': this.headers }\n\n    def init(self, extend=''):\n        pass\n\n    def getName(self):\n        pass\n\n    def isVideoFormat(self, url):\n        pass\n\n    def manualVideoCheck(self):\n        pass\n\n    def destroy(self):\n        pass\n\n    def localProxy(self, param):\n        pass\n"
  },
  {
    "path": "resources/t3PyBase/__tests__/logger.py",
    "content": "import zmq\nimport json\n\n\nLOG_ADDR = \"tcp://127.0.0.1:19980\"\n\ndef listen_logs():\n    ctx = zmq.Context()\n    log_socket = ctx.socket(zmq.SUB)\n    log_socket.connect(LOG_ADDR)\n    log_socket.setsockopt_string(zmq.SUBSCRIBE, \"\")\n\n    print(\"[Main] Log listening started...\")\n    try:\n        while True:\n            msg_raw = log_socket.recv_string()\n            msg = json.loads(msg_raw)\n\n            msg_type = msg.get(\"type\")\n            msg_list = msg.get(\"msg\", [])\n\n            print(\n                \"[LOG]\",\n                *(\n                    msg_list\n                    if msg_type == \"multiple\"\n                    else (msg_list[:1] if msg_list else [])\n                )\n            )\n\n    except zmq.ZMQError:\n        print(\"[Main] Stop listening to logs\")\n    finally:\n        log_socket.close()\n        ctx.term()\n\nif __name__ == \"__main__\":\n    try:\n        while True:\n            listen_logs()\n    except KeyboardInterrupt:\n        print(\"[Main] Exiting log listener\")\n"
  },
  {
    "path": "resources/t3PyBase/__tests__/test.py",
    "content": "import zmq, json\nfrom pathlib import Path\n\nCTRL_ADDR = \"tcp://127.0.0.1:19979\"\ncode = Path(\"demo.py\").read_text(encoding=\"utf-8\")\n# code = \"\"\n\nctx = zmq.Context()\nctrl_socket = ctx.socket(zmq.REQ)\nctrl_socket.connect(CTRL_ADDR)\n\ndef send_request(method, options=None):\n    if options is None:\n        options = []\n    req = {\"type\": method, \"options\": options, \"code\": code}\n    ctrl_socket.send_string(json.dumps(req))\n    reply = ctrl_socket.recv_string()\n    return reply\n\nreply_init = send_request(\"init\", [\"\"])\nprint(\"init reply:\", reply_init)\n\nreply_home = send_request(\"homeContent\", [\"\"])\nprint(\"homeContent reply:\", reply_home)\n\n"
  },
  {
    "path": "resources/t3PyBase/base/htmlParser.py",
    "content": "# -*- coding: utf-8 -*-\n# File  : htmlParser.py\n# Author: DaShenHan&道长-----先苦后甜, 任凭晚风拂柳颜------\n# Date  : 2022/8/25\n# upDate  : 2022/11/17 支持 -- 剔除元素 多个剔除\n# upDate  : 2024/04/09 取html返回的文本自动解除转义, 防止script里取Html的内容被转义无法执行\n# upDate  : 2024/05/16 支持:not,even,odd,has,contans,matches,empty 新特性, pdfh取属性支持||\n\nimport json\nfrom pyquery import PyQuery as pq\nfrom urllib.parse import urljoin\nimport re\nfrom jsonpath import jsonpath\nfrom html import escape, unescape\n\nPARSE_CACHE = True  # 解析缓存\nNOADD_INDEX = ':eq|:lt|:gt|:first|:last|:not|:even|:odd|:has|:contains|:matches|:empty|^body$|^#'  # 不自动加eq下标索引\nURLJOIN_ATTR = '(url|src|href|-original|-src|-play|-url|style)$'  # 需要自动urljoin的属性\nSPECIAL_URL = '^(ftp|magnet|thunder|ws):'  # 过滤特殊链接,不走urlJoin\n\nclass Jsoup:\n    def __init__(self, MY_URL=''):\n        self.MY_URL = MY_URL\n        self.pdfh_html = ''\n        self.pdfa_html = ''\n\n        self.pdfh_doc = None\n        self.pdfa_doc = None\n\n    def test(self, text: str, string: str):\n        \"\"\"\n        正则判断字符串包含, 模仿js的 //.test()\n        :param text:\n        :param string:\n        :return:\n        \"\"\"\n        searchObj = re.search(rf'{text}', string, re.M | re.I)\n        test_ret = True if searchObj else False\n        return test_ret\n\n    def contains(self, text: str, match: str):\n        # return match in text\n        return text.find(match) > -1\n\n    def parseHikerToJq(self, parse, first=False):\n        \"\"\"\n         海阔解析表达式转原生表达式,自动补eq,如果传了first就最后一个也取eq(0)\n        :param parse:\n        :param first:\n        :return:\n        \"\"\"\n        if self.contains(parse, '&&'):\n            parse = parse.split('&&')  # 带&&的重新拼接\n            new_parses = []  # 构造新的解析表达式列表\n            for i in range(len(parse)):\n                ps = parse[i].split(' ')[-1]  # 如果分割&&后带空格就取最后一个元素\n                if not self.test(NOADD_INDEX, ps):\n                    if not first and i >= len(parse) - 1:  # 不传first且遇到最后一个,不用补eq(0)\n                        new_parses.append(parse[i])\n                    else:\n                        new_parses.append(f'{parse[i]}:eq(0)')\n                else:\n                    new_parses.append(parse[i])\n            parse = ' '.join(new_parses)\n        else:\n            ps = parse.split(' ')[-1]  # 如果带空格就取最后一个元素\n            if not self.test(NOADD_INDEX, ps) and first:\n                parse = f'{parse}:eq(0)'\n\n        return parse\n\n    def getParseInfo(self, nparse):\n        \"\"\"\n        根据传入的单规则获取 parse规则, 索引位置,排除列表  -- 可以用于剔除元素,支持多个, 按标签剔除, 按id剔除等操作\n        :param nparse:\n        :return:\n        \"\"\"\n        excludes = []  # 定义排除列表默认值为空\n        nparse_index = 0  # 定义位置索引默认值为0\n        nparse_rule = nparse  # 定义规则默认值为本身\n        if self.contains(nparse, ':eq'):\n            nparse_rule = nparse.split(':eq')[0]\n            nparse_pos = nparse.split(':eq')[1]\n            # print(nparse_rule)\n            if self.contains(nparse_rule, '--'):\n                excludes = nparse_rule.split('--')[1:]\n                nparse_rule = nparse_rule.split('--')[0]\n            elif self.contains(nparse_pos, '--'):\n                excludes = nparse_pos.split('--')[1:]\n                nparse_pos = nparse_pos.split('--')[0]\n            try:\n                nparse_index = int(nparse_pos.split('(')[1].split(')')[0])\n            except:\n                pass\n\n        elif self.contains(nparse, '--'):\n            nparse_rule = nparse.split('--')[0]\n            excludes = nparse.split('--')[1:]\n\n        # if nparse_index > 0:\n        #     print(f'nparse_rule:{nparse_rule},nparse_index:{nparse_index},excludes:{excludes}')\n        return nparse_rule, nparse_index, excludes\n\n    def parseOneRule(self, doc, nparse, ret=None):\n        \"\"\"\n        解析空格分割后的原生表达式中的一条记录,正确处理eq的索引, 返回处理后的ret\n        :param doc: pq(html) load 后的pq对象\n        :param nparse: 当前单个解析表达式\n        :param ret: pd对象结果\n        :return:\n        \"\"\"\n        nparse_rule, nparse_index, excludes = self.getParseInfo(nparse)\n        # print('nparse_rule:', nparse_rule)\n        # print('nparse:', nparse)\n\n        not_prefix = nparse_rule\n        not_regex = ''\n        not_endfix = ''\n        if self.contains(nparse_rule, ':not'):\n            not_prefix = nparse_rule.split(':not')[0]\n            not_reg_array = re.search(r':not\\((.*)\\)(.*)', nparse_rule, re.M | re.I).groups()\n            not_regex = not_reg_array[0] if len(not_reg_array) > 0 else not_regex\n            not_endfix = not_reg_array[1] if len(not_reg_array) > 1 else not_endfix\n\n        if not ret:\n            ret = doc(not_prefix)\n        else:\n            ret = ret(not_prefix)\n\n        if not_regex:\n            ret = ret.not_(not_regex)\n        if not_endfix:\n            ret = ret(not_endfix)\n\n        # print(ret)\n        # print(f'nparse_rule:{nparse_rule},nparse_index:{nparse_index},excludes:{excludes},ret:{ret}')\n        if self.contains(nparse, ':eq'):\n            ret = ret.eq(nparse_index)\n            # if nparse_index > 4:\n            #     print('nparse_index',ret,not ret)\n\n        if excludes and ret:\n            # print(excludes)\n            ret = ret.clone()  # 克隆一个,免得直接remove会影响doc的缓存\n            for exclude in excludes:\n                # ret.remove(exclude)\n                ret(exclude).remove()\n        return ret\n\n    def pdfa(self, html, parse: str):\n        # 看官方文档才能解决这个问题!!!\n        # https://pyquery.readthedocs.io/en/latest/api.html\n        if not all([html, parse]):\n            return []\n        parse = self.parseHikerToJq(parse)\n        # print(f'pdfa:{parse}')\n        if PARSE_CACHE:\n            if self.pdfa_html != html:\n                self.pdfa_html = html\n                self.pdfa_doc = pq(html)\n            doc = self.pdfa_doc\n        else:\n            doc = pq(html)\n\n        parses = parse.split(' ')\n        # print(parses)\n        ret = None\n        for nparse in parses:\n            ret = self.parseOneRule(doc, nparse, ret)\n            if not ret:  # 可能循环取值后ret 对应eq取完无值了, pdfa直接返回空列表\n                return []\n        res = [item.outerHtml() for item in ret.items()]\n        return res\n\n    def pdfh(self, html, parse: str, base_url: str = ''):\n        if not all([html, parse]):\n            return ''\n        if PARSE_CACHE:\n            if self.pdfh_html != html:\n                self.pdfh_html = html\n                self.pdfh_doc = pq(html)\n            doc = self.pdfh_doc\n        else:\n            doc = pq(html)\n        if parse == 'body&&Text' or parse == 'Text':\n            return doc.text()\n        elif parse == 'body&&Html' or parse == 'Html':\n            return unescape(doc.html())\n\n        option = None\n        if self.contains(parse, '&&'):\n            option = parse.split('&&')[-1]\n            parse = '&&'.join(parse.split('&&')[:-1])\n        parse = self.parseHikerToJq(parse, True)\n        # print(f'pdfh:{parse},option:{option}')\n        parses = parse.split(' ')\n        # print(parses)\n        ret = None\n        for nparse in parses:\n            ret = self.parseOneRule(doc, nparse, ret)\n            # print(nparse,ret)\n            if not ret:  # 可能循环取值后ret 对应eq取完无值了, pdfh直接返回空字符串\n                return ''\n\n        if option:\n            if option == 'Text':\n                ret = ret.text()\n            elif option == 'Html':\n                ret = unescape(ret.html())\n            else:\n                # 保留原来的ret\n                original_ret = ret.clone()\n                options = option.split('||')\n                opt_index = 0\n                for opt in options:\n                    # print(f'opt_index:{opt_index},opt:{opt}')\n                    opt_index += 1\n                    ret = original_ret.attr(opt) or ''\n                    if self.contains(opt.lower(), 'style') and self.contains(ret, 'url('):\n                        try:\n                            ret = re.search('url\\((.*?)\\)', ret, re.M | re.S).groups()[0]\n                            # 2023/07/28新增 style取内部链接自动去除首尾单双引号\n                            ret = re.sub(r\"^['\\\"]|['\\\"]$\", '', ret)\n                        except:\n                            pass\n                    if ret and base_url:\n                        # need_add = re.search(URLJOIN_ATTR, opt, re.M | re.I)\n                        need_add = self.test(URLJOIN_ATTR, opt) and not self.test(SPECIAL_URL, ret)\n                        if need_add:\n                            if 'http' in ret:\n                                ret = ret[ret.find('http'):]\n                            else:\n                                ret = urljoin(base_url, ret)\n                    if ret:\n                        break\n        else:\n            ret = ret.outerHtml()\n        return ret\n\n    def pd(self, html, parse: str, base_url: str = ''):\n        if not base_url:\n            base_url = self.MY_URL\n        return self.pdfh(html, parse, base_url)\n\n    def pq(self, html: str):\n        return pq(html)\n\n    def pjfh(self, html, parse: str, add_url=False):\n        if not all([html, parse]):\n            return ''\n        if isinstance(html, str):\n            # print(html)\n            try:\n                html = json.loads(html)\n                # html = eval(html)\n            except:\n                print('字符串转json失败')\n                return ''\n        if not parse.startswith('$.'):\n            parse = f'$.{parse}'\n        ret = ''\n        for ps in parse.split('||'):\n            ret = jsonpath(html, ps)\n            if isinstance(ret, list):\n                ret = str(ret[0]) if ret[0] else ''\n            else:\n                ret = str(ret) if ret else ''\n            if add_url and ret:\n                ret = urljoin(self.MY_URL, ret)\n            if ret:\n                break\n        # print(ret)\n        return ret\n\n    def pj(self, html, parse: str):\n        return self.pjfh(html, parse, True)\n\n    def pjfa(self, html, parse: str):\n        if not all([html, parse]):\n            return []\n        if isinstance(html, str):\n            try:\n                html = json.loads(html)\n            except:\n                return []\n        if not parse.startswith('$.'):\n            parse = f'$.{parse}'\n        # print(html)\n        # print(parse)\n        ret = jsonpath(html, parse)\n        # print(ret)\n        # print(type(ret))\n        # print(type(ret[0]))\n        # print(len(ret))\n        if isinstance(ret, list) and isinstance(ret[0], list) and len(ret) == 1:\n            # print('自动解包')\n            ret = ret[0]  # 自动解包\n        return ret or []\n\ndef pd(html, parse: str, base_url: str =''):\n    jsp = Jsoup(base_url)\n    return jsp.pd(html, parse, base_url)\n\ndef pdfa(html, parse: str):\n    jsp = Jsoup()\n    return jsp.pdfa(html, parse)\n\ndef pdfh(html, parse: str, base_url: str =''):\n    jsp = Jsoup(base_url)\n    return jsp.pdfh(html, parse, base_url)\n"
  },
  {
    "path": "resources/t3PyBase/base/spider.py",
    "content": "# -*- coding: utf-8 -*-\n# File  : spider.py\n# Author: DaShenHan&道长-----先苦后甜，任凭晚风拂柳颜------\n# Author's Blog: https://blog.csdn.net/qq_32394351\n# Date  : 2024/1/9\n# UpDate  : 2024/1/9 增加多个静态函数以及个性化函数\n\nimport hashlib\nimport re\nimport json\nimport zlib\nimport gzip\nfrom typing import List\n\nimport requests\nimport warnings\nimport time\nfrom lxml import etree\nfrom abc import abstractmethod, ABCMeta\nfrom importlib.machinery import SourceFileLoader\nfrom urllib3 import encode_multipart_formdata\nfrom urllib.parse import urljoin, quote, unquote\n\nimport base64\nimport io\nimport tokenize\nfrom Crypto.Cipher import AES, PKCS1_v1_5 as PKCS1_cipher\nfrom Crypto.Util.Padding import unpad\nfrom Crypto.PublicKey import RSA\n\n# 关闭警告\nwarnings.filterwarnings(\"ignore\")\nrequests.packages.urllib3.disable_warnings()\n\nclass BaseSpider(metaclass=ABCMeta):  # 元类 默认的元类 type\n    _instance = None\n\n    def __init__(self, query_params=None, t4_api=None):\n        self.query_params = query_params or {}\n        self.t4_api = t4_api or ''\n        self.extend = ''\n        self._cache = {}\n        self.log(f'BaseSpider __init__ query_params:{query_params} t4_api:{t4_api}')\n\n    def __new__(cls, *args, **kwargs):\n        if cls._instance:\n            return cls._instance  # 有实例则直接返回\n        else:\n            cls._instance = super().__new__(cls)  # 没有实例则new一个并保存\n            return cls._instance  # 这个返回是给是给init，再实例化一次，也没有关系\n\n    # # 这是简化的写法，上面注释的写法更容易提现判断思路\n    # if not cls._instance:\n    #   cls._instance = super().__new__(cls)\n    # return cls._instance\n\n    @abstractmethod\n    def init(self, extend=\"\"):\n        pass\n\n    @abstractmethod\n    def homeContent(self, filter):\n        pass\n\n    @abstractmethod\n    def homeVideoContent(self):\n        pass\n\n    @abstractmethod\n    def categoryContent(self, tid, pg, filter, extend):\n        pass\n\n    @abstractmethod\n    def detailContent(self, ids):\n        pass\n\n    @abstractmethod\n    def searchContent(self, key, quick, pg=1):\n        pass\n\n    @abstractmethod\n    def playerContent(self, flag, id, vipFlags=None):\n        pass\n\n    @abstractmethod\n    def localProxy(self, params):\n        pass\n\n    @abstractmethod\n    def isVideoFormat(self, url):\n        pass\n\n    @abstractmethod\n    def manualVideoCheck(self):\n        pass\n\n    # @abstractmethod\n    def getName(self):\n        return 'BaseSpider'\n\n    def init_api_ext_file(self):\n        pass\n\n    def getProxyUrl(self, flag=False):\n        \"\"\"\n        获取本地代理地址\n        @return:\n        \"\"\"\n        return self.t4_api\n\n    def getDependence(self):\n        return []\n\n    def setExtendInfo(self, extend):\n        self.extend = extend\n\n    def setCache(self, key, value, expire=None):\n        \"\"\"\n        设置缓存键值对，可选的过期时间\n\n        参数:\n            key: 缓存键\n            value: 缓存值\n            expire: 过期时间（秒），None表示永不过期\n        \"\"\"\n        self._cache[key] = {\n            'value': value,\n            'expire': time.time() + expire if expire else None\n        }\n\n    def getCache(self, key):\n        \"\"\"\n        获取缓存值，如果已过期则返回None并删除该键\n\n        参数:\n            key: 缓存键\n\n        返回:\n            对应的缓存值，如果键不存在或已过期则返回 None\n        \"\"\"\n        if key not in self._cache:\n            return None\n\n        item = self._cache[key]\n\n        # 检查是否过期\n        if item['expire'] and time.time() > item['expire']:\n            del self._cache[key]  # 删除过期项\n            return None\n\n        return item['value']\n\n    def cleanup(self):\n        \"\"\"清理所有过期的缓存项\"\"\"\n        current_time = time.time()\n        expired_keys = [\n            key for key, item in self._cache.items()\n            if item['expire'] and current_time > item['expire']\n        ]\n\n        for key in expired_keys:\n            del self._cache[key]\n\n    def regStr(self, src, reg, group=1):\n        m = re.search(reg, src)\n        src = ''\n        if m:\n            src = m.group(group)\n        return src\n\n    def custom_RegexGetText(self, Text, RegexText, Index, find_all=False):\n        \"\"\"改进版：支持返回所有匹配结果或单个匹配\"\"\"\n        if not find_all:\n            match = re.search(RegexText, Text, re.M | re.S)\n            return match.group(Index) if match else \"\"\n        else:\n            return [m.group(Index) for m in re.finditer(RegexText, Text, re.M | re.S)]\n\n    # cGroup = re.compile('[\\U00010000-\\U0010ffff]')\n    # clean = cGroup.sub('',rsp.text)\n    def cleanText(self, src):\n        clean = re.sub('[\\U0001F600-\\U0001F64F\\U0001F300-\\U0001F5FF\\U0001F680-\\U0001F6FF\\U0001F1E0-\\U0001F1FF]', '',\n                       src)\n        return clean\n\n    def fetch(self, url, params=None, headers=None, cookies=None, timeout=5, verify=True,\n              allow_redirects=True, stream=None):\n        rsp = requests.get(url, params=params, headers=headers, cookies=cookies, timeout=timeout,\n                           verify=verify,\n                           allow_redirects=allow_redirects, stream=stream)\n        rsp.encoding = 'utf-8'\n        return rsp\n\n    def post(self, url, data=None, headers=None, cookies=None, timeout=5, verify=True, allow_redirects=True,\n             stream=None):\n        rsp = requests.post(url, data=data, headers=headers, cookies=cookies, timeout=timeout, verify=verify,\n                            allow_redirects=allow_redirects, stream=stream)\n        rsp.encoding = 'utf-8'\n        return rsp\n\n    def postJson(self, url, json, headers=None, cookies=None, timeout=5, verify=True, allow_redirects=True,\n                 stream=None):\n        rsp = requests.post(url, json=json, headers=headers, cookies=cookies, timeout=timeout, verify=verify,\n                            allow_redirects=allow_redirects, stream=stream)\n        rsp.encoding = 'utf-8'\n        return rsp\n\n    def postBinary(self, url, data: dict, boundary=None, headers=None, cookies=None, timeout=5, verify=True,\n                   allow_redirects=True, stream=None):\n        if boundary is None:\n            boundary = f'--dio-boundary-{int(time.time())}'\n        if headers is None:\n            headers = {}\n        headers['Content-Type'] = f'multipart/form-data; boundary={boundary}'\n        fields = []\n        for key, value in data.items():\n            fields.append((key, (None, value, None)))\n        m = encode_multipart_formdata(fields, boundary=boundary)\n        data = m[0]\n        rsp = requests.post(url, data=data, headers=headers, cookies=cookies, timeout=timeout, verify=verify,\n                            allow_redirects=allow_redirects, stream=stream)\n        rsp.encoding = 'utf-8'\n        return rsp\n\n    def html(self, content):\n        return etree.HTML(content)\n\n    def xpText(self, root, expr):\n        ele = root.xpath(expr)\n        if len(ele) == 0:\n            return ''\n        else:\n            return ele[0]\n\n    def loadModule(self, name, fileName):\n        return SourceFileLoader(name, fileName).load_module()\n\n    # ==================== 静态函数 ======================\n    def log(self, msg):\n        \"\"\"\n        打印日志文本\n        @param msg:\n        @return:\n        \"\"\"\n        if isinstance(msg, dict) or isinstance(msg, list):\n            msg = self.json2str(msg)\n        else:\n            msg = f'{msg}'\n\n        print(msg)\n\n    @staticmethod\n    def isVideo():\n        \"\"\"\n        返回是否为视频的匹配字符串\n        @return: None空 reg:正则表达式  js:input js代码\n        \"\"\"\n        pass\n\n    @staticmethod\n    def adRemove():\n        \"\"\"\n        m3u8广告移除函数。将自动执行返回的字符串的本地代理功能\n        @return: None空 reg:正则表达式  js:input js代码\n        \"\"\"\n        pass\n\n    @staticmethod\n    def replaceAll(text, mtext, rtext):\n        \"\"\"\n        字符串替换全部\n        @param text: 原始字符串: 如 xxx.ts\n        @param mtext: 匹配想要替换的字符串 如 r'(.*?ts)'\n        @param rtext: 用于替换的字符串 如 r'https://www.bdys03.com/\\1' 其中\\1代表匹配的第1项类似于js的 $1\n        @return: 替换后的字符串结果\n        \"\"\"\n        return re.sub(mtext, rtext, text)\n\n    @staticmethod\n    def str2json(str):\n        return json.loads(str)\n\n    @staticmethod\n    def json2str(str):\n        return json.dumps(str, ensure_ascii=False)\n\n    @staticmethod\n    def encodeStr(input, encoding='GBK'):\n        \"\"\"\n        指定字符串编码\n        :param input:\n        :param encoding:\n        :return:\n        \"\"\"\n        return quote(input.encode(encoding, 'ignore'))\n\n    @staticmethod\n    def decodeStr(input, encoding='GBK'):\n        \"\"\"\n        指定字符串解码\n        :param input:\n        :param encoding:\n        :return:\n        \"\"\"\n        return unquote(input, encoding)\n\n    @staticmethod\n    def hexStringTobytes(_str):\n        \"\"\"\n        将hex字符串转成byte字节\n        @param _str: hex字符串\n        @return: byte字节\n        \"\"\"\n        _str = _str.replace(\" \", \"\")\n        return bytes.fromhex(_str)\n\n    @staticmethod\n    def bytesToHexString(_bytes, no_space=True):\n        \"\"\"\n        将byte字节转成hex字符串\n        @param _bytes: byte字节\n        @param no_space: 是否不带空格返回，默认是\n        @return: hex字符串\n        \"\"\"\n        _str = ''.join(['%02X ' % b for b in _bytes])\n        if no_space:\n            _str = _str.replace(\" \", \"\")\n        return _str\n\n    @staticmethod\n    def urljoin(base_url, path):\n        \"\"\"\n        链接拼接\n        @param base_url: 原链接\n        @param path: 路径\n        @return: 拼接后的链接\n        \"\"\"\n        return urljoin(base_url, path)\n\n    @staticmethod\n    def coverDict2form(data: dict):\n        \"\"\"\n        字典转form\n        @param data:\n        @return:\n        \"\"\"\n        forms = []\n        for k, v in data.items():\n            forms.append(f'{k}={v}')\n        return '&'.join(forms)\n\n    @staticmethod\n    def buildUrl(url: str, obj: dict = None):\n        \"\"\"\n        @param url:基础链接可以带query\n        @param obj:要更新的query字典。会覆盖基础链接中同名query\n        @return:\n        \"\"\"\n        if obj is None:\n            return url\n        if '?' in url:\n            old_query = url.split('?')[1]\n            old_params = {}\n            for text in old_query.split('&'):\n                key = text.split('=')[0]\n                value = text.split('=')[1]\n                old_params[key] = value\n        else:\n            old_params = {}\n\n        new_obj = old_params.copy()\n        new_obj.update(obj)\n        param_list = [f'{i}={new_obj[i]}' for i in new_obj]\n        prs = '&'.join(param_list)\n        if param_list:\n            url = url.split('?')[0] + '?' + prs\n        return url\n\n    @staticmethod\n    def to_lower_camel_case(x):\n        \"\"\"转小驼峰法命名：下划线转驼峰且首字母小写\"\"\"\n        s = re.sub('_([a-zA-Z])', lambda m: (m.group(1).upper()), x)\n        return s[0].lower() + s[1:]\n\n    @staticmethod\n    def md5(text):\n        \"\"\"\n        md5加密\n        @param text: 明文\n        @return: 加密结果\n        \"\"\"\n        return hashlib.md5(text.encode(encoding='UTF-8')).hexdigest()\n\n    @staticmethod\n    def gzinflate(compressed: bytes) -> bytes:\n        \"\"\"\n        gzip解压\n        @param compressed: 压缩后的字节\n        @return:\n        \"\"\"\n        return zlib.decompress(compressed, -zlib.MAX_WBITS)\n\n    @staticmethod\n    def gzipCompress(compressed: bytes) -> bytes:\n        \"\"\"\n        gzip解压\n        @param compressed: 压缩后的字节\n        @return:\n        \"\"\"\n        return gzip.decompress(compressed)\n\n    @staticmethod\n    def gzip(input_str: str) -> str:\n        \"\"\"\n        将字符串进行 gzip 压缩，并返回 base64 编码的结果\n\n        Args:\n            input_str: 要压缩的字符串\n\n        Returns:\n            base64 编码的压缩数据\n        \"\"\"\n        try:\n            # 将字符串编码为 UTF-8 字节\n            utf8_bytes = input_str.encode('utf-8')\n\n            # 使用 zlib 进行 gzip 压缩\n            # wbits 参数设置为 31 表示使用 gzip 头部和尾部\n            compressed_data = zlib.compress(utf8_bytes, level=zlib.Z_BEST_COMPRESSION, wbits=31)\n\n            # 将压缩数据编码为 base64 字符串\n            b64_data = base64.b64encode(compressed_data).decode('ascii')\n\n            return b64_data\n\n        except Exception as e:\n            raise ValueError(f\"压缩过程中出错: {str(e)}\")\n\n    @staticmethod\n    def ungzip(b64_data: str) -> str:\n        \"\"\"\n        解码 base64 字符串，进行 gzip 解压缩，并返回 UTF-8 字符串\n\n        Args:\n            b64_data: base64 编码的压缩数据\n\n        Returns:\n            解压缩后的 UTF-8 字符串\n        \"\"\"\n        try:\n            # 解码 base64 字符串\n            compressed_data = base64.b64decode(b64_data)\n\n            # 使用 zlib 进行 gzip 解压缩\n            # wbits 参数设置为 15+32 表示自动检测 gzip 头部\n            decompressed_data = zlib.decompress(compressed_data, zlib.MAX_WBITS | 32)\n\n            # 将字节数据解码为 UTF-8 字符串\n            return decompressed_data.decode('utf-8')\n\n        except Exception as e:\n            raise ValueError(f\"解压缩过程中出错: {str(e)}\")\n\n    # 辅助函数：将字节数组转换为 UTF-8 字符串（如果需要）\n    @staticmethod\n    def utf8_array_to_str(data: List[int]) -> str:\n        \"\"\"将整数列表（字节值）转换为 UTF-8 字符串\"\"\"\n        byte_array = bytes(data)\n        return byte_array.decode('utf-8')\n\n    @staticmethod\n    def bytes2stream(some_bytes: bytes):\n        \"\"\"\n        字节转文件流\n        @param some_bytes:\n        @return:\n        \"\"\"\n        return io.BytesIO(some_bytes)\n\n    @staticmethod\n    def stream2bytes(some_stream):\n        \"\"\"\n        文件流转字节\n        @param some_stream:\n        @return:\n        \"\"\"\n        return some_stream.read()\n\n    def skip_bytes(self, some_bytes: bytes, pos=0) -> bytes:\n        \"\"\"\n        跳过位置之前的字节并返回\n        @param some_bytes:\n        @param pos: 待跳过的位置，默认0不跳过\n        @return:\n        \"\"\"\n\n        some_stream = self.bytes2stream(some_bytes)\n        some_stream.seek(pos)\n        return self.stream2bytes(some_stream)\n\n    @staticmethod\n    def base64Encode(text):\n        \"\"\"\n        base64编码文本\n        @param text:\n        @return:\n        \"\"\"\n        return base64.b64encode(text.encode(\"utf8\")).decode(\"utf-8\")  # base64编码\n\n    @staticmethod\n    def base64Decode(text: str):\n        \"\"\"\n        base64文本解码\n        @param text:\n        @return:\n        \"\"\"\n        return base64.b64decode(text).decode(\"utf-8\")  # base64解码\n\n    @staticmethod\n    def atob(text):\n        \"\"\"\n        base64编码文本-同浏览器\n        :param text:\n        :return:\n        \"\"\"\n        return base64.b64decode(text.encode(\"utf8\")).decode(\"latin1\")\n\n    @staticmethod\n    def btoa(text):\n        \"\"\"\n        base64文本解码-同浏览器\n        :param text:\n        :return:\n        \"\"\"\n        return base64.b64encode(text.encode(\"latin1\")).decode(\"utf8\")\n\n    @staticmethod\n    def check_unsafe_attributes(string):\n        \"\"\"\n        安全检测需要exec执行的python代码\n        :param string:\n        :return:\n        \"\"\"\n        g = tokenize.tokenize(io.BytesIO(string.encode('utf-8')).readline)\n        pre_op = ''\n        for toktype, tokval, _, _, _ in g:\n            if toktype == tokenize.NAME and pre_op == '.' and tokval.startswith('_'):\n                attr = tokval\n                msg = \"access to attribute '{0}' is unsafe.\".format(attr)\n                raise AttributeError(msg)\n            elif toktype == tokenize.OP:\n                pre_op = tokval\n\n    @staticmethod\n    def aes_cbc_decode(ciphertext, key, iv):\n        \"\"\"\n        aes cbc格式解密\n        @param ciphertext:加密的字符串\n        @param key: 加密密钥\n        @param iv: 加密偏移量\n        @return:解密后的文本明文\n        \"\"\"\n        # 将密文转换成byte数组\n        ciphertext = base64.b64decode(ciphertext)\n        # 构建AES解密器\n        decrypter = AES.new(key.encode(), AES.MODE_CBC, iv.encode())\n        # 解密\n        plaintext = decrypter.decrypt(ciphertext)\n        # 去除填充\n        plaintext = unpad(plaintext, AES.block_size)\n        # 输出明文\n        return plaintext.decode('utf-8')\n\n    @staticmethod\n    def rsa_private_decode(ciphertext, private_key, default_length=256):\n        \"\"\"\n        rsa私钥解密\n        @param ciphertext: 加密的字符串\n        @param private_key: 私钥\n        @param default_length: 分段加密长度,默认256位\n        @return: 解密后的文本明文\n        \"\"\"\n        # 计算需要添加的等号数\n        b64_ciphertext = ciphertext\n        num_padding = 4 - (len(b64_ciphertext) % 4)\n        if num_padding < 4:\n            b64_ciphertext += \"=\" * num_padding\n        # 将密文转换成byte数组\n        ciphertext = base64.b64decode(b64_ciphertext)\n        # 构建RSA解密器\n        private_key = f'-----BEGIN RSA PRIVATE KEY-----\\n{private_key}\\n-----END RSA PRIVATE KEY-----'\n        pri_Key = RSA.importKey(private_key)\n        decrypter = PKCS1_cipher.new(pri_Key)\n        # 解密\n        length = len(ciphertext)\n        # 长度不用分段\n        if length < default_length:\n            plaintext = b''.join(decrypter.decrypt(ciphertext, b' '))\n        else:\n            # 需要分段\n            offset = 0\n            res = []\n            while length - offset > 0:\n                if length - offset > default_length:\n                    res.append(decrypter.decrypt(ciphertext[offset:offset + default_length], b' '))\n                else:\n                    res.append(decrypter.decrypt(ciphertext[offset:], b' '))\n                offset += default_length\n\n            plaintext = b''.join(res)\n        return plaintext.decode('utf-8')\n\n    @staticmethod\n    def rsa_public_encode(text, public_key, default_length=256):\n        \"\"\"\n        rsa公钥加密\n        @param text: 明文\n        @param public_key: 公钥\n        @param default_length: 分段加密长度默认 256\n        @return: 密文\n        \"\"\"\n        public_key = \"-----BEGIN RSA PRIVATE KEY-----\\n\" + public_key + \"\\n-----END RSA PRIVATE KEY-----\"\n        pub_key = RSA.importKey(public_key)\n        cipher = PKCS1_cipher.new(pub_key)\n        text = text.encode(\"utf-8)\")\n        length = len(text)\n        if length < default_length:\n            rsa_text = base64.b64encode(cipher.encrypt(text))  # 加密并转为b64编码\n        else:\n            # 需要分段\n            offset = 0\n            res = []\n            while length - offset > 0:\n                if length - offset > default_length:\n                    res.append(cipher.encrypt(text[offset:offset + default_length]))\n                else:\n                    res.append(cipher.encrypt(text[offset:]))\n                offset += default_length\n            byte_data = b''.join(res)\n\n            rsa_text = base64.b64encode(byte_data)\n\n        ciphertext = rsa_text.decode(\"utf8\")\n        return ciphertext\n\n    @staticmethod\n    def remove_comments(text):\n        \"\"\"\n        字符串删除注释\n        @param text:带注释的字符串\n        @return:\n        \"\"\"\n\n        pattern = re.compile(r'\\s*[\\'\\\"]{3}[\\S\\s]*?[\\'\\\"]{3}')\n        text = pattern.sub('', text)\n        pattern = re.compile(r'\\s*/\\*[\\S\\s]*?\\*/')\n        text = pattern.sub('', text)\n        text = text.splitlines()\n        text = [txt for txt in text if not (txt.strip().startswith('//') or txt.strip().startswith('#'))]\n        text = '\\n'.join(text)\n        return text.strip()\n\n    # ==================== 个性化函数 ======================\n    def superStr2dict(self, text: str):\n        text = self.remove_comments(text)\n        localdict = {'true': True, 'false': False, 'null': None}\n        self.safe_eval(f'result={text}', localdict)\n        result = localdict.get('result') or {}\n        return result\n\n    def fixAdM3u8(self, m3u8_text, m3u8_url='', ad_remove=''):\n        \"\"\"\n        修复带广告的m3u8文本\n        @param m3u8_text: 带广告的m3u8文本\n        @param m3u8_url: m3u8原地址链接\n        @param ad_remove: 广告去除正则表达式字符串如: reg:/video/adjump(.*?)ts\n        @return:\n        \"\"\"\n        # ad_remove = 'reg:/video/adjump(.*?)ts'\n        if ad_remove.startswith('reg:'):\n            ad_remove = ad_remove[4:]\n        elif ad_remove.startswith('js:'):\n            ad_remove = ad_remove[3:]\n        else:\n            ad_remove = None\n\n        print(ad_remove)\n\n        # 开头\n        m3u8_start = m3u8_text[:m3u8_text.find('#EXTINF')].strip()\n        # 中间\n        m3u8_body = m3u8_text[m3u8_text.find('#EXTINF'):m3u8_text.find('#EXT-X-ENDLIST')].strip()\n        # 结尾\n        m3u8_end = m3u8_text[m3u8_text.find('#EXT-X-ENDLIST'):].strip()\n\n        murls = []\n        m3_body_list = m3u8_body.splitlines()\n        m3_len = len(m3_body_list)\n        i = 0\n        while i < m3_len:\n            mi = m3_body_list[i]\n            mi_1 = m3_body_list[i + 1]\n            if mi.startswith('#EXTINF'):\n                murls.append('&'.join([mi, mi_1]))\n                i += 2\n            elif mi.startswith('#EXT-X-DISCONTINUITY'):\n                mi_2 = m3_body_list[i + 2]\n                murls.append('&'.join([mi, mi_1, mi_2]))\n                i += 3\n            else:\n                break\n        new_m3u8_body = []\n        for murl in murls:\n            if ad_remove and self.regStr(murl, ad_remove):\n                pass\n            else:\n                murl_list = murl.split('&')\n                if not murl_list[-1].startswith('http') and m3u8_url.startswith('http'):\n                    murl_list[-1] = self.urljoin(m3u8_url, murl_list[-1])\n                new_m3u8_body.extend(murl_list)\n\n        new_m3u8_body = '\\n'.join(new_m3u8_body).strip()\n        m3u8_text = '\\n'.join([m3u8_start, new_m3u8_body, m3u8_end]).strip()\n        return m3u8_text\n\n    def eval_computer(self, text):\n        \"\"\"\n        自定义的字符串安全计算器\n        @param text:字符串的加减乘除\n        @return:计算后得到的值\n        \"\"\"\n        localdict = {}\n        self.safe_eval(f'ret={text.replace(\"=\", \"\")}', localdict)\n        ret = localdict.get('ret') or None\n        return ret\n\n    def safe_eval(self, code: str = '', localdict: dict = None):\n        \"\"\"\n        安全执行python代码，返回执行后的数据字典\n        @param code: python代码文本\n        @param localdict: 待返回字典参数\n        @return: localdict\n        \"\"\"\n        code = code.strip()\n        if not code:\n            return {}\n        if localdict is None:\n            localdict = {}\n        builtins = __builtins__\n        if not isinstance(builtins, dict):\n            builtins = builtins.__dict__.copy()\n        else:\n            builtins = builtins.copy()\n        for key in ['__import__', 'eval', 'exec', 'globals', 'dir', 'copyright', 'open', 'quit']:\n            del builtins[key]  # 删除不安全的关键字\n        # print(builtins)\n        global_dict = {'__builtins__': builtins,\n                       'json': json, 'print': print,\n                       're': re, 'time': time, 'base64': base64\n                       }  # 禁用内置函数,不允许导入包\n        try:\n            self.check_unsafe_attributes(code)\n            exec(code, global_dict, localdict)\n            return localdict\n        except Exception as e:\n            return {'error': f'执行报错:{e}'}\n\n\nSpider = BaseSpider\n"
  },
  {
    "path": "resources/t3PyBase/main.py",
    "content": "import argparse\nimport asyncio\nimport builtins\nfrom functools import lru_cache\nimport importlib.util\nimport inspect\nimport json\nimport signal\nimport sys\nfrom typing import Any, Dict, List, Optional\nimport zmq\n\nsignal.signal(signal.SIGINT, lambda signum, frame: sys.exit(130))\nbuiltins.original_print = builtins.print\n\n\ndef custom_print(*args: Any, **kwargs: Any) -> None:\n    try:\n        log: Dict[str, Any] = {\n            \"type\": \"multiple\" if len(args) > 0 else \"single\",\n            \"msg\": [*args, *[f'{k}={v}' for k, v in kwargs.items()]]\n        }\n        builtins.original_print(log)  # type: ignore[attr-defined]\n        log_socket.send_string(json.dumps(log, ensure_ascii=False))\n    except zmq.ZMQError:\n        pass\n\n\ndef ensure_json_str(val: Any) -> str:\n    if isinstance(val, str):\n        return val\n    try:\n        return json.dumps(val)\n    except (TypeError, ValueError):\n        return val\n\n\ndef parse_args() -> argparse.Namespace:\n    parser = argparse.ArgumentParser(description=\"Spider ZMQ server\")\n    parser.add_argument(\"--ctrl-port\", type=int, default=19979, help=\"Control port\")\n    parser.add_argument(\"--log-port\", type=int, help=\"Log port (default=ctrl_port+1)\")\n    return parser.parse_args()\n\n\ndef load_module_from_code(module_name: str, source_code: str) -> Any:\n    spec = importlib.util.spec_from_loader(module_name, loader=None)\n    module = importlib.util.module_from_spec(spec)\n    sys.modules[module_name] = module\n    exec(source_code, module.__dict__)\n    return module\n\n\ndef sync_wrapper(func: Any, params: Optional[List[Any]]) -> Any:\n    if params is None or not params:\n        if inspect.iscoroutinefunction(func):\n            return asyncio.run(func())\n        return func()\n    if inspect.iscoroutinefunction(func):\n        return asyncio.run(func(*params))\n    return func(*params)\n\n\n@lru_cache(maxsize=10)\ndef get_spider(code_hash: int, code_str: str) -> Any:\n    module_name = f\"dynamic_module_{code_hash}\"\n    module = load_module_from_code(module_name, code_str)\n\n    spider_cls = getattr(module, \"Spider\", None)\n    if spider_cls is None:\n        raise ImportError(\"Spider class not found in module\")\n\n    spider = spider_cls(t4_api=\"http://127.0.0.1:9978/proxy?do=py\")\n    return spider\n\n\ndef core(method: str, source_code: str, opts: List[Any]) -> Any:\n    # print(f\"Received request: method={method}, options={opts}\")\n\n    if not source_code:\n        raise RuntimeError(f\"Source content is empty\")\n\n    uuid = hash(source_code)\n    spider = get_spider(uuid, source_code)\n\n    method_obj = getattr(spider, method, None)\n    if not method_obj:\n        raise RuntimeError(f\"Method '{method}' not found in Spider class\")\n\n    try:\n        return sync_wrapper(method_obj, opts)\n    except Exception as exc:\n        raise RuntimeError(f\"Failed to execute method '{method}': {exc}\") from exc\n\n\nif __name__ == '__main__':\n    cli_args = parse_args()\n    CTRL_PORT = cli_args.ctrl_port\n    LOG_PORT = cli_args.log_port or (CTRL_PORT + 1)\n\n    try:\n        context = zmq.Context()\n\n        log_socket = context.socket(zmq.PUB)\n        log_socket.bind(f\"tcp://*:{LOG_PORT}\")\n\n        builtins.print = custom_print\n\n        ctrl_socket = context.socket(zmq.REP)\n        ctrl_socket.bind(f\"tcp://*:{CTRL_PORT}\")\n\n        sys.stdout.write(f\"Spider ZMQ server started. CTRL_PORT={CTRL_PORT}, LOG_PORT={LOG_PORT}\\n\")\n        sys.stdout.flush()\n\n        while True:\n            try:\n                message: str = ctrl_socket.recv_string()\n                request: Dict[str, Any] = json.loads(message)\n\n                code: str = request.get(\"code\", \"\")\n                method_name: str = request.get(\"type\", \"\")\n                options: List[Any] = request.get(\"options\", [])\n\n                if method_name == \"init\":\n                    if not options:\n                        options = ['']\n                    options = [ensure_json_str(options[0])]\n\n                res: Any = core(method_name, code, options)\n                ctrl_socket.send_string(json.dumps(res, ensure_ascii=False))\n\n            except Exception as e:\n                log_socket.send_string(\n                    json.dumps({\"type\": \"single\", \"msg\": [f\"Failed to execute, cause: {str(e) or 'Unknown error'}\"]},\n                               ensure_ascii=False))\n                ctrl_socket.send_string(json.dumps({\"error\": f\"{str(e) or 'Unknown error'}\"}, ensure_ascii=False))\n\n    except SystemExit:\n        sys.stdout.write(\"Spider ZMQ server exited\")\n        sys.stdout.flush()\n        sys.exit(130)\n\n    except Exception as main_e:\n        sys.stdout.write(f\"Spider exited: {str(main_e)}\")\n        sys.stdout.flush()\n        sys.exit(1)\n"
  },
  {
    "path": "resources/t3PyBase/pyproject.toml",
    "content": "[project]\nname = \"zyfun-film-adapter_t3_py\"\nversion = \"0.1.0\"\nrequires-python = \">=3.6\"\ndependencies = [\n  \"cachetools\",\n  \"lxml\",\n  \"jsonpath\",\n  \"pyquery\",\n  \"pycryptodome\",\n  \"requests\",\n  \"pyzmq\"\n]\n"
  },
  {
    "path": "resources/t3PyBase/requirements.txt",
    "content": "cachetools\nlxml\njsonpath\npyquery\npycryptodome\nrequests\npyzmq\n"
  },
  {
    "path": "scripts/after-pack.js",
    "content": "const fs = require('node:fs');\nconst path = require('node:path');\n\nexports.default = async function (context) {\n  const platform = context.packager.platform.name;\n  if (platform === 'windows') {\n    fs.rmSync(path.join(context.appOutDir, 'LICENSE.electron.txt'), { force: true });\n    fs.rmSync(path.join(context.appOutDir, 'LICENSES.chromium.html'), { force: true });\n  }\n};\n"
  },
  {
    "path": "scripts/artifact-build-completed.js",
    "content": "const fs = require('node:fs');\n\nexports.default = function (buildResult) {\n  try {\n    console.log('  • building completed  rename artifact file...');\n    if (!buildResult.file.includes(' ')) {\n      return;\n    }\n\n    const oldFilePath = buildResult.file;\n    const newfilePath = oldFilePath.replace(/ /g, '-');\n    fs.renameSync(oldFilePath, newfilePath);\n    buildResult.file = newfilePath;\n    console.log(`  • building completed  rename file ${oldFilePath} to ${newfilePath} `);\n  } catch (error) {\n    console.error('  • Error renaming file:', error);\n  }\n};\n"
  },
  {
    "path": "scripts/before-pack.js",
    "content": "const { Arch } = require('electron-builder');\nconst { execSync } = require('node:child_process');\nconst fs = require('node:fs');\nconst path = require('node:path');\nconst yaml = require('js-yaml');\n\nconst workspaceConfigPath = path.join(__dirname, '..', 'pnpm-workspace.yaml');\n\n// if you want to add new prebuild binaries packages with different architectures, you can add them here\n// please add to allX64 and allArm64 from pnpm-lock.yaml\nconst packages = [\n  '@libsql/darwin-arm64',\n  '@libsql/darwin-x64',\n  '@libsql/linux-arm64-gnu',\n  '@libsql/linux-x64-gnu',\n  '@libsql/linux-arm64-musl',\n  '@libsql/linux-x64-musl',\n  '@libsql/win32-x64-msvc',\n  '@strongtz/win32-arm64-msvc',\n];\n\nconst platformToArch = {\n  mac: 'darwin',\n  windows: 'win32',\n  linux: 'linux',\n  linuxmusl: 'linuxmusl',\n};\n\nexports.default = async function (context) {\n  const arch = context.arch === Arch.arm64 ? 'arm64' : 'x64';\n  const platformName = context.packager.platform.name;\n  const platform = platformToArch[platformName];\n\n  const downloadPackages = async () => {\n    // Skip if target platform and architecture match current system\n    if (platform === process.platform && arch === process.arch) {\n      console.log(`  • Skipping install: target (${platform}/${arch}) matches current system`);\n      return;\n    }\n\n    console.log(`  • Installing packages for target platform=${platform} arch=${arch}...`);\n\n    // Backup and modify pnpm-workspace.yaml to add target platform support\n    const originalWorkspaceConfig = fs.readFileSync(workspaceConfigPath, 'utf-8');\n    const workspaceConfig = yaml.load(originalWorkspaceConfig);\n\n    // Add target platform to supportedArchitectures.os\n    if (!workspaceConfig.supportedArchitectures.os.includes(platform)) {\n      workspaceConfig.supportedArchitectures.os.push(platform);\n    }\n\n    // Add target architecture to supportedArchitectures.cpu\n    if (!workspaceConfig.supportedArchitectures.cpu.includes(arch)) {\n      workspaceConfig.supportedArchitectures.cpu.push(arch);\n    }\n\n    const modifiedWorkspaceConfig = yaml.dump(workspaceConfig);\n    // console.log('  • Modified workspace config:', modifiedWorkspaceConfig);\n    fs.writeFileSync(workspaceConfigPath, modifiedWorkspaceConfig);\n\n    try {\n      execSync(`pnpm install`, { stdio: 'inherit' });\n    } finally {\n      // Restore original pnpm-workspace.yaml\n      fs.writeFileSync(workspaceConfigPath, originalWorkspaceConfig);\n    }\n  };\n\n  await downloadPackages();\n\n  const excludePackages = async (packagesToExclude) => {\n    // 从项目根目录的 electron-builder.yml 读取 files 配置，避免多次覆盖配置导致出错\n    const electronBuilderConfigPath = path.join(__dirname, '..', 'electron-builder.yml');\n    const electronBuilderConfig = yaml.load(fs.readFileSync(electronBuilderConfigPath, 'utf-8'));\n    const filters = electronBuilderConfig.files;\n\n    // add filters for other architectures (exclude them)\n    filters.push(...packagesToExclude);\n\n    context.packager.config.files[0].filter = filters;\n  };\n\n  const arm64KeepPackages = packages.filter((p) => p.includes('arm64') && p.includes(platform));\n  const arm64ExcludePackages = packages\n    .filter((p) => !arm64KeepPackages.includes(p))\n    .map((p) => `!node_modules/${p}/**`);\n\n  const x64KeepPackages = packages.filter((p) => p.includes('x64') && p.includes(platform));\n  const x64ExcludePackages = packages.filter((p) => !x64KeepPackages.includes(p)).map((p) => `!node_modules/${p}/**`);\n\n  const excludeRipgrepFilters = ['arm64-darwin', 'arm64-linux', 'x64-darwin', 'x64-linux', 'x64-win32'].filter((f) => {\n    // On Windows ARM64, also keep x64-win32 for emulation compatibility\n    if (platform === 'win32' && context.arch === Arch.arm64 && f === 'x64-win32') {\n      return false;\n    }\n    return f !== `${arch}-${platform}`;\n  });\n\n  if (context.arch === Arch.arm64) {\n    await excludePackages([...arm64ExcludePackages, ...excludeRipgrepFilters]);\n  } else {\n    await excludePackages([...x64ExcludePackages, ...excludeRipgrepFilters]);\n  }\n};\n"
  },
  {
    "path": "scripts/generate-changelog.js",
    "content": "const fs = require('node:fs/promises');\nconst path = require('node:path');\nconst semver = require('semver');\n\nconst ROOT_DIR = path.join(__dirname, '..');\nconst OUTPUT_FILE = path.join(ROOT_DIR, 'CHANGELOG.md');\n\nconst owner = 'Hiram-Wong';\nconst repo = 'zyfun';\nconst GITHUB_TOKEN = process.env.GITHUB_TOKEN || '';\nconst PER_PAGE = 100;\n\nfunction normalizeVersion(tag) {\n  const clean = tag.replace(/^v/i, '');\n  return semver.valid(clean) || semver.valid(semver.coerce(clean));\n}\n\nasync function fetchAllReleases() {\n  let page = 1;\n  const all = [];\n\n  while (true) {\n    const url = `https://api.github.com/repos/${owner}/${repo}/releases?per_page=${PER_PAGE}&page=${page}`;\n\n    const res = await fetch(url, {\n      headers: {\n        Accept: 'application/vnd.github+json',\n        ...(GITHUB_TOKEN && {\n          Authorization: `Bearer ${GITHUB_TOKEN}`,\n        }),\n      },\n    });\n\n    if (!res.ok) {\n      throw new Error(`GitHub API error: ${res.status}`);\n    }\n\n    const data = await res.json();\n    if (!Array.isArray(data) || data.length === 0) break;\n\n    all.push(...data);\n    page++;\n  }\n\n  return all\n    .map((r) => {\n      const version = normalizeVersion(r.tag_name);\n      if (!version) return null;\n\n      return {\n        version,\n        tag: r.tag_name,\n        publishedAt: r.published_at?.slice(0, 10),\n        body: r.body?.trim(),\n        url: r.html_url,\n      };\n    })\n    .filter(Boolean)\n    .sort((a, b) => semver.rcompare(a.version, b.version));\n}\n\n(async () => {\n  console.log('🔍 Generating CHANGELOG...');\n\n  try {\n    const releases = await fetchAllReleases();\n\n    const content = [\n      '# Changelog',\n      '',\n      '> All notable changes to this project will be documented in this file.',\n      '',\n      ...releases.map((r) => {\n        return [\n          `## ${r.tag} (${r.publishedAt || 'unknown'})`,\n          '',\n          r.body || '_No release notes provided._',\n          '',\n          `[View on GitHub](${r.url})`,\n          '',\n        ].join('\\n');\n      }),\n    ].join('\\n');\n\n    await fs.writeFile(OUTPUT_FILE, content, 'utf8');\n\n    console.log(`✅ CHANGELOG generated: ${OUTPUT_FILE}`);\n  } catch (error) {\n    console.error('❌ Failed to generate CHANGELOG:\\n', error);\n    process.exit(1);\n  }\n})();\n"
  },
  {
    "path": "scripts/generate-license.js",
    "content": "const checker = require('license-checker');\nconst fs = require('node:fs/promises');\nconst path = require('node:path');\nconst { satisfies: spdxSatisfies } = require('spdx-satisfies');\nconst semver = require('semver');\n\nconst ROOT_DIR = path.join(__dirname, '..');\nconst OUTPUT_FILE = path.join(ROOT_DIR, 'ThirdPartyNotices.txt');\nconst PACKAGE_JSON = require(path.join(ROOT_DIR, 'package.json'));\n\nconst TOP_LEVEL_DEPS = (() => {\n  const pkg = PACKAGE_JSON;\n\n  return new Set([\n    ...Object.keys(pkg.dependencies || {}),\n    ...Object.keys(pkg.devDependencies || {}),\n    ...Object.keys(pkg.optionalDependencies || {}),\n    ...Object.keys(pkg.peerDependencies || {}),\n  ]);\n})();\n\n/**\n * A general note on some black listed specific licenses:\n * - CC0\n *    This is not a valid license. It does not grant copyright of the code/asset, and does not\n *    resolve patents or other licensed work. The different claims also have no standing in court\n *    and do not provide protection to or from Google and/or third parties.\n *    We cannot use nor contribute to CC0 licenses.\n * - Public Domain\n *    Same as CC0, it is not a valid license.\n */\nconst LICENSE_WHITELIST = [\n  // Regular valid open source licenses supported by Google.\n  'MIT',\n  'ISC',\n  'Apache-2.0',\n\n  'BSD-2-Clause',\n  'BSD-3-Clause',\n  'BSD-4-Clause',\n\n  // All CC-BY licenses have a full copyright grant and attribution section.\n  'CC-BY-3.0',\n  'CC-BY-4.0',\n\n  // Have a full copyright grant. Validated by opensource team.\n  'Unlicense',\n\n  // Combinations.\n  '(AFL-2.1 OR BSD-2-Clause)',\n  '(MIT OR CC-BY-3.0)',\n  '(MIT OR Apache-2.0)',\n  '(MIT OR BSD-3-Clause)',\n];\n\n/**\n * Name variations of SPDX licenses that some packages have.\n * Licenses not included in SPDX but accepted will be converted to MIT.\n */\nconst LICENSE_REPLACEMENTS = {\n  // Just a longer string that our script catches. SPDX official name is the shorter one.\n  'Apache License, Version 2.0': 'Apache-2.0',\n  Apache2: 'Apache-2.0',\n  'Apache 2.0': 'Apache-2.0',\n  'AFLv2.1': 'AFL-2.1',\n  // BSD is BSD-2-clause by default.\n  BSD: 'BSD-2-Clause',\n  'BSD-like': 'BSD-2-Clause',\n  'BSD*': 'BSD-2-Clause',\n  'MIT*': 'MIT',\n  'Apache*': 'Apache-2.0',\n  'Apache 2': 'Apache-2.0',\n  'Apache v2': 'Apache-2.0',\n  'Apache License 2.0': 'Apache-2.0',\n};\n\n/**\n * Specific packages to ignore, add a reason in a comment. Format: package-name@version.\n */\nconst IGNORED_PACKAGES = new Set([\n  // no license file\n\n  // electron\n  'electron-builder',\n  'electron-devtools-installer',\n  'electron-icon-builder',\n  'electron-publish',\n  'electron-rebuild',\n  'electron-to-chromium',\n  'electron-vite',\n  'electron',\n  'electronmon',\n\n  // other\n  'depcheck',\n  'eslint',\n  'eslint-config-prettier',\n  'eslint-plugin-prettier',\n  'eslint-plugin-simple-import-sort',\n  'eslint-plugin-vue-scoped-css',\n  'jest-styled-components',\n  'license-checker',\n  'lint-staged',\n  'npm-check-updates',\n  'prettier',\n  'pinia-plugin-persistedstate',\n  'prettier-plugin-sort-json',\n  'stylelint',\n  'stylelint-config-standard',\n  'stylelint-order',\n  'typescript',\n  'typescript-eslint',\n  'unplugin-auto-import',\n  'unplugin-vue-components',\n  'vite-plugin-vue-devtools',\n  'vitest',\n]);\n\n/**\n * Normalize license string to standard SPDX identifier.\n */\nfunction normalizeLicense(license) {\n  if (!license) return '';\n  return LICENSE_REPLACEMENTS[license.replace(/\\*$/, '')] || license;\n}\n\n/**\n * Check if the license expression is allowed.\n */\nfunction isLicenseAllowed(licenses, whitelist) {\n  const licenseExpression = Array.isArray(licenses) ? licenses.join(' OR ') : licenses;\n  return whitelist.some((accepted) => {\n    try {\n      return spdxSatisfies(licenseExpression, accepted);\n    } catch {\n      const compare = (l) => accepted.includes(l) || l.includes(accepted);\n      return Array.isArray(licenses) ? licenses.some(compare) : compare(licenses);\n    }\n  });\n}\n\n/**\n * Determine if a package passes validation.\n */\nfunction validatePackage(pkg) {\n  // if (!pkg.licenseFile) return false;\n  if (IGNORED_PACKAGES.has(pkg.name)) return false;\n  if (!TOP_LEVEL_DEPS.has(pkg.name)) return false;\n\n  if (!isLicenseAllowed(pkg.licenses, LICENSE_WHITELIST)) return false;\n\n  return true;\n}\n\n/**\n * Filter to only include the latest version of each package.\n */\nfunction latestPackages(pkg, index, array) {\n  if (!latestPackages.latestMap) {\n    latestPackages.latestMap = new Map();\n\n    for (const p of array) {\n      const existing = latestPackages.latestMap.get(p.name);\n\n      if (!existing) {\n        latestPackages.latestMap.set(p.name, p);\n        continue;\n      }\n\n      const v1 = p.version;\n      const v2 = existing.version;\n\n      if (semver.valid(v1) && semver.valid(v2)) {\n        if (semver.gt(v1, v2)) latestPackages.latestMap.set(p.name, p);\n      } else {\n        if (v1 > v2) latestPackages.latestMap.set(p.name, p);\n      }\n    }\n  }\n\n  const newest = latestPackages.latestMap.get(pkg.name);\n  return newest && newest.id === pkg.id;\n}\n\n(async () => {\n  console.log('🔍 Checking licenses...');\n\n  const licenseData = await new Promise((resolve, reject) => {\n    checker.init({ start: ROOT_DIR }, (error, json) => {\n      if (error) reject(error);\n      else resolve(json);\n    });\n  });\n\n  const validPackages = Object.entries(licenseData)\n    .map(([id, info]) => ({\n      id,\n      name: id.split('@')?.[0],\n      version: id.split('@')?.[1] ?? 'UNKNOWN',\n      repository: info.repository ?? 'N/A',\n      licenseFile: info.licenseFile ?? '',\n      licenses: [...[], ...(info.licenses || [])].map(normalizeLicense),\n    }))\n    .filter(validatePackage)\n    .filter(latestPackages);\n\n  console.log(`✅ ${validPackages.length} valid packages found.`);\n\n  const results = await Promise.all(\n    validPackages.map(async (pkg) => {\n      try {\n        const licenseFileName = path.basename(pkg.licenseFile).toLowerCase();\n        const content = licenseFileName.startsWith('readme')\n          ? `NO LICENSE CONTENT, USE ${pkg.licenses.join('')} GENERIC RULES`\n          : await fs.readFile(pkg.licenseFile, 'utf8');\n        const determine = [\n          '---------------------------------------------------------\\n\\n',\n          pkg.name,\n          '\\n',\n          pkg.repository,\n          '\\n\\n',\n          content.trim(),\n          '\\n---------------------------------------------------------\\n\\n',\n        ].join('');\n        return determine;\n      } catch (error) {\n        console.warn(`⚠️ Failed to read license for ${pkg.id}: ${error.message}`);\n        return '';\n      }\n    }),\n  );\n\n  results.unshift(\n    'NOTICES',\n    '\\n\\n',\n    'This repository incorporates material as listed below or described in the code.',\n    '\\n\\n\\n',\n  );\n  await fs.writeFile(OUTPUT_FILE, results.join(''), { encoding: 'utf8' });\n\n  console.log(`📄 License report generated at: ${OUTPUT_FILE}`);\n})().catch((error) => {\n  console.error('❌ Failed to generate license report:\\n', error);\n  process.exit(1);\n});\n"
  },
  {
    "path": "scripts/minidump.js",
    "content": "const fs = require('node:fs');\nconst minidump = require('minidump');\nconst path = require('node:path');\n\n// https://github.com/electron/electron/releases\nlet symbolPaths = path.join(__dirname, 'symbols');\nlet file = path.join(__dirname, 'crash.dmp');\n\nconst args = process.argv.slice(2);\nif (args.length >= 1) file = args[0];\nif (args.length >= 2) symbolPaths = args[1];\n\nminidump.walkStack(file, symbolPaths, (error, result) => {\n  if (error) {\n    console.error('Minidump read error:', error);\n    return;\n  }\n\n  fs.writeFileSync('dmp.txt', result.toString());\n  console.log('Minidump processed successfully. Output written to dmp.txt');\n});\n\n// node minidump.js (root directory must save the name crash.dmp file)\n// node minidump.js xxx/crash.dmp (specify the dmp file path)\n// node minidump.js xxx/crash.dmp xxx/symbols (specify the dmp file and symbols dir path)\n"
  },
  {
    "path": "scripts/notarize.js",
    "content": "require('dotenv').config();\nconst { notarize } = require('@electron/notarize');\n\nexports.default = async function notarizing(context) {\n  if (context.electronPlatformName !== 'darwin') {\n    return;\n  }\n\n  if (!process.env.APPLE_ID || !process.env.APPLE_APP_SPECIFIC_PASSWORD || !process.env.APPLE_TEAM_ID) {\n    return;\n  }\n\n  const appName = context.packager.appInfo.productFilename;\n  const appPath = `${context.appOutDir}/${appName}.app`;\n\n  await notarize({\n    appPath,\n    appBundleId: 'com.github.zyfun',\n    appleId: process.env.APPLE_ID,\n    appleIdPassword: process.env.APPLE_APP_SPECIFIC_PASSWORD,\n    teamId: process.env.APPLE_TEAM_ID,\n  });\n\n  console.log('  • Notarized app:', appPath);\n};\n"
  },
  {
    "path": "scripts/version.js",
    "content": "const { execSync } = require('node:child_process');\nconst fs = require('node:fs');\n\n// 执行命令并返回输出\nfunction exec(command) {\n  return execSync(command, { encoding: 'utf8' }).trim();\n}\n\n// 获取命令行参数\nconst args = process.argv.slice(2);\nconst versionType = args[0] || 'patch';\nconst shouldPush = args.includes('push');\n\n// 验证版本类型\nif (!['patch', 'minor', 'major'].includes(versionType)) {\n  console.error('Invalid version type. Use patch, minor, or major.');\n  process.exit(1);\n}\n\n// 更新版本\nexec(`pnpm version ${versionType}`);\n\n// 读取更新后的 package.json 获取新版本号\nconst updatedPackageJson = JSON.parse(fs.readFileSync('package.json', 'utf8'));\nconst newVersion = updatedPackageJson.version;\n\n// Git 操作\nexec('git add .');\nexec(`git commit -m \"chore(version): ${newVersion}\"`);\nexec(`git tag -a v${newVersion} -m \"Version ${newVersion}\"`);\n\nconsole.log(`Version bumped to ${newVersion}`);\n\nif (shouldPush) {\n  console.log('Pushing to remote...');\n  exec('git push && git push --tags');\n  console.log('Pushed to remote.');\n} else {\n  console.log('Changes are committed locally. Use \"git push && git push --tags\" to push to remote.');\n}\n"
  },
  {
    "path": "scripts/win-sign.js",
    "content": "const { execSync } = require('node:child_process');\n\nexports.default = async function (configuration) {\n  if (process.env.WIN_SIGN) {\n    const { path } = configuration;\n    if (configuration.path) {\n      try {\n        const certPath = process.env.CERT_PATH;\n        const keyContainer = process.env.CERT_KEY;\n        const csp = process.env.CERT_CSP;\n\n        if (!certPath || !keyContainer || !csp) {\n          throw new Error('CERT_PATH, CERT_KEY or CERT_CSP is not set');\n        }\n\n        console.log('  • Start code signing...');\n        console.log('  • Signing file:', path);\n        const signCommand = `signtool sign /tr http://timestamp.digicert.com /td sha256 /fd sha256 /v /f \"${certPath}\" /csp \"${csp}\" /k \"${keyContainer}\" \"${path}\"`;\n        execSync(signCommand, { stdio: 'inherit' });\n        console.log('  • Code signing completed');\n      } catch (error) {\n        console.error('  • Code signing failed:', error);\n        throw error;\n      }\n    }\n  }\n};\n"
  },
  {
    "path": "src/main/electron.d.ts",
    "content": "declare global {\n  namespace Electron {\n    interface App {\n      isQuitting: boolean;\n    }\n  }\n}\n\nexport {};\n"
  },
  {
    "path": "src/main/env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n\ninterface ImportMetaEnv {\n  VITE_MAIN_BUNDLE_ID: string;\n}\n\ninterface ImportMeta {\n  readonly env: ImportMetaEnv;\n}\n"
  },
  {
    "path": "src/main/index.ts",
    "content": "// don't reorder this file, it's used to initialize the app data dir and\n// other which should be run before the main process is ready\n\nimport process from 'node:process';\n\nimport { electronApp, optimizer } from '@electron-toolkit/utils';\nimport { loggerService } from '@logger';\nimport { registerIpc } from '@main/ipc';\nimport { appLocale } from '@main/services/AppLocale';\nimport { configManager } from '@main/services/ConfigManager';\nimport { dbService } from '@main/services/DbService';\nimport { fastifyService } from '@main/services/FastifyService';\nimport { terminate as filmCmsTerminate } from '@main/services/FastifyService/routes/v1/film/cms/utils/cache';\nimport { fileStorage } from '@main/services/FileStorage';\nimport { menuService } from '@main/services/MenuService';\nimport { pluginService } from '@main/services/PluginService';\nimport { handleProtocolUrl, setupAppImageDeepLink } from '@main/services/ProtocolClient';\nimport { proxyManager } from '@main/services/ProxyManager';\nimport { trayService } from '@main/services/TrayService';\nimport { windowService } from '@main/services/WindowService';\nimport { isDev, isLinux, isMacOS, isWindows } from '@main/utils/systeminfo';\nimport { APP_NAME, APP_NAME_PROTOCOL } from '@shared/config/appinfo';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport { runFunction } from '@shared/modules/function';\nimport { isBoolean, isHttp } from '@shared/modules/validate';\nimport { app, crashReporter } from 'electron';\nimport installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer';\n\nconst logger = loggerService.withContext(LOG_MODULE.MAIN);\n\n// enable local crash reports\ncrashReporter.start({\n  productName: APP_NAME,\n  submitURL: '',\n  uploadToServer: false,\n});\n\n/**\n * Environment Variable Repair\n */\nconst setupEnv = () => {\n  process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; // ignore TLS certificate errors\n  process.env.ELECTRON_DISABLE_SECURITY_WARNINGS = 'true'; // disable security warnings\n\n  process.on('warning', (warning) => {\n    logger.warn(`Capture Warning: ${warning.message}`);\n  });\n\n  // in production mode, handle uncaught exception and unhandled rejection globally\n  if (!isDev) {\n    // handle uncaught exception\n    process.on('uncaughtException', (error) => {\n      logger.error('Uncaught Exception:', error);\n    });\n\n    // handle unhandled rejection\n    process.on('unhandledRejection', (reason, promise) => {\n      logger.error(`Unhandled Rejection at: ${promise} reason: ${reason}`);\n    });\n  }\n};\n\n/**\n * Application Initialization Processing\n */\nconst setupApp = async () => {\n  /**\n   * Disable hardware acceleration if setting is enabled\n   */\n  const dbHardwareAcceleration = configManager.hardwareAcceleration;\n  const disableHardwareAcceleration = isBoolean(dbHardwareAcceleration) ? !dbHardwareAcceleration : false;\n  if (disableHardwareAcceleration) {\n    app.disableHardwareAcceleration();\n  }\n\n  /**\n   * Disable chromium's window animations\n   * main purpose for this is to avoid the transparent window flashing when it is shown\n   * (especially on Windows for SelectionAssistant Toolbar)\n   * Know Issue: https://github.com/electron/electron/issues/12130#issuecomment-627198990\n   */\n  if (isWindows) {\n    app.commandLine.appendSwitch('wm-window-animations-disabled');\n  }\n\n  /**\n   * Enable GlobalShortcutsPortal for Linux Wayland Protocol\n   * see: https://www.electronjs.org/docs/latest/api/global-shortcut\n   */\n  if (isLinux && process.env.XDG_SESSION_TYPE === 'wayland') {\n    app.commandLine.appendSwitch('enable-features', 'GlobalShortcutsPortal');\n  }\n\n  /**\n   * Set window class and name for Linux\n   * This ensures the window manager identifies the app correctly on both X11 and Wayland\n   */\n  if (isLinux) {\n    app.commandLine.appendSwitch('class', APP_NAME);\n    app.commandLine.appendSwitch('name', APP_NAME);\n  }\n\n  /**\n   * Enable Chromium features\n   * https://github.com/microsoft/vscode/pull/241640/files\n   */\n  const enableFeatures = [\n    'DocumentPolicyIncludeJSCallStacksInCrashReports', // unresponsive renderer js call stacks\n    'EarlyEstablishGpuChannel', // early establish gpu channel\n    'EstablishGpuChannelAsync', // early establish gpu channel\n    'PlatformHEVCDecoderSupport', // HEVC video decoding support\n    'VaapiVideoDecoder', // VA-API video decoder\n    'UseMultiPlaneFormatForHardwareVideo', // Fix frame pool issue\n    'VaapiIgnoreDriverChecks', // Ignore driver compatibility check\n    'CanvasOopRasterization', // Canvas OOP rasterization\n  ];\n  app.commandLine.appendSwitch('enable-features', enableFeatures.join(','));\n  app.commandLine.appendSwitch('ignore-certificate-errors'); // ignore certificate errors\n  app.commandLine.appendSwitch('disable-web-security'); // disable web security\n  app.commandLine.appendSwitch('disable-http-cache'); // disable HTTP cache\n\n  /**\n   * Disable Chromium features\n   */\n  const disableFeatures = [\n    'OutOfBlinkCors', // Disable CORS for cross-origin requests\n    'SameSiteByDefaultCookies', // Enable SameSite cookies by default\n    'CookiesWithoutSameSiteMustBeSecure', // Allow cookies without SameSite to be secure\n    'BlockInsecurePrivateNetworkRequests', // Block insecure requests initiated by private networks\n  ];\n  app.commandLine.appendSwitch('disable-features', disableFeatures.join(','));\n};\n\n/**\n * Application Ready Processing\n */\nconst setupReady = () => {\n  app.whenReady().then(async () => {\n    // Set app user model id for windows\n    electronApp.setAppUserModelId(import.meta.env.VITE_MAIN_BUNDLE_ID);\n\n    // Set doh\n    const hostResolver = configManager.dns;\n    if (isHttp(hostResolver, true)) {\n      logger.info(`Using secure dns: ${hostResolver}`);\n      app.configureHostResolver({\n        secureDnsMode: 'secure',\n        secureDnsServers: [hostResolver],\n      });\n    }\n\n    const mainWindow = windowService.createMainWindow();\n\n    trayService.updateTray(true);\n    menuService.updateMenu(true);\n\n    registerIpc(mainWindow, app);\n\n    // Setup deep link for AppImage on Linux\n    await setupAppImageDeepLink();\n\n    if (isDev) {\n      installExtension([VUEJS_DEVTOOLS])\n        .then(([...args]) => logger.info(`Added devtool extensions: ${args.map((arg) => arg.name).join(', ')}`))\n        .catch((error) => logger.error('An error occurred: ', error));\n    }\n  });\n\n  app.on('activate', function () {\n    const windowNames = windowService.getAllNames();\n    if (windowNames.length === 0) {\n      windowService.createMainWindow();\n    } else {\n      windowService.showAllWindows();\n    }\n  });\n\n  app.on('window-all-closed', () => {\n    if (!isMacOS) app.quit();\n  });\n\n  // macOS specific: handle protocol when app is already running\n  app.on('open-url', (event, url) => {\n    event.preventDefault();\n    handleProtocolUrl(url);\n  });\n\n  const handleOpenUrl = (args: string[]) => {\n    const url = args.find((arg) => arg.startsWith(APP_NAME_PROTOCOL));\n    if (url) handleProtocolUrl(url);\n  };\n\n  // for windows to start with url\n  handleOpenUrl(process.argv);\n\n  // Listen for second instance\n  app.on('second-instance', (_event, argv) => {\n    windowService.showAllWindows();\n\n    // Protocol handler for Windows/Linux\n    // The commandLine is an array of strings where the last item might be the URL\n    handleOpenUrl(argv);\n  });\n\n  app.on('browser-window-created', (_, window) => {\n    optimizer.watchWindowShortcuts(window);\n  });\n\n  app.on('before-quit', async () => {\n    app.isQuitting = true;\n  });\n\n  app.on('will-quit', async (e: Electron.Event) => {\n    e.preventDefault();\n\n    await filmCmsTerminate();\n    await fastifyService.stop();\n    await pluginService.clean();\n    logger.finish();\n\n    app.exit(0);\n  });\n\n  // In this file you can include the rest of your app\"s specific main process\n  // code. You can also put them in separate files and require them here.\n};\n\nconst main = async () => {\n  setupEnv();\n  setupApp();\n\n  if (!app.requestSingleInstanceLock()) {\n    app.quit();\n    process.exit(0);\n  } else {\n    await fileStorage.initRequireDir();\n    await dbService.init();\n    await proxyManager.configureProxy(configManager.proxy);\n    await fastifyService.start();\n\n    appLocale.init();\n    setupReady();\n\n    runFunction(() => pluginService.autoLaunch());\n  }\n};\n\nmain();\n"
  },
  {
    "path": "src/main/ipc.ts",
    "content": "import type { Buffer } from 'node:buffer';\nimport path from 'node:path';\n\nimport { loggerService } from '@logger';\nimport { appLocale } from '@main/services/AppLocale';\nimport { appService } from '@main/services/AppService';\nimport AppUpdater from '@main/services/AppUpdater';\nimport { binaryService } from '@main/services/BinaryService';\nimport { configManager } from '@main/services/ConfigManager';\nimport { fastifyService } from '@main/services/FastifyService';\nimport { fileStorage } from '@main/services/FileStorage';\nimport { menuService } from '@main/services/MenuService';\nimport NotificationService from '@main/services/NotificationService';\nimport { pluginService } from '@main/services/PluginService';\nimport { proxyManager } from '@main/services/ProxyManager';\nimport { shortcutService } from '@main/services/ShortcutService';\nimport { trayService } from '@main/services/TrayService';\nimport { windowService } from '@main/services/WindowService';\nimport { createDir, fileDelete, pathExist, readDirFaster, readFile, saveFile } from '@main/utils/file';\nimport type { IHomePath, ISystemPath, IUserPath } from '@main/utils/path';\nimport { getHomePath, getSystemPath, getUserPath } from '@main/utils/path';\nimport { execAsync } from '@main/utils/shell';\nimport { arch, generateUserAgent, isLinux, isMacOS, isPortable, isWindows, platform } from '@main/utils/systeminfo';\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport type { INotification } from '@shared/config/notification';\nimport type { IProxyType } from '@shared/config/setting';\nimport { PROXY_TYPE } from '@shared/config/setting';\nimport type { IShortcutConfig, IShortcutType } from '@shared/config/shortcut';\nimport { WINDOW_NAME } from '@shared/config/window';\nimport type { ILang } from '@shared/locales';\nimport { isExternal, isHttp, isObject, isObjectEmpty, isPositiveFiniteNumber } from '@shared/modules/validate';\nimport type { ProxyConfig } from 'electron';\nimport { BrowserWindow, ipcMain, shell, webContents } from 'electron';\nimport { getDomain } from 'tldts';\n\nconst logger = loggerService.withContext(LOG_MODULE.APP_IPC);\n\nexport function registerIpc(mainWindow: BrowserWindow, app: Electron.App) {\n  const appUpdater = new AppUpdater(mainWindow);\n\n  // api\n  ipcMain.handle(IPC_CHANNEL.API_SERVER_START, async () => {\n    return await fastifyService.start();\n  });\n\n  ipcMain.handle(IPC_CHANNEL.API_SERVER_STOP, async () => {\n    return await fastifyService.stop();\n  });\n\n  ipcMain.handle(IPC_CHANNEL.API_SERVER_RESTART, async () => {\n    return await fastifyService.restart();\n  });\n\n  ipcMain.handle(IPC_CHANNEL.API_SERVER_STATUS, () => {\n    return fastifyService.status();\n  });\n\n  // app\n  ipcMain.handle(IPC_CHANNEL.APP_AUTO_LAUNCH, (_, isLaunchOnBoot: boolean) => {\n    appService.setAppLaunchOnBoot(isLaunchOnBoot);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.APP_DNS, (_, dns: string) => {\n    if (isHttp(dns, true)) {\n      logger.info(`Set DNS to ${dns}`);\n      app.configureHostResolver({\n        secureDnsMode: 'secure',\n        secureDnsServers: [dns],\n      });\n    } else {\n      app.configureHostResolver({ secureDnsMode: 'off' });\n    }\n  });\n\n  ipcMain.handle(IPC_CHANNEL.APP_QUIT, () => {\n    app.quit();\n  });\n\n  ipcMain.handle(IPC_CHANNEL.APP_REBOOT, (_, options?: Electron.RelaunchOptions) => {\n    // Fix for .AppImage\n    if (isLinux && process.env.APPIMAGE) {\n      logger.info(`Relaunching app with options: ${process.env.APPIMAGE}`, options);\n      // On Linux, we need to use the APPIMAGE environment variable to relaunch\n      // https://github.com/electron-userland/electron-builder/issues/1727#issuecomment-769896927\n      options = options || {};\n      options.execPath = process.env.APPIMAGE;\n      options.args = options.args || [];\n      options.args.unshift('--appimage-extract-and-run');\n    }\n    if (isWindows && isPortable) {\n      options = options || {};\n      options.execPath = process.env.PORTABLE_EXECUTABLE_FILE;\n      options.args = options.args || [];\n    }\n    app.relaunch(options);\n    app.exit(0);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.APP_PROXY, async (_, type: IProxyType, proxy?: string, bypass?: string) => {\n    let proxyConfig: ProxyConfig;\n\n    if (type === PROXY_TYPE.SYSTEM) {\n      // system proxy will use the system filter by themselves\n      proxyConfig = { mode: 'system' };\n    } else if (proxy) {\n      proxyConfig = { mode: 'fixed_servers', proxyRules: proxy, proxyBypassRules: bypass };\n    } else {\n      proxyConfig = { mode: 'direct' };\n    }\n\n    await proxyManager.configureProxy(proxyConfig);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.APP_PROXY_SYSTEM, () => {\n    if (platform === 'win32') shell.openExternal('ms-settings:network-proxy');\n    if (platform === 'darwin') shell.openExternal('x-apple.systempreferences:com.apple.preference.network?Proxies');\n    if (platform === 'linux') execAsync('gnome-control-center network'); // xdg-open settings://network\n  });\n\n  // binary\n  ipcMain.handle(IPC_CHANNEL.BINARY_INSTALL, async (_, binaryName: string[]) => {\n    return await binaryService.installBinary(binaryName);\n  });\n\n  // business\n  ipcMain.handle(IPC_CHANNEL.CALL_PLAYER, async (_, app: string, url: string) => {\n    if (!url || !app) return false;\n    if (!isHttp(url) && !(await pathExist(url))) return false;\n\n    const quote = (value: string) => {\n      if (!value) return `\"\"`;\n\n      const trimmed = value.trim();\n      const first = trimmed[0];\n      const last = trimmed.at(-1);\n\n      if (first === `'` && last === `'`) {\n        return `\"${trimmed.slice(1, -1)}\"`;\n      }\n\n      if (first === `\"` && last === `\"`) {\n        return trimmed;\n      }\n\n      const cleaned = trimmed.replace(/^['\"]|['\"]$/g, '');\n\n      return `\"${cleaned}\"`;\n    };\n\n    try {\n      if (windowService.getWindow(WINDOW_NAME.PLAYER)) {\n        windowService.closeWindow(WINDOW_NAME.PLAYER);\n      }\n\n      // Windows: \"C:\\Program Files\\VLC\\vlc.exe\" \"C:\\Video\\1.mp4\"\n      // Linux: \"/usr/bin/vlc\" \"http://...\"\n      // Mac: open -a \"/Applications/IINA.app\" \"http://...\"\n      const command = isMacOS ? `open -a ${quote(app)} ${quote(url)}` : `${quote(app)} ${quote(url)}`;\n      logger.debug(`Calling player with command: ${command}`);\n\n      const { stdout, stderr } = await execAsync(command);\n      if (stdout) return true;\n      if (stderr) logger.error(`Failed to call player:`, new Error(stderr));\n\n      return false;\n    } catch (error) {\n      logger.error(`Failed to call player:`, error as Error);\n      return false;\n    }\n  });\n\n  // change\n  ipcMain.handle(IPC_CHANNEL.CHANGE_LANG, async (_, lang: ILang) => {\n    appLocale.changeLocale(lang);\n\n    menuService.updateMenu(true);\n    trayService.updateTray(true);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.CHANGE_ZOOM, (_, zoom: number) => {\n    windowService.setZoomWindows(zoom);\n  });\n\n  // file\n  ipcMain.handle(IPC_CHANNEL.FILE_SELECT_FOLDER_DIALOG, (_, options?: Electron.OpenDialogOptions) => {\n    return fileStorage.selectFolderDialog(options);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.FILE_SELECT_FILE_DIALOG, (_, options?: Electron.OpenDialogOptions) => {\n    return fileStorage.selectFileDialog(options);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.FILE_SAVE_FILE_DIALOG, (_, options?: Electron.SaveDialogOptions) => {\n    return fileStorage.saveFileDialog(options);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.FILE_SELECT_FOLDER_READ, (_, options?: Electron.OpenDialogOptions) => {\n    return fileStorage.selectFileRead(options);\n  });\n\n  ipcMain.handle(\n    IPC_CHANNEL.FILE_SELECT_FILE_WRITE,\n    (_, content: string | Buffer, options?: Electron.SaveDialogOptions) => {\n      return fileStorage.selectFolderWrite(content, options);\n    },\n  );\n\n  // fs\n  ipcMain.handle(IPC_CHANNEL.FS_EXIST, async (_, path: string) => {\n    return await pathExist(path);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.FS_DELETE, async (_, path: string) => {\n    return await fileDelete(path);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.FS_FILE_READ, async (_, path: string, encoding: BufferEncoding = 'utf-8') => {\n    return await readFile(path, encoding);\n  });\n\n  ipcMain.handle(\n    IPC_CHANNEL.FS_FILE_WRITE,\n    async (_, path: string, data: string | Buffer, encoding: BufferEncoding = 'utf-8') => {\n      return await saveFile(path, data, encoding);\n    },\n  );\n\n  ipcMain.handle(IPC_CHANNEL.FS_DIR_READ, async (_, path: string, depth: number = 0, exclude?, include?) => {\n    return await readDirFaster(path, depth, exclude, include);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.FS_DIR_CREATE, async (_, path: string) => {\n    return await createDir(path);\n  });\n\n  // notification\n  ipcMain.handle(\n    IPC_CHANNEL.NOTIFICATION_SEND,\n    async (event: Electron.IpcMainInvokeEvent, notification: INotification) => {\n      const win = BrowserWindow.fromWebContents(event.sender)!;\n      const notificationService = new NotificationService(win);\n      await notificationService.sendNotification(notification);\n    },\n  );\n\n  // open\n  ipcMain.handle(IPC_CHANNEL.OPEN_PATH, async (_, path: string) => {\n    await shell.openPath(path);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.OPEN_WEBSITE, async (_, url: string) => {\n    await shell.openExternal(url);\n  });\n\n  // path\n  ipcMain.handle(IPC_CHANNEL.PATH_RESOLVE, (_, ...paths: string[]) => {\n    return path.resolve(...paths);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.PATH_JOIN, (_, ...paths: string[]) => {\n    return path.join(...paths);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.PATH_SYSTEM, (_, name: ISystemPath) => {\n    return getSystemPath(name);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.PATH_HOME, (_, name: IHomePath) => {\n    return getHomePath(name);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.PATH_USER, (_, name: IUserPath) => {\n    return getUserPath(name);\n  });\n\n  // plugin\n  ipcMain.handle(IPC_CHANNEL.PLUGIN_INSTALL, async (_, plugins: string[]) => {\n    return await pluginService.install(plugins);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.PLUGIN_UNINSTALL, async (_, plugins: string[]) => {\n    return await pluginService.uninstall(plugins);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.PLUGIN_START, async (_, plugins: string[]) => {\n    return await pluginService.start(plugins);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.PLUGIN_STOP, async (_, plugins: string[]) => {\n    return await pluginService.stop(plugins);\n  });\n\n  // shortcut\n  ipcMain.handle(IPC_CHANNEL.SHORTCUTS_IS_REGISTERD, (_, type: IShortcutType, id: string, winName?: string) => {\n    return shortcutService.isRegistered(type, id, winName);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.SHORTCUT_REGISTER, (_, id: string, config: IShortcutConfig, force: boolean) => {\n    return shortcutService.register(id, config, force);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.SHORTCUT_UNREGISTER, (_, type: IShortcutType, id: string, winName?: string) => {\n    return shortcutService.unregister(type, id, winName);\n  });\n\n  ipcMain.handle(IPC_CHANNEL.SHORTCUT_CLEAR, () => {\n    shortcutService.clear();\n  });\n\n  // system\n  ipcMain.handle(IPC_CHANNEL.SYSTEM_ARCH, () => {\n    return arch;\n  });\n\n  ipcMain.handle(IPC_CHANNEL.SYSTEM_PLATFORM, () => {\n    return platform;\n  });\n\n  // update\n  ipcMain.handle(IPC_CHANNEL.UPDATE_CHECK, async () => {\n    return await appUpdater.checkForUpdates();\n  });\n\n  ipcMain.handle(IPC_CHANNEL.UPDATE_INSTALL, async () => {\n    await appUpdater.install();\n  });\n\n  ipcMain.handle(IPC_CHANNEL.UPDATE_DOWNLOAD, async (_, status: boolean) => {\n    if (status) await appUpdater.startDownload();\n    else await appUpdater.cancelDownload();\n  });\n\n  // webview\n  ipcMain.handle(IPC_CHANNEL.WEBVIEW_SPELL_CHECK, (_, webviewId: number, mode: 1 | 2) => {\n    const webview = webContents.fromId(webviewId);\n    if (!webview) return;\n\n    if (isPositiveFiniteNumber(mode)) {\n      if (mode === 1) webview.session.setSpellCheckerEnabled(true);\n      else if (mode === 2) webview.session.setSpellCheckerEnabled(false);\n    }\n\n    return webview.session.isSpellCheckerEnabled();\n  });\n\n  ipcMain.handle(\n    IPC_CHANNEL.WEBVIEW_LINK_BLOCK,\n    (event: Electron.IpcMainInvokeEvent, webviewId: number, mode: 1 | 2) => {\n      const webview = webContents.fromId(webviewId);\n      if (!webview) return;\n\n      if (isPositiveFiniteNumber(mode)) {\n        if (mode === 1) {\n          webview.setWindowOpenHandler(({ url }) => {\n            const win = BrowserWindow.fromWebContents(event.sender)!;\n            win.webContents.send(IPC_CHANNEL.WEBVIEW_LINK_BLOCK_RELAY, url);\n            return { action: 'deny' };\n          });\n        } else if (mode === 2) {\n          webview.setWindowOpenHandler(() => {\n            return { action: 'allow' };\n          });\n        }\n      }\n    },\n  );\n\n  ipcMain.handle(\n    IPC_CHANNEL.WEBVIEW_HEADER_BLOCK,\n    (_, webviewId: number, rawUrl: string, headers?: Record<string, any>) => {\n      const webview = webContents.fromId(webviewId);\n      if (!webview) return;\n\n      if (!isObject(headers) || isObjectEmpty(headers)) return;\n\n      const isSameDomain = (source: string, raw: string) => {\n        try {\n          return getDomain(source) === getDomain(raw);\n        } catch {\n          return false;\n        }\n      };\n\n      webview.session.webRequest.onBeforeSendHeaders(null); // Clear previous listeners to avoid stacking\n\n      const defaultUA = generateUserAgent();\n      webview.setUserAgent(defaultUA);\n\n      webview.session.webRequest.onBeforeSendHeaders({ urls: ['*://*/*'] }, (details, callback) => {\n        const { requestHeaders, url } = details;\n        const ua = configManager.ua;\n        const language = appLocale.defaultLang();\n\n        requestHeaders['User-Agent'] = ua;\n        requestHeaders['Accept-Language'] = `${language}, en;q=0.9, *;q=0.5`;\n\n        if (!isSameDomain(url, rawUrl)) return callback({ requestHeaders });\n\n        for (const key in headers) {\n          requestHeaders[key] = headers[key];\n        }\n\n        callback({ requestHeaders });\n      });\n    },\n  );\n\n  // window\n  ipcMain.handle(IPC_CHANNEL.WINDOW_SIZE, (event: Electron.IpcMainInvokeEvent, width: number, height: number) => {\n    const win = BrowserWindow.fromWebContents(event.sender)!;\n\n    if (isPositiveFiniteNumber(width) && isPositiveFiniteNumber(height)) {\n      win.setSize(width, height);\n    }\n\n    return win.getSize();\n  });\n\n  ipcMain.handle(IPC_CHANNEL.WINDOW_PIN, (event: Electron.IpcMainInvokeEvent, mode: 0 | 1 | 2) => {\n    const win = BrowserWindow.fromWebContents(event.sender)!;\n\n    if (isPositiveFiniteNumber(mode)) {\n      if (mode === 0) win.setAlwaysOnTop(!win.isAlwaysOnTop());\n      else if (mode === 1) win.setAlwaysOnTop(true);\n      else if (mode === 2) win.setAlwaysOnTop(false);\n    }\n\n    return win.isAlwaysOnTop();\n  });\n\n  ipcMain.handle(IPC_CHANNEL.WINDOW_CLOSE, (event: Electron.IpcMainInvokeEvent, mode: 1) => {\n    const win = BrowserWindow.fromWebContents(event.sender)!;\n\n    if (isPositiveFiniteNumber(mode)) {\n      if (mode === 1 && win.isClosable()) win.close();\n    }\n\n    return !win.isClosable();\n  });\n\n  ipcMain.handle(IPC_CHANNEL.WINDOW_MIN, (event: Electron.IpcMainInvokeEvent, mode: 0 | 1 | 2) => {\n    const win = BrowserWindow.fromWebContents(event.sender)!;\n\n    if (isPositiveFiniteNumber(mode)) {\n      if (mode === 0) {\n        win.isMinimized() ? win.restore() : win.minimize();\n      } else if (mode === 1 && !win.isMinimized()) {\n        win.minimize();\n      } else if (mode === 2 && win.isMinimized()) {\n        win.restore();\n      }\n    }\n\n    return win.isMinimized();\n  });\n\n  ipcMain.handle(IPC_CHANNEL.WINDOW_MAX, (event: Electron.IpcMainInvokeEvent, mode: 0 | 1 | 2) => {\n    const win = BrowserWindow.fromWebContents(event.sender)!;\n\n    if (!win.isResizable()) return win.isMaximized();\n\n    if (isPositiveFiniteNumber(mode)) {\n      if (mode === 0) {\n        win.isMaximized() ? win.unmaximize() : win.maximize();\n      } else if (mode === 1 && !win.isMaximized()) {\n        win.maximize();\n      } else if (mode === 2 && win.isMaximized()) {\n        win.unmaximize();\n      }\n    }\n\n    return win.isMaximized();\n  });\n\n  ipcMain.handle(\n    IPC_CHANNEL.WINDOW_POSITION,\n    (event: Electron.IpcMainInvokeEvent, mode: 'relative' | 'absolute', { dx, dy }) => {\n      const win = BrowserWindow.fromWebContents(event.sender)!;\n\n      const [x, y] = win.getPosition();\n\n      if (mode === 'absolute') win.setPosition(dx, dy);\n      else if (mode === 'relative') win.setPosition(x + dx, y + dy);\n\n      return win.getPosition();\n    },\n  );\n\n  ipcMain.handle(IPC_CHANNEL.WINDOW_DESTROY, (_, name: string) => {\n    const window = windowService.getWindow(name);\n    if (window && !window.isDestroyed()) {\n      windowService.closeWindow(window);\n    }\n  });\n\n  ipcMain.handle(IPC_CHANNEL.WINDOW_HIDE, (_, name: string) => {\n    const window = windowService.getWindow(name);\n    if (window && !window.isDestroyed()) {\n      windowService.hideWindow(window);\n    }\n  });\n\n  ipcMain.handle(IPC_CHANNEL.WINDOW_SHOW, (_, name: string) => {\n    const window = windowService.getWindow(name);\n    if (window && !window.isDestroyed()) {\n      windowService.showWindow(window);\n    }\n  });\n\n  ipcMain.handle(IPC_CHANNEL.WINDOW_STATUS, (_, name: string) => {\n    const window = windowService.getWindow(name);\n    return !!window;\n\n    // const window = windowService.getWindowName(name);\n    // return !!window;\n  });\n\n  ipcMain.handle(IPC_CHANNEL.WINDOW_PLAYER, () => {\n    const window = windowService.getWindow(WINDOW_NAME.PLAYER);\n    if (window && !window.isDestroyed()) {\n      windowService.showWindow(window);\n      windowService.reloadWindow(window);\n    } else {\n      windowService.createPlayerWindow();\n    }\n  });\n\n  ipcMain.handle(IPC_CHANNEL.WINDOW_MAIN, () => {\n    const window = windowService.getWindow(WINDOW_NAME.MAIN);\n    if (window && !window.isDestroyed()) {\n      windowService.showWindow(window);\n    } else {\n      windowService.createMainWindow();\n    }\n  });\n\n  ipcMain.handle(\n    IPC_CHANNEL.WINDOW_BROWSER,\n    (_event: Electron.IpcMainInvokeEvent, url: string, headers?: Record<string, any>) => {\n      if (!isExternal(url)) return;\n\n      let window = windowService.getWindow(WINDOW_NAME.BROWSER);\n      if (window && !window.isDestroyed()) {\n        windowService.showWindow(window);\n        window.webContents.send(IPC_CHANNEL.BROWSER_NAVIGATE, url, headers);\n      } else {\n        window = windowService.createBrowserWindow();\n        window.webContents.once('did-stop-loading', () => {\n          setTimeout(() => {\n            window!.webContents.send(IPC_CHANNEL.BROWSER_NAVIGATE, url, headers);\n          }, 1000);\n        });\n      }\n    },\n  );\n}\n"
  },
  {
    "path": "src/main/services/AppLocale.ts",
    "content": "import { loggerService } from '@logger';\nimport { configManager } from '@main/services/ConfigManager';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport type { ILang, ILangWithoutSystem } from '@shared/locales';\nimport { defaultLocale, fallbackLocale, langCode, messages } from '@shared/locales';\nimport { app } from 'electron';\nimport type { InitOptions } from 'i18next';\nimport i18n, { changeLanguage, init as createI18n } from 'i18next';\n\nconst logger = loggerService.withContext(LOG_MODULE.APP_LOCALE);\n\nexport class AppLocale {\n  private static instance: AppLocale;\n\n  constructor() {}\n\n  public static getInstance(): AppLocale {\n    if (!AppLocale.instance) {\n      AppLocale.instance = new AppLocale();\n    }\n    return AppLocale.instance;\n  }\n\n  public init(): void {\n    const resources = Object.fromEntries(\n      Object.entries(messages()).map(([k, v]) => [k, { translation: v }]),\n    ) as InitOptions['resources'];\n\n    createI18n({\n      resources,\n      lng: this.defaultLang(),\n      fallbackLng: fallbackLocale,\n      interpolation: {\n        escapeValue: false,\n      },\n      saveMissing: true,\n      showSupportNotice: false,\n      missingKeyHandler: (_lngs: readonly string[], _ns: string, key: string) => {\n        logger.warn(`Missing key: ${key}`);\n      },\n    });\n  }\n\n  public changeLocale(value: ILang): void {\n    const lang = this.defaultLang(value);\n\n    if (i18n.language === lang) return;\n\n    changeLanguage(lang, (error) => {\n      if (error) {\n        return logger.error(`Failed to change language: ${error.message}`);\n      }\n      logger.info(`Language changed to ${lang}`);\n    });\n  }\n\n  public defaultLang(value?: ILang): ILangWithoutSystem {\n    let lang = value;\n\n    if (!lang) {\n      lang = configManager.lang;\n    }\n    if (!lang || lang === 'system') {\n      const appLocale = app.getLocale();\n      if (appLocale.startsWith('zh')) {\n        const region = appLocale.split('-')[1];\n\n        // On Windows and macOS, Chinese languages returned by\n        // app.getPreferredSystemLanguages() start with zh-hans\n        // for Simplified Chinese or zh-hant for Traditional Chinese,\n        // so we can easily determine whether to use Simplified or Traditional.\n        // However, on Linux, Chinese languages returned by that same API\n        // are of the form zh-XY, where XY is a country code.\n        // For China (CN), Singapore (SG), and Malaysia (MY)\n        // country codes, assume they use Simplified Chinese.\n        // For other cases, assume they use Traditional.\n        if (['hans', 'cn', 'sg', 'my'].includes(region.toLocaleLowerCase())) {\n          lang = 'zh-CN';\n        }\n\n        lang = 'zh-TW';\n      }\n\n      lang = appLocale as ILangWithoutSystem;\n    }\n\n    if (!langCode.includes(lang)) {\n      lang = defaultLocale;\n    }\n\n    return lang;\n  }\n\n  public isCHS(): boolean {\n    const lang = this.defaultLang();\n    return lang === 'zh-CN';\n  }\n}\n\nexport const appLocale = AppLocale.getInstance();\n\nexport { t } from 'i18next';\n"
  },
  {
    "path": "src/main/services/AppService.ts",
    "content": "import { join } from 'node:path';\n\nimport { loggerService } from '@logger';\nimport { createDir, fileDelete, pathExist, saveFile } from '@main/utils/file';\nimport { APP_EXE_PATH, APP_HOME_PATH } from '@main/utils/path';\nimport { isLinux, isMacOS, isWindows } from '@main/utils/systeminfo';\nimport { APP_DESC, APP_NAME } from '@shared/config/appinfo';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport { app } from 'electron';\n\nconst logger = loggerService.withContext(LOG_MODULE.APP_SERVICE);\n\nclass AppService {\n  private static instance: AppService;\n\n  private constructor() {\n    // Private constructor to prevent direct instantiation\n  }\n\n  public static getInstance(): AppService {\n    if (!AppService.instance) {\n      AppService.instance = new AppService();\n    }\n    return AppService.instance;\n  }\n\n  public async setAppLaunchOnBoot(isLaunchOnBoot: boolean): Promise<void> {\n    // Set login item settings for windows and mac\n    // linux is not supported because it requires more file operations\n    if (isWindows || isMacOS) {\n      app.setLoginItemSettings({ openAtLogin: isLaunchOnBoot });\n    } else if (isLinux) {\n      try {\n        const autostartDir = join(APP_HOME_PATH, '.config', 'autostart');\n        const desktopFile = join(autostartDir, `${APP_NAME}.desktop`);\n\n        if (isLaunchOnBoot) {\n          // Ensure autostart directory exists\n          const isExist = await pathExist(autostartDir);\n          if (!isExist) {\n            await createDir(autostartDir);\n          }\n\n          // Get executable path\n          let executablePath = APP_EXE_PATH;\n          if (process.env.APPIMAGE) {\n            // For AppImage packaged apps, use APPIMAGE environment variable\n            executablePath = process.env.APPIMAGE;\n          }\n\n          // Create desktop file content\n          const desktopContent = `[Desktop Entry]\n  Type=Application\n  Name=${APP_NAME}\n  Comment=${APP_DESC}\n  Exec=${executablePath}\n  Icon=${APP_NAME}\n  Terminal=false\n  StartupNotify=false\n  Categories=Video;AudioVideo;\n  X-GNOME-Autostart-enabled=true\n  Hidden=false`;\n\n          // Write desktop file\n          await saveFile(desktopFile, desktopContent);\n          logger.info('Created autostart desktop file for Linux');\n        } else {\n          // Remove desktop file\n          await fileDelete(desktopFile);\n          logger.info('Removed autostart desktop file for Linux');\n        }\n      } catch (error) {\n        logger.error('Failed to set launch on boot for Linux:', error as Error);\n      }\n    }\n  }\n}\n\nexport const appService = AppService.getInstance();\n"
  },
  {
    "path": "src/main/services/AppUpdater.ts",
    "content": "import { dirname, resolve } from 'node:path';\n\nimport { loggerService } from '@logger';\nimport { getSystemPath } from '@main/utils/path';\nimport { isPackaged, isWindows } from '@main/utils/systeminfo';\nimport { getUserAgent } from '@main/utils/tool';\nimport { APP_VERSION } from '@shared/config/appinfo';\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport { isArray, isArrayEmpty, isStrEmpty, isString } from '@shared/modules/validate';\nimport type { UpdateInfo } from 'builder-util-runtime';\nimport { CancellationToken } from 'builder-util-runtime';\nimport type { BrowserWindow } from 'electron';\nimport { app } from 'electron';\nimport type { AppUpdater as _AppUpdater, Logger, NsisUpdater, UpdateCheckResult } from 'electron-updater';\nimport { autoUpdater } from 'electron-updater';\nimport TurndownService from 'turndown';\n\nconst logger = loggerService.withContext(LOG_MODULE.APP_UPDATE);\nconst turndownService = new TurndownService();\n\nexport default class AppUpdater {\n  autoUpdater: _AppUpdater = autoUpdater;\n  private releaseInfo: UpdateInfo | undefined;\n  private cancellationToken: CancellationToken = new CancellationToken();\n  private updateCheckResult: UpdateCheckResult | null = null;\n\n  constructor(mainWindow: BrowserWindow) {\n    if (!isPackaged) {\n      Object.defineProperty(app, 'isPackaged', {\n        get() {\n          return true;\n        },\n      });\n      autoUpdater.updateConfigPath = resolve(import.meta.dirname, '../../dev-app-update.yml');\n    }\n\n    autoUpdater.logger = logger as Logger;\n    autoUpdater.forceDevUpdateConfig = !isPackaged;\n    autoUpdater.autoDownload = false; // Disable auto-download\n    // Never auto-install on quit - user must explicitly click \"Install Now\"\n    // Auto-install on quit can cause issues: unexpected updates on restart,\n    // corruption if system shuts down during install, or app uninstall on force shutdown\n    autoUpdater.autoInstallOnAppQuit = false; // Disable auto-install on app quit\n    autoUpdater.disableDifferentialDownload = true; // Disable differential updates\n    autoUpdater.requestHeaders = {\n      ...autoUpdater.requestHeaders,\n      'User-Agent': getUserAgent(),\n    };\n\n    autoUpdater.on('error', (error) => {\n      logger.error('update error', error as Error);\n      mainWindow.webContents.send(IPC_CHANNEL.UPDATE_ERROR, error);\n    });\n\n    autoUpdater.on('update-available', (releaseInfo: UpdateInfo) => {\n      logger.info('update available', releaseInfo);\n      mainWindow.webContents.send(IPC_CHANNEL.UPDATE_AVAILABLE, releaseInfo);\n    });\n\n    // when it is detected that there is no need to update\n    autoUpdater.on('update-not-available', () => {\n      mainWindow.webContents.send(IPC_CHANNEL.UPDATE_NOT_AVAILABLE);\n    });\n\n    // update download progress\n    autoUpdater.on('download-progress', (progress) => {\n      const percent = Math.min(100, Math.max(0, progress.percent));\n      mainWindow.webContents.send(IPC_CHANNEL.UPDATE_DOWNLOAD_PROGRESS, percent);\n    });\n\n    // when the update is downloaded\n    autoUpdater.on('update-downloaded', (releaseInfo: UpdateInfo) => {\n      mainWindow.webContents.send(IPC_CHANNEL.UPDATE_DOWNLOADED, releaseInfo);\n      this.releaseInfo = releaseInfo;\n      logger.info('update downloaded', releaseInfo);\n    });\n\n    if (isWindows) {\n      (autoUpdater as NsisUpdater).installDirectory = dirname(getSystemPath('exe'));\n    }\n\n    this.autoUpdater = autoUpdater;\n  }\n\n  public setAutoUpdate(isActive: boolean) {\n    autoUpdater.autoDownload = isActive;\n    // autoInstallOnAppQuit is always false - user must explicitly click \"Install Now\"\n    // autoUpdater.autoInstallOnAppQuit = isActive;\n  }\n\n  public cancelDownload() {\n    this.cancellationToken.cancel();\n    this.cancellationToken = new CancellationToken();\n    if (this.autoUpdater.autoDownload) {\n      this.updateCheckResult?.cancellationToken?.cancel();\n    }\n  }\n\n  public async checkForUpdates() {\n    const fallbackResult = {\n      isValid: false,\n      currentVersion: APP_VERSION,\n      lastVersion: APP_VERSION,\n      releaseNote: '',\n    };\n\n    // If the app is running in portable mode, skip update check\n    if (isWindows && 'PORTABLE_EXECUTABLE_DIR' in process.env) {\n      return fallbackResult;\n    }\n\n    try {\n      const result = await this.autoUpdater.checkForUpdates();\n      this.updateCheckResult = result;\n\n      const updateInfo = result?.updateInfo;\n      const isUpdateAvailable = Boolean(result?.isUpdateAvailable);\n\n      const currentVersion = this.autoUpdater.currentVersion;\n      const lastVersion = updateInfo?.version ?? currentVersion;\n\n      logger.info(`[Updater] available=${isUpdateAvailable}, current=${currentVersion}, latest=${lastVersion}`);\n\n      if (!isUpdateAvailable || !isArray(updateInfo?.files) || isArrayEmpty(updateInfo?.files)) {\n        return fallbackResult;\n      }\n\n      const releaseNotes = updateInfo?.releaseNotes ?? '';\n      const releaseNoteMarkdown =\n        isString(releaseNotes) && !isStrEmpty(releaseNotes) ? turndownService.turndown(releaseNotes) : '';\n\n      return {\n        isValid: true,\n        currentVersion,\n        lastVersion,\n        releaseNote: releaseNoteMarkdown,\n      };\n    } catch (error) {\n      logger.error('Failed to check for update:', error as Error);\n      return fallbackResult;\n    }\n  }\n\n  public install() {\n    if (!this.releaseInfo) {\n      return;\n    }\n\n    app.isQuitting = true;\n    setImmediate(() => autoUpdater.quitAndInstall(true, true));\n  }\n\n  public startDownload() {\n    if (this.updateCheckResult?.isUpdateAvailable && !this.autoUpdater.autoDownload) {\n      // if autoDownload is false, then you need to call the following function again to trigger the download\n      // do not use await, because it will block the return of this function\n      logger.info('downloadUpdate manual by check for updates', this.cancellationToken);\n      this.autoUpdater.downloadUpdate(this.cancellationToken);\n    }\n  }\n}\n"
  },
  {
    "path": "src/main/services/BinaryService.ts",
    "content": "import { join } from 'node:path';\n\nimport { loggerService } from '@logger';\nimport { pathExist } from '@main/utils/file';\nimport { APP_PUBLIC_PATH, HOME_BIN_PATH } from '@main/utils/path';\nimport { chmodBinary, downBinary, getBinaryName } from '@main/utils/process';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport { isArray, isArrayEmpty } from '@shared/modules/validate';\n\nconst logger = loggerService.withContext(LOG_MODULE.BINARY);\n\nexport interface IBinaryInfo {\n  name: string;\n  path: string;\n  exist: boolean;\n}\n\nclass BinaryService {\n  private static instance: BinaryService;\n  private readonly DEFAULT_BINARIES = ['uv', 'bun', 'ffmpeg', 'ffprobe'] as const;\n\n  private constructor() {}\n\n  public static getInstance(): BinaryService {\n    if (!this.instance) {\n      this.instance = new BinaryService();\n    }\n    return this.instance;\n  }\n\n  private getBinaryPath(name: string): string {\n    return join(HOME_BIN_PATH, getBinaryName(name));\n  }\n\n  private async isBinaryExist(name: string): Promise<boolean> {\n    return await pathExist(this.getBinaryPath(name));\n  }\n\n  private async getBinaryInfo(name: string): Promise<IBinaryInfo> {\n    const path = this.getBinaryPath(name);\n    return {\n      name,\n      path,\n      exist: await this.isBinaryExist(name),\n    };\n  }\n\n  public async getBinaryList(names?: string[]): Promise<{ list: IBinaryInfo[]; total: number }> {\n    const normalizedNames = isArray(names) && !isArrayEmpty(names) ? names : this.DEFAULT_BINARIES;\n    return {\n      list: await Promise.all(normalizedNames.map((name) => this.getBinaryInfo(name))),\n      total: normalizedNames.length,\n    };\n  }\n\n  public async installBinary(names: string[]): Promise<IBinaryInfo[]> {\n    if (!isArray(names) || isArrayEmpty(names)) {\n      return [];\n    }\n\n    await Promise.all(\n      names.map(async (name) => {\n        try {\n          await downBinary(join(APP_PUBLIC_PATH, 'scripts', `install-${name}.js`));\n          chmodBinary(this.getBinaryPath(name), 0o755);\n        } catch (error) {\n          logger.error(`Failed to install binary ${name}: ${(error as Error).message}`);\n        }\n      }),\n    );\n\n    return (await this.getBinaryList(names))?.list;\n  }\n}\n\nexport const binaryService = BinaryService.getInstance();\n"
  },
  {
    "path": "src/main/services/CdpElectron.ts",
    "content": "import { loggerService } from '@logger';\nimport { windowService } from '@main/services/WindowService';\nimport { getTimeout, getUserAgent } from '@main/utils/tool';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport { randomUUID } from '@shared/modules/crypto';\nimport { headersPascalCase } from '@shared/modules/headers';\nimport { toString } from '@shared/modules/toString';\nimport { isHttp, isNil, isObjectEmpty, isPositiveFiniteNumber, isStrEmpty, isString } from '@shared/modules/validate';\nimport type { BrowserWindow } from 'electron';\nimport { app } from 'electron';\nimport type {\n  Browser as CdpBrowser,\n  EvaluateFunc as CdpEvaluateFunc,\n  GoToOptions as CdpGoToOptions,\n  HTTPResponse as CdpHTTPResponse,\n  Page as CdpPage,\n} from 'puppeteer-core';\nimport puppeteer from 'puppeteer-core';\nimport pie from 'puppeteer-in-electron';\n\nexport interface ISnifferResult {\n  url: string;\n  headers?: Record<string, any>;\n}\n\nexport interface ISnifferOptions {\n  runScript?: string;\n  initScript?: string;\n  customRegex?: string;\n  snifferExclude?: string;\n  headers?: Record<string, any>;\n  timeout?: number;\n}\n\nexport interface ICdpOptions {\n  timeout?: number;\n  userAgent?: string;\n}\n\nconst logger = loggerService.withContext(LOG_MODULE.CDP);\n\npie.initialize(app);\n\nexport class CdpElectron {\n  private win: BrowserWindow | null = null;\n  private browser: CdpBrowser | null = null;\n  private page: CdpPage | null = null;\n\n  private uuid: string | null = null;\n  private timerId: NodeJS.Timeout | null = null;\n\n  private options: ICdpOptions = { timeout: undefined, userAgent: undefined };\n\n  constructor(options: Partial<ICdpOptions> = {}) {\n    this.uuid = randomUUID();\n\n    this.options = {\n      timeout: options?.timeout,\n      userAgent: options?.userAgent,\n    };\n  }\n\n  private async init(): Promise<void> {\n    this.win = windowService.createSnifferWindow(this.uuid!);\n    this.win.webContents.setAudioMuted(true);\n    this.win.webContents.setWindowOpenHandler(() => ({ action: 'deny' }));\n\n    this.browser = (await pie.connect(app, puppeteer as any)) as unknown as CdpBrowser;\n    this.page = (await pie.getPage(this.browser as any, this.win)) as unknown as CdpPage;\n  }\n\n  private async cleanup(): Promise<void> {\n    if (this.timerId) clearTimeout(this.timerId);\n    this.timerId = null;\n\n    if (this.page) await this.page.close();\n    this.page = null;\n\n    if (this.browser?.connected) await this.browser.disconnect();\n    this.browser = null;\n\n    if (this.win && !this.win.isDestroyed()) this.win.close();\n    this.win = null;\n  }\n\n  private reasonUserAgentMetadata(userAgent: string) {\n    const isMobile = /Mobile|Android|iPhone/i.test(userAgent);\n\n    return {\n      brands: [\n        { brand: 'Chromium', version: '122' },\n        { brand: 'Not(A:Brand', version: '24' },\n      ],\n      fullVersion: '122.0.6261.0',\n      platform: /Windows/i.test(userAgent) ? 'Windows' : /Mac OS X/i.test(userAgent) ? 'macOS' : 'Linux',\n      platformVersion: '',\n      architecture: 'x86',\n      model: '',\n      mobile: isMobile,\n    };\n  }\n\n  private async configurePage(page: CdpPage, headers: Record<string, any> = {}): Promise<void> {\n    const h = headersPascalCase(headers);\n    if (isObjectEmpty(h)) return;\n\n    const userAgent = getUserAgent(h['User-Agent'], this.options.userAgent);\n    if (userAgent) {\n      // await page.setUserAgent(ua); // @deprecated api\n      await page.setUserAgent({\n        userAgent,\n        userAgentMetadata: this.reasonUserAgentMetadata(userAgent),\n      });\n\n      delete h['User-Agent'];\n    }\n\n    if (h.Cookie) {\n      const cookies = h.Cookie.split(';').map((c: string) => {\n        const [name, value] = c.split('=').map((s) => s.trim());\n        return { name, value, domain: '' };\n      });\n      // await page.setCookie(...cookies); // @deprecated api\n      await this.browser!.setCookie(...cookies);\n\n      delete h.Cookie;\n    }\n\n    await page.setExtraHTTPHeaders(h);\n  }\n\n  private async navigateToUrl(\n    page: CdpPage,\n    url: string,\n    options: CdpGoToOptions = {},\n  ): Promise<CdpHTTPResponse | null> {\n    return await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 0, ...options });\n  }\n\n  private async execScript(\n    page: CdpPage,\n    script: string | CdpEvaluateFunc<any>,\n    type: 'evaluate' | 'evaluateOnNewDocument' = 'evaluate',\n  ): Promise<any> {\n    switch (type) {\n      case 'evaluate': {\n        return await page.evaluate(script);\n      }\n      case 'evaluateOnNewDocument':\n      default: {\n        return await page.evaluateOnNewDocument(script);\n      }\n    }\n  }\n\n  // @ts-expect-error declared but its value is never read\n  private async execClick(page: CdpPage, selector: string, type: 'js' | 'protozoa'): Promise<void> {\n    switch (type) {\n      case 'js': {\n        return await this.execScript(page, `document.querySelector('${selector}').click()`, 'evaluate');\n      }\n      case 'protozoa':\n      default: {\n        return await page.click(selector);\n      }\n    }\n  }\n\n  // @ts-expect-error declared but its value is never read\n  private async extractContent(page: CdpPage, selector?: string): Promise<string | Element[]> {\n    if (selector) {\n      return await page.$$eval(selector, (elements) => elements);\n    }\n    return page.content();\n  }\n\n  public async snifferMedia(url: string, options: ISnifferOptions = {}): Promise<ISnifferResult> {\n    try {\n      if (!isString(url) || !isHttp(url)) throw new Error('Invalid URL');\n      const {\n        runScript,\n        initScript,\n        customRegex,\n        snifferExclude,\n        headers: rawHeaders = {},\n        timeout: rawTimeout,\n      } = options;\n\n      const timeout = getTimeout(rawTimeout, this.options.timeout);\n      const headers = Object.fromEntries(\n        Object.entries(headersPascalCase(rawHeaders))\n          .map(([key, value]) => {\n            if (key === 'User-Agent') {\n              return [key, getUserAgent(value, this.options.userAgent)];\n            }\n            return [key, value];\n          })\n          .filter(([, value]) => !isNil(value)),\n      );\n\n      await this.init();\n      const page = this.page!;\n      await this.configurePage(page, headers);\n      await page.setRequestInterception(true);\n\n      // Hooks\n      page.on('error', (error) => logger.error('Page error', error));\n      page.on('console', async (msg) => {\n        const args = await Promise.all(\n          msg.args().map(async (arg) => {\n            try {\n              return await arg.jsonValue();\n            } catch {\n              return arg.toString();\n            }\n          }),\n        );\n        const log = args.map((v) => toString(v)).join(' ');\n        if (!isStrEmpty(log)) logger.silly(log);\n      });\n      page.on('dialog', async (dialog) => await dialog.dismiss());\n\n      // Anti-crawling Bypass\n      await this.execScript(\n        page,\n        () => Object.defineProperty(navigator, 'webdriver', { get: () => false }),\n        'evaluateOnNewDocument',\n      );\n\n      // Execute custom scripts\n      if (isString(initScript) && !isStrEmpty(initScript)) {\n        await this.execScript(page, initScript, 'evaluateOnNewDocument');\n      }\n      if (isString(runScript) && !isStrEmpty(runScript)) {\n        const code = `\n          (() => {\n            var scriptTimer;\n            var scriptCounter = 0;\n            scriptTimer = setInterval(function() {\n              if (location.href !== 'about:blank') {\n                scriptCounter += 1;\n                console.log(---exec run_script start ' + scriptCounter + '---');\n                ${runScript}\n                clearInterval(scriptTimer);\n                scriptCounter = 0;\n                console.log('---exec run_script complete---');\n              }\n            }, 200);\n          })();\n        `;\n        await this.execScript(page, code, 'evaluateOnNewDocument');\n      }\n\n      // Handle timeout\n      const timeoutPromise = new Promise<ISnifferResult>((_resolve, reject) => {\n        if (!isPositiveFiniteNumber(timeout) || timeout <= 0) return;\n\n        this.timerId = setTimeout(async () => {\n          await this.cleanup();\n          reject(new Error('timeout'));\n        }, timeout);\n      });\n\n      // Handle sniffer\n      const snifferPromise = new Promise<ISnifferResult>((resolve) => {\n        page.on('request', async (req) => {\n          if (req.isInterceptResolutionHandled()) return;\n\n          const reqUrl = req.url();\n          const reqHeaders = headersPascalCase(req.headers());\n          const reqMethod = req.method();\n          const reqResourceType = req.resourceType();\n\n          if (snifferExclude && new RegExp(snifferExclude, 'gi').test(reqUrl)) {\n            logger.warn(`Sniffer media custom exclude, url: ${reqUrl}`);\n            return req.continue();\n          }\n\n          if (customRegex) {\n            if (new RegExp(customRegex, 'gi').test(reqUrl)) {\n              logger.info(`Sniffer media custom match, url: ${reqUrl}`);\n              resolve({ url: reqUrl, headers: reqHeaders });\n              return req.abort();\n            }\n          } else {\n            const videoMatchRegex: RegExp =\n              /http(?:(?!http).){12,}?\\.(?:m3u8|mpd|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3|tos)\\?.*|http(?:(?!http).){12,}\\.(?:m3u8|mpd|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)|http(?:(?!http).)*?video\\/tos*|http(?:(?!http).)*?obj\\/tos*/;\n            const videoExcludeRegex: RegExp = /\\.(?:css|html)$|url=http|v=http/i;\n\n            if (videoMatchRegex.test(reqUrl) && !videoExcludeRegex.test(reqUrl)) {\n              logger.info(`Sniffer media default match, url: ${reqUrl}`);\n              resolve({ url: reqUrl, headers: reqHeaders });\n              return req.abort();\n            }\n          }\n\n          if (\n            ['head'].includes(reqMethod) ||\n            ['stylesheet', 'image', 'font', 'manifest', 'prefetch'].includes(reqResourceType) ||\n            (['xhr', 'fetch'].includes(reqResourceType) && reqUrl.includes('.css')) ||\n            [\n              'google-analytics.com',\n              'googletagmanager.com',\n              'doubleclick.net',\n              'facebook.net',\n              'twitter.com',\n              'linkedin.com',\n              'adservice.google.com',\n            ].some((domain) => reqUrl.includes(domain)) ||\n            ['/ads/', '/analytics/', '/pixel/', '/tracking/', '/stats/', 'devtools-detector', 'disable-devtool'].some(\n              (path) => reqUrl.includes(path),\n            )\n          ) {\n            return await req.abort();\n          }\n\n          await req.continue();\n        });\n      });\n\n      await this.navigateToUrl(page, url);\n\n      return await Promise.race([timeoutPromise, snifferPromise]);\n    } catch (error) {\n      logger.error('SnifferMedia error', error as Error);\n      throw error;\n    } finally {\n      await this.cleanup();\n    }\n  }\n}\n\nexport default CdpElectron;\n"
  },
  {
    "path": "src/main/services/ConfigManager.ts",
    "content": "import { APP_DATABASE_PATH } from '@main/utils/path';\nimport { generateUserAgent } from '@main/utils/systeminfo';\nimport { PROXY_TYPE } from '@shared/config/setting';\nimport type { ITheme } from '@shared/config/theme';\nimport { THEME } from '@shared/config/theme';\nimport type { ILang } from '@shared/locales';\nimport { isHttp, isPositiveFiniteNumber, isValidUa } from '@shared/modules/validate';\nimport type { ProxyConfig } from 'electron';\nimport Store from 'electron-store';\n\nexport enum IStore {\n  THEME = 'theme',\n  ZOOM = 'zoom',\n  LANG = 'lang',\n  DNS = 'dns',\n  HARDWARE_ACCELERATION = 'hardwareAcceleration',\n  TIMEOUT = 'timeout',\n  UA = 'ua',\n  DEBUG = 'debug',\n  PROXY = 'proxy',\n}\n\nexport type IStoreKey = `${IStore}`;\n\nexport const STORE_KEYS: IStoreKey[] = Object.values(IStore);\n\nexport class ConfigManager {\n  private store: Store;\n\n  constructor() {\n    this.store = new Store({\n      name: 'config',\n      cwd: APP_DATABASE_PATH,\n    });\n  }\n\n  public get theme(): ITheme {\n    const val = this.get(IStore.THEME, 'system');\n    return ([THEME.LIGHT, THEME.DARK, THEME.SYSTEM] as ITheme[]).includes(val) ? val : 'system';\n  }\n\n  public get lang(): ILang {\n    return this.get(IStore.LANG, 'system');\n  }\n\n  public get zoom(): number {\n    const val = this.get(IStore.ZOOM, 1);\n    return isPositiveFiniteNumber(val) ? val : 1;\n  }\n\n  public get dns(): string {\n    const val = this.get(IStore.DNS, '');\n    return isHttp(val, true) ? val : '';\n  }\n\n  public get hardwareAcceleration(): boolean {\n    return !!this.get(IStore.HARDWARE_ACCELERATION, true);\n  }\n\n  public get timeout(): number {\n    const val = this.get(IStore.TIMEOUT, 10 * 1000);\n    return isPositiveFiniteNumber(val) ? val : 10 * 1000;\n  }\n\n  public get ua(): string {\n    const val = this.get(IStore.UA, generateUserAgent());\n    return isValidUa(val) ? val : generateUserAgent();\n  }\n\n  public get debug(): boolean {\n    return !!this.get(IStore.DEBUG, false);\n  }\n\n  public get proxy(): ProxyConfig {\n    const { type, url: proxy, bypass } = this.get(IStore.PROXY, { type: 'system', url: '', bypass: '' });\n    let proxyConfig: ProxyConfig;\n\n    if (type === PROXY_TYPE.SYSTEM) {\n      proxyConfig = { mode: 'system' };\n    } else if (proxy) {\n      proxyConfig = { mode: 'fixed_servers', proxyRules: proxy, proxyBypassRules: bypass };\n    } else {\n      proxyConfig = { mode: 'direct' };\n    }\n\n    return proxyConfig;\n  }\n\n  public set(key: string, value: unknown) {\n    this.store.set(key, value);\n  }\n\n  public get<T>(key: string, defaultValue?: T) {\n    return this.store.get(key, defaultValue) as T;\n  }\n}\n\nexport const configManager = new ConfigManager();\n"
  },
  {
    "path": "src/main/services/ContextMenu.ts",
    "content": "import { t } from '@main/services/AppLocale';\nimport type { MenuItemConstructorOptions } from 'electron';\nimport { Menu } from 'electron';\n\nclass ContextMenu {\n  public contextMenu(w: Electron.WebContents) {\n    w.on('context-menu', (_event, properties) => {\n      const template: MenuItemConstructorOptions[] = this.createEditMenuItems(properties);\n      const filtered = template.filter((item) => item.visible !== false);\n      if (filtered.length > 0) {\n        let template = [...filtered, ...this.createInspectMenuItems(w)];\n        const dictionarySuggestions = this.createDictionarySuggestions(properties, w);\n        if (dictionarySuggestions.length > 0) {\n          template = [\n            ...dictionarySuggestions,\n            { type: 'separator' },\n            this.createSpellCheckMenuItem(properties, w),\n            { type: 'separator' },\n            ...template,\n          ];\n        }\n        const menu = Menu.buildFromTemplate(template);\n        menu.popup();\n      }\n    });\n  }\n\n  private createInspectMenuItems(w: Electron.WebContents): MenuItemConstructorOptions[] {\n    const template: MenuItemConstructorOptions[] = [\n      {\n        id: 'inspect',\n        label: t('system.contextMenu.inspect'),\n        click: () => {\n          w.toggleDevTools();\n        },\n        enabled: true,\n      },\n    ];\n\n    return template;\n  }\n\n  private createEditMenuItems(properties: Electron.ContextMenuParams): MenuItemConstructorOptions[] {\n    const hasText = properties.selectionText.trim().length > 0;\n    const can = (type: string) => properties.editFlags[`can${type}`] && hasText;\n\n    const template: MenuItemConstructorOptions[] = [\n      {\n        id: 'copy',\n        label: t('system.edit.copy'),\n        role: 'copy',\n        enabled: can('Copy'),\n        visible: properties.isEditable || hasText,\n      },\n      {\n        id: 'paste',\n        label: t('system.edit.paste'),\n        role: 'paste',\n        enabled: properties.editFlags.canPaste,\n        visible: properties.isEditable,\n      },\n      {\n        id: 'cut',\n        label: t('system.edit.cut'),\n        role: 'cut',\n        enabled: can('Cut'),\n        visible: properties.isEditable,\n      },\n    ];\n\n    // remove role from items that are not enabled\n    // https://github.com/electron/electron/issues/13554\n    template.forEach((item) => {\n      if (item.enabled === false) {\n        item.role = undefined;\n      }\n    });\n\n    return template;\n  }\n\n  private createSpellCheckMenuItem(\n    properties: Electron.ContextMenuParams,\n    w: Electron.WebContents,\n  ): MenuItemConstructorOptions {\n    const hasText = properties.selectionText.length > 0;\n\n    return {\n      id: 'learnSpelling',\n      label: '&Learn Spelling',\n      visible: Boolean(properties.isEditable && hasText && properties.misspelledWord),\n      click: () => {\n        w.session.addWordToSpellCheckerDictionary(properties.misspelledWord);\n      },\n    };\n  }\n\n  private createDictionarySuggestions(\n    properties: Electron.ContextMenuParams,\n    w: Electron.WebContents,\n  ): MenuItemConstructorOptions[] {\n    const hasText = properties.selectionText.length > 0;\n\n    if (!hasText || !properties.misspelledWord) {\n      return [];\n    }\n\n    if (properties.dictionarySuggestions.length === 0) {\n      return [\n        {\n          id: 'dictionarySuggestions',\n          label: 'No Guesses Found',\n          visible: true,\n          enabled: false,\n        },\n      ];\n    }\n\n    return properties.dictionarySuggestions.map((suggestion) => ({\n      id: 'dictionarySuggestions',\n      label: suggestion,\n      visible: Boolean(properties.isEditable && hasText && properties.misspelledWord),\n      click: (menuItem: Electron.MenuItem) => {\n        w.replaceMisspelling(menuItem.label);\n      },\n    }));\n  }\n}\n\nexport const contextMenu = new ContextMenu();\n"
  },
  {
    "path": "src/main/services/DbService/crud/analyze.ts",
    "content": "import type { IModels, IOrm, ISchemas } from '@shared/types/db';\nimport type { SQLWrapper } from 'drizzle-orm';\nimport { and, asc, count, eq, inArray, like, sql } from 'drizzle-orm';\n\nexport default {\n  // Retrieves all records\n  async all(orm: IOrm, schemas: ISchemas) {\n    return orm.select().from(schemas.analyze);\n  },\n\n  // Retrieves all active records, ordered by name\n  async active(orm: IOrm, schemas: ISchemas) {\n    return await orm\n      .select()\n      .from(schemas.analyze)\n      .where(eq(schemas.analyze.isActive, true))\n      .orderBy(asc(schemas.analyze.createdAt));\n  },\n\n  // Updates records by ID and returns the updated rows\n  async update(orm: IOrm, schemas: ISchemas, ids: Array<string>, doc: IModels['analyze']) {\n    return await orm.update(schemas.analyze).set(doc).where(inArray(schemas.analyze.id, ids)).returning();\n  },\n\n  // Deletes all records\n  async clear(orm: IOrm, schemas: ISchemas) {\n    return await orm.delete(schemas.analyze);\n  },\n\n  // Retrieves a single record by its ID\n  async get(orm: IOrm, schemas: ISchemas, id: string) {\n    const [res] = await orm.select().from(schemas.analyze).where(eq(schemas.analyze.id, id));\n    return res;\n  },\n\n  // Retrieves records matching specified fields with optional pagination\n  async getByField(\n    orm: IOrm,\n    schemas: ISchemas,\n    condition: Partial<{ [K in keyof IModels['analyze']]: any } & { page: number; pageSize: number }> = {},\n  ) {\n    const { page, pageSize, ...filterFields } = condition;\n    const conds = Object.entries(filterFields).map(([k, v]) =>\n      Array.isArray(v) ? inArray(schemas.analyze[k], v) : eq(schemas.analyze[k], v),\n    );\n\n    let query = orm\n      .select()\n      .from(schemas.analyze)\n      .where(conds.length ? and(...conds) : sql`true`) as any;\n    if (page && pageSize) {\n      query = query.limit(pageSize).offset((page - 1) * pageSize);\n    }\n\n    const res = await query;\n    return res;\n  },\n\n  // Clears the table and inserts new records\n  async set(orm: IOrm, schemas: ISchemas, doc: Array<IModels['analyze']>) {\n    await orm.delete(schemas.analyze);\n    return await orm.insert(schemas.analyze).values(doc);\n  },\n\n  // Adds a new record and returns the inserted row\n  async add(orm: IOrm, schemas: ISchemas, doc: IModels['analyze']) {\n    return await orm.insert(schemas.analyze).values(doc).returning();\n  },\n\n  // Removes records by ID\n  async remove(orm: IOrm, schemas: ISchemas, ids: Array<string>) {\n    return await orm.delete(schemas.analyze).where(inArray(schemas.analyze.id, ids));\n  },\n\n  // Removes records matching specified fields\n  async removeByField(orm: IOrm, schemas: ISchemas, condition: Partial<{ [K in keyof IModels['analyze']]: any }> = {}) {\n    const conds = Object.entries(condition).map(([k, v]) =>\n      Array.isArray(v) ? inArray(schemas.analyze[k], v) : eq(schemas.analyze[k], v),\n    );\n\n    const query = orm.delete(schemas.analyze).where(conds.length ? and(...conds) : sql`true`);\n\n    const res = await query;\n    return res;\n  },\n\n  // Retrieves a paginated list of records with optional keyword search\n  async page(orm: IOrm, schemas: ISchemas, page: number = 1, pageSize: number = 20, kw?: string) {\n    const conditions: SQLWrapper[] = [];\n    if (kw) {\n      conditions.push(like(schemas.analyze.name, `%${kw}%`));\n    }\n\n    const dataBaseQuery = orm.select().from(schemas.analyze);\n    const dataConditionQuery = conditions.length > 0 ? dataBaseQuery.where(and(...conditions)) : dataBaseQuery;\n    const dataQuery = dataConditionQuery\n      .limit(pageSize)\n      .offset((page - 1) * pageSize)\n      .orderBy(asc(schemas.analyze.createdAt));\n    const list = await dataQuery;\n\n    const countBaseQuery = orm.select({ count: count() }).from(schemas.analyze);\n    const countConditionQuery = conditions.length > 0 ? countBaseQuery.where(and(...conditions)) : countBaseQuery;\n    const countQuery = await countConditionQuery;\n    const total = countQuery[0]?.count || 0;\n\n    return { list, total };\n  },\n};\n"
  },
  {
    "path": "src/main/services/DbService/crud/channel.ts",
    "content": "import type { IModels, IOrm, ISchemas } from '@shared/types/db';\nimport type { SQLWrapper } from 'drizzle-orm';\nimport { and, asc, count, eq, inArray, isNotNull, like, ne, sql } from 'drizzle-orm';\n\nexport default {\n  // Retrieves all records\n  async all(orm: IOrm, schemas: ISchemas) {\n    return await orm.select().from(schemas.channel);\n  },\n\n  // Updates records by ID and returns the updated rows\n  async update(orm: IOrm, schemas: ISchemas, ids: Array<string>, doc: IModels['channel']) {\n    return await orm.update(schemas.channel).set(doc).where(inArray(schemas.channel.id, ids)).returning();\n  },\n\n  // Deletes all records\n  async clear(orm: IOrm, schemas: ISchemas) {\n    return await orm.delete(schemas.channel);\n  },\n\n  // Retrieves a single record by its ID\n  async get(orm: IOrm, schemas: ISchemas, id: string) {\n    const [res] = await orm.select().from(schemas.channel).where(eq(schemas.channel.id, id));\n    return res;\n  },\n\n  // Retrieves records matching specified fields with optional pagination\n  async getByField(\n    orm: IOrm,\n    schemas: ISchemas,\n    condition: Partial<{ [K in keyof IModels['channel']]: any } & { page: number; pageSize: number }> = {},\n  ) {\n    const { page, pageSize, ...filterFields } = condition;\n    const conds = Object.entries(filterFields).map(([k, v]) =>\n      Array.isArray(v) ? inArray(schemas.channel[k], v) : eq(schemas.channel[k], v),\n    );\n\n    let query = orm\n      .select()\n      .from(schemas.channel)\n      .where(conds.length ? and(...conds) : sql`true`) as any;\n    if (page && pageSize) {\n      query = query.limit(pageSize).offset((page - 1) * pageSize);\n    }\n\n    const res = await query;\n    return res;\n  },\n\n  // Clears the table and inserts new records\n  async set(orm: IOrm, schemas: ISchemas, doc: Array<IModels['channel']>) {\n    await orm.delete(schemas.channel);\n    return await orm.insert(schemas.channel).values(doc);\n  },\n\n  // Adds a new record and returns the inserted row\n  async add(orm: IOrm, schemas: ISchemas, doc: IModels['channel']) {\n    return await orm.insert(schemas.channel).values(doc).returning();\n  },\n\n  // Removes records by ID\n  async remove(orm: IOrm, schemas: ISchemas, ids: Array<string>) {\n    return await orm.delete(schemas.channel).where(inArray(schemas.channel.id, ids));\n  },\n\n  // Removes records matching specified fields\n  async removeByField(orm: IOrm, schemas: ISchemas, condition: Partial<{ [K in keyof IModels['channel']]: any }> = {}) {\n    const conds = Object.entries(condition).map(([k, v]) =>\n      Array.isArray(v) ? inArray(schemas.channel[k], v) : eq(schemas.channel[k], v),\n    );\n\n    const query = orm.delete(schemas.channel).where(conds.length ? and(...conds) : sql`true`);\n\n    const res = await query;\n    return res;\n  },\n\n  // Retrieves a paginated list of records with optional keyword search\n  async page(orm: IOrm, schemas: ISchemas, page: number = 1, pageSize: number = 20, kw?: string, group?: string) {\n    const conditions: SQLWrapper[] = [];\n    if (kw) {\n      conditions.push(like(schemas.channel.name, `%${kw}%`));\n    }\n    if (group) {\n      conditions.push(eq(schemas.channel.group, group!));\n    }\n\n    const dataBaseQuery = orm.select().from(schemas.channel);\n    const dataConditionQuery = conditions.length > 0 ? dataBaseQuery.where(and(...conditions)) : dataBaseQuery;\n    const dataQuery = dataConditionQuery\n      .limit(pageSize)\n      .offset((page - 1) * pageSize)\n      .orderBy(asc(schemas.channel.createdAt));\n    const list = await dataQuery;\n\n    const countBaseQuery = orm.select({ count: count() }).from(schemas.channel);\n    const countConditionQuery = conditions.length > 0 ? countBaseQuery.where(and(...conditions)) : countBaseQuery;\n    const countQuery = await countConditionQuery;\n    const total = countQuery[0]?.count || 0;\n\n    return { list, total };\n  },\n\n  // Retrieves the group information\n  async group(orm: IOrm, schemas: ISchemas) {\n    return await orm\n      .select({\n        label: schemas.channel.group,\n        value: schemas.channel.group,\n      })\n      .from(schemas.channel)\n      .where(and(isNotNull(schemas.channel.group), ne(schemas.channel.group, '')))\n      .groupBy(schemas.channel.group);\n  },\n};\n"
  },
  {
    "path": "src/main/services/DbService/crud/history.ts",
    "content": "import { isArray, isArrayEmpty } from '@shared/modules/validate';\nimport type { IModels, IOrm, ISchemas } from '@shared/types/db';\nimport type { SQLWrapper } from 'drizzle-orm';\nimport { and, count, desc, eq, inArray, like, sql } from 'drizzle-orm';\n\nexport default {\n  // Retrieves all records\n  async all(orm: IOrm, schemas: ISchemas) {\n    return orm.select().from(schemas.history);\n  },\n\n  // Updates records by ID and returns the updated rows\n  async update(orm: IOrm, schemas: ISchemas, ids: Array<string>, doc: IModels['history']) {\n    return await orm.update(schemas.history).set(doc).where(inArray(schemas.history.id, ids)).returning();\n  },\n\n  // Deletes all records\n  async clear(orm: IOrm, schemas: ISchemas) {\n    return await orm.delete(schemas.history);\n  },\n\n  // Retrieves a single record by its ID\n  async get(orm: IOrm, schemas: ISchemas, id: string) {\n    const [res] = await orm.select().from(schemas.history).where(eq(schemas.history.id, id));\n    return res;\n  },\n\n  // Retrieves records matching specified fields with optional pagination\n  async getByField(\n    orm: IOrm,\n    schemas: ISchemas,\n    condition: Partial<{ [K in keyof IModels['history']]: any } & { page: number; pageSize: number }> = {},\n  ) {\n    const { page, pageSize, ...filterFields } = condition;\n    const conds = Object.entries(filterFields).map(([k, v]) =>\n      Array.isArray(v) ? inArray(schemas.history[k], v) : eq(schemas.history[k], v),\n    );\n\n    let query = orm\n      .select()\n      .from(schemas.history)\n      .where(conds.length ? and(...conds) : sql`true`) as any;\n    if (page && pageSize) {\n      query = query.limit(pageSize).offset((page - 1) * pageSize);\n    }\n\n    const res = await query;\n    return res;\n  },\n\n  // Clears the table and inserts new records\n  async set(orm: IOrm, schemas: ISchemas, doc: Array<IModels['history']>) {\n    await orm.delete(schemas.history);\n    return await orm.insert(schemas.history).values(doc);\n  },\n\n  // Adds a new record and returns the inserted row\n  async add(orm: IOrm, schemas: ISchemas, doc: IModels['history']) {\n    return await orm.insert(schemas.history).values(doc).returning();\n  },\n\n  // Removes records by ID\n  async remove(orm: IOrm, schemas: ISchemas, ids: Array<string>) {\n    return await orm.delete(schemas.history).where(inArray(schemas.history.id, ids));\n  },\n\n  // Removes records matching specified fields\n  async removeByField(orm: IOrm, schemas: ISchemas, condition: Partial<{ [K in keyof IModels['history']]: any }> = {}) {\n    const conds = Object.entries(condition).map(([k, v]) =>\n      Array.isArray(v) ? inArray(schemas.history[k], v) : eq(schemas.history[k], v),\n    );\n\n    const query = orm.delete(schemas.history).where(conds.length ? and(...conds) : sql`true`);\n\n    const res = await query;\n    return res;\n  },\n\n  // Retrieves a paginated list of records with optional keyword and type search\n  async page(\n    orm: IOrm,\n    schemas: ISchemas,\n    page: number = 1,\n    pageSize: number = 20,\n    kw?: string,\n    type?: IModels['history']['type'][],\n  ) {\n    const conditions: SQLWrapper[] = [];\n    if (kw) {\n      conditions.push(like(schemas.history.videoName, `%${kw}%`));\n    }\n\n    if (isArray(type) && !isArrayEmpty(type)) {\n      conditions.push(inArray(schemas.history.type, type));\n    }\n\n    const dataBaseQuery = orm.select().from(schemas.history);\n    const dataConditionQuery = conditions.length > 0 ? dataBaseQuery.where(and(...conditions)) : dataBaseQuery;\n    const dataQuery = dataConditionQuery\n      .limit(pageSize)\n      .offset((page - 1) * pageSize)\n      .orderBy(desc(schemas.history.updatedAt));\n    const list = await dataQuery;\n\n    const countBaseQuery = orm.select({ count: count() }).from(schemas.history);\n    const countConditionQuery = conditions.length > 0 ? countBaseQuery.where(and(...conditions)) : countBaseQuery;\n    const countQuery = await countConditionQuery;\n    const total = countQuery[0]?.count || 0;\n\n    return { list, total };\n  },\n};\n"
  },
  {
    "path": "src/main/services/DbService/crud/index.ts",
    "content": "import analyze from './analyze';\nimport channel from './channel';\nimport history from './history';\nimport iptv from './iptv';\nimport plugin from './plugin';\nimport setting from './setting';\nimport site from './site';\nimport star from './star';\n\ninterface ICrudService {\n  analyze: typeof analyze;\n  channel: typeof channel;\n  history: typeof history;\n  iptv: typeof iptv;\n  plugin: typeof plugin;\n  setting: typeof setting;\n  site: typeof site;\n  star: typeof star;\n}\n\nconst crudService: ICrudService = { analyze, channel, history, iptv, plugin, setting, site, star };\n\nexport default crudService;\n"
  },
  {
    "path": "src/main/services/DbService/crud/iptv.ts",
    "content": "import type { IModels, IOrm, ISchemas } from '@shared/types/db';\nimport type { SQLWrapper } from 'drizzle-orm';\nimport { and, asc, count, eq, inArray, like, sql } from 'drizzle-orm';\n\nexport default {\n  // Retrieves all records\n  async all(orm: IOrm, schemas: ISchemas) {\n    return orm.select().from(schemas.iptv);\n  },\n\n  // Retrieves all active records, ordered by name\n  async active(orm: IOrm, schemas: ISchemas) {\n    return await orm\n      .select()\n      .from(schemas.iptv)\n      .where(eq(schemas.iptv.isActive, true))\n      .orderBy(asc(schemas.iptv.createdAt));\n  },\n\n  // Updates records by ID and returns the updated rows\n  async update(orm: IOrm, schemas: ISchemas, ids: Array<string>, doc: IModels['iptv']) {\n    return await orm.update(schemas.iptv).set(doc).where(inArray(schemas.iptv.id, ids)).returning();\n  },\n\n  // Deletes all records\n  async clear(orm: IOrm, schemas: ISchemas) {\n    return await orm.delete(schemas.iptv);\n  },\n\n  // Retrieves a single record by its ID\n  async get(orm: IOrm, schemas: ISchemas, id: string) {\n    const [res] = await orm.select().from(schemas.iptv).where(eq(schemas.iptv.id, id));\n    return res;\n  },\n\n  // Retrieves records matching specified fields with optional pagination\n  async getByField(\n    orm: IOrm,\n    schemas: ISchemas,\n    condition: Partial<{ [K in keyof IModels['iptv']]: any } & { page: number; pageSize: number }> = {},\n  ) {\n    const { page, pageSize, ...filterFields } = condition;\n    const conds = Object.entries(filterFields).map(([k, v]) =>\n      Array.isArray(v) ? inArray(schemas.iptv[k], v) : eq(schemas.iptv[k], v),\n    );\n\n    let query = orm\n      .select()\n      .from(schemas.iptv)\n      .where(conds.length ? and(...conds) : sql`true`) as any;\n    if (page && pageSize) {\n      query = query.limit(pageSize).offset((page - 1) * pageSize);\n    }\n\n    const res = await query;\n    return res;\n  },\n\n  // Clears the table and inserts new records\n  async set(orm: IOrm, schemas: ISchemas, doc: Array<IModels['iptv']>) {\n    await orm.delete(schemas.iptv);\n    return await orm.insert(schemas.iptv).values(doc);\n  },\n\n  // Adds a new record and returns the inserted row\n  async add(orm: IOrm, schemas: ISchemas, doc: IModels['iptv']) {\n    return await orm.insert(schemas.iptv).values(doc).returning();\n  },\n\n  // Removes records by ID\n  async remove(orm: IOrm, schemas: ISchemas, ids: Array<string>) {\n    return await orm.delete(schemas.iptv).where(inArray(schemas.iptv.id, ids));\n  },\n\n  // Removes records matching specified fields\n  async removeByField(orm: IOrm, schemas: ISchemas, condition: Partial<{ [K in keyof IModels['iptv']]: any }> = {}) {\n    const conds = Object.entries(condition).map(([k, v]) =>\n      Array.isArray(v) ? inArray(schemas.iptv[k], v) : eq(schemas.iptv[k], v),\n    );\n\n    const query = orm.delete(schemas.iptv).where(conds.length ? and(...conds) : sql`true`);\n\n    const res = await query;\n    return res;\n  },\n\n  // Retrieves a paginated list of records with optional keyword search\n  async page(orm: IOrm, schemas: ISchemas, page: number = 1, pageSize: number = 20, kw?: string) {\n    const conditions: SQLWrapper[] = [];\n    if (kw) {\n      conditions.push(like(schemas.iptv.name, `%${kw}%`));\n    }\n\n    const dataBaseQuery = orm.select().from(schemas.iptv);\n    const dataConditionQuery = conditions.length > 0 ? dataBaseQuery.where(and(...conditions)) : dataBaseQuery;\n    const dataQuery = dataConditionQuery\n      .limit(pageSize)\n      .offset((page - 1) * pageSize)\n      .orderBy(asc(schemas.iptv.createdAt));\n    const list = await dataQuery;\n\n    const countBaseQuery = orm.select({ count: count() }).from(schemas.iptv);\n    const countConditionQuery = conditions.length > 0 ? countBaseQuery.where(and(...conditions)) : countBaseQuery;\n    const countQuery = await countConditionQuery;\n    const total = countQuery[0]?.count || 0;\n\n    return { list, total };\n  },\n};\n"
  },
  {
    "path": "src/main/services/DbService/crud/plugin.ts",
    "content": "import type { IModels, IOrm, ISchemas } from '@shared/types/db';\nimport type { SQLWrapper } from 'drizzle-orm';\nimport { and, asc, count, eq, inArray, like, sql } from 'drizzle-orm';\n\nexport default {\n  // Retrieves all records\n  async all(orm: IOrm, schemas: ISchemas) {\n    return orm.select().from(schemas.plugin);\n  },\n\n  // Updates records by ID and returns the updated rows\n  async update(orm: IOrm, schemas: ISchemas, ids: Array<string>, doc: IModels['plugin']) {\n    return await orm.update(schemas.plugin).set(doc).where(inArray(schemas.plugin.id, ids)).returning();\n  },\n\n  // Deletes all records\n  async clear(orm: IOrm, schemas: ISchemas) {\n    return await orm.delete(schemas.plugin);\n  },\n\n  // Retrieves a single record by its ID\n  async get(orm: IOrm, schemas: ISchemas, id: string) {\n    const [res] = await orm.select().from(schemas.plugin).where(eq(schemas.plugin.id, id));\n    return res;\n  },\n\n  // Retrieves records matching specified fields with optional pagination\n  async getByField(\n    orm: IOrm,\n    schemas: ISchemas,\n    condition: Partial<{ [K in keyof IModels['plugin']]: any } & { page: number; pageSize: number }> = {},\n  ) {\n    const { page, pageSize, ...filterFields } = condition;\n    const conds = Object.entries(filterFields).map(([k, v]) =>\n      Array.isArray(v) ? inArray(schemas.plugin[k], v) : eq(schemas.plugin[k], v),\n    );\n\n    let query = orm\n      .select()\n      .from(schemas.plugin)\n      .where(conds.length ? and(...conds) : sql`true`) as any;\n    if (page && pageSize) {\n      query = query.limit(pageSize).offset((page - 1) * pageSize);\n    }\n\n    const res = await query;\n    return res;\n  },\n\n  // Clears the table and inserts new records\n  async set(orm: IOrm, schemas: ISchemas, doc: Array<IModels['plugin']>) {\n    await orm.delete(schemas.plugin);\n    return await orm.insert(schemas.plugin).values(doc);\n  },\n\n  // Adds a new record and returns the inserted row\n  async add(orm: IOrm, schemas: ISchemas, doc: IModels['plugin']) {\n    return await orm.insert(schemas.plugin).values(doc).returning();\n  },\n\n  // Removes records by ID\n  async remove(orm: IOrm, schemas: ISchemas, ids: Array<string>) {\n    return await orm.delete(schemas.plugin).where(inArray(schemas.plugin.id, ids));\n  },\n\n  // Removes records matching specified fields\n  async removeByField(orm: IOrm, schemas: ISchemas, condition: Partial<{ [K in keyof IModels['plugin']]: any }> = {}) {\n    const conds = Object.entries(condition).map(([k, v]) =>\n      Array.isArray(v) ? inArray(schemas.plugin[k], v) : eq(schemas.plugin[k], v),\n    );\n\n    const query = orm.delete(schemas.plugin).where(conds.length ? and(...conds) : sql`true`);\n\n    const res = await query;\n    return res;\n  },\n\n  // Retrieves a paginated list of records with optional keyword search\n  async page(orm: IOrm, schemas: ISchemas, page: number = 1, pageSize: number = 20, kw?: string) {\n    const conditions: SQLWrapper[] = [];\n    if (kw) {\n      conditions.push(like(schemas.plugin.name, `%${kw}%`));\n    }\n\n    const dataBaseQuery = orm.select().from(schemas.plugin);\n    const dataConditionQuery = conditions.length > 0 ? dataBaseQuery.where(and(...conditions)) : dataBaseQuery;\n    const dataQuery = dataConditionQuery\n      .limit(pageSize)\n      .offset((page - 1) * pageSize)\n      .orderBy(asc(schemas.plugin.createdAt));\n    const list = await dataQuery;\n\n    const countBaseQuery = orm.select({ count: count() }).from(schemas.plugin);\n    const countConditionQuery = conditions.length > 0 ? countBaseQuery.where(and(...conditions)) : countBaseQuery;\n    const countQuery = await countConditionQuery;\n    const total = countQuery[0]?.count || 0;\n\n    return { list, total };\n  },\n};\n"
  },
  {
    "path": "src/main/services/DbService/crud/setting.ts",
    "content": "import type { ISettingKey } from '@shared/config/tblSetting';\nimport type { IOrm, ISchemas } from '@shared/types/db';\nimport { eq, inArray } from 'drizzle-orm';\n\nexport default {\n  // Retrieves all records\n  async all(orm: IOrm, schemas: ISchemas) {\n    const res = await orm.select().from(schemas.setting);\n\n    return res.reduce((acc, item) => {\n      acc[item.key] = (item.value as { data?: any })?.data;\n      return acc;\n    }, {});\n  },\n\n  // Updates records by ID and returns the updated rows\n  async update(orm: IOrm, schemas: ISchemas, doc: { key: ISettingKey; value: any }) {\n    return await orm\n      .update(schemas.setting)\n      .set({ value: { data: doc.value } })\n      .where(eq(schemas.setting.key, doc.key))\n      .returning();\n  },\n\n  // Deletes all records\n  async clear(orm: IOrm, schemas: ISchemas) {\n    return await orm.delete(schemas.setting);\n  },\n\n  // Retrieves a single record by its key\n  async get(orm: IOrm, schemas: ISchemas, key: ISettingKey) {\n    const [res] = await orm.select().from(schemas.setting).where(eq(schemas.setting.key, key));\n    return res;\n  },\n\n  // Clears the table and inserts new records\n  async set(orm: IOrm, schemas: ISchemas, doc: Array<{ key: ISettingKey; value: any }>) {\n    await orm.delete(schemas.setting);\n\n    const newDocs = Object.entries(doc).map(([key, value]) => ({\n      key,\n      value: { data: value },\n    }));\n\n    return await orm.insert(schemas.setting).values(newDocs);\n  },\n\n  // Adds a new record and returns the inserted row\n  async add(orm: IOrm, schemas: ISchemas, doc: { key: ISettingKey; value: any }) {\n    return await orm\n      .insert(schemas.setting)\n      .values({ key: doc.key, value: { data: doc.value } })\n      .returning();\n  },\n\n  // Removes records by key\n  async remove(orm: IOrm, schemas: ISchemas, keys: Array<ISettingKey>) {\n    return await orm.delete(schemas.setting).where(inArray(schemas.setting.key, keys));\n  },\n};\n"
  },
  {
    "path": "src/main/services/DbService/crud/site.ts",
    "content": "import type { IModels, IOrm, ISchemas } from '@shared/types/db';\nimport type { SQLWrapper } from 'drizzle-orm';\nimport { and, asc, count, eq, inArray, isNotNull, like, ne, sql } from 'drizzle-orm';\n\nexport default {\n  // Retrieves all records\n  async all(orm: IOrm, schemas: ISchemas) {\n    return orm.select().from(schemas.site);\n  },\n\n  // Retrieves all active records, ordered by name\n  async active(orm: IOrm, schemas: ISchemas) {\n    return await orm\n      .select()\n      .from(schemas.site)\n      .where(eq(schemas.site.isActive, true))\n      .orderBy(asc(schemas.site.createdAt));\n  },\n\n  // Updates records by ID and returns the updated rows\n  async update(orm: IOrm, schemas: ISchemas, ids: Array<string>, doc: IModels['site']) {\n    return await orm.update(schemas.site).set(doc).where(inArray(schemas.site.id, ids)).returning();\n  },\n\n  // Deletes all records\n  async clear(orm: IOrm, schemas: ISchemas) {\n    return await orm.delete(schemas.site);\n  },\n\n  // Retrieves a single record by its ID\n  async get(orm: IOrm, schemas: ISchemas, id: string) {\n    const [res] = await orm.select().from(schemas.site).where(eq(schemas.site.id, id));\n    return res;\n  },\n\n  // Retrieves records matching specified fields with optional pagination\n  async getByField(\n    orm: IOrm,\n    schemas: ISchemas,\n    condition: Partial<{ [K in keyof IModels['site']]: any } & { page: number; pageSize: number }> = {},\n  ) {\n    const { page, pageSize, ...filterFields } = condition;\n    const conds = Object.entries(filterFields).map(([k, v]) =>\n      Array.isArray(v) ? inArray(schemas.site[k], v) : eq(schemas.site[k], v),\n    );\n\n    let query = orm\n      .select()\n      .from(schemas.site)\n      .where(conds.length ? and(...conds) : sql`true`) as any;\n    if (page && pageSize) {\n      query = query.limit(pageSize).offset((page - 1) * pageSize);\n    }\n\n    const res = await query;\n    return res;\n  },\n\n  // Clears the table and inserts new records\n  async set(orm: IOrm, schemas: ISchemas, doc: Array<IModels['site']>) {\n    await orm.delete(schemas.site);\n    return await orm.insert(schemas.site).values(doc);\n  },\n\n  // Adds a new record and returns the inserted row\n  async add(orm: IOrm, schemas: ISchemas, doc: IModels['site']) {\n    return await orm.insert(schemas.site).values(doc).returning();\n  },\n\n  // Removes records by ID\n  async remove(orm: IOrm, schemas: ISchemas, ids: Array<string>) {\n    return await orm.delete(schemas.site).where(inArray(schemas.site.id, ids));\n  },\n\n  // Removes records matching specified fields\n  async removeByField(orm: IOrm, schemas: ISchemas, condition: Partial<{ [K in keyof IModels['site']]: any }> = {}) {\n    const conds = Object.entries(condition).map(([k, v]) =>\n      Array.isArray(v) ? inArray(schemas.site[k], v) : eq(schemas.site[k], v),\n    );\n\n    const query = orm.delete(schemas.site).where(conds.length ? and(...conds) : sql`true`);\n\n    const res = await query;\n    return res;\n  },\n\n  // Retrieves a paginated list of records with optional keyword search\n  async page(orm: IOrm, schemas: ISchemas, page: number = 1, pageSize: number = 20, kw?: string) {\n    const conditions: SQLWrapper[] = [];\n    if (kw) {\n      conditions.push(like(schemas.site.name, `%${kw}%`));\n    }\n\n    const dataBaseQuery = orm.select().from(schemas.site);\n    const dataConditionQuery = conditions.length > 0 ? dataBaseQuery.where(and(...conditions)) : dataBaseQuery;\n    const dataQuery = dataConditionQuery\n      .limit(pageSize)\n      .offset((page - 1) * pageSize)\n      .orderBy(asc(schemas.site.createdAt));\n    const list = await dataQuery;\n\n    const countBaseQuery = orm.select({ count: count() }).from(schemas.site);\n    const countConditionQuery = conditions.length > 0 ? countBaseQuery.where(and(...conditions)) : countBaseQuery;\n    const countQuery = await countConditionQuery;\n    const total = countQuery[0]?.count || 0;\n\n    return { list, total };\n  },\n\n  // Retrieves a list of unique groups\n  async group(orm: IOrm, schemas: ISchemas) {\n    return await orm\n      .select({\n        label: schemas.site.group,\n        value: schemas.site.group,\n      })\n      .from(schemas.site)\n      .where(and(isNotNull(schemas.site.group), ne(schemas.site.group, '')))\n      .groupBy(schemas.site.group);\n  },\n};\n"
  },
  {
    "path": "src/main/services/DbService/crud/star.ts",
    "content": "import { isArray, isArrayEmpty } from '@shared/modules/validate';\nimport type { IModels, IOrm, ISchemas } from '@shared/types/db';\nimport type { SQLWrapper } from 'drizzle-orm';\nimport { and, count, desc, eq, inArray, like, sql } from 'drizzle-orm';\n\nexport default {\n  // Retrieves all records\n  async all(orm: IOrm, schemas: ISchemas) {\n    return orm.select().from(schemas.star);\n  },\n\n  // Updates records by ID and returns the updated rows\n  async update(orm: IOrm, schemas: ISchemas, ids: Array<string>, doc: IModels['star']) {\n    return await orm.update(schemas.star).set(doc).where(inArray(schemas.star.id, ids)).returning();\n  },\n\n  // Deletes all records\n  async clear(orm: IOrm, schemas: ISchemas) {\n    return await orm.delete(schemas.star);\n  },\n\n  // Retrieves a single record by its ID\n  async get(orm: IOrm, schemas: ISchemas, id: string) {\n    const [res] = await orm.select().from(schemas.star).where(eq(schemas.star.id, id));\n    return res;\n  },\n\n  // Retrieves records matching specified fields with optional pagination\n  async getByField(\n    orm: IOrm,\n    schemas: ISchemas,\n    condition: Partial<{ [K in keyof IModels['star']]: any } & { page: number; pageSize: number }> = {},\n  ) {\n    const { page, pageSize, ...filterFields } = condition;\n    const conds = Object.entries(filterFields).map(([k, v]) =>\n      Array.isArray(v) ? inArray(schemas.star[k], v) : eq(schemas.star[k], v),\n    );\n\n    let query = orm\n      .select()\n      .from(schemas.star)\n      .where(conds.length ? and(...conds) : sql`true`) as any;\n    if (page && pageSize) {\n      query = query.limit(pageSize).offset((page - 1) * pageSize);\n    }\n\n    const res = await query;\n    return res;\n  },\n\n  // Clears the table and inserts new records\n  async set(orm: IOrm, schemas: ISchemas, doc: Array<IModels['star']>) {\n    await orm.delete(schemas.star);\n    return await orm.insert(schemas.star).values(doc);\n  },\n\n  // Adds a new record and returns the inserted row\n  async add(orm: IOrm, schemas: ISchemas, doc: IModels['star']) {\n    return await orm.insert(schemas.star).values(doc).returning();\n  },\n\n  // Removes records by ID\n  async remove(orm: IOrm, schemas: ISchemas, ids: Array<string>) {\n    return await orm.delete(schemas.star).where(inArray(schemas.star.id, ids));\n  },\n\n  // Removes records matching specified fields\n  async removeByField(orm: IOrm, schemas: ISchemas, condition: Partial<{ [K in keyof IModels['star']]: any }> = {}) {\n    const conds = Object.entries(condition).map(([k, v]) =>\n      Array.isArray(v) ? inArray(schemas.star[k], v) : eq(schemas.star[k], v),\n    );\n\n    const query = orm.delete(schemas.star).where(conds.length ? and(...conds) : sql`true`);\n\n    const res = await query;\n    return res;\n  },\n\n  // Retrieves a paginated list of records with optional keyword and type search\n  async page(\n    orm: IOrm,\n    schemas: ISchemas,\n    page: number = 1,\n    pageSize: number = 20,\n    kw?: string,\n    type?: IModels['star']['type'][],\n  ) {\n    const conditions: SQLWrapper[] = [];\n    if (kw) {\n      conditions.push(like(schemas.star.videoName, `%${kw}%`));\n    }\n\n    if (isArray(type) && !isArrayEmpty(type)) {\n      conditions.push(inArray(schemas.star.type, type));\n    }\n\n    const dataBaseQuery = orm.select().from(schemas.star);\n    const dataConditionQuery = conditions.length > 0 ? dataBaseQuery.where(and(...conditions)) : dataBaseQuery;\n    const dataQuery = dataConditionQuery\n      .limit(pageSize)\n      .offset((page - 1) * pageSize)\n      .orderBy(desc(schemas.star.createdAt));\n    const list = await dataQuery;\n\n    const countBaseQuery = orm.select({ count: count() }).from(schemas.star);\n    const countConditionQuery = conditions.length > 0 ? countBaseQuery.where(and(...conditions)) : countBaseQuery;\n    const countQuery = await countConditionQuery;\n    const total = countQuery[0]?.count || 0;\n\n    return { list, total };\n  },\n};\n"
  },
  {
    "path": "src/main/services/DbService/index.ts",
    "content": "import { join } from 'node:path';\n\nimport { createClient } from '@libsql/client';\nimport { loggerService } from '@logger';\nimport type { IStoreKey } from '@main/services/ConfigManager';\nimport { configManager, STORE_KEYS } from '@main/services/ConfigManager';\nimport { ICloudStorage, WebdavStorage } from '@main/services/StorageService';\nimport { fileDelete } from '@main/utils/file';\nimport { APP_DATABASE_PATH } from '@main/utils/path';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport type { ISetting, ISettingKey } from '@shared/config/tblSetting';\nimport { isArrayEmpty, isObjectEmpty } from '@shared/modules/validate';\nimport type { IClient, IConfig, IMigrations, IModels, IOrm, ITableName } from '@shared/types/db';\nimport type { FSWatcher } from 'chokidar';\nimport chokidar from 'chokidar';\nimport { eq } from 'drizzle-orm';\nimport { drizzle } from 'drizzle-orm/libsql';\nimport semver from 'semver';\n\nimport operater from './crud';\nimport { initMigrate, latestVersion, updateMigrate } from './migrations';\nimport { schemas, tableNames } from './schemas';\n\nconst logger = loggerService.withContext(LOG_MODULE.DATABASE);\n\nexport class DbService {\n  private static instance: DbService | null = null;\n  private dbURI: string = '';\n  private client: IClient | null = null;\n  private orm: IOrm | null = null;\n  private watcher: FSWatcher | null = null;\n  private subscribers: Map<string, Array<(newValue: any) => void>> = new Map();\n\n  private constructor() {\n    this.dbURI = `file:${join(APP_DATABASE_PATH, 'data.db')}`;\n  }\n\n  public static getInstance(): DbService {\n    if (!DbService.instance) {\n      DbService.instance = new DbService();\n    }\n    return DbService.instance;\n  }\n\n  public static reload(): DbService {\n    if (DbService.instance) {\n      DbService.instance.close();\n    }\n    DbService.instance = new DbService();\n    return DbService.instance;\n  }\n\n  /**\n   * Connect to database\n   */\n  private conn(): void {\n    const DB_CONFIG: IConfig = {\n      url: this.dbURI,\n    };\n\n    if (!this.client) this.client = createClient(DB_CONFIG);\n    if (!this.orm) this.orm = drizzle({ client: this.client, schema: schemas });\n  }\n\n  public async cloudBackup(\n    type: ISetting['cloud']['type'],\n    options: Omit<ISetting['cloud'], 'type' | 'sync'>,\n  ): Promise<boolean> {\n    try {\n      const { url, username, password } = options || {};\n      const content = await this.db.all();\n\n      if (type === 'webdav') {\n        const webdav = new WebdavStorage();\n        await webdav.initClient({ url, username, password });\n        await webdav.putFileContents('config.json', JSON.stringify(content));\n      } else if (type === 'icloud') {\n        const icloud = new ICloudStorage();\n        await icloud.putFileContents('config.json', JSON.stringify(content));\n      }\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  public async cloudResume(\n    type: ISetting['cloud']['type'],\n    options: Omit<ISetting['cloud'], 'type' | 'sync'>,\n  ): Promise<boolean> {\n    try {\n      const { url, username, password } = options || {};\n\n      if (type === 'webdav') {\n        const webdav = new WebdavStorage();\n        await webdav.initClient({ url, username, password });\n        const text = await webdav.getFileContents('config.json');\n        const content = JSON.parse(text as string);\n        await this.db.init(content);\n      } else if (type === 'icloud') {\n        const icloud = new ICloudStorage();\n        const text = await icloud.getFileContents('config.json');\n        const content = JSON.parse(text as string);\n        await this.db.init(content);\n      }\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  private startWatcher(): void {\n    const path = this.dbURI.replace('file:', '');\n\n    this.watcher = chokidar.watch(path, {\n      awaitWriteFinish: {\n        stabilityThreshold: 500,\n      },\n    });\n\n    this.watcher.on('change', async () => {\n      try {\n        const cloudConf = await this.setting.getValue('cloud');\n        const { sync = false, type, ...options } = cloudConf || {};\n\n        if (sync) {\n          await this.cloudBackup(type, options);\n        }\n      } catch (error) {\n        logger.error('Failed to cloud sync:', error as Error);\n      }\n\n      try {\n        this.dbSyncStore();\n      } catch (error) {\n        logger.error('Failed to local sync:', error as Error);\n      }\n    });\n  }\n\n  private async stopWatcher(): Promise<void> {\n    if (this.watcher) {\n      await this.watcher.close();\n    }\n    this.watcher = null;\n  }\n\n  /**\n   * Close database connection\n   */\n  public async close() {\n    if (this.client) {\n      this.client.close();\n      this.client = null;\n      this.orm = null;\n    }\n    if (this.watcher) {\n      await this.stopWatcher();\n    }\n  }\n\n  /**\n   * Get current database version\n   * @returns string\n   */\n  private async getDbVersion(): Promise<string> {\n    if (!this.client || !this.orm) {\n      return '0.0.0';\n    }\n\n    try {\n      const dbRes = (await this.setting.getValue('version')) || '0.0.0';\n      const version = semver.valid(dbRes) || '0.0.0';\n      return version;\n    } catch {\n      return '0.0.0';\n    }\n  }\n\n  /**\n   * Migrate database to the latest version\n   */\n  public async migrate(): Promise<void> {\n    if (!this.client || !this.orm) {\n      return;\n    }\n\n    const dbVersion = await this.getDbVersion();\n    logger.info(`Current version: ${dbVersion}`);\n\n    if (semver.gte(dbVersion, latestVersion)) return;\n\n    const migrationList: IMigrations =\n      dbVersion === '0.0.0' ? [initMigrate] : updateMigrate.filter((m) => semver.gt(m.version, dbVersion));\n\n    for (const { version, migrate } of migrationList) {\n      try {\n        await migrate(this.orm, schemas);\n        await this.orm\n          .update(schemas.setting)\n          .set({ value: { data: dbVersion === '0.0.0' ? latestVersion : version } })\n          .where(eq(schemas.setting.key, 'version'));\n\n        logger.info(`Migrate to ${version} success`);\n      } catch (error) {\n        if (dbVersion === '0.0.0') {\n          await fileDelete(this.dbURI);\n        }\n        throw new Error(`Migrate to ${version} failed: ${error instanceof Error ? error.message : error}`);\n      }\n    }\n  }\n\n  /**\n   * Sync database to config manager\n   */\n  private async dbSyncStore(): Promise<void> {\n    const config = await this.setting.all();\n\n    STORE_KEYS.forEach((key) => {\n      if (config[key] !== undefined) {\n        configManager.set(key as IStoreKey, config[key] as any);\n      }\n    });\n  }\n\n  /**\n   * Initialize the database connection and create tables\n   */\n  public async init(): Promise<void> {\n    try {\n      this.conn();\n      await this.migrate();\n      await this.dbSyncStore();\n      this.startWatcher();\n\n      logger.info('Initialized successfully');\n    } catch (error) {\n      logger.error('Failed to initialize database:', error as Error);\n      throw new Error(`Database initialization failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n    }\n  }\n\n  public subscribe<T>(key: string, callback: (newValue: T) => void) {\n    if (!this.subscribers.has(key)) {\n      this.subscribers.set(key, []);\n    }\n    this.subscribers.get(key)!.push(callback);\n  }\n\n  public unsubscribe<T>(key: string, callback: (newValue: T) => void) {\n    const subscribers = this.subscribers.get(key);\n    if (subscribers) {\n      this.subscribers.set(\n        key,\n        subscribers.filter((subscriber) => subscriber !== callback),\n      );\n    }\n  }\n\n  private notifySubscribers<T>(key: string, newValue: T) {\n    const subscribers = this.subscribers.get(key);\n    if (subscribers) {\n      subscribers.forEach((subscriber) => subscriber(newValue));\n    }\n  }\n\n  public get tableNames() {\n    return tableNames;\n  }\n\n  public get db() {\n    const TABLE_OPERATIONS = {\n      analyze: this.analyze,\n      channel: this.channel,\n      history: this.history,\n      iptv: this.iptv,\n      plugin: this.plugin,\n      setting: this.setting,\n      site: this.site,\n      star: this.star,\n    };\n\n    return {\n      all: async (tableNames: ITableName[] = []): Promise<Partial<Record<ITableName, any>>> => {\n        if (isArrayEmpty(tableNames) || isArrayEmpty(tableNames.filter(Boolean))) {\n          tableNames = Object.keys(TABLE_OPERATIONS) as ITableName[];\n        }\n\n        const results = await Promise.all(tableNames.map((name) => TABLE_OPERATIONS[name].all()));\n\n        return Object.fromEntries(tableNames.map((name, i) => [name, results[i]]));\n      },\n\n      init: async (doc: Partial<Record<ITableName, any>>): Promise<Partial<Record<ITableName, any>>> => {\n        const tableNames = Object.keys(doc).filter((name) =>\n          name in TABLE_OPERATIONS && name === 'setting' ? !isObjectEmpty(doc[name]) : !isArrayEmpty(doc[name]),\n        ) as ITableName[];\n        const results = await Promise.all(tableNames.map((name) => TABLE_OPERATIONS[name].set(doc[name])));\n        return Object.fromEntries(tableNames.map((name, i) => [name, results[i]]));\n      },\n\n      clear: async (tableNames: ITableName[] = []): Promise<Partial<Record<ITableName, any>>> => {\n        if (isArrayEmpty(tableNames)) {\n          tableNames = Object.keys(TABLE_OPERATIONS) as ITableName[];\n        }\n\n        const results = await Promise.all(tableNames.map((name) => TABLE_OPERATIONS[name].clear()));\n\n        return Object.fromEntries(tableNames.map((name, i) => [name, results[i]]));\n      },\n    };\n  }\n\n  public get analyze() {\n    return {\n      all: () => operater.analyze.all(this.orm!, schemas),\n      active: () => operater.analyze.active(this.orm!, schemas),\n      get: (id: string) => operater.analyze.get(this.orm!, schemas, id),\n      getByField: (doc: Partial<{ [K in keyof IModels['analyze']]: any } & { page: number; pageSize: number }>) =>\n        operater.analyze.getByField(this.orm!, schemas, doc),\n      add: (doc: IModels['analyze']) => operater.analyze.add(this.orm!, schemas, doc),\n      update: (ids: string[], doc: IModels['analyze']) => operater.analyze.update(this.orm!, schemas, ids, doc),\n      remove: (ids: string[]) => operater.analyze.remove(this.orm!, schemas, ids),\n      removeByField: (doc: Partial<{ [K in keyof IModels['analyze']]: any }>) =>\n        operater.analyze.removeByField(this.orm!, schemas, doc),\n      set: (doc: Array<IModels['analyze']>) => operater.analyze.set(this.orm!, schemas, doc),\n      clear: () => operater.analyze.clear(this.orm!, schemas),\n      page: (page: number = 1, pageSize: number = 20, kw?: string) =>\n        operater.analyze.page(this.orm!, schemas, page, pageSize, kw),\n    };\n  }\n\n  public get channel() {\n    return {\n      all: () => operater.channel.all(this.orm!, schemas),\n      get: (id: string) => operater.channel.get(this.orm!, schemas, id),\n      getByField: (doc: Partial<{ [K in keyof IModels['channel']]: any } & { page: number; pageSize: number }>) =>\n        operater.channel.getByField(this.orm!, schemas, doc),\n      add: (doc: IModels['channel']) => operater.channel.add(this.orm!, schemas, doc),\n      update: (ids: string[], doc: IModels['channel']) => operater.channel.update(this.orm!, schemas, ids, doc),\n      remove: (ids: string[]) => operater.channel.remove(this.orm!, schemas, ids),\n      removeByField: (doc: Partial<{ [K in keyof IModels['channel']]: any }>) =>\n        operater.channel.removeByField(this.orm!, schemas, doc),\n      set: (doc: Array<IModels['channel']>) => operater.channel.set(this.orm!, schemas, doc),\n      clear: () => operater.channel.clear(this.orm!, schemas),\n      page: (page: number = 1, pageSize: number = 20, kw: string = '', group: string = '') =>\n        operater.channel.page(this.orm!, schemas, page, pageSize, kw, group),\n      group: () => operater.channel.group(this.orm!, schemas),\n    };\n  }\n\n  public get history() {\n    return {\n      all: () => operater.history.all(this.orm!, schemas),\n      get: (id: string) => operater.history.get(this.orm!, schemas, id),\n      getByField: (doc: Partial<{ [K in keyof IModels['history']]: any } & { page: number; pageSize: number }>) =>\n        operater.history.getByField(this.orm!, schemas, doc),\n      add: (doc: IModels['history']) => operater.history.add(this.orm!, schemas, doc),\n      update: (ids: string[], doc: IModels['history']) => operater.history.update(this.orm!, schemas, ids, doc),\n      remove: (ids: string[]) => operater.history.remove(this.orm!, schemas, ids),\n      removeByField: (doc: Partial<{ [K in keyof IModels['history']]: any }>) =>\n        operater.history.removeByField(this.orm!, schemas, doc),\n      set: (doc: Array<IModels['history']>) => operater.history.set(this.orm!, schemas, doc),\n      clear: () => operater.history.clear(this.orm!, schemas),\n      page: (page: number = 1, pageSize: number = 20, kw?: string, type?: IModels['history']['type'][]) =>\n        operater.history.page(this.orm!, schemas, page, pageSize, kw, type),\n    };\n  }\n\n  public get iptv() {\n    return {\n      all: () => operater.iptv.all(this.orm!, schemas),\n      active: () => operater.iptv.active(this.orm!, schemas),\n      get: (id: string) => operater.iptv.get(this.orm!, schemas, id),\n      getByField: (doc: Partial<{ [K in keyof IModels['iptv']]: any } & { page: number; pageSize: number }>) =>\n        operater.iptv.getByField(this.orm!, schemas, doc),\n      add: (doc: IModels['iptv']) => operater.iptv.add(this.orm!, schemas, doc),\n      update: (ids: string[], doc: IModels['iptv']) => operater.iptv.update(this.orm!, schemas, ids, doc),\n      remove: (ids: string[]) => operater.iptv.remove(this.orm!, schemas, ids),\n      removeByField: (doc: Partial<{ [K in keyof IModels['iptv']]: any }>) =>\n        operater.iptv.removeByField(this.orm!, schemas, doc),\n      set: (doc: Array<IModels['iptv']>) => operater.iptv.set(this.orm!, schemas, doc),\n      clear: () => operater.iptv.clear(this.orm!, schemas),\n      page: (page: number = 1, pageSize: number = 20, kw?: string) =>\n        operater.iptv.page(this.orm!, schemas, page, pageSize, kw),\n    };\n  }\n\n  public get plugin() {\n    return {\n      all: () => operater.plugin.all(this.orm!, schemas),\n      get: (id: string) => operater.plugin.get(this.orm!, schemas, id),\n      getByField: (doc: Partial<{ [K in keyof IModels['plugin']]: any } & { page: number; pageSize: number }>) =>\n        operater.plugin.getByField(this.orm!, schemas, doc),\n      add: (doc: IModels['plugin']) => operater.plugin.add(this.orm!, schemas, doc),\n      update: (ids: string[], doc: IModels['plugin']) => operater.plugin.update(this.orm!, schemas, ids, doc),\n      remove: (ids: string[]) => operater.plugin.remove(this.orm!, schemas, ids),\n      removeByField: (doc: Partial<{ [K in keyof IModels['plugin']]: any }>) =>\n        operater.plugin.removeByField(this.orm!, schemas, doc),\n      set: (doc: Array<IModels['plugin']>) => operater.plugin.set(this.orm!, schemas, doc),\n      clear: () => operater.plugin.clear(this.orm!, schemas),\n      page: (page: number = 1, pageSize: number = 20, kw?: string) =>\n        operater.plugin.page(this.orm!, schemas, page, pageSize, kw),\n    };\n  }\n\n  public get setting() {\n    return {\n      all: () => operater.setting.all(this.orm!, schemas),\n      get: (key: ISettingKey) => operater.setting.get(this.orm!, schemas, key),\n      getValue: async (key: ISettingKey) => {\n        const result = await operater.setting.get(this.orm!, schemas, key);\n        return result?.value?.data ?? '';\n      },\n      add: async (doc: { key: ISettingKey; value: any }) => {\n        const result = await operater.setting.add(this.orm!, schemas, doc);\n        this.notifySubscribers(`setting:${doc.key}`, doc.value);\n        return result;\n      },\n      update: async (doc: { key: ISettingKey; value: any }) => {\n        const result = await operater.setting.update(this.orm!, schemas, doc);\n        this.notifySubscribers(`setting:${doc.key}`, doc.value);\n        return result;\n      },\n      remove: async (keys: ISettingKey[]) => {\n        const result = await operater.setting.remove(this.orm!, schemas, keys);\n        keys.forEach((key) => {\n          this.notifySubscribers(`setting:${key}`, null);\n        });\n        return result;\n      },\n      set: async (doc: Array<{ key: ISettingKey; value: any }>) => {\n        const result = await operater.setting.set(this.orm!, schemas, doc);\n        Object.entries(doc).forEach(([key, value]) => {\n          this.notifySubscribers(`setting:${key}`, value);\n        });\n        return result;\n      },\n      clear: async () => {\n        const result = await operater.setting.clear(this.orm!, schemas);\n        this.notifySubscribers('setting:*', null);\n        return result;\n      },\n    };\n  }\n\n  public get site() {\n    return {\n      all: () => operater.site.all(this.orm!, schemas),\n      active: () => operater.site.active(this.orm!, schemas),\n      get: (id: string) => operater.site.get(this.orm!, schemas, id),\n      getByField: (doc: Partial<{ [K in keyof IModels['site']]: any } & { page: number; pageSize: number }>) =>\n        operater.site.getByField(this.orm!, schemas, doc),\n      add: (doc: IModels['site']) => operater.site.add(this.orm!, schemas, doc),\n      update: (ids: string[], doc: IModels['site']) => operater.site.update(this.orm!, schemas, ids, doc),\n      remove: (ids: string[]) => operater.site.remove(this.orm!, schemas, ids),\n      removeByField: (doc: Partial<{ [K in keyof IModels['site']]: any }>) =>\n        operater.site.removeByField(this.orm!, schemas, doc),\n      set: (doc: Array<IModels['site']>) => operater.site.set(this.orm!, schemas, doc),\n      clear: () => operater.site.clear(this.orm!, schemas),\n      page: (page: number = 1, pageSize: number = 20, kw?: string) =>\n        operater.site.page(this.orm!, schemas, page, pageSize, kw),\n      group: () => operater.site.group(this.orm!, schemas),\n    };\n  }\n\n  public get star() {\n    return {\n      all: () => operater.star.all(this.orm!, schemas),\n      get: (id: string) => operater.star.get(this.orm!, schemas, id),\n      getByField: (doc: Partial<{ [K in keyof IModels['star']]: any } & { page: number; pageSize: number }>) =>\n        operater.star.getByField(this.orm!, schemas, doc),\n      add: (doc: IModels['star']) => operater.star.add(this.orm!, schemas, doc),\n      update: (ids: string[], doc: IModels['star']) => operater.star.update(this.orm!, schemas, ids, doc),\n      remove: (ids: string[]) => operater.star.remove(this.orm!, schemas, ids),\n      removeByField: (doc: Partial<{ [K in keyof IModels['star']]: any }>) =>\n        operater.star.removeByField(this.orm!, schemas, doc),\n      set: (doc: Array<IModels['star']>) => operater.star.set(this.orm!, schemas, doc),\n      clear: () => operater.star.clear(this.orm!, schemas),\n      page: (page: number = 1, pageSize: number = 20, kw?: string, type?: IModels['star']['type'][]) =>\n        operater.star.page(this.orm!, schemas, page, pageSize, kw, type),\n    };\n  }\n}\n\nexport const dbService = DbService.getInstance();\n"
  },
  {
    "path": "src/main/services/DbService/migrations/index.ts",
    "content": "import type { IMigrate, IMigrations } from '@shared/types/db';\nimport semver from 'semver';\n\nconst pathToVersion = (path: string): string => {\n  const match = path.match(/migrate-(\\d+_\\d+_\\d+)\\.ts/);\n  return match![1].replaceAll('_', '.');\n};\n\nconst generateMigrations = (): IMigrations => {\n  const migrateModules = import.meta.glob<IMigrate>('./migrate-*.ts', {\n    eager: true,\n    import: 'default',\n  });\n\n  // Export order is important\n  return Object.entries(migrateModules)\n    .sort(([aPath], [bPath]) => semver.compare(pathToVersion(aPath), pathToVersion(bPath)))\n    .map(([path, module]) => {\n      return { version: pathToVersion(path), migrate: module };\n    });\n};\n\nconst migrations = generateMigrations();\nexport const initMigrate = migrations[0];\nexport const updateMigrate = migrations.slice(1);\nexport const latestVersion = migrations.at(-1)!.version;\n\nexport default migrations;\n"
  },
  {
    "path": "src/main/services/DbService/migrations/migrate-3_3_1.ts",
    "content": "import { settingList as tblSetting } from '@shared/config/tblSetting';\nimport type { IOrm, ISchemas } from '@shared/types/db';\nimport { sql } from 'drizzle-orm';\n\nconst migrate = async (orm: IOrm, schemas: ISchemas): Promise<void> => {\n  // Create tables if not exists\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS tbl_analyze (\n      id        TEXT PRIMARY KEY,\n      key       TEXT NOT NULL UNIQUE,\n      name      TEXT NOT NULL,\n      api       TEXT NOT NULL,\n      type      INTEGER NOT NULL,            -- 1 = web, 2 = json\n      flag      TEXT DEFAULT '[]',           -- JSON\n      headers   TEXT DEFAULT '{}',           -- JSON\n      script    TEXT,\n      isActive  INTEGER DEFAULT 1,           -- 0 = false, 1 = true\n      createdAt INTEGER DEFAULT (strftime('%s', 'now') * 1000),\n      updatedAt INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n    );\n  `);\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS tbl_channel (\n      id        TEXT PRIMARY KEY,\n      name      TEXT NOT NULL,\n      api       TEXT NOT NULL,\n      logo      TEXT,\n      playback  TEXT,\n      \"group\"   TEXT,\n      createdAt INTEGER DEFAULT (strftime('%s', 'now') * 1000),\n      updatedAt INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n    );\n  `);\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS tbl_history (\n      id              TEXT PRIMARY KEY,\n      type            INTEGER NOT NULL,      -- 1 = film, 2 = live, 3 = parse, 5 = search, 6 = simple-import, 7 = complete-import\n      relateId        TEXT,\n      siteSource      TEXT,\n      playEnd         INTEGER DEFAULT 0,     -- 0 = false, 1 = true\n      videoId         TEXT,\n      videoImage      TEXT,\n      videoName       TEXT,\n      videoIndex      TEXT,\n      watchTime       REAL DEFAULT 0,\n      duration        REAL DEFAULT 0,\n      skipTimeInEnd   REAL DEFAULT 0,\n      skipTimeInStart REAL DEFAULT 0,\n      createdAt       INTEGER DEFAULT (strftime('%s', 'now') * 1000),\n      updatedAt       INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n    );\n  `);\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS tbl_iptv (\n      id        TEXT PRIMARY KEY,\n      key       TEXT NOT NULL UNIQUE,\n      name      TEXT NOT NULL,\n      api       TEXT NOT NULL,\n      type      INTEGER NOT NULL,            -- 1 = remote, 2 = local, 3 = manual\n      epg       TEXT,\n      logo      TEXT,\n      headers   TEXT DEFAULT '{}',           -- JSON\n      isActive  INTEGER DEFAULT 1,           -- 1 = true, 0 = false\n      createdAt INTEGER DEFAULT (strftime('%s', 'now') * 1000),\n      updatedAt INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n    );\n  `);\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS tbl_plugin (\n      id          TEXT PRIMARY KEY,\n      type        INTEGER DEFAULT 2,         -- 1 = ui, 2 = system, 3 = mix\n      name        TEXT NOT NULL,\n      pluginName  TEXT NOT NULL,\n      author      TEXT,\n      description TEXT,\n      readme      TEXT,\n      base        TEXT NOT NULL,\n      main        TEXT,\n      web         TEXT,\n      version     TEXT,\n      logo        TEXT,\n      homepage    TEXT,\n      isActive    INTEGER DEFAULT 0,           -- 1 = true, 0 = false\n      createdAt   INTEGER DEFAULT (strftime('%s', 'now') * 1000),\n      updatedAt   INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n    );\n  `);\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS tbl_setting (\n      id        TEXT PRIMARY KEY,\n      key       TEXT NOT NULL UNIQUE,\n      value     TEXT,                        -- JSON\n      createdAt INTEGER DEFAULT (strftime('%s', 'now') * 1000),\n      updatedAt INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n    );\n  `);\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS tbl_site (\n      id         TEXT PRIMARY KEY,\n      key        TEXT NOT NULL UNIQUE,\n      name       TEXT NOT NULL,\n      api        TEXT,\n      playUrl    TEXT,\n      search     INTEGER DEFAULT 1,          -- 1 = true, 0 = false\n      \"group\"    TEXT,\n      type       INTEGER NOT NULL,\n      ext        TEXT,\n      categories TEXT,\n      isActive   INTEGER DEFAULT 1,          -- 1 = true, 0 = false\n      createdAt  INTEGER DEFAULT (strftime('%s', 'now') * 1000),\n      updatedAt  INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n    );\n  `);\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS tbl_star (\n      id            TEXT PRIMARY KEY,\n      type          INTEGER NOT NULL,        -- 1 = film, 2 = live, 3 = parse\n      relateId      TEXT,\n      videoId       TEXT,\n      videoImage    TEXT,\n      videoName     TEXT,\n      videoType     TEXT,\n      videoRemarks  TEXT,\n      createdAt     INTEGER DEFAULT (strftime('%s', 'now') * 1000),\n      updatedAt     INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n    );\n  `);\n\n  // Create indexes for faster queries\n  await orm.run(sql`CREATE INDEX IF NOT EXISTS idx_analyze_key ON tbl_analyze(key);`);\n  await orm.run(sql`CREATE INDEX IF NOT EXISTS idx_iptv_key ON tbl_iptv(key);`);\n  await orm.run(sql`CREATE INDEX IF NOT EXISTS idx_setting_key ON tbl_setting(key);`);\n  await orm.run(sql`CREATE INDEX IF NOT EXISTS idx_site_key ON tbl_site(key);`);\n\n  // tbl_setting insert default values\n  if ((await orm.$count(schemas.setting)) === 0) {\n    for (const item of tblSetting) {\n      await orm.insert(schemas.setting).values({ key: item.key, value: { data: item.value } });\n    }\n  }\n};\n\nexport default migrate;\n"
  },
  {
    "path": "src/main/services/DbService/migrations/migrate-3_3_10.ts",
    "content": "import type { IOrm, ISchemas } from '@shared/types/db';\nimport { eq, sql } from 'drizzle-orm';\n\nconst migrate = async (orm: IOrm, schemas: ISchemas): Promise<void> => {\n  // disable foreign key checks\n  await orm.run(sql`PRAGMA foreign_keys=OFF;`);\n\n  // tbl_star add column date\n  await orm.run(sql`ALTER TABLE tbl_star ADD COLUMN date INTEGER;`);\n  await orm.run(sql`UPDATE tbl_star SET date = (strftime('%s', 'now') * 1000);`);\n\n  // enable foreign key checks\n  await orm.run(sql`PRAGMA foreign_keys=ON;`);\n\n  // tbl_setting update playerMode\n  const old_playerMode: { data?: Record<string, string> } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'playerMode')))?.[0]?.value || {};\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'playerMode'));\n  await orm.insert(schemas.setting).values({\n    key: 'playerMode',\n    value: {\n      data: {\n        type:\n          old_playerMode?.data?.type && ['dplayer', 'nplayer'].includes(old_playerMode.data.type)\n            ? old_playerMode.data.type\n            : 'artplayer',\n        external: old_playerMode?.data?.external || '',\n      },\n    },\n  });\n\n  // tbl_setting update defaultFilterType\n  const old_defaultFilterType: { data?: string } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'defaultFilterType')))?.[0]?.value || {};\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'defaultFilterType'));\n  await orm.insert(schemas.setting).values({\n    key: 'defaultFilterType',\n    value: { data: old_defaultFilterType?.data === 'on' || false },\n  });\n};\n\nexport default migrate;\n"
  },
  {
    "path": "src/main/services/DbService/migrations/migrate-3_3_2.ts",
    "content": "import type { IOrm, ISchemas } from '@shared/types/db';\nimport { eq } from 'drizzle-orm';\n\nconst migrate = async (orm: IOrm, schemas: ISchemas): Promise<void> => {\n  // tbl_setting update windowPosition\n  await orm.insert(schemas.setting).values({\n    key: 'windowPosition',\n    value: { data: { status: false, position: { width: 1000, height: 640 } } },\n  });\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'restoreWindowPositionAndSize'));\n};\n\nexport default migrate;\n"
  },
  {
    "path": "src/main/services/DbService/migrations/migrate-3_3_4.ts",
    "content": "import type { IOrm, ISchemas } from '@shared/types/db';\nimport { eq } from 'drizzle-orm';\n\nconst migrate = async (orm: IOrm, schemas: ISchemas): Promise<void> => {\n  // tbl_setting update lang\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'lang'));\n  await orm.insert(schemas.setting).values({ key: 'lang', value: { data: 'zh_CN' } });\n\n  // tbl_setting update defaultViewCasual\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'defaultViewCasual'));\n  await orm.insert(schemas.setting).values({ key: 'defaultViewCasual', value: { data: '' } });\n\n  // tbl_setting update barrage\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'barrage'));\n  await orm.insert(schemas.setting).values({\n    key: 'barrage',\n    value: {\n      data: {\n        url: '',\n        id: '',\n        key: 'danmuku',\n        support: ['qq', 'qiyi', 'youku', 'mgtv'],\n        start: 0,\n        mode: 1,\n        color: 2,\n        content: 4,\n      },\n    },\n  });\n\n  // tbl_setting update playerMode\n  const old_broadcasterType =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'broadcasterType'))?.[0]?.value) || {};\n  const old_externalPlayer =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'externalPlayer'))?.[0]?.value) || {};\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'playerMode'));\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'externalPlayer'));\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'broadcasterType'));\n  await orm.insert(schemas.setting).values({\n    key: 'playerMode',\n    value: {\n      data: {\n        type: old_broadcasterType?.data || 'xgplayer',\n        external: old_externalPlayer?.data || '',\n      },\n    },\n  });\n\n  // tbl_setting update snifferMode\n  const old_snifferType =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'snifferType'))?.[0]?.value) || {};\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'snifferMode'));\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'snifferType'));\n  await orm.insert(schemas.setting).values({\n    key: 'snifferMode',\n    value: {\n      data: {\n        type: old_snifferType?.data || 'pie',\n        url: '',\n      },\n    },\n  });\n\n  // tbl_setting update webdav\n  const old_webdavUrl =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'webdavUrl'))?.[0]?.value) || {};\n  const old_webdavUsername =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'webdavUsername'))?.[0]?.value) || {};\n  const old_webdavPassword =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'webdavPassword'))?.[0]?.value) || {};\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'webview'));\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'webdavUrl'));\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'webdavUsername'));\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'webdavPassword'));\n  await orm.insert(schemas.setting).values({\n    key: 'webdav',\n    value: {\n      data: {\n        sync: false,\n        data: {\n          url: old_webdavUrl?.data || 'https://dav.jianguoyun.com/dav/',\n          username: old_webdavUsername?.data || '',\n          password: old_webdavPassword?.data || '',\n        },\n      },\n    },\n  });\n};\n\nexport default migrate;\n"
  },
  {
    "path": "src/main/services/DbService/migrations/migrate-3_3_5.ts",
    "content": "import type { IOrm, ISchemas } from '@shared/types/db';\nimport { eq } from 'drizzle-orm';\n\nconst migrate = async (orm: IOrm, schemas: ISchemas): Promise<void> => {\n  // tbl_analyze update column type\n  const tblAnalyze = (await orm.select().from(schemas.analyze)) || [];\n  for (const item of tblAnalyze) {\n    await orm\n      .update(schemas.analyze)\n      .set({ type: item?.type || 0 })\n      .where(eq(schemas.analyze.id, item.id));\n  }\n\n  // tbl_setting update timeout\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'timeout'));\n  await orm.insert(schemas.setting).values({\n    key: 'timeout',\n    value: { data: 10000 },\n  });\n\n  // tbl_setting update ai\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'ai'));\n  await orm.insert(schemas.setting).values({\n    key: 'ai',\n    value: { data: { server: '', key: '', model: '' } },\n  });\n};\n\nexport default migrate;\n"
  },
  {
    "path": "src/main/services/DbService/migrations/migrate-3_3_7.ts",
    "content": "import type { IOrm, ISchemas } from '@shared/types/db';\nimport { eq } from 'drizzle-orm';\n\nconst migrate = async (orm: IOrm, schemas: ISchemas): Promise<void> => {\n  // tbl_setting update windowPosition\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'windowPosition'));\n  await orm.insert(schemas.setting).values({\n    key: 'windowPosition',\n    value: {\n      data: {\n        status: false,\n        position_main: { width: 1000, height: 640 },\n        position_play: { width: 875, height: 550 },\n      },\n    },\n  });\n\n  // tbl_setting update defaultFilterType\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'defaultFilterType'));\n  await orm.insert(schemas.setting).values({ key: 'defaultFilterType', value: { data: 'off' } });\n\n  // tbl_setting update dns\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'dns'));\n  await orm.insert(schemas.setting).values({ key: 'dns', value: { data: '' } });\n\n  // tbl_setting update debug\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'debug'));\n  await orm.insert(schemas.setting).values({ key: 'debug', value: { data: false } });\n};\n\nexport default migrate;\n"
  },
  {
    "path": "src/main/services/DbService/migrations/migrate-3_3_8.ts",
    "content": "import type { IOrm, ISchemas } from '@shared/types/db';\nimport { eq } from 'drizzle-orm';\n\nconst migrate = async (orm: IOrm, schemas: ISchemas): Promise<void> => {\n  // tbl_site update column type\n  const tblSite = (await orm.select().from(schemas.site)) || [];\n  for (const item of tblSite) {\n    if (item.type === 3 || item.type === 4) {\n      await orm.update(schemas.site).set({ type: 11 }).where(eq(schemas.site.id, item.id));\n    }\n  }\n\n  // tbl_setting update iptvMarkIp\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'iptvSkipIpv6'));\n  await orm.insert(schemas.setting).values({ key: 'iptvMarkIp', value: { data: true } });\n\n  // tbl_setting update iptvDelay\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'iptvStatus'));\n  await orm.insert(schemas.setting).values({ key: 'iptvDelay', value: { data: false } });\n\n  // tbl_setting update analyzeFlag\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'analyzeFlag'));\n  await orm.insert(schemas.setting).values({\n    key: 'analyzeFlag',\n    value: { data: ['youku', 'qq', 'iqiyi', 'qiyi', 'letv', 'leshi', 'sohu', 'tudou', 'pptv', 'mgtv', 'imgo'] },\n  });\n};\n\nexport default migrate;\n"
  },
  {
    "path": "src/main/services/DbService/migrations/migrate-3_3_9.ts",
    "content": "import type { IOrm, ISchemas } from '@shared/types/db';\nimport { sql } from 'drizzle-orm';\n\nconst migrate = async (orm: IOrm, _schemas: ISchemas): Promise<void> => {\n  // disable foreign key checks\n  await orm.run(sql`PRAGMA foreign_keys=OFF;`);\n\n  // tbl_site add column search\n  await orm.run(sql`ALTER TABLE tbl_site ADD COLUMN search INTEGER;`);\n  await orm.run(sql`UPDATE tbl_site SET search = CASE WHEN search = 1 THEN 1 ELSE 0 END;`);\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS __new_tbl_site (\n      id         TEXT PRIMARY KEY,\n      key        TEXT NOT NULL UNIQUE,\n      name       TEXT,\n      api        TEXT,\n      playUrl    TEXT,\n      search     INTEGER NOT NULL DEFAULT 0, -- 1 = true, 0 = false\n      \"group\"    TEXT,\n      type       INTEGER NOT NULL,\n      ext        TEXT,\n      categories TEXT,\n      isActive   INTEGER DEFAULT 1          -- 1 = true, 0 = false\n    );\n  `);\n  await orm.run(sql`\n    INSERT INTO __new_tbl_site (id, key, name, api, playUrl, search, \"group\", type, ext, categories, isActive)\n    SELECT id, key, name, api, playUrl, '', \"group\", type, ext, categories, isActive FROM tbl_site;\n  `);\n  await orm.run(sql`DROP TABLE tbl_site;`);\n  await orm.run(sql`ALTER TABLE __new_tbl_site RENAME TO tbl_site;`);\n  await orm.run(sql`CREATE INDEX IF NOT EXISTS idx_site_key ON tbl_site(key);`);\n\n  // tbl_drive add column showAll\n  await orm.run(sql`ALTER TABLE tbl_drive ADD COLUMN showAll boolean default false;`);\n\n  // enable foreign key checks\n  await orm.run(sql`PRAGMA foreign_keys=ON;`);\n};\n\nexport default migrate;\n"
  },
  {
    "path": "src/main/services/DbService/migrations/migrate-3_4_0.ts",
    "content": "import type { IOrm, ISchemas } from '@shared/types/db';\nimport { sql } from 'drizzle-orm';\n\nconst migrate = async (orm: IOrm, _schemas: ISchemas): Promise<void> => {\n  // disable foreign key checks\n  await orm.run(sql`PRAGMA foreign_keys=OFF;`);\n\n  // tbl_star add column type\n  await orm.run(sql`ALTER TABLE tbl_star ADD COLUMN type TEXT;`);\n  await orm.run(sql`UPDATE tbl_star SET type = 'film';`);\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS __new_tbl_star (\n      id            TEXT PRIMARY KEY,\n      date          INTEGER,\n      type          TEXT NOT NULL,\n      relateId      TEXT,\n      videoId       TEXT,\n      videoImage    TEXT,\n      videoName     TEXT,\n      videoType     TEXT,\n      videoRemarks  TEXT\n    );\n  `);\n  await orm.run(sql`\n    INSERT INTO __new_tbl_star (id, date, type, relateId, videoId, videoImage, videoName, videoType, videoRemarks)\n    SELECT id, date, type, relateId, videoId, videoImage, videoName, videoType, videoRemarks FROM tbl_star;\n  `);\n  await orm.run(sql`DROP TABLE tbl_star;`);\n  await orm.run(sql`ALTER TABLE __new_tbl_star RENAME TO tbl_star;`);\n\n  // tbl_iptv add column key headers\n  await orm.run(sql`ALTER TABLE tbl_iptv ADD COLUMN key TEXT;`);\n  await orm.run(sql`ALTER TABLE tbl_iptv ADD COLUMN headers TEXT;`);\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS __new_tbl_iptv (\n      id            TEXT PRIMARY KEY,\n      key           TEXT NOT NULL UNIQUE,\n      name          TEXT,\n      url           TEXT NOT NULL,\n      type          TEXT NOT NULL,\n      epg           TEXT,\n      logo          TEXT,\n      headers       TEXT,\n      isActive      INTEGER DEFAULT 1        -- 1 = true, 0 = false\n    );\n  `);\n  await orm.run(sql`\n    INSERT INTO __new_tbl_iptv (id, name, url, type, epg, logo, headers, isActive)\n    SELECT id, CAST(id AS TEXT), name, url, type, epg, logo, '{}', isActive FROM tbl_iptv;\n  `);\n  await orm.run(sql`DROP TABLE tbl_iptv;`);\n  await orm.run(sql`ALTER TABLE __new_tbl_iptv RENAME TO tbl_iptv;`);\n  await orm.run(sql`CREATE INDEX IF NOT EXISTS idx_iptv_key ON tbl_iptv(key);`);\n\n  // tbl_drive add column key\n  await orm.run(sql`ALTER TABLE tbl_drive ADD COLUMN key TEXT;`);\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS __new_tbl_drive (\n      id            TEXT PRIMARY KEY,\n      key           TEXT NOT NULL UNIQUE,\n      name          TEXT,\n      server        TEXT NOT NULL,\n      startPage     TEXT,\n      headers       TEXT,\n      params        TEXT,\n      search        INTEGER DEFAULT 0,       -- 1 = true, 0 = false\n      showAll       INTEGER DEFAULT 0,       -- 1 = all, 0 = video\n      isActive      INTEGER DEFAULT 1        -- 1 = true, 0 = false\n    );\n  `);\n  await orm.run(sql`\n    INSERT INTO __new_tbl_drive (id, name, server, startPage, headers, params, search, showAll, isActive)\n    SELECT id, CAST(id AS TEXT), name, server, startPage, headers, params, search, showAll, isActive FROM tbl_drive;\n  `);\n  await orm.run(sql`DROP TABLE tbl_drive;`);\n  await orm.run(sql`ALTER TABLE __new_tbl_drive RENAME TO tbl_drive;`);\n  await orm.run(sql`CREATE INDEX IF NOT EXISTS idx_drive_key ON tbl_drive(key);`);\n\n  // tbl_analyze add column key headers\n  await orm.run(sql`ALTER TABLE tbl_analyze ADD COLUMN key TEXT;`);\n  await orm.run(sql`ALTER TABLE tbl_analyze ADD COLUMN headers TEXT;`);\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS __new_tbl_analyze (\n      id            TEXT PRIMARY KEY,\n      key           TEXT NOT NULL UNIQUE,\n      name          TEXT,\n      url           TEXT NOT NULL,\n      type          TEXT NOT NULL,\n      headers       TEXT,\n      isActive      INTEGER DEFAULT 1        -- 1 = true, 0 = false\n    );\n  `);\n  await orm.run(sql`\n    INSERT INTO __new_tbl_analyze (id, name, url, type, headers, isActive)\n    SELECT id, CAST(id AS TEXT), name, url, type, '{}', isActive FROM tbl_analyze;\n  `);\n  await orm.run(sql`DROP TABLE tbl_analyze;`);\n  await orm.run(sql`ALTER TABLE __new_tbl_analyze RENAME TO tbl_analyze;`);\n  await orm.run(sql`CREATE INDEX IF NOT EXISTS idx_analyze_key ON tbl_analyze(key);`);\n\n  // enable foreign key checks\n  await orm.run(sql`PRAGMA foreign_keys=ON;`);\n};\n\nexport default migrate;\n"
  },
  {
    "path": "src/main/services/DbService/migrations/migrate-3_4_1.ts",
    "content": "import type { IOrm, ISchemas } from '@shared/types/db';\nimport { eq, sql } from 'drizzle-orm';\n\nconst migrate = async (orm: IOrm, schemas: ISchemas): Promise<void> => {\n  // disable foreign key checks\n  await orm.run(sql`PRAGMA foreign_keys=OFF;`);\n\n  /**\n   * tbl_analyze refactor\n   * change column: url -> api\n   * add column: script createdAt updatedAt\n   */\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS __new_tbl_analyze (\n      id        TEXT PRIMARY KEY,\n      key       TEXT NOT NULL UNIQUE,\n      name      TEXT NOT NULL,\n      api       TEXT NOT NULL,\n      type      INTEGER NOT NULL,            -- 1 = web, 2 = json\n      flag      TEXT DEFAULT '[]',           -- JSON\n      headers   TEXT DEFAULT '{}',           -- JSON\n      script    TEXT,\n      isActive  INTEGER DEFAULT 1,           -- 0 = false, 1 = true\n      createdAt INTEGER DEFAULT (strftime('%s', 'now') * 1000),\n      updatedAt INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n    );\n  `);\n  const system_flag: { data: string[] } = (\n    await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'analyzeFlag'))\n  )?.[0]?.value || { data: [] };\n  const flag = system_flag?.data || [];\n  await orm.run(sql`\n    INSERT INTO __new_tbl_analyze (id, key, name, api, type, flag, headers, script, isActive)\n    SELECT\n      id, key, name, url,\n      CASE type\n        WHEN 'web' THEN 1\n        WHEN 'json' THEN 2\n        ELSE 0\n      END,\n      ${flag}, headers, '', isActive\n    FROM tbl_analyze;\n  `);\n  await orm.run(sql`DROP TABLE tbl_analyze;`);\n  await orm.run(sql`ALTER TABLE __new_tbl_analyze RENAME TO tbl_analyze;`);\n\n  /**\n   * tbl_channel refactor\n   * change column: url -> api\n   * add column: logo, playback, createdAt, updatedAt\n   */\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS __new_tbl_channel (\n      id        TEXT PRIMARY KEY,\n      name      TEXT NOT NULL,\n      api       TEXT NOT NULL,\n      logo      TEXT,\n      playback  TEXT,\n      \"group\"   TEXT,\n      createdAt INTEGER DEFAULT (strftime('%s', 'now') * 1000),\n      updatedAt INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n    );\n  `);\n  await orm.run(\n    sql`INSERT INTO __new_tbl_channel (id, name, api, logo, playback, \"group\", createdAt, updatedAt)\n    SELECT id, name, url, '', 0, \"group\", createdAt, updatedAt FROM tbl_channel;`,\n  );\n  await orm.run(sql`DROP TABLE tbl_channel;`);\n  await orm.run(sql`ALTER TABLE __new_tbl_channel RENAME TO tbl_channel;`);\n\n  /**\n   * tbl_drive drop\n   */\n  await orm.run(sql`DROP TABLE tbl_drive;`);\n\n  /**\n   * tbl_history refactor\n   * change column: date -> createdAt\n   * add column: updatedAt\n   * change type column value: film:1 live:2 parse:3 search:5 import:6\n   */\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS __new_tbl_history (\n      id              TEXT PRIMARY KEY,\n      type            INTEGER NOT NULL,      -- 1 = film, 2 = live, 3 = parse, 5 = search, 6 = simple-import, 7 = complete-import\n      relateId        TEXT,\n      siteSource      TEXT,\n      playEnd         INTEGER DEFAULT 0,     -- 0 = false, 1 = true\n      videoId         TEXT,\n      videoImage      TEXT,\n      videoName       TEXT,\n      videoIndex      TEXT,\n      watchTime       REAL DEFAULT 0,\n      duration        REAL DEFAULT 0,\n      skipTimeInEnd   REAL DEFAULT 0,\n      skipTimeInStart REAL DEFAULT 0,\n      createdAt       INTEGER DEFAULT (strftime('%s','now')),\n      updatedAt       INTEGER DEFAULT (strftime('%s','now'))\n    );\n  `);\n  await orm.run(sql`\n    INSERT INTO __new_tbl_history (\n      id, type, relateId, siteSource, playEnd, videoId, videoImage, videoName, videoIndex,\n      watchTime, duration, skipTimeInEnd, skipTimeInStart, createdAt\n    )\n    SELECT\n      id,\n      CASE type\n        WHEN 'film' THEN 1\n        WHEN 'iptv' THEN 2\n        WHEN 'analyze' THEN 3\n        WHEN 'search' THEN 5\n        WHEN 'import' THEN 6\n        ELSE 0\n      END,\n      relateId, siteSource, playEnd, videoId, videoImage, videoName, videoIndex,\n      watchTime, duration, skipTimeInEnd, skipTimeInStart, date\n    FROM tbl_history;\n  `);\n  await orm.run(sql`DROP TABLE tbl_history;`);\n  await orm.run(sql`ALTER TABLE __new_tbl_history RENAME TO tbl_history;`);\n\n  /**\n   * tbl_iptv refactor\n   * change column: url -> api\n   * add column: createdAt, updatedAt\n   * change type column value: remote:1 local:2 manual:3\n   */\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS __new_tbl_iptv (\n      id        TEXT PRIMARY KEY,\n      key       TEXT NOT NULL UNIQUE,\n      name      TEXT NOT NULL,\n      api       TEXT NOT NULL,\n      type      INTEGER NOT NULL,            -- 1 = remote, 2 = local, 3 = manual\n      epg       TEXT,\n      logo      TEXT,\n      headers   TEXT DEFAULT '{}',           -- JSON\n      isActive  INTEGER DEFAULT 1,           -- 1 = true, 0 = false\n      createdAt INTEGER DEFAULT (strftime('%s','now')),\n      updatedAt INTEGER DEFAULT (strftime('%s','now'))\n    );\n  `);\n  await orm.run(sql`\n    INSERT INTO __new_tbl_iptv (id, key, name, api, type, epg, logo, headers, isActive)\n    SELECT\n      id, key, name, url,\n      CASE type\n        WHEN 'remote' THEN 1\n        WHEN 'local' THEN 2\n        WHEN 'manual' THEN 3\n        ELSE 0\n      END, epg, logo, headers, isActive\n    FROM tbl_iptv;\n  `);\n  await orm.run(sql`DROP TABLE tbl_iptv;`);\n  await orm.run(sql`ALTER TABLE __new_tbl_iptv RENAME TO tbl_iptv;`);\n\n  /**\n   * add tbl_plugin\n   */\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS tbl_plugin (\n      id          TEXT PRIMARY KEY,\n      type        INTEGER DEFAULT 1,         -- 1 = ui, 2 = system, 3 = mix\n      name        TEXT NOT NULL,\n      pluginName  TEXT NOT NULL,\n      author      TEXT,\n      description TEXT,\n      readme      TEXT,\n      base        TEXT NOT NULL,\n      main        TEXT,\n      web         TEXT,\n      version     TEXT,\n      logo        TEXT,\n      homepage    TEXT,\n      isActive    INTEGER DEFAULT 0,           -- 1 = true, 0 = false\n      createdAt   INTEGER DEFAULT (strftime('%s', 'now') * 1000),\n      updatedAt   INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n    );\n  `);\n\n  /**\n   * tbl_setting refactor\n   * add column: createdAt, updatedAt\n   */\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS __new_tbl_setting (\n      id        TEXT PRIMARY KEY,\n      key       TEXT NOT NULL UNIQUE,\n      value     TEXT,                        -- JSON\n      createdAt INTEGER DEFAULT (strftime('%s', 'now') * 1000),\n      updatedAt INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n    );\n  `);\n  await orm.run(sql`\n    INSERT INTO __new_tbl_setting (id, key, value)\n    SELECT id, key, value FROM tbl_setting;\n  `);\n  await orm.run(sql`DROP TABLE tbl_setting;`);\n  await orm.run(sql`ALTER TABLE __new_tbl_setting RENAME TO tbl_setting;`);\n\n  /**\n   * tbl_site refactor\n   * add column: createdAt, updatedAt\n   */\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS __new_tbl_site (\n      id         TEXT PRIMARY KEY,\n      key        TEXT NOT NULL UNIQUE,\n      name       TEXT NOT NULL,\n      api        TEXT,\n      playUrl    TEXT,\n      search     INTEGER DEFAULT 1,          -- 1 = true, 0 = false\n      \"group\"    TEXT,\n      type       INTEGER NOT NULL,\n      ext        TEXT,\n      categories TEXT,\n      isActive   INTEGER DEFAULT 1,          -- 1 = true, 0 = false\n      createdAt  INTEGER DEFAULT (strftime('%s','now')),\n      updatedAt  INTEGER DEFAULT (strftime('%s','now'))\n    );\n  `);\n  await orm.run(sql`\n    INSERT INTO __new_tbl_site (id, key, name, api, playUrl, search, \"group\", type, ext, categories, isActive)\n    SELECT id, key, name, api, playUrl, search, \"group\", type, ext, categories, isActive FROM tbl_site;\n  `);\n  await orm.run(sql`DROP TABLE tbl_site;`);\n  await orm.run(sql`ALTER TABLE __new_tbl_site RENAME TO tbl_site;`);\n\n  /**\n   * tbl_star refactor\n   * change column: date -> createdAt\n   * add column: updatedAt\n   * change type column value: film:1 live:2 parse:3\n   */\n  await orm.run(sql`\n    CREATE TABLE IF NOT EXISTS __new_tbl_star (\n      id            TEXT PRIMARY KEY,\n      type          INTEGER NOT NULL,        -- 1 = film, 2 = live, 3 = parse\n      relateId      TEXT,\n      videoId       TEXT,\n      videoImage    TEXT,\n      videoName     TEXT,\n      videoType     TEXT,\n      videoRemarks  TEXT,\n      createdAt     INTEGER DEFAULT (strftime('%s','now')),\n      updatedAt     INTEGER DEFAULT (strftime('%s','now'))\n    );\n  `);\n  await orm.run(sql`\n    INSERT INTO __new_tbl_star (id, type, relateId, videoId, videoImage, videoName, videoType, videoRemarks, createdAt)\n    SELECT\n      id,\n      CASE type\n        WHEN 'film' THEN 1\n        WHEN 'iptv' THEN 2\n        WHEN 'analyze' THEN 3\n        ELSE 0\n      END,\n      relateId, videoId, videoImage, videoName, videoType, videoRemarks, date FROM tbl_star;\n  `);\n  await orm.run(sql`DROP TABLE tbl_star;`);\n  await orm.run(sql`ALTER TABLE __new_tbl_star RENAME TO tbl_star;`);\n\n  // Create indexes for faster queries\n  await orm.run(sql`CREATE INDEX IF NOT EXISTS idx_analyze_key ON tbl_analyze(key);`);\n  await orm.run(sql`CREATE INDEX IF NOT EXISTS idx_iptv_key ON tbl_iptv(key);`);\n  await orm.run(sql`CREATE INDEX IF NOT EXISTS idx_setting_key ON tbl_setting(key);`);\n  await orm.run(sql`CREATE INDEX IF NOT EXISTS idx_site_key ON tbl_site(key);`);\n\n  // enable foreign key checks\n  await orm.run(sql`PRAGMA foreign_keys=ON;`);\n\n  // tbl_setting update key recordShortcut -> bossKey\n  const old_bossKey: any = await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'recordShortcut'));\n  if (old_bossKey.length > 0) {\n    await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'recordShortcut'));\n  }\n  await orm.insert(schemas.setting).values({ key: 'bossKey', value: { data: old_bossKey || 'Shift+Alt+Z' } });\n\n  // tbl_setting update key selfBoot -> autoStart\n  const old_autoStart: { data?: boolean } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'selfBoot')))?.[0]?.value || {};\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'selfBoot'));\n  await orm.insert(schemas.setting).values({\n    key: 'autoStart',\n    value: { data: old_autoStart?.data || false },\n  });\n\n  // tbl_setting update key agreementMask -> disclaimer, default true(change of disclaimer)\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'agreementMask'));\n  await orm.insert(schemas.setting).values({\n    key: 'disclaimer',\n    value: { data: true },\n  });\n\n  // tbl_setting update key defaultHot -> hot\n  const old_hot: { data?: string } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'defaultHot')))?.[0]?.value || {};\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'defaultHot'));\n  await orm.insert(schemas.setting).values({\n    key: 'hot',\n    value: { data: old_hot?.data || 'kylive' },\n  });\n\n  // tbl_setting update key playerMode -> player\n  const old_player: { data?: { type: string; external: string } } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'playerMode')))?.[0]?.value || {};\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'playerMode'));\n  await orm.insert(schemas.setting).values({\n    key: 'player',\n    value: { data: old_player?.data || { type: 'artplayer', external: '' } },\n  });\n\n  // tbl_setting update key snifferMode -> sniffer\n  const old_sniffer: { data?: { type: string; url: string } } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'snifferMode')))?.[0]?.value || {};\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'snifferMode'));\n  await orm.insert(schemas.setting).values({\n    key: 'sniffer',\n    value: {\n      data: old_sniffer?.data || old_sniffer?.data?.type === 'pie' ? { type: 'cdp', url: '' } : old_sniffer?.data,\n    },\n  });\n\n  // tbl_setting update key ai -> aigc\n  const old_aigc: { data?: { server: string; key: string; model: string } } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'ai')))?.[0]?.value || {};\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'ai'));\n  await orm.insert(schemas.setting).values({\n    key: 'aigc',\n    value: {\n      data: old_aigc?.data\n        ? { type: 'openai', ...old_aigc?.data }\n        : { type: 'openai', server: '', key: '', model: 'gpt-3.5-turbo' },\n    },\n  });\n\n  // tbl_setting update value theme\n  const old_theme: { data?: string } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'theme')))?.[0]?.value || {};\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'theme'));\n  await orm.insert(schemas.setting).values({\n    key: 'theme',\n    value: { data: !old_theme?.data || old_theme?.data === 'auto' ? 'system' : old_theme?.data },\n  });\n\n  // tbl_setting update value lang\n  const old_lang: { data?: string } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'lang')))?.[0]?.value || {};\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'lang'));\n  await orm.insert(schemas.setting).values({\n    key: 'lang',\n    value: { data: !old_lang?.data || old_lang?.data === 'auto' ? 'system' : old_lang?.data },\n  });\n\n  // tbl_setting update collect defaultSearchType/defaultFilterType to site\n  const old_site_search: { data?: string } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'defaultSearchType')))?.[0]?.value || {};\n  const old_site_filter: { data?: boolean } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'defaultFilterType')))?.[0]?.value || {};\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'defaultSearchType'));\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'defaultFilterType'));\n  await orm.insert(schemas.setting).values({\n    key: 'site',\n    value: {\n      data: {\n        searchMode: old_site_search?.data || 'site',\n        filterMode: old_site_filter?.data || false,\n      },\n    },\n  });\n\n  // tbl_setting update collect defaultIptvEpg/defaultIptvLogo/iptvMarkIp/iptvThumbnail/iptvDelay to iptv\n  const old_iptv_epg: { data?: string } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'defaultIptvEpg')))?.[0]?.value || {};\n  const old_iptv_logo: { data?: string } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'defaultIptvLogo')))?.[0]?.value || {};\n  const old_iptv_mark: { data?: boolean } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'iptvMarkIp')))?.[0]?.value || {};\n  const old_iptv_thumbnail: { data?: boolean } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'iptvThumbnail')))?.[0]?.value || {};\n  const old_iptv_delay: { data?: boolean } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'iptvDelay')))?.[0]?.value || {};\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'defaultIptvEpg'));\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'defaultIptvLogo'));\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'iptvMarkIp'));\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'iptvThumbnail'));\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'iptvDelay'));\n  await orm.insert(schemas.setting).values({\n    key: 'live',\n    value: {\n      data: {\n        ipMark: old_iptv_mark?.data || false,\n        thumbnail: old_iptv_thumbnail?.data || false,\n        delay: old_iptv_delay?.data || false,\n        epg: old_iptv_epg?.data || 'https://epg.112114.eu.org/?ch={name}&date={date}',\n        logo: old_iptv_logo?.data || 'https://epg.112114.eu.org/logo/{name}.png',\n      },\n    },\n  });\n\n  // tbl_setting update collect webdav data to old_cloud\n  const old_cloud: { data?: Record<string, any> } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'webdav')))?.[0]?.value || {};\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'webdav'));\n  await orm.insert(schemas.setting).values({\n    key: 'old_cloud',\n    value: {\n      data: {\n        sync: old_cloud?.data?.sync || false,\n        type: 'webdav',\n        url: old_cloud?.data?.url || 'https://dav.jianguoyun.com/dav/',\n        username: old_cloud?.data?.username || '',\n        password: old_cloud?.data?.password || '',\n      },\n    },\n  });\n\n  // tbl_setting update collect barrage data to barrage\n  const old_barrage: { data?: Record<string, any> } =\n    (await orm.select().from(schemas.setting).where(eq(schemas.setting.key, 'barrage')))?.[0]?.value || {};\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'barrage'));\n  await orm.insert(schemas.setting).values({\n    key: 'barrage',\n    value: {\n      data: {\n        url: old_barrage?.data?.url || '',\n        id: old_barrage?.data?.id || 'name',\n        key: old_barrage?.data?.key || 'danmuku',\n        support: old_barrage?.data?.support || [\n          'youku',\n          'qq',\n          'iqiyi',\n          'qiyi',\n          'letv',\n          'leshi',\n          'sohu',\n          'tudou',\n          'pptv',\n          'mgtv',\n          'imgo',\n        ],\n        type: old_barrage?.data?.mode || 1,\n        text: old_barrage?.data?.content || 4,\n        time: old_barrage?.data?.start || 0,\n        color: old_barrage?.data?.color || 2,\n      },\n    },\n  });\n\n  // tbl_setting delete key analyzeFlag\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'analyzeFlag'));\n\n  // tbl_setting delete key defaultViewCasual\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'defaultViewCasual'));\n\n  // tbl_setting delete key windowPosition\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'windowPosition'));\n\n  // tbl_setting insert proxy\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'proxy'));\n  await orm.insert(schemas.setting).values({\n    key: 'proxy',\n    value: { data: { type: 'system', url: '', bypass: '' } },\n  });\n\n  // tbl_setting insert zoom\n  await orm.delete(schemas.setting).where(eq(schemas.setting.key, 'zoom'));\n  await orm.insert(schemas.setting).values({\n    key: 'zoom',\n    value: { data: 1 },\n  });\n};\n\nexport default migrate;\n"
  },
  {
    "path": "src/main/services/DbService/schemas/analyze.ts",
    "content": "import { randomUUID } from '@shared/modules/crypto';\nimport type { InferSelectModel } from 'drizzle-orm';\nimport { sql } from 'drizzle-orm';\nimport { index, integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nexport const analyze = sqliteTable(\n  'tbl_analyze',\n  {\n    id: text('id')\n      .$defaultFn(() => randomUUID())\n      .primaryKey()\n      .notNull(),\n    key: text('key')\n      .$defaultFn(() => randomUUID())\n      .unique()\n      .notNull(),\n    name: text('name').notNull(),\n    api: text('api').notNull(),\n    type: integer('type').notNull(),\n    flag: text('flag', { mode: 'json' }).$type<string[]>().default([]),\n    headers: text('headers', { mode: 'json' }).$type<Record<string, any>>().default({}),\n    script: text('script'),\n    isActive: integer('isActive', { mode: 'boolean' }).default(true),\n    createdAt: integer('createdAt', { mode: 'number' })\n      .default(sql`(strftime('%s', 'now') * 1000)`)\n      .notNull(),\n    updatedAt: integer('updatedAt', { mode: 'number' })\n      .default(sql`(strftime('%s', 'now') * 1000)`)\n      .$onUpdate(() => Date.now())\n      .notNull(),\n  },\n  (table) => [index('idx_analyze_key').on(table.key)],\n);\n\nexport type AnalyzeModel = InferSelectModel<typeof analyze>;\n"
  },
  {
    "path": "src/main/services/DbService/schemas/channel.ts",
    "content": "import { randomUUID } from '@shared/modules/crypto';\nimport type { InferSelectModel } from 'drizzle-orm';\nimport { sql } from 'drizzle-orm';\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nexport const channel = sqliteTable('tbl_channel', {\n  id: text('id')\n    .$defaultFn(() => randomUUID())\n    .primaryKey()\n    .notNull(),\n  name: text('name').notNull(),\n  api: text('api').notNull(),\n  logo: text('logo'),\n  playback: text('playback'),\n  group: text('group'),\n  createdAt: integer('createdAt', { mode: 'number' })\n    .default(sql`(strftime('%s', 'now') * 1000)`)\n    .notNull(),\n  updatedAt: integer('updatedAt', { mode: 'number' })\n    .default(sql`(strftime('%s', 'now') * 1000)`)\n    .$onUpdate(() => Date.now())\n    .notNull(),\n});\n\nexport type ChannelModel = InferSelectModel<typeof channel>;\n"
  },
  {
    "path": "src/main/services/DbService/schemas/history.ts",
    "content": "import { randomUUID } from '@shared/modules/crypto';\nimport type { InferSelectModel } from 'drizzle-orm';\nimport { sql } from 'drizzle-orm';\nimport { integer, real, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nexport const history = sqliteTable('tbl_history', {\n  id: text('id')\n    .$defaultFn(() => randomUUID())\n    .primaryKey()\n    .notNull(),\n  type: integer('type').notNull(),\n  relateId: text('relateId'),\n  siteSource: text('siteSource'),\n  playEnd: integer('playEnd', { mode: 'boolean' }).default(false),\n  videoId: text('videoId'),\n  videoImage: text('videoImage'),\n  videoName: text('videoName'),\n  videoIndex: text('videoIndex'),\n  watchTime: real('watchTime').default(0),\n  duration: real('duration').default(0),\n  skipTimeInEnd: real('skipTimeInEnd').default(0),\n  skipTimeInStart: real('skipTimeInStart').default(0),\n  createdAt: integer('createdAt', { mode: 'number' })\n    .default(sql`(strftime('%s', 'now') * 1000)`)\n    .notNull(),\n  updatedAt: integer('updatedAt', { mode: 'number' })\n    .default(sql`(strftime('%s', 'now') * 1000)`)\n    .$onUpdate(() => Date.now())\n    .notNull(),\n});\n\nexport type HistoryModel = InferSelectModel<typeof history>;\n"
  },
  {
    "path": "src/main/services/DbService/schemas/index.ts",
    "content": "import type { ResultSet } from '@libsql/client';\nimport type { ExtractTablesWithRelations } from 'drizzle-orm';\nimport type { SQLiteTransaction } from 'drizzle-orm/sqlite-core';\n\nimport type { AnalyzeModel } from './analyze';\nimport { analyze } from './analyze';\nimport type { ChannelModel } from './channel';\nimport { channel } from './channel';\nimport type { HistoryModel } from './history';\nimport { history } from './history';\nimport type { IptvModel } from './iptv';\nimport { iptv } from './iptv';\nimport type { PluginModel } from './plugin';\nimport { plugin } from './plugin';\nimport type { SettingModel } from './setting';\nimport { setting } from './setting';\nimport type { SiteModel } from './site';\nimport { site } from './site';\nimport type { StarModel } from './star';\nimport { star } from './star';\n\nexport const schemas = {\n  analyze,\n  channel,\n  history,\n  iptv,\n  plugin,\n  setting,\n  site,\n  star,\n} as const;\n\nexport const tableNames = Object.keys(schemas) as (keyof Schemas)[];\n\nexport type Schemas = typeof schemas;\n\nexport type TableName = keyof Schemas;\n\nexport interface Models {\n  analyze: AnalyzeModel;\n  channel: ChannelModel;\n  history: HistoryModel;\n  iptv: IptvModel;\n  plugin: PluginModel;\n  setting: SettingModel;\n  site: SiteModel;\n  star: StarModel;\n}\n\nexport type AppTransaction<TMode extends 'async' | 'sync' = 'async'> = SQLiteTransaction<\n  TMode,\n  ResultSet,\n  Schemas,\n  ExtractTablesWithRelations<Schemas>\n>;\n\nexport type Transaction = AppTransaction<'async'>;\n"
  },
  {
    "path": "src/main/services/DbService/schemas/iptv.ts",
    "content": "import { randomUUID } from '@shared/modules/crypto';\nimport type { InferSelectModel } from 'drizzle-orm';\nimport { sql } from 'drizzle-orm';\nimport { index, integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nexport const iptv = sqliteTable(\n  'tbl_iptv',\n  {\n    id: text('id')\n      .$defaultFn(() => randomUUID())\n      .primaryKey()\n      .notNull(),\n    key: text('key')\n      .$defaultFn(() => randomUUID())\n      .unique()\n      .notNull(),\n    name: text('name').notNull(),\n    api: text('api').notNull(),\n    type: integer('type').notNull(),\n    epg: text('epg'),\n    logo: text('logo'),\n    headers: text('headers', { mode: 'json' }).$type<Record<string, any>>().default({}),\n    isActive: integer('isActive', { mode: 'boolean' }).default(true),\n    createdAt: integer('createdAt', { mode: 'number' })\n      .default(sql`(strftime('%s', 'now') * 1000)`)\n      .notNull(),\n    updatedAt: integer('updatedAt', { mode: 'number' })\n      .default(sql`(strftime('%s', 'now') * 1000)`)\n      .$onUpdate(() => Date.now())\n      .notNull(),\n  },\n  (table) => [index('idx_iptv_key').on(table.key)],\n);\n\nexport type IptvModel = InferSelectModel<typeof iptv>;\n"
  },
  {
    "path": "src/main/services/DbService/schemas/plugin.ts",
    "content": "import { randomUUID } from '@shared/modules/crypto';\nimport type { InferSelectModel } from 'drizzle-orm';\nimport { sql } from 'drizzle-orm';\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nexport const plugin = sqliteTable('tbl_plugin', {\n  id: text('id')\n    .$defaultFn(() => randomUUID())\n    .primaryKey()\n    .notNull(),\n  type: integer('type').default(2),\n  name: text('name').notNull(),\n  pluginName: text('pluginName').notNull(),\n  author: text('author'),\n  description: text('description'),\n  readme: text('readme'),\n  base: text('base').notNull(),\n  main: text('main'),\n  web: text('web'),\n  version: text('version'),\n  logo: text('logo'),\n  homepage: text('homepage'),\n  isActive: integer('isActive', { mode: 'boolean' }).default(false),\n  createdAt: integer('createdAt', { mode: 'number' })\n    .default(sql`(strftime('%s', 'now') * 1000)`)\n    .notNull(),\n  updatedAt: integer('updatedAt', { mode: 'number' })\n    .default(sql`(strftime('%s', 'now') * 1000)`)\n    .$onUpdate(() => Date.now())\n    .notNull(),\n});\n\nexport type PluginModel = InferSelectModel<typeof plugin>;\n"
  },
  {
    "path": "src/main/services/DbService/schemas/setting.ts",
    "content": "import { randomUUID } from '@shared/modules/crypto';\nimport type { InferSelectModel } from 'drizzle-orm';\nimport { sql } from 'drizzle-orm';\nimport { index, integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nexport const setting = sqliteTable(\n  'tbl_setting',\n  {\n    id: text('id')\n      .$defaultFn(() => randomUUID())\n      .primaryKey()\n      .notNull(),\n    key: text('key').notNull().unique(),\n    value: text('value', { mode: 'json' }).$type<{ data: any }>(),\n    createdAt: integer('createdAt', { mode: 'number' })\n      .default(sql`(strftime('%s', 'now') * 1000)`)\n      .notNull(),\n    updatedAt: integer('updatedAt', { mode: 'number' })\n      .default(sql`(strftime('%s', 'now') * 1000)`)\n      .$onUpdate(() => Date.now())\n      .notNull(),\n  },\n  (table) => [index('idx_setting_key').on(table.key)],\n);\n\nexport type SettingModel = InferSelectModel<typeof setting>;\n"
  },
  {
    "path": "src/main/services/DbService/schemas/site.ts",
    "content": "import { randomUUID } from '@shared/modules/crypto';\nimport type { InferSelectModel } from 'drizzle-orm';\nimport { sql } from 'drizzle-orm';\nimport { index, integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nexport const site = sqliteTable(\n  'tbl_site',\n  {\n    id: text('id')\n      .$defaultFn(() => randomUUID())\n      .primaryKey()\n      .notNull(),\n    key: text('key')\n      .$defaultFn(() => randomUUID())\n      .unique()\n      .notNull(),\n    name: text('name').notNull(),\n    api: text('api'),\n    playUrl: text('playUrl'),\n    search: integer('search', { mode: 'boolean' }).default(true),\n    group: text('group'),\n    type: integer('type').notNull(),\n    ext: text('ext'),\n    categories: text('categories'),\n    isActive: integer('isActive', { mode: 'boolean' }).default(true),\n    createdAt: integer('createdAt', { mode: 'number' })\n      .default(sql`(strftime('%s', 'now') * 1000)`)\n      .notNull(),\n    updatedAt: integer('updatedAt', { mode: 'number' })\n      .default(sql`(strftime('%s', 'now') * 1000)`)\n      .$onUpdate(() => Date.now())\n      .notNull(),\n  },\n  (table) => [index('idx_site_key').on(table.key)],\n);\n\nexport type SiteModel = InferSelectModel<typeof site>;\n"
  },
  {
    "path": "src/main/services/DbService/schemas/star.ts",
    "content": "import { randomUUID } from '@shared/modules/crypto';\nimport type { InferSelectModel } from 'drizzle-orm';\nimport { sql } from 'drizzle-orm';\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';\n\nexport const star = sqliteTable('tbl_star', {\n  id: text('id')\n    .$defaultFn(() => randomUUID())\n    .primaryKey()\n    .notNull(),\n  type: integer('type').notNull(),\n  relateId: text('relateId'),\n  videoId: text('videoId'),\n  videoImage: text('videoImage'),\n  videoName: text('videoName'),\n  videoType: text('videoType'),\n  videoRemarks: text('videoRemarks'),\n  createdAt: integer('createdAt', { mode: 'number' })\n    .default(sql`(strftime('%s', 'now') * 1000)`)\n    .notNull(),\n  updatedAt: integer('updatedAt', { mode: 'number' })\n    .default(sql`(strftime('%s', 'now') * 1000)`)\n    .$onUpdate(() => Date.now())\n    .notNull(),\n});\n\nexport type StarModel = InferSelectModel<typeof star>;\n"
  },
  {
    "path": "src/main/services/FFmpegService.ts",
    "content": "import { Buffer } from 'node:buffer';\nimport { join } from 'node:path';\nimport { PassThrough } from 'node:stream';\nimport { promisify } from 'node:util';\n\nimport { loggerService } from '@logger';\nimport { fileChmod, filePermission, pathExist } from '@main/utils/file';\nimport { HOME_BIN_PATH } from '@main/utils/path';\nimport { getBinaryName } from '@main/utils/process';\nimport { isWindows } from '@main/utils/systeminfo';\nimport { getTimeout, getUserAgent } from '@main/utils/tool';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport { headersPascalCase } from '@shared/modules/headers';\nimport { isHttp, isNil, isPositiveFiniteNumber, isStrEmpty } from '@shared/modules/validate';\nimport type { FfprobeData } from 'fluent-ffmpeg';\nimport ffmpegFluent from 'fluent-ffmpeg';\n\ntype IFFmpeg = typeof ffmpegFluent & { ffprobeAsync: (path: string, options?: string[]) => Promise<FfprobeData> };\n\nexport interface IFfmpegOptions {\n  timeout?: number;\n  userAgent?: string;\n}\n\nexport interface IMediaOptions {\n  headers?: Record<string, any>;\n  timeout?: number;\n}\n\nexport type IMediaInfoOptions = IMediaOptions;\n\nexport type IMediaScreenshotOptions = IMediaOptions & { timestamp?: string };\n\nexport interface IMediaBaseInfo {\n  duration: number;\n  video?: {\n    codec: string;\n    width: number;\n    height: number;\n    resolution: string;\n    fps: number;\n    bitrate: number;\n  };\n  audio?: {\n    codec: string;\n    sampleRate: number;\n    channelCount: number;\n    channelType: string;\n    bitrate: number;\n  };\n}\n\nconst logger = loggerService.withContext(LOG_MODULE.FFMPEG);\n\nexport class FFmpegService {\n  private static instance: FFmpegService;\n  private ffmpeg: IFFmpeg | null = null;\n\n  private options: IFfmpegOptions = { timeout: undefined, userAgent: undefined };\n\n  constructor(options: Partial<IFfmpegOptions> = {}) {\n    this.options = {\n      timeout: options?.timeout,\n      userAgent: options?.userAgent,\n    };\n  }\n\n  public static getInstance(): FFmpegService {\n    if (!FFmpegService.instance) {\n      FFmpegService.instance = new FFmpegService();\n    }\n    return FFmpegService.instance;\n  }\n\n  public async prepare(): Promise<void> {\n    try {\n      if (this.ffmpeg) return;\n\n      const ffmpegPath = join(HOME_BIN_PATH, getBinaryName('ffmpeg'));\n      const ffprobePath = join(HOME_BIN_PATH, getBinaryName('ffprobe'));\n\n      if (await pathExist(ffmpegPath)) {\n        if (!isWindows && !(await filePermission(ffmpegPath)).exec) {\n          await fileChmod(ffmpegPath, 0o755);\n        }\n      } else {\n        throw new Error(`Binary ffmpeg not found: ${ffmpegPath}`);\n      }\n\n      if (await pathExist(ffprobePath)) {\n        if (!isWindows && !(await filePermission(ffprobePath)).exec) {\n          await fileChmod(ffprobePath, 0o755);\n        }\n      } else {\n        throw new Error(`Binary ffprobe not found: ${ffprobePath}`);\n      }\n\n      ffmpegFluent.setFfmpegPath(ffmpegPath);\n      ffmpegFluent.setFfprobePath(ffprobePath);\n\n      this.ffmpeg = ffmpegFluent as IFFmpeg;\n      this.ffmpeg.ffprobeAsync = promisify(ffmpegFluent.ffprobe);\n    } catch (error) {\n      this.ffmpeg = null;\n      logger.error('Failed to initialize ffmpeg:', error as Error);\n    }\n  }\n\n  private formatNumber(value: number | string): number {\n    if (value === 'N/A') return 0;\n\n    const num = Number(value);\n    if (!isPositiveFiniteNumber(num)) return 0;\n    return num;\n  }\n\n  private buildParams(path: string, options: IMediaOptions = {}): string[] {\n    const args: string[] = [];\n\n    const { headers: rawHeaders = {}, timeout: rawTimeout } = options;\n    const timeout = getTimeout(rawTimeout, this.options.timeout);\n\n    /**\n     * FFmpeg timeout options (microseconds)\n     *\n     * - stimeout   : RTSP only, connection timeout (legacy but still valid)\n     * - timeout    : legacy option, behavior varies by protocol (not recommended)\n     * - rw_timeout : IO read/write timeout, works for HTTP / RTSP / TCP / UDP\n     *                Available since ffmpeg 4.x, preferred in 5.x+\n     */\n    if (isPositiveFiniteNumber(timeout) && timeout > 0) {\n      timeout < 2.14748e9 / 1000\n        ? args.push('-rw_timeout', `${timeout * 1000}`)\n        : args.push('-rw_timeout', `${2.14748e9}`);\n    }\n\n    if (isHttp(path)) {\n      const headers = headersPascalCase(rawHeaders);\n      headers['User-Agent'] = getUserAgent(headers['User-Agent'], this.options.userAgent);\n\n      const headersArg = Object.entries(headers)\n        .filter(([_key, value]) => !isNil(value) && !isStrEmpty(String(value)))\n        .map(([key, value]) => `${key}: ${value}\\r\\n`)\n        .join('');\n      if (!isStrEmpty(headersArg)) args.push('-headers', `${headersArg}\\r\\n`);\n    }\n\n    return args;\n  }\n\n  private getProbeCommand(path: string, args: string[] = []): string {\n    const baseArgs = [...args, '-v', 'quiet', '-print_format', 'json', '-show_format', '-show_streams', `\"${path}\"`];\n\n    return `ffprobe ${baseArgs.join(' ')}`;\n  }\n\n  public async getInfo(path: string, options?: IMediaInfoOptions): Promise<FfprobeData | null> {\n    if (!this.ffmpeg) {\n      return null;\n    }\n\n    try {\n      const probeArgs = this.buildParams(path, options);\n\n      const log = this.getProbeCommand(path, probeArgs);\n      logger.debug(`Executing command: ${log}`);\n\n      const data = await this.ffmpeg.ffprobeAsync(path, probeArgs);\n\n      return data;\n    } catch (error) {\n      logger.error('Failed to get media info:', error as Error);\n      return null;\n    }\n  }\n\n  public async getBaseInfo(path: string, options?: IMediaInfoOptions): Promise<IMediaBaseInfo | null> {\n    try {\n      const probe = await this.getInfo(path, options);\n      if (!probe) return null;\n\n      const fmt = probe.format;\n      const videoStream = probe.streams.find((s) => s.codec_type === 'video');\n      const audioStream = probe.streams.find((s) => s.codec_type === 'audio');\n\n      const res = {\n        duration: this.formatNumber(fmt.duration!),\n        ...(videoStream && {\n          video: {\n            codec: videoStream.codec_name ?? '',\n            width: videoStream.width ?? 0,\n            height: videoStream.height ?? 0,\n            resolution: videoStream.width && videoStream.height ? `${videoStream.width}x${videoStream.height}` : '',\n            fps: (() => {\n              const rate = videoStream.r_frame_rate ?? '';\n              const [n, d] = rate.split('0/0').map(Number);\n              const result = d && d !== 0 ? n / d : 0;\n              return Math.round(result);\n            })(),\n            bitrate: this.formatNumber(videoStream.bit_rate!),\n          },\n        }),\n        ...(audioStream && {\n          audio: {\n            codec: audioStream.codec_name ?? '',\n            sampleRate: Number(audioStream.sample_rate ?? 0),\n            channelCount: audioStream.channels ?? 0,\n            channelType: audioStream.channel_layout ?? '',\n            bitrate: this.formatNumber(audioStream.bit_rate!),\n          },\n        }),\n      };\n      return res;\n    } catch (error) {\n      logger.error('Failed to get media base info:', error as Error);\n      return null;\n    }\n  }\n\n  /**\n   * @see https://qianqianquege.com/images/base64/\n   */\n\n  public async getScreenshot(path: string, options?: IMediaScreenshotOptions): Promise<string | null> {\n    if (!this.ffmpeg) return null;\n\n    try {\n      const buffers: Buffer[] = [];\n      const { timestamp = '00:00:01', ...args } = options || {};\n      const probeArgs = this.buildParams(path, args);\n\n      const pts = new PassThrough();\n      ffmpegFluent(path)\n        .inputOptions(['-ss', timestamp, ...probeArgs])\n        .outputOptions(['-an', '-vframes', '1', '-vcodec', 'mjpeg'])\n        .format('image2pipe')\n        .on('start', (cmd) => logger.debug(`Executing command: ${cmd}`))\n        .on('stderr', (stderrLine) => logger.silly(stderrLine))\n        .on('error', (error) => logger.error('Failed to grab screenshot:', error as Error))\n        .pipe(pts, { end: true });\n\n      for await (const chunk of pts) {\n        buffers.push(chunk as Buffer);\n      }\n\n      const buffer = Buffer.concat(buffers);\n      return buffer.length ? `data:image/png;base64,${buffer.toString('base64')}` : null;\n    } catch (error) {\n      logger.error('Failed to grab screenshot:', error as Error);\n      return null;\n    }\n  }\n}\n\nexport const ffmpegService = FFmpegService.getInstance();\n"
  },
  {
    "path": "src/main/services/FastifyService/fastify.d.ts",
    "content": "import type { ICacheService } from '@shared/cache';\n\ndeclare module 'fastify' {\n  interface FastifyInstance {\n    cache: ICacheService;\n  }\n}\n"
  },
  {
    "path": "src/main/services/FastifyService/index.ts",
    "content": "import type { FastifyCorsOptions } from '@fastify/cors';\nimport fastifyCors from '@fastify/cors';\nimport fastifyMultipart from '@fastify/multipart';\nimport type { SwaggerOptions as FastifySwaggerOptions } from '@fastify/swagger';\nimport fastifySwagger from '@fastify/swagger';\nimport type { FastifySwaggerUiOptions } from '@fastify/swagger-ui';\nimport fastifySwaggerUi from '@fastify/swagger-ui';\nimport type { TypeBoxTypeProvider } from '@fastify/type-provider-typebox';\nimport { loggerService } from '@logger';\nimport { configManager } from '@main/services/ConfigManager';\nimport { Schema } from '@main/types/server';\nimport { isDev } from '@main/utils/systeminfo';\nimport { APP_DESC, APP_NAME, APP_VERSION } from '@shared/config/appinfo';\nimport { PORT } from '@shared/config/env';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport { CacheService } from '@shared/modules/cache';\nimport type { FastifyBaseLogger, FastifyInstance } from 'fastify';\nimport fastify from 'fastify';\nimport StatusCodes from 'http-status-codes';\nimport qs from 'qs';\n\nimport routeModules from './routes';\nimport { HttpErrorResponseSchema, HttpRedirectResponseSchema, HttpSuccessResponseSchema } from './schemas/base';\n\nconst logger = loggerService.withContext(LOG_MODULE.FASTIFY);\n\nexport class FastifyService {\n  private static instance: FastifyService | null = null;\n  private server: FastifyInstance | null = null;\n  private PORT: number = PORT;\n\n  private constructor() {\n    // Private constructor to enforce singleton pattern\n  }\n\n  public static getInstance(): FastifyService {\n    if (!FastifyService.instance) {\n      FastifyService.instance = new FastifyService();\n    }\n    return FastifyService.instance;\n  }\n\n  public async start(): Promise<boolean> {\n    if (this.server) return true;\n\n    try {\n      this.server = fastify({\n        logger: false,\n        routerOptions: {\n          ignoreTrailingSlash: true,\n          maxParamLength: 1024 * 10,\n          querystringParser: (str: string) => qs.parse(str),\n        },\n        forceCloseConnections: true,\n        bodyLimit: 1024 * 1024 * 3,\n        trustProxy: true,\n        requestTimeout: 60_000,\n        connectionTimeout: 65_000,\n        ajv: {\n          customOptions: {\n            allErrors: true,\n            coerceTypes: 'array',\n            removeAdditional: false,\n            // useDefaults: true,\n          },\n        },\n      }); // Initialize Fastify server\n      this.server.withTypeProvider<TypeBoxTypeProvider>(); // Set TypeBox as the default type provider\n      this.server.log = this.customLogger(); // Set custom logger\n\n      this.registerHandlers(); // Register handlers\n      this.registerHooks(); // Register hooks\n      this.registerSchemas(); // Register schemas\n      await this.registerPlugins(); // Register plugins\n      await this.registerRoutes(); // Register routes\n\n      await this.server!.ready(); // Finalize server setup\n      if (isDev || configManager.debug) this.server!.swagger(); // swagger documentation\n      await this.server!.listen({ port: this.PORT, host: '0.0.0.0' });\n    } catch (error) {\n      logger.error(`Fastify Service Start Failed: ${(error as Error).message}`);\n    }\n\n    return this.status();\n  }\n\n  public async stop(): Promise<boolean> {\n    if (this.server) {\n      try {\n        this.server.server.close();\n        await this.server.close();\n        this.server = null;\n      } catch (error) {\n        logger.error(`Fastify Service Stop Failed: ${(error as Error).message}`);\n      }\n    }\n\n    return !this.status();\n  }\n\n  public async restart(): Promise<boolean> {\n    if (this.server) return true;\n\n    try {\n      await this.stop();\n      await this.start();\n    } catch (error) {\n      logger.error(`Fastify Service Restart Failed: ${(error as Error).message}`);\n    }\n\n    return this.status();\n  }\n\n  public status(): boolean {\n    return !!this.server;\n  }\n\n  private async registerHandlers(): Promise<void> {\n    this.server!.setErrorHandler((error: Error, _request, reply) => {\n      logger.error(`Fastify Service Uncaught Exception: ${error.message}`);\n\n      reply\n        .status(StatusCodes.INTERNAL_SERVER_ERROR)\n        .send({ code: -1, msg: `Internal Server Error - ${error.name}`, data: error.message });\n    });\n  }\n\n  private async registerHooks(): Promise<void> {\n    this.server!.addHook('onTimeout', async (req, reply) => {\n      logger.warn(`Fastify Response Timeout: ${req.url}`);\n      reply.status(StatusCodes.REQUEST_TIMEOUT).send({ code: -1, msg: 'Request Timeout', data: null });\n    });\n  }\n\n  private async registerPlugins(): Promise<void> {\n    // Register CORS\n    await this.server!.register(fastifyCors, {\n      methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],\n      origin: '*',\n    } as FastifyCorsOptions);\n\n    // Register multipart\n    await this.server!.register(fastifyMultipart);\n\n    // Register cache\n    this.server!.decorate('cache', CacheService);\n\n    // Register swagger\n    if (isDev || configManager.debug) {\n      await this.server!.register(fastifySwagger, {\n        openapi: {\n          info: {\n            title: `${APP_NAME} - openapi`,\n            description: APP_DESC,\n            version: APP_VERSION,\n            license: {\n              name: 'License',\n              url: 'https://www.gnu.org/licenses/agpl-3.0.html',\n            },\n          },\n          externalDocs: {\n            url: 'https://swagger.io',\n            description: 'Find out more about Swagger',\n          },\n        },\n      } as FastifySwaggerOptions);\n      await this.server!.register(fastifySwaggerUi, {\n        routePrefix: '/docs',\n        uiConfig: {\n          docExpansion: 'list',\n          deepLinking: false,\n          tryItOutEnabled: true,\n          layout: 'BaseLayout',\n        },\n        staticCSP: true,\n        transformSpecificationClone: true,\n      } as FastifySwaggerUiOptions);\n    }\n  }\n\n  private async registerSchemas(): Promise<void> {\n    this.server!.addSchema({ ...HttpSuccessResponseSchema, $id: Schema.ApiReponseSuccess });\n    this.server!.addSchema({ ...HttpErrorResponseSchema, $id: Schema.ApiReponseError });\n    this.server!.addSchema({ ...HttpRedirectResponseSchema, $id: Schema.ApiReponseRedirect });\n  }\n\n  private async registerRoutes(): Promise<void> {\n    const config = {\n      routeTimeout: 0,\n      routeTimeoutMessage: JSON.stringify({ code: 408, msg: 'Request Timeout' }),\n      routeTimeoutGracefully: true, // Trigger onResponse hook even after timeout\n    };\n\n    const routes = routeModules;\n    for (const { plugin, prefix } of routes) {\n      await this.server!.register(plugin, prefix ? { ...config, prefix } : { ...config });\n    }\n  }\n\n  private customLogger(): FastifyBaseLogger {\n    return {\n      info: (o: any, ...n: any[]) => logger.info(o, ...(n as any)),\n      debug: (o: any, ...n: any[]) => logger.debug(o, ...(n as any)),\n      warn: (o: any, ...n: any[]) => logger.warn(o, ...(n as any)),\n      error: (o: any, ...n: any[]) => logger.error(o, ...(n as any)),\n      fatal: (o: any, ...n: any[]) => logger.error(o, ...(n as any)),\n      trace: (o: any, ...n: any[]) => logger.debug(o, ...(n as any)),\n      silent: () => {},\n      child: () => this.customLogger(),\n      level: 'info',\n    };\n  }\n}\n\nexport const fastifyService = FastifyService.getInstance();\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/index.ts",
    "content": "import type { FastifyPluginAsync } from 'fastify';\n\nconst generateRoutes = (): Array<{ plugin: FastifyPluginAsync; prefix?: string }> => {\n  const routeModules = import.meta.glob<FastifyPluginAsync>('./v*/*/index.ts', { eager: true });\n\n  return Object.entries(routeModules).flatMap(([path, subModule]) => {\n    const versionMatch = path.match(/\\.\\/v(\\d+)\\//);\n    const version = versionMatch ? `v${versionMatch[1]}` : null;\n\n    return Object.values(subModule)\n      .filter((handler): handler is FastifyPluginAsync => typeof handler === 'function')\n      .map((handler) => ({\n        plugin: handler,\n        prefix: version === 'v0' ? undefined : version ? `api/${version}` : undefined,\n      }));\n  });\n};\n\nexport default generateRoutes();\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v0/proxy/index.ts",
    "content": "import { Buffer } from 'node:buffer';\n\nimport { request } from '@main/utils/request';\nimport { getSchema, setSchema } from '@server/schemas/v0/proxy';\nimport { PROXY_API } from '@shared/config/env';\nimport { base64, hash } from '@shared/modules/crypto';\nimport type { FastifyPluginAsync, FastifyReply, FastifyRequest } from 'fastify';\n\nconst API_PREFIX = 'proxy';\n\nconst generateCacheKey = (url: string): string => {\n  return `proxy-${hash['md5-16']({ src: url })}`;\n};\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.get(\n    `/${API_PREFIX}`,\n    { schema: getSchema },\n    async (req: FastifyRequest<{ Querystring: { [key: string]: string } }>, reply: FastifyReply) => {\n      const { url } = req.query;\n\n      if (!url) {\n        reply.code(400).send({ code: -1, msg: 'Invalid URL', data: null });\n        return;\n      }\n\n      const cacheKey = generateCacheKey(url);\n\n      const cacheData: Array<string> | null = await fastify.cache.get(cacheKey);\n      if (cacheData && cacheData.length > 0) {\n        const [status, contentType, content, ...rest] = cacheData;\n        const headers = rest.length > 0 ? rest[0] : null;\n        const isBase64 = rest.length > 1 ? rest[1] : null;\n\n        if (headers) {\n          Object.entries(headers).forEach(([key, value]) => {\n            reply.header(key, value);\n          });\n        }\n\n        let responseContent = content;\n        if (isBase64) {\n          if (content.includes('base64,')) {\n            responseContent = decodeURIComponent(content.split('base64,')[1]);\n          }\n          responseContent = base64.decode({ src: responseContent });\n        }\n\n        reply\n          .code(typeof status === 'number' ? status : Number.parseInt(status))\n          .header('Content-Type', contentType)\n          .send(responseContent);\n      }\n\n      if (['.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp'].some((ext) => url.toLowerCase().includes(ext))) {\n        const { data: resp } = await request.request({\n          url,\n          method: 'GET',\n          headers: {\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.82',\n          },\n        });\n        if (typeof resp === 'string' && resp.includes('base64,')) {\n          const parts = resp.split(';base64,');\n          if (parts.length === 2) {\n            const imageType = parts[0].split(':')[1];\n            const imageBuffer = Buffer.from(parts[1], 'base64');\n\n            reply.type(imageType).send(imageBuffer);\n          }\n        }\n      }\n\n      reply.code(302).redirect(url);\n    },\n  );\n\n  fastify.post(\n    `/${API_PREFIX}`,\n    { schema: setSchema },\n    async (req: FastifyRequest<{ Body: { url: string; text: Array<string | number> } }>) => {\n      const { text, url } = req.body;\n\n      if (!text || !url) {\n        return { code: -1, msg: 'Text and URL parameters are required', data: null };\n      }\n\n      const cacheKey = generateCacheKey(url);\n      fastify.cache.set(cacheKey, text);\n\n      return {\n        code: 0,\n        msg: 'ok',\n        data: `${PROXY_API}}?url=${encodeURIComponent(url)}`,\n      };\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/aigc/chat.ts",
    "content": "import { dbService } from '@main/services/DbService';\nimport { completionSchema, normalSchema } from '@server/schemas/v1/aigc/chat';\nimport { isHttp, isStrEmpty, isString } from '@shared/modules/validate';\nimport type { FastifyPluginAsync, FastifyReply, FastifyRequest } from 'fastify';\n\nimport { chatCompletion } from './utils/chat';\n\nconst API_PREFIX = 'aigc/chat';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.post(\n    `/${API_PREFIX}/completion`,\n    { schema: completionSchema },\n    // @ts-expect-error Not all code paths return values。ts(7030)\n    async (\n      req: FastifyRequest<{\n        Body: { prompt: string; model?: string; stream?: boolean; sessionId?: string; parentId?: string };\n      }>,\n      reply: FastifyReply<any>,\n    ) => {\n      const { prompt, model: rawModel, sessionId, parentId, stream } = req.body;\n\n      const ai = (await dbService.setting.getValue('aigc')) || {};\n      const model = rawModel || ai.model || '';\n\n      if (!isString(prompt) || isStrEmpty(prompt)) {\n        return reply.code(400).send({ code: -1, msg: 'Invalid Prompt', data: null });\n      }\n\n      if (![ai.server, model].some(isString) || !isHttp(ai.server) || isStrEmpty(model)) {\n        return reply.code(400).send({ code: -1, msg: 'Invalid AI Configuration', data: null });\n      }\n\n      const resp = await chatCompletion.chatStandard(\n        { prompt, stream, model, sessionId, parentId },\n        { baseURL: ai.server, apiKey: ai.key },\n      );\n\n      if (stream) {\n        reply.raw.writeHead(200, {\n          'Content-Type': 'text/event-stream',\n          'Cache-Control': 'no-cache',\n          Connection: 'keep-alive',\n        });\n\n        for await (const chunk of resp.completion) {\n          reply.raw.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n        }\n\n        reply.raw.write('data: [DONE]\\n\\n');\n        reply.raw.end();\n      } else {\n        return { code: 0, msg: 'ok', data: { sessionId: resp.sessionId, completion: resp.completion } };\n      }\n    },\n  );\n\n  fastify.post(\n    `/${API_PREFIX}/normal`,\n    { schema: normalSchema },\n    async (\n      req: FastifyRequest<{\n        Body: { prompt: string; model?: string; sessionId?: string; parentId?: string };\n      }>,\n      reply: FastifyReply<any>,\n    ) => {\n      const { prompt, model: rawModel, sessionId, parentId } = req.body;\n\n      const ai = (await dbService.setting.getValue('aigc')) || {};\n      const model = rawModel || ai.model || '';\n\n      if (!isString(prompt) || isStrEmpty(prompt)) {\n        return reply.code(400).send({ code: -1, msg: 'Invalid Prompt', data: null });\n      }\n\n      if (![ai.server, model].some(isString) || !isHttp(ai.server) || isStrEmpty(model)) {\n        return reply.code(400).send({ code: -1, msg: 'Invalid AI Configuration', data: null });\n      }\n\n      const resp = await chatCompletion.chatNormal(\n        { prompt, stream: false, model, sessionId, parentId },\n        { baseURL: ai.server, apiKey: ai.key },\n      );\n\n      return { code: 0, msg: 'ok', data: resp };\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/aigc/index.ts",
    "content": "import chat from './chat';\nimport memory from './memory';\n\nexport { chat, memory };\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/aigc/memory.ts",
    "content": "import {\n  addMessageSchema,\n  clearSessionSchema,\n  createSessionSchema,\n  deleteMessageSchema,\n  getMessageSchema,\n  getSessionIdsSchema,\n  putMessageSchema,\n} from '@server/schemas/v1/aigc/memory';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nimport type { ChatMessage, RecentMessageOptions } from './utils/memory';\nimport { memoryManager } from './utils/memory';\n\nconst API_PREFIX = 'aigc/memory';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.post(\n    `/${API_PREFIX}/message`,\n    { schema: addMessageSchema },\n    async (req: FastifyRequest<{ Body: { id: string; messages: ChatMessage | ChatMessage[] } }>) => {\n      const { id, messages } = req.body;\n      const session = memoryManager.addMessage(id, messages);\n      return { code: 0, msg: 'ok', data: session };\n    },\n  );\n\n  fastify.delete(\n    `/${API_PREFIX}/message`,\n    { schema: deleteMessageSchema },\n    async (req: FastifyRequest<{ Body: { id: string; index?: number[] } }>) => {\n      const { id, index } = req.body;\n      const session = memoryManager.deleteMessage(id, index);\n      return { code: 0, msg: 'ok', data: session };\n    },\n  );\n\n  fastify.put(\n    `/${API_PREFIX}/message`,\n    { schema: putMessageSchema },\n    async (req: FastifyRequest<{ Body: { id: string; updates: { index: number; message: ChatMessage }[] } }>) => {\n      const { id, updates } = req.body;\n      const session = memoryManager.replaceMessage(id, updates);\n      return { code: 0, msg: 'ok', data: session };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/message/:id`,\n    { schema: getMessageSchema },\n    async (\n      req: FastifyRequest<{ Params: { id: string }; Querystring: { recentCount?: string; maxTokens?: string } }>,\n    ) => {\n      const { id } = req.params;\n      const { recentCount, maxTokens } = req.query;\n      const options: RecentMessageOptions = {};\n\n      if (recentCount) options.recentCount = Number.parseInt(recentCount);\n      if (maxTokens) options.maxTokens = Number.parseInt(maxTokens);\n\n      const session = memoryManager.getMessage(id, options);\n      return { code: 0, msg: 'ok', data: session };\n    },\n  );\n\n  fastify.post(\n    `/${API_PREFIX}/session`,\n    { schema: createSessionSchema },\n    async (req: FastifyRequest<{ Body: { messages?: ChatMessage[] } }>) => {\n      const { messages = [] } = req.body;\n      const session = memoryManager.createSession(messages);\n      return { code: 0, msg: 'ok', data: session };\n    },\n  );\n\n  fastify.delete(\n    `/${API_PREFIX}/session`,\n    { schema: clearSessionSchema },\n    async (req: FastifyRequest<{ Body: { id?: string[] } | null }>) => {\n      const { id } = req.body || {};\n      if (id && id.length !== 0) {\n        memoryManager.delSession(id);\n      } else {\n        memoryManager.clearSession();\n      }\n      return { code: 0, msg: 'ok', data: null };\n    },\n  );\n\n  fastify.get(`/${API_PREFIX}/session/id`, { schema: getSessionIdsSchema }, async () => {\n    const id = memoryManager.getSessionIds();\n    return { code: 0, msg: 'ok', data: id };\n  });\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/aigc/utils/chat.ts",
    "content": "import { PassThrough, Readable } from 'node:stream';\nimport { ReadableStream } from 'node:stream/web';\n\nimport { loggerService } from '@logger';\nimport { t } from '@main/services/AppLocale';\nimport { configManager } from '@main/services/ConfigManager';\nimport { APP_NAME } from '@shared/config/appinfo';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport { isHttp, isObject, isObjectEmpty } from '@shared/modules/validate';\nimport { isEqual } from 'es-toolkit';\nimport type { ClientOptions } from 'openai';\nimport OpenAI from 'openai';\n\nimport { memoryManager } from './memory';\n\nconst SYSTEM_PROMPT = `\n你是一名名为${APP_NAME}智能助手的人工智能助手。你的角色设定为简洁高效地为用户提供准确信息。当被问及姓名时，必须明确回答 \"${APP_NAME}智能助手\"。\n\n你需要严格遵循用户要求，杜绝违反版权的内容。回答应简洁明了，不带有任何个人情感色彩。在回复之前，要逐步思考，详细规划回复思路。尽量减少其他散文式表述，避免用三重回车键包裹整个回复，每个对话回合仅给出一个回复。\n\n当遇到询问${APP_NAME}产品相关的问题时，需参考以下信息：${APP_NAME}是一款免费易用的媒体播放器桌面客户端, 支持Windows、Mac和Linux操作系统, 其开源地址为<https://github.com/Hiram-Wong/zyfun>。在回复此类问题时，要准确运用这些参考信息，清晰、直接地给出答案。\n`;\n\ninterface OpenAICommonAPIOtherOption {\n  prompt: string;\n  model: string;\n  stream?: boolean;\n  sessionId?: string;\n  parentId?: string;\n}\n\nconst logger = loggerService.withContext(LOG_MODULE.AIGC_HELPER);\n\nclass ChatCompletion {\n  private client: OpenAI | null = null;\n  private options: ClientOptions = {};\n  private memory: typeof memoryManager;\n\n  constructor() {\n    this.memory = memoryManager;\n  }\n\n  private async init(options: ClientOptions = {}): Promise<boolean> {\n    if (isObjectEmpty(options) || !isHttp(options.baseURL)) {\n      logger.warn('Invalid OpenAI client options');\n      return false;\n    }\n\n    if (isEqual(this.options, options) && this.client) {\n      return true;\n    }\n\n    try {\n      const client = new OpenAI(options);\n      this.client = client;\n      this.options = options;\n      return true;\n    } catch (error) {\n      logger.error(`Failed to initialize OpenAI client: ${(error as Error).message}`);\n      this.client = null;\n      if ((error as any).status === 401 || (error as any).status === 403) return false;\n      throw error;\n    }\n  }\n\n  public async chatStandard(\n    config: OpenAICommonAPIOtherOption,\n    options?: ClientOptions,\n  ): Promise<{ completion: any; sessionId: string }> {\n    if (options && isObject(options) && !isObjectEmpty(options)) {\n      await this.init(options);\n    }\n    if (!this.client) throw new Error('OpenAI client is not initialized.');\n\n    const { sessionId: rawSessionId, prompt, model, stream = false } = config;\n    const sessionId = rawSessionId || this.memory.createSession().id;\n\n    try {\n      // Record user messages\n      this.memory.addMessage(sessionId, { role: 'user', content: prompt });\n\n      // Get recent 10 context messages\n      const history = this.memory.getMessage(sessionId, { recentCount: 10 });\n      const timeout = configManager.timeout;\n\n      const completion = await this.client.chat.completions.create(\n        {\n          model,\n          messages: [{ role: 'system', content: `必须使用${t('lang')}回答\\n\\n${SYSTEM_PROMPT}` }, ...history.messages],\n          temperature: 0.3,\n          stream: stream ?? false,\n          stream_options: { include_usage: false },\n        },\n        { maxRetries: 1, timeout },\n      );\n\n      if (stream) {\n        const nodeStream = Readable.from(completion as AsyncIterable<OpenAI.Chat.Completions.ChatCompletionChunk>);\n        const toCaller = new PassThrough({ objectMode: true });\n        const toInternal = new PassThrough({ objectMode: true });\n        const readyMessage = { id: 'ready', sessionId };\n        toCaller.write(readyMessage);\n        nodeStream.pipe(toCaller);\n        nodeStream.pipe(toInternal);\n\n        (async () => {\n          let fullMessage = '';\n          for await (const chunk of toInternal) {\n            const reply = chunk?.choices?.[0]?.delta?.content || '';\n            fullMessage += reply;\n          }\n          this.memory.addMessage(sessionId, { role: 'assistant', content: fullMessage });\n        })();\n\n        const webStream = ReadableStream.from(toCaller);\n        return { completion: webStream, sessionId };\n      } else {\n        const reply = (completion as OpenAI.Chat.Completions.ChatCompletion).choices?.[0]?.message?.content || '';\n        this.memory.addMessage(sessionId, { role: 'assistant', content: reply });\n        return { completion, sessionId };\n      }\n    } catch (error) {\n      this.memory.deleteMessage(sessionId, [-1]);\n      logger.error(`Failed to chat: ${(error as Error).message}`);\n      throw error;\n    }\n  }\n\n  public async chatNormal(config: OpenAICommonAPIOtherOption, options?: ClientOptions): Promise<string> {\n    config.stream = false; // Ensure it's non-streaming\n    const resp = await this.chatStandard(config, options);\n    const text = (resp.completion as OpenAI.Chat.Completions.ChatCompletion)?.choices?.[0]?.message?.content || '';\n    return text;\n  }\n}\n\nexport const chatCompletion = new ChatCompletion();\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/aigc/utils/memory.ts",
    "content": "import { randomUUID } from '@shared/modules/crypto';\nimport { isArray, isArrayEmpty } from '@shared/modules/validate';\nimport { estimateTokenCount } from 'tokenx';\n\nexport interface ChatMessage {\n  role: 'system' | 'user' | 'assistant';\n  content: string;\n}\n\nexport interface ChatSession {\n  id: string;\n  messages: ChatMessage[];\n}\n\nexport interface RecentMessageOptions {\n  recentCount?: number; // Number of messages to return\n  maxTokens?: number; // Maximum total token count\n}\n\nclass MemoryManager {\n  private static instance: MemoryManager;\n  private messages: Map<string, ChatMessage[]> = new Map();\n\n  private constructor() {}\n\n  public static getInstance(): MemoryManager {\n    if (!MemoryManager.instance) {\n      MemoryManager.instance = new MemoryManager();\n    }\n    return MemoryManager.instance;\n  }\n\n  /**\n   * Create a new chat session with optional initial messages\n   */\n  createSession(initialMessages: ChatMessage[] = []): ChatSession {\n    const sessionId = randomUUID();\n    this.messages.set(sessionId, [...initialMessages]);\n    return { id: sessionId, messages: this.messages.get(sessionId)! };\n  }\n\n  /**\n   * Delete a session by ID\n   * @param sessionId The session ID\n   */\n  delSession(sessionId: string[]): void {\n    sessionId.forEach((id) => this.messages.delete(id));\n  }\n\n  /**\n   * Add one or multiple messages to a session\n   * @param sessionId The session ID\n   * @param messages Single message or array of messages\n   */\n  addMessage(sessionId: string, messages: ChatMessage | ChatMessage[]): ChatSession {\n    const history = this.messages.get(sessionId) || [];\n    const newHistory = [...history, ...(isArray(messages) ? messages : [messages])];\n    this.messages.set(sessionId, newHistory);\n    return { id: sessionId, messages: newHistory };\n  }\n\n  /**\n   * Get messages by recentCount or token limit\n   * @param sessionId The session ID\n   * @param options Either { recentCount } or { maxTokens }\n   */\n  getMessage(sessionId: string, options: RecentMessageOptions = {}): ChatSession {\n    const history = this.messages.get(sessionId) || [];\n\n    // Token-based retrieval\n    if (options.maxTokens) {\n      const result: ChatMessage[] = [];\n      let tokens = 0;\n\n      // Iterate from the end (most recent) backwards\n      for (let i = history.length - 1; i >= 0; i--) {\n        const msg = history[i];\n        const msgTokens = estimateTokenCount(msg.content);\n\n        if (tokens + msgTokens > options.maxTokens) break;\n        result.unshift(msg);\n        tokens += msgTokens;\n      }\n\n      return { id: sessionId, messages: result };\n    }\n\n    // Count-based retrieval\n    if (options.recentCount) {\n      const recent = history.slice(-options.recentCount);\n      return { id: sessionId, messages: recent };\n    }\n\n    return { id: sessionId, messages: history };\n  }\n\n  /**\n   * Get all sessions\n   * @returns All sessions\n   */\n  getSession(): ChatSession[] {\n    const sessions: ChatSession[] = [];\n    this.messages.forEach((history, sessionId) => {\n      sessions.push({ id: sessionId, messages: history });\n    });\n    return sessions;\n  }\n\n  /**\n   * Get all session IDs\n   * @returns All session IDs\n   */\n  getSessionIds(): string[] {\n    return [...this.messages.keys()];\n  }\n\n  /**\n   * Delete messages in a session\n   * @param sessionId The session ID\n   * @param indexes Array of message indexes to delete (supports negative indexes). If omitted, delete all messages\n   */\n  deleteMessage(sessionId: string, indexes?: number[]): ChatSession {\n    let history = this.messages.get(sessionId) || [];\n\n    if (!isArray(indexes) || isArrayEmpty(indexes)) {\n      history = [];\n    } else {\n      const len = history.length;\n      const normalizedIndexes = indexes.map((i) => (i < 0 ? len + i : i));\n      history = history.filter((_, idx) => !normalizedIndexes.includes(idx));\n    }\n\n    this.messages.set(sessionId, history);\n    return { id: sessionId, messages: history };\n  }\n\n  /**\n   * Replace specific messages in a session\n   * @param sessionId The session ID\n   * @param updates Array of updates [{ index, message }], supports negative indexes\n   */\n  replaceMessage(sessionId: string, updates: Array<{ index: number; message: ChatMessage }>): ChatSession {\n    const history = this.messages.get(sessionId) || [];\n    const len = history.length;\n\n    for (const { index, message } of updates) {\n      const i = index < 0 ? len + index : index;\n      if (i >= 0 && i < len) {\n        history[i] = message;\n      }\n    }\n\n    this.messages.set(sessionId, history);\n    return { id: sessionId, messages: history };\n  }\n\n  /** Clear all sessions */\n  clearSession(): void {\n    this.messages.clear();\n  }\n}\n\nexport const memoryManager = MemoryManager.getInstance();\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/data/cloud.ts",
    "content": "import { dbService } from '@main/services/DbService';\nimport { backupSchema, resumeSchema } from '@server/schemas/v1/data/cloud';\nimport type { FastifyPluginAsync } from 'fastify';\n\nconst API_PREFIX = 'data/cloud';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.get(`/${API_PREFIX}/backup`, { schema: backupSchema }, async () => {\n    const cloudConf = await dbService.setting.getValue('cloud');\n    const { sync: _sync, type, ...options } = cloudConf || {};\n\n    const status = await dbService.cloudBackup(type, options);\n    return { code: 0, msg: 'ok', data: status };\n  });\n\n  fastify.get(`/${API_PREFIX}/resume`, { schema: resumeSchema }, async () => {\n    const cloudConf = await dbService.setting.getValue('cloud');\n    const { sync: _sync, type, ...options } = cloudConf || {};\n\n    const status = await dbService.cloudResume(type, options);\n    return { code: 0, msg: 'ok', data: status };\n  });\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/data/db.ts",
    "content": "import { dbService } from '@main/services/DbService';\nimport { fileStorage } from '@main/services/FileStorage';\nimport { clearSchema, exportSchema, importSchema } from '@server/schemas/v1/data/db';\nimport type { IDataImportType, IDataPage, IDataPutType, IDataRemoteType } from '@shared/config/data';\nimport { DATA_PAGE, DATA_PUT_TYPE, DATA_TABLE_PAGE } from '@shared/config/data';\nimport { isArrayEmpty } from '@shared/modules/validate';\nimport type { ITableName } from '@shared/types/db';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nimport { convertToStandard } from './utils/data';\n\nconst API_PREFIX = 'data/db';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.delete(\n    `/${API_PREFIX}/clear`,\n    { schema: clearSchema },\n    async (req: FastifyRequest<{ Body: { type?: (ITableName | IDataPage | 'cache')[] } }>) => {\n      const { type = [] } = req.body;\n\n      const TABLE_NAMES = dbService.tableNames;\n      const tables = type.filter((t) => TABLE_NAMES.includes(t as ITableName));\n      if (type.includes(DATA_PAGE.FILM)) tables.push(...DATA_TABLE_PAGE.FILM);\n      if (type.includes(DATA_PAGE.LIVE)) tables.push(...DATA_TABLE_PAGE.LIVE);\n      if (type.includes(DATA_PAGE.MOMENT)) tables.push(...DATA_TABLE_PAGE.MOMENT);\n      if (type.includes(DATA_PAGE.PARSE)) tables.push(...DATA_TABLE_PAGE.PARSE);\n      const others = type.filter((t) => !TABLE_NAMES.includes(t as ITableName));\n\n      const otherActions: Record<string, () => Promise<void>> = {\n        cache: async () => {\n          await fileStorage.clearTempCache();\n        },\n      };\n\n      if (!isArrayEmpty(tables)) await dbService.db.clear(tables as ITableName[]);\n      await Promise.all(others.filter((t) => t in otherActions).map((t) => otherActions[t]()));\n\n      return { code: 0, msg: 'ok', data: true };\n    },\n  );\n\n  fastify.post(\n    `/${API_PREFIX}/export`,\n    { schema: exportSchema },\n    async (req: FastifyRequest<{ Body: { type?: (ITableName | IDataPage)[] } }>) => {\n      const { type = [] } = req.body;\n\n      const TABLE_NAMES = dbService.tableNames;\n      const tables = type.filter((t) => TABLE_NAMES.includes(t as ITableName));\n      if (type.includes(DATA_PAGE.FILM)) tables.push(...DATA_TABLE_PAGE.FILM);\n      if (type.includes(DATA_PAGE.LIVE)) tables.push(...DATA_TABLE_PAGE.LIVE);\n      if (type.includes(DATA_PAGE.MOMENT)) tables.push(...DATA_TABLE_PAGE.MOMENT);\n      if (type.includes(DATA_PAGE.PARSE)) tables.push(...DATA_TABLE_PAGE.PARSE);\n\n      const res = await dbService.db.all(tables as ITableName[]);\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.post(\n    `/${API_PREFIX}/import`,\n    { schema: importSchema },\n    async (\n      req: FastifyRequest<{\n        Body: {\n          api: string;\n          putType: IDataPutType;\n          importType: IDataImportType;\n          remoteType: IDataRemoteType;\n          url: string;\n        };\n      }>,\n    ) => {\n      const { api, putType, importType, remoteType } = req.body;\n      const method = putType === DATA_PUT_TYPE.ADDITIONAL ? 'add' : 'set';\n\n      const data = await convertToStandard(importType, remoteType, api);\n      if (putType === DATA_PUT_TYPE.ADDITIONAL) delete data.setting;\n\n      const ops = (Object.keys(data) as ITableName[]).map((t) => dbService[t][method](data[t] as any));\n      const res = await Promise.allSettled(ops);\n\n      const ststus = res.filter((r) => r.status === 'rejected').length === 0;\n      return { code: 0, msg: 'ok', data: ststus };\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/data/index.ts",
    "content": "import cloud from './cloud';\nimport db from './db';\n\nexport { cloud, db };\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/data/utils/data.ts",
    "content": "import { loggerService } from '@main/services/LoggerService';\nimport type { Catvod, Tvbox, TvboxLiveNewItem, TvboxLiveOldItem } from '@main/types/tvbox';\nimport { pathExist, readFile } from '@main/utils/file';\nimport { request } from '@main/utils/request';\nimport type { IDataImportType, IDataRemoteType } from '@shared/config/data';\nimport { DATA_COMPLETE_TYPE, DATA_IMPORT_TYPE, DATA_SIMPLE_TYPE } from '@shared/config/data';\nimport { PROXY_API } from '@shared/config/env';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport type { ISettingKey } from '@shared/config/tblSetting';\nimport { settingKeys, settingList as tblSetting } from '@shared/config/tblSetting';\nimport { aes, base64, randomUUID } from '@shared/modules/crypto';\nimport { jsonStrToObj } from '@shared/modules/obj';\nimport {\n  isArray,\n  isArrayEmpty,\n  isBase64,\n  isHttp,\n  isJson,\n  isJsonStr,\n  isNil,\n  isObject,\n  isObjectEmpty,\n  isStrEmpty,\n  isString,\n  isTimestamp,\n  isUUID,\n} from '@shared/modules/validate';\nimport type { IDbStore } from '@shared/types/db';\n\nconst logger = loggerService.withContext(LOG_MODULE.DATA_HELPER);\n\nconst catvodToStandard = (config: Catvod, baseUrl: string): Partial<IDbStore> => {\n  if (isObjectEmpty(config) || !config?.video?.sites?.length) return {};\n  const data: Partial<IDbStore> = {};\n\n  const rawList = config.video.sites;\n  data.site = rawList.map((item) => {\n    const uuid = randomUUID();\n    return {\n      id: uuid,\n      key: item.key ?? uuid,\n      name: item.name,\n      type: 8,\n      api: new URL(item.api, baseUrl).toString(),\n      playUrl: '',\n      group: 'catvod',\n      search: true,\n      categories: '',\n      ext: '',\n      isActive: true,\n      createdAt: Date.now(),\n      updatedAt: Date.now(),\n    };\n  });\n\n  return data;\n};\n\nconst tvboxToStandard = (config: Tvbox, baseUrl: string, type: string): Partial<IDbStore> => {\n  const data: Partial<IDbStore> = {};\n\n  if (Object.hasOwn(config, 'sites') && isArray(config.sites) && !isArrayEmpty(config.sites)) {\n    const formatSiteType = (selectType: string, sourceType: number, api: string): number => {\n      if (selectType === 'drpy') return 2;\n\n      const apiMap: Record<string, number> = {\n        csp_XBPQ: 9,\n        csp_XYQHiker: 10,\n        csp_AppYsV2: 11,\n        csp_AppGet: 15,\n        csp_AppQi: 16,\n        csp_AppFox: 17,\n      };\n\n      if (api in apiMap) return apiMap[api];\n\n      switch (sourceType) {\n        case 0:\n          return 0; // cms[xml]\n        case 1:\n          return 1; // cms[json]\n        case 3:\n          if (api?.endsWith('.js')) return 7;\n          if (api?.endsWith('.py')) return 12;\n          break;\n        case 4:\n          return 6; // hipy[t4]\n      }\n\n      return -1;\n    };\n\n    const formatSiteGroup = (type: string): string => {\n      switch (type) {\n        case 'drpy':\n          return 'drpy';\n        case 'tvbox':\n          return 'tvbox';\n        default:\n          return '';\n      }\n    };\n\n    const formatSiteSearch = (searchable: 0 | 1, quickSearch: 0 | 1): boolean => {\n      if (searchable === 1 || quickSearch === 1) return true;\n      return false;\n    };\n\n    const formatUrl = (relativeUrl: string, baseUrl: string): string => {\n      if (!relativeUrl) return '';\n      if (typeof relativeUrl === 'object') return JSON.stringify(relativeUrl);\n      if (relativeUrl.startsWith('csp_')) return relativeUrl;\n      if (relativeUrl.startsWith('./') || relativeUrl.startsWith('/') || relativeUrl.startsWith('../')) {\n        return new URL(relativeUrl, baseUrl).toString();\n      }\n      return relativeUrl;\n    };\n\n    data.site = config.sites\n      .filter(\n        (item) =>\n          [0, 1, 4].includes(item.type) ||\n          (item.type === 3 &&\n            (['csp_XBPQ', 'csp_XYQHiker'].includes(type) ||\n              // ['csp_XBPQ', 'csp_XYQHiker', 'csp_AppGet', 'csp_AppQi', 'csp_AppFox'].includes(type) ||\n              item.api.endsWith('.js') ||\n              item.api.endsWith('.py'))),\n      )\n      .map((item) => {\n        const uuid = randomUUID();\n        return {\n          id: uuid,\n          key: item.key ?? uuid,\n          name: item.name,\n          type: formatSiteType(type, item.type, item.api),\n          api: formatUrl(item.api, baseUrl),\n          playUrl: '',\n          group: formatSiteGroup(type),\n          search: formatSiteSearch(item.searchable ?? 0, item.quickSearch ?? 0),\n          categories: Array.isArray(item.categories) ? item.categories.join(',') : (item.categories ?? ''),\n          ext: item.ext ? formatUrl(item.ext, baseUrl) : '',\n          isActive: true,\n          createdAt: Date.now(),\n          updatedAt: Date.now(),\n        };\n      })\n      .filter((item) => item.api || item.ext);\n  }\n\n  if (Object.hasOwn(config, 'lives') && isArray(config.lives) && !isArrayEmpty(config.lives)) {\n    // [\n    //   {\n    //     name: 'yingshi',\n    //     url: 'http://xxx.xx',\n    //     type: 0,\n    //     epg: 'https://epg.112114.xyz/?ch={name}&date={date}',\n    //     logo: 'https://epg.112114.xyz/logo/{name}.png',\n    //   },\n    //   {\n    //     group: 'redirect',\n    //     channels: [{ name: 'live', urls: ['proxy://do=live&type=txt&ext=base64'] }],\n    //   },\n    //   {\n    //     group: 'default',\n    //     channels: [{ name: 'CCTV-1', urls: ['http://xxx.xxx/0001_1.m3u8', 'http://xxx.xxx/index.m3u8'] }],\n    //   },\n    // ];\n\n    const iptv: IDbStore['iptv'] = [];\n    const channel: Array<{ name: string; api: string; group: string }> = [];\n\n    const isNewLive = (value: TvboxLiveNewItem): value is TvboxLiveNewItem => value.type === 0 && isHttp(value.url);\n    const isOldLive = (value: TvboxLiveOldItem): value is TvboxLiveOldItem =>\n      isArray(value.channels) && !isArrayEmpty(value.channels);\n\n    const unwrapProxyUrl = (raw: string) => {\n      if (!raw.startsWith(PROXY_API)) return raw;\n      try {\n        const parsed = new URL(raw);\n        return parsed.searchParams.get('url') || '';\n      } catch {\n        return '';\n      }\n    };\n\n    for (const live of config.lives) {\n      if (isNewLive(live as TvboxLiveNewItem)) {\n        const { name, url: urlRaw, epg, logo, ua } = live as TvboxLiveNewItem;\n        const url = unwrapProxyUrl(urlRaw);\n        if (!isHttp(url)) continue;\n\n        const uuid = randomUUID();\n        iptv.push({\n          id: uuid,\n          key: uuid,\n          name,\n          type: 1,\n          api: url,\n          epg: epg ?? '',\n          logo: logo ?? '',\n          headers: ua ? { 'User-Agent': ua } : {},\n          isActive: true,\n          createdAt: Date.now(),\n          updatedAt: Date.now(),\n        });\n      } else if (isOldLive(live as TvboxLiveOldItem)) {\n        const { group, channels } = live as TvboxLiveOldItem;\n\n        for (const chal of channels) {\n          const { name, urls } = chal;\n\n          if (group === 'redirect') {\n            const links = urls\n              .map((url) => {\n                const link = url.split('&ext=')?.[1];\n                if (isNil(link)) return null;\n                return isBase64(link) ? base64.decode({ src: link }) : null;\n              })\n              .filter(Boolean) as string[];\n\n            links.forEach((url) => {\n              const uuidSub = randomUUID();\n\n              iptv.push({\n                id: uuidSub,\n                key: uuidSub,\n                name,\n                type: 1,\n                api: url,\n                epg: '',\n                logo: '',\n                headers: {},\n                isActive: true,\n                createdAt: Date.now(),\n                updatedAt: Date.now(),\n              });\n            });\n          } else {\n            urls\n              .filter((url) => isHttp(url))\n              .forEach((item) => {\n                channel.push({\n                  name,\n                  api: item,\n                  group: group ?? '',\n                });\n              });\n          }\n        }\n      }\n    }\n\n    if (channel.length) {\n      const m3uArgs = [\n        '#EXTM3U',\n        ...channel.map(\n          (item) => `#EXTINF:-1 tvg-name=\"${item.name}\" group-title=\"${item.group}\",${item.name}\\n${item.api}`,\n        ),\n      ];\n      const m3uContent = m3uArgs.join('\\n');\n      const uuid = randomUUID();\n\n      iptv.push({\n        id: uuid,\n        key: uuid,\n        name: 'Auto Generated M3U',\n        type: 3,\n        api: m3uContent,\n        epg: '',\n        logo: '',\n        headers: {},\n        isActive: true,\n        createdAt: Date.now(),\n        updatedAt: Date.now(),\n      });\n    }\n\n    data.iptv = iptv;\n  }\n\n  if (Object.hasOwn(config, 'parses') && isArray(config.parses) && !isArrayEmpty(config.parses)) {\n    const formatSiteType = (type: number = 0): number => {\n      switch (type) {\n        case 1:\n          return 2;\n        case 0:\n        default:\n          return 1;\n      }\n    };\n\n    data.analyze = config.parses\n      .filter((item) => [0, 1].includes(item.type) && item.url)\n      .map((item) => {\n        const uuid = randomUUID();\n        return {\n          id: uuid,\n          key: uuid,\n          name: item.name,\n          api: item.url,\n          type: formatSiteType(item.type ?? 0),\n          flag: item.ext?.flag ?? ['youku', 'qq', 'iqiyi', 'qiyi', 'mgtv', 'imgo', 'letv', 'leshi', 'sohu', 'pptv'],\n          script: '',\n          headers: {},\n          isActive: true,\n          createdAt: Date.now(),\n          updatedAt: Date.now(),\n        };\n      });\n  }\n\n  return data;\n};\n\nconst tvboxDecryption = (json: string, configKey?: string): string => {\n  let content = json;\n\n  try {\n    const pattern = /[A-Z0-9]{8}\\*\\*/i;\n    const match = content.match(pattern);\n\n    if (match) {\n      content = content.substring(content.indexOf(match[0]) + 10);\n      content = base64.decode({ src: content as string });\n    }\n\n    if (content.startsWith('2423')) {\n      // data\n      const dataStartIndex = content.indexOf('2324') + 4;\n      const dataEndIndex = content.length - 26;\n      const data = content.substring(dataStartIndex, dataEndIndex);\n\n      // content = Buffer.from(AES.toBytes(content)).toString().toLowerCase();\n      content = content.toLowerCase();\n\n      // key\n      const keyIndexStart = content.indexOf('$#') + 2;\n      const keyIndexEnd = content.indexOf('#$');\n      const keySub = content.substring(keyIndexStart, keyIndexEnd);\n      const key = keySub.padEnd(16, '0');\n\n      // iv\n      const ivSub = content.substring(content.length - 13);\n      const iv = ivSub.padEnd(16, '0');\n\n      json = aes.decode({ src: data, mode: 'cbc', key, iv });\n    } else if (isString(configKey) && !isStrEmpty(configKey) && !isJson(content)) {\n      json = aes.decode({ src: content as string, mode: 'ecb', key: configKey! });\n    } else {\n      json = content;\n    }\n  } catch {\n    // do nothing\n  }\n\n  return json;\n};\n\nconst contentToStandard = (config: IDbStore): Partial<IDbStore> => {\n  const data: Partial<IDbStore> = {};\n\n  for (const key in config) {\n    switch (key) {\n      case 'setting': {\n        const newdata = config[key] || {};\n        const notStandardKeys = Object.keys(newdata).filter((k) => !settingKeys.includes(k as ISettingKey));\n        notStandardKeys.forEach((k) => delete newdata[k]);\n\n        for (const item of tblSetting) {\n          if (newdata[item.key] === undefined) {\n            newdata[item.key] = item.value as any;\n          }\n        }\n\n        if (isObject(newdata) && !isObjectEmpty(newdata)) {\n          data.setting = newdata;\n        }\n        break;\n      }\n      case 'site': {\n        const site = (config[key] || [])\n          .filter((item) => item?.api || item?.ext)\n          .map((item) => {\n            const uuid = randomUUID();\n            return {\n              id: item?.id || uuid,\n              key: item?.key || uuid,\n              name: item?.name || '',\n              type: item?.type || 0,\n              api: item?.api || '',\n              playUrl: item?.playUrl || '',\n              group: item?.group || '',\n              search: !!item?.search,\n              categories: Array.isArray(item.categories) ? item.categories.join(',') : item.categories,\n              ext: item?.ext || '',\n              isActive: true,\n              createdAt: isTimestamp(item.createdAt) ? item.createdAt : Date.now(),\n              updatedAt: isTimestamp(item.updatedAt) ? item.createdAt : Date.now(),\n            };\n          });\n        if (isArray(site) && !isArrayEmpty(site)) data.site = site;\n        break;\n      }\n      case 'iptv': {\n        const iptv = (config[key] || [])\n          .filter((item) => item.api && [1, 2, 3].includes(item.type))\n          .map((item) => {\n            const uuid = randomUUID();\n            return {\n              id: item.id || uuid,\n              key: item.key || uuid,\n              name: item.name ?? '',\n              type: item.type,\n              api: item.api,\n              epg: item.epg ?? '',\n              logo: item.logo ?? '',\n              headers: item.headers ?? {},\n              isActive: item.isActive ?? true,\n              createdAt: isTimestamp(item.createdAt) ? item.createdAt : Date.now(),\n              updatedAt: isTimestamp(item.updatedAt) ? item.updatedAt : Date.now(),\n            };\n          });\n        if (isArray(iptv) && !isArrayEmpty(iptv)) data.iptv = iptv;\n        break;\n      }\n      case 'channel': {\n        const channel = (config[key] || [])\n          .filter((item) => isHttp(item.api))\n          .map((item) => {\n            const uuid = randomUUID();\n            return {\n              id: item.id || uuid,\n              name: item.name ?? '',\n              api: item.api,\n              logo: item.logo ?? '',\n              group: item.group ?? '',\n              playback: item.playback ?? '',\n              createdAt: isTimestamp(item.createdAt) ? item.createdAt : Date.now(),\n              updatedAt: isTimestamp(item.updatedAt) ? item.updatedAt : Date.now(),\n            };\n          });\n        if (isArray(channel) && !isArrayEmpty(channel)) data.channel = channel;\n        break;\n      }\n      case 'analyze': {\n        const analyze = (config[key] || [])\n          .filter((item) => isHttp(item.api) && [1, 2].includes(item.type))\n          .map((item) => {\n            const uuid = randomUUID();\n            return {\n              id: item.id || uuid,\n              key: item.key || uuid,\n              name: item.name ?? '',\n              api: item.api,\n              type: item.type,\n              flag: item.flag ?? ['youku', 'qq', 'iqiyi', 'qiyi', 'mgtv', 'imgo', 'letv', 'leshi', 'sohu', 'pptv'],\n              headers: item.headers ?? {},\n              script: item.script ?? '',\n              isActive: true,\n              createdAt: isTimestamp(item.createdAt) ? item.createdAt : Date.now(),\n              updatedAt: isTimestamp(item.updatedAt) ? item.updatedAt : Date.now(),\n            };\n          });\n        if (isArray(analyze) && !isArrayEmpty(analyze)) data.analyze = analyze;\n        break;\n      }\n      case 'history': {\n        const history = (config[key] || [])\n          .filter((item) => [1, 2, 3, 4, 5, 6].includes(item.type))\n          .map((item) => {\n            const uuid = randomUUID();\n            return {\n              id: item.id || uuid,\n              type: item.type,\n              relateId: item.relateId,\n              siteSource: item.siteSource ?? '',\n              playEnd: item.playEnd ?? false,\n              videoId: item.videoId ?? '',\n              videoImage: item.videoImage ?? '',\n              videoName: item.videoName ?? '',\n              videoIndex: item.videoIndex ?? '',\n              watchTime: item.watchTime ?? 0,\n              duration: item.duration ?? 0,\n              skipTimeInEnd: item.skipTimeInEnd ?? 0,\n              skipTimeInStart: item.skipTimeInStart ?? 0,\n              createdAt: isTimestamp(item.createdAt) ? item.createdAt : Date.now(),\n              updatedAt: isTimestamp(item.updatedAt) ? item.updatedAt : Date.now(),\n            };\n          });\n        if (isArray(history) && !isArrayEmpty(history)) data.history = history;\n        break;\n      }\n      case 'star': {\n        const star = (config[key] || [])\n          .filter((item) => item.videoId && item.relateId && [1, 2, 3, 4].includes(item.type))\n          .map((item) => {\n            const uuid = randomUUID();\n            return {\n              id: item.id || uuid,\n              type: item.type,\n              relateId: item.relateId,\n              videoId: item.videoId,\n              videoImage: item.videoImage ?? '',\n              videoName: item.videoName ?? '',\n              videoType: item.videoType ?? '',\n              videoRemarks: item.videoRemarks ?? '',\n              createdAt: isTimestamp(item.createdAt) ? item.createdAt : Date.now(),\n              updatedAt: isTimestamp(item.updatedAt) ? item.updatedAt : Date.now(),\n            };\n          });\n        if (isArray(star) && !isArrayEmpty(star)) data.star = star;\n        break;\n      }\n    }\n  }\n\n  for (const tableName in data) {\n    const list = data[tableName];\n    if (isArrayEmpty(list)) continue;\n\n    const uniqueFieldsMap: Record<string, string[]> = {\n      site: ['id', 'key'],\n      iptv: ['id', 'key'],\n      analyze: ['id', 'key'],\n      channel: ['id'],\n      history: ['id'],\n      star: ['id'],\n      plugin: ['id'],\n      // system: ['key'],\n    };\n\n    const uniqueFields = uniqueFieldsMap[tableName] || [];\n    // id must be first\n    if (uniqueFields.includes('id')) {\n      uniqueFields.splice(uniqueFields.indexOf('id'), 1);\n      uniqueFields.unshift('id');\n    }\n    if (uniqueFields.length === 0) continue;\n\n    const fieldSets: Record<string, Set<string>> = {};\n    for (const field of uniqueFields) fieldSets[field] = new Set();\n\n    data[tableName] = list.map((item) => {\n      const updatedItem: Record<string, any> = { ...item };\n\n      for (const field of uniqueFields) {\n        let value = updatedItem[field];\n\n        if (field === 'id') {\n          if (!value || !isUUID(value, 4) || fieldSets.id.has(value)) {\n            value = randomUUID();\n          }\n        }\n\n        if (field === 'key') {\n          if (!value || fieldSets.key?.has(value)) {\n            value = value ? `${value}-${updatedItem.id}` : updatedItem.id;\n          }\n        }\n\n        fieldSets[field].add(value);\n        updatedItem[field] = value;\n      }\n\n      return updatedItem;\n    });\n  }\n\n  return data;\n};\n\n/**\n * Convert standard\n * @param importType simple | complete\n * @param remoteType simple: catvod | tvbox | drpy ; complete: local | remote\n * @param path url | file path\n * @returns standard content\n */\nexport const convertToStandard = async (importType: IDataImportType, remoteType: IDataRemoteType, path: string) => {\n  let content: string | Record<string, any> | null = null;\n  if (\n    importType === DATA_IMPORT_TYPE.SIMPLE ||\n    (importType === DATA_IMPORT_TYPE.COMPLETE && remoteType === DATA_COMPLETE_TYPE.REMOTE)\n  ) {\n    try {\n      const { data: resp } = await request.request({ url: path, method: 'GET', responseType: 'text' });\n      content = resp;\n    } catch (error) {\n      logger.error(`Failed fetch ${path} cause of ${(error as Error).message}`);\n      content = null;\n    }\n  } else if (importType === DATA_IMPORT_TYPE.COMPLETE && remoteType === DATA_COMPLETE_TYPE.LOCAL) {\n    if (await pathExist(path)) content = await readFile(path);\n  }\n  if (isNil(content) || isStrEmpty(content)) return {};\n\n  if (importType === DATA_IMPORT_TYPE.SIMPLE && remoteType !== DATA_SIMPLE_TYPE.CATVOD) {\n    content = tvboxDecryption(content as string);\n  }\n\n  if (isJsonStr(content)) content = jsonStrToObj(content as string);\n\n  let standard: Partial<IDbStore> = {};\n  if (importType === DATA_IMPORT_TYPE.SIMPLE) {\n    if (remoteType === 'catvod') {\n      standard = catvodToStandard(content as Catvod, path);\n    } else {\n      standard = tvboxToStandard(content as Tvbox, path, remoteType);\n    }\n  } else if (importType === DATA_IMPORT_TYPE.COMPLETE) {\n    standard = content as Partial<IDbStore>;\n  }\n\n  const res = contentToStandard(standard);\n\n  return res;\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/file/film.ts",
    "content": "import { basename, dirname, extname, join } from 'node:path';\n\nimport {\n  fileState,\n  fileStateSync,\n  pathExist,\n  readDirFaster,\n  readDirSync,\n  readFile,\n  readFileSync,\n  saveFile,\n} from '@main/utils/file';\nimport { APP_FILE_PATH } from '@main/utils/path';\nimport { autoSchema, makeSchema } from '@server/schemas/v1/file/film';\nimport { PREFIX_API } from '@shared/config/env';\nimport { randomUUID } from '@shared/modules/crypto';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nconst API_PREFIX = 'file/film';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.get(\n    `/${API_PREFIX}/auto/:type/*`,\n    { schema: autoSchema },\n    async (req: FastifyRequest<{ Params: { type: 'system' | 'file'; '*': string } }>) => {\n      const { type = 'file', '*': path } = req.params || {};\n      const filePath = type === 'file' ? join(APP_FILE_PATH, path) : path;\n\n      const files = await readDirFaster(filePath, 3, (path, _isDirectory) => {\n        return !/\\.(?:js|py)(?:\\?.*)?$/.test(path);\n      });\n\n      const matchApi = (ext: string, path: string) => {\n        if (ext === '.js') {\n          return 'https://raw.githubusercontent.com/hjdhnx/drpy-webpack/refs/heads/main/src/drpy2.min.js';\n        }\n        if (ext === '.py') return `${PREFIX_API}/v1/file/manage/${type}/${path}`;\n        return '';\n      };\n      const matchExt = (ext: string, path: string) => {\n        if (ext === '.js') {\n          return `${PREFIX_API}/v1/file/manage/${type}/${path}`;\n        }\n        if (ext === '.py') return '';\n        return '';\n      };\n\n      const sites = files.map((path) => {\n        const uuid = randomUUID();\n\n        const fullName = basename(path);\n        const ext = extname(fullName);\n        const name = basename(fullName, ext);\n\n        const relativePath = type === 'file' ? path.replace(`${APP_FILE_PATH}/`, '') : path;\n\n        return {\n          id: uuid,\n          key: uuid,\n          name,\n          type: 3,\n          api: matchApi(ext, relativePath),\n          searchable: 1,\n          quickSearch: 0,\n          filterable: 1,\n          ext: matchExt(ext, relativePath),\n        };\n      });\n      const res = { sites };\n\n      return res;\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/make/:type/*`,\n    { schema: makeSchema },\n    async (req: FastifyRequest<{ Params: { type: 'system' | 'file'; '*': string } }>) => {\n      const { type = 'file', '*': path } = req.params || {};\n      const filePath = type === 'file' ? join(APP_FILE_PATH, path) : path;\n\n      const exists = await pathExist(filePath);\n      if (!exists) {\n        return {};\n      }\n\n      const state = await fileState(filePath);\n      if (state !== 'dir' && state !== 'file') {\n        return {};\n      }\n\n      const indexPath = join(filePath, 'index.js');\n      const jsonPath = join(filePath, 'index.json');\n\n      const indexState = await fileState(indexPath);\n      if (indexState === 'file') {\n        const content = await readFile(indexPath);\n\n        // eslint-disable-next-line no-new-func\n        const func = new Function('pathLib', 'path_dir', `${content}\\n return main;`);\n        const fn = func(\n          {\n            join,\n            dirname,\n            readDir: readDirSync,\n            readFile: readFileSync,\n            stat: fileStateSync,\n          },\n          filePath,\n        );\n        const resp = await fn();\n\n        await saveFile(join(filePath, 'index.json'), resp);\n      }\n\n      const jsonState = await fileState(jsonPath);\n      if (jsonState === 'file') {\n        const content = await readFile(jsonPath);\n        return content;\n      }\n\n      return {};\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/file/index.ts",
    "content": "import film from './film';\nimport manage from './manage';\n\nexport { film, manage };\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/file/manage.ts",
    "content": "import { dirname, join } from 'node:path';\n\nimport { createDir, fileDelete, pathExist, readFile, saveFile } from '@main/utils/file';\nimport { APP_FILE_PATH } from '@main/utils/path';\nimport { addSchema, deleteSchema, getSchema, putSchema } from '@server/schemas/v1/file/manage';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nconst API_PREFIX = 'file/manage';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.post(\n    `/${API_PREFIX}/:type/*`,\n    { schema: addSchema },\n    async (req: FastifyRequest<{ Params: { type: 'system' | 'file'; '*': string }; Body: string }>) => {\n      const { type = 'file', '*': path } = req.params || {};\n      const filePath = type === 'file' ? join(APP_FILE_PATH, path) : path;\n      const content = req.body;\n\n      const basePath = dirname(filePath);\n\n      const isExist = await pathExist(basePath);\n      if (!isExist) {\n        createDir(basePath);\n      }\n\n      const status = await saveFile(filePath, content);\n\n      return { code: 0, msg: 'ok', data: status };\n    },\n  );\n\n  fastify.delete(\n    `/${API_PREFIX}/:type/*`,\n    { schema: deleteSchema },\n    async (req: FastifyRequest<{ Params: { type: 'system' | 'file'; '*': string }; Body: string }>) => {\n      const { type = 'file', '*': path } = req.params || {};\n      const filePath = type === 'file' ? join(APP_FILE_PATH, path) : path;\n\n      const status = await fileDelete(filePath);\n      return { code: 0, msg: 'ok', data: status };\n    },\n  );\n\n  fastify.put(\n    `/${API_PREFIX}/:type/*`,\n    { schema: putSchema },\n    async (req: FastifyRequest<{ Params: { type: 'system' | 'file'; '*': string }; Body: string }>) => {\n      const { type = 'file', '*': path } = req.params || {};\n      const filePath = type === 'file' ? join(APP_FILE_PATH, path) : path;\n      const content = req.body;\n\n      const basePath = dirname(filePath);\n\n      const isExist = await pathExist(basePath);\n      if (!isExist) {\n        createDir(basePath);\n      }\n\n      const status = await saveFile(filePath, content);\n\n      return { code: 0, msg: 'ok', data: status };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/:type/*`,\n    { schema: getSchema },\n    async (req: FastifyRequest<{ Params: { type: 'system' | 'file'; '*': string } }>) => {\n      const { type = 'file', '*': path } = req.params || {};\n      const filePath = type === 'file' ? join(APP_FILE_PATH, path) : path;\n\n      const content = await readFile(filePath);\n      return content;\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/index.ts",
    "content": "import T0Adapter from './t0Xml';\nimport T1Adapter from './t1Json';\nimport T3AlistAdapter from './t3Alist';\nimport T3AppYsV2Adapter from './t3AppYsV2';\nimport T3CatopenAdapter from './t3Catopen';\nimport T3DrpyAdapter from './t3Drpy';\nimport T3PyAdapter from './t3Py';\nimport T3XbpqAdapter from './t3Xbpq';\nimport T3XyqAdapter from './t3Xyq';\nimport T4CatvodAdapter from './t4Catvod';\nimport T4DrpyJs0Adapter from './t4DrpyJs0';\nimport T4DrpysAdapter from './t4Drpys';\n\nexport {\n  T0Adapter,\n  T1Adapter,\n  T3AlistAdapter,\n  T3AppYsV2Adapter,\n  T3CatopenAdapter,\n  T3DrpyAdapter,\n  T3PyAdapter,\n  T3XbpqAdapter,\n  T3XyqAdapter,\n  T4CatvodAdapter,\n  T4DrpyJs0Adapter,\n  T4DrpysAdapter,\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t0Xml.ts",
    "content": "import { request } from '@main/utils/request';\nimport type { ICmsParams, ICmsResultPromise, IConstructorOptions } from '@shared/types/cms';\nimport { XMLParser } from 'fast-xml-parser';\nimport { JSONPath } from 'jsonpath-plus';\n\n// @see https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/docs/v6/3.Options.md\nconst xmlOptions = {\n  trimValues: true,\n  textNodeName: '$text',\n  ignoreAttributes: false,\n  attributeNamePrefix: '',\n  parseAttributeValue: true,\n};\nconst parser = new XMLParser(xmlOptions);\n\nclass T0XmlAdapter {\n  private api: string = '';\n  private playUrl: string = '';\n  private categories: string[] = [];\n\n  constructor(source: IConstructorOptions) {\n    this.api = source.api!;\n    this.playUrl = source.playUrl || '';\n    this.categories = source.categories;\n  }\n\n  async init(): ICmsResultPromise['init'] {}\n\n  async home(): ICmsResultPromise['home'] {\n    let xmlResp: string;\n    try {\n      const { data } = await request.request({\n        url: this.api,\n        method: 'GET',\n        params: { ac: 'class' },\n      });\n      xmlResp = data;\n    } catch {\n      const { data } = await request.request({\n        url: this.api,\n        method: 'GET',\n      });\n      xmlResp = data;\n    }\n\n    const xml2json = parser.parse(xmlResp);\n    const resp = xml2json?.rss;\n\n    const rawClassList = Array.isArray(resp?.class?.ty) ? resp.class.ty : [];\n    const classes = rawClassList\n      .map((item) => ({\n        type_id: String(item.id ?? '').trim(),\n        type_name: item.$text?.toString().trim() ?? '',\n      }))\n      .filter(\n        (item, index, self) =>\n          item.type_id &&\n          item.type_name &&\n          !this.categories?.includes(item.type_name) &&\n          self.findIndex((other) => other.type_id === item.type_id) === index,\n      );\n\n    const filters = {};\n\n    return { class: classes, filters };\n  }\n\n  async homeVod(): ICmsResultPromise['homeVod'] {\n    let xmlResp: string;\n    try {\n      const { data } = await request.request({\n        url: this.api,\n        method: 'GET',\n        params: { ac: 'class' },\n      });\n      xmlResp = data;\n    } catch {\n      const { data } = await request.request({\n        url: this.api,\n        method: 'GET',\n      });\n      xmlResp = data;\n    }\n\n    const xml2json = parser.parse(xmlResp);\n    const resp = xml2json?.rss;\n\n    // one item is object, so convert to ransform to array\n    let rawList = Array.isArray(resp?.list?.video) ? resp.list.video : resp?.list?.video ? [resp.list.video] : [];\n    if (rawList.length && !rawList[0]?.pic) {\n      const ids = rawList\n        .map((v) => String(v.id))\n        .filter(Boolean)\n        .join(',');\n      if (ids.length) resp.list.video = (await this.detail({ ids })).list;\n    }\n    rawList = Array.isArray(resp?.list?.video) ? resp.list.video : resp?.list?.video ? [resp.list.video] : [];\n\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String((v.id || v.vod_id) ?? ''),\n        vod_name: (v.name || v.vod_name) ?? '',\n        vod_pic: v.pic || v.vod_pic || '',\n        vod_remarks: (v.note || v.vod_remarks) ?? '',\n        vod_blurb: ((v.desc || v.vod_blurb) ?? '')?.trim(),\n        vod_tag: 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.list?.page) || 1;\n    const pagecount = Number(resp?.list?.pagecount) || 0;\n    const total = Number(resp?.list?.recordcount) || 0;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async category(doc: ICmsParams['category']): ICmsResultPromise['category'] {\n    const { page = 1, tid } = doc || {};\n\n    const { data: xmlResp } = await request.request({\n      url: this.api,\n      method: 'GET',\n      params: { ac: 'videolist', t: tid, pg: page },\n    });\n\n    const xml2json = parser.parse(xmlResp);\n    const resp = xml2json?.rss;\n\n    // one item is object, so convert to ransform to array\n    const rawList = Array.isArray(resp?.list?.video) ? resp.list.video : resp?.list?.video ? [resp.list.video] : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String((v.id || v.vod_id) ?? ''),\n        vod_name: (v.name || v.vod_name) ?? '',\n        vod_pic: v.pic || v.vod_pic || '',\n        vod_remarks: (v.note || v.vod_remarks) ?? '',\n        vod_blurb: ((v.desc || v.vod_blurb) ?? '')?.trim(),\n        vod_tag: 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.list?.page) || page;\n    const pagecount = Number(resp?.list?.pagecount) || 0;\n    const total = Number(resp?.list?.recordcount) || 0;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {\n    const { ids } = doc || {};\n    const idsArray = ids.split(',');\n\n    const { data: xmlResp } = await request.request({\n      url: this.api,\n      method: 'GET',\n      params: { ac: 'detail', ids },\n    });\n\n    const parseDldd = (dldd: Array<any>, field: 'flag' | '$text'): string => {\n      if (!dldd) return '';\n      const arr = Array.isArray(dldd) ? dldd : [dldd];\n      return arr\n        .map((i) => i?.[field] ?? '')\n        .filter(Boolean)\n        .join('$$$');\n    };\n\n    const xml2json = parser.parse(xmlResp);\n    const resp = xml2json?.rss;\n\n    // one item is object, so convert to ransform to array\n    const rawList = Array.isArray(resp?.list?.video) ? resp.list.video : resp?.list?.video ? [resp.list.video] : [];\n    const videos = rawList\n      .map((v, i) => ({\n        vod_id: String((v.id || idsArray[i]) ?? ''),\n        vod_name: v.name ?? '',\n        vod_pic: v.pic ?? '',\n        vod_year: String(v.year ?? ''),\n        vod_lang: v.lang ?? '',\n        vod_area: v.area ?? '',\n        vod_remarks: v.note ?? '',\n        vod_score: '0.0',\n        vod_state: v.state ?? '',\n        vod_class: '',\n        vod_actor: v.actor ?? '',\n        vod_director: v.director ?? '',\n        vod_content: (v.des ?? '')?.trim(),\n        vod_blurb: (v.des ?? '')?.trim(),\n        vod_play_from: parseDldd(v.dl.dd, 'flag') ?? '',\n        vod_play_url: parseDldd(v.dl.dd, '$text') ?? '',\n        type_name: v.type ?? '',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.list?.page) || 1;\n    const pagecount = Number(resp?.list?.pagecount) || 0;\n    const total = Number(resp?.list?.recordcount) || 0;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {\n    const { wd, page = 1 } = doc || {};\n\n    const { data: xmlResp } = await request.request({\n      url: this.api,\n      method: 'GET',\n      params: { ac: 'list', wd, pg: page },\n    });\n\n    const xml2json = parser.parse(xmlResp);\n    const resp = xml2json?.rss;\n\n    // one item is object, so convert to ransform to array\n    let rawList = Array.isArray(resp?.list?.video) ? resp.list.video : resp?.list?.video ? [resp.list.video] : [];\n    if (rawList.length && !rawList[0]?.pic) {\n      const ids = rawList\n        .map((v) => String(v.id))\n        .filter(Boolean)\n        .join(',');\n      if (ids.length) resp.list.video = (await this.detail({ ids })).list;\n    }\n    rawList = Array.isArray(resp?.list?.video) ? resp.list.video : resp?.list?.video ? [resp.list.video] : [];\n\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String((v.id || v.vod_id) ?? ''),\n        vod_name: (v.name || v.vod_name) ?? '',\n        vod_pic: v.pic || v.vod_pic || '',\n        vod_remarks: (v.note || v.vod_remarks) ?? '',\n        vod_blurb: ((v.desc || v.vod_blurb) ?? '')?.trim(),\n        vod_tag: 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.list?.page) || page;\n    const pagecount = Number(resp?.list?.pagecount) || 0;\n    const total = Number(resp?.list?.recordcount) || 0;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {\n    const { play } = doc || {};\n    const parseUrl = this.playUrl || '';\n\n    if (/\\.(?:m3u8|mp4|mpd|flv|mkv)/.test(play)) {\n      return { parse: 0, url: play };\n    } else {\n      if (parseUrl.startsWith('json:')) {\n        const purl = parseUrl.replace('json:', '') + play;\n        const { data: resp } = await request.request({\n          url: purl,\n          method: 'GET',\n        });\n\n        try {\n          const queryResult = JSONPath({ path: '$.url', json: resp });\n          return { parse: 0, url: queryResult };\n        } catch {\n          return { parse: 1, url: play };\n        }\n      } else {\n        return { parse: 1, url: parseUrl + play };\n      }\n    }\n  }\n\n  async action(_doc: ICmsParams['action']): ICmsResultPromise['action'] {\n    return '';\n  }\n\n  async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {\n    return [];\n  }\n\n  async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain'] {\n    return '';\n  }\n}\n\nexport default T0XmlAdapter;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t1Json.ts",
    "content": "import { request } from '@main/utils/request';\nimport type { ICmsParams, ICmsResultPromise, IConstructorOptions } from '@shared/types/cms';\nimport { JSONPath } from 'jsonpath-plus';\n\nclass T1JsonAdapter {\n  private api: string = '';\n  private playUrl: string = '';\n  private categories: string[] = [];\n\n  constructor(source: IConstructorOptions) {\n    this.api = source.api!;\n    this.playUrl = source.playUrl || '';\n    this.categories = source.categories;\n  }\n\n  async init(): ICmsResultPromise['init'] {}\n\n  async home(): ICmsResultPromise['home'] {\n    let resp;\n    try {\n      const { data } = await request.request({\n        url: this.api,\n        method: 'GET',\n        params: { ac: 'class' },\n      });\n      resp = data;\n    } catch {\n      const { data } = await request.request({\n        url: this.api,\n        method: 'GET',\n      });\n      resp = data;\n    }\n\n    const rawClassList = Array.isArray(resp?.class) ? resp.class : [];\n    const classes = rawClassList\n      .map((item) => ({\n        type_id: String(item.type_id ?? '').trim(),\n        type_name: item.type_name?.toString().trim() ?? '',\n      }))\n      .filter(\n        (item, index, self) =>\n          item.type_id &&\n          item.type_name &&\n          !this.categories?.includes(item.type_name) &&\n          self.findIndex((other) => other.type_id === item.type_id) === index,\n      );\n\n    const filters = {};\n\n    return { class: classes, filters };\n  }\n\n  async homeVod(): ICmsResultPromise['homeVod'] {\n    let resp;\n    try {\n      const { data } = await request.request({\n        url: this.api,\n        method: 'GET',\n        params: { ac: 'class' },\n      });\n      resp = data;\n    } catch {\n      const { data } = await request.request({\n        url: this.api,\n        method: 'GET',\n      });\n      resp = data;\n    }\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    if (rawList.length && !rawList[0]?.vod_pic) {\n      const ids = rawList\n        .map((v) => String(v.vod_id))\n        .filter(Boolean)\n        .join(',');\n      if (ids.length) resp.list = (await this.detail({ ids })).list;\n    }\n\n    const videos = (Array.isArray(resp?.list) ? resp.list : [])\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || 1;\n    const pagecount = Number(resp?.pagecount) || 0;\n    const total = Number(resp?.total) || 0;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async category(doc: ICmsParams['category']): ICmsResultPromise['category'] {\n    const { page = 1, tid } = doc || {};\n\n    const { data: resp } = await request.request({\n      url: this.api,\n      method: 'GET',\n      params: { ac: 'videolist', t: tid, pg: page },\n    });\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || page;\n    const pagecount = Number(resp?.pagecount) || 0;\n    const total = Number(resp?.total) || 0;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {\n    const { ids } = doc || {};\n    const idsArray = ids.split(',');\n\n    const { data: resp } = await request.request({\n      url: this.api,\n      method: 'GET',\n      params: { ac: 'detail', ids },\n    });\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v, i) => ({\n        vod_id: String((v.vod_id || idsArray[i]) ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_year: String(v.vod_year ?? ''),\n        vod_lang: v.vod_lang ?? '',\n        vod_area: v.vod_area ?? '',\n        vod_score: String((v.vod_score || v.vod_douban_score) ?? '0.0'),\n        vod_state: v.vod_state ?? '', // '正片' | '预告' | '花絮'\n        vod_class: v.vod_class ?? '', // '电影' | '电视剧' | '综艺' | '动漫' | '纪录片' | '其他'\n        vod_actor: v.vod_actor ?? '',\n        vod_director: v.vod_director ?? '',\n        vod_content: (v.vod_content ?? '')?.trim(),\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_play_from: v.vod_play_from ?? '',\n        vod_play_url: v.vod_play_url ?? '',\n        type_name: v.type_name ?? '',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || 1;\n    const pagecount = Number(resp?.pagecount) || 0;\n    const total = Number(resp?.total) || 0;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {\n    const { wd, page = 1 } = doc || {};\n\n    const { data: resp } = await request.request({\n      url: this.api,\n      method: 'GET',\n      params: { ac: 'videolist', wd, pg: page },\n    });\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    if (rawList.length && !rawList[0]?.vod_pic) {\n      const ids = rawList\n        .map((v) => String(v.vod_id))\n        .filter(Boolean)\n        .join(',');\n      if (ids.length) resp.list.video = (await this.detail({ ids })).list;\n    }\n\n    const videos = (Array.isArray(resp?.list) ? resp.list : [])\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || page;\n    const pagecount = Number(resp?.pagecount) || 0;\n    const total = Number(resp?.total) || 0;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {\n    const { play } = doc || {};\n    const parseUrl = this.playUrl || '';\n\n    if (/\\.(?:m3u8|mp4|mpd|flv|mkv)/.test(play)) {\n      return { parse: 0, url: play };\n    } else {\n      if (parseUrl.startsWith('json:')) {\n        const purl = parseUrl.replace('json:', '') + play;\n        const { data: resp } = await request.request({\n          url: purl,\n          method: 'GET',\n        });\n\n        try {\n          const queryResult = JSONPath({ path: '$.url', json: resp });\n          return { parse: 0, url: queryResult };\n        } catch {\n          return { parse: 1, url: play };\n        }\n      } else {\n        return { parse: 1, url: parseUrl + play };\n      }\n    }\n  }\n\n  async action(_doc: ICmsParams['action']): ICmsResultPromise['action'] {\n    return '';\n  }\n\n  async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {\n    return [];\n  }\n\n  async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain'] {\n    return '';\n  }\n}\n\nexport default T1JsonAdapter;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Alist.ts",
    "content": "import { request } from '@main/utils/request';\nimport { isJsonStr } from '@shared/modules/validate';\nimport type { ICmsParams, ICmsResultPromise, IConstructorOptions } from '@shared/types/cms';\nimport JSON5 from 'json5';\n\ninterface ISource {\n  name: string;\n  server: string;\n  startPage?: string;\n  showAll?: boolean;\n  search?: boolean;\n  params?: string;\n  headers?: string;\n  username?: string;\n  password?: string;\n}\n\ninterface ISettings {\n  title: string;\n  v3: boolean;\n  version: string;\n  enableSearch: boolean;\n  pagSize: number;\n}\n\ninterface IApi {\n  path: string;\n  file: string;\n  search: string;\n  other: string | null;\n}\n\ninterface IUser {\n  username: string;\n  password: string;\n}\n\n/**\n * @see https://github.com/AlistGo/alist-doc/blob/main/docs/api.md -v2\n * @see https://alist-public.apifox.cn/327961242e0 - v3\n */\nclass T3AlistAdapter {\n  private ext: string = '';\n\n  private headers: Record<string, any> = {};\n  private params: Record<string, any> = {};\n  private settings: Partial<ISettings> = {};\n  private api: Partial<IApi> = {};\n  private user: Partial<IUser> = {};\n  private startPage: string = '/';\n  private server: string = '';\n  private showAll: boolean = false;\n\n  constructor(source: IConstructorOptions) {\n    this.ext = source.ext!;\n  }\n\n  async init(): ICmsResultPromise['init'] {\n    let ext: string = this.ext;\n    let source: ISource = { name: '', server: '' };\n\n    if (ext.startsWith('http')) {\n      const { data } = await request.request({ url: ext, method: 'GET', responseType: 'text' });\n      ext = data;\n    }\n\n    if (isJsonStr(ext)) source = JSON5.parse(ext);\n\n    const {\n      name,\n      server: rawServer,\n      startPage = '/',\n      showAll = false,\n      params: rawParams = '{}',\n      headers: rawHeaders = '{}',\n      username = '',\n      password = '',\n    } = source;\n\n    this.server = rawServer.endsWith('/') ? rawServer.slice(0, -1) : rawServer;\n    this.params = isJsonStr(rawParams) ? JSON5.parse(rawParams) : {};\n    this.headers = isJsonStr(rawHeaders) ? JSON5.parse(rawHeaders) : {};\n    this.startPage = startPage;\n    this.showAll = showAll;\n    this.user = { username, password };\n\n    const { data: resp } = await request.request({\n      url: `${this.server}/api/public/settings`,\n      method: 'GET',\n      headers: this.headers,\n    });\n    const rawData = resp.data;\n\n    const settings: Partial<ISettings> = {};\n    if (Array.isArray(rawData)) {\n      settings.title = rawData.find((x) => x.key === 'title')?.value || name;\n      settings.v3 = false;\n      settings.version = rawData.find((x) => x.key === 'version')?.value;\n      settings.enableSearch = rawData.find((x) => x.key === 'enable search')?.value === 'true';\n      settings.pagSize = Number(rawData.find((x) => x.key === 'default page size')?.value) || 30;\n    } else {\n      settings.title = rawData.site_title || name;\n      settings.v3 = true;\n      settings.version = rawData.version;\n      settings.enableSearch = true;\n      settings.pagSize = Number(rawData.default_page_size) || 30;\n    }\n    this.settings = settings as ISettings;\n\n    this.api = {\n      path: settings.v3 ? '/api/fs/list' : '/api/public/path',\n      file: settings.v3 ? '/api/fs/get' : '/api/public/path',\n      search: settings.v3 ? '/api/fs/search' : '/api/public/search',\n      other: settings.v3 ? '/api/fs/other' : '',\n    };\n\n    await this.getToken();\n  }\n\n  async home(): ICmsResultPromise['home'] {\n    return { class: [{ type_id: 'default', type_name: '默认' }], filters: {} };\n  }\n\n  async homeVod(): ICmsResultPromise['homeVod'] {\n    return { page: 1, pagecount: 0, total: 0, list: [] };\n  }\n\n  async category(doc: ICmsParams['category']): ICmsResultPromise['category'] {\n    const { page = 1, tid: rawTid = '/' } = doc || {};\n\n    const tid = rawTid === 'default' ? this.startPage : rawTid;\n\n    const { data: resp } = await request.request({\n      url: `${this.server}${this.api.path}`,\n      method: 'POST',\n      data: {\n        ...this.getParams(tid),\n        ...(this.settings.v3\n          ? {\n              page,\n              per_page: this.settings.pagSize,\n              refresh: false,\n            }\n          : { page_num: page, page_size: this.settings.pagSize }),\n      },\n      headers: this.headers,\n    });\n\n    const parent = tid.endsWith('/') ? tid : `${tid}/`;\n\n    const rawContent = this.settings.v3 ? resp.data?.content : resp.data?.files?.[0];\n    const rawList = Array.isArray(rawContent) ? rawContent : [];\n\n    const total = Number(resp?.data?.total) || 0;\n    const pagecount = total > 0 ? Math.ceil(total / this.settings.pagSize!) : 0;\n    const pagecurrent = page;\n\n    const videos = rawList\n      .filter((v) => (this.showAll ? true : this.isFolder(v) || this.isVideo(v)))\n      .filter((v) => v.name)\n      .map((v) => ({\n        vod_id: parent + v.name + (this.isFolder(v) ? '/' : ''),\n        vod_name: v.name.replaceAll('$', '_').replaceAll('#', '_') ?? '',\n        vod_pic: this.getPic(v) || '',\n        vod_remarks: String(this.getSize(v) || 0),\n        vod_blurb: '',\n        vod_tag: this.isFolder(v) ? 'folder' : 'file',\n      }));\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {\n    const { ids } = doc || {};\n    const idsArray = [ids];\n\n    const { data: resp } = await request.request({\n      url: `${this.server}${this.api.file}`,\n      method: 'POST',\n      data: this.getParams(ids),\n      headers: this.headers,\n    });\n\n    const rawContent = this.settings.v3 ? [resp.data] : [resp.data.files[0]];\n    const rawList = Array.isArray(rawContent) ? rawContent : [];\n\n    const pagecurrent = 1;\n    const pagecount = rawList.length ? 1 : 0;\n    const total = rawList.length;\n\n    const videos = rawList\n      .filter((v) => v.name)\n      .map((v, i) => {\n        return {\n          vod_id: String((v.id || idsArray[i]) ?? ''),\n          vod_name: v.name ?? '',\n          vod_pic: this.getPic(v) || '',\n          vod_remarks: String(this.getSize(v) || 0),\n          vod_year: '',\n          vod_lang: '',\n          vod_area: '',\n          vod_score: '0.0',\n          vod_state: '',\n          vod_class: '',\n          vod_actor: '',\n          vod_director: '',\n          vod_content: '',\n          vod_blurb: '',\n          vod_play_from: this.settings.title ?? '',\n          vod_play_url: `${v.name ?? ''}$${this.settings.v3 ? v.raw_url : v.url}`,\n          type_name: '',\n        };\n      });\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  /**\n   * only v3+ and enable search\n   */\n  async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {\n    const { wd, page = 1 } = doc || {};\n\n    if (!this.settings.enableSearch) {\n      return { page, pagecount: 0, total: 0, list: [] };\n    }\n\n    const { data: resp } = await request.request({\n      url: `${this.server}${this.api.search}`,\n      method: 'POST',\n      data: {\n        ...this.getParams('/'),\n        keywords: wd,\n        parent: '/',\n        page,\n        per_page: this.settings.pagSize,\n        scope: 0, // 0:all 1:folder 2:file\n      },\n      headers: this.headers,\n    });\n\n    const rawContent = this.settings.v3 ? resp.data?.content : resp.data?.files?.[0];\n    const rawList = Array.isArray(rawContent) ? rawContent : [];\n\n    const total = Number(resp?.data?.total) || 0;\n    const pagecount = total > 0 ? Math.ceil(total / this.settings.pagSize!) : 0;\n    const pagecurrent = page;\n\n    const videos = rawList\n      .filter((v) => (this.showAll ? true : this.isFolder(v) || this.isVideo(v)))\n      .filter((v) => v.name)\n      .map((v) => ({\n        vod_id: `${v.parent}${v.name}`,\n        vod_name: v.name.replaceAll('$', '_').replaceAll('#', '_') ?? '',\n        vod_pic: this.getPic(v) || '',\n        vod_remarks: String(this.getSize(v) || 0),\n        vod_blurb: '',\n        vod_tag: this.isFolder(v) ? 'folder' : 'file',\n      }));\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {\n    const { play } = doc || {};\n    return { parse: 0, url: play };\n  }\n\n  async action(_doc: ICmsParams['action']): ICmsResultPromise['action'] {\n    return '';\n  }\n\n  async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {\n    return [];\n  }\n\n  async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain'] {\n    return '';\n  }\n\n  private isFolder(data: { type: number }): boolean {\n    return data.type === 1;\n  }\n\n  private isVideo(data: { type: number }): boolean {\n    return this.settings.v3 ? data.type === 2 : data.type === 3;\n  }\n\n  // @ts-expect-error declared but its value is never read\n  private isSubtitle(data: { type: number; name: string }) {\n    if (data.type === 1) return false;\n    const ext = ['.srt', '.ass', '.scc', '.stl', '.ttml'];\n    return ext.some((x) => data.name.endsWith(x));\n  }\n\n  // @ts-expect-error declared but its value is never read\n  private getType(data: { type: number }) {\n    const isVideo = this.isVideo(data);\n    return this.isFolder(data) ? 0 : isVideo ? 10 : 1;\n  }\n\n  private getPic(data: { type: number; thumb?: string; thumbnail?: string }) {\n    const pic = this.settings.v3 ? data.thumb : data.thumbnail;\n    if (pic) return pic;\n\n    return this.isFolder(data)\n      ? 'https://img.alicdn.com/imgextra/i1/O1CN01rGJZac1Zn37NL70IT_!!6000000003238-2-tps-230-180.png'\n      : '';\n  }\n\n  private getSize(data: { size: number }) {\n    const sizes = ['KB', 'MB', 'GB', 'TB'];\n    let sz = data.size || 0;\n    let i = 0;\n    while (sz >= 1024 && i < sizes.length - 1) {\n      sz /= 1024;\n      i++;\n    }\n    return `${sz.toFixed(2)} ${sizes[i]}`;\n  }\n\n  // @ts-expect-error declared but its value is never read\n  private getTime(data: { updated_at: string; time_str: string; modified: string }) {\n    const tTime = data.updated_at || data.time_str || data.modified || '';\n    const time = new Date(tTime);\n    return time.toISOString().split('T')[0];\n  }\n\n  private getParams(path: string) {\n    let password = { password: '' };\n    const formatPath = path.replace(/\\/+$/, '');\n    if (formatPath) {\n      const checkPasswd = this.params?.[formatPath];\n      if (checkPasswd !== undefined) password = this.params[formatPath];\n    }\n    return { ...password, ...{ path } };\n  }\n\n  private async getToken() {\n    const { username, password } = this.user;\n    const { v3 } = this.settings;\n\n    if (v3 && username && password) {\n      try {\n        const { data: resp } = await request.request({\n          url: `${this.server}/api/auth/login`,\n          method: 'POST',\n          data: { username, password },\n        });\n        const token = resp?.data?.token || '';\n        if (token) this.headers.Authorization = token;\n        return token;\n      } catch {\n        return '';\n      }\n    }\n  }\n}\n\nexport default T3AlistAdapter;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t3AppGet.ts",
    "content": "import { request } from '@main/utils/request';\nimport { aes } from '@shared/modules/crypto';\nimport { buildUrl } from '@shared/modules/headers';\nimport type { ICmsParams, ICmsResultPromise, IConstructorOptions } from '@shared/types/cms';\n\nclass T3AppGetAdapter {\n  private host: string = '';\n  private muban: string = '';\n  private categories: string[] = [];\n  private headers: Record<string, string> = {\n    'user-agent':\n      'Mozilla/5.0 (Linux; Android 12) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.105 MUOUAPP/10.8.4506.400',\n  };\n\n  private appConfig: Record<string, string> = {};\n  private from: Record<string, string> = {};\n\n  constructor(source: IConstructorOptions) {\n    const ext = source.ext as unknown as Record<string, any>;\n    this.appConfig = ext.appConfig || {};\n    this.muban = source.api === 'csp_AppGet' ? 'AppGet' : 'AppQiji';\n\n    let host = '';\n    if (this.appConfig.host) {\n      host = this.appConfig.host;\n    } else {\n      const _hosturl = this.appConfig.hosturl;\n      // let hostdata = request(hosturl);\n      // host = hostdata.split('\\n')[0].replace(/\\s+/g, '');\n    }\n    if (host.endsWith('/')) {\n      host = host.slice(0, -1);\n    }\n    this.host = host;\n\n    this.categories = source.categories;\n  }\n\n  async init(): Promise<void> {\n    if (this.appConfig.username && this.appConfig.password) {\n      try {\n        const resp = await request.request({\n          url: buildUrl(this.host, `/${this.API[this.muban].appLogin}`),\n          method: 'POST',\n          data: {\n            password: this.appConfig.password,\n            code: '',\n            device_id: '',\n            user_name: this.appConfig.username,\n            invite_code: '',\n            key: '',\n            is_emulator: 0,\n          },\n          headers: this.headers,\n        });\n\n        const userInfo = JSON.parse(this.decrypt(JSON.parse(resp).data)).user;\n        this.headers['app-user-token'] = userInfo.auth_token;\n      } catch {}\n    }\n  }\n\n  async home(): ICmsResultPromise['home'] {\n    const resp = await request.request({\n      url: buildUrl(this.host, `/${this.API[this.muban].initV}`),\n      method: 'POST',\n      headers: this.headers,\n    });\n\n    const srcList = JSON.parse(this.decrypt(JSON.parse(resp).data)).type_list;\n    const rawList = Array.isArray(srcList) ? srcList : [];\n\n    const classes = rawList\n      .map((item) => ({\n        type_id: String(item.type_id ?? '').trim(),\n        type_name: item.type_name?.toString().trim() ?? '',\n      }))\n      .filter(\n        (item, index, self) =>\n          item.type_id &&\n          item.type_name &&\n          !this.categories?.includes(item.type_name) &&\n          self.findIndex((other) => other.type_id === item.type_id) === index,\n      );\n    const classIds = classes.map((item) => item.type_id);\n\n    const filters = rawList.reduce((acc, item) => {\n      const rawFiltersObj = item?.type_extend || {};\n      const rawKey = String(item?.type_id);\n\n      const arr = Object.entries(rawFiltersObj)\n        .filter(([k, v]) => !['state', 'star', 'director'].includes(k) && v && classIds.includes(rawKey))\n        .map(([k, v]) => ({\n          key: k,\n          name: k,\n          value: [\n            { n: '全部', v: '' },\n            ...v\n              .split(',')\n              .filter(Boolean)\n              .map((v) => ({ n: v, v })),\n          ],\n        }));\n\n      acc[rawKey] = arr;\n      return acc;\n    }, {});\n\n    return { class: classes, filters };\n  }\n\n  async homeVod(): ICmsResultPromise['homeVod'] {\n    return { list: [], page: 1, pagecount: 0, total: 0 };\n  }\n\n  async category(doc: ICmsParams['category']): ICmsResultPromise['category'] {\n    const { page, tid, extend = {} } = doc || {};\n\n    const resp = await request.request({\n      url: buildUrl(this.host, `${this.API[this.muban].typeFilterVodList}`),\n      method: 'POST',\n      params: {\n        area: extend.area || '全部',\n        year: extend.year || '全部',\n        type_id: tid,\n        page,\n        sort: extend.sort || '最新',\n        lang: extend.lang || '全部',\n        class: extend.class || '全部',\n      },\n      headers: this.headers,\n    });\n\n    const srcList = JSON.parse(this.decrypt(JSON.parse(resp).data)).recommend_list;\n    const rawList = Array.isArray(srcList) ? srcList : [];\n\n    const list: ICmsHomeVod['list'] = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb || v.vod_content || '').trim(),\n      }))\n      .filter((v) => v.vod_id);\n\n    return { list };\n  }\n\n  async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {\n    const { ids } = doc;\n    const idsArr = ids.split(/[,，]/).map((c) => c.trim());\n\n    const srcList = await Promise.all(\n      idsArr.map(async (id) => {\n        const resp = await request.request({\n          url: buildUrl(this.host, `/${this.API[this.muban].vodDetail}`),\n          method: 'POST',\n          params: { vod_id: id },\n          headers: this.headers,\n        });\n\n        const data = JSON.parse(this.decrypt(resp)).data.vod;\n        return data;\n      }),\n    );\n    const rawList = Array.isArray(srcList) ? srcList : [];\n\n    const videos = rawList\n      .map((v, i) => {\n        try {\n          const playform: string[] = [];\n          const playurls: string[] = [];\n          const playlist = v.vod_play_list;\n          playlist.forEach((item) => {\n            playform.push(item.player_info.show);\n            playurls.push(\n              item.urls\n                .map((it) => {\n                  return `${it.name}$${JSON.stringify(it)}`;\n                })\n                .join('#'),\n            );\n          });\n          v.vod_play_from = playform.join('$$$');\n          v.vod_play_url = playurls.join('$$$');\n        } catch {\n          v.vod_play_from = '暂无资源';\n          v.vod_play_url = '暂无资源$0';\n        }\n\n        return {\n          vod_id: String((v.vod_id || idsArr[i]) ?? ''),\n          vod_name: v.vod_name ?? '',\n          vod_pic: v.vod_pic ?? '',\n          vod_remarks: v.vod_remarks ?? '',\n          vod_year: String(v.vod_year ?? ''),\n          vod_lang: v.vod_lang ?? '',\n          vod_area: v.vod_area ?? '',\n          vod_score: String((v.vod_score || v.vod_douban_score) ?? '0.0'),\n          vod_state: v.vod_state ?? '', // '正片' | '预告' | '花絮'\n          vod_class: v.vod_class ?? '', // '电影' | '电视剧' | '综艺' | '动漫' | '纪录片' | '其他'\n          vod_actor: v.vod_actor ?? '',\n          vod_director: v.vod_director ?? '',\n          vod_content: (v.vod_content ?? '')?.trim(),\n          vod_blurb: (v.vod_blurb ?? '')?.trim(),\n          vod_play_from: v.vod_play_from ?? '',\n          vod_play_url: v.vod_play_url ?? '',\n          type_name: v.type_name ?? '',\n        };\n      })\n      .filter((v) => v.vod_id);\n\n    return { list: videos };\n  }\n\n  async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {\n    const { wd, page } = doc || {};\n\n    const resp = await request.request({\n      url: buildUrl(this.host, `/${this.API[this.muban].searchList}`),\n      method: 'POST',\n      params: { keywords: wd, page, type_id: 0 },\n      headers: this.headers,\n    });\n\n    const srcList = JSON.parse(this.decrypt(JSON.parse(resp).data)).search_list;\n    const rawList = Array.isArray(srcList) ? srcList : [];\n\n    const list: ICmsHomeVod['list'] = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb || v.vod_content || '').trim(),\n      }))\n      .filter((v) => v.vod_id);\n\n    return { list };\n  }\n\n  async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {\n    const { play } = doc;\n\n    const json = JSON.parse(play);\n    const url = json.url;\n    const headers = this.appConfig.lazyheader || {};\n    let parse_api_url = json.parse_api_url;\n\n    if (/url=/.test(parse_api_url) && parse_api_url.startsWith('http')) {\n      const parsedata = await request.request({\n        url: parse_api_url,\n        headers: this.headers,\n      });\n      if (parsedata) {\n        try {\n          if (parsedata.url) {\n            let parseurl = parsedata.url;\n\n            if (!/m3u8|mp4|mkv/.test(parseurl)) {\n              parseurl = `${parseurl}&type=m3u8`;\n            }\n            return { url: parseurl, parse: 0, headers };\n          }\n        } catch {\n          return { parse: 1, url: parse_api_url };\n        }\n      }\n    } else {\n      parse_api_url = parse_api_url.replace(url, '');\n      const token = json.token;\n      try {\n        const resp = await request.request({\n          url: `${this.host}/${this.API[this.muban].vodParse}`,\n          method: 'POST',\n          headers: this.headers,\n          data: {\n            parse_api: parse_api_url,\n            url: encodeURIComponent(this.encrypt(url)),\n            token,\n          },\n        });\n        const parsejson = JSON.parse(JSON.parse(this.decrypt(resp.data)).json);\n        let play = parsejson.url;\n        if (play) {\n          if (!/m3u8|mp4|mkv/.test(play)) {\n            play = `${play}&type=m3u8`;\n          }\n          return { parse: 0, url: play, headers };\n        }\n      } catch {}\n    }\n    if (/m3u8|mp4|mkv/.test(url)) {\n      return { url, parse: 0, headers };\n    }\n    return { parse: 1, jx: this.isofficial(url) ? 1 : 0, url };\n  }\n\n  async action(_doc: ICmsParams['action']): ICmsResultPromise['action'] {\n    return '';\n  }\n\n  async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {\n    return [];\n  }\n\n  async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain'] {\n    return '';\n  }\n\n  get API() {\n    return {\n      AppGet: {\n        appLogin: 'api.php/getappapi.index/appLogin',\n        initV: 'api.php/getappapi.index/initV119',\n        typeFilterVodList: 'api.php/getappapi.index/typeFilterVodList',\n        vodDetail: 'api.php/getappapi.index/vodDetail',\n        searchList: 'api.php/getappapi.index/searchList',\n        vodParse: 'api.php/getappapi.index/vodParse',\n        mineInfo: 'api.php/getappapi.index/mineInfo',\n        watchRewardAd: 'api.php/getappapi.index/watchRewardAd',\n        userBuyVip: 'api.php/getappapi.index/userBuyVip',\n      },\n      AppQiji: {\n        appLogin: 'api.php/qijiappapi.index/appLogin',\n        initV: 'api.php/qijiappapi.index/initV120',\n        typeFilterVodList: 'api.php/qijiappapi.index/typeFilterVodList',\n        vodDetail: 'api.php/qijiappapi.index/vodDetail2',\n        searchList: 'api.php/qijiappapi.index/searchList',\n        vodParse: 'api.php/qijiappapi.index/vodParse',\n        mineInfo: 'api.php/qijiappapi.index/mineInfo',\n        watchRewardAd: 'api.php/qijiappapi.index/watchRewardAd',\n        userBuyVip: 'api.php/qijiappapi.index/userBuyVip',\n      },\n    };\n  }\n\n  private async vipTime() {\n    if (!this.会员时长 && this.appConfig['会员时长']) {\n      // eslint-disable-next-line no-eval\n      eval(`this.会员时长 = ${ungzip(this.appConfig['会员时长'])}`);\n      console.log(`传入会员时长函数:${this.会员时长}`);\n    }\n    if (this.appConfig.username && this.appConfig.password) {\n      // 获取用户信息\n      let mineInfo = await request.request({\n        url: buildUrl(this.host, `/${this.API[this.muban].mineInfo}`),\n        method: 'POST',\n        headers: this.headers,\n      });\n      mineInfo = JSON.parse(this.decrypt(mineInfo.data));\n      if (!mineInfo.user) {\n        this.init();\n        mineInfo = await request.request({\n          url: buildUrl(this.host, `${this.API[this.muban].mineInfo}`),\n          method: 'POST',\n          headers: this.headers,\n        });\n        mineInfo = JSON.parse(this.decrypt(mineInfo.data));\n      }\n      if (mineInfo.user.is_vip) {\n        const user_end_time = new Date(mineInfo.user.user_end_time * 1000).toLocaleString();\n        console.log(`会员到期时间:${user_end_time}`);\n      } else {\n        if (this.会员时长) {\n          // 获取会员时长\n          this.会员时长(mineInfo);\n          this.init();\n        }\n      }\n    }\n  }\n\n  private encrypt(value: string): string {\n    return aes.encode({\n      key: this.appConfig.key,\n      iv: this.appConfig.iv,\n      src: value,\n      mode: 'cbc',\n      pad: 'pkcs7padding',\n      outputEncode: 'base64',\n    });\n  }\n\n  private decrypt(value: string): string {\n    try {\n      return aes.decode({\n        key: this.appConfig.key,\n        iv: this.appConfig.iv,\n        src: value,\n        mode: 'cbc',\n        pad: 'pkcs7padding',\n      });\n    } catch {\n      if (typeof value === 'string') {\n        return value;\n      } else if (typeof value === 'object') {\n        return JSON.stringify(value);\n      }\n    }\n    return '';\n  }\n\n  private isofficial(url) {\n    const flag =\n      /qq.com|iqiyi.com|youku.com|mgtv.com|bilibili.com|sohu.com|ixigua.com|pptv.com|miguvideo.com|le.com|1905.com|fun.tv/;\n    return flag.test(url) && !/url=/.test(url);\n  }\n}\n\nexport default T3AppGetAdapter;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t3AppYsV2.ts",
    "content": "import { request } from '@main/utils/request';\nimport { buildUrl, getHome } from '@shared/modules/headers';\nimport type { ICmsParams, ICmsResultPromise, IConstructorOptions } from '@shared/types/cms';\n\nconst lienName: Record<string, string> = {\n  bfzym3u8: '暴风',\n  '1080zyk': '优质',\n  kuaikan: '快看',\n  lzm3u8: '量子',\n  ffm3u8: '非凡',\n  haiwaikan: '海外看',\n  gsm3u8: '光速',\n  zuidam3u8: '最大',\n  bjm3u8: '八戒',\n  snm3u8: '索尼',\n  wolong: '卧龙',\n  xlm3u8: '新浪',\n  yhm3u8: '樱花',\n  tkm3u8: '天空',\n  jsm3u8: '极速',\n  wjm3u8: '无尽',\n  sdm3u8: '闪电',\n  kcm3u8: '快车',\n  jinyingm3u8: '金鹰',\n  fsm3u8: '飞速',\n  tpm3u8: '淘片',\n  lem3u8: '鱼乐',\n  dbm3u8: '百度',\n  tomm3u8: '番茄',\n  ukm3u8: 'U酷',\n  ikm3u8: '爱坤',\n  hnzym3u8: '红牛资源',\n  hnm3u8: '红牛',\n  '68zy_m3u8': '68',\n  kdm3u8: '酷点',\n  bdxm3u8: '北斗星',\n  qhm3u8: '奇虎',\n  hhm3u8: '豪华',\n  kbm3u8: '快播',\n};\n\nclass T3AppYsV2Adapter {\n  private api: string = '';\n  private type: number = 1;\n  private parseApis: Record<string, string> = {};\n  private categories: string[] = [];\n  private randomPrefix: string = '';\n\n  constructor(source: IConstructorOptions) {\n    const ext = source.ext!;\n    this.type = ext.includes('.vod') ? 1 : 2;\n    this.api = ext.endsWith('/') ? ext.replace(/\\/$/, '') : ext;\n    this.categories = source.categories;\n\n    this.randomPrefix = `${Date.now() / 1000}Prefix:`;\n  }\n\n  async init(): ICmsResultPromise['init'] {}\n\n  async home(): ICmsResultPromise['home'] {\n    const { data: resp } = await request.request({\n      url: buildUrl(this.api, this.type === 1 ? '/types' : '/nav'),\n      method: 'GET',\n    });\n\n    const srcList = this.type === 1 ? resp?.data?.typelist || resp?.data?.list : resp?.list || resp?.data;\n    const rawList: Array<{\n      type_id: string;\n      type_name: string;\n      type_extend: Record<string, any>;\n    }> = Array.isArray(srcList) ? srcList : [];\n\n    const keyMap = new Map([\n      ['class', '类型'],\n      ['area', '地区'],\n      ['lang', '语言'],\n      ['year', '年份'],\n      ['by', '排序'],\n    ]);\n\n    const classes = rawList\n      .map((item) => ({\n        type_id: String(item.type_id ?? '').trim(),\n        type_name: item.type_name?.toString().trim() ?? '',\n      }))\n      .filter(\n        (item, index, self) =>\n          item.type_id &&\n          item.type_name &&\n          !this.categories?.includes(item.type_name) &&\n          self.findIndex((other) => other.type_id === item.type_id) === index,\n      );\n    const classIds = classes.map((item) => item.type_id);\n\n    const filters = rawList.reduce((acc, item) => {\n      const rawFiltersObj = item?.type_extend || {};\n      const rawKey = String(item?.type_id);\n\n      const arr = Object.entries(rawFiltersObj)\n        .filter(([k, v]) => keyMap.has(k) && v && classIds.includes(rawKey))\n        .map(([k, v]) => ({\n          key: k,\n          name: keyMap.get(k)!,\n          value: [\n            { n: '全部', v: '' },\n            ...v\n              .split(',')\n              .filter(Boolean)\n              .map((v) => ({ n: v, v })),\n          ],\n        }));\n\n      acc[rawKey] = arr;\n      return acc;\n    }, {});\n\n    return { class: classes, filters };\n  }\n\n  async homeVod(): ICmsResultPromise['homeVod'] {\n    const { data: resp } = await request.request({\n      url: buildUrl(this.api, this.type === 1 ? '/vodPhbAll' : '/index_video'),\n      method: 'GET',\n    });\n\n    const srcList = this.type === 1 ? resp?.data?.list : resp?.list || resp?.data;\n    const rawList = Array.isArray(srcList) ? srcList : [];\n\n    const videos = rawList\n      .flatMap((it) => {\n        const vlist = this.type === 1 ? it.vod_list || [] : it.vlist || [];\n        return vlist;\n      })\n      .filter((v) => v.vod_id)\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: this.fixPic(v.vod_pic),\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb || v.vod_content || '').trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }));\n\n    const pagecurrent = 1;\n    const pagecount = videos.length ? 1 : 0;\n    const total = videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async category(doc: ICmsParams['category']): ICmsResultPromise['category'] {\n    const { page, tid, extend: fl = {} } = doc || {};\n    const f = `class=${fl.class || ''}&area=${fl.area || ''}&lang=${fl.lang || ''}&letter=${fl.letter || ''}&year=${fl.year || ''}&by=${fl.by || ''}`;\n\n    const { data: resp } = await request.request({\n      url: buildUrl(this.api, this.type === 1 ? `?tid=${tid}&page=${page}&${f}` : `/video?tid=${tid}&pg=${page}&${f}`),\n      method: 'GET',\n    });\n\n    const srcList = this.type === 1 ? resp?.data?.list : resp?.list || resp?.data;\n    const rawTotal = this.type === 1 ? resp?.data?.total : resp?.total;\n    const rawPage = this.type === 1 ? resp?.data?.page : resp?.page;\n    const rawLimit = this.type === 1 ? resp?.data?.limit : resp?.limit;\n    const rawList = Array.isArray(srcList) ? srcList : [];\n\n    const videos = rawList\n      .filter((v) => v.vod_id)\n      .map((v) => ({\n        vod_id: String((v.vod_id || this.randomPrefix + v.vod_name) ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: this.fixPic(v.vod_pic),\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb || v.vod_content || '').trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }));\n\n    const pagecurrent = Number(rawPage) || page;\n    const total = Number(rawTotal) || 0;\n    const pagecount = Number(total) ? (Number(rawLimit) ? Math.ceil(total / Number(rawLimit)) : videos.length) : 0;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {\n    const { ids } = doc;\n    const idsArray = ids.split(',');\n\n    const realIds = await Promise.all(\n      idsArray.map(async (rawId) => {\n        const isPrefixed = rawId.startsWith(this.randomPrefix);\n        if (!isPrefixed) return rawId;\n\n        const wd = rawId.replace(this.randomPrefix, '');\n        const { data: resp } = await request.request({\n          url: this.type === 1 ? `${this.api}?wd=${wd}` : `${this.api}/search?text=${wd}`,\n          method: 'GET',\n        });\n\n        const list = this.type === 1 ? resp.data?.list : resp.list || resp.data;\n        const newId = list?.[0]?.vod_id;\n        return newId || rawId;\n      }),\n    );\n\n    const srcList = await Promise.all(\n      realIds.map(async (id) => {\n        const { data: resp } = await request.request({\n          url: buildUrl(this.api, this.type === 1 ? `/detail?vod_id=${id}` : `/video_detail?id=${id}`),\n          method: 'GET',\n        });\n\n        return resp?.data?.vod_info || resp?.data;\n      }),\n    );\n    const rawList = Array.isArray(srcList) ? srcList : [];\n\n    const videos = rawList\n      .map((v, i) => {\n        const episodes = this.type === 1 ? v.vod_play_list : v.vod_url_with_player;\n        const episodeList = Array.isArray(episodes) ? episodes : [];\n\n        const playMap = {};\n        const parseApis = new Map<string, string>();\n\n        episodeList.forEach((ep) => {\n          const from =\n            this.type === 1 ? ep.player_info?.from || ep.player_info?.show || ep.from || ep.show : ep.code || ep.name;\n\n          if (!from) return;\n\n          if (!playMap[from]) playMap[from] = [];\n          playMap[from].push(ep.url);\n\n          if (ep.parse_api) {\n            const flag = lienName[from] || from;\n            parseApis.set(flag, ep.parse_api);\n          }\n        });\n\n        if (parseApis.size) this.parseApis = Object.fromEntries(parseApis);\n\n        const sortOrder = {\n          bfzym3u8: 1,\n          '1080zyk': 2,\n          kuaikan: 3,\n          lzm3u8: 4,\n          ffm3u8: 5,\n          snm3u8: 6,\n          qhm3u8: 7,\n        };\n\n        const arr = Object.entries(playMap)\n          .map(([key, urls]) => ({\n            flag: lienName[key] || key,\n            url: urls,\n            sort: sortOrder[key] || 8,\n          }))\n          .sort((a, b) => a.sort - b.sort);\n\n        const valid = arr.filter(({ flag }) => flag && !flag.includes('undefined'));\n        const playFrom = valid.map((v) => v.flag);\n        const playUrl = valid.map((v) => v.url);\n        if (playFrom.length) v.vod_play_from = playFrom.join('$$$');\n        if (playUrl.length) v.vod_play_url = playUrl.join('$$$');\n\n        return {\n          vod_id: String((v.vod_id || idsArray[i]) ?? ''),\n          vod_name: v.vod_name ?? '',\n          vod_pic: v.vod_pic ?? '',\n          vod_remarks: v.vod_remarks ?? '',\n          vod_year: String(v.vod_year ?? ''),\n          vod_lang: v.vod_lang ?? '',\n          vod_area: v.vod_area ?? '',\n          vod_score: String((v.vod_score || v.vod_douban_score) ?? '0.0'),\n          vod_state: v.vod_state ?? '', // '正片' | '预告' | '花絮'\n          vod_class: v.vod_class ?? '', // '电影' | '电视剧' | '综艺' | '动漫' | '纪录片' | '其他'\n          vod_actor: v.vod_actor ?? '',\n          vod_director: v.vod_director ?? '',\n          vod_content: (v.vod_content ?? '')?.trim(),\n          vod_blurb: (v.vod_blurb ?? '')?.trim(),\n          vod_play_from: v.vod_play_from ?? '',\n          vod_play_url: v.vod_play_url ?? '',\n          type_name: v.type_name ?? '',\n        };\n      })\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = 1;\n    const pagecount = videos.length ? 1 : 0;\n    const total = videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {\n    const { wd, page } = doc || {};\n\n    const { data: resp } = await request.request({\n      url: buildUrl(this.api, this.type === 1 ? `?wd=${wd}&page=${page}` : `/search?text=${wd}&pg=${page}`),\n      method: 'GET',\n    });\n\n    const srcList = this.type === 1 ? resp?.data?.list : resp?.list || resp?.data;\n    const rawTotal = this.type === 1 ? resp?.data?.total : resp?.total;\n    const rawPage = this.type === 1 ? resp?.data?.page : resp?.page;\n    const rawLimit = this.type === 1 ? resp?.data?.limit : resp?.limit;\n    const rawList = Array.isArray(srcList) ? srcList : [];\n\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: this.fixPic(v.vod_pic),\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb || v.vod_content || '').trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(rawPage) || page;\n    const total = Number(rawTotal) || 0;\n    const pagecount = Number(total) ? (Number(rawLimit) ? Math.ceil(total / Number(rawLimit)) : videos.length) : 0;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {\n    const { play, flag } = doc;\n\n    const res = {\n      url: this.parseApis?.[flag] && !/\\.(?:m3u8|mp4|mpd|flv|mkv)/i.test(play) ? this.parseApis[flag] + play : play,\n      parse: +!/\\.(?:m3u8|mp4|mpd|flv|mkv)$/i.test(play),\n    };\n    return res;\n  }\n\n  async action(_doc: ICmsParams['action']): ICmsResultPromise['action'] {\n    return '';\n  }\n\n  async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {\n    return [];\n  }\n\n  async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain'] {\n    return '';\n  }\n\n  private fixPic(pic: string): string {\n    if (pic.startsWith('http')) return pic;\n    if (pic.startsWith('//')) return `https:${pic}`;\n    if (pic.startsWith('/')) return getHome(this.api) + pic;\n    return `${getHome(this.api)}/${pic}`;\n  }\n}\n\nexport default T3AppYsV2Adapter;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Catopen/index.ts",
    "content": "import { join } from 'node:path';\n\nimport { loggerService } from '@logger';\nimport { APP_PUBLIC_PATH } from '@main/utils/path';\nimport { request } from '@main/utils/request';\nimport { SITE_LOGGER_MAP, SITE_TYPE } from '@shared/config/film';\nimport { isJson, isJsonStr } from '@shared/modules/validate';\nimport type { ICmsMethodName, ICmsParams, ICmsResultPromise, IConstructorOptions } from '@shared/types/cms';\nimport JSON5 from 'json5';\nimport type { Pool } from 'workerpool';\nimport workerpool from 'workerpool';\n\nconst logger = loggerService.withContext(SITE_LOGGER_MAP[SITE_TYPE.T3_CATOPEN]);\n\ntype ICmsResultCustom = Omit<Awaited<ICmsResultPromise>, 'play'> & {\n  play: Awaited<ICmsResultPromise['play']> & {\n    parse_extra?: string;\n    js?: string;\n    header?: Record<string, any>;\n  };\n};\n\nclass T3CatopenAdapter {\n  private id: string = '';\n  private ext: string = '';\n  private api: string = '';\n  private categories: string[] = [];\n\n  private pool: Pool | null = null;\n\n  constructor(source: IConstructorOptions) {\n    this.id = source.id;\n    this.api = source.api!;\n    this.ext = source.ext!;\n    this.categories = source.categories;\n  }\n\n  public async destroy(): Promise<void> {\n    if (this.pool) {\n      await this.pool.terminate();\n      this.pool = null;\n    }\n  }\n\n  private async execCtx<T extends ICmsMethodName>(type: T, options?: ICmsParams[T]): Promise<ICmsResultCustom[T]> {\n    if (!this.pool) {\n      const uri = join(import.meta.dirname, 'film_cms_adapter_t3_catopen_worker.js');\n      this.pool = workerpool.pool(uri, {\n        workerType: 'process',\n        maxWorkers: 1,\n        forkOpts: { silent: true },\n      });\n    }\n\n    const resp = await this.pool.exec('main', [type, options], {\n      on(payload) {\n        const { type, level, msg } = payload;\n\n        if (type === 'log') {\n          const msgType = msg?.type;\n          const msgList = msg?.msg ?? [];\n\n          const log =\n            msgType === 'single' ? msgList[0] : msgList.map((t: any) => (isJson(t) ? JSON.stringify(t) : t)).join(' ');\n\n          logger[level](log);\n        }\n      },\n    });\n\n    return resp;\n  }\n\n  public async init(): ICmsResultPromise['init'] {\n    let ext: string = this.ext;\n\n    const { data: code } = await request.request({\n      url: this.api,\n      method: 'GET',\n    });\n\n    if (isJsonStr(ext)) ext = JSON5.parse(ext);\n\n    await this.execCtx('init', {\n      id: this.id,\n      ext,\n      code,\n      libPath: join(APP_PUBLIC_PATH, 't3Catopen'),\n    });\n  }\n\n  public async home(): ICmsResultPromise['home'] {\n    const resp = await this.execCtx('home');\n\n    const rawClassList = Array.isArray(resp?.class) ? resp?.class : [];\n    const classes = rawClassList\n      .map((item) => ({\n        type_id: String(item.type_id ?? '').trim(),\n        type_name: item.type_name?.toString().trim() ?? '',\n      }))\n      .filter(\n        (item, index, self) =>\n          item.type_id &&\n          item.type_name &&\n          !this.categories?.includes(item.type_name) &&\n          self.findIndex((other) => other.type_id === item.type_id) === index,\n      );\n    const classIds = classes.map((item) => item.type_id);\n\n    const rawFiltersObj = resp?.filters && Object.keys(resp?.filters).length ? resp.filters : {};\n    const filters = Object.keys(rawFiltersObj).reduce((acc, key) => {\n      if (String(key) && classIds.includes(String(key))) {\n        acc[String(key)] = rawFiltersObj[key];\n      }\n      return acc;\n    }, {});\n\n    return { class: classes, filters };\n  }\n\n  public async homeVod(): ICmsResultPromise['homeVod'] {\n    const resp = await this.execCtx('homeVod');\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || 1;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  public async category(doc: ICmsParams['category']): ICmsResultPromise['category'] {\n    const { tid, page = 1, extend = {} } = doc || {};\n    const resp = await this.execCtx('category', { tid, page, extend });\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || page;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  public async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {\n    const { ids } = doc || {};\n    const resp = await this.execCtx('detail', { ids });\n\n    const idsArray = [ids];\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v, i) => ({\n        vod_id: String((v.vod_id || idsArray[i]) ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_year: String(v.vod_year ?? ''),\n        vod_lang: v.vod_lang ?? '',\n        vod_area: v.vod_area ?? '',\n        vod_score: String(v.vod_score ?? '0.0'),\n        vod_state: v.vod_state ?? '', // '正片' | '预告' | '花絮'\n        vod_class: v.vod_class ?? '', // '电影' | '电视剧' | '综艺' | '动漫' | '纪录片' | '其他'\n        vod_actor: v.vod_actor ?? '',\n        vod_director: v.vod_director ?? '',\n        vod_content: (v.vod_content ?? '')?.trim(),\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_play_from: v.vod_play_from ?? '',\n        vod_play_url: v.vod_play_url ?? '',\n        type_name: v.type_name ?? '',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || 1;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  public async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {\n    const { wd, page = 1 } = doc || {};\n    const resp = await this.execCtx('search', { wd, page });\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || page;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  public async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {\n    const { flag, play } = doc || {};\n    const resp = await this.execCtx('play', { flag, play });\n\n    const qs = resp?.parse_extra;\n    const scriptObj = qs ? Object.fromEntries(new URLSearchParams(qs)) : {};\n\n    const res = {\n      url: resp?.url || '',\n      quality: resp.quality || [],\n      parse: resp.parse || 0,\n      jx: resp.jx || 0,\n      headers: resp?.header || resp?.headers || {},\n      script: Object.keys(scriptObj).length\n        ? {\n            ...(resp.js ? { runScript: resp.js } : {}),\n            ...(scriptObj.init_script ? { initScript: scriptObj.init_script } : {}),\n            ...(scriptObj.custom_regex ? { customRegex: scriptObj.custom_regex } : {}),\n            ...(scriptObj.sniffer_exclude ? { snifferExclude: scriptObj.sniffer_exclude } : {}),\n          }\n        : {},\n    };\n\n    return res;\n  }\n\n  async action(doc: ICmsParams['action']): ICmsResultPromise['action'] {\n    const { action, value, timeout } = doc || {};\n    const resp = await this.execCtx('action', { action, value, timeout });\n    return resp;\n  }\n\n  async proxy(doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {\n    const resp = await this.execCtx('proxy', doc);\n    return resp;\n  }\n\n  async runMain(doc: ICmsParams['runMain']): ICmsResultPromise['runMain'] {\n    const resp = await this.execCtx('runMain', doc);\n    return resp;\n  }\n}\n\nexport default T3CatopenAdapter;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Catopen/inject.ts",
    "content": "import { Buffer } from 'node:buffer';\n\nimport { batchFetch, fetch } from '@main/utils/hiker/request/asyncAxios';\nimport { headersPascalCase } from '@shared/modules/headers';\n\nconst hasPropertyIgnoreCase = (obj: Record<string, string>, propertyName: string) => {\n  return Object.keys(obj).some((key) => key.toLowerCase() === propertyName.toLowerCase());\n};\n\nconst valueStartsWith = (obj: Record<string, string>, propertyName: string, prefix: string) => {\n  const key = Object.keys(obj).find((key) => key.toLowerCase() === propertyName.toLowerCase());\n  return key !== undefined && obj[key].startsWith(prefix);\n};\n\nconst req = async (\n  url: string,\n  cobj: Record<string, any>,\n): Promise<{ content: string; headers?: Record<string, string> }> => {\n  const obj = { ...cobj };\n\n  if (obj.data) {\n    obj.body = obj.data;\n    const isForm =\n      obj.postType === 'form' ||\n      (hasPropertyIgnoreCase(obj.headers, 'Content-Type') &&\n        valueStartsWith(obj.headers, 'Content-Type', 'application/x-www-form-urlencoded'));\n\n    if (isForm) {\n      obj.body = new URLSearchParams(obj.data).toString();\n    }\n    delete obj.data;\n  }\n\n  if (Object.hasOwn(obj, 'redirect')) obj.redirect = !!obj.redirect;\n  if (obj.buffer === 2) obj.toHex = true;\n\n  if (url === 'https://api.nn.ci/ocr/b64/text' && obj.headers) {\n    obj.headers['Content-Type'] = 'text/plain';\n  }\n  obj.headers = headersPascalCase(obj.headers);\n\n  const res: { content: string; headers?: Record<string, string> } = { content: '' };\n  let resp: any = await fetch(url, obj);\n  if (obj.withHeaders) {\n    resp = JSON.parse(resp!);\n    res.content = resp.body;\n    res.headers = Object.fromEntries(Object.entries(resp.headers || {}).map(([k, v]) => [k, v?.[0]]));\n  } else {\n    res.content = resp!;\n  }\n\n  if (obj.buffer === 2) {\n    res.content = Buffer.from(resp!.body, 'hex').toString('base64');\n  }\n\n  return res;\n};\n\nexport { batchFetch, req };\n\nexport { aesX, BaseSpider, desX, getProxy, joinUrl, local, md5X, rsaX } from '@main/utils/hiker';\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Catopen/worker.ts",
    "content": "import { pathToFileURL } from 'node:url';\n\nimport { base64 } from '@shared/modules/crypto';\nimport { isArray, isFunction, isJsonStr, isNil } from '@shared/modules/validate';\nimport workerpool from 'workerpool';\n\nimport { BaseSpider, getProxy, req } from './inject';\n\nglobalThis.BaseSpider = BaseSpider;\nglobalThis.getProxy = getProxy;\nglobalThis.req = req;\n\nlet spider: any;\n\n['log', 'info', 'warn', 'error', 'debug'].forEach((method) => {\n  const level = method === 'log' ? 'verbose' : method;\n  console[method] = (...msgRaw: any[]) => {\n    const msg = {\n      type: msgRaw.length > 1 ? 'multiple' : 'single',\n      msg: msgRaw,\n    };\n    workerpool.workerEmit({ type: 'log', level, msg });\n  };\n});\n\nconst handlers: Record<string, (options?: Record<string, any>) => Promise<any>> = {\n  async init(options) {\n    let { id, code, ext, libPath } = options!;\n\n    const cfg = {\n      stype: 4,\n      skey: id,\n      sourceKey: id,\n      ext,\n    };\n\n    if (code.includes('assets://js/lib/')) {\n      const libUrl = pathToFileURL(libPath).href;\n      code = code.replaceAll('assets://js/lib', libUrl);\n    }\n\n    const dataUri = `data:text/javascript;base64,${base64.encode({ src: code })}`;\n    const modRaw = await import(dataUri);\n    const mod = isFunction(modRaw.__jsEvalReturn) ? modRaw.__jsEvalReturn() : (modRaw.default ?? modRaw);\n\n    spider = mod;\n    await mod.init(cfg);\n\n    return mod;\n  },\n\n  async home() {\n    const resp = await spider.home(true);\n    const res = isJsonStr(resp) ? JSON.parse(resp) : resp;\n    return res;\n  },\n\n  async homeVod() {\n    const resp = await spider.homeVod();\n    const res = isJsonStr(resp) ? JSON.parse(resp) : resp;\n    return res;\n  },\n\n  async category(options) {\n    const { tid, page, extend } = options!;\n    const resp = await spider.category(\n      tid,\n      page,\n      Object.keys(extend).length > 0,\n      Object.keys(extend).length > 0 ? extend : {},\n    );\n    const res = isJsonStr(resp) ? JSON.parse(resp) : resp;\n    return res;\n  },\n\n  async detail(options) {\n    const { ids } = options!;\n    let resp = '{}';\n    if (isFunction(spider.detailContent)) {\n      resp = await spider.detailContent(isArray(ids) ? ids : [ids]);\n    } else {\n      resp = await spider.detail(ids);\n    }\n    const res = isJsonStr(resp) ? JSON.parse(resp) : resp;\n    return res;\n  },\n\n  async play(options) {\n    const { flag, play: input } = options!;\n    const resp = await spider.play(flag, input, []);\n    const res = isJsonStr(resp) ? JSON.parse(resp) : resp;\n    return res;\n  },\n\n  async search(options) {\n    const { wd, page } = options!;\n    const resp = await spider.search(wd, false, page);\n    const res = isJsonStr(resp) ? JSON.parse(resp) : resp;\n    return res;\n  },\n\n  async action(options) {\n    const { action, value, timeout } = options!;\n    if (timeout && timeout > 0) globalThis.variable = { timeout };\n    else delete globalThis.variable?.timeout;\n    const resp = await spider.action(action, value);\n    return resp;\n  },\n\n  async proxy(options) {\n    const resp = await spider.proxy(options);\n    const res = isJsonStr(resp) ? JSON.parse(resp) : resp;\n    return res;\n  },\n};\n\nconst main = async (type: string, options?: Record<string, any>) => {\n  try {\n    const handler = handlers[type];\n    if (isNil(handler)) throw new Error(`Handler not found for type: ${type}`);\n    return await handler(options);\n  } catch (error) {\n    console.error((error as Error).message);\n    throw error;\n  }\n};\n\nworkerpool.worker({ main });\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Drpy/decrypt.ts",
    "content": "import { aes, base64, gzip, rsa } from '@shared/modules/crypto';\n\nconst removeHeader = (content: string, options: { mode?: string; fileType: string }): string => {\n  const { mode = 'header-only', fileType } = options;\n\n  // 文件类型配置\n  const COMMENT_CONFIG = {\n    '.js': {\n      start: '/*',\n      end: '*/',\n      regex: /^\\s*\\/\\*([\\s\\S]*?)\\*\\/\\s*/,\n      headerRegex: /@header\\(([\\s\\S]*?)\\)/,\n      // topCommentsRegex: /^(\\s*(\\/\\/[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/)\\s*)+/,\n      topCommentsRegex: /^(?:\\s|\\/\\/[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/)+/,\n    },\n    '.py': {\n      start: '\"\"\"',\n      end: '\"\"\"',\n      regex: /^\\s*\"\"\"([\\s\\S]*?)\"\"\"\\s*/,\n      headerRegex: /@header\\(([\\s\\S]*?)\\)/,\n      // topCommentsRegex: /^(\\s*(#[^\\n]*\\n|'''[\\s\\S]*?'''|\"\"\"[\\s\\S]*?\"\"\")\\s*)+/,\n      topCommentsRegex: /^(?:\\s|#[^\\n]*\\n|'''[\\s\\S]*?'''|\"\"\"[\\s\\S]*?\"\"\")+/,\n    },\n  };\n\n  // Check required options\n  if (!fileType) throw new Error('fileType option is required');\n\n  // Get the file extension\n  const ext = fileType.startsWith('.') ? fileType : `.${fileType}`;\n  const config = COMMENT_CONFIG[ext];\n\n  // Check supported file type\n  if (!config) throw new Error(`Unsupported file type: ${ext}`);\n\n  // Mode1: Remove all consecutive comment blocks at the top\n  if (mode === 'top-comments') {\n    const match = content.match(config.topCommentsRegex);\n    if (match) {\n      return content.substring(match[0].length).trim();\n    }\n    return content.trim();\n  }\n\n  // Mode2: Remove only the @header line (default mode)\n  const match = content.match(config.regex);\n  if (!match) return content.trim();\n\n  let [fullComment, innerContent] = match;\n\n  // Detect and Remove @header\n  if (config.headerRegex.test(innerContent)) {\n    innerContent = innerContent.replace(config.headerRegex, '');\n\n    // Clean up empty lines and reorganize comments\n    const cleanedInner = innerContent\n      .split('\\n')\n      .filter((line) => line.trim().length > 0)\n      .join('\\n');\n\n    if (!cleanedInner.trim()) {\n      // Remove the comment block completely if the comment content is empty\n      return content.replace(fullComment, '').trim();\n    } else {\n      // Preserve non-header comments\n      const newComment = `${config.start}${cleanedInner}${config.end}`;\n      return content.replace(fullComment, newComment).trim();\n    }\n  }\n\n  return content.trim();\n};\n\nconst convertOriginalCode = (code: string): string => {\n  // const current_match = /var rule|[\\u4E00-\\u9FA5]+|function|let |var |const |[()\"']/;\n  const currentMatch = /var rule|function|let |var |const|class Rule|async|this\\./;\n  if (currentMatch.test(code)) {\n    return code;\n  }\n  const rawCode = removeHeader(code, { mode: 'top-comments', fileType: '.js' });\n\n  const decodeFns = {\n    gzip: (value: string) => {\n      try {\n        return gzip.decode({ src: value });\n      } catch {\n        console.log('Not gzip encryption');\n        return '';\n      }\n    },\n    base64: (value: string) => {\n      try {\n        return base64.decode({ src: value });\n      } catch {\n        console.log('Not base64 encryption');\n        return '';\n      }\n    },\n    aes: (value: string) => {\n      try {\n        const key = '686A64686E780A0A0A0A0A0A0A0A0A0A';\n        const iv = '647A797964730A0A0A0A0A0A0A0A0A0A';\n        return aes.decode({ src: value, key, iv, keyEncode: 'hex', ivEncode: 'hex' });\n      } catch {\n        console.log('Not aes encryption');\n        return '';\n      }\n    },\n    rsa: (value: string) => {\n      try {\n        const key = `-----BEGIN RSA PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqin/jUpqM6+fgYP/oMqj9zcdHMM0mEZXLeTyixIJWP53lzJV2N2E3OP6BBpUmq2O1a9aLnTIbADBaTulTNiOnVGoNG58umBnupnbmmF8iARbDp2mTzdMMeEgLdrfXS6Y3VvazKYALP8EhEQykQVarexR78vRq7ltY3quXx7cgI0ROfZz5Sw3UOLQJ+VoWmwIxu9AMEZLVzFDQN93hzuzs3tNyHK6xspBGB7zGbwCg+TKi0JeqPDrXxYUpAz1cQ/MO+Da0WgvkXnvrry8NQROHejdLVOAslgr6vYthH9bKbsGyNY3H+P12kcxo9RAcVveONnZbcMyxjtF5dWblaernAgMBAAECggEAGdEHlSEPFmAr5PKqKrtoi6tYDHXdyHKHC5tZy4YV+Pp+a6gxxAiUJejx1hRqBcWSPYeKne35BM9dgn5JofgjI5SKzVsuGL6bxl3ayAOu+xXRHWM9f0t8NHoM5fdd0zC3g88dX3fb01geY2QSVtcxSJpEOpNH3twgZe6naT2pgiq1S4okpkpldJPo5GYWGKMCHSLnKGyhwS76gF8bTPLoay9Jxk70uv6BDUMlA4ICENjmsYtd3oirWwLwYMEJbSFMlyJvB7hjOjR/4RpT4FPnlSsIpuRtkCYXD4jdhxGlvpXREw97UF2wwnEUnfgiZJ2FT/MWmvGGoaV/CfboLsLZuQKBgQDTNZdJrs8dbijynHZuuRwvXvwC03GDpEJO6c1tbZ1s9wjRyOZjBbQFRjDgFeWs9/T1aNBLUrgsQL9c9nzgUziXjr1Nmu52I0Mwxi13Km/q3mT+aQfdgNdu6ojsI5apQQHnN/9yMhF6sNHg63YOpH+b+1bGRCtr1XubuLlumKKscwKBgQDOtQ2lQjMtwsqJmyiyRLiUOChtvQ5XI7B2mhKCGi8kZ+WEAbNQcmThPesVzW+puER6D4Ar4hgsh9gCeuTaOzbRfZ+RLn3Aksu2WJEzfs6UrGvm6DU1INn0z/tPYRAwPX7sxoZZGxqML/z+/yQdf2DREoPdClcDa2Lmf1KpHdB+vQKBgBXFCVHz7a8n4pqXG/HvrIMJdEpKRwH9lUQS/zSPPtGzaLpOzchZFyQQBwuh1imM6Te+VPHeldMh3VeUpGxux39/m+160adlnRBS7O7CdgSsZZZ/dusS06HAFNraFDZf1/VgJTk9BeYygX+AZYu+0tReBKSs9BjKSVJUqPBIVUQXAoGBAJcZ7J6oVMcXxHxwqoAeEhtvLcaCU9BJK36XQ/5M67ceJ72mjJC6/plUbNukMAMNyyi62gO6I9exearecRpB/OGIhjNXm99Ar59dAM9228X8gGfryLFMkWcO/fNZzb6lxXmJ6b2LPY3KqpMwqRLTAU/zy+ax30eFoWdDHYa4X6e1AoGAfa8asVGOJ8GL9dlWufEeFkDEDKO9ww5GdnpN+wqLwePWqeJhWCHad7bge6SnlylJp5aZXl1+YaBTtOskC4Whq9TP2J+dNIgxsaF5EFZQJr8Xv+lY9lu0CruYOh9nTNF9x3nubxJgaSid/7yRPfAGnsJRiknB5bsrCvgsFQFjJVs=\n-----END RSA PRIVATE KEY-----`;\n        return rsa.decode({ src: value, key, long: true });\n      } catch {\n        console.log('Not rsa encryption');\n        return '';\n      }\n    },\n  };\n\n  let decodeContent: string = '';\n  for (const func in decodeFns) {\n    decodeContent = decodeFns[func](rawCode);\n    if (currentMatch.test(decodeContent)) break;\n  }\n\n  return decodeContent || rawCode;\n};\n\nexport { convertOriginalCode };\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Drpy/index.ts",
    "content": "// (node) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 error listeners added to [ChildProcess]. MaxListeners is 10. Use emitter.setMaxListeners() to increase limit\nimport { join } from 'node:path';\n\nimport { loggerService } from '@logger';\nimport { SITE_LOGGER_MAP, SITE_TYPE } from '@shared/config/film';\nimport { isJson } from '@shared/modules/validate';\nimport type { ICmsMethodName, ICmsParams, ICmsResultPromise, IConstructorOptions } from '@shared/types/cms';\nimport type { Pool } from 'workerpool';\nimport workerpool from 'workerpool';\n\ntype ICmsResultCustom = Omit<Awaited<ICmsResultPromise>, 'play'> & {\n  play: Awaited<ICmsResultPromise['play']> & {\n    parse_extra?: string;\n    js?: string;\n    header?: Record<string, any>;\n  };\n};\n\nconst logger = loggerService.withContext(SITE_LOGGER_MAP[SITE_TYPE.T3_DRPY]);\n\nclass T3DrpyAdapter {\n  private ext: string = '';\n  private categories: string[] = [];\n\n  private pool: Pool | null = null;\n\n  constructor(source: IConstructorOptions) {\n    this.ext = source.ext!;\n    this.categories = source.categories;\n  }\n\n  public async destroy(): Promise<void> {\n    if (this.pool) {\n      await this.pool.terminate();\n      this.pool = null;\n    }\n  }\n\n  private async execCtx<T extends ICmsMethodName>(type: T, options?: ICmsParams[T]): Promise<ICmsResultCustom[T]> {\n    if (!this.pool) {\n      this.pool = workerpool.pool(join(import.meta.dirname, 'film_cms_adapter_t3_drpy_worker.js'), {\n        workerType: 'process',\n        maxWorkers: 1,\n        forkOpts: { silent: true },\n      });\n    }\n\n    const resp = await this.pool.exec('main', [type, options], {\n      on(payload) {\n        const { type, level, msg } = payload;\n\n        if (type === 'log') {\n          const msgType = msg?.type;\n          const msgList = msg?.msg ?? [];\n\n          const log =\n            msgType === 'single' ? msgList[0] : msgList.map((t: any) => (isJson(t) ? JSON.stringify(t) : t)).join(' ');\n\n          logger[level](log);\n        }\n      },\n    });\n\n    return resp;\n  }\n\n  public async init(): ICmsResultPromise['init'] {\n    await this.execCtx('init', this.ext);\n  }\n\n  public async home(): ICmsResultPromise['home'] {\n    const resp = await this.execCtx('home');\n\n    const rawClassList = Array.isArray(resp?.class) ? resp?.class : [];\n    const classes = rawClassList\n      .map((item) => ({\n        type_id: String(item.type_id ?? '').trim(),\n        type_name: item.type_name?.toString().trim() ?? '',\n      }))\n      .filter(\n        (item, index, self) =>\n          item.type_id &&\n          item.type_name &&\n          !this.categories?.includes(item.type_name) &&\n          self.findIndex((other) => other.type_id === item.type_id) === index,\n      );\n    const classIds = classes.map((item) => item.type_id);\n\n    const rawFiltersObj = resp?.filters && Object.keys(resp?.filters).length ? resp.filters : {};\n    const filters = Object.keys(rawFiltersObj).reduce((acc, key) => {\n      if (String(key) && classIds.includes(String(key))) {\n        acc[String(key)] = rawFiltersObj[key];\n      }\n      return acc;\n    }, {});\n\n    return { class: classes, filters };\n  }\n\n  public async homeVod(): ICmsResultPromise['homeVod'] {\n    const resp = await this.execCtx('homeVod');\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || 1;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  public async category(doc: ICmsParams['category']): ICmsResultPromise['category'] {\n    const { tid, page = 1, extend = {} } = doc || {};\n    const resp = await this.execCtx('category', { tid, page, extend });\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || page;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  public async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {\n    const { ids } = doc || {};\n    const resp = await this.execCtx('detail', { ids });\n\n    const idsArray = [ids];\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v, i) => ({\n        vod_id: String((v.vod_id || idsArray[i]) ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_year: String(v.vod_year ?? ''),\n        vod_lang: v.vod_lang ?? '',\n        vod_area: v.vod_area ?? '',\n        vod_score: String(v.vod_score ?? '0.0'),\n        vod_state: v.vod_state ?? '', // '正片' | '预告' | '花絮'\n        vod_class: v.vod_class ?? '', // '电影' | '电视剧' | '综艺' | '动漫' | '纪录片' | '其他'\n        vod_actor: v.vod_actor ?? '',\n        vod_director: v.vod_director ?? '',\n        vod_content: (v.vod_content ?? '')?.trim(),\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_play_from: v.vod_play_from ?? '',\n        vod_play_url: v.vod_play_url ?? '',\n        type_name: v.type_name ?? '',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || 1;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  public async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {\n    const { wd, page = 1 } = doc || {};\n    const resp = await this.execCtx('search', { wd, page });\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || page;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  public async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {\n    const { flag, play } = doc || {};\n    const resp = await this.execCtx('play', { flag, play });\n\n    const qs = resp?.parse_extra;\n    const scriptObj = qs ? Object.fromEntries(new URLSearchParams(qs)) : {};\n\n    const res = {\n      url: resp?.url || '',\n      quality: resp.quality || [],\n      parse: resp.parse || 0,\n      jx: resp.jx || 0,\n      headers: resp?.header || resp?.headers || {},\n      script: Object.keys(scriptObj).length\n        ? {\n            ...(resp.js ? { runScript: resp.js } : {}),\n            ...(scriptObj.init_script ? { initScript: scriptObj.init_script } : {}),\n            ...(scriptObj.custom_regex ? { customRegex: scriptObj.custom_regex } : {}),\n            ...(scriptObj.sniffer_exclude ? { snifferExclude: scriptObj.sniffer_exclude } : {}),\n          }\n        : {},\n    };\n\n    return res;\n  }\n\n  async action(doc: ICmsParams['action']): ICmsResultPromise['action'] {\n    const { action, value, timeout } = doc || {};\n    const resp = await this.execCtx('action', { action, value, timeout });\n    return resp;\n  }\n\n  async proxy(doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {\n    const resp = await this.execCtx('proxy', doc);\n    return resp;\n  }\n\n  public async runMain(doc: ICmsParams['runMain']): ICmsResultPromise['runMain'] {\n    const resp = await this.execCtx('runMain', doc);\n    return resp;\n  }\n}\n\nexport default T3DrpyAdapter;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Drpy/inject.ts",
    "content": "import { Buffer } from 'node:buffer';\n\nimport { batchFetch, fetch } from '@main/utils/hiker/request/syncFetch';\nimport { headersPascalCase } from '@shared/modules/headers';\n\nconst hasPropertyIgnoreCase = (obj: Record<string, string>, propertyName: string) => {\n  return Object.keys(obj).some((key) => key.toLowerCase() === propertyName.toLowerCase());\n};\n\nconst valueStartsWith = (obj: Record<string, string>, propertyName: string, prefix: string) => {\n  const key = Object.keys(obj).find((key) => key.toLowerCase() === propertyName.toLowerCase());\n  return key !== undefined && obj[key].startsWith(prefix);\n};\n\nconst req = (url: string, cobj: Record<string, any>): { content: string; headers?: Record<string, string> } => {\n  const obj = { ...cobj };\n\n  if (obj.data) {\n    obj.body = obj.data;\n    const isForm =\n      obj.postType === 'form' ||\n      (hasPropertyIgnoreCase(obj.headers, 'Content-Type') &&\n        valueStartsWith(obj.headers, 'Content-Type', 'application/x-www-form-urlencoded'));\n\n    if (isForm) {\n      obj.body = new URLSearchParams(obj.data).toString();\n    }\n    delete obj.data;\n  }\n\n  if (Object.hasOwn(obj, 'redirect')) obj.redirect = !!obj.redirect;\n  if (obj.buffer === 2) obj.toHex = true;\n\n  if (url === 'https://api.nn.ci/ocr/b64/text' && obj.headers) {\n    obj.headers['Content-Type'] = 'text/plain';\n  }\n  obj.headers = headersPascalCase(obj.headers);\n\n  const res: { content: string; headers?: Record<string, string> } = { content: '' };\n  let resp: any = fetch(url, obj);\n  if (obj.withHeaders) {\n    resp = JSON.parse(resp!);\n    res.content = resp.body;\n    res.headers = Object.fromEntries(Object.entries(resp.headers || {}).map(([k, v]) => [k, v?.[0]]));\n  } else {\n    res.content = resp!;\n  }\n\n  if (obj.buffer === 2) {\n    res.content = Buffer.from(resp!.body, 'hex').toString('base64');\n  }\n\n  return res;\n};\n\nexport { batchFetch, req };\nexport { joinUrl, local, pd, pdfa, pdfh } from '@main/utils/hiker';\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Drpy/templates.ts",
    "content": "// Common lazy load script for video URL extraction\nconst commonLazy = `js:\n  let html = request(input);\n  let hconf = html.match(/r player_.*?=(.*?)</)[1];\n  let json = JSON5.parse(hconf);\n  let url = json.url;\n  if (json.encrypt == '1') {\n    url = unescape(url);\n  } else if (json.encrypt == '2') {\n    url = unescape(base64Decode(url));\n  }\n  if (/\\\\.(m3u8|mp4|m4a|mp3)/.test(url)) {\n    input = { parse: 0, jx: 0, url: url };\n  } else {\n    input = url && url.startsWith('http') && tellIsJx(url) ? { parse: 0, jx: 1, url: url } : input;\n  }`;\n\n// Default lazy load script\nconst defLazy = `js: input = { parse: 1, url: input, js: '' };`;\n\n// Collection lazy load script\nconst cjLazy = `js:\n  if (/\\\\.(m3u8|mp4)/.test(input)) {\n    input = { parse: 0, url: input };\n  } else {\n    if (rule.parse_url.startsWith('json:')) {\n      let purl = rule.parse_url.replace('json:', '') + input;\n      let html = request(purl);\n      let json = JSON.parse(html);\n      if (json.url) {\n        input = { parse: 0, url: json.url };\n      }\n    } else {\n      input = rule.parse_url + input;\n    }\n  }`;\n\n// Function to get template configurations\nexport const templates = {\n  mx: {\n    title: '',\n    host: '',\n    url: '/vodshow/fyclass--------fypage---/',\n    searchUrl: '/vodsearch/**----------fypage---/',\n    class_parse: '.top_nav li;a&&Text;a&&href;.*/(.*?)/',\n    searchable: 2,\n    quickSearch: 0,\n    filterable: 0,\n    headers: {\n      'User-Agent': 'MOBILE_UA',\n    },\n    play_parse: true,\n    lazy: commonLazy,\n    limit: 6,\n    double: true,\n    推荐: '.cbox_list;*;*;*;*;*',\n    一级: 'ul.vodlist li;a&&title;a&&data-original;.pic_text&&Text;a&&href',\n    二级: {\n      title: 'h2&&Text;.content_detail:eq(1)&&li&&a:eq(2)&&Text',\n      img: '.vodlist_thumb&&data-original',\n      desc: '.content_detail:eq(1)&&li:eq(1)&&Text;.content_detail:eq(1)&&li&&a&&Text;.content_detail:eq(1)&&li&&a:eq(1)&&Text;.content_detail:eq(1)&&li:eq(2)&&Text;.content_detail:eq(1)&&li:eq(3)&&Text',\n      content: '.content_desc&&span&&Text',\n      tabs: '.play_source_tab&&a',\n      lists: '.content_playlist:eq(#id) li',\n    },\n    搜索: '*',\n  },\n  mxpro: {\n    title: '',\n    host: '', // homeUrl:'/',\n    url: '/vodshow/fyclass--------fypage---.html',\n    searchUrl: '/vodsearch/**----------fypage---.html',\n    searchable: 2, // 是否启用全局搜索,\n    quickSearch: 0, // 是否启用快速搜索,\n    filterable: 0, // 是否启用分类筛选,\n    headers: {\n      // 网站的请求头,完整支持所有的,常带ua和cookies\n      'User-Agent': 'MOBILE_UA', // \"Cookie\": \"searchneed=ok\"\n    },\n    class_parse: '.navbar-items li:gt(0):lt(10);a&&Text;a&&href;/(\\\\d+)',\n    play_parse: true,\n    lazy: commonLazy,\n    limit: 6,\n    double: true, // 推荐内容是否双层定位\n    推荐: '.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href',\n    一级: 'body a.module-poster-item.module-item;a&&title;.lazyload&&data-original;.module-item-note&&Text;a&&href',\n    二级: {\n      title: 'h1&&Text;.module-info-tag-link:eq(-1)&&Text',\n      img: '.lazyload&&data-original||data-src||src',\n      desc: '.module-info-item:eq(-2)&&Text;.module-info-tag-link&&Text;.module-info-tag-link:eq(1)&&Text;.module-info-item:eq(2)&&Text;.module-info-item:eq(1)&&Text',\n      content: '.module-info-introduction&&Text',\n      tabs: '.module-tab-item',\n      lists: '.module-play-list:eq(#id) a',\n      tab_text: 'div--small&&Text',\n    },\n    搜索: 'body .module-item;.module-card-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href;.module-info-item-content&&Text',\n  },\n  mxone5: {\n    title: '',\n    host: '',\n    url: '/show/fyclass--------fypage---.html',\n    searchUrl: '/search/**----------fypage---.html',\n    searchable: 2, // 是否启用全局搜索,\n    quickSearch: 0, // 是否启用快速搜索,\n    filterable: 0, // 是否启用分类筛选,\n    class_parse: '.nav-menu-items&&li;a&&Text;a&&href;.*/(.*?).html',\n    play_parse: true,\n    lazy: commonLazy,\n    limit: 6,\n    double: true, // 推荐内容是否双层定位\n    推荐: '.module-list;.module-items&&.module-item;a&&title;img&&data-src;.module-item-text&&Text;a&&href',\n    一级: '.module-items .module-item;a&&title;img&&data-src;.module-item-text&&Text;a&&href',\n    二级: {\n      title: 'h1&&Text;.tag-link&&Text',\n      img: '.module-item-pic&&img&&data-src',\n      desc: '.video-info-items:eq(3)&&Text;.tag-link:eq(2)&&Text;.tag-link:eq(1)&&Text;.video-info-items:eq(1)&&Text;.video-info-items:eq(0)&&Text',\n      content: '.vod_content&&Text',\n      tabs: '.module-tab-item',\n      lists: '.module-player-list:eq(#id)&&.scroll-content&&a',\n      tab_text: 'div--small&&Text',\n    },\n    搜索: '.module-items .module-search-item;a&&title;img&&data-src;.video-serial&&Text;a&&href',\n  },\n  首图: {\n    title: '',\n    host: '',\n    url: '/vodshow/fyclass--------fypage---/',\n    searchUrl: '/vodsearch/**----------fypage---.html',\n    searchable: 2, // 是否启用全局搜索,\n    quickSearch: 0, // 是否启用快速搜索,\n    filterable: 0, // 是否启用分类筛选,\n    headers: {\n      // 网站的请求头,完整支持所有的,常带ua和cookies\n      'User-Agent': 'MOBILE_UA', // \"Cookie\": \"searchneed=ok\"\n    },\n    class_parse: '.myui-header__menu li.hidden-sm:gt(0):lt(7);a&&Text;a&&href;/(\\\\d+).html',\n    play_parse: true,\n    lazy: commonLazy,\n    limit: 6,\n    double: true, // 推荐内容是否双层定位\n    推荐: 'ul.myui-vodlist.clearfix;li;a&&title;a&&data-original;.pic-text&&Text;a&&href',\n    一级: '.myui-vodlist li;a&&title;a&&data-original;.pic-text&&Text;a&&href',\n    二级: {\n      title: '.myui-content__detail .title--span&&Text;.myui-content__detail p.data:eq(3)&&Text',\n      img: '.myui-content__thumb .lazyload&&data-original',\n      desc: '.myui-content__detail p.otherbox&&Text;.year&&Text;.myui-content__detail p.data:eq(4)&&Text;.myui-content__detail p.data:eq(2)&&Text;.myui-content__detail p.data:eq(0)&&Text',\n      content: '.content&&Text',\n      tabs: '.myui-panel__head&&li',\n      // tabs: '.nav-tabs&&li',\n      lists: '.myui-content__list:eq(#id) li',\n    },\n    搜索: '#searchList li;a&&title;.lazyload&&data-original;.pic-text&&Text;a&&href;.detail&&Text',\n  },\n  首图2: {\n    title: '',\n    host: '',\n    url: '/list/fyclass-fypage.html',\n    searchUrl: '/vodsearch/**----------fypage---.html',\n    searchable: 2, // 是否启用全局搜索,\n    quickSearch: 0, // 是否启用快速搜索,\n    filterable: 0, // 是否启用分类筛选,\n    headers: {\n      'User-Agent': 'UC_UA', // \"Cookie\": \"\"\n    },\n    class_parse: '.stui-header__menu li:gt(0):lt(7);a&&Text;a&&href;.*/(.*?).html',\n    play_parse: true,\n    lazy: commonLazy,\n    limit: 6,\n    double: true, // 推荐内容是否双层定位\n    推荐: 'ul.stui-vodlist.clearfix;li;a&&title;.lazyload&&data-original;.pic-text&&Text;a&&href',\n    一级: '.stui-vodlist li;a&&title;a&&data-original;.pic-text&&Text;a&&href',\n    二级: {\n      title: '.stui-content__detail .title&&Text;.stui-content__detail&&p:eq(-2)&&a&&Text',\n      title1: '.stui-content__detail .title&&Text;.stui-content__detail&&p&&Text',\n      img: '.stui-content__thumb .lazyload&&data-original',\n      desc: '.stui-content__detail p&&Text;.stui-content__detail&&p:eq(-2)&&a:eq(2)&&Text;.stui-content__detail&&p:eq(-2)&&a:eq(1)&&Text;.stui-content__detail p:eq(2)&&Text;.stui-content__detail p:eq(1)&&Text',\n      desc1: '.stui-content__detail p:eq(4)&&Text;;;.stui-content__detail p:eq(1)&&Text',\n      content: '.detail&&Text',\n      tabs: '.stui-pannel__head h3',\n      tabs1: '.stui-vodlist__head h3',\n      lists: '.stui-content__playlist:eq(#id) li',\n    },\n    搜索: 'ul.stui-vodlist__media,ul.stui-vodlist,#searchList li;a&&title;.lazyload&&data-original;.pic-text&&Text;a&&href;.detail&&Text',\n  },\n  默认: {\n    title: '',\n    host: '',\n    url: '',\n    searchUrl: '',\n    searchable: 2,\n    quickSearch: 0,\n    filterable: 0,\n    filter: '',\n    filter_url: '',\n    filter_def: {},\n    headers: {\n      'User-Agent': 'MOBILE_UA',\n    },\n    timeout: 5000,\n    class_parse: '#side-menu li;a&&Text;a&&href;/(.*?).html',\n    cate_exclude: '',\n    play_parse: true,\n    lazy: defLazy,\n    double: true,\n    推荐: '列表1;列表2;标题;图片;描述;链接;详情',\n    一级: '列表;标题;图片;描述;链接;详情',\n    二级: {\n      title: 'vod_name;vod_type',\n      img: '图片链接',\n      desc: '主要信息;年代;地区;演员;导演',\n      content: '简介',\n      tabs: '',\n      lists: 'xx:eq(#id)&&a',\n      tab_text: 'body&&Text',\n      list_text: 'body&&Text',\n      list_url: 'a&&href',\n    },\n    搜索: '列表;标题;图片;描述;链接;详情',\n  },\n  vfed: {\n    title: '',\n    host: '',\n    url: '/index.php/vod/show/id/fyclass/page/fypage.html',\n    searchUrl: '/index.php/vod/search/page/fypage/wd/**.html',\n    searchable: 2, // 是否启用全局搜索,\n    quickSearch: 0, // 是否启用快速搜索,\n    filterable: 0, // 是否启用分类筛选,\n    headers: {\n      'User-Agent': 'UC_UA',\n    },\n    class_parse: '.fed-pops-navbar&&ul.fed-part-rows&&a;a&&Text;a&&href;.*/(.*?).html',\n    play_parse: true,\n    lazy: commonLazy,\n    limit: 6,\n    double: true, // 推荐内容是否双层定位\n    推荐: 'ul.fed-list-info.fed-part-rows;li;a.fed-list-title&&Text;a&&data-original;.fed-list-remarks&&Text;a&&href',\n    一级: '.fed-list-info&&li;a.fed-list-title&&Text;a&&data-original;.fed-list-remarks&&Text;a&&href',\n    二级: {\n      title: 'h1.fed-part-eone&&Text;.fed-deta-content&&.fed-part-rows&&li&&Text',\n      img: '.fed-list-info&&a&&data-original',\n      desc: '.fed-deta-content&&.fed-part-rows&&li:eq(1)&&Text;.fed-deta-content&&.fed-part-rows&&li:eq(2)&&Text;.fed-deta-content&&.fed-part-rows&&li:eq(3)&&Text',\n      content: '.fed-part-esan&&Text',\n      tabs: '.fed-drop-boxs&&.fed-part-rows&&li',\n      lists: '.fed-play-item:eq(#id)&&ul:eq(1)&&li',\n    },\n    搜索: '.fed-deta-info;h1&&Text;.lazyload&&data-original;.fed-list-remarks&&Text;a&&href;.fed-deta-content&&Text',\n  },\n  海螺3: {\n    title: '',\n    host: '',\n    searchUrl: '/v_search/**----------fypage---.html',\n    url: '/vod_____show/fyclass--------fypage---.html',\n    headers: {\n      'User-Agent': 'MOBILE_UA',\n    },\n    timeout: 5000,\n    class_parse: 'body&&.hl-nav li:gt(0);a&&Text;a&&href;.*/(.*?).html',\n    cate_exclude: '明星|专题|最新|排行',\n    limit: 40,\n    play_parse: true,\n    lazy: commonLazy,\n    double: true,\n    推荐: '.hl-vod-list;li;a&&title;a&&data-original;.remarks&&Text;a&&href',\n    一级: '.hl-vod-list&&.hl-list-item;a&&title;a&&data-original;.remarks&&Text;a&&href',\n    二级: {\n      title: '.hl-dc-title&&Text;.hl-dc-content&&li:eq(6)&&Text',\n      img: '.hl-lazy&&data-original',\n      desc: '.hl-dc-content&&li:eq(10)&&Text;.hl-dc-content&&li:eq(4)&&Text;.hl-dc-content&&li:eq(5)&&Text;.hl-dc-content&&li:eq(2)&&Text;.hl-dc-content&&li:eq(3)&&Text',\n      content: '.hl-content-text&&Text',\n      tabs: '.hl-tabs&&a',\n      tab_text: 'a--span&&Text',\n      lists: '.hl-plays-list:eq(#id)&&li',\n    },\n    搜索: '.hl-list-item;a&&title;a&&data-original;.remarks&&Text;a&&href',\n    searchable: 2, // 是否启用全局搜索,\n    quickSearch: 0, // 是否启用快速搜索,\n    filterable: 0, // 是否启用分类筛选,\n  },\n  海螺2: {\n    title: '',\n    host: '',\n    searchUrl: '/index.php/vod/search/page/fypage/wd/**/',\n    url: '/index.php/vod/show/id/fyclass/page/fypage/',\n    headers: {\n      'User-Agent': 'MOBILE_UA',\n    },\n    timeout: 5000,\n    class_parse: '#nav-bar li;a&&Text;a&&href;id/(.*?)/',\n    limit: 40,\n    play_parse: true,\n    lazy: commonLazy,\n    double: true,\n    推荐: '.list-a.size;li;a&&title;.lazy&&data-original;.bt&&Text;a&&href',\n    一级: '.list-a&&li;a&&title;.lazy&&data-original;.list-remarks&&Text;a&&href',\n    二级: {\n      title: 'h2&&Text;.deployment&&Text',\n      img: '.lazy&&data-original',\n      desc: '.deployment&&Text',\n      content: '.ec-show&&Text',\n      tabs: '#tag&&a',\n      lists: '.play_list_box:eq(#id)&&li',\n    },\n    搜索: '.search-list;a&&title;.lazy&&data-original;.deployment&&Text;a&&href',\n    searchable: 2, // 是否启用全局搜索,\n    quickSearch: 0, // 是否启用快速搜索,\n    filterable: 0, // 是否启用分类筛选,\n  },\n  短视: {\n    title: '',\n    host: '', // homeUrl:'/',\n    url: '/channel/fyclass-fypage.html',\n    searchUrl: '/search.html?wd=**',\n    searchable: 2, // 是否启用全局搜索,\n    quickSearch: 0, // 是否启用快速搜索,\n    filterable: 0, // 是否启用分类筛选,\n    headers: {\n      // 网站的请求头,完整支持所有的,常带ua和cookies\n      'User-Agent': 'MOBILE_UA', // \"Cookie\": \"searchneed=ok\"\n    },\n    class_parse: '.menu_bottom ul li;a&&Text;a&&href;.*/(.*?).html',\n    cate_exclude: '解析|动态',\n    play_parse: true,\n    lazy: commonLazy,\n    limit: 6,\n    double: true, // 推荐内容是否双层定位\n    推荐: '.indexShowBox;ul&&li;a&&title;img&&data-src;.s1&&Text;a&&href',\n    一级: '.pic-list&&li;a&&title;img&&data-src;.s1&&Text;a&&href',\n    二级: {\n      title: 'h1&&Text;.content-rt&&p:eq(0)&&Text',\n      img: '.img&&img&&data-src',\n      desc: '.content-rt&&p:eq(1)&&Text;.content-rt&&p:eq(2)&&Text;.content-rt&&p:eq(3)&&Text;.content-rt&&p:eq(4)&&Text;.content-rt&&p:eq(5)&&Text',\n      content: '.zkjj_a&&Text',\n      tabs: '.py-tabs&&option',\n      lists: '.player:eq(#id) li',\n    },\n    搜索: '.sr_lists&&ul&&li;h3&&Text;img&&data-src;.int&&p:eq(0)&&Text;a&&href',\n  },\n  短视2: {\n    title: '',\n    host: '',\n    class_name: '电影&电视剧&综艺&动漫',\n    class_url: '1&2&3&4',\n    searchUrl: '/index.php/ajax/suggest?mid=1&wd=**&limit=50',\n    searchable: 2,\n    quickSearch: 0,\n    headers: { 'User-Agent': 'MOBILE_UA' },\n    url: '/index.php/api/vod#type=fyclass&page=fypage',\n    filterable: 0, // 是否启用分类筛选,\n    filter_url: '',\n    filter: {},\n    filter_def: {},\n    detailUrl: '/index.php/vod/detail/id/fyid.html',\n    play_parse: true,\n    lazy: commonLazy,\n    limit: 6,\n    推荐: '.list-vod.flex .public-list-box;a&&title;.lazy&&data-original;.public-list-prb&&Text;a&&href',\n    一级: 'js:let body=input.split(\"#\")[1];let t=Math.round(new Date/1e3).toString();let key=md5(\"DS\"+t+\"DCC147D11943AF75\");let url=input.split(\"#\")[0];body=body+\"&time=\"+t+\"&key=\"+key;print(body);fetch_params.body=body;let html=post(url,fetch_params);let data=JSON.parse(html);VODS=data.list.map(function(it){it.vod_pic=urljoin2(input.split(\"/i\")[0],it.vod_pic);return it});',\n    二级: {\n      title: '.slide-info-title&&Text;.slide-info:eq(2)--strong&&Text',\n      img: '.detail-pic&&data-original',\n      desc: '.slide-info-remarks&&Text;.slide-info-remarks:eq(1)&&Text;.slide-info-remarks:eq(2)&&Text;.slide-info:eq(1)--strong&&Text;.info-parameter&&ul&&li:eq(3)&&Text',\n      content: '#height_limit&&Text',\n      tabs: '.anthology.wow.fadeInUp.animated&&.swiper-wrapper&&a',\n      tab_text: 'a--span&&Text',\n      lists: '.anthology-list-box:eq(#id) li',\n    },\n    搜索: 'json:list;name;pic;;id',\n  },\n  采集1: {\n    title: '',\n    host: '',\n    homeTid: '13',\n    homeUrl: '/api.php/provide/vod/?ac=detail&t={{rule.homeTid}}',\n    detailUrl: '/api.php/provide/vod/?ac=detail&ids=fyid',\n    searchUrl: '/api.php/provide/vod/?wd=**&pg=fypage',\n    url: '/api.php/provide/vod/?ac=detail&pg=fypage&t=fyclass',\n    headers: { 'User-Agent': 'MOBILE_UA' },\n    timeout: 5000, // class_name: '电影&电视剧&综艺&动漫',\n    // class_url: '1&2&3&4',\n    // class_parse:'js:let html=request(input);input=JSON.parse(html).class;',\n    class_parse: 'json:class;',\n    limit: 20,\n    multi: 1,\n    searchable: 2, // 是否启用全局搜索,\n    quickSearch: 1, // 是否启用快速搜索,\n    filterable: 0, // 是否启用分类筛选,\n    play_parse: true,\n    parse_url: '',\n    lazy: cjLazy,\n    推荐: '*',\n    一级: 'json:list;vod_name;vod_pic;vod_remarks;vod_id;vod_play_from',\n    二级: `js:\n      let html=request(input);\n      html=JSON.parse(html);\n      let data=html.list;\n      VOD=data[0];`,\n    搜索: '*',\n  },\n};\n\nexport const renderTemplate = {\n  templates,\n  detail: (name: string): string => {\n    const text = templates?.[name] || templates['默认'];\n    return `var rule = ${JSON.stringify(text, null, 2)}`;\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Drpy/worker.ts",
    "content": "import { isJsonStr, isNil } from '@shared/modules/validate';\nimport workerpool from 'workerpool';\n\nimport drpy from './drpy2.min';\n\nconst { action, category, detail, home, homeVod, init, play, proxy, search } = drpy;\n\n['log', 'info', 'warn', 'error', 'debug'].forEach((method) => {\n  const level = method === 'log' ? 'verbose' : method;\n  console[method] = (...msgRaw: any[]) => {\n    const msg = {\n      type: msgRaw.length > 1 ? 'multiple' : 'single',\n      msg: msgRaw,\n    };\n    workerpool.workerEmit({ type: 'log', level, msg });\n  };\n});\n\nconst handlers: Record<string, (options?: Record<string, any>) => Promise<any>> = {\n  async init(options) {\n    const resp = init(options);\n    const res = isJsonStr(resp) ? JSON.parse(resp) : resp;\n    return res;\n  },\n\n  async home() {\n    const resp = home();\n    const res = isJsonStr(resp) ? JSON.parse(resp) : resp;\n    return res;\n  },\n\n  async homeVod() {\n    const resp = homeVod();\n    const res = isJsonStr(resp) ? JSON.parse(resp) : resp;\n    return res;\n  },\n\n  async category(options) {\n    const { tid, page, extend } = options!;\n    const resp = category(tid, page, Object.keys(extend).length > 0, Object.keys(extend).length > 0 ? extend : {});\n    const res = isJsonStr(resp) ? JSON.parse(resp) : resp;\n    return res;\n  },\n\n  async detail(options) {\n    const { ids } = options!;\n    const resp = detail(ids);\n    const res = isJsonStr(resp) ? JSON.parse(resp) : resp;\n    return res;\n  },\n\n  async play(options) {\n    const { flag, play: input } = options!;\n    const resp = play(flag, input, []);\n    const res = isJsonStr(resp) ? JSON.parse(resp) : resp;\n    return res;\n  },\n\n  async search(options) {\n    const { wd, page } = options!;\n    const resp = search(wd, false, page);\n    const res = isJsonStr(resp) ? JSON.parse(resp) : resp;\n    return res;\n  },\n\n  async action(options) {\n    const { action: method, value, timeout } = options!;\n    if (timeout && timeout > 0) globalThis.variable = { timeout };\n    else delete globalThis.variable?.timeout;\n    const resp = action(method, value);\n    const res = isJsonStr(resp) ? JSON.parse(resp) : resp;\n    return res;\n  },\n\n  async proxy(options) {\n    const resp = proxy(options);\n    const res = isJsonStr(resp) ? JSON.parse(resp) : resp;\n    return res;\n  },\n};\n\nconst main = async (type: string, options?: Record<string, any>) => {\n  try {\n    const handler = handlers[type];\n    if (isNil(handler)) throw new Error(`Method not found for type: ${type}`);\n    return await handler(options);\n  } catch (error) {\n    console.error((error as Error).message);\n    throw error;\n  }\n};\n\nworkerpool.worker({ main });\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Py.ts",
    "content": "import { join } from 'node:path';\n\nimport { loggerService } from '@logger';\nimport { PythonService } from '@main/services/PythonService';\nimport { APP_PUBLIC_PATH } from '@main/utils/path';\nimport { request } from '@main/utils/request';\nimport { SITE_LOGGER_MAP, SITE_TYPE } from '@shared/config/film';\nimport { isJson } from '@shared/modules/validate';\nimport type { ICmsParams, ICmsResultPromise, IConstructorOptions } from '@shared/types/cms';\nimport workerpool from 'workerpool';\nimport * as zmq from 'zeromq';\n\nconst logger = loggerService.withContext(SITE_LOGGER_MAP[SITE_TYPE.T3_PY]);\n\nzmq.context.blocky = false;\n\nconst loggerModule = async (port: number) => {\n  const workerpool = await import('workerpool');\n  const zmq = await import('zeromq');\n\n  zmq.context.blocky = false;\n\n  const sock = new zmq.Subscriber();\n  sock.linger = 0;\n  sock.connect(`tcp://127.0.0.1:${port}`);\n  sock.subscribe('');\n\n  for await (const [msgRaw] of sock) {\n    try {\n      const msg = JSON.parse(msgRaw.toString());\n      workerpool.workerEmit({ type: 'log', level: 'verbose', msg });\n    } catch {\n      workerpool.workerEmit({ type: 'log', level: 'error', msg: 'Failed to parse log message' });\n    }\n  }\n};\n\nclass ConnectService extends PythonService {\n  private static instance: ConnectService;\n\n  private pool: workerpool.Pool | null = null;\n  private socket: zmq.Request | null = null;\n  private pids: number[] = [];\n\n  private readonly ctrlPort: number = 19979;\n  private readonly logPort: number = this.ctrlPort + 1;\n\n  public static getInstance(): ConnectService {\n    if (!ConnectService.instance) {\n      ConnectService.instance = new ConnectService({\n        projectBasePath: join(APP_PUBLIC_PATH, 't3PyBase'),\n      });\n    }\n    return ConnectService.instance;\n  }\n\n  private async connectLogger(): Promise<void> {\n    if (this.pool) return;\n\n    try {\n      const pool = workerpool.pool({\n        maxWorkers: 1,\n        workerType: 'process',\n        forkOpts: { silent: true },\n      });\n\n      await pool.exec(loggerModule, [this.logPort], {\n        on(payload) {\n          const { type, level, msg } = payload;\n\n          if (type === 'log') {\n            const msgType = msg?.type;\n            const msgList = msg?.msg ?? [];\n\n            const log =\n              msgType === 'single'\n                ? msgList[0]\n                : msgList.map((t: any) => (isJson(t) ? JSON.stringify(t) : t)).join(' ');\n\n            logger[level](log);\n          }\n        },\n      });\n\n      this.pool = pool;\n    } catch (error) {\n      this.pool = null;\n      throw new Error(`Failed to connect to Python logger service: ${error}`);\n    }\n  }\n\n  private async connectApi(): Promise<void> {\n    if (this.socket) return;\n\n    try {\n      const ctrlSocket = new zmq.Request();\n      ctrlSocket.linger = 0;\n      ctrlSocket.connect(`tcp://127.0.0.1:${this.ctrlPort}`);\n      this.socket = ctrlSocket;\n    } catch (error) {\n      this.socket = null;\n      throw new Error(`Failed to connect to Python api service: ${error}`);\n    }\n  }\n\n  private async connect(): Promise<void> {\n    this.connectLogger();\n    await this.connectApi();\n  }\n\n  public async prepare(): Promise<void> {\n    this.checkBinary();\n    await this.installDep();\n\n    const pids = await this.matchPort(this.ctrlPort);\n\n    if (pids.length) {\n      this.pids = pids;\n      await this.connect();\n      return;\n    }\n\n    try {\n      await new Promise((resolve, reject) =>\n        this.runSpawn(['main.py', '--ctrl-port', String(this.ctrlPort)], true, {\n          stdoutCb: async () => {\n            const pids = await this.matchPort(this.ctrlPort);\n            if (pids.length) {\n              this.pids = pids;\n              await this.connect();\n              resolve('Python t3Py service started successfully');\n            }\n            reject(new Error('Process did not start as expected'));\n          },\n        }),\n      );\n    } catch (error) {\n      throw new Error(`Failed to start Python t3Py service: ${error}`);\n    }\n  }\n\n  public async terminate(): Promise<void> {\n    try {\n      // ctrl socket\n      if (this.socket) this.socket.close();\n      this.socket = null;\n\n      // log socket\n      if (this.pool) await this.pool.terminate(true);\n      this.pool = null;\n\n      // process\n      if (!this.pids.length) {\n        const pids = await this.matchPort(this.ctrlPort);\n        if (pids.length) this.pids = pids;\n      }\n\n      if (this.pids.length) await this.killProcess(this.pids);\n      this.pids = [];\n    } catch (error) {\n      logger.error('Error during termination:', error as Error);\n    }\n  }\n\n  public getSocket(): zmq.Request | null {\n    return this.socket;\n  }\n}\n\nconst connectService = ConnectService.getInstance();\n\nexport class T3PyAdapter {\n  categories: string[] = [];\n  api: string = '';\n  ext: string = '';\n\n  code: string = '';\n\n  constructor(source: IConstructorOptions) {\n    this.api = source.api!;\n    this.ext = source.ext!;\n    this.categories = source.categories;\n  }\n\n  public static async prepare(): Promise<void> {\n    await connectService.prepare();\n  }\n\n  public static async terminate(): Promise<void> {\n    await connectService.terminate();\n  }\n\n  private async execCtx(type: string, options: any[] = []): Promise<any> {\n    const socket = connectService.getSocket();\n    if (!socket) {\n      throw new Error('Socket is not initialized.');\n    }\n\n    await socket.send(JSON.stringify({ code: this.code, type, options }));\n\n    const [reply] = await socket.receive();\n    const result = JSON.parse(reply.toString());\n\n    if (result?.error) throw new Error(result.error);\n\n    return result;\n  }\n\n  async init(): ICmsResultPromise['init'] {\n    let content = '';\n    if (this.api.startsWith('http')) {\n      const { data } = await request.request({ url: this.api, method: 'GET' });\n      content = data;\n    }\n    this.code = content;\n\n    const resp = await this.execCtx('init', [this.ext]);\n    return resp;\n  }\n\n  async home(): ICmsResultPromise['home'] {\n    const resp = await this.execCtx('homeContent', [true]);\n\n    const rawClassList = Array.isArray(resp?.class) ? resp.class : [];\n    const classes = rawClassList\n      .map((item) => ({\n        type_id: String(item.type_id ?? '').trim(),\n        type_name: item.type_name?.toString().trim() ?? '',\n      }))\n      .filter(\n        (item, index, self) =>\n          item.type_id &&\n          item.type_name &&\n          !this.categories?.includes(item.type_name) &&\n          self.findIndex((other) => other.type_id === item.type_id) === index,\n      );\n    const classIds = classes.map((item) => item.type_id);\n\n    const rawFiltersObj = resp?.filters && Object.keys(resp?.filters).length ? resp.filters : {};\n    const filters = Object.keys(rawFiltersObj).reduce((acc, key) => {\n      if (String(key) && classIds.includes(String(key))) {\n        acc[String(key)] = rawFiltersObj[key];\n      }\n      return acc;\n    }, {});\n\n    return { class: classes, filters };\n  }\n\n  async homeVod(): ICmsResultPromise['homeVod'] {\n    const resp = await this.execCtx('homeVideoContent', []);\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || 1;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async category(doc: ICmsParams['category']): ICmsResultPromise['category'] {\n    const { tid, page = 1, extend = {} } = doc || {};\n    const resp = await this.execCtx('categoryContent', [tid, page, Object.keys(extend).length > 0, extend]);\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || page;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {\n    const { ids } = doc || {};\n    const resp = await this.execCtx('detailContent', [[ids]]);\n\n    const idsArray = [ids];\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v, i) => ({\n        vod_id: String((v.vod_id || idsArray[i]) ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_year: String(v.vod_year ?? ''),\n        vod_lang: v.vod_lang ?? '',\n        vod_area: v.vod_area ?? '',\n        vod_score: String(v.vod_score ?? '0.0'),\n        vod_state: v.vod_state ?? '', // '正片' | '预告' | '花絮'\n        vod_class: v.vod_class ?? '', // '电影' | '电视剧' | '综艺' | '动漫' | '纪录片' | '其他'\n        vod_actor: v.vod_actor ?? '',\n        vod_director: v.vod_director ?? '',\n        vod_content: (v.vod_content ?? '')?.trim(),\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_play_from: v.vod_play_from ?? '',\n        vod_play_url: v.vod_play_url ?? '',\n        type_name: v.type_name ?? '',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || 1;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {\n    const { wd, page = 1 } = doc || {};\n    const resp = await this.execCtx('searchContent', [wd, false, page]);\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || page;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {\n    const { flag, play } = doc || {};\n    const resp = await this.execCtx('playerContent', [flag, play, []]);\n\n    const qs = resp?.parse_extra;\n    const scriptObj = qs ? Object.fromEntries(new URLSearchParams(qs)) : {};\n\n    const res = {\n      url: resp?.url || '',\n      quality: resp.quality || [],\n      parse: resp.parse || 0,\n      jx: resp.jx || 0,\n      headers: resp?.header || resp?.headers || {},\n      script: Object.keys(scriptObj).length\n        ? {\n            ...(resp.js ? { runScript: resp.js } : {}),\n            ...(scriptObj.init_script ? { initScript: scriptObj.init_script } : {}),\n            ...(scriptObj.custom_regex ? { customRegex: scriptObj.custom_regex } : {}),\n            ...(scriptObj.sniffer_exclude ? { snifferExclude: scriptObj.sniffer_exclude } : {}),\n          }\n        : {},\n    };\n\n    return res;\n  }\n\n  async action(doc: ICmsParams['action']): ICmsResultPromise['action'] {\n    const { action, value, timeout } = doc || {};\n    const resp = await this.execCtx('actionContent', [action, value, timeout]);\n    return resp;\n  }\n\n  async proxy(doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {\n    const resp = await this.execCtx('localProxy', [doc]);\n    return resp;\n  }\n\n  async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain'] {\n    return '';\n  }\n}\n\nexport default T3PyAdapter;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Xbpq/index.ts",
    "content": "import { loggerService } from '@logger';\nimport * as XBPQParse from '@main/utils/hiker/ruleParse';\nimport { MOBILE_UA, PC_UA } from '@main/utils/hiker/ua';\nimport { request } from '@main/utils/request';\nimport { SITE_LOGGER_MAP, SITE_TYPE } from '@shared/config/film';\nimport { hash } from '@shared/modules/crypto';\nimport { getHome, urlResolve } from '@shared/modules/headers';\nimport type { ICmsParams, ICmsResultPromise, IConstructorOptions } from '@shared/types/cms';\nimport JSON5 from 'json5';\n\nimport {\n  removeChars,\n  removeDuplicatesByValue,\n  removeTagsExceptList,\n  replaceTagsWithMapping,\n  stringex,\n} from './methods';\nimport { autoRule, extRule, searchmap } from './rule';\n\nconst logger = loggerService.withContext(SITE_LOGGER_MAP[SITE_TYPE.T3_XBPQ]);\n\nstringex();\n\nfunction stringtoJson(obj) {\n  const text = obj.ext;\n  const regex = /([^:,]+):([^,]+)/g;\n  const result = {};\n  let match;\n  while (true) {\n    match = regex.exec(text);\n    if (match === null) break;\n    result[match[1]] = match[2];\n  }\n  delete obj.text;\n  return Object.assign(obj, result);\n}\n\n/**\n *处理HTML实体字符\n */\nfunction htmlEntitiesToText(htmlString) {\n  // 定义一个 HTML 实体到字符的映射表\n  const entities = {\n    '&lt;': '<',\n    '&gt;': '>',\n    '&amp;': '&',\n    '&quot;': '\"',\n    '&apos;': \"'\",\n  };\n\n  // 使用正则表达式和映射表替换 HTML 实体\n  return htmlString.replace(/&(#x[\\da-f]+|#\\d+|[a-z]+);/gi, (match) => {\n    // 如果实体在映射表中，则替换它\n    if (entities[match]) {\n      return entities[match];\n    } else {\n      // 如果实体不在映射表中，尝试解码十进制或十六进制实体\n      const code = match.startsWith('&#x')\n        ? match.substring(3, match.length - 1)\n        : match.substring(2, match.length - 1);\n      if (match.startsWith('&#x')) {\n        // 十六进制实体\n        return String.fromCharCode(Number.parseInt(code, 16));\n      } else if (match.startsWith('&#')) {\n        // 十进制实体\n        return String.fromCharCode(Number.parseInt(code, 10));\n      }\n      // 如果都不是，则返回原实体（虽然这可能不是一个有效的实体）\n      return match;\n    }\n  });\n}\n\n/**\n *文本# $ 转换对象\n */\nfunction parseStringToObject(inputString) {\n  const obj = {};\n  const keyValuePairs = inputString.split('#');\n  keyValuePairs.forEach((pair) => {\n    const [key, value] = pair.split('$');\n    if (key && value) {\n      obj[key] = value.trim();\n    }\n  });\n\n  return obj;\n}\n\n/**\n * 对象转querystring\n */\nfunction objToQueryString(obj, shouldEncode?) {\n  // 如果第二个参数是true，则进行编码\n  const encode = typeof shouldEncode === 'boolean' ? shouldEncode : false;\n  return Object.keys(obj)\n    .map(function (key) {\n      if (encode) {\n        return `${encodeURIComponent(key)}=${encodeURIComponent(obj[key])}`;\n      } else {\n        return `${key}=${obj[key]}`;\n      }\n    })\n    .join('&');\n}\n\n// @ts-expect-error declared but its value is never read\n// eslint-disable-next-line ts/no-unused-vars\nfunction findMostCommonStructure(urls) {\n  const pathCount = {};\n  // 提取每个URL的路径部分并统计\n  urls.forEach((url) => {\n    // 假设URL的结构是http://example.com/ + path\n    const path = url.split('//')[1].split('/')[1]; // 取http://example.com/之后的部分\n    if (!pathCount[path]) {\n      pathCount[path] = 0;\n    }\n    pathCount[path] += 1;\n  });\n  // 找出出现次数最多的路径\n  let maxCount = 0;\n  let mostCommonPath = '';\n  for (const path in pathCount) {\n    if (pathCount[path] > maxCount) {\n      maxCount = pathCount[path];\n      mostCommonPath = path;\n    }\n  }\n  return mostCommonPath;\n}\n\nfunction findIndicesOfElementsWithNumbers(arr) {\n  // 使用正则表达式来检测字符串中是否包含数字\n  const regex = /\\d/;\n  // 使用 map 方法来遍历数组，并返回包含数字的元素的索引\n  const indices = arr\n    .map((element, index) => {\n      // 检查元素是否包含数字\n      if (typeof element === 'string' && !regex.test(element)) {\n        // 如果包含数字，返回索引\n        return index;\n      }\n      // 如果不包含数字，不返回任何值\n      return null;\n    })\n    .filter((index) => index !== null); // 过滤掉 null 值\n  return indices;\n}\n\nfunction findMostCommonBaseStructure(urls) {\n  const pathCount = {};\n  // 提取每个URL的路径部分，不包括查询参数\n  urls.forEach((url) => {\n    // const path = String(new URL(url).getPath()); // 只取路径部分\n    // let baseStructure = path.split('/').slice(1, -1).join('/'); // 去掉开头的'/'和末尾的文件名或ID\n    let baseStructure = url.split('?')[0].split('/').slice(3, -1).join('/');\n    if (baseStructure.includes('-')) {\n      const temp = baseStructure.split('-');\n      baseStructure = temp[findIndicesOfElementsWithNumbers(temp)[0]];\n      // logger.info(baseStructure)\n    }\n    // logger.info(baseStructure)\n    if (!pathCount[baseStructure]) {\n      pathCount[baseStructure] = 0;\n    }\n    pathCount[baseStructure] += 1;\n  });\n  // 找出出现次数最多的基础结构\n  let maxCount = 0;\n  let mostCommonBaseStructure = '';\n  for (const base in pathCount) {\n    if (pathCount[base] > maxCount) {\n      maxCount = pathCount[base];\n      mostCommonBaseStructure = base;\n    }\n  }\n  return mostCommonBaseStructure;\n}\n\nfunction convertMultipleUnicodeEscapedWords(str) {\n  const unicodeEscapeWordRegex = /\\\\u[a-fA-F0-9]{4}(?:\\\\u[a-fA-F0-9]{4})*/g;\n  return str.replace(unicodeEscapeWordRegex, (match) => {\n    return match.replace(/\\\\u([a-fA-F0-9]{4})/g, (_seq, p1) => {\n      return String.fromCharCode(Number.parseInt(p1, 16));\n    });\n  });\n}\n\nfunction collapseSpacesAndTrim(str) {\n  str = str.replace(/\\r\\n|\\r|\\n/g, '');\n  str = str.replace(/\\s+/g, ' ');\n  str = str.trim();\n  str = str.replace(/&nbsp;/g, ' ');\n  str = convertMultipleUnicodeEscapedWords(str);\n  str = str.replace(/\\s+/g, ' ');\n  return str;\n}\n\nfunction optimizeHtmlContent(htmlString) {\n  // 替换多个连续的<br>标签为一个\n  htmlString = htmlString.replace(/(<br>\\s*){2,}/g, '<br>');\n  // 以下是其他可能的优化步骤（可选）\n  // 移除开头和结尾的空白字符\n  htmlString = htmlString.replace(/^\\s+|\\s+$/g, '');\n  // 移除不必要的空白字符，如多个连续的空白字符\n  htmlString = htmlString.replace(/\\s{2,}/g, ' ');\n  // 返回优化后的HTML内容\n  return htmlString;\n}\n\nfunction removeSingleAngleBrackets(inputString) {\n  // 正则表达式匹配单独的 < 或 > 符号，不包括标签内的\n  return inputString.replace(/<([^>]+)>|<([^>])|([^<])>/g, function (match, p1, _p2, p3) {\n    // 如果匹配到完整的标签，则保留\n    if (p1) {\n      return match;\n    }\n    if (/[。，]/.test(p3)) {\n      return p3;\n    }\n    // 如果是单独的 < 或 > 符号，则移除\n    return '';\n  });\n}\n\nfunction extractUrlParts(url) {\n  const regex = /^(?:([a-z]+):\\/\\/)?(?:(\\w+:\\w+)@)?([\\w.-]+)(?::(\\d+))?(\\/[^?#]*)?/i;\n  const match = url.match(regex);\n\n  if (match) {\n    return {\n      protocol: match[1] || 'http', // 默认协议为http\n      auth: match[2],\n      host: match[3],\n      port: match[4],\n      path: match[5] || '/',\n    };\n  }\n  return null;\n}\n\n// @ts-expect-error declared but its value is never read\n// eslint-disable-next-line ts/no-unused-vars\nfunction findLongindex(arrays) {\n  let maxLength = 0;\n  let index = 0;\n  // const longestSubset = [];\n  arrays.forEach((subArray, i) => {\n    if (subArray.length > maxLength) {\n      maxLength = subArray.length;\n      index = i;\n    }\n  });\n  return index;\n}\n\n// @ts-expect-error declared but its value is never read\n// eslint-disable-next-line ts/no-unused-vars\nfunction isNestedArray(arr) {\n  return arr.some((item) => Array.isArray(item));\n}\n\nfunction mergeStringsToJSON(str1, str2, type) {\n  // 将 str1 按照 \"&\" 分割成数组\n  const sstr2 = str2;\n  const arr1 = str1.split('&');\n  if (arr1[0] !== '全部' && str2 === '*' && type !== 'by') {\n    arr1.unshift('全部$');\n  }\n  if (str2 === '*') {\n    str2 = undefined;\n  }\n  // 如果 str2 为空，初始化 arr2 为 arr1 的副本，每个元素的 \"$\" 后的部分为空字符串\n  const arr2 = str2 ? str2.split('&') : arr1.map((item) => (item.includes('$') ? item.split('$')[1] : item));\n  // 检查 arr1 和 arr2 的长度是否相等\n  if (str2 && arr1.length !== arr2.length) {\n    return;\n  }\n  if (arr1[0] !== '全部' && arr2[0] !== '' && sstr2 !== '*' && type !== 'by') {\n    arr1.unshift('全部');\n    arr2.unshift('');\n  }\n  // 初始化结果数组\n  const result: any[] = [];\n  // 遍历 arr1 和 arr2\n  for (let i = 0; i < arr1.length; i++) {\n    const item1 = arr1[i].split('$')[0]; // 获取 \"$\" 前的值\n    const item2 = arr2[i] || ''; // 获取 \"$\" 后的值或默认为空字符串\n    // 将处理后的 arr1 和 arr2 的元素添加到结果数组\n    result.push({\n      n: item1,\n      v: item2,\n    });\n  }\n  return result;\n}\n\nfunction getFilter(i, rule, name) {\n  const aliasMap = new Map([\n    ['电影', new Set(['电影', '電影'])],\n    ['连续剧', new Set(['连续剧', '連續劇', /[剧劇]集/, /[电電][视視][剧劇]/])],\n    ['综艺', new Set(['综艺', '綜藝', /综艺/])],\n    ['动漫', new Set(['动漫', '動漫'])],\n    ['纪录片', new Set(['纪录片'])],\n  ]);\n\n  function getOriginalByAlias(key) {\n    for (const [k, v] of aliasMap) {\n      for (const it of v) {\n        if (it instanceof RegExp) {\n          // 正则表达;\n          if (it.test(key)) {\n            return k;\n          }\n        } else {\n          // 字符串;\n          if (it === key) {\n            return k;\n          }\n        }\n      }\n    }\n    return key; // 原始值\n  }\n  name = getOriginalByAlias(name);\n\n  const items = new Map();\n  const tempArray: any[] = [];\n  const mapp = new Map([\n    ['类型', 'cateId'],\n    ['剧情', 'class'],\n    ['地区', 'area'],\n    ['年份', 'year'],\n    ['语言', 'lang'],\n    ['字母', 'letter'],\n    ['排序', 'by'],\n  ]);\n  mapp.forEach((v, k, _m) => {\n    let item = rule.getRuleValue([k]);\n    const value = rule.getRuleValue([`${k}值`]);\n\n    if (item && item !== '*') {\n      if (item.includes('||')) {\n        item = item.split('||');\n        // eslint-disable-next-line array-callback-return\n        item.map((n, ni) => {\n          if (n.includes('--')) {\n            const parts = n.split('--');\n            // parts[1] = \"全部$&\" + parts[1];\n            items.set(parts[0], {\n              v: parts[1],\n              index: ni,\n            });\n          }\n        });\n        if (items.size > 0) {\n          item = items.get(name);\n          if (typeof item == 'object') {\n            item = item.v;\n          }\n        } else {\n          item = item[i];\n        }\n      }\n      if (item === '空') {\n        return;\n      }\n      if (item && item.includes('#')) {\n        item = item.split('#').map((it) => {\n          if (it.includes('$')) {\n            const parts = it.split('$');\n            return {\n              n: parts[0],\n              v: parts[1],\n            };\n          } else {\n            return {\n              n: it,\n              v: it,\n            };\n          }\n        });\n        if (item[0].n !== '全部' && v !== 'by') {\n          item.unshift({\n            n: '全部',\n            v: '',\n          });\n        }\n      }\n      if (item && /^\\d+-\\d+$/.test(item)) {\n        const [s, e] = item.split('-').map(Number);\n        item = Array.from(\n          {\n            length: e - s + 1,\n          },\n          (_, i) => e - i,\n        ).join('&');\n      }\n\n      if (item && item.includes('&')) {\n        item = mergeStringsToJSON(item, value, v);\n      }\n      if (!item) {\n        return;\n      }\n      tempArray.push({\n        key: v,\n        name: k,\n        value: item,\n      });\n    }\n  });\n  return tempArray;\n}\n\nclass T3XbpqAdapter {\n  private rule: Record<string, any> = {};\n  private source = {} as IConstructorOptions;\n  private XBPQRule: Record<string, any> = {};\n  private target = '';\n  private categories: string[] = [];\n\n  constructor(source: IConstructorOptions) {\n    this.source = source;\n    this.categories = source.categories;\n\n    this.XBPQRule = source.ext! as unknown as Record<string, any>;\n    if (typeof this.XBPQRule?.ext !== 'object') {\n      this.XBPQRule = stringtoJson(this.XBPQRule);\n    }\n    // if (source.click) {\n    //   this.XBPQRule.click = source.click;\n    // }\n    // if (source.lazy) {\n    //   this.XBPQRule.lazy = source.lazy;\n    // }\n\n    this.rule = {\n      name: source.name,\n      host: source.api,\n      play_parse: true,\n      一级: 'true',\n      推荐: 'true',\n      类型: '影视',\n      switchs: '',\n      snifferw: '',\n      exsnifferw: '',\n      // 模板: \"自动\"\n    };\n  }\n\n  async init(): ICmsResultPromise['init'] {\n    let res = this.source.ext;\n    if (this.source.ext!.startsWith('http')) {\n      const { data } = await request.request({\n        url: this.source.ext!,\n        method: 'GET',\n        responseType: 'text',\n        headers: {\n          'User-Agent': 'okhttp/4.12.0',\n        },\n      });\n      res = data;\n    }\n    try {\n      res = JSON5.parse(res!);\n      this.XBPQRule = Object.assign(this.XBPQRule, res);\n    } catch {}\n\n    this.rule.headers = {};\n    const 主页url = this.getRuleValue(['主页url'], '');\n    const 分类url = getHome(this.getRuleValue(['分类url']));\n\n    let url = 主页url;\n    if (主页url === '') {\n      url = 分类url;\n    }\n\n    this.rule.host = getHome(url);\n    this.rule.URL = extractUrlParts(this.rule.host);\n    let turl = this.getRuleValue(['分类url']);\n    turl = this.splitTextWithSingleBracket(turl).filter((e) => e)[0];\n    if (turl.includes(';;')) {\n      const temp = turl.split(';;');\n      turl = temp[0];\n      this.rule.switchs = temp[1];\n      this.setSwitchs(this.rule.switchs);\n    }\n    if (this.getRuleValue(['hikerListCol'])) {\n      this.rule.hikerListCol = this.getRuleValue(['hikerListCol']);\n    }\n    if (this.getRuleValue(['hikerClassListCol'])) {\n      this.rule.hikerClassListCol = this.getRuleValue(['hikerClassListCol']);\n    }\n\n    let 首页 = this.getRuleValue(['首页']);\n    let 分类 = this.getRuleValue(['分类']);\n\n    if (分类.startsWith('http')) {\n      logger.info(`获取远程分类url: ${分类}`);\n      const tmp = await this.req(分类);\n      try {\n        const json = JSON.parse(tmp);\n        if (Object.hasOwn(json, 'class')) {\n          分类 = json.class\n            .map((x) => {\n              return `${x.type_name}$${x.type_id}`;\n            })\n            .join('#');\n          this.XBPQRule['分类'] = 分类;\n          logger.info(分类);\n        }\n      } catch {}\n    }\n\n    const nowYear = new Date().getFullYear();\n    const years: string[] = [];\n    for (let i = 0; i < 15; i++) {\n      years[i] = `${nowYear - i}$${nowYear - i}`;\n    }\n    autoRule['年份'] = years.join('#');\n\n    const 主分类: Array<{ type_name: string; type_id: string }> = [];\n    if (分类.includes('$')) {\n      for (const c of 分类.split('#')) {\n        const d = c.split('$');\n        主分类.push({\n          type_name: d[0],\n          type_id: d[1],\n        });\n      }\n    } else if (分类.includes('&') && this.getRuleValue(['分类值'])) {\n      const typenames = 分类.split('&');\n      const typeids = this.getRuleValue(['分类值']).split('&');\n      for (const i in typeids) {\n        主分类.push({\n          type_name: typenames[i],\n          type_id: typeids[i],\n        });\n      }\n    }\n\n    const 分类数组 = this.getRuleValue(['分类数组']);\n\n    if (主分类.length === 0 && 分类数组) {\n      const autoContent = this.AutoContent();\n      logger.info('获取分类中...');\n      const mainurl = autoContent.isEmpty(['主页url']) ? this.getRuleValue(['主页url']) : this.rule.host;\n      logger.info('主页url:', mainurl);\n      let html = await this.req(mainurl);\n      html = autoContent.splitStr(html, ['分类二次截取'], {\n        twice: true,\n      }) as string;\n      const class数组 = XBPQParse.getSplitArray(html, 分类数组);\n      const list: any[] = [];\n      if (class数组.length) {\n        class数组.forEach((item) => {\n          const 分类标题 = XBPQParse.getHasRuleSplitStr(item, this.getRuleValue(['分类标题'], '>&&</a'));\n          // logger.info(分类标题)\n          const 分类id = XBPQParse.getHasRuleSplitStr(item, this.getRuleValue(['分类ID']));\n          // logger.info(分类id)\n          if (分类id) {\n            list.push(`${分类标题}$${分类id}`);\n          }\n        });\n        this.XBPQRule['分类'] = list.join('#');\n        logger.info(this.XBPQRule['分类']);\n      }\n    }\n\n    const clurl = this.getRuleValue(['分类url']);\n\n    if (clurl.includes('{class}') && !this.getRuleValue(['剧情'])) {\n      this.XBPQRule['剧情'] = autoRule['剧情'];\n    }\n    if (clurl.includes('{year}') && !this.getRuleValue(['年份'])) {\n      this.XBPQRule['年份'] = autoRule['年份'];\n    }\n    if (clurl.includes('{area}') && !this.getRuleValue(['地区'])) {\n      this.XBPQRule['地区'] = autoRule['地区'];\n    }\n    if (clurl.includes('{by}') && !this.getRuleValue(['排序'])) {\n      this.XBPQRule['排序'] = autoRule['排序'];\n    }\n    if (首页) {\n      if (首页.includes('$')) {\n        const temp = 首页.split('$');\n        首页 = temp[0];\n      }\n\n      let tid;\n      const cid = 主分类.findIndex((x) => 首页 === x.type_name);\n      if (cid !== -1) {\n        tid = 主分类[cid].type_id;\n        this.rule['主页surl'] = turl.replace('{cateId}', tid).replace('{catePg}', '1');\n      }\n    }\n\n    let filters = {};\n\n    if (this.getRuleValue(['筛选']) === '1' || this.getRuleValue(['筛选']) === '') {\n      主分类.forEach((it, i) => {\n        const tid = it.type_id;\n        filters[tid] = getFilter(i, this, it.type_name);\n      });\n\n      filters = Object.fromEntries(Object.entries(filters).filter(([_key, value]) => (value as any[]).length > 0));\n      this.XBPQRule['筛选'] = filters;\n    }\n\n    let ua = this.getRuleValue(['请求头', 'ua', 'UserAgent'], '电脑');\n    // logger.info(ua)\n    if (ua === '手机') {\n      ua =\n        'Mozilla/5.0 (Linux; Android 11; Ghxi Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/76.0.3809.89 Mobile Safari/537.36';\n    } else if (ua === '电脑') {\n      ua =\n        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36';\n    } else if (ua.includes('$')) {\n      ua = ua.split('$')[1];\n      if (ua === 'PC_UA') {\n        ua = PC_UA;\n      }\n      if (ua === 'MOBILE_UA') {\n        ua = MOBILE_UA;\n      }\n    }\n\n    const playheads = this.getRuleValue(['播放请求头']);\n    if (playheads) {\n      this.rule.playheads = parseStringToObject(playheads);\n    }\n    const lazy = this.getRuleValue(['lazy']);\n    if (lazy) {\n      this.rule.lazy = lazy;\n    }\n\n    const click = this.getRuleValue(['click']);\n    if (click) {\n      this.rule.js = click;\n    }\n    const snifferw = this.getRuleValue(['嗅探词']);\n    if (snifferw) {\n      this.rule.snifferw = snifferw.replace(/#/g, '|');\n    }\n    const exsnifferw = this.getRuleValue(['过滤词']);\n    if (exsnifferw) {\n      this.rule.exsnifferw = exsnifferw.replace(/#/g, '|');\n    }\n\n    this.rule.headers['User-Agent'] = ua;\n    if (this.getRuleValue(['Cookie'])) {\n      this.rule.headers.Cookie = this.getRuleValue(['Cookie']);\n    }\n    if (this.getRuleValue(['Referer'])) {\n      this.rule.headers.Referer = this.getRuleValue(['Referer']);\n    }\n    if (this.getRuleValue(['头部集合', 'User'])) {\n      const heads = this.getRuleValue(['头部集合', 'User']).split('#');\n      for (const head of heads) {\n        const [k, v] = head.split('$');\n        this.rule.headers[k] = v;\n      }\n    }\n    if (this.getRuleValue(['解析'])) {\n      const jx = parseStringToObject(this.getRuleValue(['解析']));\n      this.rule['解析'] = jx;\n    }\n    if (this.getRuleValue(['直接播放']) === '1') {\n      this.rule['二级'] = '*';\n      if (!this.rule.playheads) {\n        this.rule.playheads = this.rule.headers;\n      }\n      if (!this.rule.playheads.Referer) {\n        this.rule.playheads.Referer = this.rule.host;\n      }\n    }\n  }\n\n  async home(): ICmsResultPromise['home'] {\n    const classData = this.getRuleValue(['分类']);\n    const rawClassList: Array<{ type_id: string; type_name: string }> = [];\n\n    if (classData.includes('$')) {\n      for (let c of classData.split('#')) {\n        c = c.split('$') as any;\n        rawClassList.push({\n          type_id: c[1],\n          type_name: c[0],\n        });\n      }\n    } else if (classData.includes('&') && this.getRuleValue(['分类值'])) {\n      const typenames = classData.split('&');\n      const typeids = this.getRuleValue(['分类值']).split('&');\n      for (const i in typeids) {\n        rawClassList.push({\n          type_id: typeids[i],\n          type_name: typenames[i],\n        });\n      }\n    }\n\n    const classes = rawClassList\n      .map((item) => ({\n        type_id: String(item.type_id ?? '').trim(),\n        type_name: item.type_name?.toString().trim() ?? '',\n      }))\n      .filter(\n        (item, index, self) =>\n          item.type_id &&\n          item.type_name &&\n          !this.categories?.includes(item.type_name) &&\n          self.findIndex((other) => other.type_id === item.type_id) === index,\n      );\n    const classIds = classes.map((item) => item.type_id);\n    // logger.info(this.getRuleValue([\"筛选\"]))\n\n    const rawFilters = this.getRuleValue(['筛选'], {});\n    const rawFiltersObj = rawFilters && Object.keys(rawFilters).length ? rawFilters : {};\n    const filters = Object.keys(rawFiltersObj).reduce((acc, key) => {\n      if (String(key) && classIds.includes(String(key))) {\n        acc[String(key)] = rawFiltersObj[key];\n      }\n      return acc;\n    }, {});\n\n    this.rule.class = { class: classes, filters };\n    logger.info(this.rule);\n    return { class: classes, filters };\n  }\n\n  async homeVod(): ICmsResultPromise['homeVod'] {\n    const 主页url = this.getRuleValue(['主页url'], '');\n    const 分类url = getHome(this.getRuleValue(['分类url']));\n    const 主页surl = this.rule['主页surl'] || '';\n    let url = 主页url;\n    if (主页url === '') {\n      url = 分类url;\n    }\n    if (主页surl !== '') {\n      url = 主页surl;\n    }\n    // logger.info(\"home\", url);\n\n    const list = (await this.一级(url, '首页')) ?? [];\n    // try {\n    //   list = (await this.一级(url, '首页')).list;\n    //   if (list.length > 100) {\n    //     list = list.slice(0, 99);\n    //   }\n    // } catch (err) {\n    //   logger.info(`一级加载出错:${err}`);\n    // }\n\n    const rawList = Array.isArray(list) ? list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = 1;\n    const pagecount = videos.length ? 1 : 0;\n    const total = videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async category(doc: ICmsParams['category']): ICmsResultPromise['category'] {\n    const { tid, page: pg = 1, extend = {} } = doc || {};\n\n    let host = getHome(this.getRuleValue(['分类url']));\n    if (!host.startsWith('http')) {\n      host = getHome(this.getRuleValue(['主页url']));\n    }\n    // logger.info(\"host:\" + host);\n\n    const urlMap = new Map([\n      [\n        '{class}',\n        {\n          v: ['/class/{class}'],\n        },\n      ],\n      [\n        '{area}',\n        {\n          v: ['/area/{area}'],\n        },\n      ],\n      [\n        '{year}',\n        {\n          v: ['/year/{year}'],\n        },\n      ],\n      [\n        '{area}',\n        {\n          v: ['/area/{area}'],\n        },\n      ],\n      [\n        '{lang}',\n        {\n          v: ['/lang/{lang}'],\n        },\n      ],\n      [\n        '{letter}',\n        {\n          v: ['/letter/{letter}'],\n        },\n      ],\n      [\n        '{by}',\n        {\n          v: ['/by/{by}'],\n        },\n      ],\n    ]);\n    // !! url含有[]会有问题，未解决\n    let url = this.getRuleValue(['分类url']);\n    const firstPage = this.getRuleValue(['起始页', '分类起始页码', 'qishiye', 'firstpage'], '1');\n    // if ((url.includes('[') && (url.includes('];') || /\\]$/.test(url))) || url.includes('|')) {\n    if ((url.includes('[') && (url.includes('];') || url.endsWith(']'))) || url.includes('|')) {\n      url =\n        String(pg) === firstPage\n          ? url.replace(/[^\\n\\r[|\\u2028\\u2029]*[[|].*(http[^\\]]*).*/g, '$1').replace('firstPage=', '')\n          : url.replace(/\\|\\|/g, '\\\\|').replace(/(.*)[[|].*/g, '$1');\n    }\n    // logger.info(\"f:\"+url)\n    const temp_url = this.splitTextWithSingleBracket(url);\n    // logger.info(\"f:\"+temp_url)\n    const sresult_url = host + url.replace(host, '');\n\n    if (temp_url.filter((e) => e).length > 1) {\n      if (pg === 1) {\n        url = host + temp_url[1].replace(host, '');\n      } else {\n        url = host + temp_url[0].replace(host, '');\n      }\n    } else {\n      url = sresult_url;\n    }\n\n    for (const [key, value] of urlMap) {\n      // 在这里进行判断\n      if (url.includes(key)) {\n        // logger.info(`${key}`);\n        const k = key.replace(/[{}]/g, '');\n        if (Object.hasOwn(extend, k) && extend[k] !== '') {\n          /* empty */\n        } else {\n          for (const vv of [...value.v]) {\n            if (url.includes(vv)) {\n              url = url.replace(vv, '');\n              break;\n            }\n          }\n        }\n      }\n      // 可以根据需要添加更多的判断\n    }\n    // logger.info(\"f:\"+url)\n    url = url\n      .replace('{cateId}', extend.cateId || tid || '')\n      .replace('{class}', extend.class || '')\n      .replace('{area}', extend.area || '')\n      .replace('{year}', extend.year || '')\n      .replace('{by}', extend.by || '')\n      .replace('{lang}', extend.lang || '')\n      .replace('{catePg}', String(pg))\n      .replace('{letter}', extend.letter || '');\n\n    if (url.includes(';;')) {\n      const temp = url.split(';;');\n      url = temp[0];\n    }\n\n    const list = (await this.一级(url, extend.cateId || tid)) ?? [];\n    const rawList = Array.isArray(list) ? list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = 1;\n    const pagecount = videos.length ? 999 : 0;\n    const total = videos.length ? 999 : 0;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {\n    const { ids } = doc || {};\n    const idsArray = ids.split(',');\n    let vod_url = ids || '';\n    // logger.info('vod_url', vod_url);\n    function urljoin(fromPath, nowPath) {\n      fromPath = fromPath || '';\n      nowPath = nowPath || '';\n      return urlResolve(fromPath, nowPath);\n    }\n    let vod_name;\n    let vod_pic;\n    const orId = vod_url;\n    let fyclass = '';\n    logger.info(`orId:${orId}`);\n    if (vod_url.includes('$')) {\n      const tmp = vod_url.split('$');\n      fyclass = tmp[0];\n      vod_url = tmp[1];\n    }\n\n    const detailUrl = vod_url.split('@@')[0];\n\n    logger.info(`detailUrl:${detailUrl}`);\n\n    if (vod_url.includes('@@')) {\n      const tmp = vod_url.split('@@');\n      vod_name = tmp[1];\n      vod_pic = tmp[2];\n    }\n\n    logger.info(`vod_name: ${vod_name}`);\n    logger.info(`vod_pic: ${vod_pic}`);\n\n    let url;\n    if (!detailUrl.startsWith('http') && !detailUrl.includes('/')) {\n      url = this.rule.detailUrl.replaceAll('fyid', detailUrl).replaceAll('fyclass', fyclass);\n    } else if (detailUrl.includes('/')) {\n      url = urljoin(this.rule.homeUrl, detailUrl);\n    } else {\n      url = detailUrl;\n    }\n    // logger.info(url)\n    vod_url = url;\n\n    if (this.rule['二级'] === '*') {\n      return {\n        list: [\n          {\n            vod_id: vod_url,\n            vod_name,\n            vod_pic,\n            vod_remarks: '',\n            vod_blurb: '',\n            vod_play_url: `播放视频$${vod_url}`,\n            vod_play_from: '嗅探',\n          },\n        ],\n      };\n    }\n\n    logger.info(`vod_url:${vod_url}`);\n\n    const html = await this.req(vod_url);\n    const host = getHome(vod_url);\n    const autoContent = this.AutoContent();\n\n    const lienHtml = autoContent.splitStr(html, ['线路二次截取'], {\n      twice: true,\n    });\n\n    const fromle = autoContent.splitArray(lienHtml, ['线路数组'], {\n      key: '线路数组',\n    }) as string[];\n\n    logger.info('fromle', fromle);\n\n    let from: string[] = [];\n\n    // eslint-disable-next-line array-callback-return\n    fromle.map((v) => {\n      const t = this.getRuleValue(['线路标题']);\n      let line_title = autoContent.splitStr(v, ['线路标题'], '\">&&<', {\n        type: '文本',\n        key: '线路标题',\n      });\n\n      // if (t && !/(\\+|&&)/.test(t)) {\n      if (t && !/\\+|&&/.test(t)) {\n        line_title = t;\n      }\n\n      // logger.info(line_title)\n      if (line_title != null) {\n        from.push(line_title);\n      }\n    });\n    if (from.length === 0) {\n      const tfrom = fromle.map((v) => {\n        return removeTagsExceptList(v).replace(/[<>]/g, '').trim();\n      });\n      from = tfrom;\n    }\n    from = from.filter((e) => e && e !== '');\n\n    // logger.info('from', from);\n\n    let 简介 =\n      autoContent.splitStr(html, ['简介'], {\n        type: '文本',\n        key: '简介',\n      }) || '';\n    简介 = 简介.replace(/\\\\\\\\r\\\\\\\\n/g, '<br>').replace(/\\\\n/g, '<br>');\n    // logger.info(简介)\n\n    简介 = removeSingleAngleBrackets(简介);\n    简介 = convertMultipleUnicodeEscapedWords(简介);\n    简介 = replaceTagsWithMapping(简介, {\n      br: ['span', 'p'],\n    });\n    简介 = removeTagsExceptList(简介, ['br']);\n    简介 = optimizeHtmlContent(简介);\n\n    const descs = {\n      状态:\n        autoContent.splitStr(html, ['影片状态'], autoRule['影片状态'], {\n          key: '影片状态',\n        }) || '',\n      类型:\n        autoContent.splitStr(html, ['影片类型'], autoRule['影片类型'], {\n          key: '影片类型',\n        }) || '',\n      主演:\n        autoContent.splitStr(html, ['主演'], autoRule['主演'][0], {\n          type: '文本',\n          key: '主演',\n        }) || '',\n      导演:\n        autoContent.splitStr(html, ['导演'], autoRule['导演'][0], {\n          type: '文本',\n          key: '导演',\n        }) || '',\n      年代:\n        autoContent.splitStr(html, ['影片年代'], autoRule['影片年代'], {\n          key: '影片年代',\n        }) || '',\n      地区:\n        autoContent.splitStr(html, ['影片地区'], autoRule['影片地区'], {\n          key: '影片地区',\n        }) || '',\n    };\n    // logger.info(descs)\n\n    for (const key in descs) {\n      if (descs[key] !== '') {\n        let item = removeTagsExceptList(descs[key]);\n        item = collapseSpacesAndTrim(item);\n        item = item.replace(/简介[:：].*/, '');\n        if (key !== '状态') {\n          item = item.replace(/更新[:：].*/, '');\n        }\n        if (key !== '导演') {\n          item = item.replace(/导演[:：].*/, '');\n        }\n        if (key !== '主演') {\n          item = item.replace(/主演[:：].*/, '');\n        }\n        if (key !== '类型') {\n          item = item.replace(/类型[:：].*/, '');\n        }\n        descs[key] = item;\n      }\n    }\n\n    logger.info('descs', descs);\n\n    // logger.info(vod_pic)\n\n    const list: any[] = [];\n    const resitem: { [key: string]: any } = {\n      vod_id: vod_url,\n      vod_name,\n      vod_year: descs.年代,\n      vod_pic,\n      vod_remarks: descs.状态,\n      vod_area: descs.地区,\n      vod_content: 简介,\n      vod_actor: descs.主演,\n      vod_director: descs.导演,\n    };\n\n    // const play = [];\n\n    if (!autoContent.isEmpty('跳转数组')) {\n      this.XBPQRule['多线数组'] = this.getRuleValue(['跳转数组']);\n      this.XBPQRule['链接数组'] = this.getRuleValue(['链接数组']);\n    }\n\n    const 多线 = autoContent.splitStr(lienHtml, ['多线二次截取'], {\n      twice: true,\n    });\n\n    const 多线数组 = (XBPQParse.getSplitArray(多线, this.getRuleValue(['多线数组'])) || []).map((v) => {\n      const { ihost: ithost, getUrl } = this.prefixORsuffix(html, '多线', host);\n      let url = XBPQParse.getSplitStr(v, this.getRuleValue(['多线链接'], 'href=\"&&\"'), ithost);\n      url = getUrl(url);\n      return url;\n    });\n    if (多线数组.length) {\n      logger.info('多线数组', 多线数组);\n    }\n\n    let bfs = [];\n    let htmls: string[] = [];\n    const plays: string[] = [];\n    if (多线数组.length) {\n      const start_time = Date.now();\n      logger.info('多线程开始');\n      const heads = this.rule.headers;\n      bfs = 多线数组.map((url) => ({\n        options: heads,\n        url,\n      }));\n      // htmls = (await batchRequest(bfs)).data;\n      htmls = (await Promise.allSettled(\n        bfs.map(async (u) => {\n          try {\n            const { data } = await request.request(u);\n            return data;\n          } catch {\n            return '';\n          }\n        }),\n      )) as any[];\n      const end_time = Date.now() - start_time;\n      logger.info(`多线程结束,耗时: ${end_time}`);\n    }\n    // logger.info(htmls.length)\n\n    const surls = new Set();\n\n    function getplaylist(html, playHtmlArr, i, rule) {\n      // logger.info(Object.keys(rule))\n\n      const { ihost: phost, getUrl: pgetUrl } = rule.prefixORsuffix(html, '播放', host);\n      const playlist: any[] = [];\n      // let tplaylist = XBPQParse.getSplitArray(playHtmlArr[i], rule.getRuleValue([\"播放列表\"], autoRule[\"播放列表\"]));\n      // logger.info(playHtmlArr[i])\n      const tplaylist = autoContent.splitArray(playHtmlArr[i], ['播放列表'], autoRule['播放列表']);\n      // logger.info(\"播放列表\", tplaylist)\n      // logger.info(tplaylist.length)\n\n      for (const v of tplaylist) {\n        // logger.info(v)\n\n        let title = autoContent.splitStr(v, ['播放标题'], 'title=\"&&\"', {\n          type: '文本',\n          key: '播放标题',\n        });\n        // logger.info(title)\n        if (title == null) {\n          title = v.replace(/.*>/g, '');\n          title = removeChars(title, '\\n').trim();\n        }\n        // logger.info(title)\n\n        let url = autoContent.splitStr(v, ['播放链接'], autoRule['播放链接'], {\n          host: phost,\n          type: '链接',\n          key: '播放链接',\n        });\n\n        url = pgetUrl(url);\n        // logger.info(url);\n        if (url === '' || url?.includes('javascript')) {\n          continue;\n        }\n        const it = `${title}$${url}`;\n        // logger.info(it)\n        if (!surls.has(url)) {\n          surls.add(url);\n        } else {\n          continue;\n        }\n        playlist.push(it);\n      }\n      return playlist;\n    }\n\n    if (htmls.length === 0) {\n      htmls = [html];\n    } else {\n      htmls = [html, ...htmls];\n    }\n    // logger.info(htmls.length)\n\n    htmls.forEach((ithml) => {\n      /* let playHtml = ithml;\n      if (this.getRuleValue([\"播放二次截取\"])) {\n        playHtml = XBPQParse.getHasRuleSplitStr(ithml, this.getRuleValue([\"播放二次截取\"]));\n      }\n      logger.info(\"playHtml\", playHtml)\n      if (playHtml == null) {\n        playHtml = ithml;\n      } */\n\n      const playHtml = autoContent.splitStr(ithml, ['播放二次截取'], {\n        twice: true,\n      });\n\n      /* let playHtmlArr = XBPQParse.getSplitArray(playHtml, this.getRuleValue([\"播放数组\"])); */\n      const playHtmlArr: any = autoContent.splitArray(playHtml, ['播放数组'], {\n        key: '播放数组',\n      });\n\n      logger.info('playHtmlArr', playHtmlArr.length);\n      // logger.info(playHtmlArr)\n\n      /* if (playHtmlArr.length == 0) {\n        playHtmlArr = this.loopTest(lienHtml, \"数组\", \"播放数组\")\n      } */\n\n      for (const i in playHtmlArr) {\n        const playlist = getplaylist(ithml, playHtmlArr, i, this);\n        if (this.rule['倒序'] === '1') {\n          playlist.reverse();\n        }\n        plays.push(playlist.join('#'));\n      }\n    });\n    // logger.info(plays);\n\n    const lists = plays.filter((e) => e && e !== '');\n    // logger.info(lists)\n\n    logger.info(lists.map((x) => x.split('#').length));\n\n    // const originalFrom = from;\n    from = from.slice(0, lists.length);\n\n    // if (!from.length && autoContent.isEmpty([\"线路标题\"])) {\n    //   from = [this.getRuleValue([\"线路标题\"])];\n    // }\n\n    // if (!from.length || !lists.length) {\n    //   logger.info(\"AI匹配\");\n    //   let ailist = AiMatching.match(vod_url, html);\n    //   from = [];\n    //   lists = [];\n    //   let xi = 0;\n    //   for (let it of ailist) {\n    //     let oform = originalFrom.at(xi);\n    //     from.push(oform || (\"线路\" + (xi + 1)));\n    //     lists.push(it.map(v => v.text + \"$\" + v.url).join(\"#\"));\n    //     xi++;\n    //   }\n    // }\n\n    resitem.vod_play_from = from.join('$$$');\n    resitem.vod_play_url = lists.join('$$$');\n    list.push(resitem);\n\n    logger.info(list);\n\n    const rawList = Array.isArray(list) ? list : [];\n    const videos = rawList\n      .map((v, i) => ({\n        vod_id: String((v.vod_id || idsArray[i]) ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_year: String(v.vod_year ?? ''),\n        vod_lang: v.vod_lang ?? '',\n        vod_area: v.vod_area ?? '',\n        vod_score: String((v.vod_score || v.vod_douban_score) ?? '0.0'),\n        vod_state: v.vod_state ?? '', // '正片' | '预告' | '花絮'\n        vod_class: v.vod_class ?? '', // '电影' | '电视剧' | '综艺' | '动漫' | '纪录片' | '其他'\n        vod_actor: v.vod_actor ?? '',\n        vod_director: v.vod_director ?? '',\n        vod_content: (v.vod_content ?? '')?.trim(),\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_play_from: v.vod_play_from ?? '',\n        vod_play_url: v.vod_play_url ?? '',\n        type_name: v.type_name ?? '',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = 1;\n    const pagecount = videos.length ? 1 : 0;\n    const total = videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {\n    const { wd, page = 1 } = doc;\n    let url = this.getRuleValue(['搜索url'], '/index.php/ajax/suggest?mid=1&wd={wd}&limit=500');\n    url = url.replace('{wd}', wd).replace('{pg}', String(page)).replace('{catePg}', String(page));\n    const host = this.rule.host;\n    let surl = url;\n    if (!surl.startsWith('http')) {\n      surl = host + surl;\n    }\n    logger.info(`${this.rule.name} 'search:'${surl}`);\n    let html: string = await this.req(surl);\n    const autoContent = this.AutoContent();\n    const ctype = '搜索';\n    // if (this.getRuleValue([\"搜索二次截取\"])) {\n    //   html = XBPQParse.getSplitStr(html, this.getRuleValue([\"搜索二次截取\"]));\n    // }\n\n    html = autoContent.splitStr(html, ['搜索二次截取'], {\n      twice: true,\n    })!;\n    // logger.info(html)\n\n    const htmlList = autoContent.splitArray(html, ['搜索数组', '数组'], {\n      key: '数组',\n      ctype,\n    });\n\n    // logger.info(htmlList)\n\n    // let htmlList = XBPQParse.getSplitArray(html, this.getRuleValue([\"搜索数组\", \"数组\"], \"<a &&</a>\"));\n\n    let list: any[] = [];\n    for (const item of htmlList) {\n      // let name = XBPQParse.getSplitStr(item, this.getRuleValue([\"搜索标题\", \"标题\"], 'title=\"&&\"'));\n      const name = autoContent.splitStr(item, ['搜索标题', '标题'], 'title=\"&&\"', {\n        type: '文本',\n        key: '标题',\n        ctype,\n      });\n\n      let remarks = autoContent.splitStr(item, ['搜索副标题', '副标题'], {\n        type: '文本',\n        key: '标题',\n        ctype,\n      });\n\n      if (remarks) {\n        remarks = remarks.replace(/[<>]/g, '');\n      }\n\n      if (name == null) {\n        continue;\n      }\n\n      // let vod_pic = XBPQParse.getSplitStr(item, this.getRuleValue([\"搜索图片\", \"图片\"], item.includes(\"original\") ? 'original=\"&&\"' : '<img src=\"&&\"'), host);\n\n      const vod_pic = autoContent.splitStr(item, ['搜索图片', '图片'], {\n        type: '图片',\n        key: '图片',\n        host,\n        ctype,\n      });\n\n      // vod_pic = this.normalizeUrl(vod_pic);\n\n      const { ihost, getUrl } = this.prefixORsuffix(item, '搜索', host);\n\n      let vod_id = autoContent.splitStr(item, ['搜索链接', '链接'], 'href=\"&&\"', {\n        host: ihost,\n        ctype,\n      });\n\n      // let vod_id = XBPQParse.getSplitStr(item, this.getRuleValue([\"搜索链接\", \"链接\"], 'href=\"&&\"'), ihost);\n      if (vod_id) {\n        vod_id = getUrl(vod_id);\n      }\n\n      if (vod_id?.startsWith('/')) {\n        vod_id = host + vod_id;\n      }\n\n      list.push({\n        vod_id,\n        vod_ids: `搜索` + `$${vod_id}@@${name}@@${vod_pic}`,\n        vod_name: name,\n        vod_pic,\n        vod_remarks: remarks,\n      });\n    }\n    list = removeDuplicatesByValue(list, 'vod_id').filter((x) => x.vod_name !== '首页' && !x.vod_id.includes(';'));\n\n    if (list.length) {\n      list = list.map((x) => {\n        x.vod_id = x.vod_ids;\n        return x;\n      });\n    }\n\n    // if (list.length) {\n    //   logger.info('searchlist:', list.slice(0, 3));\n    // }\n\n    const rawList = Array.isArray(list) ? list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = page;\n    const pagecount = videos.length ? 999 : 0;\n    const total = videos.length ? 999 : 0;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {\n    const { flag, play } = doc;\n    let input = play;\n\n    // @ts-expect-error declared but its value is never read\n    let parse_extra = '';\n\n    // @ts-expect-error declared but its value is never read\n    let jx: number = 0;\n    const headers = this.rule.playheads;\n    let parse = this.rule.playParse;\n    const jxs = this.rule['解析'];\n    const p_exrta: Record<string, any> = {};\n    if (this.rule.snifferw) {\n      p_exrta.custom_regex = this.rule.snifferw;\n    }\n    if (this.rule.exsnifferw) {\n      p_exrta.sniffer_exclude = this.rule.exsnifferw;\n    }\n\n    // eslint-disable-next-line ts/no-unused-vars\n    parse_extra = objToQueryString(p_exrta);\n    // logger.info(\"parse_extra\", parse_extra)\n\n    // const lazy = this.rule.lazy;\n    // if (input && lazy) {\n    //   let mark = this.rule.name + \"drpy\";\n    //   let DrpyManage = GM.defineModule(\"DrpyManage\");\n    //   let rule = Object.assign({}, this.rule);\n    //   let drpy = DrpyManage.getBySource({\n    //     key: mark,\n    //     ext: rule\n    //   });\n    //   //logger.info(drpy.getRule())\n    //   //logger.info(Object.keys(drpy))\n    //   return drpy.play(flag, input);\n    // }\n\n    const autoContent = this.AutoContent();\n\n    if (jxs && input) {\n      if (!input.startsWith('http')) {\n        if (Object.hasOwn(jxs, flag)) {\n          input = jxs[flag] + input;\n        } else if (Object.hasOwn(jxs, '默认')) {\n          input = jxs['默认'] + input;\n        }\n        // eslint-disable-next-line ts/no-unused-vars\n        jx = 1;\n      }\n    }\n\n    const jumplay = this.getRuleValue(['跳转播放链接']);\n\n    if (input && jumplay) {\n      const h = await this.req(input, { ...this.rule.headers, ...{ Referer: getHome(input) } });\n      let temp = autoContent.splitStr(h, ['跳转播放链接'], {\n        type: '链接',\n      });\n\n      // logger.info(temp)\n\n      if (temp && temp.startsWith('http')) {\n        if (temp.includes('punish?x5sec')) {\n          temp = input;\n        }\n        input = temp;\n        input = this.normalizeUrl(temp);\n        if (new RegExp(this.rule.snifferw).test(input)) {\n          parse = 0;\n        }\n      }\n    }\n\n    const playobj = {\n      // jx:jx,\n      parse: parse !== undefined ? parse : 1,\n      url: input,\n      headers,\n      script: Object.keys(p_exrta).length\n        ? {\n            ...(p_exrta.js ? { runScript: this.rule.js } : {}),\n            ...(p_exrta.custom_regex ? { customRegex: p_exrta.custom_regex } : {}),\n            ...(p_exrta.sniffer_exclude ? { snifferExclude: p_exrta.sniffer_exclude } : {}),\n          }\n        : {},\n    };\n    // logger.info(playobj);\n\n    return playobj;\n  }\n\n  async action(_doc: ICmsParams['action']): ICmsResultPromise['action'] {\n    return '';\n  }\n\n  async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {\n    return [];\n  }\n\n  async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain'] {\n    return '';\n  }\n\n  async req(url: string, headers = {}) {\n    if (url.includes('时间戳')) {\n      url = url.replace(/时间戳/g, String(Date.now()));\n    }\n    if (url.includes('md5(')) {\n      const regex = /md5\\((.*?)\\)/g;\n      url = url.replace(regex, function (_match, p1) {\n        // p1 是括号中的内容，即需要加密的字符串\n        // 计算MD5\n        const md5Value = hash['md5-32']({ src: p1 });\n        // 返回替换后的字符串\n        return md5Value;\n      });\n    }\n    if (!url.startsWith('http')) {\n      url = this.rule.host + url;\n    }\n    let res = '';\n    const type = url.includes(';post') ? 'post' : 'get';\n    if (type === 'post') {\n      const postcs = url.split(';')[2];\n      url = url.split(';')[0];\n      const { data } = await request.request({\n        url,\n        method: 'POST',\n        headers: this.rule.headers,\n        data: postcs,\n      });\n      res = data;\n\n      // res = post(url, {\n      //   headers: this.rule.headers,\n      //   method: 'POST',\n      //   body: postcs,\n      // });\n    } else {\n      url = url.split(';')[0];\n      const { data } = await request.request({\n        url,\n        method: 'GET',\n        headers: headers || this.rule.headers,\n      });\n      res = data;\n\n      // res = request(url, {\n      //   headers: headers || this.rule.headers\n      // });\n    }\n    if (res.includes('robot')) {\n      logger.info('疑似触发机器人验证,打印日志');\n      logger.info('网页源码:', res as any);\n    }\n    return res;\n  }\n\n  async 一级(url: string, ctype: string) {\n    logger.info(`url:${url}`);\n    // let html;\n    const html = await this.req(url);\n    // logger.info(html)\n    const 搜索url = this.getRuleValue(['搜索url']);\n    if (ctype === '首页' && !搜索url) {\n      this.target = 'ext';\n      const s = this.loopTest(html, '文本', '搜索');\n      // logger.info(s)\n      if (s) {\n        if (searchmap.has(s)) {\n          logger.info(`搜索url设置: ${searchmap.get(s)}`);\n          this.XBPQRule['搜索url'] = searchmap.get(s);\n        }\n      }\n    }\n\n    const host = getHome(url);\n    // const switchs = this.rule.switchs;\n\n    const autoContent = this.AutoContent();\n    let ehtml: string = html;\n    // logger.info(ehtml)\n    if (autoContent.isEmpty(['二次截取', '数组二次截取'])) {\n      ehtml = autoContent.splitStr(html, ['二次截取', '数组二次截取'], {\n        twice: true,\n        ctype,\n      });\n    }\n    const { ihost, getUrl } = this.prefixORsuffix(html, '', host);\n    logger.info('ihost', ihost);\n\n    let list: any[] = [];\n    // logger.info(this.getRuleValue([\"数组\"]))\n    // let htmlList = XBPQParse.getSplitArray(html, this.getRuleValue([\"数组\"]));\n    const htmlList = autoContent.splitArray(ehtml, ['数组'], {\n      key: '数组',\n      ctype,\n    });\n\n    // logger.info(htmlList)\n\n    // logger.info(htmlList.length)\n    // if (htmlList.length == 0) {\n    //   htmlList = this.loopTest(html, \"数组\", \"数组\");\n    // }\n    let hasPic = 0;\n\n    for (const item of htmlList) {\n      // logger.info(item)\n      if (ctype !== '首页') {\n        // logger.info(item)\n      }\n      const vod_name = autoContent.splitStr(item, ['标题'], {\n        type: '文本',\n        key: '标题',\n        ctype,\n      });\n      // logger.info(vod_name)\n\n      if (vod_name == null || vod_name === '') {\n        continue;\n      }\n      const vod_remarks = autoContent.splitStr(item, ['副标题'], {\n        type: '文本',\n        key: '副标题',\n      });\n      // logger.info(\"副标题\", vod_remarks)\n\n      let vod_id = autoContent.splitStr(item, ['链接'], 'href=\"&&\"', {\n        host: ihost,\n        type: '链接',\n        key: '链接',\n        ctype,\n      });\n      // logger.info(\"vod_id:\", vod_id)\n      if (vod_id) {\n        vod_id = getUrl(vod_id);\n      }\n\n      if (vod_id && this.judgeUrl(vod_id, vod_name, host, '一级')) {\n        continue;\n      }\n\n      let vod_pic = autoContent.splitStr(item, ['图片'], {\n        type: '图片',\n        key: '图片',\n        host,\n        ctype,\n      });\n\n      if (this.getRuleValue(['图片']) === '' && vod_pic === '') {\n        // continue;\n      }\n      if (vod_pic) {\n        vod_pic = `${vod_pic}@Referer=`;\n        hasPic++;\n      }\n      list.push({\n        vod_ids: `${ctype}$${vod_id}@@${vod_name}@@${vod_pic}`,\n        vod_id,\n        vod_name,\n        vod_pic,\n        vod_remarks,\n      });\n    }\n    if (hasPic > 4) {\n      list = list.filter((v) => v.vod_pic);\n    }\n    list = removeDuplicatesByValue(list, 'vod_id');\n    let tlist = list;\n\n    if (list.length && list.every((it: any) => it.vod_id.includes('http'))) {\n      const topurls = list.map((x: any) => x.vod_id);\n      // logger.info(topurls)\n      // logger.info(topurls.length);\n      // 获取相同部分\n      const urlpath = findMostCommonBaseStructure(topurls);\n      // logger.info(\"相同部分\")\n      // logger.info(urlpath);\n      tlist = list.filter((it: any) => it.vod_id.includes(urlpath));\n      if (tlist.length > 10) {\n        list = tlist;\n      }\n    }\n    // logger.info(list)\n\n    if (list.length === 0) {\n      list.push({\n        vod_id: '没有数据',\n        vod_name: '无数据,防止无限请求',\n        vod_pic: 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg',\n        vod_remarks: '不要点，会崩的',\n      });\n    }\n\n    // if (list.length) {\n    //   logger.info('list:', list.slice(0, 3));\n    // }\n\n    if (list.length && list[0].vod_id !== '没有数据') {\n      list = list.map((x) => {\n        x.vod_id = x.vod_ids;\n        return x;\n      });\n    }\n\n    return list;\n  }\n\n  getRuleValue(keys: string[], def: any = ''): any {\n    let v = '';\n    for (const key of keys) {\n      v = this.XBPQRule[key];\n      if (v) break;\n    }\n    return v || def || '';\n  }\n\n  normalizeUrl(url) {\n    url = url.replace(/\\\\\\//g, '/').replace('&#038;', '&');\n    // 正则表达式匹配协议和主机名，以及第一个斜杠\n    const regex = /^((?:[a-z]+:\\/\\/)?[^\\s/]+\\.[^\\s/]+)(\\S*)/i;\n    // 捕获协议和主机名\n    if (url.startsWith('//')) {\n      if (this.rule.URL != null) {\n        url = `${this.rule.URL.protocol}:${url}`;\n      } else {\n        url = `https:${url}`;\n      }\n    }\n    if (url.startsWith('/')) {\n      url = this.rule.host + url;\n    }\n    const match = url.match(regex);\n    if (match) {\n      // 协议和主机名\n      const protocolHost = match[1];\n      // 路径，如果有的话\n      const path = match[2] || '';\n      // 去除路径中的多余斜杠，然后重新组合URL\n      return protocolHost + path.replace(/\\/+/g, '/');\n    }\n    return url; // 如果没有匹配，返回原始URL\n  }\n\n  judgeUrl(url, name, host, type) {\n    let result = false;\n    if (type === '一级') {\n      if (!url) {\n        return true;\n      }\n      if (/^会员中心$/.test(name)) {\n        return true;\n      }\n      if (\n        /vod\\/type\\/id\\/\\d+\\.html|\\/label\\/(?:hot|down|live|web|top)\\.html|user\\/login/.test(url) ||\n        /^#$/.test(url)\n      ) {\n        logger.info(`命中: ${url}`);\n        result = true;\n      }\n      if (/index.php\\/vod\\/show\\//.test(url) && /\\/id\\/\\d+\\.html/.test(url)) {\n        return true;\n      }\n\n      if (/detail\\/id\\/\\d+\\.html|voddetail/i.test(url)) {\n        return false;\n      }\n      if (/javascript:|\\/vod\\/?type\\/|\\/vod\\/?show\\//.test(url)) {\n        result = true;\n      }\n      if (url != null && url.replace(/\\/$/, '') === host) {\n        result = true;\n      }\n    }\n\n    return result;\n  }\n\n  byType(value, ctype) {\n    if (value.every((x) => x.includes('--'))) {\n      const tys = value.map((x) => x.split('--')[0]);\n      const filterType = tys.includes(ctype) ? ctype : '默认';\n      const filteredValue = value.filter((x) => {\n        const type = x.split('--')[0];\n        return type === filterType;\n      });\n      return filteredValue;\n    }\n  }\n\n  AutoContent() {\n    // eslint-disable-next-line ts/no-this-alias\n    const self = this; // 保存对当前实例的引用\n    return {\n      isEmpty(keys, def: string | undefined = undefined) {\n        // 调用继承的 getRuleValue 方法\n        const value = self.getRuleValue(keys, def);\n        // 如果 value 是 undefined、null、空字符串或者空数组，则返回 false\n        return !(value === undefined || value === null || value === '' || (Array.isArray(value) && value.length === 0));\n      },\n      splitStr: (html, keys, def: string | undefined | object = undefined, params: any = {}) => {\n        let result: string | null = null;\n        params = params || {};\n        if (typeof def == 'object') {\n          params = def;\n          def = params.def || '';\n        }\n        const { host, type, key } = params;\n        const twice = params.twice || false;\n        const skey = params.skey || type;\n        const ctype = params.ctype || null;\n        // const ext = params.ext || false;\n        let temp;\n        let value = this.getRuleValue(keys, def);\n        const descs = ['影片年代', '影片地区', '影片状态', '影片类型', '主演', '导演'];\n        if (keys.some((key) => descs.includes(key)) && !value.includes('&&')) {\n          return value;\n        }\n\n        if (value.includes('||')) {\n          value = value.split('||').filter((e) => e && e !== '');\n        }\n        if (!Array.isArray(value)) {\n          value = [value];\n        }\n        if (value.every((x) => x.includes('--'))) {\n          // let tys = value.map(x => x.split(\"--\")[0]);\n          // if (ctype == \"首页\") {\n          //   value = value.filter(x => x.split(\"--\")[0] == \"首页\");\n          // } else if (tys.includes(ctype)) {\n          //   value = value.filter(x => x.split(\"--\")[0] == ctype);\n          // } else {\n          //   value = value.filter(x => x.split(\"--\")[0] == \"默认\");\n          // }\n          // logger.info(value)\n          value = self.byType(value, ctype);\n        }\n        // logger.info(value)\n        for (let v of value) {\n          // @ts-expect-error declared but its value is never read\n          let n;\n          if (v.includes('--')) {\n            // logger.info(\"v\", v)\n            temp = v.split('--');\n\n            // eslint-disable-next-line ts/no-unused-vars\n            n = temp[0];\n            v = temp[1];\n          }\n          if (v === '空') {\n            temp = html;\n            break;\n          }\n          // logger.info(key)\n          // logger.info(v)\n\n          if (type === '链接') {\n            // logger.info(\"v:\", v);\n          }\n\n          if (v && !v.includes('&&')) {\n            temp = XBPQParse.getJsonStr(html, v);\n          } else if (v.includes('含序号:')) {\n            let prefix = '';\n            if (v.includes('+')) {\n              const tmp = v.split('+');\n              prefix = tmp[0];\n              v = tmp[1];\n            } else {\n              let arrtext = XBPQParse.getSplitArray(html, v)[0];\n              logger.info(v);\n              logger.info(arrtext);\n              if (prefix) {\n                arrtext = prefix + arrtext;\n              }\n              if (arrtext) {\n                temp = arrtext;\n              }\n            }\n          } else {\n            temp = XBPQParse.getHasRuleSplitStr(html, v, undefined, twice);\n            // logger.info(\"第一次:\", temp)\n            if (!temp) {\n              temp = XBPQParse.getHasRuleSplitStr(html.replace(/\\\\\"/g, '\"'), v, undefined, twice);\n              // logger.info(\"第二次:\", temp)\n            }\n          }\n          if (type === '链接') {\n            // logger.info(\"链接:\", temp);\n          }\n\n          // logger.info(temp)\n\n          if (temp && temp.startsWith('/') && type === '链接') {\n            temp = (host || '') + temp;\n          }\n\n          if (temp && temp.length) {\n            break;\n          }\n        }\n\n        if (temp != null && temp !== '') {\n          result = temp;\n        } else {\n          if (Object.hasOwn(autoRule, key)) {\n            result = this.loopTest(html, type, key, host);\n          }\n        }\n        if (result == null && twice) {\n          result = html;\n        }\n        if (result) {\n          if (!twice) {\n            // 移除所有标签，只保留文本\n            if (skey === '文本') {\n              result = removeTagsExceptList(result).replace(/[><]/g, '').trim();\n              result = htmlEntitiesToText(result);\n            }\n          }\n          if (skey === '图片') {\n            result = result!.replace(/\\\\$/, '');\n            result = this.normalizeUrl(result);\n          }\n          if (skey === '链接') {\n            // logger.info(\"链接:\",result);\n            if (/&#x/.test(result!)) {\n              result = htmlEntitiesToText(result);\n            }\n            if (result?.startsWith('http')) {\n              const uhost = getHome(result);\n              if (result.replace(/\\/$/, '') === uhost || result.replace(/\\/$/, '') === host) {\n                return '';\n              }\n              result = this.normalizeUrl(result);\n            }\n          }\n          if (key === '线路标题') {\n            // logger.info(result)\n            result = result!.replace(/\\s/g, '').replace(/div|id|class|[\"=]/g, '');\n          }\n          if (key === '播放标题') {\n            result = result!.replace(/&nbsp;/g, '').replace(/\\\\r/, '');\n            result = removeChars(result, '\\n').trim();\n            // logger.info(result)\n          }\n        }\n        return result;\n      },\n      splitArray: (html, keys, def, params: any = {}) => {\n        params = params || {};\n        if (typeof def == 'object') {\n          params = def;\n          def = params.def || '';\n        }\n\n        const { key } = params;\n\n        // const ext = params.ext || false;\n        const ctype = params.ctype || null;\n        let results: string[] | string = [];\n        let value: any = this.getRuleValue(keys, def);\n        if (value.includes('||')) {\n          value = value.split('||').filter((e) => e && e !== '');\n        }\n        let list: any[] = [];\n        if (!Array.isArray(value)) {\n          value = [value];\n        }\n        logger.info(value);\n        if (value.every((x) => x.includes('--'))) {\n          // let tys = value.map(x => x.split(\"--\")[0]);\n          // if (ctype == \"首页\") {\n          //   value = value.filter(x => x.split(\"--\")[0] == \"首页\");\n          // } else if (tys.includes(ctype)) {\n          //   value = value.filter(x => x.split(\"--\")[0] == ctype);\n          // } else {\n          //   value = value.filter(x => x.split(\"--\")[0] == \"默认\");\n          // }\n          // logger.info(value)\n          value = self.byType(value, ctype);\n          logger.info(value);\n        }\n        for (let v of value) {\n          // @ts-expect-error declared but its value is never read\n          let n;\n          let temp;\n          if (v.includes('--')) {\n            // logger.info(\"v\", v)\n            temp = v.split('--');\n\n            // eslint-disable-next-line ts/no-unused-vars\n            n = temp[0];\n            v = temp[1];\n          }\n          if (v === '空') {\n            temp = html;\n            break;\n          }\n          // logger.info(\"html:\", html);\n          // logger.info(\"v:\"+v);\n          if (!v.includes('&&')) {\n            list = XBPQParse.getJsonArray(html, v);\n            // logger.info($.type( list))\n          } else {\n            list = XBPQParse.getSplitArray(html, v);\n          }\n\n          if (v === 'list') {\n            // logger.info(list)\n          }\n\n          if (key === '线路数组') {\n            // logger.info(\"线路数组:\", list)\n            const autoc = this.AutoContent();\n            const t = this.getRuleValue(['线路标题']);\n            if (autoc.isEmpty(['线路标题']) && /&&/.test(t)) {\n              list = list\n                .map((tx) => {\n                  const tt = autoc.splitStr(tx, ['线路标题']);\n                  return tt;\n                })\n                .filter((e) => e);\n            }\n          }\n          if (list.length) {\n            break;\n          }\n        }\n        if (key === '线路数组') {\n          // logger.info(\"list\", list)\n        }\n        // logger.info(\"list\", list)\n        if (list.length > 0) {\n          results = list;\n        } else {\n          results = this.loopTest(html, '数组', key) as string;\n        }\n        return results;\n      },\n    };\n  }\n\n  loopTest(html, type, key, host = '') {\n    let contents = autoRule[key];\n    if (this.target === 'ext') {\n      contents = extRule[key];\n      this.target = '';\n    }\n    let result = '';\n    const results = [];\n    if (type === '数组') {\n      if (Array.isArray(contents)) {\n        for (const content of contents) {\n          // logger.info(content)\n          result = XBPQParse.getSplitArray(html, content);\n          // logger.info(result.length)\n          if (result!.length > 0) {\n            logger.info(`目标[${key}]:${content}`);\n            return result;\n          }\n        }\n      }\n    }\n    if (type === '文本') {\n      let strict = false;\n      if (['播放标题'].includes(key)) {\n        strict = true;\n      }\n      if (Array.isArray(contents)) {\n        for (const content of contents) {\n          if (key === '副标题') {\n            // logger.info(html)\n            // logger.info(content)\n          }\n          result = XBPQParse.getHasRuleSplitStr(html, content, '', strict)!;\n          if (key === '副标题') {\n            // logger.info(result)\n          }\n          if (result != null) {\n            result = collapseSpacesAndTrim(result);\n            // logger.info(`目标[${key}]:${content}`)\n            break;\n          }\n        }\n      }\n    }\n    if (type === '图片') {\n      const es = /logo.gif/;\n      if (Array.isArray(contents)) {\n        for (const content of contents) {\n          // logger.info(content)\n          result = XBPQParse.getHasRuleSplitStr(html, content)!;\n          if (result != null && !es.test(result)) {\n            result = collapseSpacesAndTrim(result);\n            // logger.info(result)\n            if (host) {\n              if (result!.startsWith('/')) {\n                result = host + result;\n              }\n            }\n            // logger.info(content)\n            break;\n          }\n        }\n      }\n    }\n    if (type === '链接') {\n      const es = /javascript:;/;\n      if (Array.isArray(contents)) {\n        for (const content of contents) {\n          // logger.info(content)\n          result = XBPQParse.getHasRuleSplitStr(html, content)!;\n          if (result != null && !es.test(result)) {\n            result = collapseSpacesAndTrim(result);\n            // logger.info(result);\n            if (host) {\n              if (result!.startsWith('/')) {\n                result = host + result;\n              }\n            }\n            // logger.info(content)\n            break;\n          }\n        }\n      }\n    }\n    // logger.info(results.length)\n    if (results.length > 0) {\n      /* (let index = findLongindex(results);\n      logger.info(\"index\")\n      logger.info(index) */\n      // logger.info(result)\n    }\n    return result;\n  }\n\n  prefixORsuffix(html, input, h) {\n    let ithost;\n    const prefix = XBPQParse.getHasRuleSplitStr(html, this.getRuleValue([`${input}链接前缀`]));\n    const suffix = XBPQParse.getHasRuleSplitStr(html, this.getRuleValue([`${input}链接后缀`]));\n\n    if (!prefix && !suffix) {\n      ithost = h;\n    }\n    return {\n      getUrl(url) {\n        if (url.includes(prefix)) {\n          url = url.replace(prefix, '');\n        }\n        url = (prefix || '') + url + (suffix || '');\n        return url;\n      },\n      ihost: ithost,\n    };\n  }\n\n  splitTextWithSingleBracket(text) {\n    // 正则表达式匹配 [xxx] 的内容和除此之外的文本\n    // const regex = /^(.*?)\\[(.*?)\\]$/;\n    const regex = /^([^[]*)\\[(.*?)\\]$/;\n    const match = text.match(regex);\n    if (match) {\n      // 返回普通文本部分和括号内容\n      return [match[1] + match[3], match[2]];\n    } else {\n      // 如果没有匹配到括号，返回原始文本和null\n      return [text, ''];\n    }\n  }\n\n  setSwitchs(switchs) {\n    function checkDigit(str, key) {\n      const pattern = new RegExp(`${key}(\\\\d+)`);\n      const match = str.match(pattern);\n      return match ? Number.parseInt(match[1], 10) : null; // 返回数字或null\n    }\n    const swMap = new Map([\n      // z-直接播放（开）\n      [\n        'z',\n        (_str) => {\n          this.rule['二级'] = '*';\n        },\n      ],\n      // d-倒序（开），默认自动 d0-倒序（关）\n      [\n        'd',\n        (str) => {\n          const digit = checkDigit(str, 'd');\n          this.rule['倒序'] = digit;\n        },\n      ],\n      // v-直链标记（开），把播放链接当成Video直接播放，不再嗅探或解析\n      [\n        'v',\n        (_str) => {\n          this.rule.playParse = 0;\n        },\n      ],\n    ]);\n\n    function processString(str) {\n      for (const [key, handler] of swMap) {\n        if (str.includes(key)) {\n          handler(str);\n        }\n      }\n    }\n    processString(switchs);\n  }\n}\n\nexport default T3XbpqAdapter;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Xbpq/methods.ts",
    "content": "/**\n * 扩展字符串方法\n */\nfunction stringex() {\n  // eslint-disable-next-line no-extend-native\n  Object.defineProperties(String.prototype, {\n    retag: {\n      value() {\n        return this.replace(/<[^>]*>/g, '').replace(/[“”']/g, '');\n      },\n      writable: true,\n      enumerable: false,\n    },\n    Split: {\n      value(s, e) {\n        if (e) {\n          return this.split(s).filter((item) => item !== '');\n        } else {\n          return this.split(s);\n        }\n      },\n      writable: true,\n      enumerable: false,\n    },\n  });\n}\n\n/**\n * 移除字符串中指定的字符\n *\n * @param {string} originalText - 原始文本\n * @param {string} charsToRemove - 需要移除的字符\n * @returns {string} - 移除指定字符后的文本\n */\nfunction removeChars(originalText, charsToRemove) {\n  // 将原始文本转换为字符数组，以便后续处理\n  return originalText.split('').reduce((acc, char) => {\n    // 判断当前字符是否需要被移除\n    return charsToRemove.includes(char) ? acc : acc + char;\n  }, '');\n}\n\nfunction removeTagsExceptList(htmlString, tagList: string[] = []) {\n  if (htmlString === '') {\n    return htmlString;\n  }\n  if (tagList === undefined) {\n    tagList = [];\n  }\n  // 构建一个正则表达式，排除列表中的标签\n  const tagPattern = tagList.map((tag) => `</?${tag}(\\\\s+[^>]*)?>`).join('|');\n  // eslint-disable-next-line regexp/no-dupe-disjunctions\n  const regex = tagList.length > 0 ? new RegExp(`<(?!${tagPattern})[^>]+>|<!--.*?-->`, 'gs') : /<[^>]+>|<!--.*?-->/gs; // 如果 tagList 为空，则匹配所有标签\n  // 使用正则表达式替换掉除了列表中标签之外的所有HTML标签\n  return htmlString.replace(regex, (match) => {\n    // 如果匹配的是注释，则直接返回空字符串\n    if (match.startsWith('<!--')) {\n      return '';\n    }\n    // 如果 tagList 为空，则直接返回空字符串，因为我们要删除所有标签\n    if (tagList === undefined || tagList.length === 0) {\n      return '';\n    }\n    // 如果匹配的是我们要保留的标签，则返回原字符串\n    if (tagList.some((tag) => match.includes(`<${tag}`) || match.includes(`</${tag}>`))) {\n      return match;\n    }\n    // 否则，返回空字符串，即删除该标签\n    return '';\n  });\n}\n\nfunction replaceTagsWithMapping(htmlString, replacementMap: Record<string, string[]>) {\n  // 遍历映射并构建替换逻辑\n  const replacements = Object.entries(replacementMap).map(([newTag, oldTags]) => {\n    // 构建正则表达式来匹配旧标签的开始和结束标签\n    const openTagRegex = new RegExp(`<(${oldTags.join('|')})(\\\\s+[^>]*)?>`, 'g');\n    const closeTagRegex = new RegExp(`</(${oldTags.join('|')})>`, 'g');\n    // 替换函数\n    return (str) => {\n      return str\n        .replace(openTagRegex, `<${newTag}$2>`) // 替换开始标签\n        .replace(closeTagRegex, `</${newTag}>`); // 替换结束标签\n    };\n  });\n  // 执行替换\n  return replacements.reduce((acc, replace) => {\n    return replace(acc);\n  }, htmlString);\n}\n\nfunction removeDuplicatesByValue(arr, valueToCheck) {\n  // 使用 Set 对象来存储已经遇到的值\n  const seenValues = new Set();\n  const uniqueArr: any[] = [];\n  // 遍历原始数组\n  for (const obj of arr) {\n    // 如果对象包含要检查的值，并且这个值之前没有出现过，则添加到结果数组中\n    if (obj[valueToCheck] && !seenValues.has(obj[valueToCheck])) {\n      seenValues.add(obj[valueToCheck]);\n      uniqueArr.push(obj);\n    }\n  }\n  return uniqueArr;\n}\n\nexport { removeChars, removeDuplicatesByValue, removeTagsExceptList, replaceTagsWithMapping, stringex };\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Xbpq/rule.ts",
    "content": "const templates = {\n  搜索模板: [\n    {\n      搜索数组: 'module-search-item\">&&<div+1',\n      搜索标题: '<a class=\"video-serial\"*alt=\"&&\">',\n      搜索副标题: '<a class=\"video-serial\"*>&&</a',\n      搜索链接: '<a class=\"video-serial\"*href=\"&&\"',\n    },\n  ],\n};\n\nconst autoRule = {\n  数组: [\n    'hl-list-item&&</li>',\n    'myui-vodlist__box&&</div',\n    'class=\"stui-vodlist__box\"&&</a',\n    '<a&&</a>[包含:module-item-cover#vodlist_thumb]',\n    'oneVideo\">&&<div class=\"col',\n    '\"video-img-box&&</p',\n    '<article&&</article>',\n    '<li class=\"clearfix\">&&</li>',\n    'module-item\"&&</div+1[不包含:module-item-ru]',\n    'module-search-item\">&&<div+1',\n    '<a&&</a>',\n  ],\n  图片: ['data-src=\"&&\"', 'original=\"&&\"', '<img*src=\"&&\"'],\n  标题: ['alt=\"&&\"', 'title=\"&&\"', 'name\">&&<'],\n  链接: ['href=\"&&\"', \"href='&&'\"],\n  副标题: [\n    'module-item-text\">&&<',\n    '\"v_note\">&&</div',\n    'class=\"pic-text*text-right\">&&<',\n    '\"v-ins\"><p>&&</p>',\n    'module-item-note\">&&<',\n    'class=\"*remarks\"&&<',\n    'v-item-bottom\">&&</span>',\n    'class=\"pic_text*\">&&<',\n    '<span class=\"qb\">&&</span>',\n    '<span*>&&</span>',\n    '<span>&&</span>',\n  ],\n  线路数组: [\n    'module-tab-item &&</small>',\n    'module-tab-item&&</div>',\n    'module-tab-item &&</a>',\n    'tabindex=*\"tab\">&&<',\n    '\"tab\"*>&&<[不包含:同]',\n    '\"hl-text-site\">&&<[不包含:评分#微信#扫一扫]',\n    'playfrom*>&&</div>',\n    'channelname*>&&</a>',\n    'tabs-play*>&&</span>',\n    '=\"pull-left\"*>&&<',\n    'pay-url*>&&</a>',\n    'myui-panel__head&&</h3>[包含:fa-sort][替换:排序>>]',\n    '<a&&</a>[包含:class=\"wo\"]',\n    'href=\"javascript:void(0);&&</a>[包含:alt]',\n    '\"radius1*>&&</a>',\n    'href=\"javascript:void(0);\"&&</a>',\n    '\"stui-pannel__head*span>&&</div>[包含:线路]',\n    'id=\"playlist\">&&</div>',\n    '<h3*>&&</h3>[不包含:正片#猜#热#熱#更#介#榜#情#链#表#荐#排#评#留言#讨论#记#同#最新#演#正在#href=#收藏#明星#分享#相关#]',\n    '<h4*>&&</h4>[不包含:正片#猜#热#熱#更#介#榜#情#链#表#荐#排#评#留言#讨论#记#同#最新#演#正在#href=#收藏#明星#分享#相关#]',\n    '<h2*>&&</h2>[不包含:正片#猜#热#熱#更#介#榜#情#链#表#排#评#留言#讨论#记#同#最新#演#正在#href=#收藏#明星#分享#相关]',\n  ],\n  线路标题: [\n    '换线路&&</ul>',\n    '选择播放源&&</ul>',\n    '节点列表&&</ul>',\n    '<ul*tab-title\"&&</ul>',\n    '<ul class=\"nav nav-btn&&</ul>[不包含:首页#电影]',\n    '\"playname\"&&</ul>',\n    'from*list\"&&</ul>',\n    '<dt&&</dt>',\n    'play_source_tab&&</div>',\n    'data-dropdown-value=\"&&\">',\n    'alt=\"&&\"',\n  ],\n  播放数组: [\n    'hl-sort-list&&</ul>',\n    'sort-list clearfix&&</ul>',\n    'id=\"hl-plays-list&&</ul>',\n    'id=\"con_playlist&&</ul>',\n    '<ul class=\"stui-play*list&&</ul>',\n    '<ul class=\"myui-play*list&&</ul>',\n    '<ul class=\"stui-content*playlist&&</ul>',\n    '<ul class=\"content*playlist clearfix\"&&</ul>',\n    '<div class=\"stui-content*playlist&&</div>',\n    '<ul class=\"myui-content*list&&</ul>',\n    '<ul id=\"playsx\"&&</ul>',\n    '<div class=\"module-play-list&&</div>',\n    '<ul class=\"play_list\"&&</ul>',\n    '<ul class=\"large_list&&</ul>',\n    '\"tab_con\"&&</ul>',\n    '<ul class=\"playlist&&</ul>',\n    'class=\"scroll-content&&</div></div>',\n    '<ul class=\"anthology-list-play&&</ul',\n  ],\n  播放列表: '<a&&</a>[不包含:src=#original=#background#tab-item#节点#线路#福利#推荐#追剧#游客#留言#求片#影视#下载]',\n  播放标题: [\n    'span>&&<',\n    'title=\"&&\"',\n    '>&&</a>[包含:集#清#版#HD#BD#0P#原画#蓝光#字#正片#0p#TC#TS#DVD#CD#期#季#语#话#1#2#3#4#5#6#7#8#9#]',\n  ],\n  播放链接:\n    'href=\"&&\"[不包含:href=\"/\"#search#show#view#detail#juqing#type#script#Script#read#list#/hot/#index.html#/news/#email#/appxz/#/tags/#.xml#.js#url=http#.app]',\n  简介: ['name=\"description\"*content=\"&&\"', '剧情&&</p>[不包含:首页]'],\n  影片状态: '状态：&&</div>',\n  影片类型: '类型：&&</div>',\n  影片地区: '地区：&&</div>',\n  主演: ['主演：&&</div>', '演员:&&</div>'],\n  导演: ['导演：&&</div>', '导演:&&</div>'],\n  剧情: '电影--喜剧&爱情&动作&科幻&剧情&战争&警匪&犯罪&动画&奇幻&武侠&冒险&枪战&恐怖&悬疑&青春&古装&历史&运动&儿童||连续剧--古装&神话&战争&偶像&爱情&喜剧&家庭&犯罪&悬疑&恐怖&武侠&动作&奇幻&剧情&历史||综艺--脱口秀&真人秀&情感&旅游&音乐&舞蹈&美食&纪实&生活||动漫--科幻&热血&搞笑&冒险&校园&动作&运动||纪录片--纪录&历史&传记&音乐&歌舞&短片&科幻',\n  地区: '电影--大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&俄罗斯&意大利&西班牙&加拿大||连续剧--大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&俄罗斯&意大利&西班牙&加拿大||综艺--大陆&香港&台湾&日本&韩国&美国&英国||动漫--大陆&日本&韩国&美国&英国&法国||纪录片--大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&俄罗斯&意大利&西班牙&加拿大',\n  排序: '时间$time#人气$hits#评分$score',\n  年份: '',\n};\n\nconst extRule = {\n  搜索: ['<form name=\"search\"*action=\"&&\"', '<form id=\"search\"*action=\"&&\"'],\n};\n\nconst searchmap = new Map([\n  ['/ss/-------------/', '/ss/{wd}----------{pg}---/'],\n  ['/vsearch/-------------.html', '/vsearch/{wd}----------{pg}---.html'],\n  ['/vodsearch/-------------.html', '/vodsearch/{wd}----------{pg}---.html'],\n  ['/index.php/vod/search.html', '/index.php/vod/search/page/{pg}/wd/{wd}.html'],\n]);\n\nexport { autoRule, extRule, searchmap, templates };\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Xyq.ts",
    "content": "import { loggerService } from '@logger';\nimport { pd, pdfa, pdfh } from '@main/utils/hiker/htmlParser';\nimport jinja from '@main/utils/hiker/jinja';\nimport * as XBPQParse from '@main/utils/hiker/ruleParse';\nimport { MOBILE_UA, PC_UA } from '@main/utils/hiker/ua';\nimport { request } from '@main/utils/request';\nimport { SITE_LOGGER_MAP, SITE_TYPE } from '@shared/config/film';\nimport { getHome } from '@shared/modules/headers';\nimport type { ICmsParams, ICmsResultPromise, IConstructorOptions } from '@shared/types/cms';\nimport JSON5 from 'json5';\n\nconst logger = loggerService.withContext(SITE_LOGGER_MAP[SITE_TYPE.T3_XYQ]);\n\nfunction getValueByPath(json, path) {\n  // 将路径字符串拆分成属性名数组\n  const keys = path.split('.');\n  // 逐层访问对象属性\n  return keys.reduce((obj, key) => {\n    if (obj === undefined || obj === null) {\n      return undefined;\n    }\n    return obj[key];\n  }, json); // 初始值为json对象\n}\n\nfunction generateYearArray(startYear, endYear) {\n  const years: number[] = [];\n  for (let year = startYear; year >= endYear; year--) {\n    years.push(year);\n  }\n  return years;\n}\n\nconst replacePlaceholders = (url, fl) => {\n  return jinja.render(url.replace(/\\{(\\w+)\\}/g, '{{$1}}'), fl);\n};\n\nclass T3XyqAdapter {\n  rule: any = {};\n  source: any = '';\n  XYQRULE: any = {};\n  private categories: string[] = [];\n\n  constructor(source: IConstructorOptions) {\n    this.source = source;\n    this.categories = source.categories;\n\n    this.XYQRULE = source.ext;\n\n    this.rule = {\n      name: source.name,\n      host: '',\n      一级: 'true',\n      推荐: 'true',\n      类型: '影视',\n      headers: {},\n    };\n  }\n\n  async init(): ICmsResultPromise['init'] {\n    let resp: string = this.source.ext;\n    if (this.source.ext.startsWith('http')) {\n      const { data } = await request.request({\n        url: this.source.ext,\n        method: 'GET',\n        responseType: 'text',\n        headers: { 'User-Agent': 'okhttp/4.12.0' },\n      });\n      resp = data;\n    }\n    try {\n      resp = JSON5.parse(resp);\n      this.XYQRULE = Object.assign(this.XYQRULE, resp);\n    } catch {\n      // ignore\n    }\n\n    const XYQRULE = this.XYQRULE;\n    const headers = this.rule.headers;\n\n    if (XYQRULE['请求头参数']) {\n      if (XYQRULE['请求头参数'].includes('#') || XYQRULE['请求头参数'].includes('$')) {\n        XYQRULE['请求头参数'].split('#').forEach((v) => (headers[v.split('$')[0]] = v.split('$')[1]));\n      } else {\n        headers['User-Agent'] = XYQRULE['请求头参数'];\n      }\n    }\n    headers['User-Agent'] = headers['User-Agent'] === '电脑' || headers['User-Agent'] === 'PC_UA' ? PC_UA : MOBILE_UA;\n\n    if (XYQRULE['首页推荐链接'] || XYQRULE['分类链接']) {\n      const host = getHome(XYQRULE['首页推荐链接'] || XYQRULE['分类链接']);\n      this.rule.host = host;\n    }\n    if (!XYQRULE['是否开启获取首页数据'] || !XYQRULE['首页列表数组规则']) {\n      this.rule.推荐 = '';\n    }\n    if (!XYQRULE['分类名称']) {\n      this.rule.一级 = '';\n    }\n    if (XYQRULE['链接是否直接播放'] === '1') {\n      this.rule.二级 = '*';\n    }\n  }\n\n  async home(): ICmsResultPromise['home'] {\n    const XYQRULE = this.XYQRULE;\n    const typenames = XYQRULE['分类名称'] ? XYQRULE['分类名称'].split('&') : [];\n    const typeids = XYQRULE['分类名称替换词'] ? XYQRULE['分类名称替换词'].split('&') : [];\n\n    const rawClassList = typenames.map((name, i) => ({\n      type_id: typeids[i],\n      type_name: name,\n    }));\n    const classes = rawClassList\n      .map((item) => ({\n        type_id: String(item.type_id ?? '').trim(),\n        type_name: item.type_name?.toString().trim() ?? '',\n      }))\n      .filter(\n        (item, index, self) =>\n          item.type_id &&\n          item.type_name &&\n          !this.categories?.includes(item.type_name) &&\n          self.findIndex((other) => other.type_id === item.type_id) === index,\n      );\n    const classIds = classes.map((item) => item.type_id);\n\n    let filters: Record<string, any[]> = {};\n    if (typeof XYQRULE['筛选数据'] == 'string' && XYQRULE['筛选数据'] === 'ext') {\n      if (!XYQRULE['筛选年份名称'] && XYQRULE['分类链接'].includes('{year}')) {\n        XYQRULE['筛选年份名称'] = generateYearArray(new Date().getFullYear(), 2004).join('&');\n        XYQRULE['筛选年份替换词'] = generateYearArray(new Date().getFullYear(), 2004).join('&');\n      }\n      if (!XYQRULE['筛选排序名称'] && XYQRULE['分类链接'].includes('{by}')) {\n        XYQRULE['筛选排序名称'] = '时间&人气&评分';\n        XYQRULE['筛选排序替换词'] = 'time&hits&score';\n      }\n      const filtersTypes = ['子分类', '类型', '地区', '年份', '语言', '排序'];\n      const filtersIds = ['cateId', 'class', 'area', 'year', 'lang', 'by'];\n      const rawFiltersObj = filtersTypes.reduce((acc, it, id) => {\n        const ruleName = `筛选${it}名称`;\n        const ruleId = `筛选${it}替换词`;\n\n        if (!XYQRULE[ruleName] || !XYQRULE[ruleId]) return acc;\n\n        let catenames = XYQRULE[ruleName].split('||');\n        let cateids = (XYQRULE[ruleId] === '*' ? XYQRULE[ruleName] : XYQRULE[ruleId]).split('||');\n\n        /* ———— 长度对齐逻辑 ———— */\n        if (it === '排序') {\n          catenames = Array.from({ length: typeids.length }).fill(catenames[0]);\n          cateids = Array.from({ length: typeids.length }).fill(cateids[0]);\n        } else if (cateids.length === 1 && catenames.length === 1 && typeids.length > 1) {\n          catenames = Array.from({ length: typeids.length }).fill(catenames[0]);\n          cateids = Array.from({ length: typeids.length }).fill(cateids[0]);\n        }\n\n        /* ———— 生成每个 type_id 的筛选项 ———— */\n        cateids.forEach((_x, i) => {\n          const names = catenames[i]?.split('&') ?? [];\n          if (names.length === 1 && names[0] === '空') return;\n\n          const ids = cateids[i].split('&');\n          const value = names.map((n, idx) => ({ n, v: ids[idx] ?? '' }));\n\n          if (value.length) {\n            if (it !== '排序' && value[0].n !== '全部') {\n              value.unshift({ n: '全部', v: '' });\n            }\n\n            const key = typeids[i]; // 当前分类 id\n            if (!acc[key]) acc[key] = []; // 首次初始化\n            acc[key].push({\n              key: filtersIds[id], // 过滤器字段名\n              name: it, // 中文名\n              value, // 可选项\n            });\n          }\n        });\n\n        return acc;\n      }, {});\n      filters = Object.keys(rawFiltersObj).reduce((acc, key) => {\n        if (String(key) && classIds.includes(String(key))) {\n          acc[String(key)] = rawFiltersObj[key];\n        }\n        return acc;\n      }, {});\n    }\n    return { class: classes, filters };\n  }\n\n  async homeVod(): ICmsResultPromise['homeVod'] {\n    const XYQRULE = this.XYQRULE;\n    const html = await this.getCode(XYQRULE['首页推荐链接'] || this.rule.host);\n    const list: Awaited<ICmsResultPromise['homeVod']>['list'] = [];\n    if (XYQRULE['首页片单是否Jsoup写法'] === '1' || XYQRULE['首页片单是否Jsoup写法'] === '是') {\n      const listArr = pdfa(html, XYQRULE['首页列表数组规则']);\n      let ls = XYQRULE['首页片单列表数组规则'];\n      if (!ls.includes('body&&')) {\n        ls = `body&&${ls}`;\n      }\n\n      listArr.forEach((it) => {\n        pdfa(it, ls).forEach((v) => {\n          const vod_id = pd(v, XYQRULE['首页片单链接'] || XYQRULE['分类片单链接'], this.rule.host);\n          const vod_name = pdfh(v, XYQRULE['首页片单标题'] || XYQRULE['分类片单标题']);\n          const vod_pic = pdfh(v, XYQRULE['首页片单图片'] || XYQRULE['分类片单图片']);\n          const vod_remarks = pdfh(v, XYQRULE['首页片单副标题'] || XYQRULE['分类片单副标题']);\n          if (vod_id && vod_name) {\n            list.push({\n              vod_id,\n              vod_name,\n              vod_pic,\n              vod_remarks,\n            } as any);\n          }\n        });\n      });\n    }\n\n    const rawList = Array.isArray(list) ? list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = 1;\n    const pagecount = videos.length ? 1 : 0;\n    const total = videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async category(doc: ICmsParams['category']): ICmsResultPromise['category'] {\n    const { tid, page: pg, extend = {} } = doc;\n\n    const XYQRULE = this.XYQRULE;\n    let url = String(\n      XYQRULE['分类链接'].includes('firstPage=') && pg === 1\n        ? XYQRULE['分类链接'].split('firstPage=')[1].split(']')[0]\n        : XYQRULE['分类链接'].split('[')[0],\n    );\n\n    url = url.startsWith('http') ? url : this.rule.host;\n    extend.cateId = extend?.cateId || tid;\n\n    let html = await this.getCode(\n      replacePlaceholders(url.replaceAll('{catePg}', `${pg}`), extend).replaceAll('{cateId}', tid),\n    );\n\n    const list: Awaited<ICmsResultPromise['category']>['list'] = [];\n    if (\n      (XYQRULE['分类片单是否Jsoup写法'] === '1' || XYQRULE['分类片单是否Jsoup写法'] === '是') &&\n      XYQRULE['分类列表数组规则']\n    ) {\n      pdfa(html, XYQRULE['分类列表数组规则']).forEach((it) => {\n        const vod_name = pdfh(it, XYQRULE['分类片单标题']);\n        const vod_id = pd(it, XYQRULE['分类片单链接'], this.rule.host);\n        const vod_pic = pdfh(it, XYQRULE['分类片单图片']);\n        const vod_remarks = pdfh(it, XYQRULE['分类片单副标题']);\n        if (vod_id && vod_name) {\n          list.push({\n            vod_id,\n            vod_name,\n            vod_pic,\n            vod_remarks,\n          } as any);\n        }\n      });\n    }\n    if (XYQRULE['分类截取模式'] === '0') {\n      if (XYQRULE['分类Json数据二次截取']) {\n        html = XBPQParse.getHasRuleSplitStr(html, XYQRULE['分类Json数据二次截取'], undefined, true) || html;\n      }\n\n      const json = JSON.parse(html);\n      const vlist = getValueByPath(json, XYQRULE['分类列表数组规则']);\n\n      vlist.forEach((it) => {\n        let vod_id = it[XYQRULE['分类片单链接']];\n        const vod_name = it[XYQRULE['分类片单标题']];\n        const vod_pic = it[XYQRULE['分类片单图片']];\n        const vod_remarks = it[XYQRULE['分类片单副标题']];\n\n        const prefix = XYQRULE['分类片单链接加前缀'] || '';\n        let suffix = XYQRULE['分类片单链接加后缀'] || '';\n        if (suffix && suffix.includes(\"'input'\")) {\n          suffix = suffix.replace(\"'input'\", vod_id);\n        }\n\n        vod_id = `${prefix || ''}${vod_id}${suffix || ''}`;\n\n        if (vod_id && vod_name) {\n          list.push({\n            vod_id,\n            vod_name,\n            vod_pic,\n            vod_remarks,\n          } as any);\n        }\n      });\n    }\n\n    const rawList = Array.isArray(list) ? list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = 1;\n    const pagecount = videos.length ? 999 : 0;\n    const total = videos.length ? 999 : 0;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {\n    const { ids } = doc || {};\n    const idsArray = ids.split(',');\n    const vod_url = ids || '';\n\n    const XYQRULE = this.XYQRULE;\n    if (this.rule['二级'] === '*') {\n      return {\n        list: [\n          {\n            vod_id: vod_url,\n            vod_name: '',\n            vod_play_url: vod_url.includes('$') ? vod_url : `直接播放$${vod_url}`,\n            vod_play_from: '嗅探',\n          } as any,\n        ],\n      };\n    }\n    const html = await this.getCode(vod_url);\n    let resitem: any = {};\n\n    let tabs: any[] = [];\n    const lists: any[] = [];\n    try {\n      if (XYQRULE['详情是否Jsoup写法'] === '1' || XYQRULE['详情是否Jsoup写法'] === '是') {\n        resitem = {\n          vod_remarks: pdfh(html, XYQRULE['类型详情']),\n          vod_content: pdfh(html, XYQRULE['简介详情']),\n          vod_actor: pdfh(html, XYQRULE['演员详情']),\n          vod_year: pdfh(html, XYQRULE['年代详情']),\n          vod_area: pdfh(html, XYQRULE['地区详情']),\n        };\n      } else {\n        // XBPQ\n        resitem = {\n          vod_remarks: pdfh(XBPQParse.getHasRuleSplitStr(html, XYQRULE['类型详情'])!, 'Text'),\n          vod_content: pdfh(XBPQParse.getHasRuleSplitStr(html, XYQRULE['简介详情'])!, 'Text'),\n          vod_actor: pdfh(XBPQParse.getHasRuleSplitStr(html, XYQRULE['演员详情'])!, 'Text'),\n          vod_year: XBPQParse.getHasRuleSplitStr(html, XYQRULE['年代详情']),\n          vod_area: XBPQParse.getHasRuleSplitStr(html, XYQRULE['地区详情']),\n        };\n      }\n    } catch (error) {\n      logger.info('xpath获取海报信息失败>', error as Error);\n    }\n    try {\n      if (XYQRULE['线路列表数组规则']) {\n        pdfa(html, XYQRULE['线路列表数组规则']).forEach((it) => {\n          let linename = '';\n          XYQRULE['线路标题'].split('+').forEach((v) => {\n            let n;\n            if (v === '_') {\n              n = v;\n            } else {\n              n = pdfh(it, v);\n            }\n            linename = `${linename}${n}`;\n          });\n          tabs.push(linename);\n        });\n      } else {\n        tabs = ['线路1'];\n      }\n    } catch (error) {\n      logger.info('XYQ获取线路失败>', error as Error);\n    }\n\n    try {\n      const contlist = pdfa(html, XYQRULE['播放列表数组规则']);\n      for (let i = 0; i < contlist.length; i++) {\n        let bfline = pdfa(contlist[i], `body&&${XYQRULE['选集列表数组规则']}`);\n        if (bfline.length === 0) {\n          bfline = [contlist[i]];\n        }\n        const cont: any[] = [];\n        for (let j = 0; j < bfline.length; j++) {\n          let contname, conturl;\n          if (XYQRULE['选集标题链接是否Jsoup写法'] === '1' || XYQRULE['选集标题链接是否Jsoup写法'] === '是') {\n            contname = pdfh(bfline[j], XYQRULE['选集标题'] || 'a&&Text');\n            if (!contname) {\n              contname = j + 1;\n            }\n            conturl =\n              (XYQRULE['选集链接加前缀'] || '') +\n              pdfh(bfline[j], XYQRULE['选集链接'] || 'a&&href') +\n              (XYQRULE['选集链接加后缀'] || '');\n          }\n          cont.push(`${contname}$${conturl}`);\n        }\n        if (XYQRULE['是否反转选集序列'] === '1') {\n          cont.reverse();\n        }\n        lists.push(cont.join('#'));\n      }\n    } catch (error) {\n      logger.info('XYQ获取选集列表失败>', error as Error);\n    }\n\n    resitem.vod_play_from = tabs.join('$$$') || '默认线路';\n    resitem.vod_play_url = lists.join('$$$');\n    const list = [resitem];\n\n    const rawList = Array.isArray(list) ? list : [];\n    const videos = rawList\n      .map((v, i) => ({\n        vod_id: String((v.vod_id || idsArray[i]) ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_year: String(v.vod_year ?? ''),\n        vod_lang: v.vod_lang ?? '',\n        vod_area: v.vod_area ?? '',\n        vod_score: String((v.vod_score || v.vod_douban_score) ?? '0.0'),\n        vod_state: v.vod_state ?? '', // '正片' | '预告' | '花絮'\n        vod_class: v.vod_class ?? '', // '电影' | '电视剧' | '综艺' | '动漫' | '纪录片' | '其他'\n        vod_actor: v.vod_actor ?? '',\n        vod_director: v.vod_director ?? '',\n        vod_content: (v.vod_content ?? '')?.trim(),\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_play_from: v.vod_play_from ?? '',\n        vod_play_url: v.vod_play_url ?? '',\n        type_name: v.type_name ?? '',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = 1;\n    const pagecount = videos.length ? 1 : 0;\n    const total = videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {\n    const { wd, page } = doc;\n\n    const XYQRULE = this.XYQRULE;\n    const headers = {};\n    if (XYQRULE['搜索请求头参数']) {\n      if (XYQRULE['搜索请求头参数'].includes('#') || XYQRULE['搜索请求头参数'].includes('$')) {\n        XYQRULE['搜索请求头参数'].split('#').forEach((v) => {\n          headers[v.split('$')[0]] = v.split('$')[1];\n        });\n      } else {\n        headers['User-Agent'] = XYQRULE['搜索请求头参数'];\n      }\n    }\n    headers['User-Agent'] = headers['User-Agent'] === '电脑' || headers['User-Agent'] === 'PC_UA' ? PC_UA : MOBILE_UA;\n    let url = XYQRULE['搜索链接'].replaceAll('{wd}', wd).replaceAll('{pg}', page).replaceAll('{SearchPg}', page);\n    let host = this.rule.host;\n    if (host.includes('undefined') || !host) {\n      host = getHome(url);\n      this.rule.host = host;\n    }\n\n    let postData;\n    if (XYQRULE['POST请求数据'] !== '') {\n      url = url.split(';')[0];\n      postData = XYQRULE['POST请求数据'].replaceAll('{wd}', wd).replaceAll('{pg}', page);\n    }\n\n    let html = '';\n    let result;\n    if (postData) {\n      try {\n        result = await request.request({\n          url,\n          headers,\n          method: 'POST',\n          data: postData,\n        });\n        html = result.data;\n      } catch {\n        // ignore\n      }\n    } else {\n      html = await this.getCode(url, headers);\n    }\n    const list: Awaited<ICmsResultPromise['search']>['list'] = [];\n    const sslist = pdfa(html, XYQRULE['搜索列表数组规则']);\n\n    for (let i = 0; i < sslist.length; i++) {\n      const item = sslist[i];\n      let title, href, img, desc;\n      if (XYQRULE['搜索片单是否Jsoup写法'] === '1' || XYQRULE['搜索片单是否Jsoup写法'] === '是') {\n        title = pdfh(sslist[i], XYQRULE['搜索片单标题']);\n        href =\n          (XYQRULE['搜索片单链接加前缀'] || '') +\n          pdfh(sslist[i], XYQRULE['搜索片单链接']) +\n          (XYQRULE['搜索片单链接加后缀'] || '');\n        img = pdfh(sslist[i], XYQRULE['搜索片单图片']);\n        desc = pdfh(sslist[i], XYQRULE['搜索片单副标题']);\n      }\n      if (XYQRULE['搜索片单是否Jsoup写法'] === '0') {\n        title = XBPQParse.getHasRuleSplitStr(item, XYQRULE['搜索片单标题']);\n        href = XBPQParse.getHasRuleSplitStr(item, XYQRULE['搜索片单链接']);\n        img = XBPQParse.getHasRuleSplitStr(item, XYQRULE['搜索片单图片']);\n        if (img && img.startsWith('/')) {\n          img = host + img;\n        }\n      }\n\n      if (href && title) {\n        list.push({\n          vod_id: href,\n          vod_name: title,\n          vod_pic: img,\n          vod_remarks: desc || '',\n        } as any);\n      }\n    }\n\n    const rawList = Array.isArray(list) ? list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = page;\n    const pagecount = videos.length ? 999 : 0;\n    const total = videos.length ? 999 : 0;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {\n    const { play } = doc || {};\n    const parse = /\\.(?:m3u8|mp4|mpd|flv|mkv)/.test(play) ? 0 : 1;\n    return { url: play, parse };\n  }\n\n  async action(_doc: ICmsParams['action']): ICmsResultPromise['action'] {\n    return '';\n  }\n\n  async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {\n    return [];\n  }\n\n  async runMain(_doc: ICmsParams['runMain']): Promise<ICmsResultPromise['runMain']> {\n    return '';\n  }\n\n  private async getCode(url: string, headers: object = {}) {\n    const resp = await request.request({\n      url,\n      method: 'GET',\n      headers: Object.assign(this.rule.headers, headers),\n    });\n\n    let html = resp.data;\n\n    try {\n      if (html.includes('检测中')) {\n        const { data } = await request.request({\n          url: `${url}&btwaf${html.match(/btwaf(.*?)\"/)[1]}`,\n          method: 'GET',\n          headers,\n        });\n        html = data;\n      } else if (html.includes('页面已拦截')) {\n        //   html = fetchCodeByWebView(url, {\n        //     headers: headers,\n        //     blockRules: ['.png', '.jpg', '.gif', '.mp3', '.mp4'],\n        //   });\n        //   html = pdfh(html, 'body&&pre&&Text');\n      } else if (html.includes('系统安全验证')) {\n        //   async function ocr(codeurl: string, headers: any) {\n        //     headers = headers || {};\n        //     let img = convertBase64Image(codeurl, headers).replace('data:image/jpeg;base64,', '');\n        //     let code = await request({\n        //       url: 'https://api.xhofe.top/ocr/b64/text',\n        //       data: img,\n        //       method: 'POST',\n        //       headers: {\n        //         'Content-Type': 'text/html',\n        //       },\n        //     });\n        //     code = code.replace(/o/g, '0').replace(/u/g, '0').replace(/I/g, '1').replace(/l/g, '1').replace(/g/g, '9');\n        //     logger.info('识别验证码：' + code);\n        //     return code;\n        //   }\n        //   let www = url.split('/');\n        //   let home = www[0] + '//' + www[2];\n        //   let codeurl =\n        //     home +\n        //     (url.indexOf('search-pg-1-wd-') > -1 ? '/inc/common/code.php?a=search' : '/index.php/verify/index.html?');\n        //   let cook = await completeRequest({\n        //     url: codeurl,\n        //     headers: headers,\n        //   });\n        //   headers.Cookie = (cook.headers['set-cookie'] || '[]').join(';');\n        //   let vcode = ocr(codeurl, headers);\n        //   await request({\n        //     url:\n        //       home +\n        //       (url.indexOf('search-pg-1-wd-') > -1\n        //         ? '/inc/ajax.php?ac=code_check&type=search&code='\n        //         : html.match(/\\/index.php.*?verify=/)[0]) +\n        //       vcode,\n        //     headers: headers,\n        //     method: url.indexOf('search-pg-1-wd-') > -1 ? 'GET' : 'POST',\n        //   });\n        const { data } = await request.request({\n          url,\n          method: 'GET',\n          headers,\n        });\n        html = data;\n      }\n    } catch {\n      // ignore\n    }\n\n    return html;\n  }\n}\n\nexport default T3XyqAdapter;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t4Catvod.ts",
    "content": "import { request } from '@main/utils/request';\nimport { buildUrl } from '@shared/modules/headers';\nimport type { ICmsParams, ICmsResultPromise, IConstructorOptions } from '@shared/types/cms';\n\nclass T4CatvodAdapter {\n  private api: string = '';\n  ext: object = {};\n  private categories: string[] = [];\n\n  constructor(source: IConstructorOptions) {\n    this.api = source.api!;\n    this.categories = source.categories;\n  }\n\n  async init(): ICmsResultPromise['init'] {\n    await request.request({\n      url: buildUrl(this.api, '/init'),\n      method: 'POST',\n      data: {}, // must have body, but allow empty\n    });\n  }\n\n  async home(): ICmsResultPromise['home'] {\n    const { data: resp } = await request.request({\n      url: buildUrl(this.api, '/home'),\n      method: 'POST',\n      data: {}, // must have body, but allow empty\n    });\n\n    const rawClassList = Array.isArray(resp?.class) ? resp.class : [];\n    const classes = rawClassList\n      .map((item) => ({\n        type_id: String(item.type_id ?? '').trim(),\n        type_name: item.type_name?.toString().trim() ?? '',\n      }))\n      .filter(\n        (item, index, self) =>\n          item.type_id &&\n          item.type_name &&\n          !this.categories?.includes(item.type_name) &&\n          self.findIndex((other) => other.type_id === item.type_id) === index,\n      );\n    const classIds = classes.map((item) => item.type_id);\n\n    const rawFiltersObj = resp?.filters && Object.keys(resp?.filters).length ? resp.filters : {};\n    const filters = Object.keys(rawFiltersObj).reduce((acc, key) => {\n      if (String(key) && classIds.includes(String(key))) {\n        acc[String(key)] = rawFiltersObj[key];\n      }\n      return acc;\n    }, {});\n\n    return { class: classes, filters };\n  }\n\n  async homeVod(): ICmsResultPromise['homeVod'] {\n    return { page: 1, pagecount: 0, total: 0, list: [] };\n  }\n\n  async category(doc: ICmsParams['category']): ICmsResultPromise['category'] {\n    const { page, tid, extend = {} } = doc;\n\n    const { data: resp } = await request.request({\n      url: buildUrl(this.api, `/category`),\n      method: 'POST',\n      data: { id: tid, page, filters: extend },\n    });\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || page;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {\n    const { ids } = doc || {};\n    const idsArray = [ids];\n\n    const { data: resp } = await request.request({\n      url: buildUrl(this.api, `/detail`),\n      method: 'POST',\n      data: { id: ids },\n    });\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v, i) => ({\n        vod_id: String((v.vod_id || idsArray[i]) ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_year: String(v.vod_year ?? ''),\n        vod_lang: v.vod_lang ?? '',\n        vod_area: v.vod_area ?? '',\n        vod_score: String((v.vod_score || v.vod_douban_score) ?? '0.0'),\n        vod_state: v.vod_state ?? '', // '正片' | '预告' | '花絮'\n        vod_class: v.vod_class ?? '', // '电影' | '电视剧' | '综艺' | '动漫' | '纪录片' | '其他'\n        vod_actor: v.vod_actor ?? '',\n        vod_director: v.vod_director ?? '',\n        vod_content: (v.vod_content ?? '')?.trim(),\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_play_from: v.vod_play_from ?? '',\n        vod_play_url: v.vod_play_url ?? '',\n        type_name: v.type_name ?? '',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || 1;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {\n    const { wd, page = 1 } = doc || {};\n\n    const { data: resp } = await request.request({\n      url: buildUrl(this.api, `/search`),\n      method: 'POST',\n      data: { wd, pg: page },\n    });\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || page;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {\n    const { flag, play } = doc;\n\n    const { data: resp } = await request.request({\n      url: buildUrl(this.api, `/play`),\n      method: 'POST',\n      data: { flag, id: play },\n    });\n\n    const url = resp?.url?.startsWith('js2p')\n      ? (resp.url.match(/\\/proxy\\/[^/]+\\/([^/]+)/) || [])?.[1] || ''\n      : resp?.url || '';\n\n    const res = {\n      url,\n      headers: resp?.header || resp?.headers || {},\n    };\n\n    return res;\n  }\n\n  async action(doc: ICmsParams['action']): ICmsResultPromise['action'] {\n    const { action, value, timeout } = doc || {};\n    const { data: resp } = await request.request({\n      url: buildUrl(this.api, `/action`),\n      method: 'POST',\n      data: { action, value },\n      ...(timeout && timeout > 0 ? { timeout } : {}),\n    });\n\n    return resp;\n  }\n\n  async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {\n    return [];\n  }\n\n  async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain'] {\n    return '';\n  }\n}\n\nexport default T4CatvodAdapter;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t4DrpyJs0.ts",
    "content": "import { request } from '@main/utils/request';\nimport type { ICmsParams, ICmsResultPromise, IConstructorOptions } from '@shared/types/cms';\n\nclass T4DrpyJs0Adapter {\n  private api: string = '';\n  private categories: string[] = [];\n\n  constructor(source: IConstructorOptions) {\n    this.api = source.api!;\n    this.categories = source.categories;\n  }\n\n  async init(): ICmsResultPromise['init'] {}\n\n  async home(): ICmsResultPromise['home'] {\n    const { data: resp } = await request.request({\n      url: this.api,\n      method: 'GET',\n    });\n\n    const rawClassList = Array.isArray(resp?.class) ? resp?.class : [];\n    const classes = rawClassList\n      .map((item) => ({\n        type_id: String(item.type_id ?? '').trim(),\n        type_name: item.type_name?.toString().trim() ?? '',\n      }))\n      .filter(\n        (item, index, self) =>\n          item.type_id &&\n          item.type_name &&\n          !this.categories?.includes(item.type_name) &&\n          self.findIndex((other) => other.type_id === item.type_id) === index,\n      );\n    const classIds = classes.map((item) => item.type_id);\n\n    const rawFiltersObj = resp?.filters && Object.keys(resp?.filters).length ? resp.filters : {};\n    const filters = Object.keys(rawFiltersObj).reduce((acc, key) => {\n      if (String(key) && classIds.includes(String(key))) {\n        acc[String(key)] = rawFiltersObj[key];\n      }\n      return acc;\n    }, {});\n\n    return { class: classes, filters };\n  }\n\n  async homeVod(): ICmsResultPromise['homeVod'] {\n    const { data: resp } = await request.request({\n      url: this.api,\n      method: 'GET',\n    });\n\n    const pagecurrent = Number(resp?.page) || 1;\n    const pagecount = Number(resp?.pagecount) || 0;\n    const total = Number(resp?.total) || 0;\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async category(doc: ICmsParams['category']): ICmsResultPromise['category'] {\n    const { page, tid, extend } = doc || {};\n\n    const { data: resp } = await request.request({\n      url: this.api,\n      method: 'GET',\n      params: { ac: 'videolist', t: tid, pg: page, f: JSON.stringify(extend || {}) },\n    });\n\n    const pagecurrent = Number(resp?.page) || 1;\n    const pagecount = Number(resp?.pagecount) || 0;\n    const total = Number(resp?.total) || 0;\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {\n    const { ids } = doc || {};\n    const idsArray = [ids];\n\n    const { data: resp } = await request.request({\n      url: this.api,\n      method: 'GET',\n      params: { ac: 'detail', ids },\n    });\n\n    const pagecurrent = Number(resp?.page) || 1;\n    const pagecount = Number(resp?.pagecount) || 0;\n    const total = Number(resp?.total) || 0;\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v, i) => ({\n        vod_id: String((v.vod_id || idsArray[i]) ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_year: String(v.vod_year ?? ''),\n        vod_lang: v.vod_lang ?? '',\n        vod_area: v.vod_area ?? '',\n        vod_score: String((v.vod_score || v.vod_douban_score) ?? '0.0'),\n        vod_state: v.vod_state ?? '', // '正片' | '预告' | '花絮'\n        vod_class: v.vod_class ?? '', // '电影' | '电视剧' | '综艺' | '动漫' | '纪录片' | '其他'\n        vod_actor: v.vod_actor ?? '',\n        vod_director: v.vod_director ?? '',\n        vod_content: (v.vod_content ?? '')?.trim(),\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_play_from: v.vod_play_from ?? '',\n        vod_play_url: v.vod_play_url ?? '',\n        type_name: v.type_name ?? '',\n      }))\n      .filter((v) => v.vod_id);\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {\n    const { wd, page = 1 } = doc || {};\n\n    const { data: resp } = await request.request({\n      url: this.api,\n      method: 'GET',\n      params: { ac: 'detail', wd, pg: page },\n    });\n\n    const pagecurrent = Number(resp?.page) || 1;\n    const pagecount = Number(resp?.pagecount) || 0;\n    const total = Number(resp?.total) || 0;\n\n    const videos = (Array.isArray(resp?.list) ? resp.list : [])\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {\n    const { play } = doc || {};\n\n    const url = `${new URL(this.api).origin}/web/302redirect`;\n    const { data: resp } = await request.request({\n      url,\n      method: 'GET',\n      params: { url: play },\n    });\n\n    const VIP_LIST = [\n      'iqiyi.com',\n      'iq.com',\n      'mgtv.com',\n      'qq.com',\n      'youku.com',\n      'le.com',\n      'sohu.com',\n      'pptv.com',\n      'bilibili.com',\n      'tudou.com',\n    ];\n\n    const parsedUrl = resp?.url || '';\n    const parse = /\\.(?:m3u8|mp4|mpd|flv|mkv)/.test(parsedUrl) ? 0 : 1;\n\n    let jx = 0;\n    try {\n      const { hostname } = new URL(parsedUrl);\n      if (VIP_LIST.some((item) => hostname.includes(item))) jx = 1;\n    } catch {}\n\n    const res = {\n      url: parsedUrl,\n      quality: [],\n      parse,\n      jx,\n      headers: {},\n      script: {},\n    };\n\n    return res;\n  }\n\n  async action(doc: ICmsParams['action']): ICmsResultPromise['action'] {\n    const { action, value, timeout } = doc || {};\n\n    const { data: resp } = await request.request({\n      url: this.api,\n      method: 'GET',\n      params: { ac: 'action', action, value },\n      ...(timeout && timeout > 0 ? { timeout } : {}),\n    });\n\n    return resp;\n  }\n\n  async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {\n    return [];\n  }\n\n  async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain'] {\n    return '';\n  }\n}\n\nexport default T4DrpyJs0Adapter;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/adapter/t4Drpys.ts",
    "content": "import { request } from '@main/utils/request';\nimport { base64 } from '@shared/modules/crypto';\nimport { isJson } from '@shared/modules/validate';\nimport type { ICmsParams, ICmsResultPromise, IConstructorOptions } from '@shared/types/cms';\n\nclass T4ServerAdapter {\n  private api: string = '';\n  private ext: any = '';\n  private categories: string[] = [];\n\n  constructor(source: IConstructorOptions) {\n    this.api = source.api!;\n    this.ext = source.ext || '';\n    this.categories = source.categories;\n  }\n\n  async init(): ICmsResultPromise['init'] {}\n\n  async home(): ICmsResultPromise['home'] {\n    const { data: resp } = await request.request({\n      url: this.api,\n      method: 'GET',\n      params: { extend: this.ext, filter: true },\n    });\n\n    const rawClassList = Array.isArray(resp?.class) ? resp?.class : [];\n    const classes = rawClassList\n      .map((item) => ({\n        type_id: String(item.type_id ?? '').trim(),\n        type_name: item.type_name?.toString().trim() ?? '',\n      }))\n      .filter(\n        (item, index, self) =>\n          item.type_id &&\n          item.type_name &&\n          !this.categories?.includes(item.type_name) &&\n          self.findIndex((other) => other.type_id === item.type_id) === index,\n      );\n    const classIds = classes.map((item) => item.type_id);\n\n    const rawFiltersObj = resp?.filters && Object.keys(resp?.filters).length ? resp.filters : {};\n    const filters = Object.keys(rawFiltersObj).reduce((acc, key) => {\n      if (String(key) && classIds.includes(String(key))) {\n        acc[String(key)] = rawFiltersObj[key];\n      }\n      return acc;\n    }, {});\n\n    return { class: classes, filters };\n  }\n\n  async homeVod(): ICmsResultPromise['homeVod'] {\n    const { data: resp } = await request.request({\n      url: this.api,\n      method: 'GET',\n      params: { extend: this.ext, filter: true },\n    });\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || 1;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async category(doc: ICmsParams['category']): ICmsResultPromise['category'] {\n    const { page = 1, tid, extend = {} } = doc || {};\n    const extendStr = JSON.stringify(extend);\n\n    const { data: resp } = await request.request({\n      url: this.api,\n      method: 'GET',\n      params: {\n        ac: 'videolist',\n        t: tid,\n        pg: page,\n        ext: base64.encode({ src: extendStr }),\n        extend: this.ext,\n      },\n    });\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || page;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {\n    const { ids } = doc || {};\n    const idsArray = [ids];\n\n    const { data: resp } = await request.request({\n      url: this.api,\n      method: 'GET',\n      params: { ac: 'detail', ids, extend: this.ext },\n    });\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v, i) => ({\n        vod_id: String((v.vod_id || idsArray[i]) ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_year: String(v.vod_year ?? ''),\n        vod_lang: v.vod_lang ?? '',\n        vod_area: v.vod_area ?? '',\n        vod_score: String((v.vod_score || v.vod_douban_score) ?? '0.0'),\n        vod_state: v.vod_state ?? '', // '正片' | '预告' | '花絮'\n        vod_class: v.vod_class ?? '', // '电影' | '电视剧' | '综艺' | '动漫' | '纪录片' | '其他'\n        vod_actor: v.vod_actor ?? '',\n        vod_director: v.vod_director ?? '',\n        vod_content: (v.vod_content ?? '')?.trim(),\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_play_from: v.vod_play_from ?? '',\n        vod_play_url: v.vod_play_url ?? '',\n        type_name: v.type_name ?? '',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || 1;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {\n    const { wd, page = 1 } = doc || {};\n\n    const { data: resp } = await request.request({\n      url: this.api,\n      method: 'GET',\n      params: { extend: this.ext, wd, pg: page },\n    });\n\n    const rawList = Array.isArray(resp?.list) ? resp.list : [];\n    const videos = rawList\n      .map((v) => ({\n        vod_id: String(v.vod_id ?? ''),\n        vod_name: v.vod_name ?? '',\n        vod_pic: v.vod_pic ?? '',\n        vod_remarks: v.vod_remarks ?? '',\n        vod_blurb: (v.vod_blurb ?? '')?.trim(),\n        vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n      }))\n      .filter((v) => v.vod_id);\n\n    const pagecurrent = Number(resp?.page) || page;\n    const pagecount = Number(resp?.pagecount) || (videos.length ? 1 : 0);\n    const total = Number(resp?.total) || videos.length;\n\n    return { page: pagecurrent, pagecount, total, list: videos };\n  }\n\n  async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {\n    const { flag, play } = doc || {};\n\n    const { data: resp } = await request.request({\n      url: this.api,\n      method: 'GET',\n      params: { extend: this.ext, flag, play },\n    });\n\n    const qs = resp?.parse_extra;\n    const scriptObj = qs ? Object.fromEntries(new URLSearchParams(qs)) : {};\n\n    const res = {\n      url: resp?.url || '',\n      quality: resp.quality || [],\n      parse: resp.parse || 0,\n      jx: resp.jx || 0,\n      headers: resp?.header || resp?.headers || {},\n      script: Object.keys(scriptObj).length\n        ? {\n            ...(resp.js ? { runScript: resp.js } : {}),\n            ...(scriptObj.init_script ? { initScript: scriptObj.init_script } : {}),\n            ...(scriptObj.custom_regex ? { customRegex: scriptObj.custom_regex } : {}),\n            ...(scriptObj.sniffer_exclude ? { snifferExclude: scriptObj.sniffer_exclude } : {}),\n          }\n        : {},\n    };\n\n    return res;\n  }\n\n  async action(doc: ICmsParams['action']): ICmsResultPromise['action'] {\n    const { action, value: rawValue, timeout } = doc || {};\n    const value = isJson(rawValue) ? JSON.stringify(rawValue) : rawValue;\n    const { data: resp } = await request.request({\n      url: this.api,\n      method: 'GET',\n      params: { ac: 'action', action, value },\n      ...(timeout && timeout > 0 ? { timeout } : {}),\n    });\n\n    return resp;\n  }\n\n  async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {\n    return [];\n  }\n\n  async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain'] {\n    return '';\n  }\n}\n\nexport default T4ServerAdapter;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/index.ts",
    "content": "import { dbService } from '@main/services/DbService';\nimport {\n  getActionSchema,\n  getCategorySchema,\n  getCheckSchema,\n  getDetailSchema,\n  getHomeSchema,\n  getHomeVodSchema,\n  getInitchema,\n  getPlaySchema,\n  getProxySchema,\n  getSearchSchema,\n} from '@server/schemas/v1/flim/cms';\nimport { runRetryAsyncFunction } from '@shared/modules/function';\nimport {\n  isArray,\n  isArrayEmpty,\n  isJsonStr,\n  isNil,\n  isObject,\n  isObjectEmpty,\n  isPositiveFiniteNumber,\n  isString,\n} from '@shared/modules/validate';\nimport type {\n  ICmsAction,\n  ICmsCategory,\n  ICmsDetail,\n  ICmsHome,\n  ICmsHomeVod,\n  ICmsPlay,\n  ICmsProxy,\n  ICmsSearch,\n} from '@shared/types/cms';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\nimport JSON5 from 'json5';\n\nimport { prepare } from './utils/cache';\nimport { formatEpisode, formatInfoContent } from './utils/cms';\n\nconst API_PREFIX = 'film/cms';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.get(\n    `/${API_PREFIX}/init`,\n    { schema: getInitchema },\n    async (req: FastifyRequest<{ Querystring: { uuid: string; force?: boolean } }>) => {\n      const { uuid, force = false } = req.query || {};\n\n      try {\n        await prepare(uuid, force);\n        return { code: 0, msg: 'ok', data: true };\n      } catch {\n        return { code: -1, msg: 'fail', data: false };\n      }\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/home`,\n    { schema: getHomeSchema },\n    async (req: FastifyRequest<{ Querystring: { uuid: string } }>) => {\n      const { uuid } = req.query || {};\n\n      const adapter = await prepare(uuid);\n      const resp = await adapter.home();\n\n      const source = await dbService.site.get(uuid);\n\n      const categories = source.categories\n        ? [\n            ...new Set(\n              source.categories\n                .split(/[,，]/)\n                .map((c) => c.trim())\n                .filter(Boolean),\n            ),\n          ]\n        : [];\n\n      const rawClassList = Array.isArray(resp?.class) ? resp?.class : [];\n      const classes = rawClassList\n        .filter(\n          (item, index, self) =>\n            item.type_id &&\n            item.type_name &&\n            !categories?.includes(item.type_name) &&\n            self.findIndex((other) => other.type_id === item.type_id) === index,\n        )\n        .map((item) => ({\n          type_id: String(item.type_id ?? '').trim(),\n          type_name: item.type_name?.toString().trim() ?? '',\n        }));\n      const classIds = classes.map((item) => item.type_id);\n\n      const rawFiltersObj = resp?.filters && Object.keys(resp?.filters).length ? resp.filters : {};\n      const filters = Object.keys(rawFiltersObj).reduce((acc, key) => {\n        if (String(key) && classIds.includes(String(key))) {\n          acc[String(key)] = rawFiltersObj[key];\n        }\n        return acc;\n      }, {});\n\n      const res = { class: classes, filters } as ICmsHome;\n\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/homeVod`,\n    { schema: getHomeVodSchema },\n    async (req: FastifyRequest<{ Querystring: { uuid: string } }>) => {\n      const { uuid } = req.query || {};\n\n      const adapter = await prepare(uuid);\n      const resp = await adapter.homeVod();\n\n      const videos = (Array.isArray(resp?.list) ? resp.list : [])\n        .filter((v) => v.vod_id && v.vod_id !== 'no_data')\n        .map((v) => ({\n          vod_id: String(v.vod_id ?? ''),\n          vod_name: v.vod_name ?? '',\n          vod_pic: v.vod_pic ?? '',\n          vod_remarks: formatInfoContent(v.vod_remarks ?? ''),\n          vod_blurb: formatInfoContent(v.vod_blurb ?? ''),\n          vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n        }));\n      const pagecurrent = Number(resp?.page) || 1;\n      const pagecount = Number(resp?.pagecount) || 0;\n      const total = Number(resp?.total) || 0;\n\n      const res = { page: pagecurrent, pagecount, total, list: videos } as ICmsHomeVod;\n\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/category`,\n    { schema: getCategorySchema },\n    async (\n      req: FastifyRequest<{\n        Querystring: { uuid: string; tid: string; page?: number; extend?: string };\n      }>,\n    ) => {\n      let { uuid, tid, page = 1, extend: rawExtend = '{}' } = req.query || {};\n      if (isString(page)) page = Number.parseInt(page);\n      if (!isPositiveFiniteNumber(page)) page = 1;\n      const extend = isJsonStr(rawExtend) ? JSON5.parse(rawExtend) : {};\n\n      const adapter = await prepare(uuid);\n      const resp = tid === '' ? await adapter.homeVod() : await adapter.category({ tid, page, extend });\n\n      const videos = (Array.isArray(resp?.list) ? resp.list : [])\n        .filter((v) => v.vod_id && v.vod_id !== 'no_data')\n        .map((v) => ({\n          vod_id: String(v.vod_id ?? ''),\n          vod_name: v.vod_name ?? '',\n          vod_pic: v.vod_pic ?? '',\n          vod_remarks: formatInfoContent(v.vod_remarks ?? ''),\n          vod_blurb: formatInfoContent(v.vod_blurb ?? ''),\n          vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n        }));\n      const pagecurrent = Number(resp?.page) || page;\n      const pagecount = Number(resp?.pagecount) || 0;\n      const total = Number(resp?.total) || 0;\n\n      const res = { page: pagecurrent, pagecount, total, list: videos } as ICmsCategory;\n\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/detail`,\n    { schema: getDetailSchema },\n    async (req: FastifyRequest<{ Querystring: { uuid: string; ids: string } }>) => {\n      const { uuid, ids } = req.query || {};\n\n      const adapter = await prepare(uuid);\n      const resp = await adapter.detail({ ids });\n\n      const videos = (Array.isArray(resp?.list) ? resp.list : [])\n        .filter((v) => v.vod_id)\n        .map((v) => ({\n          vod_id: String(v.vod_id),\n          vod_name: v.vod_name ?? '',\n          vod_pic: v.vod_pic ?? '',\n          vod_remarks: formatInfoContent(v.vod_remarks ?? ''),\n          vod_year: formatInfoContent(String(v.vod_year ?? '')),\n          vod_lang: formatInfoContent(v.vod_lang ?? ''),\n          vod_area: formatInfoContent(v.vod_area ?? ''),\n          vod_score: formatInfoContent(String((v.vod_score || v.vod_douban_score) ?? '0.0')),\n          vod_state: formatInfoContent(v.vod_state ?? ''), // '正片' | '预告' | '花絮'\n          vod_class: formatInfoContent(v.vod_class ?? ''), // '电影' | '电视剧' | '综艺' | '动漫' | '纪录片' | '其他'\n          vod_actor: formatInfoContent(v.vod_actor ?? ''),\n          vod_director: formatInfoContent(v.vod_director ?? ''),\n          vod_content: formatInfoContent(v.vod_content ?? ''),\n          vod_blurb: formatInfoContent(v.vod_blurb ?? ''),\n          vod_play_from: v.vod_play_from ?? '',\n          vod_play_url: v.vod_play_url ?? '',\n          vod_episode: formatEpisode(v.vod_play_from, v.vod_play_url) || {},\n          type_name: v.type_name ?? '',\n        }));\n      const pagecurrent = Number(resp?.page) || 1;\n      const pagecount = Number(resp?.pagecount) || 0;\n      const total = Number(resp?.total) || 0;\n\n      const res = { page: pagecurrent, pagecount, total, list: videos } as ICmsDetail;\n\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/search`,\n    { schema: getSearchSchema },\n    async (req: FastifyRequest<{ Querystring: { uuid: string; wd: string; page?: number } }>) => {\n      let { uuid, wd, page = 1 } = req.query || {};\n      if (isString(page)) page = Number.parseInt(page);\n      if (!isPositiveFiniteNumber(page)) page = 1;\n\n      const adapter = await prepare(uuid);\n      const resp = await adapter.search({ wd, page });\n\n      const videos = (Array.isArray(resp?.list) ? resp.list : [])\n        .filter((v) => v.vod_id)\n        .map((v) => ({\n          vod_id: String(v.vod_id ?? ''),\n          vod_name: v.vod_name ?? '',\n          vod_pic: v.vod_pic ?? '',\n          vod_remarks: formatInfoContent(v.vod_remarks ?? ''),\n          vod_blurb: formatInfoContent(v.vod_blurb ?? ''),\n          vod_tag: ['action', 'file', 'folder'].includes(v.vod_tag || 'file') ? v.vod_tag : 'file',\n        }));\n      const pagecurrent = Number(resp?.page) || page;\n      const pagecount = Number(resp?.pagecount) || 0;\n      const total = Number(resp?.total) || 0;\n\n      const res = { page: pagecurrent, pagecount, total, list: videos } as ICmsSearch;\n\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/play`,\n    { schema: getPlaySchema },\n    async (req: FastifyRequest<{ Querystring: { uuid: string; play: string; flag: string } }>) => {\n      const { uuid, flag, play } = req.query || {};\n\n      const adapter = await prepare(uuid);\n      const resp = await adapter.play({ flag, play });\n\n      const res = {\n        url: resp?.url || '',\n        quality: isArray(resp?.quality) && !isArrayEmpty(resp.quality) ? resp.quality : [],\n        parse: isPositiveFiniteNumber(resp?.parse) ? resp.parse : 0,\n        jx: isPositiveFiniteNumber(resp?.jx) ? resp.jx : 0,\n        headers: isObject(resp?.headers) && !isObjectEmpty(resp.headers) ? resp.headers : {},\n        script: isObject(resp?.script) && !isObjectEmpty(resp.script) ? resp.script : {},\n      } as ICmsPlay;\n\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/action`,\n    { schema: getActionSchema },\n    async (\n      req: FastifyRequest<{\n        Querystring: { uuid: string; action: string; value: string | Record<string, any>; timeout?: number };\n      }>,\n    ) => {\n      const { uuid, action, value, timeout } = req.query || {};\n\n      const adapter = await prepare(uuid);\n      const resp = await adapter.action({ action, value, timeout });\n\n      const res = resp as ICmsAction;\n\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/proxy`,\n    { schema: getProxySchema },\n    async (req: FastifyRequest<{ Querystring: { uuid: string; do: string; url: string } & Record<string, any> }>) => {\n      const { uuid, ...args } = req.query || {};\n\n      const adapter = await prepare(uuid);\n      const resp = await adapter.proxy(args);\n\n      const res = resp as ICmsProxy;\n\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/check`,\n    { schema: getCheckSchema },\n    async (req: FastifyRequest<{ Querystring: { uuid: string } & { type: 'search' | 'simple' | 'complete' } }>) => {\n      const { uuid, type } = req.query || {};\n      const retry = 3;\n      const adapter = await prepare(uuid);\n\n      const checkSearch = async () => {\n        await runRetryAsyncFunction(\n          async () => {\n            const keywords = ['我', '你', '他'];\n            const wd = keywords[Math.floor(Math.random() * keywords.length)];\n            return await adapter.search({ wd });\n          },\n          retry,\n          (result) => !isNil(result?.list) && !isArrayEmpty(result.list) && result.list[0]?.vod_id !== 'no_data',\n        );\n\n        return true;\n      };\n\n      const checkMain = async () => {\n        const home = await adapter.home();\n        if (isNil(home.class) || isArrayEmpty(home.class)) return false;\n\n        let category = await runRetryAsyncFunction(\n          async () => {\n            const tid = home.class[Math.floor(Math.random() * home.class.length)]?.type_id;\n            return await adapter.category({ tid });\n          },\n          retry,\n          (result) => !isNil(result?.list) && !isArrayEmpty(result.list) && result.list[0]?.vod_id !== 'no_data',\n        );\n\n        // ignore folder and action type check\n        const filteredList = category.list?.filter((item) => !['folder', 'action'].includes(item?.vod_tag)) || [];\n        const hasSpecialTags = category.list?.some((item) => ['folder', 'action'].includes(item?.vod_tag));\n        if (filteredList.length === 0 && hasSpecialTags) {\n          return true;\n        } else if (filteredList.length > 0) {\n          category = { ...category, list: filteredList };\n        }\n\n        const detail = await runRetryAsyncFunction(\n          async () => {\n            const ids = category.list[Math.floor(Math.random() * category.list.length)]?.vod_id;\n            return await adapter.detail({ ids });\n          },\n          retry,\n          (result) =>\n            !isNil(result?.list) &&\n            !isArrayEmpty(result.list) &&\n            !!result.list[0]?.vod_play_url &&\n            !!result.list[0]?.vod_play_from,\n        );\n\n        const vod_episode = formatEpisode(detail.list[0].vod_play_from, detail.list[0].vod_play_url)!;\n        const resPlay = await adapter.play({\n          flag: Object.keys(vod_episode)[0] || '',\n          play: vod_episode[Object.keys(vod_episode)[0]]?.[0].link || '',\n        });\n        return !!resPlay?.url;\n      };\n\n      const typeCheckMap: Record<string, (() => Promise<boolean>)[]> = {\n        search: [checkSearch],\n        simple: [checkMain],\n        complete: [checkSearch, checkMain],\n      };\n\n      const checks = typeCheckMap[type] || [];\n\n      try {\n        for (const fn of checks) {\n          if (!(await fn())) return { code: 0, msg: 'ok', data: false };\n        }\n      } catch {\n        return { code: 0, msg: 'ok', data: false };\n      }\n\n      return { code: 0, msg: 'ok', data: true };\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/utils/cache.ts",
    "content": "import { loggerService } from '@logger';\nimport { dbService } from '@main/services/DbService';\nimport { SITE_TYPE } from '@shared/config/film';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport { hash } from '@shared/modules/crypto';\nimport LruCache from '@shared/modules/lrucache';\nimport singleton from '@shared/modules/singleton';\nimport { isNil, isPositiveFiniteNumber } from '@shared/modules/validate';\nimport type { ICmsAdapter, ICmsAdapterConstructor } from '@shared/types/cms';\n\nimport {\n  T0Adapter,\n  T1Adapter,\n  T3AlistAdapter,\n  T3AppYsV2Adapter,\n  T3CatopenAdapter,\n  T3DrpyAdapter,\n  T3PyAdapter,\n  T3XbpqAdapter,\n  T3XyqAdapter,\n  T4CatvodAdapter,\n  T4DrpyJs0Adapter,\n  T4DrpysAdapter,\n} from '../adapter';\n\nconst logger = loggerService.withContext(LOG_MODULE.FILM_CMS);\n\nconst CMS_ADAPTER_MAP = {\n  [SITE_TYPE.T0_XML]: T0Adapter,\n  [SITE_TYPE.T1_JSON]: T1Adapter,\n  [SITE_TYPE.T4_DRPYJS0]: T4DrpyJs0Adapter,\n  [SITE_TYPE.T4_DRPYS]: T4DrpysAdapter,\n  [SITE_TYPE.T3_DRPY]: T3DrpyAdapter,\n  [SITE_TYPE.T4_CATVOD]: T4CatvodAdapter,\n  [SITE_TYPE.T3_XBPQ]: T3XbpqAdapter,\n  [SITE_TYPE.T3_XYQ]: T3XyqAdapter,\n  [SITE_TYPE.T3_APPYSV2]: T3AppYsV2Adapter,\n  [SITE_TYPE.T3_PY]: T3PyAdapter,\n  [SITE_TYPE.T3_ALIST]: T3AlistAdapter,\n  [SITE_TYPE.T3_CATOPEN]: T3CatopenAdapter,\n};\n\nclass WorkLruCache<K = string, V = ICmsAdapter> extends LruCache<K, V> {\n  put(key: K, value: V): V {\n    if (this.cache.has(key)) {\n      this.cache.delete(key);\n    } else if (this.cache.size >= this.capacity) {\n      const firstKey = this.cache.keys().next().value;\n\n      const pool = this.cache.get(firstKey!) as ICmsAdapter;\n      pool?.destroy?.();\n\n      this.cache.delete(this.cache.keys().next().value!);\n    }\n    this.cache.set(key, value);\n    return value;\n  }\n\n  delete(key: K): boolean {\n    if (!this.cache.has(key)) return false;\n\n    const pool = this.cache.get(key!) as ICmsAdapter;\n    pool?.destroy?.();\n\n    super.delete(key);\n    return true;\n  }\n\n  clear(): void {\n    const keys = [...this.cache.keys()];\n    for (const key of keys) {\n      this.delete(key);\n    }\n  }\n}\n\nconst CACHE_LIMIT = 10;\nconst lruCache = new WorkLruCache<string, ICmsAdapter>(CACHE_LIMIT);\n\nexport const prepare = async (uuid: string, force: boolean = false): Promise<ICmsAdapter> => {\n  if (!uuid) {\n    throw new Error('Parameter \"uuid\" is required');\n  }\n\n  const dbResSource = await dbService.site.get(uuid);\n  const source = {\n    ...dbResSource,\n    categories: dbResSource.categories\n      ? [\n          ...new Set(\n            dbResSource.categories\n              .split(/[,，]/)\n              .map((c) => c.trim())\n              .filter(Boolean),\n          ),\n        ]\n      : [],\n  };\n\n  const type = source.type;\n\n  if (isNil(type) || !isPositiveFiniteNumber(type) || !Object.hasOwn(CMS_ADAPTER_MAP, type)) {\n    throw new Error('Db data type error');\n  }\n\n  // Limit: unable to detect network data changes\n  const contentStr = JSON.stringify(source);\n  const contentHash = hash['md5-32']({ src: contentStr });\n  const idHash = `${uuid}:${contentHash}`;\n\n  if (force) lruCache.delete(idHash);\n\n  if (lruCache.has(idHash)) {\n    return lruCache.get(idHash)!;\n  } else {\n    const SingleAdapter = singleton(CMS_ADAPTER_MAP[type]);\n    if (SingleAdapter?.prepare) await SingleAdapter.prepare();\n\n    const adapter: ICmsAdapter = new SingleAdapter(source);\n    try {\n      await adapter.init();\n      lruCache.put(idHash, adapter);\n      return adapter;\n    } catch (error) {\n      logger.error(error as Error);\n\n      lruCache.delete(idHash);\n      throw new Error(`Cms adapter init failed, cause: ${(error as Error).message}`);\n    }\n  }\n};\n\nexport const terminate = async () => {\n  const modules = Object.values(CMS_ADAPTER_MAP) as Array<ICmsAdapterConstructor>;\n  for (const module of modules) {\n    const SingleAdapter = singleton(module);\n    if (SingleAdapter?.terminate) await SingleAdapter.terminate();\n  }\n\n  lruCache.clear();\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/cms/utils/cms.ts",
    "content": "import { isStrEmpty, isString } from '@shared/modules/validate';\nimport type { ICmsInfo } from '@shared/types/cms';\n\n/**\n * Format the episode information\n * @param playFroms - From of the video episodes\n * @param playUrls - Url of the video episodes\n * @returns episode\n */\nexport const formatEpisode = (playFroms: string, playUrls: string): ICmsInfo['vod_episode'] => {\n  try {\n    if (!isString(playFroms) || isStrEmpty(playFroms) || !isString(playUrls) || isStrEmpty(playUrls)) {\n      return {};\n    }\n\n    // Parsing Episode Information: Split different sources by $$$, split different episodes by #.\n    const episodesBySource = playUrls.split('$$$').map((sourceEpisodes) => {\n      return sourceEpisodes.split('#').map((episode) => {\n        const hasCustomName = episode.includes('$');\n        if (hasCustomName) {\n          const [text, link] = episode.split('$');\n          return { text: text || '正片', link: link || '' };\n        }\n        return { text: '正片', link: episode };\n      });\n    });\n\n    // Build the final data structure: play source name -> list of corresponding episodes\n    const formattedData = playFroms.split('$$$').reduce((result, sourceName, index) => {\n      const episodes = episodesBySource[index] || [];\n      result[sourceName] = episodes;\n      return result;\n    }, {});\n\n    return formattedData;\n  } catch {\n    return {};\n  }\n};\n\n/**\n * Format the content\n * @param val - Text to be formatted\n * @param key - Key of the text\n * @returns text\n */\nexport const formatInfoContent = (val: string, key?: string): string => {\n  if (!isString(val) || isStrEmpty(val)) return val?.toString() || '';\n\n  const DEFAULT_PREFIXES = [\n    '年份',\n    '年代',\n    '上映',\n    '地区',\n    '类型',\n    '语言',\n    '更新',\n    '更新至',\n    '评分',\n    '导演',\n    '编剧',\n    '主演',\n    '演员',\n    '简介',\n    '背景',\n    '详情',\n    '片长',\n    '状态',\n    '播放',\n    '集数',\n    '标签',\n  ] as const;\n\n  const SEPARATORS = ['：', ':', ' '];\n\n  let text = String(val).trim();\n\n  /** remove prefix */\n  const prefixes = key ? [key] : DEFAULT_PREFIXES;\n\n  const prefix = prefixes.find((p) => text.startsWith(p));\n  if (prefix) {\n    text = text.slice(prefix.length).trim();\n\n    const separator = SEPARATORS.find((s) => text.startsWith(s));\n    if (separator) {\n      text = text.slice(separator.length).trim();\n    }\n  }\n\n  /** normalize slash-separated values */\n  if (text.startsWith('/') || text.endsWith('/')) {\n    text = text\n      .split('/')\n      .map((s) => s.trim())\n      .filter(Boolean)\n      .join(', ');\n  }\n\n  return text;\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/edit/index.ts",
    "content": "import { pd, pdfa, pdfh, pdfl } from '@main/utils/hiker/htmlParser';\nimport {\n  decryptSchema,\n  domPdfaSchema,\n  domPdfhSchema,\n  domPdflSchema,\n  domPdSchema,\n  siftCategorySchema,\n  siftFilterSchema,\n  templateDetailSchema,\n  templateNameSchema,\n} from '@server/schemas/v1/flim/edit';\nimport type { ISiteType } from '@shared/config/film';\nimport { SITE_TYPE } from '@shared/config/film';\nimport { isObjectEmpty } from '@shared/modules/validate';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nimport { convertOriginalCode as t3DrpyDecrypt } from '../cms/adapter/t3Drpy/decrypt';\nimport { renderTemplate as t3DrpyTemplates } from '../cms/adapter/t3Drpy/templates';\nimport { siftCategory, siftFilter } from './utils/sift';\n\nconst TEMPLATES_MAP = {\n  [SITE_TYPE.T3_DRPY]: t3DrpyTemplates,\n};\n\nconst DECRYPT_MAP = {\n  [SITE_TYPE.T3_DRPY]: t3DrpyDecrypt,\n  [SITE_TYPE.T4_DRPYS]: t3DrpyDecrypt,\n};\n\nconst API_PREFIX = 'film/edit';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.post(\n    `/${API_PREFIX}/dom/pd`,\n    { schema: domPdSchema },\n    async (req: FastifyRequest<{ Body: { html: string; rule: string; baseUrl?: string } }>) => {\n      const { html, rule, baseUrl } = req.body;\n      const res = pd(html, rule, baseUrl);\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.post(\n    `/${API_PREFIX}/dom/pdfa`,\n    { schema: domPdfaSchema },\n    async (req: FastifyRequest<{ Body: { html: string; rule: string } }>) => {\n      const { html, rule } = req.body;\n      const res = pdfa(html, rule);\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.post(\n    `/${API_PREFIX}/dom/pdfh`,\n    { schema: domPdfhSchema },\n    async (req: FastifyRequest<{ Body: { html: string; rule: string; baseUrl?: string } }>) => {\n      const { html, rule, baseUrl } = req.body;\n      const res = pdfh(html, rule, baseUrl);\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.post(\n    `/${API_PREFIX}/dom/pdfl`,\n    { schema: domPdflSchema },\n    async (\n      req: FastifyRequest<{\n        Body: { html: string; rule: string; listText: string; listUrl: string; urlKey?: string };\n      }>,\n    ) => {\n      const { html, rule, listText, listUrl, urlKey = '' } = req.body;\n      const res = pdfl(html, rule, listText, listUrl, urlKey);\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.post(\n    `/${API_PREFIX}/sift/category`,\n    { schema: siftCategorySchema },\n    async (\n      req: FastifyRequest<{\n        Body: {\n          html: string;\n          baseUrl: string;\n          categoryUrl: string;\n          categoryRule: string;\n          categoryExclude?: string;\n        };\n      }>,\n    ) => {\n      const { html, baseUrl, categoryUrl, categoryRule, categoryExclude = '' } = req.body;\n      const res = siftCategory(html, baseUrl, categoryUrl, categoryRule, categoryExclude);\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.post(\n    `/${API_PREFIX}/sift/filter`,\n    { schema: siftFilterSchema },\n    async (\n      req: FastifyRequest<{\n        Body: {\n          html: string;\n          baseRule: string;\n          detailRule: string;\n          matchs: Record<string, string>;\n          ci?: string;\n          excludeKeys?: string;\n        };\n      }>,\n    ) => {\n      const { html, baseRule, detailRule, matchs, ci = '', excludeKeys = '' } = req.body;\n      const res = siftFilter(html, baseRule, detailRule, matchs, ci, excludeKeys);\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/template/:type`,\n    { schema: templateNameSchema },\n    async (req: FastifyRequest<{ Params: { type: ISiteType } }>) => {\n      const { type: rawType } = req.params;\n      const type = Number.parseInt(rawType as unknown as string);\n\n      if (isObjectEmpty(TEMPLATES_MAP[type]?.templates || {})) return { code: 0, msg: 'ok', data: [] };\n      const templates = Object.keys(TEMPLATES_MAP[type].templates);\n\n      return { code: 0, msg: 'ok', data: templates };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/template/:type/:name`,\n    { schema: templateDetailSchema },\n    async (req: FastifyRequest<{ Params: { type: ISiteType; name: string } }>) => {\n      const { type: rawType, name } = req.params;\n      const type = Number.parseInt(rawType as unknown as string);\n\n      if (!Object.hasOwn(TEMPLATES_MAP[type]?.templates || {}, name)) return { code: 0, msg: 'ok', data: '' };\n      const template = TEMPLATES_MAP[type].detail(name) || '';\n\n      return { code: 0, msg: 'ok', data: template };\n    },\n  );\n\n  fastify.post(\n    `/${API_PREFIX}/decrypt/:type`,\n    { schema: decryptSchema },\n    async (req: FastifyRequest<{ Params: { type: ISiteType }; Body: string }>) => {\n      const rawCode = req.body;\n      const { type: rawType } = req.params;\n      const type = Number.parseInt(rawType as unknown as string);\n\n      if (!Object.hasOwn(DECRYPT_MAP, type)) return { code: 0, msg: 'ok', data: '' };\n      const code = DECRYPT_MAP[type]?.(rawCode) || '';\n\n      return { code: 0, msg: 'ok', data: code };\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/edit/utils/sift.ts",
    "content": "import { pdfa, pdfh } from '@main/utils/hiker/htmlParser';\nimport type { ISiftCategoryResult } from '@shared/types/sift';\n\nexport const siftCategory = (\n  html: string,\n  base_url: string,\n  category_url: string,\n  category_rule: string,\n  category_exclude: string = '',\n): ISiftCategoryResult => {\n  const host = new URL(base_url).origin;\n  const [listSelector, titleSelector, urlSelector, matchPattern] = category_rule.split(';').map((s) => s.trim());\n  const excludePattern = new RegExp(['首页', '留言求片', 'APP'].join('|'), 'gi');\n\n  const categories = pdfa(html, listSelector)\n    .map((item) => {\n      const title = pdfh(item, titleSelector).trim();\n      if ((category_exclude && new RegExp(category_exclude).test(title)) || excludePattern.test(title)) {\n        return null;\n      }\n\n      const itemUrl = pdfh(item, urlSelector);\n      const categoryItem: Record<string, string> = { title, path_url: itemUrl };\n\n      if (matchPattern) {\n        const matchResult = itemUrl.match(new RegExp(matchPattern));\n        if (matchResult) {\n          categoryItem.uuid = matchResult[1];\n        } else {\n          return null;\n        }\n      }\n\n      if (category_url) {\n        if (category_url.startsWith('http')) {\n          categoryItem.source_url = category_url.replace('fyclass', categoryItem.uuid);\n        } else {\n          categoryItem.source_url = host + category_url.replace('fyclass', categoryItem.uuid);\n        }\n      } else {\n        categoryItem.source_url = host + categoryItem.url;\n      }\n      return categoryItem;\n    })\n    .filter(Boolean) as ISiftCategoryResult['raw'];\n\n  const convertArrayToObject = (array: any[], excludedKeys: string[] = []): { title: string; uuid: string } =>\n    array.reduce((acc, curr) => {\n      Object.entries(curr).forEach(([key, value]) => {\n        if (!excludedKeys.includes(key)) {\n          acc[key] = acc[key] ? `${acc[key]}&${value}` : value?.toString();\n        }\n      });\n      return acc;\n    }, {});\n\n  const { title, uuid } = convertArrayToObject(categories, ['source_url', 'path_url']);\n\n  return { title, uuid, raw: categories };\n};\n\nexport const siftFilter = (\n  html: string,\n  base_rule: string,\n  detail_rule: string,\n  matchs: Record<string, string> = {},\n  ci: string = '',\n  exclude_keys: string = '',\n) => {\n  const filters: Array<{ key: string; name: string; value: { n: string; v: string }[] }> = [];\n  const links: Record<number, string[]> = {};\n  const list = base_rule.split(/[\\r\\n]/).filter(Boolean);\n\n  let fs = 0;\n  list.forEach((item: string | string[], id) => {\n    let [key, name, type = 'body&&a', title = 'a&&Text', url = 'a&&href'] = detail_rule.split(/[\\r\\n]/)[id].split(';');\n    let rename = '';\n\n    if (name && name.includes('@r')) {\n      const tk = name.split('@');\n      name = tk[0];\n      rename = tk[1].replace(/^r/, '.replace');\n    }\n\n    if (item.includes(';')) {\n      item = (item as string).split(';').filter(Boolean);\n    }\n\n    let content: string[] = [];\n    if (Array.isArray(item)) {\n      content = item.map((e) => pdfa(html, e)).flat();\n    } else {\n      content = pdfa(html, item);\n    }\n\n    content.forEach((it) => {\n      let n = name.startsWith('s:') ? name.replace('s:', '') : pdfh(it, name);\n\n      if (rename) {\n        // eslint-disable-next-line no-new-func\n        const func = new Function('str', `return (str${rename});`);\n        // n = eval('n' + rename);\n        n = func(n);\n      }\n\n      const k = key === '' ? n : key.startsWith('s:') ? key.replace('s:', '') : pdfh(it, key);\n\n      // 排除键\n      if (exclude_keys.split('|').includes(k)) return;\n\n      const typeMatch = pdfa(it, type);\n      fs++;\n\n      links[fs] = [];\n      const filterResults: Array<{ title: string; match_part: string; path_url: string }> = typeMatch\n        .map((y) => {\n          const parsedTitle = pdfh(y, title);\n          if (parsedTitle === k) return null;\n\n          const pathUrl = pdfh(y, url);\n          let matchPart = '';\n\n          let me = matchs[fs] || matchs[k];\n          let add: string | undefined;\n\n          if (me) {\n            const regexList = me.split(/[\\r\\n]/g).filter(Boolean);\n\n            if (regexList.length > 1) {\n              const regex = regexList.find((rr) => rr.startsWith(`${ci}::`));\n              me = regex?.split('::')[1] || regexList[0];\n            } else {\n              me = regexList[0];\n            }\n\n            let error: string | undefined;\n            // let add: string | undefined;\n            if (me.includes('@@')) {\n              const [main, err] = me.split('@@');\n              me = main;\n              error = err;\n\n              if (error?.includes('##')) {\n                const te = error.split('##');\n                error = te[0];\n                // add = te[1];\n              }\n            } else if (me.includes('##')) {\n              const [main, _addition] = me.split('##');\n              me = main;\n              // // eslint-disable-next-line ts/no-unused-vars\n              // add = addition;\n            }\n            if (error !== undefined) {\n              error = error.replace('fyclass', ci);\n            }\n\n            try {\n              const str = pathUrl;\n              links[fs].push(str);\n              matchPart = decodeURIComponent(new RegExp(me).exec(str)?.[1] || '');\n            } catch {\n              if (error) matchPart = error;\n            }\n          }\n\n          if (add) matchPart += add;\n\n          const res = { title: parsedTitle, match_part: matchPart, path_url: pathUrl };\n          return res;\n        })\n        .filter((item): item is { title: string; match_part: string; path_url: string } => item !== null);\n\n      filters.push({\n        key: k,\n        name: n,\n        value: filterResults.map((item) => ({\n          n: item.title,\n          v: item.match_part !== undefined ? item.match_part : item.path_url,\n        })),\n      });\n    });\n  });\n\n  return { filters, fs, links, fl: filters.map((x) => x.key) };\n};\n\nexport default { siftCategory, siftFilter };\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/index.ts",
    "content": "import cms from './cms';\nimport edit from './edit';\nimport rec from './rec';\nimport site from './site';\n\nexport { cms, edit, rec, site };\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/rec/index.ts",
    "content": "import { dbService } from '@main/services/DbService';\nimport { getBarrageSchema, getHotSchema, getMatchSchema, sendBarrageSchema } from '@server/schemas/v1/flim/rec';\nimport { isObject, isObjectEmpty, isStrEmpty, isString } from '@shared/modules/validate';\nimport type { IBarrageSendOptions } from '@shared/types/barrage';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nimport { fetchBarrage, sendBarrage } from './utils/barrage';\nimport { fetchDoubanRecomm } from './utils/douban';\nimport fetchHot from './utils/hot';\n\nconst API_PREFIX = 'film/rec';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.get(\n    `/${API_PREFIX}/barrage`,\n    { schema: getBarrageSchema },\n    async (req: FastifyRequest<{ Querystring: { id?: string } }>) => {\n      const { id } = req.query || {};\n      if (!isString(id) || isStrEmpty(id)) return { code: -1, msg: 'Invalid parameters', data: [] };\n\n      const dbResBarrage = await dbService.setting.getValue('barrage');\n      const res = await fetchBarrage(id, dbResBarrage);\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.post(\n    `/${API_PREFIX}/barrage`,\n    { schema: sendBarrageSchema },\n    async (req: FastifyRequest<{ Body: IBarrageSendOptions }>) => {\n      const options = req.body;\n      if (!isObject(options) || isObjectEmpty(options)) return { code: -1, msg: 'Invalid parameters', data: false };\n\n      const dbResBarrage = await dbService.setting.getValue('barrage');\n      const res = await sendBarrage(dbResBarrage?.url, options);\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/hot`,\n    { schema: getHotSchema },\n    async (\n      req: FastifyRequest<{\n        Querystring: {\n          source?: 'komect' | 'douban' | 'quark' | 'baidu' | 'kylive' | 'enlightent';\n          date?: string;\n          type?: number;\n          page?: number;\n          pageSize?: number;\n        };\n      }>,\n    ) => {\n      const { page = 1, pageSize = 10, source, date, type = 1 } = req.query || {};\n\n      const dataSource = source || (await dbService.setting.getValue('hot')) || 'komect';\n      if (!['komect', 'douban', 'quark', 'baidu', 'kylive', 'enlightent'].includes(dataSource)) {\n        return { code: 0, msg: 'ok', data: [] };\n      }\n\n      const res = await fetchHot[dataSource]({ date, type, page, pageSize });\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/match`,\n    { schema: getMatchSchema },\n    async (req: FastifyRequest<{ Querystring: { name?: string; year?: number; id?: string; type?: string } }>) => {\n      const { name, year, id, type } = req.query || {};\n      const res = await fetchDoubanRecomm({ name, year, id, type });\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/rec/utils/barrage.ts",
    "content": "import { loggerService } from '@logger';\nimport { request } from '@main/utils/request';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport { stripUrlParam } from '@shared/modules/headers';\nimport { objPathValue } from '@shared/modules/obj';\nimport { isArray, isArrayEmpty, isHttp, isPositiveFiniteNumber, isStrEmpty, isString } from '@shared/modules/validate';\nimport type { IBarrage, IBarrageResult, IBarrageSendOptions } from '@shared/types/barrage';\n\nconst logger = loggerService.withContext(LOG_MODULE.FILM_REC_BARRAGE);\n\ninterface IBarrageOptions {\n  url: string;\n  id: string;\n  key: string;\n  type: number;\n  text: number;\n  time: number;\n  color: number;\n}\n\nexport const fetchBarrage = async (id: string, options: IBarrageOptions): Promise<IBarrageResult> => {\n  if (\n    !isHttp(options.url) ||\n    !isString(options.id) ||\n    isStrEmpty(options.id) ||\n    !isString(options.key) ||\n    isStrEmpty(options.key) ||\n    !isPositiveFiniteNumber(options.type) ||\n    !isPositiveFiniteNumber(options.text) ||\n    !isPositiveFiniteNumber(options.time) ||\n    !isPositiveFiniteNumber(options.color)\n  ) {\n    return { id: '', list: [] };\n  }\n\n  const url = options.url.replace('{id}', id);\n\n  let barrageRes: any;\n  try {\n    const { data } = await request.request({ url, method: 'GET' });\n    barrageRes = data;\n  } catch (error) {\n    logger.error('fetch barrage request error:', error as Error);\n    return { id: '', list: [] };\n  }\n\n  const comments = objPathValue(barrageRes, options.key) || [];\n  const uuid = objPathValue(barrageRes, options.id) || id;\n  if (!isArray(comments) || isArrayEmpty(comments)) return { id: '', list: [] };\n\n  const res: IBarrage[] = comments\n    .map((item, index) => {\n      const time = Number.parseFloat(item?.[options.time]);\n      if (!isPositiveFiniteNumber(time) || isStrEmpty(item?.[options.text])) return null;\n\n      const rawType = item?.[options.type];\n      const type: IBarrage['type'] = ['top', 'bottom', 'left', 'right'].includes(rawType) ? rawType : 'left';\n\n      const rawColor = item?.[options.color];\n      const color: IBarrage['color'] = isString(rawColor) && !isStrEmpty(rawColor) ? rawColor : '#FFFFFF';\n\n      return {\n        id: String(index + 1),\n        type,\n        text: String(item[options.text]),\n        time,\n        color,\n      };\n    })\n    .filter(Boolean)\n    .sort((a, b) => a!.time - b!.time) as IBarrage[];\n\n  return { id: uuid, list: res };\n};\n\nexport const sendBarrage = async (url: string, options: IBarrageSendOptions): Promise<boolean> => {\n  const { id, type, color, text, time, size } = options;\n  if (\n    !isHttp(url) ||\n    !isString(id) ||\n    isStrEmpty(id) ||\n    !['top', 'bottom', 'left', 'right'].includes(type) ||\n    !isString(text) ||\n    isStrEmpty(text) ||\n    !isPositiveFiniteNumber(time)\n  ) {\n    return false;\n  }\n\n  const postUrl = stripUrlParam(url, '{id}', 'value');\n\n  let barrageRes: any;\n  try {\n    const { data } = await request.request({\n      url: postUrl,\n      method: 'POST',\n      data: { player: id, type, text, time, color: color || '#ffffff', size: size || '24px' },\n    });\n    barrageRes = data;\n  } catch (error) {\n    logger.error('post barrage error:', error as Error);\n    return false;\n  }\n\n  if (barrageRes?.code === 23 || barrageRes?.msg === true) {\n    return true;\n  }\n\n  return false;\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/rec/utils/douban.ts",
    "content": "import { loggerService } from '@logger';\nimport { request } from '@main/utils/request';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport {\n  isArrayEmpty,\n  isNil,\n  isObjectEmpty,\n  isPositiveFiniteNumber,\n  isStrEmpty,\n  isString,\n} from '@shared/modules/validate';\nimport type { IRecMatch } from '@shared/types/cms';\n\nconst logger = loggerService.withContext(LOG_MODULE.FILM_REC_DOUBAN);\n\ninterface IRecommSearch {\n  vod_douban_id?: string;\n  vod_douban_type?: string;\n  vod_score?: number;\n  vod_name?: string;\n  vod_year?: number;\n}\n\ninterface IRecommDetail {\n  type_name?: string;\n  vod_douban_id?: string;\n  vod_douban_type?: string;\n  vod_lang?: string;\n  vod_score?: number;\n  vod_name?: string;\n  vod_year?: number;\n  vod_pic?: string;\n  vod_blurb?: string;\n  vod_content?: string;\n  vod_director?: string;\n  vod_actor?: string;\n}\n\n/**\n * Get douban base info with name and year\n */\nexport const fetchDoubanSearch = async (doc: { name: string; year: number }): Promise<IRecommSearch> => {\n  try {\n    let { name, year } = doc || {};\n\n    if (isString(String(year)) && !isStrEmpty(String(year))) {\n      year = Number.parseInt(String(year));\n    }\n\n    if (!isString(name) || isStrEmpty(name) || !isPositiveFiniteNumber(year)) {\n      return {};\n    }\n\n    const url = 'https://m.douban.com/rexxar/api/v2/search/subjects';\n    const { data: resp } = await request.request({\n      url,\n      method: 'GET',\n      headers: {\n        Referer: 'https://movie.douban.com',\n      },\n      params: {\n        q: name,\n      },\n    });\n\n    const list = resp?.subjects?.items;\n    if (isArrayEmpty(list)) return {};\n\n    for (const node of list) {\n      const t = node?.target;\n      if (isNil(t) || isObjectEmpty(t)) continue;\n\n      const isMovie = node.target_type === 'movie';\n      const isTv = node.target_type === 'tv';\n      if (!isMovie && !isTv) continue;\n\n      if (t.title === name && Number(t.year) === year) {\n        return {\n          vod_douban_id: t.id ?? '',\n          vod_douban_type: node.target_type,\n          vod_score: Number(t.rating?.value) || 0,\n          vod_name: t.title ?? '',\n          vod_year: Number(t.year ?? 1970),\n        };\n      }\n    }\n\n    return {};\n  } catch (error) {\n    logger.error('Failed to fetch douban search', error as Error);\n    return {};\n  }\n};\n\n/**\n * Get douban detail info with id\n */\nexport const fetchDoubanDetail = async (doc: { id: string; type: string }): Promise<IRecommDetail> => {\n  try {\n    const { id, type } = doc || {};\n\n    if (!isString(id) || isStrEmpty(id) || !isString(type) || isStrEmpty(type)) {\n      return {};\n    }\n\n    const url = `https://m.douban.com/rexxar/api/v2/${type}/${id}`;\n    const { data: resp } = await request.request({\n      url,\n      method: 'GET',\n      headers: {\n        Referer: 'https://movie.douban.com',\n      },\n    });\n\n    if (isObjectEmpty(resp)) return {};\n\n    return {\n      type_name: resp.genres.join(','),\n      vod_douban_id: resp.id ?? '',\n      vod_douban_type: resp.target_type ?? type,\n      vod_lang: resp.languages.join(','),\n      vod_score: Number(resp.rating?.value) || 0,\n      vod_name: resp.title ?? '',\n      vod_year: Number(resp.year ?? 1970),\n      vod_pic: resp.pic?.normal || resp.pic?.large || '',\n      vod_blurb: resp.intro ?? '',\n      vod_content: resp.intro ?? '',\n      vod_director: resp.directors.map((item) => item.name).join(',') ?? '',\n      vod_actor: resp.actors.map((item) => item.name).join(',') ?? '',\n    };\n  } catch (error) {\n    logger.error('Failed to fetch douban detail', error as Error);\n    return {};\n  }\n};\n\n/**\n * Get douban ratings\n */\nexport const fetchDoubanRate = async (doc: {\n  id?: string;\n  type?: string;\n  name?: string;\n  year?: number;\n}): Promise<number> => {\n  try {\n    let { id, type, name, year } = doc || {};\n\n    if (isString(String(year)) && !isStrEmpty(String(year))) {\n      year = Number.parseInt(String(year));\n    }\n\n    const hasId = isString(id) && !isStrEmpty(id) && isString(type) && !isStrEmpty(type);\n    const hasName = isString(name) && !isStrEmpty(name) && !isPositiveFiniteNumber(year);\n\n    if (!hasId && !hasName) {\n      return 0;\n    }\n\n    const resp = hasId\n      ? await fetchDoubanDetail({ id: id!, type: type! })\n      : await fetchDoubanSearch({ name: name!, year: year! });\n\n    const score = Number(resp?.vod_score || 0);\n    return isPositiveFiniteNumber(score) ? score : 0;\n  } catch (error) {\n    logger.error('Failed to fetch douban rate', error as Error);\n    return 0.0;\n  }\n};\n\n/**\n * Get douban related video recommendation list\n */\nexport const fetchDoubanRecomm = async (doc: {\n  id?: string;\n  type?: string;\n  name?: string;\n  year?: number;\n}): Promise<IRecMatch[]> => {\n  try {\n    let { id, type, name, year } = doc || {};\n    let doubanId = id;\n    let doubanType = type;\n\n    if (isString(String(year)) && !isStrEmpty(String(year))) {\n      year = Number.parseInt(String(year));\n    }\n\n    const hasId = isString(id) && !isStrEmpty(id) && isString(type) && !isStrEmpty(type);\n    const hasName = isString(name) && !isStrEmpty(name) && !isNil(year) && isPositiveFiniteNumber(year);\n\n    if (!hasId && !hasName) {\n      return [];\n    }\n\n    if (!hasId && hasName) {\n      const searchResult = await fetchDoubanSearch({ name: name!, year: year! });\n      doubanId = searchResult.vod_douban_id ?? '';\n      doubanType = searchResult.vod_douban_type ?? '';\n    }\n\n    if (isStrEmpty(doubanId) || isStrEmpty(doubanType)) {\n      return [];\n    }\n\n    const url = `https://m.douban.com/rexxar/api/v2/${doubanType}/${doubanId}/recommendations`;\n    const { data: resp } = await request.request({\n      url,\n      method: 'GET',\n      headers: {\n        Referer: 'https://movie.douban.com',\n      },\n    });\n\n    const data = resp.map((item) => ({\n      vod_name: item.title ?? '',\n      vod_pic: item.pic?.large || item.pic?.normal || '',\n      vod_douban_id: String(item.id ?? ''),\n      vod_douban_type: item.type,\n    }));\n\n    return data ?? [];\n  } catch (error) {\n    logger.error('Failed to fetch douban recomm', error as Error);\n    return [];\n  }\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/rec/utils/hot.ts",
    "content": "import { loggerService } from '@logger';\nimport { request } from '@main/utils/request';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport { randomNanoid } from '@shared/modules/crypto';\nimport { toM, toUnix, toY, toYMD } from '@shared/modules/date';\nimport { isArrayEmpty, isNil, isPositiveFiniteNumber, isStrEmpty, isString } from '@shared/modules/validate';\n\nconst logger = loggerService.withContext(LOG_MODULE.FILM_REC_HOT);\n\nexport interface IRecommHot {\n  vod_id: string | number;\n  vod_name: string;\n  vod_hot: number;\n  vod_pic?: string;\n  vod_remarks?: string;\n}\n\nexport interface IRecommHotOptions {\n  type?: number;\n  date?: string;\n  pageSize?: number;\n  page?: number;\n}\n\n/**\n * 百度\n *\n * @see https://www.baidu.com/s?wd=%E7%94%B5%E8%A7%86%E5%89%A7%E6%8E%92%E8%A1%8C%E6%A6%9C\n */\nexport const baidu = async (doc: IRecommHotOptions = {}): Promise<IRecommHot[]> => {\n  try {\n    let { type = 1, pageSize = 20, page = 1 } = doc;\n\n    if (isString(type)) type = Number.parseInt(type);\n    if (![1, 2].includes(type)) type = 1; // 1:电影 2:电视剧\n\n    if (isString(pageSize)) pageSize = Number.parseInt(pageSize);\n    if (isString(page)) page = Number.parseInt(page);\n    if (!isPositiveFiniteNumber(pageSize)) pageSize = 20;\n    if (!isPositiveFiniteNumber(page)) page = 1;\n\n    const TYPE_MAP = {\n      1: '电影',\n      2: '电视剧',\n    };\n\n    const url = 'https://opendata.baidu.com/api.php';\n    const { data: resp } = await request.request({\n      url,\n      method: 'GET',\n      params: {\n        resource_id: 51274,\n        ks_from: 'aladdin',\n        new_need_di: 1,\n        from_mid: 1,\n        sort_type: 1,\n        query: `${TYPE_MAP[type]}排行榜`, // 电视剧排行榜 | 电影排行榜\n        tn: 'wisexmlnew',\n        dsp: 'iphone',\n        format: 'json',\n        ie: 'utf-8',\n        oe: 'utf-8',\n        q_ext: { query_key: 3, is_person_related: 0, video_type_list: [] },\n        sort_key: 1, // 1:最热 2:最新 3:好评\n        stat0: TYPE_MAP[type], // 电视剧 | 电影\n        stat1: '全部',\n        stat2: '全部',\n        stat3: '全部',\n        rn: pageSize,\n        pn: (page - 1) * pageSize, // 从第几条开始\n        trigger_srcid: 51251,\n        sid: '60274_62325_63145_63948_64364_64437_64450_64566_64580_64647_64710_64740_64743_64739_64763_64702_64822_64818_64813_64839_64912_64915_64954_64934_64968_64985_65044_65050_65077_65085_65080',\n        // cb: 'jsonp_1757148729846_55022'\n      },\n    });\n\n    if (resp.ResultCode !== 0) return [];\n\n    const rawList = resp.Result?.[0]?.DisplayData?.resultData?.tplData?.result?.result;\n    if (isNil(rawList) || isArrayEmpty(rawList)) return [];\n\n    return rawList\n      .map((item) => ({\n        vod_id: item.urlsign ?? '',\n        vod_name: item.ename ?? '',\n        vod_remarks: item.additional ?? '',\n        vod_pic: item.img ?? '',\n        vod_hot: Number(item?.douBanInfo?.score) || 0,\n      }))\n      .sort((a, b) => b.vod_hot - a.vod_hot);\n  } catch (error) {\n    logger.error('Failed to fetch baidu hot', error as Error);\n    return [];\n  }\n};\n\n/**\n * 豆瓣\n *\n * @see 小程序\n */\nexport const douban = async (doc: IRecommHotOptions = {}): Promise<IRecommHot[]> => {\n  let { type = 1, pageSize = 20, page = 1 } = doc;\n\n  if (isString(type)) type = Number.parseInt(type);\n  if (![1, 2, 3].includes(type)) type = 1; // 1:电影(影院热映) 2:电视剧(豆瓣热播) 3:综艺(热播综艺)\n\n  if (isString(pageSize)) pageSize = Number.parseInt(pageSize);\n  if (isString(page)) page = Number.parseInt(page);\n  if (!isPositiveFiniteNumber(pageSize)) pageSize = 20;\n  if (!isPositiveFiniteNumber(page)) page = 1;\n\n  const TYPE_MAP = {\n    1: 'movie_showing',\n    2: 'tv_hot',\n    3: 'tv_variety_show',\n  };\n\n  try {\n    const url = `https://m.douban.com/rexxar/api/v2/subject_collection/${TYPE_MAP[type]}/items`;\n    const { data: resp } = await request.request({\n      url,\n      method: 'GET',\n      headers: {\n        Referer: 'https://movie.douban.com',\n      },\n      params: {\n        start: (page - 1) * pageSize,\n        count: pageSize,\n      },\n    });\n\n    const rawList = resp?.subject_collection_items;\n    if (isNil(rawList) || isArrayEmpty(rawList)) return [];\n\n    return rawList\n      .map((item) => {\n        const base = {\n          vod_id: item.id ?? '',\n          vod_name: item.title ?? '',\n          vod_hot: Number(item.allHot) || 0,\n          vod_pic: '',\n          vod_remarks: item.card_subtitle ?? '',\n        };\n\n        if (item.type === 'tv') {\n          base.vod_pic = item.pic?.large || item.pic?.normal || '';\n          base.vod_hot = Number(item.rating?.count) || 0;\n        } else if (item.type === 'movie') {\n          base.vod_pic = item.cover?.url || '';\n          base.vod_hot = Number(item.rating?.value) || 0;\n        }\n\n        return base;\n      })\n      .sort((a, b) => b.vod_hot - a.vod_hot);\n  } catch (error) {\n    logger.error('Failed to fetch douban hot', error as Error);\n    return [];\n  }\n};\n\n/**\n * 云合\n *\n * @see https://www.enlightent.cn/program.html - 小程序\n */\nexport const enlightent = async (doc: IRecommHotOptions = {}): Promise<IRecommHot[]> => {\n  try {\n    let { date, type } = doc;\n\n    if (isStrEmpty(date) || isNil(date)) date = toYMD();\n    date = date.replace(/-/g, '/');\n\n    if (isString(type)) type = Number.parseInt(type);\n    if (isNil(type) || ![1, 2, 3].includes(type)) type = 1; // 1:电影 2:电视剧 3:综艺\n\n    const TYPE_MAP = {\n      1: 'movie',\n      2: 'tv',\n      3: 'art',\n    };\n\n    const url = 'https://www.enlightent.cn/sxapi/top/getHeatTop.do';\n    const { data: resp } = await request.request({\n      url,\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n      },\n      data: {\n        sort: 'allHot',\n        channelType: TYPE_MAP[type],\n        day: 1,\n        date,\n      },\n    });\n\n    const rawList = resp?.content;\n    if (isNil(rawList) || isArrayEmpty(rawList)) return [];\n\n    return rawList\n      .map((item) => ({\n        vod_id: item.nameId ?? '',\n        vod_name: item.name ?? '',\n        vod_hot: Number(item.allHot) || 0,\n        vod_remarks: item.channel ?? '',\n      }))\n      .sort((a, b) => b.vod_hot - a.vod_hot);\n  } catch (error) {\n    logger.error('Failed to fetch enlightent hot', error as Error);\n    return [];\n  }\n};\n\n/**\n * 酷云\n *\n * @see https://www.ky.live\n */\nexport const kylive = async (doc: IRecommHotOptions = {}): Promise<IRecommHot[]> => {\n  try {\n    let { date, type } = doc;\n    if (isStrEmpty(date) || isNil(date)) date = toYMD();\n    if (isString(type)) type = Number.parseInt(type);\n    if (isNil(type) || ![2, 3].includes(type)) type = 2; // 2:电视剧 3:综艺\n\n    const month = (toM(date) as unknown as number) - 1 || 12;\n    const year = (toY(date) as unknown as number) - (month === 12 ? 1 : 0);\n\n    const TYPE_MAP = {\n      2: 2,\n      3: 3,\n    };\n\n    const url = 'https://www.ky.live/api/full';\n    const { data: resp } = await request.request({\n      url,\n      method: 'GET',\n      params: {\n        dt: 3,\n        y: year,\n        m: month,\n        vt: TYPE_MAP[type],\n      },\n    });\n\n    if (!resp?.status) return [];\n\n    const rawList = resp.data;\n    if (isNil(rawList) || isArrayEmpty(rawList)) return [];\n\n    return rawList\n      .map((item) => ({\n        vod_id: item.caid ?? '',\n        vod_name: item.epg ?? '',\n        vod_remarks: isPositiveFiniteNumber(item.mr) ? `播放市占${(item.mr * 100).toFixed(2)}%` : '播放市占0.00%',\n        vod_hot: Number(item.count) || 0,\n      }))\n      .sort((a, b) => b.vod_hot - a.vod_hot);\n  } catch (error) {\n    logger.error('Failed to fetch kylive hot', error as Error);\n    return [];\n  }\n};\n\n/**\n * 移动爱家(未来电视数据)\n *\n * @see https://msi.nsoap.komect.com/minitvH5/index.html#/hotlist?licensedParty=未来电视&isOuter=undefined&provCode=42&deviceType=502090&isNewTheme=2\n */\nexport const komect = async (doc: IRecommHotOptions = {}): Promise<IRecommHot[]> => {\n  try {\n    let { type = 1, pageSize = 20, page = 1 } = doc;\n\n    if (isString(type)) type = Number.parseInt(type);\n    if (![1, 2, 3, 4].includes(type)) type = 1; // 1:电影 2:电视剧 3:综艺 4:少儿(动漫)\n\n    if (isString(pageSize)) pageSize = Number.parseInt(pageSize);\n    if (isString(page)) page = Number.parseInt(page);\n    if (!isPositiveFiniteNumber(pageSize)) pageSize = 20;\n    if (!isPositiveFiniteNumber(page)) page = 1;\n\n    const TYPE_MAP = {\n      1: '电影',\n      2: '电视剧',\n      3: '综艺',\n      4: '少儿',\n    };\n\n    const url = 'https://msi.nsoap.komect.com/msi/cbiz/dp/contentInfo/homePage/list';\n    const { data: resp } = await request.request({\n      url,\n      method: 'POST',\n      headers: {\n        auth: '3637df52d98ce8815fe47bbe49fe6459',\n        Origin: 'https://msi.nsoap.komect.com',\n        Referer: 'https://msi.nsoap.komect.com/minitvH5/index.html',\n        channelId: 'H5',\n      },\n      data: {\n        openId: '111',\n        provCode: '42',\n        licensedParty: '未来电视',\n        deviceType: '502090',\n        contentTypeIndexs: [\n          {\n            contentType: TYPE_MAP[type],\n            pageNum: page,\n            pageSize,\n          },\n        ],\n      },\n    });\n\n    if (resp.recode !== 1) return [];\n\n    const rawList = resp.data?.items?.[0]?.contentInfoList;\n    if (isNil(rawList) || isArrayEmpty(rawList)) return [];\n\n    return rawList\n      .map((item) => ({\n        vod_id: item.psId ?? '',\n        vod_name: item.dpContentName ?? '',\n        vod_pic: item.dpContentPicUrl ?? '',\n        vod_hot: Number(item.dpPlayCount) || 0,\n        vod_remarks: item.dpContentShortDesc ?? '',\n      }))\n      .filter((v) => v.vod_id)\n      .sort((a, b) => b.vod_hot - a.vod_hot);\n  } catch (error) {\n    logger.error('Failed to fetch komect hot', error as Error);\n    return [];\n  }\n};\n\n/**\n * 夸克\n *\n * @see https://vt.quark.cn/blm/video-list-544/tab?app=college&hot=电视剧&type=电视剧热搜&hottype=true&video=电视剧\n * @see https://vt.quark.cn/blm/video-list-544/tab?app=college&hot=电影&type=电影热搜&hottype=true&video=电影\n * @see https://vt.quark.cn/blm/video-list-544/tab?app=college&hot=综艺&type=综艺热搜&hottype=true&video=综艺\n */\nexport const quark = async (doc: IRecommHotOptions = {}): Promise<IRecommHot[]> => {\n  try {\n    let { type = 1, pageSize = 20, page = 1 } = doc;\n\n    if (isString(type)) type = Number.parseInt(type);\n    if (![1, 2, 3].includes(type)) type = 1; // 1:电影 2:电视剧 3:综艺\n\n    if (isString(pageSize)) pageSize = Number.parseInt(pageSize);\n    if (isString(page)) page = Number.parseInt(page);\n    if (!isPositiveFiniteNumber(pageSize)) pageSize = 20;\n    if (!isPositiveFiniteNumber(page)) page = 1;\n\n    const TYPE_MAP = {\n      1: '电影',\n      2: '电视剧',\n      3: '综艺',\n    };\n\n    const url = 'https://quark.sm.cn/api/rest';\n    const { data: resp } = await request.request({\n      url,\n      method: 'GET',\n      params: {\n        method: 'yingshi_list.getData',\n        q: 'default',\n        hit: pageSize,\n        fi_channel: TYPE_MAP[type],\n        vendor: 100002,\n        belong: 'other',\n        start: page,\n        fi_rank_type: '最新',\n        fi_cate: '全部',\n        fi_area: '全部',\n        fi_year: '全部',\n        second_tag: true,\n        _: toUnix(),\n      },\n    });\n\n    const rawList = resp.item;\n    if (isNil(rawList) || isArrayEmpty(rawList)) return [];\n\n    return rawList\n      .map((item) => ({\n        vod_id: randomNanoid() ?? '',\n        vod_name: item.title ?? '',\n        vod_remarks: item.episode_count ?? '',\n        vod_pic: item.src ?? '',\n        vod_hot: Number(item.hot_score) || 0,\n      }))\n      .sort((a, b) => b.vod_hot - a.vod_hot);\n  } catch (error) {\n    logger.error('Failed to fetch quark hot', error as Error);\n    return [];\n  }\n};\n\nexport default {\n  komect,\n  douban,\n  quark,\n  baidu,\n  kylive,\n  enlightent,\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/film/site.ts",
    "content": "import { dbService } from '@main/services/DbService';\nimport {\n  addSchema,\n  deleteSchema,\n  getActiveSchema,\n  getDetailByKeySchema,\n  getDetailSchema,\n  pageSchema,\n  putSchema,\n  setDefaultSchema,\n} from '@server/schemas/v1/flim/site';\nimport type { IModels } from '@shared/types/db';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nconst API_PREFIX = 'film/site';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.post(`/${API_PREFIX}`, { schema: addSchema }, async (req: FastifyRequest<{ Body: IModels['site'] }>) => {\n    const dbRes = await dbService.site.add(req.body);\n    return { code: 0, msg: 'ok', data: dbRes };\n  });\n\n  fastify.delete(\n    `/${API_PREFIX}`,\n    { schema: deleteSchema },\n    async (req: FastifyRequest<{ Body: { id?: string[] } | null }>) => {\n      const { id } = req.body || {};\n      if (id && id.length !== 0) {\n        await dbService.site.remove(id);\n      } else {\n        await dbService.site.clear();\n      }\n      return { code: 0, msg: 'ok', data: null };\n    },\n  );\n\n  fastify.put(\n    `/${API_PREFIX}`,\n    { schema: putSchema },\n    async (req: FastifyRequest<{ Body: { id: string[]; doc: IModels['site'] } }>) => {\n      const { id, doc } = req.body;\n      const dbRes = await dbService.site.update(id, doc);\n      return { code: 0, msg: 'ok', data: dbRes };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/page`,\n    { schema: pageSchema },\n    async (req: FastifyRequest<{ Querystring: { page: number; pageSize: number; kw?: string } }>) => {\n      const { page = 1, pageSize = 10, kw } = req.query;\n\n      const [dbResPage, dbResGroup, dbResDefaultId] = await Promise.all([\n        dbService.site.page(page, pageSize, kw),\n        dbService.site.group(),\n        dbService.setting.getValue('defaultSite'),\n      ]);\n\n      return {\n        code: 0,\n        msg: 'ok',\n        data: {\n          list: dbResPage.list,\n          total: dbResPage.total,\n          default: dbResDefaultId,\n          group: dbResGroup,\n        },\n      };\n    },\n  );\n\n  fastify.get(`/${API_PREFIX}/active`, { schema: getActiveSchema }, async () => {\n    const [dbResAll, dbResGroup, dbResDefaultId, dbResSite] = await Promise.all([\n      dbService.site.active(),\n      dbService.site.group(),\n      dbService.setting.getValue('defaultSite'),\n      dbService.setting.getValue('site'),\n    ]);\n\n    const dbResDefault = await dbService.site.get(dbResDefaultId);\n\n    return {\n      code: 0,\n      msg: 'ok',\n      data: {\n        list: dbResAll,\n        default: dbResDefault,\n        extra: {\n          group: dbResGroup,\n          filter: dbResSite.filterMode,\n          search: dbResSite.searchMode,\n        },\n      },\n    };\n  });\n\n  fastify.get(\n    `/${API_PREFIX}/:id`,\n    { schema: getDetailSchema },\n    async (req: FastifyRequest<{ Params: { id: string } }>) => {\n      const { id } = req.params;\n      const dbRes = await dbService.site.get(id);\n      return { code: 0, msg: 'ok', data: dbRes };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/key/:key`,\n    { schema: getDetailByKeySchema },\n    async (req: FastifyRequest<{ Params: { key: string } }>) => {\n      const { key } = req.params;\n      const dbRes = await dbService.site.getByField({ key });\n      const res = dbRes?.[0];\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.put(\n    `/${API_PREFIX}/default/:id`,\n    { schema: setDefaultSchema },\n    async (req: FastifyRequest<{ Params: { id: string } }>) => {\n      const { id } = req.params;\n      await dbService.setting.update({ key: 'defaultSite', value: id });\n      return { code: 0, msg: 'ok', data: true };\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/live/channel.ts",
    "content": "import { dbService } from '@main/services/DbService';\nimport {\n  addSchema,\n  deleteSchema,\n  getDetailSchema,\n  getEpgSchema,\n  pageSchema,\n  putSchema,\n} from '@server/schemas/v1/live/channel';\nimport { isStrEmpty } from '@shared/modules/validate';\nimport type { IModels } from '@shared/types/db';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nimport { convertToStandard } from './utils/epg';\n\nconst API_PREFIX = 'live/channel';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.post(`/${API_PREFIX}`, { schema: addSchema }, async (req: FastifyRequest<{ Body: IModels['channel'] }>) => {\n    const dbRes = await dbService.channel.add(req.body);\n    return { code: 0, msg: 'ok', data: dbRes };\n  });\n\n  fastify.delete(\n    `/${API_PREFIX}`,\n    { schema: deleteSchema },\n    async (req: FastifyRequest<{ Body: { id?: string[] } | null }>) => {\n      const { id } = req.body || {};\n      if (id && id.length !== 0) {\n        await dbService.channel.remove(id);\n      } else {\n        await dbService.channel.clear();\n      }\n      return { code: 0, msg: 'ok', data: null };\n    },\n  );\n\n  fastify.put(\n    `/${API_PREFIX}`,\n    { schema: putSchema },\n    async (req: FastifyRequest<{ Body: { id: string[]; doc: IModels['channel'] } }>) => {\n      const { id, doc } = req.body;\n      const dbRes = await dbService.channel.update(id, doc);\n      return { code: 0, msg: 'ok', data: dbRes };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/page`,\n    { schema: pageSchema },\n    async (\n      req: FastifyRequest<{\n        Querystring: { page: number; pageSize: number; kw?: string; group?: string };\n      }>,\n    ) => {\n      const { page = 1, pageSize = 10, kw, group } = req.query;\n\n      const [dbResPage, defaultIptvId, defaultIptv, dbResGroup] = await Promise.all([\n        dbService.channel.page(page, pageSize, kw, group),\n        dbService.setting.getValue('defaultIptv'),\n        dbService.setting.getValue('live'),\n        dbService.channel.group(),\n      ]);\n\n      const { logo: dbResSourceLogo = '' } = (await dbService.iptv.get(defaultIptvId)) || {};\n      const defaultLogo = dbResSourceLogo || defaultIptv?.logo || '';\n\n      const list = dbResPage.list.map((item) => ({\n        ...item,\n        logo: item?.logo || defaultLogo.replace('{name}', item.name),\n      }));\n\n      return {\n        code: 0,\n        msg: 'ok',\n        data: { list, total: dbResPage.total, class: dbResGroup },\n      };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/:id`,\n    { schema: getDetailSchema },\n    async (req: FastifyRequest<{ Params: { id: string } }>) => {\n      const { id } = req.params;\n      const dbRes = await dbService.channel.get(id);\n      return { code: 0, msg: 'ok', data: dbRes };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/epg`,\n    { schema: getEpgSchema },\n    async (req: FastifyRequest<{ Querystring: { ch: string; date: string } }>) => {\n      const { ch, date } = req.query;\n      if (isStrEmpty(ch)) {\n        return { code: -1, msg: 'Invalid parameters', data: [] };\n      }\n\n      const dbResIptvId = await dbService.setting.getValue('defaultIptv');\n      const dbResSourceEpg = (await dbService.iptv.get(dbResIptvId))?.epg;\n      const dbResSeeingEpg = (await dbService.setting.getValue('live'))?.epg;\n\n      const api = dbResSourceEpg || dbResSeeingEpg || '';\n      if (isStrEmpty(api)) {\n        return { code: -1, msg: 'EPG URL not found', data: [] };\n      }\n\n      try {\n        const res = await convertToStandard(api, ch, date);\n        return { code: 0, msg: 'ok', data: res };\n      } catch {\n        return { code: 0, msg: 'ok', data: [] };\n      }\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/live/index.ts",
    "content": "import channel from './channel';\nimport iptv from './iptv';\n\nexport { channel, iptv };\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/live/iptv.ts",
    "content": "import { dbService } from '@main/services/DbService';\nimport {\n  addSchema,\n  deleteSchema,\n  getActiveSchema,\n  getCheckSchema,\n  getDetailByKeySchema,\n  getDetailSchema,\n  pageSchema,\n  putSchema,\n  setDefaultSchema,\n} from '@server/schemas/v1/live/iptv';\nimport type { IIptvType } from '@shared/config/live';\nimport { isArrayEmpty, isNumber, isStrEmpty } from '@shared/modules/validate';\nimport type { IModels } from '@shared/types/db';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nimport { convertToStandard } from './utils/channel';\n\nconst API_PREFIX = 'live/iptv';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.post(`/${API_PREFIX}`, { schema: addSchema }, async (req: FastifyRequest<{ Body: IModels['iptv'] }>) => {\n    const dbRes = await dbService.iptv.add(req.body);\n    return { code: 0, msg: 'ok', data: dbRes };\n  });\n\n  fastify.delete(\n    `/${API_PREFIX}`,\n    { schema: deleteSchema },\n    async (req: FastifyRequest<{ Body: { id?: string[] } | null }>) => {\n      const { id } = req.body || {};\n      if (id && id.length !== 0) {\n        await dbService.iptv.remove(id);\n      } else {\n        await dbService.iptv.clear();\n      }\n      return { code: 0, msg: 'ok', data: null };\n    },\n  );\n\n  fastify.put(\n    `/${API_PREFIX}`,\n    { schema: putSchema },\n    async (req: FastifyRequest<{ Body: { id: string[]; doc: IModels['iptv'] } }>) => {\n      const { id, doc } = req.body;\n      const dbRes = await dbService.iptv.update(id, doc);\n      return { code: 0, msg: 'ok', data: dbRes };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/page`,\n    { schema: pageSchema },\n    async (req: FastifyRequest<{ Querystring: { page: number; pageSize: number; kw?: string } }>) => {\n      const { page = 1, pageSize = 10, kw } = req.query;\n\n      const [dbResPage, dbResDefaultId] = await Promise.all([\n        dbService.iptv.page(page, pageSize, kw),\n        dbService.setting.getValue('defaultIptv'),\n      ]);\n\n      return {\n        code: 0,\n        msg: 'ok',\n        data: { list: dbResPage.list, total: dbResPage.total, default: dbResDefaultId },\n      };\n    },\n  );\n\n  fastify.get(`/${API_PREFIX}/active`, { schema: getActiveSchema }, async () => {\n    const [dbResAll, dbResDefaultId, dbResIptv, dbResGroup] = await Promise.all([\n      dbService.iptv.active(),\n      dbService.setting.getValue('defaultIptv'),\n      dbService.setting.getValue('live'),\n      dbService.channel.group(),\n    ]);\n\n    const dbResDefault = await dbService.iptv.get(dbResDefaultId);\n\n    return {\n      code: 0,\n      msg: 'ok',\n      data: {\n        list: dbResAll,\n        default: dbResDefault,\n        class: dbResGroup,\n        extra: {\n          epg: dbResIptv?.epg ?? '',\n          logo: dbResIptv?.logo ?? '',\n          ipMark: dbResIptv?.ipMark ?? '',\n          delay: dbResIptv?.delay ?? '',\n          thumbnail: dbResIptv?.thumbnail ?? '',\n        },\n      },\n    };\n  });\n\n  fastify.get(\n    `/${API_PREFIX}/:id`,\n    { schema: getDetailSchema },\n    async (req: FastifyRequest<{ Params: { id: string } }>) => {\n      const { id } = req.params;\n      const dbRes = await dbService.iptv.get(id);\n      return { code: 0, msg: 'ok', data: dbRes };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/key/:key`,\n    { schema: getDetailByKeySchema },\n    async (req: FastifyRequest<{ Params: { key: string } }>) => {\n      const { key } = req.params;\n      const dbRes = await dbService.iptv.getByField({ key });\n      const res = dbRes?.[0];\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.put(\n    `/${API_PREFIX}/default/:id`,\n    { schema: setDefaultSchema },\n    async (req: FastifyRequest<{ Params: { id: string } }>) => {\n      const { id } = req.params;\n      const dbResDetail = await dbService.iptv.get(id);\n      const { api, type } = dbResDetail || {};\n      if (isStrEmpty(api) || !isNumber(type)) return { code: -1, msg: 'Invalid parameters', data: false };\n\n      const parseRes = await convertToStandard(api, type as IIptvType);\n\n      if (!isArrayEmpty(parseRes)) {\n        await dbService.channel.set(parseRes as IModels['channel'][]); // clear && insert\n        await dbService.setting.update({ key: 'defaultIptv', value: id });\n      }\n\n      return { code: 0, msg: 'ok', data: true };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/check/:id`,\n    { schema: getCheckSchema },\n    async (req: FastifyRequest<{ Params: { id: string } }>) => {\n      const { id } = req.params;\n      const dbResDetail = await dbService.iptv.get(id);\n      const { api, type } = dbResDetail || {};\n      if (isStrEmpty(api) || !isNumber(type)) return { code: -1, msg: 'Invalid parameters', data: false };\n\n      const parseRes = await convertToStandard(api, type as IIptvType);\n\n      if (!isArrayEmpty(parseRes)) {\n        return { code: 0, msg: 'ok', data: true };\n      }\n\n      return { code: 0, msg: 'ok', data: false };\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/live/utils/channel.ts",
    "content": "import { pathExist, readFile } from '@main/utils/file';\nimport { request } from '@main/utils/request';\nimport type { IIptvType } from '@shared/config/live';\nimport { IPTV_TYPE } from '@shared/config/live';\nimport { isHttp, isNil, isStrEmpty } from '@shared/modules/validate';\n\ninterface IChannelItem {\n  name: string;\n  api: string;\n  logo?: string;\n  group?: string;\n  playback?: string;\n}\n\ntype ICatchupMode = 'append' | 'shift' | 'default' | '';\n\ninterface ICatchupConfig {\n  mode: ICatchupMode;\n  source: string;\n}\n\n/**\n  1. 默认回看参数\n  检测播放连接中是否存在【PLTV】或【TVOD】两个字符，若存在则会自动拼接下面的回看参数\n  ?playseek=${(b)yyyyMMddHHmmss}-${(e)yyyyMMddHHmmss}\n  2. 针对整个M3U文件设置回看参数\n  #EXTM3U catchup=\"append\" catchup-source=\"?playbackbegin=${(b)yyyyMMddHHmmss}&playbackend=${(e)yyyyMMddHHmmss}\"\n  3. 如何对单个频道设置回看参数\n  #EXTINF:-1 catchup=\"append\" catchup-source=\"?playseek=${(b)yyyyMMddHHmmss}-${(e)yyyyMMddHHmmss}\",CCTV1\n */\n\n/**\n * Parsing IPTV M3U Text as an Array of Channel Objects\n *\n * @param text - IPTV M3U content (string)\n * @returns The parsed channel array\n *\n * @example\n * ```ts\n * const txt = `\n * #EXTM3U x-tvg-url=\"https://live.fanmingming.cn/e.xml\"\n * #EXTINF:-1 tvg-name=\"CCTV1\" tvg-logo=\"https://live.fanmingming.cn/tv/CCTV1.png\" group-title=\"CCTV\",CCTV-1\n * http://hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221236222/index.m3u8\n * #EXTINF:-1 tvg-name=\"CCTV2\" tvg-logo=\"https://live.fanmingming.cn/tv/CCTV2.png\" group-title=\"CCTV\",CCTV-2\n * http://hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221236393/index.m3u8\n * `\n *\n * const result = parseIptvM3u(txt)\n * // result:\n * // [\n * //   { name: 'CCTV1', url: 'http://hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221236222/index.m3u8', group: 'CCTV' },\n * //   { name: 'CCTV2', url: 'http://hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221236393/index.m3u8', group: 'CCTV' }\n * // ]\n * ```\n */\nconst m3uToStandard = (text: string): IChannelItem[] => {\n  const GROUP = /.*group-title=\"(.?|.+?)\".*/i;\n  const LOGO = /.*tvg-logo=\"(.?|.+?)\".*/i;\n  const NAME = /.*,\\s*(.+)/;\n  const CATCHUP = /.*catchup=\"(.+?)\"/i;\n  const CATCHUP_SOURCE = /.*catchup-source=\"(.+?)\"/i;\n\n  const docs: IChannelItem[] = [];\n  let current: Partial<IChannelItem> = {};\n  let currentCatchup: Partial<ICatchupConfig> = {};\n  let globalCatchup: Partial<ICatchupConfig> = {};\n\n  const resolveCatchup = (url: string): string => {\n    if (url.includes('PLTV') || url.includes('TVOD')) {\n      return `append-?playseek=\\${(b)yyyyMMddHHmmss}-\\${(e)yyyyMMddHHmmss}`;\n    }\n    if (currentCatchup.mode) {\n      return `${currentCatchup.mode}-${currentCatchup.source}`;\n    }\n    if (globalCatchup.mode) {\n      return `${globalCatchup.mode}-${globalCatchup.source}`;\n    }\n    return '';\n  };\n\n  for (const rawLine of text.split('\\n')) {\n    const line = rawLine.trim();\n    if (!line) continue;\n\n    if (line.startsWith('#EXTINF:-1')) {\n      current = {\n        name: line.match(NAME)?.[1]?.trim() ?? '',\n        logo: line.match(LOGO)?.[1]?.trim(),\n        group: line.match(GROUP)?.[1]?.trim(),\n      };\n\n      currentCatchup = {\n        mode: (line.match(CATCHUP)?.[1]?.trim() as ICatchupMode) ?? '',\n        source: line.match(CATCHUP_SOURCE)?.[1]?.trim() ?? '',\n      };\n    } else if (isHttp(line)) {\n      current.api = line;\n      current.playback = resolveCatchup(line);\n\n      docs.push(current as IChannelItem);\n\n      // reset\n      current = {};\n      currentCatchup = {};\n    } else if (line.startsWith('#EXTM3U')) {\n      globalCatchup = {\n        mode: (line.match(CATCHUP)?.[1]?.trim() as ICatchupMode) ?? '',\n        source: line.match(CATCHUP_SOURCE)?.[1]?.trim() ?? '',\n      };\n    }\n  }\n\n  return docs;\n};\n\n/**\n * Parsing IPTV TXT Text as an Array of Channel Objects\n *\n * @param text - IPTV txt content (string)\n * @returns The parsed channel array\n *\n * @example\n * ```ts\n * const txt = `\n * CCTV,#genre#\n * CCTV1,http://hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221236222/index.m3u8\n * CCTV2,http://hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221236393/index.m3u8\n * `\n *\n * const result = parseIptvTxt(txt)\n * // result:\n * // [\n * //   { name: 'CCTV1', url: 'http://hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221236222/index.m3u8', group: 'CCTV' },\n * //   { name: 'CCTV2', url: 'http://hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221236393/index.m3u8', group: 'CCTV' }\n * // ]\n * ```\n */\nconst txtToStandard = (text: string): IChannelItem[] => {\n  if (isStrEmpty(text)) return [];\n\n  const docs: IChannelItem[] = [];\n  let currentGroup = '';\n\n  for (const rawLine of text.split('\\n')) {\n    const line = rawLine.trim();\n    if (!line || !line.includes(',')) continue;\n\n    const [first = '', second = ''] = line.split(',', 2).map((s) => s.trim());\n    if (!first || !second) continue;\n\n    if (second === '#genre#') {\n      currentGroup = first;\n    } else if (isHttp(second)) {\n      docs.push({ name: first, api: second, group: currentGroup });\n    }\n  }\n\n  return docs;\n};\n\n/**\n * Parsing IPTV Channel\n * @param path -  remote url / local path / text\n * @param type - 1: remote 2: local 3: manual\n * @returns Parsed channel\n */\nexport const convertToStandard = async (path: string, type: IIptvType): Promise<IChannelItem[]> => {\n  let content: string | null = null;\n\n  switch (type) {\n    case IPTV_TYPE.REMOTE: {\n      try {\n        const { data: resp } = await request.request({ url: path, method: 'GET', responseType: 'text' });\n        content = resp;\n      } catch {\n        content = null;\n      }\n      break;\n    }\n    case IPTV_TYPE.LOCAL: {\n      if (await pathExist(path)) content = await readFile(path);\n      break;\n    }\n    case IPTV_TYPE.MANUAL: {\n      content = path;\n      break;\n    }\n  }\n  if (isNil(content) || isStrEmpty(content)) return [];\n\n  const list = content.includes('#EXTM3U') ? m3uToStandard(content) : txtToStandard(content);\n\n  return list;\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/live/utils/epg.ts",
    "content": "import { request } from '@main/utils/request';\nimport { defaultOptions } from '@shared/config/xmlOptions';\nimport { toYMD } from '@shared/modules/date';\nimport { isHttp, isNil, isStrEmpty, isString } from '@shared/modules/validate';\nimport { XMLParser } from 'fast-xml-parser';\n\ninterface IEpgItem {\n  title: string;\n  desc: string;\n  start: string;\n  end: string;\n}\n\nconst parser = new XMLParser(defaultOptions);\n\nconst xmlToStandard = async (api: string, program: string, _date: string): Promise<IEpgItem[]> => {\n  const { data: xmlResp } = await request.request({ url: api, method: 'GET' });\n  const xmlJson = parser.parse(xmlResp);\n\n  const channelIdMapName = new Map((xmlJson.tv.channel ?? []).map((ch) => [ch.id, ch['display-name']?.$text ?? '']));\n\n  // if (![...channelIdMapName.values()].includes(program)) return [];\n  const channelId = [...channelIdMapName.entries()].find(([, name]) => name === program)?.[0];\n  if (!channelId) return [];\n\n  const getParsedTime = (time?: string) => {\n    const getNow = () => {\n      const t = new Date(Date.now() + 8 * 60 * 60 * 1000);\n      const m = t.getMonth() + 1;\n      const d = t.getDate();\n      return `${t.getFullYear()}-${m < 10 ? `0${m}` : m}-${d < 10 ? `0${d}` : d}`;\n    };\n\n    if (!time || time.length < 8) {\n      return { date: getNow(), time: '' };\n    }\n\n    const year = time.substring(0, 4);\n    const month = time.substring(4, 6);\n    const day = time.substring(6, 8);\n    const date = `${year}-${month}-${day}`;\n\n    let timeStr = '';\n    if (time.length >= 12) {\n      const hour = time.substring(8, 10);\n      const minute = time.substring(10, 12);\n      timeStr = `${hour}:${minute}`;\n    }\n\n    return { date, time: timeStr };\n  };\n\n  const list: IEpgItem[] = [];\n\n  for (const p of xmlJson.tv.programme ?? []) {\n    if (p.channel !== channelId) continue;\n\n    list.push({\n      title: p.title?.$text ?? '未知节目',\n      desc: p.desc?.$text ?? '',\n      start: getParsedTime(p.start).time,\n      end: getParsedTime(p.stop).time,\n    });\n  }\n\n  return list;\n};\n\nconst jsonToStandard = async (api: string, program: string, date: string): Promise<IEpgItem[]> => {\n  const url = api.replace('{name}', program).replace('{date}', date);\n  const { data: resp } = await request.request({ url, method: 'GET' });\n  return resp?.epg_data ?? [];\n};\n\nexport const convertToStandard = async (api: string, program: string, date?: string) => {\n  if (!isHttp(api) || !isString(program) || isStrEmpty(program)) return [];\n\n  if (isNil(date)) date = toYMD();\n  program = program.replaceAll('-', '').toUpperCase();\n\n  const day = date.replaceAll('-', '');\n  if (Number.parseInt(day) < 20240214) return [];\n\n  const type = api.includes('{name}') || api.includes('{date}') ? 'diyp' : 'xml';\n  const list = type === 'xml' ? await xmlToStandard(api, program, date) : await jsonToStandard(api, program, date);\n\n  return list;\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/moment/history.ts",
    "content": "import { dbService } from '@main/services/DbService';\nimport {\n  addSchema,\n  deleteSchema,\n  findDetailSchema,\n  getDetailSchema,\n  pageSchema,\n  putSchema,\n} from '@server/schemas/v1/moment/history';\nimport type { IModels } from '@shared/types/db';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nconst API_PREFIX = 'moment/history';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.post(`/${API_PREFIX}`, { schema: addSchema }, async (req: FastifyRequest<{ Body: IModels['history'] }>) => {\n    const dbRes = await dbService.history.add(req.body);\n    return { code: 0, msg: 'ok', data: dbRes };\n  });\n\n  fastify.delete(\n    `/${API_PREFIX}`,\n    { schema: deleteSchema },\n    async (req: FastifyRequest<{ Body: { id?: string[]; type?: IModels['history']['type'][] } | null }>) => {\n      const { id = [], type = [] } = req.body || {};\n      if (type && type.length !== 0) {\n        await dbService.history.removeByField({ type });\n      } else if (id && id.length !== 0) {\n        await dbService.history.remove(id);\n      } else {\n        await dbService.history.clear();\n      }\n      return { code: 0, msg: 'ok', data: null };\n    },\n  );\n\n  fastify.put(\n    `/${API_PREFIX}`,\n    { schema: putSchema },\n    async (req: FastifyRequest<{ Body: { id: string[]; doc: IModels['history'] } }>) => {\n      const { id, doc } = req.body;\n      const dbRes = await dbService.history.update(id, doc);\n      return { code: 0, msg: 'ok', data: dbRes };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/page`,\n    { schema: pageSchema },\n    async (\n      req: FastifyRequest<{\n        Querystring: { page: number; pageSize: number; kw?: string; type?: number[] };\n      }>,\n    ) => {\n      const { page = 1, pageSize = 10, type = [], kw } = req.query;\n\n      const dbResPage = await dbService.history.page(page, pageSize, kw, type);\n\n      // 1:site 2: iptv 3:analyze 5:search 6:simple-import 7:complete-import\n      const loaderMap: Record<number, string> = {\n        1: 'site',\n        2: 'iptv',\n        3: 'analyze',\n        5: 'search',\n        6: 'simple-import',\n        7: 'complete-import',\n      } as const;\n\n      const list = await Promise.all(\n        dbResPage.list.map(async (item) => {\n          const relateSite = (await dbService?.[loaderMap[item.type]]?.getByField({ key: item.relateId! }))?.[0] ?? {};\n          return { ...item, relateSite };\n        }),\n      );\n\n      return {\n        code: 0,\n        msg: 'ok',\n        data: {\n          list,\n          total: dbResPage.total,\n        },\n      };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/find`,\n    { schema: findDetailSchema },\n    async (req: FastifyRequest<{ Querystring: { relateId: string; videoId: string; type?: number } }>) => {\n      const { relateId, videoId, type } = req.query;\n      const dbRes = await dbService.history.getByField({ relateId, videoId, ...(type ? { type } : {}) });\n      const res = dbRes?.[0];\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/:id`,\n    { schema: getDetailSchema },\n    async (req: FastifyRequest<{ Params: { id: string } }>) => {\n      const { id } = req.params;\n      const dbRes = await dbService.history.get(id);\n      return { code: 0, msg: 'ok', data: dbRes };\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/moment/index.ts",
    "content": "import history from './history';\nimport moment from './moment';\nimport star from './star';\n\nexport { history, moment, star };\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/moment/moment.ts",
    "content": "import { dbService } from '@main/services/DbService';\nimport { getRelatedSchema } from '@server/schemas/v1/moment/moment';\nimport type { FastifyPluginAsync } from 'fastify';\n\nconst API_PREFIX = 'moment';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.get(`/${API_PREFIX}/related`, { schema: getRelatedSchema }, async () => {\n    const [dbResAnalyze, dbResIptv, dbResSite] = await Promise.all([\n      dbService.analyze.active(),\n      dbService.iptv.active(),\n      dbService.site.active(),\n    ]);\n\n    const res = {\n      parse: dbResAnalyze,\n      live: dbResIptv,\n      film: dbResSite,\n    };\n    return { code: 0, msg: 'ok', data: res };\n  });\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/moment/star.ts",
    "content": "import { dbService } from '@main/services/DbService';\nimport {\n  addSchema,\n  deleteSchema,\n  findDetailSchema,\n  getDetailSchema,\n  pageSchema,\n  putSchema,\n} from '@server/schemas/v1/moment/star';\nimport type { IModels } from '@shared/types/db';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nconst API_PREFIX = 'moment/star';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.post(`/${API_PREFIX}`, { schema: addSchema }, async (req: FastifyRequest<{ Body: IModels['star'] }>) => {\n    const dbRes = await dbService.star.add(req.body);\n    return { code: 0, msg: 'ok', data: dbRes };\n  });\n\n  fastify.delete(\n    `/${API_PREFIX}`,\n    { schema: deleteSchema },\n    async (req: FastifyRequest<{ Body: { id?: string[]; type?: IModels['star']['type'][] } | null }>) => {\n      const { id = [], type = [] } = req.body || {};\n      if (type && type.length !== 0) {\n        await dbService.star.removeByField({ type });\n      } else if (id && id.length !== 0) {\n        await dbService.star.remove(id);\n      } else {\n        await dbService.star.clear();\n      }\n      return { code: 0, msg: 'ok', data: null };\n    },\n  );\n\n  fastify.put(\n    `/${API_PREFIX}`,\n    { schema: putSchema },\n    async (req: FastifyRequest<{ Body: { id: string[]; doc: IModels['star'] } }>) => {\n      const { id, doc } = req.body;\n      const dbRes = await dbService.star.update(id, doc);\n      return { code: 0, msg: 'ok', data: dbRes };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/page`,\n    { schema: pageSchema },\n    async (\n      req: FastifyRequest<{\n        Querystring: { page: number; pageSize: number; kw?: string; type?: IModels['star']['type'][] };\n      }>,\n    ) => {\n      const { page, pageSize, type, kw } = req.query;\n\n      const dbResPage = await dbService.star.page(page, pageSize, kw, type);\n\n      // 1:site 2: iptv 3:analyze\n      const loaderMap: Record<number, string> = {\n        1: 'site',\n        2: 'iptv',\n        3: 'analyze',\n      } as const;\n\n      const list = await Promise.all(\n        dbResPage.list.map(async (item) => {\n          const relateSite = (await dbService?.[loaderMap[item.type]]?.getByField({ key: item.relateId! }))?.[0] ?? {};\n          return { ...item, relateSite };\n        }),\n      );\n\n      return {\n        code: 0,\n        msg: 'ok',\n        data: {\n          list,\n          total: dbResPage.total,\n        },\n      };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/find`,\n    { schema: findDetailSchema },\n    async (req: FastifyRequest<{ Querystring: { relateId: string; videoId: string; type?: number } }>) => {\n      const { relateId, videoId, type } = req.query;\n      const dbRes = await dbService.star.getByField({ relateId, videoId, ...(type ? { type } : {}) });\n      const res = dbRes?.[0];\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/:id`,\n    { schema: getDetailSchema },\n    async (req: FastifyRequest<{ Params: { id: string } }>) => {\n      const { id } = req.params;\n      const dbRes = await dbService.star.get(id);\n      return { code: 0, msg: 'ok', data: dbRes };\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/parse/analyze.ts",
    "content": "import { dbService } from '@main/services/DbService';\nimport {\n  addSchema,\n  deleteSchema,\n  getActiveSchema,\n  getCheckSchema,\n  getDetailByKeySchema,\n  getDetailSchema,\n  pageSchema,\n  putSchema,\n  setDefaultSchema,\n} from '@server/schemas/v1/parse/analyze';\nimport type { IAnalyzeType } from '@shared/config/parse';\nimport { isHttp, isNumber } from '@shared/modules/validate';\nimport type { IModels } from '@shared/types/db';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nimport { convertToStandard } from './utils/mediaDirect';\n\nconst API_PREFIX = 'parse/analyze';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.post(`/${API_PREFIX}`, { schema: addSchema }, async (req: FastifyRequest<{ Body: IModels['analyze'] }>) => {\n    const dbRes = await dbService.analyze.add(req.body);\n    return { code: 0, msg: 'ok', data: dbRes };\n  });\n\n  fastify.delete(\n    `/${API_PREFIX}`,\n    { schema: deleteSchema },\n    async (req: FastifyRequest<{ Body: { id?: string[] } | null }>) => {\n      const { id } = req.body || {};\n      if (id && id.length !== 0) {\n        await dbService.analyze.remove(id);\n      } else {\n        await dbService.analyze.clear();\n      }\n      return { code: 0, msg: 'ok', data: null };\n    },\n  );\n\n  fastify.put(\n    `/${API_PREFIX}`,\n    { schema: putSchema },\n    async (req: FastifyRequest<{ Body: { id: string[]; doc: IModels['analyze'] } }>) => {\n      const { id, doc } = req.body;\n      const dbRes = await dbService.analyze.update(id, doc);\n      return { code: 0, msg: 'ok', data: dbRes };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/page`,\n    { schema: pageSchema },\n    async (req: FastifyRequest<{ Querystring: { page: number; pageSize: number; kw?: string } }>) => {\n      const { page = 1, pageSize = 10, kw } = req.query;\n\n      const [dbResPage, dbResDefaultId] = await Promise.all([\n        dbService.analyze.page(page, pageSize, kw),\n        dbService.setting.getValue('defaultAnalyze'),\n      ]);\n\n      return {\n        code: 0,\n        msg: 'ok',\n        data: {\n          list: dbResPage.list,\n          total: dbResPage.total,\n          default: dbResDefaultId,\n        },\n      };\n    },\n  );\n\n  fastify.get(`/${API_PREFIX}/active`, { schema: getActiveSchema }, async () => {\n    const [dbResAll, dbResDefaultId] = await Promise.all([\n      dbService.analyze.active(),\n      dbService.setting.getValue('defaultAnalyze'),\n    ]);\n\n    const dbResDefault = await dbService.analyze.get(dbResDefaultId);\n\n    return {\n      code: 0,\n      msg: 'ok',\n      data: { list: dbResAll, default: dbResDefault, extra: {} },\n    };\n  });\n\n  fastify.get(\n    `/${API_PREFIX}/:id`,\n    { schema: getDetailSchema },\n    async (req: FastifyRequest<{ Params: { id: string } }>) => {\n      const { id } = req.params;\n      const dbRes = await dbService.analyze.get(id);\n      return { code: 0, msg: 'ok', data: dbRes };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/key/:key`,\n    { schema: getDetailByKeySchema },\n    async (req: FastifyRequest<{ Params: { key: string } }>) => {\n      const { key } = req.params;\n      const dbRes = await dbService.analyze.getByField({ key });\n      const res = dbRes?.[0];\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.put(\n    `/${API_PREFIX}/default/:id`,\n    { schema: setDefaultSchema },\n    async (req: FastifyRequest<{ Params: { id: string } }>) => {\n      const { id } = req.params;\n      await dbService.setting.update({ key: 'defaultAnalyze', value: id });\n      return { code: 0, msg: 'ok', data: true };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/check/:id`,\n    { schema: getCheckSchema },\n    async (req: FastifyRequest<{ Params: { id: string } }>) => {\n      const { id } = req.params;\n      const dbResDetail = await dbService.analyze.get(id);\n      const { api, type, script, headers } = dbResDetail || {};\n      if (!isHttp(api) || !isNumber(type)) return { code: -1, msg: 'Invalid parameters', data: false };\n\n      const RANDOM_URL = [\n        'https://v.qq.com/x/cover/mzc00200f19q8q5/t41011onk2h.html', // 许我耀眼\n        'https://www.iqiyi.com/v_aky0eua8jg.html', // 命悬一生\n        'https://www.mgtv.com/b/779771/23643138.html', // 花儿与少年\n        'https://v.youku.com/v_show/id_XNjUwNjI3NDg0OA==.html', // 暗河传\n      ];\n\n      const url = `${api}${RANDOM_URL[Math.floor(Math.random() * RANDOM_URL.length)]}`;\n      const resp = await convertToStandard(url, type as IAnalyzeType, headers as Record<string, any>, script as string);\n      const status = isHttp(resp.url);\n\n      return { code: 0, msg: 'ok', data: status };\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/parse/index.ts",
    "content": "import analyze from './analyze';\nimport parse from './parse';\n\nexport { analyze, parse };\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/parse/parse.ts",
    "content": "import { dbService } from '@main/services/DbService';\nimport { mediaDirectSchema } from '@server/schemas/v1/parse/parse';\nimport type { IAnalyzeType } from '@shared/config/parse';\nimport { isHttp, isNumber, isStrEmpty, isString } from '@shared/modules/validate';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nimport { convertToStandard } from './utils/mediaDirect';\n\nconst API_PREFIX = 'parse';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.get(\n    `/${API_PREFIX}/media-direct`,\n    { schema: mediaDirectSchema },\n    async (req: FastifyRequest<{ Querystring: { id: string; url: string } }>) => {\n      const { id, url: rawUrl } = req.query;\n      const dbResDetail = await dbService.analyze.get(id);\n      const { api, type, script, headers } = dbResDetail || {};\n      if (!isHttp(api) || !isNumber(type)) return { code: -1, msg: 'Invalid parameters', data: false };\n      if (!isString(rawUrl) || isStrEmpty(rawUrl)) return { code: -1, msg: 'Invalid URL', data: false };\n\n      try {\n        const url = `${api}${rawUrl}`;\n        const res = await convertToStandard(\n          url,\n          type as IAnalyzeType,\n          headers as Record<string, any>,\n          script as string,\n        );\n        return { code: 0, msg: 'ok', data: res };\n      } catch {\n        return { code: 0, msg: 'ok', data: { url: '', headers: {} } };\n      }\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/parse/utils/mediaDirect.ts",
    "content": "import { request } from '@main/utils/request';\nimport type { IAnalyzeType } from '@shared/config/parse';\nimport { ANALYZE_TYPE } from '@shared/config/parse';\nimport { isObject, isObjectEmpty, isStrEmpty, isString } from '@shared/modules/validate';\nimport { JSONPath } from 'jsonpath-plus';\n\nimport { snifferMediaToStandard } from '../../system/utils/sniffer';\n\ninterface IParseResult {\n  url: string;\n  headers: Record<string, any>;\n}\n\nconst jsonToStandard = async (url: string, headers: Record<string, any>): Promise<IParseResult> => {\n  const { data: resp } = await request.request({\n    url,\n    method: 'GET',\n    ...(isObject(headers) && !isObjectEmpty(headers) ? { headers } : {}),\n  });\n  const parsedUrl = JSONPath({ path: '$.url', json: resp })?.[0];\n  const parsedHeaders =\n    JSONPath({ path: '$.headers', json: resp })?.[0] || JSONPath({ path: '$.header', json: resp })?.[0] || {};\n\n  return {\n    url: parsedUrl,\n    headers: parsedHeaders,\n  };\n};\n\nconst webToStandard = async (url: string, headers: Record<string, any>, script?: string): Promise<IParseResult> => {\n  const resp = await snifferMediaToStandard(url, {\n    headers,\n    ...(isString(script) && !isStrEmpty(script) ? { runScript: script } : {}),\n  });\n\n  return {\n    url: resp.url,\n    headers: resp.headers || {},\n  };\n};\n\nexport const convertToStandard = async (\n  url: string,\n  type: IAnalyzeType,\n  headers: Record<string, any> = {},\n  script: string = '',\n): Promise<IParseResult> => {\n  let res = { url: '', headers: {} };\n\n  switch (type) {\n    case ANALYZE_TYPE.JSON: {\n      res = await jsonToStandard(url, headers);\n      break;\n    }\n    case ANALYZE_TYPE.WEB: {\n      res = await webToStandard(url, headers, script);\n      break;\n    }\n  }\n\n  return res;\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/plugin/index.ts",
    "content": "import { dbService } from '@main/services/DbService';\nimport { pluginService } from '@main/services/PluginService';\nimport {\n  getDetailSchema,\n  installSchema,\n  pageSchema,\n  startSchema,\n  stopSchema,\n  uninstallSchema,\n} from '@server/schemas/v1/plugin';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nconst API_PREFIX = 'plugin';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.get(\n    `/${API_PREFIX}/page`,\n    { schema: pageSchema },\n    async (req: FastifyRequest<{ Querystring: { page: number; pageSize: number; kw?: string } }>) => {\n      const { page = 1, pageSize = 10, kw } = req.query;\n      const res = await dbService.plugin.page(page, pageSize, kw);\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/:id`,\n    { schema: getDetailSchema },\n    async (req: FastifyRequest<{ Params: { id: string } }>) => {\n      const { id } = req.params;\n      const res = await dbService.plugin.get(id);\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.post(\n    `/${API_PREFIX}/install`,\n    { schema: installSchema },\n    async (req: FastifyRequest<{ Body: { id: string[] } }>) => {\n      const { id } = req.body;\n      const res = await pluginService.install(id);\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.delete(\n    `/${API_PREFIX}/uninstall`,\n    { schema: uninstallSchema },\n    async (req: FastifyRequest<{ Body: { id: string[] } }>) => {\n      const { id } = req.body;\n      const res = await pluginService.uninstall(id);\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.put(\n    `/${API_PREFIX}/start`,\n    { schema: startSchema },\n    async (req: FastifyRequest<{ Body: { id: string[] } }>) => {\n      const { id } = req.body;\n      const res = await pluginService.start(id);\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n\n  fastify.put(\n    `/${API_PREFIX}/stop`,\n    { schema: stopSchema },\n    async (req: FastifyRequest<{ Body: { id: string[] } }>) => {\n      const { id } = req.body;\n      const res = await pluginService.stop(id);\n      return { code: 0, msg: 'ok', data: res };\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/setting/index.ts",
    "content": "import { dbService } from '@main/services/DbService';\nimport {\n  addSchema,\n  deleteSchema,\n  getDetailSchema,\n  getDetailValueSchema,\n  getListSchema,\n  getSetupSchema,\n  putSchema,\n  putSourceSchema,\n} from '@server/schemas/v1/setting';\nimport type { ISettingKey } from '@shared/config/tblSetting';\nimport { settingList as tblSetting, setupKeys } from '@shared/config/tblSetting';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nconst API_PREFIX = 'setting';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.post(\n    `/${API_PREFIX}`,\n    { schema: addSchema },\n    async (req: FastifyRequest<{ Body: { key: ISettingKey; value: any } }>) => {\n      const { key, value } = req.body;\n      const doc = { key, value };\n      const dbRes = await dbService.setting.add(doc);\n      return { code: 0, msg: 'ok', data: dbRes };\n    },\n  );\n\n  fastify.delete(\n    `/${API_PREFIX}`,\n    { schema: deleteSchema },\n    async (req: FastifyRequest<{ Body: { keys?: ISettingKey[] } | null }>) => {\n      const { keys } = req.body || {};\n      if (!keys || keys.length === 0) {\n        await dbService.setting.clear();\n      } else {\n        await dbService.setting.remove(keys);\n      }\n      return { code: 0, msg: 'ok', data: null };\n    },\n  );\n\n  fastify.put(\n    `/${API_PREFIX}`,\n    { schema: putSchema },\n    async (req: FastifyRequest<{ Body: { key: ISettingKey; value: any } }>) => {\n      const { key, value } = req.body;\n      const doc = { key, value };\n      const dbRes = await dbService.setting.update(doc);\n      return { code: 0, msg: 'ok', data: dbRes };\n    },\n  );\n\n  fastify.get(`/${API_PREFIX}/list`, { schema: getListSchema }, async () => {\n    const dbRes = await dbService.setting.all();\n    return { code: 0, msg: 'ok', data: dbRes };\n  });\n\n  fastify.get(`/${API_PREFIX}/setup`, { schema: getSetupSchema }, async () => {\n    const dbRes = Object.fromEntries(\n      await Promise.all(setupKeys.map(async (key) => [key, await dbService.setting.getValue(key)])),\n    );\n    return { code: 0, msg: 'ok', data: dbRes };\n  });\n\n  fastify.get(\n    `/${API_PREFIX}/:key`,\n    { schema: getDetailSchema },\n    async (req: FastifyRequest<{ Params: { key: ISettingKey } }>) => {\n      const { key } = req.params;\n      const dbRes = await dbService.setting.get(key);\n      return { code: 0, msg: 'ok', data: dbRes };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/value/:key`,\n    { schema: getDetailValueSchema },\n    async (req: FastifyRequest<{ Params: { key: ISettingKey } }>) => {\n      const { key } = req.params;\n      const dbRes = await dbService.setting.getValue(key);\n      return { code: 0, msg: 'ok', data: dbRes };\n    },\n  );\n\n  fastify.put(\n    `/${API_PREFIX}/source`,\n    { schema: putSourceSchema },\n    async (req: FastifyRequest<{ Body: Record<ISettingKey, any> }>) => {\n      // 1. Pre-generated Map for quick reading\n      const destMap = new Map(Object.entries(req.body || {}));\n      const settingMap = new Map(tblSetting.map((s) => [s.key, s.value]));\n\n      const dbValue = await dbService.setting.all();\n\n      // 2. Concurrency: updates or additions\n      const upsertPromises: Promise<unknown>[] = [];\n      for (const [key, fallback] of settingMap) {\n        const value = destMap.get(key) ?? fallback;\n        if (!Object.hasOwn(dbValue, key)) {\n          upsertPromises.push(dbService.setting.add({ key, value }));\n        } else if (dbValue[key] !== value) {\n          upsertPromises.push(dbService.setting.update({ key, value }));\n        }\n      }\n      await Promise.all(upsertPromises);\n\n      // 3. Concurrency: removing redundant keys\n      const toDelete = Object.keys(dbValue).filter((k) => !settingMap.has(k as ISettingKey));\n      if (toDelete.length) {\n        await dbService.setting.remove(toDelete as ISettingKey[]);\n      }\n\n      const dbRes = await dbService.setting.all();\n\n      return { code: 0, msg: 'ok', data: dbRes };\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/system/binary.ts",
    "content": "import { binaryService } from '@main/services/BinaryService';\nimport { getBinaryListSchema, installBinarySchema } from '@server/schemas/v1/system/binary';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nconst API_PREFIX = 'system/binary';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.get(`/${API_PREFIX}/list`, { schema: getBinaryListSchema }, async () => {\n    const resp = await binaryService.getBinaryList();\n    return { code: 0, msg: 'ok', data: resp };\n  });\n\n  fastify.post(\n    `/${API_PREFIX}/install`,\n    { schema: installBinarySchema },\n    async (req: FastifyRequest<{ Body: { id: string[] } }>) => {\n      const { id } = req.body;\n      const resp = await binaryService.installBinary(id);\n      return { code: 0, msg: 'ok', data: resp };\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/system/cdp.ts",
    "content": "import type { ISnifferOptions } from '@main/services/CdpElectron';\nimport { cdpSnifferMediaSchema } from '@server/schemas/v1/system/cdp';\nimport { isHttp } from '@shared/modules/validate';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nimport { snifferMediaToStandard } from './utils/sniffer';\n\nconst API_PREFIX = 'system/cdp';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.post(\n    `/${API_PREFIX}/sniffer/media`,\n    { schema: cdpSnifferMediaSchema },\n    async (req: FastifyRequest<{ Body: { url: string; options?: ISnifferOptions } }>) => {\n      const { url, options } = req.body;\n      if (!isHttp(url)) return { code: -1, msg: 'Invalid URL', data: { url: '', headers: {} } };\n\n      const resp = await snifferMediaToStandard(url, options);\n\n      return { code: 0, msg: 'ok', data: resp };\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/system/ffmpeg.ts",
    "content": "import type { IMediaInfoOptions, IMediaScreenshotOptions } from '@main/services/FFmpegService';\nimport { ffmpegService } from '@main/services/FFmpegService';\nimport { ffmpegInfoSchema, ffmpegScreenshotSchema } from '@server/schemas/v1/system/ffmpeg';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nconst API_PREFIX = 'system/ffmpeg';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.post(\n    `/${API_PREFIX}/info`,\n    { schema: ffmpegInfoSchema },\n    async (req: FastifyRequest<{ Body: { url: string; options?: IMediaInfoOptions } }>) => {\n      const { url, options } = req.body;\n      await ffmpegService.prepare();\n      const resp = await ffmpegService.getBaseInfo(url, options);\n      return { code: 0, msg: 'ok', data: resp };\n    },\n  );\n\n  fastify.post(\n    `/${API_PREFIX}/screenshot`,\n    { schema: ffmpegScreenshotSchema },\n    async (req: FastifyRequest<{ Body: { url: string; options?: IMediaScreenshotOptions } }>) => {\n      const { url, options } = req.body;\n      await ffmpegService.prepare();\n      const resp = await ffmpegService.getScreenshot(url, options);\n      return { code: 0, msg: 'ok', data: resp };\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/system/index.ts",
    "content": "import binary from './binary';\nimport cdp from './cdp';\nimport ffmpeg from './ffmpeg';\nimport other from './other';\nimport process from './process';\n\nexport { binary, cdp, ffmpeg, other, process };\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/system/other.ts",
    "content": "import { Buffer } from 'node:buffer';\nimport { join } from 'node:path';\nimport readline from 'node:readline';\n\nimport TailFile from '@logdna/tail-file';\nimport { getNetwork } from '@main/utils/ip';\nimport { APP_LOG_PATH } from '@main/utils/path';\nimport { request } from '@main/utils/request';\nimport { healthSchema, ipSchema, logSchema, m3u8AdRemoveSchema, reqSchema } from '@server/schemas/v1/system/other';\nimport { APP_VERSION } from '@shared/config/appinfo';\nimport type { ILogModuleType, LogLevel } from '@shared/config/logger';\nimport { LEVEL_MAP, LOG_MODULE } from '@shared/config/logger';\nimport type { IReqEncode } from '@shared/config/req';\nimport { reqEncodes } from '@shared/config/req';\nimport { toUnix, toYMD } from '@shared/modules/date';\nimport { isHttp, isJsonStr, isNil } from '@shared/modules/validate';\nimport type { AxiosRequestConfig } from 'axios';\nimport type { FastifyPluginAsync, FastifyReply, FastifyRequest } from 'fastify';\nimport iconv from 'iconv-lite';\n\nimport { fixAdM3u8Ai } from './utils/m3u8';\n\nconst API_PREFIX = 'system';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.get(`/${API_PREFIX}/health`, { schema: healthSchema }, async () => {\n    return { code: 0, msg: 'ok', data: { timestamp: toUnix(), version: APP_VERSION } };\n  });\n\n  fastify.get(\n    `/${API_PREFIX}/ip`,\n    { schema: ipSchema },\n    async (req: FastifyRequest<{ Querystring: { preferIPv6?: boolean } }>) => {\n      const { preferIPv6 = true } = req.query;\n      const resp = await getNetwork(preferIPv6);\n      return { code: 0, msg: 'ok', data: resp };\n    },\n  );\n\n  fastify.post(\n    `/${API_PREFIX}/req`,\n    { schema: reqSchema },\n    async (req: FastifyRequest<{ Body: AxiosRequestConfig & { encode?: IReqEncode } }>) => {\n      const { encode, ...config } = req.body;\n\n      if (!isNil(encode) && reqEncodes.includes(encode)) {\n        const resp = await request.request({ ...config, responseType: 'arraybuffer' });\n        resp.data = iconv.decode(Buffer.from(resp.data), encode);\n        const res = { code: resp.status, data: resp.data, headers: resp.headers };\n        return { code: 0, msg: 'ok', data: res };\n      } else {\n        const resp = await request.request(config);\n        const res = { code: resp.status, data: resp.data, headers: resp.headers };\n        return { code: 0, msg: 'ok', data: res };\n      }\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/m3u8/adremove`,\n    { schema: m3u8AdRemoveSchema },\n    async (req: FastifyRequest<{ Querystring: { url: string; headers?: string } }>, reply: FastifyReply) => {\n      const M3U8_CONTENT_TYPES = ['application/vnd.apple.mpegurl', 'application/x-mpegURL', 'application/octet-stream'];\n\n      const { url, headers: rawHeaders = '{}' } = req.query;\n      const headers = isJsonStr(rawHeaders) ? JSON.parse(rawHeaders) : {};\n\n      if (!isHttp(url)) {\n        return reply.code(400).send({ code: -1, msg: 'Invalid m3u8 URL' });\n      }\n\n      try {\n        const ext = new URL(url).pathname.split('.').pop();\n        if (ext !== 'm3u8') {\n          const { data: resp } = await request.request({ url, method: 'HEAD', headers });\n\n          const contentType = resp?.headers?.['content-type'];\n          if (!contentType || !M3U8_CONTENT_TYPES.includes(contentType)) {\n            return reply.code(400).send({ code: -1, msg: 'Invalid m3u8 URL' });\n          }\n        }\n\n        const content = await fixAdM3u8Ai(url, headers);\n        if (content && content.includes('.ts')) {\n          return reply.code(200).header('Content-Type', 'application/vnd.apple.mpegurl').send(content);\n        }\n\n        return reply.code(302).redirect(url);\n      } catch {\n        return reply.code(302).redirect(url);\n      }\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/log`,\n    { schema: logSchema },\n    async (req: FastifyRequest<{ Querystring: { type?: string; level?: LogLevel } }>, reply: FastifyReply<any>) => {\n      const { type: rawType = '', level = 'none' } = req.query;\n\n      const modules = Object.values(LOG_MODULE) as ILogModuleType[];\n\n      const type = rawType.split(',').filter((t) => {\n        if (modules.includes(t as ILogModuleType)) return true;\n        const lt = t.indexOf('<');\n        return lt !== -1 && t.endsWith('>') && modules.includes(t.slice(0, lt) as ILogModuleType);\n      });\n\n      const filePath = join(APP_LOG_PATH, `app.${toYMD()}.log`);\n      const minLevel = LEVEL_MAP[level];\n\n      reply.raw.writeHead(200, {\n        'Content-Type': 'text/event-stream',\n        'Cache-Control': 'no-cache',\n        Connection: 'keep-alive',\n      });\n\n      reply.raw.write(': heartbeat\\n\\n');\n      const heartbeat = setInterval(() => {\n        reply.raw.write(': heartbeat\\n\\n');\n      }, 15000);\n\n      let tail: TailFile | null = null;\n\n      const quit = async () => {\n        clearInterval(heartbeat);\n        if (tail) {\n          await tail.quit();\n          tail = null;\n        }\n        reply.raw.write('data: [DONE]\\n\\n');\n        reply.raw.end();\n      };\n\n      tail = new TailFile(filePath).on('tail_error', (error) => {\n        fastify.log.error(`TailFile error: ${error.message}`);\n        quit();\n      });\n      await tail.start();\n\n      reply.raw.write('data: [READY]\\n\\n');\n\n      const linesplitter = readline.createInterface({ input: tail });\n      linesplitter.on('line', (line) => {\n        try {\n          const obj = JSON.parse(line);\n          if (LEVEL_MAP[obj.level] < minLevel) return;\n          if (!type.includes(obj.module) && type.length !== 0) return;\n\n          reply.raw.write(`data: ${JSON.stringify(obj)}\\n\\n`);\n        } catch (error) {\n          fastify.log.error(`Invalid log line: ${(error as Error).message}`);\n        }\n      });\n\n      req.raw.on('close', quit);\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/system/process.ts",
    "content": "import { killPid, matchPort, matchPs } from '@main/utils/process';\nimport { processKillSchema, processMatchSchema } from '@server/schemas/v1/system/process';\nimport type { FastifyPluginAsync, FastifyRequest } from 'fastify';\n\nconst API_PREFIX = 'system/process';\n\nconst api: FastifyPluginAsync = async (fastify): Promise<void> => {\n  fastify.get(\n    `/${API_PREFIX}/kill`,\n    { schema: processKillSchema },\n    async (req: FastifyRequest<{ Querystring: { pid: number[] } }>) => {\n      const { pid = [] } = req.query;\n      const resp = await killPid(pid);\n      return { code: 0, msg: 'ok', data: resp };\n    },\n  );\n\n  fastify.get(\n    `/${API_PREFIX}/match`,\n    { schema: processMatchSchema },\n    async (req: FastifyRequest<{ Querystring: { type: string; kw: string | number } }>) => {\n      const { type, kw } = req.query;\n      const pids = type === 'port' ? await matchPort(Number(kw)) : await matchPs(String(kw));\n      return { code: 0, msg: 'ok', data: pids };\n    },\n  );\n};\n\nexport default api;\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/system/utils/m3u8.ts",
    "content": "import { loggerService } from '@logger';\nimport { request } from '@main/utils/request';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport { urlResolve } from '@shared/modules/headers';\n\nconst logger = loggerService.withContext(LOG_MODULE.SYSTEM_HELPER);\n\nexport const fixAdM3u8Ai = async (m3u8Url: string, headers: Record<string, string> = {}) => {\n  const startTime = Date.now();\n\n  const commonPrefixLength = (a: string, b: string): number => {\n    let i = 0;\n    while (i < a.length && i < b.length && a[i] === b[i]) i++;\n    return i;\n  };\n\n  const reverseString = (str: string): string => str.split('').reverse().join('');\n\n  // 拉取并格式化 M3U8\n  const fetchM3u8 = async (url: string) => {\n    const { data: content } = await request.request({\n      url,\n      method: 'GET',\n      ...headers,\n    });\n    return content\n      .trim()\n      .split('\\n')\n      .map((line: string) => (line.startsWith('#') ? line : urlResolve(url, line)))\n      .join('\\n')\n      .replace(/\\n\\n/g, '\\n');\n  };\n\n  let m3u8Content = await fetchM3u8(m3u8Url);\n\n  // 处理嵌套 m3u8\n  let lastUrl = m3u8Content.split('\\n').filter(Boolean).slice(-1)[0] || '';\n  if (lastUrl.length < 5) {\n    lastUrl = m3u8Content.split('\\n').filter(Boolean).slice(-2)[0] || '';\n  }\n  if (lastUrl.includes('.m3u8') && lastUrl !== m3u8Url) {\n    m3u8Url = urlResolve(m3u8Url, lastUrl);\n    logger.info(`嵌套的 m3u8_url: ${m3u8Url}`);\n    m3u8Content = await fetchM3u8(m3u8Url);\n  }\n\n  const lines = m3u8Content.trim().split('\\n').filter(Boolean);\n\n  // ffzy 平台的广告检测和移除\n  // if (m3u8Url.includes('ffzy')) {\n  //   let n = 0;\n  //   let m = 0;\n  //   let t = 0;\n  //   let k1 = 0;\n  //   let s2 = '';\n\n  //   for (let i = 0; i < lines.length; i++) {\n  //     const line = lines[i];\n\n  //     if (line.startsWith('#EXTINF')) {\n  //       const duration = line.slice(8);\n  //       n++;\n  //       if (n === 1) k1 = i;\n  //       if (!s2.includes(duration)) {\n  //         s2 += duration;\n  //         m++;\n  //       }\n  //       t += Number.parseFloat(duration);\n  //       i++; // 跳过 ts 地址\n  //     }\n\n  //     if (line.startsWith('#EXT-X-DISCONTINUITY')) {\n  //       if (n === 5) {\n  //         logger.info(`广告位置: ${k1}`);\n  //         logger.info(`数据条数: ${n}`);\n  //         logger.info(`数据种类: ${m}`);\n  //         logger.info(`广告时间: ${t.toFixed(5)}`);\n  //         lines.splice(k1, 2 * n + 1);\n  //         i = i - 2 * n + 1;\n  //       }\n\n  //       // reset\n  //       n = m = t = 0;\n  //       s2 = '';\n  //     }\n  //   }\n  // }\n\n  // 寻找首片段和尾片段\n  let firstSegment = '';\n  let maxPrefixLen = 0;\n  // let firstCandidate = '';\n  let secondCandidate = '';\n  let count1 = 1;\n  let count2 = 0;\n\n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i];\n    if (!line.startsWith('#')) {\n      if (!firstSegment) {\n        firstSegment = line;\n      } else {\n        const prefixLen = commonPrefixLength(firstSegment, line);\n        if (maxPrefixLen > prefixLen + 1) {\n          if (secondCandidate.length < 5) secondCandidate = line;\n          count2++;\n        } else {\n          maxPrefixLen = prefixLen;\n          count1++;\n        }\n      }\n      if (count1 + count2 >= 30) break;\n    }\n  }\n\n  if (count2 > count1) firstSegment = secondCandidate;\n  const firstLen = firstSegment.length;\n  const middleLen = Math.round(lines.length / 2).toString().length;\n\n  const lastSegment = lines.toReversed().find((line: string) => {\n    if (!line.startsWith('#')) {\n      const revMatch = commonPrefixLength(reverseString(firstSegment), reverseString(line));\n      maxPrefixLen = commonPrefixLength(firstSegment, line);\n      return firstLen - maxPrefixLen <= middleLen + revMatch || maxPrefixLen > 10;\n    }\n    return false;\n  });\n  logger.info(`最后一条切片：${lastSegment}`);\n\n  // 移除广告 URL\n  const adUrls: string[] = [];\n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i];\n    if (!line.startsWith('#')) {\n      if (commonPrefixLength(firstSegment, line) < maxPrefixLen) {\n        adUrls.push(line);\n        lines.splice(i - 1, 2);\n        i -= 2;\n      } else {\n        lines[i] = urlResolve(m3u8Url, line);\n      }\n    } else {\n      lines[i] = line.replace(/URI=\"(.*)\"/, (_, u) => `URI=\"${urlResolve(m3u8Url, u)}\"`);\n    }\n  }\n\n  logger.info(`处理的 m3u8 地址: ${m3u8Url}`);\n  logger.info('----广告地址----');\n  logger.info(`发现广告地址:\\n${adUrls.join('\\n')}`);\n\n  const result = lines.join('\\n');\n  logger.info(`处理耗时: ${Date.now() - startTime}ms`);\n  logger.silly(`最终分片:\\n${result}`);\n\n  return result;\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/routes/v1/system/utils/sniffer.ts",
    "content": "import type { ISnifferOptions } from '@main/services/CdpElectron';\nimport { CdpElectron } from '@main/services/CdpElectron';\nimport { dbService } from '@main/services/DbService';\nimport { request } from '@main/utils/request';\nimport { getTimeout } from '@main/utils/tool';\nimport { SNIFFER_TYPE } from '@shared/config/setting';\nimport { base64 } from '@shared/modules/crypto';\nimport { headersPascalCase } from '@shared/modules/headers';\nimport { isObject, isObjectEmpty, isStrEmpty, isString } from '@shared/modules/validate';\n\nexport interface ISnifferMediaResult {\n  url: string;\n  headers?: Record<string, any>;\n}\n\nconst cdpSnifferMediaToStandard = async (url: string, options: ISnifferOptions = {}): Promise<ISnifferMediaResult> => {\n  const cdp = new CdpElectron();\n  const resp = await cdp.snifferMedia(url, options);\n  return { url: resp.url, headers: headersPascalCase(resp?.headers || {}) };\n};\n\nconst customSnifferMediaToStandard = async (\n  snifferUrl: string,\n  url: string,\n  options: ISnifferOptions = {},\n): Promise<ISnifferMediaResult> => {\n  const { data: resp } = await request.request({\n    url: snifferUrl,\n    method: 'GET',\n    params: {\n      url,\n      timeout: getTimeout(options.timeout),\n      ...(isObject(options.headers) && !isObjectEmpty(options.headers)\n        ? { headers: options.headers.map(([key, value]) => `${key}:${value}`).join('\\n') }\n        : {}),\n      ...(isString(options.runScript) && !isStrEmpty(options.runScript)\n        ? { script: base64.encode({ src: options.runScript }) }\n        : {}),\n      ...(isString(options.initScript) && !isStrEmpty(options.initScript)\n        ? { init_script: base64.encode({ src: options.initScript }) }\n        : {}),\n      ...(isString(options.customRegex) && !isStrEmpty(options.customRegex)\n        ? { custom_regex: options.customRegex }\n        : {}),\n      ...(isString(options.snifferExclude) && !isStrEmpty(options.snifferExclude)\n        ? { sniffer_exclude: options.snifferExclude }\n        : {}),\n    },\n  });\n  return { url: resp?.data?.url || '', headers: headersPascalCase(resp?.data?.headers || {}) };\n};\n\nexport const snifferMediaToStandard = async (\n  url: string,\n  options: ISnifferOptions = {},\n): Promise<ISnifferMediaResult> => {\n  let res: ISnifferMediaResult = { url: '', headers: {} };\n\n  const ext = await dbService.setting.getValue('sniffer');\n\n  switch (ext.type) {\n    case SNIFFER_TYPE.CDP: {\n      res = await cdpSnifferMediaToStandard(url, options);\n      break;\n    }\n    case SNIFFER_TYPE.CUSTOM: {\n      res = await customSnifferMediaToStandard(ext.url, url, options);\n      break;\n    }\n  }\n\n  return res;\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/base.ts",
    "content": "import type { ObjectOptions as TObjectOptions, TObject, TProperties, TSchema } from '@sinclair/typebox';\nimport { Type } from '@sinclair/typebox';\n\n/**\n * Create a schema with a string enumeration type\n */\nexport const StringEnum = <T extends string[]>(values: [...T]) =>\n  Type.Unsafe<T[number]>({ type: 'string', enum: values });\n\n/**\n * Create a schema with a number enumeration type\n */\nexport const NumberEnum = <T extends number[]>(values: [...T]) =>\n  Type.Unsafe<T[number]>({ type: 'number', enum: values });\n\n/**\n * Enumeration of response status codes\n */\nexport enum ResponseCode {\n  SUCCESS = 0,\n  ERROR = -1,\n}\n\n/**\n * Convert object properties to nullable\n */\nexport const Nullable = <T extends TObject>(schema: T) =>\n  Type.Object(\n    Object.fromEntries(\n      Object.entries(schema.properties).map(([k, v]) => [k, Type.Union([v, Type.Null()])]),\n    ) as TProperties,\n    { ...schema, properties: undefined },\n  );\n\n/**\n * Generic HTTP response schema constructor\n */\nconst createHttpResponseSchema = <T extends TSchema = any>(\n  code: number,\n  msgSchema: TSchema,\n  dataSchema?: T,\n  options?: TObjectOptions,\n) =>\n  Type.Object(\n    {\n      code: Type.Literal(code, { format: 'int32', example: code }),\n      msg: msgSchema,\n      data: Type.Optional(\n        dataSchema ? Type.Union([dataSchema, Type.Null()]) : Type.Any({ description: 'response data' }),\n      ),\n    },\n    options,\n  );\n\n/**\n * HTTP success/error/redirect response schema\n */\nexport const createHttpSuccessResponseSchema = <T extends TSchema = any>(dataSchema?: T, options?: TObjectOptions) =>\n  createHttpResponseSchema(ResponseCode.SUCCESS, Type.Literal('ok'), dataSchema, options);\n\nexport const createHttpErrorResponseSchema = <T extends TSchema = any>(dataSchema?: T, options?: TObjectOptions) =>\n  createHttpResponseSchema(ResponseCode.ERROR, Type.String(), dataSchema, options);\n\nexport const createHttpRedirectResponseSchema = () =>\n  Type.Object({ headers: Type.Object({ location: Type.String({ format: 'uri' }) }) }, { additionalProperties: false });\n\n/**\n * Predefined Response Modes\n */\nexport const HttpSuccessResponseSchema = createHttpSuccessResponseSchema();\nexport const HttpErrorResponseSchema = createHttpErrorResponseSchema();\nexport const HttpRedirectResponseSchema = createHttpRedirectResponseSchema();\n\n/**\n * Generic response schema\n */\nexport const ResponseSchema = {\n  200: HttpSuccessResponseSchema,\n  301: HttpRedirectResponseSchema,\n  302: HttpRedirectResponseSchema,\n  400: HttpErrorResponseSchema,\n  500: HttpErrorResponseSchema,\n};\n\n/**\n * Create a routing schema with standard responses\n */\nexport const createRouteSchema = <T extends TSchema = TSchema, R extends TSchema = TSchema>(\n  requestSchema?: T,\n  responseDataSchema?: R,\n) => ({\n  ...(requestSchema ? { body: requestSchema } : {}),\n  response: {\n    200: createHttpSuccessResponseSchema(responseDataSchema),\n    301: HttpRedirectResponseSchema,\n    302: HttpRedirectResponseSchema,\n    400: createHttpErrorResponseSchema(responseDataSchema),\n    500: createHttpErrorResponseSchema(responseDataSchema),\n  },\n});\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v0/proxy.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpErrorResponseSchema, createHttpSuccessResponseSchema } from '../base';\n\nconst TAG = '[proxy]work';\n\nexport const getSchema = {\n  tags: [TAG],\n  summary: 'Get proxy cache',\n  description: 'Get proxy cache content.',\n  querystring: Type.Object({\n    url: Type.String({ description: 'proxy cache key' }),\n  }),\n  response: {\n    200: {\n      content: { 'text/html': { schema: Type.String() } },\n      description: 'Successful Operation',\n    },\n    400: createHttpErrorResponseSchema(Type.String(), { description: 'Parameter Verification Error' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const setSchema = {\n  tags: [TAG],\n  summary: 'Set proxy cache',\n  description: 'Set proxy cache content.',\n  body: Type.Object({\n    url: Type.String({ description: 'proxy cache key' }),\n    text: Type.Tuple(\n      [\n        Type.Integer({ format: 'int32', description: 'proxy cache code' }),\n        Type.String({ description: 'proxy cache content type' }),\n        Type.String({ description: 'proxy cache content' }),\n      ],\n      { description: 'proxy cache content' },\n    ),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.String({ description: 'proxy access url' }), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/aigc/chat.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpErrorResponseSchema, createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[aigc]chat';\n\nexport const completionSchema = {\n  tags: [API_PREFIX],\n  summary: 'Ai Chat Completion',\n  description: 'Ai Chat Completion.',\n  body: Type.Object({\n    prompt: Type.String({ description: 'The prompt to generate a completion for.' }),\n    model: Type.Optional(Type.String({ description: 'The model to use.' })),\n    stream: Type.Optional(Type.Boolean({ description: 'Whether to stream the response.' })),\n    sessionId: Type.Optional(Type.String({ description: 'The session ID for the conversation.' })),\n    parentId: Type.Optional(Type.String({ description: 'The parent message ID for threading.' })),\n  }),\n  response: {\n    200: {\n      content: {\n        'text/event-stream': {\n          schema: Type.Union([\n            Type.Object({\n              id: Type.String(),\n              object: Type.String(Type.Literal('chat.completion.chunk')),\n              created: Type.Integer({ format: 'int64' }),\n              model: Type.String(),\n              choices: Type.Array(\n                Type.Object({\n                  index: Type.Integer({ format: 'int32' }),\n                  delta: Type.Object({\n                    role: Type.String({ enum: ['system', 'user', 'assistant'] }),\n                    content: Type.String(),\n                  }),\n                  finish_reason: Type.Union([Type.String(), Type.Null()]),\n                }),\n              ),\n              usage: Type.Optional(\n                Type.Object({\n                  prompt_tokens: Type.Integer({ format: 'int32' }),\n                  completion_tokens: Type.Integer({ format: 'int32' }),\n                  total_tokens: Type.Integer({ format: 'int32' }),\n                }),\n              ),\n            }),\n            Type.String(),\n          ]),\n        },\n        'application/json': {\n          schema: createHttpSuccessResponseSchema(\n            Type.Object({\n              sessionId: Type.String(),\n              completion: Type.Object({\n                id: Type.String(),\n                object: Type.String(Type.Literal('chat.completion')),\n                created: Type.Integer({ format: 'int64' }),\n                model: Type.String(),\n                choices: Type.Array(\n                  Type.Object({\n                    index: Type.Integer({ format: 'int32' }),\n                    message: Type.Object({\n                      role: Type.String({ enum: ['system', 'user', 'assistant'] }),\n                      content: Type.String(),\n                    }),\n                    finish_reason: Type.String(),\n                  }),\n                ),\n                usage: Type.Optional(\n                  Type.Object({\n                    prompt_tokens: Type.Integer({ format: 'int32' }),\n                    completion_tokens: Type.Integer({ format: 'int32' }),\n                    total_tokens: Type.Integer({ format: 'int32' }),\n                  }),\n                ),\n              }),\n            }),\n          ),\n        },\n      },\n      description: 'Successful Operation',\n    },\n    400: createHttpErrorResponseSchema(Type.String(), { description: 'Parameter Verification Error' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const normalSchema = {\n  tags: [API_PREFIX],\n  summary: 'Ai Chat Normal',\n  description: 'Ai Chat Normal, only return message.',\n  body: Type.Object({\n    prompt: Type.String({ description: 'The prompt to generate a completion for.' }),\n    model: Type.Optional(Type.String({ description: 'The model to use.' })),\n    sessionId: Type.Optional(Type.String({ description: 'The session ID for the conversation.' })),\n    parentId: Type.Optional(Type.String({ description: 'The parent message ID for threading.' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.String(), { description: 'Successful Operation' }),\n    400: createHttpErrorResponseSchema(Type.String(), { description: 'Parameter Verification Error' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/aigc/memory.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[aigc]memory';\n\nconst chatMessageSchema = Type.Object({\n  role: Type.String({ enum: ['system', 'user', 'assistant'] }),\n  content: Type.String(),\n});\n\nconst outputItemSchema = Type.Object({\n  id: Type.String(),\n  messages: Type.Union([Type.Array(chatMessageSchema), Type.Null()]),\n});\n\nexport const addMessageSchema = {\n  tags: [API_PREFIX],\n  summary: 'Add message data',\n  description: 'Add a new message data.',\n  body: Type.Object({\n    id: Type.String({ description: 'data id' }),\n    messages: Type.Union([chatMessageSchema, Type.Array(chatMessageSchema)], { description: 'messages' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const deleteMessageSchema = {\n  tags: [API_PREFIX],\n  summary: 'Delete message data',\n  description: 'Delete message data as supplied, or if the index is empty, delete all sessions supplied with id.',\n  body: Type.Object({\n    id: Type.String({ description: 'data id' }),\n    index: Type.Optional(Type.Array(Type.Integer(), { description: 'message index' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const putMessageSchema = {\n  tags: [API_PREFIX],\n  summary: 'Set message data',\n  description: 'Set message data.',\n  body: Type.Object({\n    id: Type.String({ description: 'data id' }),\n    updates: Type.Array(\n      Type.Object({\n        index: Type.Integer(),\n        message: chatMessageSchema,\n      }),\n      { description: 'updates' },\n    ),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getMessageSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get message data',\n  description:\n    'Get message data, limit by recentCount or maxTokens, if both are provided, recentCount will be ignored, if none is provided, return all.',\n  params: Type.Object({\n    id: Type.String({ description: 'data id' }),\n  }),\n  querystring: Type.Object({\n    recentCount: Type.Optional(Type.String()),\n    maxTokens: Type.Optional(Type.String()),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const createSessionSchema = {\n  tags: [API_PREFIX],\n  summary: 'Create session data',\n  description: 'Create a new session data.',\n  body: Type.Optional(\n    Type.Object({\n      messages: Type.Optional(Type.Array(chatMessageSchema, { description: 'initial messages' })),\n    }),\n  ),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const clearSessionSchema = {\n  tags: [API_PREFIX],\n  summary: 'Delete session data',\n  description: 'Delete session all data.',\n  body: Type.Object({\n    id: Type.Optional(Type.Array(Type.String(), { description: 'data id' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Boolean(), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getSessionIdsSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get session id data',\n  description: 'Get all session id.',\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(Type.String()), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/data/cloud.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[data]cloud';\n\nexport const backupSchema = {\n  tags: [API_PREFIX],\n  summary: 'Data backup',\n  description: 'Local data backup to cloud.',\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Boolean(), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const resumeSchema = {\n  tags: [API_PREFIX],\n  summary: 'Data resume',\n  description: 'Local data resume from cloud.',\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Boolean(), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/data/db.ts",
    "content": "import { tableNames } from '@main/services/DbService/schemas';\nimport { Schema } from '@main/types/server';\nimport { dataImportTypes, dataPages, dataPutTypes, dataRemoteTypes } from '@shared/config/data';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[data]db';\n\nexport const clearSchema = {\n  tags: [API_PREFIX],\n  summary: 'Clear data',\n  description: 'Clear data, if provided type, only clear the specified type.',\n  body: Type.Object({\n    type: Type.Optional(\n      Type.Array(Type.String({ enum: [...tableNames, ...dataPages, 'cache'] }), {\n        description: 'table name or other type',\n      }),\n    ),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Boolean(), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const exportSchema = {\n  tags: [API_PREFIX],\n  summary: 'Export data',\n  description: 'Export data, if provided type, only export the specified type.',\n  body: Type.Object({\n    type: Type.Optional(\n      Type.Array(Type.String({ enum: [...tableNames, ...dataPages] }), {\n        description: 'table name',\n      }),\n    ),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Record(Type.String({ enum: tableNames }), Type.Any()), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const importSchema = {\n  tags: [API_PREFIX],\n  summary: 'Import data',\n  description: 'Import data.',\n  body: Type.Object({\n    api: Type.String({ description: 'api' }),\n    putType: Type.String({ enum: dataPutTypes, description: 'put type' }),\n    importType: Type.String({ enum: dataImportTypes, description: 'import type' }),\n    remoteType: Type.String({ enum: dataRemoteTypes, description: 'remote type' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Boolean(), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/file/film.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nconst API_PREFIX = '[file]film';\n\nconst filmSchema = Type.Object({\n  lives: Type.Array(\n    Type.Object({\n      group: Type.String(),\n      channels: Type.Object({\n        name: Type.String(),\n        urls: Type.Array(Type.String()),\n      }),\n    }),\n    { description: 'live item' },\n  ),\n  parses: Type.Array(\n    Type.Object({\n      name: Type.String(),\n      type: Type.Integer({ format: 'int32', enum: [1, 2] }),\n      url: Type.String(),\n      header: Type.Optional(Type.Record(Type.String(), Type.String())),\n      ext: Type.Optional(Type.Object({ flag: Type.Array(Type.String()) })),\n    }),\n    { description: 'parse item' },\n  ),\n  sites: Type.Array(\n    Type.Object({\n      name: Type.String(),\n      key: Type.String(),\n      type: Type.Integer({ format: 'int32', enum: [0, 1, 2, 3, 4] }),\n      api: Type.String(),\n      playUrl: Type.Optional(Type.String()),\n      quickSearch: Type.Optional(Type.Integer({ format: 'int32', enum: [0, 1] })),\n      searchable: Type.Optional(Type.Integer({ format: 'int32', enum: [0, 1] })),\n      filterable: Type.Optional(Type.Integer({ format: 'int32', enum: [0, 1] })),\n      ext: Type.Optional(Type.Any()),\n      categories: Type.Optional(Type.Array(Type.String())),\n    }),\n    { description: 'site item' },\n  ),\n\n  flags: Type.Array(Type.String(), { description: 'flags' }),\n\n  ads: Type.Array(Type.String(), { description: 'ads' }),\n  ijk: Type.Array(\n    Type.Object({\n      group: Type.String(),\n      options: Type.Array(\n        Type.Object({\n          category: Type.Integer({ format: 'int32' }),\n          name: Type.String(),\n          value: Type.String(),\n        }),\n      ),\n    }),\n    { description: 'ijk' },\n  ),\n\n  homeLogo: Type.String({ description: 'home logo url' }),\n  homePage: Type.String({ description: 'home page url' }),\n  spider: Type.String({ description: 'spider jar url' }),\n  wallpaper: Type.String({ description: 'wallpaper url' }),\n});\n\nexport const autoSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get auto content',\n  description:\n    'Get a file content by path level(three levels), operating system files if the type is system, which is a dangerous operation.',\n  params: Type.Object({\n    type: Type.String({ enum: ['file', 'system'], description: 'file type' }),\n    '*': Type.String({ description: 'file path' }),\n  }),\n  response: {\n    200: Type.Partial(filmSchema, { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const makeSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get make content',\n  description:\n    'Get a file content by generate index.json from index.js, operating system files if the type is system, which is a dangerous operation.',\n  params: Type.Object({\n    type: Type.String({ enum: ['file', 'system'], description: 'file type' }),\n    '*': Type.String({ description: 'file path' }),\n  }),\n  response: {\n    200: Type.Partial(filmSchema, { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/file/manage.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[file]manage';\n\nexport const addSchema = {\n  tags: [API_PREFIX],\n  summary: 'Add file',\n  description: 'Add a new file, operating system files if the type is system, which is a dangerous operation.',\n  params: Type.Object({\n    type: Type.String({ enum: ['file', 'system'], description: 'file type' }),\n    '*': Type.String({ description: 'file path' }),\n  }),\n  body: Type.String({ description: 'file content' }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Boolean(), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const deleteSchema = {\n  tags: [API_PREFIX],\n  summary: 'Delete file',\n  description: 'Delete a file by path, operating system files if the type is system, which is a dangerous operation.',\n  params: Type.Object({\n    type: Type.String({ enum: ['file', 'system'], description: 'file type' }),\n    '*': Type.String({ description: 'file path' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Boolean(), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const putSchema = {\n  tags: [API_PREFIX],\n  summary: 'Update file content',\n  description: 'Update a file by path, operating system files if the type is system, which is a dangerous operation.',\n  params: Type.Object({\n    type: Type.String({ enum: ['file', 'system'], description: 'file type' }),\n    '*': Type.String({ description: 'file path' }),\n  }),\n  body: Type.String({ description: 'file content' }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Boolean(), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get file content',\n  description:\n    'Get a file content by path, operating system files if the type is system, which is a dangerous operation.',\n  params: Type.Object({\n    type: Type.String({ enum: ['file', 'system'], description: 'file type' }),\n    '*': Type.String({ description: 'file path' }),\n  }),\n  response: {\n    200: Type.Any({ description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/flim/cms.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[film]cms';\n\nexport const getInitchema = {\n  tags: [API_PREFIX],\n  summary: 'Get cms init',\n  description: 'Cms init.',\n  querystring: Type.Object({\n    uuid: Type.String({ description: 'cms uuid' }),\n    force: Type.Optional(Type.Boolean({ description: 'refresh cache' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Boolean(), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getHomeSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get cms home',\n  description: 'Cms home.',\n  querystring: Type.Object({\n    uuid: Type.String({ description: 'cms uuid' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        class: Type.Optional(\n          Type.Array(\n            Type.Object({\n              type_id: Type.Union([Type.String(), Type.Integer({ format: 'int32' })]),\n              type_name: Type.String(),\n            }),\n          ),\n        ),\n        filters: Type.Optional(\n          Type.Record(\n            Type.String(),\n            Type.Array(\n              Type.Object({\n                key: Type.String(),\n                name: Type.String(),\n                value: Type.Array(\n                  Type.Object({\n                    n: Type.Union([Type.String(), Type.Integer({ format: 'int32' })]),\n                    v: Type.Union([Type.String(), Type.Integer({ format: 'int32' })]),\n                  }),\n                ),\n              }),\n            ),\n          ),\n        ),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getHomeVodSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get cms homeVod',\n  description: 'Cms homeVod.',\n  querystring: Type.Object({\n    uuid: Type.String({ description: 'cms uuid' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        page: Type.Optional(Type.Integer({ format: 'int32' })),\n        pagecount: Type.Optional(Type.Integer({ format: 'int32' })),\n        total: Type.Optional(Type.Integer({ format: 'int32' })),\n        list: Type.Optional(\n          Type.Array(\n            Type.Object({\n              vod_id: Type.Union([Type.String(), Type.Integer({ format: 'int32' })]),\n              vod_name: Type.String(),\n              vod_pic: Type.Optional(Type.String()),\n              vod_remarks: Type.Optional(Type.String()),\n              vod_blurb: Type.Optional(Type.String()),\n              vod_tag: Type.Optional(Type.String({ enum: ['folder', 'file'] })),\n            }),\n          ),\n        ),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getCategorySchema = {\n  tags: [API_PREFIX],\n  summary: 'Get cms category',\n  description: 'Cms category.',\n  querystring: Type.Object({\n    uuid: Type.String({ description: 'cms uuid' }),\n    tid: Type.Union([Type.String(), Type.Integer({ format: 'int32' })], { description: 'category id' }),\n    page: Type.Optional(Type.Integer({ format: 'int32', description: 'page' })),\n    extend: Type.Optional(Type.String({ description: 'extend' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        page: Type.Optional(Type.Integer({ format: 'int32' })),\n        pagecount: Type.Optional(Type.Integer({ format: 'int32' })),\n        total: Type.Optional(Type.Integer({ format: 'int32' })),\n        list: Type.Array(\n          Type.Object({\n            vod_id: Type.Union([Type.String(), Type.Integer({ format: 'int32' })]),\n            vod_name: Type.String(),\n            vod_pic: Type.Optional(Type.String()),\n            vod_remarks: Type.Optional(Type.String()),\n            vod_blurb: Type.Optional(Type.String()),\n            vod_tag: Type.Optional(Type.String({ enum: ['folder', 'file', 'action', ''] })),\n          }),\n        ),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getDetailSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get cms detail',\n  description: 'Cms detail.',\n  querystring: Type.Object({\n    uuid: Type.String({ description: 'cms uuid' }),\n    ids: Type.String({ description: 'detail id' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        page: Type.Optional(Type.Integer({ format: 'int32' })),\n        pagecount: Type.Optional(Type.Integer({ format: 'int32' })),\n        total: Type.Optional(Type.Integer({ format: 'int32' })),\n        list: Type.Array(\n          Type.Object({\n            vod_id: Type.Union([Type.String(), Type.Integer({ format: 'int32' })]),\n            vod_name: Type.String(),\n            vod_pic: Type.Optional(Type.String()),\n            vod_lang: Type.Optional(Type.String()),\n            vod_year: Type.Union([Type.String(), Type.Integer({ format: 'int32' })]),\n            vod_area: Type.Optional(Type.String()),\n            vod_remarks: Type.Optional(Type.String()),\n            vod_score: Type.Optional(Type.String()),\n            vod_state: Type.Optional(Type.String()),\n            vod_class: Type.Optional(Type.String()),\n            vod_actor: Type.Optional(Type.String()),\n            vod_director: Type.Optional(Type.String()),\n            vod_content: Type.Optional(Type.String()),\n            vod_blurb: Type.Optional(Type.String()),\n            vod_play_from: Type.String(),\n            vod_play_url: Type.String(),\n            vod_episode: Type.Optional(\n              Type.Record(Type.String(), Type.Array(Type.Object({ text: Type.String(), link: Type.String() }))),\n            ),\n            type_name: Type.Optional(Type.String()),\n          }),\n        ),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getSearchSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get cms search',\n  description: 'Cms search.',\n  querystring: Type.Object({\n    uuid: Type.String({ description: 'cms uuid' }),\n    wd: Type.String({ description: 'search word' }),\n    page: Type.Optional(Type.Integer({ format: 'int32', description: 'page' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        page: Type.Optional(Type.Integer({ format: 'int32' })),\n        pagecount: Type.Optional(Type.Integer({ format: 'int32' })),\n        total: Type.Optional(Type.Integer({ format: 'int32' })),\n        list: Type.Array(\n          Type.Object({\n            vod_id: Type.Union([Type.String(), Type.Integer({ format: 'int32' })]),\n            vod_name: Type.String(),\n            vod_pic: Type.Optional(Type.String()),\n            vod_remarks: Type.Optional(Type.String()),\n            vod_blurb: Type.Optional(Type.String()),\n            vod_tag: Type.Optional(Type.String({ enum: ['folder', 'file'] })),\n          }),\n        ),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getPlaySchema = {\n  tags: [API_PREFIX],\n  summary: 'Get cms play',\n  description: 'Cms play.',\n  querystring: Type.Object({\n    uuid: Type.String({ description: 'cms uuid' }),\n    play: Type.String({ description: 'play episode' }),\n    flag: Type.Optional(Type.String({ description: 'play line' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        url: Type.String(),\n        quality: Type.Optional(Type.Array(Type.Union([Type.String(), Type.Number()]))),\n        jx: Type.Optional(Type.Integer({ format: 'int32' })),\n        parse: Type.Optional(Type.Integer({ format: 'int32' })),\n        headers: Type.Optional(Type.Record(Type.String(), Type.Any())),\n        script: Type.Optional(Type.Record(Type.String(), Type.String())),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getActionSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get cms action',\n  description: 'Cms action.',\n  querystring: Type.Object({\n    uuid: Type.String({ format: 'uuid', description: 'cms uuid' }),\n    action: Type.String({ description: 'action key' }),\n    value: Type.Optional(\n      Type.Union([Type.String(), Type.Record(Type.String(), Type.Any())], { description: 'action value' }),\n    ),\n    timeout: Type.Optional(Type.Integer({ format: 'int32', description: 'action timeout, unit is second' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Optional(Type.Union([Type.String(), Type.Record(Type.String(), Type.Any())])),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getProxySchema = {\n  tags: [API_PREFIX],\n  summary: 'Get cms proxy',\n  description: 'Cms proxy.',\n  querystring: Type.Object(\n    {\n      uuid: Type.String({ format: 'uuid', description: 'cms uuid' }),\n      do: Type.String({ description: 'proxy type' }),\n      url: Type.String({ format: 'uri', description: 'proxy url' }),\n    },\n    { additionalProperties: true },\n  ),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Union([Type.Tuple([Type.Integer({ format: 'int32' }), Type.String(), Type.String()]), Type.Tuple([])]),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getCheckSchema = {\n  tags: [API_PREFIX],\n  summary: 'Check cms validity',\n  description: 'Check cms validity.',\n  querystring: Type.Object({\n    uuid: Type.String({ format: 'uuid', description: 'cms uuid' }),\n    type: Type.String({ enum: ['search', 'simple', 'complete'], description: 'check type' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Boolean(), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/flim/edit.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { siteTypes } from '@shared/config/film';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[film]edit';\n\nexport const domPdSchema = {\n  tags: [API_PREFIX],\n  summary: 'Parser pd',\n  description: 'Parsing content with the pd function.',\n  body: Type.Object({\n    rule: Type.String({ description: 'rule' }),\n    html: Type.String({ description: 'html, post-transfer incoming' }),\n    baseUrl: Type.Optional(Type.String({ description: 'base url' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.String(), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const domPdfaSchema = {\n  tags: [API_PREFIX],\n  summary: 'Parser pdfa',\n  description: 'Parsing content with the pdfa function.',\n  body: Type.Object({\n    rule: Type.String({ description: 'rule' }),\n    html: Type.String({ description: 'html, post-transfer incoming' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(Type.String()), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const domPdfhSchema = {\n  tags: [API_PREFIX],\n  summary: 'Parser pdfh',\n  description: 'Parsing content with the pdfh function.',\n  body: Type.Object({\n    rule: Type.String({ description: 'rule' }),\n    html: Type.String({ description: 'html, post-transfer incoming' }),\n    baseUrl: Type.Optional(Type.String({ description: 'base url' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.String(), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const domPdflSchema = {\n  tags: [API_PREFIX],\n  summary: 'Parser pdfl',\n  description: 'Parsing content with the pdfl function.',\n  body: Type.Object({\n    rule: Type.String({ description: 'rule' }),\n    html: Type.String({ description: 'html, post-transfer incoming' }),\n    listText: Type.String({ description: 'list text' }),\n    listUrl: Type.String({ description: 'list url' }),\n    baseUrl: Type.Optional(Type.String({ description: 'baseurl' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.String(), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const siftCategorySchema = {\n  tags: [API_PREFIX],\n  summary: 'Parser sift category',\n  description: 'Parsing content with the sift category function.',\n  body: Type.Object({\n    html: Type.String({ description: 'html, post-transfer incoming' }),\n    categoryRule: Type.String({ description: 'category parse' }),\n    categoryExclude: Type.Optional(Type.String({ description: 'category exclude, vertical line split' })),\n    categoryUrl: Type.String({ description: 'category url, \"fyclass\" instead of category uuid' }),\n    baseUrl: Type.String({ description: 'base url' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        title: Type.String(),\n        uuid: Type.String(),\n        raw: Type.Array(\n          Type.Object({\n            title: Type.String(),\n            uuid: Type.String(),\n            path_url: Type.Optional(Type.String()),\n            source_url: Type.Optional(Type.String()),\n          }),\n        ),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const siftFilterSchema = {\n  tags: [API_PREFIX],\n  summary: 'Parser sift filter',\n  description: 'Parsing content with the sift filter function.',\n  body: Type.Object({\n    html: Type.String({ description: 'html, post-transfer incoming' }),\n    baseRule: Type.String({ description: 'base rule' }),\n    detailRule: Type.String({ description: 'detail rule' }),\n    matchs: Type.Record(Type.String(), Type.String(), { description: 'matchs' }),\n    ci: Type.Optional(Type.String({ description: 'ci' })),\n    excludeKeys: Type.Optional(Type.String({ description: 'exclude keys, vertical line split' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Any(), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const templateNameSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get template names',\n  description: 'Get template names by type.',\n  params: Type.Object({\n    type: Type.Integer({ format: 'int32', enum: siteTypes, description: 'type' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(Type.String()), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const templateDetailSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get template detail',\n  description: 'Get template detail by type and name.',\n  params: Type.Object({\n    type: Type.Integer({ format: 'int32', enum: siteTypes, description: 'type' }),\n    name: Type.String({ description: 'name' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Any(), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const decryptSchema = {\n  tags: [API_PREFIX],\n  summary: 'Decrypt code',\n  description: 'Decrypt code content.',\n  consumes: ['text/plain'],\n  params: Type.Object({\n    type: Type.Integer({ format: 'int32', enum: siteTypes, description: 'type' }),\n  }),\n  body: Type.String({ description: 'code content' }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.String(), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/flim/rec.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[film]rec';\n\nexport const getBarrageSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get Recommend Barrage',\n  description: 'Recommend Barrage.',\n  querystring: Type.Object({\n    id: Type.String({ description: 'id' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object(\n        {\n          id: Type.Optional(Type.String()),\n          list: Type.Optional(\n            Type.Array(\n              Type.Object({\n                id: Type.String(),\n                text: Type.String(),\n                type: Type.String({ enum: ['top', 'bottom', 'left', 'right'] }),\n                time: Type.Number(),\n                color: Type.String(),\n              }),\n            ),\n          ),\n        },\n        { description: 'Successful Operation' },\n      ),\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const sendBarrageSchema = {\n  tags: [API_PREFIX],\n  summary: 'Post Barrage',\n  description: 'Post Barrage.',\n  body: Type.Object({\n    id: Type.String({ description: 'id' }),\n    time: Type.Number({ format: 'float', description: 'time' }),\n    text: Type.String({ description: 'text' }),\n    type: Type.String({ enum: ['top', 'bottom', 'left', 'right'], description: 'type' }),\n    color: Type.Optional(Type.String({ description: 'color' })),\n    size: Type.Optional(Type.String({ description: 'size' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Boolean({ description: 'Successful Operation' })),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getHotSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get Recommend Hot',\n  description: 'Recommend Hot.',\n  querystring: Type.Optional(\n    Type.Object({\n      source: Type.Optional(\n        Type.String({ enum: ['komect', 'douban', 'quark', 'baidu', 'kylive', 'enlightent'], description: 'source' }),\n      ),\n      date: Type.Optional(Type.String({ description: 'date' })),\n      type: Type.Optional(\n        Type.Integer({ format: 'int32', enum: [1, 2, 3, 4], description: '1:movie 2:tv 3:art 4:anime(child)' }),\n      ),\n      page: Type.Optional(Type.Integer({ format: 'int32', description: 'page' })),\n      pageSize: Type.Optional(Type.Integer({ format: 'int32', description: 'pageSize' })),\n    }),\n  ),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Array(\n        Type.Object({\n          vod_id: Type.Union([Type.String(), Type.Integer({ format: 'int32' })]),\n          vod_name: Type.String(),\n          vod_hot: Type.Number(),\n          vod_pic: Type.Optional(Type.String()),\n          vod_remarks: Type.Optional(Type.String()),\n        }),\n      ),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getMatchSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get Douban Recommend',\n  description: 'Douban Recommend with (name and year) or (id and type).',\n  querystring: Type.Object({\n    name: Type.Optional(Type.String({ description: 'name' })),\n    year: Type.Optional(Type.String({ description: 'year' })),\n    id: Type.Optional(Type.String({ description: 'id' })),\n    type: Type.Optional(Type.String({ description: 'type' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Array(\n        Type.Object({\n          vod_name: Type.String(),\n          vod_pic: Type.Optional(Type.String()),\n          vod_douban_id: Type.Optional(Type.String()),\n          vod_douban_type: Type.Optional(Type.String()),\n        }),\n      ),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/flim/site.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { siteTypes } from '@shared/config/film';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[film]site';\n\nconst baseItemSchema = Type.Object({\n  id: Type.String({ description: 'id' }),\n  key: Type.String({ description: 'key' }),\n  name: Type.Union([Type.String(), Type.Null()], { description: 'name' }),\n  api: Type.String({ description: 'api' }),\n  playUrl: Type.Union([Type.String(), Type.Null()], { description: 'play parse json url' }),\n  search: Type.Boolean({ description: 'search' }),\n  group: Type.Union([Type.String(), Type.Null()], { description: 'group' }),\n  type: Type.Integer({ format: 'int32', enum: siteTypes, description: 'type' }),\n  ext: Type.Union([Type.String(), Type.Record(Type.String(), Type.String()), Type.Null()], { description: 'ext' }),\n  categories: Type.Union([Type.String(), Type.Null()], { description: 'categories' }),\n  isActive: Type.Boolean({ description: 'active status' }),\n  createdAt: Type.Integer({ format: 'int64', description: 'created timestamp' }),\n  updatedAt: Type.Integer({ format: 'int64', description: 'updated timestamp' }),\n});\n\nconst inputItemSchema = Type.Partial(Type.Omit(baseItemSchema, ['id', 'createdAt', 'updatedAt']));\n\nconst putItemSchema = Type.Partial(baseItemSchema);\n\nexport const outputItemSchema = baseItemSchema;\n\nexport const addSchema = {\n  tags: [API_PREFIX],\n  summary: 'Add data',\n  description: 'Add a new data.',\n  body: inputItemSchema,\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const deleteSchema = {\n  tags: [API_PREFIX],\n  summary: 'Delete data',\n  description: 'Delete data by id or type, if id and type is empty, delete all.',\n  body: Type.Object({\n    id: Type.Optional(Type.Array(Type.String(), { description: 'data id' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Null(), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const putSchema = {\n  tags: [API_PREFIX],\n  summary: 'Set data',\n  description: 'Set data.',\n  body: Type.Object({\n    id: Type.Array(Type.String(), { description: 'updated data id' }),\n    doc: putItemSchema,\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const pageSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get list',\n  description: 'Get list with pagination and filtering.',\n  querystring: Type.Object({\n    page: Type.Integer({ format: 'int32', description: 'page number' }),\n    pageSize: Type.Integer({ format: 'int32', description: 'page size' }),\n    kw: Type.Optional(Type.String({ description: 'search keyword' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        list: Type.Optional(Type.Array(outputItemSchema)),\n        total: Type.Optional(Type.Integer({ format: 'int32' })),\n        default: Type.Optional(Type.String()),\n        group: Type.Optional(Type.Array(Type.Object({ label: Type.String(), value: Type.String() }))),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getActiveSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get active',\n  description: 'Get active data.',\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        list: Type.Optional(Type.Array(outputItemSchema)),\n        default: Type.Optional(outputItemSchema),\n        extra: Type.Optional(\n          Type.Object({\n            group: Type.Optional(Type.Array(Type.Object({ label: Type.String(), value: Type.String() }))),\n            filter: Type.Optional(Type.Boolean()),\n            search: Type.Optional(Type.String()),\n          }),\n        ),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getDetailSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get detail',\n  description: 'Get detail by id.',\n  params: Type.Object({\n    id: Type.String({ description: 'data id' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getDetailByKeySchema = {\n  tags: [API_PREFIX],\n  summary: 'Get detail',\n  description: 'Get detail by key.',\n  params: Type.Object({\n    key: Type.String({ description: 'data key' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const setDefaultSchema = {\n  tags: [API_PREFIX],\n  summary: 'Set default',\n  description: 'Set default by id.',\n  params: Type.Object({\n    id: Type.String({ description: 'data id' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Boolean(), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/live/channel.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[live]channel';\n\nconst baseItemSchema = Type.Object({\n  id: Type.String({ description: 'id' }),\n  name: Type.Union([Type.String(), Type.Null()], { description: 'name' }),\n  api: Type.String({ description: 'api' }),\n  logo: Type.Union([Type.String(), Type.Null()], { description: 'logo' }),\n  playback: Type.Union([Type.String(), Type.Null()], { description: 'playback' }),\n  group: Type.Union([Type.String(), Type.Null()], { description: 'group' }),\n  createdAt: Type.Integer({ format: 'int64', description: 'created timestamp' }),\n  updatedAt: Type.Integer({ format: 'int64', description: 'updated timestamp' }),\n});\n\nconst inputItemSchema = Type.Partial(Type.Omit(baseItemSchema, ['id', 'createdAt', 'updatedAt']));\n\nconst putItemSchema = Type.Partial(baseItemSchema);\n\nconst outputItemSchema = baseItemSchema;\n\nexport const addSchema = {\n  tags: [API_PREFIX],\n  summary: 'Add data',\n  description: 'Add a new data.',\n  body: inputItemSchema,\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const deleteSchema = {\n  tags: [API_PREFIX],\n  summary: 'Delete data',\n  description: 'Delete data by id or type, if id and type is empty, delete all.',\n  body: Type.Object({\n    id: Type.Optional(Type.Array(Type.String(), { description: 'data id' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Null(), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const putSchema = {\n  tags: [API_PREFIX],\n  summary: 'Set data',\n  description: 'Set data.',\n  body: Type.Object({\n    id: Type.Array(Type.String(), { description: 'updated data id' }),\n    doc: putItemSchema,\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const pageSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get list',\n  description: 'Get list with pagination and filtering.',\n  querystring: Type.Object({\n    page: Type.Integer({ format: 'int32', description: 'page number' }),\n    pageSize: Type.Integer({ format: 'int32', description: 'page size' }),\n    kw: Type.Optional(Type.String({ description: 'search keyword' })),\n    group: Type.Optional(Type.String({ description: 'search group' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        list: Type.Optional(Type.Array(outputItemSchema)),\n        total: Type.Optional(Type.Integer({ format: 'int32' })),\n        class: Type.Optional(Type.Array(Type.Object({ label: Type.String(), value: Type.String() }))),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getDetailSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get detail',\n  description: 'Get detail by id.',\n  params: Type.Object({\n    id: Type.String({ description: 'data id' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getEpgSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get epg',\n  description: 'Get epg by channel and date.',\n  querystring: Type.Object({\n    ch: Type.String({ description: 'data channel' }),\n    date: Type.Optional(Type.String({ format: 'date', description: 'data date' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Array(\n        Type.Object({\n          start: Type.String({ pattern: '^([01]\\\\d|2[0-3]):[0-5]\\\\d$', description: 'start time' }),\n          desc: Type.Optional(Type.String({ description: 'data description' })),\n          end: Type.String({ pattern: '^([01]\\\\d|2[0-3]):[0-5]\\\\d$', description: 'end time' }),\n          title: Type.String({ description: 'data title' }),\n        }),\n      ),\n      {\n        description: 'Successful Operation',\n      },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/live/iptv.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { iptvTypes } from '@shared/config/live';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[live]iptv';\n\nconst baseItemSchema = Type.Object({\n  id: Type.String({ description: 'id' }),\n  key: Type.String({ description: 'key' }),\n  name: Type.Union([Type.String(), Type.Null()], { description: 'name' }),\n  api: Type.String({ description: 'api' }),\n  type: Type.Integer({ format: 'int32', enum: iptvTypes, description: 'type' }),\n  epg: Type.Union([Type.String(), Type.Null()], { description: 'epg' }),\n  logo: Type.Union([Type.String(), Type.Null()], { description: 'logo' }),\n  headers: Type.Union([Type.Record(Type.String(), Type.Any()), Type.Null()], { description: 'headers' }),\n  isActive: Type.Boolean({ description: 'active status' }),\n  createdAt: Type.Integer({ format: 'int64', description: 'created timestamp' }),\n  updatedAt: Type.Integer({ format: 'int64', description: 'updated timestamp' }),\n});\n\nconst inputItemSchema = Type.Partial(Type.Omit(baseItemSchema, ['id', 'createdAt', 'updatedAt']));\n\nconst putItemSchema = Type.Partial(baseItemSchema);\n\nexport const outputItemSchema = baseItemSchema;\n\nexport const addSchema = {\n  tags: [API_PREFIX],\n  summary: 'Add data',\n  description: 'Add a new data.',\n  body: inputItemSchema,\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const deleteSchema = {\n  tags: [API_PREFIX],\n  summary: 'Delete data',\n  description: 'Delete data by id or type, if id and type is empty, delete all.',\n  body: Type.Object({\n    id: Type.Optional(Type.Array(Type.String(), { description: 'data id' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Null(), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const putSchema = {\n  tags: [API_PREFIX],\n  summary: 'Set data',\n  description: 'Set data.',\n  body: Type.Object({\n    id: Type.Array(Type.String(), { description: 'updated data id' }),\n    doc: putItemSchema,\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const pageSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get list',\n  description: 'Get list with pagination and filtering.',\n  querystring: Type.Object({\n    page: Type.Integer({ format: 'int32', description: 'page number' }),\n    pageSize: Type.Integer({ format: 'int32', description: 'page size' }),\n    kw: Type.Optional(Type.String({ description: 'search keyword' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        list: Type.Optional(Type.Array(outputItemSchema)),\n        total: Type.Optional(Type.Integer({ format: 'int32' })),\n        default: Type.Optional(Type.String()),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getActiveSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get active',\n  description: 'Get active data.',\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        list: Type.Optional(Type.Array(outputItemSchema)),\n        default: Type.Optional(outputItemSchema),\n        class: Type.Optional(Type.Array(Type.Object({ label: Type.String(), value: Type.String() }))),\n        extra: Type.Optional(\n          Type.Object({\n            epg: Type.Optional(Type.String({ description: 'epg' })),\n            logo: Type.Optional(Type.String({ description: 'logo' })),\n            ipMark: Type.Optional(Type.Boolean({ description: 'ipMark' })),\n            delay: Type.Optional(Type.Boolean({ description: 'delay' })),\n            thumbnail: Type.Optional(Type.Boolean({ description: 'thumbnail' })),\n          }),\n        ),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getDetailSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get detail',\n  description: 'Get detail by id.',\n  params: Type.Object({\n    id: Type.String({ description: 'data id' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getDetailByKeySchema = {\n  tags: [API_PREFIX],\n  summary: 'Get detail',\n  description: 'Get detail by key.',\n  params: Type.Object({\n    key: Type.String({ description: 'data key' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const setDefaultSchema = {\n  tags: [API_PREFIX],\n  summary: 'Set default',\n  description: 'Set default by id.',\n  params: Type.Object({\n    id: Type.String({ description: 'data id' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Boolean(), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getCheckSchema = {\n  tags: [API_PREFIX],\n  summary: 'Check validity',\n  description: 'Check validity.',\n  params: Type.Object({\n    id: Type.String({ description: 'data id' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Boolean(), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/moment/history.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[moment]history';\n\nconst baseItemSchema = Type.Object({\n  id: Type.String({ description: 'id' }),\n  type: Type.Integer({ format: 'int32', enum: [1, 2, 3, 5, 6, 7], description: 'type' }),\n  relateId: Type.String({ description: 'relate id' }),\n  siteSource: Type.Union([Type.String(), Type.Null()], { description: 'site source' }),\n  playEnd: Type.Boolean({ description: 'watch end' }),\n  videoId: Type.String({ description: 'video id' }),\n  videoImage: Type.Union([Type.String(), Type.Null()], { description: 'video image' }),\n  videoName: Type.Union([Type.String(), Type.Null()], { description: 'video name' }),\n  videoIndex: Type.Union([Type.String(), Type.Null()], { description: 'video index' }),\n  watchTime: Type.Union([Type.Number({ format: 'float' }), Type.Null()], { description: 'watch time' }),\n  duration: Type.Union([Type.Number({ format: 'float' }), Type.Null()], { description: 'video duration' }),\n  skipTimeInEnd: Type.Union([Type.Number({ format: 'float' }), Type.Null()], { description: 'skip time in end' }),\n  skipTimeInStart: Type.Union([Type.Number({ format: 'float' }), Type.Null()], { description: 'skip time in start' }),\n  createdAt: Type.Integer({ format: 'int64', description: 'created timestamp' }),\n  updatedAt: Type.Integer({ format: 'int64', description: 'updated timestamp' }),\n});\n\nconst inputItemSchema = Type.Partial(Type.Omit(baseItemSchema, ['id', 'createdAt', 'updatedAt']));\n\nconst putItemSchema = Type.Partial(baseItemSchema);\n\nconst outputItemSchema = baseItemSchema;\n\nexport const addSchema = {\n  tags: [API_PREFIX],\n  summary: 'Add data',\n  description: 'Add a new data.',\n  body: inputItemSchema,\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const deleteSchema = {\n  tags: [API_PREFIX],\n  summary: 'Delete data',\n  description: 'Delete data by id or type, if id and type is empty, delete all.',\n  body: Type.Partial(\n    Type.Object({\n      id: Type.Optional(Type.Array(Type.String(), { description: 'data id' })),\n      type: Type.Optional(\n        Type.Array(Type.Integer({ format: 'int32', enum: [1, 2, 3, 5, 6, 7] }), { description: 'search type' }),\n      ),\n    }),\n  ),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Null(), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const putSchema = {\n  tags: [API_PREFIX],\n  summary: 'Set data',\n  description: 'Set data.',\n  body: Type.Object({\n    id: Type.Array(Type.String(), { description: 'updated data id' }),\n    doc: putItemSchema,\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const pageSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get list',\n  description: 'Get list with pagination and filtering.',\n  querystring: Type.Object({\n    page: Type.Integer({ format: 'int32', description: 'page number' }),\n    pageSize: Type.Integer({ format: 'int32', description: 'page size' }),\n    kw: Type.Optional(Type.String({ description: 'search keyword' })),\n    type: Type.Optional(\n      Type.Array(Type.Integer({ format: 'int32', enum: [1, 2, 3, 5, 6, 7] }), { description: 'search type' }),\n    ),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        list: Type.Optional(\n          Type.Array(\n            Type.Intersect([\n              outputItemSchema,\n              Type.Object({\n                relateSite: Type.Any({ description: 'relate info' }),\n              }),\n            ]),\n          ),\n        ),\n        total: Type.Optional(Type.Integer({ format: 'int32' })),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const findDetailSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get detail',\n  description: 'Get detail by joint parameterization.',\n  querystring: Type.Object({\n    relateId: Type.String({ description: 'relate id' }),\n    videoId: Type.String({ description: 'video id' }),\n    type: Type.Optional(Type.Integer({ format: 'int32', enum: [1, 2, 3, 5, 6, 7], description: 'type' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getDetailSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get detail',\n  description: 'Get detail by id.',\n  params: Type.Object({\n    id: Type.String({ description: 'data id' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/moment/moment.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\nimport { outputItemSchema as siteSchema } from '../flim/site';\nimport { outputItemSchema as iptvSchema } from '../live/iptv';\nimport { outputItemSchema as analyzeSchema } from '../parse/analyze';\n\nconst API_PREFIX = '[moment]other';\n\nexport const getRelatedSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get related',\n  description: 'Get related site.',\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        parse: Type.Array(analyzeSchema),\n        live: Type.Array(iptvSchema),\n        film: Type.Array(siteSchema),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/moment/star.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[moment]star';\n\nconst baseItemSchema = Type.Object({\n  id: Type.String({ description: 'id' }),\n  type: Type.Integer({ format: 'int32', enum: [1, 2, 3], description: 'type' }),\n  relateId: Type.String({ description: 'relate id' }),\n  videoId: Type.String({ description: 'video id' }),\n  videoImage: Type.Union([Type.String(), Type.Null()], { description: 'video image' }),\n  videoName: Type.Union([Type.String(), Type.Null()], { description: 'video name' }),\n  videoType: Type.Union([Type.String(), Type.Null()], { description: 'video type' }),\n  videoRemarks: Type.Union([Type.String(), Type.Null()], { description: 'video remarks' }),\n  createdAt: Type.Integer({ format: 'int64', description: 'created timestamp' }),\n  updatedAt: Type.Integer({ format: 'int64', description: 'updated timestamp' }),\n});\n\nconst inputItemSchema = Type.Partial(Type.Omit(baseItemSchema, ['id', 'createdAt', 'updatedAt']));\n\nconst putItemSchema = Type.Partial(baseItemSchema);\n\nconst outputItemSchema = baseItemSchema;\n\nexport const addSchema = {\n  tags: [API_PREFIX],\n  summary: 'Add data',\n  description: 'Add a new data.',\n  body: inputItemSchema,\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const deleteSchema = {\n  tags: [API_PREFIX],\n  summary: 'Delete data',\n  description: 'Delete data by id or type, if id and type is empty, delete all.',\n  body: Type.Partial(\n    Type.Object({\n      id: Type.Optional(Type.Array(Type.String(), { description: 'data id' })),\n      type: Type.Optional(\n        Type.Array(Type.Integer({ format: 'int32', enum: [1, 2, 3] }), { description: 'search type' }),\n      ),\n    }),\n  ),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Null(), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const putSchema = {\n  tags: [API_PREFIX],\n  summary: 'Set data',\n  description: 'Set data.',\n  body: Type.Object({\n    id: Type.Array(Type.String(), { description: 'updated data id' }),\n    doc: putItemSchema,\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const pageSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get list',\n  description: 'Get list with pagination and filtering.',\n  querystring: Type.Object({\n    page: Type.Integer({ format: 'int32', description: 'page number' }),\n    pageSize: Type.Integer({ format: 'int32', description: 'page size' }),\n    kw: Type.Optional(Type.String({ description: 'search keyword' })),\n    type: Type.Optional(Type.Array(Type.Integer({ format: 'int32', enum: [1, 2, 3] }), { description: 'search type' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        list: Type.Optional(\n          Type.Array(\n            Type.Intersect([\n              outputItemSchema,\n              Type.Object({\n                relateSite: Type.Any({ description: 'relate info' }),\n              }),\n            ]),\n          ),\n        ),\n        total: Type.Optional(Type.Integer({ format: 'int32' })),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const findDetailSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get detail',\n  description: 'Get detail by joint parameterization.',\n  querystring: Type.Object({\n    relateId: Type.String({ description: 'relate id' }),\n    videoId: Type.String({ description: 'video id' }),\n    type: Type.Optional(Type.Integer({ format: 'int32', enum: [1, 2, 3], description: 'type' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getDetailSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get detail',\n  description: 'Get detail by id.',\n  params: Type.Object({\n    id: Type.String({ description: 'data id' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/parse/analyze.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { analyzeTypes } from '@shared/config/parse';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[parse]analyze';\n\nconst baseItemSchema = Type.Object({\n  id: Type.String({ description: 'id' }),\n  key: Type.String({ description: 'key' }),\n  name: Type.Union([Type.String(), Type.Null()], { description: 'name' }),\n  api: Type.String({ description: 'api' }),\n  type: Type.Integer({ format: 'int32', enum: analyzeTypes, description: 'type' }),\n  flag: Type.Array(Type.String(), { description: 'flag' }),\n  headers: Type.Union([Type.Record(Type.String(), Type.Any()), Type.Null()], { description: 'headers' }),\n  script: Type.Union([Type.String(), Type.Null()], { description: 'script' }),\n  isActive: Type.Boolean({ description: 'active status' }),\n  createdAt: Type.Integer({ format: 'int64', description: 'created timestamp' }),\n  updatedAt: Type.Integer({ format: 'int64', description: 'updated timestamp' }),\n});\n\nconst inputItemSchema = Type.Partial(Type.Omit(baseItemSchema, ['id', 'createdAt', 'updatedAt']));\n\nconst putItemSchema = Type.Partial(baseItemSchema);\n\nexport const outputItemSchema = baseItemSchema;\n\nexport const addSchema = {\n  tags: [API_PREFIX],\n  summary: 'Add data',\n  description: 'Add a new data.',\n  body: inputItemSchema,\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const deleteSchema = {\n  tags: [API_PREFIX],\n  summary: 'Delete data',\n  description: 'Delete data by id or type, if id and type is empty, delete all.',\n  body: Type.Object({\n    id: Type.Optional(Type.Array(Type.String(), { description: 'data id' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Null(), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const putSchema = {\n  tags: [API_PREFIX],\n  summary: 'Set data',\n  description: 'Set data.',\n  body: Type.Object({\n    id: Type.Array(Type.String(), { description: 'updated data id' }),\n    doc: putItemSchema,\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const pageSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get list',\n  description: 'Get list with pagination and filtering.',\n  querystring: Type.Object({\n    page: Type.Integer({ format: 'int32', description: 'page number' }),\n    pageSize: Type.Integer({ format: 'int32', description: 'page size' }),\n    kw: Type.Optional(Type.String({ description: 'search keyword' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        list: Type.Optional(Type.Array(outputItemSchema)),\n        total: Type.Optional(Type.Integer({ format: 'int32' })),\n        default: Type.Optional(Type.String()),\n        flag: Type.Optional(Type.Array(Type.String())),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getActiveSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get active',\n  description: 'Get active data.',\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        list: Type.Optional(Type.Array(outputItemSchema)),\n        default: Type.Optional(outputItemSchema),\n        extra: Type.Optional(\n          Type.Object({\n            flag: Type.Optional(Type.Array(Type.String())),\n          }),\n        ),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getDetailSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get detail',\n  description: 'Get detail by id.',\n  params: Type.Object({\n    id: Type.String({ description: 'data id' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getDetailByKeySchema = {\n  tags: [API_PREFIX],\n  summary: 'Get detail',\n  description: 'Get detail by key.',\n  params: Type.Object({\n    key: Type.String({ description: 'data key' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const setDefaultSchema = {\n  tags: [API_PREFIX],\n  summary: 'Set default',\n  description: 'Set default by id.',\n  params: Type.Object({\n    id: Type.String({ description: 'data id' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Boolean(), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getCheckSchema = {\n  tags: [API_PREFIX],\n  summary: 'Check validity',\n  description: 'Check validity.',\n  params: Type.Object({\n    id: Type.String({ description: 'data id' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Boolean(), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/parse/parse.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[parse]other';\n\nexport const mediaDirectSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get media direct',\n  description: 'Get media direct url.',\n  querystring: Type.Object({\n    id: Type.String({ description: 'Specified analyze id' }),\n    url: Type.String({ description: 'parse url' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        url: Type.String({ description: 'parsed url' }),\n        headers: Type.Optional(Type.Record(Type.String(), Type.Any(), { description: 'parsed headers' })),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/plugin.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../base';\n\nconst API_PREFIX = '[plugin]work';\n\nconst baseItemSchema = Type.Object({\n  id: Type.String({ description: 'id' }),\n  type: Type.Integer({ format: 'int32', enum: [1, 2, 3], description: 'type' }),\n  name: Type.String({ description: 'plugin name' }),\n  pluginName: Type.String({ description: 'plugin readable name' }),\n  author: Type.String({ description: 'author' }),\n  description: Type.String({ description: 'description' }),\n  readme: Type.String({ description: 'readme' }),\n  base: Type.String({ description: 'work path' }),\n  main: Type.String({ description: 'main' }),\n  web: Type.String({ description: 'web' }),\n  version: Type.String({ description: 'version' }),\n  logo: Type.String({ description: 'logo' }),\n  homepage: Type.String({ description: 'homepage' }),\n  isActive: Type.Boolean({ description: 'run status' }),\n  createdAt: Type.Integer({ format: 'int64', description: 'created timestamp' }),\n  updatedAt: Type.Integer({ format: 'int64', description: 'updated timestamp' }),\n});\n\nconst outputItemSchema = baseItemSchema;\n\nexport const pageSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get list',\n  description: 'Get list with pagination and filtering.',\n  querystring: Type.Object({\n    page: Type.Integer({ format: 'int32', description: 'page number' }),\n    pageSize: Type.Integer({ format: 'int32', description: 'page size' }),\n    kw: Type.Optional(Type.String({ description: 'search keyword' })),\n    type: Type.Optional(Type.Integer({ format: 'int32', enum: [1, 2, 3], description: 'search type' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        list: Type.Optional(Type.Array(baseItemSchema)),\n        total: Type.Optional(Type.Integer({ format: 'int32' })),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getDetailSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get detail',\n  description: 'Get detail by id.',\n  params: Type.Object({\n    id: Type.String({ description: 'data id' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const installSchema = {\n  tags: [API_PREFIX],\n  summary: 'Install plugin',\n  description: 'Install plugin by project path.',\n  body: Type.Object({\n    id: Type.Array(Type.String(), { description: 'install data path' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const uninstallSchema = {\n  tags: [API_PREFIX],\n  summary: 'Uninstall plugin',\n  description: 'Uninstall plugin by id.',\n  body: Type.Object({\n    id: Type.Array(Type.String(), { description: 'uninstall data id' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const startSchema = {\n  tags: [API_PREFIX],\n  summary: 'Start plugin',\n  description: 'Start plugin by id.',\n  body: Type.Object({\n    id: Type.Array(Type.String(), { description: 'start data id' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const stopSchema = {\n  tags: [API_PREFIX],\n  summary: 'Stop plugin',\n  description: 'Stop plugin by id.',\n  body: Type.Object({\n    id: Type.Array(Type.String(), { description: 'stop data id' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/setting.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { settingKeys, setupKeys } from '@shared/config/tblSetting';\nimport type { TLiteral } from '@sinclair/typebox';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../base';\n\nconst API_PREFIX = '[setting]work';\n\nconst baseItemSchema = Type.Object({\n  id: Type.String({ description: 'id' }),\n  key: Type.String({ description: 'key' }),\n  value: Type.Any({ description: 'value' }),\n  createdAt: Type.Integer({ format: 'int64', description: 'created timestamp' }),\n  updatedAt: Type.Integer({ format: 'int64', description: 'updated timestamp' }),\n});\n\nconst outputItemSchema = baseItemSchema;\n\nexport const addSchema = {\n  tags: [API_PREFIX],\n  summary: 'Add data',\n  description: 'Add a new data.',\n  body: Type.Object({\n    key: Type.String({ enum: settingKeys, description: 'key' }),\n    value: Type.Any({ description: 'value' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const deleteSchema = {\n  tags: [API_PREFIX],\n  summary: 'Delete data',\n  description: 'Delete data by keys, if keys is empty, delete all.',\n  body: Type.Object({\n    keys: Type.Optional(Type.Array(Type.String(), { description: 'data ids' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Null(), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const putSchema = {\n  tags: [API_PREFIX],\n  summary: 'Set data',\n  description: 'Set data.',\n  body: Type.Object({\n    key: Type.String({ enum: settingKeys, description: 'key' }),\n    value: Type.Any({ description: 'value' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getSetupSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get setup',\n  description: 'Get setup.',\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Partial(\n        Type.Record(\n          Type.Union(setupKeys.map((k) => Type.Literal(k)) as TLiteral<(typeof setupKeys)[number]>[]),\n          Type.Any(),\n        ),\n      ),\n      {\n        description: 'Successful Operation',\n      },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getListSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get list',\n  description: 'Get list.',\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Partial(\n        Type.Record(\n          Type.Union(settingKeys.map((k) => Type.Literal(k)) as TLiteral<(typeof settingKeys)[number]>[]),\n          Type.Any(),\n        ),\n      ),\n      {\n        description: 'Successful Operation',\n      },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getDetailSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get detail',\n  description: 'Get detail by key.',\n  params: Type.Object({\n    key: Type.String({ enum: settingKeys, description: 'key' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(outputItemSchema, {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const getDetailValueSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get detail',\n  description: 'Get detail by key.',\n  params: Type.Object({\n    key: Type.String({ enum: settingKeys, description: 'key' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Any(), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const putSourceSchema = {\n  tags: [API_PREFIX],\n  summary: 'Set all data',\n  description: 'Set all data.',\n  body: Type.Partial(\n    Type.Record(\n      Type.Union(settingKeys.map((k) => Type.Literal(k)) as TLiteral<(typeof settingKeys)[number]>[]),\n      Type.Any(),\n    ),\n    { description: 'settings' },\n  ),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Partial(\n        Type.Record(\n          Type.Union(settingKeys.map((k) => Type.Literal(k)) as TLiteral<(typeof settingKeys)[number]>[]),\n          Type.Any(),\n        ),\n      ),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/system/binary.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[system]binary';\n\nconst baseItemSchema = Type.Object({\n  name: Type.String({ description: 'name' }),\n  path: Type.String({ description: 'path' }),\n  exist: Type.Boolean({ description: 'exist' }),\n});\n\nexport const outputItemSchema = baseItemSchema;\n\nexport const getBinaryListSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get binary list',\n  description: 'Get binary list.',\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object(\n        {\n          list: Type.Array(outputItemSchema, { description: 'binary list' }),\n          total: Type.Number({ description: 'total count' }),\n        },\n        { description: 'Successful Operation' },\n      ),\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const installBinarySchema = {\n  tags: [API_PREFIX],\n  summary: 'Install binary',\n  description: 'Install binary.',\n  body: Type.Object({\n    id: Type.Array(Type.String(), { description: 'binary name' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(outputItemSchema), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/system/cdp.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[system]cdp';\n\nexport const cdpSnifferMediaSchema = {\n  tags: [API_PREFIX],\n  summary: 'Sniffer media',\n  description: 'Sniffer media.',\n  body: Type.Object({\n    url: Type.String({ format: 'uri', description: 'media url' }),\n    options: Type.Optional(\n      Type.Object({\n        runScript: Type.Optional(Type.String({ description: 'run script' })),\n        initScript: Type.Optional(Type.String({ description: 'init script' })),\n        customRegex: Type.Optional(Type.String({ description: 'match regex' })),\n        snifferExclude: Type.Optional(Type.String({ description: 'exclude regex' })),\n        headers: Type.Optional(Type.Record(Type.String(), Type.Any(), { description: 'request headers' })),\n        timeout: Type.Optional(Type.Integer({ format: 'int32', minimum: 0, description: 'timeout (ms)' })),\n      }),\n    ),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        url: Type.String({ description: 'media url' }),\n        headers: Type.Record(Type.String(), Type.Any(), { description: 'request headers' }),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/system/ffmpeg.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[system]ffmpeg';\n\nexport const ffmpegInfoSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get media info',\n  description: 'Media info.',\n  body: Type.Object({\n    url: Type.String({ format: 'uri', description: 'request url' }),\n    options: Type.Optional(\n      Type.Object({\n        headers: Type.Optional(Type.Record(Type.String(), Type.Any(), { description: 'request headers' })),\n        timeout: Type.Optional(Type.Integer({ minimum: 0, maximum: 2147480, description: 'timeout (ms)' })),\n      }),\n    ),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        duration: Type.Optional(Type.Number({ description: 'duration (s)', format: 'float' })),\n        video: Type.Optional(\n          Type.Object({\n            codec: Type.Optional(Type.String({ description: 'video codec' })),\n            width: Type.Optional(Type.Integer({ description: 'video width', format: 'int32' })),\n            height: Type.Optional(Type.Integer({ description: 'video height', format: 'int32' })),\n            resolution: Type.Optional(Type.String({ description: 'video resolution' })),\n            fps: Type.Optional(Type.Integer({ description: 'video fps', format: 'int32' })),\n            bitrate: Type.Optional(Type.Integer({ description: 'video bitrate (kbps)', format: 'int32' })),\n          }),\n        ),\n        audio: Type.Optional(\n          Type.Object({\n            codec: Type.Optional(Type.String({ description: 'audio codec' })),\n            sampleRate: Type.Optional(Type.Integer({ description: 'audio sample rate (hz)', format: 'int32' })),\n            channelCount: Type.Optional(Type.Integer({ description: 'audio channel count', format: 'int32' })),\n            channelType: Type.Optional(Type.String({ description: 'audio channel type' })),\n            bitrate: Type.Optional(Type.Integer({ description: 'audio bitrate (kbps)', format: 'int32' })),\n          }),\n        ),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const ffmpegScreenshotSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get media screenshot',\n  description: 'Media screenshot base64.',\n  body: Type.Object({\n    url: Type.String({ format: 'uri', description: 'request url' }),\n    options: Type.Optional(\n      Type.Object({\n        headers: Type.Optional(Type.Record(Type.String(), Type.Any(), { description: 'request headers' })),\n        timeout: Type.Optional(Type.Integer({ minimum: 0, maximum: 2147480, description: 'timeout (ms)' })),\n        timestamp: Type.Optional(Type.String({ description: 'timestamp (HH:mm:ss)' })),\n      }),\n    ),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.String({ description: 'screenshot base64' }), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/system/other.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { LEVEL, LOG_MODULE } from '@shared/config/logger';\nimport { reqEncodes, reqMethods } from '@shared/config/req';\nimport { Type } from '@sinclair/typebox';\n\nimport {\n  createHttpErrorResponseSchema,\n  createHttpRedirectResponseSchema,\n  createHttpSuccessResponseSchema,\n} from '../../base';\n\nconst API_PREFIX = '[system]other';\n\nexport const healthSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get server health',\n  description: 'Server health.',\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        timestamp: Type.Integer({ format: 'int64', description: 'timestamp' }),\n        version: Type.String({ description: 'version' }),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const ipSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get server ip',\n  description: 'Server ip address.',\n  querystring: Type.Object({\n    preferIPv6: Type.Optional(Type.Boolean({ description: 'Whether to prefer IPv6 address, default is true' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        ip: Type.Union([Type.String({ format: 'ipv4' }), Type.String({ format: 'ipv6' }), Type.String()], {\n          description: 'ip address',\n        }),\n        version: Type.Integer({ enum: [4, 6, -1], format: 'int32', description: 'ip version' }),\n        valid: Type.Boolean({ description: 'ip valid' }),\n        location: Type.Object({\n          country: Type.Optional(Type.String({ description: 'country' })),\n          region: Type.Optional(Type.String({ description: 'region' })),\n          city: Type.Optional(Type.String({ description: 'city' })),\n          isp: Type.Optional(Type.String({ description: 'isp' })),\n          isChinaMainland: Type.Optional(Type.Boolean({ description: 'valid location in china mainland' })),\n        }),\n      }),\n      { description: 'Successful Operation' },\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const reqSchema = {\n  tags: [API_PREFIX],\n  summary: 'Axios request',\n  description: 'same as axios request.',\n  body: Type.Object({\n    url: Type.String({ format: 'uri', description: 'request url' }),\n    method: Type.String({ enum: reqMethods, description: 'request method' }),\n    headers: Type.Optional(Type.Record(Type.String(), Type.Any(), { description: 'request headers' })),\n    data: Type.Optional(Type.Any({ description: 'request data' })),\n    params: Type.Optional(Type.Record(Type.String(), Type.Any(), { description: 'request params' })),\n    timeout: Type.Optional(Type.Integer({ minimum: 0, description: 'timeout (ms)' })),\n    encode: Type.Optional(Type.String({ enum: reqEncodes, description: 'encoding format' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(\n      Type.Object({\n        code: Type.Integer({ format: 'int32', description: 'response code' }),\n        data: Type.Any({ description: 'response data' }),\n        headers: Type.Optional(Type.Record(Type.String(), Type.Any(), { description: 'response headers' })),\n      }),\n    ),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const m3u8AdRemoveSchema = {\n  tags: [API_PREFIX],\n  summary: 'Remove m3u8 segment',\n  description: 'Remove ad from m3u8 segment.',\n  querystring: Type.Object({\n    url: Type.String({ format: 'uri', description: 'm3u8 url' }),\n    headers: Type.Optional(Type.String({ description: 'request headers' })),\n  }),\n  response: {\n    200: {\n      content: {\n        'application/vnd.apple.mpegurl': { schema: Type.String() },\n        'application/x-mpegURL': { schema: Type.String() },\n        'application/octet-stream': { schema: Type.String() },\n      },\n      description: 'Successful Operation',\n    },\n    302: createHttpRedirectResponseSchema(),\n    400: createHttpErrorResponseSchema(Type.String(), { description: 'Parameter Verification Error' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const logSchema = {\n  tags: [API_PREFIX],\n  summary: 'Get log',\n  description: 'Get log by type and level, default is all',\n  querystring: Type.Object({\n    type: Type.Optional(\n      Type.String({ description: `log type(comma split), allowed values: ${Object.values(LOG_MODULE).join(', ')}` }),\n    ),\n    level: Type.Optional(Type.String({ enum: Object.values(LEVEL), description: 'log level' })),\n  }),\n  response: {\n    200: {\n      content: {\n        'text/event-stream': {\n          schema: Type.Union([\n            Type.Object({\n              level: Type.String({ enum: Object.values(LEVEL), description: 'log level' }),\n              message: Type.Any(),\n              module: Type.String({ enum: Object.values(LOG_MODULE), description: 'log module' }),\n              timestamp: Type.String({ description: 'timestamp' }),\n              process: Type.String({ enum: ['main', 'renderer'], description: 'process name' }),\n            }),\n            Type.String(),\n          ]),\n        },\n      },\n      description: 'Successful Operation',\n    },\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FastifyService/schemas/v1/system/process.ts",
    "content": "import { Schema } from '@main/types/server';\nimport { Type } from '@sinclair/typebox';\n\nimport { createHttpSuccessResponseSchema } from '../../base';\n\nconst API_PREFIX = '[system]process';\n\nexport const processKillSchema = {\n  tags: [API_PREFIX],\n  summary: 'Process kill',\n  description: 'Kill system process.',\n  querystring: Type.Object({\n    pid: Type.Array(Type.Integer({ format: 'int32', description: 'process id' })),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Boolean(), { description: 'Successful Operation' }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n\nexport const processMatchSchema = {\n  tags: [API_PREFIX],\n  summary: 'Process match',\n  description: 'Match system process.',\n  querystring: Type.Object({\n    type: Type.String({ enum: ['port', 'ps'], description: 'match type' }),\n    kw: Type.Union([Type.String(), Type.Integer({ format: 'int32' })], { description: 'keyword' }),\n  }),\n  response: {\n    200: createHttpSuccessResponseSchema(Type.Array(Type.Number()), {\n      description: 'Successful Operation',\n    }),\n    default: {\n      description: 'Unexpected Error',\n      $ref: Schema.ApiReponseError,\n    },\n  },\n};\n"
  },
  {
    "path": "src/main/services/FileStorage.ts",
    "content": "import type { Buffer } from 'node:buffer';\n\nimport { loggerService } from '@logger';\nimport { clearDir, ensureDir, readFile, saveFile } from '@main/utils/file';\nimport { APP_REQUIRE_PATH, APP_TEMP_PATH } from '@main/utils/path';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport type { OpenDialogOptions, OpenDialogReturnValue, SaveDialogOptions, SaveDialogReturnValue } from 'electron';\nimport { dialog, session, shell } from 'electron';\nimport { merge } from 'es-toolkit';\n\nconst logger = loggerService.withContext(LOG_MODULE.FILE_STORAGE);\n\nclass FileStorage {\n  private static instance: FileStorage;\n  private requireDir = APP_REQUIRE_PATH;\n\n  constructor() {}\n\n  public static getInstance(): FileStorage {\n    if (!FileStorage.instance) {\n      FileStorage.instance = new FileStorage();\n    }\n    return FileStorage.instance;\n  }\n\n  public initRequireDir = async (): Promise<void> => {\n    try {\n      for (const dir of this.requireDir) {\n        await ensureDir(dir);\n      }\n    } catch (error) {\n      logger.error('Failed to initialize storage:', error as Error);\n      throw error;\n    }\n  };\n\n  public clear = async (): Promise<void> => {\n    try {\n      for (const dir of this.requireDir) {\n        await clearDir(dir);\n      }\n      await this.initRequireDir();\n    } catch (error) {\n      logger.error('Failed to clear storage:', error as Error);\n      throw error;\n    }\n  };\n\n  public clearTemp = async (): Promise<void> => {\n    await clearDir(APP_TEMP_PATH);\n  };\n\n  public clearCache = async (): Promise<void> => {\n    const sessions = [session.defaultSession, session.fromPartition('persist:webview')];\n\n    await Promise.all(\n      sessions.map(async (session) => {\n        await session.clearCache();\n        await session.clearStorageData({\n          storages: [\n            'indexdb',\n            'localstorage',\n            'cookies',\n            'filesystem',\n            'shadercache',\n            'websql',\n            'serviceworkers',\n            'cachestorage',\n          ],\n        });\n      }),\n    );\n  };\n\n  public clearTempCache = async (): Promise<void> => {\n    await this.clearCache();\n    await this.clearTemp();\n  };\n\n  public selectFileDialog = async (options?: OpenDialogOptions): Promise<string[]> => {\n    const defaultOptions: OpenDialogOptions = {\n      properties: ['openFile', 'showHiddenFiles'],\n      filters: [{ name: 'All Files', extensions: ['*'] }],\n    };\n\n    const dialogOptions: OpenDialogOptions = merge(defaultOptions, options || {});\n\n    const result: OpenDialogReturnValue = await dialog.showOpenDialog(dialogOptions);\n\n    if (result.canceled || !result.filePaths.length) {\n      return [];\n    }\n\n    return result.filePaths;\n  };\n\n  public selectFolderDialog = async (options?: OpenDialogOptions): Promise<string[]> => {\n    const defaultOptions: OpenDialogOptions = {\n      properties: ['openDirectory', 'showHiddenFiles'],\n    };\n\n    const dialogOptions: OpenDialogOptions = merge(defaultOptions, options || {});\n\n    const result: OpenDialogReturnValue = await dialog.showOpenDialog(dialogOptions);\n\n    if (result.canceled || !result.filePaths.length) {\n      return [];\n    }\n\n    return result.filePaths;\n  };\n\n  public saveFileDialog = async (options?: SaveDialogOptions): Promise<string> => {\n    const defaultOptions: SaveDialogOptions = {\n      properties: ['createDirectory', 'showHiddenFiles'],\n    };\n\n    const dialogOptions: SaveDialogOptions = merge(defaultOptions, options || {});\n\n    const result: SaveDialogReturnValue = await dialog.showSaveDialog(dialogOptions);\n\n    if (result.canceled || !result.filePath) {\n      return '';\n    }\n\n    return result.filePath;\n  };\n\n  public selectFileRead = async (\n    options?: OpenDialogOptions,\n  ): Promise<{ path: string | null; content: string | null }> => {\n    try {\n      const paths = await this.selectFileDialog(options || {});\n      if (!paths.length) return { path: null, content: null };\n\n      const path = paths[0];\n      const content = await readFile(path);\n      return { path, content };\n    } catch (error) {\n      logger.error('An error occurred opening the file with read:', error as Error);\n      return { path: null, content: null };\n    }\n  };\n\n  public selectFolderWrite = async (\n    content: string | Buffer,\n    options?: SaveDialogOptions,\n  ): Promise<{ path: string | null; status: boolean }> => {\n    try {\n      const path = await this.saveFileDialog(options || {});\n      if (!path) return { path: null, status: false };\n\n      const status = await saveFile(path, content);\n      return { path, status };\n    } catch (error) {\n      logger.error('An error occurred opening the file with write:', error as Error);\n      return { path: null, status: false };\n    }\n  };\n\n  public openPath = async (path: string): Promise<void> => {\n    shell.openPath(path).catch((error) => logger.error('Failed to open file:', error));\n  };\n}\n\nexport const fileStorage = FileStorage.getInstance();\n"
  },
  {
    "path": "src/main/services/LoggerService.ts",
    "content": "import os from 'node:os';\nimport path from 'node:path';\nimport { isMainThread } from 'node:worker_threads';\n\nimport { APP_LOG_PATH } from '@main/utils/path';\nimport { isDev } from '@main/utils/systeminfo';\nimport { APP_VERSION } from '@shared/config/appinfo';\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport type { LogContextData, LogLevel, LogSourceWithContext } from '@shared/config/logger';\nimport { ANSICOLORS, LEVEL, LEVEL_MAP } from '@shared/config/logger';\nimport { ipcMain } from 'electron';\nimport winston from 'winston';\nimport DailyRotateFile from 'winston-daily-rotate-file';\n\n/**\n * Apply ANSI color to text\n * @param text - The text to colorize\n * @param color - The color key from ANSICOLORS\n * @returns Colorized text\n */\nfunction colorText(text: string, color: string) {\n  return ANSICOLORS[color] + text + ANSICOLORS.END;\n}\n\nconst SYSTEM_INFO = {\n  os: `${os.platform()}-${os.arch()} / ${os.version()}`,\n  hw: `${os.cpus()[0]?.model || 'Unknown CPU'} / ${(os.totalmem() / 1024 / 1024 / 1024).toFixed(2)}GB`,\n};\n\nconst DEFAULT_LEVEL = LEVEL.SILLY;\n// const DEFAULT_LEVEL = isDev ? LEVEL.SILLY : LEVEL.DEBUG;\n\n/**\n * IMPORTANT: How to use LoggerService\n * please refer to\n *   English: `docs/technical/how-to-use-logger-en.md`\n *   Chinese: `docs/technical/how-to-use-logger-zh.md`\n */\nclass LoggerService {\n  private static instance: LoggerService;\n  private logger: winston.Logger;\n\n  // env variables, only used in dev mode\n  private envLevel: LogLevel = LEVEL.NONE;\n  private envShowModules: string[] = [];\n\n  private logsDir: string = '';\n\n  private module: string = '';\n  private context: Record<string, any> = {};\n\n  private constructor() {\n    if (!isMainThread) {\n      throw new Error('[LoggerService] NOT support worker thread yet, can only be instantiated in main process.');\n    }\n\n    // Create logs directory path\n    this.logsDir = APP_LOG_PATH;\n\n    // env variables, only used in dev mode\n    // only affect console output, not affect file output\n    if (isDev) {\n      // load env level if exists\n      if (\n        process.env.CSLOGGER_MAIN_LEVEL &&\n        Object.values(LEVEL).includes(process.env.CSLOGGER_MAIN_LEVEL as LogLevel)\n      ) {\n        this.envLevel = process.env.CSLOGGER_MAIN_LEVEL as LogLevel;\n\n        console.log(colorText(`[LoggerService] env CSLOGGER_MAIN_LEVEL loaded: ${this.envLevel}`, 'BLUE'));\n      }\n\n      // load env show module if exists\n      if (process.env.CSLOGGER_MAIN_SHOW_MODULES) {\n        const showModules = process.env.CSLOGGER_MAIN_SHOW_MODULES.split(',')\n          .map((module) => module.trim())\n          .filter((module) => module !== '');\n        if (showModules.length > 0) {\n          this.envShowModules = showModules;\n\n          console.log(\n            colorText(\n              `[LoggerService] env CSLOGGER_MAIN_SHOW_MODULES loaded: ${this.envShowModules.join(' ')}`,\n              'BLUE',\n            ),\n          );\n        }\n      }\n    }\n\n    // Configure transports based on environment\n    const transports: winston.transport[] = [];\n\n    // Daily rotate file transport for general logs\n    transports.push(\n      new DailyRotateFile({\n        filename: path.join(this.logsDir, 'app.%DATE%.log'),\n        datePattern: 'YYYY-MM-DD',\n        // maxSize: '10m',\n        maxFiles: '30d',\n      }),\n    );\n\n    // Daily rotate file transport for error logs\n    transports.push(\n      new DailyRotateFile({\n        level: 'warn',\n        filename: path.join(this.logsDir, 'app-error.%DATE%.log'),\n        datePattern: 'YYYY-MM-DD',\n        // maxSize: '10m',\n        maxFiles: '60d',\n      }),\n    );\n\n    // Configure Winston logger\n    this.logger = winston.createLogger({\n      // Development: all levels, Production: info and above\n      level: DEFAULT_LEVEL,\n      format: winston.format.combine(\n        winston.format.timestamp({\n          format: 'YYYY-MM-DD HH:mm:ss',\n        }),\n        winston.format.errors({ stack: true }),\n        winston.format.json(),\n      ),\n      exitOnError: false,\n      transports,\n    });\n\n    // Handle transport events\n    this.logger.on('error', (error) => {\n      console.error('LoggerService fatal error:', error);\n    });\n\n    // register ipc handler, for renderer process to log to main process\n    this.registerIpcHandler();\n  }\n\n  /**\n   * Get the singleton instance of LoggerService\n   */\n  public static getInstance(): LoggerService {\n    if (!LoggerService.instance) {\n      LoggerService.instance = new LoggerService();\n    }\n    return LoggerService.instance;\n  }\n\n  /**\n   * Create a new logger with module name and additional context\n   * @param module - The module name for logging\n   * @param context - Additional context data\n   * @returns A new logger instance with the specified context\n   */\n  public withContext(module: string, context?: Record<string, any>): LoggerService {\n    const newLogger = Object.create(this);\n\n    // Copy all properties from the base logger\n    newLogger.logger = this.logger;\n    newLogger.module = module;\n    newLogger.context = { ...this.context, ...context };\n\n    return newLogger;\n  }\n\n  /**\n   * Finish logging and close all transports\n   */\n  public finish() {\n    this.logger.end();\n  }\n\n  /**\n   * Process and output log messages with source information\n   * @param source - The log source with context\n   * @param level - The log level\n   * @param message - The log message\n   * @param meta - Additional metadata to log\n   */\n  private processLog(source: LogSourceWithContext, level: LogLevel, message: any, meta: any[]): void {\n    if (isDev) {\n      // skip if env level is set and current level is less than env level\n      if (this.envLevel !== LEVEL.NONE && LEVEL_MAP[level] < LEVEL_MAP[this.envLevel]) {\n        return;\n      }\n      // skip if env show modules is set and current module is not in the list\n      if (this.module && this.envShowModules.length > 0 && !this.envShowModules.includes(this.module)) {\n        return;\n      }\n\n      const datetimeColored = colorText(\n        new Date().toLocaleString('zh-CN', {\n          hour: '2-digit',\n          minute: '2-digit',\n          second: '2-digit',\n          fractionalSecondDigits: 3,\n          hour12: false,\n        }),\n        'CYAN',\n      );\n\n      let moduleString = '';\n      if (source.process === 'main') {\n        moduleString = this.module ? ` [${colorText(this.module, 'UNDERLINE')}] ` : ' ';\n      } else {\n        moduleString = ` [${colorText(source.window || '', 'UNDERLINE')}::${colorText(source.module || '', 'UNDERLINE')}] `;\n      }\n\n      switch (level) {\n        case LEVEL.ERROR:\n          console.error(\n            `${datetimeColored} ${colorText(colorText('<ERROR>', 'RED'), 'BOLD')}${moduleString}${message}`,\n            ...meta,\n          );\n          break;\n        case LEVEL.WARN:\n          console.warn(\n            `${datetimeColored} ${colorText(colorText('<WARN>', 'YELLOW'), 'BOLD')}${moduleString}${message}`,\n            ...meta,\n          );\n          break;\n        case LEVEL.INFO:\n          console.info(\n            `${datetimeColored} ${colorText(colorText('<INFO>', 'GREEN'), 'BOLD')}${moduleString}${message}`,\n            ...meta,\n          );\n          break;\n        case LEVEL.DEBUG:\n          console.debug(\n            `${datetimeColored} ${colorText(colorText('<DEBUG>', 'BLUE'), 'BOLD')}${moduleString}${message}`,\n            ...meta,\n          );\n          break;\n        case LEVEL.VERBOSE:\n          console.log(`${datetimeColored} ${colorText('<VERBOSE>', 'BOLD')}${moduleString}${message}`, ...meta);\n          break;\n        case LEVEL.SILLY:\n          console.log(`${datetimeColored} ${colorText('<SILLY>', 'BOLD')}${moduleString}${message}`, ...meta);\n          break;\n      }\n    }\n\n    // add source information to meta\n    // renderer process has its own module and context, do not use this.module and this.context\n    const sourceWithContext: LogSourceWithContext = source;\n    if (source.process === 'main') {\n      sourceWithContext.module = this.module;\n      if (Object.keys(this.context).length > 0) {\n        sourceWithContext.context = this.context;\n      }\n    }\n    meta.push(sourceWithContext);\n\n    // add extra system information for error and warn levels\n    if (level === LEVEL.ERROR || level === LEVEL.WARN) {\n      const extra = {\n        sys: SYSTEM_INFO,\n        appver: APP_VERSION,\n      };\n\n      meta.push(extra);\n    }\n\n    this.logger.log(level, message, ...meta);\n  }\n\n  /**\n   * Log error message\n   */\n  public error(message: any, ...data: LogContextData): void {\n    this.processMainLog(LEVEL.ERROR, message, data);\n  }\n\n  /**\n   * Log warning message\n   */\n  public warn(message: any, ...data: LogContextData): void {\n    this.processMainLog(LEVEL.WARN, message, data);\n  }\n\n  /**\n   * Log info message\n   */\n  public info(message: any, ...data: LogContextData): void {\n    this.processMainLog(LEVEL.INFO, message, data);\n  }\n\n  /**\n   * Log verbose message\n   */\n  public verbose(message: any, ...data: LogContextData): void {\n    this.processMainLog(LEVEL.VERBOSE, message, data);\n  }\n\n  /**\n   * Log debug message\n   */\n  public debug(message: any, ...data: LogContextData): void {\n    this.processMainLog(LEVEL.DEBUG, message, data);\n  }\n\n  /**\n   * Log silly level message\n   */\n  public silly(message: any, ...data: LogContextData): void {\n    this.processMainLog(LEVEL.SILLY, message, data);\n  }\n\n  /**\n   * Process log messages from main process\n   * @param level - The log level\n   * @param message - The log message\n   * @param data - Additional data to log\n   */\n  private processMainLog(level: LogLevel, message: any, data: any[]): void {\n    this.processLog({ process: 'main' }, level, message, data);\n  }\n\n  /**\n   * Process log messages from renderer process (bound to preserve context)\n   * @param source - The log source with context\n   * @param level - The log level\n   * @param message - The log message\n   * @param data - Additional data to log\n   */\n  private processRendererLog = (source: LogSourceWithContext, level: LogLevel, message: any, data: any[]): void => {\n    this.processLog(source, level, message, data);\n  };\n\n  /**\n   * Set the minimum log level\n   * @param level - The log level to set\n   */\n  public setLevel(level: LogLevel): void {\n    this.logger.level = level;\n  }\n\n  /**\n   * Get the current log level\n   * @returns The current log level\n   */\n  public getLevel(): LogLevel {\n    return this.logger.level as LogLevel;\n  }\n\n  /**\n   * Reset log level to environment default\n   */\n  public resetLevel(): void {\n    this.setLevel(DEFAULT_LEVEL);\n  }\n\n  /**\n   * Get the underlying Winston logger instance\n   * @returns The Winston logger instance\n   */\n  public getBaseLogger(): winston.Logger {\n    return this.logger;\n  }\n\n  /**\n   * Get the logs directory path\n   * @returns The logs directory path\n   */\n  public getLogsDir(): string {\n    return this.logsDir;\n  }\n\n  /**\n   * Register IPC handler for renderer process logging\n   */\n  private registerIpcHandler(): void {\n    ipcMain.handle(\n      IPC_CHANNEL.APP_LOG_TO_MAIN,\n      (_, source: LogSourceWithContext, level: LogLevel, message: any, data: any[]) => {\n        this.processRendererLog(source, level, message, data);\n      },\n    );\n  }\n}\n\nexport const loggerService = LoggerService.getInstance();\n"
  },
  {
    "path": "src/main/services/MenuService.ts",
    "content": "import { t } from '@main/services/AppLocale';\nimport { dbService } from '@main/services/DbService';\nimport { windowService } from '@main/services/WindowService';\nimport { isMacOS } from '@main/utils/systeminfo';\nimport { APP_NAME } from '@shared/config/appinfo';\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { WINDOW_NAME } from '@shared/config/window';\nimport { isNil } from '@shared/modules/validate';\nimport type { BrowserWindow, MenuItem, MenuItemConstructorOptions } from 'electron';\nimport { Menu } from 'electron';\n\nclass MenuService {\n  private static instance: MenuService;\n  private contextMenu: Menu | null = null;\n\n  constructor() {}\n\n  public static getInstance(): MenuService {\n    if (!MenuService.instance) {\n      MenuService.instance = new MenuService();\n    }\n    return MenuService.instance;\n  }\n\n  private createMenu() {\n    this.destroyMenu();\n\n    this.updateContextMenu();\n\n    if (!isMacOS) {\n      return;\n    }\n\n    Menu.setApplicationMenu(this.contextMenu);\n  }\n\n  private updateContextMenu() {\n    const template = [\n      {\n        label: APP_NAME,\n        role: 'appMenu',\n        submenu: [\n          { label: t('system.app.about', { name: APP_NAME }), role: 'about', visible: !!isMacOS },\n          { type: 'separator' },\n          { label: t('system.app.hide'), role: 'hide' },\n          { label: t('system.app.hideOthers'), role: 'hideOthers' },\n          { label: t('system.app.showAll'), role: 'showAll' },\n          { type: 'separator' },\n          { label: t('system.app.quit', { name: APP_NAME }), role: 'quit' },\n        ],\n      },\n      {\n        label: t('system.file.title'),\n        role: 'fileMenu',\n        submenu: [{ label: t('system.file.closeWindow'), role: 'close' }],\n      },\n      {\n        label: t('system.edit.title'),\n        role: 'editMenu',\n        submenu: [\n          { label: t('system.edit.undo'), role: 'undo' },\n          { label: t('system.edit.redo'), role: 'redo' },\n          { type: 'separator' },\n          { label: t('system.edit.cut'), role: 'cut' },\n          { label: t('system.edit.copy'), role: 'copy' },\n          { label: t('system.edit.paste'), role: 'paste' },\n          { label: t('system.edit.delete'), role: 'delete' },\n          { label: t('system.edit.selectAll'), role: 'selectAll' },\n        ],\n      },\n      {\n        label: t('system.view.title'),\n        role: 'viewMenu',\n        submenu: [\n          { label: t('system.view.reload'), role: 'reload' },\n          { label: t('system.view.forceReload'), role: 'forceReload' },\n          { label: t('system.view.toggleDevTools'), role: 'toggleDevTools' },\n          { type: 'separator' },\n          {\n            label: t('system.view.actualSize'),\n            // role: 'resetZoom',\n            accelerator: 'CmdOrCtrl+0',\n            click: async () => {\n              windowService.setZoomWindows(1);\n              await dbService.setting.update({ key: 'zoom', value: 1 });\n\n              const mainWindow = windowService.getWindow(WINDOW_NAME.MAIN);\n              if (!isNil(mainWindow)) mainWindow.webContents.send(IPC_CHANNEL.ZOOM_UPDATED, 1);\n            },\n          },\n          {\n            label: t('system.view.zoomIn'),\n            // role: 'zoomIn',\n            accelerator: 'CmdOrCtrl+=',\n            click: async (_menuItem: MenuItem, window: BrowserWindow) => {\n              const currentZoom = window.webContents.getZoomFactor();\n              const zoom = currentZoom + 0.2;\n              if (zoom < 0.8 || zoom > 1.8) return;\n\n              windowService.setZoomWindows(zoom);\n              await dbService.setting.update({ key: 'zoom', value: zoom });\n\n              const mainWindow = windowService.getWindow(WINDOW_NAME.MAIN);\n              if (!isNil(mainWindow)) mainWindow.webContents.send(IPC_CHANNEL.ZOOM_UPDATED, zoom);\n            },\n          },\n          {\n            label: t('system.view.zoomOut'),\n            // role: 'zoomOut',\n            accelerator: 'CmdOrCtrl+-',\n            click: async (_menuItem: MenuItem, window: BrowserWindow) => {\n              const currentZoom = window.webContents.getZoomFactor();\n              const zoom = currentZoom - 0.2;\n              if (zoom < 0.8 || zoom > 1.8) return;\n\n              windowService.setZoomWindows(zoom);\n              await dbService.setting.update({ key: 'zoom', value: zoom });\n\n              const mainWindow = windowService.getWindow(WINDOW_NAME.MAIN);\n              if (!isNil(mainWindow)) mainWindow.webContents.send(IPC_CHANNEL.ZOOM_UPDATED, zoom);\n            },\n          },\n          { type: 'separator' },\n          { label: t('system.view.toggleFullScreen'), role: 'togglefullscreen' },\n        ],\n      },\n      {\n        label: t('system.window.title'),\n        role: 'windowMenu',\n        submenu: [\n          { label: t('system.window.minimize'), role: 'minimize' },\n          { label: t('system.window.zoom'), role: 'zoom' },\n          // { label: t('system.window.fill'), role: 'front' },\n          // { label: t('system.window.center'), role: 'center' },\n        ],\n      },\n    ].filter(Boolean) as MenuItemConstructorOptions[];\n\n    this.contextMenu = Menu.buildFromTemplate(template);\n  }\n\n  public updateMenu(showMenu: boolean = false) {\n    if (showMenu) {\n      this.createMenu();\n    } else {\n      this.destroyMenu();\n    }\n  }\n\n  private destroyMenu() {\n    if (this.contextMenu) {\n      Menu.setApplicationMenu(null);\n      this.contextMenu = null;\n    }\n  }\n}\n\nexport const menuService = MenuService.getInstance();\n"
  },
  {
    "path": "src/main/services/NotificationService.ts",
    "content": "import type { INotification } from '@shared/config/notification';\nimport type { BrowserWindow } from 'electron';\nimport { Notification as ElectronNotification } from 'electron';\n\nclass NotificationService {\n  private window: BrowserWindow;\n\n  constructor(window: BrowserWindow) {\n    // Initialize the service\n    this.window = window;\n  }\n\n  public async sendNotification(notification: INotification) {\n    console.log('Sending notification:', notification);\n    // Electron Notification API\n    const electronNotification = new ElectronNotification({\n      title: notification.title,\n      body: notification.message,\n    });\n\n    electronNotification.on('click', () => {\n      this.window.show();\n      this.window.webContents.send('notification-click', notification);\n    });\n\n    electronNotification.show();\n  }\n}\n\nexport default NotificationService;\n"
  },
  {
    "path": "src/main/services/PluginService.ts",
    "content": "import os from 'node:os';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nimport { loggerService } from '@logger';\nimport { appLocale } from '@main/services/AppLocale';\nimport { dbService } from '@main/services/DbService';\nimport { fileDelete, fileState, pathExist, readFile, readJson } from '@main/utils/file';\nimport { APP_PLUGIN_PATH } from '@main/utils/path';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport { isArrayEmpty, isJson, isNil, isObjectEmpty } from '@shared/modules/validate';\nimport type { IModels } from '@shared/types/db';\nimport npminstall from 'npminstall';\nimport workerpool from 'workerpool';\n\nexport interface IPluginOptions {\n  registry: string;\n}\n\nexport enum IPluginType {\n  UI = 1,\n  SYSTEM = 2,\n  MIX = 3,\n}\n\nexport interface IPluginInfo {\n  type: `${IPluginType}`;\n  name: string;\n  pluginName: string;\n  author: string;\n  description: string;\n  readme: string;\n  main: string;\n  web: string;\n  base: string;\n  version: string;\n  logo: string;\n  homepage: string;\n  status: boolean;\n}\n\nexport interface IRawModuleExports {\n  start: () => Promise<boolean>;\n  stop: () => Promise<boolean>;\n  default: {\n    start: () => Promise<boolean>;\n    stop: () => Promise<boolean>;\n  };\n}\n\nexport interface IModuleExports {\n  start: () => Promise<boolean>;\n  stop: () => Promise<boolean>;\n}\n\nconst logger = loggerService.withContext(LOG_MODULE.PLUGIN);\n\nconst manageModule = async (entryBasePath: string, modulePath: string, method: 'stop' | 'start'): Promise<boolean> => {\n  const workerpool = await import('workerpool');\n\n  ['log', 'info', 'warn', 'error', 'debug'].forEach((method) => {\n    const level = method === 'log' ? 'verbose' : method;\n    console[method] = (...msgRaw: any[]) => {\n      const msg = {\n        type: msgRaw.length > 1 ? 'multiple' : 'single',\n        msg: msgRaw,\n      };\n\n      workerpool.workerEmit({ type: 'log', level, msg });\n    };\n  });\n\n  const convertValToBool = (value: any): boolean => {\n    if (typeof value === 'boolean') return value;\n    if (typeof value === 'number') return value >= 0;\n    if (typeof value === 'string') {\n      if (['true', 'ok', 'success'].includes(value.toLowerCase())) return true;\n      if (['false', 'fail', 'error'].includes(value.toLowerCase())) return false;\n      return false;\n    }\n    if (value instanceof Error) return false;\n    return false;\n  };\n\n  const hasLifecycle = (obj: unknown, method: 'start' | 'stop'): obj is Record<typeof method, () => unknown> => {\n    return typeof obj === 'object' && obj !== null && typeof (obj as any)[method] === 'function';\n  };\n\n  try {\n    process.chdir(entryBasePath);\n\n    let rawMod: Partial<IRawModuleExports> | undefined;\n    if (method === 'start') {\n      rawMod = await import(modulePath);\n      globalThis.entryModule = rawMod;\n    } else if (method === 'stop') {\n      rawMod = globalThis.entryModule;\n    }\n\n    if (!rawMod) {\n      console.warn(`Module not found`);\n      return false;\n    }\n\n    const cand1 = rawMod?.default ?? undefined;\n    const cand2 = (() => {\n      const { default: _default, ...rest } = rawMod;\n      return Object.keys(rest).length > 0 ? rest : undefined;\n    })();\n\n    let mod: Partial<IModuleExports> = {};\n    if (hasLifecycle(cand1, method)) mod = cand1;\n    if (hasLifecycle(cand2, method)) mod = cand2;\n\n    if (mod && typeof mod === 'object' && Object.keys(mod).length === 0) {\n      console.warn(`Module not implement ${method} method`);\n      return false;\n    }\n\n    const fn = mod?.[method];\n    if (typeof fn === 'function') {\n      const resp = await fn();\n      return convertValToBool(resp);\n    }\n\n    return false;\n  } catch (error) {\n    console.error(`Module execution failed for ${method}`, (error as Error).message);\n    return false;\n  }\n};\n\nclass PluginService {\n  private static instance: PluginService;\n  private baseDir: string = APP_PLUGIN_PATH;\n  private syncModules = new Map<string, workerpool.Pool>();\n  private readonly registry: string;\n  private readonly maxWorkers: number;\n\n  constructor(options?: Partial<IPluginOptions>) {\n    this.registry =\n      options?.registry ?? (appLocale.isCHS() ? 'https://registry.npmmirror.com/' : 'https://registry.npmjs.org/');\n    this.maxWorkers = Math.max(1, os.cpus().length - 1);\n  }\n\n  public static getInstance(): PluginService {\n    if (!PluginService.instance) {\n      PluginService.instance = new PluginService();\n    }\n    return PluginService.instance;\n  }\n\n  public async autoLaunch(): Promise<void> {\n    try {\n      const plugins = await dbService.plugin.all();\n      const runningPlugins = plugins.filter((p) => p.isActive);\n\n      if (isArrayEmpty(runningPlugins)) return;\n\n      const runningPluginIds = runningPlugins.map((p) => p.id);\n      const runningPluginNames = runningPlugins.map((p) => p.pluginName);\n\n      await this.start(runningPluginIds);\n\n      logger.info(`Launched plugins: ${runningPluginNames.join(', ')}`);\n    } catch (error) {\n      logger.error('Restart plugins failed', error as Error);\n    }\n  }\n\n  public async clean(): Promise<void> {\n    try {\n      const poolKeys = this.syncModules.keys();\n      for (const key of poolKeys) {\n        const pool = this.syncModules.get(key);\n        if (pool) {\n          pool.terminate();\n          this.syncModules.delete(key);\n        }\n      }\n      this.syncModules.clear();\n    } catch (error) {\n      logger.error('Clean plugin pool failed', error as Error);\n    }\n  }\n\n  /**\n   * Install plugin\n   */\n  public async install(projects: string[]): Promise<IModels['plugin'][]> {\n    const plugins: string[] = [];\n\n    for (const plugin of projects) {\n      try {\n        const pluginBasePath = join(this.baseDir, plugin);\n        if (!(await pathExist(pluginBasePath)) || (await fileState(pluginBasePath)) !== 'dir') {\n          logger.warn(`Not found plugin working directory`);\n          continue;\n        }\n\n        const pkgPath = join(pluginBasePath, 'package.json');\n        if (!(await pathExist(pkgPath)) || (await fileState(pkgPath)) !== 'file') {\n          logger.warn(`Not found package.json`);\n          continue;\n        }\n\n        const pkgInfo = await readJson(pkgPath);\n        if (isNil(pkgInfo) || isObjectEmpty(pkgInfo)) {\n          logger.warn(`Not compliant documents in package.json`);\n          continue;\n        }\n\n        const dbInfo = (await dbService.plugin.getByField({ base: pluginBasePath }))?.[0] || {};\n\n        // meta\n        const type = pkgInfo?.pluginType ?? 'system';\n        const readmePath = join(pluginBasePath, 'README.md');\n        const readme = (await pathExist(readmePath)) ? await readFile(readmePath) : '### Empty';\n        const main =\n          type !== 'ui' && pkgInfo?.main ? pathToFileURL(resolve(pluginBasePath, pkgInfo.main)).toString() : '';\n        const web =\n          type !== 'system' && pkgInfo?.web ? pathToFileURL(resolve(pluginBasePath, pkgInfo.web)).toString() : '';\n        if (!main && !web) continue;\n\n        const data = {\n          name: pkgInfo?.name || plugin,\n          pluginName: pkgInfo?.pluginName || pkgInfo?.name || plugin,\n          type: type === 'ui' ? 1 : type === 'system' ? 2 : 3,\n          description: pkgInfo?.description ?? '',\n          readme,\n          base: pluginBasePath,\n          main,\n          web,\n          version: pkgInfo?.version ?? '0.0.0',\n          author: pkgInfo?.author ?? '',\n          homepage: pkgInfo?.homepage ?? '',\n          logo: pkgInfo?.logo ?? '',\n          isActive: false,\n        } as IModels['plugin'];\n\n        const pluginNodeModulesPath = join(pluginBasePath, 'node_modules');\n        await fileDelete(pluginNodeModulesPath);\n        const pluginPkgLockPath = join(pluginBasePath, 'package-lock.json');\n        await fileDelete(pluginPkgLockPath);\n\n        await npminstall({ root: pluginBasePath, registry: this.registry, ignoreScripts: false });\n\n        if (pluginBasePath === dbInfo?.base) {\n          await dbService.plugin.update([dbInfo.id], data);\n          plugins.push(dbInfo.id);\n        } else {\n          const newPlugin = await dbService.plugin.add(data);\n          plugins.push(newPlugin?.[0]?.id);\n        }\n      } catch (error) {\n        logger.error('Plugin install error', error as Error);\n      }\n    }\n\n    return await dbService.plugin.getByField({ id: plugins });\n  }\n\n  /**\n   * Uninstall plugin\n   */\n  public async uninstall(plugins: string[]): Promise<IModels['plugin'][]> {\n    for (const plugin of plugins) {\n      try {\n        const pluginInfo = await dbService.plugin.get(plugin);\n        if (isNil(pluginInfo) || isObjectEmpty(pluginInfo)) {\n          logger.warn(`Not found plugin in database`);\n          await dbService.plugin.remove([plugin]);\n          continue;\n        }\n\n        const pluginBasePath = pluginInfo.base;\n        if (!(await pathExist(pluginBasePath)) || (await fileState(pluginBasePath)) !== 'dir') {\n          logger.warn(`Not found plugin working directory`);\n          await dbService.plugin.remove([plugin]);\n          continue;\n        }\n\n        await this.stop([plugin]);\n\n        const pluginNodeModulesPath = join(pluginBasePath, 'node_modules');\n        await fileDelete(pluginNodeModulesPath);\n        const pluginPkgLockPath = join(pluginBasePath, 'package-lock.json');\n        await fileDelete(pluginPkgLockPath);\n\n        await dbService.plugin.remove([plugin]);\n      } catch (error) {\n        logger.error('Plugin uninstall error', error as Error);\n      }\n    }\n\n    return await dbService.plugin.getByField({ id: plugins });\n  }\n\n  /**\n   * Start plugin\n   */\n  public async start(plugins: string[]): Promise<IModels['plugin'][]> {\n    for (const plugin of plugins) {\n      try {\n        const pluginInfo = await dbService.plugin.get(plugin);\n        if (isNil(pluginInfo) || isObjectEmpty(pluginInfo)) {\n          logger.warn(`Not found plugin in database`);\n          continue;\n        }\n\n        const pluginBasePath = pluginInfo.base;\n        if (!(await pathExist(pluginBasePath)) || (await fileState(pluginBasePath)) !== 'dir') {\n          logger.warn(`Not found plugin working directory`);\n          await dbService.plugin.remove([plugin]);\n          continue;\n        }\n\n        if (pluginInfo.type !== IPluginType.SYSTEM) continue;\n        // if (pluginInfo.isActive) return true;\n\n        if (pluginInfo.main?.endsWith('.js')) {\n          const poolKey = pluginInfo.name!;\n          let pool = this.syncModules.get(poolKey);\n          if (pool) continue;\n\n          const entryBasePath = fileURLToPath(dirname(pluginInfo.main));\n\n          pool = workerpool.pool({\n            maxWorkers: this.maxWorkers,\n            workerType: 'process',\n            forkOpts: {\n              cwd: entryBasePath,\n            },\n          });\n\n          this.syncModules.set(poolKey, pool);\n\n          let status = false;\n          try {\n            // pool.\n            const resp = await pool.exec(manageModule, [entryBasePath, pluginInfo.main, 'start'], {\n              on(payload) {\n                const { type, level, msg } = payload;\n\n                if (type === 'log') {\n                  const msgType = msg?.type;\n                  const msgList = msg?.msg ?? [];\n\n                  const log =\n                    msgType === 'single'\n                      ? msgList[0]\n                      : msgList.map((t: any) => (isJson(t) ? JSON.stringify(t) : t)).join(' ');\n\n                  const logger = loggerService.withContext(`${LOG_MODULE.PLUGIN}<${pluginInfo.pluginName}>`);\n                  logger[level](log);\n                }\n              },\n            });\n            status = resp;\n          } catch (error) {\n            logger.error(`Plugin ${plugin} startup error:`, error as Error);\n          } finally {\n            if (!status) {\n              await pool.terminate();\n              this.syncModules.delete(poolKey);\n            }\n            await dbService.plugin.update([pluginInfo.id], { isActive: status } as IModels['plugin']);\n          }\n        }\n      } catch (error) {\n        logger.error('plugin start error', error as Error);\n      }\n    }\n\n    return await dbService.plugin.getByField({ id: plugins });\n  }\n\n  /**\n   * Stop plugin\n   */\n  public async stop(plugins: string[]): Promise<IModels['plugin'][]> {\n    for (const plugin of plugins) {\n      try {\n        const pluginInfo = await dbService.plugin.get(plugin);\n        if (isNil(pluginInfo) || isObjectEmpty(pluginInfo)) {\n          logger.warn(`Not found plugin in database`);\n          continue;\n        }\n\n        const pluginBasePath = pluginInfo.base;\n        if (!(await pathExist(pluginBasePath)) || (await fileState(pluginBasePath)) !== 'dir') {\n          logger.warn(`Not found plugin working directory`);\n          await dbService.plugin.remove([plugin]);\n          continue;\n        }\n\n        if (pluginInfo.type !== IPluginType.SYSTEM) continue;\n        // if (!pluginInfo.isActive) continue;\n\n        if (pluginInfo.main?.endsWith('.js')) {\n          const poolKey = pluginInfo.name!;\n          const pool = this.syncModules.get(poolKey);\n          if (!pool) continue;\n\n          try {\n            const entryBasePath = fileURLToPath(dirname(pluginInfo.main));\n            await pool.exec(manageModule, [entryBasePath, pluginInfo.main, 'stop'], {\n              on(payload) {\n                const { type, level, msg } = payload;\n\n                if (type === 'log') {\n                  const msgType = msg?.type;\n                  const msgList = msg?.msg ?? [];\n\n                  const log =\n                    msgType === 'single'\n                      ? msgList[0]\n                      : msgList.map((t: any) => (isJson(t) ? JSON.stringify(t) : t)).join(' ');\n\n                  const logger = loggerService.withContext(`${LOG_MODULE.PLUGIN}<${pluginInfo.pluginName}>`);\n                  logger[level](log);\n                }\n              },\n            });\n          } catch (error) {\n            logger.warn(`Plugin ${plugin} stop error:`, error as Error);\n          } finally {\n            await pool.terminate();\n            this.syncModules.delete(poolKey);\n            await dbService.plugin.update([pluginInfo.id], { isActive: false } as IModels['plugin']);\n          }\n        }\n      } catch (error) {\n        logger.error('plugin stop error', error as Error);\n      }\n    }\n\n    return await dbService.plugin.getByField({ id: plugins });\n  }\n}\n\nexport const pluginService = PluginService.getInstance();\n"
  },
  {
    "path": "src/main/services/ProtocolClient.ts",
    "content": "import { join } from 'node:path';\n\nimport { loggerService } from '@logger';\nimport { createDir, saveFile } from '@main/utils/file';\nimport { APP_EXE_PATH, APP_HOME_PATH } from '@main/utils/path';\nimport { execAsync } from '@main/utils/shell';\nimport { isLinux } from '@main/utils/systeminfo';\nimport { APP_NAME, APP_NAME_ALIAS } from '@shared/config/appinfo';\nimport { LOG_MODULE } from '@shared/config/logger';\n\nimport { windowService } from './WindowService';\n\nconst logger = loggerService.withContext(LOG_MODULE.APP_PROTOCOL);\n\nexport function registerProtocolClient(app: Electron.App) {\n  if (process.defaultApp) {\n    if (process.argv.length >= 2) {\n      app.setAsDefaultProtocolClient(APP_NAME_ALIAS, process.execPath, [process.argv[1]]);\n    }\n  }\n\n  app.setAsDefaultProtocolClient(APP_NAME_ALIAS);\n}\n\nexport function handleProtocolUrl(url: string) {\n  // if (!url) return;\n  // Process the URL that was used to open the app\n  // The url will be in the format: zy://data?param1=value1&param2=value2\n\n  // Parse the URL and extract parameters\n  const urlObj = new URL(url);\n  const params = new URLSearchParams(urlObj.search);\n\n  // switch (urlObj.hostname.toLowerCase()) {\n  //   case 'data':\n  //     return;\n  // }\n\n  // You can send the data to your renderer process\n  const mainWindow = windowService.getWindow('main');\n\n  if (mainWindow && !mainWindow.isDestroyed()) {\n    mainWindow.webContents.send('protocol-data', {\n      url,\n      params: Object.fromEntries(params.entries()),\n    });\n  }\n}\n\n/**\n * Sets up deep linking for the AppImage build on Linux by creating a .desktop file.\n * This allows the OS to open zy:// URLs with this App.\n */\nexport async function setupAppImageDeepLink(): Promise<void> {\n  // Only run on Linux and when packaged as an AppImage\n  if (!isLinux || !process.env.APPIMAGE) {\n    return;\n  }\n\n  logger.debug('AppImage environment detected on Linux, setting up deep link.');\n\n  try {\n    const appPath = APP_EXE_PATH;\n    if (!appPath) {\n      logger.error('Could not determine App path.');\n      return;\n    }\n\n    const homeDir = APP_HOME_PATH;\n    const applicationsDir = join(homeDir, '.local', 'share', 'applications');\n    const desktopFilePath = join(applicationsDir, `${APP_NAME}-url-handler.desktop`);\n\n    // Ensure the applications directory exists\n    await createDir(applicationsDir);\n\n    // Content of the .desktop file\n    // %U allows passing the URL to the application\n    // NoDisplay=true hides it from the regular application menu\n    const desktopFileContent = `[Desktop Entry]\nType=Application\nName=${APP_NAME}\nExec=${escapePathForExec(appPath)} %U\nTerminal=false\nMimeType=x-scheme-handler/${APP_NAME_ALIAS};\nNoDisplay=true\n`;\n\n    // Write the .desktop file (overwrite if exists)\n    await saveFile(desktopFilePath, desktopFileContent, 'utf8');\n    logger.debug(`Created/Updated desktop file: ${desktopFilePath}`);\n\n    // Update the desktop database\n    // It's important to update the database for the changes to take effect\n    try {\n      const { stdout, stderr } = await execAsync(`update-desktop-database ${escapePathForExec(applicationsDir)}`);\n      if (stderr) {\n        logger.warn(`update-desktop-database stderr: ${stderr}`);\n      }\n      logger.debug(`update-desktop-database stdout: ${stdout}`);\n      logger.debug('Desktop database updated successfully.');\n    } catch (updateError) {\n      logger.error('Failed to update desktop database:', updateError as Error);\n      // Continue even if update fails, as the file is still created.\n    }\n  } catch (error) {\n    // Log the error but don't prevent the app from starting\n    logger.error('Failed to setup AppImage deep link:', error as Error);\n  }\n}\n\n/**\n * Escapes a path for safe use within the Exec field of a .desktop file\n * and for shell commands. Handles spaces and potentially other special characters\n * by quoting.\n */\nfunction escapePathForExec(filePath: string): string {\n  // Simple quoting for paths with spaces.\n  return `'${filePath.replace(/'/g, \"'\\\\''\")}'`;\n}\n"
  },
  {
    "path": "src/main/services/ProxyManager.ts",
    "content": "import http from 'node:http';\nimport https from 'node:https';\n\nimport { loggerService } from '@logger';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport axios from 'axios';\nimport type { ProxyConfig } from 'electron';\nimport { app, session } from 'electron';\nimport { socksDispatcher } from 'fetch-socks';\nimport * as ipaddr from 'ipaddr.js';\nimport { getSystemProxy } from 'os-proxy-config';\nimport { ProxyAgent } from 'proxy-agent';\nimport { Dispatcher, EnvHttpProxyAgent, getGlobalDispatcher, setGlobalDispatcher } from 'undici';\n\nconst logger = loggerService.withContext(LOG_MODULE.APP_PROXY);\nlet byPassRules: string[] = [];\n\ntype IHostnameMatchType = 'exact' | 'wildcardSubdomain' | 'generalWildcard';\n\n// eslint-disable-next-line no-restricted-syntax\nconst enum ProxyBypassRuleType {\n  Local = 'local',\n  Cidr = 'cidr',\n  Ip = 'ip',\n  Domain = 'domain',\n}\n\ninterface ParsedProxyBypassRule {\n  type: ProxyBypassRuleType;\n  matchType: IHostnameMatchType;\n  rule: string;\n  scheme?: string;\n  port?: string;\n  domain?: string;\n  regex?: RegExp;\n  cidr?: [ipaddr.IPv4 | ipaddr.IPv6, number];\n  ip?: string;\n}\n\nlet parsedByPassRules: ParsedProxyBypassRule[] = [];\n\nconst getDefaultPortForProtocol = (protocol: string): string | null => {\n  switch (protocol.toLowerCase()) {\n    case 'http:':\n      return '80';\n    case 'https:':\n      return '443';\n    default:\n      return null;\n  }\n};\n\nconst buildWildcardRegex = (pattern: string): RegExp => {\n  const escapedSegments = pattern.split('*').map((segment) => segment.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n  return new RegExp(`^${escapedSegments.join('.*')}$`, 'i');\n};\n\nconst isWildcardIp = (value: string): boolean => {\n  if (!value.includes('*')) {\n    return false;\n  }\n  const replaced = value.replace(/\\*/g, '0');\n  return ipaddr.isValid(replaced);\n};\n\nconst matchHostnameRule = (hostname: string, rule: ParsedProxyBypassRule): boolean => {\n  const normalizedHostname = hostname.toLowerCase();\n\n  switch (rule.matchType) {\n    case 'exact':\n      return normalizedHostname === rule.domain;\n    case 'wildcardSubdomain': {\n      const domain = rule.domain;\n      if (!domain) {\n        return false;\n      }\n      return normalizedHostname === domain || normalizedHostname.endsWith(`.${domain}`);\n    }\n    case 'generalWildcard':\n      return rule.regex ? rule.regex.test(normalizedHostname) : false;\n    default:\n      return false;\n  }\n};\n\nconst parseProxyBypassRule = (rule: string): ParsedProxyBypassRule | null => {\n  const trimmedRule = rule.trim();\n  if (!trimmedRule) {\n    return null;\n  }\n\n  if (trimmedRule === '<local>') {\n    return {\n      type: ProxyBypassRuleType.Local,\n      matchType: 'exact',\n      rule: '<local>',\n    };\n  }\n\n  let workingRule = trimmedRule;\n  let scheme: string | undefined;\n  const schemeMatch = workingRule.match(/^([a-z][a-z\\d+\\-.]*):\\/\\//i);\n  if (schemeMatch) {\n    scheme = schemeMatch[1].toLowerCase();\n    workingRule = workingRule.slice(schemeMatch[0].length);\n  }\n\n  // CIDR notation must be processed before port extraction\n  if (workingRule.includes('/')) {\n    const cleanedCidr = workingRule.replace(/^\\[|\\]$/g, '');\n    if (ipaddr.isValidCIDR(cleanedCidr)) {\n      return {\n        type: ProxyBypassRuleType.Cidr,\n        matchType: 'exact',\n        rule: workingRule,\n        scheme,\n        cidr: ipaddr.parseCIDR(cleanedCidr),\n      };\n    }\n  }\n\n  // Extract port: supports \"host:port\" and \"[ipv6]:port\" formats\n  let port: string | undefined;\n  const portMatch = workingRule.match(/^(.+?):(\\d+)$/);\n  if (portMatch) {\n    // For IPv6, ensure we're not splitting inside the brackets\n    const potentialHost = portMatch[1];\n    if (!potentialHost.startsWith('[') || potentialHost.includes(']')) {\n      workingRule = potentialHost;\n      port = portMatch[2];\n    }\n  }\n\n  const cleanedHost = workingRule.replace(/^\\[|\\]$/g, '');\n  const normalizedHost = cleanedHost.toLowerCase();\n\n  if (!cleanedHost) {\n    return null;\n  }\n\n  if (ipaddr.isValid(cleanedHost)) {\n    return {\n      type: ProxyBypassRuleType.Ip,\n      matchType: 'exact',\n      rule: cleanedHost,\n      scheme,\n      port,\n      ip: cleanedHost,\n    };\n  }\n\n  if (isWildcardIp(cleanedHost)) {\n    const regexPattern = cleanedHost.replace(/\\./g, '\\\\.').replace(/\\*/g, '\\\\d+');\n    return {\n      type: ProxyBypassRuleType.Ip,\n      matchType: 'generalWildcard',\n      rule: cleanedHost,\n      scheme,\n      port,\n      regex: new RegExp(`^${regexPattern}$`),\n    };\n  }\n\n  if (workingRule.startsWith('*.')) {\n    const domain = normalizedHost.slice(2);\n    return {\n      type: ProxyBypassRuleType.Domain,\n      matchType: 'wildcardSubdomain',\n      rule: workingRule,\n      scheme,\n      port,\n      domain,\n    };\n  }\n\n  if (workingRule.startsWith('.')) {\n    const domain = normalizedHost.slice(1);\n    return {\n      type: ProxyBypassRuleType.Domain,\n      matchType: 'wildcardSubdomain',\n      rule: workingRule,\n      scheme,\n      port,\n      domain,\n    };\n  }\n\n  if (workingRule.includes('*')) {\n    return {\n      type: ProxyBypassRuleType.Domain,\n      matchType: 'generalWildcard',\n      rule: workingRule,\n      scheme,\n      port,\n      regex: buildWildcardRegex(normalizedHost),\n    };\n  }\n\n  return {\n    type: ProxyBypassRuleType.Domain,\n    matchType: 'exact',\n    rule: workingRule,\n    scheme,\n    port,\n    domain: normalizedHost,\n  };\n};\n\nconst isLocalHostname = (hostname: string): boolean => {\n  const normalized = hostname.toLowerCase();\n  if (normalized === 'localhost') {\n    return true;\n  }\n\n  const cleaned = hostname.replace(/^\\[|\\]$/g, '');\n  if (ipaddr.isValid(cleaned)) {\n    const parsed = ipaddr.parse(cleaned);\n    return parsed.range() === 'loopback';\n  }\n\n  return false;\n};\n\nexport const updateByPassRules = (rules: string[]): void => {\n  byPassRules = rules;\n  parsedByPassRules = [];\n\n  for (const rule of rules) {\n    const parsedRule = parseProxyBypassRule(rule);\n    if (parsedRule) {\n      parsedByPassRules.push(parsedRule);\n    } else {\n      logger.warn(`Skipping invalid proxy bypass rule: ${rule}`);\n    }\n  }\n};\n\nexport const isByPass = (url: string) => {\n  if (parsedByPassRules.length === 0) {\n    return false;\n  }\n\n  try {\n    const parsedUrl = new URL(url);\n    const hostname = parsedUrl.hostname;\n    const cleanedHostname = hostname.replace(/^\\[|\\]$/g, '');\n    const protocol = parsedUrl.protocol;\n    const protocolName = protocol.replace(':', '').toLowerCase();\n    const defaultPort = getDefaultPortForProtocol(protocol);\n    const port = parsedUrl.port || defaultPort || '';\n    const hostnameIsIp = ipaddr.isValid(cleanedHostname);\n\n    for (const rule of parsedByPassRules) {\n      if (rule.scheme && rule.scheme !== protocolName) {\n        continue;\n      }\n\n      if (rule.port && rule.port !== port) {\n        continue;\n      }\n\n      switch (rule.type) {\n        case ProxyBypassRuleType.Local:\n          if (isLocalHostname(hostname)) {\n            return true;\n          }\n          break;\n        case ProxyBypassRuleType.Ip:\n          if (!hostnameIsIp) {\n            break;\n          }\n\n          if (rule.ip && cleanedHostname === rule.ip) {\n            return true;\n          }\n\n          if (rule.regex && rule.regex.test(cleanedHostname)) {\n            return true;\n          }\n          break;\n        case ProxyBypassRuleType.Cidr:\n          if (hostnameIsIp && rule.cidr) {\n            const parsedHost = ipaddr.parse(cleanedHostname);\n            const [cidrAddress, prefixLength] = rule.cidr;\n            // Ensure IP version matches before comparing\n            if (parsedHost.kind() === cidrAddress.kind() && parsedHost.match([cidrAddress, prefixLength])) {\n              return true;\n            }\n          }\n          break;\n        case ProxyBypassRuleType.Domain:\n          if (!hostnameIsIp && matchHostnameRule(hostname, rule)) {\n            return true;\n          }\n          break;\n        default:\n          logger.error(`Unknown proxy bypass rule type: ${rule.type}`);\n          break;\n      }\n    }\n  } catch (error) {\n    logger.error('Failed to check bypass:', error as Error);\n    return false;\n  }\n  return false;\n};\n\nclass SelectiveDispatcher extends Dispatcher {\n  private proxyDispatcher: Dispatcher;\n  private directDispatcher: Dispatcher;\n\n  constructor(proxyDispatcher: Dispatcher, directDispatcher: Dispatcher) {\n    super();\n    this.proxyDispatcher = proxyDispatcher;\n    this.directDispatcher = directDispatcher;\n  }\n\n  dispatch(opts: Dispatcher.DispatchOptions, handler: Dispatcher.DispatchHandlers) {\n    if (opts.origin) {\n      if (isByPass(opts.origin.toString())) {\n        return this.directDispatcher.dispatch(opts, handler);\n      }\n    }\n\n    return this.proxyDispatcher.dispatch(opts, handler);\n  }\n\n  async close(): Promise<void> {\n    try {\n      await this.proxyDispatcher.close();\n    } catch (error) {\n      logger.error('Failed to close dispatcher:', error as Error);\n      this.proxyDispatcher.destroy();\n    }\n  }\n\n  async destroy(): Promise<void> {\n    try {\n      await this.proxyDispatcher.destroy();\n    } catch (error) {\n      logger.error('Failed to destroy dispatcher:', error as Error);\n    }\n  }\n}\n\nexport class ProxyManager {\n  private config: ProxyConfig = { mode: 'direct' };\n  private systemProxyInterval: NodeJS.Timeout | null = null;\n  private isSettingProxy = false;\n\n  private proxyDispatcher: Dispatcher | null = null;\n  private proxyAgent: ProxyAgent | null = null;\n\n  private originalGlobalDispatcher: Dispatcher;\n  private originalSocksDispatcher: Dispatcher;\n  // for http and https\n  private originalHttpGet: typeof http.get;\n  private originalHttpRequest: typeof http.request;\n  private originalHttpsGet: typeof https.get;\n  private originalHttpsRequest: typeof https.request;\n\n  private originalAxiosAdapter;\n\n  constructor() {\n    this.originalGlobalDispatcher = getGlobalDispatcher();\n    // eslint-disable-next-line no-restricted-globals\n    this.originalSocksDispatcher = global[Symbol.for('undici.globalDispatcher.1')];\n    this.originalHttpGet = http.get;\n    this.originalHttpRequest = http.request;\n    this.originalHttpsGet = https.get;\n    this.originalHttpsRequest = https.request;\n    this.originalAxiosAdapter = axios.defaults.adapter;\n  }\n\n  private async monitorSystemProxy(): Promise<void> {\n    // Clear any existing interval first\n    this.clearSystemProxyMonitor();\n    // Set new interval\n    this.systemProxyInterval = setInterval(async () => {\n      const currentProxy = await getSystemProxy();\n      if (\n        currentProxy?.proxyUrl.toLowerCase() === this.config?.proxyRules &&\n        currentProxy?.noProxy.join(',').toLowerCase() === this.config?.proxyBypassRules?.toLowerCase()\n      ) {\n        return;\n      }\n\n      logger.info(\n        `system proxy changed: ${currentProxy?.proxyUrl}, this.config.proxyRules: ${this.config.proxyRules}, this.config.proxyBypassRules: ${this.config.proxyBypassRules}`,\n      );\n      await this.configureProxy({\n        mode: 'system',\n        proxyRules: currentProxy?.proxyUrl.toLowerCase(),\n        proxyBypassRules: currentProxy?.noProxy.join(','),\n      });\n    }, 1000 * 60);\n  }\n\n  private clearSystemProxyMonitor(): void {\n    if (this.systemProxyInterval) {\n      clearInterval(this.systemProxyInterval);\n      this.systemProxyInterval = null;\n    }\n  }\n\n  async configureProxy(config: ProxyConfig): Promise<void> {\n    logger.info(`configureProxy: ${config?.mode} ${config?.proxyRules} ${config?.proxyBypassRules}`);\n\n    if (this.isSettingProxy) {\n      return;\n    }\n\n    this.isSettingProxy = true;\n\n    try {\n      this.clearSystemProxyMonitor();\n      if (config.mode === 'system') {\n        const currentProxy = await getSystemProxy();\n        if (currentProxy) {\n          logger.info(\n            `current system proxy: ${currentProxy.proxyUrl}, bypass rules: ${currentProxy.noProxy.join(',')}`,\n          );\n          config.proxyRules = currentProxy.proxyUrl.toLowerCase();\n          config.proxyBypassRules = currentProxy.noProxy.join(',');\n        }\n        this.monitorSystemProxy();\n      }\n\n      // Support both semicolon and comma as separators\n      if (config.proxyBypassRules !== this.config.proxyBypassRules) {\n        const rawRules = config.proxyBypassRules\n          ? config.proxyBypassRules\n              .split(/[;,]/)\n              .map((rule) => rule.trim())\n              .filter((rule) => rule.length > 0)\n          : [];\n\n        updateByPassRules(rawRules);\n      }\n\n      this.setGlobalProxy(config);\n      this.config = config;\n    } catch (error) {\n      logger.error('Failed to config proxy:', error as Error);\n      throw error;\n    } finally {\n      this.isSettingProxy = false;\n    }\n  }\n\n  private setEnvironment(url: string): void {\n    if (url === '') {\n      delete process.env.HTTP_PROXY;\n      delete process.env.HTTPS_PROXY;\n      delete process.env.grpc_proxy;\n      delete process.env.http_proxy;\n      delete process.env.https_proxy;\n      delete process.env.no_proxy;\n\n      delete process.env.SOCKS_PROXY;\n      delete process.env.ALL_PROXY;\n      return;\n    }\n\n    process.env.grpc_proxy = url;\n    process.env.HTTP_PROXY = url;\n    process.env.HTTPS_PROXY = url;\n    process.env.http_proxy = url;\n    process.env.https_proxy = url;\n    process.env.no_proxy = byPassRules.join(',');\n\n    if (url.startsWith('socks')) {\n      process.env.SOCKS_PROXY = url;\n      process.env.ALL_PROXY = url;\n    }\n  }\n\n  private setGlobalProxy(config: ProxyConfig) {\n    this.setEnvironment(config.proxyRules || '');\n    this.setGlobalFetchProxy(config);\n    this.setSessionsProxy(config);\n\n    this.setGlobalHttpProxy(config);\n  }\n\n  private setGlobalHttpProxy(config: ProxyConfig) {\n    if (config.mode === 'direct' || !config.proxyRules) {\n      http.get = this.originalHttpGet;\n      http.request = this.originalHttpRequest;\n      https.get = this.originalHttpsGet;\n      https.request = this.originalHttpsRequest;\n      try {\n        this.proxyAgent?.destroy();\n      } catch (error) {\n        logger.error('Failed to destroy proxy agent:', error as Error);\n      }\n      this.proxyAgent = null;\n      return;\n    }\n\n    // ProxyAgent 从环境变量读取代理配置\n    const agent = new ProxyAgent();\n    this.proxyAgent = agent;\n    http.get = this.bindHttpMethod(this.originalHttpGet, agent);\n    http.request = this.bindHttpMethod(this.originalHttpRequest, agent);\n\n    https.get = this.bindHttpMethod(this.originalHttpsGet, agent);\n    https.request = this.bindHttpMethod(this.originalHttpsRequest, agent);\n  }\n\n  // eslint-disable-next-line ts/no-unsafe-function-type\n  private bindHttpMethod(originalMethod: Function, agent: http.Agent | https.Agent) {\n    return (...args: any[]) => {\n      let url: string | URL | undefined;\n      let options: http.RequestOptions | https.RequestOptions;\n      let callback: (res: http.IncomingMessage) => void;\n\n      if (typeof args[0] === 'string' || args[0] instanceof URL) {\n        url = args[0];\n        if (typeof args[1] === 'function') {\n          options = {};\n          callback = args[1];\n        } else {\n          options = {\n            ...args[1],\n          };\n          callback = args[2];\n        }\n      } else {\n        options = {\n          ...args[0],\n        };\n        callback = args[1];\n      }\n\n      // filter localhost\n      if (url) {\n        if (isByPass(url.toString())) {\n          return originalMethod(url, options, callback);\n        }\n      }\n\n      // for webdav https self-signed certificate\n      if (options.agent instanceof https.Agent) {\n        (agent as https.Agent).options.rejectUnauthorized = options.agent.options.rejectUnauthorized;\n      }\n      options.agent = agent;\n      if (url) {\n        return originalMethod(url, options, callback);\n      }\n      return originalMethod(options, callback);\n    };\n  }\n\n  private setGlobalFetchProxy(config: ProxyConfig) {\n    const proxyUrl = config.proxyRules;\n    if (config.mode === 'direct' || !proxyUrl) {\n      setGlobalDispatcher(this.originalGlobalDispatcher);\n      // eslint-disable-next-line no-restricted-globals\n      global[Symbol.for('undici.globalDispatcher.1')] = this.originalSocksDispatcher;\n      this.proxyDispatcher?.close();\n      this.proxyDispatcher = null;\n      axios.defaults.adapter = this.originalAxiosAdapter;\n      return;\n    }\n\n    // axios 使用 fetch 代理\n    axios.defaults.adapter = 'fetch';\n\n    const url = new URL(proxyUrl);\n    if (url.protocol === 'http:' || url.protocol === 'https:') {\n      this.proxyDispatcher = new SelectiveDispatcher(new EnvHttpProxyAgent(), this.originalGlobalDispatcher);\n      setGlobalDispatcher(this.proxyDispatcher);\n      return;\n    }\n\n    this.proxyDispatcher = new SelectiveDispatcher(\n      socksDispatcher({\n        port: Number.parseInt(url.port),\n        type: url.protocol === 'socks4:' ? 4 : 5,\n        host: url.hostname,\n        userId: url.username || undefined,\n        password: url.password || undefined,\n      }),\n      this.originalSocksDispatcher,\n    );\n    // eslint-disable-next-line no-restricted-globals\n    global[Symbol.for('undici.globalDispatcher.1')] = this.proxyDispatcher;\n  }\n\n  private async setSessionsProxy(config: ProxyConfig): Promise<void> {\n    const sessions = [session.defaultSession, session.fromPartition('persist:webview')];\n    await Promise.all(sessions.map((session) => session.setProxy(config)));\n\n    // set proxy for electron\n    app.setProxy(config);\n  }\n}\n\nexport const proxyManager = new ProxyManager();\n"
  },
  {
    "path": "src/main/services/PythonService.ts",
    "content": "import type { ChildProcessByStdio } from 'node:child_process';\nimport { execSync, spawn } from 'node:child_process';\nimport { join } from 'node:path';\nimport type { Stream } from 'node:stream';\n\nimport { loggerService } from '@logger';\nimport { pathExist } from '@main/utils/file';\nimport { HOME_BIN_PATH } from '@main/utils/path';\nimport { chmodBinary, getBinaryName, killPid, matchPort, matchPs } from '@main/utils/process';\nimport { execAsync } from '@main/utils/shell';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport { isArray, isArrayEmpty, isNil } from '@shared/modules/validate';\n\nconst logger = loggerService.withContext(LOG_MODULE.PYTHON);\n\nexport interface IPythonOptions {\n  projectBasePath: string;\n}\n\nexport class PythonService {\n  projectBasePath: string;\n  uvBinaryPath: string;\n  childProcess: ChildProcessByStdio<null, Stream.Readable, Stream.Readable> | null = null;\n\n  constructor(options: IPythonOptions) {\n    this.projectBasePath = options.projectBasePath;\n    this.uvBinaryPath = join(HOME_BIN_PATH, getBinaryName('uv'));\n  }\n\n  async checkBinary() {\n    if (!(await pathExist(this.uvBinaryPath))) {\n      throw new Error('uv binary does not exist.');\n    }\n    if (!(await chmodBinary(this.uvBinaryPath, 0o755))) {\n      throw new Error('Failed to set executable permissions for uv binary.');\n    }\n  }\n\n  async matchProcess(kw: string): Promise<number[]> {\n    return await matchPs(kw);\n  }\n\n  async matchPort(port: number): Promise<number[]> {\n    return await matchPort(port);\n  }\n\n  async killProcess(pids: number[]): Promise<boolean> {\n    return await killPid(pids);\n  }\n\n  async installDep(pkgs: string[] = []): Promise<boolean> {\n    try {\n      const tomlPath = join(this.projectBasePath, 'pyproject.toml');\n      const requirementsPath = join(this.projectBasePath, 'requirements.txt');\n\n      const cmd = (await pathExist(tomlPath))\n        ? [this.uvBinaryPath, 'sync', '--native-tls']\n        : (await pathExist(requirementsPath))\n          ? [this.uvBinaryPath, 'pip', 'install', '-r', 'requirements.txt']\n          : isArray(pkgs) && !isArrayEmpty(pkgs)\n            ? [this.uvBinaryPath, 'pip', 'install', ...pkgs]\n            : null;\n\n      if (isNil(cmd)) {\n        logger.warn('No pyproject.toml or requirements.txt found, skipping dependency installation.');\n        return false;\n      }\n      logger.debug(`Installing Python dependencies with command: ${cmd.join(' ')}`);\n\n      const { stdout, stderr } = await execAsync(cmd.join(' '), {\n        cwd: this.projectBasePath,\n      });\n\n      if (stdout) logger.debug(stdout.toString());\n      if (stderr) logger.debug(stderr.toString());\n\n      return true;\n    } catch (error) {\n      logger.error('Failed to install dependencies:', error as Error);\n      throw error;\n    }\n  }\n\n  runSpawn(\n    args: string[] = [],\n    venv: boolean = false,\n    cb: {\n      stdoutCb?: (data: string) => void;\n      stderrCb?: (data: string) => void;\n      errorCb?: (error: Error) => void;\n      closeCb?: (code: number | null) => void;\n    } = {},\n  ): void {\n    try {\n      logger.debug(`Spawning Python process with args: ${args.join(' ')}`);\n\n      const cmd = ['run', ...(venv ? ['--active'] : []), ...args];\n      const child = spawn(this.uvBinaryPath, cmd, {\n        cwd: this.projectBasePath,\n        detached: false,\n        windowsHide: true,\n        stdio: ['ignore', 'pipe', 'pipe'],\n        shell: false,\n      });\n      this.childProcess = child;\n\n      child.stdout.on('data', (data) => {\n        cb?.stdoutCb?.(data.toString());\n      });\n\n      child.stderr.on('data', (data) => {\n        cb?.stderrCb?.(data.toString());\n      });\n\n      child.on('error', (error) => {\n        cb?.errorCb?.(error);\n      });\n\n      child.on('close', (code) => {\n        cb?.closeCb?.(code);\n      });\n    } catch (error) {\n      logger.error('Error while starting Python process:', error as Error);\n      throw error;\n    }\n  }\n\n  async runExec(args: string[], venv: boolean = false): Promise<{ stdout: string; stderr: string }> {\n    try {\n      const cmd = [this.uvBinaryPath, 'run', ...(venv ? ['--active'] : []), ...args];\n      const { stdout, stderr } = await execAsync(cmd.join(' '), {\n        cwd: this.projectBasePath,\n        windowsHide: true,\n        encoding: 'utf-8',\n      });\n      return { stdout: stdout.toString().trim(), stderr: stderr.toString().trim() };\n    } catch (error) {\n      logger.error('Failed to run Python script:', error as Error);\n      throw error;\n    }\n  }\n\n  runExecSync(args: string[], venv: boolean = false): { stdout: string; stderr: string } {\n    try {\n      const cmd = [this.uvBinaryPath, 'run', ...(venv ? ['--active'] : []), ...args];\n      const output = execSync(cmd.join(' '), {\n        cwd: this.projectBasePath,\n        windowsHide: true,\n        encoding: 'utf-8',\n        stdio: ['pipe', 'pipe', 'pipe'],\n      });\n      return { stdout: output.trim(), stderr: '' };\n    } catch (error) {\n      logger.error('Failed to run Python script synchronously:', error as Error);\n      throw error;\n    }\n  }\n}\n"
  },
  {
    "path": "src/main/services/ShortcutService.ts",
    "content": "import { loggerService } from '@logger';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport type { IShortcutConfig, IShortcutType } from '@shared/config/shortcut';\nimport { SHORTCUT_TYPE } from '@shared/config/shortcut';\nimport { isFunction, isNil, isStrEmpty, isString } from '@shared/modules/validate';\nimport { globalShortcut } from 'electron';\nimport * as localShortcut from 'electron-localshortcut';\n\nimport { windowService } from './WindowService';\n\ninterface IShortcutPool {\n  type: IShortcutType;\n  winName?: string;\n  shortcut: string;\n  handler: () => Promise<void> | void;\n  callback?: () => Promise<void> | void;\n}\n\nconst logger = loggerService.withContext(LOG_MODULE.APP_SHORTCUT);\n\nexport class ShortcutService {\n  private static instance: ShortcutService;\n  private shortcutPool = new Map<string, IShortcutPool>();\n\n  constructor() {}\n\n  public static getInstance(): ShortcutService {\n    if (!ShortcutService.instance) {\n      ShortcutService.instance = new ShortcutService();\n    }\n    return ShortcutService.instance;\n  }\n\n  private shortcutHandler = {\n    bossKey: () => windowService.toggleAllWindows(),\n  };\n\n  // convert the shortcut recorded by JS keyboard event key value to electron global shortcut format\n  // see: https://www.electronjs.org/zh/docs/latest/api/accelerator\n  private convertShortcutFormat = (shortcut: string | string[]): string => {\n    const keys = Array.isArray(shortcut) ? shortcut : shortcut.split('+').map((k) => k.trim());\n\n    return keys\n      .map((key) => {\n        switch (key) {\n          case 'CommandOrControl':\n            return 'CommandOrControl';\n          case 'Ctrl':\n            return 'Ctrl';\n          case 'Alt':\n            return 'Alt'; // Use `Alt` instead of `Option`. The `Option` key only exists on macOS, whereas the `Alt` key is available on all platforms.\n          case 'Meta':\n            return 'Meta'; // `Meta` key is mapped to the Windows key on Windows and Linux, `Cmd` on macOS.\n          case 'Shift':\n            return 'Shift';\n          case 'ArrowUp':\n            return 'Up';\n          case 'ArrowDown':\n            return 'Down';\n          case 'ArrowLeft':\n            return 'Left';\n          case 'ArrowRight':\n            return 'Right';\n          case 'AltGraph':\n            return 'AltGr';\n          case 'Slash':\n            return '/';\n          case 'Semicolon':\n            return ';';\n          case 'BracketLeft':\n            return '[';\n          case 'BracketRight':\n            return ']';\n          case 'Backslash':\n            return '\\\\';\n          case 'Quote':\n            return \"'\";\n          case 'Comma':\n            return ',';\n          case 'Minus':\n            return '-';\n          case 'Equal':\n            return '=';\n          default:\n            return key;\n        }\n      })\n      .join('+');\n  };\n\n  public registerGlobal(id: string, config: IShortcutConfig, force: boolean = false): boolean {\n    const { type, shortcut: shortcutRaw, handler: handlerRaw, cb } = config;\n\n    if (isNil(id) || type !== SHORTCUT_TYPE.GLOBAL || isNil(shortcutRaw)) return false;\n\n    const shortcut = this.convertShortcutFormat(shortcutRaw);\n    const handler = isFunction(handlerRaw)\n      ? (handlerRaw as () => Promise<void> | void)\n      : (this.shortcutHandler[String(handlerRaw)] ?? (() => {}));\n\n    const fn = () => {\n      logger.debug(`Global shortcut triggered: ${shortcut}`);\n      handler();\n      cb?.();\n    };\n\n    if (globalShortcut.isRegistered(shortcut)) {\n      if (!force) return false; // already registered\n\n      const entry = [...this.shortcutPool.entries()].find(\n        ([, conf]) => conf.type === SHORTCUT_TYPE.GLOBAL && conf.shortcut === shortcut,\n      );\n\n      if (!entry) {\n        logger.warn(`Global shortcut occupied by system or other app: ${shortcut}`);\n        return false;\n      } // unregister the existing one\n\n      const [key, conf] = entry;\n      globalShortcut.unregister(conf.shortcut);\n      if (globalShortcut.isRegistered(conf.shortcut)) {\n        logger.warn(`Failed to unregister global shortcut: ${shortcut}`);\n        return false;\n      }\n      this.shortcutPool.delete(key);\n    }\n\n    globalShortcut.register(shortcut, fn);\n    if (!globalShortcut.isRegistered(shortcut)) return false;\n\n    this.shortcutPool.set(id, { type, shortcut, handler: fn });\n\n    logger.info(`Registered global shortcut: ${shortcut}`);\n\n    return true;\n  }\n\n  public registerLocal(id: string, config: IShortcutConfig, force: boolean = false): boolean {\n    const { type, winName, shortcut: shortcutRaw, handler: handlerRaw, cb } = config;\n\n    if (isNil(id) || type !== SHORTCUT_TYPE.LOCAL || isNil(shortcutRaw) || isNil(winName)) return false;\n\n    const win = windowService.getWindow(winName);\n    if (!win) {\n      logger.warn(`Failed to register local shortcut: ${winName} window not found`);\n      return false;\n    }\n\n    const shortcut = this.convertShortcutFormat(shortcutRaw);\n    const handler = isFunction(handlerRaw)\n      ? (handlerRaw as () => Promise<void> | void)\n      : (this.shortcutHandler[String(handlerRaw)] ?? (() => {}));\n\n    const fn = () => {\n      logger.debug(`Local shortcut triggered: ${shortcut} for window: ${winName}`);\n      handler();\n      cb?.();\n    };\n\n    const onWindowClosed = () => {\n      if (this.shortcutPool.has(id)) this.shortcutPool.delete(id);\n    };\n    win.once('closed', onWindowClosed);\n\n    if (localShortcut.isRegistered(win, shortcut)) {\n      if (!force) return false; // already registered\n\n      const entry = [...this.shortcutPool.entries()].find(\n        ([, conf]) => conf.type === SHORTCUT_TYPE.LOCAL && conf.shortcut === shortcut && conf.winName === winName,\n      );\n\n      if (!entry) {\n        logger.warn(`Local shortcut occupied by system or other app: ${shortcut} for window: ${winName}`);\n        return false;\n      } // unregister the existing one\n\n      const [key, conf] = entry;\n      localShortcut.unregister(win, conf.shortcut);\n      if (localShortcut.isRegistered(win, conf.shortcut)) {\n        logger.warn(`Failed to unregister local shortcut: ${shortcut} for window: ${winName}`);\n        return false;\n      }\n\n      this.shortcutPool.delete(key);\n    }\n\n    localShortcut.register(win, shortcut, fn);\n    if (!localShortcut.isRegistered(win, shortcut)) return false;\n\n    this.shortcutPool.set(id, { type, winName, shortcut, handler: fn });\n\n    logger.info(`Registered local shortcut: ${shortcut} for window: ${winName}`);\n\n    return true;\n  }\n\n  public register(id: string, config: IShortcutConfig, force: boolean = false): boolean {\n    if (\n      isNil(id) ||\n      ![SHORTCUT_TYPE.GLOBAL, SHORTCUT_TYPE.LOCAL].includes(config.type) ||\n      !isString(config.shortcut) ||\n      isStrEmpty(config.shortcut) ||\n      (config.type === SHORTCUT_TYPE.LOCAL && !(isString(config.winName) && !isStrEmpty(config.winName)))\n    ) {\n      return false;\n    }\n\n    if (config.type === SHORTCUT_TYPE.GLOBAL) {\n      return this.registerGlobal(id, config, force);\n    }\n    if (config.type === SHORTCUT_TYPE.LOCAL) {\n      return this.registerLocal(id, config, force);\n    }\n    return false;\n  }\n\n  public isRegisteredGlobal(id: string): boolean {\n    if (isNil(id)) return false;\n\n    const conf = this.shortcutPool.get(id);\n    if (!conf) return false;\n\n    if (!globalShortcut.isRegistered(conf.shortcut)) {\n      this.shortcutPool.delete(id);\n      return false;\n    }\n\n    return true;\n  }\n\n  public isRegisteredLocal(id: string, winName: string): boolean {\n    if (isNil(id) || !isString(winName) || isStrEmpty(winName)) return false;\n\n    const conf = this.shortcutPool.get(id);\n    if (!conf) return false;\n\n    const win = windowService.getWindow(winName);\n    if (!win) {\n      logger.warn(`Failed to check local shortcut: ${winName} window not found`);\n      this.shortcutPool.delete(id);\n      return false;\n    }\n\n    if (!localShortcut.isRegistered(win, conf.shortcut)) {\n      this.shortcutPool.delete(id);\n      return false;\n    }\n\n    return true;\n  }\n\n  public isRegistered(type: IShortcutType, id: string, winName?: string): boolean {\n    if (\n      isNil(id) ||\n      ![SHORTCUT_TYPE.GLOBAL, SHORTCUT_TYPE.LOCAL].includes(type) ||\n      (type === SHORTCUT_TYPE.LOCAL && !(isString(winName) && !isStrEmpty(winName)))\n    ) {\n      return false;\n    }\n\n    if (type === SHORTCUT_TYPE.GLOBAL) {\n      return this.isRegisteredGlobal(id);\n    }\n    if (type === SHORTCUT_TYPE.LOCAL) {\n      return this.isRegisteredLocal(id, winName!);\n    }\n    return false;\n  }\n\n  public unregisterGlobal(id: string): boolean {\n    if (isNil(id)) return true;\n\n    const conf = this.shortcutPool.get(id);\n    if (!conf) return true;\n\n    globalShortcut.unregister(conf.shortcut);\n    if (globalShortcut.isRegistered(conf.shortcut)) {\n      logger.warn(`Failed to unregister global shortcut: ${conf.shortcut}`);\n      return false;\n    }\n\n    this.shortcutPool.delete(id);\n\n    logger.info(`Unregistered global shortcut: ${conf.shortcut}`);\n\n    return true;\n  }\n\n  public unregisterLocal(id: string, winName: string): boolean {\n    if (isNil(id) || !isString(winName) || isStrEmpty(winName)) return true;\n\n    const conf = this.shortcutPool.get(id);\n    if (!conf) return true;\n\n    const win = windowService.getWindow(winName);\n    if (!win) {\n      logger.warn(`Failed to unregister local shortcut: ${winName} window not found`);\n      this.shortcutPool.delete(id);\n      return false;\n    }\n\n    localShortcut.unregister(win, conf.shortcut);\n    if (localShortcut.isRegistered(win, conf.shortcut)) {\n      logger.warn(`Failed to unregister local shortcut: ${conf.shortcut} for window: ${winName}`);\n      return false;\n    }\n\n    this.shortcutPool.delete(id);\n\n    logger.info(`Unregistered local shortcut: ${conf.shortcut} for window: ${winName}`);\n\n    return true;\n  }\n\n  public unregister(type: IShortcutType, id: string, winName?: string): boolean {\n    if (\n      isNil(id) ||\n      ![SHORTCUT_TYPE.GLOBAL, SHORTCUT_TYPE.LOCAL].includes(type) ||\n      (type === SHORTCUT_TYPE.LOCAL && !(isString(winName) && !isStrEmpty(winName)))\n    ) {\n      return true;\n    }\n\n    if (type === SHORTCUT_TYPE.GLOBAL) {\n      return this.unregisterGlobal(id);\n    }\n    if (type === SHORTCUT_TYPE.LOCAL) {\n      return this.unregisterLocal(id, winName!);\n    }\n    return true;\n  }\n\n  public clear(): void {\n    for (const [id, conf] of this.shortcutPool) {\n      this.unregister(conf.type, id, conf.winName);\n    }\n\n    this.shortcutPool.clear();\n\n    logger.info('Cleared all shortcuts');\n  }\n}\n\nexport const shortcutService = ShortcutService.getInstance();\n"
  },
  {
    "path": "src/main/services/StorageService/ICloudStorage.ts",
    "content": "import type { Buffer } from 'node:buffer';\nimport { dirname, join } from 'node:path';\n\nimport { loggerService } from '@logger';\nimport { createDir, fileDelete, pathExist, readDirFaster, readFile, saveFile } from '@main/utils/file';\nimport { APP_HOME_PATH } from '@main/utils/path';\nimport { isMacOS } from '@main/utils/systeminfo';\nimport { APP_NAME_ALIAS } from '@shared/config/appinfo';\nimport { LOG_MODULE } from '@shared/config/logger';\n\nconst logger = loggerService.withContext(LOG_MODULE.SYNC_STORAGE);\n\nexport class ICloudStorage {\n  private readonly icloudRootPath = join(APP_HOME_PATH, 'Library/Mobile Documents/com~apple~CloudDocs');\n  private readonly baseDirPath: string = `${this.icloudRootPath}/${APP_NAME_ALIAS}`;\n\n  constructor() {}\n\n  public ensureIcloudReady = async (): Promise<void> => {\n    if (!isMacOS) {\n      throw new Error('iCloud storage is only supported on macOS');\n    }\n\n    if (!(await pathExist(this.icloudRootPath))) {\n      throw new Error('iCloud Drive is not enabled or not available');\n    }\n\n    if (!(await pathExist(this.baseDirPath))) {\n      await createDir(this.baseDirPath);\n    }\n  };\n\n  public putFileContents = async (filename: string, data: string | Buffer) => {\n    await this.ensureIcloudReady();\n\n    const remoteFilePath = join(this.baseDirPath, filename);\n    const remoteFileDirPath = dirname(remoteFilePath);\n\n    try {\n      if (!(await pathExist(remoteFileDirPath))) {\n        await createDir(remoteFileDirPath);\n      }\n\n      return await saveFile(remoteFilePath, data);\n    } catch (error) {\n      logger.error('Error putting file contents:', error as Error);\n      throw error;\n    }\n  };\n\n  public getFileContents = async (filename: string, options?) => {\n    await this.ensureIcloudReady();\n\n    const remoteFilePath = join(this.baseDirPath, filename);\n\n    try {\n      const fileExists = await pathExist(remoteFilePath);\n      if (!fileExists) {\n        logger.error(`File does not exist: ${remoteFilePath}`);\n        throw new Error('File does not exist');\n      }\n\n      return await readFile(remoteFilePath, options);\n    } catch (error) {\n      logger.error('Error getting file contents:', error as Error);\n      throw error;\n    }\n  };\n\n  public getDirectoryContents = async (depth = 1) => {\n    await this.ensureIcloudReady();\n\n    try {\n      return await readDirFaster(this.baseDirPath, depth);\n    } catch (error) {\n      logger.error('Error getting directory contents:', error as Error);\n      throw error;\n    }\n  };\n\n  public createDirectory = async (path: string) => {\n    await this.ensureIcloudReady();\n\n    const remoteFilePath = join(this.baseDirPath, path);\n\n    try {\n      return await createDir(remoteFilePath);\n    } catch (error) {\n      logger.error('Error creating directory:', error as Error);\n      throw error;\n    }\n  };\n\n  public deleteFile = async (filename: string) => {\n    await this.ensureIcloudReady();\n\n    const remoteFilePath = join(this.baseDirPath, filename);\n\n    try {\n      return await fileDelete(remoteFilePath);\n    } catch (error) {\n      logger.error('Error deleting file:', error as Error);\n      throw error;\n    }\n  };\n}\n"
  },
  {
    "path": "src/main/services/StorageService/WebdavStorage.ts",
    "content": "import https from 'node:https';\nimport { posix } from 'node:path';\nimport type { Stream } from 'node:stream';\n\nimport { loggerService } from '@logger';\nimport { APP_NAME_ALIAS } from '@shared/config/appinfo';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport { isHttp, isStrEmpty } from '@shared/modules/validate';\nimport type {\n  BufferLike,\n  CreateDirectoryOptions,\n  GetFileContentsOptions,\n  PutFileContentsOptions,\n  WebDAVClient,\n} from 'webdav';\nimport { createClient } from 'webdav';\n\nexport interface IWebdavConfig {\n  url: string;\n  username: string;\n  password: string;\n}\n\nconst logger = loggerService.withContext(LOG_MODULE.SYNC_STORAGE);\n\nexport class WebdavStorage {\n  private readonly baseDirPath: string = `/${APP_NAME_ALIAS}`;\n  private client: WebDAVClient | null = null;\n\n  constructor() {}\n\n  public initClient = async (config: IWebdavConfig): Promise<void> => {\n    const { url, username, password } = config;\n\n    if (!isHttp(url) || isStrEmpty(username) || isStrEmpty(password)) {\n      logger.error('Invalid WebDAV configuration');\n      throw new Error('Invalid WebDAV configuration');\n    }\n\n    try {\n      this.client = createClient(url, {\n        username,\n        password,\n        maxBodyLength: Infinity,\n        maxContentLength: Infinity,\n        httpsAgent: new https.Agent({\n          rejectUnauthorized: false,\n        }),\n      });\n    } catch (error) {\n      logger.error('Error initializing WebDAV client:', error as Error);\n      throw error;\n    }\n  };\n\n  public putFileContents = async (\n    filename: string,\n    data: string | BufferLike | Stream.Readable,\n    options?: PutFileContentsOptions,\n  ) => {\n    if (!this.client) {\n      return new Error('WebDAV client not initialized');\n    }\n\n    try {\n      if (!(await this.client.exists(this.baseDirPath))) {\n        await this.client.createDirectory(this.baseDirPath, {\n          recursive: true,\n        });\n      }\n    } catch (error) {\n      logger.error('Error creating directory on WebDAV:', error as Error);\n      throw error;\n    }\n\n    const remoteFilePath = posix.join(this.baseDirPath, filename);\n\n    try {\n      return await this.client.putFileContents(remoteFilePath, data, options);\n    } catch (error) {\n      logger.error('Error putting file contents on WebDAV:', error as Error);\n      throw error;\n    }\n  };\n\n  public getFileContents = async (filename: string, options?: GetFileContentsOptions) => {\n    if (!this.client) {\n      throw new Error('WebDAV client not initialized');\n    }\n\n    const remoteFilePath = posix.join(this.baseDirPath, filename);\n\n    try {\n      const fileExists = await this.client!.exists(remoteFilePath);\n      if (!fileExists) {\n        logger.error(`File does not exist on WebDAV: ${remoteFilePath}`);\n        throw new Error('File does not exist on WebDAV');\n      }\n\n      return await this.client.getFileContents(remoteFilePath, options);\n    } catch (error) {\n      logger.error('Error getting file contents on WebDAV:', error as Error);\n      throw error;\n    }\n  };\n\n  public getDirectoryContents = async () => {\n    if (!this.client) {\n      throw new Error('WebDAV client not initialized');\n    }\n\n    try {\n      return await this.client.getDirectoryContents(this.baseDirPath);\n    } catch (error) {\n      logger.error('Error getting directory contents on WebDAV:', error as Error);\n      throw error;\n    }\n  };\n\n  public checkConnection = async (): Promise<boolean> => {\n    if (!this.client) {\n      throw new Error('WebDAV client not initialized');\n    }\n\n    try {\n      return await this.client.exists('/');\n    } catch (error) {\n      logger.error('Error checking connection:', error as Error);\n      throw error;\n    }\n  };\n\n  public createDirectory = async (path: string, options?: CreateDirectoryOptions) => {\n    if (!this.client) {\n      throw new Error('WebDAV client not initialized');\n    }\n\n    try {\n      return await this.client.createDirectory(path, options);\n    } catch (error) {\n      logger.error('Error creating directory on WebDAV:', error as Error);\n      throw error;\n    }\n  };\n\n  public deleteFile = async (filename: string): Promise<void> => {\n    if (!this.client) {\n      throw new Error('WebDAV client not initialized');\n    }\n\n    const remoteFilePath = posix.join(this.baseDirPath, filename);\n\n    try {\n      return await this.client.deleteFile(remoteFilePath);\n    } catch (error) {\n      logger.error('Error deleting file on WebDAV:', error as Error);\n      throw error;\n    }\n  };\n\n  public disconnect(): void {\n    this.client = null;\n  }\n}\n"
  },
  {
    "path": "src/main/services/StorageService/index.ts",
    "content": "export * from './ICloudStorage';\nexport * from './WebdavStorage';\n"
  },
  {
    "path": "src/main/services/ThemeService.ts",
    "content": "import { configManager } from '@main/services/ConfigManager';\nimport { dbService } from '@main/services/DbService';\nimport { windowService } from '@main/services/WindowService';\nimport { titleBarOverlayDark, titleBarOverlayLight } from '@shared/config/appinfo';\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport type { ITheme } from '@shared/config/theme';\nimport { THEME } from '@shared/config/theme';\nimport { nativeTheme } from 'electron';\n\nexport class ThemeService {\n  private static instance: ThemeService;\n  private theme: ITheme = THEME.SYSTEM;\n\n  constructor() {\n    // Private constructor to prevent direct instantiation\n  }\n\n  public static async getInstance(): Promise<ThemeService> {\n    if (!ThemeService.instance) {\n      ThemeService.instance = new ThemeService();\n      ThemeService.instance.init();\n    }\n    return ThemeService.instance;\n  }\n\n  private init() {\n    this.theme = configManager.theme || THEME.SYSTEM;\n\n    if (this.theme === THEME.DARK || this.theme === THEME.LIGHT || this.theme === THEME.SYSTEM) {\n      nativeTheme.themeSource = this.theme;\n    }\n\n    nativeTheme.on('updated', this.themeUpdatedHandler.bind(this));\n  }\n\n  private themeUpdatedHandler() {\n    windowService.getAllWindows().forEach((win) => {\n      if (win && !win.isDestroyed() && win.setTitleBarOverlay) {\n        try {\n          win.setTitleBarOverlay(nativeTheme.shouldUseDarkColors ? titleBarOverlayDark : titleBarOverlayLight);\n        } catch {\n          // don't throw error if setTitleBarOverlay failed\n          // Because it may be called with some windows have some title bar\n        }\n      }\n      win.webContents.send(IPC_CHANNEL.THEME_UPDATED, nativeTheme.shouldUseDarkColors ? THEME.DARK : THEME.LIGHT);\n    });\n  }\n\n  public async setTheme(theme: ITheme) {\n    if (theme === this.theme) {\n      return;\n    }\n\n    this.theme = theme;\n    nativeTheme.themeSource = theme;\n\n    await dbService.setting.update({ key: 'theme', value: theme });\n  }\n}\n\nexport const themeService = ThemeService.getInstance();\n"
  },
  {
    "path": "src/main/services/TrayService.ts",
    "content": "import { t } from '@main/services/AppLocale';\nimport { APP_STORE_PATH } from '@main/utils/path';\nimport { isLinux, isMacOS, isWindows } from '@main/utils/systeminfo';\nimport { APP_NAME, APP_VERSION, DOCUMENT_URL, ISSUE_URL, WEBSITE_URL } from '@shared/config/appinfo';\nimport { WINDOW_NAME } from '@shared/config/window';\nimport { isNil } from '@shared/modules/validate';\nimport type { MenuItemConstructorOptions } from 'electron';\nimport { Menu, nativeImage, nativeTheme, shell, Tray } from 'electron';\n\nimport icon from '../../../build/tray_icon.png?asset';\nimport iconDark from '../../../build/tray_icon_dark.png?asset';\nimport iconLight from '../../../build/tray_icon_light.png?asset';\nimport { windowService } from './WindowService';\n\nclass TrayService {\n  private static instance: TrayService;\n  private tray: Tray | null = null;\n  private contextMenu: Menu | null = null;\n\n  constructor() {}\n\n  public static getInstance(): TrayService {\n    if (!TrayService.instance) {\n      TrayService.instance = new TrayService();\n    }\n    return TrayService.instance;\n  }\n\n  private createTray() {\n    this.destroyTray();\n\n    const iconPath = isMacOS ? (nativeTheme.shouldUseDarkColors ? iconLight : iconDark) : icon;\n\n    const tray = new Tray(iconPath);\n\n    if (isWindows) {\n      tray.setImage(iconPath);\n    } else if (isMacOS) {\n      const image = nativeImage.createFromPath(iconPath);\n      const resizedImage = image.resize({ width: 16, height: 16 });\n      resizedImage.setTemplateImage(true);\n      tray.setImage(resizedImage);\n    } else if (isLinux) {\n      const image = nativeImage.createFromPath(iconPath);\n      const resizedImage = image.resize({ width: 16, height: 16 });\n      tray.setImage(resizedImage);\n    }\n\n    this.tray = tray;\n\n    this.updateContextMenu();\n\n    this.tray.setToolTip(APP_NAME);\n\n    // only windows and macos support right-click event and popUpContextMenu\n    if (isLinux) {\n      this.tray.setContextMenu(this.contextMenu);\n    } else {\n      this.tray.on('right-click', () => {\n        if (this.contextMenu) {\n          this.tray?.popUpContextMenu(this.contextMenu);\n        }\n      });\n    }\n\n    this.tray.on('click', () => {\n      windowService.showAllWindows();\n    });\n  }\n\n  private updateContextMenu() {\n    const template = [\n      {\n        label: t('system.tray.open', { name: APP_NAME }),\n        click: () => windowService.showAllWindows(),\n      },\n      {\n        label: t('system.tray.version', { version: APP_VERSION }),\n        enabled: false,\n      },\n      { type: 'separator' },\n      {\n        label: t('system.tray.website'),\n        click: () => shell.openExternal(WEBSITE_URL),\n      },\n      {\n        label: t('system.tray.document'),\n        click: () => shell.openExternal(DOCUMENT_URL),\n      },\n      {\n        label: t('system.tray.reportIssue'),\n        click: () => shell.openExternal(ISSUE_URL),\n      },\n      { type: 'separator' },\n      {\n        label: t('system.tray.openData'),\n        click: () => shell.openPath(APP_STORE_PATH),\n      },\n      // { label: t('system.view.toggleDevTools'), role: 'toggleDevTools' },\n      {\n        label: t('system.view.toggleDevTools'),\n        click() {\n          [WINDOW_NAME.MAIN, WINDOW_NAME.PLAYER, WINDOW_NAME.BROWSER].forEach((name) => {\n            const win = windowService.getWindow(name);\n            if (isNil(win) || !win?.isDestroyed) return;\n\n            win?.webContents?.toggleDevTools();\n          });\n        },\n      },\n      { type: 'separator' },\n      { label: t('system.app.quit', { name: APP_NAME }), role: 'quit' },\n    ].filter(Boolean) as MenuItemConstructorOptions[];\n\n    this.contextMenu = Menu.buildFromTemplate(template);\n  }\n\n  public updateTray(showTray: boolean = false) {\n    if (showTray) {\n      if (!this.tray) {\n        this.createTray();\n      } else {\n        this.updateContextMenu();\n        if (isLinux) {\n          this.tray.setContextMenu(this.contextMenu);\n        }\n      }\n    } else {\n      this.destroyTray();\n    }\n  }\n\n  private destroyTray() {\n    if (this.tray) {\n      this.tray.destroy();\n      this.tray = null;\n    }\n  }\n}\n\nexport const trayService = TrayService.getInstance();\n"
  },
  {
    "path": "src/main/services/WebviewService.ts",
    "content": "import { appLocale } from '@main/services/AppLocale';\nimport { configManager } from '@main/services/ConfigManager';\nimport { generateUserAgent } from '@main/utils/systeminfo';\nimport { session } from 'electron';\n\n/**\n * init the useragent of the webview session\n * remove the zyfun and Electron from the useragent\n */\nexport function initSessionUserAgent() {\n  const wvSession = session.fromPartition('persist:webview');\n  // const originUA = wvSession.getUserAgent();\n  const defaultUA = generateUserAgent();\n\n  wvSession.setUserAgent(defaultUA);\n  wvSession.webRequest.onBeforeSendHeaders((details, cb) => {\n    const ua = configManager.ua;\n    const language = appLocale.defaultLang();\n\n    const headers = {\n      ...details.requestHeaders,\n      'User-Agent': ua,\n      'Accept-Language': `${language}, en;q=0.9, *;q=0.5`,\n    };\n    cb({ requestHeaders: headers });\n  });\n}\n"
  },
  {
    "path": "src/main/services/WindowService.ts",
    "content": "import { join } from 'node:path';\n\nimport { loggerService } from '@logger';\nimport { appLocale } from '@main/services/AppLocale';\nimport { configManager } from '@main/services/ConfigManager';\nimport { APP_DATABASE_PATH, APP_FILE_PATH } from '@main/utils/path';\nimport { isDev, isLinux, isMacOS, isMacOSTahoe, isPackaged, isWindows, isWindows22H2 } from '@main/utils/systeminfo';\nimport { titleBarOverlayDark, titleBarOverlayLight } from '@shared/config/appinfo';\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport type { ISize } from '@shared/config/window';\nimport { WINDOW_NAME, WINDOW_SIZE } from '@shared/config/window';\nimport { convertUriToStandard, ELECTRON_TAG, isLocalhostURI, UNSAFE_HEADERS } from '@shared/modules/headers';\nimport { isPositiveFiniteNumber, isUndefined } from '@shared/modules/validate';\nimport type { BrowserWindowConstructorOptions } from 'electron';\nimport { app, BrowserWindow, ipcMain, nativeImage, nativeTheme, shell } from 'electron';\nimport windowStateKeeper from 'electron-window-state';\nimport { merge } from 'es-toolkit';\n\nimport iconPath from '../../../build/icon.png?asset';\nimport { contextMenu } from './ContextMenu';\nimport { initSessionUserAgent } from './WebviewService';\n\nconst logger = loggerService.withContext(LOG_MODULE.APP_WINDOW);\n\nconst linuxIcon = isLinux ? nativeImage.createFromPath(iconPath) : undefined;\n\nexport class WindowService {\n  private static instance: WindowService | null = null;\n  private winPool = new Map<string, { window: BrowserWindow | null; lastCrashTime: number }>();\n\n  public static getInstance(): WindowService {\n    if (!WindowService.instance) {\n      WindowService.instance = new WindowService();\n    }\n    return WindowService.instance;\n  }\n\n  public computedSize(size: number): number {\n    return Math.ceil(size * configManager.zoom);\n  }\n\n  public getWindowSize(name: string, type: 'default' | 'min' = 'default', computed: boolean = true): ISize {\n    const config = WINDOW_SIZE[name] ?? WINDOW_SIZE[WINDOW_NAME.OTHER];\n    const size = config[type];\n\n    if (!computed) return { ...size };\n\n    return {\n      width: this.computedSize(size.width),\n      height: this.computedSize(size.height),\n    };\n  }\n\n  public getAllNames(): string[] {\n    return [...this.winPool.keys()];\n  }\n\n  public getAllWindows(): BrowserWindow[] {\n    return Array.from(this.winPool.values(), (item) => item.window!).filter((win) => win instanceof BrowserWindow);\n  }\n\n  public getWindowName(mainWindow: BrowserWindow): string | null {\n    for (const [name, item] of this.winPool.entries()) {\n      if (item.window === mainWindow) {\n        return name;\n      }\n    }\n\n    return null;\n  }\n\n  public getWindow(window: string | BrowserWindow): BrowserWindow | null {\n    if (typeof window === 'string') {\n      if (this.winPool.has(window)) {\n        return this.winPool.get(window)?.window as BrowserWindow;\n      }\n    } else if (typeof window === 'object' && window instanceof BrowserWindow) {\n      return window;\n    }\n\n    return null;\n  }\n\n  public setZoomWindow(window: string | BrowserWindow, zoom: number) {\n    if (!isPositiveFiniteNumber(zoom)) {\n      return;\n    }\n\n    const mainWindow = this.getWindow(window);\n\n    if (!mainWindow || mainWindow.isDestroyed()) {\n      return;\n    }\n\n    const newZoom = Math.min(Math.max(Number(zoom.toFixed(1)), 0.5), 2.0);\n\n    const currentZoom = mainWindow.webContents.getZoomFactor();\n    if (Math.abs(newZoom - currentZoom) < 0.01) return;\n\n    const windowName = this.getWindowName(mainWindow)!;\n\n    const [currentWidth, currentHeight] = mainWindow.getSize();\n    const baseWidth = currentWidth / currentZoom;\n    const baseHeight = currentHeight / currentZoom;\n\n    const calculatedSize = {\n      width: Math.round(baseWidth * newZoom),\n      height: Math.round(baseHeight * newZoom),\n    };\n\n    const minConfSize = this.getWindowSize(windowName, 'min', false);\n    const minSize = {\n      width: Math.round(minConfSize.width * newZoom),\n      height: Math.round(minConfSize.height * newZoom),\n    };\n\n    const defaultConfSize = this.getWindowSize(windowName, 'default', false);\n    const defaultSize = {\n      width: Math.round(defaultConfSize.width * newZoom),\n      height: Math.round(defaultConfSize.height * newZoom),\n    };\n\n    const finalSize = {\n      width: calculatedSize.width < minSize.width ? defaultSize.width : calculatedSize.width,\n      height: calculatedSize.height < minSize.height ? defaultSize.height : calculatedSize.height,\n    };\n\n    mainWindow.setMinimumSize(minSize.width, minSize.height);\n    mainWindow.setSize(finalSize.width, finalSize.height);\n    mainWindow.webContents.setZoomFactor(newZoom);\n  }\n\n  public setZoomWindows(zoom: number) {\n    const windows = this.getAllWindows();\n    windows.forEach((win) => this.setZoomWindow(win, zoom));\n  }\n\n  public showWindow(window: string | BrowserWindow) {\n    const mainWindow = this.getWindow(window);\n\n    if (!mainWindow || mainWindow.isDestroyed()) {\n      return;\n    }\n\n    if (mainWindow.isMinimized()) {\n      mainWindow.restore();\n    }\n\n    if (isWindows) {\n      mainWindow.setOpacity(1);\n    }\n\n    /**\n     * [Linux] Special handling for window activation\n     * When the window is visible but covered by other windows, simply calling show() and focus()\n     * is not enough to bring it to the front. We need to hide it first, then show it again.\n     * This mimics the \"close to tray and reopen\" behavior which works correctly.\n     */\n    if (isLinux && mainWindow.isVisible() && !mainWindow.isFocused()) {\n      mainWindow.hide();\n      setImmediate(() => {\n        if (mainWindow && !mainWindow.isDestroyed()) {\n          mainWindow.show();\n          mainWindow.focus();\n        }\n      });\n      return;\n    }\n\n    /**\n     * About setVisibleOnAllWorkspaces\n     *\n     * [macOS] Known Issue\n     *  setVisibleOnAllWorkspaces true/false will NOT bring window to current desktop in Mac (works fine with Windows)\n     *  AppleScript may be a solution, but it's not worth\n     *\n     * [Linux] Known Issue\n     *  setVisibleOnAllWorkspaces In Linux environments (especially KDE Wayland) this can cause windows to go into a \"false popup\" state\n     */\n    if (!isLinux) {\n      mainWindow.setVisibleOnAllWorkspaces(true);\n    }\n\n    /**\n     * [macOS] After being closed in fullscreen, the fullscreen behavior will become strange when window shows again\n     * So we need to set it to FALSE explicitly.\n     * althougle other platforms don't have the issue, but it's a good practice to do so\n     *\n     *  Check if window is visible to prevent interrupting fullscreen state when clicking dock icon\n     */\n    if (mainWindow.isFullScreen() && !mainWindow.isVisible()) {\n      mainWindow.setFullScreen(false);\n    }\n\n    mainWindow.webContents.setAudioMuted(false);\n    mainWindow.show();\n    mainWindow.focus();\n\n    if (!isLinux) {\n      mainWindow.setVisibleOnAllWorkspaces(false);\n    }\n  }\n\n  public showAllWindows() {\n    const windows = this.getAllWindows();\n    windows.forEach((win) => this.showWindow(win));\n  }\n\n  public hideWindow(window: string | BrowserWindow) {\n    const mainWindow = this.getWindow(window);\n\n    if (!mainWindow || mainWindow.isDestroyed()) {\n      return;\n    }\n\n    mainWindow.webContents.setAudioMuted(true);\n\n    // [macOs/Windows] hacky fix\n    // previous window(not self-app) should be focused again after miniWindow hide\n    // this workaround is to make previous window focused again after miniWindow hide\n    if (isWindows) {\n      mainWindow.setOpacity(0); // don't show the minimizing animation\n      mainWindow.minimize();\n      return;\n    } else if (isMacOS) {\n      mainWindow.hide();\n      app.hide();\n      return;\n    }\n\n    mainWindow.hide();\n  }\n\n  public hideAllWindows() {\n    const windows = this.getAllWindows();\n    windows.forEach((win) => this.hideWindow(win));\n  }\n\n  public toggleWindow(window: string | BrowserWindow) {\n    const mainWindow = this.getWindow(window);\n\n    if (!mainWindow || mainWindow.isDestroyed()) {\n      return;\n    }\n\n    // should not toggle main window when in full screen\n    // but if the main window is close to tray when it's in full screen, we can show it again\n    // (it's a bug in macos, because we can close the window when it's in full screen, and the state will be remained)\n    // if (mainWindow?.isFullScreen() && mainWindow.isVisible()) {\n    //   return;\n    // }\n\n    mainWindow.isVisible() ? this.hideWindow(mainWindow) : this.showWindow(mainWindow);\n  }\n\n  public toggleAllWindows() {\n    const windows = this.getAllWindows();\n    const isVisable = windows.some((win) => win.isVisible());\n\n    windows.forEach((win) => {\n      isVisable ? this.hideWindow(win) : this.showWindow(win);\n    });\n  }\n\n  public closeWindow(window: string | BrowserWindow) {\n    const mainWindow = this.getWindow(window);\n    const mainWindowName = this.getWindowName(mainWindow!);\n\n    if (mainWindow && !mainWindow.isDestroyed()) {\n      try {\n        mainWindow.close();\n      } catch {\n        mainWindow.destroy();\n      }\n    }\n\n    if (mainWindowName) {\n      this.winPool.delete(mainWindowName);\n    }\n  }\n\n  public closeAllWindows = () => {\n    const windows = this.getAllWindows();\n    windows.forEach((win) => this.closeWindow(win));\n    this.winPool.clear();\n  };\n\n  public reloadWindow(window: string | BrowserWindow, force: boolean = false) {\n    const mainWindow = this.getWindow(window);\n\n    if (mainWindow && !mainWindow.isDestroyed()) {\n      force ? mainWindow.webContents.reloadIgnoringCache() : mainWindow.webContents.reload();\n    }\n  }\n\n  public reloadAllWindows(force: boolean = false) {\n    const windows = this.getAllWindows();\n    windows.forEach((win) => this.reloadWindow(win, force));\n  }\n\n  private safeClose(mainWindow: BrowserWindow) {\n    const finish = () => {\n      ipcMain.removeListener(IPC_CHANNEL.WINDOW_DESTROY_RELAY, onAck);\n      if (mainWindow && !mainWindow.isDestroyed()) mainWindow.destroy();\n    };\n\n    const onAck = () => {\n      if (timer) clearTimeout(timer);\n      finish();\n    };\n\n    const timer = setTimeout(onAck, 800);\n\n    ipcMain.once(IPC_CHANNEL.WINDOW_DESTROY_RELAY, onAck);\n    mainWindow.webContents.send(IPC_CHANNEL.WINDOW_DESTROY);\n  }\n\n  private setupWindowMonitor(mainWindow: BrowserWindow) {\n    mainWindow.webContents.on('render-process-gone', (_, details) => {\n      logger.error(`Renderer process crashed with: ${JSON.stringify(details)}`);\n      const currentTime = Date.now();\n      const mainWindowName = this.getWindowName(mainWindow)!;\n      const lastCrashTime = this.winPool.get(mainWindowName)?.lastCrashTime || 0;\n      this.winPool.set(mainWindowName, { window: mainWindow, lastCrashTime });\n      if (currentTime - lastCrashTime > 60 * 1000) {\n        // If greater than 1 minute, restart the rendering process\n        mainWindow.webContents.reload();\n      } else {\n        // If less than 1 minute, exit the application\n        app.exit(1);\n      }\n    });\n  }\n\n  private setupContextMenu(mainWindow: BrowserWindow) {\n    contextMenu.contextMenu(mainWindow.webContents);\n    // setup context menu for all webviews\n    app.on('web-contents-created', (_, webContents) => {\n      contextMenu.contextMenu(webContents);\n    });\n\n    // Dangerous API\n    if (isDev) {\n      // mainWindow.webContents.on('will-attach-webview', (_, webPreferences) => {\n      //   webPreferences.preload = join(import.meta.dirname, '../preload/index.js');\n      // });\n    }\n  }\n\n  private setupWindowEvents(mainWindow: BrowserWindow) {\n    mainWindow.once('ready-to-show', () => {\n      mainWindow.webContents.setZoomFactor(configManager.zoom);\n\n      // [mac]hacky-fix: miniWindow set visibleOnFullScreen:true will cause dock icon disappeared\n      app.dock?.show();\n      mainWindow.show();\n    });\n\n    // set the zoom factor again when the window is going to resize\n    //\n    // this is a workaround for the known bug that\n    // the zoom factor is reset to cached value when window is resized after routing to other page\n    // see: https://github.com/electron/electron/issues/10572\n    //\n    mainWindow.on('will-resize', () => {\n      mainWindow.webContents.setZoomFactor(configManager.zoom);\n      mainWindow.webContents.send(IPC_CHANNEL.WINDOW_SIZE, mainWindow.getSize());\n    });\n\n    // set the zoom factor again when the window is going to restore\n    // minimize and restore will cause zoom reset\n    mainWindow.on('restore', () => {\n      mainWindow.webContents.setZoomFactor(configManager.zoom);\n    });\n\n    // ARCH: as `will-resize` is only for Win & Mac,\n    // linux has the same problem, use `resize` listener instead\n    // but `resize` will fliker the ui\n    if (isLinux) {\n      mainWindow.on('resize', () => {\n        mainWindow.webContents.setZoomFactor(configManager.zoom);\n        mainWindow.webContents.send(IPC_CHANNEL.WINDOW_SIZE, mainWindow.getSize());\n      });\n    }\n\n    mainWindow.on('maximize', () => {\n      mainWindow.webContents.send(IPC_CHANNEL.WINDOW_MAX, mainWindow.isMaximized());\n    });\n\n    mainWindow.on('unmaximize', () => {\n      mainWindow.webContents.send(IPC_CHANNEL.WINDOW_MAX, mainWindow.isMaximized());\n    });\n\n    mainWindow.on('enter-full-screen', () => {\n      mainWindow.webContents.send(IPC_CHANNEL.WINDOW_FULLSCREEN, mainWindow.isFullScreen());\n    });\n\n    mainWindow.on('leave-full-screen', () => {\n      mainWindow.webContents.send(IPC_CHANNEL.WINDOW_FULLSCREEN, mainWindow.isFullScreen());\n    });\n  }\n\n  private setupWebContentsHandlers(mainWindow: BrowserWindow) {\n    mainWindow.webContents.on('will-navigate', (event, url) => {\n      if (url.includes('localhost:5173')) {\n        return;\n      }\n\n      event.preventDefault();\n      shell.openExternal(url);\n    });\n\n    mainWindow.webContents.setWindowOpenHandler((details) => {\n      const { url } = details;\n\n      const oauthProviderUrls = ['github.com', 'catni.cn', 'pagespy.org'];\n\n      if (oauthProviderUrls.some((link) => url.includes(link))) {\n        return {\n          action: 'allow',\n          overrideBrowserWindowOptions: {\n            webPreferences: {\n              partition: 'persist:webview',\n            },\n          },\n        };\n      }\n\n      if (url.includes('http://file/')) {\n        const fileName = url.replace('http://file/', '');\n        const filePath = `${APP_FILE_PATH}/${fileName}`;\n        shell.openPath(filePath).catch((error) => logger.error('Failed to open file:', error));\n      } else {\n        // mainWindow.webContents.send(IPC_CHANNEL.URI_BLOCKED, url);\n        // shell.openExternal(details.url);\n\n        let window = this.getWindow(WINDOW_NAME.BROWSER);\n        if (window && !window.isDestroyed()) {\n          this.showWindow(window);\n          window.webContents.send(IPC_CHANNEL.BROWSER_NAVIGATE, url);\n        } else {\n          window = this.createBrowserWindow();\n          window.webContents.once('did-finish-load', () => {\n            setTimeout(() => {\n              window!.webContents.send(IPC_CHANNEL.BROWSER_NAVIGATE, url);\n            }, 1000);\n          });\n        }\n      }\n\n      return { action: 'deny' };\n    });\n\n    this.setupWebRequestHeaders(mainWindow);\n  }\n\n  private setupWebRequestHeaders(mainWindow: BrowserWindow) {\n    const reqMap = new Map<number, { redirect: string; headers: Record<string, any> }>();\n\n    mainWindow.webContents.session.webRequest.onBeforeRequest({ urls: ['*://*/*'] }, (details, callback) => {\n      const { id, url } = details;\n\n      // Block devtools detector requests\n      if (['devtools-detector', 'disable-devtool'].some((f) => url.includes(f))) {\n        callback({ cancel: true });\n        return;\n      }\n\n      const { redirect, headers } = convertUriToStandard(url);\n      if (headers && Object.keys(headers).length && url !== redirect) {\n        reqMap.set(id, { redirect, headers });\n        callback({ cancel: false, redirectURL: redirect });\n      } else {\n        callback({ cancel: false });\n      }\n    });\n\n    mainWindow.webContents.session.webRequest.onBeforeSendHeaders((details, callback) => {\n      const { id, requestHeaders, url } = details;\n      const customHeaders = reqMap.has(id) ? reqMap.get(id)!.headers : {};\n      if (reqMap.has(id)) reqMap.delete(id);\n\n      UNSAFE_HEADERS.forEach((key) => {\n        requestHeaders[key] = !isUndefined(customHeaders[key])\n          ? customHeaders[key]\n          : !isUndefined(requestHeaders[`${ELECTRON_TAG}-${key}`])\n            ? requestHeaders[`${ELECTRON_TAG}-${key}`]\n            : requestHeaders[key];\n        delete requestHeaders[`${ELECTRON_TAG}-${key}`];\n\n        if (key === 'User-Agent' && requestHeaders[key]?.includes(ELECTRON_TAG)) {\n          requestHeaders[key] = configManager.ua;\n        }\n\n        if (isUndefined(requestHeaders[key]) || isLocalhostURI(requestHeaders[key])) {\n          delete requestHeaders[key];\n        }\n      });\n\n      // Accept-Language\n      const language = appLocale.defaultLang();\n      requestHeaders['Accept-Language'] = `${language}, en;q=0.9, *;q=0.5`;\n\n      // Custom Header\n      if (url.includes('doubanio.com') && !requestHeaders.Referer) {\n        requestHeaders.Referer = 'https://api.douban.com/';\n      }\n\n      // Handle redirect mode\n      if (requestHeaders.Redirect === 'manual') reqMap.set(id, { redirect: url, headers: requestHeaders });\n\n      callback({ requestHeaders });\n    });\n\n    mainWindow.webContents.session.webRequest.onHeadersReceived({ urls: ['*://*/*'] }, (details, callback) => {\n      const { id, responseHeaders } = details;\n\n      // Frame\n      ['X-Frame-Options', 'x-frame-options'].forEach((key) => delete responseHeaders?.[key]);\n\n      // Content-Security-Policy\n      ['Content-Security-Policy', 'content-security-policy'].forEach((key) => delete responseHeaders?.[key]);\n\n      // Set-Cookie\n      ['Set-Cookie', 'set-cookie'].forEach((key) => {\n        if (responseHeaders?.[key]) {\n          responseHeaders[key] = responseHeaders![key].map((ck) => `${ck}; SameSite=None; Secure`);\n        }\n      });\n\n      if (reqMap.has(id)) reqMap.delete(id);\n\n      callback({ cancel: false, responseHeaders });\n    });\n  }\n\n  // see: https://github.com/electron/electron/issues/42055#issuecomment-2449365647\n  private replaceDevtoolsFont = (mainWindow: BrowserWindow) => {\n    // only for windows and dev, don't do this in production to avoid performance issues\n    if (isWindows && isDev) {\n      mainWindow.webContents.on('devtools-opened', () => {\n        const css = `\n          :root {\n            --sys-color-base: var(--ref-palette-neutral100);\n            --source-code-font-family: consolas !important;\n            --source-code-font-size: 12px;\n            --monospace-font-family: consolas !important;\n            --monospace-font-size: 12px;\n            --default-font-family: system-ui, sans-serif;\n            --default-font-size: 12px;\n            --ref-palette-neutral99: #ffffffff;\n          }\n          .theme-with-dark-background {\n            --sys-color-base: var(--ref-palette-secondary25);\n          }\n          body {\n            --default-font-family: system-ui, sans-serif;\n          }\n      `;\n        mainWindow.webContents.devToolsWebContents?.executeJavaScript(`\n          const overriddenStyle = document.createElement('style');\n          overriddenStyle.innerHTML = '${css.replaceAll('\\n', ' ')}';\n          document.body.append(overriddenStyle);\n          document.querySelectorAll('.platform-windows').forEach(el => el.classList.remove('platform-windows'));\n          addStyleToAutoComplete();\n          const observer = new MutationObserver((mutationList, observer) => {\n            for (const mutation of mutationList) {\n              if (mutation.type === 'childList') {\n                for (let i = 0; i < mutation.addedNodes.length; i++) {\n                  const item = mutation.addedNodes[i];\n                  if (item.classList.contains('editor-tooltip-host')) {\n                      addStyleToAutoComplete();\n                  }\n                }\n              }\n            }\n          });\n          observer.observe(document.body, {childList: true});\n          function addStyleToAutoComplete() {\n            document.querySelectorAll('.editor-tooltip-host').forEach(element => {\n              if (element.shadowRoot.querySelectorAll('[data-key=\"overridden-dev-tools-font\"]').length === 0) {\n                const overriddenStyle = document.createElement('style');\n                overriddenStyle.setAttribute('data-key', 'overridden-dev-tools-font');\n                overriddenStyle.innerHTML = '.cm-tooltip-autocomplete ul[role=listbox] {font-family: consolas !important;}';\n                element.shadowRoot.append(overriddenStyle);\n              }\n            });\n          }\n      `);\n      });\n    }\n  };\n\n  public createWindow(windowName: string, options?: BrowserWindowConstructorOptions): BrowserWindow {\n    let mainWindow = this.getWindow(windowName);\n\n    if (mainWindow && !mainWindow.isDestroyed()) {\n      mainWindow.show();\n      mainWindow.focus();\n      return mainWindow;\n    }\n\n    mainWindow = new BrowserWindow(\n      merge(\n        {\n          width: WINDOW_SIZE[WINDOW_NAME.OTHER].default.width,\n          height: WINDOW_SIZE[WINDOW_NAME.OTHER].default.height,\n          show: false,\n          autoHideMenuBar: true,\n          transparent: false,\n          ...(isLinux ? { icon: linuxIcon } : {}),\n          webPreferences: {\n            allowRunningInsecureContent: true,\n            backgroundThrottling: false,\n            contextIsolation: true,\n            nodeIntegration: false,\n            preload: join(import.meta.dirname, '../preload/index.js'),\n            sandbox: false,\n            spellcheck: false,\n            webSecurity: false,\n            zoomFactor: configManager.zoom,\n          },\n        },\n        options || {},\n      ),\n    );\n\n    this.replaceDevtoolsFont(mainWindow);\n    this.setupContextMenu(mainWindow);\n    this.setupWindowMonitor(mainWindow);\n\n    mainWindow.on('closed', () => {\n      this.winPool.delete(windowName);\n\n      if (app.isQuitting && this.getAllWindows().length === 0) {\n        app.quit();\n      }\n    });\n\n    this.winPool.set(windowName, { window: mainWindow, lastCrashTime: 0 });\n\n    return mainWindow;\n  }\n\n  public createMainWindow(): BrowserWindow {\n    const windowName = WINDOW_NAME.MAIN;\n\n    const mainWindowState = windowStateKeeper({\n      path: APP_DATABASE_PATH,\n      file: `${windowName}-window-state.json`,\n      defaultWidth: this.getWindowSize(windowName, 'default').width,\n      defaultHeight: this.getWindowSize(windowName, 'default').height,\n      fullScreen: false,\n      maximize: false,\n    });\n\n    const mainWindow = this.createWindow(windowName, {\n      x: mainWindowState.x,\n      y: mainWindowState.y,\n      width: mainWindowState.width,\n      height: mainWindowState.height,\n      minWidth: this.getWindowSize(windowName, 'min').width,\n      minHeight: this.getWindowSize(windowName, 'min').height,\n      show: false,\n      autoHideMenuBar: true,\n      transparent: false,\n      vibrancy: 'sidebar',\n      visualEffectState: 'active',\n      // For Windows and Linux, we use frameless window with custom controls\n      // For Mac, we keep the native title bar style\n      ...(isMacOS\n        ? {\n            titleBarStyle: 'hidden',\n            titleBarOverlay: nativeTheme.shouldUseDarkColors ? titleBarOverlayDark : titleBarOverlayLight,\n            trafficLightPosition: isMacOSTahoe ? { x: 8, y: 14 } : { x: 12, y: 14 },\n          }\n        : {\n            frame: false, // Frameless window for Windows and Linux\n          }),\n      ...(isWindows22H2 ? { backgroundMaterial: 'mica' } : {}),\n      ...(!isMacOS && !isWindows22H2\n        ? { backgroundColor: nativeTheme.shouldUseDarkColors ? '#181818' : '#FFFFFF' }\n        : {}),\n      darkTheme: nativeTheme.shouldUseDarkColors,\n      webPreferences: {\n        webviewTag: true,\n      },\n    });\n\n    mainWindowState.manage(mainWindow);\n\n    this.setupWindowEvents(mainWindow);\n    this.setupWebContentsHandlers(mainWindow);\n\n    if (!isPackaged && process.env.ELECTRON_RENDERER_URL) {\n      mainWindow.loadURL(process.env.ELECTRON_RENDERER_URL);\n    } else {\n      mainWindow.loadFile(join(import.meta.dirname, '../renderer/index.html'));\n    }\n\n    // init webview useragent\n    initSessionUserAgent();\n\n    return mainWindow;\n  }\n\n  public createPlayerWindow(): BrowserWindow {\n    const windowName = WINDOW_NAME.PLAYER;\n\n    const mainWindowState = windowStateKeeper({\n      path: APP_DATABASE_PATH,\n      file: `${windowName}-window-state.json`,\n      defaultWidth: this.getWindowSize(windowName, 'default').width,\n      defaultHeight: this.getWindowSize(windowName, 'default').height,\n      fullScreen: false,\n      maximize: false,\n    });\n\n    const mainWindow = this.createWindow(windowName, {\n      x: mainWindowState.x,\n      y: mainWindowState.y,\n      width: mainWindowState.width,\n      height: mainWindowState.height,\n      minWidth: this.getWindowSize(windowName, 'min').width,\n      minHeight: this.getWindowSize(windowName, 'min').height,\n      show: false,\n      autoHideMenuBar: true,\n      transparent: false,\n      vibrancy: 'sidebar',\n      visualEffectState: 'active',\n      // For Windows and Linux, we use frameless window with custom controls\n      // For Mac, we keep the native title bar style\n      ...(isMacOS\n        ? {\n            titleBarStyle: 'hidden',\n            titleBarOverlay: nativeTheme.shouldUseDarkColors ? titleBarOverlayDark : titleBarOverlayLight,\n            trafficLightPosition: isMacOSTahoe ? { x: 8, y: 14 } : { x: 12, y: 14 },\n          }\n        : {\n            frame: false, // Frameless window for Windows and Linux\n          }),\n      ...(isWindows22H2 ? { backgroundMaterial: 'mica' } : {}),\n      ...(!isMacOS && !isWindows22H2\n        ? { backgroundColor: nativeTheme.shouldUseDarkColors ? '#181818' : '#FFFFFF' }\n        : {}),\n      darkTheme: nativeTheme.shouldUseDarkColors,\n    });\n\n    mainWindowState.manage(mainWindow);\n\n    this.setupWindowEvents(mainWindow);\n    this.setupWebContentsHandlers(mainWindow);\n\n    mainWindow.on('close', (event: Electron.Event) => {\n      event.preventDefault();\n      this.safeClose(mainWindow);\n\n      if (!app.isQuitting) {\n        const window = this.getWindow(WINDOW_NAME.MAIN);\n        if (window && !window.isDestroyed()) {\n          this.showWindow(window);\n        } else {\n          this.createMainWindow();\n        }\n      }\n    });\n\n    if (!isPackaged && process.env.ELECTRON_RENDERER_URL) {\n      mainWindow.loadURL(`${process.env.ELECTRON_RENDERER_URL}/#/player`);\n    } else {\n      mainWindow.loadFile(join(import.meta.dirname, '../renderer/index.html'), { hash: 'player' });\n    }\n    return mainWindow;\n  }\n\n  public createBrowserWindow(): BrowserWindow {\n    const windowName = WINDOW_NAME.BROWSER;\n\n    const mainWindowState = windowStateKeeper({\n      path: APP_DATABASE_PATH,\n      file: `${windowName}-window-state.json`,\n      defaultWidth: this.getWindowSize(windowName, 'default').width,\n      defaultHeight: this.getWindowSize(windowName, 'default').height,\n      fullScreen: false,\n      maximize: false,\n    });\n\n    const mainWindow = this.createWindow(windowName, {\n      x: mainWindowState.x,\n      y: mainWindowState.y,\n      width: mainWindowState.width,\n      height: mainWindowState.height,\n      minWidth: this.getWindowSize(windowName, 'min').width,\n      minHeight: this.getWindowSize(windowName, 'min').height,\n      show: false,\n      autoHideMenuBar: true,\n      transparent: false,\n      vibrancy: 'sidebar',\n      visualEffectState: 'active',\n      // For Windows and Linux, we use frameless window with custom controls\n      // For Mac, we keep the native title bar style\n      ...(isMacOS\n        ? {\n            titleBarStyle: 'hidden',\n            titleBarOverlay: nativeTheme.shouldUseDarkColors ? titleBarOverlayDark : titleBarOverlayLight,\n            trafficLightPosition: isMacOSTahoe ? { x: 8, y: 14 } : { x: 12, y: 14 },\n          }\n        : {\n            frame: false, // Frameless window for Windows and Linux\n          }),\n      ...(isWindows22H2 ? { backgroundMaterial: 'mica' } : {}),\n      ...(!isMacOS && !isWindows22H2\n        ? { backgroundColor: nativeTheme.shouldUseDarkColors ? '#181818' : '#FFFFFF' }\n        : {}),\n      darkTheme: nativeTheme.shouldUseDarkColors,\n      webPreferences: {\n        webviewTag: true,\n      },\n    });\n\n    mainWindowState.manage(mainWindow);\n\n    this.setupWindowEvents(mainWindow);\n    this.setupWebContentsHandlers(mainWindow);\n\n    mainWindow.on('close', (event: Electron.Event) => {\n      event.preventDefault();\n      this.safeClose(mainWindow);\n    });\n\n    if (!isPackaged && process.env.ELECTRON_RENDERER_URL) {\n      mainWindow.loadURL(`${process.env.ELECTRON_RENDERER_URL}/#/browser`);\n    } else {\n      mainWindow.loadFile(join(import.meta.dirname, '../renderer/index.html'), { hash: 'browser' });\n    }\n\n    return mainWindow;\n  }\n\n  public createSnifferWindow(uuid: string): BrowserWindow {\n    const mainWindow = this.createWindow(`${WINDOW_NAME.SNIFFER}-${uuid}`, {});\n\n    const debug = configManager.debug;\n\n    if (debug) {\n      mainWindow.once('ready-to-show', () => {\n        mainWindow.webContents.setZoomFactor(configManager.zoom);\n\n        // [mac]hacky-fix: miniWindow set visibleOnFullScreen:true will cause dock icon disappeared\n        app.dock?.show();\n        mainWindow.show();\n      });\n    }\n\n    return mainWindow;\n  }\n}\n\nexport const windowService = WindowService.getInstance();\n"
  },
  {
    "path": "src/main/services/__tests__/ProxyManager.test.ts",
    "content": "import { beforeEach, describe, expect, it } from 'vitest';\n\nimport { isByPass, updateByPassRules } from '../ProxyManager';\n\ndescribe('proxyManager - bypass evaluation', () => {\n  beforeEach(() => {\n    updateByPassRules([]);\n  });\n\n  it('matches simple hostname patterns', () => {\n    updateByPassRules(['foobar.com']);\n    expect(isByPass('http://foobar.com')).toBe(true);\n    expect(isByPass('http://www.foobar.com')).toBe(false);\n\n    updateByPassRules(['*.foobar.com']);\n    expect(isByPass('http://api.foobar.com')).toBe(true);\n    expect(isByPass('http://foobar.com')).toBe(true);\n    expect(isByPass('http://foobar.org')).toBe(false);\n\n    updateByPassRules(['*foobar.com']);\n    expect(isByPass('http://devfoobar.com')).toBe(true);\n    expect(isByPass('http://foobar.com')).toBe(true);\n    expect(isByPass('http://foobar.company')).toBe(false);\n  });\n\n  it('matches hostname patterns with scheme and port qualifiers', () => {\n    updateByPassRules(['https://secure.example.com']);\n    expect(isByPass('https://secure.example.com')).toBe(true);\n    expect(isByPass('https://secure.example.com:443/home')).toBe(true);\n    expect(isByPass('http://secure.example.com')).toBe(false);\n\n    updateByPassRules(['https://secure.example.com:8443']);\n    expect(isByPass('https://secure.example.com:8443')).toBe(true);\n    expect(isByPass('https://secure.example.com')).toBe(false);\n    expect(isByPass('https://secure.example.com:443')).toBe(false);\n\n    updateByPassRules(['https://x.*.y.com:99']);\n    expect(isByPass('https://x.api.y.com:99')).toBe(true);\n    expect(isByPass('https://x.api.y.com')).toBe(false);\n    expect(isByPass('http://x.api.y.com:99')).toBe(false);\n  });\n\n  it('matches domain suffix patterns with leading dot', () => {\n    updateByPassRules(['.example.com']);\n    expect(isByPass('https://example.com')).toBe(true);\n    expect(isByPass('https://api.example.com')).toBe(true);\n    expect(isByPass('https://deep.api.example.com')).toBe(true);\n    expect(isByPass('https://example.org')).toBe(false);\n\n    updateByPassRules(['.com']);\n    expect(isByPass('https://anything.com')).toBe(true);\n    expect(isByPass('https://example.org')).toBe(false);\n\n    updateByPassRules(['http://.google.com']);\n    expect(isByPass('http://maps.google.com')).toBe(true);\n    expect(isByPass('https://maps.google.com')).toBe(false);\n  });\n\n  it('matches IP literals, CIDR ranges, and wildcard IPs', () => {\n    updateByPassRules(['127.0.0.1', '[::1]', '192.168.1.0/24', 'fefe:13::abc/33', '192.168.*.*']);\n\n    expect(isByPass('http://127.0.0.1')).toBe(true);\n    expect(isByPass('http://[::1]')).toBe(true);\n    expect(isByPass('http://192.168.1.55')).toBe(true);\n    expect(isByPass('http://192.168.200.200')).toBe(true);\n    expect(isByPass('http://192.169.1.1')).toBe(false);\n    expect(isByPass('http://[fefe:13::abc]')).toBe(true);\n  });\n\n  it('matches CIDR ranges specified with IPv6 prefix lengths', () => {\n    updateByPassRules(['[2001:db8::1]', '2001:db8::/32']);\n\n    expect(isByPass('http://[2001:db8::1]')).toBe(true);\n    expect(isByPass('http://[2001:db8:0:0:0:0:0:ffff]')).toBe(true);\n    expect(isByPass('http://[2001:db9::1]')).toBe(false);\n  });\n\n  it('matches local addresses when <local> keyword is provided', () => {\n    updateByPassRules(['<local>']);\n\n    expect(isByPass('http://localhost')).toBe(true);\n    expect(isByPass('http://127.0.0.1')).toBe(true);\n    expect(isByPass('http://[::1]')).toBe(true);\n    expect(isByPass('http://dev.localdomain')).toBe(false);\n  });\n});\n"
  },
  {
    "path": "src/main/types/argv.ts",
    "content": "/* ---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *-------------------------------------------------------------------------------------------- */\n\nexport interface INativeCliOptions {\n  'cli-data-dir'?: string;\n  'disable-telemetry'?: boolean;\n  'telemetry-level'?: string;\n}\n\n/**\n * A list of command line arguments we support natively.\n */\nexport interface NativeParsedArgs {\n  // subcommands\n  tunnel?: INativeCliOptions & {\n    user: {\n      login: {\n        'access-token'?: string;\n        provider?: string;\n      };\n    };\n  };\n  'serve-web'?: INativeCliOptions;\n  chat?: {\n    _: string[];\n    'add-file'?: string[];\n    mode?: string;\n    maximize?: boolean;\n    'reuse-window'?: boolean;\n    'new-window'?: boolean;\n    profile?: string;\n    help?: boolean;\n  };\n\n  // arguments\n  _: string[];\n  'folder-uri'?: string[]; // undefined or array of 1 or more\n  'file-uri'?: string[]; // undefined or array of 1 or more\n  _urls?: string[];\n  help?: boolean;\n  version?: boolean;\n  telemetry?: boolean;\n  status?: boolean;\n  wait?: boolean;\n  waitMarkerFilePath?: string;\n  diff?: boolean;\n  merge?: boolean;\n  add?: boolean;\n  remove?: boolean;\n  goto?: boolean;\n  'new-window'?: boolean;\n  'reuse-window'?: boolean;\n  locale?: string;\n  'user-data-dir'?: string;\n  'prof-startup'?: boolean;\n  'prof-startup-prefix'?: string;\n  'prof-append-timers'?: string;\n  'prof-duration-markers'?: string[];\n  'prof-duration-markers-file'?: string;\n  'prof-v8-extensions'?: boolean;\n  'no-cached-data'?: boolean;\n  verbose?: boolean;\n  trace?: boolean;\n  'trace-memory-infra'?: boolean;\n  'trace-category-filter'?: string;\n  'trace-options'?: string;\n  'open-devtools'?: boolean;\n  log?: string[];\n  logExtensionHostCommunication?: boolean;\n  'extensions-dir'?: string;\n  'extensions-download-dir'?: string;\n  'builtin-extensions-dir'?: string;\n  extensionDevelopmentPath?: string[]; // undefined or array of 1 or more local paths or URIs\n  extensionTestsPath?: string; // either a local path or a URI\n  extensionDevelopmentKind?: string[];\n  extensionEnvironment?: string; // JSON-stringified Record<string, string> object\n  'inspect-extensions'?: string;\n  'inspect-brk-extensions'?: string;\n  debugId?: string;\n  debugRenderer?: boolean; // whether we expect a debugger (js-debug) to attach to the renderer, incl webviews+webworker\n  'inspect-search'?: string;\n  'inspect-brk-search'?: string;\n  'inspect-ptyhost'?: string;\n  'inspect-brk-ptyhost'?: string;\n  'inspect-sharedprocess'?: string;\n  'inspect-brk-sharedprocess'?: string;\n  'disable-extensions'?: boolean;\n  'disable-extension'?: string[]; // undefined or array of 1 or more\n  'list-extensions'?: boolean;\n  'show-versions'?: boolean;\n  category?: string;\n  'install-extension'?: string[]; // undefined or array of 1 or more\n  'pre-release'?: boolean;\n  'install-builtin-extension'?: string[]; // undefined or array of 1 or more\n  'uninstall-extension'?: string[]; // undefined or array of 1 or more\n  'update-extensions'?: boolean;\n  'do-not-include-pack-dependencies'?: boolean;\n  'locate-extension'?: string[]; // undefined or array of 1 or more\n  'enable-proposed-api'?: string[]; // undefined or array of 1 or more\n  'open-url'?: boolean;\n  'skip-release-notes'?: boolean;\n  'skip-welcome'?: boolean;\n  'disable-telemetry'?: boolean;\n  'export-default-configuration'?: string;\n  'install-source'?: string;\n  'add-mcp'?: string[];\n  'disable-updates'?: boolean;\n  transient?: boolean;\n  'use-inmemory-secretstorage'?: boolean;\n  'password-store'?: string;\n  'disable-workspace-trust'?: boolean;\n  'disable-crash-reporter'?: boolean;\n  'crash-reporter-directory'?: string;\n  'crash-reporter-id'?: string;\n  'skip-add-to-recently-opened'?: boolean;\n  'file-write'?: boolean;\n  'file-chmod'?: boolean;\n  'enable-smoke-test-driver'?: boolean;\n  remote?: string;\n  force?: boolean;\n  'do-not-sync'?: boolean;\n  'preserve-env'?: boolean;\n  'force-user-env'?: boolean;\n  'force-disable-user-env'?: boolean;\n  sync?: 'on' | 'off';\n  logsPath?: string;\n  '__enable-file-policy'?: boolean;\n  editSessionId?: string;\n  continueOn?: string;\n  'locate-shell-integration-path'?: string;\n  profile?: string;\n  'profile-temp'?: boolean;\n  'disable-chromium-sandbox'?: boolean;\n  sandbox?: boolean;\n  'enable-coi'?: boolean;\n  'unresponsive-sample-interval'?: string;\n  'unresponsive-sample-period'?: string;\n  'enable-rdp-display-tracking'?: boolean;\n  'disable-layout-restore'?: boolean;\n  'disable-experiments'?: boolean;\n\n  // chromium command line args: https://electronjs.org/docs/all#supported-chrome-command-line-switches\n  'no-proxy-server'?: boolean;\n  'no-sandbox'?: boolean;\n  'proxy-server'?: string;\n  'proxy-bypass-list'?: string;\n  'proxy-pac-url'?: string;\n  inspect?: string;\n  'inspect-brk'?: string;\n  'js-flags'?: string;\n  'disable-lcd-text'?: boolean;\n  'disable-gpu'?: boolean;\n  'disable-gpu-sandbox'?: boolean;\n  nolazy?: boolean;\n  'force-device-scale-factor'?: string;\n  'force-renderer-accessibility'?: boolean;\n  'ignore-certificate-errors'?: boolean;\n  'allow-insecure-localhost'?: boolean;\n  'log-net-log'?: string;\n  vmodule?: string;\n  'disable-dev-shm-usage'?: boolean;\n  'ozone-platform'?: string;\n  'enable-tracing'?: string;\n  'trace-startup-format'?: string;\n  'trace-startup-file'?: string;\n  'trace-startup-duration'?: string;\n  'xdg-portal-required-version'?: string;\n}\n"
  },
  {
    "path": "src/main/types/server.ts",
    "content": "export enum Schema {\n  ApiReponseError = 'ApiReponseError',\n  ApiReponseSuccess = 'ApiReponseSuccess',\n  ApiReponseRedirect = 'ApiReponseRedirect',\n}\n"
  },
  {
    "path": "src/main/types/tvbox.ts",
    "content": "export interface TvboxLiveOldItem {\n  group: string;\n  channels: Array<{\n    name: string;\n    urls: string[];\n  }>;\n}\n\nexport interface TvboxLiveNewItem {\n  name: string;\n  type: number;\n  url: string;\n  epg: string;\n  logo: string;\n  ua: string;\n  timeout: number;\n  playerType: number;\n}\n\nexport interface TvboxParseItem {\n  name: string;\n  type: 1 | 2;\n  url: string;\n  header?: Record<string, string>;\n  ext?: { flag: string[] };\n}\n\nexport interface TvboxSiteItem {\n  name: string;\n  key: string;\n  type: 0 | 1 | 2 | 3 | 4;\n  api: string;\n  playUrl: string;\n  quickSearch: 0 | 1;\n  searchable: 0 | 1;\n  filterable: 0 | 1;\n  ext: any;\n  categories: string[];\n}\n\nexport interface TvboxIjkItem {\n  group: string;\n  options: Array<{\n    category: number;\n    name: string;\n    value: string;\n  }>;\n}\n\nexport interface Tvbox {\n  lives: TvboxLiveOldItem[] | TvboxLiveNewItem[];\n  parses: TvboxParseItem[];\n  sites: TvboxSiteItem[];\n  flags: string[];\n  ads: string[];\n  ijk: TvboxIjkItem[];\n  homeLogo: string;\n  homePage: string;\n  spider: string;\n  wallpaper: string;\n}\n\nexport interface CatvodSiteItem {\n  key: string;\n  name: string;\n  type: number;\n  api: string;\n}\n\nexport interface Catvod {\n  video: {\n    sites: CatvodSiteItem[];\n  };\n  read: {\n    sites: CatvodSiteItem[];\n  };\n  comic: {\n    sites: CatvodSiteItem[];\n  };\n  music: {\n    sites: CatvodSiteItem[];\n  };\n  pan: {\n    sites: CatvodSiteItem[];\n  };\n  color: Array<{\n    light: Record<string, string>;\n    dark: Record<string, string>;\n  }>;\n}\n"
  },
  {
    "path": "src/main/utils/argv.ts",
    "content": "import type { NativeParsedArgs } from '@main/types/argv';\nimport minimist from 'minimist';\n\nexport const parseCLIArgs = (): NativeParsedArgs => {\n  return minimist(process.argv, {\n    string: ['user-data-dir', 'locale', 'js-flags', 'crash-reporter-directory'],\n    boolean: ['disable-chromium-sandbox'],\n    default: {\n      sandbox: true,\n    },\n    alias: {\n      'no-sandbox': 'sandbox',\n    },\n  });\n};\n"
  },
  {
    "path": "src/main/utils/file.ts",
    "content": "import { Buffer } from 'node:buffer';\nimport { basename, dirname, extname, join } from 'node:path';\n\nimport { hash } from '@shared/modules/crypto';\nimport type { ISizeOption } from '@shared/modules/size';\nimport { calculateSize } from '@shared/modules/size';\nimport {\n  isBase64,\n  isBinary,\n  isFunction,\n  isJson,\n  isPermissionNumber,\n  isPositiveFiniteNumber,\n  isStrEmpty,\n  isString,\n} from '@shared/modules/validate';\nimport { fdir as Fdir } from 'fdir';\nimport fs from 'fs-extra';\nimport JSON5 from 'json5';\nimport mime from 'mime-types';\n\nimport { relativeToAbsolute } from './path';\n\nexport type IFileState = 'file' | 'dir' | 'unknown';\nexport type IFileLink = 'link' | 'strict' | 'unknown';\nexport type IFileMode = fs.Mode;\nexport interface IFileMetadata {\n  name: string;\n  path: string;\n  created_at: string;\n  size: number;\n  ext: string;\n  mime: string;\n}\n\nconst bufferEncoding: Array<BufferEncoding> = [\n  'ascii',\n  'utf8',\n  'utf-8',\n  'utf16le',\n  'utf-16le',\n  'ucs2',\n  'ucs-2',\n  'base64',\n  'base64url',\n  'latin1',\n  'binary',\n  'hex',\n];\n\n/**\n * Check if path exists\n * @param filePath File path\n * @returns Whether the path exists\n */\nexport const pathExist = async (filePath: string): Promise<boolean> => {\n  if (isStrEmpty(filePath)) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    return await fs.pathExists(absolutePath);\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Synchronously check if path exists\n * @param filePath File path\n * @returns Whether the path exists\n */\nexport const pathExistSync = (filePath: string): boolean => {\n  if (isStrEmpty(filePath)) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    return fs.pathExistsSync(absolutePath);\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Check if path is soft link\n * @param filePath File path\n * @returns Whether the path is soft link\n */\nexport const pathLink = async (filePath: string): Promise<IFileLink> => {\n  if (!(await pathExist(filePath))) {\n    return 'unknown';\n  }\n\n  try {\n    const stats = await fs.lstat(filePath);\n    if (stats.isSymbolicLink()) {\n      return 'link';\n    }\n    return 'strict';\n  } catch {\n    return 'unknown';\n  }\n};\n\n/**\n * Synchronously check if path is soft link\n * @param filePath File path\n * @returns Whether the path is soft link\n */\nexport const pathLinkSync = (filePath: string): IFileLink => {\n  if (!pathExistSync(filePath)) {\n    return 'unknown';\n  }\n\n  try {\n    const stats = fs.lstatSync(filePath);\n    if (stats.isSymbolicLink()) {\n      return 'link';\n    }\n    return 'strict';\n  } catch {\n    return 'unknown';\n  }\n};\n\n/**\n * Get path state\n * @param filePath File path\n * @returns File state\n */\nexport const fileState = async (filePath: string): Promise<IFileState> => {\n  if (!(await pathExist(filePath))) {\n    return 'unknown';\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    const state = await fs.stat(absolutePath);\n    if (state.isFile()) return 'file';\n    if (state.isDirectory()) return 'dir';\n    return 'unknown';\n  } catch {\n    return 'unknown';\n  }\n};\n\n/**\n * Synchronously check path state\n * @param filePath File path\n * @returns File state\n */\nexport const fileStateSync = (filePath: string): IFileState => {\n  if (!pathExistSync(filePath)) {\n    return 'unknown';\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    const state = fs.statSync(absolutePath);\n    if (state.isFile()) return 'file';\n    if (state.isDirectory()) return 'dir';\n    return 'unknown';\n  } catch {\n    return 'unknown';\n  }\n};\n\n/**\n * Get file line count\n * @param filePath File path\n * @returns File line count\n */\nexport const fileLineCount = async (filePath: string): Promise<number> => {\n  if (!(await pathExist(filePath))) {\n    return 0;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    const content = (await readFile(absolutePath, 'utf8')) || '';\n    return content.split('\\n').length;\n  } catch {\n    return 0;\n  }\n};\n\n/**\n * Synchronously get file line count\n * @param filePath File path\n * @returns File line count\n */\nexport const fileLineCountSync = (filePath: string): number => {\n  if (!pathExistSync(filePath)) {\n    return 0;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    const content = readFileSync(absolutePath, 'utf8') || '';\n    return content.split('\\n').length;\n  } catch {\n    return 0;\n  }\n};\n\n/**\n * Get file permission\n * @param filePath File path\n * @returns File permission\n */\nexport const filePermission = async (\n  filePath: string,\n): Promise<{ read: boolean; writ: boolean; exec: boolean; code: number }> => {\n  const defaultValue = { read: false, writ: false, exec: false, code: 0 };\n\n  if (!(await pathExist(filePath))) {\n    return defaultValue;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n\n    const check = async (type: 'read' | 'writ' | 'exec'): Promise<boolean> => {\n      try {\n        const permit = {\n          read: fs.constants.R_OK,\n          writ: fs.constants.W_OK,\n          exec: fs.constants.X_OK,\n        };\n\n        await fs.access(absolutePath, permit[type]);\n        return true;\n      } catch {\n        return false;\n      }\n    };\n\n    const read = await check('read');\n    const writ = await check('writ');\n    const exec = await check('exec');\n\n    const code = ((read ? 4 : 0) + (writ ? 2 : 0) + (exec ? 1 : 0)) * 111;\n\n    return { read, writ, exec, code };\n  } catch {\n    return defaultValue;\n  }\n};\n\n/**\n * Synchronously get file permission\n * @param filePath File path\n * @returns File permission\n */\nexport const filePermissionSync = (filePath: string): { read: boolean; writ: boolean; exec: boolean; code: number } => {\n  const defaultValue = { read: false, writ: false, exec: false, code: 0 };\n\n  if (!pathExistSync(filePath)) {\n    return defaultValue;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n\n    const check = (type: 'read' | 'writ' | 'exec'): boolean => {\n      try {\n        const permit = {\n          read: fs.constants.R_OK,\n          writ: fs.constants.W_OK,\n          exec: fs.constants.X_OK,\n        };\n\n        fs.accessSync(absolutePath, permit[type]);\n        return true;\n      } catch {\n        return false;\n      }\n    };\n\n    const read = check('read');\n    const writ = check('writ');\n    const exec = check('exec');\n\n    const code = ((read ? 4 : 0) + (writ ? 2 : 0) + (exec ? 1 : 0)) * 111;\n\n    return { read, writ, exec, code };\n  } catch {\n    return defaultValue;\n  }\n};\n\n/**\n * Modify file permission\n * @param filePath File path\n * @param mode File permission\n * @returns Whether the operation was successful\n */\nexport const fileChmod = async (filePath: string, mode: IFileMode): Promise<boolean> => {\n  if (!(await pathExist(filePath))) {\n    return false;\n  }\n\n  if (!isPermissionNumber(mode)) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    const octalMode = Number.parseInt(mode.toString(), 8);\n    await fs.chmod(absolutePath, octalMode);\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Synchronously modify file permission\n * @param filePath File path\n * @param mode File permission\n * @returns Whether the operation was successful\n */\nexport const fileChmodSync = (filePath: string, mode: IFileMode): boolean => {\n  if (!pathExistSync(filePath)) {\n    return false;\n  }\n\n  if (!isPermissionNumber(mode)) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    const octalMode = Number.parseInt(mode.toString(), 8);\n    fs.chmodSync(absolutePath, octalMode);\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Get file metadata\n * @param filePath File path\n * @returns File metadata\n */\nexport const fileMetadata = async (filePath: string): Promise<IFileMetadata> => {\n  const defaultValue: IFileMetadata = { name: '', ext: '', path: '', size: 0, created_at: '', mime: 'unknown' };\n\n  if (!(await pathExist(filePath))) {\n    return defaultValue;\n  }\n\n  if ((await fileState(filePath)) !== 'file') {\n    return defaultValue;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    const stats = await fs.stat(absolutePath);\n    return {\n      name: basename(absolutePath),\n      ext: extname(absolutePath).slice(1),\n      mime: mime.lookup(absolutePath) || 'unknown',\n      path: absolutePath,\n      size: stats.size,\n      created_at: stats.birthtime.toISOString(),\n    };\n  } catch {\n    return defaultValue;\n  }\n};\n\n/**\n * Synchronously get file metadata\n * @param filePath File path\n * @returns File metadata\n */\nexport const fileMetadataSync = (filePath: string): IFileMetadata => {\n  const defaultValue: IFileMetadata = { name: '', ext: '', path: '', size: 0, created_at: '', mime: 'unknown' };\n\n  if (!pathExistSync(filePath)) {\n    return defaultValue;\n  }\n\n  if (fileStateSync(filePath) !== 'file') {\n    return defaultValue;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    const stats = fs.statSync(absolutePath);\n    return {\n      name: basename(absolutePath),\n      ext: extname(absolutePath).slice(1),\n      mime: mime.lookup(absolutePath) || 'unknown',\n      path: absolutePath,\n      size: stats.size,\n      created_at: stats.birthtime.toISOString(),\n    };\n  } catch {\n    return defaultValue;\n  }\n};\n\n/**\n * Compute file hash\n * @param filePath File path\n * @returns File hash\n */\nexport const fileHash = async (filePath: string, algo: 'sha1' | 'sha256' | 'md5' = 'md5'): Promise<string> => {\n  if (!(await pathExist(filePath))) {\n    return '';\n  }\n\n  if ((await fileState(filePath)) !== 'file') {\n    return '';\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    const content = await readFile(absolutePath);\n    switch (algo) {\n      case 'sha1':\n        return hash.sha1({ src: content! });\n      case 'sha256':\n        return hash.sha256({ src: content! });\n      case 'md5':\n      default:\n        return hash['md5-32']({ src: content! });\n    }\n  } catch {\n    return '';\n  }\n};\n\n/**\n * Synchronously compute file hash\n * @param filePath File path\n * @returns File hash\n */\nexport const fileHashSync = async (filePath: string, algo: 'sha1' | 'sha256' | 'md5' = 'md5'): Promise<string> => {\n  if (!pathExistSync(filePath)) {\n    return '';\n  }\n\n  if (fileStateSync(filePath) !== 'file') {\n    return '';\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    const content = readFileSync(absolutePath);\n    switch (algo) {\n      case 'sha1':\n        return hash.sha1({ src: content! });\n      case 'sha256':\n        return hash.sha256({ src: content! });\n      case 'md5':\n      default:\n        return hash['md5-32']({ src: content! });\n    }\n  } catch {\n    return '';\n  }\n};\n\n/**\n * Copy a file or directory. The directory can have contents.\n * @param srcPath src file path\n * @param destPath dest file path\n * @returns Whether the copy was successful\n */\nexport const fileCopy = async (srcPath: string, destPath: string): Promise<boolean> => {\n  if (!(await pathExist(srcPath))) {\n    return false;\n  }\n\n  try {\n    const absoluteSrcPath = relativeToAbsolute(srcPath);\n    const absoluteDestPath = relativeToAbsolute(destPath);\n\n    const copyStat = await fileState(srcPath);\n    if (copyStat === 'unknown') return false;\n    const destDir = copyStat === 'file' ? dirname(destPath) : destPath;\n    const stats = await ensureDir(destDir);\n    if (!stats) {\n      return false;\n    }\n\n    await fs.copy(absoluteSrcPath, absoluteDestPath, { overwrite: true });\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Synchronously copy a file or directory. The directory can have contents.\n * @param srcPath src file path\n * @param destPath dest file path\n * @returns Whether the copy was successful\n */\nexport const fileCopySync = (srcPath: string, destPath: string): boolean => {\n  if (!pathExistSync(srcPath)) {\n    return false;\n  }\n\n  try {\n    const absoluteSrcPath = relativeToAbsolute(srcPath);\n    const absoluteDestPath = relativeToAbsolute(destPath);\n\n    const copyStat = fileStateSync(srcPath);\n    if (copyStat === 'unknown') return false;\n    const destDir = copyStat === 'file' ? dirname(destPath) : destPath;\n    const stats = ensureDirSync(destDir);\n    if (!stats) {\n      return false;\n    }\n\n    fs.copySync(absoluteSrcPath, absoluteDestPath, { overwrite: true });\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Move a file or directory, even across devices\n * @param srcPath src file path\n * @param destPath dest file path\n * @returns Whether the move was successful\n */\nexport const fileMove = async (srcPath: string, destPath: string): Promise<boolean> => {\n  if (!(await pathExist(srcPath))) {\n    return false;\n  }\n\n  try {\n    const absoluteSrcPath = relativeToAbsolute(srcPath);\n    const absoluteDestPath = relativeToAbsolute(destPath);\n\n    const copyStat = await fileState(srcPath);\n    if (copyStat === 'unknown') return false;\n    const destDir = copyStat === 'file' ? dirname(destPath) : destPath;\n    const stats = await ensureDir(destDir);\n    if (!stats) {\n      return false;\n    }\n\n    await fs.move(absoluteSrcPath, absoluteDestPath, { overwrite: true });\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Synchronously move a file or directory, even across devices\n * @param srcPath src file path\n * @param destPath dest file path\n * @returns Whether the move was successful\n */\nexport const fileMoveSync = (srcPath: string, destPath: string): boolean => {\n  if (!pathExistSync(srcPath)) {\n    return false;\n  }\n\n  try {\n    const absoluteSrcPath = relativeToAbsolute(srcPath);\n    const absoluteDestPath = relativeToAbsolute(destPath);\n\n    const copyStat = fileStateSync(srcPath);\n    if (copyStat === 'unknown') return false;\n    const destDir = copyStat === 'file' ? dirname(destPath) : destPath;\n    const stats = ensureDirSync(destDir);\n    if (!stats) {\n      return false;\n    }\n\n    fs.moveSync(absoluteSrcPath, absoluteDestPath, { overwrite: true });\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Rename the file or directory from oldPath to newPath\n * @param filePath file path\n * @param newName new file name\n * @returns Whether the rename was successful\n */\nexport const fileRename = async (filePath: string, newName: string): Promise<boolean> => {\n  if (!(await pathExist(filePath))) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    const newFilePath = join(dirname(absolutePath), newName);\n    await fs.rename(absolutePath, newFilePath);\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Synchronously rename the file or directory from oldPath to newPath\n * @param filePath file path\n * @param newName new file name\n * @returns Whether the rename was successful\n */\nexport const fileRenameSync = (filePath: string, newName: string): boolean => {\n  if (!pathExistSync(filePath)) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    const newFilePath = join(dirname(absolutePath), newName);\n    fs.renameSync(absolutePath, newFilePath);\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Save file (supports string and Buffer)\n * @param filePath File path\n * @param content File content (string or Buffer)\n * @param encoding File encoding, defaults to utf8 (only applies to strings)\n * @returns Whether the save was successful\n */\nexport const saveFile = async (\n  filePath: string,\n  content: string | Buffer = '',\n  encoding: BufferEncoding = 'utf8',\n): Promise<boolean> => {\n  if (isStrEmpty(filePath)) {\n    return false;\n  }\n\n  if (!isString(content) && !isBinary(content)) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n\n    if (isString(content)) {\n      await fs.outputFile(absolutePath, content, encoding);\n      return true;\n    } else if (isBinary(content)) {\n      const binary = Buffer.from(content);\n      await fs.outputFile(absolutePath, binary);\n      return true;\n    }\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Synchronously save file (supports string and Buffer)\n * @param filePath File path\n * @param content File content (string or Buffer)\n * @param encoding File encoding, defaults to utf8 (only applies to strings)\n * @returns Whether the save was successful\n */\nexport const saveFileSync = (\n  filePath: string,\n  content: string | Buffer = '',\n  encoding: BufferEncoding = 'utf8',\n): boolean => {\n  if (isStrEmpty(filePath)) {\n    return false;\n  }\n\n  if (!isString(content) && !isBinary(content)) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n\n    if (isString(content)) {\n      fs.outputFileSync(absolutePath, content, encoding);\n      return true;\n    } else if (isBinary(content)) {\n      const binary = Buffer.from(content);\n      fs.outputFileSync(absolutePath, binary);\n      return true;\n    }\n\n    return false;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Read file (supports string and NonSharedBuffer)\n * @param filePath File path\n * @param encoding File encoding, defaults to utf8, pass null to return NonSharedBuffer\n * @returns File content (string or NonSharedBuffer), returns null on failure\n */\nexport const readFile = async <T extends BufferEncoding | null = 'utf8'>(\n  filePath: string,\n  encoding: T = 'utf8' as T,\n): Promise<T extends null ? NonSharedBuffer | null : string | null> => {\n  if (!(await pathExist(filePath))) {\n    return null;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n\n    const state = fileStateSync(absolutePath);\n    if (state !== 'file') {\n      return null;\n    }\n\n    const encodingFormat = encoding !== null && bufferEncoding.includes(encoding) ? encoding : null;\n    const content = await fs.readFile(absolutePath, { encoding: encodingFormat });\n    return content as T extends null ? NonSharedBuffer | null : string | null;\n  } catch {\n    return null;\n  }\n};\n\n/**\n * Synchronously read file (supports string and NonSharedBuffer)\n * @param filePath File path\n * @param encoding File encoding, defaults to utf8, pass null to return NonSharedBuffer\n * @returns File content (string or NonSharedBuffer), returns null on failure\n */\nexport const readFileSync = <T extends BufferEncoding | null = 'utf8'>(\n  filePath: string,\n  encoding: T = 'utf8' as T,\n): T extends null ? NonSharedBuffer | null : string | null => {\n  if (!pathExistSync(filePath)) {\n    return null;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n\n    const state = fileStateSync(absolutePath);\n    if (state !== 'file') {\n      return null;\n    }\n\n    const encodingFormat = encoding !== null && bufferEncoding.includes(encoding) ? encoding : null;\n    const content = fs.readFileSync(absolutePath, { encoding: encodingFormat });\n    return content as T extends null ? NonSharedBuffer | null : string | null;\n  } catch {\n    return null;\n  }\n};\n\n/**\n * Save JSON file\n * @param filePath File path\n * @param content JSON object\n * @param spaces Number of spaces for indentation, defaults to 2\n * @returns Whether the save was successful\n */\nexport const saveJson = async (filePath: string, content: object = {}, spaces: number = 2): Promise<boolean> => {\n  if (isStrEmpty(filePath)) {\n    return false;\n  }\n\n  if (!isJson(content)) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    const contentFormat = JSON5.parse(JSON.stringify(content));\n    const spacesFormat = isPositiveFiniteNumber(spaces) ? spaces : 2;\n    await fs.outputJson(absolutePath, contentFormat, { spaces: spacesFormat });\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Synchronously save JSON file\n * @param filePath File path\n * @param content JSON object\n * @param spaces Number of spaces for indentation, defaults to 2\n * @returns Whether the save was successful\n */\nexport const saveJsonSync = (filePath: string, content: object = {}, spaces: number = 2): boolean => {\n  if (isStrEmpty(filePath)) {\n    return false;\n  }\n\n  if (!isJson(content)) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    const contentFormat = JSON5.parse(JSON.stringify(content));\n    const spacesFormat = isPositiveFiniteNumber(spaces) ? spaces : 2;\n    fs.outputJsonSync(absolutePath, contentFormat, { spaces: spacesFormat });\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Read JSON file\n * @param filePath File path\n * @returns JSON object, returns null on failure\n */\nexport const readJson = async (filePath: string): Promise<any | null> => {\n  if (!(await pathExist(filePath))) {\n    return null;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n\n    if (!(await pathExist(absolutePath))) {\n      return null;\n    }\n\n    const state = await fileState(absolutePath);\n    if (state !== 'file') {\n      return null;\n    }\n\n    const content = await fs.readJson(absolutePath);\n    return content;\n  } catch {\n    return null;\n  }\n};\n\n/**\n * Synchronously read JSON file\n * @param filePath File path\n * @returns JSON object, returns null on failure\n */\nexport const readJsonSync = (filePath: string): any | null => {\n  if (!pathExistSync(filePath)) {\n    return null;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n\n    if (!pathExistSync(absolutePath)) {\n      return null;\n    }\n\n    const state = fileStateSync(absolutePath);\n    if (state !== 'file') {\n      return null;\n    }\n\n    const content = fs.readJsonSync(absolutePath);\n    return content;\n  } catch {\n    return null;\n  }\n};\n\n/**\n * Save image from base64\n * @param filePath File path\n * @param base64Data Base64 data\n * @returns Whether the save was successful\n */\nexport const saveImageBase64 = async (filePath: string, base64Data: string): Promise<boolean> => {\n  if (isStrEmpty(filePath)) {\n    return false;\n  }\n\n  if (!isBase64(base64Data)) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n\n    const base64String = base64Data.replace(/^data:.*;base64,/, '');\n    const buffer = Buffer.from(base64String, 'base64');\n\n    await saveFile(absolutePath, buffer);\n\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Synchronously save image from base64\n * @param filePath File path\n * @param base64Data Base64 data\n * @returns Whether the save was successful\n */\nexport const saveImageBase64Sync = (filePath: string, base64Data: string): boolean => {\n  if (isStrEmpty(filePath)) {\n    return false;\n  }\n\n  if (!isBase64(base64Data)) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n\n    const base64String = base64Data.replace(/^data:.*;base64,/, '');\n    const buffer = Buffer.from(base64String, 'base64');\n\n    saveFileSync(absolutePath, buffer);\n\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Read image file as base64\n * @param filePath File path\n * @returns Base64 encoded image data, returns null on failure\n */\nexport const readImageBase64 = async (filePath: string): Promise<string | null> => {\n  if (!(await pathExist(filePath))) {\n    return null;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n\n    if (!(await pathExist(absolutePath))) {\n      return null;\n    }\n\n    const state = await fileState(absolutePath);\n    if (state !== 'file') {\n      return null;\n    }\n\n    const mimeinfo = mime.lookup(absolutePath);\n    if (!mimeinfo || !mimeinfo.startsWith('image')) {\n      return null;\n    }\n\n    const ext = extname(filePath).slice(1);\n    const content = await readFile(absolutePath, 'base64');\n    return `data:${ext};base64,${content}`;\n  } catch {\n    return null;\n  }\n};\n\n/**\n * Synchronously read image file as base64\n * @param filePath File path\n * @returns Base64 encoded image data, returns null on failure\n */\nexport const readImageBase64Sync = (filePath: string): string | null => {\n  if (!pathExistSync(filePath)) {\n    return null;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n\n    if (!pathExistSync(absolutePath)) {\n      return null;\n    }\n\n    const state = fileStateSync(absolutePath);\n    if (state !== 'file') {\n      return null;\n    }\n\n    const mimeinfo = mime.lookup(absolutePath);\n    if (!mimeinfo || !mimeinfo.startsWith('image')) {\n      return null;\n    }\n\n    const ext = extname(filePath).slice(1);\n    const content = readFileSync(absolutePath, 'base64');\n    return `data:${ext};base64,${content}`;\n  } catch {\n    return null;\n  }\n};\n\n/**\n * Delete file or directory\n * @param filePath File path\n * @returns Whether the deletion was successful\n */\nexport const fileDelete = async (filePath: string): Promise<boolean> => {\n  if (!(await pathExist(filePath))) {\n    return true;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    await fs.remove(absolutePath);\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Synchronously delete file or directory\n * @param filePath File path\n * @returns Whether the deletion was successful\n */\nexport const fileDeleteSync = (filePath: string): boolean => {\n  if (!pathExistSync(filePath)) {\n    return true;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(filePath);\n    fs.removeSync(absolutePath);\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Read directory contents\n * @param dirPath Directory path\n * @returns Array of directory contents, returns null on failure\n */\nexport const readDir = async (dirPath: string): Promise<string[]> => {\n  if (!(await pathExist(dirPath))) {\n    return [];\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(dirPath);\n\n    const state = await fileState(absolutePath);\n    if (state === 'file') {\n      return [absolutePath];\n    }\n\n    const entries = await fs.readdir(absolutePath);\n    return entries;\n  } catch {\n    return [];\n  }\n};\n\n/**\n * Read directory contents faster\n * @see https://github.com/thecodrr/fdir\n *\n * @param dirPath Directory path\n * @param depth Maximum depth, default is 0\n * @param exclude Exclude callback function\n * @param include Include callback function\n * @returns Array of directory contents, returns null on failure\n */\nexport const readDirFaster = async (\n  dirPath: string,\n  depth: number = 0,\n  exclude?: (path: string, isDirectory: boolean) => boolean,\n  include?: (path: string, isDirectory: boolean) => boolean,\n): Promise<string[]> => {\n  if (!(await pathExist(dirPath))) {\n    return [];\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(dirPath);\n\n    const state = await fileState(absolutePath);\n    if (state === 'file') {\n      return [absolutePath];\n    }\n\n    const api = new Fdir()\n      .withFullPaths()\n      .withDirs()\n      .filter((path: string, isDirectory: boolean) => {\n        if (!isDirectory && path.endsWith('.DS_Store')) return false;\n        if (exclude && isFunction(exclude) && exclude(path, isDirectory)) return false;\n        if (include && isFunction(include) && !include(path, isDirectory)) return false;\n        return true;\n      });\n    if (isPositiveFiniteNumber(depth)) api.withMaxDepth(depth);\n\n    const entries = await api.crawl(absolutePath).withPromise();\n    return entries;\n  } catch {\n    return [];\n  }\n};\n\n/**\n * Synchronously read directory contents\n * @param dirPath Directory path\n * @returns Array of directory contents, returns null on failure\n */\nexport const readDirSync = (dirPath: string): Array<string> => {\n  if (!pathExistSync(dirPath)) {\n    return [];\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(dirPath);\n\n    const state = fileStateSync(absolutePath);\n    if (state === 'file') {\n      return [absolutePath];\n    }\n\n    const entries = fs.readdirSync(absolutePath);\n    return entries;\n  } catch {\n    return [];\n  }\n};\n\n/**\n * Synchronously read  directory contents faster\n * @see https://github.com/thecodrr/fdir\n *\n * @param dirPath Directory path\n * @param depth Maximum depth, default is 0\n * @param exclude Exclude callback function\n * @param include Include callback function\n * @returns Array of directory contents, returns null on failure\n */\nexport const readDirFasterSync = (\n  dirPath: string,\n  depth: number = 0,\n  exclude?: (path: string, isDirectory: boolean) => boolean,\n  include?: (path: string, isDirectory: boolean) => boolean,\n): string[] => {\n  if (!pathExistSync(dirPath)) {\n    return [];\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(dirPath);\n\n    const state = fileStateSync(absolutePath);\n    if (state === 'file') {\n      return [absolutePath];\n    }\n\n    const api = new Fdir()\n      .withFullPaths()\n      .withDirs()\n      .filter((path: string, isDirectory: boolean) => {\n        if (!isDirectory && path.endsWith('.DS_Store')) return false;\n        if (exclude && isFunction(exclude) && exclude(path, isDirectory)) return false;\n        if (include && isFunction(include) && !include(path, isDirectory)) return false;\n        return true;\n      });\n    if (isPositiveFiniteNumber(depth)) api.withMaxDepth(depth);\n\n    const entries = api.crawl(absolutePath).sync();\n    return entries;\n  } catch {\n    return [];\n  }\n};\n\n/**\n * Create directory\n * @param dirPath Directory path\n * @returns Whether the creation was successful\n */\nexport const createDir = async (dirPath: string): Promise<boolean> => {\n  if (isStrEmpty(dirPath)) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(dirPath);\n    await fs.ensureDir(absolutePath);\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Synchronously create directory\n * @param dirPath Directory path\n * @returns Whether the creation was successful\n */\nexport const createDirSync = (dirPath: string): boolean => {\n  if (isStrEmpty(dirPath)) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(dirPath);\n    fs.ensureDirSync(absolutePath);\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Get file or directory size\n * @param dirPath File or directory path\n * @param ignoreLink Whether to ignore symbolic links (default: true)\n * @param unit Output size unit (optional, auto-select if not specified)\n * @returns Size information, returns {format: 0, unit: 'B', formatted: '0B'} on failure\n */\nexport const fileSize = async (\n  dirPath: string,\n  ignoreLink: boolean = true,\n  unit: ISizeOption['unit'] = 'auto',\n): Promise<{ size: number; unit: string; format: string }> => {\n  if (!(await pathExist(dirPath))) {\n    return { size: 0, unit: 'B', format: '0B' };\n  }\n\n  const processedInodes = new Set<string | number>();\n\n  try {\n    const absolutePath = relativeToAbsolute(dirPath);\n    const bytes = await calculateBytes(absolutePath);\n    const size = calculateSize(bytes, { unit });\n    const res = {\n      size: size.count,\n      unit: size.unit,\n      format: `${size.count}${size.unit}`,\n    };\n    return res;\n  } catch {\n    return { size: 0, unit: 'B', format: '0B' };\n  }\n\n  async function calculateBytes(itemPath: string): Promise<number> {\n    if (!(await pathExist(itemPath))) {\n      return 0;\n    }\n\n    try {\n      // check if it's a symbolic link\n      if (ignoreLink) {\n        const linkState = await pathLink(itemPath);\n        if (linkState === 'link') {\n          return 0;\n        }\n      }\n\n      const stats = await fs.lstat(itemPath);\n\n      // check if it's already been processed\n      if (processedInodes.has(stats.ino)) {\n        return 0;\n      }\n      processedInodes.add(stats.ino);\n\n      // If it's a file, return the size directly\n      if (stats.isFile()) {\n        return stats.size;\n      }\n\n      // If it's a directory, recursively calculate the content size\n      if (stats.isDirectory()) {\n        const entries = await readDir(itemPath);\n\n        if (!entries || entries.length === 0) {\n          return 0;\n        }\n\n        const sizes = await Promise.all(entries.map((entry) => calculateBytes(join(itemPath, entry))));\n\n        return sizes.reduce((total, size) => total + size, 0);\n      }\n\n      return 0;\n    } catch {\n      return 0;\n    }\n  }\n};\n\n/**\n * Synchronously get file or directory size\n * @param dirPath File or directory path\n * @param ignoreLink Whether to ignore symbolic links (default: true)\n * @param unit Output size unit (optional, auto-select if not specified)\n * @returns Size information, returns {size: 0, unit: 'B', format: '0B'} on failure\n */\nexport const fileSizeSync = (\n  dirPath: string,\n  ignoreLink: boolean = true,\n  unit: ISizeOption['unit'] = 'auto',\n): { size: number; unit: string; format: string } => {\n  if (!pathExistSync(dirPath)) {\n    return { size: 0, unit: 'B', format: '0B' };\n  }\n\n  // Track processed inodes to avoid counting hard links multiple times\n  const processedInodes = new Set<string | number>();\n\n  try {\n    const absolutePath = relativeToAbsolute(dirPath);\n    const bytes = calculateBytesSync(absolutePath);\n    const size = calculateSize(bytes, { unit });\n    const res = {\n      size: size.count,\n      unit: size.unit,\n      format: `${size.count}${size.unit}`,\n    };\n    return res;\n  } catch {\n    return { size: 0, unit: 'B', format: '0B' };\n  }\n\n  function calculateBytesSync(itemPath: string): number {\n    if (!pathExistSync(itemPath)) {\n      return 0;\n    }\n\n    try {\n      // Check if it's a symbolic link\n      if (ignoreLink) {\n        const linkState = pathLinkSync(itemPath);\n        if (linkState === 'link') {\n          return 0;\n        }\n      }\n\n      const stats = fs.lstatSync(itemPath);\n\n      // Check if it's already been processed (avoid counting hard links multiple times)\n      if (processedInodes.has(stats.ino)) {\n        return 0;\n      }\n      processedInodes.add(stats.ino);\n\n      // If it's a file, return the size directly\n      if (stats.isFile()) {\n        return stats.size;\n      }\n\n      // If it's a directory, recursively calculate the content size\n      if (stats.isDirectory()) {\n        const entries = readDirSync(itemPath);\n\n        if (!entries || entries.length === 0) {\n          return 0;\n        }\n\n        // Calculate total size by summing all entries\n        let totalSize = 0;\n        for (const entry of entries) {\n          const entryPath = join(itemPath, entry);\n          totalSize += calculateBytesSync(entryPath);\n        }\n\n        return totalSize;\n      }\n\n      return 0;\n    } catch {\n      return 0;\n    }\n  }\n};\n\n/**\n * Ensure directory exists\n * @param dirPath Directory path\n * @returns Whether the operation was successful\n */\nexport const ensureDir = async (dirPath: string): Promise<boolean> => {\n  if (isStrEmpty(dirPath)) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(dirPath);\n\n    if (!(await pathExist(absolutePath))) {\n      await createDir(absolutePath);\n    } else {\n      const state = await fileState(absolutePath);\n      if (state !== 'dir') {\n        await fileDelete(absolutePath);\n        await createDir(absolutePath);\n      }\n    }\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Synchronously ensure directory exists\n * @param dirPath Directory path\n * @returns Whether the operation was successful\n */\nexport const ensureDirSync = (dirPath: string): boolean => {\n  if (isStrEmpty(dirPath)) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(dirPath);\n\n    if (!pathExistSync(absolutePath)) {\n      createDirSync(absolutePath);\n    } else {\n      const state = fileStateSync(absolutePath);\n      if (state !== 'dir') {\n        fileDeleteSync(absolutePath);\n        createDirSync(absolutePath);\n      }\n    }\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Clear directory contents\n * @param dirPath Directory path\n * @returns Whether the operation was successful\n */\nexport const clearDir = async (dirPath: string): Promise<boolean> => {\n  if (isStrEmpty(dirPath)) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(dirPath);\n\n    if (!(await pathExist(absolutePath))) {\n      await createDir(absolutePath);\n    } else {\n      const state = await fileState(absolutePath);\n      if (state !== 'dir') {\n        await fileDelete(absolutePath);\n        await createDir(absolutePath);\n      } else {\n        await fs.emptyDir(absolutePath);\n      }\n    }\n\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Synchronously clear directory contents\n * @param dirPath Directory path\n * @returns Whether the operation was successful\n */\nexport const clearDirSync = (dirPath: string): boolean => {\n  if (isStrEmpty(dirPath)) {\n    return false;\n  }\n\n  try {\n    const absolutePath = relativeToAbsolute(dirPath);\n\n    if (!pathExistSync(absolutePath)) {\n      createDirSync(absolutePath);\n    } else {\n      const state = fileStateSync(absolutePath);\n      if (state !== 'dir') {\n        fileDeleteSync(absolutePath);\n        createDirSync(absolutePath);\n      } else {\n        fs.emptyDirSync(absolutePath);\n      }\n    }\n    return true;\n  } catch {\n    return false;\n  }\n};\n\nexport default {\n  pathExist,\n  pathExistSync,\n  pathLink,\n  pathLinkSync,\n  fileState,\n  fileStateSync,\n  filePermission,\n  filePermissionSync,\n  fileChmod,\n  fileChmodSync,\n  fileLineCount,\n  fileLineCountSync,\n  fileMetadata,\n  fileMetadataSync,\n  fileDelete,\n  fileDeleteSync,\n  fileSize,\n  fileSizeSync,\n  fileHash,\n  fileHashSync,\n  fileCopy,\n  fileCopySync,\n  fileMove,\n  fileMoveSync,\n  fileRename,\n  fileRenameSync,\n  saveFile,\n  saveFileSync,\n  readFile,\n  readFileSync,\n  saveJson,\n  saveJsonSync,\n  readJson,\n  readJsonSync,\n  saveImageBase64,\n  saveImageBase64Sync,\n  readImageBase64,\n  readImageBase64Sync,\n  readDir,\n  readDirFaster,\n  readDirSync,\n  readDirFasterSync,\n  createDir,\n  createDirSync,\n  ensureDir,\n  ensureDirSync,\n  clearDir,\n  clearDirSync,\n};\n"
  },
  {
    "path": "src/main/utils/hiker/baseSpider.ts",
    "content": "import { isJsonStr } from '@shared/modules/validate';\n\nclass BaseSpider {\n  public home: () => Promise<any>;\n  public category: () => Promise<any>;\n  public detail: () => Promise<any>;\n  public search: () => Promise<any>;\n  public play: () => Promise<any>;\n  public homeVod: () => Promise<any>;\n  public proxy: () => Promise<any>;\n\n  constructor() {\n    this.home = this.homeContent;\n    this.category = this.categoryContent;\n    this.detail = this.detailContent;\n    this.search = this.searchContent;\n    this.play = this.playerContent;\n    this.homeVod = this.homeVideoContent;\n    this.proxy = this.localProxy;\n  }\n\n  async fetch(url: string, options: Record<string, any>) {\n    // @ts-expect-error req is a global function in hiker, but not defined in TypeScript\n    const resp = await req(url, options);\n    return {\n      ...resp,\n      get data() {\n        return isJsonStr(resp.content) ? JSON.parse(resp.content) : resp.content;\n      },\n    };\n  }\n\n  async homeContent() {}\n\n  async categoryContent() {}\n\n  async detailContent() {}\n\n  async searchContent() {}\n\n  async playerContent() {}\n\n  async homeVideoContent() {}\n\n  async localProxy() {}\n\n  async action() {}\n}\n\nexport default BaseSpider;\n"
  },
  {
    "path": "src/main/utils/hiker/crypto.ts",
    "content": "import { aes, base64, des, hash, rabbit, rabbitLegacy, rc4, rsa, sm4, tripleDes } from '@shared/modules/crypto';\nimport type { Mode, Pad, RsaPad, Sm4Mode, Sm4Pad } from '@shared/modules/crypto/type';\n\nexport const base64Encode = (val: string) => base64.encode({ src: val });\nexport const base64Decode = (val: string) => base64.decode({ src: val });\n\nexport const md5 = (val: string) => hash['md5-32']({ src: val });\nexport const md5X = md5;\n\nexport const aesEncode = (val: string, key: string, iv?: string, mode?: Mode, pad?: Pad, aad?: string) =>\n  aes.encode({ src: val, key, iv, mode, pad, aad });\nexport const aesDecode = (val: string, key: string, iv?: string, mode?: Mode, pad?: Pad, aad?: string) =>\n  aes.decode({ src: val, key, iv, mode, pad, aad });\nexport const aesX = (\n  mode: Mode,\n  encrypt: boolean,\n  input: string,\n  inBase64: boolean,\n  key: string,\n  iv: string,\n  outBase64: boolean,\n) => {\n  if (encrypt) {\n    return aes.encode({\n      src: input,\n      key,\n      iv,\n      mode,\n      inputEncode: inBase64 ? 'base64' : 'utf8',\n      outputEncode: outBase64 ? 'base64' : 'utf8',\n    });\n  } else {\n    return aes.decode({\n      src: input,\n      key,\n      iv,\n      mode,\n      inputEncode: inBase64 ? 'base64' : 'utf8',\n      outputEncode: outBase64 ? 'base64' : 'utf8',\n    });\n  }\n};\n\nexport const desEncode = (val: string, key: string, iv?: string, mode?: Mode, pad?: Pad) =>\n  des.encode({ src: val, key, iv, mode, pad });\nexport const desDecode = (val: string, key: string, iv?: string, mode?: Mode, pad?: Pad) =>\n  des.decode({ src: val, key, iv, mode, pad });\nexport const desX = (\n  mode: Mode,\n  encrypt: boolean,\n  input: string,\n  inBase64: boolean,\n  key: string,\n  iv: string,\n  outBase64: boolean,\n) => {\n  if (encrypt) {\n    return des.encode({\n      src: input,\n      key,\n      iv,\n      mode,\n      inputEncode: inBase64 ? 'base64' : 'utf8',\n      outputEncode: outBase64 ? 'base64' : 'utf8',\n    });\n  } else {\n    return des.decode({\n      src: input,\n      key,\n      iv,\n      mode,\n      inputEncode: inBase64 ? 'base64' : 'utf8',\n      outputEncode: outBase64 ? 'base64' : 'utf8',\n    });\n  }\n};\n\nexport const rabbitEncode = (val: string, key: string, iv?: string) => rabbit.encode({ src: val, key, iv });\nexport const rabbitDecode = (val: string, key: string, iv?: string) => rabbit.decode({ src: val, key, iv });\n\nexport const rabbitLegacyEncode = (val: string, key: string, iv?: string) => rabbitLegacy.encode({ src: val, key, iv });\nexport const rabbitLegacyDecode = (val: string, key: string, iv?: string) => rabbitLegacy.decode({ src: val, key, iv });\n\nexport const rc4Encode = (val: string, key: string) => rc4.encode({ src: val, key });\nexport const rc4Decode = (val: string, key: string) => rc4.decode({ src: val, key });\n\nexport const rsaEncode = (val: string, key: string, passphrase?: string, pad?: RsaPad) =>\n  rsa.encode({ src: val, key, passphrase, pad });\nexport const rsaDecode = (val: string, key: string, passphrase?: string, pad?: RsaPad) =>\n  rsa.decode({ src: val, key, passphrase, pad });\nexport const rsaX = (\n  mode: RsaPad,\n  pub: boolean,\n  encrypt: boolean,\n  input: string,\n  inBase64: boolean,\n  key: string,\n  outBase64: boolean,\n) => {\n  if (encrypt) {\n    return rsa.encode({\n      src: input,\n      key,\n      type: pub ? 0 : 1,\n      pad: mode,\n      inputEncode: inBase64 ? 'base64' : 'utf8',\n      outputEncode: outBase64 ? 'base64' : 'utf8',\n      long: true,\n    });\n  } else {\n    return rsa.decode({\n      src: input,\n      key,\n      type: pub ? 0 : 1,\n      pad: mode,\n      inputEncode: inBase64 ? 'base64' : 'utf8',\n      outputEncode: outBase64 ? 'base64' : 'utf8',\n      long: true,\n    });\n  }\n};\n\nexport const sm4Encode = (val: string, key: string, iv?: string, mode?: Sm4Mode, pad?: Sm4Pad, aad?: string) =>\n  sm4.encode({ src: val, key, iv, mode, pad, aad });\nexport const sm4Decode = (val: string, key: string, iv?: string, mode?: Sm4Mode, pad?: Sm4Pad, aad?: string) =>\n  sm4.decode({ src: val, key, iv, mode, pad, aad });\n\nexport const tripleDesEncode = (val: string, key: string, iv: string, mode?: Mode, pad?: Pad) =>\n  tripleDes.encode({ src: val, key, iv, mode, pad });\nexport const tripleDesDecode = (val: string, key: string, iv: string, mode?: Mode, pad?: Pad) =>\n  tripleDes.decode({ src: val, key, iv, mode, pad });\n"
  },
  {
    "path": "src/main/utils/hiker/htmlParser.ts",
    "content": "import { urlResolve } from '@shared/modules/headers';\nimport type { Cheerio, CheerioAPI } from 'cheerio';\nimport * as cheerio from 'cheerio';\nimport { JSONPath } from 'jsonpath-plus';\n\nconst PARSE_CACHE = true; // 解析缓存\nconst NOADD_INDEX = ':eq|:lt|:gt|:first|:last|:not|:even|:odd|:has|:contains|:matches|:empty|^body$|^#'; // 不自动加eq下标索引\nconst URLJOIN_ATTR = '(url|src|href|-original|-src|-play|-url|style)$|^(data-|url-|src-)'; // 需要自动urljoin的属性\nconst SPECIAL_URL = '^(ftp|magnet|thunder|ws):'; // 过滤特殊链接,不走urljoin\n\nclass Jsoup {\n  MY_URL: string = '';\n  pdfh_html = '';\n  pdfa_html = '';\n  pdfh_doc: CheerioAPI | null = null;\n  pdfa_doc: CheerioAPI | null = null;\n\n  constructor(MY_URL: string = '') {\n    this.MY_URL = MY_URL;\n  }\n\n  // 测试\n  test(text: string, string: string): boolean {\n    const searchObj = new RegExp(text, 'im').exec(string);\n    return !!searchObj;\n  }\n\n  // 包含\n  contains(text: string, match: string): boolean {\n    return text.includes(match);\n  }\n\n  /**\n   * 海阔解析表达式转原生表达式,自动补eq,如果传了first就最后一个也取eq(0)\n   */\n  parseHikerToJq(parse: string, first: boolean = false): string {\n    if (this.contains(parse, '&&')) {\n      const parses = parse.split('&&'); // 带&&的重新拼接\n      const new_parses: string[] = []; //  构造新的解析表达式列表\n      for (let i = 0; i < parses.length; i++) {\n        const ps_list = parses[i].split(' ');\n        const ps = ps_list.at(-1); // 如果分割&&后带空格就取最后一个元素\n        if (!this.test(NOADD_INDEX, ps!)) {\n          if (!first && i >= parses.length - 1) {\n            // 不传first且遇到最后一个,不用补eq(0)\n            new_parses.push(parses[i]);\n          } else {\n            new_parses.push(`${parses[i]}:eq(0)`);\n          }\n        } else {\n          new_parses.push(parses[i]);\n        }\n      }\n      parse = new_parses.join(' ');\n    } else {\n      const ps_list = parse.split(' ');\n      const ps = ps_list.at(-1); // 如果带空格就取最后一个元素\n      if (!this.test(NOADD_INDEX, ps!) && first) {\n        parse = `${parse}:eq(0)`;\n      }\n    }\n\n    return parse;\n  }\n\n  /**\n   * 根据传入的单规则获取 parse规则, 索引位置,排除列表  -- 可以用于剔除元素,支持多个, 按标签剔除, 按id剔除等操作\n   */\n  getParseInfo(nparse: string): { nparse_rule: string; nparse_index: number; excludes: string[] } {\n    let excludes: string[] = []; // 定义排除列表默认值为空\n    let nparse_index: number = 0; // 定义位置索引默认值为0\n    let nparse_rule: string = nparse; // 定义规则默认值为本身\n\n    if (this.contains(nparse, ':eq')) {\n      nparse_rule = nparse.split(':eq')[0];\n      let nparse_pos = nparse.split(':eq')[1];\n      if (this.contains(nparse_rule, '--')) {\n        excludes = nparse_rule.split('--').slice(1);\n        nparse_rule = nparse_rule.split('--')[0];\n      } else if (this.contains(nparse_pos, '--')) {\n        excludes = nparse_pos.split('--').slice(1);\n        nparse_pos = nparse_pos.split('--')[0];\n      }\n      try {\n        nparse_index = Number.parseInt(nparse_pos.split('(')[1].split(')')[0]);\n      } catch {}\n    } else if (this.contains(nparse, '--')) {\n      nparse_rule = nparse.split('--')[0];\n      excludes = nparse.split('--').slice(1);\n    }\n\n    return { nparse_rule, nparse_index, excludes };\n  }\n\n  /**\n   * 处理jquery lt和gt顺序不一致会导致跟jsoup表现不一致的问题，确保相邻位置的lt始终在gt前面\n   */\n  reorderAdjacentLtAndGt(selector: string): string {\n    // 使用正则表达式匹配相邻的 :gt() 和 :lt()，包括它们的参数\n    const adjacentPattern = /:gt\\((\\d+)\\):lt\\((\\d+)\\)/;\n\n    // 循环，直到没有更多相邻的 :gt() 和 :lt() 需要交换\n    let match = adjacentPattern.exec(selector);\n    while (match !== null) {\n      // 构建交换后的字符串\n      const replacement = `:lt(${match[2]}):gt(${match[1]})`;\n      selector = selector.substring(0, match.index) + replacement + selector.substring(match.index + match[0].length);\n\n      // 为了避免跳过任何可能的匹配项，从当前匹配项的开始位置重新开始匹配\n      adjacentPattern.lastIndex = match.index;\n\n      match = adjacentPattern.exec(selector);\n    }\n\n    return selector;\n  }\n\n  /**\n   * 解析空格分割后的原生表达式中的一条记录,正确处理eq的索引,返回处理后的ret\n   */\n  parseOneRule(doc: CheerioAPI, nparse: string, ret: Cheerio<any> | null = null) {\n    let { nparse_rule, nparse_index, excludes } = this.getParseInfo(nparse);\n    nparse_rule = this.reorderAdjacentLtAndGt(nparse_rule);\n    if (!ret) ret = doc(nparse_rule);\n    else ret = ret.find(nparse_rule);\n\n    if (this.contains(nparse, ':eq')) ret = ret.eq(nparse_index);\n\n    if (excludes.length > 0 && ret) {\n      ret = ret.clone(); // 克隆一个，避免直接remove影响原始DOM\n      // ret = ret.toArray().map(element => doc(element));\n\n      for (const exclude of excludes) {\n        ret.find(exclude).remove();\n      }\n    }\n\n    return ret;\n  }\n\n  parseText(text: string) {\n    // 使用正则表达式替换所有空白字符序列为单个换行符 '\\n'\n    text = text.replace(/\\s+/g, '\\n');\n    // 压缩连续的换行符为单个换行符\n    // text = text.replace(/\\n+/g, '\\n').trim();\n    // 去除字符串开头的空白。不用trim去所有\n    text = text.replace(/\\n+/g, '\\n').replace(/^\\s+/, '');\n    // 前面两步执行完结果和py的一致。剩下的就是把\\n替换成空格就和java的一致了\n    text = text.replace(/\\n/g, ' ');\n    return text;\n  }\n\n  /**\n   * 解析空格分割后的原生表达式,返回处理后的ret\n   * @see https://pyquery.readthedocs.io/en/latest/api.html\n   */\n  pdfa(html: string, parse: string): string[] {\n    if (!html || !parse) return [];\n    parse = this.parseHikerToJq(parse);\n\n    const doc = cheerio.load(html);\n    if (PARSE_CACHE) {\n      if (this.pdfa_html !== html) {\n        this.pdfa_html = html;\n        this.pdfa_doc = doc;\n      }\n    }\n\n    const parses = parse.split(' ');\n    let ret: Cheerio<any> | null = null;\n    for (const nparse of parses) {\n      ret = this.parseOneRule(doc, nparse, ret);\n      if (!ret) return [];\n    }\n\n    const res: string[] = (ret?.toArray() ?? []).map((item: any) => {\n      const res_html = `${doc(item)}`; // outerHTML()\n      // const res_html = doc(item).html(); // innerHTML()\n      return res_html || ''; // 空值检查，将 null 值转换为空字符串\n    });\n    return res;\n  }\n\n  pdfl(html: string, parse: string, list_text: string, list_url: string, _url_key: string): string[] {\n    if (!html || !parse) return [];\n    parse = this.parseHikerToJq(parse, false);\n    const new_vod_list: any = [];\n\n    const doc = cheerio.load(html);\n    const parses: string[] = parse.split(' ');\n    let ret: Cheerio<any> | null = null;\n    for (const pars of parses) {\n      ret = this.parseOneRule(doc, pars, ret);\n      if (!ret) return [];\n    }\n\n    ret!.each((_, element) => {\n      // new_vod_list.push(`${doc(element)}`); // outerHTML()\n      // new_vod_list.push(doc(element).html()); // innerHTML()\n\n      const _html = `${doc(element)}`;\n      // new_vod_list.push(`${doc(element)}`);\n      const _doc = cheerio.load(_html);\n      const _ret1 = null;\n      const _title = this.parseOneRule(_doc, list_text, _ret1);\n      const _ret2 = null;\n      const _url = this.parseOneRule(_doc, list_url, _ret2);\n      new_vod_list.push(`${_title}${_url}`);\n    });\n\n    return new_vod_list;\n  }\n\n  /**\n   * 解析空格分割后的原生表达式,返回处理后的ret\n   * https://pyquery.readthedocs.io/en/latest/api.html\n   * @param html\n   * @param parse\n   * @param baseUrl\n   */\n  pdfh(html: string, parse: string, baseUrl: string = ''): string {\n    if (!html || !parse) return '';\n\n    const doc: CheerioAPI = cheerio.load(html);\n    if (PARSE_CACHE) {\n      if (this.pdfa_html !== html) {\n        this.pdfa_html = html;\n        this.pdfa_doc = doc;\n      }\n    }\n\n    if (parse === 'body&&Text' || parse === 'Text') {\n      return this.parseText(doc.text());\n    } else if (parse === 'body&&Html' || parse === 'Html') {\n      return doc.html();\n    }\n\n    let option: string | undefined;\n    if (this.contains(parse, '&&')) {\n      const parts: string[] = parse.split('&&');\n      option = parts.at(-1);\n      parse = parts.slice(0, -1).join('&&');\n    }\n    parse = this.parseHikerToJq(parse, true);\n    const parses: string[] = parse.split(' ');\n\n    let ret: Cheerio<any> | string | null = null;\n    for (const nparse of parses) {\n      ret = this.parseOneRule(doc, nparse, ret);\n      if (!ret) return '';\n    }\n    if (option) {\n      switch (option) {\n        case 'Text': {\n          ret = (ret as Cheerio<any>)?.text() || '';\n          ret = ret ? this.parseText(ret) : '';\n          break;\n        }\n        case 'Html': {\n          ret = (ret as Cheerio<any>)?.html() || '';\n          break;\n        }\n        default: {\n          // 保留原来的ret\n          const original_ret = (ret as Cheerio<any>)?.clone();\n          const options = option.split('||');\n          let opt_index = 0;\n          for (const opt of options) {\n            // console.log(`opt_index:${opt_index},opt:${opt}`);\n            opt_index = opt_index + 1;\n            ret = original_ret?.attr(opt) || '';\n            // console.log('ret:', ret);\n            if (this.contains(opt.toLowerCase(), 'style') && this.contains(ret, 'url(')) {\n              try {\n                ret = ret.match(/url\\((.*?)\\)/)![1];\n                // 2023/07/28新增 style取内部链接自动去除首尾单双引号\n                ret = ret.replace(/^['\"]|['\"]$/g, '');\n              } catch {}\n            }\n            if (ret && baseUrl) {\n              const needAdd = this.test(URLJOIN_ATTR, opt) && !this.test(SPECIAL_URL, ret);\n              if (needAdd) {\n                if (ret.includes('http')) {\n                  ret = ret.slice(ret.indexOf('http'));\n                } else {\n                  ret = urlResolve(baseUrl, ret);\n                }\n              }\n            }\n            if (ret) {\n              break;\n            }\n          }\n        }\n      }\n    } else {\n      // 增加返回字符串，禁止直接返回pq对象\n      ret = `${ret}`;\n    }\n\n    return ret as string;\n  }\n\n  pd(html: string, parse: string, baseUrl: string = ''): string {\n    if (!baseUrl) baseUrl = this.MY_URL;\n    return this.pdfh(html, parse, baseUrl);\n  }\n\n  pq(html: string) {\n    return cheerio.load(html);\n  }\n\n  pjfh(html: any, parse: string, addUrl = false): string {\n    if (!html || !parse) return '';\n\n    try {\n      html = typeof html === 'string' ? JSON.parse(html) : html;\n    } catch {\n      console.log('字符串转json失败');\n      return '';\n    }\n\n    if (!parse.startsWith('$.')) parse = `$.${parse}`;\n\n    let ret = '';\n    const paths = parse.split('||');\n    for (const path of paths) {\n      const queryResult = JSONPath({ path, json: html });\n      ret = Array.isArray(queryResult) ? queryResult[0] || '' : queryResult || '';\n      if (addUrl && ret) ret = urlResolve(this.MY_URL, ret);\n      if (ret) break;\n    }\n\n    return ret;\n  }\n\n  pj(html: any, parse: string): string {\n    return this.pjfh(html, parse, true);\n  }\n\n  pjfa(html: any, parse: string): string[] {\n    if (!html || !parse) return [];\n\n    try {\n      html = typeof html === 'string' ? JSON.parse(html) : html;\n    } catch {\n      return [];\n    }\n\n    if (!parse.startsWith('$.')) parse = `$.${parse}`;\n\n    const result = JSONPath({ path: parse, json: html });\n    if (Array.isArray(result) && Array.isArray(result[0]) && result.length === 1) {\n      return result[0];\n    }\n\n    return result || [];\n  }\n}\n\nconst pd = (html: string, parse: string, base_url: string = globalThis?.MY_URL || ''): string => {\n  const jsp = new Jsoup(base_url);\n  return jsp.pd(html, parse);\n};\n\nconst pdfa = (html: string, parse: string): string[] => {\n  const jsp = new Jsoup();\n  return jsp.pdfa(html, parse);\n};\n\nconst pdfh = (html: string, parse: string, base_url: string = globalThis?.MY_URL || ''): string => {\n  const jsp = new Jsoup(base_url);\n  return jsp.pdfh(html, parse, base_url);\n};\n\nconst pdfl = (html: string, parse: string, list_text: string, list_url: string, url_key: string): string[] => {\n  const jsp = new Jsoup();\n  return jsp.pdfl(html, parse, list_text, list_url, url_key);\n};\n\nexport { pd, pdfa, pdfh, pdfl };\n"
  },
  {
    "path": "src/main/utils/hiker/index.ts",
    "content": "import * as ruleParse from './ruleParse';\nimport * as similarity from './similarity';\n\nexport { ruleParse, similarity };\n\nexport * from './inject';\n"
  },
  {
    "path": "src/main/utils/hiker/inject.ts",
    "content": "import { urlResolve } from '@shared/modules/headers';\n\nimport BaseSpider from './baseSpider';\nimport jinja from './jinja';\nimport local from './local';\n\nexport { BaseSpider, jinja, local };\n\nexport * from './crypto';\nexport * from './htmlParser';\nexport * from './proxy';\n\nexport const joinUrl = urlResolve;\nexport * from './ua';\n"
  },
  {
    "path": "src/main/utils/hiker/jinja.ts",
    "content": "/*!\n * Jinja Templating for JavaScript v0.1.8\n * https://github.com/sstur/jinja-js\n *\n * This is a slimmed-down Jinja2 implementation [http://jinja.pocoo.org/]\n *\n * In the interest of simplicity, it deviates from Jinja2 as follows:\n * - Line statements, cycle, super, macro tags and block nesting are not implemented\n * - auto escapes html by default (the filter is \"html\" not \"e\")\n * - Only \"html\" and \"safe\" filters are built in\n * - Filters are not valid in expressions; `foo|length > 1` is not valid\n * - Expression Tests (`if num is odd`) not implemented (`is` translates to `==` and `isnot` to `!=`)\n *\n * Notes:\n * - if property is not found, but method '_get' exists, it will be called with the property name (and cached)\n * - `{% for n in obj %}` iterates the object's keys; get the value with `{% for n in obj %}{{ obj[n] }}{% endfor %}`\n * - subscript notation `a[0]` takes literals or simple variables but not `a[item.key]`\n * - `.2` is not a valid number literal; use `0.2`\n *\n */\n\nconst STRINGS = /'(\\\\.|[^'])*'|\"(\\\\.|[^\"'])*\"/g;\nconst IDENTS_AND_NUMS = /([$_a-z][$\\w]*)|([+-]?\\d+(\\.\\d+)?)/g;\nconst NUMBER = /^[+-]?\\d+(?:\\.\\d+)?$/;\n// non-primitive literals (array and object literals)\nconst NON_PRIMITIVES = /\\[[@#~](,[@#~])*\\]|\\[\\]|\\{([@i]:[@#~])(,[@i]:[@#~])*\\}|\\{\\}/g;\n// bare identifiers such as variables and in object literals: {foo: 'value'}\nconst IDENTIFIERS = /[$_a-z][$\\w]*/gi;\nconst VARIABLES = /i(\\.i|\\[[@#i]\\])*/g;\nconst ACCESSOR = /(\\.i|\\[[@#i]\\])/g;\nconst OPERATORS = /(===?|!==?|>=?|<=?|&&|\\|\\||[+\\-*/%])/g;\n// extended (english) operators\nconst EOPS = /(^|[^$\\w])(and|or|not|is|isnot)([^$\\w]|$)/g;\nconst LEADING_SPACE = /^\\s+/;\nconst TRAILING_SPACE = /\\s+$/;\n\nconst START_TOKEN = /\\{\\{\\{|\\{\\{|\\{%|\\{#/;\nconst TAGS: Record<string, RegExp> = {\n  '{{{': /^('(\\\\.|[^'])*'|\"(\\\\.|[^\"'])*\"|.)+?\\}\\}\\}/,\n  '{{': /^('(\\\\.|[^'])*'|\"(\\\\.|[^\"'])*\"|.)+?\\}\\}/,\n  '{%': /^('(\\\\.|[^'])*'|\"(\\\\.|[^\"'])*\"|.)+?%\\}/,\n  '{#': /^('(\\\\.|[^'])*'|\"(\\\\.|[^\"'])*\"|.)+?#\\}/,\n};\n\nconst delimeters: Record<string, string> = {\n  '{%': 'directive',\n  '{{': 'output',\n  '{#': 'comment',\n};\n\nconst operators: Record<string, string> = {\n  and: '&&',\n  or: '||',\n  not: '!',\n  is: '==',\n  isnot: '!=',\n};\n\nconst constants: Record<string, boolean | null> = {\n  true: true,\n  false: false,\n  null: null,\n};\n\nclass Parser {\n  nest: string[] = [];\n  compiled: string[] = [];\n  childBlocks: number = 0;\n  parentBlocks: number = 0;\n  isSilent: boolean = false;\n\n  rawMode: boolean = false;\n  isParent: boolean = false;\n  hasParent: boolean = false;\n  isInclude: boolean = false;\n\n  constructor() {}\n\n  readTemplateFile!: (name: string) => string;\n\n  push(line: string): void {\n    if (!this.isSilent) {\n      this.compiled.push(line);\n    }\n  }\n\n  parse(src: string): string[] {\n    this.tokenize(src);\n    return this.compiled;\n  }\n\n  tokenize(src: string): void {\n    let lastEnd = 0;\n    // eslint-disable-next-line ts/no-this-alias\n    const parser = this;\n    let trimLeading = false;\n    // @ts-expect-error not all code paths return values TS7030\n    matchAll(src, START_TOKEN, (open: string, index: number, src: string) => {\n      // here we match the rest of the src against a regex for this tag\n      const match = src.slice(index + open.length).match(TAGS[open]);\n      const matched = match ? match[0] : '';\n      // here we sub out strings so we don't get false matches\n      const simplified = matched.replace(STRINGS, '@');\n      // if we don't have a close tag or there is a nested open tag\n      if (!match || simplified.includes(open)) {\n        return index + 1;\n      }\n      let inner = matched.slice(0, 0 - open.length);\n      // check for white-space collapse syntax\n      const wsCollapseLeft = inner.charAt(0) === '-';\n      const wsCollapseRight = inner.slice(-1) === '-';\n      inner = inner.replace(/^-|-$/g, '').trim();\n      // if we're in raw mode and we are not looking at an \"endraw\" tag, move along\n      if (parser.rawMode && open + inner !== '{%endraw') {\n        return index + 1;\n      }\n      let text = src.slice(lastEnd, index);\n      lastEnd = index + open.length + match.length;\n      if (trimLeading) text = trimLeft(text);\n      if (wsCollapseLeft) text = trimRight(text);\n      if (wsCollapseRight) trimLeading = true;\n      if (open === '{{{') {\n        // liquid-style: make {{{x}}} => {{x|safe}}\n        open = '{{';\n        inner += '|safe';\n      }\n      parser.textHandler(text);\n      parser.tokenHandler(open, inner);\n    });\n    let text = src.slice(lastEnd);\n    if (trimLeading) text = trimLeft(text);\n    this.textHandler(text);\n  }\n\n  textHandler(text: string): void {\n    this.push(`write(${JSON.stringify(text)});`);\n  }\n\n  tokenHandler(open: string, inner: string): void {\n    const type = delimeters[open];\n    if (type === 'directive') {\n      this.compileTag(inner);\n    } else if (type === 'output') {\n      const extracted: any = this.extractEnt(inner, STRINGS, '@');\n      // replace || operators with ~\n      extracted.src = extracted.src.replace(/\\|\\|/g, '~').split('|');\n      // put back || operators\n      extracted.src = extracted.src.map(function (part: string) {\n        return part.split('~').join('||');\n      });\n      const parts = this.injectEnt(extracted, '@');\n      if (parts.length > 1) {\n        const filters = parts.slice(1).map(this.parseFilter.bind(this));\n        this.push(`filter(${this.parseExpr(parts[0])},${filters.join(',')});`);\n      } else {\n        this.push(`filter(${this.parseExpr(parts[0])});`);\n      }\n    }\n  }\n\n  compileTag(str: string): void {\n    const directive = str.split(' ')[0];\n    const handler = tagHandlers[directive];\n    if (!handler) throw new Error(`Invalid tag: ${str}`);\n    handler.call(this, str.slice(directive.length).trim());\n  }\n\n  parseFilter(src: string): string {\n    src = src.trim();\n    const match = src.match(/[:(]/);\n    const i = (match ? match.index : -1)!;\n    if (i < 0) return JSON.stringify([src]);\n    const name = src.slice(0, i);\n    let args = src.charAt(i) === ':' ? src.slice(i + 1) : src.slice(i + 1, -1);\n    args = this.parseExpr(args, { terms: true });\n    return `[${JSON.stringify(name)},${args}]`;\n  }\n\n  extractEnt(\n    src: string,\n    regex: RegExp,\n    placeholder: string | ((s: string) => string | null),\n  ): { src: string; subs: string[] } {\n    const subs: string[] = [];\n    const isFunc = typeof placeholder === 'function';\n    src = src.replace(regex, function (str) {\n      const replacement = isFunc ? placeholder(str) : placeholder;\n      if (replacement) {\n        subs.push(str);\n        return replacement;\n      }\n      return str;\n    });\n    return { src, subs };\n  }\n\n  injectEnt(extracted: { src: string; subs: string[] }, placeholder: string): string[] {\n    const { src, subs } = extracted;\n    const isArr = Array.isArray(src);\n    const arr = isArr ? src : [src];\n    const re = new RegExp(`[${placeholder}]`, 'g');\n    let i = 0;\n    arr.forEach(function (src, index) {\n      arr[index] = src.replace(re, function () {\n        return subs[i++];\n      });\n    });\n    return isArr ? arr : arr[0];\n  }\n\n  // replace complex literals without mistaking subscript notation with array literals\n  replaceComplex(s: string): string[] {\n    const parsed = this.extractEnt(s, /i(\\.i|\\[[@#i]\\])+/g, 'v');\n    parsed.src = parsed.src.replace(NON_PRIMITIVES, '~');\n    return this.injectEnt(parsed, 'v');\n  }\n\n  // parse expression containing literals (including objects/arrays) and variables (including dot and subscript notation)\n  // valid expressions: `a + 1 > b.c or c == null`, `a and b[1] != c`, `(a < b) or (c < d and e)`, 'a || [1]`\n  parseExpr(src: string, opts?: { terms?: boolean }): string {\n    opts = opts || {};\n    // extract string literals -> @\n    const parsed1: any = this.extractEnt(src, STRINGS, '@');\n    // note: this will catch {not: 1} and a.is; could we replace temporarily and then check adjacent chars?\n    parsed1.src = parsed1.src.replace(EOPS, function (s, before, op, after) {\n      return op in operators ? before + operators[op] + after : s;\n    });\n    // sub out non-string literals (numbers/true/false/null) -> #\n    // the distinction is necessary because @ can be object identifiers, # cannot\n    const parsed2: any = this.extractEnt(parsed1.src, IDENTS_AND_NUMS, function (s) {\n      return s in constants || NUMBER.test(s) ? '#' : null;\n    });\n    // sub out object/variable identifiers -> i\n    const parsed3: any = this.extractEnt(parsed2.src, IDENTIFIERS, 'i');\n    // remove white-space\n    parsed3.src = parsed3.src.replace(/\\s+/g, '');\n\n    // the rest of this is simply to boil the expression down and check validity\n    let simplified = parsed3.src;\n    // sub out complex literals (objects/arrays) -> ~\n    // the distinction is necessary because @ and # can be subscripts but ~ cannot\n    // while (simplified !== (simplified = this.replaceComplex(simplified)));\n    while (true) {\n      const vaild = simplified !== (simplified = this.replaceComplex(simplified));\n      if (!vaild) break;\n    }\n    // now @ represents strings, # represents other primitives and ~ represents non-primitives\n    // replace complex variables (those with dot/subscript accessors) -> v\n    // while (simplified !== (simplified = simplified.replace(/i(\\.i|\\[[@#i]\\])+/, 'v')));\n    while (true) {\n      const vaild = simplified !== (simplified = simplified.replace(/i(\\.i|\\[[@#i]\\])+/, 'v'));\n      if (!vaild) break;\n    }\n    // empty subscript or complex variables in subscript, are not permitted\n    simplified = simplified.replace(/[iv]\\[v?\\]/g, 'x');\n    // sub in \"i\" for @ and # and ~ and v (now \"i\" represents all literals, variables and identifiers)\n    simplified = simplified.replace(/[@#~v]/g, 'i');\n    // sub out operators\n    simplified = simplified.replace(OPERATORS, '%');\n    // allow 'not' unary operator\n    simplified = simplified.replace(/!+i/g, 'i');\n    const terms = opts.terms ? simplified.split(',') : [simplified];\n    terms.forEach(function (term) {\n      // simplify logical grouping\n      // while (term !== (term = term.replace(/\\(i(%i)*\\)/g, 'i')));\n      while (true) {\n        const vaild = term !== (term = term.replace(/\\(i(%i)*\\)/g, 'i'));\n        if (!vaild) break;\n      }\n      if (!/^i(?:%i)*/.test(term)) {\n        throw new Error(`Invalid expression: ${src}`);\n      }\n    });\n\n    parsed3.src = parsed3.src.replace(VARIABLES, this.parseVar.bind(this));\n    parsed2.src = this.injectEnt(parsed3, 'i');\n    parsed1.src = this.injectEnt(parsed2, '#');\n    return this.injectEnt(parsed1, '@') as unknown as string;\n  }\n\n  parseVar(src: string, ...rest: any[]): string {\n    const args = rest.slice();\n    const str = args.pop();\n    const index = args.pop();\n\n    // quote bare object identifiers (might be a reserved word like {while: 1})\n    if (src === 'i' && str.charAt(index + 1) === ':') {\n      return '\"i\"';\n    }\n    const parts = ['\"i\"'];\n    src.replace(ACCESSOR, (part): any => {\n      if (part === '.i') {\n        parts.push('\"i\"');\n      } else if (part === '[i]') {\n        parts.push('get(\"i\")');\n      } else {\n        parts.push(part.slice(1, -1));\n      }\n    });\n    return `get(${parts.join(',')})`;\n  }\n\n  // escapes a name to be used as a javascript identifier\n  escName(str: string): string {\n    return str.replace(/\\W/g, function (s) {\n      return `$${s.charCodeAt(0).toString(16)}`;\n    });\n  }\n\n  parseQuoted(str: string): string {\n    if (str.charAt(0) === \"'\") {\n      str = str.slice(1, -1).replace(/\\\\.|\"/, function (s) {\n        if (s === \"\\\\'\") return \"'\";\n        return s.charAt(0) === '\\\\' ? s : `\\\\${s}`;\n      });\n      str = `\"${str}\"`;\n    }\n    // todo: try/catch or deal with invalid characters (linebreaks, control characters)\n    return JSON.parse(str);\n  }\n}\n\ninterface TagHandlerContext extends Parser {}\n// the context 'this' inside tagHandlers is the parser instance\nconst tagHandlers: { [key: string]: (this: TagHandlerContext, expr: string) => void } = {\n  if(expr) {\n    this.push(`if (${this.parseExpr(expr)}) {`);\n    this.nest.unshift('if');\n  },\n  else() {\n    if (this.nest[0] === 'for') {\n      this.push('}, function() {');\n    } else {\n      this.push('} else {');\n    }\n  },\n  elseif(expr) {\n    this.push(`} else if (${this.parseExpr(expr)}) {`);\n  },\n  endif() {\n    this.nest.shift();\n    this.push('}');\n  },\n  for(str) {\n    const i = str.indexOf(' in ');\n    const name = str.slice(0, i).trim();\n    const expr = str.slice(i + 4).trim();\n    this.push(`each(${this.parseExpr(expr)},${JSON.stringify(name)},function() {`);\n    this.nest.unshift('for');\n  },\n  endfor() {\n    this.nest.shift();\n    this.push('});');\n  },\n  raw() {\n    this.rawMode = true;\n  },\n  endraw() {\n    this.rawMode = false;\n  },\n  set(stmt) {\n    const i = stmt.indexOf('=');\n    const name = stmt.slice(0, i).trim();\n    const expr = stmt.slice(i + 1).trim();\n    this.push(`set(${JSON.stringify(name)},${this.parseExpr(expr)});`);\n  },\n  block(name) {\n    if (this.isParent) {\n      ++this.parentBlocks;\n      const blockName = `block_${this.escName(name) || this.parentBlocks}`;\n      this.push(`block(typeof ${blockName} == \"function\" ? ${blockName} : function() {`);\n    } else if (this.hasParent) {\n      this.isSilent = false;\n      ++this.childBlocks;\n      const blockName = `block_${this.escName(name) || this.childBlocks}`;\n      this.push(`function ${blockName}() {`);\n    }\n    this.nest.unshift('block');\n  },\n  endblock() {\n    this.nest.shift();\n    if (this.isParent) {\n      this.push('});');\n    } else if (this.hasParent) {\n      this.push('}');\n      this.isSilent = true;\n    }\n  },\n  extends(name) {\n    name = this.parseQuoted(name);\n    const parentSrc = this.readTemplateFile(name);\n    this.isParent = true;\n    this.tokenize(parentSrc);\n    this.isParent = false;\n    this.hasParent = true;\n    // silence output until we enter a child block\n    this.isSilent = true;\n  },\n  include(name) {\n    name = this.parseQuoted(name);\n    const incSrc = this.readTemplateFile(name);\n    this.isInclude = true;\n    this.tokenize(incSrc);\n    this.isInclude = false;\n  },\n};\n\n// liquid style\ntagHandlers.assign = tagHandlers.set;\n// python/django style\ntagHandlers.elif = tagHandlers.elseif;\n\ninterface RuntimeOptions {\n  autoEscape?: 'toJson';\n  filters?: { [key: string]: (...args: any[]) => any };\n}\n\ninterface Runtime {\n  get: (...args: any[]) => any;\n  set: (n: string, val: any) => void;\n  push: (ctx?: object) => void;\n  pop: () => void;\n  write: (str: string) => void;\n  filter: (val: any, ...filters: any[]) => void;\n  each: (obj: any, loopvar: string, fn1: (val: any) => void, fn2?: () => void) => void;\n  block: (fn: () => void) => void;\n  render: () => string;\n}\n\nconst getRuntime = function runtime(data: object, opts: RuntimeOptions): Runtime {\n  const defaults = { autoEscape: 'toJson' };\n  const _toString = Object.prototype.toString;\n  const _hasOwnProperty = Object.prototype.hasOwnProperty;\n  const getKeys =\n    Object.keys ||\n    function (obj: object) {\n      const keys: string[] = [];\n      for (const n in obj) {\n        if (_hasOwnProperty.call(obj, n)) keys.push(n);\n      }\n      return keys;\n    };\n  const isArray =\n    Array.isArray ||\n    function (obj: any) {\n      return _toString.call(obj) === '[object Array]';\n    };\n  const create =\n    Object.create ||\n    function (obj: object) {\n      function F() {}\n      F.prototype = obj;\n      return new (F as any)();\n    };\n  const toString = function (val: any): string {\n    if (val == null) return '';\n    return typeof val.toString == 'function' ? val.toString() : _toString.call(val);\n  };\n  const extend = function (dest: any, src: any) {\n    const keys = getKeys(src);\n    for (let i = 0, len = keys.length; i < len; i++) {\n      const key = keys[i];\n      dest[key] = src[key];\n    }\n    return dest;\n  };\n  // get a value, lexically, starting in current context; a.b -> get(\"a\",\"b\")\n  const get = function () {\n    let val: any;\n    // eslint-disable-next-line prefer-rest-params\n    const n = arguments[0];\n    let c = stack.length;\n    while (c--) {\n      val = stack[c][n];\n      if (typeof val != 'undefined') break;\n    }\n    for (let i = 1, len = arguments.length; i < len; i++) {\n      if (val == null) continue;\n      // eslint-disable-next-line prefer-rest-params\n      const n = arguments[i];\n      val = _hasOwnProperty.call(val, n) ? val[n] : typeof val._get == 'function' ? (val[n] = val._get(n)) : null;\n    }\n    return val === null ? null : val;\n  };\n  const set = function (n: string, val: any) {\n    stack.at(-1)[n] = val;\n  };\n  const push = function (ctx?: object) {\n    stack.push(ctx || {});\n  };\n  const pop = function () {\n    stack.pop();\n  };\n  const write = function (str: string) {\n    output.push(str);\n  };\n  const filter = function (val: any) {\n    let name: string = '';\n    for (let i = 1, len = arguments.length; i < len; i++) {\n      // eslint-disable-next-line prefer-rest-params\n      const arr = arguments[i];\n      name = arr[0];\n      const filter = filters[name];\n      if (filter) {\n        arr[0] = val;\n        // now arr looks like [val, arg1, arg2]\n        val = filter.apply(data, arr);\n      } else {\n        throw new Error(`Invalid filter: ${name}`);\n      }\n    }\n    if (opts.autoEscape && name !== opts.autoEscape && name !== 'safe') {\n      // auto escape if not explicitly safe or already escaped\n      val = filters[opts.autoEscape].call(data, val);\n    }\n    output.push(val);\n  };\n  const each = function (obj: any, loopvar: string, fn1: (val: any) => void, fn2?: () => void) {\n    if (obj == null) return;\n    const arr = isArray(obj) ? obj : getKeys(obj);\n    const len = arr.length;\n    const ctx = { loop: { length: len, first: arr[0], last: arr[len - 1] } };\n    push(ctx);\n    for (let i = 0; i < len; i++) {\n      extend(ctx.loop, { index: i + 1, index0: i });\n      fn1((ctx[loopvar] = arr[i]));\n    }\n    if (len === 0 && fn2) fn2();\n    pop();\n  };\n  const block = function (fn: () => void) {\n    push();\n    fn();\n    pop();\n  };\n  const render = function () {\n    return output.join('');\n  };\n  data = data || {};\n  opts = extend(defaults, opts || {});\n  const filters = extend(\n    {\n      html(val: any) {\n        return toString(val)\n          .split('&')\n          .join('&amp;')\n          .split('<')\n          .join('&lt;')\n          .split('>')\n          .join('&gt;')\n          .split('\"')\n          .join('&quot;');\n      },\n      safe(val: any) {\n        return val;\n      },\n      toJson(val: any) {\n        if (typeof val === 'object') {\n          return JSON.stringify(val);\n        }\n        return toString(val);\n      },\n    },\n    opts.filters || {},\n  );\n  const stack: any[] = [create(data || {})];\n  const output: string[] = [];\n  return { get, set, push, pop, write, filter, each, block, render };\n};\n\nlet runtime: any;\n\n/*!\n * Helpers\n */\n\nfunction trimLeft(str: string): string {\n  return str.replace(LEADING_SPACE, '');\n}\n\nfunction trimRight(str: string): string {\n  return str.replace(TRAILING_SPACE, '');\n}\n\nfunction matchAll(str: string, reg: RegExp, fn: (m: string, i: number, s: string) => number | void): void {\n  // copy as global\n  reg = new RegExp(reg.source, `g${reg.ignoreCase ? 'i' : ''}${reg.multiline ? 'm' : ''}`);\n  let match: RegExpExecArray | null;\n  while (true) {\n    match = reg.exec(str);\n    if (match === null) break;\n    const result = fn(match[0], match.index, str);\n    if (typeof result == 'number') {\n      reg.lastIndex = result;\n    }\n  }\n}\n\nconst jinja: Record<string, any> = {\n  compile(markup: string, opts?: { runtime?: boolean }): { render: (data: any, options: any) => string } {\n    opts = opts || {};\n    const parser = new Parser() as Parser;\n    parser.readTemplateFile = this.readTemplateFile;\n    const code: string[] = [];\n    code.push('function render($) {');\n    code.push(\n      'var get = $.get, set = $.set, push = $.push, pop = $.pop, write = $.write, filter = $.filter, each = $.each, block = $.block;',\n    );\n    // eslint-disable-next-line prefer-spread\n    code.push.apply(code, parser.parse(markup));\n    code.push('return $.render();');\n    code.push('}');\n    const codeString = code.join('\\n');\n    let fn;\n    if (opts.runtime === false) {\n      // eslint-disable-next-line no-new-func\n      fn = new Function('data', 'options', `return (${codeString})(runtime(data, options))`);\n    } else {\n      runtime = runtime || (runtime = getRuntime.toString());\n      // eslint-disable-next-line no-new-func\n      fn = new Function('data', 'options', `return (${codeString})((${runtime})(data, options))`);\n    }\n    return { render: fn as any };\n  },\n\n  render(markup: string, data: any, opts: any): string {\n    const tmpl = this.compile(markup);\n    return tmpl.render(data, opts);\n  },\n\n  templateFiles: {},\n\n  readTemplateFile(name: string): string {\n    const templateFiles = this.templateFiles || {};\n    const templateFile = templateFiles[name];\n    if (templateFile == null) {\n      throw new Error(`Template file not found: ${name}`);\n    }\n    return templateFile;\n  },\n};\n\nexport default jinja;\n"
  },
  {
    "path": "src/main/utils/hiker/local.ts",
    "content": "import { CacheService } from '@shared/modules/cache';\n\nconst localKey = 'hiker';\n\nexport default {\n  get: (rulekey: string, key: string, value: any = '') => {\n    const res = CacheService.get(`${localKey}@${rulekey}@${key}`);\n    return res || value;\n  },\n  set: (rulekey: string, key: string, value: any) => {\n    const res = CacheService.set(`${localKey}@${rulekey}@${key}`, value);\n    return res;\n  },\n  delete: (rulekey: string, key: string) => {\n    const res = CacheService.remove(`${localKey}@${rulekey}@${key}`);\n    return res;\n  },\n};\n"
  },
  {
    "path": "src/main/utils/hiker/proxy.ts",
    "content": "import { PORT, PROXY_API } from '@shared/config/env';\n\nexport const getPort = (): string => PORT;\nexport const getUrl = (_local: boolean): string => PROXY_API;\nexport const getProxy = (local: boolean): string => `${getUrl(local)}?do=js`;\n\nexport const js2Proxy = (\n  dynamic: boolean,\n  siteType: number,\n  siteKey: string,\n  url: string,\n  headers: Record<string, any> = {},\n): string => {\n  const proxyUrl = getProxy(!dynamic);\n  const headerStr = encodeURIComponent(JSON.stringify(headers));\n  const encodedUrl = encodeURIComponent(url);\n\n  return `${proxyUrl}&from=catvod&siteType=${siteType}&siteKey=${siteKey}&header=${headerStr}&url=${encodedUrl}`;\n};\n"
  },
  {
    "path": "src/main/utils/hiker/request/asyncAxios.ts",
    "content": "import { Buffer } from 'node:buffer';\nimport path from 'node:path';\n\nimport { headersPascalCase } from '@shared/modules/headers';\nimport { toString } from '@shared/modules/toString';\nimport { isJsonStr } from '@shared/modules/validate';\nimport type { AxiosRequestConfig, AxiosResponse } from 'axios';\nimport axios from 'axios';\nimport FormData from 'form-data';\nimport fs from 'fs-extra';\nimport JSON5 from 'json5';\nimport mime from 'mime-types';\nimport protobuf from 'protobufjs';\n\nimport { MOBILE_UA, PC_UA } from '../ua';\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD';\n\ninterface RequestOptions {\n  method?: HttpMethod;\n  timeout?: number;\n  body?: any;\n  headers?: Record<string, string>;\n  redirect?: 0 | 1 | boolean;\n  toHex?: boolean;\n  onlyHeaders?: boolean;\n  withHeaders?: boolean;\n  withStatusCode?: boolean;\n}\n\nconst getTimeout = (timeout: number | undefined | null) => {\n  const baseTimeout = 5000;\n\n  if (timeout !== null && timeout !== undefined) {\n    return Math.max(baseTimeout, timeout);\n  }\n\n  if (globalThis.variable?.timeout) {\n    return Math.max(baseTimeout, globalThis.variable.timeout);\n  }\n\n  return baseTimeout;\n};\n\nconst isLikelyPath = (p: string) => {\n  if (typeof p !== 'string') return false;\n  if (p.trim() === '') return false;\n  if (path.isAbsolute(p)) return true;\n  if (p.includes('/') || p.includes('\\\\')) return true;\n  return false;\n};\n\nconst fetch = async (url: string, options: RequestOptions = {}) => {\n  try {\n    const method = (options.method || 'GET').toUpperCase() as HttpMethod;\n    const headers = headersPascalCase(options.headers || {});\n\n    const config: AxiosRequestConfig = {\n      url,\n      method,\n      headers,\n      timeout: getTimeout(options?.timeout),\n      maxRedirects: options?.redirect === false ? 0 : undefined,\n      responseType: 'arraybuffer',\n    };\n\n    if (!config.headers?.['User-Agent']) {\n      config.headers!['User-Agent'] = MOBILE_UA;\n    }\n    if (!config.headers?.Accept) {\n      config.headers!.Accept = '*/*';\n    }\n\n    const contentType = config.headers?.['Content-Type'] || '';\n    let charset: string = 'utf-8';\n    if (contentType.includes('charset=')) {\n      const match = contentType.match(/charset=([\\w-]+)/i);\n      if (match?.[1]) charset = match[1];\n    }\n\n    if (method !== 'GET') {\n      if (contentType.includes('application/x-www-form-urlencoded')) {\n        const body = isJsonStr(options.body) ? JSON5.parse(options.body) : options.body;\n        config.data = body;\n      } else if (['text/plain', 'text/html', 'text/xml'].some((t) => contentType.includes(t))) {\n        config.data = options.body;\n      } else if (contentType.includes('multipart/form-data')) {\n        const fd = new FormData();\n        if (isLikelyPath(options.body)) {\n          fd.append('file', fs.readFileSync(options.body), path.basename(options.body));\n        } else {\n          fd.append('file', options.body, 'file.txt');\n        }\n        Object.assign(headers, fd.getHeaders());\n        return fd;\n      } else if (contentType.includes('application/octet-stream')) {\n        let raw: Buffer;\n        if (isLikelyPath(options.body as string)) {\n          raw = Buffer.from(fs.readFileSync(options.body as string));\n        } else {\n          raw = Buffer.from(options.body as string);\n        }\n        config.data = raw;\n      } else if (contentType.includes('application/x-protobuf')) {\n        let raw: Buffer | Uint8Array;\n        if (\n          typeof options.body === 'object' &&\n          ['proto', 'bin', 'type'].every((key) => key in (options.body as Record<string, any>))\n        ) {\n          let { proto, bin, type } = options.body as Record<string, any>;\n          if (isLikelyPath(proto)) {\n            proto = fs.readFileSync(proto);\n          }\n          if (isLikelyPath(bin)) {\n            bin = fs.readFileSync(bin);\n          }\n          const root = protobuf.parse(proto).root;\n          const module = root.lookupType(type);\n          const message = module.create(bin);\n          raw = module.encode(message).finish();\n        } else {\n          if (isLikelyPath(options.body as string)) {\n            raw = Buffer.from(fs.readFileSync(options.body as string));\n          } else {\n            raw = Buffer.from(options.body as string);\n          }\n        }\n        config.data = raw;\n      } else {\n        if (!contentType) config.headers!['Content-Type'] = 'application/json';\n\n        const body = isJsonStr(options.body) ? JSON5.parse(options.body) : options.body;\n        config.data = body;\n      }\n    }\n\n    // console.warn(`[request] url: ${url} | method: ${method} | options: ${JSON.stringify(config)}`);\n\n    const resp: AxiosResponse<Buffer> = await axios(config);\n    // @ts-expect-error custom method\n    resp.getBody = function (encoding: BufferEncoding | undefined): string | Buffer {\n      const buffer = Buffer.from(resp.data);\n      return encoding ? buffer.toString(encoding) : buffer;\n    };\n\n    const { onlyHeaders, withHeaders, withStatusCode, toHex } = options || {};\n\n    if (onlyHeaders) {\n      return toString(resp.headers);\n    }\n\n    // @ts-expect-error custom method\n    const content = toHex ? resp.getBody('hex') : resp.getBody(charset);\n\n    if (!(withHeaders || withStatusCode)) {\n      return toString(content);\n    }\n\n    return toString({\n      headers: resp.headers,\n      statusCode: resp.status,\n      body: content,\n    });\n  } catch (error) {\n    console.error(error);\n    return null;\n  }\n};\n\nconst request = fetch;\n\nconst fetchCookie = async (url: string, options: RequestOptions = {}) => {\n  if (options?.withHeaders) delete options.withHeaders;\n  if (options?.withStatusCode) delete options.withStatusCode;\n  if (options?.toHex) delete options.toHex;\n\n  options = Object.assign(options, { onlyHeaders: true });\n\n  const headerStr = (await fetch(url, options)) || '{}';\n  const headerObj = JSON5.parse(headerStr as string);\n  const setCk = Object.keys(headerObj).find((it) => it.toLowerCase() === 'set-cookie');\n  const cookie = setCk ? headerObj[setCk] : [];\n  return JSON.stringify(cookie);\n};\n\nconst post = async (url: string, options: RequestOptions = {}) => {\n  options = Object.assign(options, { method: 'POST' });\n  return await fetch(url, options);\n};\n\nconst fetchPC = async (url: string, options: RequestOptions = {}) => {\n  options.headers = options?.headers || {};\n  const headers = headersPascalCase(options.headers);\n  if (!headers['User-Agent']) {\n    options.headers['User-Agent'] = PC_UA;\n  }\n  return await fetch(url, options);\n};\n\nconst postPC = async (url: string, options: RequestOptions = {}) => {\n  options.headers = options?.headers || {};\n  const headers = headersPascalCase(options.headers);\n  if (!headers['User-Agent']) {\n    options.headers['User-Agent'] = PC_UA;\n  }\n  return await post(url, options);\n};\n\nconst convertBase64Image = async (url: string, options: RequestOptions = {}) => {\n  try {\n    if (options?.withHeaders) delete options.withHeaders;\n    if (options?.withStatusCode) delete options.withStatusCode;\n    if (options?.toHex) delete options.toHex;\n    if (options?.onlyHeaders) delete options.onlyHeaders;\n\n    options = Object.assign(options, { toHex: true });\n\n    const hexStr = (await fetch(url, options)) as string;\n    if (!hexStr) return '';\n\n    const base64String = Buffer.from(hexStr, 'hex').toString('base64');\n    return `data:${mime.lookup(url) || 'image/png'};base64,${base64String}`;\n  } catch (error) {\n    console.error(error);\n    return '';\n  }\n};\n\nconst batchFetch = async (requests: any[], threads: number = 16) => {\n  const results: any[] = [];\n  const processBatch = async (batchSize: number, index: number = 0) => {\n    if (index < requests.length) {\n      const batch = requests.slice(index, index + batchSize);\n      for (const request of batch) {\n        try {\n          const response = await fetch(request.url, request.options);\n          results.push(response);\n        } catch (error) {\n          results.push(`Request to ${request.url} failed: ${(error as Error).message}`);\n        }\n      }\n\n      await processBatch(batchSize, index + batchSize);\n    }\n  };\n\n  const batchSize = requests.length > threads ? threads : requests.length;\n  await processBatch(batchSize);\n  return results;\n};\n\nconst bf = batchFetch;\n\nexport { batchFetch, bf, convertBase64Image, fetch, fetchCookie, fetchPC, post, postPC, request };\n"
  },
  {
    "path": "src/main/utils/hiker/request/syncFetch.ts",
    "content": "import { Buffer } from 'node:buffer';\nimport path from 'node:path';\nimport process from 'node:process';\n\nimport { headersPascalCase } from '@shared/modules/headers';\nimport { toString } from '@shared/modules/toString';\nimport { isJsonStr } from '@shared/modules/validate';\nimport FormData from 'form-data';\nimport fs from 'fs-extra';\nimport JSON5 from 'json5';\nimport mime from 'mime-types';\nimport protobuf from 'protobufjs';\nimport syncFetch from 'sync-fetch';\n\nimport { MOBILE_UA, PC_UA } from '../ua';\n\nprocess.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';\n\nconst getTimeout = (timeout: number | undefined | null) => {\n  const baseTimeout = 5000;\n\n  if (timeout !== null && timeout !== undefined) {\n    return Math.max(baseTimeout, timeout);\n  }\n\n  if (globalThis.variable?.timeout) {\n    return Math.max(baseTimeout, globalThis.variable.timeout);\n  }\n\n  return baseTimeout;\n};\n\nconst isLikelyPath = (p: string) => {\n  if (typeof p !== 'string') return false;\n  if (p.trim() === '') return false;\n  if (path.isAbsolute(p)) return true;\n  if (p.includes('/') || p.includes('\\\\')) return true;\n  return false;\n};\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD';\n\ninterface RequestOptions {\n  method?: HttpMethod;\n  timeout?: number;\n  body?: Record<string, any> | string | Buffer;\n  headers?: Record<string, string>;\n  redirect?: 0 | 1 | boolean;\n  toHex?: boolean;\n  onlyHeaders?: boolean;\n  withHeaders?: boolean;\n  withStatusCode?: boolean;\n}\n\nconst fetch = (url: string, options: RequestOptions = {}) => {\n  try {\n    const method: HttpMethod = (options.method || 'GET').toUpperCase() as HttpMethod;\n    const headers = headersPascalCase(options?.headers || {});\n\n    const config: {\n      method: HttpMethod;\n      headers: Record<string, string>;\n      timeout: number;\n      redirect: string;\n      body?: string | Buffer | Uint8Array | FormData | Record<string, any>;\n    } = {\n      method,\n      headers,\n      timeout: getTimeout(options?.timeout),\n      redirect: options?.redirect === false ? 'manual' : 'follow',\n    };\n\n    if (!config.headers['User-Agent']) {\n      config.headers['User-Agent'] = MOBILE_UA;\n    }\n    if (!config.headers?.Accept) {\n      config.headers!.Accept = '*/*';\n    }\n\n    const contentType = config.headers?.['Content-Type'] || '';\n    let charset: string = 'utf-8';\n    if (contentType.includes('charset=')) {\n      const match = contentType.match(/charset=([\\w-]+)/i);\n      if (match?.[1]) charset = match[1];\n    }\n\n    if (method !== 'GET') {\n      if (contentType.includes('application/x-www-form-urlencoded')) {\n        const rawBody = isJsonStr(options.body) ? JSON5.parse(options.body as string) : options.body;\n        const body = new URLSearchParams(rawBody).toString();\n        config.body = body;\n      } else if (['text/plain', 'text/html', 'text/xml'].includes(contentType)) {\n        config.body = options.body;\n      } else if (contentType.includes('multipart/form-data')) {\n        const fd = new FormData();\n        if (isLikelyPath(options.body as string)) {\n          fd.append('file', fs.readFileSync(options.body as string), path.basename(options.body as string));\n        } else {\n          fd.append('file', options.body as string, 'file.txt');\n        }\n        config.body = fd as unknown as { [key: string]: string };\n      } else if (contentType.includes('application/octet-stream')) {\n        let raw: Buffer;\n        if (isLikelyPath(options.body as string)) {\n          raw = Buffer.from(fs.readFileSync(options.body as string));\n        } else {\n          raw = Buffer.from(options.body as string);\n        }\n        config.body = raw;\n      } else if (contentType.includes('application/x-protobuf')) {\n        let raw: Buffer | Uint8Array;\n        if (\n          typeof options.body === 'object' &&\n          ['proto', 'bin', 'type'].every((key) => key in (options.body as Record<string, any>))\n        ) {\n          let { proto, bin, type } = options.body as Record<string, any>;\n          if (isLikelyPath(proto)) {\n            proto = fs.readFileSync(proto);\n          }\n          if (isLikelyPath(bin)) {\n            bin = fs.readFileSync(bin);\n          }\n          const root = protobuf.parse(proto).root;\n          const module = root.lookupType(type);\n          const message = module.create(bin);\n          raw = module.encode(message).finish();\n        } else {\n          if (isLikelyPath(options.body as string)) {\n            raw = Buffer.from(fs.readFileSync(options.body as string));\n          } else {\n            raw = Buffer.from(options.body as string);\n          }\n        }\n        config.body = raw;\n      } else {\n        if (!contentType) config.headers!['Content-Type'] = 'application/json';\n\n        const rawBody = isJsonStr(options.body) ? JSON5.parse(options.body as string) : options.body;\n        const body = JSON.stringify(rawBody);\n        config.body = body;\n      }\n    }\n\n    // console.warn(`[request] url: ${url} | method: ${method} | options: ${JSON.stringify(config)}`);\n\n    const resp = syncFetch(url, config);\n    resp.getBody = function (encoding: BufferEncoding | undefined): string | Buffer {\n      const buffer = resp.buffer();\n      return encoding ? buffer.toString(encoding) : buffer;\n    };\n\n    const { onlyHeaders, withHeaders, withStatusCode, toHex } = options || {};\n\n    if (onlyHeaders) {\n      return toString(resp.headers.raw());\n    }\n\n    const content = toHex ? resp.getBody('hex') : resp.getBody(charset);\n\n    if (!(withHeaders || withStatusCode)) {\n      return toString(content);\n    }\n\n    return toString({\n      headers: resp.headers.raw(),\n      statusCode: resp.status,\n      body: content,\n    });\n  } catch (error) {\n    console.error(error);\n    return null;\n  }\n};\n\nconst request = fetch;\n\nconst fetchCookie = (url: string, options: RequestOptions = {}) => {\n  if (options?.withHeaders) delete options.withHeaders;\n  if (options?.withStatusCode) delete options.withStatusCode;\n  if (options?.toHex) delete options.toHex;\n\n  options = Object.assign(options, { onlyHeaders: true });\n\n  const headerStr = fetch(url, options) || '{}';\n  const headerObj = JSON5.parse(headerStr);\n  const setCk = Object.keys(headerObj).find((it) => it.toLowerCase() === 'set-cookie');\n  const cookie = setCk ? headerObj[setCk] : [];\n  return JSON.stringify(cookie);\n};\n\nconst post = (url: string, options: RequestOptions = {}) => {\n  options = Object.assign(options, { method: 'POST' });\n  return fetch(url, options);\n};\n\nconst fetchPC = (url: string, options: RequestOptions = {}) => {\n  options.headers = options?.headers || {};\n  const headers = headersPascalCase(options.headers);\n  if (!headers['User-Agent']) {\n    options.headers['User-Agent'] = PC_UA;\n  }\n  return fetch(url, options);\n};\n\nconst postPC = (url: string, options: RequestOptions = {}) => {\n  options.headers = options?.headers || {};\n  const headers = headersPascalCase(options.headers);\n  if (!headers['User-Agent']) {\n    options.headers['User-Agent'] = PC_UA;\n  }\n  return post(url, options);\n};\n\nconst convertBase64Image = (url: string, options: RequestOptions = {}) => {\n  try {\n    if (options?.withHeaders) delete options.withHeaders;\n    if (options?.withStatusCode) delete options.withStatusCode;\n    if (options?.toHex) delete options.toHex;\n    if (options?.onlyHeaders) delete options.onlyHeaders;\n\n    options = Object.assign(options, { toHex: true });\n\n    const hexStr = fetch(url, options);\n    if (!hexStr) return '';\n    const base64String = Buffer.from(hexStr, 'hex').toString('base64');\n    return `data:${mime.lookup(url) || 'image/png'};base64,${base64String}`;\n  } catch (error) {\n    console.error(error);\n    return '';\n  }\n};\n\nconst batchFetch = (requests: any[], threads: number = 16) => {\n  const results: any[] = [];\n  const processBatch = (batchSize: number, index: number = 0) => {\n    if (index < requests.length) {\n      const batch = requests.slice(index, index + batchSize);\n      for (const request of batch) {\n        try {\n          const response = fetch(request.url, request.options);\n          results.push(response);\n        } catch (error) {\n          results.push(`Request to ${request.url} failed: ${(error as Error).message}`);\n        }\n      }\n      processBatch(batchSize, index + batchSize);\n    }\n  };\n\n  const batchSize = requests.length > threads ? threads : requests.length;\n  processBatch(batchSize);\n  return results;\n};\n\nconst bf = batchFetch;\n\nexport { batchFetch, bf, convertBase64Image, fetch, fetchCookie, fetchPC, post, postPC, request };\n"
  },
  {
    "path": "src/main/utils/hiker/request/syncRequest.ts",
    "content": "import { Buffer } from 'node:buffer';\nimport path from 'node:path';\nimport process from 'node:process';\n\nimport { headersPascalCase } from '@shared/modules/headers';\nimport { toString } from '@shared/modules/toString';\nimport { isJsonStr } from '@shared/modules/validate';\nimport fs from 'fs-extra';\nimport JSON5 from 'json5';\nimport mime from 'mime-types';\nimport protobuf from 'protobufjs';\nimport type { Options } from 'sync-request';\nimport syncRequest, { FormData } from 'sync-request';\n\nimport { MOBILE_UA, PC_UA } from '../ua';\n\nprocess.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';\n\nconst getTimeout = (timeout: number | undefined | null) => {\n  const baseTimeout = 5000;\n\n  if (timeout !== null && timeout !== undefined) {\n    return Math.max(baseTimeout, timeout);\n  }\n\n  if (globalThis.variable?.timeout) {\n    return Math.max(baseTimeout, globalThis.variable.timeout);\n  }\n\n  return baseTimeout;\n};\n\nconst isLikelyPath = (p: string) => {\n  if (typeof p !== 'string') return false;\n  if (p.trim() === '') return false;\n  if (path.isAbsolute(p)) return true;\n  if (p.includes('/') || p.includes('\\\\')) return true;\n  return false;\n};\n\nconst serialize2dict = (headers: { [key: string]: any } = {}) => {\n  const headersDict = {};\n\n  for (const [key, value] of Object.entries(headers)) {\n    if (key.toLowerCase() === 'set-cookie') {\n      headersDict[key] = Array.isArray(value) ? value : [value];\n    } else {\n      headersDict[key] = [value];\n    }\n  }\n  return headersDict;\n};\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD';\n\ninterface RequestOptions {\n  method?: HttpMethod;\n  timeout?: number;\n  body?: Record<string, any> | string | Buffer;\n  headers?: { [key: string]: string };\n  redirect?: 0 | 1 | boolean;\n  toHex?: boolean;\n  onlyHeaders?: boolean;\n  withHeaders?: boolean;\n  withStatusCode?: boolean;\n}\n\nconst fetch = (url: string, options: RequestOptions = {}) => {\n  try {\n    const method: HttpMethod = (options.method || 'GET').toUpperCase() as HttpMethod;\n    const headers = headersPascalCase(options?.headers || {});\n\n    const config: {\n      headers: Record<string, any>;\n      timeout: number;\n      followRedirects: boolean;\n      form?: FormData;\n      body?: string | Buffer | Uint8Array | FormData | Record<string, any>;\n      json?: object;\n    } = {\n      headers,\n      timeout: getTimeout(options?.timeout),\n      followRedirects: options?.redirect !== false,\n    };\n\n    if (!config.headers['User-Agent']) {\n      config.headers['User-Agent'] = MOBILE_UA;\n    }\n    if (!config.headers?.Accept) {\n      config.headers!.Accept = '*/*';\n    }\n\n    const contentType = config.headers?.['Content-Type'] || '';\n    let charset: string = 'utf-8';\n    if (contentType.includes('charset=')) {\n      const match = contentType.match(/charset=([\\w-]+)/i);\n      if (match?.[1]) charset = match[1];\n    }\n\n    if (method !== 'GET') {\n      if (contentType.includes('application/x-www-form-urlencoded')) {\n        const rawBody = isJsonStr(options.body) ? JSON5.parse(options.body as string) : options.body;\n        const body = Object.fromEntries(new URLSearchParams(rawBody));\n        const fd = new FormData();\n        Object.entries(body).forEach(([key, value]) => fd.append(key, value as string));\n        config.form = fd;\n      } else if (['text/plain', 'text/html', 'text/xml'].includes(contentType)) {\n        config.body = options.body;\n      } else if (contentType.includes('multipart/form-data')) {\n        const fd = new FormData();\n        if (isLikelyPath(options.body as string)) {\n          fd.append('file', fs.readFileSync(options.body as string), path.basename(options.body as string));\n        } else {\n          fd.append('file', options.body as string, 'file.txt');\n        }\n        config.form = fd;\n      } else if (contentType.includes('application/octet-stream')) {\n        let raw: Buffer;\n        if (isLikelyPath(options.body as string)) {\n          raw = Buffer.from(fs.readFileSync(options.body as string));\n        } else {\n          raw = Buffer.from(options.body as string);\n        }\n        config.body = raw;\n      } else if (contentType.includes('application/x-protobuf')) {\n        let raw: Buffer | Uint8Array;\n        if (\n          typeof options.body === 'object' &&\n          ['proto', 'bin', 'type'].every((key) => key in (options.body as Record<string, any>))\n        ) {\n          let { proto, bin, type } = options.body as Record<string, any>;\n          if (isLikelyPath(proto)) {\n            proto = fs.readFileSync(proto);\n          }\n          if (isLikelyPath(bin)) {\n            bin = fs.readFileSync(bin);\n          }\n          const root = protobuf.parse(proto).root;\n          const module = root.lookupType(type);\n          const message = module.create(bin);\n          raw = module.encode(message).finish();\n        } else {\n          if (isLikelyPath(options.body as string)) {\n            raw = Buffer.from(fs.readFileSync(options.body as string));\n          } else {\n            raw = Buffer.from(options.body as string);\n          }\n        }\n        config.body = raw;\n      } else {\n        const body = isJsonStr(options.body) ? JSON5.parse(options.body as string) : options.body;\n        config.json = body;\n      }\n    }\n    // json和form会自动设置Content-Type\n    if (config.json || config.form) delete config.headers['Content-Type'];\n\n    // console.warn(`[request] url: ${url} | method: ${method} | options: ${JSON.stringify(config)}`);\n\n    const resp = syncRequest(method, url, config as Options);\n    // @ts-expect-error override getBody\n    resp.getBody = function (encoding: BufferEncoding | undefined): string | Buffer {\n      return encoding ? this.body.toString(encoding) : this.body;\n    };\n    // @ts-expect-error override headers\n    resp.headers = serialize2dict(resp.headers);\n\n    const { onlyHeaders, withHeaders, withStatusCode, toHex } = options || {};\n\n    if (onlyHeaders) {\n      return toString(resp.headers);\n    }\n\n    const content = toHex ? resp.getBody('hex') : resp.getBody(charset);\n\n    if (!(withHeaders || withStatusCode)) {\n      return toString(content);\n    }\n\n    return toString({\n      headers: resp.headers,\n      statusCode: resp.statusCode,\n      body: content,\n    });\n  } catch (error) {\n    console.error(error);\n    return null;\n  }\n};\n\nconst request = fetch;\n\nconst fetchCookie = (url: string, options: RequestOptions = {}) => {\n  if (options?.withHeaders) delete options.withHeaders;\n  if (options?.withStatusCode) delete options.withStatusCode;\n  if (options?.toHex) delete options.toHex;\n\n  options = Object.assign(options, { onlyHeaders: true });\n\n  const headerStr = fetch(url, options) || '{}';\n  const headerObj = JSON5.parse(headerStr);\n  const setCk = Object.keys(headerObj).find((it) => it.toLowerCase() === 'set-cookie');\n  const cookie = setCk ? headerObj[setCk] : [];\n  return JSON.stringify(cookie);\n};\n\nconst post = (url: string, options: RequestOptions = {}) => {\n  options = Object.assign(options, { method: 'POST' });\n  return fetch(url, options);\n};\n\nconst fetchPC = (url: string, options: RequestOptions = {}) => {\n  options.headers = options?.headers || {};\n  const headers = headersPascalCase(options.headers);\n  if (!headers['User-Agent']) {\n    options.headers['User-Agent'] = PC_UA;\n  }\n  return fetch(url, options);\n};\n\nconst postPC = (url: string, options: RequestOptions = {}) => {\n  options.headers = options?.headers || {};\n  const headers = headersPascalCase(options.headers);\n  if (!headers['User-Agent']) {\n    options.headers['User-Agent'] = PC_UA;\n  }\n  return post(url, options);\n};\n\nconst convertBase64Image = (url: string, options: RequestOptions = {}) => {\n  try {\n    if (options?.withHeaders) delete options.withHeaders;\n    if (options?.withStatusCode) delete options.withStatusCode;\n    if (options?.toHex) delete options.toHex;\n    if (options?.onlyHeaders) delete options.onlyHeaders;\n\n    options = Object.assign(options, { toHex: true });\n\n    const hexStr = fetch(url, options);\n    if (!hexStr) return '';\n    const base64String = Buffer.from(hexStr, 'hex').toString('base64');\n    return `data:${mime.lookup(url) || 'image/png'};base64,${base64String}`;\n  } catch (error) {\n    console.error(error);\n    return '';\n  }\n};\n\nconst batchFetch = (requests: any[], threads: number = 16) => {\n  const results: any[] = [];\n  const processBatch = (batchSize: number, index: number = 0) => {\n    if (index < requests.length) {\n      const batch = requests.slice(index, index + batchSize);\n      for (const request of batch) {\n        try {\n          const response = fetch(request.url, request.options);\n          results.push(response);\n        } catch (error) {\n          results.push(`Request to ${request.url} failed: ${(error as Error).message}`);\n        }\n      }\n      processBatch(batchSize, index + batchSize);\n    }\n  };\n\n  const batchSize = requests.length > threads ? threads : requests.length;\n  processBatch(batchSize);\n  return results;\n};\n\nconst bf = batchFetch;\n\nexport { batchFetch, bf, convertBase64Image, fetch, fetchCookie, fetchPC, post, postPC, request };\n"
  },
  {
    "path": "src/main/utils/hiker/ruleParse.ts",
    "content": "import { base64 } from '@shared/modules/crypto';\n\nexport const splitWithEscapedDelimiter = (str, delimiter) => {\n  const parts: string[] = [];\n  let buffer: string = '';\n  const len: number = str.length;\n  let i: number = 0;\n\n  while (i < len) {\n    if (str.slice(i, i + delimiter.length) === delimiter) {\n      if (i > 0 && str[i - 1] === '\\\\') {\n        buffer += delimiter;\n        i += delimiter.length;\n      } else {\n        parts.push(buffer);\n        buffer = '';\n        i += delimiter.length;\n      }\n    } else {\n      buffer += str[i];\n      i++;\n    }\n  }\n\n  parts.push(buffer);\n\n  for (let j = 0; j < parts.length; j++) {\n    const first = delimiter[0];\n    parts[j] = parts[j].replaceAll(`\\\\${first}`, first);\n  }\n\n  return parts;\n};\n\nexport const customSort = (arr, order) => {\n  const orderMap = new Map();\n  order.forEach((keyword, index) => {\n    orderMap.set(keyword, index);\n  });\n\n  function compareStrings(a, b) {\n    for (const [keyword, _index] of orderMap) {\n      const aIndex = a.indexOf(keyword);\n      const bIndex = b.indexOf(keyword);\n      if (aIndex !== -1 && bIndex === -1) return -1;\n      if (bIndex !== -1 && aIndex === -1) return 1;\n      if (aIndex !== -1 && bIndex !== -1) return aIndex - bIndex;\n    }\n    return 0;\n  }\n  arr.sort(compareStrings);\n  return arr;\n};\n\nexport const carryInstructionForText = (rtext, instruction, arrindex = undefined) => {\n  instruction.forEach((cd) => {\n    if (cd.startsWith('替换:')) {\n      cd = cd.replace('替换:', '');\n      splitWithEscapedDelimiter(cd, '#').forEach((cdr) => {\n        const index = cdr.lastIndexOf('>>');\n        let [oT, nT] = [cdr.slice(0, index), cdr.slice(index + 2)];\n        if (nT === '空') nT = '';\n        // if(nT.includes(\"*\")&&!nT.includes(\"\\\\*\"))\n        if (nT.includes('<序号>') && arrindex !== undefined) {\n          nT = nT.replace(/<序号>/g, `${arrindex}`);\n        }\n        rtext = rtext.split(getSplitRule(oT)).join(nT);\n      });\n    } else if (cd === 'Base64') {\n      rtext = base64.decode({ src: rtext });\n    }\n  });\n  return rtext;\n};\n\nexport const carryInstructionForArray = (array, instruction) => {\n  instruction.forEach((cd) => {\n    if (cd.startsWith('排序:')) {\n      cd = cd.replace('排序:', '');\n      const order = cd.split('>');\n      array = customSort(array, order);\n    } else if (cd.startsWith('不包含:')) {\n      cd = cd.replace('不包含:', '');\n      cd = splitWithEscapedDelimiter(cd, '#');\n      array = array.filter((_) => {\n        return !cd.some((v) => _.includes(v));\n      });\n    } else if (cd.startsWith('包含:')) {\n      cd = cd.replace('包含:', '');\n      cd = splitWithEscapedDelimiter(cd, '#');\n      array = array.filter((_) => {\n        return cd.some((v) => _.includes(v));\n      });\n    } else if (cd.startsWith('不含序号:')) {\n      cd = cd.replace('不含序号:', '');\n      cd = splitWithEscapedDelimiter(cd, '#');\n      array = array.filter((_, i) => {\n        return !cd.some((v) => {\n          if (!Number.isNaN(Number(v))) {\n            v = Number(v);\n            return v === i;\n          } else if (/^\\d*-\\d*$/.test(v)) {\n            const [s, e] = v.split('-');\n            return i >= s && i <= e;\n          }\n          return false;\n        });\n      });\n    } else if (cd.startsWith('含序号:')) {\n      cd = cd.replace('含序号:', '');\n      cd = splitWithEscapedDelimiter(cd, '#');\n      array = array.filter((_, i) => {\n        return cd.some((v) => {\n          if (!Number.isNaN(Number(v))) {\n            const new_v = Number(v);\n            return new_v === i;\n          } else if (/^\\d*-\\d*$/.test(v as string)) {\n            const [s, e] = v.split('-');\n            return i >= s && i <= e;\n          }\n          return false;\n        });\n      });\n    }\n  });\n  return array;\n};\n\nexport const getInstructionAndClear = (str) => {\n  const leftbrackets = splitWithEscapedDelimiter(str, '[');\n  // let merge = false;\n  const instruction = leftbrackets.map((v, _i) => {\n    const res = splitWithEscapedDelimiter(v, ']')[0];\n    /* if (res === \"&&\" && i === 1) {\n            merge = true\n            return \"[\" + res + \"]\";\n        } */\n    return res.replaceAll('\\\\&', '&');\n  });\n  str = instruction.shift();\n  // if (merge) str += instruction.shift();\n\n  // eslint-disable-next-line regexp/no-unused-capturing-group\n  if (/^Base64\\((.*?)\\)$/.test(str)) {\n    // eslint-disable-next-line regexp/no-legacy-features\n    str = RegExp.$1;\n    instruction.push('Base64');\n  }\n  return [str, instruction];\n};\n\nexport const getSplitRule = (rule) => {\n  if (rule.includes('*') && !rule.includes('\\\\*')) {\n    return new RegExp(rule.replace(/[.+?^${}()|[\\]]/g, '\\\\$&').replace('*', '.*?'));\n  }\n  return rule;\n};\n\nexport const getSplitStr = (text, rule, host = '') => {\n  if (!rule) return '';\n  const rules = splitWithEscapedDelimiter(rule, '+');\n  let res = '';\n  // @ts-expect-error Not all code paths return values. ts(7030)\n  rules.forEach((r) => {\n    if (!r.includes('&&')) {\n      res += r;\n      return;\n    }\n\n    let [rulec, instruction] = getInstructionAndClear(r);\n    if (!rulec.includes('&&')) return null;\n    rulec = dealWithRule(rulec);\n\n    const rindex = Number(rulec[0]);\n    const lindex = Number(rulec[1]);\n    if (!Number.isNaN(rindex) && !Number.isNaN(lindex)) {\n      res += carryInstructionForText(text.slice(rindex, lindex), instruction);\n    } else {\n      const rtext = (text.split(getSplitRule(rulec[0]))[1] || '').split(getSplitRule(rulec[1]))[0] || '';\n      res += carryInstructionForText(rtext, instruction);\n    }\n  });\n  if (host && !res.startsWith('http') && res) {\n    res = host + res;\n  }\n  return res;\n};\n\nexport const dealWithRule = (rule) => {\n  return splitWithEscapedDelimiter(rule, '&&');\n};\n\nexport const getHasRuleSplitStr = (text, rule, host: string = '', complete: boolean = false) => {\n  if (!rule) return '';\n  const rules = splitWithEscapedDelimiter(rule, '+');\n  let res = '';\n  for (const r of rules) {\n    if (!r.includes('&&')) {\n      res += r;\n      continue;\n    }\n\n    let [rulec, instruction] = getInstructionAndClear(r);\n\n    if (!rulec.includes('&&')) return null;\n    rulec = dealWithRule(rulec);\n\n    const rindex = Number(rulec[0]);\n    const lindex = Number(rulec[1]);\n\n    if (!Number.isNaN(rindex) && !Number.isNaN(lindex)) {\n      res += carryInstructionForText(text.slice(rindex, lindex), instruction);\n    } else {\n      const rrule = getSplitRule(rulec[0]);\n      const rtext = text.split(rrule);\n      const fix = typeof rrule === 'string' ? rrule : '';\n      if (rtext.length < 2) return null;\n      const lrule = getSplitRule(rulec[1]);\n      let ltext;\n      for (let i = 1; i < rtext.length; i++) {\n        ltext = (rtext[i] + fix).split(lrule);\n        if (ltext.length > 1) break;\n      }\n      if (ltext.length === 1) ltext = [rtext[1]];\n      if (complete && ltext.length < 2) return null;\n      res += carryInstructionForText(ltext[0], instruction);\n    }\n  }\n\n  if (host && !res.startsWith('http') && res) {\n    res = host + res;\n  }\n  return res;\n};\n\nexport const getSplitArray = (text, rule, complete: boolean = false) => {\n  if (!rule) return [];\n  let [rulec, instruction] = getInstructionAndClear(rule);\n  rulec = dealWithRule(rulec);\n  const res: string[] = [];\n  const arr = text.split(getSplitRule(rulec[0]));\n  arr.shift();\n  arr.forEach((rtext, i) => {\n    const stext = rtext.split(getSplitRule(rulec[1]));\n    if (complete && stext[0] === rtext) return;\n    res.push(carryInstructionForText(stext[0], instruction, i));\n  });\n\n  return carryInstructionForArray(res, instruction);\n};\n\nexport const splitAndMapToStr = (text, rule, strRule) => {\n  return getSplitArray(text, rule)\n    .map((v) => getHasRuleSplitStr(v, strRule))\n    .filter((v) => v !== null);\n};\n\nexport const isParseJson = (inputText: string, arrrule: string[]) => {\n  const trimmedText = inputText.trim();\n  return (\n    ((trimmedText.startsWith('{') && trimmedText.endsWith('}')) ||\n      (trimmedText.startsWith('[') && trimmedText.endsWith(']'))) &&\n    !arrrule.includes('&&')\n  );\n};\n\nexport const toPath = (value: string) => {\n  if (typeof value !== 'string') return [];\n  const pathSegments: string[] = [];\n  let buffer = '';\n  let inBrackets = false;\n  let escapeCharacter = false;\n\n  for (const char of value) {\n    if (escapeCharacter) {\n      buffer += char;\n      escapeCharacter = false;\n    } else if (char === '\\\\') {\n      escapeCharacter = true;\n    } else if (char === '.' && !inBrackets) {\n      pathSegments.push(buffer);\n      buffer = '';\n    } else if (char === '[') {\n      inBrackets = true;\n    } else if (char === ']') {\n      inBrackets = false;\n    } else {\n      buffer += char;\n    }\n  }\n  if (buffer) pathSegments.push(buffer);\n  return pathSegments;\n};\n\nexport const getJson = (obj, path) => {\n  if (!obj) return undefined;\n  const resolvedPath = Array.isArray(path) ? path : toPath(path);\n  return resolvedPath.reduce(\n    (currentObject, key) => (currentObject && typeof currentObject === 'object' ? currentObject[key] : undefined),\n    obj,\n  );\n};\n\nexport const getJsonArray = (json: string | object, rule: string) => {\n  if (!rule || !json) return [];\n  try {\n    const parsedJson = typeof json === 'string' ? JSON.parse(json) : json;\n    return getJson(parsedJson, rule);\n  } catch {\n    return [];\n  }\n};\n\nexport const getJsonStr = (json: string | object, rule: string) => {\n  if (!rule || !json) return '';\n  try {\n    const parsedJson = typeof json === 'string' ? JSON.parse(json) : json;\n    return splitWithEscapedDelimiter(rule, '+').reduce((result, part) => {\n      if ((part.startsWith('\"') && part.endsWith('\"')) || (part.startsWith(\"'\") && part.endsWith(\"'\"))) {\n        // 直接添加字符串内容\n        return result + part.slice(1, -1);\n      } else {\n        const [ruleCondition, instructions] = getInstructionAndClear(part);\n        const jsonValue = String(getJson(parsedJson, ruleCondition));\n        return result + carryInstructionForText(jsonValue, instructions);\n      }\n    }, '');\n  } catch {\n    return '';\n  }\n};\n"
  },
  {
    "path": "src/main/utils/hiker/similarity.ts",
    "content": "export interface IRating {\n  target: string;\n  rating: number;\n}\n\nexport interface ILCSResult {\n  length: number;\n  sequence: string;\n  offset: number;\n}\n\nexport interface ILCSMatch {\n  target: string;\n  lcs: ILCSResult;\n}\n\n/**\n * Compare the similarity between two strings\n * @param first first string\n * @param second second string\n * @returns similarity value (between 0 and 1)\n */\nexport const compareTwoStrings = (first: string, second: string): number => {\n  // Normalize the strings by removing spaces\n  const cleanedFirst = first.replace(/\\s+/g, '');\n  const cleanedSecond = second.replace(/\\s+/g, '');\n\n  // If they are the same after cleaning, return 1\n  if (cleanedFirst === cleanedSecond) return 1;\n\n  // If either string is too short, return 0 (no match)\n  if (cleanedFirst.length < 2 || cleanedSecond.length < 2) return 0;\n\n  // Create bigrams for the first string\n  const firstBigrams = new Map<string, number>();\n  for (let i = 0; i < cleanedFirst.length - 1; i++) {\n    const bigram = cleanedFirst.substring(i, i + 2);\n    firstBigrams.set(bigram, (firstBigrams.get(bigram) || 0) + 1);\n  }\n\n  // Find the intersection of bigrams between the two strings\n  let intersectionSize = 0;\n  for (let i = 0; i < cleanedSecond.length - 1; i++) {\n    const bigram = cleanedSecond.substring(i, i + 2);\n    const count = firstBigrams.get(bigram) || 0;\n    if (count > 0) {\n      firstBigrams.set(bigram, count - 1); // Decrement to avoid duplicate matches\n      intersectionSize++;\n    }\n  }\n\n  // Return the Jaccard similarity coefficient for the bigrams\n  return (2 * intersectionSize) / (cleanedFirst.length + cleanedSecond.length - 2);\n};\n\n/**\n * Find the best match in the target string array for the main string\n * @param mainString main string\n * @param targetStrings target string array\n * @returns object containing all ratings and the best match\n */\nexport const findBestMatch = (\n  mainString: string,\n  targetStrings: string[],\n): { ratings: IRating[]; bestMatch: IRating; bestMatchIndex: number } => {\n  const ratings: IRating[] = [];\n  let bestMatchIndex: number = 0;\n\n  for (let i = 0; i < targetStrings.length; i++) {\n    const currentTargetString = targetStrings[i];\n    const currentRating = compareTwoStrings(mainString, currentTargetString);\n    ratings.push({ target: currentTargetString, rating: currentRating });\n\n    if (currentRating > ratings[bestMatchIndex].rating) {\n      bestMatchIndex = i;\n    }\n  }\n\n  return { ratings, bestMatch: ratings[bestMatchIndex], bestMatchIndex };\n};\n\n/**\n * Calculate the longest common subsequence of two strings\n * @param str1 - first string\n * @param str2 - second string\n * @returns  object containing length, sequence, and offset\n */\nexport const lcs = (str1: string, str2: string): ILCSResult => {\n  if (!str1 || !str2) return { length: 0, sequence: '', offset: 0 };\n\n  const str1Length = str1.length;\n  const str2Length = str2.length;\n  const dp = Array.from({ length: str1Length }).fill(Array.from({ length: str2Length }).fill(0)) as number[][];\n\n  let maxLen = 0;\n  let endIndex = 0;\n\n  for (let i = 0; i < str1Length; i++) {\n    for (let j = 0; j < str2Length; j++) {\n      if (str1[i] === str2[j]) {\n        dp[i][j] = i === 0 || j === 0 ? 1 : dp[i - 1][j - 1] + 1;\n        if (dp[i][j] > maxLen) {\n          maxLen = dp[i][j];\n          endIndex = i;\n        }\n      } else {\n        dp[i][j] = 0;\n      }\n    }\n  }\n\n  const sequence = str1.slice(endIndex - maxLen + 1, endIndex + 1);\n  const offset = endIndex - maxLen + 1;\n\n  return { length: maxLen, sequence, offset };\n};\n\n/**\n * Find the match with the longest LCS in the target string array for the main string\n * @param mainString - main string\n * @param targetStrings - target string array\n * @returns  object containing all LCS results and the best match\n */\nexport const findBestLCS = (\n  mainString: string,\n  targetStrings: string[],\n): { allLCS: ILCSMatch[]; bestMatch: ILCSMatch; bestMatchIndex: number } => {\n  const results: ILCSMatch[] = [];\n  let bestMatchIndex = 0;\n\n  for (let i = 0; i < targetStrings.length; i++) {\n    const currentTargetString = targetStrings[i];\n    const currentLCS = lcs(mainString, currentTargetString);\n    results.push({ target: currentTargetString, lcs: currentLCS });\n\n    if (currentLCS.length > results[bestMatchIndex].lcs.length) {\n      bestMatchIndex = i;\n    }\n  }\n\n  return { allLCS: results, bestMatch: results[bestMatchIndex], bestMatchIndex };\n};\n"
  },
  {
    "path": "src/main/utils/hiker/ua.ts",
    "content": "import { USER_AGENT } from '@shared/config/userAgent';\n\nconst MOBILE_UA = USER_AGENT.MOBILE_ANDROID_PIXEL;\nconst PC_UA = USER_AGENT.PC_WIN32_CHROME;\nconst UA = USER_AGENT.UA;\nconst UC_UA = USER_AGENT.MOBILE_ANDROID_MI_UC;\nconst IOS_UA = USER_AGENT.MOBILE_IOS_SAFARI;\n\nexport { IOS_UA, MOBILE_UA, PC_UA, UA, UC_UA };\n"
  },
  {
    "path": "src/main/utils/ip.ts",
    "content": "import { request } from '@main/utils/request';\nimport { getIPInfo, isValidIP } from '@shared/modules/ip';\n\nexport type IIpVersion = 4 | 6 | -1;\n\nexport interface IIpInfo {\n  ip: string;\n  version: IIpVersion;\n  valid: boolean;\n}\n\nexport interface IIpLocation {\n  country: string;\n  region: string;\n  city: string;\n  isp: string;\n  isChinaMainland: boolean;\n}\n\nexport type IIp = IIpInfo & { location: Partial<IIpLocation> };\n\n/**\n * Get external IP address\n * @param preferIPv6 Whether to prefer IPv6 address, default is true (prefer IPv6)\n * @returns IP address string, returns empty string on failure\n *\n * @see https://www.ipify.org\n * @see https://ip.sb/api\n * @see https://speed.cloudflare.com\n * @see https://ipapi.is\n */\nexport const getIP = async (preferIPv6: boolean = true): Promise<string> => {\n  const urls = preferIPv6\n    ? ['https://ipv6.icanhazip.com', 'https://ipv4.icanhazip.com']\n    : ['https://ipv4.icanhazip.com', 'https://ipv6.icanhazip.com'];\n\n  for (const url of urls) {\n    try {\n      const { data: resp } = await request.request({\n        url,\n        method: 'GET',\n      });\n\n      if (resp && typeof resp === 'string') {\n        const ip = resp.trim();\n        if (ip && isValidIP(ip)) {\n          return ip;\n        }\n      }\n    } catch {\n      // ignore errors\n    }\n  }\n\n  return '';\n};\n\n/**\n * Get location information for an IP address\n * @param ip IP address\n * @returns Location information\n */\nexport const getLocation = async (ip: string): Promise<Partial<IIpLocation>> => {\n  if (!isValidIP(ip)) return {};\n\n  try {\n    const { data: resp } = await request.request({\n      url: 'https://ip-scan.browserscan.net/sys/config/ip/get-visitor-ip',\n      method: 'GET',\n      params: { type: 'ip-api', ip },\n    });\n\n    const ipData = resp?.data?.ip_data;\n    if (!ipData) return {};\n\n    const country = ipData.country ?? '';\n\n    const res = {\n      country,\n      region: ipData.region ?? '',\n      city: ipData.city ?? '',\n      isp: ipData.isp ?? '',\n      isChinaMainland: country.toLowerCase() === 'cn',\n    };\n    return res;\n  } catch {\n    // ignore errors\n  }\n\n  return {};\n};\n\n/**\n * Get network information (including IP address and related information)\n * @param preferIPv6 Whether to prefer IPv6 address, default is true (prefer IPv6)\n * @returns IP information object\n */\nexport const getNetwork = async (preferIPv6: boolean = true): Promise<IIp> => {\n  try {\n    const ip = await getIP(preferIPv6);\n    if (!ip) {\n      return { ip: '', version: -1, valid: false, location: {} };\n    }\n\n    const location = await getLocation(ip);\n    const info = getIPInfo(ip);\n    return { ...info, location };\n  } catch {\n    return { ip: '', version: -1, valid: false, location: {} };\n  }\n};\n\nexport default {\n  getIP,\n  getLocation,\n  getNetwork,\n};\n"
  },
  {
    "path": "src/main/utils/path.ts",
    "content": "import { join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { isPackaged } from '@main/utils/systeminfo';\nimport { APP_NAME_ALIAS, APP_NAME_PROTOCOL } from '@shared/config/appinfo';\nimport { isStrEmpty } from '@shared/modules/validate';\nimport { app } from 'electron';\n\nexport const ELECTRON_PATHS = [\n  'home',\n  'appData',\n  'userData',\n  'sessionData',\n  'temp',\n  'exe',\n  'module',\n  'desktop',\n  'documents',\n  'downloads',\n  'music',\n  'pictures',\n  'videos',\n  'recent', // only windows\n  'logs',\n  'crashDumps',\n] as const;\n\nexport type IElectronPath = (typeof ELECTRON_PATHS)[number];\n\nexport const SYSTEM_PATHS = ['runtime', 'resources', ...ELECTRON_PATHS] as const;\n\nexport type ISystemPath = (typeof SYSTEM_PATHS)[number];\n\nexport const HOME_PATHS = ['bin'] as const;\n\nexport type IHomePath = (typeof HOME_PATHS)[number];\n\nexport const USER_PATHS = ['database', 'file', 'log', 'plugin', 'temp'] as const;\n\nexport type IUserPath = (typeof USER_PATHS)[number];\n\nexport const getSystemPath = (name: ISystemPath): string => {\n  // runtime path\n  if (name === 'runtime') {\n    return app.getAppPath();\n  }\n\n  // public resources path\n  if (name === 'resources') {\n    const resourcesPath = join(app.getAppPath(), 'resources');\n    return isPackaged ? resourcesPath.replace('app.asar', 'app.asar.unpacked') : resourcesPath;\n  }\n\n  // electron path\n  if (ELECTRON_PATHS.includes(name)) {\n    return app.getPath(name);\n  }\n\n  return '';\n};\n\nexport const getHomePath = (name: IHomePath): string => {\n  if (HOME_PATHS.includes(name)) {\n    return join(getSystemPath('home'), `.${APP_NAME_ALIAS}`, name);\n  }\n\n  return '';\n};\n\nexport const getUserPath = (name: IUserPath): string => {\n  if (USER_PATHS.includes(name)) {\n    return join(getSystemPath('userData'), name);\n  }\n\n  return '';\n};\n\n/**\n * Windows: %APPDATA%\\Roaming\n * Linux: $XDG_CONFIG_HOME or ~/.config\n * macOS: ~/Library/Application\\ Support\n */\nexport const APP_CRASH_PATH: string = getSystemPath('crashDumps');\nexport const APP_EXE_PATH: string = getSystemPath('exe');\nexport const APP_HOME_PATH: string = getSystemPath('home');\nexport const APP_PUBLIC_PATH: string = getSystemPath('resources');\nexport const APP_RUNTIME_PATH: string = getSystemPath('runtime');\nexport const APP_STORE_PATH: string = getSystemPath('userData');\n\nexport const APP_DATABASE_PATH: string = getUserPath('database');\nexport const APP_FILE_PATH: string = getUserPath('file');\nexport const APP_LOG_PATH: string = getUserPath('log');\nexport const APP_PLUGIN_PATH: string = getUserPath('plugin');\nexport const APP_TEMP_PATH: string = getUserPath('temp');\n\nexport const HOME_BIN_PATH: string = getHomePath('bin');\n\nexport const APP_REQUIRE_PATH: string[] = [\n  HOME_BIN_PATH,\n  APP_DATABASE_PATH,\n  APP_LOG_PATH,\n  APP_PLUGIN_PATH,\n  APP_FILE_PATH,\n  APP_TEMP_PATH,\n];\n\n/**\n * Validate and normalize path string\n * @param path Path string to validate\n * @returns Normalized path or empty string if invalid\n */\nconst validateAndNormalizePath = (path: string): string => {\n  if (isStrEmpty(path)) {\n    return '';\n  }\n  return path.trim() || '';\n};\n\n/**\n * Check if URL starts with app mark path\n * @param path URL to check\n * @returns Whether URL starts with app mark path\n */\nexport const isAppMarkPath = (path: string): boolean => {\n  const normalized = validateAndNormalizePath(path);\n  return normalized.length > 0 && normalized.startsWith(APP_NAME_PROTOCOL);\n};\n\nexport const isAppFilePath = (path: string): boolean => {\n  const normalized = validateAndNormalizePath(path);\n  return normalized.length > 0 && normalized.startsWith('file://');\n};\n\n/**\n * Check if URL starts with app store path\n * @param path URL to check\n * @returns Whether URL starts with app store path\n */\nexport const isAppStorePath = (path: string): boolean => {\n  const normalized = validateAndNormalizePath(path);\n  return normalized.length > 0 && normalized.startsWith(APP_STORE_PATH);\n};\n\n/**\n * Convert relative path to absolute path\n * @param path Path to convert\n * @returns Absolute path\n */\nexport const relativeToAbsolute = (path: string): string => {\n  const normalized = validateAndNormalizePath(path);\n  if (!normalized) return '';\n\n  if (isAppMarkPath(normalized)) {\n    return normalized.replace(APP_NAME_PROTOCOL, APP_STORE_PATH);\n  }\n\n  if (isAppFilePath(normalized)) {\n    return fileURLToPath(normalized);\n  }\n\n  return normalized;\n};\n\n/**\n * Convert absolute path to relative path\n * @param path Path to convert\n * @returns Relative path\n */\nexport const absoluteToRelative = (path: string): string => {\n  const normalized = validateAndNormalizePath(path);\n  if (!normalized) return '';\n  return isAppStorePath(normalized) ? normalized.replace(APP_STORE_PATH, APP_NAME_PROTOCOL) : normalized;\n};\n\nexport default {\n  absoluteToRelative,\n  APP_CRASH_PATH,\n  APP_DATABASE_PATH,\n  APP_EXE_PATH,\n  APP_FILE_PATH,\n  APP_HOME_PATH,\n  APP_LOG_PATH,\n  APP_PLUGIN_PATH,\n  APP_PUBLIC_PATH,\n  APP_RUNTIME_PATH,\n  APP_STORE_PATH,\n  APP_TEMP_PATH,\n  getSystemPath,\n  getUserPath,\n  isAppMarkPath,\n  isAppStorePath,\n  relativeToAbsolute,\n};\n"
  },
  {
    "path": "src/main/utils/process.ts",
    "content": "import { execSync, spawn } from 'node:child_process';\nimport { join } from 'node:path';\nimport process from 'node:process';\n\nimport { loggerService } from '@logger';\nimport type { IFileMode } from '@main/utils/file';\nimport {\n  fileChmod,\n  fileChmodSync,\n  filePermission,\n  filePermissionSync,\n  pathExist,\n  pathExistSync,\n} from '@main/utils/file';\nimport { execAsync } from '@main/utils/shell';\nimport { isWindows, linebreak } from '@main/utils/systeminfo';\nimport { LOG_MODULE } from '@shared/config/logger';\nimport { isArray, isArrayEmpty, isPositiveFiniteNumber, isStrEmpty, isString } from '@shared/modules/validate';\n\nconst logger = loggerService.withContext(LOG_MODULE.UTIL_PROCESS);\n\n/**\n * Get the appropriate binary name based on the operating system.\n * @param name - Base name of the binary.\n * @returns The binary name with the correct extension for the OS.\n */\nexport function getBinaryName(name: string): string {\n  if (isWindows) return `${name}.exe`;\n  return name;\n}\n\n/**\n * Run a binary script as a child process.\n * @param scriptPath - Path to the script to run.\n * @returns A promise that resolves when the script completes.\n */\nexport function downBinary(scriptPath: string): Promise<void> {\n  return new Promise<void>((resolve, reject) => {\n    logger.info(`Running script at: ${scriptPath}`);\n\n    const nodeProcess = spawn(process.execPath, [scriptPath], {\n      windowsHide: true,\n      env: {\n        ...process.env,\n        ELECTRON_RUN_AS_NODE: '1',\n        NODE_PATH: join(process.resourcesPath, 'app.asar', 'node_modules'),\n      },\n    });\n\n    nodeProcess.stdout.on('data', (data) => {\n      logger.info(`Script output: ${data}`);\n    });\n\n    nodeProcess.stderr.on('data', (data) => {\n      logger.error(`Script error: ${data}`);\n    });\n\n    nodeProcess.on('close', (code) => {\n      if (code === 0) {\n        logger.info('Script completed successfully');\n        resolve();\n      } else {\n        logger.warn(`Script exited with code ${code}`);\n        reject(new Error(`Process exited with code ${code}`));\n      }\n    });\n  });\n}\n\n/**\n * Set permissions for a binary file.\n * @param binaryPath - Path to the binary file.\n * @param permission - File mode to set.\n * @returns True if permissions were set successfully, false otherwise.\n */\nexport async function chmodBinary(binaryPath: string, permission: IFileMode): Promise<boolean> {\n  if ((await pathExist(binaryPath)) === false) return false;\n  if (isWindows) return true;\n\n  try {\n    if ((await filePermission(binaryPath)).code !== permission) {\n      await fileChmod(binaryPath, permission);\n      logger.info(`Set executable permissions for binary: ${binaryPath}`);\n    }\n    return true;\n  } catch (error) {\n    logger.error(`Failed to set permissions for binary: ${binaryPath}`, error as Error);\n    return false;\n  }\n}\n\n/**\n * Synchronously set permissions for a binary file.\n * @param binaryPath - Path to the binary file.\n * @param permission - File mode to set.\n * @returns True if permissions were set successfully, false otherwise.\n */\nexport function chmodBinarySync(binaryPath: string, permission: IFileMode): boolean {\n  if (pathExistSync(binaryPath) === false) return false;\n  if (isWindows) return true;\n\n  try {\n    if (filePermissionSync(binaryPath).code !== permission) {\n      fileChmodSync(binaryPath, permission);\n      logger.info(`Set executable permissions for binary: ${binaryPath}`);\n    }\n    return true;\n  } catch (error) {\n    logger.error(`Failed to set permissions for binary: ${binaryPath}`, error as Error);\n    return false;\n  }\n}\n\n/**\n * match processes by keyword.\n * @param keyword - Keyword to match processes.\n * @returns Array of matched process IDs.\n */\nexport async function matchPs(keyword: string): Promise<number[]> {\n  if (isPositiveFiniteNumber(keyword)) keyword = String(keyword);\n  if (!isString(keyword) || isStrEmpty(keyword)) return [];\n\n  try {\n    const cmd = isWindows\n      ? `for /f \"tokens=3 delims=,\" %p in ('cmd /c wmic process get ProcessId^,CommandLine /format:csv ^| findstr /i \"${keyword}\" ^| findstr /v /i \"wmic\" ^| findstr /v /i \"findstr\"') do @echo %p`\n      : `pgrep -f \"${keyword}\"`;\n    logger.debug(`Match process cmd: ${cmd}`);\n\n    const { stdout: output } = await execAsync(cmd, { encoding: 'utf8' });\n    if (!output) return [];\n\n    const pids = output\n      .split(linebreak)\n      .map((line) => line.trim())\n      .map((line) => (/^\\d+$/.test(line) ? Number.parseInt(line) : null))\n      .filter((pid): pid is number => pid !== null);\n\n    const equalPids = [...new Set(pids)];\n    logger.debug(`Matched PIDs: ${equalPids.join(', ')}`);\n\n    return equalPids;\n  } catch (error) {\n    logger.error(`Failed to match process: ${(error as Error).message}`);\n    return [];\n  }\n}\n\n/**\n * Synchronously match processes by keyword.\n * @param keyword - Keyword to match processes.\n * @returns Array of matched process IDs.\n */\nexport function matchPsSync(keyword: string): number[] {\n  if (isPositiveFiniteNumber(keyword)) keyword = String(keyword);\n  if (!isString(keyword) || isStrEmpty(keyword)) return [];\n\n  try {\n    const cmd = isWindows\n      ? `for /f \"tokens=3 delims=,\" %p in ('cmd /c wmic process get ProcessId^,CommandLine /format:csv ^| findstr /i \"${keyword}\" ^| findstr /v /i \"wmic\" ^| findstr /v /i \"findstr\"') do @echo %p`\n      : `pgrep -f \"${keyword}\"`;\n    logger.debug(`Match process cmd: ${cmd}`);\n\n    const output = execSync(cmd, { encoding: 'utf8' });\n    if (!output) return [];\n\n    const pids = output\n      .split(linebreak)\n      .map((line) => line.trim())\n      .map((line) => (/^\\d+$/.test(line) ? Number.parseInt(line) : null))\n      .filter((pid): pid is number => pid !== null);\n\n    const equalPids = [...new Set(pids)];\n    logger.debug(`Matched PIDs: ${equalPids.join(', ')}`);\n\n    return equalPids;\n  } catch (error) {\n    logger.error(`Failed to match process: ${(error as Error).message}`);\n    return [];\n  }\n}\n\n/**\n * match processes by port.\n * @param port - Port number to match processes.\n * @returns Array of process IDs listening on the specified port.\n */\nexport async function matchPort(port: number): Promise<number[]> {\n  if (isString(port) && !isStrEmpty(port)) port = Number.parseInt(String(port), 10);\n  if (!isPositiveFiniteNumber(port)) return [];\n\n  try {\n    const cmd = isWindows\n      ? `@for /f \"tokens=5\" %p in ('netstat -ano ^| findstr \":${port}\" ^| findstr LISTENING') do @echo %p`\n      : `lsof -i :${port} -sTCP:LISTEN -P -n -t`;\n    logger.debug(`Match process cmd: ${cmd}`);\n\n    const { stdout: output } = await execAsync(cmd, { encoding: 'utf8' });\n    if (!output) return [];\n\n    const pids = output\n      .split(linebreak)\n      .map((line) => line.trim())\n      .map((line) => (/^\\d+$/.test(line) ? Number.parseInt(line) : null))\n      .filter((pid): pid is number => pid !== null);\n\n    const equalPids = [...new Set(pids)];\n    logger.debug(`Matched PIDs: ${equalPids.join(', ')}`);\n\n    return equalPids;\n  } catch (error) {\n    logger.error(`Failed to match process: ${(error as Error).message}`);\n    return [];\n  }\n}\n\n/**\n * Synchronously match processes by port.\n * @param port - Port number to match processes.\n * @returns Array of process IDs listening on the specified port.\n */\nexport function matchPortSync(port: number): number[] {\n  if (isString(port) && !isStrEmpty(port)) port = Number.parseInt(String(port), 10);\n  if (!isPositiveFiniteNumber(port)) return [];\n\n  try {\n    const cmd = isWindows\n      ? `@for /f \"tokens=5\" %p in ('netstat -ano ^| findstr \":${port}\" ^| findstr LISTENING') do @echo %p`\n      : `lsof -i :${port} -sTCP:LISTEN -P -n -t`;\n    logger.debug(`Match process cmd: ${cmd}`);\n\n    const output = execSync(cmd, { encoding: 'utf8' });\n    if (!output) return [];\n\n    const pids = output\n      .split(linebreak)\n      .map((line) => line.trim())\n      .map((line) => (/^\\d+$/.test(line) ? Number.parseInt(line) : null))\n      .filter((pid): pid is number => pid !== null);\n\n    const equalPids = [...new Set(pids)];\n    logger.debug(`Matched PIDs: ${equalPids.join(', ')}`);\n\n    return equalPids;\n  } catch (error) {\n    logger.error(`Failed to match process: ${(error as Error).message}`);\n    return [];\n  }\n}\n\n/**\n * Kill processes by their PIDs.\n * @param pids - Array of process IDs to kill.\n * @returns True if all processes were killed successfully, false otherwise.\n */\nexport async function killPid(pids: number[]): Promise<boolean> {\n  if (!isArray(pids) || isArrayEmpty(pids)) return true;\n\n  try {\n    const cmd = isWindows\n      ? `taskkill ${pids.map((pid) => `/PID ${pid}`).join(' ')} /T /F`\n      : `kill -9 ${pids.join(' ')}`;\n    logger.debug(`Kill process cmd: ${cmd}`);\n\n    await execAsync(cmd);\n    return true;\n  } catch (error) {\n    logger.error('Failed to kill process:', error as Error);\n    return false;\n  }\n}\n\n/**\n * Synchronously kill processes by their PIDs.\n * @param pids - Array of process IDs to kill.\n * @returns True if all processes were killed successfully, false otherwise.\n */\nexport function killPidSync(pids: number[]): boolean {\n  if (!isArray(pids) || isArrayEmpty(pids)) return true;\n\n  try {\n    const cmd = isWindows\n      ? `taskkill ${pids.map((pid) => `/PID ${pid}`).join(' ')} /T /F`\n      : `kill -9 ${pids.join(' ')}`;\n    logger.debug(`Kill process cmd: ${cmd}`);\n\n    execSync(cmd, { stdio: 'ignore' });\n    return true;\n  } catch (error) {\n    logger.error('Failed to kill process:', error as Error);\n    return false;\n  }\n}\n\n/**\n * Determine if PowerShell is available on Windows system.\n * @returns True if PowerShell is available, false otherwise.\n */\nexport async function isWindowsPowerShell(): Promise<boolean> {\n  try {\n    // await execAsync('powershell -Command \"exit\"');\n    await execAsync('where powershell');\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Synchronously determine if PowerShell is available on Windows system.\n * @returns True if PowerShell is available, false otherwise.\n */\nexport function isWindowsPowerShellSync(): boolean {\n  try {\n    // execSync('powershell -Command \"exit\"', { stdio: 'ignore' });\n    execSync('where powershell', { stdio: 'ignore' });\n    return true;\n  } catch {\n    return false;\n  }\n}\n"
  },
  {
    "path": "src/main/utils/request/index.ts",
    "content": "// axios配置  可自行根据项目进行更改，只需更改该文件即可，其他文件可以不动\nimport { getTimeout, getUserAgent } from '@main/utils/tool';\nimport { VAxios } from '@shared/modules/request';\nimport type { AxiosTransform, CreateAxiosOptions } from '@shared/modules/request/axios/AxiosTransform';\nimport { ContentTypeEnum } from '@shared/modules/request/constants';\nimport { formatRequestDate, joinTimestamp, setObjToUrlParams } from '@shared/modules/request/utils';\nimport { isHttp, isObject, isString } from '@shared/modules/validate';\nimport type { AxiosInstance } from 'axios';\nimport { merge } from 'es-toolkit';\n\n// 数据处理，方便区分多种处理方式\nconst transform: AxiosTransform = {\n  // 处理请求数据。如果数据不是预期格式，可直接抛出错误\n  transformRequestHook: (res, options) => {\n    const { isTransformResponse, isReturnNativeResponse } = options;\n\n    // 如果204无内容直接返回\n    const method = res.config.method?.toLowerCase();\n    if (res.status === 204 && ['put', 'patch', 'delete'].includes(method!)) {\n      return res;\n    }\n\n    // 是否返回原生响应头 比如：需要获取响应头时使用该属性\n    if (isReturnNativeResponse) {\n      return res;\n    }\n\n    // 不进行任何处理，直接返回\n    // 用于页面代码可能需要直接获取code，data，message这些信息时开启\n    if (!isTransformResponse) {\n      return res.data;\n    }\n\n    // 错误的时候返回\n    const { data } = res;\n    if (!data) {\n      throw new Error('请求接口错误');\n    }\n\n    return data as any;\n  },\n\n  // 请求前处理配置\n  beforeRequestHook: (config, options) => {\n    const { apiUrl, isJoinPrefix, urlPrefix, joinParamsToUrl, formatDate, joinTime = true } = options;\n\n    // 添加接口前缀\n    if (isJoinPrefix && urlPrefix && isString(urlPrefix) && !isHttp(config.url)) {\n      config.url = `${urlPrefix}${config.url}`;\n    }\n\n    // 将baseUrl拼接\n    if (apiUrl && isString(apiUrl) && !isHttp(config.url)) {\n      config.url = `${apiUrl}${config.url}`;\n    }\n    const params = config.params || {};\n    const data = config.data || false;\n\n    if (formatDate && data && !isString(data)) {\n      formatRequestDate(data);\n    }\n    if (config.method?.toUpperCase() === 'GET') {\n      if (!isString(params)) {\n        // 给 get 请求加上时间戳参数，避免从缓存中拿数据。\n        config.params = Object.assign(params || {}, joinTimestamp(joinTime, false));\n      } else {\n        // 兼容restful风格\n        config.url = `${config.url + params}${joinTimestamp(joinTime, true)}`;\n        config.params = undefined;\n      }\n    } else if (!isString(params)) {\n      if (formatDate) {\n        formatRequestDate(params);\n      }\n      if (\n        Reflect.has(config, 'data') &&\n        config.data &&\n        (Object.keys(config.data).length > 0 || data instanceof FormData)\n      ) {\n        config.data = data;\n        config.params = params;\n      } else {\n        // 非GET请求如果没有提供data，则将params视为data\n        config.data = params;\n        config.params = undefined;\n      }\n      if (joinParamsToUrl) {\n        config.url = setObjToUrlParams(config.url as string, { ...config.params, ...config.data });\n      }\n    } else {\n      // 兼容restful风格\n      config.url += params;\n      config.params = undefined;\n    }\n    // 设置超时时间\n    config.timeout = getTimeout(config?.timeout);\n    // 设置请求头\n    config.headers = {\n      ...(isObject(config.headers) ? config.headers : {}),\n      'User-Agent': getUserAgent(config.headers?.['User-Agent']),\n    };\n\n    return config;\n  },\n\n  // 请求拦截器处理\n  requestInterceptors: (config, _options) => {\n    // 请求之前处理config\n    return config;\n  },\n\n  // 响应拦截器处理\n  responseInterceptors: (res) => {\n    return res;\n  },\n\n  // 响应错误处理\n  responseInterceptorsCatch: (error: any, instance: AxiosInstance) => {\n    const { config } = error;\n    if (!config || !config.requestOptions.retry) return Promise.reject(error);\n\n    config.retryCount = config.retryCount || 0;\n\n    if (config.retryCount >= config.requestOptions.retry.count) return Promise.reject(error);\n\n    config.retryCount += 1;\n\n    const backoff = new Promise((resolve) => {\n      setTimeout(() => {\n        resolve(config);\n      }, config.requestOptions.retry.delay || 1);\n    });\n    config.headers = { ...config.headers, 'Content-Type': ContentTypeEnum.Json };\n    return backoff.then((config) => instance.request(config!));\n  },\n};\n\nfunction createAxios(opt?: Partial<CreateAxiosOptions>) {\n  return new VAxios(\n    merge(\n      <CreateAxiosOptions>{\n        // https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#authentication_schemes\n        // 例如: authenticationScheme: 'Bearer'\n        authenticationScheme: '',\n        // 超时\n        timeout: 10 * 1000,\n        // 携带Cookie\n        withCredentials: false,\n        // 头信息\n        headers: { 'Content-Type': ContentTypeEnum.Json },\n        // 数据处理方式\n        transform,\n        // 配置项，下面的选项都可以在独立的接口请求中覆盖\n        requestOptions: {\n          // 接口地址\n          apiUrl: '',\n          // 是否自动添加接口前缀\n          isJoinPrefix: true,\n          // 接口前缀\n          // 例如: https://www.baidu.com/api\n          urlPrefix: '',\n          // 是否返回原生响应头 比如：需要获取响应头时使用该属性\n          isReturnNativeResponse: true,\n          // 需要对返回数据进行处理\n          isTransformResponse: false,\n          // post请求的时候添加参数到url\n          joinParamsToUrl: false,\n          // 格式化提交参数时间\n          formatDate: true,\n          // 是否加入时间戳\n          joinTime: false,\n          // 是否忽略请求取消令牌\n          // 如果启用，则重复请求时不进行处理\n          // 如果禁用，则重复请求时会取消当前请求\n          ignoreCancelToken: true,\n          // 是否携带token\n          withToken: false,\n          // 重试\n          retry: {\n            count: 0,\n            delay: 1000,\n          },\n        },\n      },\n      opt || {},\n    ),\n  );\n}\nexport const request = createAxios({ adapter: 'fetch' });\nexport default request;\n"
  },
  {
    "path": "src/main/utils/shell.ts",
    "content": "import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nexport const execAsync = promisify(exec);\n"
  },
  {
    "path": "src/main/utils/systeminfo.ts",
    "content": "import os from 'node:os';\nimport process from 'node:process';\n\nimport { APP_NAME, APP_VERSION } from '@shared/config/appinfo';\nimport type { IArch, IPlatform, ISystemInfo } from '@shared/types/systeminfo';\nimport { app } from 'electron';\nimport macosRelease from 'macos-release';\n\nexport const platform: IPlatform = (() => {\n  const plat = process.platform as NodeJS.Platform | 'ohos' | 'openharmony' | 'harmonyos';\n  if (plat === 'win32') return 'win32';\n  if (plat === 'darwin') return 'darwin';\n  if (plat === 'linux') return 'linux';\n  if (plat === 'ohos' || plat === 'openharmony' || plat === 'harmonyos') return 'ohos';\n  return 'unknown';\n})();\n\nexport const release: string = (() => {\n  const plat = process.platform as NodeJS.Platform | 'ohos' | 'openharmony' | 'harmonyos';\n  if (plat === 'win32') return os.release();\n  if (plat === 'darwin') return macosRelease().version;\n  if (plat === 'linux') return os.release();\n  if (plat === 'ohos' || plat === 'openharmony' || plat === 'harmonyos') return os.release();\n  return 'unknown';\n})();\n\nexport const arch: IArch = (() => {\n  const a = process.arch as NodeJS.Architecture;\n  if (a === 'x64') return 'x86_64';\n  if (a === 'ia32') return 'x86_32';\n  if (a === 'arm64') return 'arm_64';\n  if (a === 'arm') return 'arm_32';\n  if (a === 'mips' || a === 'mipsel') return 'mips';\n  if (a === 'loong64') return 'loong_64';\n  if (a === 'riscv64') return 'riscv_64';\n  return 'unknown';\n})();\n\nexport const isMacOS: boolean = platform === 'darwin';\nexport const isWindows: boolean = platform === 'win32';\nexport const isLinux: boolean = platform === 'linux';\nexport const isOhOS: boolean = platform === 'ohos';\n\nexport const isMacOSTahoe = isMacOS && Number.parseInt(macosRelease().version) >= 26;\nexport const isWindows22H2 =\n  isWindows &&\n  (() => {\n    const parts = os.release().split('.');\n    const buildNumber = Number.parseInt(parts[2], 10);\n    return buildNumber >= 22621;\n  })();\n\nexport const isElectron: boolean = !!(process?.versions && process?.versions.electron);\n\nexport const isDev: boolean = process.env.NODE_ENV === 'development';\nexport const isProd: boolean = process.env.NODE_ENV === 'production';\nexport const isPortable: boolean = isWindows && 'PORTABLE_EXECUTABLE_DIR' in process.env; // only available on Windows\nexport const isPackaged: boolean = app.isPackaged;\n\nexport const delimiter = isWindows ? '\\\\' : '/';\nexport const linebreak = isWindows ? '\\r\\n' : '\\n';\n\n/**\n * Get system information\n * @returns {ISystemInfo} Complete system information object\n */\nexport function getSystemInfo(): ISystemInfo {\n  const plat = platform;\n  const osRelease = os.release();\n\n  let osString = '';\n\n  switch (plat) {\n    case 'win32': {\n      // Get Windows version\n      const parts = osRelease.split('.');\n      const buildNumber = Number.parseInt(parts[2], 10);\n      osString = buildNumber >= 22000 ? 'Windows 11' : 'Windows 10';\n      break;\n    }\n    case 'darwin': {\n      // macOS version handling using macos-release for better accuracy\n      try {\n        const macVersionInfo = macosRelease();\n        const versionString = macVersionInfo.version.replace(/\\./g, '_'); // 15.0.0 -> 15_0_0\n        osString = arch === 'arm_64' ? `Mac OS X ${versionString}` : `Intel Mac OS X ${versionString}`; // Mac OS X 15_0_0\n      } catch {\n        // Fallback to original logic if macos-release fails\n        const macVersion = osRelease.split('.').slice(0, 2).join('_');\n        osString = arch === 'arm_64' ? `Mac OS X ${macVersion}` : `Intel Mac OS X ${macVersion}`;\n      }\n      break;\n    }\n    case 'linux': {\n      osString = `Linux ${arch}`;\n      break;\n    }\n    case 'ohos': {\n      osString = `OpenHarmony ${arch}`;\n      break;\n    }\n    default: {\n      osString = `${platform} ${arch}`;\n    }\n  }\n\n  return { platform, arch, release, osString };\n}\n\n/**\n * Generate User-Agent string based on user system data\n * @returns {string} Dynamically generated User-Agent string\n */\nexport function generateUserAgent(): string {\n  const systemInfo = getSystemInfo();\n  const ua = `Mozilla/5.0 (${systemInfo.osString}; ${systemInfo.arch}) AppleWebKit/537.36 (KHTML, like Gecko) ${APP_NAME}/${APP_VERSION} Chrome/124.0.0.0 Safari/537.36`;\n  return ua;\n}\n\nexport default {\n  isElectron,\n  isWindows,\n  isLinux,\n  isMacOS,\n  isOhOS,\n  isDev,\n  isProd,\n  isPackaged,\n  isPortable,\n  delimiter,\n  platform,\n  getSystemInfo,\n  generateUserAgent,\n};\n"
  },
  {
    "path": "src/main/utils/tool.ts",
    "content": "import { configManager } from '@main/services/ConfigManager';\nimport { generateUserAgent } from '@main/utils/systeminfo';\nimport { isPositiveFiniteNumber, isUndefined } from '@shared/modules/validate';\n\n/**\n * Get timeout value\n * Priority: Current > Option > Database > Default\n * @param timeout Current timeout(ms)\n * @param optionTimeout Option timeout(ms)\n * @returns Timeout(ms)\n */\nexport const getTimeout = (timeout?: number, optionTimeout?: number): number => {\n  const MAX_TIMEOUT = 60 * 1000;\n  const MIN_TIMEOUT = 0;\n  const DEFAULT_TIMEOUT = 10 * 1000;\n\n  const storeTimeout = Number.parseInt(String(configManager.timeout));\n\n  const isVisable = (val?: number): boolean => {\n    if (isPositiveFiniteNumber(val) && val! >= MIN_TIMEOUT && val! <= MAX_TIMEOUT) {\n      return true;\n    }\n    return false;\n  };\n\n  if (isVisable(timeout)) return timeout as number;\n  if (isVisable(optionTimeout)) return optionTimeout as number;\n  if (isVisable(storeTimeout)) return storeTimeout as number;\n\n  return DEFAULT_TIMEOUT;\n};\n\n/**\n * Get user-agent value\n * Priority: Current > Option > Database > Default\n * @param ua Current user-agent\n * @param optionUa Option user-agent\n * @returns User-agent\n */\nexport const getUserAgent = (ua?: string, optionUa?: string): string => {\n  const DEFAULT_UA = generateUserAgent();\n\n  if (!isUndefined(ua)) return ua;\n  if (!isUndefined(optionUa)) return optionUa;\n  if (!isUndefined(configManager.ua)) return configManager.ua;\n\n  return DEFAULT_UA;\n};\n"
  },
  {
    "path": "src/preload/index.ts",
    "content": "// import process from 'node:process';\n\nimport { electronAPI } from '@electron-toolkit/preload';\nimport { contextBridge } from 'electron';\n\nimport { domReady } from './utils/dom';\nimport { useLoading } from './utils/loading';\n\nconst { appendLoading, removeLoading } = useLoading();\n\ndomReady().then(appendLoading);\n\n// Custom APIs for renderer\nconst api = {};\n\n// Use `contextBridge` APIs to expose Electron APIs to\n// renderer only if context isolation is enabled, otherwise\n// just add to the DOM global.\nif (process.contextIsolated) {\n  try {\n    contextBridge.exposeInMainWorld('electron', electronAPI);\n    contextBridge.exposeInMainWorld('api', api);\n    contextBridge.exposeInMainWorld('removeLoading', removeLoading);\n  } catch (error) {\n    console.error('[Preload]Failed to expose APIs:', error as Error);\n  }\n} else {\n  window.electron = electronAPI;\n  window.api = api;\n  window.removeLoading = removeLoading;\n}\n\nexport type WindowApiType = typeof api;\n"
  },
  {
    "path": "src/preload/preload.d.ts",
    "content": "import type { ElectronAPI } from '@electron-toolkit/preload';\n\nimport type { WindowApiType } from './index';\n\ndeclare global {\n  interface Window {\n    electron: ElectronAPI;\n    api: WindowApiType;\n    removeLoading: () => void;\n  }\n}\n"
  },
  {
    "path": "src/preload/utils/dom.ts",
    "content": "/** docoment ready */\nexport function domReady(condition: DocumentReadyState[] = ['complete', 'interactive']) {\n  return new Promise((resolve) => {\n    if (condition.includes(document.readyState)) {\n      resolve(true);\n    } else {\n      document.addEventListener('readystatechange', () => {\n        if (condition.includes(document.readyState)) {\n          resolve(true);\n        }\n      });\n    }\n  });\n}\n"
  },
  {
    "path": "src/preload/utils/loading.ts",
    "content": "export function useLoading() {\n  const className = `loaders-css__square`;\n  const styleContent = `\n    :root {\n      --td-loading-bg: var(--td-bg-color-container);\n      --td-loading-circle: var(--td-brand-color-4);\n      --td-loading-dot: var(--td-text-color-primary);\n    }\n\n    @keyframes square {\n      0% { transform: rotate(0deg); }\n      50% { transform: rotate(180deg); }\n      100% { transform: rotate(360deg); }\n    }\n\n    .${className} {\n      width: 46px;\n      height: 46px;\n      border: 6px solid var(--td-loading-circle);\n      border-radius: 50%;\n      -webkit-animation: loading 1.5s linear infinite;\n      animation: square 1.5s linear infinite;\n    }\n\n    .${className} > div {\n      width: 10px;\n      height: 10px;\n      border-radius: 50%;\n      left: 40px;\n      top: -5px;\n      position: absolute;\n      background: var(--td-loading-dot);\n    }\n\n    .app-loading-wrap {\n      position: fixed;\n      top: 0;\n      left: 0;\n      width: 100vw;\n      height: 100vh;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      background: var(--td-loading-bg);\n      z-index: 999;\n    }\n  `;\n\n  const oStyle = document.createElement('style');\n  const oDiv = document.createElement('div');\n\n  oStyle.id = 'app-loading-style';\n  oStyle.innerHTML = styleContent;\n  oDiv.className = 'app-loading-wrap';\n  oDiv.innerHTML = `<div class=\"${className}\"><div></div></div>`;\n  oDiv.innerHTML = `<div class=\"${className}\"><div></div></div>`;\n\n  return {\n    appendLoading() {\n      safe.append(document.head, oStyle);\n      safe.append(document.body, oDiv);\n    },\n    removeLoading() {\n      safe.remove(document.head, oStyle);\n      safe.remove(document.body, oDiv);\n    },\n  };\n}\n\nconst safe = {\n  append(parent: HTMLElement, child: HTMLElement) {\n    if (![...parent.children].includes(child)) {\n      return parent.appendChild(child);\n    }\n    return child;\n  },\n  remove(parent: HTMLElement, child: HTMLElement) {\n    if ([...parent.children].includes(child)) {\n      return parent.removeChild(child);\n    }\n    return child;\n  },\n};\n"
  },
  {
    "path": "src/renderer/index.html",
    "content": "<!doctype html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <title>zyfun</title>\n    <!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->\n    <!-- <meta\n      http-equiv=\"Content-Security-Policy\"\n      content=\"default-src 'self'; connect-src blob: *; script-src 'self' 'unsafe-eval' 'unsafe-inline' *; worker-src 'self' blob:; style-src 'self' 'unsafe-inline' *; font-src 'self' data: *; img-src 'self' data: file: * blob:; frame-src * file:\"\n    /> -->\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  </head>\n\n  <body>\n    <div id=\"app\"></div>\n    <script type=\"module\" src=\"/src/main.ts\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "src/renderer/src/App.vue",
    "content": "<template>\n  <t-config-provider :global-config=\"getComponentsLocale\">\n    <router-view />\n    <disclaimer-view type=\"init\" />\n  </t-config-provider>\n</template>\n<script setup lang=\"ts\">\nimport type { ISetup } from '@shared/config/tblSetting';\nimport { setupObj as tblSetup } from '@shared/config/tblSetting';\nimport { THEME } from '@shared/config/theme';\nimport { onMounted, ref, watch } from 'vue';\n\nimport { fetchSetup } from '@/api/setting';\nimport { useLocale } from '@/locales/useLocale';\nimport DisclaimerView from '@/pages/Disclaimer.vue';\nimport { usePlayerStore, useSettingStore } from '@/store';\nimport { start as startOSpy, stop as stopOSpy } from '@/utils/ospy';\nimport { start as startVitals, stop as stopVitals } from '@/utils/vitalsObserver';\n\nconst storePlayer = usePlayerStore();\nconst storeSetting = useSettingStore();\n\nconst { getComponentsLocale } = useLocale();\n\nconst setupConf = ref<ISetup>(tblSetup);\n\nconst active = ref({\n  disclaimer: false,\n});\n\nwatch(\n  () => ({\n    theme: storeSetting.theme,\n    lang: storeSetting.lang,\n    debug: storeSetting.debug,\n  }),\n  (val) => {\n    if (val.theme !== setupConf.value?.theme) storeSetting.changePreferredTheme();\n    if (val.lang !== setupConf.value?.lang) storeSetting.changePreferredLang();\n    if (val.debug !== setupConf.value?.debug) debugMode(val.debug);\n\n    for (const key in val) {\n      setupConf.value[key] = val[key];\n    }\n  },\n  { deep: true },\n);\nwatch(\n  () => storeSetting.displayTheme,\n  () => {\n    if (storeSetting.theme === THEME.SYSTEM) {\n      storeSetting.changePreferredTheme();\n    }\n  },\n);\n\nonMounted(() => setup());\n\nconst setup = () => {\n  syncStore();\n};\n\nconst syncStore = async () => {\n  const resp = await fetchSetup();\n  setupConf.value = resp;\n\n  const { barrage, bossKey, debug, disclaimer, lang, player, theme, timeout } = resp;\n\n  // privacy policy\n  active.value.disclaimer = !disclaimer;\n\n  // setting store sync config\n  storeSetting.updateConfig({ bossKey, debug, lang, theme, timeout: timeout || 5000 });\n  // play store sync config\n  storePlayer.updateConfig({ barrage, player });\n\n  if (debug) debugMode(debug);\n};\nconst debugMode = (type: boolean) => {\n  if (type) {\n    startVitals();\n    startOSpy();\n  } else {\n    stopVitals();\n    stopOSpy();\n  }\n};\n</script>\n"
  },
  {
    "path": "src/renderer/src/api/aigc.ts",
    "content": "import { apiRequest as request, sseRequest } from '@/utils/request';\n\n/** chat */\n\nexport function fetchAiChat(doc) {\n  return request.request({\n    url: '/v1/aigc/chat/normal',\n    method: 'post',\n    data: doc,\n  });\n}\n\nexport function fetchAiStream(doc, callback) {\n  return sseRequest.request({\n    url: '/v1/aigc/chat/completion',\n    method: 'post',\n    data: doc,\n    ...callback,\n  });\n}\n\n/** memory - session */\n\nexport function createMemorySession() {\n  return request.request({\n    url: '/v1/aigc/memory/session',\n    method: 'post',\n  });\n}\n\nexport function delMemorySession(doc) {\n  return request.request({\n    url: '/v1/aigc/memory/session',\n    method: 'delete',\n    data: doc,\n  });\n}\nexport function getMemorySessionIds() {\n  return request.request({\n    url: '/v1/aigc/memory/session/id',\n    method: 'get',\n  });\n}\n\n/** memory - message */\n\nexport function fetchMemoryMessage(id) {\n  return request.request({\n    url: `/v1/aigc/memory/message/${id}`,\n    method: 'get',\n  });\n}\n\nexport function addMemoryMessage(doc) {\n  return request.request({\n    url: '/v1/aigc/memory/message',\n    method: 'post',\n    data: doc,\n  });\n}\n\nexport function putMemoryMessage(doc) {\n  return request.request({\n    url: '/v1/aigc/memory/message',\n    method: 'put',\n    data: doc,\n  });\n}\n\nexport function delMemoryMessage(doc) {\n  return request.request({\n    url: '/v1/aigc/memory/message',\n    method: 'delete',\n    data: doc,\n  });\n}\n"
  },
  {
    "path": "src/renderer/src/api/data.ts",
    "content": "import { apiRequest as request } from '@/utils/request';\n\nexport function dataDbClear(doc) {\n  return request.request({\n    url: '/v1/data/db/clear',\n    method: 'delete',\n    data: doc,\n  });\n}\n\nexport function dataDbExport(doc) {\n  return request.request({\n    url: '/v1/data/db/export',\n    method: 'post',\n    data: doc,\n  });\n}\n\nexport function dataDbImport(doc) {\n  return request.request({\n    url: '/v1/data/db/import',\n    method: 'post',\n    data: doc,\n  });\n}\n\nexport function dataCloudBackup() {\n  return request.request({\n    url: '/v1/data/cloud/backup',\n    method: 'get',\n  });\n}\n\nexport function dataCloudResume() {\n  return request.request({\n    url: '/v1/data/cloud/resume',\n    method: 'get',\n  });\n}\n"
  },
  {
    "path": "src/renderer/src/api/film.ts",
    "content": "import { apiRequest as request } from '@/utils/request';\n\n/** site */\n\nexport function addSite(doc) {\n  return request.request({\n    url: `/v1/film/site`,\n    method: 'post',\n    data: doc,\n  });\n}\n\nexport function delSite(doc) {\n  return request.request({\n    url: `/v1/film/site`,\n    method: 'delete',\n    data: doc,\n  });\n}\n\nexport function putSite(doc) {\n  return request.request({\n    url: `/v1/film/site`,\n    method: 'put',\n    data: doc,\n  });\n}\n\nexport function putSiteDefault(id) {\n  return request.request({\n    url: `/v1/film/site/default/${id}`,\n    method: 'put',\n  });\n}\n\nexport function fetchSiteActive() {\n  return request.request({\n    url: '/v1/film/site/active',\n    method: 'get',\n  });\n}\n\nexport function fetchSitePage(doc) {\n  return request.request({\n    url: `/v1/film/site/page`,\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function fetchSiteDetail(id) {\n  return request.request({\n    url: `/v1/film/site/${id}`,\n    method: 'get',\n  });\n}\n\nexport function fetchSiteDetailByKey(key) {\n  return request.request({\n    url: `/v1/film/site/key/${key}`,\n    method: 'get',\n  });\n}\n\n/** cms */\n\nexport function fetchCmsInit(doc) {\n  return request.request({\n    url: '/v1/film/cms/init',\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function fetchCmsHome(doc) {\n  return request.request({\n    url: '/v1/film/cms/home',\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function fetchCmsHomeVod(doc) {\n  return request.request({\n    url: '/v1/film/cms/homeVod',\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function fetchCmsCategory(doc) {\n  return request.request({\n    url: '/v1/film/cms/category',\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function fetchCmsSearch(doc) {\n  return request.request({\n    url: '/v1/film/cms/search',\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function fetchCmsDetail(doc) {\n  return request.request({\n    url: '/v1/film/cms/detail',\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function fetchCmsPlay(doc) {\n  return request.request({\n    url: '/v1/film/cms/play',\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function fetchCmsAction(doc) {\n  return request.request({\n    url: '/v1/film/cms/action',\n    method: 'get',\n    params: doc,\n    ...(doc.timeout ? { timeout: doc.timeout } : {}),\n  });\n}\n\nexport function fetchCmsProxy(doc) {\n  return request.request({\n    url: '/v1/film/cms/proxy',\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function fetchCmsCheck(doc) {\n  return request.request({\n    url: '/v1/film/cms/check',\n    method: 'get',\n    params: doc,\n  });\n}\n\n/** recommend */\n\nexport function fetchRecBarrage(doc) {\n  return request.request({\n    url: '/v1/film/rec/barrage',\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function sendRecBarrage(doc) {\n  return request.request({\n    url: '/v1/film/rec/barrage',\n    method: 'post',\n    data: doc,\n  });\n}\n\nexport function fetchRecHot(doc) {\n  return request.request({\n    url: '/v1/film/rec/hot',\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function fetchRecMatch(doc) {\n  return request.request({\n    url: '/v1/film/rec/match',\n    method: 'get',\n    params: doc,\n  });\n}\n\n/** edit */\n\nexport function fetchEditDomPd(doc) {\n  return request.request({\n    url: `/v1/film/edit/dom/pd`,\n    method: 'POST',\n    data: doc,\n  });\n}\n\nexport function fetchEditDomPdfa(doc) {\n  return request.request({\n    url: `/v1/film/edit/dom/pdfa`,\n    method: 'POST',\n    data: doc,\n  });\n}\n\nexport function fetchEditDomPdfh(doc) {\n  return request.request({\n    url: `/v1/film/edit/dom/pdfh`,\n    method: 'POST',\n    data: doc,\n  });\n}\n\nexport function fetchEditDomPdfl(doc) {\n  return request.request({\n    url: `/v1/film/edit/dom/pdfl`,\n    method: 'POST',\n    data: doc,\n  });\n}\n\nexport function fetchEditSiftCategory(doc) {\n  return request.request({\n    url: `/v1/film/edit/sift/category`,\n    method: 'POST',\n    data: doc,\n  });\n}\n\nexport function fetchEditSiftFilter(doc) {\n  return request.request({\n    url: `/v1/film/edit/sift/filter`,\n    method: 'POST',\n    data: doc,\n  });\n}\n\nexport function fetchEditTemplates(type) {\n  return request.request({\n    url: `/v1/film/edit/template/${type}`,\n    method: 'GET',\n  });\n}\n\nexport function fetchEditTemplateDetail(type, name) {\n  return request.request({\n    url: `/v1/film/edit/template/${type}/${name}`,\n    method: 'GET',\n  });\n}\n\nexport function fetchEditDecrypt(type, doc) {\n  return request.request({\n    url: `/v1/film/edit/decrypt/${type}`,\n    method: 'POST',\n    data: doc,\n  });\n}\n"
  },
  {
    "path": "src/renderer/src/api/live.ts",
    "content": "import { apiRequest as request } from '@/utils/request';\n\n/** iptv */\n\nexport function addIptv(doc) {\n  return request.request({\n    url: '/v1/live/iptv',\n    method: 'post',\n    data: doc,\n  });\n}\n\nexport function delIptv(doc) {\n  return request.request({\n    url: '/v1/live/iptv',\n    method: 'delete',\n    data: doc,\n  });\n}\n\nexport function putIptv(doc) {\n  return request.request({\n    url: '/v1/live/iptv',\n    method: 'put',\n    data: doc,\n  });\n}\n\nexport function putIptvDefault(id) {\n  return request.request({\n    url: `/v1/live/iptv/default/${id}`,\n    method: 'put',\n  });\n}\n\nexport function fetchIptvActive() {\n  return request.request({\n    url: '/v1/live/iptv/active',\n    method: 'get',\n  });\n}\n\nexport function fetchIptvPage(doc) {\n  return request.request({\n    url: '/v1/live/iptv/page',\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function fetchIptvCheck(id) {\n  return request.request({\n    url: `/v1/live/iptv/check/${id}`,\n    method: 'get',\n  });\n}\n\n/** channel */\n\nexport function addChannel(doc) {\n  return request.request({\n    url: '/v1/live/channel',\n    method: 'post',\n    data: doc,\n  });\n}\n\nexport function delChannel(doc) {\n  return request.request({\n    url: '/v1/live/channel',\n    method: 'delete',\n    data: doc,\n  });\n}\n\nexport function fetchChannelPage(doc) {\n  return request.request({\n    url: '/v1/live/channel/page',\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function fetchChannelDetail(id) {\n  return request.request({\n    url: `/v1/live/channel/${id}`,\n    method: 'get',\n  });\n}\n\nexport function fetchChannelEpg(doc) {\n  return request.request({\n    url: '/v1/live/channel/epg',\n    method: 'get',\n    params: doc,\n  });\n}\n"
  },
  {
    "path": "src/renderer/src/api/moment.ts",
    "content": "import { apiRequest as request } from '@/utils/request';\n\n/** moment */\n\nexport function fetchMomentRelated() {\n  return request.request({\n    url: '/v1/moment/related',\n    method: 'get',\n  });\n}\n\n/** history */\n\nexport function fetchHistoryPage(doc) {\n  return request.request({\n    url: '/v1/moment/history/page',\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function addHistory(doc) {\n  return request.request({\n    url: '/v1/moment/history',\n    method: 'post',\n    data: doc,\n  });\n}\n\nexport function delHistory(doc) {\n  return request.request({\n    url: `/v1/moment/history`,\n    method: 'delete',\n    data: doc,\n  });\n}\n\nexport function putHistory(doc) {\n  return request.request({\n    url: `/v1/moment/history`,\n    method: 'put',\n    data: doc,\n  });\n}\n\nexport function findHistory(doc) {\n  return request.request({\n    url: `/v1/moment/history/find`,\n    method: 'get',\n    params: doc,\n  });\n}\n\n/** star */\n\nexport function addStar(doc) {\n  return request.request({\n    url: `/v1/moment/star`,\n    method: 'post',\n    data: doc,\n  });\n}\nexport function delStar(doc) {\n  return request.request({\n    url: `/v1/moment/star`,\n    method: 'delete',\n    data: doc,\n  });\n}\nexport function putStar(doc) {\n  return request.request({\n    url: `/v1/moment/star`,\n    method: 'put',\n    data: doc,\n  });\n}\nexport function fetchStarPage(doc) {\n  return request.request({\n    url: '/v1/moment/star/page',\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function fetchStarDetail(id) {\n  return request.request({\n    url: `/v1/moment/star/${id}`,\n    method: 'get',\n  });\n}\n\nexport function findStar(doc) {\n  return request.request({\n    url: `/v1/moment/star/find`,\n    method: 'get',\n    params: doc,\n  });\n}\n"
  },
  {
    "path": "src/renderer/src/api/parse.ts",
    "content": "import { apiRequest as request } from '@/utils/request';\n\n/** analyze */\n\nexport function addAnalyze(doc) {\n  return request.request({\n    url: `/v1/parse/analyze`,\n    method: 'post',\n    data: doc,\n  });\n}\n\nexport function delAnalyze(doc) {\n  return request.request({\n    url: `/v1/parse/analyze`,\n    method: 'delete',\n    data: doc,\n  });\n}\n\nexport function putAnalyze(doc) {\n  return request.request({\n    url: `/v1/parse/analyze`,\n    method: 'put',\n    data: doc,\n  });\n}\n\nexport function fetchAnalyzeDetail(id) {\n  return request.request({\n    url: `/v1/parse/analyze/${id}`,\n    method: 'get',\n  });\n}\n\nexport function fetchAnalyzeDetailByKey(key) {\n  return request.request({\n    url: `/v1/parse/analyze/key/${key}`,\n    method: 'get',\n  });\n}\n\nexport function putAnalyzeDefault(id) {\n  return request.request({\n    url: `/v1/parse/analyze/default/${id}`,\n    method: 'put',\n  });\n}\n\nexport function fetchAnalyzeActive() {\n  return request.request({\n    url: '/v1/parse/analyze/active',\n    method: 'get',\n  });\n}\n\nexport function fetchAnalyzePage(doc) {\n  return request.request({\n    url: `/v1/parse/analyze/page`,\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function fetchAnalyzeCheck(id) {\n  return request.request({\n    url: `/v1/parse/analyze/check/${id}`,\n    method: 'get',\n  });\n}\n\n/** parse */\n\nexport function fetchParse(doc) {\n  return request.request({\n    url: `/v1/parse/media-direct`,\n    method: 'get',\n    params: doc,\n  });\n}\n"
  },
  {
    "path": "src/renderer/src/api/plugin.ts",
    "content": "import { apiRequest as request } from '@/utils/request';\n\nexport function fetchPluginPage(doc) {\n  return request.request({\n    url: `/v1/plugin/page`,\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function startPlugin(doc) {\n  return request.request({\n    url: `/v1/plugin/start`,\n    method: 'put',\n    data: doc,\n  });\n}\n\nexport function stopPlugin(doc) {\n  return request.request({\n    url: `/v1/plugin/stop`,\n    method: 'put',\n    data: doc,\n  });\n}\n\nexport function installPlugin(doc) {\n  return request.request({\n    url: `/v1/plugin/install`,\n    method: 'post',\n    data: doc,\n  });\n}\n\nexport function uninstallPlugin(doc) {\n  return request.request({\n    url: `/v1/plugin/uninstall`,\n    method: 'delete',\n    data: doc,\n  });\n}\n\nexport function fetchPluginDetail(id) {\n  return request.request({\n    url: `/v1/plugin/${id}`,\n    method: 'get',\n  });\n}\n"
  },
  {
    "path": "src/renderer/src/api/proxy.ts",
    "content": "import { PROXY_API } from '@shared/config/env';\n\nimport { apiRequest as request } from '@/utils/request';\n\nexport function setProxy(doc) {\n  return request.request({\n    url: PROXY_API,\n    method: 'post',\n    data: doc,\n  });\n}\n\nexport function getProxy(doc) {\n  return request.request({\n    url: PROXY_API,\n    method: 'get',\n    params: doc,\n  });\n}\n"
  },
  {
    "path": "src/renderer/src/api/setting.ts",
    "content": "import { apiRequest as request } from '@/utils/request';\n\nexport function setDefault(doc) {\n  return request.request({\n    url: '/v1/setting/default',\n    method: 'post',\n    data: doc,\n  });\n}\n\nexport function fetchSetup() {\n  return request.request({\n    url: '/v1/setting/setup',\n    method: 'get',\n  });\n}\n\nexport function fetchSettingList() {\n  return request.request({\n    url: '/v1/setting/list',\n    method: 'get',\n  });\n}\n\nexport function putSetting(doc) {\n  return request.request({\n    url: '/v1/setting',\n    method: 'put',\n    data: doc,\n  });\n}\n\nexport function sourceSetting(doc) {\n  return request.request({\n    url: '/v1/setting/source',\n    method: 'put',\n    data: doc,\n  });\n}\n\nexport function getSettingDetail(key) {\n  return request.request({\n    url: `/v1/setting/value/${key}`,\n    method: 'get',\n  });\n}\n"
  },
  {
    "path": "src/renderer/src/api/system.ts",
    "content": "import { apiRequest as request, sseRequest } from '@/utils/request';\n\n/** other */\n\nexport function getHealth() {\n  return request.request({\n    url: '/v1/system/health',\n    method: 'get',\n  });\n}\n\nexport function getIp() {\n  return request.request({\n    url: '/v1/system/ip',\n    method: 'get',\n  });\n}\n\nexport function systemInitiateReq(doc) {\n  return request.request({\n    url: '/v1/system/req',\n    method: 'post',\n    data: doc,\n  });\n}\n\nexport function m3u8Adremove(doc) {\n  return request.request({\n    url: '/v1/system/m3u8/adremove',\n    method: 'get',\n    params: doc,\n  });\n}\n\nexport function fetchLoggerStream(doc, callback) {\n  return sseRequest.request({\n    url: '/v1/system/log',\n    method: 'get',\n    params: doc,\n    ...callback,\n  });\n}\n\n/** ffmpeg */\n\nexport function generateFfmpegInfo(doc) {\n  return request.request({\n    url: '/v1/system/ffmpeg/info',\n    method: 'post',\n    data: doc,\n  });\n}\n\nexport function generateFfmpegScreenshot(doc) {\n  return request.request({\n    url: '/v1/system/ffmpeg/screenshot',\n    method: 'post',\n    data: doc,\n  });\n}\n\n/** cdp */\n\nexport function cdpSnifferMedia(doc) {\n  return request.request({\n    url: '/v1/system/cdp/sniffer/media',\n    method: 'post',\n    data: doc,\n  });\n}\n\n/** binary */\n\nexport function getBinaryList() {\n  return request.request({\n    url: '/v1/system/binary/list',\n    method: 'get',\n  });\n}\n\nexport function binaryInstall(doc) {\n  return request.request({\n    url: '/v1/system/binary/install',\n    method: 'post',\n    data: doc,\n  });\n}\n"
  },
  {
    "path": "src/renderer/src/components/action/components/ActionSection.vue",
    "content": "<template>\n  <div class=\"action-section\">\n    <!-- common -->\n    <div v-if=\"config.timeout && timeCountDown > 0\" class=\"action-item timeout-item\">\n      <t-progress\n        status=\"warning\"\n        :percentage=\"(timeCountDown / config.timeout) * 100\"\n        :label=\"$t('component.action.countdown', [timeCountDown])\"\n      />\n    </div>\n    <div v-if=\"config.qrcode\" class=\"action-item qrcode-item\">\n      <t-qrcode :value=\"config.qrcode\" level=\"L\" />\n    </div>\n\n    <component :is=\"currentComponent\" ref=\"componentRef\" :config=\"config\" @submit=\"onSubmit\" />\n  </div>\n</template>\n<script setup lang=\"tsx\">\ndefineOptions({\n  name: 'ActionSection',\n});\n\nconst props = defineProps({\n  config: {\n    type: Object as PropType<ICmsActionBase>,\n    default: () => ({}),\n  },\n});\n\nconst emits = defineEmits(['submit', 'timeout']);\n\nimport { CMS_ACTION_TYPE } from '@shared/config/cmsAction';\nimport { isPositiveFiniteNumber } from '@shared/modules/validate';\nimport type { ICmsActionBase } from '@shared/types/cms';\nimport type { PropType } from 'vue';\nimport { defineAsyncComponent, nextTick, onMounted, onUnmounted, ref, shallowRef, useTemplateRef, watch } from 'vue';\n\nconst componentRef = useTemplateRef<any>('componentRef');\n\nconst timeCountDown = ref<number>(0);\nconst timer = ref<ReturnType<typeof setInterval> | null>(null);\n\nconst componentMap = {\n  browser: defineAsyncComponent(() => import('./BrowserActionSection.vue')),\n  form: defineAsyncComponent(() => import('./FormActionSection.vue')),\n  help: defineAsyncComponent(() => import('./HelpActionSection.vue')),\n  msgbox: defineAsyncComponent(() => import('./MsgBoxActionSection.vue')),\n};\n\nconst currentComponent = shallowRef();\n\nwatch(\n  () => props.config,\n  () => {\n    stopTimeout(false);\n    nextTick(() => getComponent());\n    startTimeout();\n  },\n  { deep: true },\n);\n\nonMounted(() => setup());\nonUnmounted(() => dispose());\n\nconst setup = () => {\n  nextTick(() => getComponent());\n  startTimeout();\n};\n\nconst dispose = () => {\n  stopTimeout(false);\n};\n\nconst getComponent = () => {\n  const typeMap = {\n    [CMS_ACTION_TYPE.BROWSER]: 'browser',\n    [CMS_ACTION_TYPE.WEBVIEW]: 'browser',\n\n    [CMS_ACTION_TYPE.HELP]: 'help',\n    [CMS_ACTION_TYPE.MSGBOX]: 'msgbox',\n\n    [CMS_ACTION_TYPE.INPUT]: 'form',\n    [CMS_ACTION_TYPE.EDIT]: 'form',\n    [CMS_ACTION_TYPE.MENU]: 'form',\n    [CMS_ACTION_TYPE.SELECT]: 'form',\n    [CMS_ACTION_TYPE.MULTI_SELECT]: 'form',\n    [CMS_ACTION_TYPE.MULTI_INPUT]: 'form',\n    [CMS_ACTION_TYPE.MULTI_INPUT_X]: 'form',\n  };\n\n  const finalType = typeMap[props.config.type] || 'form';\n\n  currentComponent.value = componentMap[finalType];\n};\n\nconst startTimeout = () => {\n  const timeout = props.config.timeout;\n  if (!isPositiveFiniteNumber(timeout)) return;\n\n  timeCountDown.value = timeout!;\n\n  timer.value = setInterval(() => {\n    if (--timeCountDown.value <= 0) {\n      stopTimeout(true);\n    }\n  }, 1000);\n};\n\nconst stopTimeout = (trigger: boolean = false) => {\n  if (timer.value) {\n    clearInterval(timer.value);\n    timer.value = null;\n  }\n\n  timeCountDown.value = 0;\n\n  if (trigger) emits('timeout');\n};\n\nconst onSubmit = (id: string, data: Record<string, any>) => {\n  emits('submit', id, data);\n};\n\ndefineExpose({\n  reset: () => componentRef.value?.reset(),\n  submit: () => componentRef.value?.submit(),\n});\n</script>\n<style lang=\"less\" scoped>\n.action-section {\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n\n  .action-item {\n    width: 100%;\n  }\n\n  .qrcode-item {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n  }\n\n  &-browser {\n    .browser-view {\n      border-radius: var(--td-radius-medium);\n      overflow: hidden;\n    }\n  }\n\n  &-help {\n    .title {\n      font: var(--td-font-title-medium);\n      margin-top: var(--td-comp-margin-m);\n      margin-bottom: var(--td-comp-margin-s);\n    }\n\n    .content {\n      color: var(--td-text-color-primary);\n      font: var(--td-font-body-medium);\n      margin-bottom: var(--td-comp-margin-s);\n    }\n  }\n\n  &-form {\n    .form-group {\n      width: 100%;\n      display: flex;\n      gap: var(--td-size-4);\n\n      &-input {\n        flex: 1;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/action/components/BrowserActionSection.vue",
    "content": "<template>\n  <div class=\"browser-action-section\">\n    <webview-view\n      :src=\"props.config.url\"\n      :headers=\"props.config.header\"\n      :style=\"{\n        height: props.config.browserHeight ? `${props.config.browserHeight}px` : '300px',\n        width: props.config.browserWidth ? `${props.config.browserWidth}px` : '100%',\n      }\"\n      class=\"browser-view\"\n    />\n    <t-button block @click=\"handleOpenInBrowser\">{{ $t('component.action.fullview') }}</t-button>\n  </div>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'BrowserActionSection',\n});\n\nconst props = defineProps({\n  config: {\n    type: Object as PropType<ICmsActionBrowser>,\n    default: () => ({}),\n  },\n});\n\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport type { ICmsActionBrowser } from '@shared/types/cms';\nimport type { PropType } from 'vue';\nimport { toRaw } from 'vue';\n\nimport WebviewView from '@/components/webview/index.vue';\n\nconst handleOpenInBrowser = () => {\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_BROWSER, props.config.url, toRaw(props.config.header));\n};\n\ndefineExpose({\n  reset: () => {},\n  submit: () => {},\n});\n</script>\n<style lang=\"less\" scoped>\n.browser-action-section {\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n\n  .browser-view {\n    border-radius: var(--td-radius-medium);\n    overflow: hidden;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/action/components/FormActionSection.vue",
    "content": "<template>\n  <div class=\"form-action-section\">\n    <div v-if=\"config.imageUrl\" class=\"action-item image-item\">\n      <t-image\n        :src=\"config.imageUrl\"\n        :style=\"{\n          height: config.imageHeight ? `${config.imageHeight}px` : 'auto',\n          width: 'fit-content',\n          margin: '0 auto',\n          pointerEvents: config.imageClickCoord ? 'pointer' : 'none',\n        }\"\n        lazy\n        shape=\"round\"\n        :loading=\"renderLoading\"\n        @click=\"handleGetImageCoord(config, $event)\"\n      />\n    </div>\n\n    <t-card :bordered=\"false\" class=\"action-item\" :header-style=\"{ padding: 0 }\" :body-style=\"{ padding: 0 }\">\n      <template v-if=\"showTitle\" #subtitle>\n        {{ config.msg }}\n      </template>\n\n      <t-form\n        ref=\"formRef\"\n        :data=\"formData\"\n        :rules=\"rules\"\n        required-mark-position=\"left\"\n        label-align=\"top\"\n        reset-type=\"initial\"\n        @submit=\"onSubmit\"\n      >\n        <t-form-item v-for=\"item in inputs\" :key=\"getKey(item)\" :name=\"getKey(item)\" :label=\"item.msg || item.name\">\n          <template #label>\n            <span v-if=\"item.msg || item.name\">\n              {{ item.msg || item.name }}\n            </span>\n\n            <t-popup v-if=\"item.help\" destroy-on-close>\n              <info-circle-icon class=\"help-icon\" />\n              <template #content>\n                <span v-html=\"item.help\"></span>\n              </template>\n            </t-popup>\n          </template>\n\n          <!-- calendar -->\n          <t-date-picker\n            v-if=\"item.selectData === '[calendar]'\"\n            v-model=\"formData[getKey(item)]\"\n            clearable\n            :placeholder=\"item.tip || $t('common.placeholder.input')\"\n            class=\"form-calendar\"\n          />\n\n          <!-- file / folder / image -->\n          <div v-else-if=\"isUploadType(item)\" class=\"form-group\">\n            <t-input\n              v-model=\"formData[getKey(item)]\"\n              clearable\n              :placeholder=\"item.tip || $t('common.placeholder.input')\"\n              class=\"form-group-input\"\n            />\n            <t-button theme=\"default\" class=\"form-group-btn\" @click=\"handleUpload(item)\">\n              {{ $t('common.upload') }}\n            </t-button>\n          </div>\n\n          <!-- select -->\n          <t-select\n            v-else-if=\"isSelect(item)\"\n            v-model=\"formData[getKey(item)]\"\n            :multiple=\"isSelectMultiple(item)\"\n            clearable\n            :creatable=\"!(!!item.quickSelect || !!item.onlyQuickSelect)\"\n            :filterable=\"!(!!item.quickSelect || !!item.onlyQuickSelect)\"\n            :placeholder=\"item.tip || $t('common.placeholder.input')\"\n          >\n            <t-option v-for=\"opt in getOptions(item)\" :key=\"opt.value\" :value=\"opt.value\" :label=\"opt.name\" />\n          </t-select>\n\n          <!-- textarea -->\n          <t-textarea\n            v-else-if=\"isTextarea(item)\"\n            v-model=\"formData[getKey(item)]\"\n            :autosize=\"{ minRows: item.multiLine || 4 }\"\n            clearable\n            :placeholder=\"item.tip || $t('common.placeholder.input')\"\n          />\n\n          <!-- input -->\n          <t-input\n            v-else-if=\"isInput(item)\"\n            v-model=\"formData[getKey(item)]\"\n            clearable\n            :placeholder=\"item.tip || $t('common.placeholder.input')\"\n            :type=\"getInputType(item)\"\n          />\n        </t-form-item>\n      </t-form>\n    </t-card>\n  </div>\n</template>\n<script setup lang=\"tsx\">\ndefineOptions({\n  name: 'FormActionSection',\n});\n\nconst props = defineProps({\n  config: {\n    type: Object as PropType<ICmsActionForm>,\n    default: () => ({}),\n  },\n});\n\nconst emits = defineEmits(['submit']);\n\nimport { CMS_ACTION_INPUT_TYPE, CMS_ACTION_TYPE } from '@shared/config/cmsAction';\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport {\n  isArray,\n  isArrayEmpty,\n  isObject,\n  isObjectEmpty,\n  isPositiveFiniteNumber,\n  isStrEmpty,\n  isString,\n} from '@shared/modules/validate';\nimport type { ICmsActionForm } from '@shared/types/cms';\nimport { InfoCircleIcon } from 'tdesign-icons-vue-next';\nimport type { FormInstanceFunctions, FormRule, SubmitContext } from 'tdesign-vue-next';\nimport { Loading, MessagePlugin } from 'tdesign-vue-next';\nimport type { PropType } from 'vue';\nimport { computed, nextTick, onMounted, ref, toRaw, useTemplateRef, watch } from 'vue';\n\nimport { parseMenuData, parseSelectData } from '../utils';\n\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\nconst formData = ref<Record<string, any>>({});\nconst rules = ref<Record<string, FormRule[]>>({});\n\nconst inputs = computed(() => (isArray(props.config.input) ? props.config.input : [props.config]));\n\nconst showTitle = computed(() => isArray(props.config.input) && props.config.msg);\n\nwatch(\n  () => props.config,\n  (val) => {\n    resetState();\n    nextTick(() => buildForm(val));\n  },\n  { deep: true },\n);\n\nonMounted(() => setup());\n\nconst renderLoading = () => (\n  <div\n    style={{\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%',\n      height: '100%',\n      background: 'var(--td-bg-color-component)',\n      backdropFilter: 'blur(10px)',\n      borderRadius: 'var(--td-radius-medium)',\n    }}\n  >\n    <Loading delay={0} fullscreen={false} indicator inheritColor={false} loading preventScrollThrough showOverlay />\n  </div>\n);\n\nconst setup = () => {\n  nextTick(() => buildForm(props.config));\n};\n\nconst resetState = () => {\n  formData.value = {};\n  rules.value = {};\n};\n\nconst buildForm = (options: Record<string, any>) => {\n  if (!isObject(options) || isObjectEmpty(options)) return;\n\n  // const validTypes = ['edit', 'input', 'multiInput', 'multiInputX', 'menu', 'select', 'multiSelect', 'order', 'remote', 'help', 'msgbox'];\n  // if (!validTypes.includes(options.type)) return;\n\n  if (\n    [CMS_ACTION_TYPE.MULTI_INPUT, CMS_ACTION_TYPE.MULTI_INPUT_X].includes(options.type) &&\n    isArray(options.input) &&\n    !isArrayEmpty(options.input)\n  ) {\n    options.input.forEach(createField);\n    return;\n  }\n\n  createField(options);\n};\n\nconst createField = (field: Record<string, any>) => {\n  const key = getKey(field);\n  formData.value[key] = field.value ?? '';\n  if (isSelect(field)) {\n    const options = getOptions(field);\n    const select = options.filter((item) => item.selected).map((item) => item.value);\n    formData.value[key] = [CMS_ACTION_TYPE.SELECT, CMS_ACTION_TYPE.MULTI_SELECT].includes(field.type)\n      ? select\n      : select[0];\n  }\n\n  const typeRuleMap: Record<number, FormRule> = {\n    [CMS_ACTION_INPUT_TYPE.EMAIL]: { email: { ignore_max_length: true } },\n    [CMS_ACTION_INPUT_TYPE.URL]: {\n      url: {\n        protocols: ['http', 'https', 'ftp'],\n        require_protocol: true,\n      },\n    },\n  };\n\n  const fieldRules = [\n    field.required && { required: true },\n    field.validator && { validator: field.validator },\n    typeRuleMap[field.inputType],\n  ].filter(Boolean) as FormRule[];\n\n  if (!isArrayEmpty(fieldRules)) {\n    rules.value[key] = fieldRules;\n  }\n};\n\nconst getKey = (item: Record<string, any>) => {\n  return item.id || item.name || 'value';\n};\n\nconst isUploadType = (item: Record<string, any>) => {\n  return ['[file]', '[folder]', '[image]'].includes(item.selectData);\n};\n\nconst isInput = (item: Record<string, any>) => {\n  return !item.type || item.type === CMS_ACTION_TYPE.INPUT;\n};\n\nconst isTextarea = (item: Record<string, any>) => {\n  return item.type === CMS_ACTION_TYPE.EDIT || item.multiLine > 1;\n};\n\nconst isSelect = (item: Record<string, any>) => {\n  const validTypes = [CMS_ACTION_TYPE.MENU, CMS_ACTION_TYPE.SELECT, CMS_ACTION_TYPE.MULTI_SELECT].includes(item.type);\n  const hasSelectData = isString(item.selectData) && !isStrEmpty(item.selectData) && !isUploadType(item);\n  return (validTypes || hasSelectData) && !isUploadType(item);\n};\n\nconst isSelectMultiple = (item: Record<string, any>) => {\n  return [CMS_ACTION_TYPE.SELECT, CMS_ACTION_TYPE.MULTI_SELECT].includes(item.type);\n};\n\nconst getOptions = (item: Record<string, any>): Array<{ name: string; value: string; selected?: boolean }> => {\n  if (item.option) {\n    const options = parseMenuData(item.option);\n    const selectedIndex = item.selectedIndex;\n    if (isPositiveFiniteNumber(selectedIndex)) {\n      options[selectedIndex].selected = true;\n    }\n    return options;\n  }\n  if (item.selectData) return parseSelectData(item.selectData);\n  return [];\n};\n\nconst getInputType = (item: Record<string, any>) => {\n  const typeMap: Record<number, string> = {\n    [CMS_ACTION_INPUT_TYPE.TEXT]: 'text',\n    [CMS_ACTION_INPUT_TYPE.PASSWORD]: 'password',\n    [CMS_ACTION_INPUT_TYPE.NUMBER]: 'number',\n    [CMS_ACTION_INPUT_TYPE.EMAIL]: 'text', // email\n    [CMS_ACTION_INPUT_TYPE.URL]: 'text', // url\n  };\n\n  const type = item.inputType;\n  return typeMap[type] ?? 'text';\n};\n\nconst handleGetImageCoord = (item: Record<string, any>, event: { e: PointerEvent }) => {\n  const { e } = event;\n  const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n  const x = Math.round(e.clientX - rect.left);\n  const y = Math.round(e.clientY - rect.top);\n  const coord = `${x},${y}`;\n\n  const key = getKey(item);\n\n  formData.value[key] = formData.value[key] ? `${formData.value[key]}-${coord}` : coord;\n};\n\nconst handleUpload = async (item: any) => {\n  const type = item.selectData.replace('[', '').replace(']', '');\n  const key = getKey(item);\n\n  const channelMap: Record<string, string> = {\n    file: IPC_CHANNEL.FILE_SELECT_FILE_DIALOG,\n    folder: IPC_CHANNEL.FILE_SELECT_FOLDER_DIALOG,\n    image: IPC_CHANNEL.FILE_SELECT_FILE_DIALOG,\n  };\n\n  const filterMap: Record<string, any[]> = {\n    file: [{ name: 'All Files', extensions: ['*'] }],\n    folder: [],\n    image: [{ name: 'Image Files', extensions: ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'] }],\n  };\n\n  const resp = await window.electron.ipcRenderer.invoke(channelMap[type], {\n    filters: filterMap[type],\n  });\n\n  if (!isArray(resp) || isArrayEmpty(resp)) return;\n\n  formData.value[key] = resp[0];\n};\n\nconst onSubmit = (context: SubmitContext<any>) => {\n  const { validateResult, firstError } = context;\n\n  if (validateResult === true) {\n    const id = props.config.actionId || '';\n    emits('submit', id, toRaw(formData.value));\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\ndefineExpose({\n  reset: () => formRef.value?.reset(),\n  submit: () => formRef.value?.submit(),\n});\n</script>\n<style lang=\"less\" scoped>\n.form-action-section {\n  :deep(.t-form__label--top) {\n    white-space: wrap;\n  }\n\n  .form-calendar {\n    flex: 1;\n  }\n\n  .form-group {\n    width: 100%;\n    display: flex;\n    gap: var(--td-size-4);\n\n    &-input {\n      flex: 1;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/action/components/HelpActionSection.vue",
    "content": "<template>\n  <div class=\"help-action-section\">\n    <template v-for=\"(value, key) in helpData\" :key=\"key\">\n      <h3 class=\"title\">{{ key }}</h3>\n      <p class=\"content\" v-html=\"value\"></p>\n    </template>\n  </div>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'HelpActionSection',\n});\n\nconst props = defineProps({\n  config: {\n    type: Object as PropType<ICmsActionHelp>,\n    default: () => ({}),\n  },\n});\n\nimport type { ICmsActionHelp } from '@shared/types/cms';\nimport type { PropType } from 'vue';\nimport { computed } from 'vue';\n\nimport { parseHelpData } from '../utils';\n\nconst helpData = computed(() => parseHelpData(props.config.data));\n\ndefineExpose({\n  reset: () => {},\n  submit: () => {},\n});\n</script>\n<style lang=\"less\" scoped>\n.help-action-section {\n  .title {\n    font: var(--td-font-title-medium);\n    margin-top: var(--td-comp-margin-m);\n    margin-bottom: var(--td-comp-margin-s);\n  }\n\n  .content {\n    color: var(--td-text-color-primary);\n    font: var(--td-font-body-medium);\n    margin-bottom: var(--td-comp-margin-s);\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/action/components/MsgBoxActionSection.vue",
    "content": "<template>\n  <div class=\"msgbox-action-section\">\n    <t-alert>\n      <template #message>\n        <span v-html=\"config.msg || config.htmlMsg\"></span>\n      </template>\n    </t-alert>\n\n    <div v-if=\"config.imageUrl\" class=\"action-item image-item\">\n      <t-image\n        :src=\"config.imageUrl\"\n        :style=\"{\n          height: config.imageHeight ? `${config.imageHeight}px` : '200px',\n          width: 'fit-content',\n          margin: '0 auto',\n        }\"\n        lazy\n        shape=\"round\"\n        :loading=\"renderLoading\"\n      />\n    </div>\n  </div>\n</template>\n<script setup lang=\"tsx\">\ndefineOptions({\n  name: 'MsgBoxActionSection',\n});\n\ndefineProps({\n  config: {\n    type: Object as PropType<ICmsActionMsgbox>,\n    default: () => ({}),\n  },\n});\n\nimport type { ICmsActionMsgbox } from '@shared/types/cms';\nimport { Loading } from 'tdesign-vue-next';\nimport type { PropType } from 'vue';\n\nconst renderLoading = () => (\n  <div\n    style={{\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%',\n      height: '100%',\n      background: 'var(--td-bg-color-component)',\n      backdropFilter: 'blur(10px)',\n      borderRadius: 'var(--td-radius-medium)',\n    }}\n  >\n    <Loading delay={0} fullscreen={false} indicator inheritColor={false} loading preventScrollThrough showOverlay />\n  </div>\n);\n\ndefineExpose({\n  reset: () => {},\n  submit: () => {},\n});\n</script>\n<style lang=\"less\" scoped>\n.msgbox-action-section {\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/action/index.vue",
    "content": "<template>\n  <t-dialog v-model:visible=\"formVisible\" v-bind=\"attrsCustom\">\n    <template v-if=\"formData.title\" #header>\n      <div class=\"action-header\">\n        {{ formData.title }}\n      </div>\n    </template>\n\n    <template #body>\n      <div class=\"action-content\">\n        <action-section-view ref=\"actionRef\" :config=\"formData\" @submit=\"onSubmit\" @timeout=\"onTimeout\" />\n      </div>\n    </template>\n\n    <template #footer>\n      <div class=\"action-footer\">\n        <!-- <t-button v-if=\"parsedButton.includes('preview')\" variant=\"dashed\" class=\"btn-modern\" @click=\"handlePreview\">\n          {{ $t('common.preview') }}\n        </t-button> -->\n\n        <t-button v-if=\"parsedButton.includes('reset')\" variant=\"dashed\" class=\"btn-modern\" @click=\"handleReset\">\n          {{ $t('common.reset') }}\n        </t-button>\n\n        <t-button v-if=\"parsedButton.includes('cancel')\" theme=\"default\" class=\"btn-modern\" @click=\"handleCancel\">\n          {{ $t('common.cancel') }}\n        </t-button>\n\n        <t-button v-if=\"parsedButton.includes('confirm')\" theme=\"primary\" class=\"btn-modern\" @click=\"handleSubmit\">\n          {{ $t('common.confirm') }}\n        </t-button>\n      </div>\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'Action',\n});\n\nconst props = defineProps({\n  config: {\n    type: Object as PropType<ICmsActionBase>,\n    default: () => ({}),\n  },\n  visible: {\n    type: Boolean,\n    default: false,\n  },\n});\n\nconst emits = defineEmits(['update:visible', 'cancel', 'submit', 'timeout']);\n\nimport type { ICmsActionButtonTypeDisplay } from '@shared/config/cmsAction';\nimport type { ICmsActionBase } from '@shared/types/cms';\nimport type { Dialog, DialogProps } from 'tdesign-vue-next';\nimport type { PropType } from 'vue';\nimport { computed, ref, useAttrs, watch } from 'vue';\n\nimport ActionSectionView from './components/ActionSection.vue';\nimport { parseActionButton } from './utils';\n\nconst attrs = useAttrs() as DialogProps;\n\nconst dialogRef = ref<InstanceType<typeof Dialog>>();\nconst actionRef = ref<InstanceType<typeof ActionSectionView>>();\n\nconst formVisible = ref<boolean>(props.visible);\n\nconst formData = ref<ICmsActionBase>(props.config);\n\nconst attrsCustom = computed<Partial<DialogProps>>(() => {\n  // eslint-disable-next-line ts/no-unused-vars\n  const { visible, ...rest } = attrs;\n\n  return {\n    ref: dialogRef,\n    showInAttachedElement: true,\n    destroyOnClose: true,\n    placement: 'center',\n    footer: shouldShowFooter.value,\n    ...rest,\n    onCloseBtnClick: () => handleCancel(),\n    closeOnOverlayClick: formData.value.canceledOnTouchOutside ?? true,\n    closeOnEscKeydown: formData.value.canceledOnTouchOutside ?? true,\n  } as Partial<DialogProps>;\n});\n\nwatch(\n  () => formVisible.value,\n  (val) => emits('update:visible', val),\n);\nwatch(\n  () => props.visible,\n  (val) => (formVisible.value = val),\n);\nwatch(\n  () => props.config,\n  (val) => (formData.value = val),\n  { deep: true },\n);\n\nconst parsedButton = computed<Array<ICmsActionButtonTypeDisplay>>(() =>\n  parseActionButton(formData.value.type, formData.value.button),\n);\n\nconst shouldShowFooter = computed(() => parsedButton.value.length > 0);\n\n// const handlePreview = () => {};\n\nconst handleCancel = () => {\n  emits('cancel');\n  formVisible.value = false;\n};\n\nconst handleReset = () => {\n  actionRef.value?.reset();\n};\n\nconst onSubmit = (id: string, data?: Record<string, any>) => {\n  emits('submit', id, data);\n  formVisible.value = false;\n};\n\nconst onTimeout = () => {\n  emits('timeout');\n  formVisible.value = false;\n};\n\nconst handleSubmit = () => {\n  actionRef.value?.submit();\n};\n\ndefineExpose({\n  reset: handleReset,\n  submit: handleSubmit,\n});\n</script>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "src/renderer/src/components/action/utils.ts",
    "content": "import type {\n  ICmsActionButtonType,\n  ICmsActionButtonTypeDisplay,\n  ICmsActionButtonTypeEnum,\n  ICmsActionFormType,\n  ICmsActionType,\n} from '@shared/config/cmsAction';\nimport { CMS_ACTION_FORM_TYPE, CMS_ACTION_TYPE } from '@shared/config/cmsAction';\nimport {\n  isArray,\n  isArrayEmpty,\n  isBoolean,\n  isJsonStr,\n  isNil,\n  isObject,\n  isObjectEmpty,\n  isStrEmpty,\n  isString,\n} from '@shared/modules/validate';\nimport JSON5 from 'json5';\n\nconst isFormType = (type: ICmsActionType = CMS_ACTION_TYPE.INPUT): boolean => {\n  return CMS_ACTION_FORM_TYPE.includes(type as unknown as ICmsActionFormType);\n};\n\nconst buttonToStandard = (type?: ICmsActionButtonType): Array<ICmsActionButtonTypeDisplay> => {\n  if (isNil(type)) return [];\n  if (isBoolean(type) && type === true) type = 2;\n\n  const map: Record<ICmsActionButtonTypeEnum, Array<ICmsActionButtonTypeDisplay>> = {\n    0: [], //\n    1: ['confirm'], // confirm\n    2: ['cancel', 'confirm'], // cancel/confirm\n    3: ['cancel', 'confirm', 'reset'], // cancel/confirm/reset\n    4: ['cancel', 'confirm', 'reset', 'preview'], // cancel/confirm/reset/preview\n  };\n\n  return Object.keys(map).includes(String(type)) ? map[type as ICmsActionButtonTypeEnum] : [];\n};\n\nconst parseDelimitedFormat = (data: string, delimiter: string, pairSeparator: string) => {\n  return data\n    .split(delimiter)\n    .map((item) => {\n      const [name, value] = item.split(pairSeparator);\n      return {\n        name: name?.trim() || item.trim(),\n        value: value?.trim() || item.trim(),\n      };\n    })\n    .filter((item) => item.name);\n};\n\nexport const parseActionButton = (actionType?: ICmsActionType, btnType?: ICmsActionButtonType) => {\n  if (isNil(btnType) && isFormType(actionType)) btnType = 2;\n  return buttonToStandard(btnType);\n};\n\nexport const parseActionConfig = (data: string | Record<string, any> | Record<string, { config: any }>) => {\n  if (isJsonStr(data)) return JSON5.parse(data as string);\n\n  if (isObject(data) && !isObjectEmpty(data) && Object.hasOwn(data, 'config')) return data.config;\n\n  return data;\n};\n\nexport const parseSelectData = (data: string): Array<{ name: string; value: string }> => {\n  if (!isString(data) || isStrEmpty(data)) return [];\n\n  try {\n    // Handle special selectors like [folder], [calendar], etc.\n    const SPECIAL_SELECTOR_REGEX = /^\\[(folder|calendar|file|image)\\]$/;\n    const specialMatch = data.match(SPECIAL_SELECTOR_REGEX);\n    if (specialMatch) {\n      const DISPLAY_NAMES = {\n        calendar: '📅 选择日期',\n        file: '📄 选择文件',\n        folder: '📁 选择文件夹',\n        image: '🖼️ 选择图片',\n      };\n\n      const type = specialMatch[1];\n      return [{ name: DISPLAY_NAMES[type], value: data }];\n    }\n\n    // Handle prefixed selectors with options like [Please select]a,b,c\n    if (data.startsWith('[') && data.includes(']')) {\n      const bracketEnd = data.indexOf(']');\n      const prefix = data.substring(1, bracketEnd);\n      const options = data.substring(bracketEnd + 1);\n\n      if (options) {\n        return options\n          .split(',')\n          .map((item) => {\n            const value = item.trim();\n            return { name: value, value };\n          })\n          .filter((item) => item.name);\n      } else {\n        return [{ name: prefix, value: data }];\n      }\n    }\n\n    // Handle JSON format\n    if (isJsonStr(data)) return JSON5.parse(data);\n\n    // Handle key-value format: key:=value,key2:=value2\n    if (data.includes(':=')) return parseDelimitedFormat(data, ',', ':=');\n\n    // Handle legacy pipe-delimited format: name=value|name2=value2\n    if (data.includes('|')) return parseDelimitedFormat(data, '|', '=');\n\n    return [];\n  } catch (error) {\n    console.warn('解析selectData失败:', error);\n    return [];\n  }\n};\n\nexport const parseMenuData = (\n  data: Array<string | Record<string, any>>,\n): Array<{ name: string; value: string; selected: boolean }> => {\n  if (!isArray(data) || isArrayEmpty(data)) return [];\n\n  const result: Array<{ name: string; value: string; selected: boolean }> = [];\n\n  for (const item of data) {\n    if (isObject(item)) {\n      result.push({ name: item.name ?? '', value: item.action ?? '', selected: !!item.selected });\n    } else if (isString(item)) {\n      const [name = '', value = '', selected = 'false'] = item.split('$');\n      result.push({ name, value, selected: selected === 'true' });\n    }\n  }\n\n  return result;\n};\n\nexport const parseHelpData = (data: Record<string, string>): Record<string, string> => {\n  if (!isObject(data) || isObjectEmpty(data)) return {};\n\n  const result: Record<string, any> = {};\n\n  for (const [key, value] of Object.entries(data)) {\n    result[key] = value.replaceAll('\\n', '<br/>').replaceAll(' ', '&nbsp;');\n  }\n\n  return result;\n};\n\nexport const isSpecialAction = (data: Record<string, any>): boolean => {\n  if (!isObject(data) || isObjectEmpty(data)) return false;\n\n  // Contains a content field and the actionId is __copy__\n  if (data.actionId === '__copy__' && Object.hasOwn(data, 'content')) return true;\n\n  if (data.actionId.startsWith('__') && data.actionId.endsWith('__')) return true;\n\n  return false;\n};\n\nexport const isActionConfig = (data: Record<string, any>): boolean => {\n  if (!isObject(data) || isObjectEmpty(data)) return false;\n  if (!Object.hasOwn(data, 'actionId')) return false;\n\n  if (isSpecialAction(data)) return true;\n\n  if (!Object.hasOwn(data, 'type') || !Object.values(CMS_ACTION_TYPE).includes(data.type)) return false;\n\n  return true;\n};\n"
  },
  {
    "path": "src/renderer/src/components/aigc/index.vue",
    "content": "<template>\n  <div class=\"aigc\">\n    <div v-if=\"isAvaildParam\" class=\"aigc-main\">\n      <div class=\"aigc-content\">\n        <t-chat-list :clear-history=\"messages.length > 0\" @clear=\"clearHistory\">\n          <t-chat-message\n            v-for=\"(message, idx) in messages\"\n            :key=\"message.id\"\n            :message=\"message\"\n            :variant=\"messageProps[message.role]?.variant\"\n            :placement=\"messageProps[message.role]?.placement\"\n            :avatar=\"messageProps[message.role]?.avatar\"\n            :handle-actions=\"message.role === 'user' ? {} : handleMsgActions\"\n            :chat-content-props=\"contentProps\"\n            :copy-text=\"handleCopyAction\"\n            allow-content-segment-custom\n          >\n            <template #actionbar>\n              <t-chat-actionbar\n                v-if=\"isAIMessage(message) && message.status === 'complete'\"\n                :comment=\"actionComment\"\n                :action-bar=\"getActionBar(idx === messages.length - 1)\"\n                @actions=\"handleAction\"\n              />\n            </template>\n          </t-chat-message>\n        </t-chat-list>\n\n        <t-chat-sender\n          v-model=\"inputValue\"\n          :textarea-props=\"{\n            placeholder: $t('common.placeholder.input'),\n          }\"\n          :loading=\"senderLoading\"\n          @send=\"handleSend\"\n          @stop=\"handleStop\"\n        />\n      </div>\n      <p class=\"aigc-declare\">{{ $t('aigc.declare') }}</p>\n    </div>\n\n    <div v-else class=\"aigc-empty\">\n      <t-empty :title=\"$t('aigc.noParam')\">\n        <template #image>\n          <error-circle-icon size=\"64\" color=\"var(--td-text-color-placeholder)\" />\n        </template>\n      </t-empty>\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { APP_NAME } from '@shared/config/appinfo';\nimport { AIGC_CHAT_COMPLETION_API } from '@shared/config/env';\nimport { THEME } from '@shared/config/theme';\nimport { isHttp, isNil, isObject, isObjectEmpty } from '@shared/modules/validate';\nimport type {\n  AIMessageContent,\n  ChatMessagesData,\n  ChatRequestParams,\n  ChatServiceConfig,\n  SSEChunkData,\n  SuggestionItem,\n  TdChatActionsName,\n  TdChatContentMDOptions,\n  TdChatMessageConfig,\n} from '@tdesign-vue-next/chat';\nimport { isAIMessage, useChat } from '@tdesign-vue-next/chat';\nimport { cloneDeep } from 'es-toolkit';\nimport { ErrorCircleIcon } from 'tdesign-icons-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { computed, onMounted, ref } from 'vue';\n\nimport { createMemorySession, delMemoryMessage, delMemorySession } from '@/api/aigc';\nimport { getSettingDetail } from '@/api/setting';\nimport openaiIcon from '@/assets/ai/openai-kimi.png';\nimport { emitterChannel, emitterSource } from '@/config/emitterChannel';\nimport { t } from '@/locales';\nimport { useSettingStore } from '@/store';\nimport emitter from '@/utils/emitter';\n\n/**\n * @see https://tdesign.tencent.com/vue-next/components/chatbot\n */\n\ntype OpenAIStreamChunk =\n  | {\n      id?: string;\n      object?: string;\n      created?: number;\n      model?: string;\n      choices?: Array<{\n        index: number;\n        delta?: {\n          role?: 'user' | 'assistant' | 'system';\n          content?: string;\n          function_call?: any;\n          reasoning_content?: string;\n        };\n        finish_reason?: string;\n      }>;\n    }\n  | string;\n\nconst storeSetting = useSettingStore();\n\nconst inputValue = ref<string>('');\nconst actionComment = ref<'good' | 'bad' | ''>('');\n\nconst reasoningCache = ref<string | null>(null);\nconst isReasoning = ref<boolean>(false);\n\nconst config = ref<{ server: string; key: string; model: string }>({\n  server: '',\n  key: '',\n  model: '',\n});\nconst sessionId = ref<string | null>(null);\n\nconst messageProps = ref<TdChatMessageConfig>({\n  user: { variant: 'base', placement: 'right' },\n  assistant: {\n    variant: 'text',\n    placement: 'left',\n    actions: ['copy', 'replay', 'good', 'bad'],\n    avatar: openaiIcon,\n  },\n});\n\nconst contentProps = ref({\n  thinking: { maxHeight: 100, collapsed: false },\n  markdown: {\n    engine: 'cherry-markdown',\n    options: {\n      themeSettings: {\n        codeBlockTheme: storeSetting.displayTheme === THEME.LIGHT ? THEME.LIGHT : THEME.DARK,\n      } as TdChatContentMDOptions,\n    },\n  },\n});\n\nconst defaultMessages = ref<ChatMessagesData[]>([\n  {\n    id: 'welcome',\n    role: 'assistant',\n    content: [\n      {\n        type: 'text',\n        status: 'complete',\n        data: t('aigc.chat.tip', [APP_NAME]),\n      },\n      {\n        type: 'suggestion',\n        status: 'complete',\n        data: [\n          {\n            title: t('aigc.chat.suggestion.desc.title', [APP_NAME]),\n            prompt: t('aigc.chat.suggestion.desc.prompt', [APP_NAME]),\n          },\n        ],\n      },\n    ],\n  },\n]);\n\nconst chatServiceConfig = ref<ChatServiceConfig>({\n  endpoint: AIGC_CHAT_COMPLETION_API,\n  stream: true,\n  protocol: 'default',\n  onRequest: (\n    params: ChatRequestParams,\n  ): (ChatRequestParams & RequestInit) | Promise<ChatRequestParams & RequestInit> => {\n    return {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({\n        prompt: params.prompt,\n        messageID: params.messageId,\n        stream: true,\n        model: config.value.model,\n        sessionId: sessionId.value,\n      }),\n    };\n  },\n  onMessage: (chunk: SSEChunkData): AIMessageContent | AIMessageContent[] | null => {\n    const data = chunk.data as OpenAIStreamChunk;\n\n    // stream end / invalid\n    if (data === '[DONE]') return null;\n    if (!isObject(data) || isObjectEmpty(data)) return null;\n\n    const delta = data?.choices?.[0]?.delta;\n    if (!isObject(data) || isObjectEmpty(delta)) return null;\n\n    const reasoningContent = delta?.reasoning_content;\n    const mainContent = delta?.content ?? '';\n\n    const content = isNil(reasoningCache.value) ? mainContent : reasoningCache.value + mainContent;\n    reasoningCache.value = null;\n\n    /** ---------- reasoning streaming ---------- */\n    if (!isNil(reasoningContent)) {\n      isReasoning.value = true;\n\n      return {\n        type: 'thinking',\n        data: { title: t('aigc.status.reasoning'), text: reasoningContent },\n        status: 'streaming',\n      };\n    }\n\n    /** ---------- reasoning → content ---------- */\n    if (isReasoning.value && isNil(reasoningContent)) {\n      isReasoning.value = false;\n      reasoningCache.value = content;\n\n      return {\n        type: 'thinking',\n        data: { title: t('aigc.status.reasoned'), text: '' },\n        status: 'complete',\n      };\n    }\n\n    /** ---------- normal content ---------- */\n    if (content) {\n      return {\n        type: 'markdown',\n        data: content,\n        strategy: 'merge',\n      };\n    }\n\n    return null;\n  },\n});\n\nconst { chatEngine, messages, status } = useChat({\n  defaultMessages: defaultMessages.value,\n  chatServiceConfig: chatServiceConfig.value,\n});\n\nconst senderLoading = computed(() => status.value === 'pending' || status.value === 'streaming');\nconst isAvaildParam = computed(() => {\n  const { server, model } = config.value;\n  return isHttp(server) && !!model;\n});\n\nonMounted(() => setup());\n\nconst getActionBar = (isLast: boolean): TdChatActionsName[] => {\n  const actions: TdChatActionsName[] = ['copy', 'good', 'bad'];\n  if (isLast) actions.unshift('replay');\n  return actions;\n};\n\nconst handleMsgActions = {\n  suggestion: ({ content }: { content: SuggestionItem }) => {\n    inputValue.value = content?.prompt || '';\n  },\n};\n\nconst handleCopyAction = (content: string) => {\n  console.debug('Copy content:', content);\n  try {\n    navigator.clipboard.writeText(content);\n    MessagePlugin.success(t('common.copySuccess'));\n  } catch (error) {\n    console.error('Copy failed:', error);\n    MessagePlugin.error(t('common.copyFail'));\n  }\n};\n\nconst handleAction = (name: string, data?: any) => {\n  console.log(name, data);\n  const handles = {\n    bad: () => {\n      actionComment.value = actionComment.value === 'bad' ? '' : 'bad';\n    },\n    copy: () => {},\n    good: () => {\n      actionComment.value = actionComment.value === 'good' ? '' : 'good';\n    },\n    replay: async () => {\n      await delMessageMemory([-1, -2]);\n      chatEngine.value?.regenerateAIMessage();\n    },\n  };\n\n  handles?.[name]?.(data);\n};\n\nconst handleSend = async (params: string) => {\n  if (!sessionId.value) {\n    const sessionStatus = await initSessionMemory();\n    if (!sessionStatus) {\n      MessagePlugin.error(t('aigc.message.createSessionFailed'));\n      return;\n    }\n  }\n\n  await chatEngine.value?.sendUserMessage({ prompt: params });\n  inputValue.value = '';\n};\n\nconst handleStop = () => {\n  chatEngine.value?.abortChat();\n};\n\nconst setup = async () => {\n  emitter.off(emitterChannel.REFRESH_AIGC_CONFIG, reloadConfig);\n  emitter.on(emitterChannel.REFRESH_AIGC_CONFIG, reloadConfig);\n\n  getSetting();\n};\n\nconst getSetting = async () => {\n  try {\n    const resp = await getSettingDetail('aigc');\n\n    const currentModel = config.value.model;\n    if (resp.model !== currentModel) {\n      const systemIdx = messages.value.findIndex((m) => m.role === 'system');\n      if (systemIdx < 0) {\n        chatEngine.value?.sendSystemMessage(t('aigc.chat.modelChange', [resp.model]));\n      } else {\n        const clonedMessages = cloneDeep(messages.value);\n        clonedMessages[systemIdx].content = [\n          {\n            type: 'text',\n            status: 'complete',\n            data: t('aigc.chat.modelChange', [resp.model]),\n          },\n        ];\n        chatEngine.value?.setMessages(clonedMessages, 'replace');\n      }\n    }\n\n    config.value = resp;\n  } catch (error) {\n    console.error('Failed to fetch AI config:', error);\n  }\n};\n\nconst reloadConfig = async ({ data: eventData }) => {\n  const { source } = eventData;\n  if (source === emitterSource.LAYOUT_HEADER_QUICK) return;\n\n  handleStop();\n\n  await getSetting();\n};\n\nconst initSessionMemory = async () => {\n  try {\n    const resp = await createMemorySession();\n    sessionId.value = resp.id;\n    return !!sessionId.value;\n  } catch (error) {\n    console.error('Failed to create session:', error);\n    return false;\n  }\n};\n\nconst clearSessionMemory = async () => {\n  try {\n    if (sessionId.value) {\n      await delMemorySession({ id: [sessionId.value] });\n    }\n    sessionId.value = null;\n  } catch (error) {\n    console.error('Failed to clear chat:', error);\n    sessionId.value = null;\n  }\n};\n\nconst delMessageMemory = async (idx: number[]) => {\n  try {\n    if (sessionId.value) {\n      await delMemoryMessage({ id: sessionId.value, index: idx });\n    }\n  } catch (error) {\n    console.error('Failed to delete message memory:', error);\n  }\n};\n\nconst clearHistory = async () => {\n  await clearSessionMemory();\n  chatEngine.value?.clearMessages();\n};\n</script>\n<style lang=\"less\" scoped>\n.aigc {\n  height: 100%;\n  width: 100%;\n\n  .aigc-main {\n    height: 100%;\n    width: 100%;\n    max-width: 734px;\n    margin: 0 auto;\n    overflow: hidden;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: var(--td-size-4);\n\n    .aigc-content {\n      height: 100%;\n      width: 100%;\n      flex: 1 1 auto;\n      overflow: hidden;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      gap: var(--td-size-4);\n\n      :deep(t-chat-loading),\n      :deep(t-chat-item) {\n        --td-chat-loading-circle-border-top-color: var(--td-brand-color);\n        --td-chat-loading-circle-border: 2px solid var(--td-brand-color-1);\n      }\n\n      :deep(t-chat-item) {\n        &::part(t-chat__text--user) {\n          background-color: var(--td-chat-item-suggestion-background);\n          color: var(--td-chat-item-suggestion-color);\n        }\n\n        &::part(t-chat-loading__circle) {\n          --td-chat-loading-circle-border-top-color: var(--td-brand-color);\n        }\n      }\n\n      :deep(.t-divider) {\n        margin: var(--td-comp-margin-s) 0;\n      }\n\n      :deep(.t-chat-sender) {\n        .t-chat-sender__textarea {\n          background-color: var(--td-bg-color-component);\n          box-shadow: none;\n        }\n      }\n    }\n\n    .aigc-declare {\n      height: fit-content;\n      width: 100%;\n      flex: 0;\n      color: var(--td-text-color-disabled);\n      font-size: var(--td-font-size-link-small);\n      text-align: center;\n    }\n\n    :deep(.t-chat__to-bottom) {\n      bottom: 0;\n      width: var(--td-comp-size-xl);\n      height: var(--td-comp-size-xl);\n      border-radius: var(--td-radius-circle);\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/code-editor/index.ts",
    "content": "import CodeEditor from './src/code-editor';\n\nexport type * from './src/code-editor-types';\nexport * from './src/composables/use-code-editor-hooks';\nexport default CodeEditor;\n"
  },
  {
    "path": "src/renderer/src/components/code-editor/src/code-editor-types.ts",
    "content": "import type * as monaco from 'monaco-editor/esm/vs/editor/editor.api.d.ts';\nimport type { ExtractPropTypes, PropType, Ref } from 'vue';\n\nexport type IEditor = typeof import('monaco-editor');\n\nexport type IMode = 'normal' | 'diff' | 'review';\nexport type ITheme = 'light' | 'dark';\nexport type ILang = 'python' | 'json' | 'yaml' | 'javascript' | 'typescript' | 'plaintext';\n\nexport interface IEditorOptions {\n  diff: monaco.editor.IStandaloneDiffEditorConstructionOptions;\n  normal: monaco.editor.IStandaloneEditorConstructionOptions;\n}\n\nexport interface IDecoration {\n  lineNumber: number;\n  icon?: string;\n  customClasses?: string;\n  glyphClassName?: string;\n}\nexport interface IComment {\n  lineNumber: number;\n  isExpanded: boolean;\n  domNode?: HTMLElement;\n  heightInPx?: number;\n  allowEditorOverflow?: boolean;\n  offsetLeft?: number;\n}\n\nexport interface IUseCodeEditor {\n  editorEl: Ref;\n}\n\nexport interface IPositionInfo {\n  top?: number;\n  height?: number;\n}\n\nexport interface ILayoutInfo extends IPositionInfo {\n  minimapWidth?: number;\n  offsetLeft?: number;\n}\n\nexport const codeEditorProps = {\n  modelValue: {\n    type: String,\n    default: '',\n  },\n  originalValue: {\n    type: String,\n    default: '',\n  },\n  mode: {\n    type: String as PropType<IMode>,\n    default: 'normal',\n  },\n  theme: {\n    type: String as PropType<ITheme>,\n    default: 'light',\n  },\n  autoHeight: {\n    type: Boolean,\n    default: false,\n  },\n  refreshAll: {\n    type: Boolean,\n    default: false,\n  },\n  offsetLeft: {\n    type: Number,\n  },\n  addCommentIcon: {\n    type: String,\n    default: '',\n  },\n  expandCommentIcon: {\n    type: String,\n    default: '',\n  },\n  options: {\n    type: Object,\n    default: () => ({}),\n  },\n  mouseTargetTypes: {\n    type: Array as PropType<number[]>,\n    default: () => [2, 4],\n  },\n  editorDecorations: {\n    type: Array as PropType<IDecoration[]>,\n    default: () => [],\n  },\n  comments: {\n    type: Array as PropType<IComment[]>,\n    default: () => [],\n  },\n};\n\nexport type CodeEditorProps = ExtractPropTypes<typeof codeEditorProps>;\n"
  },
  {
    "path": "src/renderer/src/components/code-editor/src/code-editor.less",
    "content": ".code-editor {\n  display: block;\n  position: relative;\n  width: 100%;\n  height: 100%;\n\n  div.icon-pointer {\n    cursor: pointer;\n  }\n\n  .monaco-editor,\n  .monaco-diff-editor,\n  .monaco-component {\n    height: 100% !important;\n    width: 100% !important;\n\n    .find-widget {\n      & > .button.codicon-widget-close {\n        top: 8px;\n        right: 8px;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/renderer/src/components/code-editor/src/code-editor.tsx",
    "content": "import './code-editor.less';\n\nimport type { SetupContext } from 'vue';\nimport { defineComponent } from 'vue';\n\nimport type { CodeEditorProps } from './code-editor-types';\nimport { codeEditorProps } from './code-editor-types';\nimport { useCodeEditor } from './composables/use-code-editor';\n\nexport default defineComponent({\n  name: 'CodeEditor',\n  props: codeEditorProps,\n  emits: ['update:modelValue', 'update:originalValue', 'afterEditorInit', 'click', 'monacoObject'],\n  setup(props: CodeEditorProps, ctx: SetupContext) {\n    const { editorEl } = useCodeEditor(props, ctx);\n    return () => <div ref={editorEl} class=\"code-editor\"></div>;\n  },\n});\n"
  },
  {
    "path": "src/renderer/src/components/code-editor/src/composables/use-code-editor-hooks.ts",
    "content": "import { isJsonStr } from '@shared/modules/validate';\nimport JSON5 from 'json5';\nimport type { IDisposable } from 'monaco-editor';\nimport { version } from 'monaco-editor/package.json';\nimport semver from 'semver';\n\nimport type { IEditor, ILang } from '../code-editor-types';\n\nconst providerCache = new WeakMap<IEditor, Map<string, IDisposable>>();\nconst extraLibCache = new WeakMap<IEditor, Map<ILang, IDisposable>>();\n\nconst isNewMonaco = semver.gt(version, '0.52.2');\n\nconst resetCache = <T>(cache: Map<T, IDisposable>, key: T) => {\n  cache.get(key)?.dispose();\n  cache.delete(key);\n};\n\nconst getCache = <K, V>(weakMap: WeakMap<IEditor, Map<K, V>>, ins: IEditor): Map<K, V> => {\n  let cache = weakMap.get(ins);\n  if (!cache) {\n    cache = new Map<K, V>();\n    weakMap.set(ins, cache);\n  }\n  return cache;\n};\n\nexport const applymSuggestions = (monaco: IEditor, language: ILang, suggestions: any): void => {\n  if (!suggestions) return;\n  if (!['python', 'json', 'javascript', 'typescript'].includes(language)) return;\n\n  const cache = getCache(providerCache, monaco);\n  resetCache(cache, language);\n\n  const disposable = monaco.languages.registerCompletionItemProvider(language, {\n    provideCompletionItems(model, position) {\n      const word = model.getWordUntilPosition(position);\n\n      const range = new monaco.Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn);\n\n      const list = suggestions(range, monaco) ?? [];\n\n      return {\n        suggestions: list.map((item: any) => ({\n          label: item.label,\n          detail: item.detail,\n          kind: item.kind ?? monaco.languages.CompletionItemKind.Function,\n          insertText: item.insertText,\n          insertTextRules: item.insertTextRules ?? monaco.languages.CompletionItemInsertTextRule.None,\n          documentation: item.documentation,\n          range,\n        })),\n      };\n    },\n  });\n\n  cache.set(language, disposable);\n};\n\nexport const applyExtraLib = (monaco: IEditor, language: ILang, extraLib: string) => {\n  if (!extraLib) return;\n  if (!['json', 'javascript', 'typescript'].includes(language)) return;\n\n  const cache = getCache(extraLibCache, monaco);\n  resetCache(cache, language);\n\n  let disposable: IDisposable = { dispose: () => {} };\n\n  if (language === 'javascript') {\n    const filePath = `ts:extra/${language}/globals.d.ts`;\n\n    if (isNewMonaco) {\n      // @ts-expect-error new api\n      monaco.typescript.javascriptDefaults.setDiagnosticsOptions({ noSemanticValidation: true }); // disable errors\n      // @ts-expect-error new api\n      monaco.typescript.javascriptDefaults.setExtraLibs([{ content: extraLib, filePath }]);\n    } else {\n      // // @ts-expect-error deprecated api\n      disposable = monaco.languages.typescript.javascriptDefaults.addExtraLib(extraLib, filePath);\n    }\n  }\n\n  if (language === 'typescript') {\n    const filePath = `ts:extra/${language}/globals.d.ts`;\n    if (isNewMonaco) {\n      // @ts-expect-error new api\n      monaco.typescript.typescriptDefaults.setDiagnosticsOptions({ noSemanticValidation: true }); // disable errors\n      // @ts-expect-error new api\n      monaco.typescript.typescriptDefaults.setExtraLibs([{ content: extraLib, filePath }]);\n    } else {\n      // // @ts-expect-error deprecated api\n      disposable = monaco.languages.typescript.typescriptDefaults.addExtraLib(extraLib, filePath);\n    }\n  }\n\n  if (language === 'json') {\n    const schema = isJsonStr(extraLib) ? JSON5.parse(extraLib) : {};\n    const filePath = `json:extra/${language}/schema.json`;\n\n    if (isNewMonaco) {\n      // @ts-expect-error new api\n      monaco.json.jsonDefaults.setDiagnosticsOptions({\n        validate: true,\n        allowComments: false,\n        enableSchemaRequest: true,\n        schemas: [{ uri: filePath, fileMatch: ['*'], schema }],\n      });\n    } else {\n      // // @ts-expect-error deprecated api\n      monaco.languages.json.jsonDefaults.setDiagnosticsOptions({\n        validate: true,\n        allowComments: false,\n        enableSchemaRequest: true,\n        schemas: [{ uri: filePath, fileMatch: ['*'], schema }],\n      });\n    }\n  }\n\n  cache.set(language, disposable);\n};\n"
  },
  {
    "path": "src/renderer/src/components/code-editor/src/composables/use-code-editor.ts",
    "content": "import '../themes';\n\nimport { throttle } from 'es-toolkit';\nimport * as monacoModule from 'monaco-editor';\nimport EditorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';\nimport CssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker';\nimport HtmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker';\nimport JsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';\nimport TypeScriptWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker';\nimport YamlWorker from 'monaco-yaml/yaml.worker?worker';\nimport type { SetupContext } from 'vue';\nimport { nextTick, onBeforeMount, onMounted, ref, toRefs, watch } from 'vue';\n\nimport type { CodeEditorProps, IComment, IDecoration, IEditor, ILayoutInfo, IPositionInfo } from '../code-editor-types';\n\nexport function useCodeEditor(props: CodeEditorProps, ctx: SetupContext) {\n  const editorEl = ref();\n  const {\n    modelValue,\n    originalValue,\n    options,\n    mode,\n    autoHeight,\n    offsetLeft,\n    refreshAll,\n    mouseTargetTypes,\n    editorDecorations,\n    comments,\n    addCommentIcon,\n    expandCommentIcon,\n  } = toRefs(props);\n\n  const monaco: IEditor = monacoModule;\n  let editor: monacoModule.editor.IStandaloneCodeEditor;\n  let diffEditor: monacoModule.editor.IStandaloneDiffEditor;\n  let commentViewZones: Array<{ lineNumber: number; id: string }> = [];\n  let heightMap: Map<number, number> = new Map();\n  let commentWidgets: Array<{ lineNumber: number; widget: any }> = [];\n  let currentDecorations: string[] = [];\n  let currentLineDecoration: string[] = [];\n  let modifyValueFromInner: boolean = false;\n\n  watch(editorDecorations, refreshDecorations, { deep: true });\n  watch(\n    comments,\n    () => {\n      refreshViewZones();\n      refreshOverlayWidgets();\n    },\n    { deep: true },\n  );\n  watch(\n    options,\n    () => {\n      updateLanguage();\n      updateTheme();\n      updateOptions();\n    },\n    { deep: true },\n  );\n  watch([modelValue, originalValue], () => {\n    if (!modifyValueFromInner) {\n      setValue();\n    } else {\n      modifyValueFromInner = false;\n    }\n  });\n\n  onBeforeMount(() => {});\n\n  onMounted(async () => {\n    if (typeof window !== 'undefined') {\n      window.MonacoEnvironment = {\n        getWorker(_: any, label: string) {\n          if (label === 'json') {\n            return new JsonWorker();\n          }\n          if (['css', 'scss', 'less'].includes(label)) {\n            return new CssWorker();\n          }\n          if (['html', 'handlebars', 'razor'].includes(label)) {\n            return new HtmlWorker();\n          }\n          if (['typescript', 'javascript'].includes(label)) {\n            return new TypeScriptWorker();\n          }\n          if (label === 'yaml') {\n            return new YamlWorker();\n          }\n          return new EditorWorker();\n        },\n      };\n      init();\n      if (mode.value === 'review') {\n        nextTick(() => {\n          refreshDecorations();\n          refreshViewZones();\n          refreshOverlayWidgets();\n        });\n      }\n    }\n  });\n\n  function init(): void {\n    if (mode.value === 'normal' || mode.value === 'review') {\n      initNormalEditor();\n    } else if (mode.value.includes('diff')) {\n      initDiffEditor();\n    }\n\n    updateTheme();\n\n    handleAutoHeight();\n    setValueEmitter();\n  }\n\n  function initNormalEditor(): void {\n    if (!editor) {\n      editor = monaco.editor.create(editorEl.value, options.value);\n      editor.setModel(monaco.editor.createModel(modelValue.value, options.value.language));\n\n      ctx.emit('afterEditorInit', editor);\n      ctx.emit('monacoObject', monaco);\n\n      if (mode.value === 'review') {\n        editor.onMouseMove(handleMouseMove);\n        editor.onMouseLeave(handleMouseLeave);\n        editor.onMouseDown(handleMouseDown);\n      }\n    }\n  }\n\n  function initDiffEditor(): void {\n    if (!diffEditor) {\n      diffEditor = monaco.editor.createDiffEditor(editorEl.value, options.value);\n      diffEditor.setModel({\n        original: monaco.editor.createModel(originalValue.value, options.value.language),\n        modified: monaco.editor.createModel(modelValue.value, options.value.language),\n      });\n\n      ctx.emit('afterEditorInit', diffEditor);\n      ctx.emit('monacoObject', monaco);\n    }\n  }\n\n  function setValue() {\n    if (mode.value === 'normal' || mode.value === 'review') {\n      setEditorValue();\n    } else if (mode.value === 'diff') {\n      setDiffEditorValue();\n    }\n  }\n\n  function setEditorValue() {\n    if (!editor || !editor.getModel()) {\n      return;\n    }\n    editor.getModel()!.setValue(modelValue.value);\n  }\n\n  function setDiffEditorValue() {\n    if (!diffEditor || !diffEditor.getModel()) {\n      return;\n    }\n    diffEditor.getModel()!.modified?.setValue(modelValue.value);\n    diffEditor.getModel()!.original?.setValue(originalValue.value);\n  }\n\n  function handleAutoHeight(): void {\n    if (autoHeight.value) {\n      editor.onDidChangeModelDecorations(() => {\n        setTimeout(updateEditorHeightAuto);\n      });\n    }\n  }\n\n  function setValueEmitter(): void {\n    const bindContentChange = (model: monacoModule.editor.ITextModel | null, side: 'original' | 'modified') => {\n      model?.onDidChangeContent(\n        throttle(() => {\n          const editorValue = model.getValue();\n\n          if (modelValue.value !== editorValue && side === 'modified') {\n            modifyValueFromInner = true;\n            ctx.emit('update:modelValue', editorValue);\n          }\n\n          if (originalValue.value !== editorValue && side === 'original') {\n            modifyValueFromInner = true;\n            ctx.emit('update:originalValue', editorValue);\n          }\n        }, 100),\n      );\n    };\n\n    if (editor) {\n      bindContentChange(editor.getModel(), 'modified');\n    } else if (diffEditor) {\n      bindContentChange(diffEditor.getModel()!.modified, 'modified');\n      bindContentChange(diffEditor.getModel()!.original, 'original');\n    }\n  }\n\n  function updateLanguage() {\n    const language = options.value.language;\n    if (editor) {\n      if (mode.value === 'normal' || mode.value === 'review') {\n        const model = editor.getModel()!;\n        monaco.editor.setModelLanguage(model, language);\n      } else if (mode.value === 'diff') {\n        const model = diffEditor.getModel()!;\n        monaco.editor.setModelLanguage(model.modified, language);\n        monaco.editor.setModelLanguage(model.original, language);\n      }\n    }\n  }\n\n  function updateTheme() {\n    const theme = options.value.theme || 'vs';\n    monaco.editor.setTheme(theme);\n  }\n\n  function updateOptions() {\n    if (editor) {\n      editor.updateOptions({ ...options.value });\n    }\n    if (diffEditor) {\n      diffEditor.updateOptions({ ...options.value });\n    }\n  }\n\n  function updateEditorHeightAuto(): void {\n    const lineHeight = editor.getOption(monaco.editor.EditorOption.lineHeight);\n    const lineCount = editor.getModel()?.getLineCount() || 1;\n    const height = editor.getTopForLineNumber(lineCount + 1) + lineHeight;\n\n    if (editorEl.value) {\n      editorEl.value.style.height = `${height}px`;\n    }\n    editor.layout();\n  }\n\n  function handleMouseMove(event: any): void {\n    if (event.target && event.target.position) {\n      const currentLineNumber = event.target.position.lineNumber;\n      if (!isDecorationExisted(currentLineNumber)) {\n        const lineDecoration: any[] = [\n          {\n            range: new monaco.Range(currentLineNumber, 0, currentLineNumber, 0),\n            options: {\n              isWholeLine: true,\n              glyphMarginClassName: `icon-pointer ${addCommentIcon.value}`,\n            },\n          },\n        ];\n        currentLineDecoration = editor.deltaDecorations(currentLineDecoration, lineDecoration);\n      } else {\n        currentLineDecoration = editor.deltaDecorations(currentLineDecoration, []);\n      }\n    }\n  }\n\n  function handleMouseLeave(): void {\n    editor.deltaDecorations(currentLineDecoration, []);\n  }\n\n  function handleMouseDown(event: any) {\n    if (mouseTargetTypes.value.includes(event.target.type)) {\n      ctx.emit('click', event);\n    }\n  }\n\n  function refreshDecorations() {\n    if (editorDecorations.value.length >= 0 && editor) {\n      const tempDecorations = editorDecorations.value.map(setDecorations);\n      setTimeout(() => {\n        currentDecorations = editor.deltaDecorations(currentDecorations, tempDecorations);\n      });\n      currentLineDecoration = editor.deltaDecorations(currentLineDecoration, []);\n    }\n  }\n\n  function setDecorations(decoration: IDecoration): any {\n    return {\n      range: new monaco.Range(decoration.lineNumber, 1, decoration.lineNumber, 1),\n      options: {\n        isWholeLine: true,\n        className: decoration.customClasses || '',\n        glyphMarginClassName: `icon-pointer ${decoration.icon || expandCommentIcon.value} ${decoration.glyphClassName || ''}`,\n      },\n    };\n  }\n\n  function isDecorationExisted(lineNumber: number): boolean {\n    return editorDecorations.value.some((ed) => ed.lineNumber === lineNumber);\n  }\n\n  function refreshViewZones(): void {\n    if (editor) {\n      editor.changeViewZones((changeAccessor: any) => {\n        resetViewZones(changeAccessor);\n        renderViewZones(changeAccessor);\n        if (autoHeight.value) {\n          updateEditorHeightAuto();\n        }\n      });\n    }\n  }\n\n  function resetViewZones(changeAccessor: any): void {\n    if (commentViewZones.length > 0) {\n      commentViewZones.forEach((commentId) => {\n        changeAccessor.removeZone(commentId.id);\n      });\n      commentViewZones = [];\n      heightMap = new Map();\n    }\n  }\n\n  function renderViewZones(changeAccessor: any): void {\n    if (comments.value && comments.value.length) {\n      const renderedComments = comments.value.filter((comment) => comment.isExpanded);\n      renderedComments.forEach((comment) => {\n        const commentId = changeAccessor.addZone({\n          afterLineNumber: comment.lineNumber,\n          heightInPx: comment.heightInPx ? comment.heightInPx : 0,\n          afterColumn: 1,\n          domNode: document.createElement('div'),\n          onDomNodeTop: (top: number) => {\n            layoutOverlayWidget(comment.lineNumber, { top });\n          },\n          onComputedHeight: (height: number) => {\n            layoutOverlayWidget(comment.lineNumber, { height });\n          },\n        });\n        commentViewZones.push({ lineNumber: comment.lineNumber, id: commentId });\n      });\n    }\n  }\n\n  function layoutOverlayWidget(lineNumber: number, ...positionInfos: IPositionInfo[]): void {\n    const index = comments.value.findIndex((comment) => comment.lineNumber === lineNumber);\n    const editorLayoutInfo = editor.getLayoutInfo();\n    const layoutInfo: ILayoutInfo = calculateLayoutInfo(positionInfos, editorLayoutInfo, index);\n    if (layoutInfo.height) {\n      heightMap.set(index, layoutInfo.height);\n    }\n\n    comments.value[index].domNode!.style.width =\n      `${editorLayoutInfo.width - layoutInfo.minimapWidth! - layoutInfo.offsetLeft!}px`;\n    handleDomNodePosition(layoutInfo.top!, layoutInfo.height!, index);\n  }\n\n  function calculateLayoutInfo(positionInfos: IPositionInfo[], editorLayoutInfo: any, index: number): ILayoutInfo {\n    let _offsetLeft = 0;\n    const indexOffsetLeft = comments.value[index].offsetLeft;\n    if (indexOffsetLeft) {\n      _offsetLeft = indexOffsetLeft;\n    } else {\n      _offsetLeft = offsetLeft?.value ? offsetLeft?.value : 0;\n    }\n    return {\n      top: positionInfos[0].top,\n      height: positionInfos[0].height,\n      minimapWidth: editorLayoutInfo.minimap.minimapWidth,\n      offsetLeft: _offsetLeft,\n    };\n  }\n\n  function handleDomNodePosition(top: number, height: number, index: number): void {\n    comments.value[index].domNode!.style.height = `${height}px`;\n    if (heightMap.get(index) === 0) {\n      comments.value[index].domNode!.style.top = `-${10000 + top}px`;\n    } else {\n      comments.value[index].domNode!.style.top = `${top}px`;\n    }\n  }\n\n  function refreshOverlayWidgets(): void {\n    if (editor) {\n      renderOverlayWidget();\n    }\n  }\n\n  function renderOverlayWidget(): void {\n    // 切换新文件时要移除editor上原有的所有评论\n    if (refreshAll.value) {\n      resetAllOverlayWidget();\n    } else {\n      resetOverlayWidget();\n    }\n    const renderedWidget = comments.value.filter((comment) => comment.isExpanded);\n    renderedWidget?.forEach((comment) => {\n      const commentIndex = commentWidgets.findIndex((cw) => cw.lineNumber === comment.lineNumber);\n      if (commentIndex === -1) {\n        const overlayWidget = buildOverlayWidget(comment);\n        commentWidgets.push({ lineNumber: comment.lineNumber, widget: overlayWidget });\n        editor.addOverlayWidget(overlayWidget);\n      }\n    });\n  }\n\n  function resetOverlayWidget(): void {\n    comments.value.forEach((comment) => {\n      if (!comment.isExpanded) {\n        const commentIndex = commentWidgets.findIndex((cw) => cw.lineNumber === comment.lineNumber);\n        if (commentIndex !== -1) {\n          const commentRemoved = commentWidgets.splice(commentIndex, 1)[0];\n          editor.removeOverlayWidget(commentRemoved.widget);\n        }\n      }\n    });\n  }\n\n  function resetAllOverlayWidget(): void {\n    if (commentWidgets.length > 0) {\n      commentWidgets.forEach((widget) => {\n        editor.removeOverlayWidget(widget.widget);\n      });\n      commentWidgets = [];\n    }\n  }\n\n  function buildOverlayWidget(comment: IComment): any {\n    return {\n      getId: () => {\n        return `widget-lineNumber${comment.lineNumber}`;\n      },\n      getDomNode: () => {\n        return comment.domNode;\n      },\n      getPosition: () => {\n        return null;\n      },\n    };\n  }\n\n  return { editorEl };\n}\n"
  },
  {
    "path": "src/renderer/src/components/code-editor/src/themes/code-dark.ts",
    "content": "import * as monaco from 'monaco-editor';\n\nmonaco.editor.defineTheme('code-dark', {\n  base: 'vs-dark',\n  inherit: true,\n  rules: [],\n  colors: {\n    focusBorder: '#00000000',\n    'editor.background': '#393939',\n    'editor.lineHighlightBorder': '#4b4b4b9f',\n  },\n});\n"
  },
  {
    "path": "src/renderer/src/components/code-editor/src/themes/code-light.ts",
    "content": "import * as monaco from 'monaco-editor';\n\nmonaco.editor.defineTheme('code-light', {\n  base: 'vs',\n  inherit: true,\n  rules: [],\n  colors: {\n    focusBorder: '#00000000',\n    'editor.background': '#e8e8e8',\n    'editor.lineHighlightBorder': '#a6a6a64f',\n  },\n});\n"
  },
  {
    "path": "src/renderer/src/components/code-editor/src/themes/index.ts",
    "content": "import './code-dark';\nimport './code-light';\n"
  },
  {
    "path": "src/renderer/src/components/common-nav/index.vue",
    "content": "<template>\n  <div class=\"common-nav\">\n    <div class=\"nav-sub\" :class=\"{ 'nav-sub-hidden': !active.show }\">\n      <div v-if=\"props.search\" class=\"nav-sub-header\">\n        <t-input v-model=\"searchValue\" clearable class=\"nav-sub-input\" @change=\"handleListFilter\">\n          <template #prefix-icon><search-icon /></template>\n        </t-input>\n      </div>\n\n      <div class=\"nav-sub-content\">\n        <t-list ref=\"listRef\" class=\"list-wrap\" :scroll=\"{ rowHeight: 34, threshold: 15, type: 'virtual' }\">\n          <t-list-item\n            v-for=\"(item, index) in listData\"\n            :key=\"index\"\n            class=\"item-wrap\"\n            :class=\"[activeData === item.id ? 'is-active' : '']\"\n            @click=\"handleItemClick(item.id)\"\n          >\n            <div class=\"list-item\">\n              <template v-if=\"measureText(item.name) < width\">\n                <div class=\"title txthide txthide1\">{{ item.name }}</div>\n              </template>\n\n              <template v-else>\n                <t-tooltip attach=\".common-nav\" :z-index=\"3\" destroy-on-close :content=\"item.name\">\n                  <div class=\"title-wrap txthide txthide1\">{{ item.name }}</div>\n                </t-tooltip>\n              </template>\n            </div>\n          </t-list-item>\n        </t-list>\n      </div>\n\n      <div v-if=\"$slots.bottom\" class=\"nav-sub-footer\">\n        <slot name=\"bottom\"></slot>\n      </div>\n    </div>\n\n    <div v-show=\"active.show\" class=\"dragbar\"></div>\n\n    <div class=\"pin-wrapper\" @click=\"active.show = !active.show\">\n      <div class=\"pin-icon-wrapper\" :class=\"[active.show ? 'pin-icon-wrapper-show' : 'pin-icon-wrapper-hide']\">\n        <caret-left-small-icon v-if=\"active.show\" class=\"icon\" />\n        <caret-right-small-icon v-else class=\"icon\" />\n      </div>\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'CommonNav',\n});\n\nconst props = defineProps({\n  title: {\n    type: String,\n    default: '',\n  },\n  search: {\n    type: Boolean,\n    default: false,\n  },\n  active: {\n    type: String,\n    default: '',\n  },\n  list: {\n    type: Array<{ id: string; name: string }>,\n    default: () => [],\n  },\n});\n\nconst emit = defineEmits(['change']);\n\nimport { isNil, isStrEmpty, isString } from '@shared/modules/validate';\nimport Fuse from 'fuse.js';\nimport { CaretLeftSmallIcon, CaretRightSmallIcon, SearchIcon } from 'tdesign-icons-vue-next';\nimport type { ListInstanceFunctions } from 'tdesign-vue-next';\nimport { onActivated, onDeactivated, onMounted, ref, useTemplateRef, watch } from 'vue';\n\nconst listRef = useTemplateRef<ListInstanceFunctions>('listRef');\n\nconst activeData = ref<string>(props.active);\nconst listData = ref<Array<{ id: string; name: string }>>(props.list);\n\nconst searchValue = ref<string>('');\nconst active = ref({\n  search: false,\n  show: true,\n  index: -1,\n});\nconst width = ref<number>(114);\nconst fuse = ref<Fuse<{ id: string; name: string }> | null>(null);\n\nwatch(\n  () => props.active,\n  (val) => {\n    activeData.value = val;\n    handleScroll();\n  },\n);\n\nwatch(\n  () => props.list,\n  (val) => {\n    listData.value = val;\n    fuseCollection();\n    handleScroll();\n  },\n  { deep: true },\n);\n\nonMounted(() => setup());\nonActivated(() => activeSetup());\nonDeactivated(() => deactivateDispose());\n\nconst setup = () => {\n  fuseCollection();\n  handleScroll();\n};\n\nconst activeSetup = () => {\n  handleListFilter();\n  handleScroll();\n};\n\nconst deactivateDispose = () => {\n  active.value.index = -1;\n};\n\nconst fuseCollection = () => {\n  const list = listData.value || [];\n\n  if (isNil(fuse.value)) {\n    fuse.value = new Fuse(list, { keys: ['name'], useExtendedSearch: true });\n  } else {\n    fuse.value.setCollection(list);\n  }\n};\n\nconst measureText = (text: string): number => {\n  const canvas = document.createElement('canvas');\n  const ctx = canvas.getContext('2d');\n  return ctx!.measureText(text).width;\n};\n\nconst handleItemClick = (key: string | number) => {\n  emit('change', key);\n};\n\nconst handleListFilter = () => {\n  const kw = searchValue.value;\n  const isSearchKw = isString(kw) && !isStrEmpty(kw);\n\n  listData.value =\n    isSearchKw && !isNil(fuse.value) ? fuse.value!.search(String(kw)).map((item) => item.item) : props.list;\n\n  if (!isSearchKw) active.value.index = -1;\n  handleScroll();\n};\n\nconst handleScroll = () => {\n  if (!listRef.value) return;\n\n  const id = activeData.value;\n  if (!id) return;\n\n  const list = listData.value;\n  if (list.length === 0) return;\n\n  const index = list.findIndex((item) => item.id === id) - 1;\n  if (index < 0) return;\n  if (active.value.index === index) return;\n  active.value.index = index;\n\n  listRef.value?.scrollTo?.({\n    index,\n    behavior: 'smooth',\n  });\n};\n</script>\n<style lang=\"less\" scoped>\n.common-nav {\n  height: 100%;\n  width: fit-content;\n  position: relative;\n\n  .nav-sub {\n    height: 100%;\n    width: 162px;\n    padding-left: var(--td-comp-paddingLR-s);\n    will-change: width;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n    overflow: hidden;\n    transition: all 0.25s ease-in-out;\n\n    &-hidden {\n      width: 0;\n      padding: var(--td-comp-paddingTB-s) 0;\n    }\n\n    .nav-sub-header {\n      width: 100%;\n      height: fit-content;\n      flex: 0 0 auto;\n      padding-right: var(--td-comp-paddingLR-s);\n    }\n\n    .nav-sub-content {\n      width: 100%;\n      height: 100%;\n      flex: 1;\n      overflow: hidden;\n\n      .list-wrap {\n        height: 100%;\n        overflow-y: scroll;\n\n        :deep(.item-wrap) {\n          width: 100%;\n          height: calc(var(--td-comp-size-m) + 2px);\n          padding: 0;\n          cursor: pointer;\n\n          &::after {\n            content: none;\n          }\n\n          &:last-of-type {\n            margin-bottom: 0;\n          }\n\n          .list-item {\n            display: flex;\n            align-items: center;\n            width: 100%;\n            height: var(--td-comp-size-m);\n            flex: 1;\n            padding: 0 var(--td-comp-paddingTB-s);\n            border-radius: var(--td-radius-medium);\n\n            .title {\n              width: 100%;\n              flex: 1;\n            }\n          }\n\n          &:hover {\n            .list-item {\n              background-color: var(--td-bg-color-component-hover);\n            }\n          }\n        }\n\n        .is-active {\n          .list-item {\n            background-color: var(--td-bg-color-component-hover);\n          }\n        }\n      }\n    }\n\n    .nav-sub-footer {\n      width: 100%;\n      height: fit-content;\n      flex: 0 0 auto;\n    }\n  }\n\n  .dragbar {\n    position: absolute;\n    z-index: 1;\n    top: 0;\n    bottom: 0;\n    right: -6px;\n    width: 6px;\n    user-select: none;\n\n    &::after,\n    &::before {\n      content: '';\n      position: absolute;\n      top: 0;\n      bottom: 0;\n      background: linear-gradient(\n        180deg,\n        transparent,\n        color-mix(in srgb, var(--td-text-color-primary) 10%, transparent) 50%,\n        transparent\n      );\n    }\n\n    &::before {\n      right: 0;\n      transition: all 0.2s ease-in-out;\n    }\n\n    &::after {\n      transition: background-color 0.2s ease-in-out;\n      right: 6px;\n      width: 1px;\n    }\n  }\n\n  .pin-wrapper {\n    position: absolute;\n    z-index: 8;\n    right: 0;\n    top: 0;\n    width: 1px;\n    height: 100%;\n\n    .pin-icon-wrapper {\n      position: absolute;\n      top: 220px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      height: 44px;\n      width: 14px;\n      border: 1px solid var(--td-border-level-2-color);\n      box-shadow: var(--td-shadow-2);\n      background-color: var(--td-bg-color-container);\n      cursor: pointer;\n      transform: translateY(-50%);\n      transition: all 0.25s ease-in-out;\n\n      &-show {\n        border-radius: var(--td-radius-large);\n        right: calc(0px - var(--td-size-3));\n      }\n\n      &-hide {\n        border-radius: 0 var(--td-radius-large) var(--td-radius-large) 0;\n        right: calc(0px - var(--td-size-5));\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/dialog-document/index.vue",
    "content": "<template>\n  <t-dialog v-model:visible=\"formVisible\" v-bind=\"attrsCustom\">\n    <template #header>\n      {{ formData.title }}\n    </template>\n\n    <template #body>\n      <div class=\"content-overflow\">\n        <div class=\"content-wrapper\">\n          <render-md :content=\"formData.content\" />\n        </div>\n      </div>\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'DialogDocument',\n});\n\nconst props = defineProps({\n  title: {\n    type: String,\n    default: '',\n  },\n  content: {\n    type: String,\n    default: '',\n  },\n  visible: {\n    type: Boolean,\n    default: false,\n  },\n});\n\nconst emits = defineEmits(['update:visible']);\n\nimport type { Dialog, DialogProps } from 'tdesign-vue-next';\nimport { computed, ref, useAttrs, watch } from 'vue';\n\nimport RenderMd from '@/components/render-markdown/index.vue';\n\nconst attrs = useAttrs() as Partial<DialogProps & { title: string; content: string }>;\n\nconst dialogRef = ref<InstanceType<typeof Dialog>>();\nconst formVisible = ref(props.visible);\nconst formData = ref({\n  title: props.title,\n  content: props.content,\n});\n\nconst attrsCustom = computed<Partial<DialogProps>>(() => {\n  // eslint-disable-next-line ts/no-unused-vars\n  const { title, content, visible, ...rest } = attrs;\n\n  return {\n    ref: dialogRef,\n    showInAttachedElement: true,\n    destroyOnClose: true,\n    placement: 'center',\n    lazy: true,\n    footer: null,\n    ...rest,\n  } as Partial<DialogProps>;\n});\n\nwatch(\n  () => formVisible.value,\n  (val) => emits('update:visible', val),\n);\nwatch(\n  () => props.visible,\n  (val) => (formVisible.value = val),\n);\nwatch(\n  () => props.title,\n  (val) => (formData.value.title = val),\n);\nwatch(\n  () => props.content,\n  (val) => (formData.value.content = val),\n);\n</script>\n<style scoped lang=\"less\">\n.content-overflow {\n  position: relative;\n\n  .content-wrapper {\n    max-height: 340px;\n    overflow: hidden auto;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/group-btn/index.vue",
    "content": "<template>\n  <t-radio-group v-model=\"opMethod.radio\" variant=\"default-filled\" @change=\"handleOpRadioChange\">\n    <template v-for=\"(item, index) in formData\" :key=\"index\">\n      <t-radio-button v-if=\"!isArray(item.value)\" :value=\"item.value\">\n        {{ item.label }}\n      </t-radio-button>\n      <t-select\n        v-else\n        v-model=\"opMethod[toRaw(item.label)]\"\n        auto-width\n        @change=\"handleOpSelectChange(item.label, $event)\"\n      >\n        <t-option\n          v-for=\"(subItem, subIndex) in item.value\"\n          :key=\"subIndex\"\n          :label=\"subItem.label\"\n          :value=\"subItem.value\"\n        />\n      </t-select>\n    </template>\n  </t-radio-group>\n</template>\n<script lang=\"ts\" setup>\ndefineOptions({\n  name: 'GroupBtn',\n});\n\nconst props = defineProps({\n  data: {\n    type: Array as PropType<IOpProps>,\n    default: () => [],\n  },\n});\n\nconst emits = defineEmits(['change']);\n\nimport { isArray } from '@shared/modules/validate';\nimport type { PropType } from 'vue';\nimport { ref, toRaw, watch } from 'vue';\n\ninterface IOpItem {\n  label: string;\n  value: string;\n}\ntype IOpProps = Array<{\n  label: string;\n  value: string | IOpItem[];\n}>;\n\nconst formData = ref<IOpProps>(props.data);\nconst opMethod = ref<Record<string, string>>({\n  radio: '',\n  ...props.data\n    .filter((item) => isArray(item.value))\n    .reduce(\n      (prev, { label }) => {\n        prev[label] = label;\n        return prev;\n      },\n      {} as Record<string, string>,\n    ),\n});\n\nwatch(\n  () => props.data,\n  (val) => {\n    formData.value = val;\n\n    opMethod.value = {\n      radio: '',\n      ...val\n        .filter((item) => isArray(item.value))\n        .reduce(\n          (prev, { label }) => {\n            prev[label] = label;\n            return prev;\n          },\n          {} as Record<string, string>,\n        ),\n    };\n  },\n  { deep: true },\n);\n\nconst handleOpRadioChange = (val: string) => {\n  emits('change', val);\n  opMethod.value = { ...opMethod.value, radio: '' };\n};\n\nconst handleOpSelectChange = (label: string, val: string) => {\n  emits('change', val);\n  // const core = props.data.find((item) => item.value === label) as IOpItem;\n  opMethod.value = { ...opMethod.value, [label]: label, radio: '' };\n};\n</script>\n<style scoped lang=\"less\">\n:deep(.t-select__wrap) {\n  width: fit-content;\n\n  .t-input--auto-width {\n    min-width: 44px;\n  }\n\n  &:hover {\n    .t-input__inner {\n      color: var(--td-text-color-primary);\n    }\n  }\n\n  .t-input__inner {\n    color: var(--td-text-color-secondary);\n    font: var(--td-font-body-medium);\n  }\n\n  .t-input {\n    height: calc(var(--td-comp-size-m) - (var(--td-comp-paddingTB-xxs) * 2));\n    border-width: 0 !important;\n\n    .t-input__suffix:not(:empty) {\n      display: none;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/input-req/index.vue",
    "content": "<template>\n  <div class=\"req-html\">\n    <div class=\"input-group\">\n      <t-input-adornment class=\"input\">\n        <template #prepend>\n          <t-select v-model=\"formData.method\" auto-width>\n            <t-option v-for=\"item in reqMethods\" :key=\"item.value\" :value=\"item.value\" :label=\"item.label\" />\n          </t-select>\n        </template>\n        <template #append>\n          <t-button theme=\"default\" variant=\"text\" size=\"small\" @click=\"isVisible = true\">\n            <transform-icon />\n          </t-button>\n        </template>\n        <t-input v-model=\"formData.url\" />\n      </t-input-adornment>\n\n      <t-button class=\"button w-btn\" theme=\"default\" @click=\"handleExec\">\n        {{ $t('common.execute') }}\n      </t-button>\n    </div>\n\n    <t-dialog v-model:visible=\"isVisible\" show-in-attached-element :attach=\"`.${attachContent}`\" placement=\"center\">\n      <template #header>\n        {{ $t('common.request.param') }}\n      </template>\n      <template #body>\n        <t-form\n          ref=\"formRef\"\n          :data=\"formData\"\n          :rules=\"RULES\"\n          :label-width=\"80\"\n          required-mark-position=\"right\"\n          label-align=\"left\"\n          reset-type=\"initial\"\n        >\n          <t-form-item :label=\"$t('common.encode')\" name=\"encode\">\n            <t-select v-model=\"formData.encode\" :options=\"reqEncode\" />\n          </t-form-item>\n          <t-form-item :label=\"$t('common.request.headers')\" name=\"headers\">\n            <t-textarea\n              v-model=\"formData.headers\"\n              :autosize=\"{ minRows: 2, maxRows: 5 }\"\n              :placeholder=\"$t('common.placeholder.request.headers')\"\n            />\n          </t-form-item>\n          <t-form-item v-if=\"formData.method !== 'GET'\" :label=\"$t('common.request.contentType')\" name=\"contentType\">\n            <t-select v-model=\"formData.contentType\" :options=\"reqContentTypes\" />\n          </t-form-item>\n          <t-form-item v-if=\"formData.method !== 'GET'\" :label=\"$t('common.request.data')\" name=\"data\">\n            <t-textarea\n              v-model=\"formData.data\"\n              :autosize=\"{ minRows: 2, maxRows: 5 }\"\n              :placeholder=\"$t('common.placeholder.request.data')\"\n            />\n          </t-form-item>\n        </t-form>\n      </template>\n      <template #footer>\n        <t-button theme=\"default\" variant=\"base\" @click=\"handleReset\">{{ $t('common.reset') }}</t-button>\n        <t-button theme=\"primary\" variant=\"base\" @click=\"handleSubmit\">{{ $t('common.confirm') }}</t-button>\n      </template>\n    </t-dialog>\n  </div>\n</template>\n<script lang=\"ts\" setup>\ndefineOptions({\n  name: 'InputRequest',\n});\n\nconst props = defineProps({\n  modelValue: {\n    type: Object as PropType<IReqConfig>,\n    default: () => ({\n      method: REQ_METHOD.GET,\n      url: '',\n      encode: REQ_ENCODE.UTF8,\n      headers: '',\n      contentType: REQ_CONTENT_TYPE.JSON,\n      data: '',\n    }),\n  },\n});\n\nconst emits = defineEmits(['update:modelValue', 'response']);\n\nimport { REQ_CONTENT_TYPE, REQ_ENCODE, REQ_METHOD } from '@shared/config/req';\nimport { TransformIcon } from 'tdesign-icons-vue-next';\nimport type { FormInstanceFunctions } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport type { PropType } from 'vue';\nimport { ref, useTemplateRef, watch } from 'vue';\n\nimport { attachContent } from '@/config/global';\nimport { t } from '@/locales';\n\nimport type { IReqConfig } from './utils';\nimport { handleReq } from './utils';\n\nexport type { IReqConfig } from './utils';\nexport type { IReqResponse } from '@shared/config/req';\n\nconst reqMethods = [\n  { label: REQ_METHOD.GET, value: 'GET' },\n  { label: REQ_METHOD.POST, value: 'POST' },\n  { label: REQ_METHOD.DELETE, value: 'DELETE' },\n  { label: REQ_METHOD.PUT, value: 'PUT' },\n  { label: REQ_METHOD.HEAD, value: 'HEAD' },\n];\n\nconst reqEncode = [\n  { label: REQ_ENCODE.UTF8, value: REQ_ENCODE.UTF8 },\n  { label: REQ_ENCODE.GB2312, value: REQ_ENCODE.GB2312 },\n  { label: REQ_ENCODE.GBK, value: REQ_ENCODE.GBK },\n  { label: REQ_ENCODE.GB18030, value: REQ_ENCODE.GB18030 },\n];\n\nconst reqContentTypes = [\n  { label: REQ_CONTENT_TYPE.JSON, value: REQ_CONTENT_TYPE.JSON },\n  { label: REQ_CONTENT_TYPE.FORM_URLENCODED, value: REQ_CONTENT_TYPE.FORM_URLENCODED },\n];\n\nconst RULES = {\n  encode: [{ required: true, type: 'error' }],\n};\n\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\n\nconst isVisible = ref<boolean>(false);\nconst formData = ref<IReqConfig>(props.modelValue);\n\nwatch(\n  () => props.modelValue,\n  (val) => (formData.value = val),\n  { deep: true },\n);\nwatch(\n  () => formData.value,\n  (val) => emits('update:modelValue', val),\n  { deep: true },\n);\n\nconst handleExec = async () => {\n  try {\n    const { url, method, encode, headers, data, contentType } = formData.value;\n    const resp = await handleReq({ url, method, encode, headers, data, contentType });\n    if (resp?.code === 200) {\n      emits('response', resp);\n      MessagePlugin.success(t('common.success'));\n    } else {\n      MessagePlugin.error(t('common.fail'));\n    }\n  } catch (error) {\n    console.error('Fetch Request Error:', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst handleSubmit = () => {\n  isVisible.value = false;\n};\n\nconst handleReset = () => {\n  formRef.value?.reset();\n};\n</script>\n<style lang=\"less\" scoped>\n.req-html {\n  .input-group {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    width: 100%;\n    gap: var(--td-size-4);\n\n    :first-child {\n      flex: 1;\n    }\n\n    :deep(.t-input-adornment__append) {\n      display: flex;\n      flex-direction: column;\n      justify-content: center;\n      align-items: center;\n\n      .t-button {\n        color: var(--td-text-color-secondary);\n        border-radius: 0 var(--td-radius-medium) var(--td-radius-medium) 0;\n\n        &:hover {\n          color: var(--td-text-color-primary);\n          border: 1px solid var(--td-brand-color);\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/input-req/utils.ts",
    "content": "import type { IReqContentType, IReqOptions, IReqResponse } from '@shared/config/req';\nimport { REQ_CONTENT_TYPE, REQ_METHOD } from '@shared/config/req';\nimport { headerKeysPascalCase } from '@shared/modules/headers';\nimport { isHttp, isJsonStr, isObject, isObjectEmpty } from '@shared/modules/validate';\nimport JSON5 from 'json5';\n\nexport type IReqConfig = Omit<IReqOptions, 'timeout' | 'params'> & { contentType: IReqContentType };\n\nimport { systemInitiateReq } from '@/api/system';\n\nexport const parseReqOptions = (\n  options: Partial<IReqConfig>,\n): { headers: Record<string, any>; data?: Record<string, any> | string } => {\n  const {\n    method = REQ_METHOD.GET,\n    headers: headersRaw = '{}',\n    data: dataRaw = '{}',\n    contentType = REQ_CONTENT_TYPE.JSON,\n  } = options;\n  const headers = isObject(headersRaw) ? headersRaw : isJsonStr(headersRaw) ? JSON5.parse(headersRaw) : {};\n  const headerKeys = headerKeysPascalCase(headers);\n  const body: Record<string, any> = isObject(dataRaw) ? dataRaw : isJsonStr(dataRaw) ? JSON5.parse(dataRaw) : {};\n\n  const upperMethod = method.toUpperCase();\n  let data: Record<string, any> | string = {};\n\n  const supportNoBody = upperMethod === REQ_METHOD.GET || upperMethod === REQ_METHOD.HEAD;\n  const hasBody = body && isObject(body) && !isObjectEmpty(body);\n\n  if (!supportNoBody && hasBody) {\n    data = body;\n\n    if (!headerKeys.includes('Content-Type')) {\n      headers['Content-Type'] = contentType;\n    }\n\n    if (headers['Content-Type'].includes(REQ_CONTENT_TYPE.FORM_URLENCODED)) {\n      data = new URLSearchParams(body).toString();\n    }\n  }\n\n  if (!headerKeys.includes('Accept')) {\n    headers.Accept = '*/*';\n  }\n\n  return { headers, ...(isObjectEmpty(data) ? {} : { data }) };\n};\n\nexport const handleReq = async (options: Partial<IReqConfig>): Promise<IReqResponse> => {\n  const { url, method, encode, headers: headersRaw, data: dataRaw, contentType } = options;\n  if (!isHttp(url)) return { code: 400, headers: {}, data: '' };\n\n  const { headers, data } = parseReqOptions({ method, headers: headersRaw, data: dataRaw, contentType });\n  const resp = await systemInitiateReq({ url, method, encode, headers, data });\n  return resp;\n};\n"
  },
  {
    "path": "src/renderer/src/components/input-shortcut/index.vue",
    "content": "<template>\n  <t-input v-bind=\"attrsCustom\" v-model=\"displayValue\">\n    <template v-for=\"slot in slotsCustom\" #[slot.name]=\"slotProps\">\n      <slot :name=\"slot.name\" v-bind=\"slotProps\"></slot>\n    </template>\n  </t-input>\n</template>\n<script lang=\"ts\" setup>\ndefineOptions({\n  name: 'InputShortcut',\n});\n\nconst props = defineProps({\n  modelValue: {\n    type: String,\n    default: '',\n  },\n});\n\nconst emit = defineEmits(['update:modelValue']);\n\nimport type { Input, InputProps } from 'tdesign-vue-next';\nimport { computed, onMounted, ref, useAttrs, useSlots, watch } from 'vue';\n\nimport { isMacOS } from '@/utils/systeminfo';\n\nconst attrs = useAttrs() as InputProps;\nconst slots = useSlots();\n\nconst inputRef = ref<InstanceType<typeof Input>>();\nconst readonly = ref<InputProps['readonly']>(false);\n\nconst formatData = ref({ data: props.modelValue, raw: props.modelValue });\nconst tmpVal = ref<Array<string>>([]);\n\nconst attrsCustom = computed(\n  () =>\n    ({\n      ref: inputRef,\n      clearable: true,\n      readonly: readonly.value,\n      onClear: handleClear,\n      onKeydown: handleKeyDown,\n      onKeyup: handleKeyUp,\n      ...attrs,\n    }) as Partial<InputProps>,\n);\nconst slotsCustom = computed(() => {\n  const slotsExclude: Array<string> = [];\n  return Object.keys(slots)\n    .filter((key) => !slotsExclude.includes(key))\n    .map((name) => ({ name }));\n});\nconst displayValue = computed({\n  get: () => formatShortcut(formatData.value.data),\n  set: (val: string) => (formatData.value.data = val),\n});\n\nwatch(\n  () => props.modelValue,\n  (newVal) => setupValue(newVal),\n);\n\nonMounted(() => {\n  setupValue(props.modelValue);\n});\n\n/**\n * 设置快捷键值\n * @param {string} val - 快捷键字符串\n * @description\n * - 将快捷键字符串分割为数组，去重后检查是否有效\n * - 如果有效，更新格式化数据并触发更新事件\n * - 如果无效，清空格式化数据\n */\nconst setupValue = (val: string): void => {\n  const splitVal = [...new Set((val || '').split(' + '))];\n  if (splitVal.length === 0) return;\n\n  const isValid = isValidShortcut(splitVal);\n  if (isValid) {\n    const res = splitVal.join(' + ');\n    formatData.value = { data: res, raw: res };\n    (inputRef.value as unknown as HTMLInputElement)?.blur();\n    if (res !== val) emit('update:modelValue', res);\n  } else {\n    formatData.value = { data: '', raw: '' };\n  }\n  tmpVal.value = [];\n};\n\n/**\n * 格式化快捷键字符串\n * @param {string} val - 快捷键字符串\n * @returns {string} 格式化后的快捷键字符串\n * @description\n * - 替换箭头键为对应符号\n * - 根据平台替换特殊按键（Mac使用⌘、⌥、⌃、⇧）\n */\nconst formatShortcut = (val: string): string => {\n  if (!val) return '';\n\n  let shortcut = val\n    .replace('ArrowUp', '↑')\n    .replace('ArrowDown', '↓')\n    .replace('ArrowRight', '→')\n    .replace('ArrowLeft', '←');\n\n  if (isMacOS) {\n    shortcut = shortcut\n      .replace(/Meta/g, '⌘')\n      .replace(/Alt/g, '⌥')\n      .replace(/Control/g, '⌃')\n      .replace(/Shift/g, '⇧');\n  }\n\n  return shortcut;\n};\n\n/**\n * 检查快捷键是否有效\n * @param {Array<string>} val - 快捷键数组\n * @returns {boolean} 是否有效\n * @description\n * - 必须包含至少一个特殊按键（Control、Alt、Shift、Meta）\n * - 必须包含至少一个公共按键（字母、数字、功能键、箭头键等）\n */\nconst isValidShortcut = (val: Array<string>): boolean => {\n  const specialKeys = ['Control', 'Alt', 'Shift', 'Meta'];\n  const publicKeys = [\n    ...['`', '-', '=', '[', ']', '\\\\', ';', \"'\", ',', '.', '/', '*'], // punctuation\n    ...'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''), // letter\n    ...'0123456789'.split(''), // number\n    ...Array.from({ length: 12 }, (_, i) => `F${i + 1}`), // f1-f12\n    ...['ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown'], // arrow\n    ...['Space', 'Escape', 'Tab', 'Backspace', 'Enter'], // control\n  ];\n\n  const hasSpecialKey = val.some((key) => specialKeys.includes(key));\n  const hasPublicKey = val.some((key) => publicKeys.includes(key));\n\n  return hasSpecialKey && hasPublicKey;\n};\n\nconst keyCodeToKey = (code: string): string => {\n  const punctuationMap: Record<string, string> = {\n    Backquote: '`',\n    Minus: '-',\n    Equal: '=',\n    BracketLeft: '[',\n    BracketRight: ']',\n    Backslash: '\\\\',\n    Semicolon: ';',\n    Quote: \"'\",\n    Comma: ',',\n    Period: '.',\n    Slash: '/',\n  };\n  const numpadMap: Record<string, string> = {\n    Add: '+',\n    Subtract: '-',\n    Multiply: '*',\n    Divide: '/',\n    Decimal: '.',\n  };\n\n  if (/^(?:Digit|Numpad)\\d+$/i.test(code)) return code.replace(/^(Digit|Numpad)/, '');\n  if (/^Key[A-Z]$/i.test(code)) return code.replace('Key', '');\n  if (['ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown'].includes(code)) return code;\n  if (punctuationMap[code]) return punctuationMap[code];\n  if (/^Numpad(?:Add|Subtract|Multiply|Divide|Decimal)$/.test(code)) return numpadMap[code.replace('Numpad', '')];\n  if (/^F[1-9][0-2]?$/.test(code)) return code;\n  if (/^(?:Shift|Control|Alt|Meta)(?:Left|Right)$/i.test(code)) return code.replace(/(Left|Right)/, '');\n  if (['Space', 'Escape', 'Tab', 'Backspace', 'Enter'].includes(code)) return code;\n\n  return '';\n};\n\n/**\n * 处理清除操作\n * @param {MouseEvent} context - 事件上下文\n * @description\n * - 阻止默认事件和冒泡\n * - 设置只读状态为true\n * - 清空格式化数据和临时值\n * - 触发输入框失焦\n * - 更新modelValue为''\n * - 恢复只读状态为false\n */\nconst handleClear = (context: { e: MouseEvent }) => {\n  const e = context.e;\n  e.preventDefault();\n  e.stopPropagation();\n\n  readonly.value = true;\n\n  formatData.value = { data: '', raw: '' };\n  tmpVal.value = [];\n  (inputRef.value as unknown as HTMLInputElement)?.blur();\n  emit('update:modelValue', '');\n\n  readonly.value = false;\n};\n\n/**\n * 处理按键按下事件\n * @param {any} _value - 未使用的值\n * @param {object} context - 事件上下文\n * @param {KeyboardEvent} context.e - 键盘事件\n * @description\n * - 阻止默认事件\n * - 设置只读状态为true\n * - 获取按键代码并转换为对应的按键名称\n * - 将按键名称添加到临时值数组中，去重后更新格式化数据\n */\nconst handleKeyDown = (_value: any, context: { e: KeyboardEvent }) => {\n  const { e } = context;\n  e.preventDefault();\n\n  readonly.value = true;\n\n  const key = keyCodeToKey(e.code);\n\n  if (key) {\n    tmpVal.value.push(key);\n    const uniqueKeys = [...new Set(tmpVal.value)];\n    formatData.value.data = uniqueKeys.join(' + ');\n  }\n};\n\n/**\n * 处理按键松开事件\n * @param {any} _value - 未使用的值\n * @param {object} context - 事件上下文\n * @param {KeyboardEvent} context.e - 键盘事件\n * @description\n * - 阻止默认事件\n * - 如果临时值数组为空，直接返回\n * - 检查快捷键是否有效，如果有效，格式化数据并触发更新事件\n * - 如果无效，恢复格式化数据为原始值\n * - 清空临时值数组\n * - 恢复只读状态为false\n */\nconst handleKeyUp = (_value: any, context: { e: KeyboardEvent }) => {\n  const { e } = context;\n  e.preventDefault();\n\n  const val = [...new Set(tmpVal.value)];\n  if (val.length === 0) return;\n\n  if (isValidShortcut(val)) {\n    const res = val.join(' + ');\n    formatData.value = { data: res, raw: res };\n    (inputRef.value as unknown as HTMLInputElement)?.blur();\n    emit('update:modelValue', res);\n  } else {\n    formatData.value.data = formatData.value.raw;\n  }\n  tmpVal.value = [];\n\n  readonly.value = false;\n};\n\ndefineExpose({ inputRef, isValidShortcut });\n</script>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "src/renderer/src/components/lazy-bg/index.vue",
    "content": "<template>\n  <logo-icon class=\"lazy-icon\" />\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'LazyBackground',\n});\n\nimport LogoIcon from '@/assets/icon.svg';\n</script>\n<style scoped>\n.lazy-icon {\n  height: 100%;\n  width: 100%;\n  color: var(--td-gray-color-10);\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/CHANGELOG.md",
    "content": "# Changelog\n\n\n## 2026.1.17\n\n- 修复xgplayer无法加载音乐类型\n- 修复xgplayer音乐模式下图标替换\n- 修复创建播放器mode为new时在已有播放器的情况下找不到dom问题\n- 微调图标svg\n\n## 2025.12.30\n\n- 修复oplayer加载弹幕后摧毁报错(官方方案)\n\n## 2025.12.26\n\n- 重构弹幕加载/切换函数\n- 优化创建逻辑, 优先switchUrl后create\n- 修复create可能存在的参数冲突问题\n- 修复artplayer全屏部分样式冲突\n- 修复dplayer请求头丢失\n- 修复oplayer加载弹幕后摧毁报错(临时补丁)\n  ```ts\n  diff --git a/dist/index.es.js b/dist/index.es.js\n  index ce634bbd4551b0d7519eaf297d69b245aa2b2545..81b450fa4631365e7e256a32deabebbcf7d6d345 100644\n  --- a/dist/index.es.js\n  +++ b/dist/index.es.js\n  @@ -1126,7 +1126,7 @@ function renderSetting(it) {\n      panels[0].$ref.classList.add(activeCls);\n      function outClickListener(e) {\n        if (!$dom.contains(e.target)) {\n  -        player.$root.classList.remove(settingShown);\n  +        player.$root?.classList?.remove(settingShown);\n          panels.forEach(($p) => $p.$ref.classList.remove(activeCls));\n          document.removeEventListener(\"click\", outClickListener);\n        }\n  ```\n- 调整ts类型标注\n\n## 2025.7.27\n\n- 删除检查网络状态(getNetworkCircuitType)方法\n- i18n获取取主程序store\n- 网络请求\n- 修复artplayer摧毁webtorrent后无法使用\n- webtorrent链接缺少tr时自动添加公共tracker\n- 修复xgplayer一处解码器条件错误\n- 删除shaka解码器与dash重合(除xg-shaka)\n\n## 2025.7.4\n\n- 修复批导入图标语法告警[query: '?raw' -> as: 'raw']\n\n## 2025.6.25\n\n- 修复 xgplayer 切换画质渲染名称不变问题\n\n## 2025.6.24\n\n- 优化媒体/存储工具库\n- 修复摧毁后重建国际化不生效\n- dplayer|artplayer|nplayer 创建时均清除自带的数据记忆-防止storage冲突\n- 修复xgplayer dplayer摧毁后dom被添加运行时属性\n- github:Hiram-Wong/DPlayer\n  - 支持i18n\n  - 修复摧毁时触发倍速为1\n  - 修复静音操作不会同步ui\n  - 修复弹幕库未初始化触发switchVideo无效\n  - 修复播放按钮dom结构不一致\n\n## 2025.6.23\n\n- 修复多处 seek 方法失效\n- 修复nplayer倍速/音量/静音不记忆\n- 新增 volume rate muted setMuted toggleMuted 方法\n\n## 2025.6.22\n\n- 微调图标svg和样式\n- 修复部分按钮滑动触发的面板无法控制\n\n## 2025.6.21\n\n- 弹幕数据简单过滤并排序避免部分播放器加载失败\n- dplayer弹幕使用 url+blob / apiBackend 实现-之前依赖后端\n\n## 2025.6.20\n\n- 修复@oplayer/torrent和webtorrent未同时安装冲突[vite环境下@oplayer/torrent动态导入库导致]\n- 修复shaka-player解码库提示错误-error TS2306: File '/node_modules/shaka-player/dist/shaka-player.compiled.d.ts' is not a module\n- mpegts库调整 官方 -> github:tsukumijima/mpegts.js\n- dplayer库调整 官方 -> github:tsukumijima/DPlayer -> [自维护-部分特性提交给上游]-github:Hiram-Wong/DPlayer\n\n## 2025.6.19\n\n- 对齐方法名\n- 对齐弹幕参数-字体大小透明度等\n- 拆分部分文件函数\n- 新增头部插槽\n- 修复调用组件方法报方法不存在\n\n## 2025.6.18\n\n- 修复artplayer静音监听事件缺少数据来源\n- 修复oplayer弹幕清空事件\n- 修复xgplayer下集类型匹配错误\n- 修复artplayer新版弹幕库发送事件不兼容\n- 修复artplayer音量不同步-需篡改原有存储\n- 修复nplayer静音不同步-需设置volume替代muted\n- 修复oplayer起始进度跳转失败\n- nplayer i18n支持\n- nplayer|dplayer 下集emitter\n\n## 2025.2.26\n\n- 修复oplayer不支持请求头问题\n- 修复formatUrlHeaders数据类型错误导致播放地址拼接失败\n- 修复formatUrlHeaders方法value拼写错误\n\n## 2025.2.25\n\n- 修复oplayer下一集显示后无法摧毁\n- 修复oplayer弹幕问题\n- 修复oplayer方法create类型switch缺失break\n- 修复xgplayer多语言映射错误导致倍速显示undefined\n- 修复artplayer|oplayer方法playNext入参错误\n- 自定义播放器样式各自导入不再整体导入\n- 微调图标svg和样式\n\n## 2025.2.24\n\n- 集成oplayer(下一集显示bug, 弹幕逻辑天坑)\n\n## 2025.1.25\n\n- 精简集成(移除nplayer|dplayer)\n- artplayer|xgplayer i18n支持\n- artplayer|xgplayer 下集emitter\n\n## 2024.12.24\n\n- 视频质量(dplayer切换会丢失视频原有属性, nplayer 不支持)\n- 提取formatRemoveUnSafeHeaders, formatUrlHeaders方法\n- headers前端剔除不安全请求头, 拦截符遇=改为$*&\n- getMediaType方法加入请求头\n\n## 2024.12.14\n\n- tsx组件化\n- 业务代码解耦合\n- dp播放器销毁监听会触发多次摧毁导致报错\n- 集成媒体类型类工具(检测|映射)\n- 修复webtorrent摧毁失败\n\n## 2024.11.7\n\n- 弹幕字母拼写错误\n\n## 2024.10.28\n\n- 重写所有适配器-改为class适配器\n- 共享记忆数据,并初始化设置\n\n## 2024.7.1\n\n- 扩展dplayer播放器缺失once方法\n- 重写dplayer播放器destroy方法-始终会释放playrate为1的信号\n\n## 2024.6.30\n\n- 优化记忆音量和倍速(遗留art播放器UI显示不对bug-已提issue)-存储localStorage\n- 统一倍速为[0.5, 0.75, 1, 1.25, 1.5, 2]\n\n## 2024.6.29\n\n- 修复在live模式下切换下一个报错-需判断弹幕组件库是否加载\n- 修复flv数据流切换失败, 始终播放一个视频流\n- 统一调用公共逻辑摧毁实例(除西瓜播放器外)\n- 去除nplayer控制条调用画中画(遗留多次创建会创建多个dom问题bug)\n\n## 2024.6.4\n\n- 修复西瓜播放器加载视频错误\n- 修复多次创建播放器扩展插件会重复添加-默认参数使用深拷贝\n\n## 2024.6.3\n\n- 支持mp3|m4a音频-使用MPEG-TS库\n\n## 2024.6.2\n\n- 修复mpd无法播放问题-类型映射\n- 修复xgplayer初始化播放器失败-plugin赋值错误\n- 优化mpd播放-使用shaka库替代dash库[dash库经常卡死|反复请求同一分片]\n- 修复artplayer弹幕库5.1版本-参数对齐\n- 修复nplayer弹幕不滚动-BulletOption中type赋值错误\n- 修复dplayer弹幕控制不生效-弹幕开关控制逻辑误删\n\n## 2024.6.1\n\n- 修复playerNext方法nplayer类型为mp4不生效\n- 统一风格-nplayer音量进度条改为垂直|扩展画中画控制栏显示|live模式去进度条\n- 统一风格-live模式去除相关弹幕组件\n\n## 2024.5.25\n\n- 动态异步加载依赖\n- 按播放器解耦\n\n## 2024.5.16\n\n- 扩展dplayer画中画功能、控制栏弹幕开关\n- 调整dplayer参数unlimited为false-解决阻塞主进程问题\n- 修复触发playerNext方法在触发playerBarrage方法切换失败-没有赋值dp.options.video.src导致地址一直不变\n\n## 2024.5.15\n\n- 修复取消监听事件导致组件内监听事件失效-提取为公共方法[时间变动|弹幕发送]\n- 修复自定义dplayer的off传入func匹配错误\n\n## 2024.5.14\n\n- 优化公共流逻辑-先检测环境是否支持\n- 修复seek方法xgplayer进度跳转失败\n- 修复playerNext方法nplayer会退出全屏\n\n## 2024.5.13\n\n- 除xgplayer外增加弹幕发送逻辑\n- 优化xgplayer兼容性-xgplayer-flv.js替代xgplayer-flv, xgplayer-hls.js替代xgplayer-hls\n\n## 2024.5.12\n\n- 初步实现方法集成[xgplayer|nplayer|dplayer|artplayer]\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/README.md",
    "content": "- 差异说明\n  - 解码器\n    - dash\n      - xgplayer: shaka([dash加载ranage为0](https://github.com/bytedance/xgplayer/issues/1674))\n      - artplayer/oplayer/nplayer/dplayer: dash\n    - flv\n      - oplayer: mpegts\n      - artplayer/xgplayer/nplayer/dplayer: flv\n    - mpegts: oplayer/xgplayer不支持ts分片类型\n    - torrent: xgplayer不支持\n    - xgplayer: 解码器默认参数与其他不对齐(参数不一致)\n  - 请求头(不支持情况) -> 链接绑请求头 -> 底层拦截(electron)\n    - oplayer: dash/flv/shaka均不支持\n    - xgplayer: 仅m3u8/flv支持\n    - torrent: 均不支持\n    - shaka: 解码器只有第一次请求mpd存在请求头 m4s 不带请求头\n  - 记忆\n    - oplayer: 赋值音量与ui不对应(功能不影响) -> 静音直接显示0 但 赋值会显示赋值\n    - oplayer: 倍速/音量/静音记忆失效(偶发)\n  - 右键\n    - 支持: artplayer/dplayer/nplayer(不支持画质数据)\n    - 不支持: xgpayer/oplayer\n  - 音量\n    - artplayer/dplayer/oplayer/xgplayer: 静音显示0\n    - nplayer: 静音显示原音量\n    - artplayer: 静音点击音量条会提示音量变动但是ui没渲染实际也是静音, 拖动直接恢复\n  - 弹幕\n    - dplayer: 弹幕使用 url+blob / apiBackend\n    - dplayer: 弹幕发布无法控制底部距离\n    - oplayer: 渲染有问题获取不到图层真实尺寸\n    - xgplayer: 不支持弹幕配置项\n  - 国际化\n    - artplayer/dplayer/nplayer/xgplayer: 支持 简体/繁体/英语\n    - oplayer: 不支持繁体\n    - artplayer: 弹幕部分只支持简体\n  - 画质\n    - nplayer: 不支持多画质\n    - xgplayer: 首次不显示默认画质\n  - 切换\n    - 解码器\n      - dplayer/nplayer/oplayer/xgplayer: 跨解码器切换链接\n      - artplayer: 同解码器切换链接\n    - 请求头\n      - artplayer/dplayer/nplayer/xgplayer: 可切请求头\n      - oplayer: 不可切请求头\n    - xgplayer 切换 mpd 失败\n    - dplayer 切换 mpd 会提示加载失败, 实际加载了\n  - 其他\n    - nplayer: 一旦 startTime 超过总时长会报错\n    - nplayer: 摧毁后重建会丢失插件 pip 和 playNext, 刷新生效\n\n- 参数\n  - container: 容器id不带#\n  - type: 解码器类型 hls dash flv mpegts torrent mp4\n  - url: 视频地址\n  - quality: 视频质量 { name, url }\n  - headers: 请求头\n  - autoplay: 自动播放\n  - isLive: 直播\n  - startTime: 开始时间,单位秒\n  - next: 下集按钮\n\n- 方法\n  - barrage: 弹幕\n  - create: 创建播放器\n  - destroy: 摧毁播放器\n  - onTimeUpdate: 实时返回时间\n  - play: 播放\n  - pause: 暂停\n  - togglePlay: 播放/暂停\n  - toggleMuted: 切换静音\n  - time: 视频时间<当前播放时间, 总进度时间>\n  - seek: 跳转\n  - playbackRate: 当前倍速\n  - setPlaybackRate: 设置倍速\n  - muted: 当前静音\n  - setMuted: 设置静音\n  - volume: 当前音量\n  - setVolume: 设置音量\n\n- 插槽\n  - header: 头部插槽\n\n- mediaUtils\n  - checkMediaType: 检测媒体类型\n  - removeUnSafeHeaders: 移除不安全请求头\n  - convertStandardToUri: 请求头转url拼接\n  - convertWebToElectron: web不安全请求头转electron请求头\n  - getExtensionFromMime: 获取文件扩展名-根据Mime\n  - getMimeFromExtension: 获取Mime-根据扩展名\n  - getFileExtension: 获取文件扩展名-根据路径\n  - getStreamContentTypeToExtension: 获取媒体类型-根据网络流ContentType\n  - getDecoderFromExtension: 获取媒体对应解码器\n  - getStreamContentType: 获取ContentType\n  - isHEVCVideoSupported: 检查是否支持hevc\n  - isSafeHeader: 检查请求头 key 是否安全\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/global.d.ts",
    "content": "declare module 'shaka-player/dist/shaka-player.compiled' {\n  export = shaka;\n}\n\ndeclare interface Navigator extends NavigatorNetworkInformation {}\ndeclare interface WorkerNavigator extends NavigatorNetworkInformation {}\ndeclare interface NavigatorNetworkInformation {\n  readonly connection?: NetworkInformation;\n}\ntype Megabit = number;\ntype Millisecond = number;\ntype EffectiveConnectionType = '2g' | '3g' | '4g' | 'slow-2g';\ntype ConnectionType = 'bluetooth' | 'cellular' | 'ethernet' | 'mixed' | 'none' | 'other' | 'unknown' | 'wifi' | 'wimax';\ninterface NetworkInformation extends EventTarget {\n  readonly type?: ConnectionType;\n  readonly effectiveType?: EffectiveConnectionType;\n  readonly downlinkMax?: Megabit;\n  readonly downlink?: Megabit;\n  readonly rtt?: Millisecond;\n  readonly saveData?: boolean;\n  onchange?: EventListener;\n}\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/index.ts",
    "content": "import MultiPlayer from './src/multi-player';\nimport { mediaUtils } from './src/utils/tool';\n\nexport { mediaUtils, MultiPlayer };\nexport type { MultiPlayerInstance } from './src/multi-player';\nexport type * from './src/types';\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/assets/css/index.less",
    "content": ".multi-player {\n  position: relative;\n  width: 100%;\n  height: 100%;\n  background-image: url('../img/bg/bg-player.jpg');\n  background-position: center center;\n  background-repeat: no-repeat;\n  background-size: cover;\n\n  &__header {\n    position: absolute;\n    inset: 0;\n    width: 100%;\n    height: fit-content;\n    z-index: 11;\n    padding: var(--td-comp-paddingTB-xxs) var(--td-comp-paddingLR-s);\n    background: linear-gradient(to bottom, rgb(0 0 0 / 80%) 0%, rgb(0 0 0 / 60%) 30%, rgb(0 0 0 / 0%) 100%);\n    color: var(--td-gray-color-1);\n    transition: all 0.3s ease;\n    opacity: 0;\n\n    .multi-player:hover &,\n    &:hover {\n      opacity: 1;\n    }\n  }\n\n  &__mse {\n    position: absolute !important;\n    inset: 0;\n    width: 100%;\n    height: 100%;\n  }\n}\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/artplayer/css/index.css",
    "content": "/* 加载 */\n.art-video-player.art-loading-show .art-loading svg {\n  width: 64px !important;\n  height: 64px !important;\n}\n\n/* 右键 */\n.art-contextmenus {\n  border-radius: 8px !important;\n}\n\n.art-video-player .art-info {\n  border-radius: 8px !important;\n}\n\n/* 下控制条 */\n.art-controls {\n  margin-bottom: 4px;\n}\n\n.art-controls-left:first-child {\n  margin-left: -6px;\n}\n\n.art-controls-right:last-child {\n  margin-right: -4px;\n}\n\n/* 图标 */\n.art-video-player svg {\n  height: 21px;\n  width: 21px;\n}\n\n/* 提示 */\n[class*='hint--']::before {\n  display: none;\n}\n\n[class*='hint--']::after {\n  box-shadow: none !important;\n}\n\n.hint--top::before,\n.hint--top::after {\n  bottom: calc(100% + 15px) !important;\n}\n\n.hint--rounded::after {\n  border-radius: 8px !important;\n  font-weight: 700;\n}\n\n/* 全局提示 */\n.art-video-player .art-notice {\n  inset: auto 0 56px !important;\n  border-radius: 8px !important;\n}\n\n/* 音量面板 */\n.art-control-volume .art-volume-panel {\n  width: 42px !important;\n  height: 160px !important;\n  border-radius: 8px !important;\n  padding: 0 0 25px !important;\n}\n\n.art-control-volume .art-volume-panel .art-volume-inner {\n  background-color: transparent !important;\n}\n\n.art-video-player.art-backdrop .art-contextmenus,\n.art-video-player.art-backdrop .art-info,\n.art-video-player.art-backdrop .art-settings,\n.art-video-player.art-backdrop .art-layer-auto-playback,\n.art-video-player.art-backdrop .art-selector-list,\n.art-video-player.art-backdrop .art-volume-inner {\n  background-color: transparent !important;\n  backdrop-filter: none !important;\n}\n\n/* 设置面板 */\n.art-video-player .art-settings {\n  border-radius: 8px !important;\n  bottom: 60px !important;\n}\n\n/* 画质面板 */\n.art-control-quality .art-selector-list {\n  border-radius: 8px !important;\n  padding-bottom: 25px;\n}\n\n.art-control-quality .art-selector-list::before {\n  content: '';\n  position: absolute;\n  inset: 0;\n  width: 100%;\n  height: calc(100% - 19px);\n  bottom: 19px;\n  border-radius: 8px;\n  background-color: #000000bf !important;\n}\n\n.art-video-player.art-backdrop .art-control-quality .art-selector-list {\n  background-color: transparent !important;\n}\n\n.art-control-selector .art-selector-list .art-selector-item {\n  z-index: 999;\n}\n\n.art-control-selector .art-selector-list .art-selector-item:hover {\n  background-color: #26262b !important;\n}\n\n/* 弹幕面板 */\n.art-controls-center {\n  z-index: 60;\n}\n\n.artplayer-plugin-danmuku .apd-config .apd-config-panel {\n  padding: 0 0 30px !important;\n  bottom: 22px !important;\n}\n\n.artplayer-plugin-danmuku .apd-config .apd-config-panel .apd-config-panel-inner {\n  border-radius: 8px !important;\n}\n\n.artplayer-plugin-danmuku .apd-slider .apd-slider-progress {\n  background-color: var(--art-theme) !important;\n}\n\n.artplayer-plugin-danmuku .apd-slider .apd-slider-dot {\n  background-color: var(--art-theme) !important;\n}\n\n.artplayer-plugin-danmuku .apd-config-other .apd-check-off path,\n.artplayer-plugin-danmuku .apd-config-other .apd-check-on path {\n  fill: var(--art-theme) !important;\n}\n\n[data-danmuku-mode0='false'] .apd-config-mode .apd-mode-0-off path,\n[data-danmuku-mode1='false'] .apd-config-mode .apd-mode-1-off path,\n[data-danmuku-mode2='false'] .apd-config-mode .apd-mode-2-off path {\n  fill: var(--art-theme) !important;\n}\n\n.artplayer-plugin-danmuku .apd-config-other .apd-other:hover {\n  color: #fff !important;\n}\n\n.artplayer-plugin-danmuku .apd-modes .apd-mode:hover {\n  color: #fff !important;\n}\n\n.art-fullscreen .artplayer-plugin-danmuku {\n  height: 100% !important;\n}\n\n.art-fullscreen .artplayer-plugin-danmuku .apd-config-icon,\n.art-fullscreen .artplayer-plugin-danmuku .apd-toggle-on,\n.art-fullscreen .artplayer-plugin-danmuku .apd-toggle-off {\n  height: 21px !important;\n  width: 21px !important;\n}\n\n[data-danmuku-emitter='false'].art-fullscreen .art-controls-center .artplayer-plugin-danmuku,\n[data-danmuku-emitter='false'].art-fullscreen-web .art-controls-center .artplayer-plugin-danmuku {\n  gap: 12px !important;\n}\n\n.art-controls .art-controls-center {\n  padding: 0 6px 0 12px !important;\n}\n\n/* 弹幕发送按钮 */\n.artplayer-plugin-danmuku .apd-send {\n  background-color: var(--art-theme) !important;\n  font-weight: 500;\n}\n\n.artplayer-plugin-danmuku .apd-send.apd-lock {\n  background-color: #6b6b6b !important;\n  color: #fff !important;\n  font-weight: 500;\n}\n\n/* 弹幕发送参数面板 */\n.artplayer-plugin-danmuku .apd-style .apd-style-panel {\n  padding: 0 0 30px !important;\n  bottom: 22px !important;\n}\n\n.artplayer-plugin-danmuku .apd-style .apd-style-panel .apd-style-panel-inner {\n  border-radius: 8px !important;\n}\n\n[data-danmuku-mode='0'] .apd-style-mode [data-mode='0'],\n[data-danmuku-mode='1'] .apd-style-mode [data-mode='1'],\n[data-danmuku-mode='2'] .apd-style-mode [data-mode='2'] {\n  color: #fff !important;\n}\n\n[data-danmuku-mode='0'] .apd-style-mode [data-mode='0'] path,\n[data-danmuku-mode='1'] .apd-style-mode [data-mode='1'] path,\n[data-danmuku-mode='2'] .apd-style-mode [data-mode='2'] path {\n  fill: var(--art-theme) !important;\n}\n\n/* 弹幕开关提示 */\n.apd-toggle::after {\n  bottom: calc(100% + 23px) !important;\n}\n\n/* 播放暂停提示 */\n.art-icon-play::after,\n.art-icon-pause::after {\n  bottom: calc(100% + 23px) !important;\n}\n\n/* 中间按钮 */\n.art-mask .art-state .art-icon svg {\n  height: 64px !important;\n  width: 64px !important;\n}\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/artplayer/index.ts",
    "content": "import './css/index.css';\n\nimport type { Option as IPlayerOptions } from 'artplayer';\nimport Artplayer from 'artplayer';\nimport ZH_TW from 'artplayer/i18n/zh-tw';\nimport type { Danmu as IDanmu } from 'artplayer-plugin-danmuku';\nimport artplayerPluginDanmuku from 'artplayer-plugin-danmuku';\nimport { merge } from 'es-toolkit';\n\nimport type {\n  IBarrage,\n  IBarrageSendOptions,\n  IDashInstance,\n  IFlvInstance,\n  IHlsInstance,\n  IMpegtsInstance,\n  IMultiPlayerOptions,\n  ITorrentInstance,\n} from '../../types';\nimport { color, icons, language } from '../../utils/static';\nimport { storage, storageUtil } from '../../utils/storage';\nimport { streamDecoder } from '../../utils/stream-decoder';\nimport { publicBarrageSend } from '../../utils/tool';\nimport { playNextPlugin } from './plugins';\nimport type { PlayerAdapter } from './types';\nimport { uiIconHandle } from './utils';\n\nclass ArtPlayerAdapter {\n  player: PlayerAdapter | null = null;\n  listeners: Map<string, Set<(...args: any[]) => void>> = new Map();\n  videoId: string = '';\n\n  private on(event: string, handler: (...args: any[]) => void) {\n    if (!this.player) return;\n\n    let handlers = this.listeners.get(event);\n    if (!handlers) {\n      handlers = new Set();\n      this.listeners.set(event, handlers);\n    }\n\n    if (!handlers.has(handler)) {\n      handlers.add(handler);\n      this.player.on(event, handler);\n    }\n  }\n\n  private off(event: string, handler?: any) {\n    if (!this.player) return;\n\n    const handlers = this.listeners.get(event);\n    if (!handlers) return;\n\n    if (handler) {\n      if (handlers.has(handler)) {\n        this.player.off(event, handler);\n        handlers.delete(handler);\n      }\n    } else {\n      handlers.forEach((h) => this.player!.off(event, h));\n      handlers.clear();\n    }\n\n    if (handlers.size === 0) this.listeners.delete(event);\n  }\n\n  options: IPlayerOptions = {\n    container: '#artplayer',\n    url: '',\n    type: '',\n    theme: color.theme,\n    autoplay: true,\n    playbackRate: true,\n    fullscreen: true,\n    pip: true,\n    setting: true,\n    flip: true,\n    hotkey: true,\n    isLive: false,\n    aspectRatio: true,\n    lang: 'zh-cn',\n    controls: [playNextPlugin],\n    i18n: {\n      'zh-cn': {\n        // @ts-expect-error 对象字面量只能指定已知属性，并且“playNext”不在类型“Partial<I18nValue>”中。ts(2353)\n        playNext: '下集',\n      },\n      'zh-tw': {\n        ...ZH_TW,\n        // @ts-expect-error 对象字面量只能指定已知属性，并且“playNext”不在类型“Partial<I18nValue>”中。ts(2353)\n        playNext: '下集',\n      },\n    },\n    plugins: [\n      artplayerPluginDanmuku({\n        opacity: 1, // 弹幕透明度\n        fontSize: 24, // 弹幕字体大小\n        speed: 5, // 弹幕速度\n        synchronousPlayback: true, // 同步播放速度\n        margin: [10, '25%'], // 弹幕显示区域\n        color: '#FFFFFF', // 弹幕颜色\n        danmuku: [],\n        emitter: false,\n        antiOverlap: true, // 弹幕是否防重叠\n        heatmap: false, // 热力图\n        beforeEmit: ((item: IDanmu) => {\n          if (!this.videoId) return false;\n\n          const sendHandle = (item: IDanmu) => {\n            const options: IBarrageSendOptions = {\n              id: this.videoId,\n              type: item.mode === 1 ? 'top' : item.mode === 2 ? 'bottom' : 'right',\n              text: item.text,\n              time: item.time!,\n              color: item.color ?? '#FFFFFF',\n            };\n\n            publicBarrageSend(options);\n          };\n\n          sendHandle(item);\n          return true;\n        }) as (item: IDanmu) => boolean,\n      }),\n    ],\n    icons: {\n      play: icons.play,\n      pause: icons.pause,\n      volume: icons.volumeLargeFill,\n      volumeClose: icons.volumeMutedFill,\n      pip: icons.pipEnter,\n      fullscreenOn: icons.fullscreen,\n      fullscreenOff: icons.fullscreenExit,\n      setting: icons.settingDot,\n    },\n    cssVar: {\n      '--art-control-height': '34px',\n      '--art-control-icon-size': '20px',\n      '--art-control-icon-scale': 1,\n    },\n    customType: {\n      hls: (video: HTMLVideoElement, url: string, art: PlayerAdapter) => {\n        art.loading.show = true;\n        if (art.hls) (art.hls as IHlsInstance)!.destroy();\n        const steamOptions = {\n          isLive: art.option.isLive,\n          autoplay: art.option.autoplay,\n          headers: art.option.headers,\n        };\n        const hls = streamDecoder.customHls(video, url, steamOptions);\n        art.hls = hls;\n        art.on('destroy', () => hls?.destroy());\n        art.loading.show = false;\n      },\n      flv: (video: HTMLVideoElement, url: string, art: PlayerAdapter) => {\n        art.loading.show = true;\n        if (art.flv) (art.flv as IFlvInstance)!.destroy();\n        const steamOptions = {\n          isLive: art.option.isLive,\n          autoplay: art.option.autoplay,\n          headers: art.option.headers,\n        };\n        const flv = streamDecoder.customFlv(video, url, steamOptions);\n        art.flv = flv;\n        art.on('destroy', () => flv?.destroy());\n        art.loading.show = false;\n      },\n      dash: (video: HTMLVideoElement, url: string, art: PlayerAdapter) => {\n        art.loading.show = true;\n        if (art.dash) (art.dash as IDashInstance)!.destroy();\n        const steamOptions = {\n          isLive: art.option.isLive,\n          autoplay: art.option.autoplay,\n          headers: art.option.headers,\n        };\n        const dash = streamDecoder.customDash(video, url, steamOptions);\n        art.dash = dash;\n        art.on('destroy', () => dash?.destroy());\n        art.loading.show = false;\n      },\n      mpegts: (video: HTMLVideoElement, url: string, art: PlayerAdapter) => {\n        art.loading.show = true;\n        if (art.mpegts) (art.mpegts as IMpegtsInstance)!.destroy();\n        const steamOptions = {\n          isLive: art.option.isLive,\n          autoplay: art.option.autoplay,\n          headers: art.option.headers,\n        };\n        const mpegts = streamDecoder.customMpegts(video, url, steamOptions);\n        art.mpegts = mpegts;\n        art.on('destroy', () => mpegts?.destroy());\n        art.loading.show = false;\n      },\n      torrent: (video: HTMLVideoElement, url: string, art: PlayerAdapter) => {\n        art.loading.show = true;\n        if (art.torrent) (art.torrent as ITorrentInstance)!.destroy();\n        const steamOptions = {\n          isLive: art.option.isLive,\n          autoplay: art.option.autoplay,\n          headers: art.option.headers,\n        };\n        const torrent = streamDecoder.customTorrent(video, url, steamOptions);\n        art.torrent = torrent;\n        art.on('destroy', () => torrent?.destroy());\n        art.loading.show = false;\n      },\n    },\n  };\n\n  barrage(barrage: IBarrage[], id: string) {\n    if (!this.player) return;\n\n    this.videoId = id;\n\n    const comments: IDanmu[] = barrage.map((item) => ({\n      id: item.id,\n      mode: ['top', 'bottom'].includes(item.type) ? (item.type === 'top' ? 1 : 2) : 0,\n      text: item.text,\n      time: item.time,\n      color: item.color,\n      border: false,\n      style: {},\n    }));\n\n    this.player.plugins.artplayerPluginDanmuku?.config({ danmuku: comments });\n    this.player.plugins.artplayerPluginDanmuku?.load();\n  }\n\n  create(rawOptions: Required<IMultiPlayerOptions>) {\n    storageUtil.delStartWith('artplayer_settings');\n\n    const options: Partial<IPlayerOptions> | Record<string, any> = {\n      container: `#${rawOptions.container}`, // 容器\n      type: ['hls', 'dash', 'flv', 'mpegts', 'torrent'].includes(rawOptions.type) ? rawOptions.type : 'auto', // 解码\n      url: rawOptions.url, // 地址\n      autoplay: rawOptions.autoplay,\n      isLive: rawOptions.isLive,\n      volume: ((v) => (Number.isNaN(v) ? 1 : v))(Number(storage?.get('volume'))), // 音量\n      muted: !!storage?.get('muted'),\n      lang: (() => {\n        const locale = language();\n        switch (locale) {\n          case 'zh-CN':\n            return 'zh-cn';\n          case 'zh-TW':\n            return 'zh-tw';\n          default:\n            return 'en';\n        }\n      })(), // 语言\n      quality: rawOptions.quality.map((q, i) => ({ html: q.name, url: q.url, default: i === 0 })), // 画质\n      headers: rawOptions.headers, // 请求头\n    };\n\n    if (rawOptions.next) {\n      const index = this.options.controls!.findIndex((i) => i.name === 'playNext');\n      if (index > -1) {\n        this.options.controls![index].disable = false;\n        this.options.controls![index].tooltip = (() => {\n          const locale = language();\n          switch (locale) {\n            case 'zh-CN':\n              return '下集';\n            case 'zh-TW':\n              return '下集';\n            default:\n              return 'Play Next';\n          }\n        })();\n      }\n    } // 下集\n\n    Artplayer.PLAYBACK_RATE = [0.5, 0.75, 1, 1.25, 1.5, 2]; // 倍速\n\n    // 初始化\n    const player: PlayerAdapter = new Artplayer(merge(this.options, options), function onReady() {\n      // player.volume = options.volume; // 音量\n\n      !rawOptions.isLive &&\n        (player.playbackRate = ((v) => (Number.isNaN(v) ? 1 : v))(Number(storage?.get('playrate')))); // 倍速\n      !rawOptions.isLive && rawOptions.startTime > 0 && (player.seek = rawOptions.startTime); // 开始时间\n    });\n    player.storage = storage; // 挂载存储\n    this.player = player; // 赋值实例\n\n    setTimeout(() => {\n      uiIconHandle.replace('.apd-toggle-on', icons.danmuOpen);\n      uiIconHandle.replace('.apd-toggle-off', icons.danmuClose);\n      uiIconHandle.replace('.apd-config-icon', icons.danmu);\n    }, 0); // 图标替换\n\n    this.on('video:ratechange', () => player?.storage?.set('playrate', player.playbackRate));\n    this.on('video:volumechange', () => player?.storage?.set('volume', player.volume));\n    this.on('muted', (state) => player?.storage?.set('muted', state));\n\n    return player;\n  }\n\n  destroy() {\n    if (!this.player) return;\n\n    this.listeners.forEach((handlers, event) => {\n      handlers.forEach((handler) => {\n        this.off(event, handler);\n      });\n    });\n    this.listeners.clear();\n\n    this.videoId = '';\n\n    this.player.destroy();\n    this.player = null;\n  }\n\n  onTimeUpdate(callback: any) {\n    if (!this.player) return;\n\n    const handler = () => {\n      callback({\n        currentTime: this.player?.video?.currentTime ?? Number.NaN,\n        duration: this.player?.video?.duration ?? Number.NaN,\n      });\n    };\n\n    this.on('video:timeupdate', handler);\n  }\n\n  offTimeUpdate() {\n    if (!this.player) return;\n    this.off('video:timeupdate');\n  }\n\n  play() {\n    this.player?.play();\n  }\n\n  pause() {\n    this.player?.pause();\n  }\n\n  togglePlay() {\n    this.player?.toggle();\n  }\n\n  toggleMuted() {\n    if (this.player) this.player.muted = !this.player.muted;\n  }\n\n  seek(time: number) {\n    if (this.player) this.player.seek = time;\n  }\n\n  switchUrl(rawOptions: Required<IMultiPlayerOptions>) {\n    if (!this.player) return;\n\n    ['hls', 'flv', 'dash', 'mpegts', 'torrent'].forEach((key) => {\n      this.player?.[key]?.destroy?.();\n      delete this.player?.[key]; // imporant\n    });\n\n    this.player.option.headers = rawOptions.headers;\n\n    // player.switch = url;\n    this.player.switchUrl(rawOptions.url);\n\n    if (this.player.plugins?.artplayerPluginDanmuku) {\n      this.player.plugins.artplayerPluginDanmuku.config({ danmuku: [] });\n      this.player.plugins.artplayerPluginDanmuku.load();\n    }\n  }\n\n  get currentTime() {\n    return this.player?.video?.currentTime ?? Number.NaN;\n  }\n\n  get duration() {\n    return this.player?.video?.duration ?? Number.NaN;\n  }\n\n  get time() {\n    return {\n      currentTime: this.player?.video?.currentTime ?? Number.NaN,\n      duration: this.player?.video?.duration ?? Number.NaN,\n    };\n  }\n\n  get playbackRate() {\n    return this.player?.playbackRate ?? 1;\n  }\n\n  set playbackRate(rate: number) {\n    if (this.player) this.player.playbackRate = rate;\n  }\n\n  get muted() {\n    return !!this.player?.muted;\n  }\n\n  set muted(state: boolean) {\n    if (this.player) this.player.muted = state;\n  }\n\n  get volume() {\n    return this.player?.volume ?? 0;\n  }\n\n  set volume(volume: number) {\n    if (this.player) {\n      if (volume > 0) this.player.muted = false;\n      this.player.volume = volume;\n    }\n  }\n\n  get instance() {\n    return this.player;\n  }\n}\n\nexport default ArtPlayerAdapter;\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/artplayer/plugins/index.ts",
    "content": "import playNextPlugin from './playNext';\n\nexport { playNextPlugin };\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/artplayer/plugins/playNext.ts",
    "content": "import { emitterChannel } from '@/config/emitterChannel';\nimport emitter from '@/utils/emitter';\n\nimport { icons, language } from '../../../utils/static';\n\nconst lang = () => {\n  const locale = language();\n  switch (locale) {\n    case 'zh-CN':\n      return '下集';\n    case 'zh-TW':\n      return '下集';\n    default:\n      return 'Play Next';\n  }\n};\n\nconst playNextPlugin = {\n  name: 'playNext',\n  index: 11,\n  position: 'left',\n  html: `<i class=\"art-icon art-icon-play-next\" style=\"display: flex;\">${icons.mnext}</i>`,\n  tooltip: lang(),\n  disable: true,\n  click() {\n    emitter.emit(emitterChannel.COMP_MULTI_PLAYER_PLAYNEXT, {});\n  },\n  mounted() {},\n};\n\nexport default playNextPlugin;\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/artplayer/types.ts",
    "content": "import type Artplayer from 'artplayer';\n\n// @ts-expect-error artplayer 没有导出类型，故自行扩展\nexport interface PlayerAdapter extends Artplayer {\n  readonly option: Artplayer['option'] & {\n    headers?: Record<string, any>;\n  };\n\n  storage: {\n    set: (key: string, value: any) => void;\n    get: (key: string) => any;\n  };\n\n  readonly plugins: Artplayer['plugins'] & {\n    artplayerPluginDanmuku?: {\n      config: (options: { danmuku: any[] }) => void;\n      load: () => void;\n    };\n  };\n\n  dash?: unknown;\n  flv?: unknown;\n  hls?: unknown;\n  mpegts?: unknown;\n  shaka?: unknown;\n  torrent?: unknown;\n}\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/artplayer/utils/index.ts",
    "content": "const uiIconHandle = {\n  /**\n   * 替换目标元素中的SVG图标\n   * @param targetSelector 目标元素选择器\n   * @param html 新元素的HTML字符串\n   * @returns 是否成功替换\n   */\n  replace(targetSelector: string, html: string): boolean {\n    // 获取目标SVG\n    const targetSVG = document.querySelector(targetSelector);\n    if (!targetSVG || !(targetSVG instanceof SVGElement)) return false;\n\n    // 获取原class\n    const originalClass = targetSVG.getAttribute('class') || '';\n\n    // 创建新SVG元素\n    const tempDiv = document.createElement('div');\n    tempDiv.innerHTML = html;\n    const newSVG = tempDiv.querySelector('svg');\n    if (!newSVG) return false;\n\n    // 添加原class到新SVG\n    if (originalClass) {\n      const newClass = newSVG.getAttribute('class') || '';\n      const combinedClass = `${newClass} ${originalClass}`;\n      newSVG.setAttribute('class', combinedClass);\n    }\n\n    // 替换整个SVG元素\n    targetSVG.replaceWith(newSVG);\n\n    return true;\n  },\n};\n\n/**\n * 过滤控制项数组，移除指定的控制项并重置非字符串项的disable状态\n * @param data 原始控制项数组，可以是字符串或包含name属性的对象\n * @param filter 需要过滤的控制项名称数组\n * @returns 过滤后的新数组\n */\nconst filterControls = <T extends string | { name: string; disable?: boolean }>(data: T[], filter: string[]): T[] => {\n  // 无过滤条件时直接返回原数组的浅拷贝\n  if (!filter.length) return [...data];\n\n  return data\n    .filter((item) => {\n      const itemName = typeof item === 'string' ? item : item.name;\n      return !filter.includes(itemName);\n    })\n    .map((item) => {\n      if (typeof item === 'string') {\n        return item;\n      } else {\n        return { ...(item as any), disable: false };\n      }\n    }) as T[];\n};\n\nexport { filterControls, uiIconHandle };\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/dplayer/css/index.css",
    "content": "/* 加载 */\n.dplayer-bezel .dplayer-loading-icon,\n.dplayer-bezel .dplayer-bezel-icon {\n  width: 64px !important;\n  height: 64px !important;\n  padding: 0 !important;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.dplayer-bezel .dplayer-loading-icon svg,\n.dplayer-bezel .dplayer-bezel-icon svg {\n  width: calc(100% - 6px) !important;\n  height: calc(100% - 6px) !important;\n}\n\n/* 控制条 */\n.dplayer-icons-left:first-child {\n  margin-left: -10px !important;\n}\n\n.dplayer-icons-right:last-child {\n  margin-right: -8px !important;\n}\n\n.dplayer-setting {\n  margin-right: 3px;\n}\n\n/* 图标 */\n.dplayer svg {\n  height: 21px !important;\n  width: 21px !important;\n}\n\n.dplayer-controller .dplayer-icons .dplayer-icon .dplayer-icon-content {\n  display: inline-block;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon {\n  padding: 0 !important;\n  width: 32px !important;\n  height: 32px !important;\n}\n\n.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon {\n  padding: 0 !important;\n}\n\n.dplayer-play-icon svg,\n.dplayer-volume-icon svg {\n  height: 28px !important;\n  width: 28px !important;\n}\n\n/* 提示 */\n[aria-label][data-balloon-pos][data-balloon-pos^='up']::after,\n[aria-label][data-balloon-pos][data-balloon-pos^='up']::before {\n  bottom: calc(100% + 24px) !important;\n}\n\n.dplayer [aria-label]::after {\n  background: #1f1f1fe6 !important;\n  border-radius: 8px !important;\n}\n\n/* 屏蔽网页全屏 */\n.dplayer-full .dplayer-full-in-icon {\n  display: none !important;\n}\n\n/* 屏蔽弹幕发送组件 */\n.dplayer-comment {\n  display: none !important;\n}\n\n/* 弹幕发送框 */\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input {\n  width: calc(100% - 40px) !important;\n}\n\n/* 设置面板 */\n.dplayer-setting-box {\n  bottom: 68px !important;\n  background: #1f1f1fe6 !important;\n  border-radius: 8px !important;\n}\n\n.dplayer-setting-box .dplayer-setting-item.dplayer-setting-audio {\n  display: none;\n}\n\n/* 右键 */\n.dplayer-menu {\n  background: #1f1f1fe6 !important;\n  color: #bbb;\n  border-radius: 8px !important;\n  min-width: 234px;\n  padding: 10px 0 !important;\n}\n\n.dplayer-menu .dplayer-menu-item {\n  height: 34px !important;\n  line-height: 34px;\n  max-width: 100%;\n  overflow: hidden;\n  padding-left: 20px;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.dplayer-menu .dplayer-menu-item:hover {\n  background: #26262b !important;\n}\n\n.dplayer-menu .dplayer-menu-item a {\n  text-decoration: none;\n  color: #bbb !important;\n  padding: 0 !important;\n}\n\n.dplayer-info-panel {\n  background: #1f1f1fe6 !important;\n  border-radius: 8px !important;\n  margin: 10px 0 0 10px;\n  padding: 8px 5px !important;\n}\n\n.dplayer-info-panel .dplayer-info-panel-close {\n  text-align: right;\n  position: relative !important;\n  padding: 0 8px;\n  margin-bottom: 8px;\n}\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/dplayer/index.ts",
    "content": "import './css/index.css';\n\nimport type { DPlayerType } from 'dplayer';\nimport DPlayer from 'dplayer';\nimport { merge } from 'es-toolkit';\n\nimport { emitterChannel } from '@/config/emitterChannel';\nimport emitter from '@/utils/emitter';\n\nimport type { IBarrage, IBarrageSendOptions, IMultiPlayerOptions } from '../../types';\nimport { color, icons, language } from '../../utils/static';\nimport { storage, storageUtil } from '../../utils/storage';\nimport { streamDecoder } from '../../utils/stream-decoder';\nimport { publicBarrageSend } from '../../utils/tool';\nimport type { PlayerAdapter } from './types';\nimport { uiIconHandle } from './utils';\n\nclass DPlayerAdapter {\n  player: PlayerAdapter | null = null;\n  listeners: Map<DPlayerType.Events, Set<(...args: any[]) => void>> = new Map();\n  headers: Record<string, string> = {};\n  options: DPlayerType.Options = {\n    container: document.getElementById('dplayer')!,\n    autoplay: true,\n    screenshot: false,\n    theme: color.theme,\n    live: false,\n    lang: 'zh-cn',\n    video: {\n      url: '',\n      type: '',\n      customType: {\n        hls: (video: HTMLVideoElement, dp: PlayerAdapter) => {\n          if (dp.plugins?.hls) dp.plugins.hls.destroy();\n          const hls = streamDecoder.customHls(video, video.src, {\n            isLive: dp.options.live,\n            autoplay: dp.options.autoplay,\n            headers: dp.options.pluginOptions.headers,\n          });\n          dp.plugins.hls = hls;\n          dp.on('destroy', () => hls?.destroy());\n        },\n        flv: (video: HTMLVideoElement, dp: PlayerAdapter) => {\n          if (dp.plugins?.flv) dp.plugins.flv.destroy();\n          const flv = streamDecoder.customFlv(video, video.src, {\n            isLive: dp.options.live,\n            autoplay: dp.options.autoplay,\n            headers: dp.options.pluginOptions.headers,\n          });\n          dp.plugins.flv = flv;\n          dp.on('destroy', () => flv?.destroy());\n        },\n        dash: (video: HTMLVideoElement, dp: PlayerAdapter) => {\n          if (dp.plugins?.dash) dp.plugins.dash.destroy();\n          const dash = streamDecoder.customDash(video, video.src, {\n            isLive: dp.options.live,\n            autoplay: dp.options.autoplay,\n            headers: dp.options.pluginOptions.headers,\n          });\n          dp.plugins.dash = dash;\n          dp.on('destroy', () => dash?.destroy());\n        },\n        mpegts: (video: HTMLVideoElement, dp: PlayerAdapter) => {\n          if (dp.plugins?.mpegts) dp.plugins.mpegts.destroy();\n          const mpegts = streamDecoder.customMpegts(video, video.src, {\n            isLive: dp.options.live,\n            autoplay: dp.options.autoplay,\n            headers: dp.options.pluginOptions.headers,\n          });\n          dp.plugins.mpegts = mpegts;\n          dp.on('destroy', () => mpegts?.destroy());\n        },\n        torrent: (video: HTMLVideoElement, dp: PlayerAdapter) => {\n          if (dp.plugins?.torrent) dp.plugins.torrent.destroy();\n          const torrent = streamDecoder.customTorrent(video, video.src, {\n            isLive: dp.options.live,\n            autoplay: dp.options.autoplay,\n            headers: dp.options.pluginOptions.headers,\n          });\n          dp.plugins.torrent = torrent;\n          dp.on('destroy', () => torrent?.destroy());\n        },\n      },\n    },\n  };\n\n  private on(event: DPlayerType.Events, handler: (...args: any[]) => void) {\n    if (!this.player) return;\n\n    let handlers = this.listeners.get(event);\n    if (!handlers) {\n      handlers = new Set();\n      this.listeners.set(event, handlers);\n    }\n\n    if (!handlers.has(handler)) {\n      handlers.add(handler);\n      this.player.on(event, handler);\n    }\n  }\n\n  private off(event: DPlayerType.Events, handler?: any) {\n    if (!this.player) return;\n\n    const handlers = this.listeners.get(event);\n    if (!handlers) return;\n\n    if (handler) {\n      if (handlers.has(handler)) {\n        this.player.off(event, handler);\n        handlers.delete(handler);\n      }\n    } else {\n      handlers.forEach((h) => this.player!.off(event, h));\n      handlers.clear();\n    }\n\n    if (handlers.size === 0) this.listeners.delete(event);\n  }\n\n  barrage(barrage: IBarrage[], id: string) {\n    if (!this.player) return;\n\n    const { video } = this.player.options;\n\n    // api格式\n    const comments: DPlayerType.Dan[] = barrage.map((item) => ({\n      author: 'username', // 弹幕作者（实际上不使用）\n      id: item.id,\n      type: (['top', 'bottom'].includes(item.type) ? item.type : 'right') as DPlayerType.DanmakuType,\n      text: item.text,\n      time: item.time,\n      color: item.color,\n      size: 'medium', // 弹幕字体大小 big small medium\n    }));\n    const barrageResp = { code: 0, data: comments };\n    let barrageBlob: Blob | null = new Blob([JSON.stringify(barrageResp)], { type: 'application/json' });\n    const barrageUrl = URL.createObjectURL(barrageBlob);\n    this.player.switchVideo(\n      { ...video } as {\n        url: string;\n        type?: DPlayerType.VideoType | string;\n        pic?: string;\n      },\n      {\n        user: 'username', // 评论的用户名（实际上不使用）\n        speedRate: 1, // 弹幕速度\n        // opacity: 0.4, // 弹幕透明度\n        bottom: '30%', // 弹幕距离播放器底部的距离\n        // borderColor: '#F5F5', // 弹幕边框颜色\n        unlimited: false, // 弹幕重叠也展示\n        fontSize: 24, // 弹幕字体大小\n        closeCommentFormAfterSend: true, // 提交评论后是否关闭评论表单\n        addition: [barrageUrl], // api处理方式\n      },\n      true,\n      {\n        read(options) {\n          options.success(comments);\n        },\n        send(options) {\n          const sendHandle = (item: DPlayerType.Dan) => {\n            const options: IBarrageSendOptions = {\n              id,\n              type: item.type,\n              text: item.text as DPlayerType.DanmakuType,\n              time: item.time,\n              color: item.color ?? '#FFFFFF',\n            };\n            publicBarrageSend(options);\n          };\n          sendHandle(options.data);\n          options.success();\n        },\n      },\n    );\n\n    URL.revokeObjectURL(barrageUrl); // 释放 URL 对象\n    barrageBlob = null; // 释放 Blob 对象\n  }\n\n  create(rawOptions: Required<IMultiPlayerOptions>) {\n    storageUtil.delStartWith('dplayer-');\n\n    const muted = !!storage?.get('muted'); // 静音\n\n    const options: Partial<PlayerAdapter['options']> = {\n      container: document.getElementById(rawOptions.container)!, // 容器\n      autoplay: rawOptions.autoplay, // 自动播放\n      live: rawOptions.isLive, // 直播\n      volume: ((v) => (Number.isNaN(v) ? 1 : v))(Number(storage?.get('volume'))),\n      video: {\n        url: rawOptions.url,\n        type: ['hls', 'dash', 'flv', 'mpegts', 'torrent'].includes(rawOptions.type) ? rawOptions.type : 'normal', // 解码器\n      },\n      pluginOptions: { headers: rawOptions.headers },\n      lang: (() => {\n        const locale = language();\n        switch (locale) {\n          case 'zh-CN':\n            return 'zh-cn';\n          case 'zh-TW':\n            return 'zh-tw';\n          default:\n            return 'en';\n        }\n      })(), // 语言\n    };\n\n    if (rawOptions.quality.length > 0) {\n      options.video!.quality = rawOptions.quality.map((q) => {\n        return { name: q.name, url: q.url, type: options.video!.type };\n      });\n      options.video!.defaultQuality = 0;\n    } // 画质\n\n    // 初始化\n    const player: PlayerAdapter = new DPlayer(merge(this.options, options));\n\n    player.storage = storage; // 挂载存储\n    this.player = player; // 赋值实例\n\n    setTimeout(() => {\n      // uiIconHandle.replace('.dplayer-play-icon', icons.play);\n      // uiIconHandle.replace('.dplayer-pause-icon', icons.pause);\n      uiIconHandle.replace('.dplayer-setting-icon', icons.settingDot);\n      uiIconHandle.replace('.dplayer-full-icon', icons.fullscreenEnter);\n      uiIconHandle.replace('.dplayer-pip-icon', icons.pip);\n\n      // 下集\n      uiIconHandle.create(\n        '.dplayer-play-icon',\n        icons.mnext,\n        'playNext',\n        (() => {\n          const locale = language();\n          switch (locale) {\n            case 'zh-CN':\n              return '下集';\n            case 'zh-TW':\n              return '下集';\n            default:\n              return 'Play Next';\n          }\n        })(),\n      );\n      const handlePlayNext = () => {\n        emitter.emit(emitterChannel.COMP_MULTI_PLAYER_PLAYNEXT, {});\n      };\n      const playNextButton = document.querySelector('.dplayer-playNext-icon');\n      if (playNextButton) playNextButton.addEventListener('click', handlePlayNext);\n\n      // 弹幕\n      uiIconHandle.create(\n        '.dplayer-setting',\n        player.template.showDanmakuToggle.checked ? icons.danmuOpen : icons.danmuClose,\n        'danmu',\n        (() => {\n          const locale = language();\n          switch (locale) {\n            case 'zh-CN':\n              return '弹幕开关';\n            case 'zh-TW':\n              return '彈幕開關';\n            default:\n              return 'Toggle Danmaku';\n          }\n        })(),\n      );\n      const handleDanmu = () => {\n        player.template.showDanmakuToggle.checked = !player.template.showDanmakuToggle.checked;\n        const showDanmaku = player.template.showDanmakuToggle.checked;\n\n        if (showDanmaku) {\n          player.danmaku?.show();\n          uiIconHandle.replace('.dplayer-danmu-icon', icons.danmuOpen);\n        } else {\n          player.danmaku?.hide();\n          uiIconHandle.replace('.dplayer-danmu-icon', icons.danmuClose);\n        }\n\n        player.user.set('danmaku', showDanmaku ? 1 : 0);\n      };\n      const danmuButton = document.querySelector('.dplayer-danmu-icon');\n      if (danmuButton) danmuButton.addEventListener('click', handleDanmu);\n    }, 0); // 图标替换\n\n    player.on(\n      'canplay',\n      () => {\n        player.muted(muted); // 静音\n        !rawOptions.isLive && player.speed(((v) => (Number.isNaN(v) ? 1 : v))(Number(storage?.get('playrate')))); // 倍速\n        !rawOptions.isLive && rawOptions.startTime > 0 && player.seek(rawOptions.startTime); // 开始时间\n      },\n      true,\n    );\n\n    this.on('ratechange', () => player.storage?.set('playrate', player.video.playbackRate));\n    this.on('volumechange', () => {\n      player.storage?.set('volume', player.video.volume);\n      player.storage?.set('muted', player.video.muted);\n    });\n\n    return player;\n  }\n\n  destroy() {\n    if (!this.player) return;\n\n    this.listeners.forEach((handlers, event) => {\n      handlers.forEach((handler) => {\n        this.off(event, handler);\n      });\n    });\n    this.listeners.clear();\n\n    this.player.destroy();\n    this.player = null;\n  }\n\n  onTimeUpdate(callback: any) {\n    if (!this.player) return;\n\n    const handler = () => {\n      callback({\n        currentTime: this.player?.video?.currentTime ?? Number.NaN,\n        duration: this.player?.video?.duration ?? Number.NaN,\n      });\n    };\n    this.on('timeupdate', handler);\n  }\n\n  offTimeUpdate() {\n    if (!this.player) return;\n    this.off('timeupdate');\n  }\n\n  play() {\n    this.player?.play();\n  }\n\n  pause = () => {\n    this.player?.pause();\n  };\n\n  togglePlay() {\n    if (this.player) this.player.toggle();\n  }\n\n  toggleMuted() {\n    if (this.player) this.player.muted(!this.player.video.muted);\n  }\n\n  seek(time: number) {\n    if (this.player) this.player.seek(time);\n  }\n\n  switchUrl(rawOptions: Required<IMultiPlayerOptions>) {\n    if (!this.player) return;\n\n    const options = {\n      url: rawOptions.url,\n      type: ['hls', 'dash', 'flv', 'mpegts', 'torrent'].includes(rawOptions.type) ? rawOptions.type : 'normal',\n    };\n    this.player.options.pluginOptions = { headers: rawOptions.headers };\n\n    const { playbackRate } = this.player.video;\n\n    ['hls', 'flv', 'dash', 'mpegts', 'torrent'].forEach((key) => {\n      this.player?.plugins?.[key]?.destroy?.();\n      delete this.player?.plugins?.[key];\n    });\n\n    // 重要\n    this.player.switchVideo(options);\n    this.player.options.video.url = rawOptions.url;\n\n    if (this.player?.danmaku) this.player.danmaku.clear();\n    if (playbackRate !== 1) this.player.speed(playbackRate);\n\n    this.player.play();\n  }\n\n  get currentTime() {\n    return this.player?.video?.currentTime ?? Number.NaN;\n  }\n\n  get duration() {\n    return this.player?.video?.duration ?? Number.NaN;\n  }\n\n  get time() {\n    return {\n      currentTime: this.player?.video?.currentTime ?? Number.NaN,\n      duration: this.player?.video?.duration ?? Number.NaN,\n    };\n  }\n\n  get playbackRate() {\n    return this.player?.video?.playbackRate ?? 1;\n  }\n\n  set playbackRate(rate: number) {\n    if (this.player) this.player.speed(rate);\n  }\n\n  get muted() {\n    return !!this.player?.video?.muted;\n  }\n\n  set muted(state: boolean) {\n    if (this.player) this.player.muted(state);\n  }\n\n  get volume() {\n    return this.player?.volume() ?? 0;\n  }\n\n  set volume(volume: number) {\n    if (this.player) {\n      this.player.muted(!(volume > 0));\n      this.player.volume(volume, true, false);\n    }\n  }\n\n  get instance() {\n    return this.player;\n  }\n}\n\nexport default DPlayerAdapter;\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/dplayer/types.ts",
    "content": "import type DPlayer from 'dplayer';\nimport type { OptionsInternal, PluginOptions, Plugins } from 'dplayer/dist/d.ts/types';\n\nimport type { IShakaInstance } from '../../types';\n\nexport interface PlayerAdapterPluginOptions extends PluginOptions {\n  headers?: Record<string, any>;\n}\n\nexport type PlayerAdapterOptions = Omit<OptionsInternal, 'pluginOptions'> & {\n  pluginOptions: PlayerAdapterPluginOptions;\n};\n\nexport interface PlayerAdapterPlugins extends Plugins {\n  shaka?: IShakaInstance;\n  flv?: Plugins['flvjs'];\n  torrent?: Plugins['webtorrent'];\n}\n\nexport interface PlayerAdapter extends DPlayer {\n  storage?: {\n    set: (key: string, value: any) => void;\n    get: (key: string) => any;\n  };\n  options: PlayerAdapterOptions;\n  plugins: PlayerAdapterPlugins;\n}\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/dplayer/utils/index.ts",
    "content": "const uiIconHandle = {\n  /**\n   * 创建图标按钮元素\n   * @param el 目标元素选择器\n   * @param html 图标HTML字符串\n   * @param className 基础类名\n   * @param popup 可选的弹出提示文本\n   * @returns 返回一个函数，可进一步添加类名并获取按钮元素\n   */\n  create(el: string, html: string, className: string, popup: string): Element | boolean {\n    const controlSetting = document.querySelector(el);\n    if (!controlSetting) return false;\n\n    const btn = document.createElement('button');\n    btn.className = `dplayer-icon dplayer-${className}-icon`;\n    btn.setAttribute('data-balloon', className || '');\n    btn.setAttribute('data-balloon-pos', 'up');\n    btn.setAttribute('data-balloon-nofocus', '');\n    btn.setAttribute('aria-label', popup || '');\n    btn.innerHTML = `<span class=\"dplayer-icon-content\">${html}</span>`;\n\n    controlSetting.insertAdjacentElement('afterend', btn);\n\n    return controlSetting;\n  },\n\n  /**\n   * 替换目标元素中的SVG图标\n   * @param targetSelector 目标元素选择器\n   * @param html 新元素的HTML字符串\n   * @returns 是否成功替换\n   */\n  replace(targetSelector: string, html: string): boolean {\n    try {\n      const targetEl = document.querySelector(`${targetSelector} .dplayer-icon-content`);\n      if (!targetEl) return false;\n\n      targetEl.innerHTML = html;\n\n      return true;\n    } catch (error) {\n      console.error('Failed to replace icon:', error);\n      return false;\n    }\n  },\n};\n\nexport { uiIconHandle };\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/index.ts",
    "content": "import ArtPlayerAdapter from './artplayer';\nimport DPlayerAdapter from './dplayer';\nimport NPlayerAdapter from './nplayer';\nimport OPlayerAdapter from './oplayer';\nimport XgPlayerAdapter from './xgplayer';\n\nexport { ArtPlayerAdapter, DPlayerAdapter, NPlayerAdapter, OPlayerAdapter, XgPlayerAdapter };\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/nplayer/css/index.css",
    "content": "/* 图标 */\n.nplayer_icon {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.nplayer_icon svg {\n  height: 21px;\n  width: 21px;\n}\n\n/* 设置按钮 */\n.nplayer_control_setting-active {\n  background: transparent !important;\n}\n\n.nplayer_control_setting-active .nplayer_icon {\n  transform: none !important;\n}\n\n/* 播放 */\n.nplayer_poster_play {\n  position: relative !important;\n  transform: none !important;\n  left: 0 !important;\n  top: 0 !important;\n  height: 28px !important;\n  width: 28px !important;\n}\n\n/* 弹幕发送面板 */\n.nplayer_danmaku_send {\n  height: 34px;\n  border-radius: 8px;\n  opacity: 0 !important;\n  pointer-events: none !important;\n}\n\n/* 提示 面板 */\n.nplayer_tooltip_content,\n.nplayer_popover_panel {\n  background: #1f1f1fe6 !important;\n  border-radius: 8px;\n  font-weight: 700;\n  margin-bottom: 25px !important;\n  box-shadow: none !important;\n}\n\n.nplayer_popover_panel {\n  min-width: 192px;\n}\n\n/* 音量面板 */\n.nplayer_control_volume_bars {\n  background: transparent !important;\n  width: 42px;\n  padding-bottom: 25px;\n}\n\n.nplayer_control_volume_bars::before {\n  content: '';\n  position: absolute;\n  left: 0;\n  width: 100%;\n  height: calc(100% - 19px);\n  bottom: 19px;\n  border-radius: 8px;\n  background: #1f1f1fe6 !important;\n}\n\n.nplayer_control_volume_bar {\n  width: 4px !important;\n  margin: 3px auto 0;\n  border-radius: 2px;\n}\n\n/* 弹幕控制面板 */\n.nplayer_danmaku_setting {\n  border-radius: 8px !important;\n  padding: 24px 20px 10px !important;\n  background: #1f1f1fe6 !important;\n  width: 312px !important;\n}\n\n.nplayer_danmaku_row {\n  margin: 0 0 18px !important;\n}\n\n.nplayer_danmaku_reset {\n  border-width: 0 !important;\n  background-color: #47494a !important;\n  border-radius: 100px;\n  padding: 0 10px !important;\n  font-size: 12px;\n  line-height: 26px;\n}\n\n.nplayer_danmaku_setting .nplayer_checkbox::before {\n  border-radius: 8px;\n}\n\n/* 右键 */\n.nplayer_contextmenu {\n  border-radius: 8px;\n  background: #1f1f1fe6 !important;\n  color: #bbb;\n  width: 234px;\n  padding: 10px 0 !important;\n}\n\n.nplayer_contextmenu_item {\n  cursor: pointer;\n  height: 34px;\n  line-height: 34px;\n  max-width: 100%;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  padding: 0 0 0 20px !important;\n}\n\n.nplayer_contextmenu_item:hover {\n  background: #26262b !important;\n}\n\n@media not all and (hover: none) {\n  .nplayer_tooltip:hover {\n    background: transparent !important;\n  }\n}\n\n@media (any-hover: hover) {\n  .nplayer_control:hover {\n    cursor: default !important;\n    opacity: 1 !important;\n    pointer-events: auto !important;\n  }\n}\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/nplayer/index.ts",
    "content": "import './css/index.css';\n\nimport NplayerDanmaku from '@nplayer/danmaku';\nimport type { BulletOption as IBulletOption } from '@nplayer/danmaku/dist/src/ts/danmaku/bullet';\nimport { merge } from 'es-toolkit';\nimport type { PlayerOptions as IPlayerOptions } from 'nplayer';\nimport NPlayer, { EVENT, I18n, Icon } from 'nplayer';\n\nimport type { IBarrage, IBarrageSendOptions, IMultiPlayerOptions } from '../../types';\nimport { color, icons, language } from '../../utils/static';\nimport { storage, storageUtil } from '../../utils/storage';\nimport { streamDecoder } from '../../utils/stream-decoder';\nimport { publicBarrageSend } from '../../utils/tool';\nimport ZH_TW from './locales/zh-tw';\nimport { pipPlugin, playNextPlugin } from './plugins';\nimport type { PlayerAdapter } from './types';\nimport { filterControls, uiIconHandle } from './utils';\n\nIcon.register('play', uiIconHandle.create(icons.play, 'play'));\nIcon.register('pause', uiIconHandle.create(icons.pause, 'pause'));\nIcon.register('volume', uiIconHandle.create(icons.volumeLargeFill, 'volume'));\nIcon.register('muted', uiIconHandle.create(icons.volumeMutedFill, 'volumeMuted'));\nIcon.register('cog', uiIconHandle.create(icons.settingDot, 'cog'));\nIcon.register('enterFullscreen', uiIconHandle.create(icons.fullscreen, 'enterFullscreen'));\nIcon.register('exitFullscreen', uiIconHandle.create(icons.fullscreenExit, 'exitFullscreen'));\n\nI18n.add('zh-tw', ZH_TW);\n\nclass NPlayerAdapter {\n  player: PlayerAdapter | null = null;\n  listeners: Map<string, Set<(...args: any[]) => void>> = new Map();\n  options: IPlayerOptions = {\n    container: '#nplayer',\n    src: '',\n    live: false,\n    videoProps: { autoplay: 'true' },\n    volumeVertical: true,\n    i18n: 'zh-cn',\n    bpControls: {},\n    controls: [\n      ['play', playNextPlugin, 'volume', 'time', 'spacer', 'danmaku-settings', 'settings', pipPlugin, 'fullscreen'],\n      ['progress'],\n    ],\n    themeColor: color.theme,\n    progressBg: color.theme,\n    volumeProgressBg: color.theme,\n    contextMenuToggle: false,\n    plugins: [\n      new NplayerDanmaku({\n        autoInsert: true, // 自动插入控制条项\n        speed: 1, // 弹幕速度\n        duration: 5, // 弹幕持续显示时间\n        opacity: 1, // 弹幕透明度\n        fontsize: 24, // 弹幕字体大小\n        area: 0.75, // 弹幕显示区域\n        unlimited: false, // 弹幕无限弹幕模式\n      }),\n    ],\n  };\n\n  private on(event: string, handler: (...args: any[]) => void) {\n    if (!this.player) return;\n\n    let handlers = this.listeners.get(event);\n    if (!handlers) {\n      handlers = new Set();\n      this.listeners.set(event, handlers);\n    }\n\n    if (!handlers.has(handler)) {\n      handlers.add(handler);\n      this.player.on(event, handler);\n    }\n  }\n\n  private off(event: string, handler?: any) {\n    if (!this.player) return;\n\n    const handlers = this.listeners.get(event);\n    if (!handlers) return;\n\n    if (handler) {\n      if (handlers.has(handler)) {\n        this.player.off(event, handler);\n        handlers.delete(handler);\n      }\n    } else {\n      handlers.forEach((h) => this.player!.off(event, h));\n      handlers.clear();\n    }\n\n    if (handlers.size === 0) this.listeners.delete(event);\n  }\n\n  barrage(barrage: IBarrage[], id: string) {\n    if (!this.player) return;\n\n    const comments: IBulletOption[] = barrage.map((item) => ({\n      type: (['top', 'bottom'].includes(item.type) ? item.type : 'scroll') as IBulletOption['type'],\n      text: item.text,\n      time: item.time,\n      color: item.color,\n      isMe: false,\n      force: false,\n    }));\n    this.player.danmaku.resetItems(comments);\n\n    const sendHandle = (item: IBulletOption) => {\n      const options: IBarrageSendOptions = {\n        id,\n        type: (['top', 'bottom'].includes(item.type!) ? item.type : 'right') as IBarrageSendOptions['type'],\n        text: item.text,\n        time: item.time,\n        color: item.color ?? '#FFFFFF',\n      };\n      publicBarrageSend(options);\n    };\n\n    this.on('DanmakuSend', sendHandle);\n  }\n\n  create(rawOptions: Required<IMultiPlayerOptions>) {\n    storageUtil.delStartWith('nplayer:');\n\n    const options: Partial<IPlayerOptions> = {\n      container: `#${rawOptions.container}`, // 容器\n      src: rawOptions.url, // 地址\n      autoSeekTime: !rawOptions.isLive && rawOptions.startTime > 0 ? rawOptions.startTime : 0, // 起始时间\n      live: rawOptions.isLive, // 直播\n      i18n: (() => {\n        const locale = language();\n        switch (locale) {\n          case 'zh-CN':\n            return 'zh-cn';\n          case 'zh-TW':\n            return 'zh-tw';\n          default:\n            return 'en';\n        }\n      })(), // 语言\n    };\n\n    if (rawOptions.isLive) {\n      this.options.controls = [[...this!.options!.controls![0]], []];\n    } // 直播\n\n    if (!rawOptions.next) {\n      this.options.controls = [\n        [...filterControls(this!.options!.controls![0], ['playNext'])],\n        [...this!.options!.controls![1]],\n      ];\n    } // 下集\n\n    // 初始化\n    const player: PlayerAdapter = new NPlayer(merge(this.options, options));\n    player.storage = storage;\n\n    // 倍速\n    // @ts-expect-error ts-migate(2341) 属性“settingNamedMap”为私有属性，只能在类“Player”中访问。\n    player.settingNamedMap.speed.options = [\n      { value: 0.5, html: '0.5' },\n      { value: 0.75, html: '0.75' },\n      { value: 1, html: I18n.t('Normal') },\n      { value: 1.25, html: '1.25' },\n      { value: 1.5, html: '1.5' },\n      { value: 2, html: '2' },\n    ];\n\n    const steamOptions = {\n      isLive: rawOptions.isLive,\n      autoplay: rawOptions.autoplay,\n      headers: rawOptions.headers,\n    };\n    // 解码器\n    const type = ['hls', 'dash', 'flv', 'mpegts', 'torrent'].includes(rawOptions.type) ? rawOptions.type : 'auto';\n    switch (type) {\n      case 'hls': {\n        if (player.hls) player.hls.destroy();\n        const hls = streamDecoder.customHls(player.video, rawOptions.url, steamOptions);\n        player.hls = hls!;\n        player.on('destroy', () => hls?.destroy());\n        break;\n      }\n      case 'flv': {\n        if (player.flv) player.flv.destroy();\n        const flv = streamDecoder.customFlv(player.video, rawOptions.url, steamOptions);\n        player.flv = flv;\n        player.on('destroy', () => flv?.destroy());\n        break;\n      }\n      case 'dash': {\n        if (player.dash) player.dash.destroy();\n        const dash = streamDecoder.customDash(player.video, rawOptions.url, steamOptions);\n        player.dash = dash;\n        player.on('destroy', () => dash?.destroy());\n        break;\n      }\n      case 'mpegts': {\n        if (player.mpegts) player.mpegts.destroy();\n        const mpegts = streamDecoder.customMpegts(player.video, rawOptions.url, steamOptions);\n        player.mpegts = mpegts;\n        player.on('destroy', () => mpegts?.destroy());\n        break;\n      }\n      case 'torrent': {\n        if (player.torrent) player.torrent.destroy();\n        const torrent = streamDecoder.customTorrent(player.video, rawOptions.url, steamOptions);\n        player.torrent = torrent;\n        player.on('destroy', () => torrent?.destroy());\n        break;\n      }\n      default:\n        break;\n    } // 解码器\n\n    player.mount(); // 挂载\n    this.player = player; // 赋值实例\n\n    if (!rawOptions.isLive) {\n      player.playbackRate = ((v) => (Number.isNaN(v) ? 1 : v))(Number(storage?.get('playrate')));\n      // @ts-expect-error ts-migate(2341) 属性“settingNamedMap”为只读属性\n      player.settingNamedMap.speed.value = player.playbackRate; // 用于 ui 渲染\n    }\n\n    player.volume = ((v) => (Number.isNaN(v) ? 1 : v))(Number(storage?.get('volume')));\n    // @ts-expect-error ts-migate(2341) 属性“prevVolume”为只读属性\n    player.prevVolume = player.volume; // 重要, 不然静音->恢复音量会 直接从 0->1\n    player.muted = !!storage?.get('muted');\n\n    setTimeout(() => {\n      uiIconHandle.replace('.nplayer_control_setting', icons.danmu, 'danmu');\n    }, 0); // 图标替换\n\n    this.on(EVENT.RATE_CHANGE, () => player.storage?.set('playrate', player.playbackRate));\n    this.on(EVENT.VOLUME_CHANGE, () => {\n      player.storage?.set('volume', player.volume);\n      player.storage?.set('muted', player.muted);\n    });\n\n    return player;\n  }\n\n  destroy() {\n    if (!this.player) return;\n\n    this.listeners.forEach((handlers, event) => {\n      handlers.forEach((handler) => {\n        this.off(event, handler);\n      });\n    });\n    this.listeners.clear();\n\n    this.player.dispose();\n    this.player = null;\n  }\n\n  onTimeUpdate(callback: any) {\n    if (!this.player) return;\n\n    const handler = () => {\n      callback({\n        currentTime: this.player?.currentTime ?? Number.NaN,\n        duration: this.player?.duration ?? Number.NaN,\n      });\n    };\n    this.on(EVENT.TIME_UPDATE, handler);\n  }\n\n  offTimeUpdate() {\n    if (!this.player) return;\n    this.off(EVENT.TIME_UPDATE);\n  }\n\n  play() {\n    this.player?.play();\n  }\n\n  pause() {\n    this.player?.pause();\n  }\n\n  togglePlay() {\n    this.player?.toggle();\n  }\n\n  toggleMuted() {\n    if (this.player) {\n      this.player.muted = !this.player.muted;\n    }\n  }\n\n  seek(time: number) {\n    if (this.player) this.player.seek(time);\n  }\n\n  switchUrl(rawOptions: Required<IMultiPlayerOptions>) {\n    if (!this.player) return;\n\n    const steamOptions: Record<string, any> = {\n      isLive: rawOptions.isLive,\n      autoplay: rawOptions.autoplay,\n      headers: rawOptions.headers,\n    };\n\n    ['hls', 'flv', 'dash', 'mpegts', 'torrent'].forEach((key) => {\n      this.player?.[key]?.destroy?.();\n      delete this.player?.[key]; // imporant\n    });\n\n    const type = ['hls', 'dash', 'flv', 'mpegts', 'torrent'].includes(rawOptions.type) ? rawOptions.type : 'auto';\n    switch (type) {\n      case 'hls':\n        this.player!.hls = streamDecoder.customHls(this.player!.video, rawOptions.url, steamOptions);\n        break;\n      case 'flv':\n        this.player!.flv = streamDecoder.customFlv(this.player!.video, rawOptions.url, steamOptions);\n        break;\n      case 'dash':\n        this.player!.dash = streamDecoder.customDash(this.player!.video, rawOptions.url, steamOptions);\n        break;\n      case 'mpegts':\n        this.player!.mpegts = streamDecoder.customMpegts(this.player!.video, rawOptions.url, steamOptions);\n        break;\n      case 'torrent':\n        this.player!.torrent = streamDecoder.customTorrent(this.player!.video, rawOptions.url, steamOptions);\n        break;\n      default:\n        this.player!.video.src = rawOptions.url;\n        break;\n    }\n\n    this.player.play();\n\n    if (this.player?.danmaku) this.player.danmaku.clearScreen();\n  }\n\n  get currentTime() {\n    return this.player?.currentTime ?? Number.NaN;\n  }\n\n  get duration() {\n    return this.player?.duration ?? Number.NaN;\n  }\n\n  get time() {\n    return {\n      currentTime: this.player?.currentTime ?? Number.NaN,\n      duration: this.player?.duration ?? Number.NaN,\n    };\n  }\n\n  get playbackRate() {\n    return this.player?.playbackRate ?? 1;\n  }\n\n  set playbackRate(rate: number) {\n    if (this.player) {\n      this.player.playbackRate = rate;\n      // @ts-expect-error ts-migate(2341) 属性“settingNamedMap”为只读属性\n      this.player.settingNamedMap.speed.value = rate;\n    }\n  }\n\n  get muted() {\n    return !!this.player?.muted;\n  }\n\n  set muted(state: boolean) {\n    if (this.player) this.player.muted = state;\n  }\n\n  get volume() {\n    return this.player?.volume ?? 0;\n  }\n\n  set volume(volume: number) {\n    if (!this.player) return;\n\n    if (this.player) {\n      if (volume > 0) this.player.muted = false;\n      this.player.volume = volume;\n    }\n  }\n\n  get instance() {\n    return this.player;\n  }\n}\n\nexport default NPlayerAdapter;\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/nplayer/locales/zh-tw.ts",
    "content": "const lang = {\n  Fullscreen: '全屏',\n  'Exit fullscreen': '取消全屏',\n  'Web fullscreen': '網頁全屏',\n  'Exit web fullscreen': '退出網頁全屏',\n  Settings: '設置',\n  Play: '播放',\n  Pause: '暫停',\n  Mute: '靜音',\n  Unmute: '取消靜音',\n  Normal: '正常',\n  Speed: '播放速度',\n  'Picture in Picture': '畫中畫',\n  Loop: '循環播放',\n  Volume: '音量',\n  Airplay: '隔空播放',\n  Live: '直播',\n\n  'Send settings': '發送設置',\n  Send: '發送',\n  Mode: '模式',\n  Scroll: '滾動',\n  Top: '頂部',\n  Bottom: '底部',\n  Color: '顏色',\n  Colour: '彩色',\n  'Danmaku settings': '彈幕設置',\n  'On/Off': '開/關',\n  'Restore settings': '恢復默認設置',\n  'Block by type': '按類型屏蔽',\n  'Opacity &nbsp;': '不透明度',\n  'Area &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;': '顯示區域',\n  Half: '半屏',\n  Full: '全屏',\n  'Speed &nbsp;&nbsp;&nbsp;': '彈幕速度',\n  Slow: '慢',\n  Fast: '快',\n  'Font size': '字體大小',\n  Small: '小',\n  Big: '大',\n  Unlimited: '不限彈幕',\n  'Bottom to top': '從下到上',\n};\n\nexport default lang;\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/nplayer/plugins/index.ts",
    "content": "import pipPlugin from './pip';\nimport playNextPlugin from './playNext';\n\nexport { pipPlugin, playNextPlugin };\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/nplayer/plugins/pip.ts",
    "content": "import type NPlayer from 'nplayer';\nimport { I18n } from 'nplayer';\n\nimport { icons } from '../../../utils/static';\n\nconst pipPlugin = {\n  el: document.createElement('div'),\n  id: 'pip',\n  tooltip: '',\n  isSupport: () => true,\n  handle() {},\n  updateI18n() {\n    I18n.add('zh-tw', {\n      PIP: '畫中畫',\n    });\n    I18n.add('zh-cn', {\n      PIP: '画中画',\n    });\n    I18n.add('en', {\n      PIP: 'PIP',\n    });\n  },\n  init(player: NPlayer, _: any, tooltip: string) {\n    this.updateI18n();\n\n    this.el.id = 'pip';\n    const pipDom = document.createElement('div');\n    pipDom.className = 'nplayer_icon';\n    pipDom.innerHTML = icons.pip;\n\n    this.tooltip = tooltip;\n    (this.tooltip as any).html = I18n.t('PIP');\n    this.el.append(pipDom);\n\n    this.handle = () => {\n      if (!player.loaded) return;\n      if ((document as any).pictureInPictureElement !== player.video) {\n        (player.video as any).requestPictureInPicture();\n      } else {\n        (document as any).exitPictureInPicture();\n      }\n    };\n\n    this.el.addEventListener('click', this.handle);\n  },\n  dispose() {\n    this.el.removeEventListener('click', this.handle);\n    this.el?.remove();\n  },\n};\n\nexport default pipPlugin;\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/nplayer/plugins/playNext.ts",
    "content": "import type NPlayer from 'nplayer';\nimport { I18n } from 'nplayer';\n\nimport { emitterChannel } from '@/config/emitterChannel';\nimport emitter from '@/utils/emitter';\n\nimport { icons } from '../../../utils/static';\n\nconst playNextPlugin = {\n  el: document.createElement('div'),\n  id: 'playNext',\n  tooltip: '',\n  isSupport: () => true,\n  handle() {},\n  updateI18n() {\n    I18n.add('zh-tw', {\n      playNext: '下集',\n    });\n    I18n.add('zh-cn', {\n      playNext: '下集',\n    });\n    I18n.add('en', {\n      playNext: 'Play Next',\n    });\n  },\n  init(player: NPlayer, _: any, tooltip: string) {\n    this.updateI18n();\n\n    this.el.id = 'playNext';\n    const pipDom = document.createElement('div');\n    pipDom.className = 'nplayer_icon';\n    pipDom.innerHTML = icons.mnext;\n\n    this.tooltip = tooltip;\n    (this.tooltip as any).html = I18n.t('playNext');\n    this.el.append(pipDom);\n\n    this.handle = () => {\n      if (!player.loaded) return;\n      emitter.emit(emitterChannel.COMP_MULTI_PLAYER_PLAYNEXT, {});\n    };\n\n    this.el.addEventListener('click', this.handle);\n  },\n  dispose() {\n    this.el.removeEventListener('click', this.handle);\n    this.el?.remove();\n  },\n};\n\nexport default playNextPlugin;\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/nplayer/types.ts",
    "content": "import type NPlayer from 'nplayer';\n\nimport type {\n  IDashInstance,\n  IFlvInstance,\n  IHlsInstance,\n  IMpegtsInstance,\n  IShakaInstance,\n  ITorrentInstance,\n} from '../../types';\n\nexport interface PlayerAdapter extends NPlayer {\n  storage?: {\n    set: (key: string, value: any) => void;\n    get: (key: string) => any;\n  };\n  hls?: IHlsInstance;\n  flv?: IFlvInstance;\n  shaka?: IShakaInstance;\n  mpegts?: IMpegtsInstance;\n  dash?: IDashInstance;\n  torrent?: ITorrentInstance;\n}\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/nplayer/utils/index.ts",
    "content": "import type { ControlItem as IControlItem } from 'nplayer';\n\nconst uiIconHandle = {\n  /**\n   * 创建图标元素\n   * @param html 图标HTML字符串\n   * @param className 是否不添加默认类名\n   * @returns 返回一个函数，可进一步添加类名并获取元素\n   */\n  create(html: string, className?: string): (cls?: string) => HTMLDivElement {\n    const div = document.createElement('div');\n    const classes = ['nplayer_icon'];\n\n    if (className) {\n      classes.push(`nplayer_${className}_icon`);\n      div.id = className;\n    }\n\n    div.className = classes.join(' ');\n    div.innerHTML = html;\n\n    return () => {\n      return div;\n    };\n  },\n\n  /**\n   * 替换目标元素中的SVG图标\n   * @param targetSelector 目标元素选择器\n   * @param html 新元素的HTML字符串\n   * @param className 新元素的类名\n   * @returns 是否成功替换\n   */\n  replace(targetSelector: string, html: string, className?: string): boolean {\n    try {\n      const targetElement = document.querySelector(targetSelector);\n      if (!targetElement) return false;\n\n      const prevElement = targetElement.previousElementSibling;\n      if (!prevElement) return false;\n\n      const iconElement = prevElement.querySelector('.nplayer_icon');\n      if (!iconElement) return false;\n\n      const newIconElement = document.createElement('div');\n      const classes = ['nplayer_icon'];\n\n      if (className) {\n        classes.push(`nplayer_${className}_icon`);\n        newIconElement.id = className;\n      }\n\n      newIconElement.className = classes.join(' ');\n      newIconElement.innerHTML = html;\n\n      iconElement.replaceWith(newIconElement);\n\n      return true;\n    } catch (error) {\n      console.error('[uiIconHandle][replace]', error);\n      return false;\n    }\n  },\n};\n\n/**\n * 过滤控制项数组，移除指定的控制项\n * @param data 原始控制项数组，可以是字符串或包含id属性的对象\n * @param filter 需要过滤的控制项ID数组\n * @returns 过滤后的新数组（不修改原数组）\n */\nconst filterControls = (data: (IControlItem | string)[], filter: string[]): (IControlItem | string)[] => {\n  // 无过滤条件时直接返回原数组的浅拷贝\n  if (!filter.length) return [...(data || [])];\n\n  return [...(data || [])].filter((item) => {\n    const itemId = typeof item === 'string' ? item : (item as unknown as IControlItem).id;\n    return !filter.includes(itemId);\n  });\n};\n\nexport { filterControls, uiIconHandle };\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/oplayer/css/index.css",
    "content": "/* 控制条 */\n.css-f4aimg {\n  padding: 5px 0 !important;\n}\n\n/* 设置面板 */\n.css-1y41a61 {\n  border-radius: 8px !important;\n  background: #1f1f1fe6 !important;\n  margin-bottom: 20px;\n}\n\n/* 提示 */\n.css-181s0gc::after {\n  border-radius: 8px !important;\n  bottom: calc(100% + 22px) !important;\n  background: #1f1f1fe6 !important;\n}\n\n/* 音量面板 */\n.css-fy6n4p {\n  padding-bottom: 20px;\n  background-color: transparent !important;\n  border-radius: 8px !important;\n}\n\n.css-fy6n4p .css-1y9tj12,\n.css-fy6n4p .css-fy6n4p {\n  background: #1f1f1fe6 !important;\n  border-radius: 8px !important;\n}\n\n.css-1fdetu4 {\n  position: relative;\n}\n\n/* 画质面板 */\n.css-fy6n4p::before {\n  content: '';\n  position: absolute;\n  width: 100%;\n  height: calc(100% - 19px);\n  bottom: 19px;\n  left: 0;\n  border-radius: 8px;\n  background-color: #1f1f1fe6 !important;\n}\n\n.css-fy6n4p .css-1cm6xxk {\n  position: relative;\n}\n\n/* 弹幕 */\n.css-xpnf3v {\n  display: flex;\n  margin: 0 10px;\n}\n\n/* 弹幕面板 */\n.css-12rog9r {\n  padding: 0 0 20px !important;\n  background-color: transparent !important;\n  border-radius: 8px !important;\n}\n\n.css-12rog9r::before {\n  content: '';\n  position: absolute;\n  width: 100%;\n  height: calc(100% - 19px);\n  bottom: 19px;\n  left: 0;\n  border-radius: 8px;\n  background-color: #1f1f1fe6 !important;\n}\n\n.css-12rog9r .css-17upkjl {\n  position: relative;\n}\n\n/* button */\n.css-165g1ze .css-rte19r {\n  margin-right: 16px !important;\n}\n\n.css-165g1ze .css-rte19r:has(svg) {\n  width: 21px !important;\n  height: 21px !important;\n}\n\n.css-165g1ze .css-qyn9ru:has([aria-label='Torrent']) {\n  display: none;\n}\n\n.css-76twjl > .css-rte19r:last-child {\n  margin-right: 0 !important;\n}\n\n.css-165g1ze .css-rte19r:hover {\n  background-color: transparent !important;\n}\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/oplayer/index.ts",
    "content": "import './css/index.css';\n\nimport type { PlayerOptions as IPlayerOptions } from '@oplayer/core';\nimport OPlayer from '@oplayer/core';\nimport type { Comment as IComment } from '@oplayer/danmaku';\nimport ODanmaku from '@oplayer/danmaku';\nimport ODash from '@oplayer/dash';\nimport OHls from '@oplayer/hls';\nimport OMpegts from '@oplayer/mpegts';\n// import OShaka from '@oplayer/shaka';\n// import { ad, AirPlay, Chromecast, Playlist, vttThumbnails } from '@oplayer/plugins';\nimport OTorrent from '@oplayer/torrent';\nimport type { UiConfig as IUiConfig } from '@oplayer/ui';\nimport OUI from '@oplayer/ui';\nimport { merge } from 'es-toolkit';\n\nimport { emitterChannel } from '@/config/emitterChannel';\nimport emitter from '@/utils/emitter';\n\nimport WebTorrentjs from '../../modules/webtorrent.min.js';\nimport type { IBarrage, IBarrageSendOptions, IMultiPlayerOptions } from '../../types';\nimport { color, icons, language } from '../../utils/static';\nimport { storage } from '../../utils/storage';\nimport { streamConfig } from '../../utils/stream-decoder';\nimport { publicBarrageSend } from '../../utils/tool';\nimport ZH_TW from './locales/zh-tw';\nimport type { PlayerAdapter } from './types';\n\nclass OPlayerAdapter {\n  player: PlayerAdapter | null = null;\n  listeners: Map<string, Set<(...args: any[]) => void>> = new Map();\n  options: { [key: string]: any } = {\n    conf: {\n      source: {\n        src: '',\n        format: 'auto',\n      },\n      autoplay: true,\n      isLive: false,\n      lang: 'zh-CN',\n    },\n    ui: {\n      theme: {\n        primaryColor: color.theme,\n        controller: {\n          slideToSeek: 'always',\n          coverButton: false,\n        },\n      },\n      speeds: ['2.0', '1.5', '1.25', '1.0', '0.75', '0.5'],\n      keyboard: { global: true },\n      pictureInPicture: true,\n      fullscreen: true,\n      icons: {\n        volume: [icons.volumeLarge, icons.volumeMuted],\n        pip: [icons.pipEnter, icons.pipExit],\n        setting: icons.settingDot,\n        fullscreen: [icons.fullscreenEnter, icons.fullscreenExit],\n        play: icons.play,\n        pause: icons.pause,\n        danmaku: icons.danmaku,\n      },\n    },\n  };\n\n  private on(event: string, handler: (...args: any[]) => void) {\n    if (!this.player) return;\n\n    let handlers = this.listeners.get(event);\n    if (!handlers) {\n      handlers = new Set();\n      this.listeners.set(event, handlers);\n    }\n\n    if (!handlers.has(handler)) {\n      handlers.add(handler);\n      this.player.on(event, handler);\n    }\n  }\n\n  private off(event: string, handler?: any) {\n    if (!this.player) return;\n\n    const handlers = this.listeners.get(event);\n    if (!handlers) return;\n\n    if (handler) {\n      if (handlers.has(handler)) {\n        this.player.off(event, handler);\n        handlers.delete(handler);\n      }\n    } else {\n      handlers.forEach((h) => this.player!.off(event, h));\n      handlers.clear();\n    }\n\n    if (handlers.size === 0) this.listeners.delete(event);\n  }\n\n  barrage(barrage: IBarrage[], id: string) {\n    if (!this.player) return;\n\n    const comments: IComment[] = barrage.map((item) => ({\n      mode: (['top', 'bottom'].includes(item.type)\n        ? item.type\n        : item.type === 'right'\n          ? 'rtl'\n          : 'ltr') as IComment['mode'],\n      text: item.text,\n      time: item.time,\n      style: {\n        color: item.color,\n        fontSize: '24px',\n      },\n    }));\n    this.player.context.danmaku.changeSource(comments);\n\n    const sendHandle = (item: Required<IComment>) => {\n      const options: IBarrageSendOptions = {\n        id,\n        type: (['top', 'bottom'].includes(item.mode!)\n          ? item.mode\n          : item.mode === 'rtl'\n            ? 'right'\n            : 'left') as IBarrageSendOptions['type'],\n        text: item.text,\n        time: item.time,\n        color: (item.style! as CSSStyleDeclaration)?.color ?? '#FFFFFF',\n      };\n      publicBarrageSend(options);\n    };\n    this.player.context.danmaku.options.onEmit = (comment: IComment) => sendHandle(comment as Required<IComment>);\n  }\n\n  create(rawOptions: Required<IMultiPlayerOptions>) {\n    const uiOptions: Partial<IUiConfig> = {\n      icons: {\n        next: rawOptions.next ? icons.mnext : undefined,\n      },\n      menu:\n        rawOptions.quality.length === 0\n          ? []\n          : [\n              {\n                name: (() => {\n                  const locale = language();\n                  switch (locale) {\n                    case 'zh-CN':\n                      return '清晰度';\n                    case 'zh-TW':\n                      return '清晰度';\n                    default:\n                      return 'Quality';\n                  }\n                })(),\n                // key: 'Quality',\n                position: 'bottom',\n                children: rawOptions.quality.map((q, i) => {\n                  return { name: q.name, value: q.url, default: i === 0 };\n                }),\n                onChange({ value }) {\n                  player.changeQuality({ src: value });\n                },\n              },\n            ],\n    };\n\n    const coreOptions: Partial<IPlayerOptions> = {\n      source: {\n        src: rawOptions.url,\n        format: ['hls', 'dash', 'flv', 'mpegts', 'torrent'].includes(rawOptions.type) ? rawOptions.type : 'auto', // 解码器\n      },\n      isLive: rawOptions.isLive, // 直播\n      volume: ((v) => (Number.isNaN(v) ? 1 : v))(Number(storage?.get('volume'))), // 音量\n      muted: !!storage?.get('muted'),\n      playbackRate: ((v) => (Number.isNaN(v) ? 1 : v))(Number(storage?.get('playrate'))), // 倍速\n      lang: (() => {\n        const locale = language();\n        switch (locale) {\n          case 'zh-CN':\n            return 'zh-CN';\n          case 'zh-TW':\n            return 'zh';\n          default:\n            return 'en';\n        }\n      })(), // 语言\n    };\n\n    const plugins = [\n      {\n        key: 'next',\n        name: 'oplayer-plugin-next',\n        apply(player: OPlayer) {\n          player.locales.update({\n            'zh-CN': {\n              Next: '下集',\n              Heatmap: '热力图',\n            },\n            'zh-TW': ZH_TW,\n          } as any);\n          player.on(['next'], () => {\n            emitter.emit(emitterChannel.COMP_MULTI_PLAYER_PLAYNEXT, {});\n          });\n          return player;\n        },\n      },\n      OUI(merge(this.options.ui, uiOptions)),\n      new ODanmaku({\n        speed: 144,\n        opacity: 1,\n        area: 0.7,\n        fontSize: 1,\n        enable: true,\n        displaySender: false,\n        heatmap: false,\n        source: [],\n      }),\n      OHls({ config: { ...streamConfig.hls(rawOptions.headers) } }),\n      ODash({ config: { streaming: { ...streamConfig.dash.stream(rawOptions.headers) } } }),\n      OMpegts({ config: { ...streamConfig.mpegts.optional(rawOptions.headers) } }),\n      // OShaka({ config: { ...streamConfig.shaka(rawOptions.headers) } }),\n      OTorrent({ library: WebTorrentjs, config: { ...streamConfig.torrent(rawOptions.headers) } }),\n    ];\n\n    // 初始化\n    const player: PlayerAdapter = OPlayer.make(`#${rawOptions.container}`, merge(this.options.conf, coreOptions))\n      .use(plugins)\n      .create();\n\n    player.storage = storage;\n    this.player = player; // 赋值实例\n\n    player.once('canplay', () => {\n      !rawOptions.isLive && rawOptions.startTime > 0 && player.seek(rawOptions.startTime); // 开始时间\n    });\n\n    this.on('ratechange', () => {\n      if (!player.isSourceChanging) player.storage?.set('playrate', player.playbackRate);\n    });\n    this.on('volumechange', () => {\n      player.storage?.set('volume', player.volume);\n      player.storage?.set('muted', player.isMuted);\n    });\n\n    return player;\n  }\n\n  destroy() {\n    if (!this.player) return;\n\n    this.listeners.forEach((handlers, event) => {\n      handlers.forEach((handler) => {\n        this.off(event, handler);\n      });\n    });\n    this.listeners.clear();\n\n    this.player.destroy();\n    this.player = null;\n  }\n\n  onTimeUpdate(callback: any) {\n    if (!this.player) return;\n\n    const handler = () => {\n      callback({\n        currentTime: this.player?.currentTime ?? Number.NaN,\n        duration: this.player?.duration ?? Number.NaN,\n      });\n    };\n    this.on('timeupdate', handler);\n  }\n\n  offTimeUpdate() {\n    if (!this.player) return;\n    this.off('timeupdate');\n  }\n\n  play() {\n    this.player?.play();\n  }\n\n  pause() {\n    this.player?.pause();\n  }\n\n  togglePlay() {\n    if (this.player) this.player.togglePlay();\n  }\n\n  toggleMuted() {\n    if (this.player) this.player.toggleMute();\n  }\n\n  seek(time: number) {\n    if (this.player) this.player.seek(time);\n  }\n\n  switchUrl(rawOptions: Required<IMultiPlayerOptions>) {\n    if (!this.player) return;\n\n    const type = ['hls', 'dash', 'flv', 'mpegts', 'torrent'].includes(rawOptions.type) ? rawOptions.type : 'auto'; // 解码器\n    const options = { src: rawOptions.url, format: type };\n    this.player.changeSource(options, true);\n\n    if (this.player?.context?.danmaku) this.player.context.danmaku.changeSource([]);\n  }\n\n  get currentTime() {\n    return this.player?.currentTime ?? Number.NaN;\n  }\n\n  get duration() {\n    return this.player?.duration ?? Number.NaN;\n  }\n\n  get time() {\n    return {\n      currentTime: this.player?.currentTime ?? Number.NaN,\n      duration: this.player?.duration ?? Number.NaN,\n    };\n  }\n\n  get playbackRate() {\n    return this.player?.playbackRate ?? 1;\n  }\n\n  set playbackRate(rate: number) {\n    if (this.player) this.player.setPlaybackRate(rate);\n  }\n\n  get muted() {\n    return !!this.player?.isMuted;\n  }\n\n  set muted(state: boolean) {\n    if (this.player) {\n      if (state) this.player.mute();\n      else this.player.unmute();\n    }\n  }\n\n  get volume() {\n    return this.player?.volume ?? 0;\n  }\n\n  set volume(volume: number) {\n    if (this.player) {\n      if (volume > 0) this.player.unmute();\n      this.player.setVolume(volume);\n    }\n  }\n\n  get instance() {\n    return this.player;\n  }\n}\n\nexport default OPlayerAdapter;\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/oplayer/locales/zh-tw.ts",
    "content": "const lang = {\n  Play: '播放',\n  Pause: '暫停',\n  Next: '下集',\n  Loop: '循環播放',\n  Volume: '音量',\n  'Volume: %s': '音量：%s',\n  Mute: '靜音',\n  Speed: '播放速度',\n  Live: '直播',\n  'Back to Live': '回到直播',\n\n  Language: '語言',\n  Screenshot: '截圖',\n  Subtitle: '字幕',\n  Quality: '畫質',\n  Fullscreen: '全屏',\n  Settings: '設置',\n  'Picture in Picture': '畫中畫',\n\n  Danmaku: '彈幕',\n  Display: '顯示',\n  Opacity: '透明度',\n  FontSize: '字體大小',\n  'Display Area': '顯示區域',\n  Heatmap: '热力图',\n\n  Off: '關閉',\n  Auto: '自動',\n  Default: '默認',\n  Normal: '正常',\n\n  '%ss': '%s秒',\n  Close: '關閉',\n  'Can be closed after %ss': '%s秒後可關閉廣告',\n};\n\nexport default lang;\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/oplayer/types.ts",
    "content": "import type { Player } from '@oplayer/core';\n\nexport interface PlayerAdapter extends Player {\n  storage?: {\n    set: (key: string, value: any) => void;\n    get: (key: string) => any;\n  };\n}\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/xgplayer/css/index.css",
    "content": "/* 进度条按钮 */\n.xgplayer .xgplayer-progress-btn {\n  box-shadow: none !important;\n  background: transparent !important;\n}\n\n/* 文本按钮 */\n.xgplayer .btn-text span {\n  color: #fff;\n  font-size: 14px;\n  font-weight: 500;\n  background-color: transparent !important;\n  border: none;\n  border-radius: 0;\n  min-width: unset !important;\n}\n\n/* 提示 */\n.xgplayer xg-icon .xg-tips {\n  top: -46px;\n}\n\n.xgplayer .xg-tips {\n  border-radius: 8px;\n  background: #1f1f1fe6;\n}\n\n/* 面板 */\n.xgplayer-pc .xg-options-list {\n  color: #fff !important;\n  font-size: 14px;\n  width: 78px;\n  padding-bottom: 20px;\n  background-color: transparent !important;\n}\n\n.xgplayer-pc .xg-options-list::after {\n  content: '';\n  position: absolute;\n  bottom: 20px;\n  left: 0;\n  width: 100%;\n  height: calc(100% - 20px);\n  background: #1f1f1fe6;\n  border-radius: 8px;\n  z-index: -1;\n}\n\n.xgplayer-pc .xg-options-list .option-item {\n  height: 34px !important;\n  padding: 0 !important;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  color: #fff !important;\n}\n\n.xgplayer-pc .xg-options-list .option-item:first-child {\n  margin-top: 0 !important;\n  border-top-left-radius: 8px;\n  border-top-right-radius: 8px;\n}\n\n.xgplayer-pc .xg-options-list .option-item:last-child {\n  margin-bottom: 0 !important;\n  border-bottom-left-radius: 8px;\n  border-bottom-right-radius: 8px;\n}\n\n.xgplayer .xg-options-list li:hover,\n.xgplayer .xg-options-list li.selected {\n  color: #00c452 !important;\n}\n\n.xgplayer-pc .xg-options-list .option-item.selected {\n  color: #00c452 !important;\n}\n\n.xgplayer-pc .xg-options-list .option-item:hover {\n  background-color: #26262b;\n}\n\n/* 音量面板 */\n.xgplayer-pc .xgplayer-volume xg-slider.xgplayer-slider {\n  border-radius: 0 0 8px 8px;\n  width: 63px;\n  height: 125px;\n  left: 50%;\n  transform: translate(-50%);\n  background: #1f1f1fe6;\n  bottom: 60px;\n}\n\n.xgplayer-pc .xgplayer-volume xg-slider.xgplayer-slider .xgplayer-bar {\n  left: 30px;\n  bottom: 12px;\n  height: 98px;\n  transform: none;\n  top: auto;\n}\n\n.xgplayer-pc .xgplayer-volume xg-slider.xgplayer-slider .xgplayer-drag {\n  max-height: 98px;\n}\n\n.xgplayer .xgplayer-value-label {\n  border-radius: 8px 8px 0 0;\n  background: #1f1f1fe6;\n  padding: 4px 0 0;\n}\n\n/* 弹幕面板 */\n.xgplayer .xgplayer-panel {\n  display: none !important;\n}\n\n.xgplayer .xgplayer-panel-slider {\n  padding: 16px;\n  height: auto;\n  width: auto;\n}\n\n.xgplayer-pc .xgplayer-panel-slider {\n  border-radius: 8px;\n  background: #1f1f1fe6;\n  width: 340px;\n  left: calc(-200px + 50%);\n  padding-bottom: 20px;\n  background-color: transparent !important;\n}\n\n.xgplayer-pc .xgplayer-panel-slider::after {\n  content: '';\n  position: absolute;\n  bottom: 20px;\n  left: 0;\n  width: 100%;\n  height: calc(100% - 20px);\n  background: #1f1f1fe6;\n  border-radius: 8px;\n  z-index: -1;\n}\n\n.xgplayer .xgplayer-panel-slider .xgplayer-hidemode-radio li {\n  border-radius: 16px;\n  background: #26262b;\n  display: inline-block;\n  padding: 2px 4px;\n  width: 60px;\n  text-align: center;\n}\n\n.xgplayer .xgplayer-panel-slider .xgplayer-transparency,\n.xgplayer .xgplayer-panel-slider .xgplayer-showarea,\n.xgplayer .xgplayer-panel-slider .xgplayer-danmuspeed,\n.xgplayer .xgplayer-panel-slider .xgplayer-danmufont {\n  padding: 8px 0;\n  position: relative;\n  display: flex !important;\n  font-size: 12px;\n  align-items: center;\n  justify-content: space-between;\n}\n\n.xgplayer .xgplayer-panel-slider .xgplayer-transparency span {\n  text-align: left;\n  flex: 0 0 80px;\n  display: block;\n  top: 0;\n}\n\n.xgplayer .xgplayer-panel-slider .xgplayer-transparency input {\n  flex: 1;\n  width: 100%;\n}\n\n.xgplayer .xgplayer-panel-slider .xgplayer-showarea-name,\n.xgplayer .xgplayer-panel-slider .xgplayer-danmuspeed-name,\n.xgplayer .xgplayer-panel-slider .xgplayer-danmufont-name {\n  text-align: left;\n  flex: 0 0 80px;\n  display: block;\n  top: 0;\n}\n\n.xgplayer .xgplayer-panel-slider .xgplayer-showarea-control,\n.xgplayer .xgplayer-panel-slider .xgplayer-danmuspeed-control,\n.xgplayer .xgplayer-panel-slider .xgplayer-danmufont-control {\n  flex: 1;\n  align-items: center;\n}\n\n.xgplayer .xgplayer-panel-slider .xgplayer-showarea-control-down-dots,\n.xgplayer .xgplayer-panel-slider .xgplayer-danmuspeed-control-down-dots,\n.xgplayer .xgplayer-panel-slider .xgplayer-danmufont-control-down-dots {\n  width: 100%;\n  margin-left: 0;\n}\n\n.xgplayer .xgplayer-panel-slider .xgplayer-showarea-control-up,\n.xgplayer .xgplayer-panel-slider .xgplayer-danmuspeed-control-up,\n.xgplayer .xgplayer-panel-slider .xgplayer-danmufont-control-up {\n  width: 100%;\n  margin-left: 0;\n}\n\n.xgplayer .xgplayer-panel-slider .xgplayer-showarea .xgplayer-showarea-line,\n.xgplayer .xgplayer-panel-slider .xgplayer-danmuspeed .xgplayer-danmuspeed-line,\n.xgplayer .xgplayer-panel-slider .xgplayer-danmufont .xgplayer-danmufont-line {\n  width: 100%;\n  margin-left: 0;\n}\n\n.xgplayer .xgplayer-danmu {\n  height: 100%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  position: relative;\n  margin-right: 16px !important;\n}\n\n.xgplayer .xgplayer-danmu .icon-warp {\n  height: 100%;\n  display: flex;\n  align-items: center;\n}\n\n.xgplayer .xgplayer-danmu .tips-wrap {\n  position: absolute;\n  bottom: 44px;\n  background: rgb(0 0 0 / 54%);\n  font-size: 11px;\n  color: #fff;\n  padding: 4px 6px;\n  border-radius: 4px;\n  text-align: center;\n  opacity: 0.85;\n  white-space: nowrap;\n  display: none;\n}\n\n.xgplayer .panel-normal .panel-box {\n  color: #fff;\n}\n\n.xgplayer .panel-normal .panel-box .xg-player-slider {\n  padding: 8px 0;\n}\n\n.xgplayer .panel-inner .panel-box {\n  color: #fff;\n}\n\n.xgplayer .panel-inner .panel-box .xg-player-slider {\n  padding: 4px 0;\n}\n\n.xgplayer .panel-fullscreen .panel-box {\n  color: #fff;\n}\n\n.xgplayer .panel-fullscreen .panel-box .xg-player-slider {\n  padding: 8px 0;\n}\n\n.xgplayer .panel-box {\n  padding: 16px;\n}\n\n.xgplayer .panel-box.pc-panel {\n  right: -10px;\n  bottom: 34px;\n  z-index: 20;\n  border-radius: 4px;\n  color: #fff;\n  position: absolute;\n  box-sizing: border-box;\n  width: 278px;\n  background-color: rgb(0 0 0 / 80%);\n  box-shadow: 0 1px 15px rgb(11 18 35 / 26%);\n  display: none;\n}\n\n.xgplayer .panel-box.pc-panel .xg-player-slider {\n  padding: 8px 0;\n}\n\n.xgplayer .panel-box .box-header {\n  display: flex;\n  font-weight: 500;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.xgplayer .panel-box .box-header .header-reset {\n  display: flex;\n  width: 64px;\n  height: 22px;\n  line-height: 22px;\n  justify-content: center;\n  align-items: center;\n  background: rgb(0 0 0 / 40%);\n  border-radius: 12px;\n  cursor: pointer;\n}\n\n.xgplayer .panel-box .box-header .header-reset:hover {\n  background: rgb(255 255 255 / 30%);\n}\n\n.xgplayer .xgplayer-danmu-container {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 100%;\n  overflow: hidden;\n  pointer-events: none;\n  outline: none;\n}\n\n.xgplayer .xgplayer-danmu-container div {\n  color: #fff;\n  text-shadow:\n    black 1px 0 1px,\n    black 0 1px 1px,\n    black 0 -1px 1px,\n    black -1px 0 1px;\n}\n\n.xgplayer.xgplayer-mobile .xgplayer-danmu {\n  margin-right: 10px !important;\n}\n\n.xgplayer.xgplayer-mobile .panel-box .box-header {\n  margin-bottom: 15px;\n}\n\n/* 音乐播放器样式 */\n.xgplayer.xgplayer-music .xg-video-container {\n  background-image: url('../../../assets/img/bg/bg-player.jpg');\n  background-position: center center;\n  background-repeat: no-repeat;\n  background-size: cover;\n}\n\n.xgplayer.xgplayer-music .xgplayer-controls .xgplayer-time.xg-time-left {\n  margin-left: 16px;\n}\n\n.xgplayer.xgplayer-music .xgplayer-progress {\n  top: 0;\n  transform: none;\n  min-width: 80px;\n}\n\n.xgplayer.xgplayer-music .xgplayer-controls .xgplayer-time.xg-time-right {\n  margin-right: 16px;\n}\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/xgplayer/index.ts",
    "content": "import 'xgplayer/dist/index.min.css';\nimport 'xgplayer-music/dist/index.min.css';\nimport 'xgplayer/es/plugins/danmu/index.css';\nimport './css/index.css';\n\nimport { merge } from 'es-toolkit';\nimport type { IPlayerOptions } from 'xgplayer';\nimport XgPlayer, { Events, I18N, SimplePlayer } from 'xgplayer';\nimport ZH_HK from 'xgplayer/es/lang/zh-hk';\nimport type { IDanmuConfig } from 'xgplayer/es/plugins/danmu';\nimport Danmu from 'xgplayer/es/plugins/danmu';\nimport LivePreset from 'xgplayer/es/presets/live';\nimport FlvPlugin from 'xgplayer-flv';\nimport HlsPlugin from 'xgplayer-hls';\nimport Mp4Plugin from 'xgplayer-mp4';\nimport MusicPreset from 'xgplayer-music';\nimport ShakaPlugin from 'xgplayer-shaka';\n\nimport type { IBarrage, IBarrageSendOptions, IMultiPlayerOptions } from '../../types';\nimport { color, icons, language } from '../../utils/static';\nimport { storage } from '../../utils/storage';\nimport { publicBarrageSend } from '../../utils/tool';\nimport { danmuSendPlugin as _danmuSendPlugin, playNextPlugin } from './plugins';\nimport type { PlayerAdapter } from './types';\nimport { uiIconHandle } from './utils';\n\nI18N.use(ZH_HK);\n\nclass XgPlayerAdapter {\n  player: PlayerAdapter | null = null;\n  listeners: Map<string, Set<(...args: any[]) => void>> = new Map();\n  options: IPlayerOptions = {\n    id: 'xgplayer',\n    url: '',\n    width: 'auto',\n    height: '100%',\n    autoplay: true,\n    pip: { index: 2, showIcon: true },\n    cssFullscreen: false,\n    startTime: 0,\n    volume: { index: 3, default: 1, showValueLabel: true },\n    playbackRate: {\n      list: [2, 1.5, 1.25, { rate: 1, iconText: { 'zh-cn': '倍速', en: 'Speed' } }, 0.75, 0.5],\n      index: 4,\n    },\n    time: { index: 2 },\n    icons: {\n      play: icons.play,\n      pause: icons.pause,\n      playNext: icons.mnext,\n      fullscreen: icons.fullscreen,\n      exitFullscreen: icons.fullscreenExit,\n      volumeSmall: icons.volumeSmall,\n      volumeLarge: icons.volumeLarge,\n      volumeMuted: icons.volumeMuted,\n      pipIcon: icons.pipEnter,\n      pipIconExit: icons.pipExit,\n      openDanmu: icons.danmuOpen,\n      closeDanmu: icons.danmuClose,\n    },\n    commonStyle: {\n      playedColor: color.theme, // 播放完成部分进度条底色\n      volumeColor: color.theme, // 音量颜色\n    },\n    lang: 'zh-cn',\n    enableContextmenu: true,\n    danmu: {\n      opacity: 1, // 弹幕透明度\n      fontSize: 24, // 弹幕字体大小\n      channelSize: 24, // 弹幕轨道高度\n      panel: true,\n      comments: [],\n      area: { start: 0, end: 0.85 }, // 弹幕显示区域\n      defaultOpen: true, // 是否默认开启弹幕\n      closeDefaultBtn: false, // 是否隐藏弹幕开关按钮\n    },\n    plugins: [],\n  };\n\n  private on(event: string, handler: (...args: any[]) => void) {\n    if (!this.player) return;\n\n    let handlers = this.listeners.get(event);\n    if (!handlers) {\n      handlers = new Set();\n      this.listeners.set(event, handlers);\n    }\n\n    if (!handlers.has(handler)) {\n      handlers.add(handler);\n      this.player.on(event, handler);\n    }\n  }\n\n  private off(event: string, handler?: any) {\n    if (!this.player) return;\n\n    const handlers = this.listeners.get(event);\n    if (!handlers) return;\n\n    if (handler) {\n      if (handlers.has(handler)) {\n        this.player.off(event, handler);\n        handlers.delete(handler);\n      }\n    } else {\n      handlers.forEach((h) => this.player!.off(event, h));\n      handlers.clear();\n    }\n\n    if (handlers.size === 0) this.listeners.delete(event);\n  }\n\n  barrage(barrage: IBarrage[], id: string) {\n    if (!this.player) return;\n\n    const comments: IDanmuConfig['comments'] = barrage.map((item) => ({\n      id: item.id,\n      mode: ['left', 'right'].includes(item.type) ? 'scroll' : item.type,\n      txt: item.text,\n      start: item.time * 1000,\n      color: true,\n      style: { color: item.color, fontSize: '24px' },\n      duration: 5 * 1000,\n    }));\n    this.player.plugins.danmu.updateComments(comments, true);\n    this.player.getPlugin('danmu').updateComments(comments, true); // 效果一样\n\n    const sendHandle = (item: any) => {\n      const options: IBarrageSendOptions = {\n        id,\n        type: ['top', 'bottom'].includes(item.mode) ? item.mode : 'right',\n        text: item.txt,\n        time: item.start,\n        color: item.style.color ?? '#FFFFFF',\n      };\n\n      publicBarrageSend(options);\n    };\n\n    this.on('DANMAKU_SEND', sendHandle!);\n  }\n\n  create(rawOptions: Required<IMultiPlayerOptions>) {\n    const options: Partial<IPlayerOptions> = {\n      id: rawOptions.container, // 容器\n      url: rawOptions.url,\n      autoplay: rawOptions.autoplay,\n      startTime: !rawOptions.isLive && rawOptions.startTime > 0 ? rawOptions.startTime : 0, // 起始时间\n      volume: {\n        default: ((v) => (Number.isNaN(v) ? 1 : v))(Number(storage?.get('volume'))),\n      }, // 音量\n      autoplayMuted: !!storage?.get('muted'),\n      lang: (() => {\n        const locale = language();\n        switch (locale) {\n          case 'zh-CN':\n            return 'zh-cn';\n          case 'zh-TW':\n            return 'zh-hk';\n          default:\n            return 'en';\n        }\n      })(), // 语言\n      presets: ['default'],\n      plugins: [],\n    };\n\n    // 解码器\n    const type = ['audio', 'mp4', 'hls', 'dash', 'flv', 'mpegts'].includes(rawOptions.type) ? rawOptions.type : 'auto';\n    switch (type) {\n      case 'audio': {\n        options.presets = ['default', MusicPreset];\n        options.controls = { initShow: true, mode: 'flex' };\n        options.marginControls = true;\n        options.mediaType = 'audio';\n        options.ignores = ['mobile', 'musiccover', 'musicmeta', 'musicnext', 'musicprev'];\n        break;\n      }\n      case 'mp4': {\n        options.plugins = [Mp4Plugin];\n        options.mp4plugin = { reqOptions: { headers: rawOptions.headers } };\n        break;\n      }\n      case 'flv': {\n        options.plugins = [FlvPlugin];\n        options.flv = { fetchOptions: { headers: rawOptions.headers } };\n        break;\n      }\n      case 'hls': {\n        options.plugins = [HlsPlugin];\n        options.hls = { fetchOptions: { headers: rawOptions.headers } };\n        break;\n      }\n      case 'dash': {\n        options.plugins = [ShakaPlugin];\n        options.shakaplugin = { fetchOptions: { headers: rawOptions.headers } };\n        break;\n      }\n    }\n\n    // 初始化\n    let player: PlayerAdapter;\n    if (rawOptions.isLive) {\n      SimplePlayer.defaultPreset = LivePreset;\n      player = new SimplePlayer(merge(this.options, options));\n    } else {\n      options.plugins = [\n        ...options.plugins!,\n        ...(type !== 'audio' ? [Danmu] : []),\n        ...(rawOptions.next ? [playNextPlugin] : []),\n      ];\n      player = new XgPlayer(merge(this.options, options));\n    }\n\n    if (rawOptions.quality.length) {\n      const quality = rawOptions.quality.map((item) => {\n        return { name: item.name, definition: item.name, url: item.url };\n      });\n      player.emit('resourceReady', quality);\n    } // 画质\n\n    player.storage = storage; // 挂载存储\n    this.player = player; // 赋值实例\n\n    if (type === 'audio') {\n      setTimeout(() => {\n        uiIconHandle.replace('.xgplayer-prev', icons.mprev);\n        uiIconHandle.replace('.xgplayer-next', icons.mnext);\n        uiIconHandle.replace('.xgplayer-backward', icons.mbackward);\n        uiIconHandle.replace('.xgplayer-forward', icons.mforward);\n      }, 0); // 图标替换\n    }\n\n    player.once(Events.READY, () => {\n      !rawOptions.isLive &&\n        (player.playbackRate = ((v) => (Number.isNaN(v) ? 1 : v))(Number(storage?.get('playrate')))); // 倍速\n    });\n\n    this.on(Events.RATE_CHANGE, () => player.storage?.set('playrate', player.playbackRate));\n    this.on(Events.VOLUME_CHANGE, () => {\n      player.storage?.set('muted', player.muted);\n      player.storage?.set('volume', player.volume);\n    });\n\n    return player;\n  }\n\n  destroy() {\n    if (!this.player) return;\n\n    this.listeners.forEach((handlers, event) => {\n      handlers.forEach((handler) => {\n        this.off(event, handler);\n      });\n    });\n    this.listeners.clear();\n\n    this.player.destroy();\n    this.player = null;\n  }\n\n  onTimeUpdate(callback: any) {\n    if (!this.player) return;\n\n    const handler = ({ currentTime, duration }) => {\n      callback({\n        currentTime: currentTime ?? Number.NaN,\n        duration: duration ?? Number.NaN,\n      });\n    };\n    this.on(Events.TIME_UPDATE, handler);\n  }\n\n  offTimeUpdate() {\n    if (!this.player) return;\n    this.off(Events.TIME_UPDATE);\n  }\n\n  play() {\n    this.player?.play();\n  }\n\n  pause() {\n    this.player?.pause();\n  }\n\n  togglePlay() {\n    if (this.player) {\n      if (this.player.paused) this.player.play();\n      else this.player.pause();\n    }\n  }\n\n  toggleMuted() {\n    if (this.player) this.player.muted = !this.player.muted;\n  }\n\n  seek(time: number) {\n    if (this.player) this.player.seek(time, 'auto');\n  }\n\n  switchUrl(rawOptions: Required<IMultiPlayerOptions>) {\n    if (!this.player) return;\n\n    const options: Partial<IPlayerOptions> = {};\n\n    if (rawOptions.isLive) {\n      const plugin = this.player?.getPlugin('danmu');\n      if (plugin) this.player!.unRegisterPlugin('danmu');\n    } else {\n      const plugin = this.player?.getPlugin('danmu');\n      if (!plugin) this.player!.registerPlugin(Danmu);\n    }\n\n    ['mp4plugin', 'hls', 'flv', 'shakaplugin'].forEach((key) => {\n      const plugin = this.player?.getPlugin(key);\n      if (plugin) {\n        plugin.__destroy();\n        this.player!.unRegisterPlugin(key, true);\n        delete this.player?.plugins?.[key as keyof typeof this.player.plugins];\n      }\n    });\n\n    const type = ['audio', 'mp4', 'hls', 'dash', 'flv', 'mpegts'].includes(rawOptions.type) ? rawOptions.type : 'auto';\n    switch (type) {\n      case 'audio':\n        break;\n      case 'mp4':\n        this.player.registerPlugin(Mp4Plugin);\n        options.mp4plugin = { reqOptions: { headers: rawOptions.headers } };\n        break;\n      case 'flv':\n        this.player.registerPlugin(FlvPlugin);\n        options.flv = { fetchOptions: { headers: rawOptions.headers } };\n        break;\n      case 'hls':\n        this.player.registerPlugin(HlsPlugin);\n        options.hls = { fetchOptions: { headers: rawOptions.headers } };\n        break;\n      case 'dash':\n        this.player.registerPlugin(ShakaPlugin);\n        options.shakaplugin = { fetchOptions: { headers: rawOptions.headers } };\n        break;\n    }\n\n    this.player.playNext({ url: rawOptions.url, ...options });\n    this.player.plugins?.danmu?.clear?.();\n  }\n\n  get currentTime() {\n    return this.player?.currentTime ?? Number.NaN;\n  }\n\n  get duration() {\n    return this.player?.duration ?? Number.NaN;\n  }\n\n  get time() {\n    return {\n      currentTime: this.player?.currentTime ?? Number.NaN,\n      duration: this.player?.duration ?? Number.NaN,\n    };\n  }\n\n  get playbackRate() {\n    return this.player?.playbackRate ?? 1;\n  }\n\n  set playbackRate(rate: number) {\n    if (this.player) this.player.playbackRate = rate;\n  }\n\n  get muted() {\n    return !!this.player?.muted;\n  }\n\n  set muted(state: boolean) {\n    if (this.player) this.player.muted = state;\n  }\n\n  get volume() {\n    return this.player?.volume ?? 0;\n  }\n\n  set volume(volume: number) {\n    if (this.player) {\n      if (volume > 0) this.player.muted = false;\n      this.player.volume = volume;\n    }\n  }\n\n  get instance() {\n    return this.player;\n  }\n}\n\nexport default XgPlayerAdapter;\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/xgplayer/plugins/danmuSend.ts",
    "content": "import type { IXGI18nText } from 'xgplayer';\nimport { I18N, Plugin } from 'xgplayer';\n\nconst LANG = [\n  {\n    LANG: 'zh-cn',\n    TEXT: {\n      danmuSend: '发送',\n      danmuPlaceholder: '请输入弹幕',\n    },\n  },\n  {\n    LANG: 'zh-hk',\n    TEXT: {\n      danmuSend: '發送',\n      danmuPlaceholder: '請輸入彈幕',\n    },\n  },\n  {\n    LANG: 'en',\n    TEXT: {\n      danmuSend: 'Send',\n      danmuPlaceholder: 'Please enter a comment',\n    },\n  },\n];\nI18N.extend(LANG as Array<IXGI18nText>);\n\nconst { POSITIONS } = Plugin;\n\nexport default class danmuSendPlugin extends Plugin {\n  // 插件的名称，将作为插件实例的唯一key值\n  static get pluginName() {\n    return 'danmuSend';\n  }\n\n  static get defaultConfig() {\n    return {\n      position: POSITIONS.CONTROLS_CENTER,\n      index: 0,\n      showIcon: false,\n      preferDocument: false,\n      width: undefined,\n      height: undefined,\n      docPiPNode: undefined,\n      docPiPStyle: undefined,\n    };\n  }\n\n  constructor(args) {\n    super(args);\n  }\n\n  beforePlayerInit() {\n    // TODO 播放器调用start初始化播放源之前的逻辑\n  }\n\n  afterPlayerInit() {\n    // TODO 播放器调用start初始化播放源之后的逻辑\n  }\n\n  sendBtnClick() {\n    const danmuPlugin = this.player.getPlugin('danmu') || this.player.plugins.danmu;\n    if (!danmuPlugin) return;\n\n    const input = this.find('.danmu-input');\n    const inputValue = (input as HTMLInputElement).value;\n    if (!inputValue) return;\n\n    const doc = {\n      txt: inputValue,\n      start: this.player.currentTime,\n      mode: 'scroll', // 默认滚动弹幕\n      style: {\n        color: '#FFFFFF',\n        fontSize: '24px',\n      },\n    };\n\n    danmuPlugin.sendComment({\n      ...doc,\n      start: (doc.start + 0.3) * 1000, // 弹幕发送时间稍微延后一点\n      duration: 5000,\n      id: Date.now().toString(),\n      prior: true,\n    });\n\n    this.emit('DANMAKU_SEND', doc);\n\n    (input as HTMLInputElement).value = ''; // 清空输入框\n  }\n\n  afterCreate() {\n    /**\n     * 自定义插件 弹幕发送模块\n     * root.__root__为根节点Vue模板data值\n     */\n    // 对当前插件根节点内部类名为.danmu-send的元素绑定click事件\n    this.bind('.danmu-send', 'click', this.sendBtnClick);\n    // TODO 插件实例化之后的一些逻辑\n  }\n\n  destroy() {\n    this.unbind('.danmu-send', 'click', this.sendBtnClick);\n    // 播放器销毁的时候一些逻辑\n  }\n\n  render() {\n    const btnEl = `<div\n      class=\"danmu-send\"\n      style=\"\n        cursor: pointer;\n        width: 60px;\n        height: 100%;\n        text-shadow: none;\n        background-color: #00a1d6;\n        border-top-right-radius: 5px;\n        border-bottom-right-radius: 5px;\n        justify-content: center;\n        align-items: center;\n        display: flex;\"\n      >\n      ${(this.i18n as any).danmuSend}\n    </div>`;\n\n    const inputEl = `\n      <input\n        class=\"danmu-input\"\n        style=\"\n          color: #fff;\n          background-color: #0000;\n          border: none;\n          outline: none;\n          flex: 1;\n          width: auto;\n          min-width: 0;\n          padding: 0 6px;\n          height: 100%;\n          line-height: 1;\n        \"\n        placeholder=\"${(this.i18n as any).danmuPlaceholder}\"\n      />\n      `;\n\n    return `\n      <div class=\"danmu-send-plugin\" style=\"\n        height: 32px; max-width: 300px; margin: 0 auto;\n        background-color: #1f1f1fe6; border-radius: 5px;\n        display: flex; flex-direction: row;\"\n      >\n        ${inputEl}\n        ${btnEl}\n      </div>`;\n  }\n}\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/xgplayer/plugins/index.ts",
    "content": "import danmuSendPlugin from './danmuSend';\nimport playNextPlugin from './playNext';\n\nexport { danmuSendPlugin, playNextPlugin };\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/xgplayer/plugins/playNext.ts",
    "content": "import { Plugin, Sniffer } from 'xgplayer';\n\nimport { emitterChannel } from '@/config/emitterChannel';\nimport emitter from '@/utils/emitter';\n\nimport { icons } from '../../../utils/static';\n\nconst { POSITIONS } = Plugin;\nconst Next = icons.mnext;\n\nfunction xgIconTips(plugin, textKey, isShow) {\n  try {\n    return ` <div class=\"xg-tips ${isShow ? 'hide' : ' '}\" lang-key=\"${plugin.i18nKeys[textKey]}\">\n    ${plugin.i18n[textKey]}\n    </div>`;\n  } catch {\n    return '<div class=\"xg-tips hide\"></div>';\n  }\n}\n\nexport default class PlayNextIcon extends Plugin {\n  static get pluginName() {\n    return 'videoNext';\n  }\n\n  static get defaultConfig() {\n    return {\n      position: POSITIONS.CONTROLS_LEFT,\n      index: 1,\n    };\n  }\n\n  constructor(options) {\n    super(options);\n  }\n\n  afterCreate() {\n    this.appendChild('.xgplayer-icon', (this.icons as { playNext: HTMLElement }).playNext);\n    this.initEvents();\n  }\n\n  registerIcons() {\n    return {\n      playNext: Next,\n    };\n  }\n\n  initEvents() {\n    // this.nextHandler = this.hook('nextClick', this.changeSrc)\n    const event = Sniffer.device === 'mobile' ? 'touchend' : 'click';\n    this.bind(event, this.playNext);\n    this.show();\n  }\n\n  playNext() {\n    emitter.emit(emitterChannel.COMP_MULTI_PLAYER_PLAYNEXT, {});\n  }\n\n  destroy() {\n    this.unbind(['touchend', 'click'], this.playNext);\n  }\n\n  render() {\n    return `\n     <xg-icon class=\"xgplayer-playnext\">\n      <div class=\"xgplayer-icon\">\n      </div>\n      ${xgIconTips(this, 'PLAYNEXT_TIPS', this.playerConfig.isHideTips)}\n     </xg-icon>\n    `;\n  }\n}\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/xgplayer/types.ts",
    "content": "import type XgPlayer from 'xgplayer';\n\nexport interface PlayerAdapter extends XgPlayer {\n  storage?: {\n    set: (key: string, value: any) => void;\n    get: (key: string) => any;\n  };\n}\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/core/xgplayer/utils/index.ts",
    "content": "const uiIconHandle = {\n  /**\n   * 替换目标元素中的SVG图标\n   * @param targetSelector 目标元素选择器\n   * @param html 新元素的HTML字符串\n   * @returns 是否成功替换\n   */\n  replace(targetSelector: string, html: string): boolean {\n    try {\n      const targetEl = document.querySelector(targetSelector);\n      if (!targetEl) return false;\n\n      targetEl.innerHTML = html;\n\n      return true;\n    } catch (error) {\n      console.error('Failed to replace icon:', error);\n      return false;\n    }\n  },\n};\n\nexport { uiIconHandle };\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/multi-player.tsx",
    "content": "import './assets/css/index.less';\n\nimport type { SetupContext, SlotsType } from 'vue';\nimport { defineComponent, onUnmounted, ref, shallowRef, toRaw } from 'vue';\n\nimport { ArtPlayerAdapter, DPlayerAdapter, NPlayerAdapter, OPlayerAdapter, XgPlayerAdapter } from './core';\nimport type {\n  IBarrage,\n  IDecoderType,\n  IMultiPlayerAdapter,\n  IMultiPlayerCreateMode,\n  IMultiPlayerOptions,\n  IMultiPlayerSlots,\n  IMultiPlayerType,\n  ISinglePlayerAdapter,\n} from './types';\nimport { mediaUtils, singleton } from './utils/tool';\n\nconst adapterRelation: Record<IMultiPlayerType, new () => any> = {\n  artplayer: ArtPlayerAdapter,\n  dplayer: DPlayerAdapter,\n  nplayer: NPlayerAdapter,\n  xgplayer: XgPlayerAdapter,\n  oplayer: OPlayerAdapter,\n};\n\nconst MultiPlayer = defineComponent({\n  name: 'MultiPlayer',\n  slots: (() => {}) as SlotsType<IMultiPlayerSlots>,\n  emits: ['updateTime'],\n\n  setup(_props: any, ctx: SetupContext) {\n    const adapter = shallowRef<ISinglePlayerAdapter | null>(null);\n    const currentAdapterType = ref<IMultiPlayerType | null>(null);\n    const mseRef = ref<HTMLDivElement | null>(null);\n    const selfRef = ref<HTMLDivElement | null>(null);\n\n    const barrage = (comments: IBarrage[], id: string) => adapter.value?.barrage?.(toRaw(comments), id);\n\n    const create = async (\n      rawOptions: Partial<IMultiPlayerOptions>,\n      player?: IMultiPlayerType,\n      mode?: IMultiPlayerCreateMode,\n    ) => {\n      if (!rawOptions?.url || !rawOptions.container) return;\n\n      const playerType = player ?? (Object.keys(adapterRelation)[0] as IMultiPlayerType);\n      const playerMode = mode ?? 'switch';\n\n      const options: Required<IMultiPlayerOptions> = {\n        container: rawOptions.container,\n        type: rawOptions.type!,\n        url: rawOptions.url,\n        startTime: typeof rawOptions.startTime === 'number' ? rawOptions.startTime : 0,\n        autoplay: typeof rawOptions.autoplay === 'boolean' ? rawOptions.autoplay : true,\n        isLive: !!rawOptions.isLive,\n        next: !!rawOptions.next,\n        quality: Array.isArray(rawOptions.quality) ? rawOptions.quality : [],\n        headers:\n          rawOptions.headers && typeof rawOptions.headers === 'object' && Object.keys(rawOptions.headers).length\n            ? rawOptions.headers\n            : {},\n      };\n\n      if (!options.type || options.type === 'auto') {\n        const detected = await mediaUtils.checkMediaType(options.url, options.headers);\n        if (!detected) return;\n        options.type = detected as IDecoderType;\n      }\n      options.type = mediaUtils.getDecoderFromExtension(options.type);\n\n      if (Object.keys(options.headers).length) {\n        options.headers = mediaUtils.convertWebToElectron(options.headers);\n\n        if (\n          (options.type === 'mp4' && playerType !== 'xgplayer') ||\n          (['mpd', 'dash', 'shaka', 'flv'].includes(options.type) && playerType === 'oplayer') ||\n          (['mpd', 'dash', 'shaka'].includes(options.type) && playerType === 'xgplayer')\n        ) {\n          options.url = mediaUtils.convertStandardToUri(options.url, options.headers);\n        }\n      }\n\n      console.debug('[MultiPlayer] create with options:', options);\n\n      if (playerMode === 'switch') {\n        try {\n          if (adapter.value && currentAdapterType.value === playerType) {\n            await adapter.value.switchUrl(toRaw(options));\n            return;\n          }\n        } catch {}\n      }\n\n      currentAdapterType.value = playerType;\n\n      await destroy();\n\n      mseRef.value && (mseRef.value.id = rawOptions.container);\n\n      const AdapterCtor = adapterRelation[playerType];\n      const SingleAdapter = singleton(AdapterCtor);\n\n      adapter.value = new SingleAdapter();\n      await adapter.value!.create(toRaw(options));\n      onTimeUpdate();\n    };\n\n    const destroy = async () => {\n      if (!adapter.value) return;\n\n      try {\n        await adapter.value.destroy();\n      } catch {}\n      adapter.value = null;\n\n      if (mseRef.value) {\n        mseRef.value.className = 'multi-player__mse';\n        mseRef.value.id = 'mse';\n\n        const attrs = [...mseRef.value.attributes];\n        for (const attr of attrs) {\n          if (attr.name !== 'class' && attr.name !== 'id') {\n            try {\n              mseRef.value.removeAttribute(attr.name);\n            } catch {}\n          }\n        }\n      }\n    };\n\n    const play = async () => adapter.value?.play();\n    const pause = async () => adapter.value?.pause();\n    const togglePlay = () => adapter.value?.togglePlay();\n\n    const time = () => adapter.value?.time;\n    const seek = (time: number) => adapter.value?.seek(time);\n\n    const playbackRate = () => adapter.value?.playbackRate;\n    const setPlaybackRate = (rate: number) => {\n      if (adapter.value) adapter.value.playbackRate = rate;\n    };\n\n    const muted = () => adapter.value?.muted;\n    const setMuted = (muted: boolean) => {\n      if (adapter.value) adapter.value.muted = muted;\n    };\n    const toggleMuted = () => adapter.value?.toggleMuted();\n\n    const volume = () => adapter.value?.volume;\n    const setVolume = (volume: number) => {\n      if (adapter.value) adapter.value.volume = volume;\n    };\n\n    const onTimeUpdate = () => {\n      if (!adapter.value) return;\n\n      adapter.value.offTimeUpdate();\n      adapter.value.onTimeUpdate(({ currentTime, duration }) => {\n        ctx.emit('updateTime', { currentTime, duration });\n      });\n    };\n\n    const instance = () => adapter.value?.instance;\n\n    onUnmounted(() => destroy());\n\n    ctx.expose({\n      barrage,\n      create,\n      destroy,\n      play,\n      pause,\n      togglePlay,\n      toggleMuted,\n      time,\n      seek,\n      playbackRate,\n      setPlaybackRate,\n      muted,\n      setMuted,\n      volume,\n      setVolume,\n      instance,\n    });\n\n    return () => (\n      <div class=\"multi-player\" ref={selfRef}>\n        <div ref={mseRef} id=\"mse\" class=\"multi-player__mse\" />\n        {ctx.slots.header && adapter.value ? <div class=\"multi-player__header\">{ctx.slots.header()}</div> : null}\n      </div>\n    );\n  },\n}) as unknown as new () => { $el: HTMLElement; $props: any } & IMultiPlayerAdapter;\n\nexport default MultiPlayer;\nexport type MultiPlayerInstance = InstanceType<typeof MultiPlayer>;\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/types.ts",
    "content": "import type { IBarrage, IBarrageSendOptions } from '@shared/types/barrage';\nimport type * as Dashjs from 'dashjs';\nimport type Flvjs from 'flv.js';\nimport type { HlsConfig as Hlsjsonfig } from 'hls.js';\nimport type Hlsjs from 'hls.js';\nimport type Mpegtsjs from 'mpegts.js';\n// https://gist.github.com/Security2431/2b28f17e11870bb4b0e347673e16d5ba#comments\nimport type Shakajs from 'shaka-player/dist/shaka-player.compiled';\n\ntype IHeaders = Record<string, any>;\n\nexport type IMultiPlayerType = 'artplayer' | 'dplayer' | 'nplayer' | 'xgplayer' | 'oplayer';\nexport type IDecoderType = 'audio' | 'mp4' | 'dash' | 'hls' | 'flv' | 'mpegts' | 'shaka' | 'torrent';\nexport type IDecoderWithAutoType = IDecoderType | 'auto';\n\nexport type IMultiPlayerCreateMode = 'new' | 'switch';\n\nexport interface IMultiPlayerOptions {\n  container: string;\n  type: IDecoderWithAutoType;\n  url: string;\n  startTime: number;\n  autoplay: boolean;\n  isLive: boolean;\n  next: boolean;\n  quality: Array<{ name: string; url: string }>;\n  headers: IHeaders;\n}\n\ninterface IBasePlayerAdapter {\n  barrage: (comments: IBarrage[], id: string) => void;\n  destroy: () => Promise<void>;\n\n  switchUrl: (doc: any) => Promise<void>;\n\n  play: () => Promise<void>;\n  pause: () => Promise<void>;\n  togglePlay: () => void;\n\n  get playbackRate(): number;\n  set playbackRate(v: number);\n\n  get muted(): boolean;\n  set muted(v: boolean);\n  toggleMuted: () => void;\n\n  get volume(): number;\n  set volume(v: number);\n\n  get time(): number;\n  seek: (time: number) => void;\n\n  get instance(): any;\n}\n\nexport interface ISinglePlayerAdapter extends IBasePlayerAdapter {\n  create: (doc: Required<IMultiPlayerOptions>) => Promise<void>;\n  onTimeUpdate: (cb: (args: { currentTime: number; duration: number }) => void) => void;\n  offTimeUpdate: () => void;\n}\n\nexport interface IMultiPlayerAdapter extends IBasePlayerAdapter {\n  create: (doc: Partial<IMultiPlayerOptions>, type: IMultiPlayerType, mode?: IMultiPlayerCreateMode) => Promise<void>;\n  onTimeUpdate: () => void;\n}\n\nexport interface IMultiPlayerSlots {\n  header?: () => any;\n  default?: () => any;\n}\n\nexport type { IBarrage, IBarrageSendOptions };\n\n/**\n * dash.js\n */\nexport interface IDashConfig {\n  autoplay?: boolean;\n  isLive?: boolean;\n  options?: Dashjs.MediaPlayerSettingClass;\n  headers?: IHeaders;\n}\n\nexport type IDashInstance = Dashjs.MediaPlayerClass | undefined;\n\n/**\n * hls.js\n */\nexport interface IHlsConfig {\n  autoplay?: boolean;\n  isLive?: boolean;\n  options?: Hlsjsonfig;\n  headers?: IHeaders;\n}\n\nexport type IHlsInstance = Hlsjs | undefined;\n\n/**\n * flv.js\n */\nexport interface IFlvConfig {\n  autoplay?: boolean;\n  isLive?: boolean;\n  mediaDataSource?: Flvjs.MediaDataSource;\n  optionalConfig?: Flvjs.Config;\n  headers?: IHeaders;\n}\n\nexport type IFlvInstance = Flvjs.Player | undefined;\n\n/**\n * mpegts.js\n */\nexport interface IMpegtsConfig {\n  autoplay?: boolean;\n  isLive?: boolean;\n  mediaDataSource?: Mpegtsjs.MediaDataSource;\n  optionalConfig?: Mpegtsjs.Config;\n  headers?: IHeaders;\n}\n\nexport type IMpegtsInstance = Mpegtsjs.Player | undefined;\n\n/**\n * shaka-player\n */\nexport interface IShakaConfig {\n  autoplay?: boolean;\n  isLive?: boolean;\n  options?: object;\n  headers?: IHeaders;\n}\n\nexport type IShakaInstance = Shakajs.Player | undefined;\n\n/**\n * webtorrent\n */\nexport interface ITorrentConfig {\n  autoplay?: boolean;\n  isLive?: boolean;\n  options?: {\n    maxConns?: number | undefined;\n    nodeId?: string | ArrayBuffer | undefined;\n    peerId?: string | ArrayBuffer | undefined;\n    tracker?: boolean | Record<string, any> | undefined;\n    dht?: boolean | Record<string, any> | undefined;\n    lsd?: boolean | undefined;\n    webSeeds?: boolean | undefined;\n    utp?: boolean | undefined;\n    blocklist?: (string | Array<string | { start: string; end: string }>) | undefined;\n    downloadLimit?: number | undefined;\n    uploadLimit?: number | undefined;\n  };\n  headers?: IHeaders;\n}\n\nexport type ITorrentInstance = any | undefined;\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/utils/static.ts",
    "content": "import { useSettingStore } from '@/store';\n\nconst iconModules = import.meta.glob('../assets/img/icon/*.svg', {\n  eager: true,\n  query: '?raw',\n  import: 'default',\n});\n\nconst icons: Record<string, string> = (() => {\n  const iconList: Record<string, string> = {};\n\n  for (const path in iconModules) {\n    const iconFileName = path.split('/').pop();\n    if (!iconFileName) continue;\n\n    // 分离文件名和后缀\n    const [iconName, _iconSuffix] = iconFileName.split('.');\n    const svgContent = iconModules[path] as string;\n\n    iconList[iconName] = svgContent;\n  }\n\n  return iconList;\n})();\n\nconst color = {\n  theme: '#00c452',\n  process: 'linear-gradient(270deg,#00e038,#32ccff)',\n};\n\nconst language = () => {\n  const storeSetting = useSettingStore();\n  const DEFAULT_LANGUAGE = 'en_US';\n\n  const getStoredLanguage = storeSetting.displayLang;\n\n  const lang = getStoredLanguage || DEFAULT_LANGUAGE;\n  return lang;\n};\n\nexport { color, icons, language };\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/utils/storage.ts",
    "content": "class Storage {\n  name: string;\n  settings: { [key: string]: any };\n  constructor(name: string) {\n    this.name = name;\n    this.settings = {};\n  }\n\n  get(key: string) {\n    try {\n      const storage = JSON.parse(localStorage.getItem(this.name) || '{}');\n      return key ? storage[key] : storage;\n    } catch (error) {\n      console.error(`[Storage][get] Error: ${error}`);\n      return key ? this.settings[key] : this.settings;\n    }\n  }\n\n  set(key: string, value: any) {\n    try {\n      const storage = {\n        ...this.get(''),\n        ...{ [key]: value },\n      };\n      localStorage.setItem(this.name, JSON.stringify(storage));\n    } catch (error) {\n      console.error(`[Storage][set] Error: ${error}`);\n      this.settings[key] = value;\n    }\n  }\n\n  del(key: string) {\n    try {\n      const storage = this.get('');\n      delete storage[key];\n      localStorage.setItem(this.name, JSON.stringify(storage));\n    } catch (error) {\n      console.error(`[Storage][del] Error: ${error}`);\n      delete this.settings[key];\n    }\n  }\n\n  clear() {\n    try {\n      localStorage.removeItem(this.name);\n    } catch (error) {\n      console.error(`[Storage][del] Error: ${error}`);\n      this.settings = {};\n    }\n  }\n}\n\nconst storage = new Storage('multi-player_setting');\n\nconst storageUtil = {\n  getKeys() {\n    const keys: Array<string> = [];\n    const length = localStorage.length;\n    for (let i = 0; i < length; i++) {\n      const key = localStorage.key(i);\n      if (key !== null) {\n        keys.push(key);\n      }\n    }\n    return keys;\n  },\n  delStartWith(match: string) {\n    const keys = this.getKeys();\n    keys.forEach((key) => {\n      if (key && key.startsWith(match)) {\n        localStorage.removeItem(key);\n      }\n    });\n  },\n};\n\nexport { Storage, storage, storageUtil };\nexport default Storage;\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/utils/stream-decoder.ts",
    "content": "import * as Dashjs from 'dashjs';\nimport Flvjs from 'flv.js';\nimport type { HlsConfig } from 'hls.js';\nimport Hlsjs from 'hls.js';\nimport * as magnet from 'magnet-uri';\nimport Mpegtsjs from 'mpegts.js';\n\n// import Shakajs from 'shaka-player/dist/shaka-player.compiled';\nimport WebTorrentjs from '../modules/webtorrent.min.js';\nimport type {\n  IDashConfig,\n  IDashInstance,\n  IFlvConfig,\n  IFlvInstance,\n  IHlsConfig,\n  IHlsInstance,\n  IMpegtsConfig,\n  IMpegtsInstance,\n  // IShakaConfig,\n  // IShakaInstance,\n  ITorrentConfig,\n  ITorrentInstance,\n} from '../types';\n\nconst streamConfig = {\n  dash: {\n    stream: (_headers = {}) => ({}),\n  },\n  flv: {\n    optional: (headers = {}): Flvjs.Config => {\n      return {\n        // enableWorker: false, // 启用分离线程true会导致无法播放\n        // enableStashBuffer: false, // 关闭IO隐藏缓冲区\n        // stashInitialSize: 128, // 减少首帧显示等待时长\n        // autoCleanupSourceBuffer: true, // 自动清除缓存\n        // reuseRedirectedURL: true, // 允许重定向请求\n        // fixAudioTimestampGap: false, // 音视频同步\n        // deferLoadAfterSourceOpen: false, // 允许延迟加载\n        // referrerPolicy: 'no-referrer', // 不发送来源\n        ...(Object.keys(headers).length > 0 ? { headers } : {}),\n      };\n    },\n  },\n  hls: (headers = {}): HlsConfig => {\n    return {\n      ...Hlsjs.DefaultConfig,\n      ...{\n        // Web Worker\n        enableWorker: true,\n        // MediaSource 仅在不存在的情况下使用ManagedMediaSource\n        preferManagedMediaSource: false,\n        // 避免播放列表/分段请求时的超时\n        manifestLoadPolicy: {\n          default: {\n            maxTimeToFirstByteMs: 1000000, // 设置一个适当大的值\n            maxLoadTimeMs: 1000000, // 设置一个适当大的值\n            timeoutRetry: {\n              maxNumRetry: 2,\n              retryDelayMs: 0,\n              maxRetryDelayMs: 0,\n            },\n            errorRetry: {\n              maxNumRetry: 1,\n              retryDelayMs: 1000,\n              maxRetryDelayMs: 8000,\n            },\n          },\n        },\n        playlistLoadPolicy: {\n          default: {\n            maxTimeToFirstByteMs: 1000000, // 设置一个适当大的值\n            maxLoadTimeMs: 1000000, // 设置一个适当大的值\n            timeoutRetry: {\n              maxNumRetry: 2,\n              retryDelayMs: 0,\n              maxRetryDelayMs: 0,\n            },\n            errorRetry: {\n              maxNumRetry: 2,\n              retryDelayMs: 1000,\n              maxRetryDelayMs: 8000,\n            },\n          },\n        },\n        fragLoadPolicy: {\n          default: {\n            maxTimeToFirstByteMs: 1000000, // 设置一个适当大的值\n            maxLoadTimeMs: 1000000, // 设置一个适当大的值\n            timeoutRetry: {\n              maxNumRetry: 4,\n              retryDelayMs: 0,\n              maxRetryDelayMs: 0,\n            },\n            errorRetry: {\n              maxNumRetry: 6,\n              retryDelayMs: 1000,\n              maxRetryDelayMs: 8000,\n            },\n          },\n        },\n      },\n      ...(Object.keys(headers).length > 0\n        ? {\n            xhrSetup(xhr: XMLHttpRequest, _url: string) {\n              // Add custom header. Requires to set up Access-Control-Allow-Headers in your\n              // response header in the server side. Reference: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/setRequestHeader\n              // xhr.withCredentials = true; // do send cookies\n              for (const key in headers) {\n                xhr.setRequestHeader(key, headers[key]);\n              }\n            },\n          }\n        : {}),\n    };\n  },\n  mpegts: {\n    optional: (headers = {}): Mpegtsjs.Config => {\n      return {\n        // Web Worker\n        enableWorker: false,\n        // 启用面向Media Source Extensions API的Web Worker\n        // 通过从主线程中分离播放处理，解决了低规格终端受到DOM绘制延迟影响而导致影像播放堵塞的问题。\n        // 在不能使用MSE in Worker的环境中，mpegts.js方面会自动回退，所以基本上设置true\n        // 不过，在 Microsoft Edge for Windows 上，只有启用了 Worker 中的 MSE，H.265 / HEVC 播放才会失效，因此只能在这种情况下禁用。\n        // enableWorkerForMSE: !(\n        //   mediaUtils.isHEVCVideoSupported() && (await Mpegtsjs.supportWorkerForMSEH265Playback()) === false\n        // ),\n        enableWorkerForMSE: false,\n        // 存储 2048KB 缓冲区，直到播放开始\n        // 太大似乎不起作用，但太小或禁用会导致不稳定，尤其是在 Safari 中。\n        enableStashBuffer: true,\n        stashInitialSize: Math.floor(2048 * 1024),\n        // 通过HTMLMediaElement的内部缓冲器追踪实时流的延迟\n        // 与liveBufferLatencyChasing不同，不是突然跳过播放时间，\n        // 通过稍微提高播放速度，在不中断播放的情况下追踪延迟\n        liveSync: true,\n        // 允许的HTMLMediaElement的内部缓冲区的最大值（以秒为单位，3秒）\n        liveSyncMaxLatency: 3,\n        // HTMLMediaElement 的内部缓冲区（延迟）超过 liveSyncMaxLatency 时的目标延迟（秒）。\n        liveSyncTargetLatency: 4.0,\n        // 用于追踪直播延迟的播放速度（x1.1）\n        // 延迟超过3秒时，直到延迟低于playback_buffer_sec为止，播放速度设置为x1.1\n        liveSyncPlaybackRate: 1.1,\n        // 发送来源\n        // referrerPolicy: 'no-referrer',\n        ...(Object.keys(headers).length > 0 ? { headers } : {}),\n      };\n    },\n  },\n  shaka: (_headers = {}) => ({}),\n  torrent: (_headers = {}) => ({}),\n};\n\nconst streamDecoder = {\n  // https://github.com/Dash-Industry-Forum/dash.js\n  customDash: (video: HTMLVideoElement, url: string, config: IDashConfig): IDashInstance => {\n    if (Dashjs.supportsMediaSource()) {\n      // @ts-expect-error declared but its value is never read\n      // eslint-disable-next-line ts/no-unused-vars\n      const { autoplay = false, isLive = false, options = {}, headers = {} } = config;\n\n      const dash = Dashjs.MediaPlayer().create();\n      if (Object.keys(headers).length > 0) {\n        // 新 v5\n        const interceptor = (request) => {\n          request.headers = headers;\n          return Promise.resolve(request);\n        };\n        dash.addRequestInterceptor(interceptor);\n\n        // 旧\n        // dash.extend(\n        //   'RequestModifier',\n        //   function () {\n        //     return {\n        //       modifyRequestHeader(xhr: XMLHttpRequest) {\n        //         // Add custom header. Requires to set up Access-Control-Allow-Headers in your\n        //         // response header in the server side. Reference: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/setRequestHeader\n        //         // xhr.withCredentials = true; // do send cookies\n        //         for (const key in headers) {\n        //           xhr.setRequestHeader(key, headers[key]);\n        //         }\n        //         return xhr;\n        //       },\n        //       modifyRequestURL(url: string) {\n        //         // Modify url adding a custom query string parameter\n        //         return url;\n        //       },\n        //     };\n        //   },\n        //   true,\n        // );\n      }\n      dash.initialize(video, url, autoplay);\n      dash.updateSettings({});\n      return dash;\n    } else {\n      console.warn('dash is not supported.');\n      return undefined;\n    }\n  },\n  // https://github.com/Bilibili/flv.js\n  customFlv: (video: HTMLVideoElement, url: string, config: IFlvConfig): IFlvInstance => {\n    if (Flvjs.isSupported()) {\n      // @ts-expect-error declared but its value is never read\n      // eslint-disable-next-line ts/no-unused-vars\n      const { autoplay = false, isLive = false, optionalConfig = {}, mediaDataSource = {}, headers = {} } = config;\n      const flv = Flvjs.createPlayer(\n        { type: 'flv', url, ...mediaDataSource },\n        { ...streamConfig.flv.optional(headers), ...optionalConfig },\n      );\n      flv.attachMediaElement(video);\n      flv.load();\n      return flv;\n    } else {\n      console.warn('flvjs is not supported.');\n      return undefined;\n    }\n  },\n  // https://github.com/video-dev/hls.js\n  customHls: (video: HTMLVideoElement, url: string, config: IHlsConfig): IHlsInstance => {\n    if (Hlsjs.isSupported()) {\n      // @ts-expect-error declared but its value is never read\n      // eslint-disable-next-line ts/no-unused-vars\n      const { autoplay = false, isLive = false, options = {}, headers = {} } = config;\n\n      const hls = new Hlsjs({ ...streamConfig.hls(headers), ...options });\n      hls.loadSource(url);\n      hls.attachMedia(video);\n      return hls;\n    } else {\n      console.warn('Hls is not supported.');\n      return undefined;\n    }\n  },\n  // https://github.com/xqq/mpegts.js\n  // https:github.com/xqq/mpegts.js/blob/master/docs/api.md\n  customMpegts: (video: HTMLVideoElement, url: string, config: IMpegtsConfig): IMpegtsInstance => {\n    if (Mpegtsjs.isSupported()) {\n      // @ts-expect-error declared but its value is never read\n      // eslint-disable-next-line ts/no-unused-vars\n      const { autoplay = false, isLive = false, mediaDataSource = {}, optionalConfig = {}, headers = {} } = config;\n\n      const mpegts = Mpegtsjs.createPlayer(\n        {\n          type: 'mpegts', // mse, mpegts, m2ts, flv, mp4\n          isLive,\n          url,\n          ...mediaDataSource,\n        },\n        { ...streamConfig.mpegts.optional(headers), ...optionalConfig },\n      );\n      mpegts.attachMediaElement(video);\n      mpegts.load();\n      mpegts.play();\n      return mpegts;\n    } else {\n      console.warn('mpegts is not supported.');\n      return undefined;\n    }\n  },\n  // https://github.com/shaka-project/shaka-player\n  // customShaka: (video: HTMLVideoElement, url: string, config: IShakaConfig): IShakaInstance => {\n  //   if (Shakajs.Player.isBrowserSupported()) {\n  //     // eslint-disable-next-line ts/no-unused-vars\n  //     const { autoplay = false, isLive = false, options = {}, headers = {} } = config;\n\n  //     const shaka = new Shakajs.Player(video);\n  //     if (Object.keys(headers).length > 0) {\n  //       shaka.getNetworkingEngine()!.registerRequestFilter(function (type, request: Shakajs.extern.Request) {\n  //         if (type !== Shakajs.net.NetworkingEngine.RequestType.MANIFEST) {\n  //           return;\n  //         }\n  //         for (const header in headers) {\n  //           request.headers[header] = headers[header];\n  //         }\n  //       });\n  //     }\n  //     shaka.load(url);\n  //     shaka.configure(Object.assign({}, streamConfig.shaka, options));\n  //     return shaka;\n  //   } else {\n  //     console.warn('shaka is not supported.');\n  //     return undefined;\n  //   }\n  // },\n  // https://github.com/webtorrent/webtorrent\n  customTorrent: (video: HTMLVideoElement, url: string, config: ITorrentConfig): ITorrentInstance => {\n    if (WebTorrentjs.WEBRTC_SUPPORT) {\n      // @ts-expect-error declared but its value is never read\n      // eslint-disable-next-line ts/no-unused-vars\n      const { autoplay = false, isLive = false, options = {}, headers = {} } = config;\n      const client = new WebTorrentjs({ ...streamConfig.torrent(headers), ...options });\n      const torrentParsed = magnet.decode(url);\n      if (!torrentParsed.tr || torrentParsed.tr.length === 0) {\n        const trackers = [\n          'udp://tracker.opentrackr.org:1337',\n          'udp://exodus.desync.com:6969',\n          'wss://tracker.btorrent.xyz',\n          'wss://tracker.fastcast.nz',\n          'wss://tracker.openwebtorrent.com',\n        ];\n\n        torrentParsed.tr = trackers;\n        torrentParsed.announce = trackers;\n      }\n      const torrentId = magnet.encode(torrentParsed);\n\n      video.preload = 'metadata';\n      client.add(torrentId, (torrent) => {\n        const file = torrent.files.find((file) => {\n          return file.name.endsWith('.mp4') || file.name.endsWith('.mkv');\n        }) as WebTorrentjs.TorrentFile;\n        file.renderTo(video, { autoplay, controls: false }); // 旧 0.98.18 版本\n        // file.streamTo(video, { autoplay, controls: false }); // 新 1.9.7 版本\n      });\n      return client;\n    } else {\n      console.warn('Webtorrent is not supported.');\n      return undefined;\n    }\n  },\n};\n\nexport { streamConfig, streamDecoder };\n"
  },
  {
    "path": "src/renderer/src/components/multi-player/src/utils/tool.ts",
    "content": "import { convertStandardToUri, convertWebToElectron, isSafeHeader, removeUnSafeHeaders } from '@shared/modules/headers';\nimport singleton from '@shared/modules/singleton';\n\nimport { sendRecBarrage } from '@/api/film';\nimport { normalRequest } from '@/utils/request';\n\nimport type { IDecoderType, IDecoderWithAutoType } from '../types';\n\nconst publicBarrageSend = (options: any) => {\n  try {\n    if (!options.id || !options.text || Number.isNaN(Number.parseFloat(options.time))) {\n      return;\n    }\n\n    const doc = {\n      id: options.id,\n      text: options.text,\n      time: options.time,\n      color: options.color,\n      type: options.type,\n    };\n\n    sendRecBarrage(doc);\n  } catch {}\n};\n\nconst mediaUtils = (() => {\n  /**\n   * 获取文件扩展名（支持URL、路径和特殊协议识别）\n   * @param {string} input - 输入字符串（URL、文件路径或特殊协议）\n   * @returns {string} 文件扩展名（小写），无扩展名返回空字符串\n   */\n  const getFileExtension = (input: string): string => {\n    if (!input?.trim()) return '';\n\n    // 特殊协议处理\n    const protocolPatterns = [\n      { pattern: /^magnet:/i, ext: 'magnet' },\n      { pattern: /^thunder:/i, ext: 'thunder' },\n      { pattern: /^ed2k:/i, ext: 'ed2k' },\n    ];\n\n    for (const { pattern, ext } of protocolPatterns) {\n      if (pattern.test(input)) return ext;\n    }\n\n    // 处理URL查询参数和哈希\n    const cleanInput = input.split(/[?#]/)[0];\n\n    // 获取最后一个点号后的内容\n    const lastDotIndex = cleanInput.lastIndexOf('.');\n    if (lastDotIndex === -1) return '';\n\n    const extension = cleanInput.slice(lastDotIndex + 1).toLowerCase();\n    return /^[a-z0-9]+$/i.test(extension) ? extension : '';\n  };\n\n  /**\n   * 内容类型到文件扩展名的映射表\n   * 包含视频、音频和流媒体格式的常见MIME类型\n   */\n  const MIME_TO_EXTENSION: Readonly<Record<string, string>> = {\n    // 视频格式\n    'video/mp4': 'mp4',\n    'video/quicktime': 'mov',\n    'video/x-matroska': 'mkv',\n    'video/x-flv': 'flv',\n    'video/x-msvideo': 'avi', // AVI格式的两种MIME类型\n    'video/avi': 'avi',\n    'video/x-ms-wmv': 'wmv',\n    'video/3gpp': '3gp',\n    'video/ogg': 'ogv', // 更正视频OGG的标准扩展名\n    'video/webm': 'webm',\n\n    // 流媒体格式\n    'application/vnd.apple.mpegurl': 'm3u8',\n    'application/x-mpegURL': 'm3u8',\n    'application/dash+xml': 'mpd',\n    'application/octet-stream': 'm3u8', // 常见于HLS流\n\n    // 音频格式\n    'audio/mpeg': 'mp3',\n    'audio/wav': 'wav',\n    'audio/x-wav': 'wav',\n    'audio/aac': 'aac',\n    'audio/ogg': 'oga',\n    'audio/flac': 'flac',\n    'audio/x-m4a': 'm4a',\n\n    // 现代格式\n    'video/mp2t': 'ts', // MPEG传输流\n    'application/vnd.ms-sstr+xml': 'ism', // Smooth Streaming\n  };\n\n  // 反向映射：扩展名到内容类型\n  const EXTENSION_TO_MIME: Readonly<Record<string, string>> = Object.entries(MIME_TO_EXTENSION).reduce(\n    (acc, [contentType, extension]) => {\n      // 确保每个扩展名只映射到一个内容类型\n      if (!acc[extension]) {\n        acc[extension] = contentType;\n      }\n      return acc;\n    },\n    {} as Record<string, string>,\n  );\n\n  /**\n   * 根据内容类型获取文件扩展名\n   */\n  const getExtensionFromMime = (mime: string): string | undefined => {\n    return MIME_TO_EXTENSION[mime?.toLowerCase()];\n  };\n\n  /**\n   * 根据文件扩展名获取内容类型\n   */\n  const getMimeFromExtension = (extension: string): string | undefined => {\n    return EXTENSION_TO_MIME[extension?.toLowerCase()];\n  };\n\n  /**\n   * 视频类型与播放器映射\n   */\n  const extensionMapDecoder = (type: string): IDecoderType | undefined => {\n    switch (type) {\n      case 'hls':\n      case 'm3u8':\n        return 'hls';\n      case 'dash':\n      case 'm4s':\n      case 'mpd':\n        return 'dash'; // dash/shaka\n      case 'flv':\n        return 'flv';\n      case 'ts':\n      case 'mpegts':\n      case 'm2ts':\n        return 'mpegts';\n      case 'webtorrent':\n      case 'torrent':\n      case 'magnet':\n        return 'torrent';\n      case 'mp4':\n      case 'mkv':\n        return 'mp4';\n      case 'mp3':\n      case 'm4a':\n      case '3gp':\n      case 'ogg':\n      case 'webm':\n        return 'audio';\n      default:\n        return undefined;\n    }\n  };\n\n  const getDecoderFromExtension = (type: string): IDecoderWithAutoType => {\n    return extensionMapDecoder(type) || 'auto';\n  };\n\n  /**\n   * 检测媒体资源的实际类型\n   * @param {string} url - 媒体资源URL\n   * @param {Record<string, any>} headers - 请求头\n   * @returns {Promise<string | undefined>} 媒体类型标识符或undefined\n   */\n  const getStreamContentType = async (url: string, headers: Record<string, any> = {}): Promise<string | undefined> => {\n    const REQUEST_METHODS = ['HEAD', 'GET'];\n\n    const baseHeaders = {\n      ...convertWebToElectron(headers),\n      Range: 'bytes=0-1',\n      Accept: '*/*',\n    };\n\n    for (const method of REQUEST_METHODS) {\n      try {\n        const resp = await normalRequest.request({\n          url,\n          method,\n          headers: baseHeaders,\n        });\n\n        // 处理部分内容响应(206)和完整响应(200)\n        if (resp.status === 200 || resp.status === 206) {\n          const contentType = resp.headers['content-type']?.split(';')[0]?.trim();\n          if (contentType) return contentType;\n        }\n      } catch (error) {\n        console.error(`[mediaUtils][getMediaType][${method}][error]:`, error);\n      }\n    }\n\n    return undefined;\n  };\n\n  /**\n   * 获取媒体流的内容类型并转换为文件扩展名\n   * @param {string} url - 媒体资源URL\n   * @param {Record<string, any>} headers - 请求头\n   * @returns {Promise<string | undefined>} 文件扩展名或undefined\n   */\n  const getStreamContentTypeToExtension = async (\n    url: string,\n    headers: Record<string, any> = {},\n  ): Promise<string | undefined> => {\n    const contentType = await getStreamContentType(url, headers);\n    if (!contentType) return undefined;\n\n    // video/mp4; charset=utf-8\n    // video/mp4\n    // video/mp4;\n    const formatContentType = contentType.includes(';') ? contentType.split(';')?.[0] : contentType;\n    const normalizedType = formatContentType?.trim()?.toLowerCase();\n    const mimeExtension = getExtensionFromMime(normalizedType);\n\n    if (!mimeExtension) return undefined;\n\n    return mimeExtension;\n  };\n\n  /**\n   * 检测链接协议\n   * @param {string} url - 媒体资源URL\n   * @returns {boolean} 是否有效协议\n   */\n  const isValidMediaUrl = (url: string): boolean => {\n    if (!url) return false;\n\n    const VALID_PROTOCOLS = ['http:', 'https:', 'magnet:'];\n    try {\n      const { protocol } = new URL(url);\n      return VALID_PROTOCOLS.includes(protocol);\n    } catch {\n      return false;\n    }\n  };\n\n  /**\n   * 检测媒体资源的类型，优先使用URL扩展名，其次使用Content-Type头\n   * @param url 媒体资源URL\n   * @param headers 请求头\n   * @returns 媒体类型标识符或undefined\n   */\n  const checkMediaType = async (url: string, headers: Record<string, any> = {}): Promise<string | undefined> => {\n    if (!isValidMediaUrl(url)) return undefined;\n\n    // 1. 首先尝试从URL扩展名获取类型\n    const urlExtension = getFileExtension(url);\n    console.debug('[mediaUtils][checkMediaType] urlExtension:', urlExtension);\n    const urlDecoder = extensionMapDecoder(urlExtension);\n    console.debug('[mediaUtils][checkMediaType] urlDecoder:', urlDecoder);\n    if (urlDecoder) return urlExtension;\n\n    // 2. 如果扩展名无法确定，尝试从Content-Type获取\n    try {\n      const contentTypeExtension = await getStreamContentTypeToExtension(url, headers);\n      if (!contentTypeExtension) return undefined;\n\n      const mimeDecoder = extensionMapDecoder(contentTypeExtension);\n      if (mimeDecoder) return contentTypeExtension;\n\n      return undefined;\n    } catch (error) {\n      console.error(`[mediaUtils][checkMediaType][error]:`, error);\n    }\n\n    return undefined;\n  };\n\n  /**\n   * 检测浏览器是否支持 HEVC (H.265) 视频格式\n   * ref: https://github.com/StaZhu/enable-chromium-hevc-hardware-decoding#mediacapabilities\n   * @returns 返回布尔值，true 表示支持，false 表示不支持\n   */\n  const isHEVCVideoSupported = (): boolean => {\n    // hvc1.1.6.L123.B0 参数的一部分（显然是一个表示 HEVC 及其配置文件的值）。\n    return document.createElement('video').canPlayType('video/mp4; codecs=\"hvc1.1.6.L123.B0\"') === 'probably';\n  };\n\n  // 导出函数\n  return {\n    checkMediaType,\n    removeUnSafeHeaders,\n    convertStandardToUri,\n    convertWebToElectron,\n    getExtensionFromMime,\n    getMimeFromExtension,\n    getFileExtension,\n    getStreamContentTypeToExtension,\n    getDecoderFromExtension,\n    getStreamContentType,\n    isHEVCVideoSupported,\n    isSafeHeader,\n    isValidMediaUrl,\n  };\n})();\n\nexport { mediaUtils, publicBarrageSend, singleton };\n"
  },
  {
    "path": "src/renderer/src/components/play-show/index.vue",
    "content": "<template>\n  <div v-if=\"playerStutus.status\" class=\"player-show\" @click=\"focusPlayerWindowEvent\">\n    <t-button theme=\"default\" shape=\"square\" variant=\"text\" class=\"btn\">\n      <template #icon><video-library-icon /></template>\n    </t-button>\n\n    <div ref=\"marqueeContainerRef\" class=\"title-warp\">\n      <span ref=\"marqueeTextRef\" class=\"title\">{{ playerStutus.title }}</span>\n    </div>\n\n    <t-button theme=\"default\" shape=\"square\" variant=\"text\" class=\"btn\" @click.stop=\"destroyPlayerWindowEvent\">\n      <template #icon><close-icon /></template>\n    </t-button>\n  </div>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'PlayerShow',\n});\n\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { WINDOW_NAME } from '@shared/config/window';\nimport { CloseIcon, VideoLibraryIcon } from 'tdesign-icons-vue-next';\nimport { computed, nextTick, onMounted, useTemplateRef, watch } from 'vue';\n\nimport { usePlayerStore } from '@/store';\n\nconst playerStore = usePlayerStore();\nconst marqueeContainerRef = useTemplateRef('marqueeContainerRef');\nconst marqueeTextRef = useTemplateRef('marqueeTextRef');\n\nconst playerStutus = computed(() => {\n  return {\n    status: playerStore.status,\n    title:\n      playerStore.type === 'film'\n        ? (playerStore.data.info as { vod_name: string }).vod_name\n        : (playerStore.data.info as { name: string }).name,\n  };\n});\n\nwatch(\n  () => playerStutus.value.title,\n  () => playerStutus.value.status && nextTick(() => setMarqueeAnimation()),\n);\n\nonMounted(() => setup());\n\nconst setup = async () => {\n  nextTick(() => setMarqueeAnimation());\n\n  if (!(await window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_STATUS, WINDOW_NAME.PLAYER))) {\n    playerStore.updateConfig({ status: false });\n  }\n};\n\nconst setMarqueeAnimation = () => {\n  const containerRef = marqueeContainerRef.value;\n  const textRef = marqueeTextRef.value;\n\n  if (containerRef && textRef) {\n    const containerWidth = containerRef.getBoundingClientRect().width;\n    const textWidth = textRef.getBoundingClientRect().width;\n\n    if (textWidth > containerWidth) {\n      const duration = textWidth / 20;\n      textRef.style.animationDuration = `${duration}s`;\n    } else {\n      textRef.style.animationDuration = '0s';\n    }\n  }\n};\n\nconst focusPlayerWindowEvent = async () => {\n  if (!(await window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_STATUS, WINDOW_NAME.PLAYER))) {\n    playerStore.updateConfig({ status: false });\n  } else {\n    window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_SHOW, WINDOW_NAME.PLAYER);\n  }\n};\n\nconst destroyPlayerWindowEvent = () => {\n  playerStore.updateConfig({ status: false });\n\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_DESTROY, WINDOW_NAME.PLAYER);\n};\n</script>\n<style lang=\"less\" scoped>\n.player-show {\n  background: var(--td-bg-color-container-hover);\n  border-radius: var(--td-radius-medium);\n  display: flex;\n  cursor: pointer;\n\n  .t-button {\n    &:not(.t-is-disabled, .t-button--ghost) {\n      &:hover {\n        background-color: transparent !important;\n      }\n    }\n  }\n\n  .title-warp {\n    display: flex;\n    align-items: center;\n    overflow: hidden;\n    max-width: 100px;\n    transition: max-width 0.3s ease;\n\n    .title {\n      display: inline-block;\n      white-space: nowrap;\n      color: var(--td-text-color-secondary);\n      animation: marquee linear infinite;\n      user-select: none;\n    }\n\n    @keyframes marquee {\n      0% {\n        transform: translateX(10%);\n      }\n\n      100% {\n        transform: translateX(-100%);\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/quick-menu/components/Ai.vue",
    "content": "<template>\n  <div class=\"quick-menu__ai\">\n    <t-button theme=\"default\" shape=\"square\" class=\"btn\" @click=\"switchDrawer\">\n      <template #icon><robot2-icon /></template>\n    </t-button>\n\n    <t-drawer\n      v-model:visible=\"active.visible\"\n      :attach=\"`.${attachContent}`\"\n      show-in-attached-element\n      size=\"420px\"\n      :size-draggable=\"{\n        min: 420,\n        max: 900,\n      }\"\n      :header=\"$t('aigc.title')\"\n      :show-overlay=\"false\"\n      :close-btn=\"true\"\n      :footer=\"false\"\n      class=\"drawer-box\"\n    >\n      <aigc />\n    </t-drawer>\n  </div>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'QuickMenuAi',\n});\n\nimport { Robot2Icon } from 'tdesign-icons-vue-next';\nimport { ref } from 'vue';\n\nimport { attachContent } from '@/config/global';\n\nimport Aigc from '../../aigc/index.vue';\n\nconst active = ref({\n  visible: false,\n  draggable: false,\n});\n\nconst switchDrawer = () => {\n  active.value.visible = !active.value.visible;\n};\n</script>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "src/renderer/src/components/quick-menu/components/Lab.vue",
    "content": "<template>\n  <div class=\"quick-menu__lab\">\n    <t-button theme=\"default\" shape=\"square\" class=\"btn\" @click=\"goNav\">\n      <template #icon><fill-color-1-icon /></template>\n    </t-button>\n  </div>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'QuickMenuLab',\n});\n\nimport { FillColor1Icon } from 'tdesign-icons-vue-next';\nimport { useRouter } from 'vue-router';\n\nconst router = useRouter();\n\nconst goNav = () => {\n  router.push({ name: 'Lab' });\n};\n</script>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "src/renderer/src/components/quick-menu/components/Language.vue",
    "content": "<template>\n  <div class=\"quick-menu__language\">\n    <t-dropdown trigger=\"click\">\n      <t-button theme=\"default\" shape=\"square\" class=\"btn\">\n        <template #icon><translate-icon /></template>\n      </t-button>\n      <t-dropdown-menu>\n        <t-dropdown-item\n          v-for=\"item in LANG_OPTIONS\"\n          :key=\"item.value\"\n          :value=\"item.value\"\n          :active=\"theme === item.value\"\n          @click=\"setLanguage(item.value as ILang)\"\n        >\n          {{ item.label }}\n        </t-dropdown-item>\n      </t-dropdown-menu>\n    </t-dropdown>\n  </div>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'QuickMenuLanguage',\n});\n\nimport type { ILang } from '@shared/locales';\nimport { TranslateIcon } from 'tdesign-icons-vue-next';\nimport { computed } from 'vue';\n\nimport { putSetting } from '@/api/setting';\nimport { langList, t } from '@/locales';\nimport { useSettingStore } from '@/store';\n\nconst storeSetting = useSettingStore();\n\nconst LANG_OPTIONS = computed(() => [\n  { value: 'auto', label: t('common.followSystem') },\n  ...langList.value.map((lang) => ({ value: lang.value, label: lang.label })),\n]);\nconst theme = computed(() => storeSetting.displayLang);\n\nconst setLanguage = async (lang: ILang) => {\n  storeSetting.updateConfig({ lang });\n\n  await putSetting({ key: 'lang', value: lang });\n};\n</script>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "src/renderer/src/components/quick-menu/components/Setting.vue",
    "content": "<template>\n  <div class=\"quick-menu__setting\">\n    <t-button theme=\"default\" shape=\"square\" class=\"btn\" @click=\"goNav\">\n      <template #icon><setting1-icon /></template>\n    </t-button>\n  </div>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'QuickMenuSetting',\n});\n\nimport { Setting1Icon } from 'tdesign-icons-vue-next';\nimport { useRouter } from 'vue-router';\n\nconst router = useRouter();\n\nconst goNav = () => {\n  router.push({ name: 'Setting' });\n};\n</script>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "src/renderer/src/components/quick-menu/components/Sponsor.vue",
    "content": "<template>\n  <div class=\"quick-menu__sponsor\">\n    <t-popup placement=\"bottom\" :attach=\"`.${attachContent}`\" show-in-attached-element trigger=\"click\">\n      <t-button theme=\"default\" shape=\"square\" class=\"btn\">\n        <template #icon><gift-icon /></template>\n      </t-button>\n      <template #content>\n        <div class=\"sponsor_main\">\n          <div class=\"sponsor-title\">{{ $t('component.sponsor.buyCoffee') }}</div>\n          <div class=\"sponsor-container\">\n            <div class=\"sponsor-arrow\"></div>\n            <div class=\"sponsor-qrcode\">\n              <t-image\n                v-if=\"isCHS\"\n                :src=\"IMG_QR_ALIWECHAT\"\n                lazy\n                shape=\"round\"\n                :style=\"{ width: '126px', height: '126px' }\"\n              />\n              <t-image v-else :src=\"IMG_QR_KOFI\" lazy shape=\"round\" :style=\"{ width: '126px', height: '126px' }\" />\n            </div>\n            <div class=\"sponsor-support\">\n              <p class=\"sponsor-support-info\">{{ $t('common.support') }}</p>\n              <div class=\"sponsor-support-platform\">\n                <template v-if=\"isCHS\">\n                  <t-image :src=\"IMG_PLATFORM_ALI\" lazy shape=\"round\" :style=\"{ width: '16px', height: '16px' }\" />\n                  <t-image :src=\"IMG_PLATFORM_WECHAT\" lazy shape=\"round\" :style=\"{ width: '16px', height: '16px' }\" />\n                </template>\n                <t-image\n                  v-else\n                  :src=\"IMG_PLATFORM_KOFI\"\n                  lazy\n                  shape=\"round\"\n                  :style=\"{ width: '16px', height: '16px' }\"\n                />\n              </div>\n              <p class=\"sponsor-support-info\">{{ $t('component.sponsor.scanDonate') }}</p>\n            </div>\n          </div>\n        </div>\n      </template>\n    </t-popup>\n  </div>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'QuickMenuSponsor',\n});\n\nimport { GiftIcon } from 'tdesign-icons-vue-next';\nimport { computed } from 'vue';\n\nimport IMG_PLATFORM_ALI from '@/assets/pay/platform-ali.webp';\nimport IMG_PLATFORM_KOFI from '@/assets/pay/platform-kofi.webp';\nimport IMG_PLATFORM_WECHAT from '@/assets/pay/platform-wechat.webp';\nimport IMG_QR_ALIWECHAT from '@/assets/pay/qr-ali_wechat.webp';\nimport IMG_QR_KOFI from '@/assets/pay/qr-kofi.webp';\nimport { attachContent } from '@/config/global';\nimport { useSettingStore } from '@/store';\n\nconst storeSetting = useSettingStore();\n\nconst isCHS = computed(() => storeSetting.isCHS);\n</script>\n<style lang=\"less\" scoped>\n.sponsor_main {\n  .sponsor-title {\n    text-align: center;\n    font-size: 16px;\n    line-height: 16px;\n    font-weight: 700;\n    color: var(--td-warning-color-6);\n  }\n\n  .sponsor-container {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n\n    .sponsor-arrow {\n      width: 0;\n      height: 0;\n      border-left: 4px solid transparent;\n      border-right: 4px solid transparent;\n      border-top: 6px solid var(--td-warning-color-6);\n      margin: var(--td-comp-paddingLR-xs) 0 var(--td-comp-paddingLR-xxs);\n    }\n\n    .sponsor-qrcode {\n      width: 132px;\n      height: 132px;\n      padding: var(--td-comp-paddingTB-xxs) var(--td-comp-paddingLR-xxs);\n      border: 1px solid var(--td-warning-color-6);\n      border-radius: var(--td-radius-s);\n      overflow: hidden;\n    }\n\n    .sponsor-support {\n      margin-top: 2px;\n      display: flex;\n      flex-direction: row;\n      justify-content: center;\n      gap: var(--td-size-2);\n\n      &-platform {\n        display: flex;\n        align-items: center;\n        gap: var(--td-size-1);\n      }\n\n      &-info {\n        font: var(--td-font-link-small);\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/quick-menu/components/Theme.vue",
    "content": "<template>\n  <div class=\"quick-menu__theme\">\n    <t-dropdown trigger=\"click\">\n      <t-button theme=\"default\" shape=\"square\" class=\"btn\">\n        <template #icon>\n          <component :is=\"themeIcon\" />\n        </template>\n      </t-button>\n      <t-dropdown-menu>\n        <t-dropdown-item\n          v-for=\"item in THEME_OPTIONS\"\n          :key=\"item.value\"\n          :value=\"item.value\"\n          :active=\"theme === item.value\"\n          @click=\"setTheme(item.value as ITheme)\"\n        >\n          <component :is=\"item.icon\" size=\"large\" />\n          <span class=\"theme-title\">{{ item.label }}</span>\n        </t-dropdown-item>\n      </t-dropdown-menu>\n    </t-dropdown>\n  </div>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'QuickMenuTheme',\n});\n\nimport type { ITheme } from '@shared/config/theme';\nimport { THEME } from '@shared/config/theme';\nimport { ContrastIcon, ModeDarkIcon, ModeLightIcon } from 'tdesign-icons-vue-next';\nimport { computed } from 'vue';\n\nimport { putSetting } from '@/api/setting';\nimport { t } from '@/locales';\nimport { useSettingStore } from '@/store';\n\nconst storeSetting = useSettingStore();\n\nconst THEME_OPTIONS = computed(() => [\n  { value: THEME.SYSTEM, label: t('common.followSystem'), icon: ContrastIcon },\n  { value: THEME.LIGHT, label: t('common.theme.light'), icon: ModeLightIcon },\n  { value: THEME.DARK, label: t('common.theme.dark'), icon: ModeDarkIcon },\n]);\nconst theme = computed(() => storeSetting.theme);\nconst themeIcon = computed(() => {\n  return THEME_OPTIONS.value.find((item) => item.value === theme.value)?.icon;\n});\n\nconst setTheme = async (theme: ITheme) => {\n  storeSetting.updateConfig({ theme });\n\n  await putSetting({ key: 'theme', value: theme });\n};\n</script>\n<style lang=\"less\" scoped>\n.theme-title {\n  margin-left: var(--td-comp-margin-xs);\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/quick-menu/index.vue",
    "content": "<template>\n  <div class=\"quick-menu\">\n    <sponsor v-if=\"!isFilter('sponsor')\" class=\"system-function\" />\n    <ai v-if=\"!isFilter('ai')\" class=\"system-function\" />\n    <language v-if=\"!isFilter('language')\" class=\"system-function\" />\n    <theme v-if=\"!isFilter('skin')\" class=\"system-function\" />\n    <lab v-if=\"!isFilter('lab')\" class=\"system-function\" />\n    <setting v-if=\"!isFilter('setting')\" class=\"system-function\" />\n  </div>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'QuickMenu',\n});\n\nconst props = defineProps({\n  filter: {\n    type: Array,\n    default: () => [],\n  },\n});\n\nimport Ai from './components/Ai.vue';\nimport Lab from './components/Lab.vue';\nimport Language from './components/Language.vue';\nimport Setting from './components/Setting.vue';\nimport Sponsor from './components/Sponsor.vue';\nimport Theme from './components/Theme.vue';\n\nconst isFilter = (name: string) => {\n  return props.filter.includes(name);\n};\n</script>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "src/renderer/src/components/render-icon/index.vue",
    "content": "<template>\n  <KeepAlive :max=\"100\">\n    <component :is=\"rowComponent\" v-bind=\"$attrs\" />\n  </KeepAlive>\n</template>\n<script lang=\"ts\" setup>\ndefineOptions({\n  name: 'RenderIcon',\n});\n\nconst { name } = defineProps({\n  name: {\n    type: String,\n  },\n});\n\nimport { manifest } from 'tdesign-icons-vue-next';\nimport * as Icons from 'tdesign-icons-vue-next/lib/icons';\nimport { computed } from 'vue';\n\nconst componentNames = new Map();\nmanifest.forEach((value) => {\n  componentNames.set(`${value.icon}Icon`, `${value.stem}-icon`);\n});\nconst components = new Map();\nObject.entries(Icons).forEach((value) => {\n  const name = componentNames.get(value[0]);\n  if (name) {\n    components.set(name, value[1]);\n  }\n});\n\nconst rowComponent = computed(() => {\n  if (!name) {\n    return null;\n  }\n  return components.get(`${name}-icon`);\n});\n</script>\n"
  },
  {
    "path": "src/renderer/src/components/render-markdown/index.vue",
    "content": "<template>\n  <t-chat-markdown :content=\"mdContent\" :options=\"mdOptions\" />\n</template>\n<script lang=\"ts\" setup>\ndefineOptions({\n  name: 'RenderMarkdown',\n});\n\nconst props = defineProps({\n  text: {\n    type: String,\n    default: '',\n  },\n});\n\nimport { THEME } from '@shared/config/theme';\nimport { ref, watch } from 'vue';\n\nimport { useSettingStore } from '@/store';\n\nconst storeSetting = useSettingStore();\n\nconst mdContent = ref(props.text);\nconst mdOptions = ref({\n  themeSettings: {\n    codeBlockTheme: storeSetting.displayTheme === THEME.LIGHT ? THEME.LIGHT : THEME.DARK,\n  },\n});\n\nwatch(\n  () => props.text,\n  (val) => (mdContent.value = val),\n);\nwatch(\n  () => storeSetting.displayTheme,\n  () =>\n    (mdOptions.value.themeSettings.codeBlockTheme =\n      storeSetting.displayTheme === THEME.LIGHT ? THEME.LIGHT : THEME.DARK),\n);\n</script>\n<style lang=\"css\" scoped></style>\n"
  },
  {
    "path": "src/renderer/src/components/router-control/index.vue",
    "content": "<template>\n  <div class=\"router-control\">\n    <t-button\n      v-if=\"!isFilter('back')\"\n      theme=\"default\"\n      shape=\"square\"\n      :disabled=\"!active.back\"\n      class=\"control-button control-button__back\"\n      @click=\"goBack\"\n    >\n      <template #icon><chevron-left-icon /></template>\n    </t-button>\n\n    <t-button\n      v-if=\"!isFilter('forward')\"\n      theme=\"default\"\n      shape=\"square\"\n      :disabled=\"!active.forward\"\n      class=\"control-button control-button__forward\"\n      @click=\"goForward\"\n    >\n      <template #icon><chevron-right-icon /></template>\n    </t-button>\n\n    <t-button\n      v-if=\"!isFilter('refresh')\"\n      theme=\"default\"\n      shape=\"square\"\n      class=\"control-button control-button__refresh\"\n      @click=\"goRefresh\"\n    >\n      <template #icon><rotate-icon /></template>\n    </t-button>\n  </div>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'RouterControl',\n});\n\nconst props = defineProps({\n  filter: {\n    type: Array,\n    default: () => [],\n  },\n});\n\nimport { ChevronLeftIcon, ChevronRightIcon, RotateIcon } from 'tdesign-icons-vue-next';\nimport { ref, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\n\nimport { emitterChannel, emitterSource } from '@/config/emitterChannel';\nimport emitter from '@/utils/emitter';\n\nconst router = useRouter();\nconst route = useRoute();\n\nconst active = ref({\n  back: false,\n  forward: false,\n});\n\nwatch(route, () => {\n  const routeState = window.history.state || {};\n  active.value.back = !!routeState?.back;\n  active.value.forward = !!routeState?.forward;\n});\n\nconst isFilter = (name: string) => {\n  return props.filter.includes(name);\n};\n\nconst goBack = () => router.back();\n\nconst goForward = () => router.forward();\n\nconst goRefresh = () => {\n  const reloadableModules = new Set(['Film', 'Live', 'Parse', 'Moment']);\n  const name = route.name as string | undefined;\n\n  if (name && reloadableModules.has(name)) {\n    const channel = emitterChannel[`REFRESH_${name.toUpperCase()}_CONFIG`];\n    emitter.emit(channel, { source: emitterSource.LAYOUT_HEADER_SEARCH });\n\n    emitter.emit(emitterChannel.SEARCH_RECOMMEND, { source: emitterSource.LAYOUT_HEADER_ROUTER, data: '' });\n  } else {\n    // file protocol not supported reload\n    window.location.href = window.location.href.replace(/\\?.*|$/, `?_t=${Date.now()}`);\n  }\n};\n</script>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "src/renderer/src/components/search-panel/index.vue",
    "content": "<template>\n  <div v-if=\"isSearchableRoute\" class=\"search-panel\">\n    <t-popup\n      placement=\"bottom\"\n      :attach=\"`.${attachContent}`\"\n      :z-index=\"20\"\n      hide-empty-popup\n      :visible=\"isPopupVisible\"\n      :overlay-inner-style=\"{ borderRadius: 'var(--td-radius-large)' }\"\n      @visible-change=\"handlePopupVisible\"\n    >\n      <t-input\n        v-model=\"searchValue\"\n        :placeholder=\"$t('component.search.placeholder.input')\"\n        class=\"search-input\"\n        @enter=\"handleSearch\"\n        @click=\"handleInputFocus\"\n      >\n        <template #label>\n          <t-select\n            v-if=\"activeRouteName === 'Film'\"\n            v-model=\"filmConfig.filmGroupType\"\n            auto-width\n            class=\"search-select\"\n            @click.stop\n          >\n            <t-option key=\"site\" :label=\"$t('pages.setting.base.site.searchMap.local')\" value=\"site\" />\n            <t-option key=\"group\" :label=\"$t('pages.setting.base.site.searchMap.group')\" value=\"group\" />\n            <t-option key=\"all\" :label=\"$t('pages.setting.base.site.searchMap.all')\" value=\"all\" />\n          </t-select>\n        </template>\n        <template #suffix>\n          <template v-if=\"searchValue\">\n            <t-button shape=\"square\" size=\"small\" class=\"suffix-btn\" @click.stop=\"handleSearch('')\">\n              <close-circle-filled-icon />\n            </t-button>\n            <t-divider layout=\"vertical\" />\n          </template>\n          <t-button shape=\"square\" size=\"small\" class=\"suffix-btn\" @click.stop=\"handleSearch(searchValue)\">\n            <template #icon><search-icon /></template>\n          </t-button>\n        </template>\n      </t-input>\n\n      <template #content>\n        <div v-if=\"(isSearchableRoute && historyList.length > 0) || isHotableRoute\" class=\"search-recommend\">\n          <div v-show=\"isSearchableRoute && historyList.length > 0\" class=\"search-recommend-top\">\n            <div class=\"search-textlist\">\n              <div class=\"search-textlist-title\">{{ $t('component.search.history') }}</div>\n              <div class=\"search-textlist-items\">\n                <div\n                  v-for=\"(item, index) in historyList\"\n                  :key=\"index\"\n                  class=\"search-textlist-item txthide txthide1\"\n                  @click=\"handleSearch(item.videoName)\"\n                >\n                  {{ item.videoName }}\n                </div>\n              </div>\n              <t-button\n                theme=\"default\"\n                shape=\"square\"\n                variant=\"text\"\n                class=\"search-recommend-top-icon\"\n                @click.stop=\"handleClearHistory\"\n              >\n                <template #icon><delete-icon /></template>\n              </t-button>\n            </div>\n          </div>\n\n          <div v-show=\"isHotableRoute\" class=\"search-recommend-bottom\">\n            <div class=\"search-hot-nav\">\n              <tag-nav :list=\"navOptions\" :active=\"hotConfig.category\" @change=\"handleSwitchHotTab\" />\n            </div>\n            <div class=\"search-hot-content\">\n              <t-skeleton :row-col=\"SKELETON_CONFIG\" :loading=\"hotConfig.load\" />\n              <template v-if=\"!hotConfig.load\">\n                <div v-if=\"hotList.length > 0\" class=\"search-hot-list\">\n                  <div\n                    v-for=\"(item, index) in hotList\"\n                    :key=\"item.vod_id\"\n                    class=\"search-hot-item\"\n                    @click=\"handleSearch(item.vod_name)\"\n                  >\n                    <div class=\"search-hot-item_order\" :class=\"`search-board-item_color${index + 1}`\">\n                      {{ index + 1 }}\n                    </div>\n                    <div class=\"search-hot-item_text txthide txthide1\">{{ item.vod_name }}</div>\n                    <div class=\"search-board-item_tag orange\">{{ item.vod_hot }}</div>\n                  </div>\n                </div>\n                <div v-else class=\"empty\">\n                  <t-empty />\n                </div>\n              </template>\n            </div>\n          </div>\n        </div>\n      </template>\n    </t-popup>\n  </div>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'SearchPanel',\n});\n\nimport { toSubtract, toYMD } from '@shared/modules/date';\nimport { CloseCircleFilledIcon, DeleteIcon, SearchIcon } from 'tdesign-icons-vue-next';\nimport type { PopupVisibleChangeContext } from 'tdesign-vue-next';\nimport { computed, onMounted, ref, watch } from 'vue';\nimport { useRoute } from 'vue-router';\n\nimport { fetchRecHot } from '@/api/film';\nimport { addHistory, delHistory, fetchHistoryPage } from '@/api/moment';\nimport { getSettingDetail } from '@/api/setting';\nimport TagNav from '@/components/tag-nav/index.vue';\nimport { emitterChannel, emitterSource } from '@/config/emitterChannel';\nimport { attachContent } from '@/config/global';\nimport HOT_CONFIG from '@/config/hot';\nimport { t } from '@/locales';\nimport emitter from '@/utils/emitter';\n\nconst RELATE_MAP = { Film: 1, Live: 2, Parse: 3 };\nconst SEARCHABLE_ROUTES = Object.keys(RELATE_MAP);\nconst POPUP_CONTENT_ROUTES = Object.keys(RELATE_MAP).filter((name) => !['Live'].includes(name));\nconst MAX_HISTORY_SIZE = 10;\nconst MAX_HOT_ITEMS = 10;\nconst MAX_RETRY_COUNT = 3;\nconst SKELETON_CONFIG = Array.from(Array.from({ length: 4 }), () => ({\n  type: 'text',\n  width: '100%',\n  height: '22px',\n}));\n\nconst route = useRoute();\n\nconst filmConfig = ref({\n  filmGroupType: 'site',\n  filmFilterType: 'off',\n});\n\nconst isPopupVisible = ref(false);\n\nconst hotList = ref<Array<{ vod_id: string; vod_name: string; vod_hot: string }>>([]);\nconst hotConfig = ref({\n  category: 1,\n  load: true,\n  active: 'kylive',\n});\n\nconst historyList = ref<any[]>([]);\nconst searchValue = ref('');\n\nconst activeRouteName = computed(() => route.name as string);\nconst isSearchableRoute = computed(() => SEARCHABLE_ROUTES.includes(activeRouteName.value));\nconst isHotableRoute = computed(() => POPUP_CONTENT_ROUTES.includes(activeRouteName.value));\nconst navOptions = computed(() =>\n  HOT_CONFIG?.[hotConfig.value.active]?.category.map((category) => ({\n    value: category,\n    label: t(`component.hot.category.field.${category}`),\n  })),\n);\n\nonMounted(() => {\n  getFilmConf();\n\n  emitter.off(emitterChannel.REFRESH_SEARCH_CONFIG, reloadConfig);\n  emitter.on(emitterChannel.REFRESH_SEARCH_CONFIG, reloadConfig);\n\n  emitter.off(emitterChannel.SEARCH_RECOMMEND, reloadKwConfig);\n  emitter.on(emitterChannel.SEARCH_RECOMMEND, reloadKwConfig);\n});\n\nwatch(\n  () => activeRouteName.value,\n  () => {\n    isPopupVisible.value = false;\n    searchValue.value = '';\n    hotConfig.value.load = true;\n  },\n);\n\nconst getSiteConfig = async () => {\n  try {\n    const resp = await getSettingDetail('site');\n    filmConfig.value.filmGroupType = resp?.searchMode || 'group';\n    filmConfig.value.filmFilterType = resp?.filterMode || false;\n  } catch (error) {\n    console.error('Failed to load film config:', error);\n  }\n};\n\nconst getHotConfig = async () => {\n  try {\n    const resp = await getSettingDetail('hot');\n    if (resp) {\n      hotConfig.value.active = resp;\n      hotConfig.value.category = HOT_CONFIG?.[resp]?.category?.[0] || 1;\n    }\n  } catch (error) {\n    console.error('Failed to load hot config:', error);\n  }\n};\n\nconst getFilmConf = async () => {\n  try {\n    await Promise.all([getSiteConfig(), getHotConfig()]);\n  } catch {}\n};\n\nconst getHotList = async (retryCount: number = 1) => {\n  try {\n    const daysToSubtract = retryCount;\n    const targetDate = toSubtract(daysToSubtract, 'day');\n    const formattedDate = toYMD(targetDate);\n\n    const resp = await fetchRecHot({\n      source: hotConfig.value.active,\n      date: formattedDate,\n      type: hotConfig.value.category,\n    });\n\n    if (resp?.length) {\n      hotList.value = resp.slice(0, MAX_HOT_ITEMS);\n    } else {\n      if (retryCount <= MAX_RETRY_COUNT) {\n        await getHotList(retryCount + 1);\n      }\n    }\n  } catch (error) {\n    console.error('Failed to load hot list:', error);\n  } finally {\n    hotConfig.value.load = false;\n  }\n};\n\nconst getHistoryConfig = async () => {\n  try {\n    const resp = await fetchHistoryPage({\n      page: 1,\n      pageSize: MAX_HISTORY_SIZE,\n      type: [5],\n    });\n    if (resp?.list) historyList.value = resp.list;\n  } catch (error) {\n    console.error('Failed to load search history:', error);\n  }\n};\n\nconst handleClearHistory = async () => {\n  await delHistory({ type: [5] });\n  historyList.value = [];\n};\n\nconst handleInputFocus = async () => {\n  if (!isSearchableRoute.value) return;\n\n  await Promise.all([getHistoryConfig(), getHotList()]);\n\n  isPopupVisible.value = true;\n};\n\nconst handleSwitchHotTab = (type: number) => {\n  hotConfig.value.category = type;\n  hotConfig.value.load = true;\n  hotList.value = [];\n\n  getHotList();\n};\n\nconst handleSearch = async (kw: string) => {\n  searchValue.value = kw;\n\n  const isDuplicate = historyList.value.some((item) => item.videoName === kw);\n  if (kw && !isDuplicate) {\n    const historyItem = {\n      relateId: hotConfig.value.active,\n      videoId: RELATE_MAP[activeRouteName.value] || 1,\n      videoName: kw,\n      type: 5,\n    };\n\n    historyList.value.unshift(historyItem);\n\n    if (historyList.value.length > MAX_HISTORY_SIZE) {\n      historyList.value.pop();\n    }\n\n    addHistory(historyItem);\n  }\n\n  const eventMap = {\n    Film: () =>\n      emitter.emit(emitterChannel.SEARCH_FILM_RECOMMEND, {\n        source: emitterSource.LAYOUT_HEADER_SEARCH,\n        data: {\n          kw,\n          group: filmConfig.value.filmGroupType,\n          filter: filmConfig.value.filmFilterType,\n        },\n      }),\n    Live: () =>\n      emitter.emit(emitterChannel.SEARCH_LIVE_RECOMMEND, { source: emitterSource.LAYOUT_HEADER_SEARCH, data: kw }),\n    Parse: () =>\n      emitter.emit(emitterChannel.SEARCH_PARSE_RECOMMEND, { source: emitterSource.LAYOUT_HEADER_SEARCH, data: kw }),\n  };\n\n  eventMap[activeRouteName.value]?.();\n\n  isPopupVisible.value = false;\n};\n\nconst handlePopupVisible = (_visible: boolean, context: PopupVisibleChangeContext) => {\n  if (context.trigger === 'document') {\n    isPopupVisible.value = false;\n  }\n};\n\nconst reloadConfig = async ({ data: eventData }) => {\n  const { source } = eventData;\n  if (source === emitterSource.LAYOUT_HEADER_SEARCH) return;\n\n  hotList.value = [];\n  hotConfig.value.load = true;\n  isPopupVisible.value = false;\n\n  searchValue.value = '';\n\n  await getFilmConf();\n};\n\nconst reloadKwConfig = async ({ data: eventData }) => {\n  const { source, data: kw } = eventData;\n  if (source === emitterSource.LAYOUT_HEADER_SEARCH) return;\n\n  searchValue.value = kw;\n};\n</script>\n<style lang=\"less\" scoped>\n.search-panel {\n  width: 250px;\n  background: var(--td-bg-color-container-hover);\n  border-radius: var(--td-radius-medium);\n\n  .search-input {\n    :deep(.t-input) {\n      background-color: transparent;\n      border-width: 0;\n      box-shadow: none;\n\n      .suffix-btn {\n        width: var(--td-comp-size-xxxs);\n      }\n    }\n  }\n}\n\n.search-recommend {\n  width: 628px;\n  padding: var(--td-comp-paddingTB-s) var(--td-comp-paddingLR-s);\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n  overflow: hidden;\n\n  @media (width <= 1240px) {\n    width: 483px;\n  }\n\n  .search-recommend-top {\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n\n    .search-textlist {\n      align-items: flex-start;\n      display: flex;\n      flex-direction: column;\n      padding: var(--td-comp-paddingTB-xs) var(--td-comp-paddingLR-s);\n      position: relative;\n      width: 100%;\n\n      .search-textlist-title {\n        font-size: var(--td-font-size-title-medium);\n        line-height: calc(var(--td-font-size-title-medium) + 1px);\n      }\n\n      .search-recommend-top-icon {\n        align-items: center;\n        cursor: pointer;\n        display: flex;\n        justify-content: center;\n        position: absolute;\n        right: var(--td-size-4);\n        top: calc(0px - var(--td-size-1));\n      }\n    }\n\n    .search-textlist-items {\n      display: flex;\n      flex-wrap: wrap;\n      margin-top: var(--td-comp-margin-s);\n      max-height: 68px;\n      overflow: hidden;\n\n      .search-textlist-item {\n        background-color: var(--td-bg-color-secondarycontainer);\n        border-radius: var(--td-radius-medium);\n        cursor: pointer;\n        height: 26px;\n        line-height: 26px;\n        margin-right: var(--td-comp-margin-s);\n        margin-top: var(--td-comp-margin-s);\n        max-width: 130px;\n        padding: 0 var(--td-comp-paddingLR-xs);\n\n        &:hover {\n          border-radius: var(--td-radius-medium);\n          background-color: var(--td-bg-color-component-hover);\n        }\n      }\n    }\n  }\n\n  .search-recommend-bottom {\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n\n    .search-hot-nav {\n      .search-textlist-item {\n        margin-right: 10px;\n        cursor: pointer;\n      }\n\n      .search-textlist-item-active {\n        font-size: 1.2em;\n        font-weight: 700;\n        color: var(--td-brand-color-active);\n      }\n    }\n\n    .search-hot-content {\n      .search-hot-list {\n        column-count: 2;\n        column-fill: auto;\n        display: flex;\n        flex-flow: column wrap;\n        flex-grow: 1;\n        height: 152px;\n\n        @media (width <= 1240px) {\n          column-count: 1;\n        }\n\n        .search-hot-item {\n          align-items: center;\n          break-inside: avoid;\n          cursor: pointer;\n          display: inline-flex;\n          justify-content: flex-start;\n          padding: var(--td-comp-paddingTB-xs) var(--td-comp-paddingLR-s);\n          width: 50%;\n\n          @media (width <= 1240px) {\n            width: 100%;\n          }\n\n          .search-hot-item_order {\n            flex: 0.15;\n          }\n\n          .search-hot-item_text {\n            flex: 0.8;\n          }\n\n          .search-board-item_color1 {\n            color: #f7534f;\n          }\n\n          .search-board-item_color2 {\n            color: #fa7b32;\n          }\n\n          .search-board-item_color3 {\n            color: #ffc63f;\n          }\n\n          &:hover {\n            border-radius: var(--td-radius-medium);\n            background-color: var(--td-bg-color-component-hover);\n          }\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/setting-table/index.vue",
    "content": "<template>\n  <div class=\"setting-table\">\n    <div class=\"header\">\n      <div class=\"left-op-container\">\n        <div class=\"component-op\">\n          <group-btn :data=\"op\" @change=\"handleOpChange\" />\n        </div>\n      </div>\n      <div class=\"right-op-container\">\n        <div class=\"search\">\n          <t-input v-model=\"searchText\" clearable @enter=\"handleOpSearch\" @clear=\"handleOpSearch\">\n            <template #prefix-icon><search-icon /></template>\n          </t-input>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"content\">\n      <t-table\n        class=\"table-custom\"\n        :row-key=\"rowKey\"\n        :data=\"data\"\n        :columns=\"columns\"\n        :hover=\"true\"\n        lazy-load\n        :pagination=\"pagination\"\n        :loading=\"dataLoading\"\n        header-affixed-top\n        @select-change=\"handleSelectChange\"\n        @page-change=\"handlePageChange\"\n      >\n        <template v-for=\"itemSlot in Object.keys(slots)\" :key=\"itemSlot\" #[itemSlot]=\"temp\">\n          <slot :name=\"itemSlot\" v-bind=\"temp\"></slot>\n        </template>\n      </t-table>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\ndefineOptions({\n  name: 'SettingTable',\n});\n\ndefineProps({\n  op: {\n    type: Array<IOpProps>,\n    default: () => [],\n  },\n  data: {\n    type: Array<any>,\n    default: () => [] as TableProps['data'],\n  },\n  columns: {\n    type: Array<any>,\n    default: () => [] as TableProps['columns'],\n  },\n  rowKey: {\n    type: String,\n    default: 'key',\n  },\n  pagination: {\n    type: Object,\n    default: {} as TableProps['pagination'],\n  },\n});\n\nconst emits = defineEmits(['op-change', 'page-change', 'op-search']);\n\nimport { SearchIcon } from 'tdesign-icons-vue-next';\nimport type { TableProps } from 'tdesign-vue-next';\nimport { ref, useSlots } from 'vue';\n\nimport GroupBtn from '@/components/group-btn/index.vue';\n\nimport type { IOpProps } from './types';\n\nconst slots = useSlots();\nconst dataLoading = ref<boolean>(false);\nconst searchText = ref<string>('');\nconst opMethod = ref<string>('');\nconst tableSelect = ref<Array<string>>([]);\n\nconst handleOpChange = (type: string) => {\n  emits('op-change', type, tableSelect.value);\n  opMethod.value = '';\n};\n\nconst handleOpSearch = () => {\n  emits('op-search', searchText.value);\n};\n\nconst handlePageChange = (curr: { current: number; pageSize: number }) => {\n  emits('page-change', curr.current, curr.pageSize);\n};\n\nconst handleSelectChange = (val: any[]) => {\n  tableSelect.value = val;\n};\n</script>\n<style lang=\"less\" scoped>\n.setting-table {\n  height: 100%;\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n\n  .header {\n    display: flex;\n    justify-content: space-between;\n    flex-grow: 0;\n    flex-shrink: 0;\n    padding: 0 var(--td-comp-paddingLR-s) 0 0;\n  }\n\n  .content {\n    height: 100%;\n    width: 100%;\n    flex: 1;\n    overflow: hidden;\n\n    .table-custom {\n      height: 100%;\n      display: flex;\n      flex-direction: column;\n      justify-content: space-between;\n      z-index: 0;\n    }\n\n    :deep(.t-table__affixed-header-elm) {\n      padding: 0 var(--td-comp-paddingLR-s) 0 0;\n    }\n\n    :deep(.t-table__content) {\n      padding: 0 var(--td-comp-paddingLR-s) 0 0;\n    }\n\n    :deep(.t-table__pagination) {\n      padding: var(--td-comp-paddingTB-s) var(--td-comp-paddingLR-s) 0;\n    }\n\n    :deep(.t-badge) {\n      padding-left: var(--td-comp-paddingLR-xs);\n\n      .t-badge--dot {\n        left: 0;\n        top: var(--td-size-2);\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/setting-table/types.ts",
    "content": "export interface IOpProps {\n  label: string;\n  value: string;\n}\n"
  },
  {
    "path": "src/renderer/src/components/share/index.vue",
    "content": "<template>\n  <div class=\"share-container\">\n    <div class=\"share-container-main\">\n      <div class=\"share-container-main-left\">\n        <div class=\"header-container\">\n          <div class=\"header-name\">{{ textILabel.scan }}</div>\n          <div class=\"header-desc\">{{ textILabel.copyright }}</div>\n        </div>\n        <t-divider dashed class=\"divider\" />\n      </div>\n      <div class=\"share-container-main-right\">\n        <t-qrcode v-if=\"formIDataProps.url\" :value=\"formIDataProps.url\" level=\"L\" :size=\"66\" class=\"qrcode\" />\n        <t-qrcode v-else value=\"zyfun\" borderless level=\"L\" :size=\"66\" type=\"svg\" class=\"qrcode\" status=\"loading\" />\n      </div>\n    </div>\n    <div class=\"bottom-copy\">\n      <t-input-adornment>\n        <t-input v-model=\"formIDataProps.url\" readonly class=\"input-only\" />\n        <template #append>\n          <t-button variant=\"text\" @click=\"handleCopy\">{{ $t('common.copy') }}</t-button>\n        </template>\n      </t-input-adornment>\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'ShareCard',\n});\n\nconst props = defineProps({\n  data: {\n    type: Object as PropType<IDataProps>,\n    default: () => ({ name: '', url: '', enablePrefix: false }),\n  },\n  label: {\n    type: Object as PropType<ILabelProps>,\n    default: (): object => ({}),\n  },\n});\n\nconst emits = defineEmits(['copy']);\n\nimport { isHttp } from '@shared/modules/validate';\nimport { cloneDeep } from 'es-toolkit';\nimport qs from 'qs';\nimport { MessagePlugin, QRCode as TQrcode } from 'tdesign-vue-next';\nimport type { PropType } from 'vue';\nimport { computed, onMounted, ref, watch } from 'vue';\n\nimport { t } from '@/locales';\n\nimport type { IDataProps, ILabelProps } from './types';\n\nconst DEFAULT_PREFIX: string = 'https://web.zyplayer.fun/?url={url}';\n\nconst formIDataProps = ref<IDataProps>(cloneDeep(props.data));\n\nconst textILabel = computed(() => ({\n  scan: props.label.scan || t('component.share.scan'),\n  copyright: props.label.copyright || t('component.share.copyright'),\n}));\n\nwatch(\n  () => props.data,\n  (newVal) => {\n    formIDataProps.value = cloneDeep(newVal);\n    setup();\n  },\n  { deep: true },\n);\n\nonMounted(() => setup());\n\nconst setup = () => {\n  const { url, name, enablePrefix } = formIDataProps.value;\n  if (!url) return;\n\n  formIDataProps.value.url = formatUrl(url, enablePrefix, { name });\n};\n\nconst formatUrl = (url: string, prefix: boolean = false, params: Record<string, any> = {}): string => {\n  if (!isHttp(url)) return '';\n  if (prefix) url = DEFAULT_PREFIX.replace('{url}', url);\n\n  const urlObj = new URL(url);\n  let searchParams = Object.fromEntries(urlObj.searchParams.entries());\n\n  if (Object.keys(params).length > 0) {\n    searchParams = { ...searchParams, ...params };\n  }\n\n  const queryString = qs.stringify(searchParams);\n\n  const fullUrl = `${urlObj.origin}${urlObj.pathname}${queryString ? `?${decodeURIComponent(queryString)}` : ''}`;\n\n  return fullUrl;\n};\n\nconst handleCopy = async () => {\n  const val = formIDataProps.value.url;\n  if (!val) return;\n\n  try {\n    emits('copy');\n    await navigator.clipboard.writeText(val);\n    MessagePlugin.success(t('common.copySuccess'));\n  } catch {\n    MessagePlugin.error(t('common.copyFail'));\n  }\n};\n</script>\n<style lang=\"less\" scoped>\n.share-container {\n  width: 300px;\n  padding: var(--td-pop-padding-xl);\n  position: relative;\n  cursor: default;\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n\n  &-main {\n    max-height: 80px;\n    display: flex;\n    justify-content: space-between;\n    align-items: stretch;\n    flex-wrap: nowrap;\n    column-gap: var(--td-size-4);\n\n    &-left {\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n      justify-content: space-between;\n\n      .header-container {\n        .header-name {\n          font-size: 14px;\n          line-height: 30px;\n          font-weight: 500;\n        }\n\n        .header-desc {\n          font-size: 12px;\n          line-height: 20px;\n        }\n      }\n\n      .divider {\n        margin: var(--td-size-2) 0 0 0;\n      }\n    }\n\n    &-right {\n      flex-grow: 0;\n      flex-shrink: 0;\n\n      .qrcode {\n        padding: var(--td-comp-paddingTB-xs) var(--td-comp-paddingLR-xs);\n      }\n    }\n  }\n\n  .bottom-title {\n    font-weight: 500;\n  }\n\n  .bottom-copy {\n    :deep(.input-only) {\n      .t-input {\n        border: none;\n      }\n    }\n\n    :deep(.t-input-adornment__append) {\n      margin-left: 0;\n\n      .t-button {\n        border: none;\n        width: calc(var(--td-comp-size-xxxxxl) + var(--td-size-1));\n      }\n\n      .t-button--variant-text:hover,\n      .t-button--variant-text:focus-visible {\n        border-radius: 0 var(--td-radius-medium) var(--td-radius-medium) 0;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/share/types.ts",
    "content": "export interface IDataProps {\n  name?: string;\n  url: string;\n  enablePrefix?: boolean;\n}\n\nexport interface ILabelProps {\n  scan?: string;\n  copyright?: string;\n}\n"
  },
  {
    "path": "src/renderer/src/components/system-control/index.vue",
    "content": "<template>\n  <div class=\"system-controls\">\n    <t-button\n      v-if=\"!isFilter('pin')\"\n      theme=\"default\"\n      shape=\"square\"\n      class=\"control-button control-button__pin\"\n      @click=\"handlePinWindow\"\n    >\n      <template #icon>\n        <pin-filled-icon v-if=\"active.isPinned\" />\n        <pin-icon v-else />\n      </template>\n    </t-button>\n\n    <template v-if=\"!isMacOS\">\n      <t-button\n        v-if=\"!isFilter('min')\"\n        theme=\"default\"\n        shape=\"square\"\n        class=\"control-button control-button__minimize\"\n        @click=\"handleMinimizeWindow\"\n      >\n        <template #icon><remove-icon /></template>\n      </t-button>\n\n      <t-button\n        v-if=\"!isFilter('max')\"\n        theme=\"default\"\n        shape=\"square\"\n        class=\"control-button control-button__maximize\"\n        @click=\"handleMaximizeWindow\"\n      >\n        <template #icon>\n          <copy-icon v-if=\"active.isMaximized\" style=\"transform: scaleX(-1)\" />\n          <rectangle-icon v-else :style=\"{ widh: '14px', height: '14px' }\" />\n        </template>\n      </t-button>\n\n      <t-button\n        v-if=\"!isFilter('close')\"\n        theme=\"default\"\n        shape=\"square\"\n        class=\"control-button control-button__close\"\n        @click=\"handleCloseWindow\"\n      >\n        <template #icon><close-icon /></template>\n      </t-button>\n    </template>\n  </div>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'SystemControl',\n});\n\nconst props = defineProps({\n  filter: {\n    type: Array,\n    default: () => [],\n  },\n});\n\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { CloseIcon, CopyIcon, PinFilledIcon, PinIcon, RectangleIcon, RemoveIcon } from 'tdesign-icons-vue-next';\nimport { onMounted, ref } from 'vue';\n\nimport { isMacOS } from '@/utils/systeminfo';\n\nconst active = ref({\n  isPinned: false,\n  isMaximized: false,\n});\n\nonMounted(() => {\n  setupWindowListeners();\n  setupWindowStatus();\n});\n\nconst isFilter = (name: string) => {\n  return props.filter.includes(name);\n};\n\nconst setupWindowListeners = () => {\n  if (isMacOS) {\n    attachFullscreenListener();\n  } else {\n    attachMaximizeListener();\n  }\n};\n\nconst setupWindowStatus = async () => {\n  const statusPin = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_PIN);\n  active.value.isPinned = statusPin;\n  const statusMax = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_MAX);\n  active.value.isMaximized = statusMax;\n};\n\nconst handlePinWindow = async () => {\n  active.value.isPinned = !active.value.isPinned;\n  const status = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_PIN, 0);\n  active.value.isPinned = status; // sync\n};\n\nconst handleMinimizeWindow = () => {\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_MIN, 1);\n};\n\nconst handleMaximizeWindow = async () => {\n  active.value.isMaximized = !active.value.isMaximized;\n  const status = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_MAX, 0);\n  active.value.isMaximized = status; // sync\n};\n\nconst handleCloseWindow = () => {\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_CLOSE, 1);\n};\n\nconst attachFullscreenListener = () => {\n  window.electron.ipcRenderer.removeAllListeners(IPC_CHANNEL.WINDOW_FULLSCREEN);\n  window.electron.ipcRenderer.on(IPC_CHANNEL.WINDOW_FULLSCREEN, (_, fullscreen: boolean) => {\n    if (fullscreen) {\n      document.documentElement.setAttribute('fullscreen', String(fullscreen));\n    } else {\n      document.documentElement.removeAttribute('fullscreen');\n    }\n  });\n};\n\nconst attachMaximizeListener = () => {\n  window.electron.ipcRenderer.removeAllListeners(IPC_CHANNEL.WINDOW_MAX);\n  window.electron.ipcRenderer.on(IPC_CHANNEL.WINDOW_MAX, (_, maximized: boolean) => {\n    active.value.isMaximized = maximized;\n  });\n};\n</script>\n<style lang=\"less\" scoped>\n.system-controls {\n  .control-button {\n    &.control-button__close {\n      &:not(.t-is-disabled, .t-button--ghost) {\n        &:hover {\n          color: var(--td-error-color) !important;\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/tag-nav/index.vue",
    "content": "<template>\n  <div class=\"tag-nav\">\n    <t-tabs v-model=\"activeTabId\" @change=\"handleTabChange\">\n      <t-tab-panel\n        v-for=\"tab in uniqueTabs\"\n        :key=\"tab.value\"\n        :value=\"tab.value\"\n        :label=\"tab.label\"\n        destroy-on-hide\n        lazy\n      />\n    </t-tabs>\n  </div>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'TagNav',\n});\n\nconst props = defineProps({\n  list: {\n    type: Array<ITabItem>,\n    default: () => [],\n  },\n  active: {\n    type: [String, Number],\n    default: '',\n  },\n});\n\nconst emits = defineEmits(['change']);\n\ninterface ITabItem {\n  label: string | number;\n  value: string;\n}\n\nimport { computed, ref, watch } from 'vue';\n\nwatch(\n  () => props.active,\n  (val) => {\n    activeTabId.value = val || '';\n  },\n);\n\nconst activeTabId = ref(props.active);\nconst uniqueTabs = computed(() => [...new Map(props.list.map((tab) => [tab.value, tab])).values()]);\n\nconst handleTabChange = (tabId: string | number) => {\n  emits('change', tabId);\n};\n</script>\n<style lang=\"less\" scoped>\n.tag-nav {\n  width: 100%;\n\n  :deep(.t-tabs) {\n    background-color: transparent;\n\n    .t-tabs__nav-item {\n      &.t-size-m {\n        height: var(--td-comp-size-m);\n        line-height: var(--td-comp-size-m);\n      }\n\n      &:not(.t-is-disabled, .t-is-active):hover .t-tabs__nav-item-wrapper {\n        background-color: transparent;\n        color: var(--td-text-color-primary);\n      }\n    }\n\n    .t-tabs__bar {\n      background-color: transparent;\n\n      &::after {\n        background-color: var(--td-brand-color);\n        border-radius: 2px;\n        bottom: 0;\n        box-shadow: 0 -4px 14px 1px var(--td-brand-color);\n        content: '';\n        height: 4px;\n        left: 50%;\n        position: absolute;\n        right: 0;\n        transform: translateX(-50%);\n        width: 20px;\n      }\n    }\n\n    .t-tabs__nav-container {\n      &.t-is-top {\n        &::after {\n          background-color: transparent;\n        }\n      }\n    }\n\n    .t-tabs__nav-item-wrapper {\n      padding: 0;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/terminal/index.vue",
    "content": "<template>\n  <div ref=\"terminalRef\" class=\"terminal\"></div>\n</template>\n<script lang=\"ts\" setup>\ndefineOptions({\n  name: 'Terminal',\n});\n\nconst props = defineProps({\n  options: {\n    type: Object as PropType<ITerminalOptions>,\n    default: () => ({}),\n  },\n  console: {\n    type: Boolean,\n    default: false,\n  },\n  onKeyCallback: {\n    type: Function as PropType<(key: string) => void>,\n    default: (_key: string) => {},\n  },\n  onLinkClickCallback: {\n    type: Function as PropType<(uri: string) => void>,\n    default: (_uri: string) => {},\n  },\n});\n\nimport '@xterm/xterm/css/xterm.css';\n\nimport type { LogLevel } from '@shared/config/logger';\nimport { ANSICOLORS, LEVEL, LEVEL_COLOR_MAP } from '@shared/config/logger';\nimport { toString } from '@shared/modules/toString';\nimport { isJsonStr } from '@shared/modules/validate';\nimport { FitAddon } from '@xterm/addon-fit';\nimport { SearchAddon } from '@xterm/addon-search';\nimport { WebLinksAddon } from '@xterm/addon-web-links';\nimport { WebglAddon } from '@xterm/addon-webgl';\nimport type { ITerminalOptions } from '@xterm/xterm';\nimport { Terminal } from '@xterm/xterm';\nimport JSON5 from 'json5';\nimport type { PropType } from 'vue';\nimport { nextTick, onMounted, onUnmounted, ref, useTemplateRef, watch } from 'vue';\nimport { SearchBarAddon } from 'xterm-addon-search-bar';\n\nimport { isMacOS } from '@/utils/systeminfo';\n\nexport type { ITerminalOptions } from '@xterm/xterm';\n\nexport type ITerminal = Terminal;\nexport type ITerminalLog = LogLevel;\ntype ITerminalConsoleLog = Exclude<LogLevel, 'verbose' | 'silly' | 'none'> | 'log';\n\nconst terminalRef = useTemplateRef<HTMLElement>('terminalRef');\n\nconst options = ref<ITerminalOptions>(props.options);\nconst isSelecting = ref<boolean>(false);\n\nconst term = ref<Terminal>();\nconst fitAddon = ref<FitAddon>();\nconst searchAddon = ref<SearchAddon>();\nconst searchBarAddon = ref<SearchBarAddon>();\nconst webLinksAddon = ref<WebLinksAddon>();\nconst webglAddon = ref<WebglAddon>();\n\nconst resizeObserver = ref<ResizeObserver>();\nconst visibleObserver = ref<IntersectionObserver>();\n\nwatch(\n  () => props.options,\n  (val) => (options.value = val),\n  { deep: true },\n);\n\nwatch(\n  () => options.value,\n  (val) => {\n    if (term.value) Object.assign(term.value.options, val);\n  },\n  { deep: true },\n);\n\nonMounted(() => setup());\nonUnmounted(() => dispose());\n\nconst setup = () => {\n  nextTick(() => {\n    const terminal = new Terminal(options.value);\n\n    const fit = new FitAddon();\n    const search = new SearchAddon();\n    const searchBar = new SearchBarAddon({ searchAddon: search as any });\n    const weblinks = new WebLinksAddon((event, uri) => {\n      event.preventDefault();\n\n      const modifierPressed = isMacOS ? event.metaKey : event.ctrlKey;\n      if (modifierPressed) props.onLinkClickCallback?.(uri);\n    });\n    const webgl = new WebglAddon();\n\n    terminal.loadAddon(fit);\n    terminal.loadAddon(weblinks);\n    terminal.loadAddon(webgl);\n    terminal.loadAddon(search);\n    terminal.loadAddon(searchBar as any);\n\n    terminal.open(terminalRef.value!);\n    terminal.focus();\n    fit.fit();\n\n    terminalRef.value?.addEventListener('keydown', handleKeyDown, true);\n\n    terminal.onKey((e: { key: string; domEvent: KeyboardEvent }) => {\n      const ev = e.domEvent;\n      const key = ev.key === 'Enter' ? '\\n' : e.key;\n\n      props.onKeyCallback?.(key);\n    });\n\n    terminal.onSelectionChange(() => {\n      isSelecting.value = terminal.hasSelection();\n    });\n\n    resizeObserver.value = new ResizeObserver(() => {\n      if (term.value && fitAddon.value) fitAddon.value.fit();\n    });\n    resizeObserver.value.observe(terminalRef.value!);\n\n    visibleObserver.value = new IntersectionObserver((entries) => {\n      for (const entry of entries) {\n        if (entry.isIntersecting) {\n          fitAddon.value?.fit();\n        }\n      }\n    });\n    visibleObserver.value.observe(terminalRef.value!);\n\n    term.value = terminal;\n    fitAddon.value = fit;\n    searchAddon.value = search;\n    searchBarAddon.value = searchBar;\n    webLinksAddon.value = weblinks;\n    webglAddon.value = webgl;\n  });\n};\n\nconst colorText = (text: string, color: string) => {\n  return ANSICOLORS[color] + text + ANSICOLORS.END;\n};\n\nconst write = (val: unknown, level: ITerminalLog = LEVEL.VERBOSE, ln: boolean = true, prefix?: string) => {\n  let content = toString(val);\n  if (isJsonStr(content)) content = JSON.stringify(JSON5.parse(content), null, 2);\n\n  let text = content;\n  let custom = prefix;\n  if (prefix) {\n    const main = colorText(colorText(prefix, LEVEL_COLOR_MAP[level]), 'BOLD');\n    const symbol = colorText('>', 'BOLD');\n    custom = `${main} ${symbol} `;\n  } else {\n    const main = colorText(colorText(content, LEVEL_COLOR_MAP[level]), 'BOLD');\n    text = main;\n  }\n\n  text = colorText(text, 'BOLD');\n\n  if (term.value) {\n    if (prefix) term.value.write(custom!);\n    ln ? term.value.writeln(text) : term.value.write(text);\n\n    if (!isSelecting.value) term.value.scrollToBottom();\n  }\n\n  if (props.console) {\n    const allowedLevels: ITerminalConsoleLog[] = [LEVEL.ERROR, LEVEL.WARN, LEVEL.INFO, LEVEL.DEBUG];\n    const consoleLevel: ITerminalConsoleLog = allowedLevels.includes(level as ITerminalConsoleLog)\n      ? (level as ITerminalConsoleLog)\n      : 'log';\n\n    const logArgs = prefix ? [prefix, val] : [val];\n    console[consoleLevel](...logArgs);\n  }\n};\n\nconst clear = () => {\n  term.value?.clear();\n  term.value?.reset();\n};\n\nconst dispose = () => {\n  if (resizeObserver.value && terminalRef.value) {\n    resizeObserver.value.unobserve(terminalRef.value);\n    resizeObserver.value.disconnect();\n  }\n  if (visibleObserver.value && terminalRef.value) {\n    visibleObserver.value.unobserve(terminalRef.value);\n    visibleObserver.value.disconnect();\n  }\n\n  try {\n    fitAddon.value?.dispose();\n    searchAddon.value?.dispose();\n    searchBarAddon.value?.dispose();\n    webLinksAddon.value?.dispose();\n    webglAddon.value?.dispose();\n    term.value?.dispose();\n  } catch {}\n\n  terminalRef.value?.removeEventListener('keydown', handleKeyDown, true);\n\n  fitAddon.value = undefined;\n  searchAddon.value = undefined;\n  searchBarAddon.value = undefined;\n  webLinksAddon.value = undefined;\n  webglAddon.value = undefined;\n\n  term.value = undefined;\n\n  resizeObserver.value = undefined;\n  visibleObserver.value = undefined;\n};\n\nconst focus = () => {\n  term.value?.focus();\n  fitAddon.value?.fit();\n};\n\nconst handleKeyDown = (ev: KeyboardEvent) => {\n  const key = ev.key.toLowerCase();\n\n  if ((isMacOS && ev.metaKey && key === 'f') || (!isMacOS && ev.ctrlKey && key === 'f')) {\n    ev.preventDefault();\n\n    searchBarAddon.value?.show();\n  }\n};\n\ndefineExpose({\n  clear,\n  dispose,\n  focus,\n  write,\n});\n</script>\n<style lang=\"less\" scoped>\n.terminal {\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n\n  :deep(.xterm) {\n    height: 100%;\n    padding-left: var(--td-comp-paddingLR-s);\n\n    .xterm-scrollable-element {\n      height: 100%;\n      margin-left: calc(0px - var(--td-comp-paddingLR-s));\n      padding-left: var(--td-comp-paddingLR-s);\n    }\n\n    .xterm-viewport {\n      background-color: var(--td-bg-content-input-1) !important;\n    }\n  }\n\n  :deep(.xterm-search-bar__addon) {\n    box-shadow: var(--td-shadow-1);\n    background-color: var(--td-bg-color-component-hover);\n    transition: transform 200ms linear;\n    padding: var(--td-comp-paddingTB-xs) var(--td-comp-paddingLR-xs);\n\n    .search-bar__input {\n      background-color: var(--td-bg-color-component);\n      color: var(--td-text-color-primary);\n      border-radius: var(--td-radius-default);\n      border-width: 1px;\n      border-style: solid;\n      border-color: transparent;\n\n      &:focus {\n        outline: none;\n        border-color: var(--td-brand-color);\n        box-shadow: 0 0 0 1px var(--td-brand-color-focus);\n      }\n    }\n\n    .search-bar__btn {\n      background-color: transparent;\n      border-radius: var(--td-radius-default);\n      margin-left: var(--td-comp-margin-xs);\n\n      &.prev {\n        margin-left: var(--td-comp-margin-xs);\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/components/title-menu/index.less",
    "content": ":root,\n:root[theme-mode='light'] {\n  --td-component-title-menu-color: #000;\n  --td-component-title-menu-color-anti: #c5c5c5;\n  --td-component-title-menu-color-anti-transparent: #fff0;\n  --td-component-title-menu-color-transparent: #c5c5c55c;\n  --td-component-title-menu-color-active-transparent: #000000e5;\n  --td-component-title-menu-color-mask-transparent: #000f;\n  --td-component-title-menu-mask-gradient: linear-gradient(270deg, #fff, #fff0);\n}\n\n:root[theme-mode='dark'] {\n  --td-component-title-menu-color: #fff;\n  --td-component-title-menu-color-anti: #000;\n  --td-component-title-menu-color-anti-transparent: #0000;\n  --td-component-title-menu-color-transparent: #ffffff14;\n  --td-component-title-menu-color-active-transparent: #ffffff1a;\n  --td-component-title-menu-color-mask-transparent: #fffc;\n  --td-component-title-menu-mask-gradient: linear-gradient(270deg, #232426, #23242600);\n}\n\n.title-menu {\n  height: var(--td-comp-size-m);\n  overflow: hidden;\n  position: relative;\n  width: 100%;\n\n  &__superWrapper {\n    align-items: center;\n    display: inline-flex;\n    flex-direction: row;\n    gap: var(--td-size-4);\n    height: var(--td-comp-size-m);\n    transition: transform 0.2s ease-in-out;\n    width: auto;\n  }\n\n  &__superItem {\n    align-items: center;\n    cursor: pointer;\n    display: flex;\n    position: relative;\n\n    .content {\n      align-items: center;\n      border: 1px solid var(--td-component-title-menu-color-transparent);\n      border-radius: var(--td-radius-medium);\n      color: var(--td-text-color-secondary);\n      display: flex;\n      height: var(--td-comp-size-m);\n      justify-content: center;\n      min-width: 58px;\n      padding: var(--td-comp-paddingTB-xs) var(--td-comp-paddingLR-s);\n      white-space: nowrap;\n    }\n\n    .border {\n      background-color: var(--td-component-title-menu-color-mask-transparent);\n      height: var(--td-comp-size-m);\n      mask-image: url('../../assets/rectangle_common-1.svg');\n      mask-repeat: no-repeat;\n      mask-size: contain;\n      position: absolute;\n      top: 0;\n      width: 13px;\n      cursor: pointer;\n    }\n\n    &.super-item_active {\n      .content {\n        background: var(--td-component-title-menu-color-transparent);\n        border: 1px solid var(--td-component-title-menu-color-active-transparent);\n        color: var(--td-component-title-menu-color);\n      }\n\n      .border {\n        mask-image: url('../../assets/rectangle_common.svg');\n      }\n    }\n\n    &:first-child {\n      margin-right: var(--td-comp-margin-s);\n\n      .content {\n        border-radius: var(--td-radius-medium) 0 0 var(--td-radius-medium);\n        border-right: none;\n      }\n\n      .border {\n        background-color: var(--td-component-title-menu-color-mask-transparent);\n        right: -13px;\n      }\n\n      &.super-item_active {\n        .content {\n          background: var(--td-component-title-menu-color-transparent);\n          border: 1px solid var(--td-component-title-menu-color-transparent);\n          color: var(--td-component-title-menu-color);\n          border-right: none;\n        }\n\n        .border {\n          background-color: var(--td-component-title-menu-color);\n          right: -16px;\n          width: var(--td-comp-size-xxxs);\n        }\n      }\n    }\n\n    &:not(:first-child, :last-child) {\n      .content {\n        border: none;\n        padding: var(--td-comp-paddingTB-xs) var(--td-comp-paddingLR-l);\n      }\n\n      .border {\n        background: var(--td-component-title-menu-color-anti-transparent);\n        border: 1px solid var(--td-component-title-menu-color-transparent);\n        border-radius: var(--td-radius-medium);\n        height: var(--td-comp-size-m);\n        mask-image: none;\n        mask-repeat: no-repeat;\n        mask-size: contain;\n        position: absolute;\n        top: 0;\n        transform: skewX(-24deg);\n        width: 100%;\n        // z-index: -1;\n      }\n\n      &.super-item_active {\n        .content {\n          background: var(--td-component-title-menu-color-anti-transparent);\n        }\n\n        .border {\n          background: var(--td-component-title-menu-color-transparent);\n        }\n      }\n    }\n\n    &:last-child {\n      margin-left: var(--td-comp-margin-s);\n\n      .content {\n        border-left: none;\n        border-radius: 0 var(--td-radius-medium) var(--td-radius-medium) 0;\n      }\n\n      .border {\n        background-color: var(--td-component-title-menu-color-mask-transparent);\n        left: -12px;\n        transform: rotate(180deg);\n      }\n\n      &.super-item_active {\n        .content {\n          background: var(--td-component-title-menu-color-transparent);\n          border: 1px solid var(--td-component-title-menu-color-transparent);\n          color: var(--td-component-title-menu-color);\n          border-left: none;\n        }\n\n        .border {\n          background-color: var(--td-component-title-menu-color);\n          left: -16px;\n          mask-image: url('../../assets/rectangle_common.svg');\n          transform: rotate(180deg);\n          width: var(--td-comp-size-xxxs);\n        }\n      }\n    }\n\n    &:only-child {\n      margin-left: 0;\n\n      .content {\n        border-color: var(--td-component-title-menu-color-transparent) !important;\n        border-style: solid !important;\n        border-radius: var(--td-radius-medium) 0 0 var(--td-radius-medium) !important;\n        border-right: none !important;\n        border-left-width: 1px !important;\n      }\n\n      .border {\n        transform: none !important;\n        left: auto !important;\n      }\n    }\n  }\n\n  &__firstMask,\n  &__lastMask {\n    background-image: var(--td-component-title-menu-mask-gradient);\n    height: var(--td-comp-size-m);\n    pointer-events: none;\n    position: absolute;\n    top: 0;\n    width: var(--td-comp-size-xxl);\n    z-index: 10;\n  }\n\n  &__firstMask {\n    left: 0;\n    transform: scaleX(-1);\n  }\n\n  &__lastMask {\n    right: var(--td-comp-size-m);\n  }\n\n  &__menuWrapper {\n    // background-color: var(--td-bg-color-component);\n    background-color: var(--td-bg-color-container);\n    display: flex;\n    flex-direction: row;\n    position: absolute;\n    right: 0;\n    top: 0;\n    width: var(--td-comp-size-m);\n    height: var(--td-comp-size-m);\n\n    .dropdown {\n      border: 1px solid var(--td-border-level-2-color);\n      color: var(--td-text-color-secondary);\n      width: var(--td-comp-size-m);\n      height: var(--td-comp-size-m);\n\n      &:hover {\n        color: var(--td-text-color-primary);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/renderer/src/components/title-menu/index.vue",
    "content": "<template>\n  <div ref=\"titleMenuRef\" class=\"title-menu\">\n    <!-- first mask -->\n    <div v-if=\"maskState.showFirstMask\" class=\"title-menu__firstMask\"></div>\n\n    <!-- menu wrapper -->\n    <div\n      ref=\"superWrapperRef\"\n      class=\"title-menu__superWrapper\"\n      :style=\"{ transform: `translateX(${currentTransformX}px)` }\"\n    >\n      <div\n        v-for=\"(item, index) in menuList\"\n        :key=\"index\"\n        class=\"title-menu__superItem\"\n        :class=\"{ 'super-item_active': activeMenu === item.type_id }\"\n        @click=\"handleIMenuItemClick(item.type_id)\"\n      >\n        <div class=\"content\">{{ item.type_name }}</div>\n        <div class=\"border\">\n          <div id=\"icon\"></div>\n          <div id=\"cover\"></div>\n          <div id=\"gradientBorder\"></div>\n        </div>\n      </div>\n    </div>\n\n    <!-- last mask -->\n    <div v-if=\"maskState.showLastMask\" class=\"title-menu__lastMask\"></div>\n\n    <!-- dropdown -->\n    <div v-if=\"maskState.showMenuWrapper\" class=\"title-menu__menuWrapper\">\n      <t-dropdown theme=\"default\" trigger=\"click\" destroy-on-close>\n        <t-button theme=\"default\" shape=\"square\" variant=\"outline\" class=\"dropdown\">\n          <caret-down-small-icon />\n        </t-button>\n        <t-dropdown-menu>\n          <t-dropdown-item\n            v-for=\"(item, index) in menuList\"\n            :key=\"index\"\n            :value=\"item.type_id\"\n            :active=\"activeMenu === item.type_id\"\n            @click=\"handleIMenuItemClick(item.type_id)\"\n          >\n            {{ item.type_name }}\n          </t-dropdown-item>\n        </t-dropdown-menu>\n      </t-dropdown>\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport './index.less';\n\ndefineOptions({\n  name: 'TitleMenu',\n});\n\nconst props = defineProps({\n  active: {\n    type: String,\n    default: '',\n  },\n  list: {\n    type: Array<IMenuItem>,\n    default: () => [],\n  },\n});\n\nconst emits = defineEmits(['change']);\n\ninterface IMenuItem {\n  type_id: string;\n  type_name: string;\n}\n\ninterface IMaskState {\n  showFirstMask: boolean;\n  showLastMask: boolean;\n  showMenuWrapper: boolean;\n}\n\ninterface IRectInfo {\n  left: number;\n  right: number;\n  top: number;\n  bottom: number;\n  width: number;\n  height: number;\n}\n\ninterface ITransformResult {\n  translateX: number;\n  showFirstMask: boolean;\n  showLastMask: boolean;\n}\n\nimport { debounce, isEqual } from 'es-toolkit';\nimport { CaretDownSmallIcon } from 'tdesign-icons-vue-next';\nimport { nextTick, onMounted, onUnmounted, ref, useTemplateRef, watch } from 'vue';\n\nconst DROPDOWN_MARGIN = 40;\nconst DEBOUNCE_DELAY = 100;\n\nconst titleMenuRef = useTemplateRef<HTMLDivElement>('titleMenuRef');\nconst superWrapperRef = useTemplateRef<HTMLDivElement>('superWrapperRef');\nconst resizeObserver = ref<ResizeObserver>();\n\nconst maskState = ref<IMaskState>({\n  showFirstMask: false,\n  showLastMask: false,\n  showMenuWrapper: false,\n});\n\nconst currentTransformX = ref(0);\nconst activeMenu = ref(props.active);\nconst menuList = ref(props.list);\n\nwatch(\n  () => props.active,\n  (val) => {\n    activeMenu.value = val;\n    debouncedRedrawElement();\n  },\n);\nwatch(\n  () => props.list,\n  (newVal, oldVal) => {\n    const isEq = isEqual(newVal, oldVal);\n    if (isEq) return;\n\n    menuList.value = [...new Map(newVal.map((menuItem) => [menuItem.type_id, menuItem])).values()];\n    defaultConfig();\n    debouncedRedrawElement();\n  },\n);\n\nonMounted(() => setup());\n\nonUnmounted(() => dispose());\n\nconst setup = () => {\n  initializeResizeObserver();\n  debouncedRedrawElement();\n};\n\nconst dispose = () => {\n  resizeObserver.value?.disconnect();\n  defaultConfig();\n};\n\nconst getElementRect = (element: HTMLElement): IRectInfo => {\n  const rect = element.getBoundingClientRect();\n\n  return {\n    left: Math.floor(rect.left),\n    right: Math.floor(rect.right),\n    top: Math.floor(rect.top),\n    bottom: Math.floor(rect.bottom),\n    width: Math.floor(rect.width),\n    height: Math.floor(rect.height),\n  };\n};\n\nconst calculateTransformOffset = (\n  targetRect: IRectInfo,\n  outerRect: IRectInfo,\n  innerRect: IRectInfo,\n  currentTransform: number,\n): ITransformResult => {\n  const halfOuterWidth = Math.floor(outerRect.width / 2);\n  const halfTargetWidth = Math.floor(targetRect.width / 2);\n  const maxTranslateX = Math.floor(outerRect.width - innerRect.width - DROPDOWN_MARGIN);\n\n  let translateX = halfOuterWidth - (targetRect.left - outerRect.left) - halfTargetWidth;\n\n  const next = currentTransform + translateX;\n  translateX = Math.min(0, Math.max(next, maxTranslateX));\n\n  return {\n    translateX,\n    showFirstMask: translateX < 0,\n    showLastMask: innerRect.width > outerRect.width - translateX - DROPDOWN_MARGIN,\n  };\n};\n\nconst redrawElement = () => {\n  const activeMenuIndex = menuList.value.findIndex((menuItem) => menuItem.type_id === activeMenu.value);\n  if (activeMenuIndex === -1) return;\n\n  nextTick(() => {\n    const superRef = superWrapperRef.value;\n    const titleRef = titleMenuRef.value;\n    if (!superRef || !titleRef) return;\n\n    const innerRect = getElementRect(superRef); // 内\n    const outerRect = getElementRect(titleRef); // 外\n    const targetElementRect = getElementRect(superRef.children[activeMenuIndex] as HTMLElement);\n\n    const isOverflowing = innerRect.width > outerRect.width; // 内 > 外\n\n    maskState.value.showMenuWrapper = isOverflowing;\n    if (!isOverflowing) return;\n\n    const { translateX, showFirstMask, showLastMask } = calculateTransformOffset(\n      targetElementRect,\n      outerRect,\n      innerRect,\n      currentTransformX.value,\n    );\n\n    const hasStateChanged =\n      currentTransformX.value !== translateX ||\n      maskState.value.showFirstMask !== showFirstMask ||\n      maskState.value.showLastMask !== showLastMask;\n\n    if (hasStateChanged) {\n      currentTransformX.value = translateX;\n      maskState.value.showFirstMask = showFirstMask;\n      maskState.value.showLastMask = showLastMask;\n    }\n  });\n};\n\nconst debouncedRedrawElement = debounce(redrawElement, DEBOUNCE_DELAY);\n\nconst initializeResizeObserver = () => {\n  nextTick(() => {\n    const containerElement = titleMenuRef.value;\n    if (!containerElement) return;\n\n    resizeObserver.value = new ResizeObserver(debounce(() => debouncedRedrawElement(), DEBOUNCE_DELAY));\n    resizeObserver.value.observe(containerElement);\n  });\n};\n\nconst defaultConfig = () => {\n  maskState.value = {\n    showFirstMask: false,\n    showLastMask: false,\n    showMenuWrapper: false,\n  };\n\n  currentTransformX.value = 0;\n};\n\nconst handleIMenuItemClick = (val: string) => {\n  emits('change', val);\n};\n</script>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "src/renderer/src/components/webview/index.vue",
    "content": "<template>\n  <div class=\"webview-container\">\n    <webview\n      :key=\"appid\"\n      ref=\"webviewRef\"\n      src=\"about:blank\"\n      allowpopups\n      autosize\n      disablewebsecurity\n      partition=\"persist:webview\"\n      class=\"webview\"\n    />\n    <t-loading attach=\".webview-container\" size=\"medium\" :loading=\"isWebviewLoading\" />\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { isHttp, isObject, isObjectEmpty } from '@shared/modules/validate';\nimport type {\n  DidNavigateEvent,\n  DidNavigateInPageEvent,\n  DidRedirectNavigationEvent,\n  PageFaviconUpdatedEvent,\n  PageTitleUpdatedEvent,\n  WebviewTag,\n} from 'electron';\nimport type { PropType } from 'vue';\nimport { nextTick, onMounted, onUnmounted, ref, toRaw, useTemplateRef, watch } from 'vue';\n\nconst props = defineProps({\n  appid: {\n    type: String,\n    default: '',\n  },\n  src: {\n    type: String,\n    default: '',\n  },\n  headers: {\n    type: Object as PropType<Record<string, any>>,\n    default: () => ({}),\n  },\n  onNavigateCallback: {\n    type: Function as PropType<(appid: string, url: string) => void>,\n    default: (_appid: string, _url: string) => {},\n  },\n  onTitleUpdatedCallback: {\n    type: Function as PropType<(appid: string, title: string) => void>,\n    default: (_appid: string, _title: string) => {},\n  },\n  onFaviconUpdatedCallback: {\n    type: Function as PropType<(appid: string, favicon: string) => void>,\n    default: (_appid: string, _favicon: string) => {},\n  },\n});\n\nconst emits = defineEmits(['change-favicon', 'change-navigate', 'change-title']);\n\nconst webviewRef = useTemplateRef<WebviewTag | null>('webviewRef');\nconst appid = ref<string>(props.appid);\nconst isWebviewLoading = ref<boolean>(false);\nconst isWebviewReady = ref<boolean>(false);\nconst token = ref<string>();\nconst pendingLoad = ref<{ url: string; headers?: Record<string, any> }>({ url: '', headers: undefined });\n\nwatch(\n  () => props.appid,\n  (val) => {\n    removeEventListeners();\n    appid.value = val;\n  },\n);\nwatch(\n  () => appid.value,\n  () => {\n    isWebviewLoading.value = false;\n    isWebviewReady.value = false;\n    nextTick(() => attachEventListeners());\n  },\n);\n\nonMounted(() => setup());\nonUnmounted(() => dispose());\n\nconst setup = () => {\n  nextTick(() => attachEventListeners());\n\n  window.electron.ipcRenderer.on(IPC_CHANNEL.WEBVIEW_LINK_BLOCK_RELAY, onUriBlocked);\n\n  if (isHttp(props.src)) loadUrl(props.src, props.headers);\n};\n\nconst dispose = () => {\n  removeEventListeners();\n\n  window.electron.ipcRenderer.removeListener(IPC_CHANNEL.WEBVIEW_LINK_BLOCK_RELAY, onUriBlocked);\n  webviewRef.value?.remove();\n};\n\nconst onUriBlocked = (_event: any, url: string) => {\n  emits('change-navigate', url);\n  webviewRef.value?.loadURL(url).catch(() => {});\n};\n\nconst onDidStartLoading = () => {\n  // console.debug('did-start-loading');\n  isWebviewLoading.value = true;\n};\n\nconst onDidStopLoading = () => {\n  // console.debug('did-stop-loading');\n  isWebviewLoading.value = false;\n};\n\nconst onDidFinishLoading = () => {\n  // console.debug('did-finish-loading');\n  isWebviewLoading.value = false;\n};\n\nconst onDidNavigate = (event: DidNavigateEvent) => {\n  // console.debug('did-navigate', event.url);\n  emits('change-navigate', event.url);\n  props.onNavigateCallback?.(appid.value, event.url);\n};\n\nconst onDidRedirectNavigate = (event: DidRedirectNavigationEvent) => {\n  // console.debug('did-redirect-navigate', event.url);\n  emits('change-navigate', event.url);\n  props.onNavigateCallback?.(appid.value, event.url);\n};\n\nconst onDidNavigateInPage = (event: DidNavigateInPageEvent) => {\n  // console.debug('did-navigate-in-page', event.url);\n  emits('change-navigate', event.url);\n  props.onNavigateCallback?.(appid.value, event.url);\n};\n\nconst onCrashed = () => {\n  console.error('Webview crashed! Reload <webview> to recover.');\n};\n\nconst onPageTitleUpdated = (event: PageTitleUpdatedEvent) => {\n  emits('change-title', event.title);\n  props.onTitleUpdatedCallback?.(appid.value, event.title);\n};\n\nconst onPageFaviconUpdated = (event: PageFaviconUpdatedEvent) => {\n  emits('change-favicon', event.favicons[0] || '');\n  props.onFaviconUpdatedCallback?.(appid.value, event.favicons[0] || '');\n};\n\nconst onDomReady = () => {\n  // console.debug('dom-ready');\n  const webviewId = webviewRef.value?.getWebContentsId();\n  if (!webviewId) return;\n\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.WEBVIEW_SPELL_CHECK, webviewId, 2);\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.WEBVIEW_LINK_BLOCK, webviewId, 1);\n\n  isWebviewReady.value = true;\n\n  if (pendingLoad.value.url) {\n    loadUrl(pendingLoad.value.url, pendingLoad.value.headers);\n    pendingLoad.value = { url: '', headers: undefined };\n  }\n};\n\n// const parseHeaders = (headers?: Record<string, any>): Electron.LoadURLOptions | undefined => {\n//   if (!isObject(headers) || isObjectEmpty(headers)) return undefined;\n\n//   const result: Electron.LoadURLOptions = {};\n//   for (const key in headers) {\n//     if (['Referer', 'User-Agent'].includes(key)) {\n//       result.httpReferrer = headers[key];\n//     } else {\n//       if (!Object.hasOwn(result, 'extraHeaders')) result.extraHeaders = '';\n//       result.extraHeaders += `${key}: ${headers[key]}\\n`;\n//     }\n//   }\n//   return result;\n// };\n\nconst loadUrl = (url: string, headers?: Record<string, any>) => {\n  if (!url) return;\n  if (isWebviewReady.value) {\n    const wv = webviewRef.value;\n    if (!wv) return;\n    if (isWebviewLoading.value) wv.stop();\n\n    if (isObject(headers) && !isObjectEmpty(headers)) {\n      window.electron.ipcRenderer.invoke(IPC_CHANNEL.WEBVIEW_HEADER_BLOCK, wv.getWebContentsId(), url, toRaw(headers));\n    }\n\n    wv.loadURL(url).catch(() => {});\n  } else {\n    pendingLoad.value = { url, headers };\n  }\n};\n\nconst sendIpc = (channel: string, ...args: any[]) => {\n  if (!webviewRef.value) return;\n  webviewRef.value.send(channel, ...args);\n};\n\nconst insertCSS = (css: string) => {\n  return new Promise<void>((resolve, reject) => {\n    if (!webviewRef.value) return reject(new Error('Webview not initialized'));\n\n    webviewRef.value\n      .insertCSS(css)\n      .then(() => resolve())\n      .catch((error) => reject(error));\n  });\n};\n\nconst executeJavaScript = (code: string): Promise<any> => {\n  return new Promise<void>((resolve, reject) => {\n    if (!webviewRef.value) return reject(new Error('Webview not initialized'));\n\n    webviewRef.value\n      .executeJavaScript(code, false)\n      .then((res) => resolve(res))\n      .catch((error) => reject(error));\n  });\n};\n\nconst toggleDevTools = () => {\n  const wv = webviewRef.value;\n  if (!wv) return;\n\n  if (wv?.isDevToolsOpened()) {\n    wv.closeDevTools();\n  } else {\n    wv.openDevTools();\n  }\n};\n\n/**\n * Attach all event listeners to webview\n * start-loading -> navigate -> dom-ready -> finish-load -> stop-loading\n * start-loading -> navigate -> title-updated -> dom-ready -> finish-load -> stop-loading -> favicon-updated\n */\nconst attachEventListeners = () => {\n  const wv = webviewRef.value;\n  if (!wv) return;\n\n  wv.addEventListener('crashed', onCrashed);\n  wv.addEventListener('page-title-updated', onPageTitleUpdated);\n  wv.addEventListener('page-favicon-updated', onPageFaviconUpdated);\n  wv.addEventListener('did-start-loading', onDidStartLoading);\n  wv.addEventListener('dom-ready', onDomReady);\n  wv.addEventListener('did-finish-load', onDidFinishLoading);\n  wv.addEventListener('did-stop-loading', onDidStopLoading);\n  wv.addEventListener('did-navigate', onDidNavigate);\n  wv.addEventListener('did-navigate-in-page', onDidNavigateInPage);\n  wv.addEventListener('did-redirect-navigation', onDidRedirectNavigate);\n};\n\n/**\n * Remove all event listeners\n */\nconst removeEventListeners = () => {\n  const wv = webviewRef.value;\n  if (!wv) return;\n\n  wv.removeEventListener('crashed', onCrashed);\n  wv.removeEventListener('page-title-updated', onPageTitleUpdated);\n  wv.removeEventListener('page-favicon-updated', onPageFaviconUpdated);\n  wv.removeEventListener('did-start-loading', onDidStartLoading);\n  wv.removeEventListener('dom-ready', onDomReady);\n  wv.removeEventListener('did-finish-load', onDidFinishLoading);\n  wv.removeEventListener('did-stop-loading', onDidStopLoading);\n  wv.removeEventListener('did-navigate', onDidNavigate);\n  wv.removeEventListener('did-navigate-in-page', onDidNavigateInPage);\n  wv.removeEventListener('did-redirect-navigation', onDidRedirectNavigate);\n};\n\n/**\n * Expose methods for parent components\n */\ndefineExpose({\n  instance: webviewRef.value,\n  remove: () => webviewRef.value?.remove(),\n  getWebContentsId: () => webviewRef.value?.getWebContentsId() || -1,\n  getTitle: () => webviewRef.value?.getTitle?.() || '',\n  getURL: () => webviewRef.value?.getURL?.() || '',\n  getToken: () => token.value || '',\n  clearHistory: () => webviewRef.value?.clearHistory?.(),\n  stop: () => webviewRef.value?.stop?.(),\n  reload: () => webviewRef.value?.reload?.(),\n  goBack: () => webviewRef.value?.goBack?.(),\n  goForward: () => webviewRef.value?.goForward?.(),\n  canGoBack: () => webviewRef.value?.canGoBack?.() || false,\n  canGoForward: () => webviewRef.value?.canGoForward?.() || false,\n  focus: () => webviewRef.value?.focus?.(),\n  openDevTools: () => webviewRef.value?.openDevTools?.(),\n  closeDevTools: () => webviewRef.value?.closeDevTools?.(),\n  toggleDevTools,\n  sendIpc,\n  insertCSS,\n  executeJavaScript,\n  loadUrl,\n  dispose,\n});\n</script>\n<style lang=\"less\" scoped>\n.webview-container {\n  width: 100%;\n  height: 100%;\n  position: relative;\n\n  .webview {\n    display: inline-flex;\n    width: 100%;\n    height: 100%;\n    color: var(--td-text-color-primary);\n    background: var(--td-border-level-1-color);\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/config/aigc.ts",
    "content": "export default {\n  amazon: {\n    baseURL: '',\n  },\n  anthropic: {\n    baseURL: 'https://api.anthropic.com/v1',\n  },\n  azure: {\n    baseURL: '',\n  },\n  gemini: {\n    baseURL: '',\n  },\n  openai: {\n    baseURL: 'https://api.openai.com/v1',\n  },\n};\n"
  },
  {
    "path": "src/renderer/src/config/browser.ts",
    "content": "export interface IBrowserItem {\n  id: string;\n  title: string;\n  url: string;\n  favicon: string;\n  headers?: Record<string, any>;\n}\n\nexport interface IBrowser {\n  activeTab: string;\n  tabs: IBrowserItem[];\n  history: IBrowserItem[];\n}\n\nexport const init: IBrowser = {\n  activeTab: '',\n  tabs: [],\n  history: [],\n};\n\nexport default init;\n"
  },
  {
    "path": "src/renderer/src/config/emitterChannel.ts",
    "content": "export enum emitterChannel {\n  REFRESH_VIEW = 'refresh:view',\n\n  // config\n  REFRESH_HISTORY_CONFIG = 'refresh:history-config',\n  REFRESH_LIVE_CONFIG = 'refresh:live-config',\n  REFRESH_MOMENT_CONFIG = 'refresh:moment-config',\n  REFRESH_PARSE_CONFIG = 'refresh:parse-config',\n  REFRESH_SETTING_CONFIG = 'refresh:setting-config',\n  REFRESH_FILM_CONFIG = 'refresh:film-config',\n  REFRESH_STAR_CONFIG = 'refresh:star-config',\n  REFRESH_PLUGIN_CONFIG = 'refresh:plugin-config',\n  REFRESH_AIGC_CONFIG = 'refresh:aigc-config',\n  REFRESH_SEARCH_CONFIG = 'refresh:search-config',\n\n  // search\n  SEARCH_RECOMMEND = 'search:recommend',\n  SEARCH_LIVE_RECOMMEND = 'search:live-recommend',\n  SEARCH_PARSE_RECOMMEND = 'search:parse-recommend',\n  SEARCH_FILM_RECOMMEND = 'search:film-recommend',\n\n  // component\n  COMP_MULTI_PLAYER_PLAYNEXT = 'component:multi-player:playnext',\n}\n\nexport enum emitterSource {\n  SETTING_TABLE = 'setting:table',\n  SETTING_DATA = 'setting:data',\n  SETTING_BASE = 'setting:base',\n  PAGE_SHOW = 'page:show',\n  PAGE_DEBUG = 'page:debug',\n  LAYOUT_HEADER_ROUTER = 'layout:header-router',\n  LAYOUT_HEADER_SEARCH = 'layout:header-search',\n  LAYOUT_HEADER_QUICK = 'layout:header-quick',\n}\n"
  },
  {
    "path": "src/renderer/src/config/global.ts",
    "content": "import { APP_NAME_ALIAS } from '@shared/config/appinfo';\n\nexport const prefix = APP_NAME_ALIAS;\nexport const attachContent = `${APP_NAME_ALIAS}-content-container`;\nexport const attachMainContent = `${APP_NAME_ALIAS}-main`;\n"
  },
  {
    "path": "src/renderer/src/config/hot.ts",
    "content": "export default {\n  baidu: {\n    url: 'https://www.baidu.com/s?wd=%E7%94%B5%E8%A7%86%E5%89%A7%E6%8E%92%E8%A1%8C%E6%A6%9C',\n    category: [1, 2],\n  },\n  douban: {\n    url: 'https://www.douban.com',\n    category: [1, 2, 3],\n  },\n  enlightent: {\n    url: 'https://www.enlightent.cn/sixiang/rank-list/',\n    category: [1, 2, 3],\n  },\n  kylive: {\n    url: 'https://www.ky.live',\n    category: [2, 3],\n  },\n  komect: {\n    url: 'https://msi.nsoap.komect.com/minitvH5/index.html#/hotlist?licensedParty=未来电视&isOuter=undefined&provCode=42&deviceType=502090&isNewTheme=2',\n    category: [1, 2, 3, 4],\n  },\n  quark: {\n    url: 'https://vt.quark.cn/blm/video-list-544/tab?app=college&hot=电视剧&type=电视剧热搜&hottype=true&video=电视剧',\n    category: [1, 2, 3],\n  },\n};\n"
  },
  {
    "path": "src/renderer/src/config/parse.ts",
    "content": "import icon360 from '@/assets/platform/icon/360.svg?raw';\nimport iconBilibili from '@/assets/platform/icon/bilibili.svg?raw';\nimport iconIqiyi from '@/assets/platform/icon/iqiyi.svg?raw';\nimport iconLe from '@/assets/platform/icon/le.svg?raw';\nimport iconMgtv from '@/assets/platform/icon/mgtv.svg?raw';\nimport iconPptv from '@/assets/platform/icon/pptv.svg?raw';\nimport iconSohu from '@/assets/platform/icon/sohu.svg?raw';\nimport iconTencent from '@/assets/platform/icon/tencent.svg?raw';\nimport iconYouku from '@/assets/platform/icon/youku.svg?raw';\nimport logo360 from '@/assets/platform/logo/360.svg?raw';\nimport logoBilibili from '@/assets/platform/logo/bilibili.svg?raw';\nimport logoIqiyi from '@/assets/platform/logo/iqiyi.svg?raw';\nimport logoLe from '@/assets/platform/logo/le.svg?raw';\nimport logoMgtv from '@/assets/platform/logo/mgtv.svg?raw';\nimport logoPptv from '@/assets/platform/logo/pptv.svg?raw';\nimport logoSohu from '@/assets/platform/logo/sohu.svg?raw';\nimport logoTencent from '@/assets/platform/logo/tencent.svg?raw';\nimport logoYouku from '@/assets/platform/logo/youku.svg?raw';\n\nexport const china = [\n  {\n    url: 'https://www.360kan.com',\n    host: '360kan.com',\n    id: '360',\n    img: logo360,\n    icon: icon360,\n    show: true,\n    search: 'https://so.360kan.com/?kw={kw}',\n    titleSplit: '',\n  },\n  {\n    url: 'https://www.iqiyi.com',\n    host: 'iqiyi.com',\n    id: 'iqiyi',\n    img: logoIqiyi,\n    icon: iconIqiyi,\n    show: true,\n    search: 'https://www.iqiyi.com/search/{kw}.html',\n    titleSplit: '-',\n  },\n  {\n    url: 'https://v.qq.com',\n    host: 'v.qq.com',\n    id: 'tencent',\n    img: logoTencent,\n    icon: iconTencent,\n    show: true,\n    search: 'https://v.qq.com/x/search/?q={kw}',\n    titleSplit: '_',\n  },\n  {\n    url: 'https://youku.com',\n    host: 'youku.com',\n    id: 'youku',\n    img: logoYouku,\n    icon: iconYouku,\n    show: true,\n    search: 'https://so.youku.com/search/q_{kw}',\n    titleSplit: '-',\n  },\n  {\n    url: 'https://www.mgtv.com',\n    host: 'mgtv.com',\n    id: 'mgtv',\n    img: logoMgtv,\n    icon: iconMgtv,\n    show: true,\n    search: 'https://so.mgtv.com/so?k={kw}',\n    titleSplit: '-',\n  },\n  {\n    url: 'https://www.le.com',\n    host: 'le.com',\n    id: 'letv',\n    img: logoLe,\n    icon: iconLe,\n    show: true,\n    search: 'https://so.le.com/s?wd={kw}',\n    titleSplit: '-',\n  },\n  {\n    url: 'https://tv.sohu.com',\n    host: 'sohu.com',\n    id: 'sohu',\n    img: logoSohu,\n    icon: iconSohu,\n    show: true,\n    search: 'https://tv.sohu.com/mts/?key={kw}',\n    titleSplit: '-',\n  },\n  {\n    url: 'https://www.pptv.com',\n    host: 'pptv.com',\n    id: 'pptv',\n    img: logoPptv,\n    icon: iconPptv,\n    show: true,\n    search: 'https://sou.pptv.com/s_video?kw={kw}',\n    titleSplit: '_',\n  },\n  {\n    url: 'https://www.bilibili.com',\n    host: 'bilibili.com',\n    id: 'bilibili',\n    img: logoBilibili,\n    icon: iconBilibili,\n    show: true,\n    search: 'https://search.bilibili.com/all?keyword={kw}',\n    titleSplit: '_',\n  },\n];\n\nexport const other = [\n  {\n    url: 'https://www.360kan.com',\n    host: '360kan.com',\n    id: '360',\n    img: logo360,\n    icon: icon360,\n    show: true,\n    search: 'https://so.360kan.com/?kw={kw}',\n    titleSplit: '',\n  },\n  {\n    url: 'https://www.iq.com',\n    host: 'iq.com',\n    id: 'iqiyi',\n    img: logoIqiyi,\n    icon: iconIqiyi,\n    show: true,\n    search: 'https://www.iq.com/search?query={kw}',\n    titleSplit: '–',\n  },\n  {\n    url: 'https://wetv.vip',\n    host: 'wetv.vip',\n    id: 'tencent',\n    img: logoTencent,\n    icon: iconTencent,\n    show: true,\n    search: 'https://wetv.vip/zh-tw/search/{kw}',\n    titleSplit: '-',\n  },\n  {\n    url: 'https://youku.tv',\n    host: 'youku.tv',\n    id: 'youku',\n    img: logoYouku,\n    icon: iconYouku,\n    show: true,\n    search: 'https://so.youku.tv/search_video/q_{kw}',\n    titleSplit: '-YOUKU',\n  },\n  {\n    url: 'https://w.mgtv.com',\n    host: 'w.mgtv.com',\n    id: 'mgtv',\n    img: logoMgtv,\n    icon: iconMgtv,\n    show: true,\n    search: 'https://w.mgtv.com/so?k={kw}',\n    titleSplit: '-MangoTV',\n  },\n  {\n    url: 'https://www.le.com',\n    host: 'le.com',\n    id: 'letv',\n    img: logoLe,\n    icon: iconLe,\n    show: true,\n    search: 'https://so.le.com/s?wd=',\n    titleSplit: '-',\n  },\n  {\n    url: 'https://tv.sohu.com',\n    host: 'sohu.com',\n    id: 'sohu',\n    img: logoSohu,\n    icon: iconSohu,\n    show: true,\n    search: 'https://tv.sohu.com/mts/?key={kw}',\n    titleSplit: '-',\n  },\n  {\n    url: 'https://www.pptv.com',\n    host: 'pptv.com',\n    id: 'pptv',\n    img: logoPptv,\n    icon: iconPptv,\n    show: true,\n    search: 'https://sou.pptv.com/s_video?kw={kw}',\n    titleSplit: '_',\n  },\n  {\n    url: 'https://www.bilibili.tv',\n    host: 'bilibili.tv',\n    id: 'bilibili',\n    img: logoBilibili,\n    icon: iconBilibili,\n    show: true,\n    search: 'https://www.bilibili.tv/en/search-result?q={kw}',\n    titleSplit: '- BiliBili',\n  },\n];\n"
  },
  {
    "path": "src/renderer/src/config/player.ts",
    "content": "import type { ISetting } from '@shared/config/tblSetting';\n\nexport interface IStorePlayer {\n  type: 'film' | 'live' | 'parse';\n  status: boolean;\n  data: {\n    info: Record<string, any>;\n    extra: Record<string, any>;\n  };\n  barrage: ISetting['barrage'];\n  setting: {\n    playNextPreload: boolean;\n    playNextEnabled: boolean;\n    loopEnabled: boolean;\n    skipHeadAndEnd: boolean;\n    skipAd: boolean;\n  };\n  player: {\n    type: ISetting['player']['type'];\n    external: string;\n  };\n}\n\nexport const init: IStorePlayer = {\n  type: 'film',\n  status: true,\n  data: {\n    info: {},\n    extra: {},\n  },\n  barrage: {\n    url: '',\n    id: '',\n    key: '',\n    support: [],\n    start: 0,\n    type: 1,\n    color: 2,\n    text: 4,\n  },\n  setting: {\n    playNextPreload: false,\n    playNextEnabled: true,\n    loopEnabled: false,\n    skipHeadAndEnd: false,\n    skipAd: false,\n  },\n  player: {\n    type: 'artplayer',\n    external: '',\n  },\n};\n\nexport default init;\n"
  },
  {
    "path": "src/renderer/src/config/setting.ts",
    "content": "import type { ITheme } from '@shared/config/theme';\nimport type { ILang } from '@shared/locales';\n\nexport interface IStoreSetting {\n  theme: ITheme;\n  lang: ILang;\n  brandTheme: string;\n  isSidebarCompact: boolean;\n  timeout: number;\n  debug: boolean;\n  bossKey: string;\n  zoom: number;\n  nav: {\n    setting: string;\n    lab: string;\n  };\n}\n\nexport const init: IStoreSetting = {\n  theme: 'system',\n  lang: 'system',\n  brandTheme: '#85d46e',\n  isSidebarCompact: false,\n  timeout: 5000,\n  debug: false,\n  bossKey: '',\n  zoom: 1,\n  nav: {\n    setting: 'baseConfig',\n    lab: 'crypto',\n  },\n};\n\nexport default init;\n"
  },
  {
    "path": "src/renderer/src/layouts/components/Content.vue",
    "content": "<template>\n  <div :class=\"[`${prefix}-content-container`]\">\n    <router-view v-if=\"isRouterAlive\" v-slot=\"{ Component }\">\n      <transition name=\"fade\" mode=\"out-in\">\n        <keep-alive>\n          <component :is=\"Component\" id=\"main-component\" :key=\"activeRouteFullPath\" :class=\"`${prefix}-component`\" />\n        </keep-alive>\n      </transition>\n    </router-view>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { computed, nextTick, ref } from 'vue';\nimport { useRouter } from 'vue-router';\n\nimport { emitterChannel } from '@/config/emitterChannel';\nimport { prefix } from '@/config/global';\nimport emitter from '@/utils/emitter';\n\nconst activeRouteFullPath = computed(() => {\n  const router = useRouter();\n  return router.currentRoute.value.fullPath;\n});\n\nconst isRouterAlive = ref(true);\n\nemitter.on(emitterChannel.REFRESH_VIEW, () => {\n  isRouterAlive.value = false;\n  nextTick(() => (isRouterAlive.value = true));\n});\n</script>\n<style lang=\"less\" scoped>\n.fade-leave-active,\n.fade-enter-active {\n  transition: opacity @anim-duration-slow @anim-time-fn-easing;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n  opacity: 0;\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/layouts/components/Header.vue",
    "content": "<template>\n  <div :class=\"[`${prefix}-header-container`]\">\n    <div class=\"left system-functions\">\n      <router-control :filter=\"routerControlFilter\" class=\"system-function no-drag-region\" />\n      <search-panel class=\"system-function no-drag-region\" />\n      <player-show class=\"system-function no-drag-region\" />\n    </div>\n    <div class=\"right system-functions\">\n      <quick-menu :filter=\"quickMenuFilter\" class=\"system-functions no-drag-region\" />\n      <system-control :filter=\"systemControlFilter\" class=\"system-function no-drag-region\" />\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\n\nimport PlayerShow from '@/components/play-show/index.vue';\nimport QuickMenu from '@/components/quick-menu/index.vue';\nimport RouterControl from '@/components/router-control/index.vue';\nimport SearchPanel from '@/components/search-panel/index.vue';\nimport SystemControl from '@/components/system-control/index.vue';\nimport { prefix } from '@/config/global';\n\nconst routerControlFilter = ref([]);\nconst quickMenuFilter = ref(['language', 'skin', 'setting', 'lab']);\nconst systemControlFilter = ref([]);\n</script>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "src/renderer/src/layouts/components/LayoutContent.vue",
    "content": "<template>\n  <l-content />\n</template>\n<script setup lang=\"ts\">\nimport LContent from './Content.vue';\n</script>\n"
  },
  {
    "path": "src/renderer/src/layouts/components/LayoutHeader.vue",
    "content": "<template>\n  <l-header />\n</template>\n<script setup lang=\"ts\">\nimport LHeader from './Header.vue';\n</script>\n"
  },
  {
    "path": "src/renderer/src/layouts/components/LayoutSideNav.vue",
    "content": "<template>\n  <l-side-nav :menu=\"sideMenu\" />\n</template>\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport { allRoutes } from '@/router';\nimport type { MenuRoute } from '@/types/interface';\n\nimport LSideNav from './SideNav.vue';\n\nconst sideMenu = computed(() => {\n  let newMenuRouters = allRoutes as Array<MenuRoute>;\n\n  newMenuRouters\n    .filter((item) => item.name === 'Base')\n    .forEach((menu) => {\n      newMenuRouters = menu.children.map((subMenu) => ({\n        ...subMenu,\n        path: `${menu.path}/${subMenu.path}`.replace(/\\/\\//, '/'),\n      }));\n    });\n\n  return newMenuRouters;\n});\n</script>\n"
  },
  {
    "path": "src/renderer/src/layouts/components/SideNav.vue",
    "content": "<template>\n  <div :class=\"[`${prefix}-aside-container`]\">\n    <t-menu collapsed :value=\"active\" :style=\"{ width: '100%' }\">\n      <template v-if=\"!isMacOS\" #logo>\n        <img src=\"@/assets/icon.png\" alt=\"logo\" class=\"t-menu__icon\" />\n      </template>\n\n      <template v-for=\"item in list.top\" :key=\"item.path\">\n        <t-menu-item v-if=\"getHref(item)\" :name=\"item.path\" :value=\"getPath(item)\" @click=\"openHref(getHref(item)![0])\">\n          <template #icon>\n            <span class=\"t-menu__icon\">\n              <component :is=\"menuIcon(item)\"></component>\n            </span>\n          </template>\n          {{ renderMenuTitle(item.title!) }}\n        </t-menu-item>\n        <t-menu-item v-else :name=\"item.path\" :value=\"getPath(item)\" :to=\"item.path\">\n          <template #icon>\n            <span class=\"t-menu__icon\">\n              <component :is=\"menuIcon(item)\"></component>\n            </span>\n          </template>\n          {{ renderMenuTitle(item.title!) }}\n        </t-menu-item>\n      </template>\n      <template #operations>\n        <t-menu collapsed :value=\"active\" :style=\"{ width: '100%' }\">\n          <template v-for=\"item in list.bottom\" :key=\"item.path\">\n            <t-menu-item\n              v-if=\"getHref(item)\"\n              :name=\"item.path\"\n              :value=\"getPath(item)\"\n              @click=\"openHref(getHref(item)![0])\"\n            >\n              <template #icon>\n                <span class=\"t-menu__icon\">\n                  <component :is=\"menuIcon(item)\"></component>\n                </span>\n              </template>\n              {{ renderMenuTitle(item.title!) }}\n            </t-menu-item>\n            <t-menu-item v-else :name=\"item.path\" :value=\"getPath(item)\" :to=\"item.path\">\n              <template #icon>\n                <span class=\"t-menu__icon\">\n                  <component :is=\"menuIcon(item)\"></component>\n                </span>\n              </template>\n              {{ renderMenuTitle(item.title!) }}\n            </t-menu-item>\n          </template>\n        </t-menu>\n      </template>\n    </t-menu>\n  </div>\n</template>\n<script setup lang=\"tsx\">\nimport type { PropType } from 'vue';\nimport { computed } from 'vue';\n\nimport RenderIcon from '@/components/render-icon/index.vue';\nimport { prefix } from '@/config/global';\nimport { useLocale } from '@/locales/useLocale';\nimport { getActive } from '@/router';\nimport type { MenuRoute } from '@/types/interface';\nimport { isMacOS } from '@/utils/systeminfo';\n\ntype ListItemType = MenuRoute & { icon?: string };\n\nconst { menu } = defineProps({\n  menu: {\n    type: Array as PropType<MenuRoute[]>,\n    default: () => [],\n  },\n});\n\nconst { locale } = useLocale();\n\nconst list = computed(() => {\n  const menuList = getMenuList(menu);\n  const topList: ListItemType[] = menuList.filter((item) => item.position === 'top' || !item.position);\n  const bottomList: ListItemType[] = menuList.filter((item) => item.position === 'bottom');\n  return { top: topList, bottom: bottomList };\n});\nconst active = computed(() => getActive());\n\nconst menuIcon = (item: ListItemType) => {\n  const filled = item.path === active.value;\n  if (typeof item.icon === 'string') return <RenderIcon name={`${item.icon}${filled ? '-filled' : ''}`} />;\n  return item.icon;\n};\n\nconst renderMenuTitle = (title: string | Record<string, string>) => {\n  if (typeof title === 'string') return title;\n  return title[locale.value];\n};\n\nconst getMenuList = (list: MenuRoute[], basePath?: string): ListItemType[] => {\n  if (!list || list.length === 0) {\n    return [];\n  }\n\n  list.sort((a, b) => {\n    return (a.meta?.orderNo || 0) - (b.meta?.orderNo || 0);\n  });\n\n  return list\n    .map((item) => {\n      const path = basePath && !item.path.includes(basePath) ? `${basePath}/${item.path}` : item.path;\n\n      return {\n        path,\n        title: item.meta?.title,\n        icon: item.meta?.icon,\n        children: getMenuList(item.children, path),\n        meta: item.meta,\n        redirect: item.redirect,\n        position: item.meta?.position,\n      };\n    })\n    .filter((item) => item.meta && item.meta.hidden !== true);\n};\n\nconst getHref = (item: MenuRoute) => {\n  const { frameSrc, frameBlank } = item.meta;\n  if (frameSrc && frameBlank) {\n    return frameSrc.match(/(https?):\\/\\/([\\w.]+)(?:\\/\\S*)?/);\n  }\n  return null;\n};\n\nconst getPath = (item: ListItemType) => {\n  const activeLevel = active.value.split('/').length;\n  const pathLevel = item.path.split('/').length;\n  if (activeLevel > pathLevel && active.value.startsWith(item.path)) {\n    return active.value;\n  }\n\n  if (active.value === item.path) {\n    return active.value;\n  }\n\n  return item.meta?.single ? item.redirect : item.path;\n};\n\nconst openHref = (url: string) => {\n  window.open(url);\n};\n</script>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "src/renderer/src/layouts/index.vue",
    "content": "<template>\n  <div class=\"layout\">\n    <t-layout :class=\"[`${prefix}-layout`, `${prefix}-layout-component`]\">\n      <t-aside :class=\"[`${prefix}-aside`, `${prefix}-layout-component`]\">\n        <layout-side-nav />\n      </t-aside>\n      <t-layout :class=\"[`${prefix}-main`, `${prefix}-layout-component`]\">\n        <t-header class=\"drag-region\" :class=\"[`${prefix}-header`, `${prefix}-layout-component`]\">\n          <layout-header />\n        </t-header>\n        <t-content :class=\"[`${prefix}-content`, `${prefix}-layout-component`]\">\n          <layout-content />\n        </t-content>\n      </t-layout>\n    </t-layout>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { prefix } from '@/config/global';\n\nimport LayoutContent from './components/LayoutContent.vue';\nimport LayoutHeader from './components/LayoutHeader.vue';\nimport LayoutSideNav from './components/LayoutSideNav.vue';\n</script>\n<style lang=\"less\" scoped>\n@import '@/style/layout.less';\n</style>\n"
  },
  {
    "path": "src/renderer/src/locales/index.ts",
    "content": "import type { ILangWithoutSystem } from '@shared/locales';\nimport { defaultLocale, fallbackLocale, lang, langCode, messages } from '@shared/locales';\nimport { usePreferredLanguages } from '@vueuse/core';\nimport { computed } from 'vue';\nimport type { Composer } from 'vue-i18n';\nimport { createI18n } from 'vue-i18n';\n\nconst importMessages = computed(() => messages());\n\nexport const defaultLang = (value?: ILangWithoutSystem | 'system'): ILangWithoutSystem => {\n  let lang = value;\n\n  if (!lang) {\n    try {\n      const store = localStorage.getItem('setting');\n      if (store) {\n        const parsed = JSON.parse(store);\n        lang = parsed.lang;\n      }\n    } catch {}\n  }\n\n  if (!lang || lang === 'system') {\n    const languages = usePreferredLanguages();\n    const preferred = languages.value[0];\n    lang = preferred as ILangWithoutSystem;\n  }\n\n  if (!langCode.includes(lang as ILangWithoutSystem)) {\n    lang = defaultLocale;\n  }\n\n  return lang as ILangWithoutSystem;\n};\n\nexport const i18n = createI18n({\n  legacy: false,\n  locale: defaultLang(),\n  fallbackLocale,\n  messages: importMessages.value,\n  globalInjection: true,\n});\n\nexport const langList = computed(() => lang());\n\nexport { langCode } from '@shared/locales';\n\n// export const { t }: { t: Composer['t'] } = i18n.global;\nexport const t: Composer['t'] = i18n.global.t;\n\nexport default i18n;\n"
  },
  {
    "path": "src/renderer/src/locales/useLocale.ts",
    "content": "import type { ILangWithoutSystem } from '@shared/locales';\nimport type { GlobalConfigProvider } from 'tdesign-vue-next';\nimport { computed } from 'vue';\nimport { useI18n } from 'vue-i18n';\n\nimport { defaultLang, i18n } from '@/locales/index';\n\nexport function useLocale() {\n  const { locale } = useI18n({ useScope: 'global' });\n  function changeLocale(value: ILangWithoutSystem) {\n    const lang = defaultLang(value);\n    locale.value = lang;\n  }\n\n  const getComponentsLocale = computed(() => {\n    // @ts-expect-error `getLocaleMessage` is a method from vue-i18n\n    return i18n.global.getLocaleMessage(locale.value).componentsLocale as GlobalConfigProvider;\n  });\n\n  return {\n    changeLocale,\n    getComponentsLocale,\n    locale,\n  };\n}\n"
  },
  {
    "path": "src/renderer/src/main.ts",
    "content": "/* eslint-disable simple-import-sort/imports */\nimport { createApp } from 'vue';\n\nimport { print as consolePrint } from '@/utils/console';\nimport { dom as initDom } from '@/utils/setup';\nimport App from './App.vue';\nimport i18n from './locales';\nimport router from './router';\nimport { store } from './store';\n\nimport '@/style/index.less';\nimport 'tdesign-vue-next/es/style/index.css';\n\ninitDom();\nconsolePrint();\n\nconst app = createApp(App);\napp.use(store);\napp.use(router);\napp.use(i18n);\n\napp.mount('#app').$nextTick(window.removeLoading);\n"
  },
  {
    "path": "src/renderer/src/pages/Disclaimer.vue",
    "content": "<template>\n  <t-dialog\n    v-model:visible=\"formVisible\"\n    placement=\"center\"\n    destroy-on-close\n    lazy\n    :close-btn=\"!active.init\"\n    :close-on-esc-keydown=\"!active.init\"\n    :close-on-overlay-click=\"!active.init\"\n    :footer=\"active.init\"\n    @confirm=\"handleAgree\"\n    @close=\"handleDisagree\"\n  >\n    <template #header>\n      {{ $t('pages.md.disclaimer.title') }}\n    </template>\n    <template #body>\n      <div class=\"content-overflow\">\n        <div v-if=\"active.init\" class=\"content-read-tips\">\n          <span v-if=\"active.scrollComplete\">\n            {{ $t('pages.md.disclaimer.readComplete') }}\n          </span>\n          <span v-else>\n            {{ $t('pages.md.disclaimer.readProcess', [active.scrollProcess]) }}\n          </span>\n        </div>\n        <div class=\"content-tips\" @scroll=\"handleScroll\">\n          <render-md :text=\"$t('pages.md.disclaimer.content')\" />\n        </div>\n      </div>\n    </template>\n    <template #footer>\n      <t-button theme=\"default\" variant=\"base\" @click=\"handleDisagree\">\n        {{ $t('common.disagree') }}\n      </t-button>\n      <t-button theme=\"primary\" variant=\"base\" :disabled=\"active.init && !active.scrollComplete\" @click=\"handleAgree\">\n        {{ $t('common.agree') }}\n      </t-button>\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"ts\">\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { computed, onMounted, ref, watch } from 'vue';\n\nimport { getSettingDetail, putSetting } from '@/api/setting';\nimport RenderMd from '@/components/render-markdown/index.vue';\nimport { t } from '@/locales';\n\nconst props = defineProps({\n  visible: {\n    type: Boolean,\n    default: undefined,\n  },\n  type: {\n    type: String,\n    default: 'info',\n  },\n});\n\nconst emits = defineEmits(['update:visible']);\n\nconst KEY = 'disclaimer';\n\nconst formVisible = ref(false);\nconst parentTakesControl = computed(() => props.visible !== undefined);\nconst active = ref({\n  scrollProcess: 0,\n  scrollComplete: false,\n  init: props.type === 'init',\n});\n\nwatch(\n  () => props.visible,\n  (newVal) => {\n    formVisible.value = !!newVal;\n    if (newVal) {\n      active.value.scrollProcess = 0;\n      active.value.scrollComplete = false;\n    }\n  },\n);\nwatch(\n  () => formVisible.value,\n  (val) => {\n    emits('update:visible', val);\n  },\n);\n\nonMounted(() => {\n  if (!parentTakesControl.value) {\n    getDisclaimer();\n  }\n});\n\nconst getDisclaimer = async () => {\n  try {\n    const resp = await getSettingDetail(KEY);\n    formVisible.value = !resp;\n  } catch (error) {\n    console.error(`Fail to get disclaimer status`, error);\n  }\n};\n\nconst putDisclaimer = async (status: boolean) => {\n  try {\n    await putSetting({ key: KEY, value: status });\n  } catch (error) {\n    console.error(`Fail to put disclaimer status`, error);\n  }\n};\n\nconst handleAgree = async () => {\n  await putDisclaimer(true);\n  formVisible.value = false;\n  MessagePlugin.success(t('pages.md.disclaimer.message.agree'));\n};\n\nconst handleDisagree = async () => {\n  if (!active.value.init) return;\n\n  await putDisclaimer(false);\n  MessagePlugin.warning(t('pages.md.disclaimer.message.disagree'));\n  setTimeout(() => window.electron.ipcRenderer.invoke(IPC_CHANNEL.APP_QUIT), 3000);\n};\n\nconst handleScroll = (e: Event) => {\n  const target = e.target as HTMLElement;\n  const scrollHeight = target.scrollHeight - target.clientHeight - 10;\n\n  if (target.scrollTop > scrollHeight) {\n    active.value.scrollComplete = true;\n  }\n\n  if (!active.value.scrollComplete) {\n    active.value.scrollProcess = Math.round((target.scrollTop / scrollHeight) * 100);\n  } else {\n    active.value.scrollProcess = 100;\n  }\n};\n</script>\n<style lang=\"less\" scoped>\n.content-overflow {\n  position: relative;\n\n  .content-tips {\n    max-height: 340px;\n    overflow: hidden auto;\n  }\n\n  .content-read-tips {\n    position: absolute;\n    right: var(--td-size-4);\n    top: 0;\n    z-index: 9;\n    font-size: 12px;\n    padding: var(--td-comp-paddingTB-xs) var(--td-comp-paddingLR-s);\n    background-color: var(--td-bg-color-container);\n    border: 1px solid var(--td-border-level-2-color);\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/browser/index.vue",
    "content": "<template>\n  <div class=\"layout-browser\">\n    <t-layout :class=\"[`${prefix}-layout`]\">\n      <t-header class=\"drag-region\" :class=\"[`${prefix}-header`]\">\n        <div :class=\"[`${prefix}-header-container`]\">\n          <div class=\"left system-functions\">\n            <div class=\"router-control system-function no-drag-region\">\n              <t-button theme=\"default\" shape=\"square\" class=\"btn\" @click=\"handleWebviewRouter('back')\">\n                <template #icon><chevron-left-icon /></template>\n              </t-button>\n\n              <t-button theme=\"default\" shape=\"square\" class=\"btn\" @click=\"handleWebviewRouter('forward')\">\n                <template #icon><chevron-right-icon /></template>\n              </t-button>\n\n              <t-button theme=\"default\" shape=\"square\" class=\"btn\" @click=\"handleWebviewRouter('refresh')\">\n                <template #icon><rotate-icon /></template>\n              </t-button>\n            </div>\n\n            <div class=\"tabs system-function no-drag-region\">\n              <template v-for=\"item in tabs\" :key=\"item.id\">\n                <t-tooltip\n                  :attach=\"`.${attachContent}`\"\n                  :z-index=\"3610\"\n                  :show-arrow=\"false\"\n                  destroy-on-close\n                  :content=\"item.title\"\n                  placement=\"bottom\"\n                >\n                  <div class=\"tab-item\" :class=\"{ 'is-active': active === item.id }\" @click=\"handleTabClick(item)\">\n                    <div class=\"icon\">\n                      <t-image\n                        :src=\"item.favicon\"\n                        fit=\"cover\"\n                        :error=\"renderFavicon\"\n                        :loading=\"renderFavicon\"\n                        class=\"favicon\"\n                      />\n                    </div>\n                    <div class=\"title txthide\">{{ item.title }}</div>\n                    <t-button\n                      theme=\"default\"\n                      shape=\"square\"\n                      variant=\"text\"\n                      class=\"close\"\n                      @click.stop=\"handleTabClose(item.id)\"\n                    >\n                      <template #icon><close-icon /></template>\n                    </t-button>\n                  </div>\n                </t-tooltip>\n              </template>\n            </div>\n          </div>\n\n          <div class=\"right system-functions\">\n            <div class=\"browser system-function no-drag-region\">\n              <t-button theme=\"default\" shape=\"square\" class=\"btn\" @click=\"handleMoreOpenSystemBrowser\">\n                <template #icon><internet-icon /></template>\n              </t-button>\n            </div>\n\n            <div class=\"more system-function no-drag-region\">\n              <t-button theme=\"default\" shape=\"square\" class=\"btn\" @click=\"handleMoreDrawer\">\n                <template #icon><ellipsis-icon /></template>\n              </t-button>\n            </div>\n\n            <system-control class=\"system-function no-drag-region\" />\n          </div>\n\n          <t-drawer\n            v-model:visible=\"isVisible.more\"\n            :header=\"null\"\n            :footer=\"null\"\n            :attach=\"`.${attachContent}`\"\n            show-in-attached-element\n            :z-index=\"3600\"\n            class=\"drawer-more-content\"\n          >\n            <div class=\"drawer-more-content-container\">\n              <div class=\"action\">\n                <t-button theme=\"default\" variant=\"text\" block class=\"action-btn\" @click=\"handleMoreOpenSystemBrowser\">\n                  {{ $t('pages.browser.button.openInBrowser') }}\n                  <template #icon><internet-icon /></template>\n                </t-button>\n                <t-button theme=\"default\" variant=\"text\" block class=\"action-btn\" @click=\"handleMoreDevtools\">\n                  {{ $t('system.view.toggleDevTools') }}\n                  <template #icon><code-1-icon /></template>\n                </t-button>\n              </div>\n              <t-divider dashed class=\"divider\" />\n              <div class=\"history\">\n                <div class=\"history-header\">\n                  <div class=\"title\">{{ $t('pages.browser.history.recent') }}</div>\n                  <div v-show=\"history.length\" class=\"clear\" @click=\"handleMoreClearHistory\">\n                    {{ $t('common.clear') }}\n                  </div>\n                </div>\n                <div class=\"history-content\">\n                  <div v-if=\"history.length\" class=\"history-items\">\n                    <template v-for=\"item in history\" :key=\"item.id\">\n                      <t-tooltip\n                        attach=\".drawer-more-content\"\n                        :z-index=\"3610\"\n                        :show-arrow=\"false\"\n                        destroy-on-close\n                        :content=\"item.url\"\n                        placement=\"bottom\"\n                      >\n                        <div class=\"history-item\" @click=\"handleTabNew(item)\">\n                          <div class=\"icon\">\n                            <t-image\n                              :src=\"item.favicon\"\n                              fit=\"cover\"\n                              :error=\"renderFavicon\"\n                              :loading=\"renderFavicon\"\n                              class=\"favicon\"\n                            />\n                          </div>\n                          <div class=\"title txthide\">{{ item.title }}</div>\n                        </div>\n                      </t-tooltip>\n                    </template>\n                  </div>\n                  <div v-else class=\"history-empty\">\n                    <t-empty />\n                  </div>\n                </div>\n                <div class=\"history-tip\">{{ $t('pages.browser.history.tip', [30]) }}</div>\n              </div>\n            </div>\n          </t-drawer>\n        </div>\n      </t-header>\n      <t-content :class=\"[`${prefix}-content`]\">\n        <div :class=\"[`${prefix}-content-container`]\">\n          <webview-view\n            ref=\"webviewRef\"\n            :appid=\"appid\"\n            class=\"content-wrapper\"\n            :on-navigate-callback=\"onNavigateCallback\"\n            :on-title-updated-callback=\"onTitleUpdatedCallback\"\n            :on-favicon-updated-callback=\"onFaviconUpdatedCallback\"\n          />\n        </div>\n      </t-content>\n    </t-layout>\n  </div>\n</template>\n<script setup lang=\"tsx\">\nimport { APP_NAME } from '@shared/config/appinfo';\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { WINDOW_NAME } from '@shared/config/window';\nimport { generateStrUUID } from '@shared/modules/crypto';\nimport { isExternal } from '@shared/modules/validate';\nimport {\n  ChevronLeftIcon,\n  ChevronRightIcon,\n  CloseIcon,\n  Code1Icon,\n  EllipsisIcon,\n  InternetIcon,\n  RotateIcon,\n} from 'tdesign-icons-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { computed, nextTick, onMounted, onUnmounted, ref, useTemplateRef } from 'vue';\n\nimport SystemControl from '@/components/system-control/index.vue';\nimport WebviewView from '@/components/webview/index.vue';\nimport type { IBrowserItem } from '@/config/browser';\nimport { attachContent, prefix } from '@/config/global';\nimport { t } from '@/locales';\nimport { useBrowserStore } from '@/store';\n\nconst MAX_TABS = 10;\n\nconst browserStore = useBrowserStore();\n\nconst webviewRef = useTemplateRef<typeof WebviewView | null>('webviewRef');\n\nconst active = computed(() => browserStore.activeTab || '');\nconst tabs = computed(() => browserStore.tabs || []);\nconst history = computed(() => browserStore.history || []);\n\nconst isVisible = ref({\n  more: false,\n});\nconst appid = ref('browser_default');\n\nonMounted(() => setup());\nonUnmounted(() => dispose());\n\nconst setup = () => {\n  document.title = `${APP_NAME}(${t('pages.browser.title')})`;\n\n  window.electron.ipcRenderer.on(IPC_CHANNEL.WINDOW_DESTROY, onWindowDestroy);\n  window.electron.ipcRenderer.on(IPC_CHANNEL.BROWSER_NAVIGATE, onBrowserNavigate);\n\n  if (active.value) {\n    nextTick(() => {\n      const item = browserStore.getDetail(active.value);\n      if (item?.url) handleWebviewNavigator(item.url, item.headers);\n    });\n  }\n};\n\nconst dispose = () => {\n  window.electron.ipcRenderer.removeAllListeners(IPC_CHANNEL.WINDOW_DESTROY);\n  window.electron.ipcRenderer.removeAllListeners(IPC_CHANNEL.BROWSER_NAVIGATE);\n};\n\nconst onWindowDestroy = () => {\n  browserStore.clear('tabs');\n  browserStore.activeTab = '';\n\n  window.electron.ipcRenderer.send(IPC_CHANNEL.WINDOW_DESTROY_RELAY);\n};\n\nconst onBrowserNavigate = (_: Electron.IpcRendererEvent, url: string, headers?: Record<string, any>) => {\n  const id = generateStrUUID(url);\n  handleTabNew({\n    id,\n    favicon: '',\n    title: `${t('pages.browser.tab.newTab')} ${id.slice(0, 4)}`,\n    url,\n    headers,\n  });\n};\n\nconst renderFavicon = () => (\n  <InternetIcon style={{ width: '100%', height: '100%', color: 'var(--td-text-color-primary)' }} />\n);\n\nconst handleWebviewRouter = (type: 'back' | 'forward' | 'refresh') => {\n  const wv = webviewRef.value;\n  if (!wv) return;\n\n  if (type === 'back' && wv.canGoBack()) wv.goBack();\n  if (type === 'forward' && wv.canGoForward()) wv.goForward();\n  if (type === 'refresh') wv.reload();\n};\n\nconst handleWebviewNavigator = (url: string, headers?: Record<string, any>) => {\n  appid.value = `browser_${generateStrUUID(url)}`;\n  nextTick(() => webviewRef.value?.loadUrl(url, headers));\n};\n\nconst handleTabClick = (item: IBrowserItem) => {\n  if (active.value === item.id) return;\n\n  browserStore.activeTab = item.id;\n\n  handleWebviewNavigator(item.url, item.headers);\n};\n\nconst handleTabClose = (id: string) => {\n  const index = browserStore.getTabIndex(active.value);\n  if (index < 0) return;\n\n  browserStore.close(id);\n\n  if (!browserStore.tabs.length) {\n    window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_DESTROY, WINDOW_NAME.BROWSER);\n    return;\n  }\n\n  const isActive = active.value === id;\n  const next = browserStore.getDetail(index + 1, 'idx') || browserStore.getDetail(index - 1, 'idx');\n\n  if (isActive) {\n    browserStore.activeTab = next?.id ?? '';\n    handleWebviewNavigator(next?.url ?? 'about:blank', next?.headers);\n  }\n};\n\nconst handleTabNew = (doc: IBrowserItem) => {\n  if (browserStore.tabs.length >= MAX_TABS) {\n    MessagePlugin.warning(t('pages.browser.message.tabOverflow'));\n    return;\n  }\n\n  browserStore.open(doc);\n  browserStore.activeTab = doc.id;\n\n  handleWebviewNavigator(doc.url, doc.headers);\n};\n\n/** more */\n\nconst handleMoreDrawer = () => {\n  isVisible.value.more = !isVisible.value.more;\n};\n\nconst handleMoreOpenSystemBrowser = () => {\n  const url = webviewRef.value?.getURL();\n  if (isExternal(url)) {\n    window.electron.ipcRenderer.invoke(IPC_CHANNEL.OPEN_WEBSITE, url);\n  } else {\n    MessagePlugin.warning(t('pages.browser.message.noSupportProtocol'));\n  }\n};\n\nconst handleMoreClearHistory = () => {\n  browserStore.clear('history');\n};\n\nconst handleMoreDevtools = () => {\n  webviewRef.value?.toggleDevTools();\n};\n\n/** callback */\n\nconst updateIfCurrent = (patch: Partial<IBrowserItem>) => {\n  const tabId = active.value;\n  if (!tabId) return;\n\n  const item = browserStore.getDetail(tabId);\n  if (!item) return;\n\n  browserStore.update({ ...item, ...patch });\n};\n\nconst onTitleUpdatedCallback = (_appid: string, title: string) => {\n  if (!title) title = t('pages.browser.tab.newTab');\n  updateIfCurrent({ title });\n};\n\nconst onNavigateCallback = (_appid: string, url: string) => {\n  if (url === 'about:blank') return;\n  updateIfCurrent({ url });\n};\n\nconst onFaviconUpdatedCallback = (_appid: string, favicon: string) => {\n  if (!favicon) return;\n  updateIfCurrent({ favicon });\n};\n</script>\n<style lang=\"less\" scoped>\n@import '@/style/browser.less';\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/film/components/DialogDetail.vue",
    "content": "<template>\n  <t-dialog\n    v-model:visible=\"formVisible\"\n    show-in-attached-element\n    :attach=\"`.${attachContent}`\"\n    width=\"70%\"\n    placement=\"center\"\n    destroy-on-close\n    lazy\n    :footer=\"false\"\n  >\n    <template #header>\n      {{ $t('common.info') }}\n    </template>\n    <template #body>\n      <div class=\"detail view-container\">\n        <div class=\"plist-body\">\n          <div class=\"left\">\n            <t-image\n              class=\"card-main-item\"\n              :src=\"infoConf.vod_pic\"\n              fit=\"cover\"\n              shape=\"round\"\n              :style=\"{ width: '120px', height: '100%' }\"\n              :lazy=\"true\"\n              :loading=\"renderDefaultLazy\"\n              :error=\"renderDefaultLazy\"\n            />\n          </div>\n          <div class=\"right\">\n            <div class=\"info\">\n              <p class=\"title txthide txthide1\">{{ infoConf.vod_name }}</p>\n              <p class=\"info-item txthide txthide1\">\n                <span class=\"name\">{{ $t('pages.film.info.release') }}: </span>\n                <span class=\"role\">{{ infoConf.vod_year || $t('common.unknown') }}</span>\n              </p>\n              <p class=\"info-item txthide txthide1\">\n                <span class=\"name\">{{ $t('pages.film.info.type') }}: </span>\n                <span class=\"role\">{{ infoConf.type_name || $t('common.unknown') }}</span>\n              </p>\n              <p class=\"info-item txthide txthide1\">\n                <span class=\"name\">{{ $t('pages.film.info.area') }}: </span>\n                <span class=\"role\">{{ infoConf.vod_area || $t('common.unknown') }}</span>\n              </p>\n            </div>\n            <div class=\"add-box\" @click=\"switchStar\">\n              <div class=\"add\">\n                <heart-filled-icon v-if=\"starData.id\" class=\"icon\" />\n                <heart-icon v-else class=\"icon\" />\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"plist-listbox\">\n          <div class=\"header\">\n            <div class=\"left\">\n              <h4 class=\"box-anthology-title\">{{ $t('pages.player.film.anthology') }}</h4>\n              <div v-show=\"activeAnalyzeList.length\" class=\"box-anthology-analyze\">\n                <t-dropdown placement=\"bottom\" :max-height=\"250\">\n                  <t-button size=\"small\" theme=\"default\" variant=\"text\" auto-width>\n                    <span>{{ $t('pages.parse.title') }}</span>\n                    <template #suffix>\n                      <chevron-down-icon size=\"16\" />\n                    </template>\n                  </t-button>\n                  <t-dropdown-menu>\n                    <t-dropdown-item\n                      v-for=\"item in activeAnalyzeList\"\n                      :key=\"item.id\"\n                      :active=\"item.id === active.analyzeId\"\n                      @click=\"handleSwitchParse(item.id)\"\n                    >\n                      <span>{{ item.name }}</span>\n                    </t-dropdown-item>\n                  </t-dropdown-menu>\n                </t-dropdown>\n              </div>\n            </div>\n            <div class=\"right\">\n              <div class=\"box-anthology-reverse-order\" @click=\"reverseOrderEvent\">\n                <order-descending-icon v-if=\"active.reverseOrder\" size=\"1.2em\" />\n                <order-ascending-icon v-else size=\"1.2em\" />\n              </div>\n            </div>\n          </div>\n          <div class=\"box-anthology-item\">\n            <div v-if=\"lineList.length > 1\" class=\"box-anthology-header\">\n              <title-menu :list=\"lineList\" :active=\"active.filmSource\" class=\"nav\" @change=\"handleSwitchLine\" />\n            </div>\n            <div class=\"box-anthology-content\">\n              <div class=\"grid-wrap\">\n                <div\n                  v-for=\"(item, index) in activeSessionList\"\n                  :key=\"index\"\n                  class=\"item-wrap\"\n                  :class=\"[`${item.text}$${item.link}` === active.filmIndex ? 'is-active' : '']\"\n                  @click=\"handleSwitchSeason(item)\"\n                >\n                  <div class=\"list-item\">\n                    <t-tooltip :content=\"item.text\">\n                      <div class=\"title txthide txthide1\">{{ reverseOrderIndex(index) }}</div>\n                    </t-tooltip>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <t-loading :attach=\"`.${attachContent}`\" size=\"medium\" :loading=\"active.loading\" />\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"tsx\">\nimport { PROXY_API } from '@shared/config/env';\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport {\n  isArray,\n  isArrayEmpty,\n  isHttp,\n  isNil,\n  isObject,\n  isObjectEmpty,\n  isPositiveFiniteNumber,\n} from '@shared/modules/validate';\nimport type { ICmsInfo, ICmsInfoEpisode } from '@shared/types/cms';\nimport type { IModels } from '@shared/types/db';\nimport {\n  ChevronDownIcon,\n  HeartFilledIcon,\n  HeartIcon,\n  OrderAscendingIcon,\n  OrderDescendingIcon,\n} from 'tdesign-icons-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport type { PropType } from 'vue';\nimport { computed, ref, watch } from 'vue';\n\nimport { fetchCmsPlay, fetchCmsProxy } from '@/api/film';\nimport { addHistory, addStar, delStar, findHistory, findStar, putHistory, putStar } from '@/api/moment';\nimport { fetchAnalyzeActive, fetchParse } from '@/api/parse';\nimport { setProxy } from '@/api/proxy';\nimport { cdpSnifferMedia } from '@/api/system';\nimport LazyBg from '@/components/lazy-bg/index.vue';\nimport { mediaUtils } from '@/components/multi-player';\nimport TitleMenu from '@/components/title-menu/index.vue';\nimport { attachContent } from '@/config/global';\nimport { t } from '@/locales';\nimport { usePlayerStore } from '@/store';\n\nconst props = defineProps({\n  visible: {\n    type: Boolean,\n    default: false,\n  },\n  info: {\n    type: Object as PropType<ICmsInfo>,\n    default: () => ({}),\n  },\n  extra: {\n    type: Object as PropType<{ active: IModels['site'] }>,\n    default: () => ({ active: {} }),\n  },\n});\n\nconst emits = defineEmits(['update:visible']);\n\nconst storePlayer = usePlayerStore();\n\nconst formVisible = ref(false);\n\nconst infoConf = ref(props.info);\nconst extraConf = ref(props.extra);\n\nconst starData = ref({} as IModels['star']);\nconst historyData = ref({} as IModels['history']);\n\nconst lineList = ref<{ type_id: string; type_name: string }[]>([]);\n\nconst analyzeConfig = ref({\n  default: {} as IModels['analyze'],\n  list: [] as IModels['analyze'][],\n});\n\nconst active = ref({\n  filmSource: '',\n  filmIndex: '',\n  analyzeId: '',\n  reverseOrder: true,\n  loading: false,\n});\n\nconst activeAnalyzeList = computed(() => {\n  const flag = active.value.filmSource;\n  const resp = analyzeConfig.value.list.filter((item: IModels['analyze']) => (item.flag || []).includes(flag));\n  return resp;\n});\n\nconst activeSessionList = computed(() => {\n  const flag = active.value.filmSource;\n  const resp = infoConf.value.vod_episode?.[flag] || [];\n  return resp;\n});\n\nwatch(\n  () => formVisible.value,\n  (val) => {\n    emits('update:visible', val);\n\n    if (val) setup();\n    else defaultConfig();\n  },\n);\nwatch(\n  () => props.visible,\n  (val) => (formVisible.value = val),\n);\nwatch(\n  () => props.info,\n  (val) => (infoConf.value = val),\n  { deep: true },\n);\nwatch(\n  () => props.extra,\n  (val) => (extraConf.value = val),\n  { deep: true },\n);\n\nconst renderDefaultLazy = () => <LazyBg class=\"render-icon\" />;\n\nconst createStarDoc = (item: ICmsInfo, siteKey: string) => ({\n  type: 1,\n  relateId: siteKey,\n  videoId: item.vod_id,\n  videoImage: item.vod_pic,\n  videoName: item.vod_name,\n  videoType: item.type_name,\n  videoRemarks: item.vod_remarks,\n});\n\nconst getStarData = async () => {\n  try {\n    const resp = await findStar({ relateId: extraConf.value.active.key, videoId: infoConf.value.vod_id, type: 1 });\n    starData.value = isNil(resp?.id) ? {} : resp;\n  } catch (error) {\n    console.error('Get Star Data Error:', error);\n    starData.value = {} as IModels['star'];\n  }\n};\n\nconst saveStarData = async () => {\n  const id = starData.value?.id;\n  const doc = createStarDoc(infoConf.value as ICmsInfo, extraConf.value.active.key);\n\n  try {\n    const resp = isNil(id) ? await addStar(doc) : await putStar({ id: [id], doc });\n    if (isArray(resp) && !isArrayEmpty(resp) && !isNil(resp[0]?.id)) {\n      starData.value = resp[0];\n    } else {\n      starData.value = {} as IModels['star'];\n    }\n  } catch (error) {\n    console.error('Save Star Data Error:', error);\n    starData.value = {} as IModels['star'];\n  }\n};\n\nconst delStarDate = async () => {\n  const id = starData.value?.id;\n\n  try {\n    await delStar({ id: [id] });\n  } catch (error) {\n    console.error('Delete Star Data Error:', error);\n  } finally {\n    starData.value = {} as IModels['star'];\n  }\n};\n\nconst switchStar = async () => {\n  const id = starData.value?.id;\n\n  isNil(id) ? await saveStarData() : await delStarDate();\n};\n\nconst createHistoryDoc = (item: ICmsInfo, siteKey: string) => ({\n  type: 1,\n  relateId: siteKey,\n  siteSource: active.value.filmSource,\n  playEnd: false,\n  videoId: item.vod_id,\n  videoImage: item.vod_pic,\n  videoName: item.vod_name,\n  videoIndex: active.value.filmIndex,\n  watchTime: 0,\n  duration: 0,\n  skipTimeInStart: 90,\n  skipTimeInEnd: 90,\n});\n\nconst getHistoryData = async () => {\n  try {\n    const resp = await findHistory({ relateId: extraConf.value.active.key, videoId: infoConf.value.vod_id, type: 1 });\n    historyData.value = isNil(resp?.id) ? {} : resp;\n  } catch (error) {\n    console.error('Get History Data Error:', error);\n    historyData.value = {} as IModels['history'];\n  }\n};\n\nconst saveHistoryData = async () => {\n  const doc = createHistoryDoc(infoConf.value as ICmsInfo, extraConf.value.active.key);\n\n  const id = historyData.value?.id;\n  if (!isNil(id) && isPositiveFiniteNumber(historyData.value.watchTime)) doc.watchTime = historyData.value.watchTime!;\n  if (!isNil(id) && isPositiveFiniteNumber(historyData.value.duration)) doc.duration = historyData.value.duration!;\n  if (!isNil(id) && isPositiveFiniteNumber(historyData.value.skipTimeInStart))\n    doc.skipTimeInStart = historyData.value.skipTimeInStart!;\n  if (!isNil(id) && isPositiveFiniteNumber(historyData.value.skipTimeInEnd))\n    doc.skipTimeInEnd = historyData.value.skipTimeInEnd!;\n\n  try {\n    const resp = isNil(id) ? await addHistory(doc) : await putHistory({ id: [id], doc });\n    if (isArray(resp) && !isArrayEmpty(resp) && !isNil(resp[0]?.id)) {\n      historyData.value = resp[0];\n    } else {\n      historyData.value = {} as IModels['history'];\n    }\n  } catch (error) {\n    console.error('Save History Data Error:', error);\n    historyData.value = {} as IModels['history'];\n  }\n};\n\nconst reverseOrderIndex = (current: number) => {\n  const total = activeSessionList.value.length;\n  const type = active.value.reverseOrder;\n\n  if (!isPositiveFiniteNumber(current) || !isPositiveFiniteNumber(total)) return 1;\n  if (current >= total) return 1;\n\n  return type ? current + 1 : total - current;\n};\n\nconst handleSwitchLine = (id: string) => {\n  active.value.filmSource = id;\n};\n\nconst handleSwitchSeason = (item: ICmsInfoEpisode) => {\n  active.value.filmIndex = `${item.text}$${item.link}`;\n\n  callPlay(item);\n};\n\nconst handleSwitchParse = (id: string) => {\n  active.value.analyzeId = id;\n\n  if (active.value.filmIndex) {\n    const [text, link] = active.value.filmIndex.split('$');\n    callPlay({ text, link });\n  }\n};\n\nconst reverseOrderEvent = () => {\n  infoConf.value.vod_episode = Object.fromEntries(\n    Object.entries(infoConf.value.vod_episode!).map(([key, arr]) => [key, arr.toReversed()]),\n  );\n\n  active.value.reverseOrder = !active.value.reverseOrder;\n};\n\nconst getAnalyzeConfig = async () => {\n  try {\n    const resp = await fetchAnalyzeActive();\n    if (resp?.default) {\n      analyzeConfig.value.default = resp.default;\n      active.value.analyzeId = resp.default.id;\n    }\n    if (resp?.list) {\n      analyzeConfig.value.list = resp.list;\n    }\n  } catch (error) {\n    console.error(`Failed to get analyze config:`, error);\n  }\n};\n\nconst setup = async () => {\n  const episode = infoConf.value.vod_episode;\n  if (!isObject(episode) || isObjectEmpty(episode)) return;\n\n  const episodeKeys = Object.keys(episode);\n  let filmSource = episodeKeys[0];\n  let flimEpisode = episode[filmSource]?.[0];\n\n  if (!isObject(flimEpisode) || isObjectEmpty(flimEpisode)) return;\n  let filmIndex = `${flimEpisode.text}$${flimEpisode.link}`;\n\n  lineList.value = episodeKeys.map((key) => ({ type_id: key, type_name: key }));\n\n  await getHistoryData();\n  if (historyData.value.siteSource && episode[historyData.value.siteSource]) filmSource = historyData.value.siteSource;\n  if (historyData.value.videoIndex) filmIndex = historyData.value.videoIndex;\n  active.value.filmSource = filmSource;\n  active.value.filmIndex = filmIndex;\n\n  flimEpisode = { text: filmIndex.split('$')[0], link: filmIndex.split('$')[1] };\n\n  await getAnalyzeConfig();\n\n  getStarData();\n};\n\nconst getDirectPlayUrl = async (\n  item: ICmsInfoEpisode,\n): Promise<{\n  url: string;\n  headers?: Record<string, any>;\n  quality?: Array<string | number>;\n  mediaType: string;\n}> => {\n  const playRes = await fetchCmsPlay({\n    uuid: extraConf.value.active.id,\n    play: item.link,\n    flag: active.value.filmSource,\n  });\n\n  if (!playRes.url) throw new Error('No Play URL');\n\n  const checkPlayable = async (\n    url: string,\n    headers?: Record<string, any>,\n  ): Promise<{\n    url: string;\n    headers?: Record<string, any>;\n    mediaType: string;\n  } | null> => {\n    const mediaType = await mediaUtils.checkMediaType(url, headers);\n    if (isNil(mediaType)) return null;\n    return { url, headers, mediaType };\n  };\n\n  // Direct play\n  if (playRes.parse === 0 && playRes.jx !== 1) {\n    if (playRes.url.startsWith(PROXY_API)) {\n      const { searchParams } = new URL(playRes.url);\n      const proxyParams = Object.fromEntries(searchParams.entries());\n      const proxyData = await fetchCmsProxy({ uuid: extraConf.value.active.id, ...proxyParams });\n      await setProxy({ url: proxyParams.url, text: proxyData });\n    }\n\n    const direct = await checkPlayable(playRes.url, playRes.headers);\n    if (!isNil(direct)) return { ...direct, quality: playRes.quality };\n  }\n\n  // Parse play\n  if (playRes.jx === 1 || !isArrayEmpty(activeAnalyzeList.value)) {\n    const parse = activeAnalyzeList.value.find((item: IModels['analyze']) => item.id === active.value.analyzeId);\n    if (isNil(parse)) throw new Error('No Active Analyze');\n\n    const parseResp = await fetchParse({ id: parse.id, url: item.link });\n    const parsed = await checkPlayable(parseResp.url, parseResp.headers);\n    if (parsed) return parsed;\n  }\n\n  // Sniffer play\n  if (isHttp(item.link)) {\n    const sniffResp = await cdpSnifferMedia({\n      url: item.link,\n      options: {\n        runScript: playRes.script.runScript,\n        initScript: playRes.script.initScript,\n        customRegex: playRes.script.customRegex,\n        snifferExclude: playRes.script.snifferExclude,\n        headers: playRes.headers,\n      },\n    });\n    const sniffed = await checkPlayable(sniffResp.url, playRes.headers);\n    if (!isNil(sniffed)) return sniffed;\n  }\n\n  throw new Error('No Play URL');\n};\n\nconst callPlay = async (item: ICmsInfoEpisode) => {\n  active.value.loading = true;\n\n  try {\n    const res = await getDirectPlayUrl(item);\n\n    const player = storePlayer.player;\n    window.electron.ipcRenderer.invoke(IPC_CHANNEL.CALL_PLAYER, player.external, res.url);\n\n    await saveHistoryData();\n  } catch (error) {\n    console.error(error);\n\n    const msg = (error as Error).message;\n    if (msg === 'No Play URL') {\n      MessagePlugin.warning(t('pages.player.message.noPlayUrl'));\n    } else if (msg === 'No Active Analyze') {\n      MessagePlugin.warning(t('pages.player.message.noActiveAnalyze'));\n    } else {\n      MessagePlugin.error(`${t('common.error')}: ${msg}`);\n    }\n  } finally {\n    active.value.loading = false;\n  }\n};\n\nconst defaultConfig = () => {\n  active.value.filmSource = '';\n  active.value.filmIndex = '';\n  active.value.analyzeId = '';\n  active.value.reverseOrder = true;\n\n  historyData.value = {} as IModels['history'];\n  starData.value = {} as IModels['star'];\n\n  analyzeConfig.value = { default: {} as IModels['analyze'], list: [] };\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n\n  .plist-body {\n    height: 165px;\n    display: flex;\n    gap: var(--td-size-4);\n\n    .left {\n      width: 120px;\n      display: block;\n      position: relative;\n      height: 100%;\n    }\n\n    .right {\n      flex: 1;\n      position: relative;\n\n      .info {\n        .title {\n          margin-bottom: var(--td-comp-margin-s);\n          color: var(--td-text-color-primary);\n          font-weight: 700;\n          font-size: 26px;\n          line-height: 36px;\n        }\n\n        .info-item {\n          overflow: hidden;\n          text-overflow: ellipsis;\n          white-space: nowrap;\n          font-size: 13px;\n          line-height: 24px;\n          color: var(--td-text-color-secondary);\n        }\n      }\n\n      .add-box {\n        position: absolute;\n        bottom: 0;\n\n        .add {\n          cursor: pointer;\n          display: flex;\n          align-items: center;\n          justify-content: center;\n          color: var(--td-text-color-secondary);\n          background-color: var(--td-bg-color-component);\n          border-radius: var(--td-radius-circle);\n          width: var(--td-comp-size-l);\n          height: var(--td-comp-size-l);\n\n          &:hover {\n            color: var(--td-text-color-primary);\n          }\n\n          .icon {\n            width: var(--td-comp-size-xxs);\n            height: var(--td-comp-size-xxs);\n          }\n        }\n      }\n    }\n  }\n\n  .plist-listbox {\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n\n    .header {\n      font-size: 16px;\n      line-height: 18px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      color: var(--td-text-color-primary);\n\n      .left {\n        display: flex;\n        flex-flow: row nowrap;\n        justify-content: flex-start;\n        align-items: flex-end;\n\n        .mg-left {\n          margin-left: var(--td-comp-margin-xs);\n        }\n\n        .box-anthology-title {\n          white-space: nowrap;\n          position: relative;\n          font-size: 18px;\n          line-height: 25px;\n          font-weight: 600;\n        }\n\n        .box-anthology-line,\n        .box-anthology-analyze {\n          :deep(.t-button) {\n            padding: 0;\n          }\n\n          :deep(.t-button--variant-text) {\n            .t-button__suffix {\n              margin-left: var(--td-comp-margin-xxs);\n            }\n\n            .t-button__text {\n              &::before {\n                content: '';\n                width: 1px;\n                margin: 0 var(--td-comp-margin-xs);\n                background: linear-gradient(180deg, transparent, var(--td-border-level-1-color), transparent);\n              }\n            }\n\n            &:hover,\n            &:focus-visible {\n              background-color: transparent !important;\n              border-color: transparent !important;\n              color: var(--td-brand-color);\n            }\n          }\n        }\n      }\n\n      .right {\n        .box-anthology-reverse-order {\n          cursor: pointer;\n        }\n      }\n    }\n\n    // .tag-container {\n    //   display: flex;\n    //   flex-wrap: wrap;\n    //   margin-top: var(--td-comp-margin-s);\n\n    //   .mainVideo-num {\n    //     position: relative;\n    //     width: 41px;\n    //     font-size: 18px;\n    //     height: 41px;\n    //     line-height: 41px;\n    //     border-radius: 8px;\n    //     text-align: center;\n    //     cursor: pointer;\n    //     margin-bottom: 4px;\n    //     margin-right: 4px;\n    //     box-shadow: 0 2px 8px 0 rgb(0 0 0 / 8%);\n\n    //     &:hover {\n    //       background-image: linear-gradient(var(--td-brand-color-2), var(--td-brand-color-3));\n    //     }\n\n    //     &::before {\n    //       content: '';\n    //       display: block;\n    //       position: absolute;\n    //       inset: 1px;\n    //       border-radius: 8px;\n    //       background-color: var(--td-bg-container);\n    //       z-index: 2;\n    //     }\n\n    //     .mainVideo_inner {\n    //       position: absolute;\n    //       inset: 1px;\n    //       border-radius: 8px;\n    //       z-index: 3;\n    //       overflow: hidden;\n    //       background-image: linear-gradient(hsl(0deg 0% 100% / 4%), hsl(0deg 0% 100% / 6%));\n\n    //       .playing {\n    //         display: none;\n    //         min-width: 10px;\n    //         height: 8px;\n    //         background: url('@/assets/player/playon-green.gif') no-repeat;\n    //       }\n    //     }\n    //   }\n\n    //   .mainVideo-selected {\n    //     color: var(--td-brand-color);\n    //     background-image: linear-gradient(hsl(0deg 0% 100% / 10%), hsl(0deg 0% 100% / 6%));\n\n    //     // box-shadow: 0 2px 8px 0 rgba(0,0,0,.08), inset 0 4px 10px 0 rgba(0,0,0,.14);\n    //     .playing {\n    //       display: inline-block !important;\n    //       position: absolute;\n    //       left: 6px;\n    //       bottom: 6px;\n    //     }\n    //   }\n    // }\n\n    .box-anthology-item {\n      height: 100%;\n      width: 100%;\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n\n      .box-anthology-header {\n        height: fit-content;\n        width: 100%;\n      }\n\n      .box-anthology-content {\n        width: 100%;\n        height: 100%;\n        flex: 1 1 0;\n\n        .grid-wrap {\n          gap: var(--td-size-4);\n          // display: grid;\n          // grid-template-columns: repeat(11, var(--td-comp-size-xxl));\n          // grid-template-rows: repeat(1, auto);\n          width: 100%;\n          display: flex;\n          flex-wrap: wrap;\n\n          .item-wrap {\n            position: relative;\n            width: var(--td-comp-size-xxl);\n            height: var(--td-comp-size-xl);\n            line-height: var(--td-comp-size-xl);\n            font-size: var(--td-font-size-title-large);\n            border-radius: var(--td-radius-medium);\n            text-align: center;\n            cursor: pointer;\n            background-color: var(--td-border-level-1-color);\n\n            &:not(.is-active):hover {\n              .list-item {\n                background-color: var(--td-bg-color-component-active);\n\n                .title {\n                  color: var(--td-text-color-primary);\n                }\n              }\n            }\n\n            .list-item {\n              border-radius: var(--td-radius-medium);\n\n              .title {\n                color: var(--td-text-color-secondary);\n              }\n            }\n          }\n\n          .is-active {\n            .list-item {\n              background-color: var(--td-brand-color-2);\n\n              .title {\n                color: var(--td-brand-color);\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/film/index.vue",
    "content": "<template>\n  <div class=\"film view-container\">\n    <common-nav :list=\"navList\" :active=\"active.nav\" search class=\"sidebar\" @change=\"onNavChange\" />\n\n    <div class=\"content\">\n      <div v-if=\"classList.length > 1\" class=\"header\">\n        <div class=\"left-op-container\">\n          <title-menu :list=\"classList\" :active=\"active.class\" class=\"nav\" @change=\"onClassChange\" />\n        </div>\n        <div v-if=\"filterData[active.class]\" class=\"right-op-container\">\n          <t-popup\n            placement=\"bottom\"\n            attach=\".content\"\n            :overlay-style=\"{\n              padding: '0 var(--td-comp-paddingLR-s)',\n            }\"\n            :z-index=\"2\"\n            :visible=\"active.filterPopup\"\n            @visible-change=\"handleFilterPopupVisible\"\n          >\n            <t-button theme=\"default\" shape=\"square\" variant=\"text\" class=\"filter-btn\" @click=\"handleFilterVisible\">\n              <template #icon><root-list-icon /></template>\n            </t-button>\n\n            <template #content>\n              <div class=\"filter-wrapper\">\n                <div v-for=\"filterItem in filterData[active.class]\" :key=\"filterItem.key\" class=\"filter-content\">\n                  <div class=\"title\">{{ filterItem.name }}</div>\n                  <div class=\"tags\">\n                    <span\n                      v-for=\"(item, index) in filterItem.value\"\n                      :key=\"index\"\n                      class=\"tag\"\n                      :class=\"{ active: active.filter[filterItem.key] === item.v }\"\n                      @click=\"changeFilterEvent(filterItem.key, item.v)\"\n                    >\n                      {{ item.n }}\n                    </span>\n                  </div>\n                </div>\n              </div>\n            </template>\n          </t-popup>\n        </div>\n      </div>\n\n      <div v-if=\"folderBreadcrumb.length\">\n        <t-breadcrumb\n          :max-items=\"9\"\n          :items-before-collapse=\"3\"\n          :items-after-collapse=\"3\"\n          max-item-width=\"140\"\n          class=\"breadcrumb\"\n        >\n          <t-breadcrumb-item>\n            <t-button\n              variant=\"text\"\n              size=\"small\"\n              shape=\"square\"\n              class=\"breadcrumb-home-btn\"\n              @click=\"handleFolderBreadcrumbClick({ label: 'home', value: null })\"\n            >\n              <template #icon>\n                <home-icon />\n              </template>\n            </t-button>\n          </t-breadcrumb-item>\n          <t-breadcrumb-item\n            v-for=\"item in folderBreadcrumb\"\n            :key=\"item.value\"\n            @click=\"handleFolderBreadcrumbClick(item)\"\n          >\n            {{ item.label }}\n          </t-breadcrumb-item>\n          <template #ellipsis=\"{ items }\">\n            <t-dropdown>\n              <t-button variant=\"text\" size=\"small\" shape=\"square\">\n                <template #icon>\n                  <ellipsis-icon stroke-color=\"var(--td-text-color-placeholder)\" />\n                </template>\n              </t-button>\n              <t-dropdown-menu>\n                <t-dropdown-item\n                  v-for=\"item in items\"\n                  :key=\"item.key\"\n                  :value=\"item.key\"\n                  @click=\"handleFolderBreadcrumbClick({ label: item.content, value: item.key })\"\n                >\n                  {{ item.content }}\n                </t-dropdown-item>\n              </t-dropdown-menu>\n            </t-dropdown>\n          </template>\n        </t-breadcrumb>\n      </div>\n\n      <div id=\"back-top\" class=\"container\">\n        <div class=\"content-wrapper\">\n          <t-row :gutter=\"[16, 4]\" style=\"margin-left: -8px; margin-right: -8px\">\n            <t-col\n              v-for=\"item in filmList\"\n              :key=\"item.vod_id\"\n              :md=\"3\"\n              :xl=\"2\"\n              :xxl=\"1\"\n              class=\"card\"\n              @click=\"playEvent(item)\"\n            >\n              <div class=\"card-main\">\n                <div v-if=\"item.vod_remarks\" class=\"card-tag card-tag-mask\">\n                  <span class=\"card-tag-text txthide txthide1\">{{ item.vod_remarks }}</span>\n                </div>\n                <t-image\n                  class=\"card-main-item\"\n                  :src=\"item.vod_pic\"\n                  :lazy=\"true\"\n                  fit=\"cover\"\n                  shape=\"round\"\n                  :loading=\"renderDefaultLazy\"\n                  :error=\"renderDefaultLazy\"\n                >\n                  <template #overlayContent>\n                    <div v-if=\"item.relateSite\" class=\"summary\">\n                      <span class=\"summary-text\">{{ item.relateSite.name }}</span>\n                    </div>\n                  </template>\n                </t-image>\n              </div>\n              <div class=\"card-footer\">\n                <p class=\"card-footer-title txthide txthide1\">{{ item.vod_name }}</p>\n                <p class=\"card-footer-desc txthide txthide1\">{{ item.vod_blurb || $t('pages.film.noDesc') }}</p>\n              </div>\n            </t-col>\n          </t-row>\n\n          <div class=\"infinite-loading\">\n            <infinite-loading\n              v-if=\"active.lazyload\"\n              class=\"infinite-loading-container\"\n              :identifier=\"infiniteId\"\n              :duration=\"200\"\n              @infinite=\"loadMore\"\n            >\n              <template #complete>{{ LOAD_TEXT_OPTIONS[active.loadStatus] }}</template>\n              <template #error>{{ $t('common.infiniteLoading.error') }}</template>\n            </infinite-loading>\n            <infinite-loading v-else class=\"infinite-loading-container\" />\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <t-loading :attach=\"`.${attachContent}`\" size=\"medium\" :loading=\"active.loading\" />\n    <t-back-top container=\"#back-top\" size=\"small\" :offset=\"['1rem', '0.8rem']\" :duration=\"2000\" />\n\n    <dialog-detail-view\n      v-model:visible=\"active.detailDialog\"\n      :extra=\"detailFormData.extra\"\n      :info=\"detailFormData.info\"\n    />\n    <action-view\n      ref=\"actionRef\"\n      v-model:visible=\"active.actionDialog\"\n      :config=\"actionData\"\n      @submit=\"onActionSubmit\"\n      @cancel=\"onActionCancel\"\n      @timeout=\"onActionTimeout\"\n    />\n  </div>\n</template>\n<script setup lang=\"tsx\">\nimport 'v3-infinite-loading/lib/style.css';\n\nimport type { ICmsActionSpecialIdType } from '@shared/config/cmsAction';\nimport { CMS_ACTION_SPECIAL_ID_TYPE, CMS_ACTION_SPECIAL_ID_TYPES } from '@shared/config/cmsAction';\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { toString } from '@shared/modules/toString';\nimport {\n  isArray,\n  isArrayEmpty,\n  isFunction,\n  isJsonStr,\n  isNil,\n  isObject,\n  isObjectEmpty,\n  isPositiveFiniteNumber,\n  isStrEmpty,\n  isString,\n} from '@shared/modules/validate';\nimport type {\n  ICmsActionBase,\n  ICmsActionEnvelope,\n  ICmsActionSpecialCopy,\n  ICmsActionSpecialDetail,\n  ICmsActionSpecialKeep,\n  ICmsHome,\n  ICmsInfo,\n} from '@shared/types/cms';\nimport type { IModels } from '@shared/types/db';\nimport { differenceBy } from 'es-toolkit';\nimport JSON5 from 'json5';\nimport { EllipsisIcon, HomeIcon, RootListIcon } from 'tdesign-icons-vue-next';\nimport type { PopupVisibleChangeContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport InfiniteLoading from 'v3-infinite-loading';\nimport type { StateHandler as ILoadStateHdandler } from 'v3-infinite-loading/lib/types';\nimport { computed, onActivated, onMounted, ref } from 'vue';\n\nimport {\n  fetchCmsAction,\n  fetchCmsCategory,\n  fetchCmsDetail,\n  fetchCmsHome,\n  fetchCmsSearch,\n  fetchSiteActive,\n  fetchSiteDetailByKey,\n} from '@/api/film';\nimport ActionView from '@/components/action/index.vue';\nimport CommonNav from '@/components/common-nav/index.vue';\nimport LazyBg from '@/components/lazy-bg/index.vue';\nimport TitleMenu from '@/components/title-menu/index.vue';\nimport { emitterChannel, emitterSource } from '@/config/emitterChannel';\nimport { attachContent } from '@/config/global';\nimport { t } from '@/locales';\nimport { usePlayerStore } from '@/store';\nimport emitter from '@/utils/emitter';\n\nimport DialogDetailView from './components/DialogDetail.vue';\n\nconst storePlayer = usePlayerStore();\n\nconst renderDefaultLazy = () => <LazyBg class=\"render-icon\" />;\n\nconst infiniteId = ref(Date.now());\nconst searchValue = ref('');\n\nconst actionRef = ref<InstanceType<typeof ActionView>>();\n\nconst detailFormData = ref({\n  info: {} as ICmsInfo,\n  extra: {} as { active: IModels['site'] },\n});\n\nconst pagination = ref({\n  pageIndex: 1,\n  pageSize: 32,\n  total: 0,\n});\n\nconst config = ref({\n  default: {} as IModels['site'],\n  list: [] as IModels['site'][],\n  extra: {\n    search: '',\n    filter: false,\n  },\n  searchList: [] as IModels['site'][],\n});\n\nconst classList = ref<ICmsHome['class']>([]);\nconst filterData = ref<ICmsHome['filters']>({});\nconst filmList = ref<Array<ICmsInfo & { relateSite: IModels['site'] }>>([]);\nconst folderBreadcrumb = ref<Array<{ label: ICmsInfo['vod_name']; value: ICmsInfo['vod_id'] }>>([]);\nconst actionData = ref<ICmsActionBase>({} as unknown as ICmsActionBase);\n\nconst active = ref({\n  nav: '',\n  class: '' as ICmsInfo['vod_id'],\n  filter: {},\n  folder: '',\n  searchCurrent: '',\n  filterPopup: false,\n  loadStatus: 'complete' as 'complete' | 'error' | 'noConfig' | 'noSelect',\n  lazyload: false,\n  loading: false,\n  detailDialog: false,\n  actionDialog: false,\n});\n\nconst navList = computed(() => config.value.list.map((t) => ({ id: t.id, name: t.name })));\nconst LOAD_TEXT_OPTIONS = computed(() => ({\n  complete: t('common.infiniteLoading.complete'),\n  error: t('common.infiniteLoading.error'),\n  noSelect: t('common.infiniteLoading.noSelect'),\n  noConfig: t('pages.film.infiniteLoading.noConfig'),\n}));\n\nonMounted(() => getSetting());\n\nonActivated(() => {\n  emitter.off(emitterChannel.REFRESH_FILM_CONFIG, reloadConfig);\n  emitter.on(emitterChannel.REFRESH_FILM_CONFIG, reloadConfig);\n\n  emitter.off(emitterChannel.SEARCH_FILM_RECOMMEND, onSearchRecommend);\n  emitter.on(emitterChannel.SEARCH_FILM_RECOMMEND, onSearchRecommend);\n});\n\nconst changeFilterEvent = (key: string, value: string | number) => {\n  active.value.filter[key] = value;\n\n  resetPagination();\n\n  filmList.value = [];\n  infiniteId.value = Date.now();\n\n  active.value.filterPopup = false;\n};\n\nconst resetFilter = () => {\n  if (!isObject(filterData.value) || isObjectEmpty(filterData.value)) return;\n\n  const currentFilters = filterData.value[active.value.class] || [];\n\n  const result = currentFilters.reduce((o, { key, value }) => {\n    o[key] = value[0]?.v ?? '全部';\n    return o;\n  }, {});\n\n  active.value.filter = result;\n};\n\nconst handleFilterVisible = () => {\n  const status = active.value.filterPopup;\n\n  active.value.filterPopup = !status;\n};\n\nconst handleFilterPopupVisible = (_visible: boolean, context: PopupVisibleChangeContext) => {\n  if (context.trigger === 'document') {\n    active.value.filterPopup = false;\n  }\n};\n\nconst collateSearchSite = (type: string, source: IModels['site']): IModels['site'][] => {\n  let query = config.value.list.filter((item) => Boolean(item.search));\n  if (type === 'site') query = query.filter((item) => item.id === source.id);\n  if (type === 'group') query = query.filter((item) => item.group === source.group);\n  return query;\n};\n\nconst resetPagination = () => {\n  pagination.value.pageIndex = 1;\n  pagination.value.total = 0;\n};\n\nconst getSetting = async () => {\n  try {\n    const resp = await fetchSiteActive();\n    if (resp?.default) {\n      config.value.default = resp.default;\n      active.value.nav = resp.default.id;\n    }\n    if (resp?.list) config.value.list = resp.list;\n    if (resp?.extra) config.value.extra = resp.extra;\n\n    active.value.loadStatus =\n      resp?.default && resp.list.length ? 'complete' : resp.list.length ? 'noSelect' : 'noConfig';\n  } catch (error) {\n    console.error(`Failed to get site config:`, error);\n    active.value.loadStatus = 'error';\n  } finally {\n    active.value.lazyload = true;\n  }\n};\n\nconst getCmsHome = async (source: IModels['site']): Promise<number> => {\n  const resp = await fetchCmsHome({ uuid: source.id });\n\n  if (isArray(resp.class) && !isArrayEmpty(resp.class)) {\n    classList.value = [\n      { type_id: '', type_name: computed(() => t('common.recommend')) },\n      ...resp.class.map((item) => ({\n        type_id: item.type_id,\n        type_name: item.type_name,\n      })),\n    ];\n    active.value.class = classList.value[0].type_id;\n  }\n\n  if (isObject(resp.filters) && !isObjectEmpty(resp.filters)) {\n    filterData.value = resp.filters;\n    resetFilter();\n  }\n\n  return resp.class.length;\n};\n\nconst getCmsCategory = async (source: IModels['site']): Promise<number> => {\n  const { pageIndex } = pagination.value;\n\n  const tid = active.value.folder || active.value.class;\n  const f = active.value.filter || {};\n\n  const resp = await fetchCmsCategory({\n    uuid: source.id,\n    tid,\n    page: pageIndex,\n    extend: JSON.stringify(f),\n  });\n\n  if (isArray(resp.list) && !isArrayEmpty(resp.list)) {\n    resp.list = differenceBy(resp.list, filmList.value, (item: ICmsInfo) => item.vod_id);\n    filmList.value.push(...resp.list);\n  }\n  if (resp.total) pagination.value.total = resp.total;\n\n  return resp.list.length;\n};\n\nconst loadMoreCategory = async (): Promise<number> => {\n  const source = config.value.default;\n\n  // Load class only once\n  if (!isArray(classList.value) || isArrayEmpty(classList.value)) {\n    const length = await getCmsHome(source);\n    if (length < 1) {\n      active.value.loadStatus = 'error';\n      return 0;\n    }\n  }\n\n  // Load category data\n  const length = await getCmsCategory(source);\n  if (length > 0) {\n    pagination.value.pageIndex++;\n    return length;\n  }\n\n  return 0;\n};\n\nconst loadMoreSearch = async (): Promise<number> => {\n  const { pageIndex } = pagination.value;\n  const searchSiteList = config.value.searchList;\n  const currentSiteId = active.value.searchCurrent;\n  const siteIndex = searchSiteList.findIndex((item) => item.id === currentSiteId);\n  const currentSite = searchSiteList[siteIndex];\n\n  const isLastSite = siteIndex + 1 >= searchSiteList.length;\n\n  const switchNextSearchSite = (): number => {\n    resetPagination();\n\n    if (isLastSite) return 0;\n\n    active.value.searchCurrent = searchSiteList[siteIndex + 1].id;\n    return 1;\n  };\n\n  try {\n    const resp = await fetchCmsSearch({\n      uuid: currentSiteId,\n      wd: searchValue.value,\n      page: pageIndex,\n    });\n\n    if (isArray(resp.list) && !isArrayEmpty(resp.list) && config.value.extra.filter) {\n      resp.list = resp.list.filter((item: ICmsInfo) => item.vod_name.includes(searchValue.value));\n    }\n\n    if (!isArray(resp.list) || isArrayEmpty(resp.list)) {\n      return switchNextSearchSite();\n    }\n\n    const normalizedList = resp.list.map((item: ICmsInfo) => ({\n      ...item,\n      relateSite: currentSite,\n    }));\n\n    const uniqueList = differenceBy(\n      normalizedList,\n      filmList.value,\n      (item: ICmsInfo & { relateSite: IModels['site'] }) => `${item.relateSite?.id ?? '0'}-${item.vod_id}`,\n    );\n\n    if (isArrayEmpty(uniqueList)) {\n      return switchNextSearchSite();\n    }\n\n    filmList.value.push(...uniqueList);\n    pagination.value.pageIndex++;\n\n    return uniqueList.length;\n  } catch (error) {\n    console.error('Failed to load search data:', error);\n    return switchNextSearchSite();\n  }\n};\n\nconst loadMore = async ($state: ILoadStateHdandler) => {\n  try {\n    if (active.value.loadStatus !== 'complete') {\n      $state.complete();\n      return;\n    }\n\n    const length = searchValue.value ? await loadMoreSearch() : await loadMoreCategory();\n\n    // Dynamic remove reccommend class\n    if (\n      !searchValue.value &&\n      length === 0 &&\n      filmList.value.length === 0 &&\n      classList.value.length > 1 &&\n      (active.value.folder || active.value.class) === ''\n    ) {\n      classList.value.shift();\n      active.value.class = classList.value[0].type_id;\n      resetPagination();\n      infiniteId.value = Date.now();\n      return;\n    }\n\n    length === 0 ? $state.complete() : $state.loaded();\n  } catch (error) {\n    console.error(`Failed to load more data:`, error);\n    $state.error();\n  }\n};\n\nconst playEvent = async (item) => {\n  active.value.loading = true;\n\n  try {\n    const site = item?.relateSite ? item.relateSite : config.value.default;\n\n    if (['folder', 'action'].includes(item.vod_tag)) {\n      handleCmsTag(item.vod_tag, item);\n      return;\n    }\n    active.value.folder = '';\n\n    const resp = await fetchCmsDetail({ uuid: site.id, ids: item.vod_id });\n    if (\n      !isArray(resp.list) ||\n      isArrayEmpty(resp.list) ||\n      !isObject(resp.list[0]?.vod_episode) ||\n      isObjectEmpty(resp.list[0]?.vod_episode)\n    ) {\n      MessagePlugin.warning(t('pages.film.message.noDetailInfo'));\n      return;\n    }\n\n    const info = {\n      ...resp.list[0],\n      ...(resp.list[0]?.vod_id ? {} : { vod_id: item.vod_id }),\n      ...(resp.list[0]?.vod_name ? {} : { vod_name: item.vod_name }),\n      ...(resp.list[0]?.vod_pic ? {} : { vod_pic: item.vod_pic }),\n    };\n\n    const player = storePlayer.player;\n\n    if (player.type === 'custom') {\n      playWithExternalPlayer(info, site);\n    } else {\n      playWithInternalPlayer(info, site);\n    }\n  } catch (error) {\n    console.error('Failed to play:', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  } finally {\n    active.value.loading = false;\n  }\n};\n\nconst playWithExternalPlayer = async (item: ICmsInfo, current: IModels['site']) => {\n  detailFormData.value = {\n    info: item,\n    extra: { active: current },\n  };\n\n  active.value.detailDialog = true;\n};\n\nconst playWithInternalPlayer = (item: ICmsInfo, active: IModels['site']) => {\n  storePlayer.updateConfig({\n    type: 'film',\n    status: true,\n    data: {\n      info: item,\n      extra: { active, site: config.value.list },\n    },\n  });\n\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_PLAYER);\n};\n\nconst handleCmsTag = (type: 'folder' | 'action', doc: ICmsInfo) => {\n  const helper = {\n    folder: handleCmsFolder,\n    action: handleCmsAction,\n  };\n\n  helper?.[type]?.(doc);\n};\n\nconst handleCmsFolder = (doc: ICmsInfo) => {\n  resetPagination();\n\n  const prefixPath = folderBreadcrumb.value.map((item) => item.value).join('');\n  folderBreadcrumb.value.push(\n    doc.vod_id.startsWith(prefixPath)\n      ? {\n          label: doc.vod_name,\n          value: doc.vod_id,\n        }\n      : { label: doc.vod_name, value: doc.vod_id },\n  );\n\n  active.value.folder = doc.vod_id;\n\n  filmList.value = [];\n\n  infiniteId.value = Date.now();\n};\n\nconst onActionSubmit = async (id: string, doc: Record<string, any>) => {\n  try {\n    const source = config.value.default;\n\n    const actionResp: ICmsActionEnvelope = await fetchCmsAction({\n      uuid: source.id,\n      action: id,\n      value: doc,\n    });\n\n    if (isNil(actionResp)) {\n      MessagePlugin.warning(t('pages.film.message.noSupportAction'));\n      return;\n    }\n\n    if (!isObject(actionResp)) {\n      MessagePlugin.info(toString(actionResp));\n      return;\n    }\n\n    if (Object.hasOwn(actionResp, 'toast')) MessagePlugin.info(actionResp.toast!);\n\n    if (Object.hasOwn(actionResp, 'action')) {\n      const { action } = actionResp;\n\n      if (CMS_ACTION_SPECIAL_ID_TYPES.includes(action.actionId as ICmsActionSpecialIdType)) {\n        const fn = handlerCmsActionSpecial[action.actionId];\n        if (isFunction(fn)) {\n          await fn(action);\n          return;\n        }\n\n        MessagePlugin.warning(t('pages.film.message.noSupportAction'));\n        return;\n      }\n\n      actionData.value = action as ICmsActionBase;\n      active.value.actionDialog = true;\n    }\n  } catch (error) {\n    console.error('Failed to exec action submit', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst onActionCancel = async () => {\n  const { cancelAction, cancelValue } = actionData.value;\n  const source = config.value.default;\n\n  if (isNil(cancelAction)) return;\n\n  try {\n    await fetchCmsAction({\n      uuid: source.id,\n      action: cancelAction,\n      ...(cancelValue ? { value: cancelValue } : {}),\n    });\n  } catch (error) {\n    console.error('Failed to exec action cancel', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst onActionTimeout = () => {};\n\nconst handleCmsActionSpecialCopy = async (action: ICmsActionSpecialCopy) => {\n  try {\n    const { content } = action;\n    if (content) await navigator.clipboard.writeText(content);\n  } catch {\n    MessagePlugin.error(t('common.copyFail'));\n  }\n};\n\nconst handleCmsActionSpecialDetail = async (action: ICmsActionSpecialDetail) => {\n  try {\n    const { skey, ids } = action;\n    let site = config.value.default;\n    if (isString(skey) && !isStrEmpty(skey)) site = await fetchSiteDetailByKey(skey);\n    if (!isObject(site) || isObjectEmpty(site)) {\n      MessagePlugin.warning(t('pages.film.message.noSiteInfo'));\n      return;\n    }\n    playEvent({ relateSite: site, vod_id: ids });\n  } catch (error) {\n    console.error('Failed to exec action detail', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst handleCmsActionSpecialKeep = async (action: ICmsActionSpecialKeep) => {\n  const { reset, msg } = action;\n\n  if (reset) actionRef.value?.reset();\n\n  actionData.value = {\n    ...actionData.value,\n    ...(msg ? { msg } : {}),\n  } as ICmsActionBase;\n  active.value.actionDialog = true;\n};\n\nconst handlerCmsActionSpecial = {\n  [CMS_ACTION_SPECIAL_ID_TYPE.COPY]: handleCmsActionSpecialCopy,\n  [CMS_ACTION_SPECIAL_ID_TYPE.DETAIL]: handleCmsActionSpecialDetail,\n  [CMS_ACTION_SPECIAL_ID_TYPE.KEEP]: handleCmsActionSpecialKeep,\n};\n\nconst handleCmsAction = async (doc: ICmsInfo) => {\n  try {\n    const source = config.value.default;\n    let data = doc.vod_id;\n    if (isJsonStr(data)) data = JSON5.parse(data);\n\n    let actionResp: ICmsActionEnvelope | null = null;\n\n    if (isString(data) && !isStrEmpty(data)) {\n      actionResp = await fetchCmsAction({\n        uuid: source.id,\n        action: data,\n      });\n    } else if (isObject(data) && !isObjectEmpty(data)) {\n      actionResp = { action: data };\n    }\n\n    if (isNil(actionResp)) {\n      MessagePlugin.warning(t('pages.film.message.noSupportAction'));\n      return;\n    }\n\n    if (!isObject(actionResp)) {\n      MessagePlugin.info(toString(actionResp));\n      return;\n    }\n\n    if (Object.hasOwn(actionResp, 'action')) {\n      if (CMS_ACTION_SPECIAL_ID_TYPES.includes(actionResp.action.actionId as ICmsActionSpecialIdType)) {\n        const { action, toast } = actionResp;\n\n        if (toast) MessagePlugin.info(toast);\n\n        const fn = handlerCmsActionSpecial[action.actionId];\n        if (isFunction(fn)) {\n          await fn(action);\n          return;\n        }\n\n        MessagePlugin.warning(t('pages.film.message.noSupportAction'));\n        return;\n      }\n\n      actionData.value = actionResp.action as ICmsActionBase;\n      active.value.actionDialog = true;\n    }\n\n    if (Object.hasOwn(actionResp.action, 'initAction')) {\n      const { initAction, initValue, timeout: timeoutSec } = actionResp.action as ICmsActionBase;\n\n      void (async () => {\n        try {\n          const initResp: { action: Record<string, any> } = await fetchCmsAction({\n            uuid: source.id,\n            action: initAction,\n            ...(initValue ? { value: initValue } : {}),\n            ...(isPositiveFiniteNumber(timeoutSec) && timeoutSec! > 0 ? { timeout: timeoutSec! * 1000 } : {}),\n          });\n\n          if (isNil(initResp)) return;\n\n          if (!isObject(initResp)) {\n            MessagePlugin.info(toString(initResp));\n            return;\n          }\n\n          if (Object.hasOwn(actionResp, 'action')) {\n            actionData.value = initResp.action as ICmsActionBase;\n            active.value.actionDialog = true;\n          }\n        } catch {}\n      })();\n    }\n  } catch (error) {\n    console.error('Failed to exec action', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst handleSearch = async () => {\n  resetPagination();\n\n  filmList.value = [];\n  classList.value = [];\n  filterData.value = {};\n\n  infiniteId.value = Date.now();\n};\n\nconst onSearchRecommend = async ({ data: eventData }) => {\n  const {\n    source,\n    data: { kw, group, filter },\n  } = eventData;\n  if (source === emitterSource.PAGE_SHOW) return;\n\n  searchValue.value = kw;\n\n  config.value.extra.filter = filter;\n  config.value.extra.search = group;\n  config.value.searchList = collateSearchSite(group, config.value.default);\n\n  if (isArrayEmpty(config.value.searchList)) {\n    MessagePlugin.warning(t('pages.film.message.noEffectiveSearchSource'));\n    return;\n  }\n  active.value.searchCurrent = config.value.searchList[0].id;\n\n  handleSearch();\n};\n\nconst onClassChange = (id: string) => {\n  resetPagination();\n\n  active.value.folder = '';\n  active.value.class = id;\n  active.value.filter = {};\n\n  filmList.value = [];\n  folderBreadcrumb.value = [];\n\n  resetFilter();\n\n  infiniteId.value = Date.now();\n};\n\nconst defaultConfig = () => {\n  resetPagination();\n\n  searchValue.value = '';\n\n  active.value.lazyload = false;\n  active.value.loadStatus = 'complete';\n  active.value.folder = '';\n  active.value.class = '';\n  active.value.nav = '';\n  active.value.filter = {};\n\n  classList.value = [];\n  filterData.value = {};\n  filmList.value = [];\n  folderBreadcrumb.value = [];\n  actionData.value = {} as ICmsActionBase;\n\n  config.value.default = {} as IModels['site'];\n};\n\nconst reloadConfig = async ({ data: eventData }) => {\n  const { source } = eventData;\n  if (source === emitterSource.PAGE_SHOW) return;\n\n  defaultConfig();\n  await getSetting();\n\n  infiniteId.value = Date.now();\n};\n\nconst onNavChange = async (id: string) => {\n  try {\n    defaultConfig();\n    active.value.class = '';\n    active.value.nav = id;\n    config.value.default = config.value.list.find((item) => item.id === id)!;\n\n    infiniteId.value = Date.now();\n  } catch (error) {\n    console.error(`Failed to change config:`, error);\n  } finally {\n    active.value.lazyload = true;\n  }\n};\n\nconst handleFolderBreadcrumbClick = (item: { label: ICmsInfo['vod_name']; value: ICmsInfo['vod_id'] | null }) => {\n  resetPagination();\n\n  const index = folderBreadcrumb.value.findIndex((i) => i.value === item.value);\n  folderBreadcrumb.value = index > -1 ? folderBreadcrumb.value.slice(0, index + 1) : [];\n  active.value.folder = index > -1 ? item.value! : '';\n\n  filmList.value = [];\n\n  infiniteId.value = Date.now();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  height: 100%;\n  width: 100%;\n  display: flex;\n  flex-direction: row;\n  gap: var(--td-size-4);\n\n  .sidebar {\n    flex: 0 0 auto;\n  }\n\n  .content {\n    height: 100%;\n    width: 100%;\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n    overflow: hidden;\n    position: relative;\n\n    .header {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      white-space: nowrap;\n      gap: var(--td-size-4);\n      padding: 0 var(--td-comp-paddingLR-s) 0 0;\n\n      .left-op-container {\n        flex: 1;\n        width: 100%;\n        overflow: hidden;\n\n        .nav {\n          width: 100%;\n          flex-grow: 0;\n          flex-shrink: 0;\n        }\n      }\n\n      .right-op-container {\n        flex-grow: 0;\n        flex-shrink: 0;\n      }\n    }\n\n    .breadcrumb {\n      height: var(--td-comp-size-m);\n      margin: auto var(--td-comp-paddingLR-s) auto 0;\n      padding: 0 0 0 var(--td-comp-paddingLR-s);\n      border-radius: var(--td-radius-medium);\n      background-color: var(--td-bg-color-component);\n\n      &-home-btn {\n        border-color: transparent;\n\n        .t-icon {\n          color: var(--td-text-color-placeholder);\n        }\n\n        &:hover {\n          background-color: transparent;\n\n          .t-icon {\n            color: var(--td-text-color-primary);\n          }\n        }\n      }\n\n      :deep(.t-breadcrumb__item) {\n        .t-breadcrumb--text-overflow .t-breadcrumb__inner:hover {\n          color: var(--td-text-color-primary);\n          cursor: pointer;\n        }\n      }\n    }\n\n    .filter-wrapper {\n      height: auto;\n      width: 100%;\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n      overflow-y: auto;\n\n      .filter-content {\n        width: 100%;\n        display: flex;\n        flex-direction: row;\n        align-items: baseline;\n        gap: var(--td-size-4);\n\n        .title {\n          flex-shrink: 0;\n          padding: 0 var(--td-comp-paddingLR-s);\n        }\n\n        .tags {\n          display: flex;\n          flex-flow: wrap;\n          overflow: hidden;\n          gap: var(--td-size-4);\n\n          .tag {\n            display: inline-block;\n            padding: 0 var(--td-comp-paddingTB-s);\n            color: var(--td-text-color-secondary);\n            text-align: center;\n            cursor: pointer;\n\n            &:hover {\n              color: var(--td-text-color-primary);\n            }\n          }\n\n          .active {\n            color: var(--td-text-color-primary);\n            border-radius: var(--td-radius-round);\n            background-color: var(--td-bg-color-component);\n          }\n        }\n      }\n    }\n\n    .container {\n      flex: 1;\n      height: 100%;\n      width: 100%;\n      overflow: auto;\n      padding: 0 var(--td-comp-paddingLR-s) 0 0;\n\n      .content-wrapper {\n        width: 100%;\n        height: 100%;\n        position: relative;\n\n        .card {\n          width: inherit;\n          cursor: pointer;\n\n          .card-main {\n            position: relative;\n            width: 100%;\n            height: 0;\n            overflow: hidden;\n            border-radius: var(--td-radius-medium);\n            padding-top: 128%;\n            background-color: var(--td-bg-color-component);\n            transition: all 0.25s ease-in-out;\n\n            .card-tag {\n              position: absolute;\n              z-index: 2;\n\n              &-mask {\n                left: 0;\n                top: 0;\n                border-radius: var(--td-radius-medium) 0 var(--td-radius-large) 0;\n                padding: var(--td-comp-paddingTB-xxs) var(--td-comp-paddingLR-s);\n                background: linear-gradient(-45deg, #45c58b, #94dab2);\n                border: 1px solid #33a371;\n                border-width: 0 1px 1px 0;\n                max-width: 66%;\n              }\n\n              &-text {\n                color: #006c44;\n                font-weight: 500;\n                font-size: var(--td-font-size-mark-small);\n                height: var(--td-comp-size-xxs);\n                line-height: var(--td-line-height-mark-small);\n              }\n            }\n\n            .card-main-item {\n              position: absolute;\n              top: 0;\n              left: 0;\n              display: block;\n              width: 100%;\n              height: 100%;\n\n              :deep(.render-icon) {\n                height: var(--td-comp-size-xxxl);\n                width: var(--td-comp-size-xxxl);\n                background: transparent;\n              }\n\n              :deep(img) {\n                transition: all 0.25s ease-in-out;\n              }\n\n              .summary {\n                position: absolute;\n                bottom: 0;\n                left: 0;\n                width: 100%;\n                border-radius: 0 0 var(--td-radius-medium) var(--td-radius-medium);\n                background: linear-gradient(180deg, rgb(0 0 0 / 0%), rgb(22 24 35 / 40%));\n\n                &-text {\n                  text-align: center;\n                  display: inline-block;\n                  width: 100%;\n                  padding: var(--td-comp-paddingTB-xs) 0;\n                  color: var(--td-font-white-1);\n                  line-height: var(--td-line-height-body-small);\n                  font-weight: 500;\n                }\n              }\n            }\n          }\n\n          .card-footer {\n            padding: var(--td-comp-paddingTB-xs) 0 var(--td-comp-paddingTB-xxs) 0;\n\n            .card-footer-title {\n              font-weight: 500;\n              font-size: var(--td-font-size-title-medium);\n              line-height: var(--td-line-height-title-medium);\n              color: var(--td-text-color-primary);\n              transition: all 0.25s ease-in-out;\n            }\n\n            .card-footer-desc {\n              font-size: var(--td-font-size-body-medium);\n              line-height: var(--td-line-height-body-small);\n              color: var(--td-text-color-placeholder);\n            }\n          }\n\n          &:hover {\n            .card-main {\n              .card-main-item {\n                :deep(img) {\n                  transform: scale(1.05);\n                }\n              }\n            }\n\n            .card-footer {\n              .card-footer-title {\n                color: var(--td-brand-color);\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\n.infinite-loading-container {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  color: var(--td-text-color-placeholder);\n  text-align: center;\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/crypto/components/encode.vue",
    "content": "<template>\n  <div class=\"lab-crypto-encode view-component-container\">\n    <div class=\"content\">\n      <div class=\"input\">\n        <p class=\"title-label\">{{ $t('common.input') }}</p>\n        <t-form\n          ref=\"formRef\"\n          :data=\"formData\"\n          :rules=\"RULES\"\n          :label-width=\"0\"\n          required-mark-position=\"right\"\n          label-align=\"left\"\n          reset-type=\"initial\"\n          @submit=\"onSubmit\"\n        >\n          <t-form-item :label=\"t('common.content')\" name=\"input\">\n            <t-textarea\n              v-model=\"formData.input\"\n              :autosize=\"{ minRows: 3, maxRows: 5 }\"\n              :placeholder=\"$t('common.placeholder.input')\"\n            />\n          </t-form-item>\n        </t-form>\n      </div>\n      <div class=\"action\">\n        <p class=\"title-label\">{{ $t('common.action') }}</p>\n        <div class=\"content-action\">\n          <t-button theme=\"default\" variant=\"base\" block @click=\"handleSubmit('encode')\">\n            {{ $t('common.encode') }}\n          </t-button>\n          <t-button theme=\"primary\" variant=\"base\" block @click=\"handleSubmit('decode')\">\n            {{ $t('common.decode') }}\n          </t-button>\n        </div>\n      </div>\n      <div class=\"output\">\n        <p class=\"title-label\">{{ $t('common.output') }}</p>\n        <div class=\"content-output\">\n          <t-textarea\n            v-model=\"output\"\n            :autosize=\"{ minRows: 3, maxRows: 5 }\"\n            readonly\n            class=\"output-textarea\"\n            @click=\"handleCopy\"\n          />\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\nimport { base64, gzip, hex, html, unicode, url } from '@shared/modules/crypto';\nimport type { FormInstanceFunctions, SubmitContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { ref, useTemplateRef, watch } from 'vue';\n\nimport { t } from '@/locales';\n\nconst props = defineProps({\n  active: {\n    type: String,\n    default: 'rsa',\n  },\n});\n\nconst RULES = {\n  input: [{ required: true }],\n};\n\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\n\nconst formData = ref({\n  input: '',\n});\nconst output = ref('');\nconst active = ref({\n  action: 'html',\n  execute: '',\n});\n\nwatch(\n  () => props.active,\n  (val) => {\n    active.value.action = val;\n    defaultConf();\n  },\n);\n\nconst defaultConf = () => {\n  output.value = '';\n};\n\nconst handleExecute = () => {\n  try {\n    const execute = active.value.execute;\n    const { input } = formData.value;\n    if (!input) return;\n\n    const action = active.value.action;\n    const METHOD_MAP = { html, unicode, base64, url, hex, gzip };\n\n    output.value = METHOD_MAP[action][execute]({ src: input });\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    output.value = '';\n    console.error(error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst handleCopy = async (e: Event) => {\n  const val = (e.target as HTMLTextAreaElement).value;\n  if (!val) return;\n\n  try {\n    await navigator.clipboard.writeText(val);\n    MessagePlugin.success(t('common.copySuccess'));\n  } catch (error) {\n    MessagePlugin.error(`${t('common.error')}:  ${(error as Error).message}`);\n  }\n};\n\nconst onSubmit = (context: SubmitContext<FormData>) => {\n  const { validateResult, firstError } = context;\n  if (validateResult && typeof validateResult === 'boolean') {\n    handleExecute();\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\nconst handleSubmit = (type: 'encode' | 'decode') => {\n  active.value.execute = type;\n\n  formRef.value?.submit();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  padding: 0 var(--td-comp-paddingLR-s) var(--td-comp-paddingTB-s) 0;\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n  overflow-y: auto;\n\n  .content {\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n\n    .input {\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n\n      .t-form {\n        > :last-child.t-form__item-with-extra {\n          margin-bottom: var(--td-line-height-body-small);\n        }\n      }\n    }\n\n    .action {\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n\n      .content-action {\n        display: flex;\n        gap: var(--td-size-4);\n      }\n    }\n\n    .output {\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n\n      .content-output {\n        flex: 1;\n\n        .output-textarea {\n          height: 100%;\n\n          :deep(textarea) {\n            height: 100% !important;\n            min-height: 200px !important;\n          }\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/crypto/components/encrypt.vue",
    "content": "<template>\n  <div class=\"lab-crypto-encrypt view-component-container\">\n    <div class=\"content\">\n      <div class=\"input\">\n        <p class=\"title-label\">{{ $t('common.input') }}</p>\n        <t-form\n          ref=\"formRef\"\n          :data=\"formData\"\n          :rules=\"RULES\"\n          :label-width=\"80\"\n          required-mark-position=\"right\"\n          label-align=\"left\"\n          reset-type=\"initial\"\n          @submit=\"onSubmit\"\n        >\n          <t-form-item :label=\"t('common.content')\" name=\"input\">\n            <t-textarea\n              v-model=\"formData.input\"\n              :autosize=\"{ minRows: 3, maxRows: 5 }\"\n              :placeholder=\"$t('common.placeholder.input')\"\n            />\n          </t-form-item>\n          <t-form-item :label=\"$t('pages.lab.crypto.field.key')\" name=\"key\">\n            <t-textarea\n              v-if=\"active.action === 'rsa'\"\n              v-model=\"formData.key\"\n              :autosize=\"{ minRows: 3, maxRows: 5 }\"\n              :placeholder=\"$t('common.placeholder.input')\"\n            />\n            <t-input-adornment v-else style=\"flex: 1\">\n              <template #prepend>\n                <t-select v-model=\"formData.keyEncode\" auto-width>\n                  <t-option v-for=\"item in ENCODE_OPTIONS\" :key=\"item.value\" :value=\"item.value\" :label=\"item.label\" />\n                </t-select>\n              </template>\n              <t-input v-model=\"formData.key\" />\n            </t-input-adornment>\n          </t-form-item>\n          <t-form-item\n            v-if=\"active.action === 'rsa'\"\n            :label=\"$t('pages.lab.crypto.encrypt.field.passphrase')\"\n            name=\"passphrase\"\n          >\n            <t-input-adornment style=\"flex: 1\">\n              <template #prepend>\n                <t-select v-model=\"formData.passphraseEncode\" auto-width>\n                  <t-option v-for=\"item in ENCODE_OPTIONS\" :key=\"item.value\" :value=\"item.value\" :label=\"item.label\" />\n                </t-select>\n              </template>\n              <t-input v-model=\"formData.passphrase\" />\n            </t-input-adornment>\n          </t-form-item>\n          <t-form-item\n            v-if=\"!['rsa', 'rc4', 'rc4Drop'].includes(active.action)\"\n            :label=\"$t('pages.lab.crypto.encrypt.field.iv')\"\n            name=\"iv\"\n          >\n            <t-input-adornment style=\"flex: 1\">\n              <template #prepend>\n                <t-select v-model=\"formData.ivEncode\" auto-width>\n                  <t-option v-for=\"item in ENCODE_OPTIONS\" :key=\"item.value\" :value=\"item.value\" :label=\"item.label\" />\n                </t-select>\n              </template>\n              <t-input v-model=\"formData.iv\" />\n            </t-input-adornment>\n          </t-form-item>\n          <t-form-item\n            v-if=\"!['rsa', 'rc4', 'rc4Drop', 'rabbit', 'rabbitLegacy'].includes(active.action)\"\n            :label=\"$t('pages.lab.crypto.encrypt.field.mode')\"\n            name=\"mode\"\n          >\n            <t-radio-group v-model=\"formData.mode\" variant=\"default-filled\">\n              <t-radio-button v-for=\"item in MODE_OPTIONS\" :key=\"item.value\" :value=\"item.value\" :label=\"item.label\" />\n            </t-radio-group>\n          </t-form-item>\n          <t-form-item\n            v-if=\"\n              !['rc4', 'rc4Drop', 'rabbit', 'rabbitLegacy'].includes(active.action) &&\n              ['cbc', 'ecb'].includes(formData.mode)\n            \"\n            :label=\"$t('pages.lab.crypto.encrypt.field.pad')\"\n            name=\"pad\"\n          >\n            <t-radio-group v-model=\"formData.pad\" variant=\"default-filled\">\n              <t-radio-button v-for=\"item in PAD_OPTIONS\" :key=\"item.value\" :value=\"item.value\" :label=\"item.label\" />\n            </t-radio-group>\n          </t-form-item>\n          <t-form-item\n            v-if=\"active.action === 'rc4Drop'\"\n            :label=\"$t('pages.lab.crypto.encrypt.field.drop')\"\n            name=\"drop\"\n          >\n            <t-input-number v-model=\"formData.drop\" auto-width theme=\"column\" :min=\"0\" />\n          </t-form-item>\n          <t-form-item\n            v-if=\"['aes', 'sm4'].includes(active.action) && formData.mode === 'gcm'\"\n            :label=\"$t('pages.lab.crypto.encrypt.field.tag')\"\n            name=\"tag\"\n          >\n            <t-input-adornment style=\"flex: 1\">\n              <template #prepend>\n                <t-select v-model=\"formData.tagEncode\" auto-width>\n                  <t-option v-for=\"item in ENCODE_OPTIONS\" :key=\"item.value\" :value=\"item.value\" :label=\"item.label\" />\n                </t-select>\n              </template>\n              <t-input v-model=\"formData.tag\" />\n            </t-input-adornment>\n          </t-form-item>\n          <t-form-item\n            v-if=\"['aes', 'sm4'].includes(active.action) && formData.mode === 'gcm'\"\n            :label=\"$t('pages.lab.crypto.encrypt.field.aad')\"\n            name=\"aad\"\n          >\n            <t-input-adornment style=\"flex: 1\">\n              <template #prepend>\n                <t-select v-model=\"formData.aadEncode\" auto-width>\n                  <t-option v-for=\"item in ENCODE_OPTIONS\" :key=\"item.value\" :value=\"item.value\" :label=\"item.label\" />\n                </t-select>\n              </template>\n              <t-input v-model=\"formData.aad\" />\n            </t-input-adornment>\n          </t-form-item>\n          <t-form-item :label=\"$t('pages.lab.crypto.field.inputEncode')\" name=\"inputEncode\">\n            <t-radio-group v-model=\"formData.inputEncode\" variant=\"default-filled\">\n              <t-radio-button\n                v-for=\"item in ENCODE_OPTIONS\"\n                :key=\"item.value\"\n                :value=\"item.value\"\n                :label=\"item.label\"\n              />\n            </t-radio-group>\n          </t-form-item>\n          <t-form-item :label=\"$t('pages.lab.crypto.field.outputEncode')\" name=\"outputEncode\">\n            <t-radio-group v-model=\"formData.outputEncode\" variant=\"default-filled\">\n              <t-radio-button\n                v-for=\"item in ENCODE_OPTIONS\"\n                :key=\"item.value\"\n                :value=\"item.value\"\n                :label=\"item.label\"\n              />\n            </t-radio-group>\n          </t-form-item>\n        </t-form>\n      </div>\n      <div class=\"action\">\n        <p class=\"title-label\">{{ $t('common.action') }}</p>\n        <div class=\"content-action\">\n          <t-button theme=\"default\" variant=\"base\" block @click=\"handleSubmit('encode')\">\n            {{ $t('common.encode') }}\n          </t-button>\n          <t-button theme=\"primary\" variant=\"base\" block @click=\"handleSubmit('decode')\">\n            {{ $t('common.decode') }}\n          </t-button>\n        </div>\n      </div>\n      <div class=\"output\">\n        <p class=\"title-label\">{{ $t('common.output') }}</p>\n        <div class=\"content-output\">\n          <t-textarea\n            v-model=\"output\"\n            :autosize=\"{ minRows: 3, maxRows: 5 }\"\n            readonly\n            class=\"output-textarea\"\n            @click=\"handleCopy\"\n          />\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\nimport { aes, des, rabbit, rabbitLegacy, rc4, rc4Drop, rsa, sm4, tripleDes } from '@shared/modules/crypto';\nimport type { FormInstanceFunctions, SubmitContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { computed, ref, useTemplateRef, watch } from 'vue';\n\nimport { t } from '@/locales';\n\nconst props = defineProps({\n  active: {\n    type: String,\n    default: 'rsa',\n  },\n});\n\nconst RULES = {\n  input: [{ required: true }],\n  key: [{ required: true }],\n  mode: [{ required: true }],\n  pad: [{ required: true }],\n  drop: [{ required: true }, { number: true }, { validator: (val: number) => val >= 0 }],\n  ivEncode: [{ required: true }],\n  keyEncode: [{ required: true }],\n  inputEncode: [{ required: true }],\n  outputEncode: [{ required: true }],\n};\n\nconst PAD_OPTIONS = computed(() => {\n  switch (active.value.action) {\n    case 'rsa': {\n      return [\n        { value: 'rsa-oaep', label: t('pages.lab.crypto.encrypt.field.paddingMap.rsaOaep') },\n        { value: 'rsa-oaep-sha256', label: t('pages.lab.crypto.encrypt.field.paddingMap.rsaOaepSha256') },\n        { value: 'rsa-oaep-sha384', label: t('pages.lab.crypto.encrypt.field.paddingMap.rsaOaepSha384') },\n        { value: 'rsa-oaep-sha512', label: t('pages.lab.crypto.encrypt.field.paddingMap.rsaOaepSha512') },\n        { value: 'rsa-oaep-md5', label: t('pages.lab.crypto.encrypt.field.paddingMap.rsaOaepMd5') },\n        { value: 'rsaes-pkcs1-v1_5', label: t('pages.lab.crypto.encrypt.field.paddingMap.rsaesPkcs1') },\n      ];\n    }\n    case 'sm4': {\n      return [\n        { value: 'Pkcs7Padding', label: t('pages.lab.crypto.encrypt.field.paddingMap.pkcs7Padding') },\n        { value: 'NoPadding', label: t('pages.lab.crypto.encrypt.field.paddingMap.noPadding') },\n      ];\n    }\n    default: {\n      return [\n        { value: 'Pkcs7Padding', label: t('pages.lab.crypto.encrypt.field.paddingMap.pkcs7Padding') },\n        { value: 'AnsiX923', label: t('pages.lab.crypto.encrypt.field.paddingMap.ansiX923') },\n        { value: 'Iso10126', label: t('pages.lab.crypto.encrypt.field.paddingMap.iso10126') },\n        { value: 'Iso97971', label: t('pages.lab.crypto.encrypt.field.paddingMap.iso97971') },\n        { value: 'ZeroPadding', label: t('pages.lab.crypto.encrypt.field.paddingMap.zeroPadding') },\n        { value: 'NoPadding', label: t('pages.lab.crypto.encrypt.field.paddingMap.noPadding') },\n      ];\n    }\n  }\n});\nconst MODE_OPTIONS = computed(() => {\n  switch (active.value.action) {\n    case 'sm4':\n      return [\n        { value: 'cbc', label: t('pages.lab.crypto.encrypt.field.modeMap.cbc') },\n        { value: 'ecb', label: t('pages.lab.crypto.encrypt.field.modeMap.ecb') },\n        { value: 'gcm', label: t('pages.lab.crypto.encrypt.field.modeMap.gcm') },\n      ];\n    case 'aes':\n      return [\n        { value: 'cbc', label: t('pages.lab.crypto.encrypt.field.modeMap.cbc') },\n        { value: 'cfb', label: t('pages.lab.crypto.encrypt.field.modeMap.cfb') },\n        { value: 'ofb', label: t('pages.lab.crypto.encrypt.field.modeMap.ofb') },\n        { value: 'ctr', label: t('pages.lab.crypto.encrypt.field.modeMap.ctr') },\n        { value: 'ecb', label: t('pages.lab.crypto.encrypt.field.modeMap.ecb') },\n        { value: 'gcm', label: t('pages.lab.crypto.encrypt.field.modeMap.gcm') },\n      ];\n    default:\n      return [\n        { value: 'cbc', label: t('pages.lab.crypto.encrypt.field.modeMap.cbc') },\n        { value: 'cfb', label: t('pages.lab.crypto.encrypt.field.modeMap.cfb') },\n        { value: 'ofb', label: t('pages.lab.crypto.encrypt.field.modeMap.ofb') },\n        { value: 'ctr', label: t('pages.lab.crypto.encrypt.field.modeMap.ctr') },\n        { value: 'ecb', label: t('pages.lab.crypto.encrypt.field.modeMap.ecb') },\n      ];\n  }\n});\nconst ENCODE_OPTIONS = computed(() => [\n  { value: 'utf8', label: t('pages.lab.crypto.encrypt.field.encodeMap.utf8') },\n  { value: 'base64', label: t('pages.lab.crypto.encrypt.field.encodeMap.base64') },\n  { value: 'hex', label: t('pages.lab.crypto.encrypt.field.encodeMap.hex') },\n]);\n\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\n\nconst formData = ref({\n  input: '',\n  mode: 'cbc',\n  pad: 'rsa-oaep',\n  iv: '',\n  key: '',\n  tag: '',\n  aad: '',\n  drop: 192,\n  passphrase: '',\n  passphraseEncode: 'utf8',\n  ivEncode: 'utf8',\n  keyEncode: 'utf8',\n  tagEncode: 'hex',\n  aadEncode: 'utf8',\n  inputEncode: 'utf8',\n  outputEncode: 'base64',\n});\nconst output = ref('');\nconst active = ref({\n  action: 'rsa',\n  execute: '',\n});\n\nwatch(\n  () => props.active,\n  (val) => {\n    active.value.action = val;\n    defaultConf();\n  },\n);\n\nconst defaultConf = () => {\n  output.value = '';\n\n  if (!PAD_OPTIONS.value.some((item) => item.value === formData.value.pad)) {\n    formData.value.pad = PAD_OPTIONS.value[0].value;\n  }\n};\n\nconst handleExecute = () => {\n  try {\n    const execute = active.value.execute;\n    const { input } = formData.value;\n    if (!input) return;\n\n    const action = active.value.action;\n    const METHOD_MAP = { rsa, rc4, rc4Drop, aes, des, tripleDes, rabbit, rabbitLegacy, sm4 };\n    const {\n      mode,\n      pad,\n      iv,\n      key,\n      tag,\n      aad,\n      drop,\n      passphrase,\n      passphraseEncode,\n      ivEncode,\n      keyEncode,\n      tagEncode,\n      aadEncode,\n      inputEncode,\n      outputEncode,\n    } = formData.value;\n\n    if (outputEncode === 'utf8' && execute === 'encode') {\n      MessagePlugin.warning(`${t('pages.lab.crypto.encrypt.message.encodeNotUtf8')}`);\n      return;\n    }\n\n    if (inputEncode === 'utf8' && execute === 'decode') {\n      MessagePlugin.warning(`${t('pages.lab.crypto.encrypt.message.decodeNotUtf8')}`);\n      return;\n    }\n\n    let doc: Record<string, any> = { src: input, inputEncode, outputEncode };\n    if (action === 'rsa') {\n      doc = { ...doc, key, pad, passphrase, passphraseEncode };\n    } else if (action === 'rc4') {\n      doc = { ...doc, key, keyEncode };\n    } else if (action === 'rc4Drop') {\n      doc = { ...doc, key, keyEncode, drop };\n    } else if (action === 'aes' || action === 'sm4') {\n      doc = { ...doc, key, keyEncode, iv, ivEncode, mode, pad, tag, tagEncode, aad, aadEncode };\n    } else if (action === 'rabbit' || action === 'rabbitLegacy') {\n      doc = { ...doc, key, keyEncode, iv, ivEncode };\n    } else {\n      doc = { ...doc, key, keyEncode, iv, ivEncode, mode, pad };\n    }\n\n    output.value = METHOD_MAP[action][execute](doc);\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    output.value = '';\n    console.error(error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst handleCopy = async (e: Event) => {\n  const val = (e.target as HTMLTextAreaElement).value;\n  if (!val) return;\n\n  try {\n    await navigator.clipboard.writeText(val);\n    MessagePlugin.success(t('common.copySuccess'));\n  } catch (error) {\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst onSubmit = (context: SubmitContext<FormData>) => {\n  const { validateResult, firstError } = context;\n  if (validateResult && typeof validateResult === 'boolean') {\n    handleExecute();\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\nconst handleSubmit = (type: 'encode' | 'decode') => {\n  active.value.execute = type;\n\n  formRef.value?.submit();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  padding: 0 var(--td-comp-paddingLR-s) var(--td-comp-paddingTB-s) 0;\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n  overflow-y: auto;\n\n  .content {\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n\n    .input {\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n\n      .content-input {\n        display: flex;\n        flex-direction: column;\n        gap: var(--td-size-5);\n\n        .input-method {\n          display: flex;\n          flex-direction: column;\n          gap: 16px;\n\n          .input-groups {\n            display: flex;\n            flex-direction: row;\n            justify-content: space-between;\n            gap: 16px;\n          }\n        }\n      }\n    }\n\n    .action {\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n\n      .content-action {\n        display: flex;\n        gap: var(--td-size-4);\n      }\n    }\n\n    .output {\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n\n      .content-output {\n        flex: 1;\n\n        .output-textarea {\n          height: 100%;\n\n          :deep(textarea) {\n            height: 100% !important;\n            min-height: 200px !important;\n          }\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/crypto/components/hash.vue",
    "content": "<template>\n  <div class=\"lab-crypto-hash view-component-container\">\n    <div class=\"content\">\n      <div class=\"input\">\n        <p class=\"title-label\">{{ $t('common.input') }}</p>\n        <t-form\n          ref=\"formRef\"\n          :data=\"formData\"\n          :rules=\"RULES\"\n          :label-width=\"80\"\n          required-mark-position=\"right\"\n          label-align=\"left\"\n          reset-type=\"initial\"\n          @submit=\"onSubmit\"\n        >\n          <t-form-item :label=\"$t('pages.lab.crypto.field.content')\" name=\"input\">\n            <t-textarea\n              v-model=\"formData.input\"\n              :autosize=\"{ minRows: 3, maxRows: 5 }\"\n              :placeholder=\"$t('common.placeholder.input')\"\n            />\n          </t-form-item>\n          <t-form-item v-if=\"active.action === 'hmac'\" :label=\"$t('pages.lab.crypto.field.key')\" name=\"key\">\n            <t-input-adornment style=\"flex: 1\">\n              <template #prepend>\n                <t-select v-model=\"formData.keyEncode\" auto-width>\n                  <t-option\n                    v-for=\"item in INNPUT_ENCODE_OPTIONS\"\n                    :key=\"item.value\"\n                    :value=\"item.value\"\n                    :label=\"item.label\"\n                  />\n                </t-select>\n              </template>\n              <t-input v-model=\"formData.key\" />\n            </t-input-adornment>\n          </t-form-item>\n          <t-form-item :label=\"$t('pages.lab.crypto.field.inputEncode')\" name=\"inputEncode\">\n            <t-radio-group v-model=\"formData.inputEncode\" variant=\"default-filled\">\n              <t-radio-button\n                v-for=\"item in INNPUT_ENCODE_OPTIONS\"\n                :key=\"item.value\"\n                :value=\"item.value\"\n                :label=\"item.label\"\n              />\n            </t-radio-group>\n          </t-form-item>\n          <t-form-item :label=\"$t('pages.lab.crypto.field.outputEncode')\" name=\"outputEncode\">\n            <t-radio-group v-model=\"formData.outputEncode\" variant=\"default-filled\">\n              <t-radio-button\n                v-for=\"item in OUTPUT_ENCODE_OPTIONS\"\n                :key=\"item.value\"\n                :value=\"item.value\"\n                :label=\"item.label\"\n              />\n            </t-radio-group>\n          </t-form-item>\n        </t-form>\n      </div>\n      <div class=\"action\">\n        <p class=\"title-label\">{{ $t('common.action') }}</p>\n        <div class=\"content-action\">\n          <t-button theme=\"primary\" variant=\"base\" block @click=\"handleSubmit\">\n            {{ $t('common.compute') }}\n          </t-button>\n        </div>\n      </div>\n      <div class=\"output\">\n        <p class=\"title-label\">{{ $t('common.output') }}</p>\n        <div class=\"content-output\">\n          <template v-for=\"item in ALGORITHM_OPTIONS\" :key=\"item.value\">\n            <t-input\n              v-model=\"output[item.value]\"\n              :label=\"item.label\"\n              readonly\n              placeholder=\"\"\n              @click=\"handleCopy(output[item.value])\"\n            />\n          </template>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\nimport { hash, hmac } from '@shared/modules/crypto';\nimport type { FormInstanceFunctions, SubmitContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { computed, ref, useTemplateRef, watch } from 'vue';\n\nimport { t } from '@/locales';\n\nconst props = defineProps({\n  active: {\n    type: String,\n    default: 'rsa',\n  },\n});\n\nconst RULES = {\n  input: [{ required: true }],\n  key: [{ required: true }],\n  inputEncode: [{ required: true }],\n  keyEncode: [{ required: true }],\n  outputEncode: [{ required: true }],\n};\n\nconst ALGORITHM_OPTIONS = computed(() => [\n  { value: 'md5-16', label: t('pages.lab.crypto.hash.field.algorithmMap.md5-16') },\n  { value: 'md5-32', label: t('pages.lab.crypto.hash.field.algorithmMap.md5-32') },\n  { value: 'sha1', label: t('pages.lab.crypto.hash.field.algorithmMap.sha1') },\n  { value: 'sha224', label: t('pages.lab.crypto.hash.field.algorithmMap.sha224') },\n  { value: 'sha256', label: t('pages.lab.crypto.hash.field.algorithmMap.sha256') },\n  { value: 'sha3', label: t('pages.lab.crypto.hash.field.algorithmMap.sha3') },\n  { value: 'sha384', label: t('pages.lab.crypto.hash.field.algorithmMap.sha384') },\n  { value: 'sha512', label: t('pages.lab.crypto.hash.field.algorithmMap.sha512') },\n  { value: 'sha512-224', label: t('pages.lab.crypto.hash.field.algorithmMap.sha512-224') },\n  { value: 'sha512-256', label: t('pages.lab.crypto.hash.field.algorithmMap.sha512-256') },\n  { value: 'ripemd160', label: t('pages.lab.crypto.hash.field.algorithmMap.ripemd160') },\n  { value: 'sm3', label: t('pages.lab.crypto.hash.field.algorithmMap.sm3') },\n]);\nconst INNPUT_ENCODE_OPTIONS = computed(() => [\n  { value: 'utf8', label: t('pages.lab.crypto.encrypt.field.encodeMap.utf8') },\n  { value: 'hex', label: t('pages.lab.crypto.encrypt.field.encodeMap.hex') },\n  { value: 'base64', label: t('pages.lab.crypto.encrypt.field.encodeMap.base64') },\n]);\nconst OUTPUT_ENCODE_OPTIONS = computed(() => [\n  { value: 'hex', label: t('pages.lab.crypto.encrypt.field.encodeMap.hex') },\n  { value: 'base64', label: t('pages.lab.crypto.encrypt.field.encodeMap.base64') },\n]);\n\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\n\nconst formData = ref({\n  input: '',\n  key: '',\n  inputEncode: 'utf8',\n  keyEncode: 'utf8',\n  outputEncode: 'hex',\n});\nconst output = ref({ ...ALGORITHM_OPTIONS.value.map((item) => ({ [item.value]: '' })) });\nconst active = ref({\n  action: 'hash',\n});\n\nwatch(\n  () => props.active,\n  (val) => {\n    active.value.action = val;\n    defaultConf();\n  },\n);\n\nconst defaultConf = () => {\n  output.value = { ...ALGORITHM_OPTIONS.value.map((item) => ({ [item.value]: '' })) };\n};\n\nconst handleExecute = () => {\n  try {\n    const action = active.value.action;\n    const { key, input, inputEncode, keyEncode, outputEncode } = formData.value;\n\n    ALGORITHM_OPTIONS.value.forEach((item) => {\n      const name = item.value;\n\n      if (action === 'hash') {\n        output.value[name] = hash[name]({ src: input, inputEncode, outputEncode });\n      } else if (action === 'hmac') {\n        output.value[name] = hmac[name]({ src: input, key, inputEncode, keyEncode, outputEncode });\n      }\n    });\n  } catch (error) {\n    console.error(error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst handleCopy = async (val: string) => {\n  if (!val) return;\n\n  try {\n    await navigator.clipboard.writeText(val);\n    MessagePlugin.success(t('common.copySuccess'));\n  } catch (error) {\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst onSubmit = (context: SubmitContext<FormData>) => {\n  const { validateResult, firstError } = context;\n  if (validateResult && typeof validateResult === 'boolean') {\n    handleExecute();\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\nconst handleSubmit = () => {\n  formRef.value?.submit();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  padding: 0 var(--td-comp-paddingLR-s) var(--td-comp-paddingTB-s) 0;\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n  overflow-y: auto;\n\n  .content {\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n\n    .input {\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n\n      .content-input {\n        display: flex;\n        flex-direction: column;\n        gap: var(--td-size-5);\n\n        .input-groups {\n          display: flex;\n          flex-direction: row;\n          justify-content: space-between;\n          gap: 16px;\n        }\n      }\n    }\n\n    .action {\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n\n      .content-action {\n        display: flex;\n        gap: var(--td-size-4);\n      }\n    }\n\n    .output {\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n\n      .content-output {\n        flex: 1;\n        display: flex;\n        flex-direction: column;\n        gap: var(--td-size-4);\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/crypto/index.vue",
    "content": "<template>\n  <div class=\"lab-crypto view-component-container\">\n    <div class=\"header\">\n      <div class=\"left-op-container\">\n        <t-dropdown theme=\"default\" trigger=\"click\" destroy-on-close>\n          <t-button theme=\"default\" shape=\"square\" variant=\"outline\" class=\"nav-btn\"><app-icon /></t-button>\n          <t-dropdown-menu>\n            <t-dropdown-item\n              v-for=\"item in CRYPTO_OPTIONS\"\n              :key=\"item.value\"\n              :value=\"item.value\"\n              :active=\"active.nav === item.value\"\n              @click=\"handleOpChange(item.value)\"\n            >\n              {{ item.label }}\n            </t-dropdown-item>\n          </t-dropdown-menu>\n        </t-dropdown>\n      </div>\n      <div class=\"right-op-container\">\n        <title-menu\n          :list=\"ALGORITHM_OPTIONS[active.nav]\"\n          :active=\"active.class\"\n          class=\"nav\"\n          @change=\"changeClassEvent\"\n        />\n      </div>\n    </div>\n    <div class=\"content\">\n      <div class=\"container\">\n        <keep-alive>\n          <component :is=\"currentComponent\" class=\"content-wrapper\" :active=\"active.class\"></component>\n        </keep-alive>\n      </div>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\nimport { AppIcon } from 'tdesign-icons-vue-next';\nimport { computed, defineAsyncComponent, ref, shallowRef } from 'vue';\n\nimport TitleMenu from '@/components/title-menu/index.vue';\nimport { t } from '@/locales';\n\nconst CRYPTO_OPTIONS = computed(() => [\n  { value: 'encrypt', label: t('pages.lab.crypto.encrypt.title') },\n  { value: 'hash', label: t('pages.lab.crypto.hash.title') },\n  { value: 'encode', label: t('pages.lab.crypto.encode.title') },\n]);\n\nconst ENCRYPT_ALGORITHM_OPTIONS = computed(() => [\n  { value: 'rsa', label: t('pages.lab.crypto.encrypt.field.algorithmMap.rsa') },\n  { value: 'aes', label: t('pages.lab.crypto.encrypt.field.algorithmMap.aes') },\n  { value: 'des', label: t('pages.lab.crypto.encrypt.field.algorithmMap.des') },\n  { value: 'tripleDes', label: t('pages.lab.crypto.encrypt.field.algorithmMap.tripleDes') },\n  { value: 'rc4', label: t('pages.lab.crypto.encrypt.field.algorithmMap.rc4') },\n  { value: 'rc4Drop', label: t('pages.lab.crypto.encrypt.field.algorithmMap.rc4Drop') },\n  { value: 'rabbit', label: t('pages.lab.crypto.encrypt.field.algorithmMap.rabbit') },\n  { value: 'rabbitLegacy', label: t('pages.lab.crypto.encrypt.field.algorithmMap.rabbitLegacy') },\n  { value: 'sm4', label: t('pages.lab.crypto.encrypt.field.algorithmMap.sm4') },\n]);\n\nconst HASH_ALGORITHM_OPTIONS = computed(() => [\n  { value: 'hash', label: t('pages.lab.crypto.hash.field.typeMap.hash') },\n  { value: 'hmac', label: t('pages.lab.crypto.hash.field.typeMap.hmac') },\n]);\n\nconst ENCODE_ALGORITHM_OPTIONS = computed(() => [\n  { value: 'html', label: t('pages.lab.crypto.encode.field.algorithmMap.html') },\n  { value: 'unicode', label: t('pages.lab.crypto.encode.field.algorithmMap.unicode') },\n  { value: 'base64', label: t('pages.lab.crypto.encode.field.algorithmMap.base64') },\n  { value: 'url', label: t('pages.lab.crypto.encode.field.algorithmMap.url') },\n  { value: 'hex', label: t('pages.lab.crypto.encode.field.algorithmMap.hex') },\n  { value: 'gzip', label: t('pages.lab.crypto.encode.field.algorithmMap.gzip') },\n]);\n\nconst ALGORITHM_OPTIONS = computed(() => ({\n  encrypt: [...ENCRYPT_ALGORITHM_OPTIONS.value.map((item) => ({ type_id: item.value, type_name: item.label }))],\n  hash: [...HASH_ALGORITHM_OPTIONS.value.map((item) => ({ type_id: item.value, type_name: item.label }))],\n  encode: [...ENCODE_ALGORITHM_OPTIONS.value.map((item) => ({ type_id: item.value, type_name: item.label }))],\n}));\n\nconst componentMap = {\n  encrypt: defineAsyncComponent(() => import('./components/encrypt.vue')),\n  hash: defineAsyncComponent(() => import('./components/hash.vue')),\n  encode: defineAsyncComponent(() => import('./components/encode.vue')),\n};\n\nconst active = ref({\n  nav: 'encrypt',\n  class: 'rsa',\n});\n\nconst currentComponent = shallowRef(componentMap[Object.keys(componentMap)[0]]);\n\nconst handleOpChange = (id: string) => {\n  active.value.nav = id;\n  active.value.class = ALGORITHM_OPTIONS.value[id][0].type_id;\n  currentComponent.value = componentMap[id];\n};\n\nconst changeClassEvent = (id: string) => {\n  active.value.class = id;\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  height: 100%;\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n\n  .header {\n    display: flex;\n    align-items: center;\n    justify-content: flex-start;\n    white-space: nowrap;\n    gap: var(--td-size-4);\n    padding: 0 var(--td-comp-paddingLR-s) 0 0;\n\n    .left-op-container {\n      flex-grow: 0;\n      flex-shrink: 0;\n\n      .nav-btn {\n        border: 1px solid var(--td-border-level-2-color);\n        color: var(--td-text-color-secondary);\n\n        &:hover {\n          color: var(--td-text-color-primary);\n        }\n      }\n    }\n\n    .right-op-container {\n      flex: 1;\n      width: 100%;\n      overflow: hidden;\n\n      .nav {\n        width: 100%;\n        flex-grow: 0;\n        flex-shrink: 0;\n      }\n    }\n  }\n\n  .content {\n    height: 100%;\n    width: 100%;\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n    overflow: hidden;\n\n    .container {\n      height: 100%;\n      width: 100%;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/diff/index.vue",
    "content": "<template>\n  <div class=\"lab-diff view-component-container\">\n    <div class=\"header\">\n      <div class=\"left-op-container\">\n        <t-input v-model=\"formData.origin.path\" class=\"header-input\" @enter=\"onImportFileByPath('origin')\" />\n        <t-button theme=\"default\" shape=\"square\" class=\"header-btn\" @click=\"onImportFile('origin')\">\n          <template #icon><file-add-icon /></template>\n        </t-button>\n        <t-button theme=\"default\" shape=\"square\" class=\"header-btn\" @click=\"onExportFile('origin')\">\n          <template #icon><save-icon /></template>\n        </t-button>\n      </div>\n\n      <div class=\"right-op-container\">\n        <t-input v-model=\"formData.target.path\" class=\"header-input\" @enter=\"onImportFileByPath('target')\" />\n        <t-button theme=\"default\" shape=\"square\" class=\"header-btn\" @click=\"onImportFile('target')\">\n          <template #icon><file-add-icon /></template>\n        </t-button>\n        <t-button theme=\"default\" shape=\"square\" class=\"header-btn\" @click=\"onExportFile('target')\">\n          <template #icon><save-icon /></template>\n        </t-button>\n      </div>\n    </div>\n\n    <div class=\"content\">\n      <code-editor\n        v-model=\"formData.target.content\"\n        v-model:original-value=\"formData.origin.content\"\n        mode=\"diff\"\n        :options=\"editorOptions\"\n        class=\"diff-box\"\n      />\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { THEME } from '@shared/config/theme';\nimport { isArrayEmpty, isNil } from '@shared/modules/validate';\nimport { FileAddIcon, SaveIcon } from 'tdesign-icons-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { ref, watch } from 'vue';\n\nimport type { IEditorOptions } from '@/components/code-editor';\nimport CodeEditor from '@/components/code-editor';\nimport { t } from '@/locales';\nimport { useSettingStore } from '@/store';\n\nconst storeSetting = useSettingStore();\n\nconst formData = ref({\n  origin: { path: '', content: '' },\n  target: { path: '', content: '' },\n});\n\nconst editorOptions = ref<IEditorOptions['diff']>({\n  automaticLayout: true, // 自动布局\n  fixedOverflowWidgets: true, // 溢出小部件固定\n  folding: true, // 代码折叠\n  fontFamily: 'JetBrainsMono, monospace',\n  fontLigatures: false, // 连字符\n  minimap: { enabled: false },\n  originalEditable: true, // 允许编辑原始内容\n  overviewRulerBorder: false, // 概览标尺边框\n  readOnly: false,\n  roundedSelection: false, // 选区边框圆角\n  scrollBeyondLastLine: false, // 滚动到最后一行后禁止继续滚动\n  scrollbar: {\n    useShadows: false,\n    verticalScrollbarSize: 5,\n    horizontalScrollbarSize: 5,\n  },\n  smoothScrolling: true,\n  stickyScroll: { enabled: false },\n  theme: storeSetting.displayTheme === THEME.LIGHT ? 'code-light' : 'code-dark',\n  useInlineViewWhenSpaceIsLimited: false, // 空间有限时不使用内联视图\n  wordWrap: 'off',\n});\n\nwatch(\n  () => storeSetting.displayTheme,\n  (val) => (editorOptions.value.theme = val === THEME.LIGHT ? 'code-light' : 'code-dark'),\n);\n\nconst onImportFileByPath = async (type: 'origin' | 'target') => {\n  const { path } = formData.value[type];\n  if (!path) return;\n\n  try {\n    const content = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.FS_FILE_READ, path);\n    if (isNil(content)) return;\n    formData.value[type].content = content ?? '';\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error(`Fail to import file:`, error);\n    MessagePlugin.error(`${t('common.error')}:${(error as Error).message}`);\n  }\n};\n\nconst onImportFile = async (type: 'origin' | 'target') => {\n  try {\n    const paths = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.FILE_SELECT_FILE_DIALOG, {});\n    if (isNil(paths) || isArrayEmpty(paths)) return;\n\n    const path = paths[0];\n    formData.value[type].path = path;\n\n    const content = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.FS_FILE_READ, path);\n    if (isNil(content)) return;\n    formData.value[type].content = content ?? '';\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error(`Fail to import file:`, error);\n    MessagePlugin.error(`${t('common.error')}:${(error as Error).message}`);\n  }\n};\n\nconst onExportFile = async (type: 'origin' | 'target') => {\n  const { path, content } = formData.value[type];\n  if (!content) return;\n\n  try {\n    let writeStatus = false;\n    if (path) {\n      writeStatus = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.FS_FILE_WRITE, path, content);\n    } else {\n      const resp = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.FILE_SELECT_FILE_WRITE, content, {\n        defaultPath: path,\n      });\n      writeStatus = resp.status ?? false;\n      if (!path) formData.value[type].path = resp.path ?? '';\n    }\n\n    if (writeStatus) MessagePlugin.success(t('common.success'));\n    else MessagePlugin.warning(t('common.fail'));\n  } catch (error) {\n    console.error(`Fail to export file:`, error);\n    MessagePlugin.error(`${t('common.error')}:${(error as Error).message}`);\n  }\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  padding: 0 var(--td-comp-paddingLR-s) var(--td-comp-paddingTB-s) 0;\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n\n  .header {\n    display: flex;\n    justify-content: space-between;\n    gap: var(--td-size-4);\n\n    .left-op-container,\n    .right-op-container {\n      display: flex;\n      align-items: center;\n      gap: var(--td-size-4);\n      width: 50%;\n\n      .header-input {\n        flex: 1;\n      }\n    }\n  }\n\n  .content {\n    height: 100%;\n    width: 100%;\n    flex: 1;\n\n    .diff-box {\n      height: 100%;\n      width: 100%;\n      border-radius: var(--td-radius-medium);\n      overflow: hidden;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/edit/components/DialogTemplate.vue",
    "content": "<template>\n  <t-dialog\n    v-model:visible=\"formVisible\"\n    show-in-attached-element\n    :attach=\"`.${attachContent}`\"\n    placement=\"center\"\n    destroy-on-close\n    lazy\n  >\n    <template #header>\n      {{ $t('pages.lab.edit.nav.template') }}\n    </template>\n    <template #body>\n      <div class=\"template view-container\">\n        <t-form\n          ref=\"formRef\"\n          :data=\"formData\"\n          :rules=\"RULES\"\n          :label-width=\"80\"\n          required-mark-position=\"right\"\n          label-align=\"left\"\n          reset-type=\"initial\"\n          @submit=\"onSubmit\"\n        >\n          <t-form-item name=\"template\" :label=\"$t('pages.lab.edit.nav.template')\">\n            <t-select v-model=\"formData.template\" :popup-props=\"popupProps\">\n              <t-option v-for=\"(item, index) in templateFormData\" :key=\"index\" :value=\"item\" :label=\"item\" />\n            </t-select>\n          </t-form-item>\n        </t-form>\n      </div>\n    </template>\n    <template #footer>\n      <t-button theme=\"default\" variant=\"base\" @click=\"handleReset\">{{ $t('common.reset') }}</t-button>\n      <t-button theme=\"primary\" variant=\"base\" @click=\"handleSubmit\">{{ $t('common.confirm') }}</t-button>\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"ts\">\nimport type { FormInstanceFunctions, SubmitContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { ref, useTemplateRef, watch } from 'vue';\n\nimport { attachContent } from '@/config/global';\n\nconst props = defineProps({\n  visible: {\n    type: Boolean,\n    default: false,\n  },\n  data: {\n    type: Object,\n    default: () => {},\n  },\n  template: {\n    type: Array,\n    default: () => [],\n  },\n});\nconst emits = defineEmits(['update:visible', 'submit']);\n\nconst RULES = {\n  template: [{ required: true }],\n};\n\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\nconst formVisible = ref(false);\nconst formData = ref(props.data);\nconst templateFormData = ref(props.template);\n\nconst popupProps = {\n  placement: 'bottom',\n  attach: '.template',\n  overlayInnerStyle: {\n    height: '200px',\n  },\n};\n\nwatch(\n  () => formVisible.value,\n  (val) => emits('update:visible', val),\n);\nwatch(\n  () => props.visible,\n  (val) => (formVisible.value = val),\n);\nwatch(\n  () => props.data,\n  (val) => (formData.value = val),\n);\nwatch(\n  () => props.template,\n  (val) => (templateFormData.value = val),\n);\n\nconst handleExecute = () => {\n  emits('submit', formData.value);\n  formVisible.value = false;\n};\n\nconst onSubmit = (context: SubmitContext<FormData>) => {\n  const { validateResult, firstError } = context;\n  if (validateResult && typeof validateResult === 'boolean') {\n    handleExecute();\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\nconst handleSubmit = () => {\n  formRef.value?.submit();\n};\n\nconst handleReset = () => {\n  formRef.value?.reset();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  padding: 0 var(--td-comp-paddingLR-xxs) var(--td-comp-paddingTB-xxs);\n  max-height: 340px;\n  overflow-y: auto;\n\n  .data-item {\n    margin-bottom: var(--td-comp-margin-xs);\n\n    .tip {\n      margin-bottom: var(--td-comp-margin-xs);\n    }\n\n    &:last-of-type {\n      margin-bottom: 0;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/edit/index.vue",
    "content": "<template>\n  <div class=\"lab-js-edit view-component-container\">\n    <div class=\"header\">\n      <div class=\"left-operation-container\">\n        <t-select\n          v-model=\"active.type\"\n          :label=\"$t('common.adapter')\"\n          auto-width\n          class=\"adapter\"\n          @change=\"handleOpTypeChange\"\n        >\n          <t-option v-for=\"item in TYPE_OPTIONS\" :key=\"item.value\" :value=\"item.value\" :label=\"item.label\" />\n        </t-select>\n        <t-button class=\"init\" theme=\"default\" auto-width @click=\"handleOpInitMode\">\n          {{ $t('pages.lab.edit.action.init') }}: {{ active.init ? $t('common.auto') : $t('common.manual') }}\n        </t-button>\n      </div>\n      <div class=\"right-operation-container\">\n        <group-btn :data=\"op\" @change=\"handleOpChange\" />\n\n        <dialog-template-view\n          v-model:visible=\"active.templateDialog\"\n          :data=\"templateFormData\"\n          :template=\"templateNameList\"\n          @submit=\"handleOpConfirmTemplate\"\n        />\n        <dialog-document\n          v-model:visible=\"active.helpDialog\"\n          :title=\"$t('pages.md.labEditHelp.title')\"\n          :content=\"$t('pages.md.labEditHelp.content')\"\n          :attach=\"`.${attachContent}`\"\n        />\n      </div>\n    </div>\n    <div class=\"content\">\n      <splitpanes horizontal>\n        <pane size=\"70\">\n          <splitpanes>\n            <pane>\n              <div class=\"editor-pane\">\n                <t-tabs v-model=\"active.editor\" theme=\"card\" lazy class=\"editor-pane-tabs\">\n                  <t-tab-panel :label=\"$t('component.codeEditor.editor.code')\" value=\"code\">\n                    <div class=\"editor-pane-code\">\n                      <code-editor\n                        v-model=\"editText.code\"\n                        :options=\"codeEditConf\"\n                        class=\"code-box\"\n                        @drop.prevent=\"handleEditorDrop('code', $event)\"\n                        @monaco-object=\"handleEditorObject\"\n                      />\n                    </div>\n                  </t-tab-panel>\n                  <t-tab-panel :label=\"$t('component.codeEditor.editor.html')\" value=\"html\">\n                    <div class=\"editor-pane-html\">\n                      <code-editor\n                        v-model=\"editText.html\"\n                        :options=\"htmlEditConf\"\n                        class=\"code-box\"\n                        @drop.prevent=\"handleEditorDrop('html', $event)\"\n                      />\n                    </div>\n                  </t-tab-panel>\n                </t-tabs>\n              </div>\n            </pane>\n            <pane>\n              <div class=\"action-pane\">\n                <t-tabs v-model=\"active.action\" theme=\"card\" lazy class=\"pane-right\">\n                  <t-tab-panel :label=\"$t('pages.lab.edit.debug.dom')\" value=\"dom\">\n                    <div class=\"action-pane-dom\">\n                      <div class=\"action-item req-item\">\n                        <input-req\n                          v-model=\"reqFormData\"\n                          :attach=\"`.${attachContent}`\"\n                          class=\"source\"\n                          @response=\"onReqResponse\"\n                        />\n                      </div>\n                      <div class=\"action-item\">\n                        <t-input\n                          v-model=\"domFormData.pdfa\"\n                          :label=\"$t('pages.lab.edit.rule.pdfa')\"\n                          :placeholder=\"$t('pages.lab.edit.placeholder.pdfa')\"\n                        />\n                        <t-button\n                          theme=\"primary\"\n                          variant=\"base\"\n                          block\n                          :loading=\"domLoading.pdfa\"\n                          @click=\"handleDomDebugPdfa\"\n                        >\n                          {{ $t('common.execute') }}\n                        </t-button>\n                      </div>\n                      <div class=\"action-item\">\n                        <t-input\n                          v-model=\"domFormData.pdfh\"\n                          :label=\"$t('pages.lab.edit.rule.pdfh')\"\n                          :placeholder=\"$t('pages.lab.edit.placeholder.pdfh')\"\n                        />\n                        <t-button\n                          theme=\"primary\"\n                          variant=\"base\"\n                          block\n                          :loading=\"domLoading.pdfh\"\n                          @click=\"handleDomDebugPdfh\"\n                        >\n                          {{ $t('common.execute') }}\n                        </t-button>\n                      </div>\n                    </div>\n                  </t-tab-panel>\n                  <t-tab-panel :label=\"$t('pages.lab.edit.debug.data')\" value=\"data\">\n                    <div class=\"action-pane-data\">\n                      <div class=\"action-item action-base\">\n                        <t-button\n                          theme=\"primary\"\n                          variant=\"base\"\n                          :loading=\"dataLoading.init\"\n                          @click=\"handleDataDebugInit\"\n                        >\n                          {{ $t('pages.lab.edit.action.init') }}\n                        </t-button>\n                        <t-button\n                          theme=\"primary\"\n                          variant=\"base\"\n                          :loading=\"dataLoading.home\"\n                          @click=\"handleDataDebugHome\"\n                        >\n                          {{ $t('pages.lab.edit.action.home') }}\n                        </t-button>\n                        <t-button\n                          theme=\"primary\"\n                          variant=\"base\"\n                          :loading=\"dataLoading.homeVod\"\n                          @click=\"handleDataDebugHomeVod\"\n                        >\n                          {{ $t('pages.lab.edit.action.homeVod') }}\n                        </t-button>\n                      </div>\n                      <div class=\"action-item\">\n                        <t-input v-model=\"dataFormData.category.tid\" :label=\"$t('pages.lab.edit.rule.tid')\" />\n                        <t-input v-model=\"dataFormData.category.filter\" :label=\"$t('pages.lab.edit.rule.filter')\" />\n                        <t-input-number\n                          v-model=\"dataFormData.category.page\"\n                          theme=\"column\"\n                          :min=\"0\"\n                          :label=\"$t('pages.lab.edit.rule.page')\"\n                          class=\"input-number-item\"\n                        />\n                        <t-button\n                          theme=\"primary\"\n                          variant=\"base\"\n                          block\n                          :loading=\"dataLoading.category\"\n                          @click=\"handleDataDebugCategory\"\n                        >\n                          {{ $t('pages.lab.edit.action.category') }}\n                        </t-button>\n                      </div>\n                      <div class=\"action-item\">\n                        <t-input v-model=\"dataFormData.detail.ids\" :label=\"$t('pages.lab.edit.rule.ids')\" />\n                        <t-button\n                          theme=\"primary\"\n                          variant=\"base\"\n                          block\n                          :loading=\"dataLoading.detail\"\n                          @click=\"handleDataDebugDetail\"\n                        >\n                          {{ $t('pages.lab.edit.action.detail') }}\n                        </t-button>\n                      </div>\n                      <div class=\"action-item\">\n                        <t-input v-model=\"dataFormData.search.wd\" :label=\"$t('pages.lab.edit.rule.wd')\" />\n                        <t-input-number\n                          v-model=\"dataFormData.search.page\"\n                          theme=\"column\"\n                          :min=\"0\"\n                          :label=\"$t('pages.lab.edit.rule.page')\"\n                          class=\"input-number-item\"\n                        />\n                        <t-button\n                          theme=\"primary\"\n                          variant=\"base\"\n                          block\n                          :loading=\"dataLoading.search\"\n                          @click=\"handleDataDebugSearch\"\n                        >\n                          {{ $t('pages.lab.edit.action.search') }}\n                        </t-button>\n                      </div>\n                      <div class=\"action-item\">\n                        <t-input v-model=\"dataFormData.play.flag\" :label=\"$t('pages.lab.edit.rule.flag')\" />\n                        <t-input v-model=\"dataFormData.play.play\" :label=\"$t('pages.lab.edit.rule.play')\" />\n                        <t-button\n                          theme=\"primary\"\n                          variant=\"base\"\n                          block\n                          :loading=\"dataLoading.play\"\n                          @click=\"handleDataDebugPlay\"\n                        >\n                          {{ $t('pages.lab.edit.action.play') }}\n                        </t-button>\n                      </div>\n                      <div class=\"action-item\">\n                        <t-input v-model=\"dataFormData.proxy.url\" :label=\"$t('pages.lab.edit.rule.url')\" />\n                        <t-button\n                          theme=\"primary\"\n                          variant=\"base\"\n                          block\n                          :loading=\"dataLoading.proxy\"\n                          @click=\"handleDataDebugProxy\"\n                        >\n                          {{ $t('pages.lab.edit.action.proxy') }}\n                        </t-button>\n                      </div>\n                      <div class=\"action-item\">\n                        <t-textarea\n                          v-model=\"dataFormData.proxy.upload\"\n                          :placeholder=\"$t('pages.lab.edit.placeholder.proxyUpload')\"\n                          :autosize=\"{ minRows: 3, maxRows: 5 }\"\n                        />\n                        <t-button\n                          theme=\"primary\"\n                          variant=\"base\"\n                          block\n                          :loading=\"dataLoading.proxyUpload\"\n                          @click=\"handleDataDebugProxyUpload\"\n                        >\n                          {{ $t('pages.lab.edit.action.proxyUpload') }}\n                        </t-button>\n                      </div>\n                    </div>\n                  </t-tab-panel>\n                </t-tabs>\n              </div>\n            </pane>\n          </splitpanes>\n        </pane>\n        <pane>\n          <div class=\"output-pane\">\n            <div class=\"output-header\">\n              <tag-nav\n                :list=\"OUTPUT_OPTIONS\"\n                :active=\"active.output\"\n                class=\"header-nav output-header-left\"\n                @change=\"handleOutputChange\"\n              />\n              <div class=\"output-header-right\">\n                <div v-show=\"active.output === 'logger'\" class=\"output-reconnect\" @click=\"connectLogger\">\n                  {{ $t('common.reconnect') }}\n                </div>\n                <div class=\"output-clear\" @click=\"handleOutputClear\"><clear-formatting1-icon /></div>\n              </div>\n            </div>\n            <div class=\"output-content\">\n              <terminal\n                v-show=\"active.output === 'testResult'\"\n                ref=\"testResultRef\"\n                :options=\"termConf\"\n                :console=\"true\"\n                class=\"output-terminal\"\n              />\n              <terminal\n                v-show=\"active.output === 'logger' && active.supportLogger\"\n                ref=\"loggerRef\"\n                :options=\"termConf\"\n                :console=\"true\"\n                class=\"output-terminal\"\n              />\n            </div>\n          </div>\n        </pane>\n      </splitpanes>\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport 'splitpanes/dist/splitpanes.css';\n\nimport { PROXY_API } from '@shared/config/env';\nimport type { ISiteType } from '@shared/config/film';\nimport { SITE_TYPE } from '@shared/config/film';\nimport { THEME } from '@shared/config/theme';\nimport { toHMS } from '@shared/modules/date';\nimport { jsonStrToObjByEval } from '@shared/modules/obj';\nimport {\n  isArray,\n  isArrayEmpty,\n  isHttp,\n  isJson,\n  isJsonStr,\n  isNil,\n  isNumber,\n  isStrEmpty,\n  isString,\n} from '@shared/modules/validate';\nimport type { IModels } from '@shared/types/db';\nimport { throttle } from 'es-toolkit';\nimport JSON5 from 'json5';\nimport { Pane, Splitpanes } from 'splitpanes';\nimport { ClearFormatting1Icon } from 'tdesign-icons-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { computed, nextTick, onActivated, onDeactivated, onMounted, ref, useTemplateRef, watch } from 'vue';\nimport { useRouter } from 'vue-router';\n\nimport {\n  addSite,\n  fetchCmsCategory,\n  fetchCmsDetail,\n  fetchCmsHome,\n  fetchCmsHomeVod,\n  fetchCmsInit,\n  fetchCmsPlay,\n  fetchCmsProxy,\n  fetchCmsSearch,\n  fetchEditDecrypt,\n  fetchEditDomPdfa,\n  fetchEditDomPdfh,\n  fetchEditTemplateDetail,\n  fetchEditTemplates,\n  fetchSiteDetailByKey,\n  putSite,\n  putSiteDefault,\n} from '@/api/film';\nimport { setProxy } from '@/api/proxy';\nimport type { IEditor, IEditorOptions, ILang as IEditorLang } from '@/components/code-editor';\nimport CodeEditor, { applyExtraLib, applymSuggestions } from '@/components/code-editor';\nimport DialogDocument from '@/components/dialog-document/index.vue';\nimport GroupBtn from '@/components/group-btn/index.vue';\nimport type { IReqConfig, IReqResponse } from '@/components/input-req/index.vue';\nimport InputReq from '@/components/input-req/index.vue';\nimport TagNav from '@/components/tag-nav/index.vue';\nimport type { ITerminalLog, ITerminalOptions } from '@/components/terminal/index.vue';\nimport Terminal from '@/components/terminal/index.vue';\nimport { emitterChannel, emitterSource } from '@/config/emitterChannel';\nimport { attachContent } from '@/config/global';\nimport { t } from '@/locales';\nimport { useSettingStore } from '@/store';\nimport emitter from '@/utils/emitter';\n\nimport DialogTemplateView from './components/DialogTemplate.vue';\nimport { openFolder, readFile, writeFile } from './utils/comm';\nimport { DEBUG_PREFIX, SITE_DIFF_DEBUG_MAP, SITE_MONACO_MAP } from './utils/config';\nimport { SITE_LOG_MAP } from './utils/log';\n\nconst router = useRouter();\nconst storeSetting = useSettingStore();\n\nconst op = computed(() => [\n  { label: t('pages.lab.edit.nav.template'), value: 'template' },\n  {\n    label: t('pages.lab.edit.nav.file.title'),\n    value: [\n      { label: t('pages.lab.edit.nav.file.folder'), value: 'file:openFolder' },\n      { label: t('pages.lab.edit.nav.file.import'), value: 'file:import' },\n      { label: t('pages.lab.edit.nav.file.export'), value: 'file:export' },\n    ],\n  },\n  { label: t('pages.lab.edit.nav.decode'), value: 'decode' },\n  { label: t('pages.lab.edit.nav.debug'), value: 'debug' },\n  { label: t('common.help'), value: 'help' },\n]);\nconst TYPE_OPTIONS = computed(() => [\n  // { value: SITE_TYPE.T0_XML, label: t('pages.film.field.typeMap.t0-xml') },\n  // { value: SITE_TYPE.T1_JSON, label: t('pages.film.field.typeMap.t1-json') },\n\n  { value: SITE_TYPE.T3_DRPY, label: t('pages.film.field.typeMap.t3-js_drpy') },\n  { value: SITE_TYPE.T3_XBPQ, label: t('pages.film.field.typeMap.t3-csp_xbpq') },\n  { value: SITE_TYPE.T3_XYQ, label: t('pages.film.field.typeMap.t3-csp_xyq') },\n  { value: SITE_TYPE.T3_CATOPEN, label: t('pages.film.field.typeMap.t3-js_catopen') },\n  // { value: SITE_TYPE.T3_APPYSV2, label: t('pages.film.field.typeMap.t3-csp_appysv2') },\n  { value: SITE_TYPE.T3_PY, label: t('pages.film.field.typeMap.t3-py') },\n  // { value: SITE_TYPE.T3_ALIST, label: t('pages.film.field.typeMap.t3-alist') },\n\n  // { value: SITE_TYPE.T4_DRPYJS0, label: t('pages.film.field.typeMap.t4-drpy_js0') },\n  { value: SITE_TYPE.T4_DRPYS, label: t('pages.film.field.typeMap.t4-drpys') },\n  // { value: SITE_TYPE.T4_CATVOD, label: t('pages.film.field.typeMap.t4-catvod') },\n]);\nconst OUTPUT_OPTIONS = computed(() => [\n  { label: t('component.codeEditor.output.testResult'), value: 'testResult' },\n  ...(active.value.supportLogger ? [{ label: t('component.codeEditor.output.logger'), value: 'logger' }] : []),\n]);\n\nconst EDIT_CONF: IEditorOptions['normal'] = {\n  automaticLayout: true, // 自动布局\n  fixedOverflowWidgets: true, // 溢出小部件固定\n  folding: true, // 代码折叠\n  fontFamily: 'JetBrainsMono, monospace',\n  fontLigatures: false, // 连字符\n  insertSpaces: false, // 使用空格代替制表符\n  minimap: { enabled: true },\n  overviewRulerBorder: false, // 概览标尺边框\n  readOnly: false,\n  roundedSelection: false, // 选区边框圆角\n  scrollBeyondLastLine: false, // 滚动到最后一行后禁止继续滚动\n  scrollbar: {\n    useShadows: false,\n    verticalScrollbarSize: 5,\n    horizontalScrollbarSize: 5,\n  },\n  smoothScrolling: true,\n  stickyScroll: { enabled: false },\n  tabSize: 2,\n  theme: storeSetting.displayTheme === THEME.LIGHT ? 'code-light' : 'code-dark',\n  wordWrap: 'off',\n};\n\nconst loggerRef = useTemplateRef<InstanceType<typeof Terminal>>('loggerRef');\nconst testResultRef = useTemplateRef<InstanceType<typeof Terminal>>('testResultRef');\n\nconst codeEditConf = ref<IEditorOptions['normal']>({\n  ...EDIT_CONF,\n  language: 'javascript',\n  quickSuggestions: {\n    strings: true,\n    comments: true,\n    other: true,\n  },\n});\nconst htmlEditConf = ref<IEditorOptions['normal']>({ ...EDIT_CONF, language: 'html' });\nconst termConf = ref<ITerminalOptions>({\n  convertEol: true,\n  cursorBlink: false,\n  cursorStyle: 'block',\n  cursorInactiveStyle: 'block',\n  fontSize: 13,\n  fontFamily: 'JetBrainsMono, monospace',\n  scrollback: 10000,\n  scrollSensitivity: 1,\n  smoothScrollDuration: 0,\n  theme: {\n    background: storeSetting.displayTheme === THEME.LIGHT ? '#e8e8e8' : '#393939',\n    cursor: storeSetting.displayTheme === THEME.LIGHT ? 'rgba(0, 0, 0, 0.9)' : 'rgba(255, 255, 255, 0.9)',\n    foreground: storeSetting.displayTheme === THEME.LIGHT ? 'rgba(0, 0, 0, 0.9)' : 'rgba(255, 255, 255, 0.9)',\n    selectionBackground: storeSetting.displayTheme === THEME.LIGHT ? 'rgba(0, 0, 0, 0.3)' : 'rgba(255, 255, 255, 0.3)',\n  },\n});\n\nconst reqFormData = ref<IReqConfig>({\n  method: 'GET',\n  url: '',\n  encode: 'UTF-8',\n  headers: '',\n  contentType: 'application/json',\n  data: '',\n});\nconst templateFormData = ref({\n  template: '',\n});\nconst domFormData = ref({\n  pdfa: '',\n  pdfh: '',\n});\nconst dataFormData = ref({\n  detail: {\n    ids: '',\n  },\n  category: {\n    tid: '',\n    filter: '{}',\n    page: 1,\n  },\n  search: {\n    wd: '',\n    page: 1,\n  },\n  play: {\n    flag: '',\n    play: '',\n  },\n  proxy: {\n    do: 'js',\n    url: '',\n    upload: '',\n  },\n});\n\nconst editText = ref({\n  code: '',\n  html: '',\n});\n\nconst active = ref({\n  type: SITE_TYPE.T3_DRPY as ISiteType,\n  init: false,\n  editor: 'code' as 'code' | 'html',\n  action: 'dom' as 'dom' | 'data',\n  output: 'testResult' as 'testResult' | 'logger',\n  templateDialog: false,\n  helpDialog: false,\n  supportLogger: true,\n});\nconst domLoading = ref({\n  pdfa: false,\n  pdfh: false,\n});\nconst dataLoading = ref({\n  init: false,\n  home: false,\n  homeVod: false,\n  category: false,\n  detail: false,\n  search: false,\n  play: false,\n  proxy: false,\n  proxyUpload: false,\n});\n\nconst templateNameList = ref<string[]>([]);\nconst siteData = ref({} as IModels['site']);\n\nconst loggerAbortController = ref<any>(null);\n\nwatch(\n  () => storeSetting.displayTheme,\n  (val) => {\n    codeEditConf.value.theme = val === THEME.LIGHT ? 'code-light' : 'code-dark';\n    htmlEditConf.value.theme = val === THEME.LIGHT ? 'code-light' : 'code-dark';\n\n    termConf.value.theme = {\n      foreground: val === THEME.LIGHT ? 'rgba(0, 0, 0, 0.9)' : 'rgba(255, 255, 255, 0.9)',\n      background: val === THEME.LIGHT ? '#e8e8e8' : '#393939',\n      cursor: val === THEME.LIGHT ? 'rgba(0, 0, 0, 0.9)' : 'rgba(255, 255, 255, 0.9)',\n    };\n  },\n);\n\nwatch(\n  () => editText.value.code,\n  () => active.value.init && throttleSaveSiteAndWriteFileData(),\n);\n\nonMounted(() => setup());\nonActivated(() => activeSetup());\nonDeactivated(() => deactivateDispose());\n\nconst setup = async () => {\n  await getSiteData();\n\n  const { id, type } = siteData.value;\n\n  if (isNil(id)) {\n    MessagePlugin.warning(t('pages.lab.edit.message.noInitSource'));\n    return;\n  }\n\n  nextTick(() => (codeEditConf.value.language = SITE_MONACO_MAP[type].language));\n\n  active.value.type = type as ISiteType;\n  editText.value.code = await readFile(type as ISiteType, 'silence');\n  await connectLogger();\n};\n\nconst activeSetup = async () => {\n  if (!isNil(siteData.value?.id)) await connectLogger();\n};\n\nconst deactivateDispose = () => {\n  disconnectLogger();\n};\n\nconst createSiteDoc = (type: ISiteType) => ({\n  name: DEBUG_PREFIX,\n  key: DEBUG_PREFIX,\n  type,\n  api: SITE_DIFF_DEBUG_MAP[type].api,\n  search: true,\n  playUrl: '',\n  group: DEBUG_PREFIX,\n  category: '',\n  ext: SITE_DIFF_DEBUG_MAP[type].ext,\n});\n\nconst saveSiteData = async () => {\n  try {\n    const type = active.value.type;\n    const uuid = siteData.value.id;\n\n    const doc = createSiteDoc(type);\n\n    const resp = isNil(uuid) ? await addSite(doc) : await putSite({ id: [uuid], doc });\n    if (isArray(resp) && !isArrayEmpty(resp) && !isNil(resp[0]?.id)) {\n      siteData.value = resp[0];\n    } else {\n      siteData.value = {} as IModels['site'];\n    }\n  } catch (error) {\n    console.error('Save site Data Error:', error);\n    siteData.value = {} as IModels['site'];\n  }\n};\n\nconst getSiteData = async () => {\n  try {\n    const resp = await fetchSiteDetailByKey(DEBUG_PREFIX);\n    if (!isNil(resp?.id)) {\n      siteData.value = resp;\n    } else {\n      await saveSiteData();\n    }\n  } catch (error) {\n    console.error('Fail to get site data', error);\n    siteData.value = {} as IModels['site'];\n  }\n};\n\nconst saveSiteAndWriteFileData = async () => {\n  const code = editText.value.code;\n  const type = active.value.type;\n  const uuid = siteData.value.id;\n\n  if (!isNil(uuid) && isString(code) && !isStrEmpty(code)) {\n    await writeFile(type, code, 'silence');\n    await saveSiteData();\n  }\n};\nconst throttleSaveSiteAndWriteFileData = throttle(saveSiteAndWriteFileData, 3000, { edges: ['leading', 'trailing'] });\n\n// operations\nconst handleOpTypeChange = async () => {\n  const type = active.value.type;\n  nextTick(() => (codeEditConf.value.language = SITE_MONACO_MAP[type].language));\n\n  await saveSiteData();\n  await connectLogger();\n};\n\nconst handleOpInitMode = () => {\n  active.value.init = !active.value.init;\n};\n\nconst handleOpMatchTemplate = async () => {\n  try {\n    const type = active.value.type;\n\n    const resp = await fetchEditTemplates(type);\n\n    templateNameList.value = resp;\n    active.value.templateDialog = true;\n  } catch (error) {\n    console.error('Fail to get templates', error);\n\n    templateNameList.value = [];\n    active.value.templateDialog = true;\n  }\n};\n\nconst handleOpConfirmTemplate = async (doc: typeof templateFormData.value) => {\n  try {\n    const type = active.value.type;\n    const templateName = doc.template;\n\n    const resp = await fetchEditTemplateDetail(type, templateName);\n    editText.value.code = isJson(resp) ? JSON.stringify(resp, null, 2) : resp;\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error('Fail to confirm template', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  } finally {\n    active.value.templateDialog = false;\n  }\n};\n\nconst handleOpOpenFolder = async () => {\n  try {\n    const type = active.value.type;\n\n    await openFolder(type);\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error('Fail to open folder', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst handleOpImportFile = async () => {\n  try {\n    const type = active.value.type;\n\n    const fileContent = await readFile(type, 'dialog');\n    editText.value.code = fileContent;\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error('Fail to import file', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst handleOpExportFile = async () => {\n  try {\n    const type = active.value.type;\n    const content = editText.value.code;\n\n    if (!isString(content) || isStrEmpty(content)) {\n      MessagePlugin.warning(t('pages.lab.edit.message.codeNoData'));\n      return;\n    }\n\n    const writeStatus = await writeFile(type, content, 'dialog');\n\n    writeStatus ? MessagePlugin.success(t('common.success')) : MessagePlugin.warning(t('common.fail'));\n  } catch (error) {\n    console.error('Fail to export file', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst handleOpDecode = async () => {\n  try {\n    const type = active.value.type;\n    const content = editText.value.code;\n\n    if (!isString(content) || isStrEmpty(content)) {\n      MessagePlugin.warning(t('pages.lab.edit.message.codeNoData'));\n      return;\n    }\n\n    const resp = await fetchEditDecrypt(type, content);\n\n    if (isString(resp) && !isStrEmpty(resp)) {\n      editText.value.code = resp;\n      MessagePlugin.success(t('common.success'));\n    } else {\n      MessagePlugin.warning(t('common.fail'));\n    }\n  } catch (error) {\n    console.error('Fail to decode', error);\n    MessagePlugin.error(`${t('common.error')}:${(error as Error).message}`);\n  }\n};\n\nconst handleOpDebug = async () => {\n  try {\n    const content = editText.value.code;\n    const uuid = siteData.value.id;\n\n    if (!isString(content) || isStrEmpty(content)) {\n      MessagePlugin.warning(t('pages.lab.edit.message.codeNoData'));\n      return;\n    }\n\n    await saveSiteData();\n    await putSiteDefault(uuid);\n\n    emitter.emit(emitterChannel.REFRESH_FILM_CONFIG, { source: emitterSource.PAGE_DEBUG });\n    router.push({ name: 'Film' });\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error('Fail to debug', error);\n    MessagePlugin.error(`${t('common.error')}:${(error as Error).message}`);\n  }\n};\n\nconst handleOpHelp = () => {\n  active.value.helpDialog = true;\n};\n\nconst handleOpChange = (val: string) => {\n  const handlers = {\n    template: handleOpMatchTemplate,\n    'file:openFolder': handleOpOpenFolder,\n    'file:import': handleOpImportFile,\n    'file:export': handleOpExportFile,\n    decode: handleOpDecode,\n    debug: handleOpDebug,\n    help: handleOpHelp,\n  };\n\n  handlers?.[val]?.();\n};\n\n// editor\nconst handleEditorDrop = (type: 'code' | 'html', e: DragEvent) => {\n  e.preventDefault();\n\n  const file = e.dataTransfer?.files[0];\n  if (file) {\n    const reader = new FileReader();\n    reader.onload = (event) => {\n      const content = event.target?.result as string;\n      editText.value[type] = content;\n    };\n    reader.readAsText(file);\n  }\n};\n\nconst handleEditorObject = (monaco: IEditor) => {\n  const type = active.value.type;\n  const { language, extraLib, suggestions } = SITE_MONACO_MAP[type] as {\n    language: IEditorLang;\n    extraLib?: string | null;\n    suggestions?: any | null;\n  };\n\n  if (!isNil(suggestions)) applymSuggestions(monaco, language, suggestions);\n  if (!isNil(extraLib)) applyExtraLib(monaco, language, extraLib);\n};\n\n// dom\nconst onReqResponse = (resp: IReqResponse) => {\n  active.value.editor = 'html';\n  editText.value.html = resp.data;\n};\n\nconst handleDomDebugPdfa = async () => {\n  domLoading.value.pdfa = true;\n  try {\n    const rule = domFormData.value.pdfa;\n    const html = editText.value.html;\n\n    if (!isString(rule) || isStrEmpty(rule)) {\n      MessagePlugin.warning(t('common.message.noRequiredParam', ['pdfa']));\n      return;\n    }\n\n    if (!isString(html) || isStrEmpty(html)) {\n      MessagePlugin.warning(t('pages.lab.edit.message.htmlNoData'));\n      return;\n    }\n\n    const resp = await fetchEditDomPdfa({ html, rule });\n    logger('testResult', `${toHMS()} [Pdfa]`, 'verbose', resp);\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    logger('testResult', `${toHMS()} [Pdfa]`, 'error', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  } finally {\n    domLoading.value.pdfa = false;\n  }\n};\n\nconst handleDomDebugPdfh = async () => {\n  domLoading.value.pdfh = true;\n  try {\n    const rule = domFormData.value.pdfh;\n    const html = editText.value.html;\n\n    if (!isString(rule) || isStrEmpty(rule)) {\n      MessagePlugin.warning(t('common.message.noRequiredParam', ['pdfh']));\n      return;\n    }\n\n    if (!isString(html) || isStrEmpty(html)) {\n      MessagePlugin.warning(t('pages.lab.edit.message.htmlNoData'));\n      return;\n    }\n\n    const resp = await fetchEditDomPdfh({ html, rule });\n    logger('testResult', `${toHMS()} [Pdfh]`, 'verbose', resp);\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    logger('testResult', `${toHMS()} [Pdfh]`, 'error', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  } finally {\n    domLoading.value.pdfh = false;\n  }\n};\n\n// data\nconst handleDataDebugInit = async () => {\n  if (isNil(siteData.value?.id)) {\n    MessagePlugin.warning(t('pages.lab.edit.message.noInitSource'));\n    return;\n  }\n\n  dataLoading.value.init = true;\n  try {\n    const uuid = siteData.value.id;\n    const code = editText.value.code;\n\n    if (!isString(code) || isStrEmpty(code)) {\n      MessagePlugin.warning(t('pages.lab.edit.message.codeNoData'));\n      return;\n    }\n\n    await saveSiteAndWriteFileData();\n\n    const resp = await fetchCmsInit({ uuid, force: true });\n    logger('testResult', `${toHMS()} [Init]`, 'verbose', resp);\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    logger('testResult', `${toHMS()} [Init]`, 'error', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  } finally {\n    dataLoading.value.init = false;\n  }\n};\n\nconst handleDataDebugHome = async () => {\n  if (isNil(siteData.value?.id)) {\n    MessagePlugin.warning(t('pages.lab.edit.message.noInitSource'));\n    return;\n  }\n\n  dataLoading.value.home = true;\n  try {\n    const uuid = siteData.value.id;\n    const code = editText.value.code;\n\n    if (!isString(code) || isStrEmpty(code)) {\n      MessagePlugin.warning(t('pages.lab.edit.message.codeNoData'));\n      return;\n    }\n\n    const resp = await fetchCmsHome({ uuid });\n    logger('testResult', `${toHMS()} [Home]`, 'verbose', resp);\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    logger('testResult', `${toHMS()} [Home]`, 'error', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  } finally {\n    dataLoading.value.home = false;\n  }\n};\n\nconst handleDataDebugHomeVod = async () => {\n  if (isNil(siteData.value?.id)) {\n    MessagePlugin.warning(t('pages.lab.edit.message.noInitSource'));\n    return;\n  }\n\n  dataLoading.value.homeVod = true;\n  try {\n    const uuid = siteData.value.id;\n    const code = editText.value.code;\n\n    if (!isString(code) || isStrEmpty(code)) {\n      MessagePlugin.warning(t('pages.lab.edit.message.codeNoData'));\n      return;\n    }\n\n    const resp = await fetchCmsHomeVod({ uuid });\n    logger('testResult', `${toHMS()} [HomeVod]`, 'verbose', resp);\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    logger('testResult', `${toHMS()} [HomeVod]`, 'error', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  } finally {\n    dataLoading.value.homeVod = false;\n  }\n};\n\nconst handleDataDebugCategory = async () => {\n  if (isNil(siteData.value?.id)) {\n    MessagePlugin.warning(t('pages.lab.edit.message.noInitSource'));\n    return;\n  }\n\n  dataLoading.value.category = true;\n  try {\n    const { tid, filter = '{}', page = 1 } = dataFormData.value.category;\n    const uuid = siteData.value.id;\n    const code = editText.value.code;\n\n    if (!isString(code) || isStrEmpty(code)) {\n      MessagePlugin.warning(t('pages.lab.edit.message.codeNoData'));\n      return;\n    }\n\n    if (!(isString(tid) && !isStrEmpty(tid)) && !isNumber(tid)) {\n      MessagePlugin.warning(t('common.message.noRequiredParam', ['tid']));\n      return;\n    }\n\n    if (!isString(filter) || isStrEmpty(filter)) {\n      MessagePlugin.warning(t('common.message.noRequiredParam', ['filter']));\n      return;\n    } else if (!isJsonStr(filter)) {\n      MessagePlugin.warning(t('common.message.errRequiredParam', ['filter']));\n      return;\n    }\n\n    const resp = await fetchCmsCategory({ uuid, tid, page, extend: JSON.stringify(JSON5.parse(filter)) });\n    logger('testResult', `${toHMS()} [Category]`, 'verbose', resp);\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    logger('testResult', `${toHMS()} [Category]`, 'error', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  } finally {\n    dataLoading.value.category = false;\n  }\n};\n\nconst handleDataDebugDetail = async () => {\n  if (isNil(siteData.value?.id)) {\n    MessagePlugin.warning(t('pages.lab.edit.message.noInitSource'));\n    return;\n  }\n\n  dataLoading.value.detail = true;\n  try {\n    const { ids } = dataFormData.value.detail;\n    const uuid = siteData.value.id;\n    const code = editText.value.code;\n\n    if (!isString(code) || isStrEmpty(code)) {\n      MessagePlugin.warning(t('pages.lab.edit.message.codeNoData'));\n      return;\n    }\n\n    if (!(isString(ids) && !isStrEmpty(ids))) {\n      MessagePlugin.warning(t('common.message.noRequiredParam', ['ids']));\n      return;\n    }\n\n    const resp = await fetchCmsDetail({ uuid, ids });\n    logger('testResult', `${toHMS()} [Detail]`, 'verbose', resp);\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    logger('testResult', `${toHMS()} [Detail]`, 'error', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  } finally {\n    dataLoading.value.detail = false;\n  }\n};\n\nconst handleDataDebugSearch = async () => {\n  if (isNil(siteData.value?.id)) {\n    MessagePlugin.warning(t('pages.lab.edit.message.noInitSource'));\n    return;\n  }\n\n  dataLoading.value.search = true;\n  try {\n    const { wd, page = 1 } = dataFormData.value.search;\n    const uuid = siteData.value.id;\n    const code = editText.value.code;\n\n    if (!isString(code) || isStrEmpty(code)) {\n      MessagePlugin.warning(t('pages.lab.edit.message.codeNoData'));\n      return;\n    }\n\n    if (!(isString(wd) && !isStrEmpty(wd))) {\n      MessagePlugin.warning(t('common.message.noRequiredParam', ['wd']));\n      return;\n    }\n\n    const resp = await fetchCmsSearch({ uuid, wd, page });\n    logger('testResult', `${toHMS()} [Search]`, 'verbose', resp);\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    logger('testResult', `${toHMS()} [Search]`, 'error', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  } finally {\n    dataLoading.value.search = false;\n  }\n};\n\nconst handleDataDebugPlay = async () => {\n  if (isNil(siteData.value?.id)) {\n    MessagePlugin.warning(t('pages.lab.edit.message.noInitSource'));\n    return;\n  }\n\n  dataLoading.value.play = true;\n  try {\n    const { flag, play } = dataFormData.value.play;\n    const uuid = siteData.value.id;\n    const code = editText.value.code;\n\n    if (!isString(code) || isStrEmpty(code)) {\n      MessagePlugin.warning(t('pages.lab.edit.message.codeNoData'));\n      return;\n    }\n\n    if (!(isString(flag) && !isStrEmpty(flag))) {\n      MessagePlugin.warning(t('common.message.noRequiredParam', ['flag']));\n\n      return;\n    }\n\n    if (!(isString(play) && !isStrEmpty(play))) {\n      MessagePlugin.warning(t('common.message.noRequiredParam', ['play']));\n      return;\n    }\n\n    const resp = await fetchCmsPlay({ uuid, flag, play });\n    logger('testResult', `${toHMS()} [Play]`, 'verbose', resp);\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    logger('testResult', `${toHMS()} [Play]`, 'error', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  } finally {\n    dataLoading.value.play = false;\n  }\n};\n\nconst handleDataDebugProxy = async () => {\n  if (isNil(siteData.value?.id)) {\n    MessagePlugin.warning(t('pages.lab.edit.message.noInitSource'));\n    return;\n  }\n\n  dataLoading.value.proxy = true;\n  try {\n    const { url } = dataFormData.value.proxy;\n    const uuid = siteData.value.id;\n    const code = editText.value.code;\n\n    if (!isString(code) || isStrEmpty(code)) {\n      MessagePlugin.warning(t('pages.lab.edit.message.codeNoData'));\n      return;\n    }\n\n    if (!isString(url) || isStrEmpty(url)) {\n      MessagePlugin.warning(t('common.message.noRequiredParam', ['url']));\n      return;\n    } else if (!isHttp(url) || !url.startsWith(PROXY_API)) {\n      MessagePlugin.warning(t('common.message.errRequiredParam', ['url']));\n      return;\n    }\n\n    const params = Object.fromEntries(new URL(url).searchParams);\n\n    const resp = await fetchCmsProxy({ uuid, ...params });\n    logger('testResult', `${toHMS()} [Proxy]`, 'verbose', resp);\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    logger('testResult', `${toHMS()} [Proxy]`, 'error', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  } finally {\n    dataLoading.value.proxy = false;\n  }\n};\n\nconst handleDataDebugProxyUpload = async () => {\n  dataLoading.value.proxyUpload = true;\n  try {\n    const { upload: uploadRaw = '[]', url } = dataFormData.value.proxy;\n    let upload: Array<any> = [];\n\n    if (!isString(url) || isStrEmpty(url)) {\n      MessagePlugin.warning(t('common.message.noRequiredParam', ['url']));\n      return;\n    } else if (!isHttp(url) || !url.startsWith(PROXY_API)) {\n      MessagePlugin.warning(t('common.message.errRequiredParam', ['url']));\n      return;\n    }\n\n    if (!isString(uploadRaw) || isStrEmpty(uploadRaw)) {\n      return;\n    } else {\n      upload = jsonStrToObjByEval(uploadRaw) as Array<any>;\n      if (isArray(upload) && upload.length !== 3) {\n        MessagePlugin.warning(t('common.message.errRequiredParam', ['upload']));\n        return;\n      }\n    }\n\n    const params = Object.fromEntries(new URL(url).searchParams);\n    await setProxy({ text: upload, url: params.url });\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error(`[data]proxyUpload: ${toHMS()} > ${error}`);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  } finally {\n    dataLoading.value.proxyUpload = false;\n  }\n};\n\n// output\n\nconst logger = (type: typeof active.value.output, prefix: string, level: ITerminalLog, text: unknown) => {\n  const printRef = type === 'logger' ? loggerRef.value : type === 'testResult' ? testResultRef.value : null;\n  if (!printRef) return;\n\n  if (text instanceof Error) {\n    level = 'error';\n    text = text.message;\n  }\n\n  printRef?.write(text, level, true, prefix);\n};\n\nconst handleOutputClear = () => {\n  try {\n    console.clear();\n\n    loggerRef.value?.clear();\n    testResultRef.value?.clear();\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error('Fail to clear output', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst handleOutputChange = (type: typeof active.value.output) => {\n  active.value.output = type;\n};\n\nconst connectLogger = async () => {\n  try {\n    disconnectLogger();\n\n    const type = active.value.type;\n    const resp = await SITE_LOG_MAP[type](logger)!;\n\n    if (isNil(resp)) {\n      active.value.supportLogger = false;\n      MessagePlugin.warning(t('component.terminal.logger.message.noSupport'));\n      return;\n    }\n\n    if (!isNil(resp.abort)) {\n      loggerAbortController.value = resp.abort;\n      MessagePlugin.success(t('component.terminal.logger.message.success'));\n    } else {\n      loggerAbortController.value = null;\n      MessagePlugin.warning(t('component.terminal.logger.message.fail'));\n    }\n    active.value.supportLogger = true;\n  } catch (error) {\n    loggerAbortController.value = null;\n    active.value.supportLogger = true;\n    console.error('Connect logger module error:', error);\n    logger('logger', toHMS(), 'error', error);\n    MessagePlugin.error(`${t('component.terminal.logger.message.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst disconnectLogger = () => {\n  try {\n    if (loggerAbortController.value) {\n      loggerAbortController.value();\n    }\n  } catch {}\n  loggerAbortController.value = null;\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  padding: 0 var(--td-comp-paddingLR-s) var(--td-comp-paddingTB-s) 0;\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n\n  .header {\n    display: flex;\n    align-items: center;\n    flex-direction: row;\n    justify-content: space-between;\n\n    .left-operation-container {\n      display: flex;\n      align-items: center;\n      flex-direction: row;\n      gap: var(--td-size-4);\n\n      .adapter {\n        width: fit-content;\n      }\n\n      .init {\n        padding: 0 var(--td-comp-paddingLR-xs);\n      }\n    }\n\n    .right-operation-container {\n      display: flex;\n      align-items: center;\n      flex-direction: row;\n    }\n  }\n\n  .content {\n    flex: 1;\n    border-radius: var(--td-radius-medium);\n    overflow: hidden;\n\n    .editor-pane {\n      height: 100%;\n\n      .editor-pane-code,\n      .editor-pane-html {\n        height: 100%;\n        border-top: 2px solid var(--td-bg-color-component);\n      }\n    }\n\n    .action-pane {\n      height: 100%;\n\n      .action-pane-dom,\n      .action-pane-data {\n        display: flex;\n        flex-direction: column;\n        gap: var(--td-size-4);\n        padding: var(--td-comp-paddingTB-xs) var(--td-comp-paddingLR-xs);\n        overflow: hidden auto;\n        height: 100%;\n      }\n\n      .action-item {\n        display: flex;\n        flex-direction: column;\n        gap: var(--td-size-4);\n\n        .input-number-item {\n          width: 100%;\n        }\n      }\n\n      .action-base {\n        flex-direction: row;\n      }\n    }\n\n    .output-pane {\n      height: 100%;\n      background-color: var(--td-bg-color-component);\n      display: flex;\n      flex-direction: column;\n      overflow: hidden;\n\n      .output-header {\n        flex: 0;\n        height: calc(var(--td-comp-size-m) + var(--td-comp-paddingLR-xxs));\n        width: 100%;\n        padding: 0 var(--td-comp-paddingLR-s) var(--td-comp-paddingLR-xxs);\n        display: flex;\n        justify-content: space-between;\n        gap: var(--td-size-4);\n\n        .output-header-left {\n          flex: 1 1 auto;\n          height: var(--td-comp-size-m);\n        }\n\n        .output-header-right {\n          flex: 0 0 auto;\n          height: var(--td-comp-size-m);\n          display: flex;\n          align-items: center;\n          gap: var(--td-size-4);\n\n          .output-reconnect,\n          .output-clear {\n            cursor: pointer;\n            color: var(--td-text-color-secondary);\n\n            &:hover {\n              color: var(--td-text-color-primary);\n            }\n          }\n        }\n      }\n\n      .output-content {\n        flex: 1 1 auto;\n        height: 100%;\n        width: 100%;\n        overflow: hidden;\n      }\n    }\n  }\n}\n\n:deep(.t-tabs) {\n  height: 100%;\n\n  .t-tabs__nav-item.t-size-m {\n    height: var(--td-comp-size-m);\n    line-height: var(--td-comp-size-m);\n  }\n\n  .t-tabs__nav--card {\n    background-color: var(--td-bg-color-secondarycontainer);\n\n    &.t-tabs__nav-item {\n      border-color: transparent;\n\n      --ripple-color: transparent;\n\n      &.t-is-active {\n        border-color: var(--td-bg-color-secondarycontainer);\n        border-bottom-color: transparent;\n        border-radius: var(--td-radius-medium) var(--td-radius-medium) 0 0;\n        color: var(--td-text-color-primary);\n        background-color: var(--td-bg-color-component);\n\n        &:first-of-type {\n          border-right: 1px solid var(--td-bg-color-secondarycontainer);\n          border-top-left-radius: 0;\n        }\n\n        &:last-of-type {\n          border-right: 1px solid var(--td-bg-color-secondarycontainer);\n        }\n\n        &:not(:first-of-type) {\n          border-left: 1px solid var(--td-bg-color-secondarycontainer);\n        }\n      }\n\n      &:not(.t-is-disabled, .t-is-active):hover {\n        background-color: transparent;\n      }\n    }\n  }\n\n  .t-tabs__content {\n    background-color: transparent;\n    height: calc(100% - var(--td-comp-size-m));\n    width: 100%;\n    overflow: hidden;\n\n    .t-tab-panel {\n      height: 100%;\n      width: 100%;\n    }\n  }\n\n  &.pane-right {\n    .t-tabs__content {\n      border-right: 2px solid var(--td-bg-color-component);\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/edit/utils/comm.ts",
    "content": "import type { ISiteType } from '@shared/config/film';\nimport { siteTypes } from '@shared/config/film';\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { isNil, isStrEmpty } from '@shared/modules/validate';\n\nimport { DEBUG_PREFIX, SITE_PATH_MAP, SITE_SUFFIX_MAP } from './config';\n\nconst utilsReadFileDialog = async (filePath: string): Promise<string> => {\n  const result = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.FILE_SELECT_FOLDER_READ, {\n    defaultPath: filePath,\n    filters: [\n      { name: 'JavaScript Files', extensions: ['js'] },\n      { name: 'Py Files', extensions: ['py'] },\n      { name: 'All Files', extensions: ['*'] },\n    ],\n  });\n  return result?.content ?? '';\n};\n\nconst utilsWriteFileDialog = async (filePath: string, content: string): Promise<boolean> => {\n  const result = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.FILE_SELECT_FILE_WRITE, content, {\n    defaultPath: filePath,\n  });\n  return !!result?.status;\n};\n\nconst utilsReadFileSilence = async (filePath: string): Promise<string> => {\n  const result = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.FS_FILE_READ, filePath);\n  return result ?? '';\n};\n\nconst utilsWriteFileSilence = async (filePath: string, content: string): Promise<boolean> => {\n  const result = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.FS_FILE_WRITE, filePath, content);\n  return !!result;\n};\n\nconst utilsCommonPath = async (): Promise<string> => {\n  return await window.electron.ipcRenderer.invoke(IPC_CHANNEL.PATH_SYSTEM, 'userData');\n};\n\nconst utilsJoinPath = async (...paths: string[]): Promise<string> => {\n  return await window.electron.ipcRenderer.invoke(IPC_CHANNEL.PATH_JOIN, ...paths);\n};\n\nexport const openFolder = async (type?: ISiteType): Promise<void> => {\n  let path = await getPath(type);\n\n  if (!(await window.electron.ipcRenderer.invoke(IPC_CHANNEL.FS_EXIST, path))) {\n    const commonPath = await utilsCommonPath();\n    path = await utilsJoinPath(commonPath, 'file');\n  }\n\n  await window.electron.ipcRenderer.invoke(IPC_CHANNEL.OPEN_PATH, path);\n};\n\nexport const getPath = async (type?: ISiteType): Promise<string> => {\n  const commonPath = await utilsCommonPath();\n\n  if (isNil(type) || !siteTypes.includes(type)) return commonPath;\n\n  const relativePath = SITE_PATH_MAP[type];\n  if (isStrEmpty(relativePath)) return commonPath;\n\n  return await utilsJoinPath(commonPath, relativePath);\n};\n\nexport const readFile = async (type: ISiteType, mode: 'dialog' | 'silence' = 'silence'): Promise<string> => {\n  const suffix = SITE_SUFFIX_MAP?.[type] ?? 'txt';\n  const prefixPath = (await getPath(type)) ?? '';\n  const path = await utilsJoinPath(prefixPath, `${DEBUG_PREFIX}.${suffix}`);\n  return mode === 'dialog' ? await utilsReadFileDialog(path) : await utilsReadFileSilence(path);\n};\n\nexport const writeFile = async (\n  type: ISiteType,\n  content: string,\n  mode: 'dialog' | 'silence' = 'silence',\n): Promise<boolean> => {\n  const suffix = SITE_SUFFIX_MAP?.[type] ?? 'txt';\n  const prefixPath = (await getPath(type)) ?? '';\n  const path = await utilsJoinPath(prefixPath, `${DEBUG_PREFIX}.${suffix}`);\n  return mode === 'dialog' ? await utilsWriteFileDialog(path, content) : await utilsWriteFileSilence(path, content);\n};\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/edit/utils/config.ts",
    "content": "import { FILE_MANAGE_API } from '@shared/config/env';\nimport { SITE_API_MAP, SITE_TYPE } from '@shared/config/film';\n\nexport const DEBUG_PREFIX = 'debug';\n\nexport const SITE_SUFFIX_MAP = {\n  [SITE_TYPE.T0_XML]: '',\n  [SITE_TYPE.T1_JSON]: '',\n  [SITE_TYPE.T4_DRPYJS0]: 'js',\n  [SITE_TYPE.T4_DRPYS]: 'js',\n  [SITE_TYPE.T3_DRPY]: 'js',\n  [SITE_TYPE.T4_CATVOD]: 'js',\n  [SITE_TYPE.T3_XBPQ]: 'json',\n  [SITE_TYPE.T3_XYQ]: 'json',\n  [SITE_TYPE.T3_APPYSV2]: '',\n  [SITE_TYPE.T3_PY]: 'py',\n  [SITE_TYPE.T3_ALIST]: '',\n  [SITE_TYPE.T3_CATOPEN]: 'js',\n};\n\nexport const SITE_PATH_MAP = {\n  [SITE_TYPE.T0_XML]: '',\n  [SITE_TYPE.T1_JSON]: '',\n  [SITE_TYPE.T4_DRPYJS0]: '',\n  [SITE_TYPE.T4_DRPYS]: 'plugin/drpy-node/spider/js/',\n  [SITE_TYPE.T3_DRPY]: 'file/drpy_dzlive/drpy_js/',\n  [SITE_TYPE.T4_CATVOD]: 'plugin/catvod/',\n  [SITE_TYPE.T3_XBPQ]: 'file/xbpq/',\n  [SITE_TYPE.T3_XYQ]: 'file/xyq/',\n  [SITE_TYPE.T3_APPYSV2]: '',\n  [SITE_TYPE.T3_PY]: 'file/py/',\n  [SITE_TYPE.T3_ALIST]: '',\n  [SITE_TYPE.T3_CATOPEN]: 'file/catopen/',\n};\n\nconst monacoInjectModules = import.meta.glob<{ default?: any }>('./inject/**/suggestions.*', { eager: true });\nconst monacoInjectExtraLibs = import.meta.glob<{ default?: any }>('./inject/**/extraLib.*', {\n  eager: true,\n  query: '?raw',\n});\n\nconst mapMonacoInject = ((\n  suggestions: Record<string, { default?: any }>,\n  extraLibs: Record<string, { default?: any }>,\n) => {\n  const res = {};\n\n  Object.entries(suggestions).forEach(([key, mod]) => {\n    const parts = key.split('/');\n    const type = parts.at(2)!;\n\n    res[type] ||= {};\n    res[type].suggestions = mod?.default ?? null;\n  });\n\n  Object.entries(extraLibs).forEach(([key, mod]) => {\n    const parts = key.split('/');\n    const type = parts.at(2)!;\n\n    res[type] ||= {};\n    res[type].extraLib = mod?.default ?? null;\n  });\n\n  return res;\n})(monacoInjectModules, monacoInjectExtraLibs);\n\nexport const SITE_MONACO_MAP = {\n  [SITE_TYPE.T0_XML]: {\n    language: 'plaintext',\n    suggestions: mapMonacoInject[SITE_TYPE.T0_XML]?.suggestions ?? null,\n    extraLib: mapMonacoInject[SITE_TYPE.T0_XML]?.extraLib ?? null,\n  },\n  [SITE_TYPE.T1_JSON]: {\n    language: 'plaintext',\n    suggestions: mapMonacoInject[SITE_TYPE.T1_JSON]?.suggestions ?? null,\n    extraLib: mapMonacoInject[SITE_TYPE.T1_JSON]?.extraLib ?? null,\n  },\n  [SITE_TYPE.T4_DRPYJS0]: {\n    language: 'javascript',\n    suggestions: mapMonacoInject[SITE_TYPE.T4_DRPYJS0]?.suggestions ?? null,\n    extraLib: mapMonacoInject[SITE_TYPE.T4_DRPYJS0]?.extraLib ?? null,\n  },\n  [SITE_TYPE.T4_DRPYS]: {\n    language: 'javascript',\n    suggestions: mapMonacoInject[SITE_TYPE.T4_DRPYS]?.suggestions ?? null,\n    extraLib: mapMonacoInject[SITE_TYPE.T4_DRPYS]?.extraLib ?? null,\n  },\n  [SITE_TYPE.T3_DRPY]: {\n    language: 'javascript',\n    suggestions: mapMonacoInject[SITE_TYPE.T3_DRPY]?.suggestions ?? null,\n    extraLib: mapMonacoInject[SITE_TYPE.T3_DRPY]?.extraLib ?? null,\n  },\n  [SITE_TYPE.T4_CATVOD]: {\n    language: 'javascript',\n    suggestions: mapMonacoInject[SITE_TYPE.T4_CATVOD]?.suggestions ?? null,\n    extraLib: mapMonacoInject[SITE_TYPE.T4_CATVOD]?.extraLib ?? null,\n  },\n  [SITE_TYPE.T3_XBPQ]: {\n    language: 'json',\n    suggestions: mapMonacoInject[SITE_TYPE.T3_XBPQ]?.suggestions ?? null,\n    extraLib: mapMonacoInject[SITE_TYPE.T3_XBPQ]?.extraLib ?? null,\n  },\n  [SITE_TYPE.T3_XYQ]: {\n    language: 'json',\n    suggestions: mapMonacoInject[SITE_TYPE.T3_XYQ]?.suggestions ?? null,\n    extraLib: mapMonacoInject[SITE_TYPE.T3_XYQ]?.extraLib ?? null,\n  },\n  [SITE_TYPE.T3_APPYSV2]: {\n    language: 'plaintext',\n    suggestions: mapMonacoInject[SITE_TYPE.T3_APPYSV2]?.suggestions ?? null,\n    extraLib: mapMonacoInject[SITE_TYPE.T3_APPYSV2]?.extraLib ?? null,\n  },\n  [SITE_TYPE.T3_PY]: {\n    language: 'python',\n    suggestions: mapMonacoInject[SITE_TYPE.T3_PY]?.suggestions ?? null,\n    extraLib: mapMonacoInject[SITE_TYPE.T3_PY]?.extraLib ?? null,\n  },\n  [SITE_TYPE.T3_CATOPEN]: {\n    language: 'javascript',\n    suggestions: mapMonacoInject[SITE_TYPE.T3_CATOPEN]?.suggestions ?? null,\n    extraLib: mapMonacoInject[SITE_TYPE.T3_CATOPEN]?.extraLib ?? null,\n  },\n  [SITE_TYPE.T3_ALIST]: {\n    language: 'plaintext',\n    suggestions: mapMonacoInject[SITE_TYPE.T3_ALIST]?.suggestions ?? null,\n    extraLib: mapMonacoInject[SITE_TYPE.T3_ALIST]?.extraLib ?? null,\n  },\n};\n\nexport const SITE_DIFF_DEBUG_MAP = {\n  [SITE_TYPE.T0_XML]: { type: SITE_TYPE.T0_XML, api: '', ext: '' },\n  [SITE_TYPE.T1_JSON]: { type: SITE_TYPE.T1_JSON, api: '', ext: '' },\n  [SITE_TYPE.T4_DRPYJS0]: { type: SITE_TYPE.T4_DRPYJS0, api: '', ext: '' },\n  [SITE_TYPE.T4_DRPYS]: {\n    type: SITE_TYPE.T4_DRPYS,\n    api: `http://127.0.0.1:5757/api/${DEBUG_PREFIX}`,\n    ext: '',\n  },\n  [SITE_TYPE.T3_DRPY]: {\n    type: SITE_TYPE.T3_DRPY,\n    api: SITE_API_MAP[SITE_TYPE.T3_DRPY],\n    ext: `${FILE_MANAGE_API}/drpy_dzlive/drpy_js/${DEBUG_PREFIX}.js`,\n  },\n  [SITE_TYPE.T4_CATVOD]: { type: SITE_TYPE.T4_CATVOD, api: '', ext: '' },\n  [SITE_TYPE.T3_XBPQ]: { type: SITE_TYPE.T3_XBPQ, api: '', ext: '' },\n  [SITE_TYPE.T3_XYQ]: { type: SITE_TYPE.T3_XYQ, api: '', ext: '' },\n  [SITE_TYPE.T3_APPYSV2]: { type: SITE_TYPE.T3_APPYSV2, api: '', ext: '' },\n  [SITE_TYPE.T3_PY]: {\n    type: SITE_TYPE.T3_PY,\n    api: `${FILE_MANAGE_API}/py/${DEBUG_PREFIX}.py`,\n    ext: '',\n  },\n  [SITE_TYPE.T3_CATOPEN]: { type: SITE_TYPE.T3_CATOPEN, api: `${FILE_MANAGE_API}/catopen/${DEBUG_PREFIX}.js`, ext: '' },\n  [SITE_TYPE.T3_ALIST]: { type: SITE_TYPE.T3_ALIST, api: '', ext: '' },\n};\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/edit/utils/inject/7/extraLib.d.ts",
    "content": "/**\n * RSA 加密解密工具定义\n */\ndeclare const RSA: {\n  /**\n   * 解密数据\n   * @param data 待解密的字符串数据\n   * @param key 解密所用的密钥\n   * @param option 解密选项，包含分段解密时的块大小 默认分段长度为117\n   * @param option.chunkSize 分段解密时的块大小，默认为117\n   * @returns 解密后的字符串数据，若 JSEncrypt 未定义则返回 false\n   */\n  decode: (data: string, key: string, option?: { chunkSize?: number }) => string | false;\n  /**\n   * 加密数据\n   * @param data 待加密的字符串数据\n   * @param key 加密所用的密钥\n   * @param option 加密选项，包含分段加密时的块大小  默认分段长度为117\n   * @param option.chunkSize 分段解密时的块大小，默认为117\n   * @returns 加密后的字符串数据，若 JSEncrypt 未定义则返回 false\n   */\n  encode: (data: string, key: string, option?: { chunkSize?: number }) => string | false;\n\n  /**\n   * 修正密钥格式，确保其有正确的前缀和后缀\n   * @param key 需要修正的原始密钥字符串\n   * @param prefix 密钥前缀字符串\n   * @param endfix 密钥后缀字符串\n   * @returns 格式修正后的密钥字符串\n   */\n  fixKey: (key: string, prefix: string, endfix: string) => string;\n  /**\n   * 从给定的密钥材料中获取私钥字符串，确保其格式正确\n   * @param key 密钥材料字符串\n   * @returns 格式正确的私钥字符串\n   */\n  getPrivateKey: (key: string) => string;\n\n  /**\n   * 从给定的密钥材料中获取公钥字符串，确保其格式正确\n   * @param key 密钥材料字符串\n   * @returns 格式正确的公钥字符串\n   */\n  getPublicKey: (key: string) => string;\n};\n\n/**\n * OcrApi 验证码识别工具定义\n */\ndeclare const OcrApi: {\n  /**\n   * ocr识别接口属性。可以使用后缀为 drpy/text或者 b64/text 的接口。默认值为 https://api.nn.ci/ocr/b64/text\n   */\n  api: string;\n  /**\n   * ocr识别图片验证码\n   * @param img 验证码图片的base64编码，不带图片格式前缀文本\n   * @returns 识别后的结果字符串，若 识别失败或者发生错误 则返回 空字符串''\n   */\n  classification: (img: string) => string;\n};\n\n/**\n * 检查宝塔验证并自动跳过获取正确源码\n * @param html 之前获取的html\n * @param url 之前的来源url\n * @param obj 来源obj\n * @returns \\{string|DocumentFragment|*\\} 返回请求结果\n */\ndeclare function checkHtml(html: string, url: string, obj: object): any;\n\n/**\n * 获取规则\n * @param key 获取规则对象的某个属性。不传则获取整个规则\n */\ndeclare function getRule(key: string | null): any;\n\n/**\n * 执行一个含main函数的字符串并得到drpy任意结果\n * @param main_func_code 带有main函数的字符串比如 function main(){return rule} 或者 function main(){return VERSION}\n * @param arg 运行main函数的传参\n */\ndeclare function runMain(main_func_code: string, arg: object | string): any;\n\n/**\n * 首页分类解析，筛选暂未实现\n * @param homeObj 首页传参对象\n * @returns \\{string\\}\n */\ndeclare function homeParse(homeObj: object): string;\n\n/**\n *  首页推荐列表解析\n * @param homeVodObj\n * @returns \\{string\\}\n */\ndeclare function homeVodParse(homeVodObj: object): string;\n\n/**\n * 一级分类页数据解析\n * @param cateObj\n * @returns \\{string\\}\n */\ndeclare function categoryParse(cateObj: object): string;\n\n/**\n * 搜索列表数据解析\n * @param searchObj\n * @returns \\{string\\}\n */\ndeclare function searchParse(searchObj: object): string;\n\n/**\n * 二级详情页数据解析\n * @param detailObj\n * @returns \\{string\\}\n */\ndeclare function detailParse(detailObj: object): string;\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/edit/utils/inject/7/suggestions.ts",
    "content": "/**\n * 自定义代码片段\n */\nconst Snippet = [\n  {\n    label: 'ifelse',\n    insertText: `if (\\${1:condition}) {\n  \\t$0\n} else {\n  \\t\n}\n    `,\n    detail: '普通if-else',\n    documentation: `if (condition) {\n\n} else {\n\n}`,\n  },\n  {\n    label: 'for',\n    insertText: `for (let \\${1:i} = 0; \\${1:i} < \\${2:array}.length; \\${1:i}++) {\n  let \\${3:data} = \\${2:array}[\\${1:i}];\n  \\$0\n}`,\n    detail: '普通 for 循环',\n    documentation: `for (let i = 0; i < array.length; i++) {\n  let data = array[i];\n\n}`,\n  },\n  {\n    label: 'forof',\n    insertText: `for (let data of \\${1:array}) {\n  \\$0\n}`,\n    detail: 'for-of(遍历数组推荐)',\n    documentation: `for (let data of array) {\n\n}`,\n  },\n  {\n    label: 'forin',\n    insertText: `for (let key in \\${1:object}) {\n  let data = \\${1:object}[key];\n  \\$0\n}`,\n    detail: 'for-in(遍历对象推荐)',\n    documentation: `for (let key in object) {\n  let data = object[key];\n\n}`,\n  },\n  {\n    label: '$js',\n    insertText: `\\\\$js.toString(()=>{\n    $0\n})`,\n    detail: '$js工具',\n    documentation: `$js.toString(()=>{\n\n})`,\n  },\n  {\n    label: '$rule',\n    insertText: `\nvar rule = {\n  类型:'影视',//影视|听书|漫画|小说\n  title:'',\n  host:'',\n  url:'',\n  searchUrl:'',\n  searchable:2,\n  quickSearch:0,\n  filterable:1,\n  filter:'',\n  filter_url:'',\n  filter_def:{},\n  headers:{\n      'User-Agent':'MOBILE_UA',\n  },\n  timeout:5000,\n  class_parse:'#side-menu li;a&&Text;a&&href;/(.*?)\\\\.html',\n  cate_exclude:'',\n  play_parse:true,\n  lazy:\\\\$js.toString(()=>{\n    input = {parse:1,url:input,js:''};\n  }),\n  double:true,\n  推荐:'列表1;列表2;标题;图片;描述;链接;详情',\n  一级:'列表;标题;图片;描述;链接;详情',\n  二级:{\n    title:'vod_name;vod_type',\n    img:'图片链接',\n    desc:'主要信息;年代;地区;演员;导演',\n    content:'简介',\n    tabs:'',\n    lists:'xx:eq(#id)&&a',\n    tab_text:'body&&Text',\n    list_text:'body&&Text',\n    list_url:'a&&href',\n    list_url_prefix: '',\n  },\n  搜索:'列表;标题;图片;描述;链接;详情',\n}\n    `.trim(),\n    detail: '常用简单列表定位规则写法',\n    documentation: `var rule = {};`,\n  },\n  {\n    label: '$ruleJs',\n    insertText: `\nvar rule = {\n  类型:'影视',//影视|听书|漫画|小说\n  title:'',\n  host:'',\n  url:'',\n  searchUrl:'',\n  searchable:2,\n  quickSearch:0,\n  filterable:1,\n  filter:'',\n  filter_url:'',\n  headers:{\n      'User-Agent':'MOBILE_UA',\n  },\n  timeout:5000,\n  class_parse:'#side-menu li;a&&Text;a&&href;/(.*?)\\\\.html',\n  cate_exclude:'',\n  play_parse:true,\n  double:true,\n  推荐:\\\\$js.toString(()=>{\n    let html=request(input);\n    let data=pdfa(html,'');\n    VODS = [];\n  }),\n  一级:\\\\$js.toString(()=>{\n    let html=request(input);\n    let data=pdfa(html,'');\n    VODS = [];\n  }),\n  二级:\\\\$js.toString(()=>{\n    let html=request(input);\n    let vod_name=pdfh(html,'.title&&Text');\n    VOD = {vod_name:vod_name};\n  }),\n  搜索:\\\\$js.toString(()=>{\n    let html=request(input);\n    let data=pdfa(html,'');\n    VODS = [];\n  }),\n  lazy:\\\\$js.toString(()=>{\n    input = {parse:0,url:input,js:''};\n  }),\n}\n    `.trim(),\n    detail: '常用简单纯JS规则写法',\n    documentation: `var rule = {};`,\n  },\n  {\n    label: '$ruleInherit',\n    insertText: `\nvar rule = {\n  title:'cokemv',\n  模板:'mxpro',\n  host:'https://cokemv.me',\n  class_parse:\\`.navbar-items li:gt(1):lt(7);a&&Text;a&&href;/(\\\\\\\\d+).html\\`,\n}\n    `.trim(),\n    detail: '简单继承写法',\n    documentation: `var rule = {};`,\n  },\n  {\n    label: '$Object',\n    insertText: `\nObject.assign(muban.mxone5.二级,{\n    //tabs: '.module-tab-item',\n    lists: '.module-row-one:eq(#id)&&a.module-row-text',\n    list_text:'h4&&Text',\n    list_url:'a&&data-clipboard-text',\n});\n    `.trim(),\n    detail: '继承模板前修改模板的二级属性',\n    documentation: `Object.assign(muban.xx模板.xx属性,{})`,\n  },\n  {\n    label: '$getOriginalJs',\n    insertText: `\nlet a = \\`\\`.trim();\nconsole.log(getOriginalJs(a));\n    `.trim(),\n    detail: '获取加密前的js源代码',\n    documentation: `getOriginalJs(js_code)`,\n  },\n  {\n    label: '$ruleTemplate',\n    insertText: `\nvar rule = {\n    类型:'影视',//影视|听书|漫画|小说\n    title:'规则标题',\n    编码:'utf-8',\n    搜索编码:'utf-8',\n    host:'网页的域名根',\n    hostJs:'print(HOST);let html=request(HOST,{headers:{\"User-Agent\":PC_UA}});let src = jsp.pdfh(html,\"ul&&li&&a&&href\");print(src);HOST=src.replace(\"/index.php\",\"\")',\n    homeUrl:'/latest/',\n    url:'/fyclass/fypage.html[/fyclass/]',\n    detailUrl:'https://yanetflix.com/voddetail/fyid.html',\n    searchUrl:'',\n    searchable:2,\n    quickSearch:0,\n    filterable:1,\n    filter:{},\n    filter_def:{\n        1:{\n        年份:'2024',\n        },\n    },\n    filter_url:'style={{fl.style}}&zone={{fl.zone}}&year={{fl.year}}&fee={{fl.fee}}&order={{fl.order}}',\n    headers:{\n        'User-Agent':'MOBILE_UA',\n        \"Cookie\": \"searchneed=ok\"\n    },\n    timeout:5000,\n    class_name:'电影&电视剧&动漫&综艺',\n    class_url:'1&2&3&4',\n    class_parse:'#side-menu:lt(1) li;a&&Text;a&&href;com/(.*?)/',\n    cate_exclude:'',\n    tab_exclude:'',\n    tab_remove:['tkm3u8'],\n    tab_order:['lzm3u8','wjm3u8','1080zyk','zuidam3u8','snm3u8'],\n    tab_rename:{'lzm3u8':'量子','1080zyk':'1080看','zuidam3u8':'最大资源','kuaikan':'快看',\n    'bfzym3u8':'暴风','ffm3u8':'非凡','snm3u8':'索尼','tpm3u8':'淘片','tkm3u8':'天空',},\n    play_parse:true,\n    play_json:[{\n        re:'*',\n        json:{\n            jx:1,\n            parse:1,\n        },\n    }],\n    pagecount:{\"1\":1,\"2\":1,\"3\":1,\"4\":1,\"5\":1,\"7\":1,\"时间表\":1},\n    lazy:'',\n    limit:6,\n    double:true,\n    图片来源:'@Referer=http://www.jianpianapp.com@User-Agent=jianpian-version350',\n    图片替换:'https://www.keke6.app/=>https://vres.a357899.cn/',\n    预处理:'rule_fetch_params.headers.Cookie = \"xxxx\";',\n    推荐:'列表;标题;图片;描述;链接;详情',\n    一级:'列表;标题;图片;描述;链接;详情',\n    二级访问前:'log(MY_URL);let jump=request(MY_URL).match(/href=\"(.*?)\"/)[1];log(jump);MY_URL=urljoin2(MY_URL,jump)',\n    二级:{\n      title:'vod_name;vod_type',\n      img:'图片链接',\n      desc:'主要信息;年代;地区;演员;导演',\n      content:'简介',\n      tabs:'',\n      lists:'',\n      tab_text:'body&&Text',\n      list_text:'body&&Text',\n      list_url:'a&&href',\n      list_url_prefix: '',\n    },\n    搜索:'列表;标题;图片;描述;链接;详情',\n    proxy_rule:\\`js:\n    log(input);\n    input = [200,'text;plain','hello drpy']\n    \\`,\n    sniffer:1,\n    isVideo:\"http((?!http).){26,}\\\\\\\\.(m3u8|mp4|flv|avi|mkv|wmv|mpg|mpeg|mov|ts|3gp|rm|rmvb|asf|m4a|mp3|wma)\",\n    isVideo:\\`js:\n    log(input);\n    if(/m3u8/.test(input)){\n    input = true\n    }else{\n    input = false\n    }\n    \\`,\n}\n    `.trim(),\n    detail: '快捷规则带参说明',\n    documentation: `var rule = {};`,\n  },\n  {\n    label: 'list.map',\n    insertText: `list.map((item,index)=>{\n  $1\n})`,\n    detail: 'list.map',\n    documentation: `list.map((item,index)=>{\n\n    })`,\n  },\n  {\n    label: 'd.pushit',\n    insertText: `d.push({\n  title: \"$1\",\n  desc:\"\",\n  img:\"\",\n  url:\"$2\"\n})`,\n    detail: '海阔d.push',\n    documentation: `d.push({\n  title: '',\n  desc:'',\n  img:'',\n  url:''\n})`,\n  },\n];\n\n/**\n * 自定义函数\n */\nconst Function = [\n  {\n    label: 'getProxyUrl',\n    insertText: \"getProxyUrl()+'&url='\",\n    detail: '获取本地代理链接',\n    documentation: 'getProxyUrl()',\n  },\n  {\n    label: 'gzip',\n    insertText: 'gzip($0)',\n    detail: 'gzip压缩',\n    documentation: 'gzip(string)',\n  },\n  {\n    label: 'ungzip',\n    insertText: 'ungzip($0)',\n    detail: 'ungzip 解压',\n    documentation: `ungzip(base64)`,\n  },\n  {\n    label: 'uint8ArrayToBase64',\n    insertText: 'uint8ArrayToBase64($0)',\n    detail: 'uint8数组转Base64',\n    documentation: `uint8ArrayToBase64(uint8Array)`,\n  },\n  {\n    label: 'Utf8ArrayToStr',\n    insertText: 'Utf8ArrayToStr($0)',\n    detail: 'Utf8数组转字符串',\n    documentation: `Utf8ArrayToStr(array)`,\n  },\n  {\n    label: 'rsa.encode',\n    insertText: 'RSA.encode($1,\"$2\",null)',\n    detail: 'rsa加密',\n    documentation: `RSA.encode(data, key, option)`,\n  },\n  {\n    label: 'rsa.decode',\n    insertText: 'RSA.decode($1,\"$2\",null)',\n    detail: 'rsa解密',\n    documentation: `RSA.decode(data, key, option)`,\n  },\n  {\n    label: 'rsa_demo_test',\n    insertText: 'rsa_demo_test()',\n    detail: 'rsa测试案例',\n    documentation: `rsa_demo_test()`,\n  },\n  {\n    label: 'ocr_demo_test',\n    insertText: 'ocr_demo_test()',\n    detail: 'ocr识别验证码测试案例',\n    documentation: `ocr_demo_test()`,\n  },\n  {\n    label: 'fixAdM3u8',\n    insertText: 'fixAdM3u8($1,$2,$3)',\n    detail: '根据正则处理原始m3u8里的广告ts片段，自动修复相对链接',\n    documentation: `fixAdM3u8(m3u8_text, m3u8_url, ad_remove)`,\n  },\n  {\n    label: 'fixAdM3u8Ai',\n    insertText: 'fixAdM3u8Ai($1)',\n    detail: '智能对比去除广告。支持嵌套m3u8。只需要传入播放地址',\n    documentation: `fixAdM3u8Ai(m3u8_url)`,\n  },\n  {\n    label: 'stringify',\n    insertText: 'stringify($1)',\n    detail: 'js对象转json文本',\n    documentation: `stringify(object)\\nJSON.stringify的简写`,\n  },\n  {\n    label: 'urlencode',\n    // eslint-disable-next-line no-template-curly-in-string\n    insertText: 'urlencode(${1:input})',\n    detail: 'url编码-常用于将base64编码转url编码',\n    documentation: 'urlencode(string)\\n全部字符串都会被编码',\n  },\n  {\n    label: 'encodeUrl',\n    // eslint-disable-next-line no-template-curly-in-string\n    insertText: 'encodeUrl(${1:input})',\n    detail: 'url编码-同encodeURL',\n    documentation: 'encodeUrl(string)\\n部分中文和特殊字符串才会被编码',\n  },\n  {\n    label: 'encodeStr',\n    insertText: 'encodeStr($1,$2)',\n    detail: '字符串指定编码',\n    documentation: 'encodeStr(input,encoding=\"gbk\")',\n  },\n  {\n    label: 'decodeStr',\n    insertText: 'decodeStr($1,$2)',\n    detail: '字符串指定解码',\n    documentation: 'decodeStr(input,encoding=\"gbk\")',\n  },\n  {\n    label: 'jinja2',\n    insertText: 'cheerio.jinja2($1,{fl:fl})',\n    detail: 'jinja2模板渲染',\n    documentation: 'cheerio.jinja2(url,{fl:fl)',\n  },\n  {\n    label: 'base64Encode',\n    insertText: 'base64Encode($1)',\n    detail: 'base64编码',\n    documentation: 'base64Encode(string)',\n  },\n  {\n    label: 'base64Decode',\n    insertText: 'base64Decode($1)',\n    detail: 'base64解码',\n    documentation: 'base64Decode(string)',\n  },\n  {\n    label: 'md5',\n    insertText: 'md5($0)',\n    detail: 'md5加密',\n    documentation: 'md5(string)',\n  },\n  {\n    label: 'log',\n    insertText: 'log($0)',\n    detail: '打印日志(文本)',\n    documentation: 'log(string)',\n  },\n  {\n    label: 'print',\n    insertText: 'print($0)',\n    detail: '打印日志(文本)',\n    documentation: 'print(string)',\n  },\n  {\n    label: 'urljoin',\n    insertText: 'urljoin($1,$2)',\n    detail: '路径拼接 urljoin(from,to)',\n    documentation: 'urljoin(from,to)',\n  },\n  {\n    label: 'urljoin2',\n    insertText: 'urljoin2($1,$2)',\n    detail: '路径拼接 urljoin2(from,to)',\n    documentation: 'urljoin2(from,to)',\n  },\n  {\n    label: 'pdfa',\n    insertText: 'pdfa($1,$2)',\n    detail: '提取列表',\n    documentation: '例子:pdfa(item,\"body&&a\")',\n  },\n  {\n    label: 'pdfh',\n    insertText: 'pdfh($1,$2)',\n    detail: '提取文本',\n    documentation: '例子:pd(item,\"a&&Text\")',\n  },\n  {\n    label: 'pd',\n    insertText: 'pd($1,$2,$3)',\n    detail: '提取链接或者图片地址',\n    documentation: '例子:pd(item,\"a&&href\",\"http://xx.com/api\")',\n  },\n  {\n    label: 'getQuery',\n    insertText: 'getQuery($1)',\n    detail: '链接的query转为字典(url)',\n    documentation: 'getQuery(url)',\n  },\n  {\n    label: 'setItem',\n    insertText: 'setItem($1,$2)',\n    detail: '存在数据库配置表里, key字段对应值value,没有就新增,有就更新,调用此方法会清除key对应的内存缓存',\n    documentation: 'setItem(k,v)',\n  },\n  {\n    label: 'getItem',\n    insertText: 'getItem($1,$2)',\n    detail: '获取数据库配置表对应的key字段的value，没有这个key就返回value默认传参.需要有缓存,第一次获取后会存在内存里',\n    documentation: 'getItem(k,v)',\n  },\n  {\n    label: 'clearItem',\n    insertText: 'clearItem($1)',\n    detail: '删除数据库key对应的一条数据,并清除此key对应的内存缓存',\n    documentation: 'clearItem(k)',\n  },\n  {\n    label: 'buildUrl',\n    insertText: 'buildUrl($1,$2)',\n    detail: 'get参数编译链接,类似python params字典自动拼接',\n    documentation: 'buildUrl(url,obj)',\n  },\n  {\n    label: '$require',\n    insertText: '\\\\$require(\"$1\")',\n    detail: 'eval执行一段远程js链接',\n    documentation: '$require(url)',\n  },\n  {\n    label: 'getCode',\n    insertText: 'getCode($1)',\n    detail: '带一次宝塔验证的源码获取',\n    documentation: 'getCode(url)',\n  },\n  {\n    label: 'getHtml',\n    insertText: 'getHtml($1)',\n    detail: '源rule专用的请求方法,自动注入cookie',\n    documentation: 'getHtml(url)',\n  },\n  {\n    label: 'req',\n    insertText: 'req($1,{})',\n    detail: '构造网页请求-原始',\n    documentation: 'req(url,object)',\n  },\n  {\n    label: 'request',\n    insertText: 'request($1,{})',\n    detail: '构造网页请求-封装',\n    documentation: 'request(url,object)',\n  },\n  {\n    label: 'post',\n    insertText: 'post($1,{})',\n    detail: 'post请求-封装',\n    documentation: 'post(url,object)',\n  },\n  {\n    label: 'reqCookie',\n    insertText: 'reqCookie($1,{})',\n    detail: '获取网页cookie',\n    documentation: `\n/**\n * 快捷获取特殊地址cookie|一般用作搜索过验证\n * 用法 let {cookie,html} = reqCookie(url);\n * @param url 能返回cookie的地址\n * @param obj 常规请求参数\n * @param all_cookie 返回全部cookie.默认false只返回第一个,一般是PhpSessionId\n * @returns {{cookie: string, html: (*|string|DocumentFragment)}}\n */\n    `.trim(),\n  },\n  {\n    label: 'batchFetch',\n    insertText: 'batchFetch($1)',\n    detail: '批量请求',\n    documentation: `\n/**\n * 发起批量请求|一般批量搜索，批量二级请求列表数据\n * 示例：var data = batchFetch([{url:'http://www.a.cn', options:{headers:{},body:'a=1&b=2',method:'POST'}}, {url:'http://www.b.cn'}]);setError(data[0] + '=====' + data[1]);\n * 说明：参数为一个数组，数组每一项是一个对象，每个对象包含url和options属性，分别对应fetch方法的第一二个参数，返回一个字符串数组对象，注意是对象，顺序和参数顺序严格一致\n * 注意：数组参数长度超过16时，会自动分批，同步循环执行，比如20个参数，那么会先16个并发请求，请求完再发起4个并发请求，最后再返回结果\n * @param list 待批量的链接和options的object列表如 [{url:'',options:{}]\n * @returns [html,html,null,html]\n */\n    `.trim(),\n  },\n  {\n    label: 'dealJson',\n    insertText: 'dealJson($1)',\n    detail: '处理返回的json数据',\n    documentation: 'dealJson(json)',\n  },\n  {\n    label: 'getHome',\n    insertText: 'getHome($1)',\n    detail: '获取链接的host',\n    documentation: 'getHome(url)',\n  },\n  {\n    label: 'NODERSA.sign',\n    insertText: 'NODERSA.sign($1,$2,{})',\n    detail: 'rsa加签',\n    documentation: `\nNODERSA.sign(\"1\", pkcs1_private, {\n    outputEncoding: \"base64\",\n    options: {environment: \"browser\", encryptionScheme: 'pkcs1', signingScheme: \"pkcs1-sha256\"},\n})\n    `.trim(),\n  },\n  {\n    label: 'NODERSA.verify',\n    insertText: 'NODERSA.sign($1,$2,$3,{})',\n    detail: 'rsa验签',\n    documentation: `\nNODERSA.verify(\"1\", \"Oulx2QrgeipKYBtqEDqFb2s/+ndk2cGQxO4CkhU7iBM1vyNmmvqubpsmeoUuN3waGrYZLknSEdwBkfv0tUMpFQ==\", pkcs1_private, {\n  options: {environment: \"browser\", encryptionScheme: 'pkcs1', signingScheme: \"pkcs1-sha256\"},\n})\n    `.trim(),\n  },\n  {\n    label: 'NODERSA.encryptRSAWithPublicKey',\n    insertText: 'NODERSA.encryptRSAWithPublicKey($1,$2,{})',\n    detail: 'rsa公钥加密',\n    documentation: `\nNODERSA.encryptRSAWithPublicKey(data, pkcs1_public, {\n  // PublicFormat: \"pkcs1-public-pem\",\n  outputEncoding: \"base64\",\n  options: {environment: \"browser\", encryptionScheme: 'pkcs1_oaep'},\n})\n    `.trim(),\n  },\n  {\n    label: 'NODERSA.decryptRSAWithPrivateKey',\n    insertText: 'NODERSA.decryptRSAWithPrivateKey($1,$2,{})',\n    detail: 'rsa私钥解密',\n    documentation: `\nNODERSA.decryptRSAWithPrivateKey(encryptedWithPublic, pkcs1_private, {\n  // PublicFormat: \"pkcs1-private\",\n  // outEncoding: \"hex\"\n  options: {environment: \"browser\", encryptionScheme: 'pkcs1_oaep'},\n})\n    `.trim(),\n  },\n  {\n    label: 'NODERSA.NodeRSA',\n    insertText: 'NODERSA.NodeRSA({$1})',\n    detail: 'rsa测试',\n    documentation: `\nlet key = new NODERSA.NodeRSA({b: 1024});\nkey.setOptions({encryptionScheme: 'pkcs1'})\nlet text = \\`你好drpy node-ras\\`;\nlet encrypted = key.encrypt(text, 'base64');\nconsole.log('encrypted: ', encrypted);\nconst decrypted = key.decrypt(encrypted, 'utf8');\nconsole.log('decrypted: ', decrypted);\n        `.trim(),\n  },\n];\n\n/**\n * 自定义关键词\n */\nconst Keyword = [\n  {\n    label: 'setResult',\n    insertText: 'setResult(d)',\n    detail: '海阔写法设置一级或搜索列表数据',\n    documentation: 'setResult(d)',\n  },\n  {\n    label: 'setResult2',\n    insertText: 'setResult2(d)',\n    detail: '设置cms的完整json数据为drpy的一级、搜索列表数据',\n    documentation: 'setResult2(d)',\n  },\n  {\n    label: 'setHomeResult',\n    insertText: 'setHomeResult(d)',\n    detail: '同海阔，跟setResult的区别在于数据格式为{list:[]}',\n    documentation: 'setHomeResult(d)',\n  },\n  {\n    label: 'Referer',\n    insertText: 'Referer',\n    detail: 'headers里的属性-访问来源',\n    documentation: 'headers里的属性之一',\n  },\n  {\n    label: 'User-Agent',\n    insertText: 'User-Agent',\n    detail: 'headers里的属性-请求头',\n    documentation: 'headers里的属性之一',\n  },\n  {\n    label: 'Content-Type',\n    insertText: 'Content-Type',\n    detail: 'headers里的属性-请求数据格式',\n    documentation: 'headers里的属性之一',\n  },\n  {\n    label: 'MOBILE_UA',\n    insertText: 'MOBILE_UA',\n    detail: '应用注入的手机UA',\n    documentation:\n      'Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36',\n  },\n  {\n    label: 'PC_UA',\n    insertText: 'PC_UA',\n    detail: '应用注入的电脑UA',\n    documentation:\n      'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36',\n  },\n  {\n    label: 'toBase64',\n    insertText: 'toBase64:true,',\n    detail: '获取response的base64编码',\n    documentation: 'reqCookie(url,{toBase64:true}',\n  },\n  {\n    label: 'headers',\n    insertText:\n      \"headers:{ 'User-Agent': PC_UA, 'Referer': '', 'content-type': 'application/x-www-form-urlencoded', 'Cookie': ''}\",\n    detail: '常用headers参数',\n    documentation:\n      \"headers:{ 'User-Agent': PC_UA, 'Referer': '', 'content-type': 'application/x-www-form-urlencoded', 'Cookie': ''}\",\n  },\n  {\n    label: 'tab_exclude',\n    insertText: \"tab_exclude:'排序',\",\n    detail: '二级线路名称排除',\n    documentation: \"tab_exclude:'排序|榜单|猜你喜欢'\",\n  },\n  {\n    label: 'cate_exclude',\n    insertText: \"cate_exclude:'今日更新|热榜',\",\n    detail: '一级分类名称排除',\n    documentation: \"cate_exclude:'今日更新|热榜'\",\n  },\n  {\n    label: 'tab_rename',\n    insertText: \"tab_rename: {'道长在线': '在线播放'},\",\n    detail: '一级分类名称排除',\n    documentation: \"tab_rename: {'道长在线': '在线播放'}\",\n  },\n  {\n    label: 'tab_order',\n    insertText: \"tab_order:['超清', '蓝光', '极速蓝光'],\",\n    detail: '二级线路排序',\n    documentation: \"tab_order:['超清', '蓝光', '极速蓝光']'\",\n  },\n  {\n    label: 'tab_remove',\n    insertText: \"tab_remove:['wjm3u8','ikm3u8','sdm3u8','M3U8','jinyingm3u8','fsm3u8','ukm3u8'],\",\n    detail: '移除二级对应线路名相关的数据',\n    documentation: \"tab_remove:['wjm3u8','ikm3u8','sdm3u8','M3U8','jinyingm3u8','fsm3u8','ukm3u8']'\",\n  },\n  {\n    label: 'list_url_prefix',\n    insertText: \"list_url_prefix: 'push://',\",\n    detail: '二级选集链接前缀',\n    documentation: '网盘类链接加push://自动推送至壳子处理',\n  },\n  {\n    label: 'search_url',\n    insertText: `\nsearchUrl: '/index.php/ajax/suggest?mid=1&wd=**',\ndetailUrl: '/detail/fyid.html',\n搜索: 'json:list;name;pic;en;id',\n    `.trim(),\n    detail: '快速联想搜索',\n    documentation: '处理一些开了搜索验证的网站',\n  },\n];\n\n/**\n * 自定义变量\n */\nconst Variable = [\n  {\n    label: 'rule_fetch_params',\n    insertText: 'rule_fetch_params',\n    detail: '源自带的请求参数',\n    documentation: '原始参数不允许修改',\n  },\n  {\n    label: 'fetch_params',\n    insertText: 'fetch_params',\n    detail: '可变变量，每次请求时使用的请求参数',\n    documentation: 'fetch_params.headers={}',\n  },\n  {\n    label: 'rule',\n    insertText: 'rule',\n    detail: '源本身的对象',\n    documentation: '可以对顶层源对象的属性进行操作',\n  },\n  {\n    label: 'HOST',\n    insertText: 'HOST',\n    detail: '源主页地址',\n    documentation: '只能用在hostJs',\n  },\n  {\n    label: 'TYPE',\n    insertText: 'TYPE',\n    detail: '标识js的执行环境，是主页。一级还是搜索等',\n    documentation: \"if(TYPE == 'home')\",\n  },\n  {\n    label: 'input',\n    insertText: 'input',\n    detail: '一级二级搜索lazy的传入url',\n    documentation: 'input',\n  },\n  {\n    label: 'VODS',\n    insertText: 'VODS',\n    detail: '一级、推荐、搜索的cms列表变量',\n    documentation: 'VODS=[{vod_id,vod_name,vod_pic,vod_remarks}]',\n  },\n  {\n    label: 'VOD',\n    insertText: 'VOD',\n    detail: '二级的cms详情变量',\n    documentation: 'VOD',\n  },\n  {\n    label: 'TABS',\n    insertText: 'TABS',\n    detail: '二级的tabs自定义js',\n    documentation: 'TABS',\n  },\n  {\n    label: 'LISTS',\n    insertText: 'LISTS',\n    detail: '二级的lists自定义js',\n    documentation: 'LISTS',\n  },\n  {\n    label: 'MY_URL',\n    insertText: 'MY_URL',\n    detail: '获取当前网络请求地址',\n    documentation: '一级和二级js里通用',\n  },\n  {\n    label: 'MY_CATE',\n    insertText: 'MY_CATE',\n    detail: '一级分类传入的tid',\n    documentation: '仅在一级的js里可用',\n  },\n  {\n    label: 'MY_FL',\n    insertText: 'MY_FL',\n    detail: '一级分类传入的筛选',\n    documentation: '仅在一级的js里可用',\n  },\n  {\n    label: 'MY_PAGE',\n    insertText: 'MY_PAGE',\n    detail: '一级分类或搜索传入的页数',\n    documentation: '仅在一级和搜索的js里可用',\n  },\n  {\n    label: 'MY_FLAG',\n    insertText: 'MY_FLAG',\n    detail: 'lazy里传入的flag',\n    documentation: '仅在lazy的js里可用, 等同flag',\n  },\n  {\n    label: 'flag',\n    insertText: 'flag',\n    detail: 'lazy里传入的flag',\n    documentation: '仅在lazy的js里可用',\n  },\n  {\n    label: 'KEY',\n    insertText: 'KEY',\n    detail: '搜索传入的搜索关键词',\n    documentation: '仅在搜索的js里可用',\n  },\n  {\n    label: 'UA',\n    insertText: 'UA',\n    detail: '最简ua',\n    documentation: 'Mozilla/5.0',\n  },\n  {\n    label: 'UC_UA',\n    insertText: 'UC_UA',\n    detail: 'uc浏览器的ua',\n    documentation:\n      'Mozilla/5.0 (Linux; U; Android 9; zh-CN; MI 9 Build/PKQ1.181121.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.5.5.1035 Mobile Safari/537.36',\n  },\n  {\n    label: 'IOS_UA',\n    insertText: 'IOS_UA',\n    detail: '苹果设备的ua',\n    documentation:\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',\n  },\n];\n\nconst createDependencyProposals = (range: object, monaco: any) => {\n  const suggestions: Array<any> = [];\n\n  // 代码片段\n  // eslint-disable-next-line ts/no-unused-vars\n  const suggestions_27 = Snippet.map((it) => {\n    Object.assign(it, {\n      kind: monaco.languages.CompletionItemKind.Snippet,\n      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n      range,\n    });\n    suggestions.push(it);\n    return it;\n  });\n\n  // 函数\n  // eslint-disable-next-line ts/no-unused-vars\n  const suggestions_1 = Function.map((it) => {\n    Object.assign(it, {\n      kind: monaco.languages.CompletionItemKind.Function,\n      insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n      range,\n    });\n    suggestions.push(it);\n    return it;\n  });\n\n  // 关键词\n  // eslint-disable-next-line ts/no-unused-vars\n  const suggestions_17 = Keyword.map((it) => {\n    Object.assign(it, {\n      kind: monaco.languages.CompletionItemKind.Keyword,\n      insertTextRules: monaco.languages.CompletionItemInsertTextRule.None,\n      range,\n    });\n    suggestions.push(it);\n    return it;\n  });\n\n  // 变量\n  // eslint-disable-next-line ts/no-unused-vars\n  const suggestions_4 = Variable.map((it) => {\n    Object.assign(it, {\n      kind: monaco.languages.CompletionItemKind.Variable,\n      insertTextRules: monaco.languages.CompletionItemInsertTextRule.None,\n      range,\n    });\n    suggestions.push(it);\n    return it;\n  });\n  return suggestions;\n};\n\nexport default createDependencyProposals;\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/edit/utils/log.ts",
    "content": "import type { ISiteType } from '@shared/config/film';\nimport { SITE_LOGGER_MAP, SITE_TYPE } from '@shared/config/film';\nimport { toHMS } from '@shared/modules/date';\nimport { isJsonStr, isObjectEmpty } from '@shared/modules/validate';\nimport JSON5 from 'json5';\n\nimport { fetchLoggerStream } from '@/api/system';\nimport type { ITerminalLog } from '@/components/terminal/index.vue';\nimport { wsRequest } from '@/utils/request';\n\ntype ILogger = (type: 'logger' | 'testResult', prefix: string, level: ITerminalLog, text: unknown) => void;\n\nconst parseLog = (chunk: string) => {\n  if (!isJsonStr(chunk)) return null;\n  const data = JSON5.parse(chunk);\n  return isObjectEmpty(data) ? null : data;\n};\n\nconst emitLog = (logger: ILogger, timestamp: number, level: ITerminalLog, message: string) => {\n  logger('logger', toHMS(timestamp), level, message);\n};\n\nconst createSystemSseTransport = async (logger: ILogger, type: ISiteType) => {\n  const onMessage = (chunk: string) => {\n    const logData = parseLog(chunk);\n    if (!logData) return;\n\n    const { level, message, timestamp } = logData;\n    emitLog(logger, timestamp, level, message);\n  };\n\n  const ins = await fetchLoggerStream({ type: SITE_LOGGER_MAP[type] }, { onMessage });\n\n  return {\n    ins,\n    abort: () => ins.abort(),\n  };\n};\n\nconst createDrpysWsTransport = async (logger: ILogger) => {\n  const onMessage = (_socket, chunk) => {\n    const logData = parseLog(chunk);\n    if (!logData) return;\n\n    const { content, level: rawLevel, type, timestamp } = logData;\n    if (type !== 'console') return;\n\n    const level = ['warn', 'info', 'debug'].includes(rawLevel) ? rawLevel : 'verbose';\n\n    emitLog(logger, timestamp, level, content);\n  };\n\n  const ins = await wsRequest.request({\n    url: 'ws://localhost:5757/ws',\n    method: 'GET',\n    onMessage,\n  });\n\n  return {\n    ins,\n    abort: () => ins.close(),\n  };\n};\n\nexport const SITE_LOG_MAP = {\n  [SITE_TYPE.T0_XML]: (logger: ILogger) => createSystemSseTransport(logger, SITE_TYPE.T0_XML),\n  [SITE_TYPE.T1_JSON]: (logger: ILogger) => createSystemSseTransport(logger, SITE_TYPE.T1_JSON),\n  [SITE_TYPE.T4_DRPYJS0]: () => null,\n  [SITE_TYPE.T4_DRPYS]: (logger: ILogger) => createDrpysWsTransport(logger),\n  [SITE_TYPE.T3_DRPY]: (logger: ILogger) => createSystemSseTransport(logger, SITE_TYPE.T3_DRPY),\n  [SITE_TYPE.T4_CATVOD]: () => null,\n  [SITE_TYPE.T3_XBPQ]: (logger: ILogger) => createSystemSseTransport(logger, SITE_TYPE.T3_XBPQ),\n  [SITE_TYPE.T3_XYQ]: (logger: ILogger) => createSystemSseTransport(logger, SITE_TYPE.T3_XYQ),\n  [SITE_TYPE.T3_APPYSV2]: (logger: ILogger) => createSystemSseTransport(logger, SITE_TYPE.T3_APPYSV2),\n  [SITE_TYPE.T3_PY]: (logger: ILogger) => createSystemSseTransport(logger, SITE_TYPE.T3_PY),\n  [SITE_TYPE.T3_CATOPEN]: (logger: ILogger) => createSystemSseTransport(logger, SITE_TYPE.T3_CATOPEN),\n  [SITE_TYPE.T3_ALIST]: (logger: ILogger) => createSystemSseTransport(logger, SITE_TYPE.T3_ALIST),\n};\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/extension/components/env/index.vue",
    "content": "<template>\n  <div class=\"lab-extension-binary view-component-container\">\n    <div class=\"header\">\n      <group-btn :data=\"op\" @change=\"handleOpChange\" />\n    </div>\n    <div class=\"content\">\n      <template v-if=\"tableList.length\">\n        <t-row :gutter=\"[8, 8]\" style=\"margin-left: -4px; margin-right: -4px\">\n          <t-col v-for=\"item in tableList\" :key=\"item.name\" :md=\"6\" :xl=\"4\" class=\"card\">\n            <t-card :title=\"item.name\" :class=\"[!item.exist ? 'card-warning' : '']\">\n              <template #subtitle>\n                <div class=\"card-subtitle texttxthide txthide1\" @click=\"goBinDir\">{{ item.path }}</div>\n              </template>\n              <template #actions>\n                <t-link :disabled=\"item.exist || item.loading\" theme=\"primary\" @click=\"handleInstall(item.name)\">\n                  <template v-if=\"item.loading\" #suffix-icon>\n                    <loading-icon />\n                  </template>\n                  {{\n                    item.exist ? $t('common.installed') : item.loading ? $t('common.installing') : $t('common.install')\n                  }}\n                </t-link>\n              </template>\n            </t-card>\n          </t-col>\n        </t-row>\n\n        <dialog-document\n          v-model:visible=\"active.helpDialog\"\n          :attach=\"`.${attachContent}`\"\n          :title=\"$t('pages.md.binaryHelp.title')\"\n          :content=\"$t('pages.md.binaryHelp.content')\"\n        />\n      </template>\n      <div v-else class=\"empty\">\n        <t-empty />\n      </div>\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport PQueue from 'p-queue';\nimport { LoadingIcon } from 'tdesign-icons-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { computed, onMounted, ref } from 'vue';\n\nimport { getBinaryList } from '@/api/system';\nimport DialogDocument from '@/components/dialog-document/index.vue';\nimport GroupBtn from '@/components/group-btn/index.vue';\nimport { attachContent } from '@/config/global';\nimport { t } from '@/locales';\n\nconst emits = defineEmits(['change-nav']);\n\nconst installQueue = new PQueue({ concurrency: 1 });\nconst activeInstallIds = new Set<string>();\n\nconst op = computed(() => [\n  { label: t('pages.lab.extension.plugin.title'), value: 'plugin' },\n  { label: t('common.help'), value: 'help' },\n]);\n\nconst tableList = ref<{ name: string; path: string; exist: boolean; loading: boolean }[]>([]);\n\nconst active = ref({\n  helpDialog: false,\n});\n\nonMounted(() => fetchTable());\n\nconst handleOpPlugin = () => {\n  emits('change-nav', 'plugin');\n};\n\nconst handleOpHelp = () => {\n  active.value.helpDialog = true;\n};\n\nconst handleOpChange = (val: string) => {\n  const handlers = {\n    plugin: handleOpPlugin,\n    help: handleOpHelp,\n  };\n\n  handlers?.[val]?.();\n};\n\nconst fetchTable = async () => {\n  try {\n    const resp = await getBinaryList();\n    if (resp?.list) tableList.value = resp.list;\n  } catch (error) {\n    console.error('Fail to fetch page', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst handleInstall = async (id: string) => {\n  if (activeInstallIds.has(id)) return;\n\n  const idx = tableList.value.findIndex((item) => item.name === id);\n  if (idx === -1) return;\n\n  activeInstallIds.add(id);\n\n  installQueue.add(async () => {\n    try {\n      tableList.value[idx].loading = true;\n\n      // const resp = await binaryInstall({ id: [id] });\n      const resp = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.BINARY_INSTALL, [id]);\n      tableList.value[idx].exist = resp?.[0]?.exist;\n    } finally {\n      activeInstallIds.delete(id);\n      tableList.value[idx].loading = false;\n    }\n\n    if (activeInstallIds.size === 0) {\n      fetchTable();\n      MessagePlugin.success(`${t('common.success')}`);\n    }\n  });\n};\n\nconst goBinDir = async () => {\n  const path = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.PATH_HOME, 'bin');\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.OPEN_PATH, path);\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  padding: 0 var(--td-comp-paddingLR-s) var(--td-comp-paddingTB-s) 0;\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n  overflow-y: auto;\n\n  .content {\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n\n    .card {\n      .t-card {\n        background-color: var(--td-bg-color-component);\n\n        .card-subtitle {\n          cursor: pointer;\n        }\n\n        &.card-warning {\n          border-color: var(--td-warning-color-active);\n        }\n      }\n    }\n\n    .help {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: var(--td-size-2);\n      cursor: pointer;\n      font-size: var(--td-font-size-link-small);\n      color: var(--td-text-color-secondary);\n    }\n\n    .empty {\n      flex: 1;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/extension/components/plugin/components/DialogDetail.vue",
    "content": "<template>\n  <t-dialog\n    v-model:visible=\"formVisible\"\n    show-in-attached-element\n    :attach=\"`.${attachContent}`\"\n    width=\"70%\"\n    placement=\"center\"\n    destroy-on-close\n    lazy\n    :footer=\"false\"\n  >\n    <template #header>\n      {{ $t('common.info') }}\n    </template>\n    <template #body>\n      <div class=\"detail view-container\">\n        <div class=\"plugin-header\">\n          <div v-if=\"formData.logo\" class=\"logo\">\n            <t-image\n              class=\"icon\"\n              shape=\"round\"\n              :src=\"formData.logo\"\n              :lazy=\"true\"\n              fit=\"cover\"\n              :loading=\"renderDefaultLazy\"\n              :error=\"renderDefaultLazy\"\n            />\n          </div>\n          <div class=\"base\">\n            <h1 class=\"title\">\n              <span class=\"name\">{{ formData.pluginName || '' }}</span>\n              <span class=\"version\">v{{ formData.version || '0.0.0' }}</span>\n            </h1>\n            <span class=\"desc txthide txthide2\">\n              {{ formData.description || $t('pages.lab.extension.plugin.empty') }}</span\n            >\n            <div class=\"info\">\n              <div v-if=\"[2, 3].includes(formData.type)\" class=\"status info-item\">\n                <application-icon class=\"icon\" />\n                <t-tag v-if=\"formData.isActive\" theme=\"success\" shape=\"round\" size=\"small\">\n                  {{ $t('pages.lab.extension.plugin.info.start') }}\n                </t-tag>\n                <t-tag v-else theme=\"danger\" shape=\"round\" size=\"small\">{{\n                  $t('pages.lab.extension.plugin.info.stop')\n                }}</t-tag>\n              </div>\n              <div class=\"author info-item\">\n                <verified-icon class=\"icon\" />\n                <span>{{ formData.author || $t('pages.lab.extension.plugin.empty') }}</span>\n              </div>\n            </div>\n          </div>\n          <div class=\"action\"></div>\n        </div>\n\n        <div class=\"plugin-readme data-item\">\n          <p class=\"title-label\">{{ $t('pages.lab.extension.plugin.content.title') }}</p>\n          <div class=\"md\">\n            <render-md class=\"custom-md\" :text=\"formData.readme\" />\n          </div>\n        </div>\n      </div>\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"tsx\">\nimport { ApplicationIcon, VerifiedIcon } from 'tdesign-icons-vue-next';\nimport { ref, watch } from 'vue';\n\nimport LazyBg from '@/components/lazy-bg/index.vue';\nimport RenderMd from '@/components/render-markdown/index.vue';\nimport { attachContent } from '@/config/global';\n\nconst props = defineProps({\n  visible: {\n    type: Boolean,\n    default: false,\n  },\n  data: {\n    type: Object,\n    default: () => {},\n  },\n});\nconst emits = defineEmits(['update:visible', 'submit']);\n\nconst formVisible = ref(false);\nconst formData = ref(props.data);\n\nconst renderDefaultLazy = () => <LazyBg class=\"render-icon\" />;\n\nwatch(\n  () => formVisible.value,\n  (val) => emits('update:visible', val),\n);\nwatch(\n  () => props.visible,\n  (val) => (formVisible.value = val),\n);\nwatch(\n  () => props.data,\n  (val) => (formData.value = val),\n);\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  max-height: 340px;\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n\n  .plugin-header {\n    height: fit-content;\n    display: flex;\n    flex-direction: row;\n    gap: var(--td-size-4);\n    align-items: center;\n    margin: auto 0;\n\n    .logo {\n      position: relative;\n      width: calc(var(--td-size-8) + var(--td-size-16));\n      height: calc(var(--td-size-8) + var(--td-size-16));\n\n      .icon {\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        transform: translate(-50%, -50%);\n        width: var(--td-comp-size-xxxxl);\n        height: var(--td-comp-size-xxxxl);\n      }\n    }\n\n    .base {\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n      align-items: flex-start;\n      height: 100%;\n      justify-content: space-around;\n      color: var(--td-text-color-primary);\n\n      .title {\n        display: flex;\n        gap: var(--td-size-4);\n        align-items: flex-end;\n        flex-direction: row;\n        margin: 0;\n\n        .name {\n          font-size: var(--td-font-size-title-large);\n          line-height: var(--td-line-height-title-large);\n          font-weight: 500;\n        }\n\n        .version {\n          font-size: var(--td-font-size-title-small);\n          font-weight: 400;\n        }\n      }\n\n      .desc {\n        line-height: var(--td-line-height-body-large);\n        width: 100%;\n        white-space: wrap;\n      }\n\n      .info {\n        display: flex;\n        gap: var(--td-size-4);\n\n        .info-item {\n          display: flex;\n          align-items: center;\n          gap: var(--td-size-2);\n\n          .icon {\n            width: var(--td-comp-size-xxxs);\n            height: var(--td-comp-size-xxxs);\n          }\n        }\n      }\n    }\n\n    .action {\n      margin-left: auto;\n      display: flex;\n      gap: var(--td-size-4);\n      padding: 0 var(--td-comp-paddingLR-s) 0 0;\n    }\n  }\n\n  .plugin-readme {\n    display: flex;\n    flex-direction: column;\n    flex: 1;\n    height: 100%;\n    width: 100%;\n    overflow: hidden;\n\n    .md {\n      min-height: 24px;\n      flex: 1;\n      overflow: auto;\n      padding: 0 var(--td-comp-paddingLR-s) 0 0;\n\n      .custom-md {\n        :deep(a) {\n          pointer-events: none;\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/extension/components/plugin/components/DialogInstall.vue",
    "content": "<template>\n  <t-dialog\n    v-model:visible=\"formVisible\"\n    show-in-attached-element\n    :attach=\"`.${attachContent}`\"\n    placement=\"center\"\n    destroy-on-close\n    lazy\n  >\n    <template #header>\n      {{ $t('common.install') }}\n    </template>\n    <template #body>\n      <div class=\"install view-container\">\n        <t-form\n          ref=\"formRef\"\n          :data=\"formData\"\n          :rules=\"RULES\"\n          :label-width=\"80\"\n          required-mark-position=\"right\"\n          label-align=\"left\"\n          reset-type=\"initial\"\n          @submit=\"onSubmit\"\n        >\n          <div class=\"data-item\">\n            <p class=\"title title-label\">{{ $t('common.stepNum', [1]) }}</p>\n            <p class=\"tip\">{{ $t('pages.plugin.install.tip.file') }}</p>\n            <t-button block class=\"mg-b-s\" @click=\"handleGoDir\">\n              {{ $t('pages.plugin.install.goDir') }}\n            </t-button>\n          </div>\n          <div class=\"data-item\">\n            <p class=\"title title-label\">{{ $t('common.stepNum', [2]) }}</p>\n            <p class=\"tip\">{{ $t('pages.plugin.install.tip.input') }}</p>\n            <t-form-item name=\"pluginName\" label-width=\"0px\">\n              <t-select v-model=\"formData.id\" :options=\"pluginList\" clearable @focus=\"onInputFocus\"></t-select>\n            </t-form-item>\n          </div>\n        </t-form>\n      </div>\n    </template>\n    <template #footer>\n      <t-button theme=\"default\" variant=\"base\" @click=\"handleReset\">{{ $t('common.cancel') }}</t-button>\n      <t-button theme=\"primary\" variant=\"base\" @click=\"handleSubmit\">{{ $t('common.install') }}</t-button>\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"ts\">\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport type { FormInstanceFunctions, SubmitContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { ref, useTemplateRef, watch } from 'vue';\n\nimport { attachContent } from '@/config/global';\nimport { delimiter } from '@/utils/systeminfo';\n\nconst props = defineProps({\n  visible: {\n    type: Boolean,\n    default: false,\n  },\n  data: {\n    type: Object,\n    default: () => {},\n  },\n  type: {\n    type: String,\n    default: 'add',\n  },\n});\nconst emits = defineEmits(['update:visible', 'submit']);\n\nconst RULES = {\n  id: [{ required: true }],\n};\n\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\nconst formVisible = ref(false);\nconst formData = ref(props.data);\nconst formType = ref(props.type);\nconst pluginList = ref([]);\n\nwatch(\n  () => formVisible.value,\n  (val) => emits('update:visible', val),\n);\nwatch(\n  () => props.visible,\n  (val) => (formVisible.value = val),\n);\nwatch(\n  () => props.data,\n  (val) => (formData.value = val),\n);\nwatch(\n  () => props.type,\n  (val) => (formType.value = val),\n);\n\nconst handleGoDir = async () => {\n  const path = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.PATH_USER, 'plugin');\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.OPEN_PATH, path);\n};\n\nconst getPluginDir = async () => {\n  const path = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.PATH_USER, 'plugin');\n  const dirs = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.FS_DIR_READ, path);\n  const filtered = dirs\n    .filter((item: string) => item.endsWith(delimiter) && item !== `${path}${delimiter}`)\n    .map((item: string) => {\n      const pathList = item.split(delimiter);\n      const path = pathList[pathList.length - 2];\n      return path;\n    });\n  pluginList.value = filtered.map((item: string) => ({ label: item, value: item }));\n};\n\nconst onInputFocus = () => {\n  getPluginDir();\n};\n\nconst handleExecute = () => {\n  emits('submit', 'table', { id: [formData.value.id] });\n  formVisible.value = false;\n};\n\nconst onSubmit = (context: SubmitContext<FormData>) => {\n  const { validateResult, firstError } = context;\n  if (validateResult && typeof validateResult === 'boolean') {\n    handleExecute();\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\nconst handleSubmit = () => {\n  formRef.value?.submit();\n};\n\nconst handleReset = () => {\n  formRef.value?.reset();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  padding: 0 var(--td-comp-paddingLR-xxs) var(--td-comp-paddingTB-xxs);\n  max-height: 340px;\n  overflow-y: auto;\n\n  .data-item {\n    margin-bottom: var(--td-comp-margin-xs);\n\n    .tip {\n      margin-bottom: var(--td-comp-margin-xs);\n    }\n\n    &:last-of-type {\n      margin-bottom: 0;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/extension/components/plugin/constants.ts",
    "content": "import { computed } from 'vue';\n\nimport { t } from '@/locales';\n\nexport const COLUMNS = computed(() => [\n  {\n    type: 'multiple',\n    fixed: 'left',\n    colKey: 'row-select',\n  },\n  {\n    title: t('common.name'),\n    align: 'left',\n    colKey: 'pluginName',\n    ellipsis: true,\n  },\n  {\n    title: t('common.type'),\n    align: 'center',\n    colKey: 'type',\n  },\n  {\n    title: t('common.status'),\n    align: 'center',\n    colKey: 'isActive',\n  },\n  {\n    title: t('common.operate'),\n    align: 'center',\n    fixed: 'right',\n    width: 230,\n    colKey: 'op',\n  },\n]);\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/extension/components/plugin/index.vue",
    "content": "<template>\n  <div class=\"lab-extension-plugin view-component-container\">\n    <setting-table\n      row-key=\"id\"\n      :op=\"operations\"\n      :data=\"tableState.list\"\n      :columns=\"COLUMNS\"\n      :pagination=\"pagination\"\n      @op-change=\"handleOperation\"\n      @page-change=\"handlePageChange\"\n      @op-search=\"handleSearch\"\n    >\n      <template #name=\"{ row }\">\n        <t-badge v-if=\"row.id === tableState.default\" size=\"small\" dot :count=\"999\">\n          {{ row.name }}\n        </t-badge>\n        <span v-else>{{ row.name }}</span>\n      </template>\n      <template #type=\"{ row }\">\n        <t-tag v-if=\"row.type === 1\" theme=\"success\" shape=\"round\" variant=\"light-outline\">\n          {{ $t('pages.plugin.field.typeMap.ui') }}\n        </t-tag>\n        <t-tag v-else-if=\"row.type === 2\" theme=\"warning\" shape=\"round\" variant=\"light-outline\">\n          {{ $t('pages.plugin.field.typeMap.system') }}\n        </t-tag>\n        <t-tag v-else-if=\"row.type === 3\" theme=\"danger\" shape=\"round\" variant=\"light-outline\">\n          {{ $t('pages.plugin.field.typeMap.mix') }}\n        </t-tag>\n      </template>\n      <template #isActive=\"{ row }\">\n        <t-switch v-model=\"row.isActive\" :disabled=\"row.type === 1\" @change=\"handleOpActiveSwitch(row.id)\" />\n      </template>\n      <template #op=\"slotProps\">\n        <t-space>\n          <t-link\n            :disabled=\"![1, 3].includes(slotProps.row.type)\"\n            theme=\"primary\"\n            @click=\"handleOperation('preview', slotProps.row)\"\n          >\n            {{ $t('common.preview') }}\n          </t-link>\n          <t-link theme=\"primary\" @click=\"handleOperation('info', slotProps.row)\">\n            {{ $t('common.info') }}\n          </t-link>\n          <t-popconfirm\n            :content=\"$t('common.popup.delete')\"\n            theme=\"danger\"\n            @confirm=\"handleOperation('delete', [slotProps.row.id])\"\n          >\n            <t-link theme=\"danger\">{{ $t('common.uninstall') }}</t-link>\n          </t-popconfirm>\n        </t-space>\n      </template>\n    </setting-table>\n\n    <dialog-install-view\n      v-model:visible=\"dialogState.visibleForm\"\n      :data=\"formData\"\n      :type=\"dialogState.formType\"\n      @submit=\"handleDialogUpdate\"\n    />\n    <dialog-detail-view v-model:visible=\"dialogState.visibleDetail\" :data=\"formData\" />\n    <dialog-document\n      v-model:visible=\"dialogState.visibleHelp\"\n      :attach=\"`.${attachContent}`\"\n      :title=\"$t('pages.md.binaryHelp.title')\"\n      :content=\"$t('pages.md.binaryHelp.content')\"\n    />\n  </div>\n</template>\n<script lang=\"tsx\" setup>\nimport { PLUGIN_STORE_URL } from '@shared/config/appinfo';\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { isArray, isArrayEmpty } from '@shared/modules/validate';\nimport type { IModels } from '@shared/types/db';\nimport { cloneDeep } from 'es-toolkit';\nimport PQueue from 'p-queue';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { computed, onActivated, onMounted, ref, toRaw } from 'vue';\n\nimport { fetchPluginPage } from '@/api/plugin';\nimport DialogDocument from '@/components/dialog-document/index.vue';\n// import { installPlugin, startPlugin, stopPlugin, uninstallPlugin } from '@/api/plugin';\nimport SettingTable from '@/components/setting-table/index.vue';\nimport { emitterChannel, emitterSource } from '@/config/emitterChannel';\nimport { attachContent } from '@/config/global';\nimport { t } from '@/locales';\nimport emitter from '@/utils/emitter';\n\nimport DialogDetailView from './components/DialogDetail.vue';\nimport DialogInstallView from './components/DialogInstall.vue';\nimport { COLUMNS } from './constants';\n\nconst emits = defineEmits(['change-nav']);\n\nconst installQueue = new PQueue({ concurrency: 1 });\nconst activeInstallIds = new Set<string>();\n\nconst operations = computed(() => [\n  { label: t('common.install'), value: 'add' },\n  { label: t('common.enable'), value: 'enable' },\n  { label: t('common.disable'), value: 'disable' },\n  { label: t('common.uninstall'), value: 'delete' },\n  { label: t('common.store'), value: 'store' },\n  { label: t('pages.lab.extension.env.title'), value: 'env' },\n  { label: t('common.help'), value: 'help' },\n]);\n\nconst dialogState = ref({\n  visibleForm: false,\n  visibleDetail: false,\n  visibleHelp: false,\n  formType: 'add',\n  currentId: '',\n});\n\nconst formData = ref({});\nconst searchValue = ref('');\nconst pagination = ref({\n  defaultPageSize: 20,\n  total: 0,\n  defaultCurrent: 1,\n  pageSize: 20,\n  current: 1,\n  theme: 'simple',\n});\n\nconst tableState = ref({\n  list: [] as IModels['plugin'][],\n  sort: {},\n  filter: { type: [] },\n  select: [],\n  default: '',\n});\n\nonMounted(() => fetchTable());\n\nonActivated(() => {\n  emitter.off(emitterChannel.REFRESH_PLUGIN_CONFIG, reloadConfig);\n  emitter.on(emitterChannel.REFRESH_PLUGIN_CONFIG, reloadConfig);\n});\n\nconst reloadConfig = async ({ data: eventData }) => {\n  const { source } = eventData;\n  if (source === emitterSource.SETTING_TABLE) return;\n\n  resetPagination();\n  resetTable();\n\n  await fetchTable();\n};\n\nconst resetPagination = () => {\n  pagination.value = { defaultCurrent: 1, defaultPageSize: 20, current: 1, pageSize: 20, total: 0, theme: 'simple' };\n};\n\nconst resetTable = () => {\n  tableState.value = { list: [], sort: {}, filter: { type: [] }, select: [], default: '' };\n};\n\nconst fetchTable = async () => {\n  try {\n    const resp = await fetchPluginPage({\n      page: pagination.value.current,\n      pageSize: pagination.value.pageSize,\n      kw: searchValue.value,\n    });\n    if (resp?.default) tableState.value.default = resp.default;\n    if (resp?.list) tableState.value.list = resp.list;\n    if (resp?.total) pagination.value.total = resp.total;\n  } catch (error) {\n    console.error('Fail to fetch page', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst createItem = async (ids: string[]) => {\n  const id = ids[0];\n\n  if (activeInstallIds.has(id)) return;\n  activeInstallIds.add(id);\n\n  installQueue.add(async () => {\n    try {\n      // await installPlugin({ id: ids });\n      await window.electron.ipcRenderer.invoke(IPC_CHANNEL.PLUGIN_INSTALL, ids);\n    } finally {\n      activeInstallIds.delete(id);\n    }\n\n    if (activeInstallIds.size === 0) {\n      fetchTable();\n      MessagePlugin.success(`${t('common.success')}`);\n    }\n  });\n};\n\nconst disableItem = async (ids: string[]) => {\n  try {\n    // await stopPlugin({ id: ids });\n    await window.electron.ipcRenderer.invoke(IPC_CHANNEL.PLUGIN_STOP, ids);\n    MessagePlugin.success(`${t('common.success')}`);\n  } catch (error) {\n    console.error('Fail to create item', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst enableItem = async (ids: string[]) => {\n  try {\n    // await startPlugin({ id: ids });\n    await window.electron.ipcRenderer.invoke(IPC_CHANNEL.PLUGIN_START, ids);\n    MessagePlugin.success(`${t('common.success')}`);\n  } catch (error) {\n    console.error('Fail to create item', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst uninstallItem = async (ids: string[]) => {\n  try {\n    // await uninstallPlugin({ id: ids });\n    await window.electron.ipcRenderer.invoke(IPC_CHANNEL.PLUGIN_UNINSTALL, ids);\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error('Fail to uninstall item', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst handleOpActiveSwitch = async (id: string) => {\n  const list = tableState.value.list;\n  const item = list.find((i: IModels['plugin']) => i.id === id);\n  if (item) handleOperation(item.isActive ? 'enable' : 'disable', [id]);\n};\n\nconst handleOpEnv = () => {\n  emits('change-nav', 'env');\n};\n\nconst handleOpHelp = () => {\n  dialogState.value.visibleHelp = true;\n};\n\n// @ts-expect-error Not all code paths return values。ts-7030\nconst handleOperation = async (type: string, payload: any) => {\n  const noSelectOps = ['enable', 'disable', 'delete'];\n  if ((!isArray(payload) || isArrayEmpty(payload)) && noSelectOps.includes(type)) {\n    return MessagePlugin.warning(t('common.message.noSelect'));\n  }\n\n  const op = {\n    add: () => {\n      dialogState.value.formType = 'add';\n      formData.value = { id: '' };\n      dialogState.value.visibleForm = true;\n    },\n    enable: () => enableItem(toRaw(payload)),\n    disable: () => disableItem(toRaw(payload)),\n    delete: () => uninstallItem(toRaw(payload)),\n    preview: () => window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_BROWSER, payload.web),\n    info: () => {\n      const cloneDoc = cloneDeep(payload);\n      formData.value = cloneDoc;\n      dialogState.value.visibleDetail = true;\n    },\n    store: () => window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_BROWSER, PLUGIN_STORE_URL),\n    env: handleOpEnv,\n    help: handleOpHelp,\n  }[type];\n\n  await op?.();\n\n  if (['enable', 'disable', 'delete'].includes(type)) {\n    fetchTable();\n    emitter.emit(emitterChannel.REFRESH_LIVE_CONFIG, { source: emitterSource.SETTING_TABLE });\n  }\n};\n\nconst handleDialogUpdate = async (type: string, doc: Record<string, any>) => {\n  if (type === 'table') {\n    if (dialogState.value.formType === 'add') {\n      await createItem(doc.id);\n    }\n  }\n\n  fetchTable();\n  emitter.emit(emitterChannel.REFRESH_LIVE_CONFIG, { source: emitterSource.SETTING_TABLE });\n};\n\nconst handleSearch = (value: string) => {\n  searchValue.value = value;\n  pagination.value.current = 1;\n  fetchTable();\n};\n\nconst handlePageChange = (page: number, pageSize: number) => {\n  pagination.value.current = page;\n  pagination.value.pageSize = pageSize;\n  fetchTable();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  height: 100%;\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/extension/index.vue",
    "content": "<template>\n  <div class=\"lab-extension view-component-container\">\n    <keep-alive>\n      <component :is=\"currentComponent\" class=\"content-wrapper\" @change-nav=\"onNavChange\"></component>\n    </keep-alive>\n  </div>\n</template>\n<script lang=\"ts\" setup>\nimport { defineAsyncComponent, ref, shallowRef } from 'vue';\n\nconst componentMap = {\n  plugin: defineAsyncComponent(() => import('./components/plugin/index.vue')),\n  env: defineAsyncComponent(() => import('./components/env/index.vue')),\n};\n\nconst active = ref({\n  nav: 'plugin',\n});\n\nconst currentComponent = shallowRef(componentMap[Object.keys(componentMap)[0]]);\n\nconst onNavChange = (item: string) => {\n  active.value.nav = item;\n  currentComponent.value = componentMap[item];\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  padding-bottom: var(--td-comp-paddingTB-s);\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/player/index.vue",
    "content": "<template>\n  <div class=\"lab-player view-component-container\">\n    <div class=\"content\">\n      <div class=\"input\">\n        <p class=\"title-label\">{{ $t('common.input') }}</p>\n        <t-form\n          ref=\"formRef\"\n          :data=\"formData\"\n          :rules=\"RULES\"\n          :label-width=\"80\"\n          required-mark-position=\"right\"\n          label-align=\"left\"\n          reset-type=\"initial\"\n          @submit=\"onSubmit\"\n          @reset=\"onReset\"\n        >\n          <t-form-item :label=\"$t('common.url')\" name=\"url\">\n            <t-input v-model=\"formData.url\" />\n          </t-form-item>\n          <t-space class=\"t-form__item\">\n            <t-form-item :label=\"$t('media.decoder')\" name=\"decoder\">\n              <t-select v-model=\"formData.decoder\" :options=\"DECODER_OPTIONS\" />\n            </t-form-item>\n            <t-form-item :label=\"$t('media.player')\" name=\"player\">\n              <t-select v-model=\"formData.player\" :options=\"PLAYER_OPTIONS\" />\n            </t-form-item>\n          </t-space>\n          <t-collapse class=\"t-form__item\">\n            <t-collapse-panel value=\"complete-import\" :header=\"$t('common.optionalParams')\">\n              <t-form-item :label=\"$t('common.request.headers')\" name=\"headers\">\n                <t-textarea\n                  v-model=\"formData.headers\"\n                  :autosize=\"{ minRows: 3, maxRows: 5 }\"\n                  :placeholder=\"$t('common.placeholder.request.headers')\"\n                />\n              </t-form-item>\n            </t-collapse-panel>\n          </t-collapse>\n        </t-form>\n      </div>\n      <div class=\"action\">\n        <p class=\"title-label\">{{ $t('common.action') }}</p>\n        <div class=\"content-action\">\n          <t-button theme=\"default\" variant=\"base\" block @click=\"handleReset\">{{ $t('common.reset') }}</t-button>\n          <t-button theme=\"primary\" variant=\"base\" block @click=\"handleSubmit\">{{ $t('common.execute') }}</t-button>\n        </div>\n      </div>\n      <div class=\"output\">\n        <p class=\"title-label\">{{ $t('common.preview') }}</p>\n        <div class=\"content-output\">\n          <multi-player ref=\"playerRef\" class=\"mse\" />\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\nimport { PLAYER_TYPE } from '@shared/config/setting';\nimport { jsonStrToObj } from '@shared/modules/obj';\nimport { isJsonStr } from '@shared/modules/validate';\nimport type { FormInstanceFunctions, SubmitContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { computed, onMounted, ref, useTemplateRef } from 'vue';\n\nimport type { IDecoderWithAutoType, IMultiPlayerType } from '@/components/multi-player';\nimport { mediaUtils, MultiPlayer } from '@/components/multi-player';\nimport { t } from '@/locales';\nimport { usePlayerStore } from '@/store';\n\nconst RULES = {\n  url: [{ required: true }, { validator: (val: string) => mediaUtils.isValidMediaUrl(val) }],\n  decoder: [{ required: true }],\n  player: [{ required: true }],\n  headers: [{ validator: (val: string) => isJsonStr(val) || val === '' }],\n};\n\nconst storePlayer = usePlayerStore();\n\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\nconst playerRef = useTemplateRef('playerRef');\n\nconst formData = ref({\n  url: '',\n  headers: '',\n  decoder: 'auto' as IDecoderWithAutoType,\n  player: 'artplayer' as IMultiPlayerType,\n});\n\nconst PLAYER_OPTIONS = computed(() => [\n  { value: PLAYER_TYPE.XGPLAYER, label: t('media.playerMap.xgplayer') },\n  // { value: PLAYER_TYPE.DPLAYER, label: t('media.playerMap.dplayer')  },\n  { value: PLAYER_TYPE.ARTPLAYER, label: t('media.playerMap.artplayer') },\n  // { value: PLAYER_TYPE.NPLAYER, label: t('media.playerMap.nplayer') },\n  // { value: PLAYER_TYPE.OPLAYER, label: t('media.playerMap.oplayer') },\n]);\nconst DECODER_OPTIONS = computed(() => [\n  { value: 'auto', label: t('common.auto') },\n  { value: 'audio', label: t('media.decoderMap.audio') },\n  { value: 'hls', label: t('media.decoderMap.hls') },\n  { value: 'flv', label: t('media.decoderMap.flv') },\n  { value: 'mp4', label: t('media.decoderMap.mp4') },\n  { value: 'dash', label: t('media.decoderMap.dash') },\n  { value: 'torrent', label: t('media.decoderMap.torrent') },\n]);\n\nonMounted(() => setup());\n\nconst setup = () => {\n  const player = storePlayer.player;\n  const isVisable = PLAYER_OPTIONS.value.findIndex((item) => item.value === player.type) !== -1;\n  formData.value.player = (isVisable ? player.type : PLAYER_OPTIONS.value[0].value) as IMultiPlayerType;\n};\n\nconst handleExecute = () => {\n  const { url, headers: headersRaw, decoder, player } = formData.value;\n  const headers = jsonStrToObj(headersRaw);\n\n  playerRef.value?.create(\n    {\n      url,\n      isLive: false,\n      headers,\n      type: decoder,\n      container: 'lab-mse',\n    },\n    player,\n  );\n};\n\nconst onSubmit = (context: SubmitContext<FormData>) => {\n  const { validateResult, firstError } = context;\n  if (validateResult && typeof validateResult === 'boolean') {\n    handleExecute();\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\nconst onReset = async () => {\n  if (!playerRef.value) return;\n\n  await playerRef.value.destroy();\n};\n\nconst handleSubmit = () => {\n  formRef.value?.submit();\n};\n\nconst handleReset = () => {\n  formRef.value?.reset();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  padding: 0 var(--td-comp-paddingLR-s) var(--td-comp-paddingTB-s) 0;\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n  overflow-y: auto;\n\n  .content {\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n\n    .input {\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n    }\n\n    .action {\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n\n      .content-action {\n        display: flex;\n        gap: var(--td-size-4);\n      }\n    }\n\n    .output {\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n\n      .content-output {\n        flex: 1;\n\n        .mse {\n          height: 100%;\n          min-height: 296px;\n          width: 100%;\n          border-radius: var(--td-radius-medium);\n          overflow: hidden;\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/sift/index.vue",
    "content": "<template>\n  <div class=\"lab-static-filter view-component-container\">\n    <div class=\"header\">\n      <div class=\"left-op-container\">\n        <div class=\"component-op\">\n          <group-btn :data=\"op\" @change=\"handleOpChange\" />\n        </div>\n      </div>\n      <div class=\"right-op-container\"></div>\n    </div>\n    <div class=\"content\">\n      <splitpanes horizontal>\n        <pane size=\"70\">\n          <splitpanes>\n            <pane>\n              <div class=\"editor-pane\">\n                <t-tabs v-model=\"active.editor\" theme=\"card\" lazy class=\"editor-pane-tabs\">\n                  <t-tab-panel :label=\"$t('component.codeEditor.editor.html')\" value=\"html\">\n                    <div class=\"editor-pane-code\">\n                      <code-editor v-model=\"sourceCode\" :options=\"editConf\" class=\"code-box\" />\n                    </div>\n                  </t-tab-panel>\n                </t-tabs>\n              </div>\n            </pane>\n            <pane>\n              <div class=\"action-pane\">\n                <t-tabs v-model=\"active.action\" theme=\"card\" lazy class=\"pane-right\">\n                  <t-tab-panel :label=\"$t('pages.lab.edit.debug.data')\" value=\"data\">\n                    <div class=\"action-pane-data\">\n                      <div class=\"action-item req-item\">\n                        <input-req\n                          v-model=\"reqFormData\"\n                          :attach=\"`.${attachContent}`\"\n                          class=\"source\"\n                          @response=\"onReqResponse\"\n                        />\n                      </div>\n                      <div class=\"action-item\">\n                        <t-input\n                          v-model=\"siftFormData.class_name\"\n                          :label=\"$t('pages.lab.sift.rule.className')\"\n                          :placeholder=\"$t('pages.lab.sift.placeholder.classNameTip')\"\n                        />\n                        <t-input\n                          v-model=\"siftFormData.class_url\"\n                          :label=\"$t('pages.lab.sift.rule.classUrl')\"\n                          :placeholder=\"$t('pages.lab.sift.placeholder.classUrlTip')\"\n                        />\n                        <t-input\n                          v-model=\"siftFormData.class_parse\"\n                          :label=\"$t('pages.lab.sift.rule.class')\"\n                          :placeholder=\"$t('pages.lab.sift.placeholder.classParseTip')\"\n                        />\n                        <t-input\n                          v-model=\"siftFormData.cate_exclude\"\n                          :label=\"$t('pages.lab.sift.rule.cateExclude')\"\n                          :placeholder=\"$t('pages.lab.sift.placeholder.cateExcludeTip')\"\n                        />\n                        <t-input\n                          v-model=\"siftFormData.reurl\"\n                          :label=\"$t('pages.lab.sift.rule.link')\"\n                          :placeholder=\"$t('pages.lab.sift.placeholder.linkTip')\"\n                        />\n                        <t-button\n                          theme=\"primary\"\n                          variant=\"base\"\n                          block\n                          :loading=\"loading.category\"\n                          @click=\"actionGenerateCategory\"\n                        >\n                          {{ $t('pages.lab.sift.action.category') }}\n                        </t-button>\n                      </div>\n                      <div class=\"action-item\">\n                        <t-textarea\n                          v-model=\"siftFormData.filter\"\n                          :label=\"$t('pages.lab.sift.rule.filter')\"\n                          :placeholder=\"$t('pages.lab.sift.placeholder.filterTip')\"\n                          :autosize=\"{ minRows: 1 }\"\n                        />\n                        <t-textarea\n                          v-model=\"siftFormData.filterInfo\"\n                          :label=\"$t('pages.lab.sift.rule.filterInfo')\"\n                          :placeholder=\"$t('pages.lab.sift.placeholder.filterInfoTip')\"\n                          :autosize=\"{ minRows: 1 }\"\n                        />\n                        <t-button\n                          theme=\"primary\"\n                          variant=\"base\"\n                          block\n                          :loading=\"loading.matchs\"\n                          @click=\"actionGenerateMatch\"\n                        >\n                          {{ $t('pages.lab.sift.action.match') }}\n                        </t-button>\n\n                        <t-input\n                          v-model=\"siftFormData.exclude_keys\"\n                          :label=\"$t('pages.lab.sift.rule.excludeKeys')\"\n                          :placeholder=\"$t('pages.lab.sift.placeholder.keyExcludeTip')\"\n                        />\n\n                        <t-input\n                          v-for=\"(_, key, index) in siftFormData.matchs\"\n                          :key=\"index\"\n                          v-model=\"siftFormData.matchs[key]\"\n                          :label=\"key\"\n                          :placeholder=\"$t('pages.lab.sift.placeholder.reg')\"\n                        />\n                        <t-button\n                          theme=\"primary\"\n                          variant=\"base\"\n                          block\n                          :loading=\"loading.sift\"\n                          @click=\"actionGenerateCurrentSift\"\n                        >\n                          {{ $t('pages.lab.sift.action.currentSift') }}\n                        </t-button>\n                      </div>\n                      <div class=\"action-item final-item\">\n                        <t-button\n                          theme=\"primary\"\n                          variant=\"dashed\"\n                          ghost\n                          block\n                          :loading=\"loading.allSift\"\n                          @click=\"actionGenerateAllSift\"\n                        >\n                          {{ $t('pages.lab.sift.action.finalSift') }}\n                        </t-button>\n                        <t-button theme=\"primary\" variant=\"dashed\" ghost block @click=\"actionCopyAllSift\">\n                          {{ $t('pages.lab.sift.action.copyFinalSift') }}\n                        </t-button>\n                      </div>\n                    </div>\n                  </t-tab-panel>\n                </t-tabs>\n              </div>\n            </pane>\n          </splitpanes>\n        </pane>\n        <pane>\n          <div class=\"output-pane\">\n            <div class=\"output-header\">\n              <tag-nav\n                :list=\"OUTPUT_OPTIONS\"\n                :active=\"active.output\"\n                class=\"header-nav output-header-left\"\n                @change=\"handleOutputChange\"\n              />\n              <div class=\"output-header-right\">\n                <div class=\"output-clear\" @click=\"handleOutputClear\"><clear-formatting1-icon /></div>\n              </div>\n            </div>\n            <div class=\"output-content\">\n              <terminal ref=\"testResultRef\" :options=\"termConf\" class=\"output-terminal\" />\n            </div>\n          </div>\n        </pane>\n      </splitpanes>\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport 'splitpanes/dist/splitpanes.css';\n\nimport { THEME } from '@shared/config/theme';\nimport { toHMS } from '@shared/modules/date';\nimport { isObject, isObjectEmpty, isStrEmpty, isString } from '@shared/modules/validate';\nimport type { ISiftCategoryResult } from '@shared/types/sift';\nimport { Pane, Splitpanes } from 'splitpanes';\nimport { ClearFormatting1Icon } from 'tdesign-icons-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { computed, ref, useTemplateRef, watch } from 'vue';\n\nimport { fetchEditSiftCategory, fetchEditSiftFilter } from '@/api/film';\nimport type { IEditorOptions } from '@/components/code-editor';\nimport CodeEditor from '@/components/code-editor';\nimport GroupBtn from '@/components/group-btn/index.vue';\nimport type { IReqConfig, IReqResponse } from '@/components/input-req/index.vue';\nimport InputReq from '@/components/input-req/index.vue';\nimport { handleReq } from '@/components/input-req/utils';\nimport TagNav from '@/components/tag-nav/index.vue';\nimport type { ITerminalLog, ITerminalOptions } from '@/components/terminal/index.vue';\nimport Terminal from '@/components/terminal/index.vue';\nimport { attachContent } from '@/config/global';\nimport { t } from '@/locales';\nimport { useSettingStore } from '@/store';\n\nconst storeSetting = useSettingStore();\n\nconst op = computed(() => [{ label: t('common.demo'), value: 'demo' }]);\nconst OUTPUT_OPTIONS = computed(() => [{ label: t('component.codeEditor.output.testResult'), value: 'testResult' }]);\n\nconst testResultRef = useTemplateRef<InstanceType<typeof Terminal>>('testResultRef');\n\nconst editConf = ref<IEditorOptions['normal']>({\n  automaticLayout: true, // 自动布局\n  fixedOverflowWidgets: true, // 溢出小部件固定\n  folding: true, // 代码折叠\n  fontFamily: 'JetBrainsMono, monospace',\n  fontLigatures: false, // 连字符\n  insertSpaces: false, // 使用空格代替制表符\n  language: 'html',\n  minimap: { enabled: true },\n  overviewRulerBorder: false, // 概览标尺边框\n  readOnly: false,\n  roundedSelection: false, // 选区边框圆角\n  scrollBeyondLastLine: false, // 滚动到最后一行后禁止继续滚动\n  scrollbar: {\n    useShadows: false,\n    verticalScrollbarSize: 5,\n    horizontalScrollbarSize: 5,\n  },\n  smoothScrolling: true,\n  stickyScroll: { enabled: false },\n  tabSize: 2,\n  theme: storeSetting.displayTheme === THEME.LIGHT ? 'code-light' : 'code-dark',\n  wordWrap: 'off',\n});\nconst termConf = ref<ITerminalOptions>({\n  convertEol: true,\n  cursorBlink: false,\n  cursorStyle: 'block',\n  cursorInactiveStyle: 'block',\n  fontSize: 13,\n  fontFamily: 'JetBrainsMono, monospace',\n  scrollback: 10000,\n  scrollSensitivity: 1,\n  smoothScrollDuration: 0,\n  theme: {\n    background: storeSetting.displayTheme === THEME.LIGHT ? '#e8e8e8' : '#393939',\n    cursor: storeSetting.displayTheme === THEME.LIGHT ? 'rgba(0, 0, 0, 0.9)' : 'rgba(255, 255, 255, 0.9)',\n    foreground: storeSetting.displayTheme === THEME.LIGHT ? 'rgba(0, 0, 0, 0.9)' : 'rgba(255, 255, 255, 0.9)',\n    selectionBackground: storeSetting.displayTheme === THEME.LIGHT ? 'rgba(0, 0, 0, 0.3)' : 'rgba(255, 255, 255, 0.3)',\n  },\n});\n\nconst siftFormData = ref({\n  class_parse: '',\n  class_name: '',\n  class_url: '',\n  cate_exclude: '首页|留言|APP|下载|资讯|新闻|动态',\n  reurl: '',\n  filter: '',\n  filterInfo: '',\n  exclude_keys: '',\n  matchs: {\n    // plot: 'show(.*?)/id',\n    // area: 'show(.*?)/id',\n    // lang: '(/lang.*?)\\.html@@',\n    // year: '(/year.*?)\\.html@@',\n    // letter: '(/letter.*?)\\.html@@',\n    // sort: '(/by.*?)/id'\n  },\n});\nconst reqFormData = ref<IReqConfig>({\n  method: 'GET',\n  url: '',\n  encode: 'UTF-8',\n  headers: '',\n  contentType: 'application/json',\n  data: '',\n});\n\nconst sourceCode = ref('');\nconst categoryResult = ref<ISiftCategoryResult['raw']>([]);\nconst siftResult = ref<any>({});\n\nconst active = ref({\n  editor: 'html' as const,\n  action: 'data' as const,\n  output: 'testResult' as const,\n});\nconst loading = ref({\n  category: false,\n  matchs: false,\n  sift: false,\n  allSift: false,\n});\n\nwatch(\n  () => storeSetting.displayTheme,\n  (val) => {\n    editConf.value.theme = val === THEME.LIGHT ? 'code-light' : 'code-dark';\n\n    termConf.value.theme = {\n      foreground: val === THEME.LIGHT ? 'rgba(0, 0, 0, 0.9)' : 'rgba(255, 255, 255, 0.9)',\n      background: val === THEME.LIGHT ? '#e8e8e8' : '#393939',\n      cursor: val === THEME.LIGHT ? 'rgba(0, 0, 0, 0.9)' : 'rgba(255, 255, 255, 0.9)',\n    };\n  },\n);\n\nconst actionGenerateCategory = async () => {\n  const { class_parse = '', cate_exclude = '', reurl = '' } = siftFormData.value;\n  const { url: baseUrl } = reqFormData.value;\n  const html = sourceCode.value;\n\n  if ([class_parse].some((x) => !isString(x) || isStrEmpty(x))) {\n    MessagePlugin.warning(t('pages.lab.sift.message.inputNoClassParse'));\n    return;\n  }\n\n  if (!isString(html) || isStrEmpty(html)) {\n    MessagePlugin.warning(t('pages.lab.sift.message.sourceFirst'));\n    return;\n  }\n\n  try {\n    loading.value.category = true;\n\n    const resp = await fetchEditSiftCategory({\n      html,\n      categoryRule: class_parse,\n      categoryExclude: cate_exclude,\n      categoryUrl: reurl,\n      baseUrl,\n    });\n\n    siftFormData.value.class_name = resp.title;\n    siftFormData.value.class_url = resp.uuid;\n    categoryResult.value = resp.raw;\n\n    logger('testResult', `${toHMS()} [Category]`, 'verbose', resp.raw);\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error(`Fail to generate category`, error);\n    logger('testResult', `${toHMS()} [Category]`, 'error', error);\n    MessagePlugin.error(`${t('common.error')}:${(error as Error).message}`);\n  } finally {\n    loading.value.category = false;\n  }\n};\n\nconst actionGenerateMatch = async () => {\n  const { filterInfo = '', filter = '', exclude_keys = '', matchs = {} } = siftFormData.value;\n  const html = sourceCode.value;\n\n  if ([filterInfo, filter].some((x) => !isString(x) || isStrEmpty(x))) {\n    MessagePlugin.warning(t('pages.lab.sift.message.inputNoFilterAndFilterInfo'));\n    return;\n  }\n\n  if (!isString(html) || isStrEmpty(html)) {\n    MessagePlugin.warning(t('pages.lab.sift.message.sourceFirst'));\n    return;\n  }\n\n  try {\n    loading.value.matchs = true;\n\n    const resp = await fetchEditSiftFilter({\n      html,\n      baseRule: filter,\n      detailRule: filterInfo,\n      matchs: {},\n      ci: '',\n      excludeKeys: exclude_keys,\n    });\n\n    const res = Object.fromEntries(\n      (resp?.fl ?? []).map((key: string) => [key, matchs[key] ?? '']).filter(([, value]) => value),\n    );\n\n    siftFormData.value.matchs = res;\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error(`Fail to generate matchs`, error);\n    MessagePlugin.error(`${t('common.error')}:${(error as Error).message}`);\n  } finally {\n    loading.value.matchs = false;\n  }\n};\n\nconst actionGenerateCurrentSift = async () => {\n  const { filterInfo = '', filter = '', exclude_keys = '', matchs = {} } = siftFormData.value;\n  const html = sourceCode.value;\n\n  if ([filterInfo, filter].some((x) => !isString(x) || isStrEmpty(x))) {\n    MessagePlugin.warning(t('pages.lab.sift.message.inputNoFilterAndFilterInfo'));\n    return;\n  }\n\n  if (!isString(html) || isStrEmpty(html)) {\n    MessagePlugin.warning(t('pages.lab.sift.message.sourceFirst'));\n    return;\n  }\n\n  try {\n    loading.value.sift = true;\n\n    const resp = await fetchEditSiftFilter({\n      html,\n      baseRule: filter,\n      detailRule: filterInfo,\n      matchs,\n      ci: '',\n      excludeKeys: exclude_keys,\n    });\n\n    logger('testResult', `${toHMS()} [CurrentSift]`, 'verbose', resp);\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error(`Fail to generate current sift`, error);\n    logger('testResult', `${toHMS()} [CurrentSift]`, 'error', error);\n    MessagePlugin.error(`${t('common.error')}:${(error as Error).message}`);\n  } finally {\n    loading.value.sift = false;\n  }\n};\n\nconst actionGenerateAllSift = async () => {\n  const classResult = categoryResult.value;\n  const { filterInfo = '', filter = '', exclude_keys = '', matchs = {} } = siftFormData.value;\n  const { method, encode, headers, data, contentType } = reqFormData.value;\n\n  if ([filterInfo, filter].some((x) => !isString(x) || isStrEmpty(x))) {\n    MessagePlugin.warning(t('pages.lab.sift.message.inputNoFilterAndFilterInfo'));\n    return;\n  }\n\n  if (!isObject(classResult) || isObjectEmpty(classResult)) {\n    MessagePlugin.warning(t('pages.lab.sift.message.classResultisEmpty'));\n    return;\n  }\n\n  try {\n    loading.value.allSift = true;\n\n    const codePromises = classResult.map(async (x) => {\n      return await handleReq({ url: x.source_url, method, encode, headers, data, contentType });\n    });\n    const codePesp = await Promise.all(codePromises);\n    const codeRes = codePesp.map((resp, index) => ({ id: classResult[index].uuid, code: resp?.data ?? '' }));\n\n    const filterPromises = codeRes.map(async (item) => {\n      const response = await fetchEditSiftFilter({\n        html: item.code,\n        baseRule: filter,\n        detailRule: filterInfo,\n        matchs,\n        ci: item.id,\n        excludeKeys: exclude_keys,\n      });\n      return { id: item.id, filters: response?.filters };\n    });\n    const filterResp = await Promise.all(filterPromises);\n    const filterRes = filterResp.reduce((a, { id, filters }) => (filters ? ((a[id] = filters), a) : a), {});\n\n    siftResult.value = filterRes;\n    logger('testResult', `${toHMS()} [FinalSift]`, 'verbose', filterRes);\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error(`Fail to generate final sift`, error);\n    logger('testResult', `${toHMS()} [FinalSift]`, 'error', error);\n    MessagePlugin.error(`${t('common.error')}:${(error as Error).message}`);\n  } finally {\n    loading.value.allSift = false;\n  }\n};\n\nconst actionCopyAllSift = async () => {\n  if (isObjectEmpty(siftResult.value)) {\n    MessagePlugin.warning(t('pages.lab.sift.message.siftResultisEmpty'));\n    return;\n  }\n\n  try {\n    const siftStr = JSON.stringify(siftResult.value, null, 2);\n    await navigator.clipboard.writeText(siftStr);\n    MessagePlugin.success(t('common.copySuccess'));\n  } catch {\n    MessagePlugin.error(t('common.copyFail'));\n  }\n};\n\nconst onReqResponse = (resp: IReqResponse) => {\n  sourceCode.value = resp.data ?? '';\n};\n\nconst handleOpChange = (type: string) => {\n  switch (type) {\n    case 'demo': {\n      handleOpDemo();\n      break;\n    }\n  }\n};\n\nconst handleOpDemo = () => {\n  reqFormData.value.url = 'https://www.dianying103.xyz/index.php/vod/show/id/1.html';\n\n  siftFormData.value.class_parse = String.raw`.myui-header__menu li.hidden-sm;a&&Text;a&&href;/type/id/(\\d+).html`;\n  siftFormData.value.reurl = 'https://www.dianying103.xyz/index.php/vod/show/id/fyclass.html';\n  siftFormData.value.cate_exclude = '首页|更新|热搜榜';\n  siftFormData.value.filter = 'body&&.myui-screen__list';\n  siftFormData.value.filterInfo = ';.text-muted&&Text;body&&a;a&&Text;a&&href';\n  siftFormData.value.matchs = {\n    年份: '(/year.*?)\\.html@@',\n    语言: '(/lang.*?)\\.html@@',\n    字母: '(/letter.*?)\\.html@@',\n    剧情: 'show(.*?)/id',\n    地区: 'show(.*?)/id',\n    排序: '(/by.*?)/id',\n  };\n};\n\n// output\n\nconst logger = (type: typeof active.value.output, prefix: string, level: ITerminalLog, text: unknown) => {\n  const printRef = type === 'testResult' ? testResultRef.value : null;\n  if (!printRef) return;\n\n  if (text instanceof Error) {\n    level = 'error';\n    text = text.message;\n  }\n\n  printRef?.write(text, level, true, prefix);\n};\n\nconst handleOutputChange = (val: typeof active.value.output) => {\n  active.value.output = val;\n};\n\nconst handleOutputClear = () => {\n  try {\n    console.clear();\n\n    testResultRef.value?.clear();\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error('Fail to clear output', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  padding: 0 var(--td-comp-paddingLR-s) var(--td-comp-paddingTB-s) 0;\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n\n  .header {\n    display: flex;\n    align-items: center;\n    flex-direction: row;\n    justify-content: space-between;\n\n    .left-operation-container {\n      display: flex;\n      align-items: center;\n      flex-direction: row;\n    }\n\n    .right-operation-container {\n      display: flex;\n      align-items: center;\n      flex-direction: row;\n    }\n  }\n\n  .content {\n    height: 100%;\n    width: 100%;\n    border-radius: var(--td-radius-medium);\n    overflow: hidden;\n    background-color: var(--td-bg-color-specialcomponent);\n\n    .editor-pane {\n      height: 100%;\n\n      .editor-pane-code {\n        height: 100%;\n        border-top: 2px solid var(--td-bg-color-component);\n      }\n    }\n\n    .action-pane {\n      height: 100%;\n\n      .action-pane-data {\n        display: flex;\n        flex-direction: column;\n        gap: var(--td-size-4);\n        padding: var(--td-comp-paddingTB-xs) var(--td-comp-paddingLR-xs);\n        overflow: hidden auto;\n        height: 100%;\n      }\n\n      .action-item {\n        display: flex;\n        flex-direction: column;\n        gap: var(--td-size-4);\n\n        .input-number-item {\n          width: 100%;\n        }\n      }\n\n      .final-item {\n        flex-direction: row;\n      }\n    }\n\n    .output-pane {\n      height: 100%;\n      background-color: var(--td-bg-color-component);\n      display: flex;\n      flex-direction: column;\n      overflow: hidden;\n\n      .output-header {\n        flex: 0;\n        height: calc(var(--td-comp-size-m) + var(--td-comp-paddingLR-xxs));\n        width: 100%;\n        padding: 0 var(--td-comp-paddingLR-s) var(--td-comp-paddingLR-xxs);\n        display: flex;\n        justify-content: space-between;\n        gap: var(--td-size-4);\n\n        .output-header-left {\n          flex: 1 1 auto;\n          height: var(--td-comp-size-m);\n        }\n\n        .output-header-right {\n          flex: 0 0 auto;\n          height: var(--td-comp-size-m);\n          display: flex;\n          align-items: center;\n          gap: var(--td-size-4);\n\n          .output-reconnect,\n          .output-clear {\n            cursor: pointer;\n            color: var(--td-text-color-secondary);\n\n            &:hover {\n              color: var(--td-text-color-primary);\n            }\n          }\n        }\n      }\n\n      .output-content {\n        flex: 1 1 auto;\n        height: 100%;\n        width: 100%;\n        overflow: hidden;\n      }\n    }\n  }\n}\n\n:deep(.t-tabs) {\n  height: 100%;\n\n  .t-tabs__nav-item.t-size-m {\n    height: var(--td-comp-size-m);\n    line-height: var(--td-comp-size-m);\n  }\n\n  .t-tabs__nav--card {\n    background-color: var(--td-bg-color-secondarycontainer);\n\n    &.t-tabs__nav-item {\n      border-color: transparent;\n\n      --ripple-color: transparent;\n\n      &.t-is-active {\n        border-color: var(--td-bg-color-secondarycontainer);\n        border-bottom-color: transparent;\n        border-radius: var(--td-radius-medium) var(--td-radius-medium) 0 0;\n        color: var(--td-text-color-primary);\n        background-color: var(--td-bg-color-component);\n\n        &:first-of-type {\n          border-right: 1px solid var(--td-bg-color-secondarycontainer);\n          border-top-left-radius: 0;\n        }\n\n        &:last-of-type {\n          border-right: 1px solid var(--td-bg-color-secondarycontainer);\n        }\n\n        &:not(:first-of-type) {\n          border-left: 1px solid var(--td-bg-color-secondarycontainer);\n        }\n      }\n\n      &:not(.t-is-disabled, .t-is-active):hover {\n        background-color: transparent;\n      }\n    }\n  }\n\n  .t-tabs__content {\n    background-color: transparent;\n    height: calc(100% - var(--td-comp-size-m));\n    width: 100%;\n    overflow: hidden;\n\n    .t-tab-panel {\n      height: 100%;\n      width: 100%;\n    }\n  }\n\n  &.pane-right {\n    .t-tabs__content {\n      border-right: 2px solid var(--td-bg-color-component);\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/lab/components/sniffer/index.vue",
    "content": "<template>\n  <div class=\"lab-sniffer view-component-container\">\n    <div class=\"content\">\n      <div class=\"input\">\n        <p class=\"title-label\">{{ $t('common.input') }}</p>\n        <t-form\n          ref=\"formRef\"\n          :data=\"formData\"\n          :rules=\"RULES\"\n          :label-width=\"80\"\n          required-mark-position=\"right\"\n          label-align=\"left\"\n          reset-type=\"initial\"\n          @submit=\"onSubmit\"\n          @reset=\"onReset\"\n        >\n          <t-form-item :label=\"$t('common.url')\" name=\"url\">\n            <t-input v-model=\"formData.url\" />\n          </t-form-item>\n          <t-collapse class=\"t-form__item\">\n            <t-collapse-panel value=\"complete-import\" :header=\"$t('common.optionalParams')\">\n              <t-form-item :label=\"$t('common.request.headers')\" name=\"headers\">\n                <t-textarea\n                  v-model=\"formData.headers\"\n                  :autosize=\"{ minRows: 2, maxRows: 5 }\"\n                  :placeholder=\"$t('common.placeholder.request.headers')\"\n                />\n              </t-form-item>\n              <t-form-item :label=\"$t('pages.lab.sniffer.field.initScript')\" name=\"initScript\">\n                <t-textarea\n                  v-model=\"formData.initScript\"\n                  :autosize=\"{ minRows: 2, maxRows: 5 }\"\n                  :placeholder=\"\n                    $t('common.placeholder.inputEg', [\n                      `Object.defineProperty(navigator, 'webdriver', { get: () => false })`,\n                    ])\n                  \"\n                />\n              </t-form-item>\n              <t-form-item :label=\"$t('pages.lab.sniffer.field.runScript')\" name=\"runScript\">\n                <t-textarea\n                  v-model=\"formData.runScript\"\n                  :autosize=\"{ minRows: 2, maxRows: 5 }\"\n                  :placeholder=\"$t('common.placeholder.inputEg', [`document.querySelector('.btn').click()`])\"\n                />\n              </t-form-item>\n              <t-form-item :label=\"$t('pages.lab.sniffer.field.customRegex')\" name=\"customRegex\">\n                <t-textarea\n                  v-model=\"formData.customRegex\"\n                  :autosize=\"{ minRows: 2, maxRows: 5 }\"\n                  :placeholder=\"$t('common.placeholder.inputEg', [`\\\\.(m3u8|mp4|flv|mkv)`])\"\n                />\n              </t-form-item>\n              <t-form-item :label=\"$t('pages.lab.sniffer.field.snifferExclude')\" name=\"snifferExclude\">\n                <t-textarea\n                  v-model=\"formData.snifferExclude\"\n                  :autosize=\"{ minRows: 2, maxRows: 5 }\"\n                  :placeholder=\"$t('common.placeholder.inputEg', [`(?:\\\\?|&)url=https?://`])\"\n                />\n              </t-form-item>\n            </t-collapse-panel>\n          </t-collapse>\n        </t-form>\n      </div>\n      <div class=\"action\">\n        <p class=\"title-label\">{{ $t('common.action') }}</p>\n        <div class=\"content-action\">\n          <t-button theme=\"default\" variant=\"base\" block @click=\"handleReset\">{{ $t('common.reset') }}</t-button>\n          <t-button theme=\"primary\" variant=\"base\" block @click=\"handleSubmit\">{{ $t('common.execute') }}</t-button>\n        </div>\n      </div>\n      <div class=\"output\">\n        <p class=\"title-label\">{{ $t('common.output') }}</p>\n        <div class=\"content-output\">\n          <t-textarea\n            v-model=\"output\"\n            :autosize=\"{ minRows: 2, maxRows: 5 }\"\n            readonly\n            class=\"output-textarea\"\n            @click=\"handleCopy\"\n          />\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\nimport { jsonStrToObj } from '@shared/modules/obj';\nimport { isJsonStr } from '@shared/modules/validate';\nimport JSON5 from 'json5';\nimport type { FormInstanceFunctions, SubmitContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { ref, useTemplateRef } from 'vue';\n\nimport { cdpSnifferMedia } from '@/api/system';\nimport { t } from '@/locales';\n\nconst RULES = {\n  url: [{ required: true }, { url: { protocols: ['http', 'https'], require_protocol: true } }],\n  headers: [{ validator: (val: string) => isJsonStr(val) || val === '' }],\n};\n\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\n\nconst formData = ref({\n  url: '',\n  headers: '',\n  snifferExclude: '',\n  customRegex: '',\n  initScript: '',\n  runScript: '',\n});\nconst output = ref('');\n\nconst handleExecute = async () => {\n  const { url, headers: headersRaw, runScript, initScript, customRegex, snifferExclude } = formData.value;\n  const headers = jsonStrToObj(headersRaw);\n\n  const resp = await cdpSnifferMedia({\n    url,\n    options: {\n      runScript,\n      initScript,\n      customRegex,\n      snifferExclude,\n      headers,\n    },\n  });\n\n  if (resp?.url) {\n    output.value = JSON5.stringify(resp, null, 2);\n    MessagePlugin.success(t('common.success'));\n  } else {\n    output.value = '';\n    MessagePlugin.warning(t('common.fail'));\n  }\n};\n\nconst handleReplace = () => {\n  output.value = '';\n};\n\nconst handleCopy = async (e: Event) => {\n  const val = (e.target as HTMLTextAreaElement).value;\n  if (!val) return;\n\n  try {\n    await navigator.clipboard.writeText(val);\n    MessagePlugin.success(t('common.copySuccess'));\n  } catch (error) {\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst onSubmit = (context: SubmitContext<FormData>) => {\n  const { validateResult, firstError } = context;\n  if (validateResult && typeof validateResult === 'boolean') {\n    handleExecute();\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\nconst onReset = () => {\n  handleReplace();\n};\n\nconst handleSubmit = () => {\n  formRef.value?.submit();\n};\n\nconst handleReset = () => {\n  formRef.value?.reset();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  padding: 0 var(--td-comp-paddingLR-s) var(--td-comp-paddingTB-s) 0;\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n  overflow-y: auto;\n\n  .content {\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n\n    .input {\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n    }\n\n    .action {\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n\n      .content-action {\n        display: flex;\n        gap: var(--td-size-4);\n      }\n    }\n\n    .output {\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n\n      .content-output {\n        flex: 1;\n\n        .output-textarea {\n          height: 100%;\n\n          :deep(textarea) {\n            height: 100% !important;\n            min-height: 200px !important;\n          }\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/lab/index.vue",
    "content": "<template>\n  <div class=\"lab view-container\">\n    <common-nav :list=\"componentNav\" :active=\"active\" class=\"sidebar\" @change=\"onNavChange\" />\n\n    <div class=\"content\">\n      <div class=\"container\">\n        <keep-alive>\n          <component :is=\"currentComponent\" class=\"content-wrapper\"></component>\n        </keep-alive>\n      </div>\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { computed, defineAsyncComponent, shallowRef } from 'vue';\n\nimport CommonNav from '@/components/common-nav/index.vue';\nimport { t } from '@/locales';\nimport { useSettingStore } from '@/store';\n\nconst storeSetting = useSettingStore();\n\nconst componentMap = {\n  crypto: defineAsyncComponent(() => import('./components/crypto/index.vue')),\n  diff: defineAsyncComponent(() => import('./components/diff/index.vue')),\n  edit: defineAsyncComponent(() => import('./components/edit/index.vue')),\n  sift: defineAsyncComponent(() => import('./components/sift/index.vue')),\n  sniffer: defineAsyncComponent(() => import('./components/sniffer/index.vue')),\n  player: defineAsyncComponent(() => import('./components/player/index.vue')),\n  extension: defineAsyncComponent(() => import('./components/extension/index.vue')),\n};\n\nconst currentComponent = shallowRef(componentMap[storeSetting.nav.lab || 'crypto']);\n\nconst active = computed(() => storeSetting.nav.lab || 'crypto');\nconst componentNav = computed(() => [\n  { id: 'crypto', name: t('pages.lab.crypto.title') },\n  { id: 'diff', name: t('pages.lab.diff.title') },\n  { id: 'edit', name: t('pages.lab.edit.title') },\n  { id: 'sift', name: t('pages.lab.sift.title') },\n  { id: 'sniffer', name: t('pages.lab.sniffer.title') },\n  { id: 'player', name: t('pages.lab.player.title') },\n  { id: 'extension', name: t('pages.lab.extension.title') },\n]);\n\nconst onNavChange = (item: string) => {\n  storeSetting.updateConfig({ nav: { ...storeSetting.nav, lab: item } });\n\n  if (Object.hasOwn(componentMap, item)) {\n    currentComponent.value = componentMap[item];\n  }\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  height: 100%;\n  width: 100%;\n  display: flex;\n  flex-direction: row;\n  gap: var(--td-size-4);\n\n  .sidebar {\n    flex-grow: 0;\n    flex-shrink: 0;\n  }\n\n  .content {\n    height: 100%;\n    width: 100%;\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n    overflow: hidden;\n\n    .container {\n      flex: 1;\n      height: 100%;\n      width: 100%;\n\n      .content-wrapper {\n        width: 100%;\n        height: 100%;\n        position: relative;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/live/index.vue",
    "content": "<template>\n  <div class=\"live view-container\">\n    <common-nav :list=\"navList\" :active=\"active.nav\" search class=\"sidebar\" @change=\"onNavChange\" />\n\n    <div class=\"content\">\n      <div v-if=\"classList.length > 1\" class=\"header\">\n        <title-menu :list=\"classList\" :active=\"active.class\" class=\"nav\" @change=\"onClassChange\" />\n      </div>\n\n      <div id=\"back-top\" class=\"container\">\n        <div class=\"content-wrapper\">\n          <t-row :gutter=\"[16, 4]\" style=\"margin-left: -8px; margin-right: -8px\">\n            <t-col\n              v-for=\"item in channelList\"\n              :key=\"item.id\"\n              :md=\"4\"\n              :xl=\"3\"\n              :xxl=\"2\"\n              class=\"card\"\n              @click=\"playEvent(item)\"\n            >\n              <div class=\"card-main\">\n                <div v-if=\"config.extra.delay\" class=\"card-tag card-tag-delay\">\n                  <span\n                    v-if=\"item.delay\"\n                    class=\"card-tag-text\"\n                    :class=\"[item.delay < 500 ? 'card-tag-text-success' : 'card-tag-text-error']\"\n                  >\n                    {{ item.delay < 9999 ? `${item.delay}ms` : '9999ms' }}\n                  </span>\n                  <span v-else class=\"card-tag-text card-tag-text-error\">\n                    {{ $t('common.unknown') }}\n                  </span>\n                </div>\n                <div v-if=\"config.extra.ipMark\" class=\"card-tag card-tag-ip\">\n                  <span\n                    class=\"card-tag-text\"\n                    :class=\"[item.ipMark !== -1 ? 'card-tag-text-success' : 'card-tag-text-error']\"\n                  >\n                    {{ item.ipMark !== -1 ? `IPV${item.ipMark}` : $t('common.unknown') }}\n                  </span>\n                </div>\n                <t-image\n                  class=\"card-main-item\"\n                  :src=\"isThumbnail(item) ? item.thumbnail : item.logo\"\n                  :class=\"{ 'card-main-logo-item': !isThumbnail(item) }\"\n                  :lazy=\"true\"\n                  fit=\"cover\"\n                  shape=\"round\"\n                  :loading=\"renderDefaultLazy\"\n                  :error=\"renderDefaultLazy\"\n                />\n              </div>\n              <div class=\"card-footer\">\n                <p class=\"card-footer-title txthide txthide1\">{{ item.name }}</p>\n              </div>\n            </t-col>\n          </t-row>\n\n          <div class=\"infinite-loading\">\n            <infinite-loading\n              v-if=\"active.lazyload\"\n              class=\"infinite-loading-container\"\n              :identifier=\"infiniteId\"\n              :duration=\"200\"\n              @infinite=\"loadMore\"\n            >\n              <template #complete>{{ LOAD_TEXT_OPTIONS[active.loadStatus] }}</template>\n              <template #error>{{ $t('common.infiniteLoading.error') }}</template>\n            </infinite-loading>\n            <infinite-loading v-else class=\"infinite-loading-container\" />\n          </div>\n        </div>\n      </div>\n    </div>\n    <t-loading :attach=\"`.${attachContent}`\" size=\"medium\" :loading=\"active.loading\" />\n    <t-back-top container=\"#back-top\" size=\"small\" :offset=\"['1rem', '0.8rem']\" :duration=\"2000\" />\n  </div>\n</template>\n<script setup lang=\"tsx\">\nimport 'v3-infinite-loading/lib/style.css';\n\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { checkIpVersion } from '@shared/modules/ip';\nimport { isArray, isArrayEmpty, isNil, isPositiveFiniteNumber } from '@shared/modules/validate';\nimport type { IModels } from '@shared/types/db';\nimport PQueue from 'p-queue';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport InfiniteLoading from 'v3-infinite-loading';\nimport type { StateHandler as ILoadStateHdandler } from 'v3-infinite-loading/lib/types';\nimport { computed, onActivated, onMounted, onUnmounted, ref } from 'vue';\n\nimport { fetchChannelPage, fetchIptvActive, putIptvDefault } from '@/api/live';\nimport { addHistory, findHistory, putHistory } from '@/api/moment';\nimport { generateFfmpegScreenshot } from '@/api/system';\nimport CommonNav from '@/components/common-nav/index.vue';\nimport LazyBg from '@/components/lazy-bg/index.vue';\nimport TitleMenu from '@/components/title-menu/index.vue';\nimport { emitterChannel, emitterSource } from '@/config/emitterChannel';\nimport { attachContent } from '@/config/global';\nimport { t } from '@/locales';\nimport { usePlayerStore } from '@/store';\nimport emitter from '@/utils/emitter';\nimport { normalRequest } from '@/utils/request';\n\ntype IChannel = IModels['channel'] & {\n  delay?: number;\n  thumbnail?: string;\n  ipMark?: number;\n};\n\nconst storePlayer = usePlayerStore();\n\nconst renderDefaultLazy = () => <LazyBg class=\"render-icon\" />;\n\nconst queues = {\n  delay: new PQueue({ concurrency: 5 }),\n  ip: new PQueue({ concurrency: 5 }),\n  thumbnail: new PQueue({ concurrency: 5 }),\n};\n\nconst searchValue = ref('');\nconst infiniteId = ref(Date.now());\n\nconst pagination = ref({\n  pageIndex: 1,\n  pageSize: 32,\n  total: 0,\n});\n\nconst config = ref({\n  default: {} as IModels['iptv'],\n  list: [] as IModels['iptv'][],\n  extra: {\n    epg: 'https://epg.112114.eu.org/?ch={name}&date={date}',\n    logo: 'https://epg.112114.eu.org/logo/{name}.png',\n    ipMark: true,\n    delay: false,\n    thumbnail: false,\n  },\n});\nconst channelList = ref<IChannel[]>([]);\nconst classList = ref<Array<{ type_id: string; type_name: string }>>([]);\n\nconst active = ref({\n  loadStatus: 'complete' as 'complete' | 'error' | 'noConfig' | 'noSelect',\n  nav: '',\n  class: '',\n  lazyload: false,\n  loading: false,\n});\n\nconst navList = computed(() => config.value.list.map((t) => ({ id: t.id, name: t.name })));\nconst isThumbnail = computed(() => (item: IChannel) => config.value.extra.thumbnail && item.thumbnail);\nconst LOAD_TEXT_OPTIONS = computed(() => ({\n  complete: t('common.infiniteLoading.complete'),\n  error: t('common.infiniteLoading.error'),\n  noSelect: t('common.infiniteLoading.noSelect'),\n  noConfig: t('pages.live.infiniteLoading.noConfig'),\n}));\n\nonMounted(() => getSetting());\n\nonActivated(() => {\n  emitter.off(emitterChannel.REFRESH_LIVE_CONFIG, reloadConfig);\n  emitter.on(emitterChannel.REFRESH_LIVE_CONFIG, reloadConfig);\n\n  emitter.off(emitterChannel.SEARCH_LIVE_RECOMMEND, onSearchRecommend);\n  emitter.on(emitterChannel.SEARCH_LIVE_RECOMMEND, onSearchRecommend);\n});\n\nonUnmounted(() => {\n  clearAllQueues();\n});\n\nconst clearAllQueues = () => {\n  Object.values(queues).forEach((queue) => {\n    if (queue.size > 0) {\n      queue.pause();\n      queue.clear();\n      queue.start();\n    }\n  });\n};\n\nconst resetPagination = () => {\n  pagination.value.pageIndex = 1;\n  pagination.value.total = 0;\n};\n\nconst getSetting = async () => {\n  try {\n    const resp = await fetchIptvActive();\n    if (resp?.default) {\n      config.value.default = resp.default;\n      active.value.nav = resp.default.id;\n    }\n    if (resp?.list) config.value.list = resp.list;\n    if (resp?.extra) config.value.extra = resp.extra;\n\n    active.value.loadStatus =\n      resp?.default && resp.list.length ? 'complete' : resp.list.length ? 'noSelect' : 'noConfig';\n  } catch (error) {\n    console.error(`Failed to get iptv config:`, error);\n    active.value.loadStatus = 'error';\n  } finally {\n    active.value.lazyload = true;\n  }\n};\n\nconst getChannel = async (): Promise<number> => {\n  const { pageIndex, pageSize } = pagination.value;\n\n  const resp = await fetchChannelPage({\n    page: pageIndex,\n    pageSize,\n    kw: searchValue.value,\n    group: active.value.class,\n  });\n\n  if (isArray(resp.class) && !isArrayEmpty(resp.class)) {\n    classList.value = [\n      { type_id: '', type_name: computed(() => t('common.all')) },\n      ...resp.class.map((item) => ({\n        type_id: item.value,\n        type_name: item.label,\n      })),\n    ];\n    active.value.class = classList.value.map((item) => item.type_id).includes(active.value.class)\n      ? active.value.class\n      : classList.value[0].type_id;\n  }\n\n  if (isArray(resp.list) && !isArrayEmpty(resp.list)) {\n    channelList.value.push(...resp.list);\n\n    const { ipMark, delay, thumbnail } = config.value.extra;\n    if (delay) processChannelDelay(resp.list);\n    if (thumbnail) processChannelThumbnail(resp.list);\n    if (ipMark) processChannelIp(resp.list);\n  }\n\n  if (resp.total) pagination.value.total = resp.total;\n\n  return resp.list.length;\n};\n\nconst loadMoreChannel = async (): Promise<number> => {\n  const length = await getChannel();\n  if (length !== 0) pagination.value.pageIndex++;\n  return length;\n};\n\nconst updateChannelProperty = <K extends keyof IChannel>(id: string, key: K, value: IChannel[K]) => {\n  const index = channelList.value.findIndex((item) => item.id === id);\n  if (index !== -1) {\n    channelList.value[index][key] = value;\n  }\n};\n\nconst processChannelIp = (list: IChannel[]) => {\n  list.forEach((item) => {\n    queues.ip.add(async () => {\n      try {\n        const hostname = new URL(item.api)?.hostname;\n        const version = checkIpVersion(hostname);\n        updateChannelProperty(item.id, 'ipMark', version);\n      } catch (error) {\n        console.error(`Failed to check ${item.api} IP version:`, error);\n        updateChannelProperty(item.id, 'ipMark', -1);\n      }\n    });\n  });\n};\n\nconst processChannelDelay = (list: IChannel[]) => {\n  list.forEach((item) => {\n    queues.delay.add(async () => {\n      try {\n        const start = Date.now();\n        await normalRequest.request({\n          url: item.api,\n          method: 'GET',\n          headers: { Range: 'bytes=0-1' },\n        });\n        const delay = Date.now() - start;\n        updateChannelProperty(item.id, 'delay', delay);\n      } catch (error) {\n        console.error('Failed to gain delay:', error);\n        updateChannelProperty(item.id, 'delay', 9999);\n      }\n    });\n  });\n};\n\nconst processChannelThumbnail = (list: IChannel[]) => {\n  list.forEach((item) => {\n    queues.thumbnail.add(async () => {\n      try {\n        const thumbnail = await generateFfmpegScreenshot({ url: item.api });\n        updateChannelProperty(item.id, 'thumbnail', thumbnail);\n      } catch (error) {\n        console.error('Failed to generate thumbnail:', error);\n      }\n    });\n  });\n};\n\nconst loadMore = async ($state: ILoadStateHdandler) => {\n  try {\n    if (active.value.loadStatus !== 'complete') {\n      $state.complete();\n      return;\n    }\n\n    const length = await loadMoreChannel();\n    length === 0 ? $state.complete() : $state.loaded();\n  } catch (error) {\n    console.error(`Failed to load more data:`, error);\n    $state.error();\n  }\n};\n\nconst handleSearch = async () => {\n  resetPagination();\n\n  channelList.value = [];\n\n  infiniteId.value = Date.now();\n};\n\nconst onSearchRecommend = ({ data: eventData }) => {\n  const { source, data: kw } = eventData;\n  if (source === emitterSource.PAGE_SHOW) return;\n\n  searchValue.value = kw;\n  clearAllQueues();\n  handleSearch();\n};\n\nconst onClassChange = (id: string) => {\n  clearAllQueues();\n  resetPagination();\n\n  channelList.value = [];\n\n  active.value.class = id;\n\n  infiniteId.value = Date.now();\n};\n\nconst createHistoryDoc = (item: IChannel, siteKey: string) => ({\n  type: 2,\n  relateId: siteKey,\n  siteSource: item.group,\n  playEnd: false,\n  videoId: item.id,\n  videoImage: item.logo,\n  videoName: item.name,\n  videoIndex: `${item.name}$${item.api}`,\n  watchTime: 0,\n  duration: 0,\n  skipTimeInStart: 0,\n  skipTimeInEnd: 0,\n});\n\nconst saveHistoryData = async (doc: ReturnType<typeof createHistoryDoc>, relateId: string, videoId: string) => {\n  const resp = await findHistory({ relateId, videoId, type: 2 });\n\n  const id = resp?.id;\n  if (!isNil(id) && isPositiveFiniteNumber(resp.watchTime)) doc.watchTime = resp.watchTime;\n  if (!isNil(id) && isPositiveFiniteNumber(resp.duration)) doc.duration = resp.duration;\n  if (!isNil(id) && isPositiveFiniteNumber(resp.skipTimeInStart)) doc.skipTimeInStart = resp.skipTimeInStart;\n  if (!isNil(id) && isPositiveFiniteNumber(resp.skipTimeInEnd)) doc.skipTimeInEnd = resp.skipTimeInEnd;\n\n  isNil(id) ? await addHistory(doc) : await putHistory({ id: [id], doc });\n};\n\nconst playEvent = async (item: IChannel) => {\n  active.value.loading = true;\n\n  try {\n    const site = config.value.default;\n    const player = storePlayer.player;\n\n    if (player.type === 'custom') {\n      playWithExternalPlayer(item, site);\n    } else {\n      playWithInternalPlayer(item, site);\n    }\n  } catch (error) {\n    console.error('Failed to play:', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  } finally {\n    active.value.loading = false;\n  }\n};\n\nconst playWithExternalPlayer = async (item: IChannel, active: IModels['iptv']) => {\n  const player = storePlayer.player;\n\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.CALL_PLAYER, player.external, item.api);\n\n  const historyDoc = createHistoryDoc(item, active.key);\n  await saveHistoryData(historyDoc, active.key, item.id);\n};\n\nconst playWithInternalPlayer = (item: IChannel, active: IModels['iptv']) => {\n  storePlayer.updateConfig({\n    type: 'live',\n    status: true,\n    data: { info: item, extra: { active, site: config.value.list } },\n  });\n\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_PLAYER);\n};\n\nconst defaultConfig = () => {\n  clearAllQueues();\n  resetPagination();\n\n  searchValue.value = '';\n\n  active.value.lazyload = false;\n  active.value.loadStatus = 'complete';\n  active.value.class = '';\n  active.value.nav = '';\n\n  classList.value = [];\n  channelList.value = [];\n\n  config.value.default = {} as IModels['iptv'];\n};\n\nconst reloadConfig = async ({ data: eventData }) => {\n  const { source } = eventData;\n  if (source === emitterSource.PAGE_SHOW) return;\n\n  defaultConfig();\n  await getSetting();\n\n  infiniteId.value = Date.now();\n};\n\nconst onNavChange = async (id: string) => {\n  try {\n    defaultConfig();\n    active.value.class = '';\n    active.value.nav = id;\n    await putIptvDefault(id);\n    config.value.default = config.value.list.find((item) => item.id === id)!;\n    emitter.emit(emitterChannel.REFRESH_LIVE_CONFIG, { source: emitterSource.PAGE_SHOW });\n\n    infiniteId.value = Date.now();\n  } catch (error) {\n    console.error(`Failed to change config:`, error);\n  } finally {\n    active.value.lazyload = true;\n  }\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  height: 100%;\n  width: 100%;\n  display: flex;\n  flex-direction: row;\n  gap: var(--td-size-4);\n\n  .sidebar {\n    flex: 0 0 auto;\n  }\n\n  .content {\n    height: 100%;\n    width: 100%;\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n    overflow: hidden;\n    position: relative;\n\n    .header {\n      width: 100%;\n      padding: 0 var(--td-comp-paddingLR-s) 0 0;\n\n      .nav {\n        width: 100%;\n        overflow: hidden;\n      }\n    }\n\n    .container {\n      flex: 1;\n      height: 100%;\n      width: 100%;\n      overflow: auto;\n      padding: 0 var(--td-comp-paddingLR-s) 0 0;\n\n      .content-wrapper {\n        width: 100%;\n        height: 100%;\n        position: relative;\n\n        .card {\n          width: inherit;\n          cursor: pointer;\n\n          .card-main {\n            position: relative;\n            width: 100%;\n            height: 0;\n            overflow: hidden;\n            border-radius: var(--td-radius-medium);\n            padding-top: 62%;\n            background-color: var(--td-bg-color-component);\n            transition: all 0.25s ease-in-out;\n\n            .card-tag {\n              height: var(--td-comp-size-xxs);\n              padding: 0 var(--td-comp-paddingLR-xs);\n              background-color: var(--td-bg-color-container);\n              border-radius: var(--td-radius-medium);\n              box-shadow: var(--td-shadow-1);\n              display: flex;\n              flex-direction: row;\n              align-items: center;\n              position: absolute;\n              z-index: 2;\n\n              &-delay {\n                top: var(--td-size-3);\n                right: var(--td-size-3);\n              }\n\n              &-ip {\n                bottom: var(--td-size-3);\n                left: var(--td-size-3);\n              }\n\n              &-text {\n                color: var(--td-text-color-secondary);\n                font-weight: 500;\n                font-size: var(--td-font-size-mark-small);\n                height: var(--td-comp-size-xxs);\n                line-height: var(--td-line-height-mark-small);\n              }\n\n              &-text-error {\n                color: var(--td-error-color);\n              }\n\n              &-text-success {\n                color: var(--td-success-color);\n              }\n            }\n\n            .card-main-item {\n              position: absolute;\n              top: 0;\n              left: 0;\n              display: block;\n              width: 100%;\n              height: 100%;\n\n              :deep(.render-icon) {\n                height: var(--td-comp-size-xxxl);\n                width: var(--td-comp-size-xxxl);\n                background: transparent;\n              }\n\n              :deep(img) {\n                transition: all 0.25s ease-in-out;\n              }\n            }\n\n            .card-main-logo-item {\n              padding: 35px 30px;\n            }\n          }\n\n          .card-footer {\n            padding: var(--td-comp-paddingTB-xs) 0 var(--td-comp-paddingTB-xxs) 0;\n\n            .card-footer-title {\n              font-weight: 500;\n              font-size: var(--td-font-size-title-medium);\n              line-height: var(--td-line-height-title-medium);\n              color: var(--td-text-color-primary);\n              transition: all 0.25s ease-in-out;\n            }\n          }\n\n          &:hover {\n            .card-main {\n              .card-main-item {\n                :deep(img) {\n                  transform: scale(1.05);\n                }\n              }\n            }\n\n            .card-footer {\n              .card-footer-title {\n                color: var(--td-brand-color);\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\n.infinite-loading-container {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  color: var(--td-text-color-placeholder);\n  text-align: center;\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/moment/components/history/index.vue",
    "content": "<template>\n  <div class=\"moment-history view-component-container\">\n    <div class=\"content\">\n      <div id=\"back-top\" class=\"container\">\n        <div class=\"content-wrapper\">\n          <div v-for=\"(historyList, name, index) in historyData\" :key=\"index\" class=\"content-wrapper-content\">\n            <template v-if=\"historyList.length !== 0\">\n              <div class=\"content-wrapper-header\">\n                <span class=\"title\">{{ translateDate[name] }}</span>\n              </div>\n              <div class=\"content-wrapper-main\">\n                <t-row :gutter=\"[16, 4]\" style=\"margin-left: -8px; margin-right: -8px\">\n                  <t-col\n                    v-for=\"item in historyList\"\n                    :key=\"item.id\"\n                    :md=\"4\"\n                    :xl=\"3\"\n                    :xxl=\"2\"\n                    class=\"card\"\n                    @click=\"playEvent(item)\"\n                  >\n                    <div class=\"card-main\">\n                      <div class=\"card-tag card-tag-mask\">\n                        <span v-if=\"item.type === 1\" class=\"card-tag-text txthide txthide1\">\n                          {{ $t('pages.film.title') }}\n                        </span>\n                        <span v-else-if=\"item.type === 2\" class=\"card-tag-text txthide txthide1\">\n                          {{ $t('pages.live.title') }}\n                        </span>\n                        <span v-else-if=\"item.type === 3\" class=\"card-tag-text txthide txthide1\">\n                          {{ $t('pages.parse.title') }}\n                        </span>\n                      </div>\n                      <div class=\"card-tag card-tag-close\" @click.stop=\"handleRemoveItem(item)\">\n                        <delete-icon class=\"t-icon t-icon-delete\" />\n                      </div>\n                      <t-image\n                        class=\"card-main-item\"\n                        :src=\"item.videoImage\"\n                        :lazy=\"true\"\n                        fit=\"cover\"\n                        shape=\"round\"\n                        :loading=\"renderDefaultLazy\"\n                        :error=\"renderDefaultLazy\"\n                      >\n                        <template #overlayContent>\n                          <div class=\"summary\">\n                            <span class=\"summary-text\">\n                              {{ item?.relateSite?.name ? item.relateSite.name : $t('pages.moment.noRelatedSource') }}\n                            </span>\n                          </div>\n                        </template>\n                      </t-image>\n                    </div>\n                    <div class=\"card-footer\">\n                      <p class=\"card-footer-title txthide txthide1\">\n                        <span class=\"title-name\">{{ item.videoName }}</span>\n                        <span v-if=\"item.type === 1\" class=\"title-index\">\n                          {{ formatFilmIndex(item.videoIndex!) }}\n                        </span>\n                      </p>\n                      <p class=\"card-footer-desc txthide txthide1\">\n                        <laptop-icon size=\"14px\" class=\"tiles-item_watch_pc icon\" />\n                        <span v-if=\"item.playEnd\" class=\"tiles-item_desc_watch\">\n                          {{ $t('pages.moment.progress.watched') }}\n                        </span>\n                        <span v-else class=\"tiles-item_desc_watch\">\n                          {{ $t('pages.moment.progress.watching') }}\n                          {{ formatProgress(item.watchTime ?? 0, item.duration ?? 0) }}\n                        </span>\n                      </p>\n                    </div>\n                  </t-col>\n                </t-row>\n              </div>\n            </template>\n          </div>\n\n          <infinite-loading\n            class=\"infinite-loading-container\"\n            :identifier=\"infiniteId\"\n            :duration=\"200\"\n            @infinite=\"loadMore\"\n          >\n            <template #complete>{{ $t('common.infiniteLoading.complete') }}</template>\n            <template #error>{{ $t('common.infiniteLoading.error') }}</template>\n          </infinite-loading>\n        </div>\n      </div>\n    </div>\n\n    <t-loading :attach=\"`.${attachContent}`\" size=\"medium\" :loading=\"active.loading\" />\n    <t-back-top container=\"#back-top\" size=\"small\" :offset=\"['1rem', '0.8rem']\" :duration=\"2000\" />\n\n    <dialog-detail-view\n      v-model:visible=\"dialogState.visibleDetail\"\n      :extra=\"detailFormData.extra\"\n      :info=\"detailFormData.info\"\n    />\n  </div>\n</template>\n<script setup lang=\"tsx\">\nimport 'v3-infinite-loading/lib/style.css';\n\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { toAgoDay } from '@shared/modules/date';\nimport {\n  isArray,\n  isArrayEmpty,\n  isHttp,\n  isNil,\n  isObject,\n  isObjectEmpty,\n  isPositiveFiniteNumber,\n  isStrEmpty,\n  isString,\n} from '@shared/modules/validate';\nimport type { ICmsInfo } from '@shared/types/cms';\nimport type { IModels } from '@shared/types/db';\nimport { DeleteIcon, LaptopIcon } from 'tdesign-icons-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport InfiniteLoading from 'v3-infinite-loading';\nimport type { StateHandler as ILoadStateHdandler } from 'v3-infinite-loading/lib/types';\nimport { computed, onActivated, ref, watch } from 'vue';\n\nimport { fetchCmsDetail } from '@/api/film';\nimport { fetchChannelDetail } from '@/api/live';\nimport { addHistory, delHistory, fetchHistoryPage, findHistory, putHistory } from '@/api/moment';\nimport { fetchParse } from '@/api/parse';\nimport LazyBg from '@/components/lazy-bg/index.vue';\nimport { emitterChannel, emitterSource } from '@/config/emitterChannel';\nimport { attachContent } from '@/config/global';\nimport { t } from '@/locales';\nimport DialogDetailView from '@/pages/film/components/DialogDetail.vue';\nimport { usePlayerStore } from '@/store';\nimport emitter from '@/utils/emitter';\n\ntype ITimeKey = 'today' | 'week' | 'ago';\n\ntype IHistoryBase = IModels['history'];\ntype IHistoryFilm = IHistoryBase & {\n  type: 1;\n  relateSite: IModels['site'];\n};\ntype IHistoryLive = IHistoryBase & {\n  type: 2;\n  relateSite: IModels['iptv'];\n};\ntype IHistoryParse = IHistoryBase & {\n  type: 3;\n  relateSite: IModels['analyze'];\n};\ntype IHistory = IHistoryFilm | IHistoryLive | IHistoryParse;\n\ninterface IParse {\n  api: NonNullable<IHistoryBase['videoId']>;\n  name: NonNullable<IHistoryBase['videoName']>;\n  id: NonNullable<IHistoryBase['videoId']>;\n}\n\nconst props = defineProps({\n  related: {\n    type: Object as () => {\n      parse: IModels['analyze'][];\n      live: IModels['iptv'][];\n      film: IModels['site'][];\n    },\n    default: () => ({ parse: [], live: [], site: [] }),\n  },\n});\n\nconst storePlayer = usePlayerStore();\n\nconst renderDefaultLazy = () => <LazyBg class=\"render-icon\" />;\n\nconst historyData = ref<Record<ITimeKey, IHistory[]>>({\n  today: [],\n  week: [],\n  ago: [],\n});\n\nconst detailFormData = ref({\n  info: {} as ICmsInfo,\n  extra: {} as { active: IModels['site'] },\n});\n\nconst infiniteId = ref(Date.now());\n\nconst pagination = ref({\n  pageIndex: 1,\n  pageSize: 32,\n  total: 0,\n});\n\nconst config = ref(props.related);\n\nconst dialogState = ref({\n  visibleDetail: false,\n});\nconst active = ref({\n  loading: false,\n});\n\nconst translateDate = computed(() => ({\n  today: t('pages.moment.date.today'),\n  week: t('pages.moment.date.week'),\n  ago: t('pages.moment.date.ago'),\n}));\n\nwatch(\n  () => props.related,\n  (val) => (config.value = val),\n  { deep: true },\n);\n\nonActivated(() => {\n  emitter.off(emitterChannel.REFRESH_MOMENT_CONFIG, reloadConfig);\n  emitter.on(emitterChannel.REFRESH_MOMENT_CONFIG, reloadConfig);\n});\n\nconst getTimeKey = (timestamp: number): ITimeKey => {\n  const timeDiff = toAgoDay('day', timestamp);\n  if (timeDiff === 0) return 'today';\n  if (timeDiff < 7) return 'week';\n  return 'ago';\n};\nconst formatFilmIndex = (item: string): string => {\n  if (!isString(item) || isStrEmpty(item)) return '';\n\n  const [index, _url] = item.split('$');\n  return index;\n};\n\nconst formatProgress = (watch: number, duration: number): string => {\n  if (!isPositiveFiniteNumber(watch) || !isPositiveFiniteNumber(duration) || watch === 0 || duration === 0) return '0%';\n  const progress = Math.trunc((watch / duration) * 100);\n  if (progress === 0 || !isPositiveFiniteNumber(progress)) return '0%';\n  return `${Math.min(progress, 100)}%`;\n};\n\nconst resetPagination = () => {\n  pagination.value.pageIndex = 1;\n  pagination.value.total = 0;\n};\n\nconst getHistory = async (): Promise<number> => {\n  const { pageIndex, pageSize } = pagination.value;\n\n  const resp = await fetchHistoryPage({\n    page: pageIndex,\n    pageSize,\n    type: [1, 2, 3],\n  });\n\n  if (isArray(resp.list) && !isArrayEmpty(resp.list)) {\n    resp.list.forEach((item: IHistory) => {\n      const timeKey = getTimeKey(item.updatedAt);\n      historyData.value[timeKey].push(item);\n    });\n  }\n\n  if (resp.total) pagination.value.total = resp.total;\n\n  return resp.list.length;\n};\n\nconst loadMoreHistory = async (): Promise<number> => {\n  const length = await getHistory();\n  if (length !== 0) pagination.value.pageIndex++;\n  return length;\n};\n\nconst loadMore = async ($state: ILoadStateHdandler) => {\n  try {\n    const length = await loadMoreHistory();\n    length === 0 ? $state.complete() : $state.loaded();\n  } catch (error) {\n    console.error(`Failed to load more data:`, error);\n    $state.error();\n  }\n};\n\nconst handleFilmPlay = async (conf: IHistoryFilm) => {\n  const playWithExternalPlayer = async (item: ICmsInfo, active: IModels['site']) => {\n    detailFormData.value = {\n      info: item,\n      extra: { active },\n    };\n\n    dialogState.value.visibleDetail = true;\n  };\n\n  const playWithInternalPlayer = (item: ICmsInfo, active: IModels['site']) => {\n    storePlayer.updateConfig({\n      type: 'film',\n      status: true,\n      data: { info: item, extra: { active, site: config.value.film } },\n    });\n\n    window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_PLAYER);\n  };\n\n  const { relateSite: site } = conf;\n  const player = storePlayer.player;\n\n  const resp = await fetchCmsDetail({ uuid: site.id, ids: conf.videoId });\n  if (\n    !isArray(resp.list) ||\n    isArrayEmpty(resp.list) ||\n    !isObject(resp.list[0]?.vod_episode) ||\n    isObjectEmpty(resp.list[0]?.vod_episode)\n  ) {\n    MessagePlugin.warning(t('pages.film.message.noDetailInfo'));\n    return;\n  }\n\n  const item = {\n    ...resp.list[0],\n    ...(resp.list[0]?.vod_id ? {} : { vod_id: conf.videoId }),\n    ...(resp.list[0]?.vod_name ? {} : { vod_name: conf.videoName }),\n    ...(resp.list[0]?.vod_pic ? {} : { vod_pic: conf.videoImage }),\n  };\n\n  if (player.type === 'custom') {\n    playWithExternalPlayer(item, site);\n  } else {\n    playWithInternalPlayer(item, site);\n  }\n};\n\nconst handleLivePlay = async (conf: IHistoryLive) => {\n  const createHistoryDoc = (item: IModels['channel'], siteKey: string) => ({\n    type: 2,\n    relateId: siteKey,\n    siteSource: item.group,\n    playEnd: false,\n    videoId: item.id,\n    videoImage: item.logo,\n    videoName: item.name,\n    videoIndex: `${item.name}$${item.api}`,\n    watchTime: 0,\n    duration: 0,\n    skipTimeInStart: 0,\n    skipTimeInEnd: 0,\n  });\n\n  const saveHistoryData = async (doc: ReturnType<typeof createHistoryDoc>, relateId: string, videoId: string) => {\n    const resp = await findHistory({ relateId, videoId, type: 2 });\n\n    const id = resp?.id;\n    if (!isNil(id) && isPositiveFiniteNumber(resp.watchTime)) doc.watchTime = resp.watchTime;\n    if (!isNil(id) && isPositiveFiniteNumber(resp.duration)) doc.duration = resp.duration;\n    if (!isNil(id) && isPositiveFiniteNumber(resp.skipTimeInStart)) doc.skipTimeInStart = resp.skipTimeInStart;\n    if (!isNil(id) && isPositiveFiniteNumber(resp.skipTimeInEnd)) doc.skipTimeInEnd = resp.skipTimeInEnd;\n\n    isNil(id) ? await addHistory(doc) : await putHistory({ id: [id], doc });\n  };\n\n  const playWithExternalPlayer = async (item: IModels['channel'], active: IModels['iptv']) => {\n    const player = storePlayer.player;\n\n    window.electron.ipcRenderer.invoke(IPC_CHANNEL.CALL_PLAYER, player.external, item.api);\n\n    const historyDoc = createHistoryDoc(item, active.key);\n    await saveHistoryData(historyDoc, active.key, item.id);\n  };\n\n  const playWithInternalPlayer = (item: IModels['channel'], active: IModels['iptv']) => {\n    storePlayer.updateConfig({\n      type: 'live',\n      status: true,\n      data: { info: item, extra: { active, site: config.value.live } },\n    });\n\n    window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_PLAYER);\n  };\n\n  const { videoId: id, relateSite: site } = conf;\n  const player = storePlayer.player;\n\n  const item = await fetchChannelDetail(id);\n\n  if (player.type === 'custom') {\n    playWithExternalPlayer(item, site);\n  } else {\n    playWithInternalPlayer(item, site);\n  }\n};\n\nconst handleParsePlay = async (conf: IHistoryParse) => {\n  const createHistoryDoc = (item: IParse, siteKey: string) => ({\n    type: 3,\n    relateId: siteKey,\n    siteSource: '',\n    playEnd: false,\n    videoId: item.id,\n    videoImage: '',\n    videoName: item.name,\n    videoIndex: `${item.name}$${item.api}`,\n    watchTime: 0,\n    duration: 0,\n    skipTimeInStart: 0,\n    skipTimeInEnd: 0,\n  });\n\n  const saveHistoryData = async (doc: ReturnType<typeof createHistoryDoc>, relateId: string, videoId: string) => {\n    const resp = await findHistory({ relateId, videoId, type: 3 });\n\n    const id = resp?.id;\n    if (!isNil(id) && isPositiveFiniteNumber(resp.watchTime)) doc.watchTime = resp.watchTime;\n    if (!isNil(id) && isPositiveFiniteNumber(resp.duration)) doc.duration = resp.duration;\n    if (!isNil(id) && isPositiveFiniteNumber(resp.skipTimeInStart)) doc.skipTimeInStart = resp.skipTimeInStart;\n    if (!isNil(id) && isPositiveFiniteNumber(resp.skipTimeInEnd)) doc.skipTimeInEnd = resp.skipTimeInEnd;\n\n    isNil(id) ? await addHistory(doc) : await putHistory({ id: [id], doc });\n  };\n\n  const playWithExternalPlayer = async (item: IParse, active: IModels['analyze']) => {\n    const resp = await fetchParse({ id: active.id, url: item.api });\n\n    if (!isHttp(resp?.url)) {\n      MessagePlugin.error(t('pages.parse.message.error'));\n      return;\n    }\n\n    const player = storePlayer.player;\n\n    window.electron.ipcRenderer.invoke(IPC_CHANNEL.CALL_PLAYER, player.external, resp.url);\n\n    const historyDoc = createHistoryDoc(item, active.key);\n    await saveHistoryData(historyDoc, active.key, item.id);\n  };\n\n  const playWithInternalPlayer = async (item: IParse, active: IModels['analyze']) => {\n    storePlayer.updateConfig({\n      type: 'parse',\n      status: true,\n      data: { info: item, extra: { active, site: config.value.parse } },\n    });\n\n    window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_PLAYER);\n  };\n\n  const { relateSite: site } = conf;\n  const player = storePlayer.player;\n\n  const item = { name: conf.videoName, api: conf.videoId, id: conf.videoId } as IParse;\n\n  if (player.type === 'custom') {\n    playWithExternalPlayer(item, site);\n  } else {\n    playWithInternalPlayer(item, site);\n  }\n};\n\nconst playEvent = async (item: IHistory) => {\n  active.value.loading = true;\n\n  try {\n    const handlers = {\n      1: handleFilmPlay,\n      2: handleLivePlay,\n      3: handleParsePlay,\n    };\n\n    if (isNil(item.relateSite) || isObjectEmpty(item.relateSite)) {\n      return;\n    }\n\n    await handlers?.[item.type]?.(item as any);\n  } catch (error) {\n    console.error('Failed to play:', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  } finally {\n    active.value.loading = false;\n  }\n};\n\nconst handleRemoveItem = async (item: IHistory) => {\n  await delHistory({ id: [item.id] });\n\n  const timeKey = getTimeKey(item.updatedAt);\n  historyData.value[timeKey] = historyData.value[timeKey].filter((i: IHistory) => i.id !== item.id);\n  pagination.value.total--;\n};\n\nconst defaultConfig = () => {\n  resetPagination();\n\n  historyData.value = { today: [], week: [], ago: [] };\n};\n\nconst reloadConfig = async ({ data: eventData }) => {\n  const { source } = eventData;\n  if (source === emitterSource.PAGE_SHOW) return;\n\n  defaultConfig();\n\n  infiniteId.value = Date.now();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  height: 100%;\n  width: 100%;\n  display: flex;\n  flex-direction: row;\n\n  .content {\n    height: 100%;\n    width: 100%;\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n    overflow: hidden;\n    position: relative;\n\n    .container {\n      flex: 1;\n      height: 100%;\n      width: 100%;\n      overflow: auto;\n      padding: 0 var(--td-comp-paddingLR-s) 0 0;\n\n      .content-wrapper {\n        width: 100%;\n        height: 100%;\n        position: relative;\n\n        .content-wrapper-content {\n          .content-wrapper-header {\n            background: var(--td-bg-color-container);\n            position: sticky;\n            top: 0;\n            left: 0;\n            z-index: 3;\n\n            .title {\n              line-height: var(--td-font-size-headline-large);\n              font-size: var(--td-font-size-title-extraLarge);\n              font-weight: 500;\n            }\n          }\n\n          .content-wrapper-main {\n            margin: var(--td-comp-margin-s) 0 var(--td-comp-margin-xs);\n\n            .card {\n              width: inherit;\n              cursor: pointer;\n\n              .card-main {\n                position: relative;\n                width: 100%;\n                height: 0;\n                overflow: hidden;\n                border-radius: var(--td-radius-medium);\n                padding-top: 62%;\n                background-color: var(--td-bg-color-component);\n                transition: all 0.25s ease-in-out;\n\n                .card-tag {\n                  position: absolute;\n                  z-index: 2;\n\n                  &-mask {\n                    left: 0;\n                    top: 0;\n                    border-radius: var(--td-radius-medium) 0 var(--td-radius-large) 0;\n                    padding: var(--td-comp-paddingTB-xxs) var(--td-comp-paddingLR-s);\n                    background: linear-gradient(-45deg, #45c58b, #94dab2);\n                    border: 1px solid #33a371;\n                    border-width: 0 1px 1px 0;\n                    max-width: 66%;\n                  }\n\n                  &-close {\n                    right: 0;\n                    top: 0;\n                    height: var(--td-comp-size-xs);\n                    width: var(--td-comp-size-xs);\n                    background-color: var(--td-bg-color-container);\n                    border: 1px solid var(--td-bg-color-container);\n                    border-radius: 0 var(--td-radius-medium);\n                    display: none;\n                    align-items: center;\n                    justify-content: center;\n                    transition: all 0.25s ease-in-out;\n\n                    .t-icon-delete {\n                      color: var(--td-text-color-secondary);\n                    }\n\n                    &:hover {\n                      .t-icon-delete {\n                        color: var(--td-text-color-primary);\n                      }\n                    }\n                  }\n\n                  &-text {\n                    color: #006c44;\n                    font-weight: 500;\n                    font-size: var(--td-font-size-mark-small);\n                    height: var(--td-comp-size-xxs);\n                    line-height: var(--td-line-height-mark-small);\n                  }\n                }\n\n                .card-main-item {\n                  position: absolute;\n                  top: 0;\n                  left: 0;\n                  display: block;\n                  width: 100%;\n                  height: 100%;\n                  border-radius: var(--td-radius-medium);\n\n                  :deep(.render-icon) {\n                    height: var(--td-comp-size-xxxl);\n                    width: var(--td-comp-size-xxxl);\n                    background: transparent;\n                  }\n\n                  :deep(img) {\n                    transition: all 0.25s ease-in-out;\n                  }\n\n                  .summary {\n                    position: absolute;\n                    bottom: 0;\n                    left: 0;\n                    width: 100%;\n                    border-radius: 0 0 var(--td-radius-medium) var(--td-radius-medium);\n                    background: linear-gradient(180deg, rgb(0 0 0 / 0%), rgb(22 24 35 / 40%));\n\n                    &-text {\n                      text-align: center;\n                      display: inline-block;\n                      width: 100%;\n                      padding: var(--td-comp-paddingTB-xs) 0;\n                      color: var(--td-font-white-1);\n                      line-height: var(--td-line-height-body-small);\n                      font-size: var(--td-font-size-body-medium);\n                      font-weight: 500;\n                    }\n                  }\n                }\n              }\n\n              .card-footer {\n                padding: var(--td-comp-paddingTB-xs) 0 var(--td-comp-paddingTB-xxs) 0;\n\n                .card-footer-title {\n                  font-weight: 500;\n                  font-size: var(--td-font-size-title-medium);\n                  line-height: var(--td-line-height-title-medium);\n                  color: var(--td-text-color-primary);\n                  transition: all 0.25s ease-in-out;\n\n                  .title-index {\n                    padding-left: var(--td-comp-paddingLR-xs);\n                  }\n                }\n\n                .card-footer-desc {\n                  font-size: 12px;\n                  color: var(--td-text-color-placeholder);\n                  align-items: center;\n                  display: flex;\n                  flex-direction: row;\n                  justify-content: flex-start;\n                  position: relative;\n\n                  .icon {\n                    margin-right: var(--td-comp-margin-xs);\n                  }\n                }\n              }\n\n              &:hover {\n                .card-main {\n                  .card-tag {\n                    &-close {\n                      display: flex;\n                    }\n                  }\n\n                  .card-main-item {\n                    :deep(img) {\n                      transform: scale(1.05);\n                    }\n                  }\n                }\n\n                .card-footer {\n                  .card-footer-title {\n                    color: var(--td-brand-color);\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\n.infinite-loading-container {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  color: var(--td-text-color-placeholder);\n  text-align: center;\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/moment/components/star/index.vue",
    "content": "<template>\n  <div class=\"moment-star view-component-container\">\n    <div class=\"content\">\n      <div id=\"back-top\" class=\"container\">\n        <div class=\"content-wrapper\">\n          <t-row :gutter=\"[16, 4]\" style=\"margin-left: -8px; margin-right: -8px\">\n            <t-col\n              v-for=\"item in starList\"\n              :key=\"item.id\"\n              :md=\"4\"\n              :xl=\"3\"\n              :xxl=\"2\"\n              class=\"card\"\n              @click=\"playEvent(item)\"\n            >\n              <div class=\"card-main\">\n                <div class=\"card-tag card-tag-mask\">\n                  <span v-if=\"item.type === 1\" class=\"card-tag-text txthide txthide1\">\n                    {{ $t('pages.film.title') }}\n                  </span>\n                  <span v-else-if=\"item.type === 2\" class=\"card-tag-text txthide txthide1\">\n                    {{ $t('pages.live.title') }}\n                  </span>\n                  <span v-else-if=\"item.type === 3\" class=\"card-tag-text txthide txthide1\">\n                    {{ $t('pages.parse.title') }}\n                  </span>\n                </div>\n                <div class=\"card-tag card-tag-close\" @click.stop=\"handleRemoveItem(item)\">\n                  <delete-icon class=\"t-icon t-icon-delete\" />\n                </div>\n                <t-image\n                  class=\"card-main-item\"\n                  :src=\"item.videoImage\"\n                  :lazy=\"true\"\n                  fit=\"cover\"\n                  shape=\"round\"\n                  :loading=\"renderDefaultLazy\"\n                  :error=\"renderDefaultLazy\"\n                >\n                  <template #overlayContent>\n                    <div class=\"summary\">\n                      <span class=\"summary-text\">\n                        {{ item?.relateSite?.name ? item.relateSite.name : $t('pages.moment.noRelatedSource') }}\n                      </span>\n                    </div>\n                  </template>\n                </t-image>\n              </div>\n              <div class=\"card-footer\">\n                <p class=\"card-footer-title txthide txthide1\">{{ item.videoName }}</p>\n                <p class=\"card-footer-desc txthide txthide1\">{{ item.videoRemarks || $t('pages.moment.noDesc') }}</p>\n              </div>\n            </t-col>\n          </t-row>\n\n          <infinite-loading\n            class=\"infinite-loading-container\"\n            :identifier=\"infiniteId\"\n            :duration=\"200\"\n            @infinite=\"loadMore\"\n          >\n            <template #complete>{{ $t('common.infiniteLoading.complete') }}</template>\n            <template #error>{{ $t('common.infiniteLoading.error') }}</template>\n          </infinite-loading>\n        </div>\n      </div>\n    </div>\n\n    <t-loading :attach=\"`.${attachContent}`\" size=\"medium\" :loading=\"active.loading\" />\n    <t-back-top container=\"#back-top\" size=\"small\" :offset=\"['1rem', '0.8rem']\" :duration=\"2000\" />\n\n    <dialog-detail-view\n      v-model:visible=\"dialogState.visibleDetail\"\n      :extra=\"detailFormData.extra\"\n      :info=\"detailFormData.info\"\n    />\n  </div>\n</template>\n<script setup lang=\"tsx\">\nimport 'v3-infinite-loading/lib/style.css';\n\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport {\n  isArray,\n  isArrayEmpty,\n  isHttp,\n  isNil,\n  isObject,\n  isObjectEmpty,\n  isPositiveFiniteNumber,\n} from '@shared/modules/validate';\nimport type { ICmsInfo } from '@shared/types/cms';\nimport type { IModels } from '@shared/types/db';\nimport { DeleteIcon } from 'tdesign-icons-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport InfiniteLoading from 'v3-infinite-loading';\nimport type { StateHandler as ILoadStateHdandler } from 'v3-infinite-loading/lib/types';\nimport { onActivated, ref, watch } from 'vue';\n\nimport { fetchCmsDetail } from '@/api/film';\nimport { fetchChannelDetail } from '@/api/live';\nimport { addHistory, delStar, fetchStarPage, findHistory, putHistory } from '@/api/moment';\nimport { fetchParse } from '@/api/parse';\nimport LazyBg from '@/components/lazy-bg/index.vue';\nimport { emitterChannel, emitterSource } from '@/config/emitterChannel';\nimport { attachContent } from '@/config/global';\nimport { t } from '@/locales';\nimport DialogDetailView from '@/pages/film/components/DialogDetail.vue';\nimport { usePlayerStore } from '@/store';\nimport emitter from '@/utils/emitter';\n\ntype IStarBase = IModels['star'];\ntype IStarFilm = IStarBase & {\n  type: 1;\n  relateSite: IModels['site'];\n};\ntype IStarLive = IStarBase & {\n  type: 2;\n  relateSite: IModels['iptv'];\n};\ntype IStarParse = IStarBase & {\n  type: 3;\n  relateSite: IModels['analyze'];\n};\ntype IStar = IStarFilm | IStarLive | IStarParse;\n\ninterface IParse {\n  api: NonNullable<IStarBase['videoId']>;\n  name: NonNullable<IStarBase['videoName']>;\n  id: NonNullable<IStarBase['videoId']>;\n}\n\nconst props = defineProps({\n  related: {\n    type: Object as () => {\n      parse: IModels['analyze'][];\n      live: IModels['iptv'][];\n      film: IModels['site'][];\n    },\n    default: () => ({ parse: [], live: [], site: [] }),\n  },\n});\n\nconst storePlayer = usePlayerStore();\n\nconst renderDefaultLazy = () => <LazyBg class=\"render-icon\" />;\n\nconst detailFormData = ref({\n  info: {} as ICmsInfo,\n  extra: {} as { active: IModels['site'] },\n});\n\nconst starList = ref<IStar[]>([]);\n\nconst infiniteId = ref(Date.now());\n\nconst pagination = ref({\n  pageIndex: 1,\n  pageSize: 32,\n  total: 0,\n});\n\nconst config = ref(props.related);\n\nconst dialogState = ref({\n  visibleDetail: false,\n});\nconst active = ref({\n  loading: false,\n});\n\nwatch(\n  () => props.related,\n  (val) => (config.value = val),\n  { deep: true },\n);\n\nonActivated(() => {\n  emitter.off(emitterChannel.REFRESH_MOMENT_CONFIG, reloadConfig);\n  emitter.on(emitterChannel.REFRESH_MOMENT_CONFIG, reloadConfig);\n});\n\nconst resetPagination = () => {\n  pagination.value.pageIndex = 1;\n  pagination.value.total = 0;\n};\n\nconst getStar = async (): Promise<number> => {\n  const { pageIndex, pageSize } = pagination.value;\n\n  const resp = await fetchStarPage({\n    page: pageIndex,\n    pageSize,\n    type: [1, 2, 3],\n  });\n\n  if (isArray(resp.list) && !isArrayEmpty(resp.list)) {\n    starList.value.push(...resp.list);\n  }\n\n  if (resp.total) pagination.value.total = resp.total;\n\n  return resp.list.length;\n};\n\nconst loadMoreStar = async (): Promise<number> => {\n  const length = await getStar();\n  if (length !== 0) pagination.value.pageIndex++;\n  return length;\n};\n\nconst loadMore = async ($state: ILoadStateHdandler) => {\n  try {\n    const length = await loadMoreStar();\n    length === 0 ? $state.complete() : $state.loaded();\n  } catch (error) {\n    console.error(`Failed to load more data:`, error);\n    $state.error();\n  }\n};\n\nconst handleFilmPlay = async (conf: IStarFilm) => {\n  const playWithExternalPlayer = async (item: ICmsInfo, active: IModels['site']) => {\n    detailFormData.value = {\n      info: item,\n      extra: { active },\n    };\n\n    dialogState.value.visibleDetail = true;\n  };\n\n  const playWithInternalPlayer = (item: ICmsInfo, active: IModels['site']) => {\n    storePlayer.updateConfig({\n      type: 'film',\n      status: true,\n      data: { info: item, extra: { active, site: config.value.film } },\n    });\n\n    window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_PLAYER);\n  };\n\n  const { relateSite: site } = conf;\n  const player = storePlayer.player;\n\n  const resp = await fetchCmsDetail({ uuid: site.id, ids: conf.videoId });\n  if (\n    !isArray(resp.list) ||\n    isArrayEmpty(resp.list) ||\n    !isObject(resp.list[0]?.vod_episode) ||\n    isObjectEmpty(resp.list[0]?.vod_episode)\n  ) {\n    MessagePlugin.warning(t('pages.film.message.noDetailInfo'));\n    return;\n  }\n\n  const item = {\n    ...resp.list[0],\n    ...(resp.list[0]?.vod_id ? {} : { vod_id: conf.videoId }),\n    ...(resp.list[0]?.vod_name ? {} : { vod_name: conf.videoName }),\n    ...(resp.list[0]?.vod_pic ? {} : { vod_pic: conf.videoImage }),\n  };\n\n  if (player.type === 'custom') {\n    playWithExternalPlayer(item, site);\n  } else {\n    playWithInternalPlayer(item, site);\n  }\n};\n\nconst handleLivePlay = async (conf: IStarLive) => {\n  const createHistoryDoc = (item: IModels['channel'], siteKey: string) => ({\n    type: 2,\n    relateId: siteKey,\n    siteSource: item.group,\n    playEnd: false,\n    videoId: item.id,\n    videoImage: item.logo,\n    videoName: item.name,\n    videoIndex: `${item.name}$${item.api}`,\n    watchTime: 0,\n    duration: 0,\n    skipTimeInStart: 0,\n    skipTimeInEnd: 0,\n  });\n\n  const saveHistoryData = async (doc: ReturnType<typeof createHistoryDoc>, relateId: string, videoId: string) => {\n    const resp = await findHistory({ relateId, videoId, type: 2 });\n\n    const id = resp?.id;\n    if (!isNil(id) && isPositiveFiniteNumber(resp.watchTime)) doc.watchTime = resp.watchTime;\n    if (!isNil(id) && isPositiveFiniteNumber(resp.duration)) doc.duration = resp.duration;\n    if (!isNil(id) && isPositiveFiniteNumber(resp.skipTimeInStart)) doc.skipTimeInStart = resp.skipTimeInStart;\n    if (!isNil(id) && isPositiveFiniteNumber(resp.skipTimeInEnd)) doc.skipTimeInEnd = resp.skipTimeInEnd;\n\n    isNil(id) ? await addHistory(doc) : await putHistory({ id: [id], doc });\n  };\n\n  const playWithExternalPlayer = (item: IModels['channel'], active: IModels['iptv']) => {\n    const player = storePlayer.player;\n\n    window.electron.ipcRenderer.invoke(IPC_CHANNEL.CALL_PLAYER, player.external, item.api);\n\n    const historyDoc = createHistoryDoc(item, active.key);\n    saveHistoryData(historyDoc, active.key, item.id);\n  };\n\n  const playWithInternalPlayer = (item: IModels['channel'], active: IModels['iptv']) => {\n    storePlayer.updateConfig({\n      type: 'live',\n      status: true,\n      data: { info: item, extra: { active, site: config.value.live } },\n    });\n\n    window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_PLAYER);\n  };\n\n  const { videoId: id, relateSite: site } = conf;\n  const player = storePlayer.player;\n\n  const item = await fetchChannelDetail(id);\n\n  if (player.type === 'custom') {\n    playWithExternalPlayer(item, site);\n  } else {\n    playWithInternalPlayer(item, site);\n  }\n};\n\nconst handleParsePlay = async (conf: IStarParse) => {\n  const createHistoryDoc = (item: IParse, siteKey: string) => ({\n    type: 3,\n    relateId: siteKey,\n    siteSource: '',\n    playEnd: false,\n    videoId: item.id,\n    videoImage: '',\n    videoName: item.name,\n    videoIndex: `${item.name}$${item.api}`,\n    watchTime: 0,\n    duration: 0,\n    skipTimeInStart: 0,\n    skipTimeInEnd: 0,\n  });\n\n  const saveHistoryData = async (doc: ReturnType<typeof createHistoryDoc>, relateId: string, videoId: string) => {\n    const resp = await findHistory({ relateId, videoId, type: 3 });\n\n    const id = resp?.id;\n    if (!isNil(id) && isPositiveFiniteNumber(resp.watchTime)) doc.watchTime = resp.watchTime;\n    if (!isNil(id) && isPositiveFiniteNumber(resp.duration)) doc.duration = resp.duration;\n    if (!isNil(id) && isPositiveFiniteNumber(resp.skipTimeInStart)) doc.skipTimeInStart = resp.skipTimeInStart;\n    if (!isNil(id) && isPositiveFiniteNumber(resp.skipTimeInEnd)) doc.skipTimeInEnd = resp.skipTimeInEnd;\n\n    isNil(id) ? await addHistory(doc) : await putHistory({ id: [id], doc });\n  };\n\n  const playWithExternalPlayer = async (item: IParse, active: IModels['analyze']) => {\n    const resp = await fetchParse({ id: active.id, url: item.api });\n\n    if (!isHttp(resp?.url)) {\n      MessagePlugin.error(t('pages.parse.message.error'));\n      return;\n    }\n\n    const player = storePlayer.player;\n\n    window.electron.ipcRenderer.invoke(IPC_CHANNEL.CALL_PLAYER, player.external, resp.url);\n\n    const historyDoc = createHistoryDoc(item, active.key);\n    saveHistoryData(historyDoc, active.key, item.id);\n  };\n\n  const playWithInternalPlayer = (item: IParse, active: IModels['analyze']) => {\n    storePlayer.updateConfig({\n      type: 'parse',\n      status: true,\n      data: { info: item, extra: { active, site: config.value.parse } },\n    });\n\n    window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_PLAYER);\n  };\n\n  const { relateSite: site } = conf;\n  const player = storePlayer.player;\n\n  const item = { name: conf.videoName, api: conf.videoId, id: conf.videoId } as IParse;\n\n  if (player.type === 'custom') {\n    playWithExternalPlayer(item, site);\n  } else {\n    playWithInternalPlayer(item, site);\n  }\n};\n\nconst playEvent = async (item: IStar) => {\n  active.value.loading = true;\n\n  try {\n    if (isNil(item.relateSite) || isObjectEmpty(item.relateSite)) {\n      return;\n    }\n\n    const handlers = {\n      1: handleFilmPlay,\n      2: handleLivePlay,\n      3: handleParsePlay,\n    };\n    await handlers?.[item.type]?.(item as any);\n  } catch (error) {\n    console.error('Failed to play:', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  } finally {\n    active.value.loading = false;\n  }\n};\n\nconst handleRemoveItem = async (item: IStar) => {\n  await delStar({ id: [item.id] });\n\n  starList.value = starList.value.filter((i) => i.id !== item.id);\n  pagination.value.total--;\n};\n\nconst defaultConfig = () => {\n  resetPagination();\n\n  starList.value = [];\n};\n\nconst reloadConfig = async ({ data: eventData }) => {\n  const { source } = eventData;\n  if (source === emitterSource.PAGE_SHOW) return;\n\n  defaultConfig();\n\n  infiniteId.value = Date.now();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  height: 100%;\n  width: 100%;\n  display: flex;\n  flex-direction: row;\n\n  .content {\n    height: 100%;\n    width: 100%;\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n    overflow: hidden;\n    position: relative;\n\n    .container {\n      flex: 1;\n      height: 100%;\n      width: 100%;\n      overflow: auto;\n      padding: 0 var(--td-comp-paddingLR-s) 0 0;\n\n      .content-wrapper {\n        width: 100%;\n        height: 100%;\n        position: relative;\n\n        .card {\n          width: inherit;\n          cursor: pointer;\n\n          .card-main {\n            position: relative;\n            width: 100%;\n            height: 0;\n            overflow: hidden;\n            border-radius: var(--td-radius-medium);\n            padding-top: 62%;\n            background-color: var(--td-bg-color-component);\n            transition: all 0.25s ease-in-out;\n\n            .card-tag {\n              position: absolute;\n              z-index: 2;\n\n              &-mask {\n                left: 0;\n                top: 0;\n                border-radius: var(--td-radius-medium) 0 var(--td-radius-large) 0;\n                padding: var(--td-comp-paddingTB-xxs) var(--td-comp-paddingLR-s);\n                background: linear-gradient(-45deg, #45c58b, #94dab2);\n                border: 1px solid #33a371;\n                border-width: 0 1px 1px 0;\n                max-width: 66%;\n              }\n\n              &-close {\n                right: 0;\n                top: 0;\n                height: var(--td-comp-size-xs);\n                width: var(--td-comp-size-xs);\n                background-color: var(--td-bg-color-container);\n                border: 1px solid var(--td-bg-color-container);\n                border-radius: 0 var(--td-radius-medium);\n                display: none;\n                align-items: center;\n                justify-content: center;\n                transition: all 0.25s ease-in-out;\n\n                .t-icon-delete {\n                  color: var(--td-text-color-secondary);\n                }\n\n                &:hover {\n                  .t-icon-delete {\n                    color: var(--td-text-color-primary);\n                  }\n                }\n              }\n\n              &-text {\n                color: #006c44;\n                font-weight: 500;\n                font-size: var(--td-font-size-mark-small);\n                height: var(--td-comp-size-xxs);\n                line-height: var(--td-line-height-mark-small);\n              }\n            }\n\n            .card-main-item {\n              position: absolute;\n              top: 0;\n              left: 0;\n              display: block;\n              width: 100%;\n              height: 100%;\n              border-radius: var(--td-radius-medium);\n\n              :deep(.render-icon) {\n                height: var(--td-comp-size-xxxl);\n                width: var(--td-comp-size-xxxl);\n                background: transparent;\n              }\n\n              :deep(img) {\n                transition: all 0.25s ease-in-out;\n              }\n\n              .summary {\n                position: absolute;\n                bottom: 0;\n                left: 0;\n                width: 100%;\n                border-radius: 0 0 var(--td-radius-medium) var(--td-radius-medium);\n                background: linear-gradient(180deg, rgb(0 0 0 / 0%), rgb(22 24 35 / 40%));\n\n                &-text {\n                  text-align: center;\n                  display: inline-block;\n                  width: 100%;\n                  padding: var(--td-comp-paddingTB-xs) 0;\n                  color: var(--td-font-white-1);\n                  line-height: var(--td-line-height-body-small);\n                  font-size: var(--td-font-size-body-medium);\n                  font-weight: 500;\n                }\n              }\n            }\n          }\n\n          .card-footer {\n            padding: var(--td-comp-paddingTB-xs) 0 var(--td-comp-paddingTB-xxs) 0;\n\n            .card-footer-title {\n              font-weight: 500;\n              font-size: var(--td-font-size-title-medium);\n              line-height: var(--td-line-height-title-medium);\n              color: var(--td-text-color-primary);\n              transition: all 0.25s ease-in-out;\n            }\n\n            .card-footer-desc {\n              font-size: var(--td-font-size-body-medium);\n              line-height: var(--td-line-height-body-small);\n              color: var(--td-text-color-placeholder);\n            }\n          }\n\n          &:hover {\n            .card-main {\n              .card-tag {\n                &-close {\n                  display: flex;\n                }\n              }\n\n              .card-main-item {\n                :deep(img) {\n                  transform: scale(1.05);\n                }\n              }\n            }\n\n            .card-footer {\n              .card-footer-title {\n                color: var(--td-brand-color);\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\n.infinite-loading-container {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  color: var(--td-text-color-placeholder);\n  text-align: center;\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/moment/index.vue",
    "content": "<template>\n  <div class=\"moment view-container\">\n    <common-nav :list=\"componentNav\" :active=\"active.nav\" class=\"sidebar\" @change=\"onNavChange\" />\n\n    <div class=\"content\">\n      <div class=\"container\">\n        <keep-alive>\n          <component :is=\"currentComponent\" class=\"content-wrapper\" :related=\"relatedSiteData\"></component>\n        </keep-alive>\n      </div>\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { isArray, isArrayEmpty } from '@shared/modules/validate';\nimport type { IModels } from '@shared/types/db';\nimport { computed, defineAsyncComponent, onActivated, onMounted, ref, shallowRef } from 'vue';\n\nimport { fetchMomentRelated } from '@/api/moment';\nimport CommonNav from '@/components/common-nav/index.vue';\nimport { emitterChannel, emitterSource } from '@/config/emitterChannel';\nimport { t } from '@/locales';\nimport emitter from '@/utils/emitter';\n\nconst componentMap = {\n  history: defineAsyncComponent(() => import('./components/history/index.vue')),\n  star: defineAsyncComponent(() => import('./components/star/index.vue')),\n};\n\nconst relatedSiteData = ref({\n  parse: [] as IModels['analyze'][],\n  live: [] as IModels['iptv'][],\n  film: [] as IModels['site'][],\n});\n\nconst active = ref({\n  nav: 'history',\n});\n\nconst currentComponent = shallowRef(componentMap[Object.keys(componentMap)[0]]);\n\nconst componentNav = computed(() => [\n  { id: 'history', name: t('pages.moment.history.title') },\n  { id: 'star', name: t('pages.moment.star.title') },\n]);\n\nonActivated(() => {\n  emitter.off(emitterChannel.REFRESH_MOMENT_CONFIG, reloadConfig);\n  emitter.on(emitterChannel.REFRESH_MOMENT_CONFIG, reloadConfig);\n});\n\nonMounted(() => setup());\n\nconst setup = () => {\n  getRelatedSiteConfig();\n};\n\nconst onNavChange = (item: string) => {\n  active.value.nav = item;\n\n  if (Object.hasOwn(componentMap, item)) {\n    currentComponent.value = componentMap[item];\n  }\n};\n\nconst getRelatedSiteConfig = async () => {\n  try {\n    const resp = await fetchMomentRelated();\n\n    if (isArray(resp.parse) && !isArrayEmpty(resp.parse)) relatedSiteData.value.parse = resp.parse;\n    if (isArray(resp.live) && !isArrayEmpty(resp.live)) relatedSiteData.value.live = resp.live;\n    if (isArray(resp.film) && !isArrayEmpty(resp.film)) relatedSiteData.value.film = resp.film;\n  } catch (error) {\n    console.error(`Failed to load related site config:`, error);\n    relatedSiteData.value = { parse: [], live: [], film: [] };\n  }\n};\n\nconst reloadConfig = async ({ data: eventData }) => {\n  const { source } = eventData;\n  if (source === emitterSource.PAGE_SHOW) return;\n\n  relatedSiteData.value = { parse: [], live: [], film: [] };\n\n  await getRelatedSiteConfig();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  height: 100%;\n  width: 100%;\n  display: flex;\n  flex-direction: row;\n  gap: var(--td-size-4);\n\n  .sidebar {\n    flex-grow: 0;\n    flex-shrink: 0;\n  }\n\n  .content {\n    height: 100%;\n    width: 100%;\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n    overflow: hidden;\n\n    .container {\n      flex: 1;\n      height: 100%;\n      width: 100%;\n\n      .content-wrapper {\n        width: 100%;\n        height: 100%;\n        position: relative;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/parse/index.vue",
    "content": "<template>\n  <div class=\"analyze view-container\">\n    <common-nav :list=\"navList\" :active=\"active.nav\" search class=\"sidebar\" @change=\"onNavChange\" />\n\n    <div class=\"content\">\n      <div class=\"header\">\n        <div class=\"router-control\">\n          <t-button theme=\"default\" shape=\"square\" class=\"btn\" @click=\"handleWebviewRouter('back')\">\n            <template #icon><chevron-left-icon /></template>\n          </t-button>\n\n          <t-button theme=\"default\" shape=\"square\" class=\"btn\" @click=\"handleWebviewRouter('forward')\">\n            <template #icon><chevron-right-icon /></template>\n          </t-button>\n\n          <t-button theme=\"default\" shape=\"square\" class=\"btn\" @click=\"handleWebviewRouter('refresh')\">\n            <template #icon><rotate-icon /></template>\n          </t-button>\n        </div>\n\n        <div class=\"platform-selector\">\n          <t-dropdown>\n            <t-button theme=\"default\" shape=\"square\" class=\"btn\"><app-icon /></t-button>\n            <t-dropdown-menu>\n              <t-dropdown-item\n                v-for=\"item in platform\"\n                :key=\"item.id\"\n                :value=\"item.id\"\n                :active=\"active.class === item.id\"\n                @click=\"handlePlatformChange(item.id)\"\n              >\n                {{ $t(`pages.parse.platform.${item.id}`) }}\n              </t-dropdown-item>\n            </t-dropdown-menu>\n          </t-dropdown>\n        </div>\n\n        <t-input v-model=\"currentUrl\" class=\"url-input\" @enter=\"handleWebviewNavigator(currentUrl)\" />\n\n        <t-button variant=\"outline\" class=\"parse-button\" @click=\"handleParse\">\n          {{ $t('pages.parse.play') }}\n        </t-button>\n      </div>\n\n      <div class=\"container\">\n        <div class=\"content-wrapper\">\n          <webview-view ref=\"webviewRef\" appid=\"analyze\" :on-navigate-callback=\"onNavigateCallback\" />\n        </div>\n      </div>\n    </div>\n\n    <t-loading :attach=\"`.${attachContent}`\" size=\"medium\" :loading=\"active.loading\" />\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport {\n  isHttp,\n  isNil,\n  isObject,\n  isObjectEmpty,\n  isPositiveFiniteNumber,\n  isStrEmpty,\n  isString,\n} from '@shared/modules/validate';\nimport type { IModels } from '@shared/types/db';\nimport { AppIcon, ChevronLeftIcon, ChevronRightIcon, RotateIcon } from 'tdesign-icons-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { getDomain } from 'tldts';\nimport { computed, nextTick, onActivated, onMounted, ref } from 'vue';\n\nimport { addHistory, findHistory, putHistory } from '@/api/moment';\nimport { fetchAnalyzeActive, fetchParse } from '@/api/parse';\nimport CommonNav from '@/components/common-nav/index.vue';\nimport WebviewView from '@/components/webview/index.vue';\nimport { emitterChannel, emitterSource } from '@/config/emitterChannel';\nimport { attachContent } from '@/config/global';\nimport { china as CN_PLATFORM, other as OTHER_PLATFORM } from '@/config/parse';\nimport { t } from '@/locales';\nimport { usePlayerStore, useSettingStore } from '@/store';\nimport emitter from '@/utils/emitter';\n\ninterface IParse {\n  api: string;\n  name: string;\n  id: string;\n}\n\nconst storePlayer = usePlayerStore();\nconst storeSetting = useSettingStore();\n\nconst searchValue = ref('');\nconst currentUrl = ref('about:blank');\nconst webviewRef = ref<typeof WebviewView | null>(null);\n\nconst config = ref({\n  default: {} as IModels['analyze'],\n  list: [] as IModels['analyze'][],\n  extra: {},\n});\n\nconst active = ref({\n  class: '',\n  nav: '',\n  loading: false,\n});\n\nconst navList = computed(() => config.value.list.map((t) => ({ id: t.id, name: t.name })));\nconst platform = computed(() => (storeSetting.isCHS ? CN_PLATFORM : OTHER_PLATFORM));\n\nonMounted(() => {\n  getSetting();\n  initClass();\n});\n\nonActivated(() => {\n  emitter.off(emitterChannel.REFRESH_PARSE_CONFIG, reloadConfig);\n  emitter.on(emitterChannel.REFRESH_PARSE_CONFIG, reloadConfig);\n\n  emitter.off(emitterChannel.SEARCH_PARSE_RECOMMEND, onSearchRecommend);\n  emitter.on(emitterChannel.SEARCH_PARSE_RECOMMEND, onSearchRecommend);\n});\n\nconst initClass = () => {\n  const item = platform.value[0];\n  active.value.class = item.id;\n\n  handleWebviewNavigator(item.url);\n};\n\nconst handlePlatformChange = (id: string) => {\n  const item = platform.value.find((item) => item.id === id);\n\n  if (!item) return;\n\n  active.value.class = item.id;\n  handleWebviewNavigator(item.url);\n};\n\nconst getSetting = async () => {\n  try {\n    const resp = await fetchAnalyzeActive();\n    if (resp?.default) {\n      config.value.default = resp.default;\n      active.value.nav = resp.default.id;\n    }\n    if (resp?.list) {\n      config.value.list = resp.list;\n    }\n    if (resp?.extra) config.value.extra = resp.extra;\n  } catch (error) {\n    console.error(`Failed to get analyze config:`, error);\n  }\n};\n\nconst handleWebviewNavigator = (url: string) => {\n  nextTick(() => webviewRef.value?.loadUrl(url));\n};\n\nconst handleParse = async () => {\n  const url = webviewRef.value?.getURL() || '';\n  await playEvent(url);\n};\n\nconst createHistoryDoc = (item: IParse, siteKey: string) => ({\n  type: 3,\n  relateId: siteKey,\n  siteSource: '',\n  playEnd: false,\n  videoId: item.id,\n  videoImage: '',\n  videoName: item.name,\n  videoIndex: `${item.name}$${item.api}`,\n  watchTime: 0,\n  duration: 0,\n  skipTimeInStart: 0,\n  skipTimeInEnd: 0,\n});\n\nconst saveHistoryData = async (doc: ReturnType<typeof createHistoryDoc>, relateId: string, videoId: string) => {\n  const resp = await findHistory({ relateId, videoId, type: 3 });\n\n  const id = resp?.id;\n  if (!isNil(id) && isPositiveFiniteNumber(resp.watchTime)) doc.watchTime = resp.watchTime;\n  if (!isNil(id) && isPositiveFiniteNumber(resp.duration)) doc.duration = resp.duration;\n  if (!isNil(id) && isPositiveFiniteNumber(resp.skipTimeInStart)) doc.skipTimeInStart = resp.skipTimeInStart;\n  if (!isNil(id) && isPositiveFiniteNumber(resp.skipTimeInEnd)) doc.skipTimeInEnd = resp.skipTimeInEnd;\n\n  isNil(id) ? await addHistory(doc) : await putHistory({ id: [id], doc });\n};\n\nconst playEvent = async (url: string) => {\n  active.value.loading = true;\n\n  try {\n    let api = url;\n    try {\n      const u = new URL(url);\n      u.search = '';\n      const cleanedUrl = u.href;\n\n      if (!isHttp(api)) {\n        MessagePlugin.warning(t('pages.parse.message.invalidAddress'));\n        return;\n      }\n\n      api = cleanedUrl;\n    } catch {\n      MessagePlugin.warning(t('pages.parse.message.invalidAddress'));\n      return;\n    }\n\n    const site = config.value.default;\n    if (!isObject(site) || isObjectEmpty(site)) {\n      MessagePlugin.warning(t('pages.parse.message.noActiveSource'));\n      return;\n    } else if (!isHttp((site as IModels['analyze']).api)) {\n      MessagePlugin.warning(t('pages.parse.message.invalidApi'));\n      return;\n    }\n\n    let name = '';\n    try {\n      const titleSplit = platform.value.find((item) => api.includes(item.host))?.titleSplit || null;\n      name = webviewRef.value?.getTitle();\n      if (isString(titleSplit) && !isStrEmpty(titleSplit)) name = name.split(titleSplit)?.[0];\n      name = name.trim();\n    } catch {}\n\n    const item = {\n      name,\n      api,\n      id: api,\n    };\n\n    const player = storePlayer.player;\n    if (player.type === 'custom') {\n      playWithExternalPlayer(item, site);\n    } else {\n      playWithInternalPlayer(item, site);\n    }\n  } catch (error) {\n    console.error('Failed to play:', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  } finally {\n    active.value.loading = false;\n  }\n};\n\nconst playWithExternalPlayer = async (item: IParse, active: IModels['analyze']) => {\n  const resp = await fetchParse({ id: active.id, url: item.api });\n\n  if (!isHttp(resp?.url)) {\n    MessagePlugin.error(t('pages.parse.message.error'));\n    return;\n  }\n\n  const player = storePlayer.player;\n\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.CALL_PLAYER, player.external, resp.url);\n\n  const historyDoc = createHistoryDoc(item, active.key);\n  await saveHistoryData(historyDoc, active.key, item.id);\n};\n\nconst playWithInternalPlayer = (item: IParse, active: IModels['analyze']) => {\n  storePlayer.updateConfig({\n    type: 'parse',\n    status: true,\n    data: { info: item, extra: { active, site: config.value.list } },\n  });\n\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_PLAYER);\n};\n\nconst defaultConfig = () => {\n  searchValue.value = '';\n\n  // active.value.class = '';\n  active.value.nav = '';\n\n  config.value.default = {} as IModels['analyze'];\n};\n\nconst reloadConfig = async ({ data: eventData }) => {\n  const { source } = eventData;\n  if (source === emitterSource.PAGE_SHOW) return;\n\n  defaultConfig();\n  await getSetting();\n};\n\nconst onNavChange = async (id: string) => {\n  try {\n    defaultConfig();\n    active.value.nav = id;\n    config.value.default = config.value.list.find((item) => item.id === id)!;\n  } catch (error) {\n    console.error(`Failed to change config:`, error);\n  }\n};\n\nconst onSearchRecommend = ({ data: eventData }) => {\n  const { source, data: kw } = eventData;\n  if (source === emitterSource.PAGE_SHOW) return;\n\n  searchValue.value = kw;\n\n  const item = platform.value.find((item) => item.id === active.value.class);\n  const url = kw ? item!.search.replace('{kw}', kw) : item!.url;\n\n  webviewRef.value?.loadUrl(url);\n};\n\nconst handleWebviewRouter = (type: 'back' | 'forward' | 'refresh') => {\n  const webview = webviewRef.value;\n  if (!webview) return;\n\n  const helpers = {\n    back: () => {\n      if (webview.canGoBack()) webview.goBack();\n    },\n    forward: () => {\n      if (webview.canGoForward()) webview.goForward();\n    },\n    refresh: () => {\n      webview.reload();\n    },\n  };\n\n  helpers?.[type]?.();\n};\n\nconst onNavigateCallback = (_appid: string, url: string) => {\n  currentUrl.value = url;\n  if (!isHttp(url)) return;\n  const index = platform.value.findIndex((item) => {\n    try {\n      return getDomain(item.url) === getDomain(url);\n    } catch {\n      return false;\n    }\n  });\n  active.value.class = index >= 0 ? platform.value[index].id : '';\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  height: 100%;\n  width: 100%;\n  display: flex;\n  flex-direction: row;\n  gap: var(--td-size-4);\n\n  .sidebar {\n    flex: 0 0 auto;\n  }\n\n  .content {\n    height: 100%;\n    width: 100%;\n    padding: 0 var(--td-comp-paddingLR-s) var(--td-comp-paddingTB-s) 0;\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n    overflow: hidden;\n    position: relative;\n\n    .header {\n      width: 100%;\n      display: flex;\n      gap: var(--td-comp-margin-s);\n\n      .router-control {\n        display: flex;\n        align-items: center;\n        border-radius: var(--td-radius-medium);\n        background-color: var(--td-bg-color-component);\n\n        .btn {\n          background: transparent;\n          border-width: 0;\n          color: var(--td-text-color-primary);\n\n          &.t-is-disabled {\n            color: var(--td-text-color-disabled);\n          }\n\n          &:not(.t-is-disabled, .t-button--ghost) {\n            &:hover {\n              color: var(--td-text-color-primary);\n            }\n          }\n        }\n      }\n\n      .platform-selector {\n        .btn {\n          &.t-is-disabled {\n            color: var(--td-text-color-disabled);\n          }\n\n          &:not(.t-is-disabled, .t-button--ghost) {\n            &:hover {\n              color: var(--td-text-color-primary);\n              border-color: var(--td-brand-color);\n            }\n          }\n        }\n      }\n\n      .parse-button {\n        background-color: var(--td-border-level-1-color);\n        border-color: var(--td-border-level-1-color);\n\n        &:hover {\n          color: var(--td-text-color-primary);\n          border-color: var(--td-brand-color);\n        }\n      }\n    }\n\n    .container {\n      flex: 1;\n      height: 100%;\n      width: 100%;\n      -webkit-app-region: no-drag;\n\n      .content-wrapper {\n        height: 100%;\n        width: 100%;\n        border-radius: var(--td-radius-medium);\n        background: var(--td-border-level-1-color);\n        overflow: hidden;\n        -webkit-app-region: no-drag;\n\n        .webview {\n          height: 100%;\n          width: 100%;\n          -webkit-app-region: no-drag;\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/player/components/AsideFilm.vue",
    "content": "<template>\n  <div class=\"container-aside-wrap container-aside-film\">\n    <div v-if=\"!active.profile\" class=\"container-wrap main-wrap\">\n      <div class=\"info-wrap\">\n        <div class=\"new-title-wrap\">\n          <div class=\"new-title-name\">\n            <div class=\"title txthide txthide1\">{{ infoConf.vod_name }}</div>\n            <div class=\"title-unfold intro-unfold\" @click=\"active.profile = true\">\n              <span>{{ $t('pages.player.film.desc') }}</span>\n              <span class=\"icon-title-right\"><chevron-right-s-icon /></span>\n            </div>\n          </div>\n          <div class=\"new-title-feature txthide txthide1\">\n            <span class=\"meta-info heat\">{{ infoConf.vod_score ? infoConf.vod_score : '0.0' }} </span>\n            <span v-show=\"infoConf.type_name\" class=\"meta-info\">{{ infoConf.type_name }}</span>\n            <span v-show=\"infoConf.vod_area\" class=\"meta-info\">{{ infoConf.vod_area }}</span>\n            <span v-show=\"infoConf.vod_year\" class=\"meta-info\">{{ infoConf.vod_year }}</span>\n          </div>\n        </div>\n        <div class=\"play-paction\">\n          <div class=\"paction-item like\" @click=\"handleSwitchStar\">\n            <heart-filled-icon v-if=\"starData.id\" class=\"icon\" />\n            <heart-icon v-else class=\"icon\" />\n            <span class=\"tip\">{{ $t('pages.moment.star.title') }}</span>\n          </div>\n          <t-divider layout=\"vertical\" />\n\n          <div class=\"paction-item download\" @click=\"handleDownloadDialog\">\n            <download-icon class=\"icon\" />\n            <span class=\"tip\">{{ $t('pages.player.function.download') }}</span>\n          </div>\n          <t-divider layout=\"vertical\" />\n\n          <div class=\"paction-item share\" @click=\"handleSharePopup\">\n            <t-popup trigger=\"click\">\n              <share1-icon class=\"icon\" />\n              <span class=\"tip\">{{ $t('component.share.title') }}</span>\n\n              <template #content>\n                <share-popup :data=\"shareFormData\" type=\"popup\" />\n              </template>\n            </t-popup>\n          </div>\n          <t-divider layout=\"vertical\" />\n\n          <div class=\"paction-item more\">\n            <t-dropdown trigger=\"click\">\n              <t-button theme=\"default\" shape=\"square\" variant=\"text\">\n                <more-icon />\n              </t-button>\n              <t-dropdown-menu>\n                <t-dropdown-item>\n                  <div class=\"setting-item\" @click=\"handleSettingDialog\">\n                    <setting-icon />\n                    {{ $t('pages.player.function.setting') }}\n                  </div>\n                </t-dropdown-item>\n              </t-dropdown-menu>\n            </t-dropdown>\n          </div>\n        </div>\n        <dialog-download-view\n          v-model:visible=\"active.download\"\n          :episode=\"downloadFormData.episode\"\n          :current=\"downloadFormData.current\"\n        />\n        <dialog-setting-view\n          v-model:visible=\"active.setting\"\n          type=\"film\"\n          :data=\"settingFormData\"\n          :time=\"processConf\"\n          @change=\"onSettingChange\"\n        />\n      </div>\n\n      <div class=\"anthology-container film-anthology\">\n        <div class=\"anthology-series-wrap\">\n          <tag-nav\n            class=\"anthology-series-nav\"\n            :list=\"navOptions\"\n            :active=\"active.nav\"\n            @change=\"handleSwitchSeriesTab\"\n          />\n          <div class=\"anthology-series-extra\">\n            <div v-show=\"activeAnalyzeList.length\" class=\"anthology-series-parse\">\n              <t-dropdown placement=\"bottom\" :max-height=\"250\">\n                <t-button class=\"anthology-series-btn\" theme=\"default\" variant=\"text\" auto-width>\n                  {{ $t('pages.parse.title') }}\n                  <template #suffix><chevron-down-icon /></template>\n                </t-button>\n                <t-dropdown-menu>\n                  <t-dropdown-item\n                    v-for=\"item in activeAnalyzeList\"\n                    :key=\"item.id\"\n                    :active=\"item.id === active.analyzeId\"\n                    @click=\"handleSwitchParse(item.id)\"\n                  >\n                    <span>{{ item.name }}</span>\n                  </t-dropdown-item>\n                </t-dropdown-menu>\n              </t-dropdown>\n            </div>\n\n            <div class=\"anthology-series-reverse\">\n              <t-button\n                class=\"anthology-series-btn\"\n                theme=\"default\"\n                variant=\"text\"\n                auto-width\n                @click=\"reverseOrderEvent\"\n              >\n                <template #suffix>\n                  <order-descending-icon v-if=\"active.reverseOrder\" class=\"reverse-icon\" />\n                  <order-ascending-icon v-else class=\"reverse-icon\" />\n                </template>\n              </t-button>\n            </div>\n          </div>\n        </div>\n        <div class=\"box-anthology-wrap\">\n          <div v-if=\"active.nav === 'episode'\" class=\"box-anthology-item box-anthology-episode\">\n            <div class=\"box-anthology-wrap\">\n              <div class=\"box-anthology-item\">\n                <div v-if=\"lineList.length > 1\" class=\"box-anthology-header\">\n                  <title-menu :list=\"lineList\" :active=\"active.filmSource\" class=\"nav\" @change=\"handleSwitchLine\" />\n                </div>\n                <div class=\"box-anthology-content\">\n                  <div class=\"grid-wrap\">\n                    <div\n                      v-for=\"(item, index) in activeSessionList\"\n                      :key=\"index\"\n                      class=\"item-wrap\"\n                      :class=\"[`${item.text}$${item.link}` === active.filmIndex ? 'is-active' : '']\"\n                      @click=\"handleSwitchSeason(item)\"\n                    >\n                      <div class=\"list-item\">\n                        <t-tooltip :content=\"item.text\">\n                          <div class=\"title txthide txthide1\">{{ reverseOrderIndex(index) }}</div>\n                        </t-tooltip>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <div v-if=\"active.nav === 'recommend'\" class=\"box-anthology-item box-anthology-recommend\">\n            <div class=\"box-anthology-content\">\n              <t-list class=\"list-wrap\" :scroll=\"{ rowHeight: 80, type: 'virtual' }\">\n                <t-list-item\n                  v-for=\"(item, index) in recommendList\"\n                  :key=\"index\"\n                  class=\"item-wrap\"\n                  @click=\"handleSwitchRecommendItem(item)\"\n                >\n                  <div class=\"list-item\">\n                    <div class=\"logo\">\n                      <t-image\n                        class=\"logo-lazy\"\n                        fit=\"cover\"\n                        :src=\"item.vod_pic\"\n                        :lazy=\"true\"\n                        :loading=\"renderDefaultLazy\"\n                        :error=\"renderDefaultLazy\"\n                      />\n                    </div>\n                    <div class=\"title txthide txthide2\">{{ item.vod_name }}</div>\n                  </div>\n                </t-list-item>\n              </t-list>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <div v-else class=\"container-wrap intro-wrap\">\n      <div class=\"side-head\">\n        <div class=\"header\">{{ $t('pages.player.film.desc') }}</div>\n        <div class=\"close-btn\" @click=\"active.profile = false\">\n          <close-icon class=\"t-icon t-icon-close\" />\n        </div>\n      </div>\n      <div class=\"side-body\">\n        <div class=\"new-intro-base\">\n          <t-image\n            class=\"new-intro-img\"\n            :src=\"infoConf.vod_pic\"\n            fit=\"cover\"\n            shape=\"round\"\n            :lazy=\"true\"\n            :loading=\"renderDefaultLazy\"\n            :error=\"renderDefaultLazy\"\n          />\n          <h4 class=\"title txthide txthide2\">{{ infoConf.vod_name }}</h4>\n        </div>\n        <div class=\"new-intro-detail\">\n          <div class=\"new-intro-case\">\n            <div class=\"new-intro-title txthide txthide1\">{{ $t('pages.player.film.info.background') }}</div>\n            <div class=\"new-intro-content\">\n              <span class=\"txt\" v-html=\"infoConf.vod_content || $t('common.unknown')\"></span>\n            </div>\n          </div>\n          <div class=\"new-intro-case\">\n            <div class=\"new-intro-title txthide txthide1\">{{ $t('pages.player.film.info.actors') }}</div>\n            <div class=\"new-intro-content\">\n              <div class=\"new-intro-roles new-intro-director\">\n                <span class=\"intro-role-title\">{{ $t('pages.player.film.info.director') }}: </span>\n                <span class=\"intro-role-subtitle\">\n                  {{ infoConf.vod_director || $t('common.unknown') }}\n                </span>\n              </div>\n              <div class=\"new-intro-roles new-intro-actor\">\n                <span class=\"intro-role-title\">{{ $t('pages.player.film.info.actor') }}: </span>\n                <span class=\"intro-role-subtitle\">\n                  {{ infoConf.vod_actor || $t('common.unknown') }}\n                </span>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n<script setup lang=\"tsx\">\nimport { PROXY_API } from '@shared/config/env';\nimport {\n  isArray,\n  isArrayEmpty,\n  isBoolean,\n  isHttp,\n  isNil,\n  isObject,\n  isObjectEmpty,\n  isPositiveFiniteNumber,\n} from '@shared/modules/validate';\nimport type { ICmsInfo, ICmsInfoEpisode, IRecMatch } from '@shared/types/cms';\nimport type { IModels } from '@shared/types/db';\nimport { throttle } from 'es-toolkit';\nimport {\n  ChevronDownIcon,\n  ChevronRightSIcon,\n  CloseIcon,\n  DownloadIcon,\n  HeartFilledIcon,\n  HeartIcon,\n  MoreIcon,\n  OrderAscendingIcon,\n  OrderDescendingIcon,\n  SettingIcon,\n  Share1Icon,\n} from 'tdesign-icons-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport type { PropType } from 'vue';\nimport { computed, onMounted, ref, toRaw, watch } from 'vue';\n\nimport {\n  fetchCmsDetail,\n  fetchCmsPlay,\n  fetchCmsProxy,\n  fetchCmsSearch,\n  fetchRecBarrage,\n  fetchRecMatch,\n} from '@/api/film';\nimport { addHistory, addStar, delStar, findHistory, findStar, putHistory, putStar } from '@/api/moment';\nimport { fetchAnalyzeActive, fetchParse } from '@/api/parse';\nimport { setProxy } from '@/api/proxy';\nimport { cdpSnifferMedia } from '@/api/system';\nimport LazyBg from '@/components/lazy-bg/index.vue';\nimport { mediaUtils } from '@/components/multi-player';\nimport SharePopup from '@/components/share/index.vue';\nimport TagNav from '@/components/tag-nav/index.vue';\nimport TitleMenu from '@/components/title-menu/index.vue';\nimport { emitterChannel } from '@/config/emitterChannel';\nimport type { IStorePlayer } from '@/config/player';\nimport { t } from '@/locales';\nimport type { IVideoOptions, IVideoProcess } from '@/types/player';\nimport emitter from '@/utils/emitter';\n\nimport DialogDownloadView from './DialogDownload.vue';\nimport DialogSettingView from './DialogSetting.vue';\n\nconst props = defineProps({\n  store: {\n    type: Object as PropType<IStorePlayer>,\n    default: () => ({}),\n  },\n  process: {\n    type: Object as PropType<IVideoProcess>,\n    default: () => ({ currentTime: 0, duration: 0 }),\n  },\n});\n\nconst emits = defineEmits(['update', 'barrage', 'create', 'pause', 'seek']);\n\nconst infoConf = ref(props.store.data.info as ICmsInfo);\nconst extraConf = ref(props.store.data.extra);\nconst playerConf = ref(props.store.setting);\nconst processConf = ref(props.process);\n\nconst lineList = ref<{ type_id: string; type_name: string }[]>([]);\nconst analyzeConfig = ref({\n  default: {} as IModels['analyze'],\n  list: [] as IModels['analyze'][],\n});\n\nconst starData = ref({} as IModels['star']);\nconst historyData = ref({} as IModels['history']);\nconst videoData = ref<IVideoOptions>({\n  url: '',\n  playEnd: false,\n  watchTime: 0,\n  duration: 0,\n  skipTimeInStart: 30,\n  skipTimeInEnd: 30,\n});\nconst recommendList = ref<IRecMatch[]>([]);\n\nconst downloadFormData = ref({\n  episode: {} as ICmsInfo['vod_episode'],\n  current: '',\n});\nconst shareFormData = ref({\n  name: '',\n  url: '',\n  enablePrefix: true,\n});\nconst settingFormData = ref({\n  skipHeadAndEnd: false,\n  skipTimeInStart: 30,\n  skipTimeInEnd: 30,\n  playNextPreload: false,\n  playNextEnabled: true,\n  skipAd: false,\n});\n\nconst active = ref({\n  watch: true,\n  profile: false,\n  nav: 'episode',\n  reverseOrder: true,\n  share: false,\n  download: false,\n  setting: false,\n  analyzeId: '',\n  filmIndex: '',\n  filmSource: '',\n});\n\nconst preload = ref({\n  status: 'idle' as 'idle' | 'ready' | 'loading' | 'error',\n  id: '',\n  url: '',\n  quality: [] as Array<string | number>,\n  headers: {} as Record<string, any>,\n  mediaType: '',\n});\n\nconst navOptions = computed(() => [\n  { value: 'episode', label: t('pages.player.film.anthology') },\n  ...(recommendList.value.length ? [{ value: 'recommend', label: t('pages.player.film.recommend') }] : []),\n]);\n\nconst activeAnalyzeList = computed(() => {\n  const flag = active.value.filmSource;\n  const resp = analyzeConfig.value.list.filter((item: IModels['analyze']) => (item.flag || []).includes(flag));\n  return resp;\n});\n\nconst activeSessionList = computed(() => {\n  const flag = active.value.filmSource;\n  const resp = infoConf.value.vod_episode?.[flag] || [];\n  return resp;\n});\n\nwatch(\n  () => props.store,\n  (val) => {\n    infoConf.value = val.data.info as ICmsInfo;\n    extraConf.value = val.data.extra;\n    playerConf.value = val.setting;\n  },\n  { deep: true },\n);\nwatch(\n  () => props.process,\n  (val) => (processConf.value = val),\n);\nwatch(\n  () => processConf.value,\n  (val) => active.value.watch && timerUpdatePlayProcess(val.currentTime, val.duration),\n);\n\nconst renderDefaultLazy = () => <LazyBg class=\"render-icon\" />;\n\nonMounted(() => setup());\n\nconst createStarDoc = (item: ICmsInfo, siteKey: string) => ({\n  type: 1,\n  relateId: siteKey,\n  videoId: item.vod_id,\n  videoImage: item.vod_pic,\n  videoName: item.vod_name,\n  videoType: item.type_name,\n  videoRemarks: item.vod_remarks,\n});\n\nconst getStarData = async () => {\n  try {\n    const resp = await findStar({ relateId: extraConf.value.active.key, videoId: infoConf.value.vod_id, type: 1 });\n    starData.value = isNil(resp?.id) ? {} : resp;\n  } catch (error) {\n    console.error('Get Star Data Error:', error);\n    starData.value = {} as IModels['star'];\n  }\n};\n\nconst saveStarData = async () => {\n  const id = starData.value?.id;\n  const doc = createStarDoc(infoConf.value as ICmsInfo, extraConf.value.active.key);\n\n  try {\n    const resp = isNil(id) ? await addStar(doc) : await putStar({ id: [id], doc });\n    if (isArray(resp) && !isArrayEmpty(resp) && !isNil(resp[0]?.id)) {\n      starData.value = resp[0];\n    } else {\n      starData.value = {} as IModels['star'];\n    }\n  } catch (error) {\n    console.error('Save Star Data Error:', error);\n    starData.value = {} as IModels['star'];\n  }\n};\n\nconst delStarDate = async () => {\n  const id = starData.value?.id;\n\n  try {\n    await delStar({ id: [id] });\n  } catch (error) {\n    console.error('Delete Star Data Error:', error);\n  } finally {\n    starData.value = {} as IModels['star'];\n  }\n};\n\nconst handleSwitchStar = async () => {\n  const id = starData.value?.id;\n\n  isNil(id) ? await saveStarData() : await delStarDate();\n};\n\nconst createHistoryDoc = (item: ICmsInfo, siteKey: string, videoData: IVideoOptions) => ({\n  type: 1,\n  relateId: siteKey,\n  siteSource: active.value.filmSource,\n  playEnd: false,\n  videoId: item.vod_id,\n  videoImage: item.vod_pic,\n  videoName: item.vod_name,\n  videoIndex: active.value.filmIndex,\n  watchTime: isPositiveFiniteNumber(videoData.watchTime) ? videoData.watchTime : 0,\n  duration: isPositiveFiniteNumber(videoData.duration) ? videoData.duration : 0,\n  skipTimeInStart: videoData.skipTimeInStart,\n  skipTimeInEnd: videoData.skipTimeInEnd,\n});\n\nconst getHistoryData = async () => {\n  try {\n    const resp = await findHistory({ relateId: extraConf.value.active.key, videoId: infoConf.value.vod_id, type: 1 });\n\n    const history = isNil(resp?.id) ? {} : resp;\n    historyData.value = history;\n\n    const { skipHeadAndEnd } = playerConf.value;\n\n    const skipTimeInStart = history.skipTimeInStart ?? 30;\n    const skipTimeInEnd = history.skipTimeInEnd ?? 30;\n    const duration = history.duration ?? 0;\n    const rawWatchTime = history.watchTime ?? 0;\n    const playEnd = history.playEnd ?? false;\n\n    videoData.value = {\n      ...videoData.value,\n      skipTimeInStart,\n      skipTimeInEnd,\n      duration,\n      watchTime: skipHeadAndEnd ? Math.max(rawWatchTime, skipTimeInStart) : rawWatchTime,\n      playEnd,\n    };\n  } catch (error) {\n    console.error('[player][getHistoryData]', error);\n    historyData.value = {} as IModels['history'];\n  }\n};\n\nconst saveHistoryData = async () => {\n  const id = historyData.value?.id;\n  const doc = createHistoryDoc(infoConf.value as ICmsInfo, extraConf.value.active.key, videoData.value);\n\n  try {\n    const resp = isNil(id) ? await addHistory(doc) : await putHistory({ id: [id], doc });\n    if (isArray(resp) && !isArrayEmpty(resp) && !isNil(resp[0]?.id)) {\n      historyData.value = resp[0];\n    } else {\n      historyData.value = {} as IModels['history'];\n    }\n  } catch (error) {\n    console.error('Save History Data Error:', error);\n    historyData.value = {} as IModels['history'];\n  }\n};\n\nconst throttleSaveHistory = throttle(saveHistoryData, 3000, { edges: ['leading', 'trailing'] });\n\nconst defaultPreloadConfig = () => {\n  preload.value = {\n    status: 'idle',\n    id: '',\n    url: '',\n    quality: [],\n    headers: {},\n    mediaType: '',\n  };\n};\n\nconst handleSwitchSeriesTab = (val: string) => {\n  active.value.nav = val;\n};\n\nconst handleDownloadDialog = () => {\n  downloadFormData.value = {\n    episode: infoConf.value.vod_episode,\n    current: videoData.value.url,\n  };\n  active.value.download = true;\n};\n\nconst handleSharePopup = () => {\n  let name = infoConf.value.vod_name!;\n  const index = active.value.filmIndex.includes('$') ? active.value.filmIndex.split('$')[0] : '';\n  if (index) name = `${name}-${index}`;\n\n  shareFormData.value = { ...shareFormData.value, name, url: videoData.value.url };\n  active.value.share = true;\n};\n\nconst handleSettingDialog = () => {\n  settingFormData.value = {\n    skipHeadAndEnd: playerConf.value.skipHeadAndEnd,\n    playNextPreload: playerConf.value.playNextPreload,\n    playNextEnabled: playerConf.value.playNextEnabled,\n    skipAd: playerConf.value.skipAd,\n    skipTimeInStart: videoData.value.skipTimeInStart,\n    skipTimeInEnd: videoData.value.skipTimeInEnd,\n  };\n\n  active.value.setting = true;\n};\n\nconst onSettingChange = (item) => {\n  const { skipTimeInStart = 30, skipTimeInEnd = 30, skipHeadAndEnd, playNextPreload, playNextEnabled, skipAd } = item;\n\n  /** sync skip time */\n  videoData.value.skipTimeInStart = skipTimeInStart;\n  videoData.value.skipTimeInEnd = skipTimeInEnd;\n\n  /** sync player config */\n  playerConf.value.skipHeadAndEnd = skipHeadAndEnd;\n  playerConf.value.playNextPreload = playNextPreload;\n  playerConf.value.playNextEnabled = playNextEnabled;\n  playerConf.value.skipAd = skipAd;\n\n  emits('update', { setting: playerConf.value });\n};\n\nconst reverseOrderIndex = (current: number) => {\n  const total = activeSessionList.value.length;\n  const type = active.value.reverseOrder;\n\n  if (!isPositiveFiniteNumber(current) || !isPositiveFiniteNumber(total)) return 1;\n  if (current >= total) return 1;\n\n  return type ? current + 1 : total - current;\n};\n\nconst handleSwitchLine = (id: string) => {\n  active.value.filmSource = id;\n};\n\nconst handleSwitchSeason = (item: ICmsInfoEpisode) => {\n  active.value.filmIndex = `${item.text}$${item.link}`;\n  active.value.watch = false;\n\n  if (active.value.filmIndex !== historyData.value.videoIndex) {\n    videoData.value = {\n      ...videoData.value,\n      duration: 0,\n      watchTime: playerConf.value.skipHeadAndEnd ? videoData.value.skipTimeInStart : 0,\n      playEnd: false,\n    };\n  }\n\n  callPlay(item);\n};\n\nconst handleSwitchParse = (id: string) => {\n  active.value.analyzeId = id;\n\n  if (active.value.filmIndex) {\n    const [text, link] = active.value.filmIndex.split('$');\n    callPlay({ text, link });\n  }\n};\n\nconst reverseOrderEvent = () => {\n  infoConf.value.vod_episode = Object.fromEntries(\n    Object.entries(infoConf.value.vod_episode!).map(([key, arr]) => [key, arr.toReversed()]),\n  );\n\n  active.value.reverseOrder = !active.value.reverseOrder;\n};\n\nconst getAnalyzeConfig = async () => {\n  try {\n    const resp = await fetchAnalyzeActive();\n    if (resp?.default) {\n      analyzeConfig.value.default = resp.default;\n      active.value.analyzeId = resp.default.id;\n    }\n    if (resp?.list) {\n      analyzeConfig.value.list = resp.list;\n    }\n  } catch (error) {\n    console.error(`Failed to get analyze config:`, error);\n  }\n};\n\nconst fetchRecommend = async () => {\n  try {\n    let { vod_name: name, vod_year: year } = infoConf.value;\n    if (!year) year = new Date().getFullYear();\n\n    const res = await fetchRecMatch({ name, year });\n\n    recommendList.value = res || [];\n  } catch {\n    recommendList.value = [];\n  }\n};\n\nconst handleSwitchRecommendItem = async (item: IRecMatch) => {\n  const site = extraConf.value.active;\n\n  const searchResp = await fetchCmsSearch({ uuid: site.id, wd: item.vod_name, page: 1 });\n  if (!isArray(searchResp.list) || isArrayEmpty(searchResp.list) || isNil(searchResp.list[0]?.vod_id)) {\n    MessagePlugin.warning(t('pages.player.message.noRecMatch'));\n    return;\n  }\n\n  const detailResp = await fetchCmsDetail({ uuid: site.id, ids: searchResp.list[0].vod_id });\n  if (\n    !isArray(detailResp.list) ||\n    isArrayEmpty(detailResp.list) ||\n    !isObject(detailResp.list[0]?.vod_episode) ||\n    isObjectEmpty(detailResp.list[0]?.vod_episode)\n  ) {\n    MessagePlugin.warning(t('pages.film.message.noDetailInfo'));\n    return;\n  }\n\n  const info = {\n    ...detailResp.list[0],\n    ...(detailResp.list[0]?.vod_id ? {} : { vod_id: searchResp.list[0]?.vod_id }),\n    ...(detailResp.list[0]?.vod_name ? {} : { vod_name: searchResp.list[0]?.vod_name }),\n    ...(detailResp.list[0]?.vod_pic ? {} : { vod_pic: searchResp.list[0]?.vod_pic }),\n  };\n\n  recommendList.value = [];\n  historyData.value = {} as IModels['history'];\n  starData.value = {} as IModels['star'];\n  active.value.reverseOrder = true;\n  active.value.nav = 'episode';\n\n  videoData.value = { url: '', playEnd: false, watchTime: 0, duration: 0, skipTimeInStart: 30, skipTimeInEnd: 30 };\n\n  await emits('update', {\n    data: toRaw({ info, extra: extraConf.value }),\n  });\n  setup();\n};\n\nconst setup = async () => {\n  const episode = infoConf.value.vod_episode;\n  if (!isObject(episode) || isObjectEmpty(episode)) return;\n\n  const episodeKeys = Object.keys(episode);\n  let filmSource = episodeKeys[0];\n  let flimEpisode = episode[filmSource]?.[0];\n\n  if (!isObject(flimEpisode) || isObjectEmpty(flimEpisode)) return;\n  let filmIndex = `${flimEpisode.text}$${flimEpisode.link}`;\n\n  lineList.value = episodeKeys.map((key) => ({ type_id: key, type_name: key }));\n\n  await getHistoryData();\n  if (historyData.value.siteSource && episode[historyData.value.siteSource]) filmSource = historyData.value.siteSource;\n  if (historyData.value.videoIndex) filmIndex = historyData.value.videoIndex;\n  active.value.filmSource = filmSource;\n  active.value.filmIndex = filmIndex;\n\n  flimEpisode = { text: filmIndex.split('$')[0], link: filmIndex.split('$')[1] };\n\n  await getAnalyzeConfig();\n  await callPlay(flimEpisode);\n\n  getStarData();\n  fetchRecommend();\n};\n\nconst getDirectPlayUrl = async (\n  item: ICmsInfoEpisode,\n): Promise<{\n  url: string;\n  headers: Record<string, any>;\n  quality: Array<string | number>;\n  mediaType: string;\n}> => {\n  const playRes = await fetchCmsPlay({\n    uuid: extraConf.value.active.id,\n    play: item.link,\n    flag: active.value.filmSource,\n  });\n\n  if (!playRes.url) throw new Error('No Play URL');\n\n  const checkPlayable = async (\n    url: string,\n    headers: Record<string, any> = {},\n  ): Promise<{\n    url: string;\n    headers: Record<string, any>;\n    quality: Array<string | number>;\n    mediaType: string;\n  } | null> => {\n    const mediaType = await mediaUtils.checkMediaType(url, headers);\n    if (isNil(mediaType)) return null;\n    return { url, headers, mediaType, quality: [] };\n  };\n\n  // Direct play\n  if (playRes.parse === 0 && playRes.jx !== 1) {\n    if (playRes.url.startsWith(PROXY_API)) {\n      const { searchParams } = new URL(playRes.url);\n      const proxyParams = Object.fromEntries(searchParams.entries());\n      const proxyData = await fetchCmsProxy({ uuid: extraConf.value.active.id, ...proxyParams });\n      await setProxy({ url: proxyParams.url, text: proxyData });\n    }\n\n    const directed = await checkPlayable(playRes.url, playRes.headers);\n    if (!isNil(directed)) return { ...directed, quality: playRes.quality };\n  }\n\n  // Parse play\n  if (playRes.parse === 1 && playRes.jx !== 1) {\n    const parsed = await checkPlayable(playRes.url, playRes.headers);\n    if (!isNil(parsed)) return { ...parsed, quality: playRes.quality };\n  }\n\n  // Jx play\n  if (playRes.jx === 1 || !isArrayEmpty(activeAnalyzeList.value)) {\n    const parse = activeAnalyzeList.value.find((item: IModels['analyze']) => item.id === active.value.analyzeId);\n    if (isNil(parse)) throw new Error('No Active Analyze');\n\n    const jxResp = await fetchParse({ id: parse.id, url: playRes.url });\n    const jxed = await checkPlayable(jxResp.url, jxResp.headers);\n    if (jxed) return jxed;\n  }\n\n  // Sniffer play\n  if (isHttp(playRes.url)) {\n    const sniffResp = await cdpSnifferMedia({\n      url: playRes.url,\n      options: {\n        runScript: playRes.script.runScript,\n        initScript: playRes.script.initScript,\n        customRegex: playRes.script.customRegex,\n        snifferExclude: playRes.script.snifferExclude,\n        headers: playRes.headers,\n      },\n    });\n    const sniffed = await checkPlayable(sniffResp.url, playRes.headers);\n    if (!isNil(sniffed)) return sniffed;\n  }\n\n  throw new Error('No Play URL');\n};\n\nconst callBarrage = async (item: ICmsInfoEpisode) => {\n  try {\n    const res = await fetchRecBarrage({ id: item.link });\n    if (!isArray(res.list) || isArrayEmpty(res.list)) return;\n    emits('barrage', { list: res.list, id: res.id });\n  } catch {}\n};\n\nconst callPlay = async (item: ICmsInfoEpisode) => {\n  try {\n    const isPreload = preload.value.status === 'ready' && preload.value.id === item.link;\n\n    const res = isPreload\n      ? {\n          url: preload.value.url,\n          quality: preload.value.quality,\n          headers: preload.value.headers,\n          mediaType: preload.value.mediaType,\n        }\n      : await getDirectPlayUrl(item);\n\n    videoData.value.url = res.url;\n    if (isPreload) videoData.value.watchTime = playerConf.value.skipHeadAndEnd ? videoData.value.skipTimeInStart : 0;\n\n    await emits('create', {\n      url: res.url,\n      quality: res.quality,\n      headers: res.headers,\n      startTime: videoData.value.watchTime,\n      skipAd: playerConf.value.skipAd,\n      next: !getEpisodePlayState()?.isLast,\n    });\n    callBarrage(item);\n\n    active.value.watch = true;\n  } catch (error) {\n    console.error(`[player][callPlay][error]`, error);\n\n    const msg = (error as Error).message;\n    if (msg === 'No Play URL') {\n      MessagePlugin.warning(t('pages.player.message.noPlayUrl'));\n    } else if (msg === 'No Active Analyze') {\n      MessagePlugin.warning(t('pages.player.message.noActiveAnalyze'));\n    } else {\n      MessagePlugin.error(`${t('common.error')}: ${msg}`);\n    }\n  } finally {\n    defaultPreloadConfig();\n  }\n};\n\nconst timerUpdatePlayProcess = async (currentTime: number, duration: number) => {\n  if (!isPositiveFiniteNumber(currentTime) || !isPositiveFiniteNumber(duration)) return;\n  if (currentTime <= 0 || duration <= 0) return;\n\n  const state = getEpisodePlayState();\n  if (!state) return;\n\n  const { skipTimeInStart, skipTimeInEnd } = videoData.value;\n  const { skipHeadAndEnd, playNextEnabled, playNextPreload } = playerConf.value;\n\n  /** skip head */\n  if (skipHeadAndEnd && skipTimeInStart < duration && currentTime < skipTimeInStart) {\n    emits('seek', skipTimeInStart);\n    return;\n  }\n\n  /** unified watch time */\n  const watchTime = skipHeadAndEnd ? currentTime + skipTimeInEnd : currentTime;\n  const isPlayEnd = watchTime >= duration;\n\n  // console.debug(`timeUpdate`, {\n  //   currentTime,\n  //   watchTime,\n  //   duration,\n  //   percentage: Math.trunc((currentTime / duration) * 100),\n  // });\n\n  /** update history */\n  videoData.value = { ...videoData.value, watchTime, duration, playEnd: isPlayEnd };\n  throttleSaveHistory();\n\n  /** play next episode */\n  if (isPlayEnd && playNextEnabled && !state.isLast) {\n    emits('pause');\n    await handleSwitchSeason(state.nextInfo);\n    return;\n  }\n\n  /** preload next episode */\n  const PRELOAD_TIME = 30;\n  const preloadWatchTime = skipHeadAndEnd ? currentTime + PRELOAD_TIME + skipTimeInEnd : currentTime + PRELOAD_TIME;\n  if (playNextPreload && !state.isLast && preload.value.status === 'idle' && preloadWatchTime >= duration) {\n    preload.value.status = 'loading';\n\n    try {\n      const nextd = await getDirectPlayUrl(state.nextInfo);\n      if (isNil(nextd)) return;\n\n      preload.value = {\n        ...preload.value,\n        ...nextd,\n        id: state.nextInfo.link,\n        status: 'ready',\n      };\n    } catch (error) {\n      preload.value.status = 'error';\n      console.error(`[player][timeUpdate][preloadNext][error]`, error);\n    }\n  }\n};\n\nconst getEpisodePlayState = (): {\n  currIndex: number;\n  nextIndex: number;\n  isLast: boolean;\n  reverseOrder: boolean;\n  currentInfo: ICmsInfoEpisode;\n  nextInfo: ICmsInfoEpisode;\n} | null => {\n  const { filmSource, filmIndex, reverseOrder } = active.value;\n  const episode = infoConf.value.vod_episode;\n\n  if (\n    isNil(filmSource) ||\n    isNil(filmIndex) ||\n    !isBoolean(reverseOrder) ||\n    !isObject(episode) ||\n    isObjectEmpty(episode)\n  ) {\n    return null;\n  }\n\n  const currentEpisode = episode?.[filmSource];\n  if (!isArray(currentEpisode) || isArrayEmpty(currentEpisode)) {\n    return null;\n  }\n\n  const index = currentEpisode.findIndex((item) => `${item.text}$${item.link}` === filmIndex);\n  if (index === -1) return null;\n\n  const currentInfo = currentEpisode[index];\n  const isLast = reverseOrder ? index === currentEpisode.length - 1 : index === 0;\n  const nextIndex = isLast ? -1 : reverseOrder ? index + 1 : index - 1;\n  const nextInfo = isLast ? ({} as ICmsInfoEpisode) : currentEpisode[nextIndex];\n\n  return { currIndex: index, nextIndex, isLast, reverseOrder, currentInfo, nextInfo };\n};\n\nemitter.on(emitterChannel.COMP_MULTI_PLAYER_PLAYNEXT, () => {\n  const state = getEpisodePlayState();\n  if (!isBoolean(state?.isLast) || isNil(state?.nextIndex) || state?.nextIndex === -1) return;\n\n  const nextInfo = state.nextInfo;\n  handleSwitchSeason(nextInfo);\n});\n</script>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "src/renderer/src/pages/player/components/AsideLive.vue",
    "content": "<template>\n  <div class=\"container-aside-wrap container-aside-live\">\n    <div class=\"container-wrap main-wrap\">\n      <div class=\"info-wrap\">\n        <div class=\"new-title-wrap\">\n          <div class=\"new-title-name\">\n            <div class=\"title title-text txthide txthide1\">{{ infoConf.name }}</div>\n          </div>\n        </div>\n        <div class=\"play-paction\">\n          <div class=\"paction-item like\" @click=\"handleSwitchStar\">\n            <heart-filled-icon v-if=\"starData.id\" class=\"icon\" />\n            <heart-icon v-else class=\"icon\" />\n            <span class=\"tip\">{{ $t('pages.moment.star.title') }}</span>\n          </div>\n          <t-divider layout=\"vertical\" />\n\n          <div class=\"paction-item download\" @click=\"handleDownloadDialog\">\n            <download-icon class=\"icon\" />\n            <span class=\"tip\">{{ $t('pages.player.function.download') }}</span>\n          </div>\n          <t-divider layout=\"vertical\" />\n\n          <div class=\"paction-item share\" @click=\"handleSharePopup\">\n            <t-popup trigger=\"click\">\n              <share1-icon class=\"icon\" />\n              <span class=\"tip\">{{ $t('component.share.title') }}</span>\n\n              <template #content>\n                <share-popup :data=\"shareFormData\" type=\"popup\" />\n              </template>\n            </t-popup>\n          </div>\n        </div>\n        <dialog-download-view\n          v-model:visible=\"active.download\"\n          :episode=\"downloadFormData.episode\"\n          :current=\"downloadFormData.current\"\n        />\n      </div>\n\n      <div class=\"anthology-container live-anthology\">\n        <div class=\"anthology-series-wrap\">\n          <tag-nav\n            class=\"anthology-series-nav\"\n            :list=\"navOptions\"\n            :active=\"active.nav\"\n            @change=\"handleSwitchSeriesTab\"\n          />\n        </div>\n        <div class=\"box-anthology-wrap\">\n          <div v-if=\"active.nav === 'epg'\" class=\"box-anthology-item box-anthology-epg\">\n            <div class=\"box-anthology-content\">\n              <t-list ref=\"epgListRef\" class=\"list-wrap\" :scroll=\"{ rowHeight: 34, type: 'virtual' }\">\n                <t-list-item\n                  v-for=\"(item, index) in epgList\"\n                  :key=\"index\"\n                  class=\"item-wrap\"\n                  :class=\"[formatEpgStatus(item.start, item.end) ? 'is-active' : '']\"\n                >\n                  <div class=\"list-item\">\n                    <div class=\"time\">{{ item.start }}</div>\n                    <div class=\"title txthide txthide1\">{{ item.title }}</div>\n                  </div>\n                  <div class=\"divider\"></div>\n                </t-list-item>\n              </t-list>\n            </div>\n          </div>\n          <div v-else-if=\"active.nav === 'channel'\" class=\"box-anthology-item box-anthology-channel\">\n            <div v-if=\"classList.length > 1\" class=\"box-anthology-header\">\n              <title-menu :list=\"classList\" :active=\"active.class\" class=\"nav\" @change=\"handleSwitchChannelClass\" />\n            </div>\n            <div class=\"box-anthology-content\">\n              <t-list ref=\"channelListRef\" class=\"list-wrap\" :scroll=\"{ rowHeight: 32, type: 'virtual' }\">\n                <t-list-item\n                  v-for=\"(item, index) in channelList\"\n                  :key=\"index\"\n                  class=\"item-wrap\"\n                  :class=\"[item.id === infoConf.id ? 'is-active' : '']\"\n                  @click=\"handleSwitchChannelItem(item)\"\n                >\n                  <div class=\"list-item\">\n                    <div class=\"logo\">\n                      <t-image\n                        class=\"logo-lazy\"\n                        fit=\"contain\"\n                        :src=\"item.logo\"\n                        :lazy=\"true\"\n                        :loading=\"renderDefaultLazy\"\n                        :error=\"renderDefaultLazy\"\n                      />\n                    </div>\n                    <div class=\"title txthide txthide1\">{{ item.name }}</div>\n                  </div>\n                  <div class=\"divider\"></div>\n                </t-list-item>\n              </t-list>\n\n              <div class=\"infinite-loading\">\n                <infinite-loading\n                  class=\"infinite-loading-container\"\n                  target=\".box-anthology-content\"\n                  :identifier=\"infiniteId\"\n                  :distance=\"200\"\n                  @infinite=\"loadMore\"\n                >\n                  <template #complete>{{ $t('common.infiniteLoading.complete') }}</template>\n                  <template #error>{{ $t('common.infiniteLoading.error') }}</template>\n                </infinite-loading>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n<script setup lang=\"tsx\">\nimport 'v3-infinite-loading/lib/style.css';\n\nimport { isBetween, toYMD } from '@shared/modules/date';\nimport { isArray, isArrayEmpty, isNil, isPositiveFiniteNumber } from '@shared/modules/validate';\nimport type { ICmsInfo } from '@shared/types/cms';\nimport type { IModels } from '@shared/types/db';\nimport { throttle } from 'es-toolkit';\nimport { DownloadIcon, HeartFilledIcon, HeartIcon, Share1Icon } from 'tdesign-icons-vue-next';\nimport InfiniteLoading from 'v3-infinite-loading';\nimport type { StateHandler as ILoadStateHdandler } from 'v3-infinite-loading/lib/types';\nimport type { PropType } from 'vue';\nimport { computed, onMounted, ref, toRaw, useTemplateRef, watch } from 'vue';\n\nconst props = defineProps({\n  store: {\n    type: Object as PropType<IStorePlayer>,\n    default: () => ({}),\n  },\n  process: {\n    type: Object as PropType<IVideoProcess>,\n    default: () => ({ currentTime: 0, duration: 0 }),\n  },\n});\n\nconst emits = defineEmits(['update', 'barrage', 'create', 'pause', 'seek']);\n\nimport type { ListInstanceFunctions } from 'tdesign-vue-next';\n\nimport { fetchChannelEpg, fetchChannelPage } from '@/api/live';\nimport { addHistory, addStar, delStar, findHistory, findStar, putHistory, putStar } from '@/api/moment';\nimport LazyBg from '@/components/lazy-bg/index.vue';\nimport sharePopup from '@/components/share/index.vue';\nimport TagNav from '@/components/tag-nav/index.vue';\nimport TitleMenu from '@/components/title-menu/index.vue';\nimport type { IStorePlayer } from '@/config/player';\nimport { t } from '@/locales';\nimport type { IVideoOptions, IVideoProcess } from '@/types/player';\n\nimport DialogDownloadView from './DialogDownload.vue';\n\nconst renderDefaultLazy = () => <LazyBg class=\"render-icon\" />;\n\n// @ts-expect-error 已声明“channelListRef”，但从未读取其值。\nconst epgListRef = useTemplateRef<ListInstanceFunctions>('epgListRef');\n// @ts-expect-error 已声明“channelListRef”，但从未读取其值。\nconst channelListRef = useTemplateRef<ListInstanceFunctions>('channelListRef');\n\nconst infoConf = ref(props.store.data.info);\nconst extraConf = ref(props.store.data.extra);\nconst playerConf = ref(props.store.setting);\nconst processConf = ref(props.process);\n\nconst channelList = ref<IModels['channel'][]>([]);\nconst classList = ref<Array<{ type_id: string; type_name: string }>>([]);\nconst epgList = ref<Array<{ title: string; start: string; end: string }>>([]);\n\nconst active = ref({\n  watch: true,\n  nav: 'epg',\n  class: '',\n  share: false,\n  download: false,\n});\n\nconst downloadFormData = ref({\n  episode: {} as ICmsInfo['vod_episode'],\n  current: '',\n});\nconst shareFormData = ref({\n  name: '',\n  url: '',\n  enablePrefix: true,\n});\n\nconst infiniteId = ref(Date.now());\nconst pagination = ref({\n  pageIndex: 1,\n  pageSize: 32,\n  total: 0,\n});\n\nconst starData = ref({} as IModels['star']);\nconst historyData = ref({} as IModels['history']);\n\nconst videoData = ref<IVideoOptions>({\n  url: '',\n  playEnd: false,\n  watchTime: 0,\n  duration: 0,\n  skipTimeInStart: 0,\n  skipTimeInEnd: 0,\n});\n\nconst navOptions = computed(() => [\n  { value: 'epg', label: t('pages.player.live.epg') },\n  { value: 'channel', label: t('pages.player.live.channel') },\n]);\n\nwatch(\n  () => props.store,\n  (val) => {\n    infoConf.value = val.data.info;\n    extraConf.value = val.data.extra;\n    playerConf.value = val.setting;\n  },\n  { deep: true },\n);\nwatch(\n  () => props.process,\n  (val) => (processConf.value = val),\n);\nwatch(\n  () => processConf.value,\n  (val) => active.value.watch && timerUpdatePlayProcess(val.currentTime, val.duration),\n);\n// watch(\n//   () => active.value.nav,\n//   () => handleScroll(),\n// );\n\nonMounted(() => setup());\n\nconst createStarDoc = (item: IModels['channel'], siteKey: string) => ({\n  type: 2,\n  relateId: siteKey,\n  videoId: item.id,\n  videoImage: item.logo,\n  videoName: item.name,\n  videoType: item.group,\n  videoRemarks: '',\n});\n\nconst getStarData = async () => {\n  try {\n    const resp = await findStar({ relateId: extraConf.value.active.key, videoId: infoConf.value.id, type: 2 });\n    starData.value = isNil(resp?.id) ? {} : resp;\n  } catch (error) {\n    console.error('Get Star Data Error:', error);\n    starData.value = {} as IModels['star'];\n  }\n};\n\nconst saveStarData = async () => {\n  const id = starData.value?.id;\n  const doc = createStarDoc(infoConf.value as IModels['channel'], extraConf.value.active.key);\n\n  try {\n    const resp = isNil(id) ? await addStar(doc) : await putStar({ id: [id], doc });\n    if (isArray(resp) && !isArrayEmpty(resp) && !isNil(resp[0]?.id)) {\n      starData.value = resp[0];\n    } else {\n      starData.value = {} as IModels['star'];\n    }\n  } catch (error) {\n    console.error('Save Star Data Error:', error);\n    starData.value = {} as IModels['star'];\n  }\n};\n\nconst delStarDate = async () => {\n  const id = starData.value?.id;\n\n  try {\n    await delStar({ id: [id] });\n  } catch (error) {\n    console.error('Delete Star Data Error:', error);\n  } finally {\n    starData.value = {} as IModels['star'];\n  }\n};\n\nconst handleSwitchStar = async () => {\n  const id = starData.value?.id;\n\n  isNil(id) ? await saveStarData() : await delStarDate();\n};\n\nconst createHistoryDoc = (item: IModels['channel'], siteKey: string, videoData: IVideoOptions) => ({\n  type: 2,\n  relateId: siteKey,\n  siteSource: item.group,\n  playEnd: videoData.playEnd,\n  videoId: item.id,\n  videoImage: item.logo,\n  videoName: item.name,\n  videoIndex: `${item.name}$${item.api}`,\n  watchTime: isPositiveFiniteNumber(videoData.watchTime) ? videoData.watchTime : 0,\n  duration: isPositiveFiniteNumber(videoData.duration) ? videoData.duration : 0,\n  skipTimeInStart: videoData.skipTimeInStart,\n  skipTimeInEnd: videoData.skipTimeInEnd,\n});\n\nconst getHistoryData = async () => {\n  try {\n    const resp = await findHistory({ relateId: extraConf.value.active.key, videoId: infoConf.value.id, type: 2 });\n\n    const history = isNil(resp?.id) ? {} : resp;\n    historyData.value = history;\n\n    const { skipHeadAndEnd } = playerConf.value;\n\n    const skipTimeInStart = history.skipTimeInStart ?? 0;\n    const skipTimeInEnd = history.skipTimeInEnd ?? 0;\n    const duration = history.duration ?? 0;\n    const rawWatchTime = history.watchTime ?? 0;\n    const playEnd = history.playEnd ?? false;\n\n    videoData.value = {\n      ...videoData.value,\n      skipTimeInStart,\n      skipTimeInEnd,\n      duration,\n      watchTime: skipHeadAndEnd ? Math.max(rawWatchTime, skipTimeInStart) : rawWatchTime,\n      playEnd,\n    };\n  } catch (error) {\n    console.error('Get History Data Error:', error);\n    historyData.value = {} as IModels['history'];\n  }\n};\n\nconst saveHistoryData = async () => {\n  const id = historyData.value?.id;\n  const doc = createHistoryDoc(infoConf.value as IModels['channel'], extraConf.value.active.key, videoData.value);\n\n  try {\n    const resp = isNil(id) ? await addHistory(doc) : await putHistory({ id: [id], doc });\n    if (isArray(resp) && !isArrayEmpty(resp) && !isNil(resp[0]?.id)) {\n      historyData.value = resp[0];\n    } else {\n      historyData.value = {} as IModels['history'];\n    }\n  } catch (error) {\n    console.error('Save History Data Error:', error);\n    historyData.value = {} as IModels['history'];\n  }\n};\n\nconst throttleSaveHistory = throttle(saveHistoryData, 3000, { edges: ['leading', 'trailing'] });\n\nconst formatEpgStatus = (start: string, end: string): boolean => {\n  const standardStart = `${toYMD()} ${start}`;\n  const standardEnd = `${toYMD()} ${end}`;\n  return isBetween(standardStart, standardEnd);\n};\n\nconst getChannel = async () => {\n  const { pageIndex, pageSize } = pagination.value;\n\n  const resp = await fetchChannelPage({\n    page: pageIndex,\n    pageSize,\n    group: active.value.class,\n  });\n\n  if (isArray(resp.class) && !isArrayEmpty(resp.class)) {\n    classList.value = [\n      { type_id: '', type_name: computed(() => t('common.all')) },\n      ...resp.class.map((item) => ({\n        type_id: item.value,\n        type_name: item.label,\n      })),\n    ];\n    active.value.class = classList.value.map((item) => item.type_id).includes(active.value.class)\n      ? active.value.class\n      : classList.value[0].type_id;\n  }\n\n  if (isArray(resp.list) && !isArrayEmpty(resp.list)) {\n    channelList.value.push(...resp.list);\n  }\n\n  if (resp.total) pagination.value.total = resp.total;\n\n  return resp.list.length;\n};\n\nconst resetPagination = () => {\n  pagination.value.pageIndex = 1;\n  pagination.value.total = 0;\n};\n\nconst loadMore = async ($state: ILoadStateHdandler) => {\n  try {\n    const length = await getChannel();\n\n    if (length === 0) {\n      resetPagination();\n      $state.complete();\n    } else {\n      pagination.value.pageIndex++;\n      $state.loaded();\n    }\n  } catch (error) {\n    console.error(`Failed to load more data:`, error);\n    $state.error();\n  }\n};\n\nconst getChannelEpg = async (ch: string, date: string) => {\n  try {\n    const res = await fetchChannelEpg({ ch, date });\n    epgList.value = res;\n  } catch (error) {\n    console.error('Fetch EPG List Error:', error);\n  }\n};\n\nconst handleSwitchSeriesTab = (val: string) => {\n  active.value.nav = val;\n};\n\nconst handleSwitchChannelClass = (id: string) => {\n  resetPagination();\n\n  channelList.value = [];\n\n  active.value.class = id;\n\n  infiniteId.value = Date.now();\n};\n\nconst handleSwitchChannelItem = async (item: IModels['channel']) => {\n  epgList.value = [];\n\n  historyData.value = {} as IModels['history'];\n  starData.value = {} as IModels['star'];\n\n  videoData.value = { url: '', playEnd: false, watchTime: 0, duration: 0, skipTimeInStart: 0, skipTimeInEnd: 0 };\n\n  await emits('update', {\n    data: toRaw({ info: item, extra: extraConf.value }),\n  });\n  setup();\n};\n\nconst handleDownloadDialog = () => {\n  downloadFormData.value = {\n    episode: {\n      [t('common.default')]: [{ text: infoConf.value.name, link: videoData.value.url || infoConf.value.api }],\n    },\n    current: videoData.value.url,\n  };\n  active.value.download = true;\n};\n\nconst handleSharePopup = () => {\n  let name = infoConf.value.name;\n  if (infoConf.value.group) name = `${infoConf.value.group}-${infoConf.value.name}`;\n\n  shareFormData.value = { ...shareFormData.value, name, url: videoData.value.url };\n  active.value.share = true;\n};\n\nconst callPlay = async (item) => {\n  videoData.value.url = item.url;\n\n  await emits('create', {\n    url: item.url,\n    isLive: true,\n    startTime: videoData.value.watchTime,\n    skipAd: playerConf.value.skipAd,\n  });\n};\n\nconst timerUpdatePlayProcess = async (currentTime: number, duration: number) => {\n  if (!isPositiveFiniteNumber(currentTime) || !isPositiveFiniteNumber(duration)) return;\n  if (currentTime <= 0 || duration <= 0) return;\n\n  const { skipTimeInStart, skipTimeInEnd } = videoData.value;\n  const { skipHeadAndEnd } = playerConf.value;\n\n  /** skip head */\n  if (skipHeadAndEnd && skipTimeInStart < duration && currentTime < skipTimeInStart) {\n    emits('seek', skipTimeInStart);\n    return;\n  }\n\n  // Get skip time\n  const watchTime = skipHeadAndEnd ? currentTime + skipTimeInEnd : currentTime;\n  const isPlayEnd = watchTime >= duration;\n\n  // console.debug(`timeUpdate`, {\n  //   currentTime,\n  //   watchTime,\n  //   duration,\n  //   percentage: Math.trunc((currentTime / duration) * 100),\n  // });\n\n  // update history data\n  videoData.value = { ...videoData.value, watchTime, duration, playEnd: isPlayEnd };\n  throttleSaveHistory();\n};\n\nconst setup = async () => {\n  // handleScroll();\n\n  await getHistoryData();\n\n  await callPlay({ url: infoConf.value.api });\n\n  getStarData();\n  getChannelEpg(infoConf.value.name, toYMD());\n};\n\n// const handleScroll = () => {\n//   nextTick(() => {\n//     const nav = active.value.nav;\n//     const isEpg = nav === 'epg';\n\n//     const listRef = isEpg ? epgListRef.value : channelListRef.value;\n//     if (!listRef) return;\n\n//     const list = isEpg ? epgList.value : channelList.value;\n//     if (list.length === 0) return;\n\n//     const id = isEpg ? epgList.value.find((item) => formatEpgStatus(item.start, item.end))?.title : infoConf.value.id;\n//     if (!id) return;\n\n//     const index = list.findIndex((item) => (isEpg ? item.title === id : item.id === id)) - 1;\n//     if (index < 0) return;\n\n//     listRef.scrollTo?.({\n//       index,\n//       behavior: 'smooth',\n//     });\n//   });\n// };\n</script>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "src/renderer/src/pages/player/components/AsideParse.vue",
    "content": "<template>\n  <div class=\"container-aside-wrap container-aside-parse\">\n    <div class=\"container-wrap main-wrap\">\n      <div class=\"info-wrap\">\n        <div class=\"new-title-wrap\">\n          <div class=\"new-title-name\">\n            <div class=\"title title-text txthide txthide1\">{{ infoConf.name }}</div>\n          </div>\n        </div>\n        <div class=\"play-paction\">\n          <div class=\"paction-item like\" @click=\"handleSwitchStar\">\n            <heart-filled-icon v-if=\"starData.id\" class=\"icon\" />\n            <heart-icon v-else class=\"icon\" />\n            <span class=\"tip\">{{ $t('pages.moment.star.title') }}</span>\n          </div>\n          <t-divider layout=\"vertical\" />\n\n          <div class=\"paction-item download\" @click=\"handleDownloadDialog\">\n            <download-icon class=\"icon\" />\n            <span class=\"tip\">{{ $t('pages.player.function.download') }}</span>\n          </div>\n          <t-divider layout=\"vertical\" />\n\n          <div class=\"paction-item share\" @click=\"handleSharePopup\">\n            <t-popup trigger=\"click\">\n              <share1-icon class=\"icon\" />\n              <span class=\"tip\">{{ $t('component.share.title') }}</span>\n\n              <template #content>\n                <share-popup :data=\"shareFormData\" type=\"popup\" />\n              </template>\n            </t-popup>\n          </div>\n          <t-divider layout=\"vertical\" />\n\n          <div class=\"paction-item more\">\n            <t-dropdown trigger=\"click\">\n              <t-button theme=\"default\" shape=\"square\" variant=\"text\">\n                <more-icon />\n              </t-button>\n              <t-dropdown-menu>\n                <t-dropdown-item>\n                  <div class=\"setting-item\" @click=\"handleSettingDialog\">\n                    <setting-icon />\n                    {{ $t('pages.player.function.setting') }}\n                  </div>\n                </t-dropdown-item>\n              </t-dropdown-menu>\n            </t-dropdown>\n          </div>\n        </div>\n        <dialog-download-view\n          v-model:visible=\"active.download\"\n          :episode=\"downloadFormData.episode\"\n          :current=\"downloadFormData.current\"\n        />\n        <dialog-setting-view\n          v-model:visible=\"active.setting\"\n          type=\"parse\"\n          :data=\"settingFormData\"\n          :time=\"processConf\"\n          @change=\"onSettingChange\"\n        />\n      </div>\n\n      <div class=\"anthology-container parse-anthology\">\n        <div class=\"anthology-series-wrap\">\n          <tag-nav\n            class=\"anthology-series-nav\"\n            :list=\"navOptions\"\n            :active=\"active.nav\"\n            @change=\"handleSwitchSeriesTab\"\n          />\n        </div>\n        <div class=\"box-anthology-wrap\">\n          <div class=\"box-anthology-item\">\n            <div class=\"box-anthology-content\">\n              <t-list ref=\"listRef\" class=\"list-wrap\" :scroll=\"{ rowHeight: 34, type: 'virtual' }\">\n                <t-list-item\n                  v-for=\"(item, index) in parseList\"\n                  :key=\"index\"\n                  class=\"item-wrap\"\n                  :class=\"[item.id === extraConf.active.id ? 'is-active' : '']\"\n                  @click=\"handleSwitchParseItem(item)\"\n                >\n                  <div class=\"list-item\">\n                    <div class=\"title txthide txthide1\">{{ item.name }}</div>\n                  </div>\n                  <div class=\"divider\"></div>\n                </t-list-item>\n              </t-list>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n<script setup lang=\"tsx\">\nimport { isArray, isArrayEmpty, isHttp, isNil, isPositiveFiniteNumber } from '@shared/modules/validate';\nimport type { ICmsInfo } from '@shared/types/cms';\nimport type { IModels } from '@shared/types/db';\nimport { throttle } from 'es-toolkit';\nimport { DownloadIcon, HeartFilledIcon, HeartIcon, MoreIcon, SettingIcon, Share1Icon } from 'tdesign-icons-vue-next';\nimport type { ListInstanceFunctions } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport type { PropType } from 'vue';\nimport { computed, onMounted, ref, toRaw, useTemplateRef, watch } from 'vue';\n\nimport { fetchRecBarrage } from '@/api/film';\nimport { addHistory, addStar, delStar, findHistory, findStar, putHistory, putStar } from '@/api/moment';\nimport { fetchParse } from '@/api/parse';\nimport sharePopup from '@/components/share/index.vue';\nimport TagNav from '@/components/tag-nav/index.vue';\nimport type { IStorePlayer } from '@/config/player';\nimport { t } from '@/locales';\nimport type { IVideoOptions, IVideoProcess } from '@/types/player';\n\nimport DialogDownloadView from './DialogDownload.vue';\nimport DialogSettingView from './DialogSetting.vue';\n\nconst props = defineProps({\n  store: {\n    type: Object as PropType<IStorePlayer>,\n    default: () => ({}),\n  },\n  process: {\n    type: Object as PropType<IVideoProcess>,\n    default: () => ({ currentTime: 0, duration: 0 }),\n  },\n});\n\nconst emits = defineEmits(['update', 'barrage', 'create', 'pause', 'seek']);\n\n// @ts-expect-error 已声明“listRef”，但从未读取其值。\nconst listRef = useTemplateRef<ListInstanceFunctions>('listRef');\n\nconst infoConf = ref(props.store.data.info);\nconst extraConf = ref(props.store.data.extra);\nconst playerConf = ref(props.store.setting);\nconst processConf = ref(props.process);\n\nconst parseList = ref(extraConf.value.site || []);\n\nconst active = ref({\n  watch: true,\n  nav: 'line',\n  share: false,\n  download: false,\n  setting: false,\n});\n\nconst downloadFormData = ref({\n  episode: {} as ICmsInfo['vod_episode'],\n  current: '',\n});\nconst shareFormData = ref({\n  name: '',\n  url: '',\n  enablePrefix: true,\n});\nconst settingFormData = ref({\n  skipHeadAndEnd: false,\n  skipTimeInStart: 30,\n  skipTimeInEnd: 30,\n  skipAd: false,\n});\n\nconst navOptions = computed(() => [{ value: 'line', label: t('pages.parse.title') }]);\n\nconst starData = ref({} as IModels['star']);\nconst historyData = ref({} as IModels['history']);\nconst videoData = ref<IVideoOptions>({\n  url: '',\n  playEnd: false,\n  watchTime: 0,\n  duration: 0,\n  skipTimeInStart: 0,\n  skipTimeInEnd: 0,\n});\n\nwatch(\n  () => props.store,\n  (val) => {\n    infoConf.value = val.data.info;\n    extraConf.value = val.data.extra;\n    playerConf.value = val.setting;\n  },\n  { deep: true },\n);\nwatch(\n  () => props.process,\n  (val) => (processConf.value = val),\n);\nwatch(\n  () => processConf.value,\n  (val) => active.value.watch && timerUpdatePlayProcess(val.currentTime, val.duration),\n);\n// watch(\n//   () => active.value.nav,\n//   () => handleScroll(),\n// );\n\nonMounted(() => setup());\n\nconst createStarDoc = (item: IModels['analyze'], siteKey: string) => ({\n  type: 3,\n  relateId: siteKey,\n  videoId: item.id,\n  videoImage: '',\n  videoName: item.name,\n  videoType: '',\n  videoRemarks: '',\n});\n\nconst getStarData = async () => {\n  try {\n    const resp = await findStar({ relateId: extraConf.value.active.key, videoId: infoConf.value.id, type: 3 });\n    starData.value = isNil(resp?.id) ? {} : resp;\n  } catch (error) {\n    console.error('Get Star Data Error:', error);\n    starData.value = {} as IModels['star'];\n  }\n};\n\nconst saveStarData = async () => {\n  const id = starData.value?.id;\n  const doc = createStarDoc(infoConf.value as IModels['analyze'], extraConf.value.active.key);\n\n  try {\n    const resp = isNil(id) ? await addStar(doc) : await putStar({ id: [id], doc });\n    if (isArray(resp) && !isArrayEmpty(resp) && !isNil(resp[0]?.id)) {\n      starData.value = resp[0];\n    } else {\n      starData.value = {} as IModels['star'];\n    }\n  } catch (error) {\n    console.error('Save Star Data Error:', error);\n    starData.value = {} as IModels['star'];\n  }\n};\n\nconst delStarDate = async () => {\n  const id = starData.value?.id;\n\n  try {\n    await delStar({ id: [id] });\n  } catch (error) {\n    console.error('Delete Star Data Error:', error);\n  } finally {\n    starData.value = {} as IModels['star'];\n  }\n};\n\nconst handleSwitchStar = async () => {\n  const id = starData.value?.id;\n\n  isNil(id) ? await saveStarData() : await delStarDate();\n};\n\nconst createHistoryDoc = (item: IModels['analyze'], siteKey: string, videoData: IVideoOptions) => ({\n  type: 3,\n  relateId: siteKey,\n  siteSource: '',\n  playEnd: videoData.playEnd,\n  videoId: item.id,\n  videoImage: '',\n  videoName: item.name,\n  videoIndex: `${item.name}$${item.api}`,\n  watchTime: isPositiveFiniteNumber(videoData.watchTime) ? videoData.watchTime : 0,\n  duration: isPositiveFiniteNumber(videoData.duration) ? videoData.duration : 0,\n  skipTimeInStart: videoData.skipTimeInStart,\n  skipTimeInEnd: videoData.skipTimeInEnd,\n});\n\nconst getHistoryData = async () => {\n  try {\n    const resp = await findHistory({ relateId: extraConf.value.active.key, videoId: infoConf.value.id, type: 3 });\n\n    const history = isNil(resp?.id) ? {} : resp;\n    historyData.value = history;\n\n    const { skipHeadAndEnd } = playerConf.value;\n\n    const skipTimeInStart = history.skipTimeInStart ?? 30;\n    const skipTimeInEnd = history.skipTimeInEnd ?? 30;\n    const duration = history.duration ?? 0;\n    const watchTime = history.watchTime ?? 0;\n    const playEnd = history.playEnd ?? false;\n\n    videoData.value = {\n      ...videoData.value,\n      skipTimeInStart,\n      skipTimeInEnd,\n      duration,\n      watchTime: skipHeadAndEnd ? Math.max(watchTime, skipTimeInStart) : watchTime,\n      playEnd,\n    };\n  } catch (error) {\n    console.error('Get History Data Error:', error);\n    historyData.value = {} as IModels['history'];\n  }\n};\n\nconst saveHistoryData = async () => {\n  const id = historyData.value?.id;\n  const doc = createHistoryDoc(infoConf.value as IModels['analyze'], extraConf.value.active.key, videoData.value);\n\n  try {\n    const resp = isNil(id) ? await addHistory(doc) : await putHistory({ id: [id], doc });\n    if (isArray(resp) && !isArrayEmpty(resp) && !isNil(resp[0]?.id)) {\n      historyData.value = resp[0];\n    } else {\n      historyData.value = {} as IModels['history'];\n    }\n  } catch (error) {\n    console.error('Save History Data Error:', error);\n    historyData.value = {} as IModels['history'];\n  }\n};\n\nconst throttleSaveHistory = throttle(saveHistoryData, 3000, { edges: ['leading', 'trailing'] });\n\nconst handleSwitchParseItem = async (item: IModels['analyze']) => {\n  historyData.value = {} as IModels['history'];\n  starData.value = {} as IModels['star'];\n\n  videoData.value = { url: '', playEnd: false, watchTime: 0, duration: 0, skipTimeInStart: 0, skipTimeInEnd: 0 };\n\n  await emits('update', {\n    data: toRaw({ info: infoConf.value, extra: { ...extraConf.value, active: item } }),\n  });\n  setup();\n};\n\nconst handleSwitchSeriesTab = (val: string) => {\n  active.value.nav = val;\n};\n\nconst handleDownloadDialog = () => {\n  downloadFormData.value = {\n    episode: {\n      [t('common.default')]: [{ text: infoConf.value.name, link: videoData.value.url || infoConf.value.api }],\n    },\n    current: videoData.value.url,\n  };\n  active.value.download = true;\n};\n\nconst handleSharePopup = () => {\n  const name = infoConf.value.name;\n\n  shareFormData.value = { ...shareFormData.value, name, url: videoData.value.url };\n  active.value.share = true;\n};\n\nconst callBarrage = async (item: { url: string }) => {\n  try {\n    const res = await fetchRecBarrage({ id: item.url });\n    if (!isArray(res.list) || isArrayEmpty(res.list)) return;\n    emits('barrage', { list: res.list, id: res.id });\n  } catch {}\n};\n\nconst handleSettingDialog = () => {\n  settingFormData.value = {\n    skipHeadAndEnd: playerConf.value.skipHeadAndEnd,\n    skipTimeInStart: videoData.value.skipTimeInStart,\n    skipTimeInEnd: videoData.value.skipTimeInEnd,\n    skipAd: playerConf.value.skipAd,\n  };\n\n  active.value.setting = true;\n};\n\nconst onSettingChange = (item) => {\n  const { skipTimeInStart = 30, skipTimeInEnd = 30, skipHeadAndEnd, skipAd } = item;\n\n  /** sync skip time */\n  videoData.value.skipTimeInStart = skipTimeInStart;\n  videoData.value.skipTimeInEnd = skipTimeInEnd;\n\n  /** sync player config */\n  playerConf.value.skipHeadAndEnd = skipHeadAndEnd;\n  playerConf.value.skipAd = skipAd;\n\n  emits('update', { setting: playerConf.value });\n};\n\nconst callPlay = async (item: { url: string }) => {\n  MessagePlugin.info(t('pages.parse.message.info'));\n\n  const { active } = extraConf.value;\n  const resp = await fetchParse({ id: active.id, url: item.url });\n\n  if (!isHttp(resp?.url)) {\n    MessagePlugin.error(t('pages.parse.message.error'));\n    return;\n  }\n\n  videoData.value.url = resp.url;\n\n  await emits('create', {\n    url: resp.url,\n    headers: resp.headers,\n    startTime: videoData.value.watchTime,\n    skipAd: playerConf.value.skipAd,\n  });\n  callBarrage(item);\n};\n\nconst timerUpdatePlayProcess = async (currentTime: number, duration: number) => {\n  if (!isPositiveFiniteNumber(currentTime) || !isPositiveFiniteNumber(duration)) return;\n  if (currentTime <= 0 || duration <= 0) return;\n\n  const { skipTimeInStart, skipTimeInEnd } = videoData.value;\n  const { skipHeadAndEnd } = playerConf.value;\n\n  /** skip head */\n  if (skipHeadAndEnd && skipTimeInStart < duration && currentTime < skipTimeInStart) {\n    emits('seek', skipTimeInStart);\n    return;\n  }\n\n  // Get skip time\n  const watchTime = skipHeadAndEnd ? currentTime + skipTimeInEnd : currentTime;\n  const isPlayEnd = watchTime >= duration;\n\n  // console.debug(`timeUpdate`, {\n  //   currentTime,\n  //   watchTime,\n  //   duration,\n  //   percentage: Math.trunc((currentTime / duration) * 100),\n  // });\n\n  // update history data\n  videoData.value = { ...videoData.value, watchTime, duration, playEnd: isPlayEnd };\n  throttleSaveHistory();\n};\n\nconst setup = async () => {\n  // handleScroll();\n\n  await getHistoryData();\n\n  await callPlay({ url: infoConf.value.api });\n\n  getStarData();\n};\n\n// const handleScroll = () => {\n//   nextTick(() => {\n//     if (!listRef.value) return;\n\n//     const id = extraConf.value.active.id;\n//     if (!id) return;\n\n//     const list = parseList.value;\n//     if (list.length === 0) return;\n\n//     const index = list.findIndex((item) => item.id === id) - 1;\n//     if (index < 0) return;\n//     console.debug('handleScroll to index:', index);\n//     listRef.value?.scrollTo?.({\n//       index,\n//       behavior: 'smooth',\n//     });\n//   });\n// };\n</script>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "src/renderer/src/pages/player/components/DialogDownload.vue",
    "content": "<template>\n  <t-dialog\n    v-model:visible=\"formVisible\"\n    show-in-attached-element\n    :attach=\"`.${attachMainContent}`\"\n    :width=\"508\"\n    placement=\"center\"\n    destroy-on-close\n    lazy\n  >\n    <template #header>\n      {{ $t('pages.player.download.title') }}\n    </template>\n    <template #body>\n      <t-form\n        ref=\"formRef\"\n        :data=\"formData\"\n        :rules=\"RULES\"\n        :label-width=\"120\"\n        required-mark-position=\"right\"\n        label-align=\"left\"\n        reset-type=\"initial\"\n        @submit=\"onSubmit\"\n      >\n        <t-form-item :label-width=\"0\" :style=\"{ marginBottom: 'var(--td-comp-margin-s)' }\">\n          <div class=\"input-horizontal-item\">\n            <t-select\n              v-model=\"active.line\"\n              :placeholder=\"$t('pages.player.download.soureceSelect')\"\n              :style=\"{ maxWidth: '200px' }\"\n            >\n              <t-option v-for=\"item in lineKeys\" :key=\"item\" :value=\"item\">{{ item }}</t-option>\n            </t-select>\n            <t-button theme=\"default\" @click=\"handleCopyCurrentURL\">\n              {{ $t('pages.player.download.copyCurrentUrl') }}\n            </t-button>\n          </div>\n        </t-form-item>\n        <t-form-item :label-width=\"0\" name=\"episode\">\n          <t-transfer v-model=\"formData.episode\" :data=\"currentEpisode\" search>\n            <template #title=\"transferProps\">\n              {{\n                transferProps.type === 'target'\n                  ? $t('pages.player.download.statusAwaitDownload')\n                  : $t('pages.player.download.statusRequireDownload')\n              }}\n            </template>\n          </t-transfer>\n        </t-form-item>\n      </t-form>\n    </template>\n    <template #footer>\n      <t-button theme=\"default\" variant=\"base\" @click=\"handleReset\">{{ $t('common.reset') }}</t-button>\n      <t-button theme=\"primary\" variant=\"base\" @click=\"handleSubmit\">{{ $t('common.confirm') }}</t-button>\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"ts\">\nimport { isArray, isArrayEmpty, isHttp, isNil, isObject, isObjectEmpty } from '@shared/modules/validate';\nimport type { ICmsInfo } from '@shared/types/cms';\nimport { useClipboard } from '@vueuse/core';\nimport type { FormInstanceFunctions, SubmitContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport type { TransferValue } from 'tdesign-vue-next/es/transfer/type.d';\nimport type { PropType } from 'vue';\nimport { computed, onMounted, ref, useTemplateRef, watch } from 'vue';\n\nimport { mediaUtils } from '@/components/multi-player';\nimport { attachMainContent } from '@/config/global';\nimport { t } from '@/locales';\n\nconst props = defineProps({\n  visible: {\n    type: Boolean,\n    default: false,\n  },\n  episode: {\n    type: Object as PropType<ICmsInfo['vod_episode']>,\n    default: () => ({}),\n  },\n  current: {\n    type: String,\n    default: '',\n  },\n});\n\nconst emits = defineEmits(['update:visible']);\n\nconst RULES = {};\n\nconst { isSupported, copy } = useClipboard();\n\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\nconst formVisible = ref(false);\nconst formData = ref<{ episode: TransferValue[] }>({ episode: [] });\nconst formEpisode = ref(props.episode);\nconst formCurrent = ref(props.current);\n\nconst lineKeys = computed(() =>\n  isObject(props.episode) && !isObjectEmpty(props.episode) ? Object.keys(props.episode) : [],\n);\nconst currentEpisode = computed(() => {\n  if (!isObject(formEpisode.value) || isObjectEmpty(formEpisode.value)) return [];\n  const episode = formEpisode.value[active.value.line];\n  if (!isArray(episode) || isArrayEmpty(episode)) return [];\n  return episode.map((item) => ({ value: item.link, label: item.text, disabled: false }));\n});\n\nconst active = ref({\n  line: '',\n});\n\nwatch(\n  () => formVisible.value,\n  (val) => emits('update:visible', val),\n);\nwatch(\n  () => props.visible,\n  (val) => (formVisible.value = val),\n);\nwatch(\n  () => props.episode,\n  (val) => {\n    formEpisode.value = val;\n    setup();\n  },\n);\nwatch(\n  () => props.current,\n  (val) => (formCurrent.value = val),\n);\n\nonMounted(() => setup());\n\nconst setup = () => {\n  if (!isObject(formEpisode.value) || isObjectEmpty(formEpisode.value)) return;\n  const firstKey = Object.keys(formEpisode.value)[0];\n  active.value.line = firstKey;\n};\n\nconst handleCopyCurrentURL = async () => {\n  try {\n    if (!isHttp(formCurrent.value)) return;\n\n    isSupported && copy(formCurrent.value);\n\n    const mediaType = await mediaUtils.checkMediaType(formCurrent.value as string);\n    if (isNil(mediaType)) {\n      MessagePlugin.warning(t('pages.player.download.copyCheck'));\n    } else {\n      MessagePlugin.success(t('common.copySuccess'));\n    }\n  } catch {\n    MessagePlugin.error(t('common.copyFail'));\n  }\n};\n\nconst copyEpisode = async () => {\n  try {\n    const { episode } = formData.value;\n    if (isArrayEmpty(episode) || !isHttp(episode?.[0])) return;\n\n    isSupported && copy(episode.join('\\n'));\n\n    const mediaType = await mediaUtils.checkMediaType(episode[0] as string);\n    if (isNil(mediaType)) {\n      MessagePlugin.warning(t('pages.player.download.copyCheck'));\n    } else {\n      MessagePlugin.success(t('common.copySuccess'));\n    }\n  } catch {\n    MessagePlugin.error(t('common.copyFail'));\n  }\n};\n\nconst handleExecute = async () => {\n  await copyEpisode();\n  formVisible.value = false;\n};\n\nconst onSubmit = (context: SubmitContext<FormData>) => {\n  const { validateResult, firstError } = context;\n  if (validateResult && typeof validateResult === 'boolean') {\n    handleExecute();\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\nconst handleSubmit = () => {\n  formRef.value?.submit();\n};\n\nconst handleReset = () => {\n  formRef.value?.reset();\n};\n</script>\n<style lang=\"less\" scoped>\n.input-horizontal-item {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: var(--td-size-4);\n  width: 100%;\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/player/components/DialogSetting.vue",
    "content": "<template>\n  <t-dialog\n    v-model:visible=\"formVisible\"\n    show-in-attached-element\n    :attach=\"`.${attachMainContent}`\"\n    placement=\"center\"\n    destroy-on-close\n    lazy\n  >\n    <template #header>\n      {{ $t('pages.player.setting.title') }}\n    </template>\n    <template #body>\n      <t-form\n        ref=\"formRef\"\n        :data=\"formData\"\n        :rules=\"RULES\"\n        :label-width=\"120\"\n        required-mark-position=\"right\"\n        label-align=\"left\"\n        reset-type=\"initial\"\n        @submit=\"onSubmit\"\n      >\n        <t-form-item :label=\"$t('pages.player.setting.skipHeadAndEnd')\" name=\"skipHeadAndEnd\">\n          <t-radio-group v-model=\"formData.skipHeadAndEnd\" variant=\"default-filled\">\n            <t-radio-button :value=\"true\">{{ $t('common.on') }}</t-radio-button>\n            <t-radio-button :value=\"false\">{{ $t('common.off') }}</t-radio-button>\n          </t-radio-group>\n        </t-form-item>\n        <t-form-item\n          v-if=\"formData.skipHeadAndEnd\"\n          :label=\"$t('pages.player.setting.skipStart')\"\n          name=\"skipTimeInStart\"\n        >\n          <div class=\"input-horizontal-item\">\n            <t-input-number v-model=\"formData.skipTimeInStart\" theme=\"normal\" :min=\"0\" auto-width>\n              <template #suffix>{{ $t('common.unit.s') }}</template>\n            </t-input-number>\n            <t-button theme=\"default\" @click=\"handleGetTime('start')\">{{ $t('common.gain') }}</t-button>\n          </div>\n        </t-form-item>\n        <t-form-item v-if=\"formData.skipHeadAndEnd\" :label=\"$t('pages.player.setting.skipEnd')\" name=\"skipTimeInEnd\">\n          <div class=\"input-horizontal-item\">\n            <t-input-number v-model=\"formData.skipTimeInEnd\" theme=\"normal\" :min=\"0\" auto-width>\n              <template #suffix>{{ $t('common.unit.s') }}</template>\n            </t-input-number>\n            <t-button theme=\"default\" @click=\"handleGetTime('end')\">{{ $t('common.gain') }}</t-button>\n          </div>\n        </t-form-item>\n        <t-form-item\n          v-if=\"['film'].includes(formType)\"\n          :label=\"$t('pages.player.setting.playNextEnabled')\"\n          name=\"playNextEnabled\"\n        >\n          <t-radio-group v-model=\"formData.playNextEnabled\" variant=\"default-filled\">\n            <t-radio-button :value=\"true\">{{ $t('common.on') }}</t-radio-button>\n            <t-radio-button :value=\"false\">{{ $t('common.off') }}</t-radio-button>\n          </t-radio-group>\n        </t-form-item>\n        <t-form-item\n          v-if=\"['film'].includes(formType)\"\n          :label=\"$t('pages.player.setting.playNextPreload')\"\n          name=\"playNextPreload\"\n        >\n          <t-radio-group v-model=\"formData.playNextPreload\" variant=\"default-filled\">\n            <t-radio-button :value=\"true\">{{ $t('common.on') }}</t-radio-button>\n            <t-radio-button :value=\"false\">{{ $t('common.off') }}</t-radio-button>\n          </t-radio-group>\n        </t-form-item>\n        <t-form-item :label=\"$t('pages.player.setting.skipAd')\" name=\"skipAd\">\n          <t-radio-group v-model=\"formData.skipAd\" variant=\"default-filled\">\n            <t-radio-button :value=\"true\">{{ $t('common.on') }}</t-radio-button>\n            <t-radio-button :value=\"false\">{{ $t('common.off') }}</t-radio-button>\n          </t-radio-group>\n        </t-form-item>\n      </t-form>\n    </template>\n    <template #footer>\n      <t-button theme=\"default\" variant=\"base\" @click=\"handleReset\">{{ $t('common.reset') }}</t-button>\n      <t-button theme=\"primary\" variant=\"base\" @click=\"handleSubmit\">{{ $t('common.confirm') }}</t-button>\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"ts\">\nimport type { FormInstanceFunctions, SubmitContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { ref, useTemplateRef, watch } from 'vue';\n\nimport { attachMainContent } from '@/config/global';\n\nconst props = defineProps({\n  visible: {\n    type: Boolean,\n    default: false,\n  },\n  type: {\n    type: String,\n    default: '',\n  },\n  data: {\n    type: Object,\n    default: () => {},\n  },\n  time: {\n    type: Object,\n    default: () => {},\n  },\n});\n\nconst emits = defineEmits(['update:visible', 'change']);\n\nconst RULES = {\n  skipHeadAndEnd: [{ required: true }],\n  skipTimeInStart: [{ required: true }],\n  skipTimeInEnd: [{ required: true }],\n  playNextEnabled: [{ required: true }],\n  playNextPreload: [{ required: true }],\n  skipAd: [{ required: true }],\n};\n\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\nconst formVisible = ref(false);\nconst formData = ref(props.data);\nconst formTime = ref(props.time);\nconst formType = ref(props.type);\n\nwatch(\n  () => formVisible.value,\n  (val) => emits('update:visible', val),\n);\nwatch(\n  () => props.visible,\n  (val) => (formVisible.value = val),\n);\nwatch(\n  () => props.type,\n  (val) => (formType.value = val),\n);\nwatch(\n  () => props.data,\n  (val) => (formData.value = val),\n);\nwatch(\n  () => props.time,\n  (val) => (formTime.value = val),\n);\n\nconst handleGetTime = (type: 'start' | 'end') => {\n  if (type === 'start') {\n    formData.value.skipTimeInStart = Math.floor(formTime.value.currentTime ?? 0);\n  } else if (type === 'end') {\n    formData.value.skipTimeInEnd = Math.floor((formTime.value.duration ?? 0) - (formTime.value.currentTime ?? 0));\n  }\n};\n\nconst handleExecute = () => {\n  emits('change', { ...formData.value });\n  formVisible.value = false;\n};\n\nconst onSubmit = (context: SubmitContext<FormData>) => {\n  const { validateResult, firstError } = context;\n  if (validateResult && typeof validateResult === 'boolean') {\n    handleExecute();\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\nconst handleSubmit = () => {\n  formRef.value?.submit();\n};\n\nconst handleReset = () => {\n  formRef.value?.reset();\n};\n</script>\n<style lang=\"less\" scoped>\n.input-horizontal-item {\n  display: flex;\n  // justify-content: space-between;\n  align-items: center;\n  gap: var(--td-size-4);\n  width: 100%;\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/player/components/Header.vue",
    "content": "<template>\n  <div :class=\"[`${prefix}-header-container`]\">\n    <div class=\"left system-functions\">\n      <div class=\"back-main system-function no-drag-region\">\n        <t-button theme=\"default\" variant=\"text\" class=\"btn\" @click=\"handleBackMain\">\n          <template #icon><home-icon /></template>\n          {{ $t('pages.player.header.backMain') }}\n        </t-button>\n      </div>\n    </div>\n    <div class=\"spacer system-functions\">\n      <span class=\"txthide txthide1\">{{ formData }}</span>\n    </div>\n    <div class=\"right system-functions\">\n      <system-control class=\"system-function no-drag-region\" />\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { APP_NAME } from '@shared/config/appinfo';\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { HomeIcon } from 'tdesign-icons-vue-next';\nimport { onMounted, ref, watch } from 'vue';\n\nimport logoIcon from '@/assets/icon.png';\nimport SystemControl from '@/components/system-control/index.vue';\nimport { prefix } from '@/config/global';\n\nconst props = defineProps({\n  title: {\n    type: String,\n    default: '',\n  },\n});\n\nconst formData = ref(props.title);\n\nwatch(\n  () => props.title,\n  (val) => (formData.value = val),\n);\nwatch(\n  () => formData.value,\n  () => setSystemMediaMetadata(),\n);\n\nonMounted(() => setup());\n\nconst setup = () => {\n  setSystemMediaMetadata();\n};\n\nconst handleBackMain = () => {\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.WINDOW_MAIN);\n};\n\nconst setSystemMediaMetadata = () => {\n  if ('mediaSession' in navigator) {\n    const doc = {\n      title: formData.value,\n      artist: APP_NAME,\n      artwork: [{ src: logoIcon, sizes: '128x128', type: 'image/png' }],\n    };\n\n    navigator.mediaSession.metadata = new MediaMetadata(doc);\n  }\n};\n</script>\n<style lang=\"less\" scoped>\n.back-main {\n  width: auto;\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/player/index.vue",
    "content": "<template>\n  <div class=\"layout-player\">\n    <t-layout :class=\"[`${prefix}-layout`]\">\n      <t-header class=\"drag-region\" :class=\"[`${prefix}-header`, active.headerPin ? 'pin' : '']\">\n        <l-header :title=\"title\" />\n      </t-header>\n      <t-layout :class=\"[`${prefix}-main`]\">\n        <t-content :class=\"[`${prefix}-content`]\">\n          <div :class=\"[`${prefix}-content-container`]\">\n            <multi-player ref=\"playerRef\" class=\"media-player\" @update-time=\"onTimeUpdate\" />\n            <div class=\"dock-show\" @click=\"toggleAside\">\n              <chevron-left-icon v-if=\"active.aside\" class=\"dock-icon\" />\n              <chevron-right-icon v-else class=\"dock-icon\" />\n            </div>\n          </div>\n        </t-content>\n        <t-aside v-show=\"!active.aside\" :class=\"[`${prefix}-aside`]\">\n          <div :class=\"[`${prefix}-aside-container`]\">\n            <component\n              :is=\"currentAsideComponent\"\n              class=\"container-aside\"\n              :store=\"playerStoreFormData\"\n              :process=\"processFormData\"\n              @barrage=\"updateBarrage\"\n              @create=\"handlePlayerCreate\"\n              @pause=\"handlePlayerPause\"\n              @seek=\"handlePlayerSeek\"\n              @update=\"updateConf\"\n            />\n          </div>\n        </t-aside>\n      </t-layout>\n    </t-layout>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { APP_NAME } from '@shared/config/appinfo';\nimport { SYSTEM_M3U8_AD_REMOVE_API } from '@shared/config/env';\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport type { IBarrageResult } from '@shared/types/barrage';\nimport { merge } from 'es-toolkit';\nimport { ChevronLeftIcon, ChevronRightIcon } from 'tdesign-icons-vue-next';\nimport { computed, defineAsyncComponent, onMounted, onUnmounted, ref, shallowRef, useTemplateRef, watch } from 'vue';\n\nimport type { IMultiPlayerOptions, MultiPlayerInstance } from '@/components/multi-player';\nimport { MultiPlayer } from '@/components/multi-player';\nimport { prefix } from '@/config/global';\nimport type { IStorePlayer } from '@/config/player';\nimport { t } from '@/locales';\nimport { usePlayerStore } from '@/store';\nimport type { IVideoProcess } from '@/types/player';\n\nimport LHeader from './components/Header.vue';\n\nconst storePlayer = usePlayerStore();\n\nconst componentMap = {\n  film: defineAsyncComponent(() => import('./components/AsideFilm.vue')),\n  live: defineAsyncComponent(() => import('./components/AsideLive.vue')),\n  parse: defineAsyncComponent(() => import('./components/AsideParse.vue')),\n};\n\nconst playerRef = useTemplateRef<MultiPlayerInstance | null>('playerRef');\nconst currentAsideComponent = shallowRef(componentMap[storePlayer.type]);\n\nconst playerFormData = ref<IMultiPlayerOptions>({\n  url: '',\n  autoplay: true,\n  next: false,\n  quality: [],\n  isLive: false,\n  headers: {},\n  type: 'auto',\n  startTime: 0,\n  container: 'play-mse',\n});\nconst processFormData = ref<IVideoProcess>({\n  currentTime: 0,\n  duration: 0,\n});\nconst playerStoreFormData = computed<IStorePlayer>(() => storePlayer.$state);\n\nconst active = ref({\n  aside: false,\n  headerPin: false,\n});\n\nconst title = computed(() => {\n  const type = storePlayer.type;\n  const info = storePlayer.data.info;\n\n  return (type === 'film' ? info.vod_name : info.name) || APP_NAME;\n});\n\nwatch(\n  () => storePlayer.setting.skipAd,\n  (val) => {\n    const watchTime = processFormData.value.currentTime;\n    handlePlayerCreate({ ...playerFormData.value, skipAd: val, startTime: watchTime }, 'new');\n  },\n);\n\nonMounted(() => setup());\nonUnmounted(() => dispose());\n\nconst setup = () => {\n  window.electron.ipcRenderer.on(IPC_CHANNEL.WINDOW_DESTROY, () => {\n    storePlayer.updateConfig({ status: false });\n    window.electron.ipcRenderer.send(IPC_CHANNEL.WINDOW_DESTROY_RELAY);\n  });\n\n  document.title = `${APP_NAME}(${t('pages.player.title')})`;\n};\n\nconst dispose = () => {\n  storePlayer.updateConfig({ status: false });\n};\n\nconst toggleAside = () => {\n  active.value.aside = !active.value.aside;\n};\n\nconst handleUrlAdRemove = (url: string, remove: boolean = false): string => {\n  if (remove && url.startsWith('http') && !url.startsWith(SYSTEM_M3U8_AD_REMOVE_API)) {\n    return `${SYSTEM_M3U8_AD_REMOVE_API}?url=${encodeURIComponent(url)}`;\n  }\n  if (!remove && url.startsWith('http') && url.startsWith(SYSTEM_M3U8_AD_REMOVE_API)) {\n    return decodeURIComponent(url.replace(`${SYSTEM_M3U8_AD_REMOVE_API}?url=`, ''));\n  }\n  return url;\n};\n\nconst onTimeUpdate = (time: IVideoProcess) => (processFormData.value = time);\n\nconst updateConf = (item: IStorePlayer) => storePlayer.updateConfig(item);\n\nconst updateBarrage = (item: IBarrageResult) => {\n  setTimeout(() => {\n    playerRef.value?.barrage(item.list, item.id);\n  }, 0);\n};\n\nconst handlePlayerCreate = async (\n  item: IMultiPlayerOptions & { skipAd?: boolean },\n  mode: 'switch' | 'new' = 'switch',\n) => {\n  const player = storePlayer.player;\n\n  if (player.type === 'custom') {\n    window.electron.ipcRenderer.invoke(IPC_CHANNEL.CALL_PLAYER, player.external, item.url);\n  } else {\n    const finalItem: IMultiPlayerOptions = {\n      ...item,\n      url: handleUrlAdRemove(item.url, item.skipAd),\n      quality: (item.quality || []).map((q) => ({ ...q, url: handleUrlAdRemove(q.url, item.skipAd) })),\n    };\n    playerFormData.value = merge(playerFormData.value, finalItem);\n    await playerRef.value?.create(playerFormData.value, player.type, mode);\n  }\n};\n\nconst handlePlayerPause = () => playerRef.value?.pause();\n\nconst handlePlayerSeek = (time: number) => playerRef.value?.seek(time);\n</script>\n<style lang=\"less\" scoped>\n@import '@/style/player.less';\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/setting/components/base/components/DialogBarrage.vue",
    "content": "<template>\n  <t-dialog\n    v-model:visible=\"formVisible\"\n    show-in-attached-element\n    :attach=\"`.${attachContent}`\"\n    placement=\"center\"\n    destroy-on-close\n    lazy\n  >\n    <template #header>\n      {{ $t('pages.setting.barrage.title') }}\n    </template>\n    <template #body>\n      <div class=\"barrage view-container\">\n        <t-form\n          ref=\"formRef\"\n          :data=\"formData.data\"\n          :rules=\"RULES\"\n          :label-width=\"80\"\n          required-mark-position=\"right\"\n          label-align=\"left\"\n          reset-type=\"initial\"\n          @submit=\"onSubmit\"\n        >\n          <div class=\"data-item\">\n            <p class=\"title-label data-title\">{{ $t('pages.setting.barrage.param.base') }}</p>\n            <div class=\"data-main data-base\">\n              <t-form-item name=\"url\">\n                <template #label>\n                  {{ $t('common.api') }}\n                  <t-popup destroy-on-close attach=\".t-form-item__url\" :content=\"$t('pages.setting.barrage.popup.url')\">\n                    <info-circle-icon />\n                  </t-popup>\n                </template>\n                <t-input v-model=\"formData.data.url\" />\n              </t-form-item>\n              <t-form-item name=\"id\">\n                <template #label>\n                  {{ $t('common.id') }}\n                  <t-popup\n                    destroy-on-close\n                    attach=\".t-form-item__id\"\n                    :content=\"$t('pages.setting.barrage.popup.nested')\"\n                  >\n                    <info-circle-icon />\n                  </t-popup>\n                </template>\n                <t-input v-model=\"formData.data.id\" />\n              </t-form-item>\n              <t-form-item name=\"key\">\n                <template #label>\n                  {{ $t('pages.setting.barrage.field.key') }}\n                  <t-popup\n                    destroy-on-close\n                    attach=\".t-form-item__key\"\n                    :content=\"$t('pages.setting.barrage.popup.nested')\"\n                  >\n                    <info-circle-icon />\n                  </t-popup>\n                </template>\n                <t-input v-model=\"formData.data.key\" />\n              </t-form-item>\n              <!-- <t-form-item :label=\"$t('pages.setting.barrage.field.support')\" name=\"support\">\n              <t-tag-input v-model=\"formData.data.support\" clearable @change=\"handleFlagFilter\" />\n            </t-form-item> -->\n            </div>\n          </div>\n          <div class=\"data-item\">\n            <p class=\"title-label data-title\">{{ $t('pages.setting.barrage.param.map') }}</p>\n            <div class=\"data-tips\">\n              <p class=\"data-tip\">{{ $t('pages.setting.barrage.tip.map') }}</p>\n            </div>\n            <div class=\"data-main data-map\">\n              <t-form-item :label=\"$t('pages.setting.barrage.field.type')\" name=\"type\">\n                <t-input-number v-model=\"formData.data.type\" theme=\"column\" :min=\"0\" />\n              </t-form-item>\n              <t-form-item :label=\"$t('pages.setting.barrage.field.text')\" name=\"text\">\n                <t-input-number v-model=\"formData.data.text\" theme=\"column\" :min=\"0\" />\n              </t-form-item>\n              <t-form-item :label=\"$t('pages.setting.barrage.field.time')\" name=\"time\">\n                <t-input-number v-model=\"formData.data.time\" theme=\"column\" :min=\"0\" />\n              </t-form-item>\n              <t-form-item :label=\"$t('pages.setting.barrage.field.color')\" name=\"color\">\n                <t-input-number v-model=\"formData.data.color\" theme=\"column\" :min=\"0\" />\n              </t-form-item>\n            </div>\n          </div>\n        </t-form>\n      </div>\n    </template>\n    <template #footer>\n      <t-button theme=\"default\" variant=\"base\" @click=\"handleReset\">{{ $t('common.reset') }}</t-button>\n      <t-button theme=\"primary\" variant=\"base\" @click=\"handleSubmit\">{{ $t('common.confirm') }}</t-button>\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'SettingBaseDialogBarrage',\n});\n\nconst props = defineProps({\n  visible: {\n    type: Boolean,\n    default: false,\n  },\n  data: {\n    type: Object,\n    default: () => ({\n      data: { url: '', id: '', key: '', support: [], type: '', text: '', time: '', color: '' },\n    }),\n  },\n});\nconst emits = defineEmits(['update:visible', 'submit']);\n\nimport { InfoCircleIcon } from 'tdesign-icons-vue-next';\nimport type { FormInstanceFunctions, SubmitContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { ref, useTemplateRef, watch } from 'vue';\n\nimport { attachContent } from '@/config/global';\n\nconst RULES = {\n  url: [{ required: true }, { url: { protocols: ['http', 'https'], require_protocol: true } }],\n  id: [{ required: true }],\n  key: [{ required: true }],\n  support: [{ required: true }],\n  type: [{ required: true }],\n  text: [{ required: true }],\n  time: [{ required: true }],\n  color: [{ required: true }],\n};\nconst TYPE = 'barrage';\n\nconst formVisible = ref(false);\nconst formData = ref(props.data);\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\n\nwatch(\n  () => formVisible.value,\n  (val) => emits('update:visible', val),\n);\nwatch(\n  () => props.visible,\n  (val) => (formVisible.value = val),\n);\nwatch(\n  () => props.data,\n  (val) => (formData.value = val),\n);\n\n// const handleFlagFilter = (value: string[]) => {\n//   formData.value.data.support = [...new Set(value)];\n// };\n\nconst handleExecute = () => {\n  emits('submit', TYPE, formData.value.data);\n  formVisible.value = false;\n};\n\nconst onSubmit = (context: SubmitContext<FormData>) => {\n  const { validateResult, firstError } = context;\n  if (validateResult && typeof validateResult === 'boolean') {\n    handleExecute();\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\nconst handleSubmit = () => {\n  formRef.value?.submit();\n};\n\nconst handleReset = () => {\n  formRef.value?.reset();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  padding: 0 var(--td-comp-paddingLR-xxs) var(--td-comp-paddingTB-xxs);\n  max-height: 340px;\n  overflow-y: auto;\n\n  .data-item {\n    & + .data-item {\n      margin-top: var(--td-comp-margin-xxl);\n    }\n\n    .data-title {\n      margin-bottom: var(--td-comp-margin-xxs);\n\n      &:not(:first-child) {\n        margin-top: var(--td-comp-margin-xxs);\n      }\n    }\n\n    .data-tips {\n      margin: var(--td-comp-margin-xxs) 0;\n      color: var(--td-text-color-secondary);\n      font: var(--td-font-link-small);\n    }\n\n    .data-main {\n      &.data-map {\n        display: flex;\n        flex-wrap: wrap;\n        gap: var(--td-size-8);\n\n        .t-form__item {\n          margin-bottom: 0;\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/setting/components/base/components/DialogDns.vue",
    "content": "<template>\n  <t-dialog\n    v-model:visible=\"formVisible\"\n    show-in-attached-element\n    :attach=\"`.${attachContent}`\"\n    placement=\"center\"\n    destroy-on-close\n    lazy\n  >\n    <template #header>\n      {{ $t('pages.setting.dns.title') }}\n    </template>\n    <template #body>\n      <div class=\"dns view-container\">\n        <t-form\n          ref=\"formRef\"\n          :data=\"formData\"\n          :rules=\"RULES\"\n          :label-width=\"0\"\n          required-mark-position=\"right\"\n          label-align=\"left\"\n          reset-type=\"initial\"\n          @submit=\"onSubmit\"\n        >\n          <t-form-item :style=\"{ marginBottom: 'var(--td-comp-margin-s)' }\">\n            <t-radio-group v-model=\"select\" variant=\"default-filled\" @change=\"handleChangeSelect\">\n              <t-radio-button v-for=\"item in LIST\" :key=\"item.name\" :value=\"item.value\">{{ item.name }}</t-radio-button>\n            </t-radio-group>\n          </t-form-item>\n          <t-form-item :label=\"$t('common.content')\" name=\"data\">\n            <t-textarea\n              v-model=\"formData.data\"\n              :placeholder=\"$t('common.placeholder.input')\"\n              :autosize=\"{ minRows: 4, maxRows: 4 }\"\n              @change=\"handleMatchTag\"\n            />\n          </t-form-item>\n        </t-form>\n      </div>\n    </template>\n    <template #footer>\n      <t-button theme=\"default\" variant=\"base\" @click=\"handleReset\">{{ $t('common.reset') }}</t-button>\n      <t-button theme=\"primary\" variant=\"base\" @click=\"handleSubmit\">{{ $t('common.confirm') }}</t-button>\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'SettingBaseDialogDns',\n});\n\nconst props = defineProps({\n  visible: {\n    type: Boolean,\n    default: false,\n  },\n  data: {\n    type: Object,\n    default: () => ({ data: '' }),\n  },\n});\nconst emits = defineEmits(['update:visible', 'submit']);\n\nimport { DNS } from '@shared/config/dns';\nimport { cloneDeep } from 'es-toolkit';\nimport type { FormInstanceFunctions, SubmitContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { ref, useTemplateRef, watch } from 'vue';\n\nimport { attachContent } from '@/config/global';\n\nconst LIST = [\n  { name: 'Tencent', value: DNS.TENCENT },\n  { name: 'Ali', value: DNS.ALI },\n  { name: 'Qihoo', value: DNS.QIHOO },\n  { name: 'Cloudflare', value: DNS.CLOUDFLARE },\n  { name: 'OpenDNS', value: DNS.OPENDNS },\n  { name: 'Google', value: DNS.GOOGLE },\n];\nconst TYPE = 'dns';\nconst RULES = {\n  data: [{ url: { protocols: ['http', 'https'], require_protocol: true } }],\n};\n\nconst formVisible = ref<boolean>(false);\nconst formData = ref(cloneDeep(props.data));\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\nconst select = ref<string>('');\n\nwatch(\n  () => formVisible.value,\n  (val) => emits('update:visible', val),\n);\nwatch(\n  () => props.visible,\n  (val) => (formVisible.value = val),\n);\nwatch(\n  () => props.data,\n  (val) => (formData.value = cloneDeep(val)),\n);\nwatch(\n  () => formData.value.data,\n  (val) => handleMatchTag(val),\n);\n\nconst handleMatchTag = (value: string) => {\n  const index = LIST.findIndex((item) => item.value === value);\n\n  if (index === -1) select.value = '';\n  else select.value = LIST[index].value;\n};\n\nconst handleChangeSelect = (item: string) => {\n  formData.value.data = item;\n};\n\nconst handleExecute = () => {\n  emits('submit', TYPE, formData.value.data);\n  formVisible.value = false;\n};\n\nconst onSubmit = (context: SubmitContext<FormData>) => {\n  const { validateResult, firstError } = context;\n  if (validateResult && typeof validateResult === 'boolean') {\n    handleExecute();\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\nconst handleSubmit = () => {\n  formRef.value?.submit();\n};\n\nconst handleReset = () => {\n  formRef.value?.reset();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  padding: 0 var(--td-comp-paddingLR-xxs) var(--td-comp-paddingTB-xxs);\n  max-height: 340px;\n  overflow-y: auto;\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/setting/components/base/components/DialogProxy.vue",
    "content": "<template>\n  <t-dialog\n    v-model:visible=\"formVisible\"\n    show-in-attached-element\n    :attach=\"`.${attachContent}`\"\n    placement=\"center\"\n    destroy-on-close\n    lazy\n  >\n    <template #header>\n      {{ $t('pages.setting.proxy.title') }}\n    </template>\n    <template #body>\n      <div class=\"proxy view-container\">\n        <t-form\n          ref=\"formRef\"\n          :data=\"formData.data\"\n          :rules=\"RULES\"\n          :label-width=\"80\"\n          required-mark-position=\"right\"\n          label-align=\"left\"\n          reset-type=\"initial\"\n          @submit=\"onSubmit\"\n        >\n          <t-form-item :label=\"$t('common.type')\" name=\"type\">\n            <t-radio-group v-model=\"formData.data.type\" variant=\"default-filled\">\n              <t-radio-button :value=\"PROXY_TYPE.SYSTEM\">{{ $t('pages.setting.proxy.typeMap.system') }}</t-radio-button>\n              <t-radio-button :value=\"PROXY_TYPE.CUSTOM\">\n                {{ $t('pages.setting.proxy.typeMap.custom') }}\n              </t-radio-button>\n              <t-radio-button :value=\"PROXY_TYPE.DIRECT\">{{ $t('pages.setting.proxy.typeMap.direct') }}</t-radio-button>\n            </t-radio-group>\n          </t-form-item>\n          <t-form-item v-if=\"formData.data.type === 'custom'\" :label=\"$t('pages.setting.proxy.field.url')\" name=\"url\">\n            <t-input v-model=\"formData.data.url\" :placeholder=\"$t('pages.setting.proxy.placeholder.url')\" />\n          </t-form-item>\n          <t-form-item\n            v-if=\"formData.data.type === 'custom'\"\n            :label=\"$t('pages.setting.proxy.field.bypass')\"\n            name=\"bypass\"\n          >\n            <t-textarea\n              v-model=\"formData.data.bypass\"\n              :placeholder=\"$t('pages.setting.proxy.placeholder.bypass')\"\n              :autosize=\"{ minRows: 4, maxRows: 4 }\"\n            />\n          </t-form-item>\n        </t-form>\n      </div>\n    </template>\n    <template #footer>\n      <t-button theme=\"default\" variant=\"base\" @click=\"handleReset\">{{ $t('common.reset') }}</t-button>\n      <t-button theme=\"primary\" variant=\"base\" @click=\"handleSubmit\">{{ $t('common.confirm') }}</t-button>\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'SettingBaseDialogDns',\n});\n\nconst props = defineProps({\n  visible: {\n    type: Boolean,\n    default: false,\n  },\n  data: {\n    type: Object,\n    default: () => ({ data: { type: 'system', url: '', bypass: '' } }),\n  },\n});\nconst emits = defineEmits(['update:visible', 'submit']);\n\nimport { PROXY_TYPE } from '@shared/config/setting';\nimport type { FormInstanceFunctions, SubmitContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { ref, useTemplateRef, watch } from 'vue';\n\nimport { attachContent } from '@/config/global';\n\nconst RULES = {\n  type: [{ enum: ['system', 'custom', 'direct'], required: true }],\n  url: [{ protocols: ['http', 'https', 'socks5'], require_protocol: true, required: true }],\n};\nconst TYPE = 'proxy';\n\nconst formVisible = ref<boolean>(false);\nconst formData = ref(props.data);\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\n\nwatch(\n  () => formVisible.value,\n  (val) => emits('update:visible', val),\n);\nwatch(\n  () => props.visible,\n  (val) => (formVisible.value = val),\n);\nwatch(\n  () => props.data,\n  (val) => (formData.value = val),\n);\n\nconst handleExecute = () => {\n  emits('submit', TYPE, formData.value.data);\n  formVisible.value = false;\n};\n\nconst onSubmit = (context: SubmitContext<FormData>) => {\n  const { validateResult, firstError } = context;\n  if (validateResult && typeof validateResult === 'boolean') {\n    handleExecute();\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\nconst handleSubmit = () => {\n  formRef.value?.submit();\n};\n\nconst handleReset = () => {\n  formRef.value?.reset();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  padding: 0 var(--td-comp-paddingLR-xxs) var(--td-comp-paddingTB-xxs);\n  max-height: 340px;\n  overflow-y: auto;\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/setting/components/base/components/DialogSniffer.vue",
    "content": "<template>\n  <t-dialog\n    v-model:visible=\"formVisible\"\n    show-in-attached-element\n    :attach=\"`.${attachContent}`\"\n    placement=\"center\"\n    destroy-on-close\n    lazy\n  >\n    <template #header>\n      {{ $t('pages.setting.sniffer.title') }}\n    </template>\n    <template #body>\n      <div class=\"sniffer view-container\">\n        <t-form\n          ref=\"formRef\"\n          :data=\"formData.data\"\n          :rules=\"RULES\"\n          :label-width=\"80\"\n          required-mark-position=\"right\"\n          label-align=\"left\"\n          reset-type=\"initial\"\n          @submit=\"onSubmit\"\n        >\n          <t-form-item :label=\"$t('common.type')\" name=\"type\">\n            <t-radio-group v-model=\"formData.data.type\" variant=\"default-filled\">\n              <t-radio-button :value=\"SNIFFER_TYPE.CDP\">\n                {{ $t('pages.setting.sniffer.typeMap.puppeteer') }}\n              </t-radio-button>\n              <t-radio-button :value=\"SNIFFER_TYPE.CUSTOM\">\n                {{ $t('pages.setting.sniffer.typeMap.thirdParty') }}\n              </t-radio-button>\n            </t-radio-group>\n          </t-form-item>\n          <t-form-item v-if=\"formData.data.type === SNIFFER_TYPE.CUSTOM\" :label=\"$t('common.api')\" name=\"url\">\n            <t-input v-model=\"formData.data.url\" clearable />\n          </t-form-item>\n        </t-form>\n      </div>\n    </template>\n    <template #footer>\n      <t-button theme=\"default\" variant=\"base\" @click=\"handleReset\">{{ $t('common.reset') }}</t-button>\n      <t-button theme=\"primary\" variant=\"base\" @click=\"handleSubmit\">{{ $t('common.confirm') }}</t-button>\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'SettingBaseDialogSniffer',\n});\n\nconst props = defineProps({\n  visible: {\n    type: Boolean,\n    default: false,\n  },\n  data: {\n    type: Object,\n    default: () => ({ data: { type: '', url: '' } }),\n  },\n});\nconst emits = defineEmits(['update:visible', 'submit']);\n\nimport { SNIFFER_TYPE } from '@shared/config/setting';\nimport type { FormInstanceFunctions, SubmitContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { ref, useTemplateRef, watch } from 'vue';\n\nimport { attachContent } from '@/config/global';\n\nconst RULES = {\n  url: [{ required: true }, { url: { protocols: ['http', 'https'], require_protocol: true } }],\n  type: [{ required: true }],\n};\nconst TYPE = 'sniffer';\n\nconst formVisible = ref<boolean>(false);\nconst formData = ref(props.data);\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\n\nwatch(\n  () => formVisible.value,\n  (val) => emits('update:visible', val),\n);\nwatch(\n  () => props.visible,\n  (val) => (formVisible.value = val),\n);\nwatch(\n  () => props.data,\n  (val) => (formData.value = val),\n);\n\nconst handleExecute = () => {\n  if (formData.value.data.type !== SNIFFER_TYPE.CUSTOM) {\n    formData.value.data.url = '';\n  }\n\n  emits('submit', TYPE, formData.value.data);\n  formVisible.value = false;\n};\n\nconst onSubmit = (context: SubmitContext<FormData>) => {\n  const { validateResult, firstError } = context;\n  if (validateResult && typeof validateResult === 'boolean') {\n    handleExecute();\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\nconst handleSubmit = () => {\n  formRef.value?.submit();\n};\n\nconst handleReset = () => {\n  formRef.value?.reset();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  padding: 0 var(--td-comp-paddingLR-xxs) var(--td-comp-paddingTB-xxs);\n  max-height: 340px;\n  overflow-y: auto;\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/setting/components/base/components/DialogUa.vue",
    "content": "<template>\n  <t-dialog\n    v-model:visible=\"formVisible\"\n    show-in-attached-element\n    :attach=\"`.${attachContent}`\"\n    placement=\"center\"\n    destroy-on-close\n    lazy\n  >\n    <template #header>\n      {{ $t('pages.setting.ua.title') }}\n    </template>\n    <template #body>\n      <div class=\"ua view-container\">\n        <t-form\n          ref=\"formRef\"\n          :data=\"formData\"\n          :rules=\"RULES\"\n          :label-width=\"0\"\n          required-mark-position=\"right\"\n          label-align=\"left\"\n          reset-type=\"initial\"\n          @submit=\"onSubmit\"\n        >\n          <t-form-item :style=\"{ marginBottom: 'var(--td-comp-margin-s)' }\">\n            <t-radio-group v-model=\"select\" variant=\"default-filled\" @change=\"handleChangeSelect\">\n              <t-radio-button v-for=\"item in LIST\" :key=\"item.name\" :value=\"item.value\">{{ item.name }}</t-radio-button>\n            </t-radio-group>\n          </t-form-item>\n          <t-form-item :label=\"$t('common.content')\" name=\"data\">\n            <t-textarea\n              v-model=\"formData.data\"\n              :placeholder=\"$t('common.placeholder.input')\"\n              :autosize=\"{ minRows: 4, maxRows: 4 }\"\n              @change=\"handleMatchTag\"\n            />\n          </t-form-item>\n        </t-form>\n      </div>\n    </template>\n    <template #footer>\n      <t-button theme=\"default\" variant=\"base\" @click=\"handleReset\">{{ $t('common.reset') }}</t-button>\n      <t-button theme=\"primary\" variant=\"base\" @click=\"handleSubmit\">{{ $t('common.confirm') }}</t-button>\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'SettingBaseDialogUA',\n});\n\nconst props = defineProps({\n  visible: {\n    type: Boolean,\n    default: false,\n  },\n  data: {\n    type: Object,\n    default: () => ({ data: '' }),\n  },\n});\nconst emits = defineEmits(['update:visible', 'submit']);\n\nimport { USER_AGENT } from '@shared/config/userAgent';\nimport type { FormInstanceFunctions, SubmitContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { ref, useTemplateRef, watch } from 'vue';\n\nimport { attachContent } from '@/config/global';\n\nconst LIST = [\n  { name: 'Chrome', value: USER_AGENT.PC_WIN32_CHROME },\n  { name: 'Safari', value: USER_AGENT.PC_DARWIN_SAFARI },\n  { name: 'Android', value: USER_AGENT.MOBILE_ANDROID_PIXEL },\n  { name: 'IPhone', value: USER_AGENT.MOBILE_IOS_SAFARI },\n  { name: 'Mpv', value: USER_AGENT.MPV },\n  { name: 'OkHttp', value: USER_AGENT.OKHTTP },\n  { name: 'Dart', value: USER_AGENT.DART },\n];\nconst TYPE = 'ua';\nconst RULES = {};\n\nconst formVisible = ref(false);\nconst formData = ref(props.data);\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\nconst select = ref('');\n\nwatch(\n  () => formVisible.value,\n  (val) => emits('update:visible', val),\n);\nwatch(\n  () => props.visible,\n  (val) => (formVisible.value = val),\n);\nwatch(\n  () => props.data,\n  (val) => (formData.value = val),\n);\nwatch(\n  () => formData.value.data,\n  (val) => handleMatchTag(val),\n);\n\nconst handleMatchTag = (value: string) => {\n  const index = LIST.findIndex((item) => item.value === value);\n\n  if (index === -1) select.value = '';\n  else select.value = LIST[index].value;\n};\n\nconst handleChangeSelect = (item: string) => {\n  formData.value.data = item;\n};\n\nconst handleExecute = () => {\n  emits('submit', TYPE, formData.value.data);\n  formVisible.value = false;\n};\n\nconst onSubmit = (context: SubmitContext<FormData>) => {\n  const { validateResult, firstError } = context;\n  if (validateResult && typeof validateResult === 'boolean') {\n    handleExecute();\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\nconst handleSubmit = () => {\n  formRef.value?.submit();\n};\n\nconst handleReset = () => {\n  formRef.value?.reset();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  padding: 0 var(--td-comp-paddingLR-xxs) var(--td-comp-paddingTB-xxs);\n  max-height: 340px;\n  overflow-y: auto;\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/setting/components/base/components/DialogUpdate.vue",
    "content": "<template>\n  <t-dialog\n    v-model:visible=\"formVisible\"\n    show-in-attached-element\n    :attach=\"`.${attachContent}`\"\n    placement=\"center\"\n    destroy-on-close\n    lazy\n    :close-on-esc-keydown=\"false\"\n    :close-on-overlay-click=\"false\"\n    :footer=\"!active.check\"\n  >\n    <template #header>\n      {{ $t('pages.setting.update.title') }}\n    </template>\n    <template #body>\n      <div class=\"update view-container\">\n        <t-loading v-if=\"active.check\" size=\"small\" :text=\"$t('common.checking')\" class=\"loading\" />\n\n        <div v-else class=\"content\">\n          <div v-if=\"info.errText\" class=\"container\">\n            <div class=\"data-item\">\n              <p class=\"title-label title\">{{ $t('pages.setting.update.errorlog') }}</p>\n              <div class=\"release-notes\">{{ info.errText }}</div>\n            </div>\n          </div>\n          <template v-else>\n            <div v-if=\"info.available\" class=\"container\">\n              <div class=\"data-item\">\n                <p class=\"title-label title\">{{ $t('pages.setting.update.latestVersion') }}: {{ info.lastVersion }}</p>\n              </div>\n              <div class=\"data-item\">\n                <p class=\"title-label title\">{{ $t('pages.setting.update.changelog') }}</p>\n                <div class=\"release-notes\">\n                  <render-md :text=\"info.releaseNotes\" />\n                </div>\n              </div>\n            </div>\n            <p v-else>{{ $t('pages.setting.update.noUpdate') }}</p>\n          </template>\n        </div>\n      </div>\n    </template>\n    <template #footer>\n      <t-button v-if=\"info.errText\" theme=\"primary\" variant=\"base\" @click=\"handleReCheck\">\n        {{ $t('common.reCheck') }}\n      </t-button>\n      <template v-else>\n        <template v-if=\"isWindows\">\n          <t-button theme=\"default\" variant=\"base\" :disabled=\"!active.downloaded\" @click=\"handleInstall\">\n            {{ $t('common.install') }}\n          </t-button>\n          <t-button\n            v-if=\"!active.downloaded\"\n            theme=\"primary\"\n            variant=\"base\"\n            :loading=\"active.download\"\n            :disabled=\"active.download\"\n            @click=\"handleDownStart\"\n          >\n            <span v-if=\"active.download\">\n              {{ $t('pages.setting.update.downloadProcess', [info.downProcess]) }}\n            </span>\n            <span v-else>{{ $t('common.download') }}</span>\n          </t-button>\n        </template>\n        <t-button v-else theme=\"primary\" variant=\"base\" @click=\"handleOpenDownLink\">\n          {{ $t('common.download') }}\n        </t-button>\n      </template>\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"ts\">\ndefineOptions({\n  name: 'SettingBaseDialogUpdate',\n});\n\nconst props = defineProps({\n  visible: {\n    type: Boolean,\n    default: false,\n  },\n});\nconst emits = defineEmits(['update:visible']);\n\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { onMounted, onUnmounted, ref, watch } from 'vue';\n\nimport RenderMd from '@/components/render-markdown/index.vue';\nimport { attachContent } from '@/config/global';\nimport { isWindows } from '@/utils/systeminfo';\n\nconst formVisible = ref(false);\n\nconst info = ref({\n  available: false,\n  currentVersion: '',\n  lastVersion: '',\n  releaseNotes: '',\n  errText: '',\n  downProcess: 0,\n});\nconst active = ref({\n  check: true,\n  download: false,\n  downloaded: false,\n});\n\nwatch(\n  () => formVisible.value,\n  (val) => emits('update:visible', val),\n);\nwatch(\n  () => props.visible,\n  (val) => {\n    formVisible.value = val;\n    if (val) handleCheckUpdate();\n  },\n);\n\nonMounted(() => setup());\nonUnmounted(() => dispose());\n\nconst setup = () => {\n  window.electron.ipcRenderer.on(IPC_CHANNEL.UPDATE_ERROR, (_, res) => {\n    active.value.check = false;\n    info.value.errText = res.message;\n  });\n\n  window.electron.ipcRenderer.on(IPC_CHANNEL.UPDATE_DOWNLOAD_PROGRESS, (_event, progress: number) => {\n    info.value.downProcess = Number(progress.toFixed(2));\n\n    active.value.download = progress < 100;\n    active.value.downloaded = progress >= 100;\n  });\n\n  window.electron.ipcRenderer.on(IPC_CHANNEL.UPDATE_DOWNLOADED, () => {\n    active.value.downloaded = true;\n  });\n};\n\nconst dispose = () => {\n  const ipc = window.electron.ipcRenderer;\n  [IPC_CHANNEL.UPDATE_DOWNLOAD_PROGRESS, IPC_CHANNEL.UPDATE_DOWNLOADED, IPC_CHANNEL.UPDATE_ERROR].forEach((event) =>\n    ipc.removeAllListeners(event),\n  );\n};\n\nconst handleReCheck = () => {\n  info.value.errText = '';\n  active.value.check = true;\n  handleCheckUpdate();\n};\n\nconst handleInstall = () => {\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.UPDATE_INSTALL);\n};\n\nconst handleOpenDownLink = () => {\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.OPEN_WEBSITE, 'https://github.com/Hiram-Wong/zyfun/releases/latest');\n};\n\nconst handleDownStart = () => {\n  active.value.download = true;\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.UPDATE_DOWNLOAD, true);\n};\n\nconst handleCheckUpdate = async () => {\n  try {\n    const resp = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.UPDATE_CHECK);\n    const { isValid, currentVersion, lastVersion, releaseNote } = resp || {};\n\n    info.value.available = isValid;\n    info.value.currentVersion = currentVersion;\n    info.value.lastVersion = lastVersion;\n    info.value.releaseNotes = releaseNote;\n  } finally {\n    active.value.check = false;\n  }\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  .loading {\n    min-height: 30px;\n  }\n\n  .release-notes {\n    max-height: 306px;\n    overflow-y: auto;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/setting/components/base/index.vue",
    "content": "<template>\n  <div class=\"setting-base view-component-container\">\n    <t-form :data=\"formData\" label-align=\"left\">\n      <t-form-item :label=\"$t('common.theme.title')\" name=\"theme\">\n        <t-radio-group v-model=\"formData.theme\" class=\"theme\">\n          <div v-for=\"item in THEME_OPTIONS\" :key=\"item.value\" class=\"theme-item\">\n            <t-radio-button :key=\"item.value\" :value=\"item.value\" class=\"theme-btn\">\n              <component :is=\"item.icon\" class=\"theme-icon\" />\n            </t-radio-button>\n            <p class=\"theme-text\">{{ item.label }}</p>\n          </div>\n        </t-radio-group>\n      </t-form-item>\n      <t-form-item :label=\"$t('common.lang')\" name=\"lang\">\n        <t-select v-model=\"formData.lang\" :options=\"LANG_OPTIONS\" :style=\"{ width: '296px' }\" />\n      </t-form-item>\n      <t-form-item :label=\"$t('pages.setting.base.bossKey')\" name=\"bossKey\">\n        <t-space align=\"center\">\n          <input-shortcut\n            v-model=\"formData.bossKey\"\n            :placeholder=\"$t('common.placeholder.inputSet')\"\n            :style=\"{ width: '296px' }\"\n          />\n          <span class=\"title\" @click=\"handleResetConf('bossKey')\">{{ $t('common.reset') }}</span>\n        </t-space>\n      </t-form-item>\n      <t-form-item :label=\"$t('pages.setting.base.timeout')\" name=\"timeout\">\n        <t-space align=\"center\">\n          <t-input-number\n            v-model=\"formData.timeout\"\n            theme=\"column\"\n            :min=\"5000\"\n            :max=\"1000 * 60\"\n            :style=\"{ width: '296px' }\"\n            @blur=\"onTimeoutBlur\"\n          />\n          <span class=\"title\" @click=\"handleResetConf('timeout')\">{{ $t('common.reset') }}</span>\n        </t-space>\n      </t-form-item>\n      <t-form-item :label=\"$t('pages.setting.base.zoom.title')\" name=\"zoom\">\n        <t-space align=\"center\">\n          <!-- single-binding values are modified by the change-end event -->\n          <t-slider\n            :model-value=\"formData.zoom\"\n            :show-tooltip=\"true\"\n            :max=\"1.8\"\n            :min=\"0.8\"\n            :step=\"0.2\"\n            :marks=\"{\n              0.8: t('pages.setting.base.zoom.levelMap.small'),\n              1: t('pages.setting.base.zoom.levelMap.standard'),\n              1.2: '',\n              1.4: '',\n              1.6: '',\n              1.8: t('pages.setting.base.zoom.levelMap.large'),\n            }\"\n            :style=\"{ width: '296px' }\"\n            @change-end=\"onZoomBlur\"\n          />\n          <span class=\"title\" @click=\"handleResetConf('zoom')\">{{ $t('common.reset') }}</span>\n        </t-space>\n      </t-form-item>\n      <t-form-item :label=\"$t('pages.setting.base.hot')\" name=\"hot\">\n        <t-select v-model=\"formData.hot\" :options=\"HOT_OPTIONS\" :style=\"{ width: '296px' }\" />\n      </t-form-item>\n      <t-form-item :label=\"$t('pages.film.title')\" name=\"site\">\n        <t-space align=\"center\">\n          <t-select v-model=\"formData.site.searchMode\" :label=\"$t('common.search')\" :style=\"{ width: '140px' }\">\n            <t-option value=\"site\" :label=\"$t('pages.setting.base.site.searchMap.local')\"></t-option>\n            <t-option value=\"group\" :label=\"$t('pages.setting.base.site.searchMap.group')\"></t-option>\n            <t-option value=\"all\" :label=\"$t('pages.setting.base.site.searchMap.all')\"></t-option>\n          </t-select>\n          <t-select v-model=\"formData.site.filterMode\" :label=\"$t('common.filter')\" :style=\"{ width: '140px' }\">\n            <t-option :value=\"true\" :label=\"$t('common.enable')\"></t-option>\n            <t-option :value=\"false\" :label=\"$t('common.disable')\"></t-option>\n          </t-select>\n        </t-space>\n      </t-form-item>\n      <t-form-item :label=\"$t('pages.live.title')\" name=\"live\">\n        <t-space direction=\"vertical\">\n          <t-space align=\"center\">\n            <t-radio v-model=\"formData.live.ipMark\" allow-uncheck>\n              {{ $t('pages.setting.base.live.ipMark') }}\n            </t-radio>\n            <t-radio v-model=\"formData.live.delay\" allow-uncheck>\n              {{ $t('pages.setting.base.live.delay') }}\n            </t-radio>\n            <t-radio v-model=\"formData.live.thumbnail\" allow-uncheck>\n              {{ $t('pages.setting.base.live.thumbnail') }}\n              <t-popup\n                destroy-on-close\n                attach=\".t-form-item__live\"\n                :content=\"$t('pages.setting.base.live.popup.thumbnail')\"\n              >\n                <info-circle-icon :style=\"{ marginBottom: 'var(--td-comp-margin-xs)' }\" />\n              </t-popup>\n            </t-radio>\n          </t-space>\n          <t-space align=\"center\">\n            <t-input\n              v-model=\"formData.live.epg\"\n              clearable\n              :label=\"$t('pages.live.field.epg')\"\n              :style=\"{ width: '296px' }\"\n            />\n            <span class=\"title\" @click=\"handleDialog('liveEpg')\">{{ $t('common.explain') }}</span>\n            <span class=\"title\" @click=\"handleResetConf('live.epg')\">{{ $t('common.reset') }}</span>\n          </t-space>\n          <t-space align=\"center\">\n            <t-input\n              v-model=\"formData.live.logo\"\n              clearable\n              :label=\"$t('pages.live.field.logo')\"\n              :style=\"{ width: '296px' }\"\n            />\n            <span class=\"title\" @click=\"handleDialog('liveLogo')\">{{ $t('common.explain') }}</span>\n            <span class=\"title\" @click=\"handleResetConf('live.logo')\">{{ $t('common.reset') }}</span>\n          </t-space>\n        </t-space>\n\n        <dialog-document\n          v-model:visible=\"isVisible.liveEpg\"\n          :attach=\"`.${attachContent}`\"\n          :title=\"$t('pages.md.liveEpg.title')\"\n          :content=\"$t('pages.md.liveEpg.content')\"\n        />\n        <dialog-document\n          v-model:visible=\"isVisible.liveLogo\"\n          :attach=\"`.${attachContent}`\"\n          :title=\"$t('pages.md.liveLogo.title')\"\n          :content=\"$t('pages.md.liveLogo.content')\"\n        />\n      </t-form-item>\n      <t-form-item :label=\"$t('aigc.subheading')\" name=\"ai\">\n        <t-space direction=\"vertical\">\n          <t-select\n            v-model=\"formData.aigc.type\"\n            :options=\"AIGC_PROVIDER_OPTIONS\"\n            :label=\"$t('common.provider')\"\n            disabled\n            :style=\"{ width: '296px' }\"\n          />\n          <t-input v-model=\"formData.aigc.server\" clearable :label=\"$t('common.api')\" :style=\"{ width: '296px' }\" />\n          <t-input\n            v-model=\"formData.aigc.key\"\n            type=\"password\"\n            clearable\n            :label=\"$t('aigc.field.key')\"\n            :style=\"{ width: '296px' }\"\n          />\n          <t-input\n            v-model=\"formData.aigc.model\"\n            clearable\n            :label=\"$t('aigc.field.model')\"\n            :style=\"{ width: '296px' }\"\n          />\n        </t-space>\n      </t-form-item>\n      <t-form-item :label=\"$t('pages.setting.base.player.title')\" name=\"player\">\n        <t-space direction=\"vertical\">\n          <t-space align=\"center\">\n            <t-select v-model=\"formData.player.type\" :options=\"PLAYER_OPTIONS\" :style=\"{ width: '296px' }\" />\n            <span class=\"title\" @click=\"handleDialogForm('sniffer')\">\n              {{ $t('pages.setting.base.player.sniffer') }}\n            </span>\n            <span class=\"title\" @click=\"handleDialogForm('barrage')\">\n              {{ $t('pages.setting.base.player.barrage') }}\n            </span>\n          </t-space>\n          <t-space v-if=\"formData.player.type === PLAYER_TYPE.CUSTOM\" align=\"center\">\n            <t-input\n              v-model=\"formData.player.external\"\n              :label=\"$t('pages.setting.base.player.command')\"\n              :style=\"{ width: '296px' }\"\n            />\n            <span class=\"title\" @click=\"handleDialog('customPlayer')\">{{ $t('common.explain') }}</span>\n          </t-space>\n        </t-space>\n\n        <dialog-barrage-view v-model:visible=\"isVisible.barrage\" :data=\"dialogFormData\" @submit=\"onDialogSubmit\" />\n        <dialog-sniffer-view v-model:visible=\"isVisible.sniffer\" :data=\"dialogFormData\" @submit=\"onDialogSubmit\" />\n        <dialog-document\n          v-model:visible=\"isVisible.customPlayer\"\n          :attach=\"`.${attachContent}`\"\n          :title=\"$t('pages.md.customPlayer.title')\"\n          :content=\"$t('pages.md.customPlayer.content')\"\n        />\n      </t-form-item>\n      <t-form-item :label=\"$t('pages.setting.base.security.title')\" name=\"security\">\n        <t-space align=\"center\">\n          <span class=\"title\" @click=\"handleDialogForm('proxy')\">{{ $t('pages.setting.base.security.proxy') }}</span>\n          <span class=\"title\" @click=\"handleDialogForm('ua')\">{{ $t('pages.setting.base.security.ua') }}</span>\n          <span class=\"title\" @click=\"handleDialogForm('dns')\">{{ $t('pages.setting.base.security.dns') }}</span>\n        </t-space>\n\n        <dialog-ua-view v-model:visible=\"isVisible.ua\" :data=\"dialogFormData\" @submit=\"onDialogSubmit\" />\n        <dialog-proxy-view v-model:visible=\"isVisible.proxy\" :data=\"dialogFormData\" @submit=\"onDialogSubmit\" />\n        <dialog-dns-view v-model:visible=\"isVisible.dns\" :data=\"dialogFormData\" @submit=\"onDialogSubmit\" />\n      </t-form-item>\n      <t-form-item :label=\"$t('pages.setting.base.permission.title')\" name=\"permission\">\n        <t-space align=\"center\">\n          <t-radio v-model=\"formData.autoLaunch\" allow-uncheck @change=\"handleAutoLaunch\">\n            {{ $t('pages.setting.base.permission.autoLaunch') }}\n          </t-radio>\n          <t-radio v-model=\"formData.hardwareAcceleration\" allow-uncheck @change=\"handleHardwareAcceleration\">\n            {{ $t('pages.setting.base.permission.hardwareAcceleration') }}\n          </t-radio>\n          <t-radio v-model=\"formData.debug\" allow-uncheck @change=\"handleDebug\">\n            {{ $t('pages.setting.base.permission.debug') }}\n          </t-radio>\n        </t-space>\n      </t-form-item>\n      <t-form-item :label=\"$t('pages.setting.base.other.title')\" name=\"other\">\n        <t-space align=\"center\">\n          <span class=\"title\" @click=\"handleFactoryReset\">{{ $t('pages.setting.base.other.factoryReset') }}</span>\n          <span class=\"title\" @click=\"handleDialog('update')\">{{ $t('pages.setting.base.other.checkUpdate') }}</span>\n          <span class=\"title\" @click=\"handleDialog('disclaimer')\">{{ $t('pages.setting.base.other.disclaimer') }}</span>\n        </t-space>\n\n        <dialog-update-view v-model:visible=\"isVisible.update\" />\n        <dialog-disclaimer-view v-model:visible=\"isVisible.disclaimer\" />\n      </t-form-item>\n    </t-form>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { AIGC_PROVIDER_TYPE, PLAYER_TYPE, REC_HOT_TYPE } from '@shared/config/setting';\nimport type { ISetting } from '@shared/config/tblSetting';\nimport { settingObj as tblSetting } from '@shared/config/tblSetting';\nimport { THEME } from '@shared/config/theme';\nimport { isObject, isObjectEmpty, isPositiveFiniteNumber } from '@shared/modules/validate';\nimport { cloneDeep, isEqual, pickBy } from 'es-toolkit';\nimport { InfoCircleIcon } from 'tdesign-icons-vue-next';\nimport { DialogPlugin, MessagePlugin } from 'tdesign-vue-next';\nimport { computed, defineAsyncComponent, onActivated, onMounted, ref, watch } from 'vue';\n\nimport { dataDbClear } from '@/api/data';\nimport { fetchSettingList, sourceSetting } from '@/api/setting';\nimport ThemeAutoIcon from '@/assets/theme/auto.svg';\nimport ThemeDarkIcon from '@/assets/theme/dark.svg';\nimport ThemeLightIcon from '@/assets/theme/light.svg';\nimport DialogDocument from '@/components/dialog-document/index.vue';\nimport InputShortcut from '@/components/input-shortcut/index.vue';\nimport { emitterChannel, emitterSource } from '@/config/emitterChannel';\nimport { attachContent } from '@/config/global';\nimport { langList, t } from '@/locales';\nimport { usePlayerStore, useSettingStore } from '@/store';\nimport emitter from '@/utils/emitter';\n\nconst createAsyncComponentRefs = (components: string[]): Record<string, any> => {\n  const refs: Record<string, any> = {};\n  components.forEach((componentName) => {\n    const refName = `Dialog${componentName}View`;\n    refs[refName] = defineAsyncComponent(() => import(`./components/Dialog${componentName}.vue`));\n  });\n  return refs;\n};\n\nconst componentNames = ['Ua', 'Proxy', 'Dns', 'Update', 'Sniffer', 'Barrage'];\n\nconst { DialogUaView, DialogProxyView, DialogDnsView, DialogUpdateView, DialogSnifferView, DialogBarrageView } =\n  createAsyncComponentRefs(componentNames);\nconst DialogDisclaimerView = defineAsyncComponent(() => import('@/pages/Disclaimer.vue'));\n\nconst storePlayer = usePlayerStore();\nconst storeSetting = useSettingStore();\n\nconst isVisible = ref({\n  liveEpg: false,\n  liveLogo: false,\n  customPlayer: false,\n  sniffer: false,\n  barrage: false,\n  ua: false,\n  proxy: false,\n  dns: false,\n  update: false,\n  disclaimer: false,\n});\nconst dialogFormData = ref({ data: {} });\n\nconst formData = ref<ISetting>(tblSetting);\n\nconst THEME_OPTIONS = computed(() => [\n  { value: THEME.SYSTEM, label: t('common.followSystem'), icon: ThemeAutoIcon },\n  { value: THEME.LIGHT, label: t('common.theme.light'), icon: ThemeLightIcon },\n  { value: THEME.DARK, label: t('common.theme.dark'), icon: ThemeDarkIcon },\n]);\n\nconst LANG_OPTIONS = computed(() => [\n  { value: 'system', label: t('common.followSystem') },\n  ...langList.value.map((lang) => ({ value: lang.value, label: lang.label })),\n]);\n\nconst HOT_OPTIONS = computed(() => [\n  { value: REC_HOT_TYPE.BAIDU, label: t('pages.setting.base.site.hotMap.baidu') },\n  { value: REC_HOT_TYPE.DOUBAN, label: t('pages.setting.base.site.hotMap.douban') },\n  { value: REC_HOT_TYPE.ENLIGHTENT, label: t('pages.setting.base.site.hotMap.enlightent') },\n  { value: REC_HOT_TYPE.KOMECT, label: t('pages.setting.base.site.hotMap.komect') },\n  { value: REC_HOT_TYPE.KYLIVE, label: t('pages.setting.base.site.hotMap.kylive') },\n  { value: REC_HOT_TYPE.QUARK, label: t('pages.setting.base.site.hotMap.quark') },\n]);\n\nconst PLAYER_OPTIONS = computed(() => [\n  { value: PLAYER_TYPE.XGPLAYER, label: t('media.playerMap.xgplayer') },\n  // { value: PLAYER_TYPE.DPLAYER, label: t('media.playerMap.dplayer') },\n  { value: PLAYER_TYPE.ARTPLAYER, label: t('media.playerMap.artplayer') },\n  // { value: PLAYER_TYPE.NPLAYER, label: t('media.playerMap.nplayer') },\n  // { value: PLAYER_TYPE.OPLAYER, label: t('media.playerMap.oplayer') },\n  { value: PLAYER_TYPE.CUSTOM, label: t('media.playerMap.customplayer') },\n]);\n\nconst AIGC_PROVIDER_OPTIONS = computed(() => [\n  // { value: AIGC_PROVIDER_TYPE.AMZON, label: t('aigc.field.providerMap.amazon') },\n  { value: AIGC_PROVIDER_TYPE.ANTHROPIC, label: t('aigc.field.providerMap.anthropic') },\n  { value: AIGC_PROVIDER_TYPE.AZURE, label: t('aigc.field.providerMap.azure') },\n  { value: AIGC_PROVIDER_TYPE.GEMINI, label: t('aigc.field.providerMap.gemini') },\n  { value: AIGC_PROVIDER_TYPE.OPENAI, label: t('aigc.field.providerMap.openai') },\n]);\n\nwatch(\n  () => ({\n    theme: storeSetting.theme,\n    lang: storeSetting.lang,\n  }),\n  (newVal, oldVal) => {\n    const patch = pickBy(newVal, (value, key) => !isEqual(value, oldVal[key]));\n    for (const key in patch) {\n      if (formData.value[key] !== patch[key]) formData.value[key] = patch[key];\n    }\n  },\n);\n\nwatch(\n  () => formData.value,\n  (val) => sourceSettingConf(val),\n  { deep: true },\n);\n\nwatch(\n  () => ({\n    theme: formData.value.theme,\n    lang: formData.value.lang,\n    timeout: formData.value.timeout,\n    debug: formData.value.debug,\n    bossKey: formData.value.bossKey,\n    zoom: formData.value.zoom,\n  }),\n  (newVal, oldVal) => {\n    const patch = pickBy(\n      { ...newVal, timeout: Math.max(newVal.timeout, 5000) },\n      (value, key) => !isEqual(value, oldVal[key]),\n    );\n    if (!isObjectEmpty(patch)) storeSetting.updateConfig(patch);\n  },\n);\n\nwatch(\n  () => ({\n    player: formData.value.player,\n    barrage: formData.value.barrage,\n  }),\n  (newVal, oldVal) => {\n    const patch = pickBy(newVal, (value, key) => !isEqual(value, oldVal[key]));\n    if (!isObjectEmpty(patch)) storePlayer.updateConfig(patch);\n  },\n  { deep: true },\n);\n\nwatch(\n  () => [formData.value.hot, formData.value.site],\n  () => emitter.emit(emitterChannel.REFRESH_SEARCH_CONFIG, { source: emitterSource.SETTING_BASE }),\n  { deep: true },\n);\n\nwatch(\n  () => formData.value.aigc,\n  () => emitter.emit(emitterChannel.REFRESH_AIGC_CONFIG, { source: emitterSource.SETTING_BASE }),\n  { deep: true },\n);\n\nwatch(\n  () => formData.value.live,\n  () => emitter.emit(emitterChannel.REFRESH_LIVE_CONFIG, { source: emitterSource.SETTING_BASE }),\n  { deep: true },\n);\n\nonMounted(() => setup());\n\nonActivated(() => {\n  emitter.off(emitterChannel.REFRESH_SETTING_CONFIG, reloadConfig);\n  emitter.on(emitterChannel.REFRESH_SETTING_CONFIG, reloadConfig);\n});\n\nconst setup = () => {\n  getSetting();\n  onIpcListener();\n};\n\nconst reloadConfig = async ({ data: eventData }) => {\n  const { source } = eventData;\n  if (source === emitterSource.SETTING_BASE) return;\n\n  await getSetting();\n};\n\nconst getSetting = async () => {\n  try {\n    const resp = await fetchSettingList();\n\n    if (isObject(resp) && !isObjectEmpty(resp)) {\n      formData.value = resp as ISetting;\n    }\n  } catch (error) {\n    console.error(`Failed to get setting conf:`, error);\n    MessagePlugin.error(`${t('common.error')}:${(error as Error).message}`);\n  }\n};\n\nconst sourceSettingConf = async (val: ISetting) => {\n  await sourceSetting(val);\n};\n\nconst onTimeoutBlur = (val: number) => {\n  const timeout = isPositiveFiniteNumber(val) ? (val < 5000 || val > 60000 ? 5000 : val) : 5000;\n  formData.value.timeout = timeout;\n};\n\nconst onZoomBlur = (val: number) => {\n  const zoom = isPositiveFiniteNumber(val) ? (val < 0.8 || val > 1.8 ? 1 : Number(val.toFixed(1))) : 1;\n  formData.value.zoom = zoom;\n};\n\nconst handleReboot = () => {\n  MessagePlugin.warning(t('pages.setting.message.willReboot'));\n  setTimeout(() => window.electron.ipcRenderer.invoke(IPC_CHANNEL.APP_REBOOT), 3000);\n};\n\nconst handleAutoLaunch = () => {\n  const isLaunchOnBoot = formData.value.autoLaunch;\n  window.electron.ipcRenderer.invoke(IPC_CHANNEL.APP_AUTO_LAUNCH, isLaunchOnBoot);\n};\n\nconst handleHardwareAcceleration = () => {\n  MessagePlugin.warning(t('pages.setting.message.effectReboot'));\n};\n\nconst handleDebug = () => {\n  MessagePlugin.warning(t('pages.setting.message.partialReboot'));\n};\n\nconst handleFactoryReset = () => {\n  const dialog = DialogPlugin({\n    header: t('pages.setting.factoryReset.title'),\n    body: t('pages.setting.factoryReset.content'),\n    width: '320px',\n    confirmBtn: t('common.confirm'),\n    cancelBtn: t('common.cancel'),\n    placement: 'center',\n    closeBtn: '',\n    onConfirm: async () => {\n      await dataDbClear({ type: ['site', 'live', 'analyze', 'history', 'star', 'setting', 'plugin', 'cache'] });\n      dialog.hide();\n      handleReboot();\n    },\n    onClose: () => dialog.hide(),\n  });\n};\n\nconst handleResetConf = (type: string) => {\n  const defaultMap = {\n    bossKey: 'Shift + Alt + Z',\n    'live.epg': 'https://epg.112114.eu.org/?ch={name}&date={date}',\n    'live.logo': 'https://epg.112114.eu.org/logo/{name}.png',\n    timeout: 10000,\n    zoom: 1,\n  };\n\n  if (Object.hasOwn(defaultMap, type)) {\n    const keys = type.split('.');\n    const last = keys.pop()!;\n\n    let target: any = formData.value;\n    for (const k of keys) {\n      if (target[k] == null || typeof target[k] !== 'object') target[k] = {};\n      target = target[k];\n    }\n\n    target[last] = defaultMap[type as keyof typeof defaultMap];\n  }\n};\n\nconst handleDialogForm = (type: string) => {\n  const doc = { data: formData.value[type] };\n  dialogFormData.value = cloneDeep(doc);\n  isVisible.value[type] = true;\n};\n\nconst handleDialog = (type: string) => {\n  isVisible.value[type] = true;\n};\n\nconst onDialogSubmit = (type: string, doc: any) => {\n  formData.value[type] = doc;\n\n  switch (type) {\n    case 'dns': {\n      window.electron.ipcRenderer.invoke(IPC_CHANNEL.APP_DNS, doc);\n      break;\n    }\n    case 'proxy': {\n      const { type, url, bypass } = doc;\n      window.electron.ipcRenderer.invoke(\n        IPC_CHANNEL.APP_PROXY,\n        type,\n        ...(type === 'custom' && url ? [url, bypass] : []),\n      );\n      // window.electron.ipcRenderer.invoke(IPC_CHANNEL.APP_PROXY_SYSTEM);\n      break;\n    }\n  }\n};\n\nconst onIpcListener = () => {\n  window.electron.ipcRenderer.on(IPC_CHANNEL.ZOOM_UPDATED, (_, zoom: number) => {\n    formData.value.zoom = zoom;\n  });\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  padding: 0 0 var(--td-comp-paddingTB-s) var(--td-comp-paddingLR-xl);\n  overflow-y: auto;\n\n  .t-radio-group.t-size-m .t-radio-button {\n    height: auto;\n  }\n\n  .title {\n    color: var(--td-brand-color);\n    cursor: pointer;\n    font-weight: 500;\n  }\n\n  .theme {\n    display: flex;\n    flex-direction: row;\n    gap: var(--td-size-8);\n\n    .theme-item {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n\n      .theme-btn {\n        display: inline-flex;\n        max-height: 78px;\n        padding: 0;\n        border-radius: var(--td-radius-s);\n        border: 2px solid transparent;\n\n        > :deep(.t-radio-button__label) {\n          display: inline-flex;\n        }\n      }\n\n      .t-is-checked {\n        border: 2px solid var(--td-brand-color);\n      }\n\n      .theme-text {\n        margin-top: var(--td-comp-margin-s);\n        text-align: center;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/setting/components/data/index.vue",
    "content": "<template>\n  <div class=\"setting-data view-component-container\">\n    <div class=\"content\">\n      <t-collapse default-expand-all>\n        <t-collapse-panel value=\"simple-import\" :header=\"$t('pages.setting.data.easyConfig.title')\">\n          <div class=\"form\">\n            <t-radio-group v-model=\"importSimpleFormData.type\">\n              <t-radio :value=\"DATA_SIMPLE_TYPE.TVBOX\">\n                {{ $t('pages.setting.data.easyConfig.field.typeMap.tvbox') }}\n              </t-radio>\n              <t-radio :value=\"DATA_SIMPLE_TYPE.CATVOD\">\n                {{ $t('pages.setting.data.easyConfig.field.typeMap.catvod') }}\n              </t-radio>\n              <t-radio :value=\"DATA_SIMPLE_TYPE.DRPY\">\n                {{ $t('pages.setting.data.easyConfig.field.typeMap.drpy') }}\n              </t-radio>\n            </t-radio-group>\n            <t-select\n              v-model=\"importSimpleFormData.url\"\n              :label=\"$t('pages.setting.data.config.field.url')\"\n              creatable\n              filterable\n              @create=\"createHistoryOptions(DATA_IMPORT_TYPE.SIMPLE, $event as string)\"\n            >\n              <t-option\n                v-for=\"item in importSimpleHistoryList\"\n                :key=\"item.value\"\n                :value=\"item.value\"\n                :label=\"item.label\"\n                @click=\"handleHistoryFillFormData(DATA_IMPORT_TYPE.SIMPLE, item.type, item.value)\"\n              />\n            </t-select>\n            <div class=\"action\">\n              <t-popconfirm\n                :content=\"$t('pages.setting.data.config.popup.additional')\"\n                placement=\"bottom\"\n                @confirm=\"importData(DATA_IMPORT_TYPE.SIMPLE, DATA_PUT_TYPE.ADDITIONAL)\"\n              >\n                <t-button theme=\"default\" variant=\"base\" block>\n                  {{ $t('pages.setting.data.additional') }}\n                </t-button>\n              </t-popconfirm>\n              <t-popconfirm\n                :content=\"$t('pages.setting.data.config.popup.override')\"\n                placement=\"bottom\"\n                @confirm=\"importData(DATA_IMPORT_TYPE.SIMPLE, DATA_PUT_TYPE.OVERWRITE)\"\n              >\n                <t-button theme=\"primary\" variant=\"base\" block>\n                  {{ $t('pages.setting.data.override') }}\n                </t-button>\n              </t-popconfirm>\n            </div>\n          </div>\n        </t-collapse-panel>\n      </t-collapse>\n\n      <t-collapse>\n        <t-collapse-panel value=\"complete-import\" :header=\"$t('pages.setting.data.configImport.title')\">\n          <div class=\"form\">\n            <t-radio-group v-model=\"importCompleteFormData.type\">\n              <t-radio :value=\"DATA_COMPLETE_TYPE.REMOTE\">\n                {{ $t('pages.setting.data.configImport.field.typeMap.remote') }}\n              </t-radio>\n              <t-radio :value=\"DATA_COMPLETE_TYPE.LOCAL\">\n                {{ $t('pages.setting.data.configImport.field.typeMap.local') }}\n              </t-radio>\n            </t-radio-group>\n            <div class=\"form-item-group\">\n              <t-select\n                v-model=\"importCompleteFormData.url\"\n                :label=\"$t('pages.setting.data.config.field.url')\"\n                creatable\n                filterable\n                @create=\"createHistoryOptions(DATA_IMPORT_TYPE.COMPLETE, $event as string)\"\n              >\n                <t-option\n                  v-for=\"item in importCompleteHistoryList\"\n                  :key=\"item.value\"\n                  :value=\"item.value\"\n                  :label=\"item.label\"\n                  @click=\"handleHistoryFillFormData(DATA_IMPORT_TYPE.COMPLETE, item.type, item.value)\"\n                />\n              </t-select>\n              <t-button\n                v-if=\"importCompleteFormData.type === DATA_COMPLETE_TYPE.LOCAL\"\n                theme=\"default\"\n                @click=\"uploadFileEvent\"\n              >\n                {{ $t('common.upload') }}\n              </t-button>\n            </div>\n            <div class=\"action\">\n              <t-popconfirm\n                :content=\"$t('pages.setting.data.config.popup.additional')\"\n                placement=\"bottom\"\n                @confirm=\"importData(DATA_IMPORT_TYPE.COMPLETE, DATA_PUT_TYPE.ADDITIONAL)\"\n              >\n                <t-button theme=\"default\" variant=\"base\" block>\n                  {{ $t('pages.setting.data.additional') }}\n                </t-button>\n              </t-popconfirm>\n              <t-popconfirm\n                :content=\"$t('pages.setting.data.config.popup.override')\"\n                placement=\"bottom\"\n                @confirm=\"importData(DATA_IMPORT_TYPE.COMPLETE, DATA_PUT_TYPE.OVERWRITE)\"\n              >\n                <t-button theme=\"primary\" variant=\"base\" block>\n                  {{ $t('pages.setting.data.override') }}\n                </t-button>\n              </t-popconfirm>\n            </div>\n          </div>\n        </t-collapse-panel>\n      </t-collapse>\n\n      <t-collapse default-expand-all>\n        <t-collapse-panel value=\"export\" :header=\"$t('pages.setting.data.configExport.title')\">\n          <div class=\"form\">\n            <div class=\"t-radio-group\">\n              <t-radio\n                v-for=\"item in TABLE_OPTIONS\"\n                :key=\"item.value\"\n                v-model=\"exportFormData[item.value]\"\n                allow-uncheck\n              >\n                {{ item.label }}\n              </t-radio>\n            </div>\n            <div class=\"action\">\n              <t-button theme=\"primary\" variant=\"base\" block @click=\"exportData\">\n                {{ $t('common.export') }}\n              </t-button>\n            </div>\n          </div>\n        </t-collapse-panel>\n      </t-collapse>\n\n      <t-collapse>\n        <t-collapse-panel value=\"clear\" :header=\"$t('pages.setting.data.clearData.title')\">\n          <div class=\"form\">\n            <div class=\"t-radio-group\">\n              <t-radio\n                v-for=\"item in TABLE_OPTIONS\"\n                :key=\"item.value\"\n                v-model=\"clearFormData[item.value]\"\n                allow-uncheck\n              >\n                {{ item.label }}\n              </t-radio>\n              <t-radio v-model=\"clearFormData.cache\" allow-uncheck>\n                {{ $t('common.cache') }}\n              </t-radio>\n            </div>\n            <div class=\"action\">\n              <t-popconfirm\n                :content=\"$t('pages.setting.data.config.popup.clear')\"\n                placement=\"bottom\"\n                theme=\"danger\"\n                @confirm=\"clearData\"\n              >\n                <t-button theme=\"danger\" variant=\"base\" block>\n                  {{ $t('common.clear') }}\n                </t-button>\n              </t-popconfirm>\n            </div>\n          </div>\n        </t-collapse-panel>\n      </t-collapse>\n\n      <t-collapse>\n        <t-collapse-panel value=\"sync\" :header=\"$t('pages.setting.data.sync.title')\">\n          <div class=\"form\">\n            <t-select v-model=\"cloudFormData.type\" :label=\"$t('common.type')\">\n              <t-option\n                v-if=\"isMacOS\"\n                value=\"icloud\"\n                :label=\"$t('pages.setting.data.sync.field.typeMap.icloud')\"\n              ></t-option>\n              <t-option value=\"webdav\" :label=\"$t('pages.setting.data.sync.field.typeMap.webdav')\"></t-option>\n            </t-select>\n            <template v-if=\"cloudFormData.type === 'webdav'\">\n              <t-input v-model=\"cloudFormData.url\" :label=\"$t('pages.setting.data.sync.field.url')\" />\n              <t-input v-model=\"cloudFormData.username\" :label=\"$t('pages.setting.data.sync.field.username')\" />\n              <t-input\n                v-model=\"cloudFormData.password\"\n                :label=\"$t('pages.setting.data.sync.field.password')\"\n                type=\"password\"\n              />\n            </template>\n            <div class=\"form-item-group\">\n              <span class=\"form-item-label\">{{ $t('pages.setting.data.sync.field.autoSync') }}</span>\n              <t-switch v-model=\"cloudFormData.sync\" />\n            </div>\n            <div class=\"action\">\n              <t-button theme=\"primary\" variant=\"base\" block @click=\"saveWebdavConf\">\n                {{ $t('common.save') }}\n              </t-button>\n              <t-popconfirm\n                :content=\"$t('pages.setting.data.sync.popup.backup')\"\n                placement=\"bottom\"\n                @confirm=\"cloudBackup\"\n              >\n                <t-button theme=\"default\" variant=\"base\" block>\n                  {{ $t('pages.setting.data.sync.action.backup') }}\n                </t-button>\n              </t-popconfirm>\n              <t-popconfirm\n                :content=\"$t('pages.setting.data.sync.popup.resume')\"\n                placement=\"bottom\"\n                @confirm=\"cloudResume\"\n              >\n                <t-button theme=\"default\" variant=\"base\" block>\n                  {{ $t('pages.setting.data.sync.action.resume') }}\n                </t-button>\n              </t-popconfirm>\n            </div>\n          </div>\n        </t-collapse-panel>\n      </t-collapse>\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport type {\n  IDataCompleteType,\n  IDataImportType,\n  IDataPutType,\n  IDataRemoteType,\n  IDataSimpleType,\n} from '@shared/config/data';\nimport {\n  DATA_COMPLETE_TYPE,\n  DATA_IMPORT_TYPE,\n  DATA_PUT_TYPE,\n  DATA_SIMPLE_TYPE,\n  dataImportTypes,\n} from '@shared/config/data';\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { toUnix } from '@shared/modules/date';\nimport { isArray, isArrayEmpty, isHttp, isStrEmpty, isString } from '@shared/modules/validate';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { computed, onMounted, ref } from 'vue';\n\nimport { dataCloudBackup, dataCloudResume, dataDbClear, dataDbExport, dataDbImport } from '@/api/data';\nimport { addHistory, fetchHistoryPage } from '@/api/moment';\nimport { getSettingDetail, putSetting } from '@/api/setting';\nimport { emitterChannel, emitterSource } from '@/config/emitterChannel';\nimport { t } from '@/locales';\nimport emitter from '@/utils/emitter';\nimport { isMacOS } from '@/utils/systeminfo';\n\nconst TABLE_OPTIONS = computed(() => [\n  { label: t('pages.film.title'), value: 'site' },\n  { label: t('pages.live.title'), value: 'live' },\n  { label: t('pages.parse.title'), value: 'analyze' },\n  { label: t('pages.moment.history.title'), value: 'history' },\n  { label: t('pages.moment.star.title'), value: 'star' },\n  { label: t('pages.setting.title'), value: 'setting' },\n  { label: t('pages.plugin.title'), value: 'plugin' },\n]);\n\nconst HISTORY_TYPE_MAP: Record<IDataImportType, 6 | 7> = { simple: 6, complete: 7 };\n\nconst importSimpleFormData = ref<{ type: IDataSimpleType; url: string }>({\n  type: DATA_SIMPLE_TYPE.TVBOX,\n  url: '',\n});\nconst importSimpleHistoryList = ref<Array<{ label: string; value: string; type: IDataSimpleType }>>([]);\n\nconst importCompleteFormData = ref<{ type: IDataCompleteType; url: string }>({\n  type: DATA_COMPLETE_TYPE.REMOTE,\n  url: '',\n});\nconst importCompleteHistoryList = ref<Array<{ label: string; value: string; type: IDataCompleteType }>>([]);\n\nconst exportFormData = ref({\n  site: false,\n  // iptv: false,\n  // channel: false,\n  live: false,\n  analyze: false,\n  history: false,\n  star: false,\n  setting: false,\n  plugin: false,\n});\n\nconst clearFormData = ref({\n  site: false,\n  // iptv: false,\n  // channel: false,\n  live: false,\n  analyze: false,\n  history: false,\n  star: false,\n  setting: false,\n  plugin: false,\n  cache: false,\n});\n\nconst cloudFormData = ref({\n  type: 'webdav' as 'webdav' | 'icloud',\n  sync: false,\n  url: '',\n  username: '',\n  password: '',\n});\n\nonMounted(() => setup());\n\nconst setup = () => {\n  dataImportTypes.forEach((type) => getHistoryConf(type));\n  getCloudConf();\n};\n\nconst refreshEmitter = (types: string[] = []) => {\n  const handlers: Record<string, string> = {\n    site: emitterChannel.REFRESH_FILM_CONFIG,\n    film: emitterChannel.REFRESH_FILM_CONFIG,\n\n    iptv: emitterChannel.REFRESH_LIVE_CONFIG,\n    channel: emitterChannel.REFRESH_LIVE_CONFIG,\n    live: emitterChannel.REFRESH_LIVE_CONFIG,\n\n    analyze: emitterChannel.REFRESH_PARSE_CONFIG,\n    parse: emitterChannel.REFRESH_PARSE_CONFIG,\n\n    history: emitterChannel.REFRESH_MOMENT_CONFIG,\n    star: emitterChannel.REFRESH_MOMENT_CONFIG,\n    moment: emitterChannel.REFRESH_MOMENT_CONFIG,\n\n    setting: emitterChannel.REFRESH_SETTING_CONFIG,\n  };\n\n  if (isArrayEmpty(types)) {\n    types = Object.keys(handlers);\n  }\n\n  for (const type of types) {\n    const ch = handlers[type];\n    if (ch) emitter.emit(ch, { source: emitterSource.SETTING_DATA });\n  }\n};\n\nconst getHistoryConf = async (importType: IDataImportType) => {\n  try {\n    const resp = await fetchHistoryPage({ page: 1, pageSize: 10, type: [HISTORY_TYPE_MAP[importType]] });\n\n    const rawList = isArray(resp?.list) ? resp.list : [];\n    const target = importType === DATA_IMPORT_TYPE.SIMPLE ? importSimpleHistoryList : importCompleteHistoryList;\n\n    target.value = rawList\n      .filter((o, i, arr) => arr.findIndex((t) => t.videoId === o.videoId) === i)\n      .map((item) => ({ label: item.videoName, value: item.videoId, type: item.relateId }))\n      .slice(0, 5);\n  } catch (error) {\n    console.error('Failed to fetch history:', error);\n  }\n};\n\nconst getCloudConf = async () => {\n  try {\n    const resp = await getSettingDetail('cloud');\n\n    if (Object.hasOwn(resp, 'sync') && Object.hasOwn(resp, 'type')) {\n      cloudFormData.value = resp;\n    }\n  } catch (error) {\n    console.error('Failed to fetch sync config:', error);\n  }\n};\n\nconst createHistoryOptions = async (importType: IDataImportType, val: string) => {\n  try {\n    const target = importType === DATA_IMPORT_TYPE.SIMPLE ? importSimpleHistoryList : importCompleteHistoryList;\n    const targetIndex = target.value.findIndex((item) => item.value === val);\n    if (targetIndex === -1) {\n      if (target.value.length >= 5) {\n        target.value.pop();\n      }\n      const type: IDataRemoteType =\n        importType === DATA_IMPORT_TYPE.SIMPLE ? importSimpleFormData.value.type : importCompleteFormData.value.type;\n      target.value.unshift({ value: val, label: val, type } as any);\n\n      await addHistory({\n        videoName: val,\n        videoId: val,\n        relateId: type,\n        type: HISTORY_TYPE_MAP[importType],\n      });\n    }\n  } catch (error) {\n    console.error('Failed to create history options:', error);\n  }\n};\n\nconst handleHistoryFillFormData = async (importType: IDataImportType, form: IDataRemoteType, value: string) => {\n  const target = importType === DATA_IMPORT_TYPE.SIMPLE ? importSimpleFormData : importCompleteFormData;\n  target.value.url = value;\n  target.value.type = form;\n};\n\nconst importData = async (importType: IDataImportType, putType: IDataPutType) => {\n  try {\n    const api =\n      importType === DATA_IMPORT_TYPE.SIMPLE ? importSimpleFormData.value.url : importCompleteFormData.value.url;\n    const type =\n      importType === DATA_IMPORT_TYPE.SIMPLE ? importSimpleFormData.value.type : importCompleteFormData.value.type;\n\n    if (isStrEmpty(api)) {\n      MessagePlugin.warning(t('common.message.noRequiredParam'));\n      return;\n    }\n\n    const resp = await dataDbImport({ importType, putType, api, remoteType: type });\n\n    if (resp) {\n      refreshEmitter();\n      MessagePlugin.success(t('common.success'));\n    } else {\n      MessagePlugin.warning(t('common.fail'));\n    }\n  } catch (error) {\n    console.error('Failed to import data:', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst uploadFileEvent = async () => {\n  try {\n    const resp = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.FILE_SELECT_FILE_DIALOG, {});\n    if (!isArray(resp) || isArrayEmpty(resp)) {\n      MessagePlugin.warning(t('common.fail'));\n      return;\n    }\n\n    const path = resp[0];\n    importCompleteFormData.value.url = path;\n\n    try {\n      createHistoryOptions(DATA_IMPORT_TYPE.COMPLETE, path);\n    } catch {\n      // do nothing\n    }\n\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error(`Upload file error:`, error);\n    MessagePlugin.error(`${t('common.error')}:${(error as Error).message}`);\n  }\n};\n\nconst exportData = async () => {\n  try {\n    const keyList = Object.keys(exportFormData.value).filter((k) => exportFormData.value[k]) ?? [];\n    if (isArrayEmpty(keyList)) return;\n\n    const resp = await dataDbExport({ type: keyList });\n    const content = JSON.stringify(resp, null, 2);\n\n    const { status: writeStatus } = await window.electron.ipcRenderer.invoke(\n      IPC_CHANNEL.FILE_SELECT_FILE_WRITE,\n      content,\n      { defaultPath: `zy_config_${toUnix()}.json` },\n    );\n\n    if (writeStatus) MessagePlugin.success(t('common.success'));\n    else MessagePlugin.warning(t('common.fail'));\n  } catch (error) {\n    console.error(`Export data error:`, error);\n    MessagePlugin.error(`${t('common.error')}:${(error as Error).message}`);\n  }\n};\n\nconst clearData = async () => {\n  try {\n    const keyList = Object.keys(clearFormData.value).filter((k) => clearFormData.value[k]) ?? [];\n    if (isArrayEmpty(keyList)) return;\n\n    const resp = await dataDbClear({ type: keyList });\n\n    if (resp) {\n      refreshEmitter(keyList);\n      MessagePlugin.success(t('common.success'));\n    } else {\n      MessagePlugin.warning(t('common.fail'));\n    }\n  } catch (error) {\n    console.error('Clear data error:', error);\n    MessagePlugin.error(`${t('common.error')}:${error}`);\n  }\n};\n\nconst saveWebdavConf = async () => {\n  try {\n    const doc = cloudFormData.value;\n    const resp = await putSetting({ key: 'cloud', value: doc });\n    if (isArray(resp) && !isArrayEmpty(resp)) {\n      MessagePlugin.success(t('common.success'));\n    } else {\n      MessagePlugin.warning(t('common.fail'));\n    }\n  } catch (error) {\n    console.error('Failed to save cloud config error:', error);\n    MessagePlugin.error(`${t('common.error')}:${(error as Error).message}`);\n  }\n};\n\nconst cloudBackup = async () => {\n  try {\n    const { url, username, password, type } = cloudFormData.value;\n    if (\n      type === 'webdav' &&\n      (!isHttp(url) || !isString(username) || isStrEmpty(username) || !isString(password) || isStrEmpty(password))\n    ) {\n      MessagePlugin.warning(t('common.message.noRequiredParam'));\n      return;\n    }\n\n    const syncStatus = await dataCloudBackup();\n    if (syncStatus) {\n      MessagePlugin.success(t('common.success'));\n    } else {\n      MessagePlugin.warning(t('common.fail'));\n    }\n  } catch (error) {\n    console.error('Failed to sync local error:', error);\n    MessagePlugin.error(`${t('common.error')}:${(error as Error).message}`);\n  }\n};\n\nconst cloudResume = async () => {\n  try {\n    const { url, username, password, type } = cloudFormData.value;\n    if (\n      type === 'webdav' &&\n      (!isHttp(url) || !isString(username) || isStrEmpty(username) || !isString(password) || isStrEmpty(password))\n    ) {\n      MessagePlugin.warning(t('common.message.noRequiredParam'));\n      return;\n    }\n\n    const syncStatus = await dataCloudResume();\n    if (syncStatus) {\n      refreshEmitter();\n      MessagePlugin.success(t('common.success'));\n    } else {\n      MessagePlugin.warning(t('common.fail'));\n    }\n  } catch (error) {\n    console.error('Failed to sync remote error:', error);\n    MessagePlugin.error(`${t('common.error')}:${(error as Error).message}`);\n  }\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  padding: 0 0 var(--td-comp-paddingTB-s) 0;\n  overflow-y: auto;\n\n  .content {\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n    padding-right: var(--td-comp-paddingLR-s);\n\n    .form {\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n\n      &-item-group {\n        display: flex;\n        align-items: center;\n        gap: var(--td-size-4);\n\n        .form-item-label {\n          color: var(--td-text-color-primary);\n          font: var(--td-font-body-medium);\n        }\n      }\n\n      .action {\n        display: flex;\n        gap: var(--td-size-4);\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/setting/components/film/components/DialogForm.vue",
    "content": "<template>\n  <t-dialog\n    v-model:visible=\"formVisible\"\n    show-in-attached-element\n    :attach=\"`.${attachContent}`\"\n    placement=\"center\"\n    destroy-on-close\n    lazy\n  >\n    <template #header>\n      {{ formType === 'add' ? $t('common.add') : $t('common.edit') }}\n    </template>\n    <template #body>\n      <div class=\"form view-container\">\n        <t-form\n          ref=\"formRef\"\n          :data=\"formData\"\n          :rules=\"RULES\"\n          :label-width=\"80\"\n          required-mark-position=\"right\"\n          label-align=\"left\"\n          reset-type=\"initial\"\n          @submit=\"onSubmit\"\n        >\n          <t-form-item :label=\"$t('common.name')\" name=\"name\">\n            <t-input v-model=\"formData.name\" />\n          </t-form-item>\n          <t-form-item :label=\"$t('common.id')\" name=\"key\">\n            <div class=\"input-horizontal-item\">\n              <t-input v-model=\"formData.key\" style=\"flex: 1\" />\n              <t-button theme=\"default\" @click=\"randomKeyEvent\">{{ $t('common.random') }}</t-button>\n            </div>\n          </t-form-item>\n          <t-form-item :label=\"$t('common.type')\" name=\"type\">\n            <t-select v-model=\"formData.type\" :options=\"TYPE_OPTIONS\" @change=\"changeTypeEvent\" />\n          </t-form-item>\n          <t-form-item :label=\"$t('common.api')\" name=\"api\">\n            <t-input v-model=\"formData.api\" />\n          </t-form-item>\n          <t-form-item :label=\"$t('common.search')\" name=\"search\">\n            <t-radio-group v-model=\"formData.search\" variant=\"default-filled\">\n              <t-radio-button :value=\"true\">{{ $t('common.on') }}</t-radio-button>\n              <t-radio-button :value=\"false\">{{ $t('common.off') }}</t-radio-button>\n            </t-radio-group>\n          </t-form-item>\n          <t-form-item :label=\"$t('pages.film.field.playUrl')\" name=\"playUrl\">\n            <t-input v-model=\"formData.playUrl\" />\n          </t-form-item>\n          <t-form-item :label=\"$t('common.group')\" name=\"group\">\n            <t-select v-model=\"formData.group\" creatable filterable @create=\"createOptions\">\n              <t-option\n                v-for=\"item in formGroup\"\n                :key=\"item.value\"\n                :value=\"item.value\"\n                :label=\"item.label\"\n                class=\"select-options\"\n              />\n            </t-select>\n          </t-form-item>\n          <t-form-item :label=\"$t('pages.film.field.category')\" name=\"category\">\n            <t-textarea\n              v-model=\"formData.categories\"\n              :placeholder=\"$t('common.placeholder.inputSplit', [','])\"\n              :autosize=\"{ minRows: 1, maxRows: 3 }\"\n            />\n          </t-form-item>\n          <t-form-item :label=\"$t('pages.film.field.ext')\" name=\"ext\">\n            <t-textarea\n              v-model=\"formData.ext\"\n              :autosize=\"{ minRows: 1, maxRows: 3 }\"\n              :placeholder=\"$t('common.placeholder.input')\"\n            />\n          </t-form-item>\n        </t-form>\n      </div>\n    </template>\n    <template #footer>\n      <t-button theme=\"default\" variant=\"base\" @click=\"handleReset\">{{ $t('common.reset') }}</t-button>\n      <t-button theme=\"primary\" variant=\"base\" @click=\"handleSubmit\">{{ $t('common.confirm') }}</t-button>\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"ts\">\nimport type { ISiteType } from '@shared/config/film';\nimport { SITE_API_MAP, SITE_TYPE } from '@shared/config/film';\nimport { randomUUID } from '@shared/modules/crypto';\nimport type { FormInstanceFunctions, SubmitContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { computed, ref, useTemplateRef, watch } from 'vue';\n\nimport { attachContent } from '@/config/global';\nimport { t } from '@/locales';\n\nconst props = defineProps({\n  visible: {\n    type: Boolean,\n    default: false,\n  },\n  data: {\n    type: Object,\n    default: () => {},\n  },\n  type: {\n    type: String,\n    default: 'add',\n  },\n  group: {\n    type: Array<{ label: string; value: string }>,\n    default: () => [],\n  },\n});\nconst emits = defineEmits(['update:visible', 'submit']);\n\nconst RULES = {\n  name: [{ required: true }],\n  key: [{ required: true }],\n  api: [{ required: true }],\n  type: [{ required: true }],\n  search: [{ required: true }],\n  filter: [{ required: true }],\n};\n\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\n\nconst formVisible = ref(false);\nconst formData = ref(props.data);\nconst formType = ref(props.type);\nconst formGroup = ref(props.group);\n\nconst TYPE_OPTIONS = computed(() => [\n  { value: SITE_TYPE.T0_XML, label: t('pages.film.field.typeMap.t0-xml') },\n  { value: SITE_TYPE.T1_JSON, label: t('pages.film.field.typeMap.t1-json') },\n\n  { value: SITE_TYPE.T3_DRPY, label: t('pages.film.field.typeMap.t3-js_drpy') },\n  { value: SITE_TYPE.T3_XBPQ, label: t('pages.film.field.typeMap.t3-csp_xbpq') },\n  { value: SITE_TYPE.T3_XYQ, label: t('pages.film.field.typeMap.t3-csp_xyq') },\n  { value: SITE_TYPE.T3_CATOPEN, label: t('pages.film.field.typeMap.t3-js_catopen') },\n  { value: SITE_TYPE.T3_APPYSV2, label: t('pages.film.field.typeMap.t3-csp_appysv2') },\n  { value: SITE_TYPE.T3_PY, label: t('pages.film.field.typeMap.t3-py') },\n  { value: SITE_TYPE.T3_ALIST, label: t('pages.film.field.typeMap.t3-alist') },\n  // { value: SITE_TYPE.T3_APPGET, label: t('pages.film.field.typeMap.t3-csp_appget') },\n  // { value: SITE_TYPE.T3_APPQI, label: t('pages.film.field.typeMap.t3-csp_appqi') },\n  // { value: SITE_TYPE.T3_APPFOX, label: t('pages.film.field.typeMap.t3-csp_appfox') },\n\n  { value: SITE_TYPE.T4_DRPYJS0, label: t('pages.film.field.typeMap.t4-drpy_js0') },\n  { value: SITE_TYPE.T4_DRPYS, label: t('pages.film.field.typeMap.t4-drpys') },\n  { value: SITE_TYPE.T4_CATVOD, label: t('pages.film.field.typeMap.t4-catvod') },\n]);\n\nwatch(\n  () => formVisible.value,\n  (val) => emits('update:visible', val),\n);\nwatch(\n  () => props.visible,\n  (val) => (formVisible.value = val),\n);\nwatch(\n  () => props.data,\n  (val) => (formData.value = val),\n);\nwatch(\n  () => props.type,\n  (val) => (formType.value = val),\n);\nwatch(\n  () => props.group,\n  (val) => (formGroup.value = val),\n);\n\nconst createOptions = (val: string) => {\n  const targetIndex = formGroup.value.findIndex((obj) => obj.value === val);\n  if (targetIndex === -1) formGroup.value.push({ label: val, value: val });\n};\n\nconst changeTypeEvent = (type: ISiteType) => {\n  formData.value.api = SITE_API_MAP?.[type] ?? '';\n};\n\nconst randomKeyEvent = () => {\n  formData.value.key = randomUUID();\n};\n\nconst handleExecute = () => {\n  emits('submit', 'table', formData.value);\n  formVisible.value = false;\n};\n\nconst onSubmit = (context: SubmitContext<FormData>) => {\n  const { validateResult, firstError } = context;\n  if (validateResult && typeof validateResult === 'boolean') {\n    handleExecute();\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\nconst handleSubmit = () => {\n  formRef.value?.submit();\n};\n\nconst handleReset = () => {\n  formRef.value?.reset();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  padding: 0 var(--td-comp-paddingLR-xxs) var(--td-comp-paddingTB-xxs);\n  max-height: 340px;\n  overflow-y: auto;\n\n  .input-horizontal-item {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    gap: var(--td-size-4);\n    width: 100%;\n  }\n\n  .input-vertical-item {\n    display: flex;\n    flex-direction: column;\n    gap: 16px;\n    width: 100%;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/setting/components/film/constants.ts",
    "content": "import { computed } from 'vue';\n\nimport { t } from '@/locales';\n\nexport const COLUMNS = computed(() => [\n  {\n    type: 'multiple',\n    fixed: 'left',\n    colKey: 'row-select',\n  },\n  {\n    title: t('common.name'),\n    align: 'left',\n    colKey: 'name',\n    ellipsis: true,\n  },\n  {\n    title: t('common.type'),\n    align: 'center',\n    colKey: 'type',\n    ellipsis: true,\n  },\n  {\n    title: t('common.group'),\n    align: 'center',\n    colKey: 'group',\n    ellipsis: true,\n  },\n  {\n    title: t('common.status'),\n    align: 'center',\n    colKey: 'isActive',\n  },\n  {\n    title: t('common.operate'),\n    align: 'center',\n    fixed: 'right',\n    width: 230,\n    colKey: 'op',\n  },\n]);\n"
  },
  {
    "path": "src/renderer/src/pages/setting/components/film/index.vue",
    "content": "<template>\n  <div class=\"setting-site view-component-container\">\n    <setting-table\n      row-key=\"id\"\n      :op=\"operations\"\n      :data=\"tableState.list\"\n      :columns=\"COLUMNS\"\n      :pagination=\"pagination\"\n      @op-change=\"handleOperation\"\n      @page-change=\"handlePageChange\"\n      @op-search=\"handleSearch\"\n    >\n      <template #name=\"{ row }\">\n        <t-badge v-if=\"row.id === tableState.default\" size=\"small\" dot :count=\"999\">\n          {{ row.name }}\n        </t-badge>\n        <span v-else>{{ row.name }}</span>\n      </template>\n      <template #isActive=\"{ row }\">\n        <t-switch v-model=\"row.isActive\" @change=\"handleOpActiveSwitch(row.id)\" />\n      </template>\n      <template #type=\"{ row }\">\n        <span v-if=\"row.type === SITE_TYPE.T0_XML\">{{ $t('pages.film.field.typeMap.t0-xml') }}</span>\n        <span v-else-if=\"row.type === SITE_TYPE.T1_JSON\">{{ $t('pages.film.field.typeMap.t1-json') }}</span>\n        <span v-else-if=\"row.type === SITE_TYPE.T4_DRPYJS0\">{{ $t('pages.film.field.typeMap.t4-drpy_js0') }}</span>\n        <span v-else-if=\"row.type === SITE_TYPE.T4_DRPYS\">{{ $t('pages.film.field.typeMap.t4-drpys') }}</span>\n        <span v-else-if=\"row.type === SITE_TYPE.T3_DRPY\">{{ $t('pages.film.field.typeMap.t3-js_drpy') }}</span>\n        <span v-else-if=\"row.type === SITE_TYPE.T4_CATVOD\">{{ $t('pages.film.field.typeMap.t4-catvod') }}</span>\n        <span v-else-if=\"row.type === SITE_TYPE.T3_XBPQ\">{{ $t('pages.film.field.typeMap.t3-csp_xbpq') }}</span>\n        <span v-else-if=\"row.type === SITE_TYPE.T3_XYQ\">{{ $t('pages.film.field.typeMap.t3-csp_xyq') }}</span>\n        <span v-else-if=\"row.type === SITE_TYPE.T3_APPYSV2\">{{ $t('pages.film.field.typeMap.t3-csp_appysv2') }}</span>\n        <span v-else-if=\"row.type === SITE_TYPE.T3_PY\">{{ $t('pages.film.field.typeMap.t3-py') }}</span>\n        <span v-else-if=\"row.type === SITE_TYPE.T3_CATOPEN\">{{ $t('pages.film.field.typeMap.t3-js_catopen') }}</span>\n        <span v-else-if=\"row.type === SITE_TYPE.T3_ALIST\">{{ $t('pages.film.field.typeMap.t3-alist') }}</span>\n        <span v-else-if=\"row.type === SITE_TYPE.T3_APPGET\">{{ $t('pages.film.field.typeMap.t3-csp_appget') }}</span>\n        <span v-else-if=\"row.type === SITE_TYPE.T3_APPQI\">{{ $t('pages.film.field.typeMap.t3-csp_appqi') }}</span>\n        <span v-else-if=\"row.type === SITE_TYPE.T3_APPFOX\">{{ $t('pages.film.field.typeMap.t3-csp_appfox') }}</span>\n      </template>\n      <template #op=\"slotProps\">\n        <t-space>\n          <t-link theme=\"primary\" @click=\"handleOperation('check', [slotProps.row.id])\">\n            {{ $t('common.check') }}\n            <template v-if=\"slotProps.row.check\" #prefix-icon>\n              <loading-icon />\n            </template>\n          </t-link>\n          <t-link theme=\"primary\" @click=\"handleOperation('default', slotProps.row.id)\">\n            {{ $t('common.default') }}\n          </t-link>\n          <t-link theme=\"primary\" @click=\"handleOperation('edit', slotProps.row)\">\n            {{ $t('common.edit') }}\n          </t-link>\n          <t-popconfirm\n            :content=\"$t('common.popup.delete')\"\n            theme=\"danger\"\n            @confirm=\"handleOperation('delete', [slotProps.row.id])\"\n          >\n            <t-link theme=\"danger\">{{ $t('common.delete') }}</t-link>\n          </t-popconfirm>\n        </t-space>\n      </template>\n    </setting-table>\n\n    <dialog-form-view\n      v-model:visible=\"dialogState.visibleForm\"\n      :data=\"formData\"\n      :type=\"dialogState.formType\"\n      :group=\"formGroup\"\n      @submit=\"handleDialogUpdate\"\n    />\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { SITE_TYPE } from '@shared/config/film';\nimport { isArray, isArrayEmpty } from '@shared/modules/validate';\nimport type { IModels } from '@shared/types/db';\nimport { cloneDeep } from 'es-toolkit';\nimport PQueue from 'p-queue';\nimport { LoadingIcon } from 'tdesign-icons-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { computed, onActivated, onMounted, ref } from 'vue';\n\nimport { addSite, delSite, fetchCmsCheck, fetchSitePage, putSite, putSiteDefault } from '@/api/film';\nimport SettingTable from '@/components/setting-table/index.vue';\nimport { emitterChannel, emitterSource } from '@/config/emitterChannel';\nimport { t } from '@/locales';\nimport emitter from '@/utils/emitter';\n\nimport DialogFormView from './components/DialogForm.vue';\nimport { COLUMNS } from './constants';\n\nconst operations = computed(() => [\n  { label: t('common.add'), value: 'add' },\n  { label: t('common.enable'), value: 'enable' },\n  { label: t('common.disable'), value: 'disable' },\n  { label: t('common.delete'), value: 'delete' },\n  { label: t('common.check'), value: 'check' },\n]);\n\nconst dialogState = ref({\n  visibleForm: false,\n  formType: 'add',\n  currentId: '',\n});\n\nconst formData = ref({});\nconst formGroup = ref([]);\nconst searchValue = ref('');\n\nconst pagination = ref({\n  defaultPageSize: 20,\n  total: 0,\n  defaultCurrent: 1,\n  pageSize: 20,\n  current: 1,\n  theme: 'simple',\n});\n\nconst tableState = ref({\n  list: [] as (IModels['site'] & { check: boolean })[],\n  sort: {},\n  filter: { type: [] },\n  select: [],\n  default: '',\n  group: [],\n});\n\nconst checkQueue = new PQueue({ concurrency: 1 });\nconst activeCheckIds = new Set<string>();\n\nonMounted(() => fetchTable());\n\nonActivated(() => {\n  emitter.off(emitterChannel.REFRESH_FILM_CONFIG, reloadConfig);\n  emitter.on(emitterChannel.REFRESH_FILM_CONFIG, reloadConfig);\n});\n\nconst reloadConfig = async ({ data: eventData }) => {\n  const { source } = eventData;\n  if (source === emitterSource.SETTING_TABLE) return;\n\n  resetPagination();\n  resetTable();\n\n  await fetchTable();\n};\n\nconst resetPagination = () => {\n  pagination.value = { defaultCurrent: 1, defaultPageSize: 20, current: 1, pageSize: 20, total: 0, theme: 'simple' };\n};\n\nconst resetTable = () => {\n  tableState.value = { list: [], sort: {}, filter: { type: [] }, select: [], default: '', group: [] };\n};\n\nconst fetchTable = async () => {\n  try {\n    const resp = await fetchSitePage({\n      page: pagination.value.current,\n      pageSize: pagination.value.pageSize,\n      kw: searchValue.value,\n    });\n    if (resp?.default) tableState.value.default = resp.default;\n    if (resp?.list) tableState.value.list = resp.list;\n    if (resp?.total) pagination.value.total = resp.total;\n    if (resp?.group) tableState.value.group = resp.group;\n  } catch (error) {\n    console.error('Fail to fetch page', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst createItem = async (doc: IModels['site']) => {\n  try {\n    await addSite(doc);\n    MessagePlugin.success(`${t('common.success')}`);\n  } catch (error) {\n    console.error('Fail to create item', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst deleteItem = async (ids: string[]) => {\n  try {\n    await delSite({ id: ids });\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error('Fail to delete item', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst updateItem = async (ids: string[], doc: Partial<IModels['site']>) => {\n  try {\n    await putSite({ id: ids, doc });\n    MessagePlugin.success(`${t('common.success')}`);\n  } catch (error) {\n    console.error('Fail to update item', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst setDefaultItem = async (id: string) => {\n  try {\n    await putSiteDefault(id);\n    MessagePlugin.success(`${t('common.success')}`);\n  } catch (error) {\n    console.error('Fail to set default item', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst checkItem = async (ids: string[]) => {\n  for (const id of ids) {\n    if (activeCheckIds.has(id)) continue;\n\n    const idx = tableState.value.list.findIndex((item: IModels['site']) => item.id === id);\n    if (idx === -1) continue;\n\n    activeCheckIds.add(id);\n\n    checkQueue.add(async () => {\n      try {\n        const row = tableState.value.list[idx];\n        tableState.value.list[idx].check = true;\n\n        let isActive = false;\n        try {\n          isActive = await fetchCmsCheck({ uuid: id, type: 'simple' });\n        } catch {\n          // ignore error\n        }\n\n        if (row.isActive !== isActive) {\n          tableState.value.list[idx].isActive = isActive;\n          try {\n            await putSite({ id, doc: { isActive } });\n          } catch {\n            // ignore error\n          }\n        }\n      } finally {\n        activeCheckIds.delete(id);\n        tableState.value.list[idx].check = false;\n      }\n\n      if (activeCheckIds.size === 0) {\n        fetchTable();\n        emitter.emit(emitterChannel.REFRESH_FILM_CONFIG, { source: emitterSource.SETTING_TABLE });\n        MessagePlugin.success(`${t('common.success')}`);\n      }\n    });\n  }\n};\n\nconst handleOpActiveSwitch = async (id: string) => {\n  const list = tableState.value.list;\n  const item = list.find((i: IModels['site']) => i.id === id);\n  if (item) handleOperation(item.isActive ? 'enable' : 'disable', [id]);\n};\n\n// @ts-expect-error Not all code paths return values。ts-7030\nconst handleOperation = async (type: string, payload: any) => {\n  const noSelectOps = ['enable', 'disable', 'delete', 'check'];\n  if ((!isArray(payload) || isArrayEmpty(payload)) && noSelectOps.includes(type)) {\n    return MessagePlugin.warning(t('common.message.noSelect'));\n  }\n\n  const op = {\n    add: () => {\n      dialogState.value.formType = 'add';\n      formData.value = {\n        name: '',\n        key: '',\n        api: '',\n        playUrl: '',\n        group: '',\n        search: true,\n        isActive: true,\n        type: 1,\n        ext: '',\n        categories: '',\n      };\n      formGroup.value = cloneDeep(tableState.value.group);\n      dialogState.value.visibleForm = true;\n    },\n    enable: () => updateItem(payload, { isActive: true }),\n    disable: () => updateItem(payload, { isActive: false }),\n    delete: () => deleteItem(payload),\n    default: async () => {\n      const activeItem = tableState.value.list.find((i: IModels['site']) => i.id === payload);\n      if (!activeItem || !activeItem.isActive) {\n        MessagePlugin.warning(t('common.message.noEnable'));\n        return;\n      }\n      await setDefaultItem(payload);\n    },\n    edit: () => {\n      dialogState.value.formType = 'edit';\n      dialogState.value.currentId = payload.id;\n      const cloneDoc = cloneDeep(payload);\n      delete cloneDoc.id;\n      formData.value = cloneDoc;\n      formGroup.value = cloneDeep(tableState.value.group);\n      dialogState.value.visibleForm = true;\n    },\n    check: () => checkItem(payload),\n  };\n\n  await op?.[type]?.();\n\n  if (['enable', 'disable', 'delete', 'default'].includes(type)) {\n    fetchTable();\n    emitter.emit(emitterChannel.REFRESH_FILM_CONFIG, { source: emitterSource.SETTING_TABLE });\n  }\n};\n\nconst handleDialogUpdate = async (type: string, doc: object) => {\n  if (type === 'table') {\n    if (dialogState.value.formType === 'add') {\n      await createItem(doc as IModels['site']);\n    } else {\n      await updateItem([dialogState.value.currentId], doc as IModels['site']);\n    }\n  }\n\n  fetchTable();\n  emitter.emit(emitterChannel.REFRESH_FILM_CONFIG, { source: emitterSource.SETTING_TABLE });\n};\n\nconst handleSearch = (value: string) => {\n  searchValue.value = value;\n  pagination.value.current = 1;\n  fetchTable();\n};\n\nconst handlePageChange = (page: number, pageSize: number) => {\n  pagination.value.current = page;\n  pagination.value.pageSize = pageSize;\n  fetchTable();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  padding-bottom: var(--td-comp-paddingTB-s);\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/setting/components/live/components/DialogForm.vue",
    "content": "<template>\n  <t-dialog\n    v-model:visible=\"formVisible\"\n    show-in-attached-element\n    :attach=\"`.${attachContent}`\"\n    placement=\"center\"\n    destroy-on-close\n    lazy\n  >\n    <template #header>\n      {{ formType === 'add' ? $t('common.add') : $t('common.edit') }}\n    </template>\n    <template #body>\n      <div class=\"form view-container\">\n        <t-form\n          ref=\"formRef\"\n          :data=\"formData\"\n          :rules=\"RULES\"\n          :label-width=\"80\"\n          required-mark-position=\"right\"\n          label-align=\"left\"\n          reset-type=\"initial\"\n          @submit=\"onSubmit\"\n        >\n          <t-form-item :label=\"$t('common.name')\" name=\"name\">\n            <t-input v-model=\"formData.name\" />\n          </t-form-item>\n          <t-form-item :label=\"$t('common.id')\" name=\"key\">\n            <div class=\"input-horizontal-item\">\n              <t-input v-model=\"formData.key\" style=\"flex: 1\" />\n              <t-button theme=\"default\" @click=\"randomKeyEvent\">{{ $t('common.random') }}</t-button>\n            </div>\n          </t-form-item>\n          <t-form-item :label=\"$t('common.type')\" name=\"type\">\n            <t-radio-group v-model=\"formData.type\" variant=\"default-filled\">\n              <t-radio-button :value=\"IPTV_TYPE.REMOTE\">{{ $t('pages.live.field.apiMap.remote') }}</t-radio-button>\n              <t-radio-button :value=\"IPTV_TYPE.LOCAL\">{{ $t('pages.live.field.apiMap.local') }}</t-radio-button>\n              <t-radio-button :value=\"IPTV_TYPE.MANUAL\">{{ $t('pages.live.field.apiMap.manual') }}</t-radio-button>\n            </t-radio-group>\n          </t-form-item>\n          <t-form-item :label=\"$t('common.api')\" name=\"api\">\n            <t-textarea\n              v-if=\"formData.type === IPTV_TYPE.MANUAL\"\n              v-model=\"formData.api\"\n              class=\"input-item input-textarea\"\n              :placeholder=\"\n                $t('common.placeholder.inputEg', [\n                  '\\nExample of M3U:\\n#EXTM3U\\n#EXTINF:-1, Channel\\nhttps://channel-url\\n\\nExample of txt\\nChannel, https://channel-url',\n                ])\n              \"\n              :autosize=\"{ minRows: 3, maxRows: 5 }\"\n            />\n            <div v-else class=\"input-horizontal-item\">\n              <t-input v-model=\"formData.api\" :style=\"{ flex: 1 }\" />\n              <t-button\n                v-if=\"formData.type === IPTV_TYPE.LOCAL\"\n                class=\"upload-item\"\n                theme=\"default\"\n                @click=\"uploadFileEvent\"\n              >\n                {{ $t('common.upload') }}\n              </t-button>\n            </div>\n          </t-form-item>\n          <t-form-item name=\"logo\">\n            <template #label>\n              {{ $t('pages.live.field.logo') }}\n              <t-popup destroy-on-close attach=\".t-form-item__logo\" :content=\"$t('pages.live.popup.logo')\">\n                <info-circle-icon />\n              </t-popup>\n            </template>\n            <t-input v-model=\"formData.logo\" />\n          </t-form-item>\n          <t-form-item name=\"epg\">\n            <template #label>\n              {{ $t('pages.live.field.epg') }}\n              <t-popup destroy-on-close attach=\".t-form-item__epg\" :content=\"$t('pages.live.popup.epg')\">\n                <info-circle-icon />\n              </t-popup>\n            </template>\n            <t-input v-model=\"formData.epg\" />\n          </t-form-item>\n        </t-form>\n      </div>\n    </template>\n    <template #footer>\n      <t-button theme=\"default\" variant=\"base\" @click=\"handleReset\">{{ $t('common.reset') }}</t-button>\n      <t-button theme=\"primary\" variant=\"base\" @click=\"handleSubmit\">{{ $t('common.confirm') }}</t-button>\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"ts\">\nimport { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport { IPTV_TYPE } from '@shared/config/live';\nimport { randomUUID } from '@shared/modules/crypto';\nimport { isArray, isArrayEmpty } from '@shared/modules/validate';\nimport { InfoCircleIcon } from 'tdesign-icons-vue-next';\nimport type { FormInstanceFunctions, SubmitContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { ref, useTemplateRef, watch } from 'vue';\n\nimport { attachContent } from '@/config/global';\nimport { t } from '@/locales';\n\nconst props = defineProps({\n  visible: {\n    type: Boolean,\n    default: false,\n  },\n  data: {\n    type: Object,\n    default: () => {},\n  },\n  type: {\n    type: String,\n    default: 'add',\n  },\n});\nconst emits = defineEmits(['update:visible', 'submit']);\n\nconst RULES = {\n  name: [{ required: true }],\n  key: [{ required: true }],\n  type: [{ required: true }],\n  api: [{ required: true }],\n  logo: [{ url: { protocols: ['http', 'https'] } }],\n  epg: [{ url: { protocols: ['http', 'https'] } }],\n};\n\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\nconst formVisible = ref(false);\nconst formData = ref(props.data);\nconst formType = ref(props.type);\n\nwatch(\n  () => formVisible.value,\n  (val) => emits('update:visible', val),\n);\nwatch(\n  () => props.visible,\n  (val) => (formVisible.value = val),\n);\nwatch(\n  () => props.data,\n  (val) => (formData.value = val),\n);\nwatch(\n  () => props.type,\n  (val) => (formType.value = val),\n);\n\nconst randomKeyEvent = () => {\n  formData.value.key = randomUUID();\n};\n\nconst handleExecute = () => {\n  emits('submit', 'table', formData.value);\n  formVisible.value = false;\n};\n\nconst onSubmit = (context: SubmitContext<FormData>) => {\n  const { validateResult, firstError } = context;\n  if (validateResult && typeof validateResult === 'boolean') {\n    handleExecute();\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\nconst handleSubmit = () => {\n  formRef.value?.submit();\n};\n\nconst handleReset = () => {\n  formRef.value?.reset();\n};\n\nconst uploadFileEvent = async () => {\n  try {\n    const resp = await window.electron.ipcRenderer.invoke(IPC_CHANNEL.FILE_SELECT_FILE_DIALOG, {\n      filters: [\n        { name: 'M3u Files', extensions: ['m3u', 'm3u8', 'ts'] },\n        { name: 'Text Files', extensions: ['txt'] },\n        { name: 'All Files', extensions: ['*'] },\n      ],\n    });\n    if (!isArray(resp) || isArrayEmpty(resp)) {\n      MessagePlugin.warning(t('common.fail'));\n      return;\n    }\n\n    const path = resp[0];\n    formData.value.api = path;\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error(`Upload file error:`, error);\n    MessagePlugin.error(`${t('common.error')}:${(error as Error).message}`);\n  }\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  padding: 0 var(--td-comp-paddingLR-xxs) var(--td-comp-paddingTB-xxs);\n  max-height: 340px;\n  overflow-y: auto;\n\n  .input-horizontal-item {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    gap: var(--td-size-4);\n    width: 100%;\n  }\n\n  .input-vertical-item {\n    display: flex;\n    flex-direction: column;\n    gap: 16px;\n    width: 100%;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/setting/components/live/constants.ts",
    "content": "import { computed } from 'vue';\n\nimport { t } from '@/locales';\n\nexport const COLUMNS = computed(() => [\n  {\n    type: 'multiple',\n    fixed: 'left',\n    colKey: 'row-select',\n  },\n  {\n    title: t('common.name'),\n    align: 'left',\n    colKey: 'name',\n    ellipsis: true,\n  },\n  {\n    title: t('common.type'),\n    align: 'center',\n    colKey: 'type',\n  },\n  {\n    title: t('common.status'),\n    align: 'center',\n    colKey: 'isActive',\n  },\n  {\n    title: t('common.operate'),\n    align: 'center',\n    fixed: 'right',\n    width: 230,\n    colKey: 'op',\n  },\n]);\n"
  },
  {
    "path": "src/renderer/src/pages/setting/components/live/index.vue",
    "content": "<template>\n  <div class=\"setting-iptv view-component-container\">\n    <setting-table\n      row-key=\"id\"\n      :op=\"operations\"\n      :data=\"tableState.list\"\n      :columns=\"COLUMNS\"\n      :pagination=\"pagination\"\n      @op-change=\"handleOperation\"\n      @page-change=\"handlePageChange\"\n      @op-search=\"handleSearch\"\n    >\n      <template #name=\"{ row }\">\n        <t-badge v-if=\"row.id === tableState.default\" size=\"small\" dot :count=\"999\">\n          {{ row.name }}\n        </t-badge>\n        <span v-else>{{ row.name }}</span>\n      </template>\n      <template #type=\"{ row }\">\n        <t-tag v-if=\"row.type === IPTV_TYPE.REMOTE\" theme=\"success\" shape=\"round\" variant=\"light-outline\">\n          {{ $t('pages.live.field.apiMap.remote') }}\n        </t-tag>\n        <t-tag v-else-if=\"row.type === IPTV_TYPE.LOCAL\" theme=\"warning\" shape=\"round\" variant=\"light-outline\">\n          {{ $t('pages.live.field.apiMap.local') }}\n        </t-tag>\n        <t-tag v-else-if=\"row.type === IPTV_TYPE.MANUAL\" theme=\"danger\" shape=\"round\" variant=\"light-outline\">\n          {{ $t('pages.live.field.apiMap.manual') }}\n        </t-tag>\n      </template>\n      <template #isActive=\"{ row }\">\n        <t-switch v-model=\"row.isActive\" :disabled=\"row.key === 'debug'\" @change=\"handleOpActiveSwitch(row.id)\" />\n      </template>\n      <template #op=\"slotProps\">\n        <t-space>\n          <t-link theme=\"primary\" @click=\"handleOperation('check', [slotProps.row.id])\">\n            {{ $t('common.check') }}\n            <template v-if=\"slotProps.row.check\" #prefix-icon>\n              <loading-icon />\n            </template>\n          </t-link>\n          <t-link theme=\"primary\" @click=\"handleOperation('default', slotProps.row.id)\">\n            {{ $t('common.default') }}\n          </t-link>\n          <t-link theme=\"primary\" @click=\"handleOperation('edit', slotProps.row)\">\n            {{ $t('common.edit') }}\n          </t-link>\n          <t-popconfirm\n            :content=\"$t('common.popup.delete')\"\n            theme=\"danger\"\n            @confirm=\"handleOperation('delete', [slotProps.row.id])\"\n          >\n            <t-link theme=\"danger\">{{ $t('common.delete') }}</t-link>\n          </t-popconfirm>\n        </t-space>\n      </template>\n    </setting-table>\n\n    <dialog-form-view\n      v-model:visible=\"dialogState.visibleForm\"\n      :data=\"formData\"\n      :type=\"dialogState.formType\"\n      @submit=\"handleDialogUpdate\"\n    />\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { IPTV_TYPE } from '@shared/config/live';\nimport { isArray, isArrayEmpty } from '@shared/modules/validate';\nimport type { IModels } from '@shared/types/db';\nimport { cloneDeep } from 'es-toolkit';\nimport PQueue from 'p-queue';\nimport { LoadingIcon } from 'tdesign-icons-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { computed, onActivated, onMounted, ref } from 'vue';\n\nimport { addIptv, delIptv, fetchIptvCheck, fetchIptvPage, putIptv, putIptvDefault } from '@/api/live';\nimport SettingTable from '@/components/setting-table/index.vue';\nimport { emitterChannel, emitterSource } from '@/config/emitterChannel';\nimport { t } from '@/locales';\nimport emitter from '@/utils/emitter';\n\nimport DialogFormView from './components/DialogForm.vue';\nimport { COLUMNS } from './constants';\n\nconst operations = computed(() => [\n  { label: t('common.add'), value: 'add' },\n  { label: t('common.enable'), value: 'enable' },\n  { label: t('common.disable'), value: 'disable' },\n  { label: t('common.delete'), value: 'delete' },\n  { label: t('common.check'), value: 'check' },\n]);\n\nconst dialogState = ref({\n  visibleForm: false,\n  formType: 'add',\n  currentId: '',\n});\n\nconst formData = ref({});\nconst searchValue = ref('');\n\nconst pagination = ref({\n  defaultPageSize: 20,\n  total: 0,\n  defaultCurrent: 1,\n  pageSize: 20,\n  current: 1,\n  theme: 'simple',\n});\n\nconst tableState = ref({\n  list: [] as (IModels['iptv'] & { check: boolean })[],\n  sort: {},\n  filter: { type: [] },\n  select: [],\n  default: '',\n});\n\nconst checkQueue = new PQueue({ concurrency: 1 });\nconst activeCheckIds = new Set<string>();\n\nonMounted(() => fetchTable());\n\nonActivated(() => {\n  emitter.off(emitterChannel.REFRESH_LIVE_CONFIG, reloadConfig);\n  emitter.on(emitterChannel.REFRESH_LIVE_CONFIG, reloadConfig);\n});\n\nconst reloadConfig = async ({ data: eventData }) => {\n  const { source } = eventData;\n  if (source === emitterSource.SETTING_TABLE) return;\n\n  resetPagination();\n  resetTable();\n\n  await fetchTable();\n};\n\nconst resetPagination = () => {\n  pagination.value = { defaultCurrent: 1, defaultPageSize: 20, current: 1, pageSize: 20, total: 0, theme: 'simple' };\n};\n\nconst resetTable = () => {\n  tableState.value = { list: [], sort: {}, filter: { type: [] }, select: [], default: '' };\n};\n\nconst fetchTable = async () => {\n  try {\n    const resp = await fetchIptvPage({\n      page: pagination.value.current,\n      pageSize: pagination.value.pageSize,\n      kw: searchValue.value,\n    });\n    if (resp?.default) tableState.value.default = resp.default;\n    if (resp?.list) tableState.value.list = resp.list;\n    if (resp?.total) pagination.value.total = resp.total;\n  } catch (error) {\n    console.error('Fail to fetch page', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst createItem = async (doc: IModels['iptv']) => {\n  try {\n    await addIptv(doc);\n    MessagePlugin.success(`${t('common.success')}`);\n  } catch (error) {\n    console.error('Fail to create item', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst deleteItem = async (ids: string[]) => {\n  try {\n    await delIptv({ id: ids });\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error('Fail to delete item', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst updateItem = async (ids: string[], doc: Partial<IModels['iptv']>) => {\n  try {\n    await putIptv({ id: ids, doc });\n    MessagePlugin.success(`${t('common.success')}`);\n  } catch (error) {\n    console.error('Fail to update item', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst setDefaultItem = async (id: string) => {\n  try {\n    await putIptvDefault(id);\n    MessagePlugin.success(`${t('common.success')}`);\n  } catch (error) {\n    console.error('Fail to set default item', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst checkItem = async (ids: string[]) => {\n  for (const id of ids) {\n    if (activeCheckIds.has(id)) continue;\n\n    const idx = tableState.value.list.findIndex((item) => item.id === id);\n    if (idx === -1) continue;\n\n    activeCheckIds.add(id);\n\n    checkQueue.add(async () => {\n      try {\n        const row = tableState.value.list[idx];\n        tableState.value.list[idx].check = true;\n\n        let isActive = false;\n        try {\n          isActive = await fetchIptvCheck(id);\n        } catch {\n          // ignore error\n        }\n\n        if (row.isActive !== isActive) {\n          tableState.value.list[idx].isActive = isActive;\n          try {\n            await putIptv({ id: [id], doc: { isActive } });\n          } catch {\n            // ignore error\n          }\n        }\n      } finally {\n        activeCheckIds.delete(id);\n        tableState.value.list[idx].check = false;\n      }\n\n      if (activeCheckIds.size === 0) {\n        fetchTable();\n        emitter.emit(emitterChannel.REFRESH_LIVE_CONFIG, { source: emitterSource.SETTING_TABLE });\n        MessagePlugin.success(`${t('common.success')}`);\n      }\n    });\n  }\n};\n\nconst handleOpActiveSwitch = async (id: string) => {\n  const list = tableState.value.list;\n  const item = list.find((i: IModels['iptv']) => i.id === id);\n  if (item) handleOperation(item.isActive ? 'enable' : 'disable', [id]);\n};\n\n// @ts-expect-error Not all code paths return values。ts-7030\nconst handleOperation = async (type: string, payload: any) => {\n  const noSelectOps = ['enable', 'disable', 'delete', 'check'];\n  if ((!isArray(payload) || isArrayEmpty(payload)) && noSelectOps.includes(type)) {\n    return MessagePlugin.warning(t('common.message.noSelect'));\n  }\n\n  const op = {\n    add: () => {\n      dialogState.value.formType = 'add';\n      formData.value = { key: '', name: '', api: '', type: IPTV_TYPE.REMOTE, epg: '', logo: '', isActive: true };\n      dialogState.value.visibleForm = true;\n    },\n    enable: () => updateItem(payload, { isActive: true }),\n    disable: () => updateItem(payload, { isActive: false }),\n    delete: () => deleteItem(payload),\n    default: async () => {\n      const activeItem = tableState.value.list.find((i: IModels['iptv']) => i.id === payload);\n      if (!activeItem || !activeItem.isActive) {\n        MessagePlugin.warning(t('common.message.noEnable'));\n        return;\n      }\n      await setDefaultItem(payload);\n    },\n    edit: () => {\n      dialogState.value.formType = 'edit';\n      dialogState.value.currentId = payload.id;\n      const cloneDoc = cloneDeep(payload);\n      delete cloneDoc.id;\n      formData.value = cloneDoc;\n      dialogState.value.visibleForm = true;\n    },\n    check: () => checkItem(payload),\n  };\n\n  await op?.[type]?.();\n\n  if (['enable', 'disable', 'delete', 'default'].includes(type)) {\n    fetchTable();\n    emitter.emit(emitterChannel.REFRESH_LIVE_CONFIG, { source: emitterSource.SETTING_TABLE });\n  }\n};\n\nconst handleDialogUpdate = async (type: string, doc: object) => {\n  if (type === 'table') {\n    if (dialogState.value.formType === 'add') {\n      await createItem(doc as IModels['iptv']);\n    } else {\n      await updateItem([dialogState.value.currentId], doc as IModels['iptv']);\n    }\n  }\n\n  fetchTable();\n  emitter.emit(emitterChannel.REFRESH_LIVE_CONFIG, { source: emitterSource.SETTING_TABLE });\n};\n\nconst handleSearch = (value: string) => {\n  searchValue.value = value;\n  pagination.value.current = 1;\n  fetchTable();\n};\n\nconst handlePageChange = (page: number, pageSize: number) => {\n  pagination.value.current = page;\n  pagination.value.pageSize = pageSize;\n  fetchTable();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  padding-bottom: var(--td-comp-paddingTB-s);\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/setting/components/parse/components/DialogForm.vue",
    "content": "<template>\n  <t-dialog\n    v-model:visible=\"formVisible\"\n    show-in-attached-element\n    :attach=\"`.${attachContent}`\"\n    placement=\"center\"\n    destroy-on-close\n    lazy\n  >\n    <template #header>\n      {{ formType === 'add' ? $t('common.add') : $t('common.edit') }}\n    </template>\n    <template #body>\n      <div class=\"form view-container\">\n        <t-form\n          ref=\"formRef\"\n          :data=\"formData\"\n          :rules=\"RULES\"\n          :label-width=\"80\"\n          required-mark-position=\"right\"\n          label-align=\"left\"\n          reset-type=\"initial\"\n          @submit=\"onSubmit\"\n        >\n          <t-form-item :label=\"$t('common.name')\" name=\"name\">\n            <t-input v-model=\"formData.name\" />\n          </t-form-item>\n          <t-form-item :label=\"$t('common.id')\" name=\"key\">\n            <div class=\"input-horizontal-item\">\n              <t-input v-model=\"formData.key\" style=\"flex: 1\" />\n              <t-button theme=\"default\" @click=\"randomKeyEvent\">{{ $t('common.random') }}</t-button>\n            </div>\n          </t-form-item>\n          <t-form-item :label=\"$t('common.type')\" name=\"type\">\n            <t-radio-group v-model=\"formData.type\" variant=\"default-filled\">\n              <t-radio-button :value=\"ANALYZE_TYPE.WEB\">{{ $t('pages.parse.field.apiMap.web') }}</t-radio-button>\n              <t-radio-button :value=\"ANALYZE_TYPE.JSON\">{{ $t('pages.parse.field.apiMap.json') }}</t-radio-button>\n            </t-radio-group>\n          </t-form-item>\n          <t-form-item :label=\"$t('common.api')\" name=\"api\">\n            <t-input v-model=\"formData.api\" />\n          </t-form-item>\n          <t-form-item :label=\"$t('common.flag')\" name=\"flag\">\n            <t-tag-input\n              v-model=\"formData.flag\"\n              :placeholder=\"$t('common.placeholder.inputTag')\"\n              @change=\"handleFlagFilter\"\n            />\n          </t-form-item>\n          <t-form-item v-if=\"formData.type === 1\" :label=\"$t('pages.parse.field.script')\" name=\"script\">\n            <t-textarea\n              v-model=\"formData.script\"\n              :placeholder=\"$t('common.placeholder.inputEg', ['document.querySelector(\\'.play\\').click()'])\"\n              :autosize=\"{ minRows: 3, maxRows: 3 }\"\n            />\n          </t-form-item>\n        </t-form>\n      </div>\n    </template>\n    <template #footer>\n      <t-button theme=\"default\" variant=\"base\" @click=\"handleReset\">{{ $t('common.reset') }}</t-button>\n      <t-button theme=\"primary\" variant=\"base\" @click=\"handleSubmit\">{{ $t('common.confirm') }}</t-button>\n    </template>\n  </t-dialog>\n</template>\n<script setup lang=\"ts\">\nimport { ANALYZE_TYPE } from '@shared/config/parse';\nimport { randomUUID } from '@shared/modules/crypto';\nimport type { FormInstanceFunctions, SubmitContext } from 'tdesign-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { ref, useTemplateRef, watch } from 'vue';\n\nimport { attachContent } from '@/config/global';\n\nconst props = defineProps({\n  visible: {\n    type: Boolean,\n    default: false,\n  },\n  data: {\n    type: Object,\n    default: () => {},\n  },\n  type: {\n    type: String,\n    default: 'add',\n  },\n});\nconst emits = defineEmits(['update:visible', 'submit']);\n\nconst RULES = {\n  name: [{ required: true }],\n  key: [{ required: true }],\n  type: [{ required: true }],\n  api: [{ required: true }, { api: { protocols: ['http', 'https'], require_protocol: true } }],\n};\n\nconst formRef = useTemplateRef<FormInstanceFunctions>('formRef');\nconst formVisible = ref(false);\nconst formData = ref(props.data);\nconst formType = ref(props.type);\n\nwatch(\n  () => formVisible.value,\n  (val) => emits('update:visible', val),\n);\nwatch(\n  () => props.visible,\n  (val) => (formVisible.value = val),\n);\nwatch(\n  () => props.data,\n  (val) => (formData.value = val),\n);\nwatch(\n  () => props.type,\n  (val) => (formType.value = val),\n);\n\nconst randomKeyEvent = () => {\n  formData.value.key = randomUUID();\n};\n\nconst handleExecute = () => {\n  if (formData.value.type !== 'json') {\n    formData.value.exec = '';\n  }\n\n  emits('submit', 'table', formData.value);\n  formVisible.value = false;\n};\n\nconst onSubmit = (context: SubmitContext<FormData>) => {\n  const { validateResult, firstError } = context;\n  if (validateResult && typeof validateResult === 'boolean') {\n    handleExecute();\n  } else {\n    MessagePlugin.warning(firstError!);\n  }\n};\n\nconst handleFlagFilter = (array: string[]) => {\n  formData.value.flag = [...new Set(array)];\n};\n\nconst handleSubmit = () => {\n  formRef.value?.submit();\n};\n\nconst handleReset = () => {\n  formRef.value?.reset();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  padding: 0 var(--td-comp-paddingLR-xxs) var(--td-comp-paddingTB-xxs);\n  max-height: 340px;\n  overflow-y: auto;\n\n  .input-horizontal-item {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    gap: var(--td-size-4);\n    width: 100%;\n  }\n\n  .input-vertical-item {\n    display: flex;\n    flex-direction: column;\n    gap: 16px;\n    width: 100%;\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/setting/components/parse/constants.ts",
    "content": "import { computed } from 'vue';\n\nimport { t } from '@/locales';\n\nexport const COLUMNS = computed(() => [\n  {\n    type: 'multiple',\n    fixed: 'left',\n    colKey: 'row-select',\n  },\n  {\n    title: t('common.name'),\n    align: 'left',\n    colKey: 'name',\n    ellipsis: true,\n  },\n  {\n    title: t('common.type'),\n    align: 'center',\n    colKey: 'type',\n  },\n  {\n    title: t('common.status'),\n    align: 'center',\n    colKey: 'isActive',\n  },\n  {\n    title: t('common.operate'),\n    align: 'center',\n    fixed: 'right',\n    width: 230,\n    colKey: 'op',\n  },\n]);\n"
  },
  {
    "path": "src/renderer/src/pages/setting/components/parse/index.vue",
    "content": "<template>\n  <div class=\"setting-analyze view-component-container\">\n    <setting-table\n      row-key=\"id\"\n      :op=\"operations\"\n      :data=\"tableState.list\"\n      :columns=\"COLUMNS\"\n      :pagination=\"pagination\"\n      @op-change=\"handleOperation\"\n      @page-change=\"handlePageChange\"\n      @op-search=\"handleSearch\"\n    >\n      <template #name=\"{ row }\">\n        <t-badge v-if=\"row.id === tableState.default\" size=\"small\" dot :count=\"999\">\n          {{ row.name }}\n        </t-badge>\n        <span v-else>{{ row.name }}</span>\n      </template>\n      <template #type=\"{ row }\">\n        <t-tag v-if=\"row.type === ANALYZE_TYPE.WEB\" shape=\"round\" theme=\"danger\" variant=\"light-outline\">\n          {{ $t('pages.parse.field.apiMap.web') }}\n        </t-tag>\n        <t-tag v-else-if=\"row.type === ANALYZE_TYPE.JSON\" shape=\"round\" theme=\"success\" variant=\"light-outline\">\n          {{ $t('pages.parse.field.apiMap.json') }}\n        </t-tag>\n      </template>\n      <template #isActive=\"{ row }\">\n        <t-switch v-model=\"row.isActive\" :disabled=\"row.key === 'debug'\" @change=\"handleOpActiveSwitch(row.id)\" />\n      </template>\n      <template #ext=\"{ row }\">\n        <span v-for=\"item in row.ext\" :key=\"item.id\">{{ item }}</span>\n      </template>\n      <template #op=\"slotProps\">\n        <t-space>\n          <t-link theme=\"primary\" @click=\"handleOperation('check', [slotProps.row.id])\">\n            {{ $t('common.check') }}\n            <template v-if=\"slotProps.row.check\" #prefix-icon>\n              <loading-icon />\n            </template>\n          </t-link>\n          <t-link theme=\"primary\" @click=\"handleOperation('default', slotProps.row.id)\">\n            {{ $t('common.default') }}\n          </t-link>\n          <t-link theme=\"primary\" @click=\"handleOperation('edit', slotProps.row)\">\n            {{ $t('common.edit') }}\n          </t-link>\n          <t-popconfirm\n            :content=\"$t('common.popup.delete')\"\n            theme=\"danger\"\n            @confirm=\"handleOperation('delete', [slotProps.row.id])\"\n          >\n            <t-link theme=\"danger\">{{ $t('common.delete') }}</t-link>\n          </t-popconfirm>\n        </t-space>\n      </template>\n    </setting-table>\n\n    <dialog-form-view\n      v-model:visible=\"dialogState.visibleForm\"\n      :data=\"formData\"\n      :type=\"dialogState.formType\"\n      @submit=\"handleDialogUpdate\"\n    />\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { ANALYZE_TYPE } from '@shared/config/parse';\nimport { isArray, isArrayEmpty } from '@shared/modules/validate';\nimport type { IModels } from '@shared/types/db';\nimport { cloneDeep } from 'es-toolkit';\nimport PQueue from 'p-queue';\nimport { LoadingIcon } from 'tdesign-icons-vue-next';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { computed, onActivated, onMounted, ref } from 'vue';\n\nimport {\n  addAnalyze,\n  delAnalyze,\n  fetchAnalyzeCheck,\n  fetchAnalyzePage,\n  putAnalyze,\n  putAnalyzeDefault,\n} from '@/api/parse';\nimport SettingTable from '@/components/setting-table/index.vue';\nimport { emitterChannel, emitterSource } from '@/config/emitterChannel';\nimport { t } from '@/locales';\nimport emitter from '@/utils/emitter';\n\nimport DialogFormView from './components/DialogForm.vue';\nimport { COLUMNS } from './constants';\n\nconst operations = computed(() => [\n  { label: t('common.add'), value: 'add' },\n  { label: t('common.enable'), value: 'enable' },\n  { label: t('common.disable'), value: 'disable' },\n  { label: t('common.delete'), value: 'delete' },\n  { label: t('common.check'), value: 'check' },\n]);\n\nconst dialogState = ref({\n  visibleForm: false,\n  visibleFlag: false,\n  formType: 'add',\n  currentId: '',\n});\n\nconst formData = ref({});\nconst searchValue = ref('');\n\nconst pagination = ref({\n  defaultPageSize: 20,\n  total: 0,\n  defaultCurrent: 1,\n  pageSize: 20,\n  current: 1,\n  theme: 'simple',\n});\n\nconst tableState = ref({\n  list: [] as (IModels['analyze'] & { check: boolean })[],\n  sort: {},\n  filter: { type: [] },\n  select: [],\n  default: '',\n});\n\nconst checkQueue = new PQueue({ concurrency: 1 });\nconst activeCheckIds = new Set<string>();\n\nonMounted(() => fetchTable());\n\nonActivated(() => {\n  emitter.off(emitterChannel.REFRESH_PARSE_CONFIG, reloadConfig);\n  emitter.on(emitterChannel.REFRESH_PARSE_CONFIG, reloadConfig);\n});\n\nconst reloadConfig = async ({ data: eventData }) => {\n  const { source } = eventData;\n  if (source === emitterSource.SETTING_TABLE) return;\n\n  resetPagination();\n  resetTable();\n\n  await fetchTable();\n};\n\nconst resetPagination = () => {\n  pagination.value = { defaultCurrent: 1, defaultPageSize: 20, current: 1, pageSize: 20, total: 0, theme: 'simple' };\n};\n\nconst resetTable = () => {\n  tableState.value = { list: [], sort: {}, filter: { type: [] }, select: [], default: '' };\n};\n\nconst fetchTable = async () => {\n  try {\n    const resp = await fetchAnalyzePage({\n      page: pagination.value.current,\n      pageSize: pagination.value.pageSize,\n      kw: searchValue.value,\n    });\n    if (resp?.default) tableState.value.default = resp.default;\n    if (resp?.list) tableState.value.list = resp.list;\n    if (resp?.total) pagination.value.total = resp.total;\n  } catch (error) {\n    console.error('Fail to fetch page', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst createItem = async (doc: IModels['analyze']) => {\n  try {\n    await addAnalyze(doc);\n    MessagePlugin.success(`${t('common.success')}`);\n  } catch (error) {\n    console.error('Fail to create item', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst deleteItem = async (ids: string[]) => {\n  try {\n    await delAnalyze({ id: ids });\n    MessagePlugin.success(t('common.success'));\n  } catch (error) {\n    console.error('Fail to delete item', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst updateItem = async (ids: string[], doc: Partial<IModels['analyze']>) => {\n  try {\n    await putAnalyze({ id: ids, doc });\n    MessagePlugin.success(`${t('common.success')}`);\n  } catch (error) {\n    console.error('Fail to update item', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst setDefaultItem = async (id: string) => {\n  try {\n    await putAnalyzeDefault(id);\n    MessagePlugin.success(`${t('common.success')}`);\n  } catch (error) {\n    console.error('Fail to set default item', error);\n    MessagePlugin.error(`${t('common.error')}: ${(error as Error).message}`);\n  }\n};\n\nconst checkItem = async (ids: string[]) => {\n  for (const id of ids) {\n    if (activeCheckIds.has(id)) continue;\n\n    const idx = tableState.value.list.findIndex((item) => item.id === id);\n    if (idx === -1) continue;\n\n    activeCheckIds.add(id);\n\n    checkQueue.add(async () => {\n      try {\n        const row = tableState.value.list[idx];\n        tableState.value.list[idx].check = true;\n\n        let isActive = false;\n        try {\n          isActive = await fetchAnalyzeCheck(id);\n        } catch {\n          // ignore error\n        }\n\n        if (row.isActive !== isActive) {\n          tableState.value.list[idx].isActive = isActive;\n          try {\n            await putAnalyze({ id: [id], doc: { isActive } });\n          } catch {\n            // ignore error\n          }\n        }\n      } finally {\n        activeCheckIds.delete(id);\n        tableState.value.list[idx].check = false;\n      }\n\n      if (activeCheckIds.size === 0) {\n        fetchTable();\n        emitter.emit(emitterChannel.REFRESH_PARSE_CONFIG, { source: emitterSource.SETTING_TABLE });\n        MessagePlugin.success(`${t('common.success')}`);\n      }\n    });\n  }\n};\n\nconst handleOpActiveSwitch = async (id: string) => {\n  const list = tableState.value.list;\n  const item = list.find((i: IModels['analyze']) => i.id === id);\n  if (item) handleOperation(item.isActive ? 'enable' : 'disable', [id]);\n};\n\n// @ts-expect-error Not all code paths return values。ts-7030\nconst handleOperation = async (type: string, payload: any) => {\n  const noSelectOps = ['enable', 'disable', 'delete', 'check'];\n  if ((!isArray(payload) || isArrayEmpty(payload)) && noSelectOps.includes(type)) {\n    return MessagePlugin.warning(t('common.message.noSelect'));\n  }\n\n  const op = {\n    add: () => {\n      dialogState.value.formType = 'add';\n      formData.value = { key: '', name: '', api: '', type: ANALYZE_TYPE.WEB, flag: [], script: '', isActive: true };\n      dialogState.value.visibleForm = true;\n    },\n    enable: () => updateItem(payload, { isActive: true }),\n    disable: () => updateItem(payload, { isActive: false }),\n    delete: () => deleteItem(payload),\n    default: async () => {\n      const activeItem = tableState.value.list.find((i: IModels['analyze']) => i.id === payload);\n      if (!activeItem || !activeItem.isActive) {\n        MessagePlugin.warning(t('common.message.noEnable'));\n        return;\n      }\n      await setDefaultItem(payload);\n    },\n    edit: () => {\n      dialogState.value.formType = 'edit';\n      dialogState.value.currentId = payload.id;\n      const cloneDoc = cloneDeep(payload);\n      delete cloneDoc.id;\n      formData.value = cloneDoc;\n      dialogState.value.visibleForm = true;\n    },\n    check: () => checkItem(payload),\n  };\n\n  await op?.[type]?.();\n\n  if (['enable', 'disable', 'delete', 'default'].includes(type)) {\n    fetchTable();\n    emitter.emit(emitterChannel.REFRESH_PARSE_CONFIG, { source: emitterSource.SETTING_TABLE });\n  }\n};\n\nconst handleDialogUpdate = async (type: string, doc: object) => {\n  if (type === 'table') {\n    if (dialogState.value.formType === 'add') {\n      await createItem(doc as IModels['analyze']);\n    } else {\n      await updateItem([dialogState.value.currentId], doc as IModels['analyze']);\n    }\n  }\n\n  fetchTable();\n  emitter.emit(emitterChannel.REFRESH_PARSE_CONFIG, { source: emitterSource.SETTING_TABLE });\n};\n\nconst handleSearch = (value: string) => {\n  searchValue.value = value;\n  pagination.value.current = 1;\n  fetchTable();\n};\n\nconst handlePageChange = (page: number, pageSize: number) => {\n  pagination.value.current = page;\n  pagination.value.pageSize = pageSize;\n  fetchTable();\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  padding-bottom: var(--td-comp-paddingTB-s);\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/setting/index.vue",
    "content": "<template>\n  <div class=\"setting view-container\">\n    <common-nav :list=\"componentNav\" :active=\"active\" class=\"sidebar\" @change=\"onNavChange\" />\n\n    <div class=\"content\">\n      <div class=\"container\">\n        <keep-alive>\n          <component :is=\"currentComponent\" class=\"content-wrapper\"></component>\n        </keep-alive>\n      </div>\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { computed, defineAsyncComponent, shallowRef } from 'vue';\n\nimport CommonNav from '@/components/common-nav/index.vue';\nimport { t } from '@/locales';\nimport { useSettingStore } from '@/store';\n\nconst storeSetting = useSettingStore();\n\nconst componentMap = {\n  baseConfig: defineAsyncComponent(() => import('./components/base/index.vue')),\n  dataManage: defineAsyncComponent(() => import('./components/data/index.vue')),\n  filmSource: defineAsyncComponent(() => import('./components/film/index.vue')),\n  liveSource: defineAsyncComponent(() => import('./components/live/index.vue')),\n  parseSource: defineAsyncComponent(() => import('./components/parse/index.vue')),\n};\n\nconst currentComponent = shallowRef(componentMap[storeSetting.nav.setting || 'baseConfig']);\n\nconst active = computed(() => storeSetting.nav.setting || 'baseConfig');\nconst componentNav = computed(() => [\n  { id: 'baseConfig', name: t('pages.setting.nav.baseConfig') },\n  { id: 'dataManage', name: t('pages.setting.nav.dataManage') },\n  { id: 'filmSource', name: t('pages.setting.nav.filmSource') },\n  { id: 'liveSource', name: t('pages.setting.nav.liveSource') },\n  { id: 'parseSource', name: t('pages.setting.nav.parseSource') },\n]);\n\nconst onNavChange = (item: string) => {\n  storeSetting.updateConfig({ nav: { ...storeSetting.nav, setting: item } });\n\n  if (Object.hasOwn(componentMap, item)) {\n    currentComponent.value = componentMap[item];\n  }\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  height: 100%;\n  width: 100%;\n  display: flex;\n  flex-direction: row;\n  gap: var(--td-size-4);\n\n  .sidebar {\n    flex-grow: 0;\n    flex-shrink: 0;\n  }\n\n  .content {\n    height: 100%;\n    width: 100%;\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n    overflow: hidden;\n    position: relative;\n\n    .container {\n      flex: 1;\n      height: 100%;\n      width: 100%;\n\n      .content-wrapper {\n        width: 100%;\n        height: 100%;\n        position: relative;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/test/components/action/index.vue",
    "content": "<template>\n  <div class=\"view-component-container\">\n    <t-space break-line>\n      <template v-for=\"(_value, key, index) in actions\" :key=\"index\">\n        <t-button class=\"btn\" @click=\"handleAction(key)\">{{ key }}</t-button>\n      </template>\n    </t-space>\n\n    <action-view v-model:visible=\"visible\" :config=\"config\" @submit=\"onActionSubmit\" />\n\n    <!-- <div style=\"margin-top: 20px; display: flex; flex-direction: column; gap: var(--td-size-4)\">\n      <action-section ref=\"actRef\" :config=\"actions['input-qrcode-1']\" @submit=\"onActionSubmit\" />\n      <t-button block @click=\"handleActionSubmit\">测试</t-button>\n    </div> -->\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\n\n// import ActionSection from '@/components/action/components/ActionSection.vue';\n// import ActionSection from '@/components/action/components/FormActionSection.vue';\nimport ActionView from '@/components/action/index.vue';\n\nconst actions = ref({\n  'input-calendar': {\n    actionId: '扫码初始动作',\n    id: 'item2',\n    name: '日期（日期选择）',\n    title: '日期（日期选择）',\n    tip: '请输入项目2内容',\n    value: '',\n    selectData: '[calendar]',\n    validation: '',\n    inputType: 0,\n  },\n  'input-file': {\n    actionId: '扫码初始动作',\n    id: 'item2',\n    title: '文件路径（文件选择）',\n    name: '文件路径（文件选择）',\n    tip: '请输入文件路径',\n    value: '',\n    selectData: '[file]',\n    validation: '',\n    inputType: 0,\n  },\n  'input-folder': {\n    actionId: '扫码初始动作',\n    id: 'item2',\n    title: '文件夹路径（文件夹选择）',\n    name: '文件夹路径（文件夹选择）',\n    tip: '请输入文件夹路径',\n    value: '',\n    selectData: '[folder]',\n    validation: '',\n    inputType: 0,\n  },\n  'input-image-upload': {\n    actionId: '扫码初始动作',\n    id: 'item2',\n    name: '图片选择',\n    tip: '请选择图片',\n    value: '',\n    selectData: '[image]',\n    validation: '',\n    inputType: 0,\n  },\n  'input-qrcode-1': {\n    actionId: '扫码初始动作',\n    id: 'alitoken',\n    type: 'input',\n    title: '阿里云盘Token',\n    msg: '弹出窗口就执行initAction里的动作，回调时就关闭窗口，应用于扫码场景，为了演示，动作注释了',\n    button: 0,\n    timeout: 20,\n    qrcode: 'https://www.alipan.com/',\n    // initAction: 'initAction'\n  },\n  'input-qrcode-2': {\n    actionId: 'quarkScanCookie',\n    id: 'quarkScanCookie',\n    canceledOnTouchOutside: false,\n    type: 'input',\n    title: '夸克扫码Cookie',\n    msg: '请使用夸克APP扫码登录获取',\n    width: 500,\n    button: 1,\n    timeout: 20,\n    qrcode: 'https://drplayer.playdreamer.cn/lives.jpg',\n    qrcodeSize: '400',\n    initAction: 'quarkScanCheck',\n    initValue: '123',\n    cancelAction: 'quarkScanCancel',\n    cancelValue: '123',\n  },\n  'input-image': {\n    actionId: 'test-image',\n    title: '图片Action测试',\n    msg: '请点击图片上的任意位置：',\n    imageUrl: 'https://drplayer.playdreamer.cn/lives.jpg',\n    imageClickCoord: true,\n    imageHeight: 300,\n    tip: '请输入坐标或点击图片',\n  },\n  'input-textarea': {\n    actionId: 'test-edit',\n    multiLine: 3,\n    title: '多行编辑测试',\n    msg: '请输入详细描述：',\n    tip: '请输入详细描述',\n    value: '这是一个多行编辑框的示例文本。\\n您可以在这里输入多行内容。',\n    width: 640,\n    height: 400,\n  },\n  'input-select-1': {\n    actionId: '玩偶域名',\n    id: 'test-mselect-1',\n    type: 'input',\n    width: 450,\n    title: '玩偶域名',\n    tip: '请输入玩偶域名',\n    value: '',\n    msg: '选择或输入使用的域名',\n    selectData:\n      '1:=https://www.wogg.net/,2:=https://wogg.xxooo.cf/,3:=https://wogg.888484.xyz/,4:=https://www.wogg.bf/,5:=https://woggapi.333232.xyz/',\n    button: 0,\n  },\n  'input-select-2': {\n    id: 'test-mselect-2',\n    title: '多项选择',\n    tip: '请选择多个选项',\n    value: '',\n    selectData: '[请选择字母]a,b,c,d,e,f,g',\n    selectWidth: 640,\n    multiSelect: true,\n    selectColumn: 4,\n    inputType: 0,\n    quickSelect: true,\n    // onlyQuickSelect: true,\n  },\n  'multi-input': {\n    actionId: 'test-multi-input',\n    type: 'multiInput',\n    title: '多输入测试',\n    msg: '请填写用户信息：',\n    button: 3,\n    input: [\n      { name: '姓名', required: true, tip: '请输入姓名' },\n      { name: '邮箱', inputType: 3, required: true, tip: '请输入邮箱地址' },\n      { name: '简介', multiLine: 3, tip: '请输入个人简介', help: '支持<b>HTML</b>格式的帮助文本' },\n      {\n        name: '多项选择',\n        tip: '请选择多个选项',\n        value: '',\n        selectData: '[请选择字母]a,b,c,d,e,f,g',\n        multiSelect: true,\n      },\n    ],\n  },\n  menu: {\n    actionId: '单选菜单',\n    type: 'menu',\n    title: 'Action单选菜单',\n    width: 480,\n    column: 2,\n    option: [\n      { name: '选项1', action: 'menu1' },\n      { name: '选项2', action: 'menu2' },\n      { name: '菜单3', action: 'menu3' },\n      { name: '菜单4', action: 'menu4' },\n      '菜单5$menu5',\n      '菜单6$menu6',\n      '菜单7$menu7',\n      '菜单8$menu8',\n      '菜单9$menu9',\n      '菜单10$menu10',\n    ],\n    selectedIndex: 3,\n  },\n  select: {\n    actionId: '多选菜单',\n    type: 'select',\n    title: 'Action多选菜单',\n    width: 480,\n    column: 2,\n    option: [\n      { name: '选项1', action: 'menu1', selected: true },\n      { name: '选项2', action: 'menu2' },\n      { name: '选项3', action: 'menu3', selected: true },\n      { name: '选项4', action: 'menu4' },\n      { name: '选项5', action: 'menu5' },\n      { name: '选项6', action: 'menu6' },\n      { name: '选项7', action: 'menu7' },\n      { name: '选项8', action: 'menu8' },\n      { name: '选项9', action: 'menu9', selected: true },\n      { name: '选项10', action: 'menu10', selected: true },\n      { name: '选项11', action: 'menu11', selected: true },\n      { name: '选项12', action: 'menu12', selected: true },\n    ],\n  },\n  msgbox: {\n    actionId: '消息弹窗',\n    type: 'msgbox',\n    title: '消息弹窗',\n    // msg: '这是一个消息弹窗',\n    // msgType: 'rich_text',\n    htmlMsg: '这是一个支持 <font color=red><b>简单HTML语法</b></font> 内容的弹窗',\n    imageUrl: 'https://pic.imgdb.cn/item/667ce9f4d9c307b7e9f9d052.webp',\n    imageHeight: 300,\n  },\n  browser: {\n    actionId: 'test-browser',\n    type: 'browser',\n    title: '小游戏',\n    url: 'https://poki.com/zh',\n  },\n  help: {\n    actionId: 'test-help',\n    type: 'help',\n    title: '帮助',\n    data: {\n      使用帮助:\n        '本帮助。长按则分项选择查看。\\n\\n系统多数功能按键和选项，短按和长按有不同的功能。\\n\\n[#影图根目录]：安全起见，影图的根目录为tvbox（/storage/emulated/0/tvbox），未说明情况下文件或文件夹都是相对于此目录。',\n      交互动作:\n        '影图APP与站源接口间交互的动作指令（action）。用户在APP主动发出动作请求，接口根据指令返回数据或返回构建信息输入窗口的配置JSON，具有连续交互的机制。',\n      动作指令:\n        '接口回传给APP的动作指令，按用户交互起点分为静态动作和动态动作。\\n\\n[#静态动作]：用户通过视频分类列表主动发起交互的起点动作。动作指令以分类列表的视频JSON数据为基础，属于静态数据。所有交互动作的起始都是静态动作。\\n\\n[#动态动作]：静态动作构建的信息输入窗口提交动作(action)数据后，接口如果再次需要用户输入数据，可以返回新的动作配置JSON数据，此数据是交互过程中动态生成的，属于动态动作。数据结构：\\n{\\n　\"action\":{\\n　　动作指令结构...\\n　},\\n　\"toast\":\"Toast显示消息\"\\n}',\n      动作类型: '基础动作、单项输入、多行编辑、多项输入、增强多项输入、单项选择、多项选择、消息弹窗、专项动作等。',\n      视频VOD:\n        '动作入口的视频分类列表VOD的JSON，vod_id字段值为字符型动作指令数据（json结构的需要转为字符型），vod_tag字段值固定为action，其它字段与视频类一致。例如：\\n{\\n　\"vod_id\":\"动作指令结构...\",\\n　\"vod_name\":\"显示名称\",\\n　\"vod_tag\":\"action\"\\n}',\n      接口action:\n        '接口接收动作指令的方法action。以js代码为例：function action(action, value) {...}。传参action为动作指令，value为动作指令值。返回结果消息或新的动作指令数据（动态动作）。',\n      基础动作:\n        '简单的动作指令字符串（非JSON结构），用户点击时无信息输入窗口，直接发送指令。\\n{\\n　\"vod_id\":\"hello world\",\\n　\"vod_name\":\"基础动作\",\\n　\"vod_tag\":\"action\"\\n}',\n      JSON动作:\n        'JSON结构的动作指令。通过JSON结构数据，配置更丰富的动作指令。通过选择配置不同的字段，定义不同的动作表现。',\n      actionId: '识别动作的路由ID或专项动作指令，必须。字符型。',\n      type: '动作的类型。input（单项输入）/edit（单项多行编辑）/multiInput（少于5个的多项输入）/multiInputX（增强的多项输入）/menu（单项选择）/select（多项选择）/msgbox（消息弹窗）等。字符型。',\n      canceledOnTouchOutside: '弹出窗口是否允许触摸窗口外时取消窗口。逻辑型。',\n      title: '标题。字符型。',\n      width: '宽度。整型。',\n      height: '高度。整型。',\n      msg: '文本消息内容。字符型。',\n      htmlMsg: 'msgbox类动作的简单html消息内容。字符型。',\n      help: 'input、multiInput、multiInputX类动作的帮助说明内容，在窗口右上角显示帮助图标，点击显示帮助说明，可支持简易的HTML内容。支持的HTML标签，b（加粗）、i（斜体）、u（下划线）、strike（删除线）、em（强调）、strong（加强强调）、p（段落）、div（分区）、br（换行）、font（颜色/大小/字体）、h1~h6（标题层级）、small（小号字体）、tt（打字机字体）、blockquote（引用块）。',\n      button: '按键的数量。0-无按键，1-取消，2-确定/取消, 3-确定/取消/重置。整型。',\n      imageUrl: '图片URL。字符型。',\n      imageHeight: '图片高度。整型。',\n      imageClickCoord: '是否检测图片的点击坐标输入。逻辑型。',\n      qrcode: '生成二维码的URL。字符型。',\n      qrcodeSize: '二维码的大小。整型。',\n      timeout: '超时时间（秒）。超时自动关闭窗口。整型。',\n      httpTimeout: 'T4源的动作网络访问超时时间（秒）。',\n      keep: '输入确认后，窗口是否保持。逻辑型。',\n      initAction: '窗口弹出时自动发送的初始化动作指令。字符型。',\n      initValue: '窗口弹出时自动发送的初始化指令值。字符型。',\n      cancelAction: '按窗口的取消键时发送的取消动作指令。字符型。',\n      cancelValue: '按窗口的取消键时发送的取消动作指令值。字符型。',\n      tip: '单项输入的输入提示，单项输入时必须。字符型。',\n      value: '单项输入的初始化值。字符型。',\n      selectData:\n        '单项输入的预定义选项，用于常见值的快速选择输入。各选项间用“,”分隔，选项值可使用“名称:=值”方式。字符型。',\n      input:\n        '多项输入的项目定义JSON数组。每个输入项目使用一个JSON对象进行定义。\\n\\n[#id]：项目id。\\n\\n[#name]：项目名称。\\n\\n[#tip]：项目输入提示。\\n\\n[#value]：项目初始值。\\n\\n[#selectData]：项目输入预定义选项。各选项间用“,”分隔，选项值可使用“名称:=值”方式。特殊的输入选择：[folder]-选择文件夹，[file]-选择文件，[calendar]-选择日期，[image]-选择图像文件转为BASE64。multiInputX。\\n\\n[#quickSelect]：是否能快速选择。单项选择时有效。quickSelect为true且inputType为0时，只输入快速选择项目不显示输入框等。multiInputX。\\n\\n[#onlyQuickSelect]：是否只快速选择，隐藏输入框等。单项选择时有效。multiInputX。\\n\\n[#selectWidth]：选择窗的宽度。multiInputX。\\n\\n[#multiSelect]：是否多选。multiInputX。\\n\\n[#selectColumn]：选择窗的列数。multiInputX。\\n\\n[#inputType]：项目输入类型。0-项目输入框只读，但可通过选项输入。129-密码输入。inputType为0且quickSelect为true时，只输入快速选择项目不显示输入框等。multiInputX。\\n\\n[#multiLine]：项目输入框的行数（多行编辑）。multiInputX。\\n\\n[#validation]：提交时项目输入值校验正则表达式。multiInputX。\\n\\n[#help]：项目输入的帮助说明，可支持简易的HTML内容。支持的HTML标签，b（加粗）、i（斜体）、u（下划线）、strike（删除线）、em（强调）、strong（加强强调）、p（段落）、div（分区）、br（换行）、font（颜色/大小/字体）、h1~h6（标题层级）、small（小号字体）、tt（打字机字体）、blockquote（引用块）。multiInputX。',\n      dimAmount: '设置窗口背景暗化效果，用于调整背景的暗化程度（透明度）。其值范围为0.0到1.0。',\n      bottom: '底部对齐和底边距。整型。',\n      column: '单项选择或多项选择窗口的列数。整型。',\n      option:\n        '单项选择或多项选择的选项定义JSON数组。每个选项使用一个JSON对象进行定义。\\n\\n[#name]：选项名称。\\n\\n[#action]：选项动作值。\\n\\n[#selected]：选项默认是否已选。多项选择是可用。',\n      单项输入:\n        \"type为input。要求用户输入一个字段的动作，JSON结构，部分字段根据需要选用。\\n{\\n　actionId:'动作路由ID',\\n　id:'输入项目id',\\n　type:'input',\\n　width:450,\\n　title:'输入窗口标题',\\n　tip:'输入提示',\\n　value:'输入初始值',\\n　msg:'窗口文本说明',\\n　imageUrl:'窗口显示图片的URL',\\n　imageHeight:200,\\n　qrcode:'生成二维码的URL',\\n　qrcodeSize:'300',\\n　initAction:'initAction',\\n　initValue:requestId,\\n　button:2,\\n　selectData:'1:=快速输入一,2:=快速输入二,3:=快速输入三'\\n}\",\n      多行编辑: 'type为edit。要求用户在一个多行编辑区输入单个字段内容的动作，JSON结构。',\n      多项输入: 'type为multiInput。要求用户输入多个字段（5个以内）的动作，JSON结构。建议使用“增强多项输入”动作。',\n      增强多项输入: 'type为multiInputX。要求用户输入多个字段（不限制个数）的动作，JSON结构。',\n      单项选择: 'type为menu。要求用户在列表中选择一个项目的动作，JSON结构。',\n      多项选择: 'type为select。要求用户在列表中选择多个项目的动作，JSON结构。',\n      消息弹窗: 'type为msgbox。弹出窗口显示消息，JSON结构。',\n      专项动作:\n        '专项动作为动态动作，接口让APP执行一些特定的行为动作。actionId值为行为特定的标识。__self_search__（源内搜索）、__detail__（详情页）、__ktvplayer__（KTV播放）、__refresh_list__（刷新列表）、__copy__（复制）、__keep__（保持窗口）。',\n      __self_search__:\n        '源内搜索。\\n\\n[#skey]：目标源key，可选，未设置或为空则使用当前源。\\n\\n[#name]：搜索分类名称。\\n\\n[#tid]：使用分类ID传递的搜索值。\\n\\n[#flag]：列表视图参数。\\n\\n[#folder]：多个分类切换搜索的配置，设置此项则忽略name、tid和flag。folder可多项合并设置为一个字符，各项间使用“#”分隔，每项中的name、tid和flag使用“$”分隔。floder也可使用JSON数组，每项分别设置name、tid和flag。',\n      __detail__: '跳转到指定站源解析详情页播放。\\n\\n[#skey]：目标源key。\\n\\n[#ids]：传递给详情页的视频ids。',\n      __ktvplayer__: '跳转到KTV播放器播放指定链接。\\n\\n[#name]：歌名。\\n\\n[#id]：歌曲的直链。',\n      __refresh_list__:\n        '刷新指定分类列表。listTab指定要刷新哪个分类的列表，不指定则刷新当前分类的列表。\\n\\n[#listTab]：分类列表的标识，可以是列表的序号、名称、分类ID（前面加“id:”）。',\n      __copy__: '把返回的内容复制到剪贴板。content：复制的内容',\n      __keep__: '保持窗口不关闭。\\n\\n[#msg]：更新窗口里的文本消息内容。\\n\\n[#reset]：窗口中的输入项目内容是否清空。',\n      图片坐标示例:\n        \"获取在图片点击的位置坐标用于验证输入的js示例。\\n　{\\n　　vod_id:　JSON.stringify({\\n　　　actionId:　'图片点击坐标',\\n　　　id:　'coord',\\n　　　type:　'input',\\n　　　title:　'图片点击坐标',\\n　　　tip:　'请输入图片中文字的坐标',\\n　　　value:　'',\\n　　　msg:　'点击图片上文字获取坐标',\\n　　　imageUrl:　'https://pic.imgdb.cn/item/667ce9f4d9c307b7e9f9d052.webp',\\n　　　imageHeight:　300,\\n　　　imageClickCoord:　true,\\n　　　button:　3,\\n　　}),\\n　　vod_name:　'图片点击坐标',\\n　　vod_pic:　'https://pic.imgdb.cn/item/667ce9f4d9c307b7e9f9d052.webp',\\n　　vod_tag:'action'\\n　}\",\n      多项输入示例:\n        \"多个不同类型输入项的js示例。\\n　{\\n　　vod_id:　JSON.stringify({\\n　　　actionId:　'多项输入',\\n　　　type:　'multiInputX',\\n　　　canceledOnTouchOutside:　true,\\n　　　title:　'多项输入(multiInputX)',\\n　　　width:　716,\\n　　　bottom:　1,\\n　　　dimAmount:　0.3,\\n　　　button:　3,\\n　　　input:　[\\n　　　　{\\n　　　　　id:　'item1',\\n　　　　　name:　'文件夹路径（文件夹选择器）',\\n　　　　　tip:　'请输入文件夹路径',\\n　　　　　value:　'',\\n　　　　　selectData:　'[folder]',\\n　　　　　inputType:　0,\\n　　　　},\\n　　　　{\\n　　　　　id:　'item2',\\n　　　　　name:　'日期（日期选择器）',\\n　　　　　tip:　'请输入项目2内容',\\n　　　　　value:　'',\\n　　　　　selectData:　'[calendar]',\\n　　　　　inputType:　0,\\n　　　　　\\n　　　　},\\n　　　　{\\n　　　　　id:　'item3',\\n　　　　　name:　'文件路径（文件选择器）',\\n　　　　　tip:　'请输入文件路径',\\n　　　　　value:　'',\\n　　　　　selectData:　'[file]',\\n　　　　　inputType:　0,\\n　　　　},\\n　　　　{\\n　　　　　id:　'item4',\\n　　　　　name:　'多项选择',\\n　　　　　tip:　'请输入多项内容，以“,”分隔',\\n　　　　　value:　'',\\n　　　　　selectData:　'[请选择字母]a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z',\\n　　　　　selectWidth:　640,\\n　　　　　multiSelect:　true,\\n　　　　　selectColumn:　4,\\n　　　　　inputType:　0,\\n　　　　},\\n　　　　{\\n　　　　　id:　'item5',\\n　　　　　name:　'多行输入',\\n　　　　　tip:　'请输入项目5内容',\\n　　　　　value:　'',\\n　　　　　multiLine:　5,\\n　　　　},\\n　　　　{\\n　　　　　id:　'item6',\\n　　　　　name:　'密码输入',\\n　　　　　tip:　'请输入项目6内容',\\n　　　　　value:　'',\\n　　　　　inputType:　129,\\n　　　　},\\n　　　　{\\n　　　　　id:　'item7',\\n　　　　　name:　'图像base64（图像文件选择器）',\\n　　　　　tip:　'请输入项目7内容',\\n　　　　　value:　'',\\n　　　　　selectData:　'[image]',\\n　　　　　multiLine:　3,\\n　　　　　inputType:　0,\\n　　　　},\\n　　　　{\\n　　　　　id:　'item8',\\n　　　　　name:　'单项选择',\\n　　　　　tip:　'请输入项目8内容',\\n　　　　　value:　'',\\n　　　　　selectData:　'[请选择地方]a,b,c,d'\\n　　　　},\\n　　　　{\\n　　　　　id:　'item9',\\n　　　　　name:　'单行输入并校验',\\n　　　　　tip:　'请输入项目9内容',\\n　　　　　value:　'',\\n　　　　　validation:　'[0-9]{6,12}',\\n　　　　}\\n　　　]\\n　　}),\\n　　vod_name:　'多项输入',\\n　　vod_tag:'action'\\n　}\",\n    },\n  },\n});\nconst visible = ref(false);\nconst config = ref<any>({});\n// const actRef = ref();\n\nconst handleAction = (key: string) => {\n  config.value = actions.value[key];\n  visible.value = true;\n};\n\n// const handleActionSubmit = () => {\n//   actRef.value?.submit();\n// };\n\nconst onActionSubmit = (id: string, data: Record<string, any>) => {\n  console.log(`Action submitted with ${id}:`, data);\n};\n</script>\n<style scoped>\n.view-component-container {\n  width: 100%;\n  height: 100%;\n  padding: 0 var(--td-comp-paddingLR-s) var(--td-comp-paddingTB-s) 0;\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/test/components/demo/index.vue",
    "content": "<template>\n  <div class=\"page\"></div>\n</template>\n<script setup lang=\"ts\"></script>\n<style scoped></style>\n"
  },
  {
    "path": "src/renderer/src/pages/test/components/editor/index.vue",
    "content": "<template>\n  <div class=\"test-editor view-component-container\">\n    <code-editor v-model=\"sourceCode\" :options=\"editConf\" class=\"code-box\" />\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\n\nimport type { IEditorOptions } from '@/components/code-editor';\nimport CodeEditor from '@/components/code-editor';\n\nconst sourceCode = ref('');\nconst editConf = ref<IEditorOptions['normal']>({\n  automaticLayout: true, // 自动布局\n  fixedOverflowWidgets: true, // 溢出小部件固定\n  folding: true, // 代码折叠\n  fontFamily: 'JetBrainsMono, monospace',\n  fontLigatures: false, // 连字符\n  insertSpaces: false, // 使用空格代替制表符\n  language: 'html',\n  minimap: { enabled: false },\n  overviewRulerBorder: false, // 概览标尺边框\n  readOnly: false,\n  roundedSelection: false, // 选区边框圆角\n  scrollBeyondLastLine: false, // 滚动到最后一行后禁止继续滚动\n  scrollbar: {\n    useShadows: false,\n    verticalScrollbarSize: 5,\n    horizontalScrollbarSize: 5,\n  },\n  smoothScrolling: true,\n  stickyScroll: { enabled: false },\n  tabSize: 2,\n  theme: 'vs-dark',\n  wordWrap: 'off',\n});\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  width: 100%;\n  height: 100%;\n  padding: 0 var(--td-comp-paddingLR-s) var(--td-comp-paddingTB-s) 0;\n  border-radius: var(--td-radius-medium);\n  overflow: hidden;\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/test/components/player/index.vue",
    "content": "<template>\n  <div class=\"test-player view-component-container\">\n    <div class=\"content\">\n      <multi-player ref=\"mseRef\" class=\"video\" @update-time=\"updateTime\">\n        <template #header>\n          <div>请勿相信视频中出现的任何广告</div>\n        </template>\n      </multi-player>\n\n      <div class=\"action\">\n        <t-space align=\"center\" size=\"small\" break-line>\n          <t-space align=\"center\" size=\"small\" break-line>\n            <t-input v-model=\"form.url\" label=\"链接\" clearable />\n            <t-input-number v-model=\"form.startTime\" :min=\"0\" :step=\"5\" label=\"起始\" theme=\"column\" auto-width />\n            <t-select v-model=\"form.next\" label=\"下集\" auto-width>\n              <t-option :value=\"true\" label=\"开\"></t-option>\n              <t-option :value=\"false\" label=\"关\"></t-option>\n            </t-select>\n            <t-select v-model=\"form.quality\" label=\"多画质\" auto-width>\n              <t-option :value=\"true\" label=\"开\"></t-option>\n              <t-option :value=\"false\" label=\"关\"></t-option>\n            </t-select>\n            <t-select v-model=\"form.type\" label=\"类型\" auto-width>\n              <t-option value=\"auto\" label=\"auto\"></t-option>\n              <t-option value=\"audio\" label=\"audio\"></t-option>\n              <t-option value=\"hls\" label=\"hls\"></t-option>\n              <t-option value=\"flv\" label=\"flv\"></t-option>\n              <t-option value=\"mp4\" label=\"mp4\"></t-option>\n              <t-option value=\"dash\" label=\"dash\"></t-option>\n              <t-option value=\"torrent\" label=\"torrent\"></t-option>\n            </t-select>\n            <t-select v-model=\"form.player\" label=\"播放器\" auto-width>\n              <t-option value=\"artplayer\" label=\"artplayer\"></t-option>\n              <t-option value=\"dplayer\" label=\"dplayer\"></t-option>\n              <t-option value=\"nplayer\" label=\"nplayer\"></t-option>\n              <t-option value=\"oplayer\" label=\"oplayer\"></t-option>\n              <t-option value=\"xgplayer\" label=\"xgplayer\"></t-option>\n            </t-select>\n            <t-button theme=\"default\" @click=\"createEvent\">创建</t-button>\n            <t-button theme=\"default\" @click=\"destroyEvent\">摧毁</t-button>\n          </t-space>\n\n          <t-space align=\"center\" size=\"small\">\n            <t-button theme=\"default\" @click=\"playEvent\">播放</t-button>\n            <t-button theme=\"default\" @click=\"pauseEvent\">暂停</t-button>\n            <t-button theme=\"default\" @click=\"togglePlayEvent\">播放/暂停</t-button>\n          </t-space>\n\n          <t-space align=\"center\" size=\"small\" break-line>\n            <span>音量</span>\n            <t-input-number v-model=\"form.volume\" :max=\"1\" :min=\"0\" :step=\"0.1\" :decimal-places=\"1\" theme=\"column\" />\n            <t-button theme=\"default\" @click=\"volumeEvent\">设置</t-button>\n            <t-button theme=\"default\" @click=\"getVolumeEvent\">获取</t-button>\n          </t-space>\n\n          <t-space align=\"center\" size=\"small\" break-line>\n            <span>静音</span>\n            <t-radio-group v-model=\"form.muted\" variant=\"default-filled\" @click=\"mutedEvent\">\n              <t-radio-button :value=\"true\">静音</t-radio-button>\n              <t-radio-button :value=\"false\">不静音</t-radio-button>\n            </t-radio-group>\n            <t-button theme=\"default\" @click=\"getMutedEvent\">获取</t-button>\n          </t-space>\n\n          <t-space align=\"center\" size=\"small\">\n            <span>进度</span>\n            <t-input-number v-model=\"form.seek\" :min=\"0\" :step=\"5\" :decimal-places=\"2\" theme=\"column\" />\n            <t-button theme=\"default\" @click=\"seekEvent\">设置</t-button>\n            <t-button theme=\"default\" @click=\"getSeekEvent\">获取</t-button>\n          </t-space>\n\n          <t-space align=\"center\" size=\"small\">\n            <span>倍速</span>\n            <t-input-number v-model=\"form.speed\" :max=\"2\" :min=\"0.5\" :step=\"0.25\" :decimal-places=\"2\" theme=\"column\" />\n            <t-button theme=\"default\" @click=\"speedEvent\">设置</t-button>\n            <t-button theme=\"default\" @click=\"getSpeedEvent\">获取</t-button>\n          </t-space>\n\n          <t-space align=\"center\" size=\"small\">\n            <span>弹幕</span>\n            <t-input v-model=\"form.barrageId\" />\n            <t-button label=\"后端标识\" theme=\"default\" @click=\"danmuLoadEvent('id')\">加载</t-button>\n            <t-input v-model=\"form.barrageCustom\" />\n            <t-button label=\"自定义\" theme=\"default\" @click=\"danmuLoadEvent('custom')\">加载</t-button>\n          </t-space>\n        </t-space>\n      </div>\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport axios from 'axios';\nimport { MessagePlugin } from 'tdesign-vue-next';\nimport { onMounted, ref } from 'vue';\n\nimport { fetchRecBarrage } from '@/api/film';\nimport { mediaUtils, MultiPlayer } from '@/components/multi-player';\nimport { emitterChannel } from '@/config/emitterChannel';\nimport emitter from '@/utils/emitter';\n\nconst mseRef = ref();\n\nconst form = ref({\n  player: 'artplayer',\n  startTime: 5,\n  next: true,\n  quality: false,\n  type: 'auto',\n  // url: 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-360p.mp4',\n  // url: 'http://static.smartisanos.cn/common/video/t1-ui.mp4',\n  url: 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/hls/xgplayer-demo.m3u8',\n  // url: 'https://voddemo-play.volcvod.com/10501b001bdd43ae89d7c0fc3d6792b5/main.m3u8?a=0&auth_key=1773925042-f0489f7ac9a14d92b96bbfb7b39a7a0d-0-4e57d65b22e9aefe63ba1c519218e9fe&br=966&bt=966&cd=0%7C0%7C0&ch=0&cr=0&cs=0&cv=1&dr=0&ds=4&er=0&l=2023032020544973DCCFE21CF4C02E38B1&lr=&mime_type=video_mp4&net=0&pl=0&qs=0&rc=amg6c2o0aTg6ZTQzNGRnM0ApOmZkZzg1PGVoNzhkOzxlZ2dfZy9gMHFrYTBgLS1kYy9zcy00L2JfL19eYF42Ly0vYi06Yw%3D%3D&vl=&vr=',\n  // url: 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/music/audio.mp3',\n  volume: 0.5,\n  seek: 10,\n  muted: false,\n  speed: 0.75,\n  barrageId: 'https://v.qq.com/x/cover/mzc00200xntoaip/a4101fjl3l1.html',\n  barrageCustom: 'https://dmku.hls.one/?ac=dm&url=https://v.qq.com/x/cover/mzc00200xntoaip/a4101fjl3l1.html',\n});\n\nonMounted(() => {\n  // tool();\n  // timer();\n});\n\n// @ts-expect-error declared but its value is never read\n// eslint-disable-next-line ts/no-unused-vars\nconst tool = async () => {\n  const checkTypeSuffix = await mediaUtils.checkMediaType(\n    'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-360p.mp4',\n  );\n  console.log('checkTypeSuffix', checkTypeSuffix);\n  const checkTypeContentType = await mediaUtils.checkMediaType(\n    'https://voddemo-play.volcvod.com/453b1f794dfa49f4819b5d923658411a?auth_key=1776913683-830c08a311bb49fab40dbaa90ebd4db3-0-1b61cbd491235c69d89a694bd51a1027',\n  );\n  console.log('checkTypeContentType', checkTypeContentType);\n  const headers = { 'multi-part': 'zyfun', 'user-agent': 'zy', host: 'zy.fun' };\n  console.log('origin-headers', headers);\n  const safeHeaders = mediaUtils.removeUnSafeHeaders(headers);\n  console.log('safe-headers', safeHeaders);\n  const urlHeaders = mediaUtils.convertStandardToUri('https://zy.fun', headers);\n  console.log('url-headers', urlHeaders);\n  const electronHeaders = mediaUtils.convertWebToElectron(headers);\n  console.log('electron-headers', electronHeaders);\n  const mime2ext = mediaUtils.getExtensionFromMime('video/mp4');\n  console.log('mime2ext', mime2ext);\n  const ext2mime = mediaUtils.getMimeFromExtension(mime2ext!);\n  console.log('ext2mime', ext2mime);\n  const pathExt = mediaUtils.getFileExtension(\n    'magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&dn=Sintel&tr=udp%3A%2F%2Fexplodie.org%3A6969&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.empire-js.us%3A1337&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=wss%3A%2F%2Ftracker.btorrent.xyz&tr=wss%3A%2F%2Ftracker.fastcast.nz&tr=wss%3A%2F%2Ftracker.openwebtorrent.com&ws=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2F&xs=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2Fsintel.torrent',\n  );\n  console.log('path2ext', pathExt);\n  const streamType = await mediaUtils.getStreamContentType(\n    'https://voddemo-play.volcvod.com/453b1f794dfa49f4819b5d923658411a?auth_key=1776913683-830c08a311bb49fab40dbaa90ebd4db3-0-1b61cbd491235c69d89a694bd51a1027',\n  );\n  console.log('streamType', streamType);\n  const streamType2Ext = await mediaUtils.getStreamContentTypeToExtension(\n    'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/hls/segment-0.ts',\n    {},\n  );\n  console.log('streamType2Ext', streamType2Ext);\n  const ext2decoder1 = mediaUtils.getDecoderFromExtension(pathExt);\n  console.log('ext2decoder1', ext2decoder1);\n  const ext2decoder2 = mediaUtils.getDecoderFromExtension(streamType2Ext!);\n  console.log('ext2decoder2', ext2decoder2);\n  const isHevc = mediaUtils.isHEVCVideoSupported();\n  console.log('isHevc', isHevc);\n  const isSafeHeaderStr = mediaUtils.isSafeHeader('cookie');\n  console.log('isSafeHeaderStr', isSafeHeaderStr);\n  const isSafeHeaderArr = mediaUtils.isSafeHeader(['cookie', 'user-agent']);\n  console.log('isSafeHeaderArr', isSafeHeaderArr);\n  const isSafeHeaderObj = mediaUtils.isSafeHeader({ xx: 'xx', yy: 'yy' });\n  console.log('isSafeHeaderObj', isSafeHeaderObj);\n};\n\n// @ts-expect-error declared but its value is never read\n// eslint-disable-next-line ts/no-unused-vars\nconst timer = () => {\n  // setTimeout();\n  const volumeList = [0.9, 0.5, 0.8, 0.2, 0.4];\n  const randomVolume = volumeList[Math.floor(Math.random() * volumeList.length)];\n\n  const platrateList = [0.5, 2, 1.5];\n  const randomPlatrate = platrateList[Math.floor(Math.random() * platrateList.length)];\n\n  setTimeout(() => {\n    console.log(`[3] pause + setVolume: ${randomVolume}`);\n    console.log('time', mseRef.value.time());\n    mseRef.value.pause();\n    mseRef.value.setVolume(randomVolume);\n    mseRef.value.onTimeUpdate();\n  }, 3000);\n\n  setTimeout(() => {\n    console.log(`[5] seek + muted + set rate: ${randomPlatrate}`);\n    mseRef.value.seek(3);\n    console.log('time', mseRef.value.time());\n    mseRef.value.setVolume(0);\n    mseRef.value.setPlaybackRate(randomPlatrate);\n  }, 5000);\n\n  setTimeout(async () => {\n    console.log('[8] play + reset');\n    console.log('volume-0', mseRef.value.volume());\n    console.log(`rate-${randomPlatrate}`, mseRef.value.playbackRate());\n    mseRef.value.play();\n    mseRef.value.setVolume(randomVolume);\n    mseRef.value.setPlaybackRate(0.5);\n  }, 8000);\n\n  setTimeout(async () => {\n    console.log('[10] togglePlay-stop');\n    mseRef.value.togglePlay();\n  }, 10000);\n\n  setTimeout(async () => {\n    console.log('[15] destroy');\n    console.log(`volume-${randomVolume}`, mseRef.value.volume());\n    console.log('rate-0.5', mseRef.value.playbackRate());\n    console.log('time', mseRef.value.time());\n    mseRef.value.destroy();\n  }, 15000);\n};\n\nconst updateTime = ({ currentTime, duration }) => {\n  console.debug(`current:${currentTime} - duration:${duration}`);\n};\n\nconst create = async () => {\n  const options: Record<string, any> = {\n    url: form.value.url,\n    isLive: false,\n    // autoplay: true,\n    type: form.value.type,\n    container: 'mse',\n    next: form.value.next,\n    headers: { 'multi-part': 'zyfun' },\n    startTime: form.value.startTime,\n  };\n  if (mseRef.value.instance()) {\n    options.headers = { 'multi-part': 'zyplayer' };\n    // options.headers = {};\n  }\n  if (form.value.quality) {\n    options.quality = [\n      {\n        name: '标清',\n        url: 'https://voddemo-play.volcvod.com/10501b001bdd43ae89d7c0fc3d6792b5/main.m3u8?a=0&auth_key=1773925042-f0489f7ac9a14d92b96bbfb7b39a7a0d-0-4e57d65b22e9aefe63ba1c519218e9fe&br=966&bt=966&cd=0%7C0%7C0&ch=0&cr=0&cs=0&cv=1&dr=0&ds=4&er=0&l=2023032020544973DCCFE21CF4C02E38B1&lr=&mime_type=video_mp4&net=0&pl=0&qs=0&rc=amg6c2o0aTg6ZTQzNGRnM0ApOmZkZzg1PGVoNzhkOzxlZ2dfZy9gMHFrYTBgLS1kYy9zcy00L2JfL19eYF42Ly0vYi06Yw%3D%3D&vl=&vr=',\n      },\n      {\n        name: '高清',\n        url: 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/hls/xgplayer-demo.m3u8',\n      },\n    ];\n  }\n\n  // options = {\n  //   ...options,\n  //   type: 'm3u8',\n  //   url: 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/hls/xgplayer-demo.m3u8',\n  // };\n\n  // options = {\n  //   ...options,\n  //   type: 'mpegts',\n  //   url: 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/hls/segment-0.ts',\n  // };\n\n  // options = {\n  //   ...options,\n  //   type: 'flv',\n  //   url: 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-720p.flv',\n  // };\n\n  // options = {\n  //   ...options,\n  //   type: 'dash',\n  //   url: 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/dash/xgplayer-demo-dash1.mpd',\n  // };\n\n  // options = {\n  //   ...options,\n  //   type: 'shaka',\n  //   url: 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/dash/xgplayer-demo-dash1.mpd',\n  // };\n\n  // options = {\n  //   ...options,\n  //   type: 'torrent',\n  //   url: 'magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&dn=Sintel&tr=udp%3A%2F%2Fexplodie.org%3A6969&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.empire-js.us%3A1337&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=wss%3A%2F%2Ftracker.btorrent.xyz&tr=wss%3A%2F%2Ftracker.fastcast.nz&tr=wss%3A%2F%2Ftracker.openwebtorrent.com&ws=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2F&xs=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2Fsintel.torrent',\n  // };\n\n  await mseRef.value.create(options, form.value.player);\n};\n\nconst danmuLoadEvent = async (type: string) => {\n  const LOCAL_DANMU = [\n    [20.22, 'right', '#fff', '32px', '测试乱序: 乱序第一条, 时间应该最后一条'],\n    ['15', 'right', '#fff', '32px', '看完五哈马上来跑男报到'],\n    [15, 'right', '#67c84e', '32px', '测试时间: 2025-06-14'],\n    ['15.25', 'bottom', '#67c84e', '32px', '测试位置: bottom'],\n    ['15.5', 'top', '#67c84eff', '32px', '测试位置: top'],\n    ['15.75', 'right', '#67c84e6f', '32px', '测试位置: right'],\n    ['16', 'left', '#67c', '32px', '测试位置: left'],\n    ['16.5', 'right', '#165aed', '32px', '测试颜色: #165aed'],\n    ['16.7', 'right', '#165aed7f', '32px', '测试透明度: #165aed7f'],\n    ['16.9', 'right', '#165aed7f', '50px', '测试字体: 50px'],\n    [17, 'right', '#c3cad6e5', '32px', '测试日文: 君だよ 君なんだよ  教えてくれた'],\n    [17.25, 'right', '#fff', '32px', '测试中文: 周深周深周深周深周深啊啊啊啊'],\n    [17.5, 'right', '#fff', '32px', '测试英文: Johnny!!!!!!!'],\n    [17.55, 'right', '#fff', '32px', `测试特殊字符半角: !@#$%^&*()_+-={}[]\\|;:''\"\"<>,./?`],\n    [17.55, 'right', '#fff', '32px', '测试特殊字符全角: ～！@#¥%……&*（—-=）【】、；‘’，。/？《》“”；「」｜、'],\n    ['17.667', 'bottom', '#f5712c', '32px', '测试炮火模式: 好听+1'],\n    ['17.667', 'bottom', '#f5712c', '32px', '测试炮火模式: 好听+1'],\n    ['17.667', 'bottom', '#f5712c', '32px', '测试炮火模式: 好听+1'],\n    ['17.667', 'bottom', '#f5712c', '32px', '测试炮火模式: 好听+1'],\n    ['17.68', 'right', '#f5712c', '32px', '测试emoji: 😄😭🤣😮‍💨😅😯'],\n    [17.782, 'left', '#533d816f', '32px', 'sayaka~'],\n    [17.99, 'right', '#fff', '32px', '听了好多次了'],\n    [19, 'right', '#fff', '32px', 'ending~~~~~~~~~'],\n  ];\n\n  const normalizeRawDanmu = (list) =>\n    list.map(([t, type, color, _size, text]) => ({\n      id: `local-${Math.random().toString(16).slice(2)}`,\n      time: Number.parseFloat(String(t)),\n      type,\n      color,\n      text,\n    }));\n\n  let danmuList = normalizeRawDanmu(LOCAL_DANMU);\n\n  try {\n    if (type === 'id' && form.value.barrageId) {\n      const response = await fetchRecBarrage({ id: form.value.barrageId });\n      if (Array.isArray(response?.list) && response.list.length) danmuList = response.list;\n    } else if (type === 'custom' && form.value.barrageCustom) {\n      const response = await axios.get(form.value.barrageCustom);\n      if (Array.isArray(response.data.danmuku) && response.data.danmuku.length)\n        danmuList = normalizeRawDanmu(response.data.danmuku);\n    }\n  } catch {}\n\n  mseRef.value.barrage(danmuList, '7ecb27c9c53cf3aa');\n};\n\nconst destroyEvent = () => {\n  mseRef.value.destroy();\n};\n\nconst seekEvent = () => {\n  mseRef.value.seek(form.value.seek);\n};\n\nconst getSeekEvent = () => {\n  const time = mseRef.value.time();\n  MessagePlugin.info(`当前时间: ${time.currentTime} - 总时长: ${time.duration}`);\n};\n\nconst speedEvent = () => {\n  mseRef.value.setPlaybackRate(form.value.speed);\n};\n\nconst getSpeedEvent = () => {\n  const rate = mseRef.value.playbackRate();\n  MessagePlugin.info(`当前倍速: ${rate}`);\n};\n\nconst volumeEvent = () => {\n  mseRef.value.setVolume(form.value.volume);\n};\n\nconst getVolumeEvent = () => {\n  const volume = mseRef.value.volume();\n  MessagePlugin.info(`当前音量: ${volume}`);\n};\n\nconst mutedEvent = () => {\n  mseRef.value.setMuted(form.value.muted);\n};\nconst getMutedEvent = () => {\n  const muted = mseRef.value.muted();\n  form.value.muted = muted;\n  MessagePlugin.info(`当前静音状态: ${muted}`);\n};\n\nconst createEvent = () => {\n  // xgplayer artplayer dplayer nplayer oplayer\n  create();\n};\n\nconst playEvent = () => {\n  mseRef.value.play();\n};\n\nconst pauseEvent = () => {\n  mseRef.value.pause();\n};\n\nconst togglePlayEvent = () => {\n  mseRef.value.togglePlay();\n};\n\nemitter.on(emitterChannel.COMP_MULTI_PLAYER_PLAYNEXT, ({ data: _eventData }) => {\n  MessagePlugin.info('播放下集事件触发');\n});\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  width: 100%;\n  height: 100%;\n  padding: 0 var(--td-comp-paddingLR-s) var(--td-comp-paddingTB-s) 0;\n\n  .content {\n    width: 100%;\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n\n    .video {\n      height: 100%;\n      width: 100%;\n      flex: 1;\n      border-radius: var(--td-radius-medium);\n    }\n\n    .action {\n      flex-shrink: 0;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/test/components/webview/index.vue",
    "content": "<template>\n  <div class=\"webview-console view-component-container\">\n    <div class=\"header\">\n      <div class=\"router-control\">\n        <t-button theme=\"default\" shape=\"square\" class=\"btn\" @click=\"handleWebviewRouter('back')\">\n          <template #icon><chevron-left-icon /></template>\n        </t-button>\n\n        <t-button theme=\"default\" shape=\"square\" class=\"btn\" @click=\"handleWebviewRouter('forward')\">\n          <template #icon><chevron-right-icon /></template>\n        </t-button>\n\n        <t-button theme=\"default\" shape=\"square\" class=\"btn\" @click=\"handleWebviewRouter('refresh')\">\n          <template #icon><rotate-icon /></template>\n        </t-button>\n      </div>\n\n      <t-input v-model=\"currentUrl\" class=\"url-input\" @enter=\"handleLoadUrl\" />\n\n      <t-button theme=\"default\" class=\"btn\" @click=\"handleWebviewRouter('devTools')\">\n        <template #icon><bug-icon /></template>\n      </t-button>\n    </div>\n\n    <div class=\"container\">\n      <div class=\"content-wrapper\">\n        <webview-container ref=\"webviewRef\" appid=\"demo\" :on-navigate-callback=\"onNavigateCallback\" />\n      </div>\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { BugIcon, ChevronLeftIcon, ChevronRightIcon, RotateIcon } from 'tdesign-icons-vue-next';\nimport { ref } from 'vue';\n\nimport WebviewContainer from '@/components/webview/index.vue';\n\nconst currentUrl = ref('about:blank');\nconst webviewRef = ref<typeof WebviewContainer | null>(null);\n\nconst handleWebviewRouter = (type: 'back' | 'forward' | 'refresh' | 'devTools') => {\n  const webview = webviewRef.value;\n  if (!webview) return;\n\n  const helpers = {\n    back: () => {\n      if (webview.canGoBack()) webview.goBack();\n    },\n    forward: () => {\n      if (webview.canGoForward()) webview.goForward();\n    },\n    refresh: () => {\n      webview.reload();\n    },\n    devTools: () => {\n      webview.openDevTools();\n    },\n  };\n\n  helpers?.[type]?.();\n};\n\nconst handleLoadUrl = () => {\n  const url = currentUrl.value;\n  webviewRef.value?.loadUrl(url);\n};\n\nconst onNavigateCallback = (_appid: string, url: string) => {\n  currentUrl.value = url;\n};\n</script>\n<style lang=\"less\" scoped>\n.view-component-container {\n  width: 100%;\n  height: 100%;\n  padding: 0 var(--td-comp-paddingLR-s) var(--td-comp-paddingTB-s) 0;\n  display: flex;\n  flex-direction: column;\n  gap: var(--td-size-4);\n\n  .header {\n    width: 100%;\n    display: flex;\n    gap: var(--td-comp-margin-s);\n\n    .router-control {\n      display: flex;\n      align-items: center;\n      border-radius: var(--td-radius-medium);\n      background-color: var(--td-border-level-1-color);\n\n      .btn {\n        background: transparent;\n        border-width: 0;\n\n        &.t-is-disabled {\n          color: var(--td-text-color-placeholder);\n        }\n\n        &:not(.t-is-disabled, .t-button--ghost) {\n          &:hover {\n            background: var(--td-bg-color-component-hover);\n          }\n        }\n      }\n    }\n\n    .navigation-controls {\n      display: flex;\n      justify-content: space-around;\n      align-items: center;\n      background-color: var(--td-border-level-1-color);\n      border-radius: var(--td-radius-medium);\n\n      .btn {\n        background: transparent;\n        border-width: 0;\n\n        &.t-is-disabled {\n          color: var(--td-text-color-placeholder);\n        }\n\n        &:not(.t-is-disabled, .t-button--ghost) {\n          &:hover {\n            background: var(--td-bg-color-component-hover);\n            border-color: var(--td-bg-color-component-hover);\n          }\n        }\n      }\n    }\n  }\n\n  .container {\n    flex: 1;\n    height: 100%;\n    width: 100%;\n    -webkit-app-region: no-drag;\n\n    .content-wrapper {\n      height: 100%;\n      width: 100%;\n      border-radius: var(--td-radius-medium);\n      background: var(--td-border-level-1-color);\n      overflow: hidden;\n      -webkit-app-region: no-drag;\n\n      .webview {\n        height: 100%;\n        width: 100%;\n        -webkit-app-region: no-drag;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/pages/test/index.vue",
    "content": "<template>\n  <div class=\"lab view-container\">\n    <common-nav :list=\"componentNav\" :active=\"active.nav\" class=\"sidebar\" @change=\"onNavChange\" />\n\n    <div class=\"content\">\n      <div class=\"container\">\n        <keep-alive>\n          <component :is=\"currentComponent\" class=\"content-wrapper\"></component>\n        </keep-alive>\n      </div>\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { computed, defineAsyncComponent, ref, shallowRef } from 'vue';\n\nimport CommonNav from '@/components/common-nav/index.vue';\n\nconst componentMap = {\n  action: defineAsyncComponent(() => import('./components/action/index.vue')),\n  player: defineAsyncComponent(() => import('./components/player/index.vue')),\n  editor: defineAsyncComponent(() => import('./components/editor/index.vue')),\n  webview: defineAsyncComponent(() => import('./components/webview/index.vue')),\n  demo: defineAsyncComponent(() => import('./components/demo/index.vue')),\n};\n\nconst componentNav = computed(() => [\n  { id: 'action', name: '动作面板' },\n  { id: 'player', name: '播放器' },\n  { id: 'editor', name: '编辑器' },\n  { id: 'webview', name: '网页视图' },\n  { id: 'demo', name: '演示' },\n]);\n\nconst active = ref({\n  nav: 'action',\n});\n\nconst currentComponent = shallowRef(componentMap[Object.keys(componentMap)[0]]);\n\nconst onNavChange = (item: string) => {\n  active.value.nav = item;\n\n  if (Object.hasOwn(componentMap, item)) {\n    currentComponent.value = componentMap[item];\n  }\n};\n</script>\n<style lang=\"less\" scoped>\n.view-container {\n  height: 100%;\n  width: 100%;\n  display: flex;\n  flex-direction: row;\n  gap: var(--td-size-4);\n\n  .sidebar {\n    flex-grow: 0;\n    flex-shrink: 0;\n  }\n\n  .content {\n    height: 100%;\n    width: 100%;\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: var(--td-size-4);\n    overflow: hidden;\n\n    .container {\n      flex: 1;\n      height: 100%;\n      width: 100%;\n\n      .content-wrapper {\n        width: 100%;\n        height: 100%;\n        position: relative;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "src/renderer/src/router/index.ts",
    "content": "import type { RouteRecordRaw } from 'vue-router';\nimport { createRouter, createWebHashHistory } from 'vue-router';\n\n// 导入homepage相关固定路由\nconst homepageModules = import.meta.glob('./modules/**/homepage.ts', { eager: true });\n\n// 其他固定路由\nconst defaultRouterList: Array<any> = [];\n\n// 存放固定路由\nexport const homepageRouterList: Array<RouteRecordRaw> = mapModuleRouterList(homepageModules);\n\nexport const allRoutes = [...homepageRouterList, ...defaultRouterList];\n\n// 固定路由模块转换为路由\n// 关于单层路由，meta 中设置 { single: true } 即可为单层路由，{ hidden: true } 即可在侧边栏隐藏该路由\nexport function mapModuleRouterList(modules: Record<string, unknown>): Array<RouteRecordRaw> {\n  const routerList: Array<RouteRecordRaw> = [];\n  Object.keys(modules).forEach((key) => {\n    // @ts-expect-error 类型“{}”上不存在属性“default”。ts(2339)\n    const mod = modules[key]?.default || {};\n    const modList = Array.isArray(mod) ? [...mod] : [mod];\n    routerList.push(...modList);\n  });\n  return routerList;\n}\n\nexport const getActive = (maxLevel: number = 4): string => {\n  // 非组件内调用必须通过Router实例获取当前路由\n  const route = router.currentRoute.value;\n\n  if (!route.path) {\n    return '';\n  }\n\n  return route.path\n    .split('/')\n    .filter((_item: string, index: number) => index <= maxLevel && index > 0)\n    .map((item: string) => `/${item}`)\n    .join('');\n};\n\nconst router = createRouter({\n  history: createWebHashHistory(),\n  routes: allRoutes,\n  scrollBehavior() {\n    return {\n      el: '#app',\n      top: 0,\n      behavior: 'smooth',\n    };\n  },\n});\n\nexport default router;\n"
  },
  {
    "path": "src/renderer/src/router/modules/homepage.ts",
    "content": "import Layout from '@/layouts/index.vue';\nimport { isProd } from '@/utils/systeminfo';\n\nexport default [\n  {\n    path: '/',\n    name: 'Base',\n    redirect: '/film',\n    component: Layout,\n    children: [\n      {\n        path: 'film',\n        name: 'Film',\n        meta: {\n          title: {\n            'zh-CN': '影视',\n            'zh-TW': '影視',\n            'en-US': 'Film',\n          },\n          icon: 'movie-clapper',\n        },\n        component: () => import('@/pages/film/index.vue'),\n      },\n      {\n        path: 'live',\n        name: 'Live',\n        meta: {\n          title: {\n            'zh-CN': '直播',\n            'zh-TW': '直播',\n            'en-US': 'Live',\n          },\n          icon: 'tv-1',\n        },\n        component: () => import('@/pages/live/index.vue'),\n      },\n      {\n        path: 'parse',\n        name: 'Parse',\n        meta: {\n          title: {\n            'zh-CN': '解析',\n            'zh-TW': '解析',\n            'en-US': 'Parse',\n          },\n          icon: 'view-in-ar',\n        },\n        component: () => import('@/pages/parse/index.vue'),\n      },\n      {\n        path: 'moment',\n        name: 'Moment',\n        meta: {\n          title: {\n            'zh-CN': '过刻',\n            'zh-TW': '過刻',\n            'en-US': 'Moment',\n          },\n          icon: 'compass',\n        },\n        component: () => import('@/pages/moment/index.vue'),\n      },\n      {\n        path: 'test',\n        name: 'Test',\n        meta: {\n          title: {\n            'zh-CN': '测试',\n            'zh-TW': '測試',\n            'en-US': 'Test',\n          },\n          icon: 'fill-color-1',\n          hidden: isProd,\n        },\n        component: () => import('@/pages/test/index.vue'),\n      },\n      {\n        path: 'lab',\n        name: 'Lab',\n        meta: {\n          title: {\n            'zh-CN': '实验室',\n            'zh-TW': '實驗室',\n            'en-US': 'Lab',\n          },\n          icon: 'extension',\n          position: 'bottom',\n        },\n        component: () => import('@/pages/lab/index.vue'),\n      },\n      {\n        path: 'setting',\n        name: 'Setting',\n        meta: {\n          title: {\n            'zh-CN': '设置',\n            'zh-TW': '設置',\n            'en-US': 'Setting',\n          },\n          icon: 'setting-1',\n          position: 'bottom',\n        },\n        component: () => import('@/pages/setting/index.vue'),\n      },\n    ],\n  },\n  {\n    path: '/player',\n    name: 'Player',\n    meta: {\n      title: {\n        'zh-CN': '播放',\n        'zh-TW': '播放',\n        'en-US': 'Play',\n      },\n      icon: 'play-circle-stroke',\n      hidden: true,\n    },\n    component: () => import('@/pages/player/index.vue'),\n  },\n  {\n    path: '/browser',\n    name: 'Browser',\n    meta: {\n      title: {\n        'zh-CN': '浏览',\n        'zh-TW': '瀏覽',\n        'en-US': 'Browse',\n      },\n      icon: 'logo-chrome',\n      hidden: true,\n    },\n    component: () => import('@/pages/browser/index.vue'),\n  },\n];\n"
  },
  {
    "path": "src/renderer/src/store/index.ts",
    "content": "import { createPinia } from 'pinia';\nimport { createPersistedState } from 'pinia-plugin-persistedstate';\nimport { PiniaSharedState } from 'pinia-shared-state';\n\nconst store = createPinia();\nstore.use(createPersistedState({ auto: true }));\nstore.use(PiniaSharedState({ type: 'native' }));\n\nexport { store };\n\nexport * from './modules/browser';\nexport * from './modules/player';\nexport * from './modules/setting';\n\nexport default store;\n"
  },
  {
    "path": "src/renderer/src/store/modules/browser.ts",
    "content": "import { cloneDeep } from 'es-toolkit';\nimport type { PiniaPluginContext } from 'pinia';\nimport { defineStore } from 'pinia';\n\nimport type { IBrowser, IBrowserItem } from '@/config/browser';\nimport BROWSER_CONFIG from '@/config/browser';\nimport { store } from '@/store';\n\nconst state: IBrowser = cloneDeep(BROWSER_CONFIG);\n\nexport const useBrowserStore = defineStore('browser', {\n  state: () => state,\n  getters: {},\n  actions: {\n    open(doc: IBrowserItem) {\n      const upsert = (list: IBrowserItem[], limit: number, mode: 'push' | 'unshift' = 'push') => {\n        const idx = list.findIndex((item) => item.id === doc.id);\n        if (idx !== -1) list.splice(idx, 1);\n        else if (list.length >= limit) list.pop();\n\n        mode === 'push' ? list.push(doc) : list.unshift(doc);\n      };\n\n      upsert(this.history, 30, 'unshift');\n      upsert(this.tabs, 10, 'push');\n\n      this.activeTab = doc.id;\n    },\n    close(id: string) {\n      const index = this.tabs.findIndex((item) => item.id === id);\n      if (index >= 0) this.tabs.splice(index, 1);\n    },\n    update(doc: IBrowserItem) {\n      const updateById = (list: IBrowserItem[]) => {\n        const idx = list.findIndex((i) => i.id === doc.id);\n        if (idx !== -1) list.splice(idx, 1, doc);\n      };\n\n      updateById(this.tabs);\n      updateById(this.history);\n    },\n    clear(type: 'tabs' | 'history' | 'all' = 'all') {\n      if (type === 'tabs' || type === 'all') {\n        this.tabs = [];\n      }\n      if (type === 'history' || type === 'all') {\n        this.history = [];\n      }\n    },\n\n    getDetail(id: string | number, type: 'id' | 'idx' = 'id') {\n      return type === 'idx' ? this.tabs[id as number] : (this.tabs.find((item) => item.id === id) ?? null);\n    },\n    isHasTab(id: string) {\n      return this.tabs.some((item) => item.id === id);\n    },\n    getTabIndex(id: string) {\n      return this.tabs.findIndex((item) => item.id === id);\n    },\n  },\n  persist: {\n    beforeHydrate: (context: PiniaPluginContext) => {\n      const key = context.store.$id;\n      const state = context.store.$state;\n\n      if (!localStorage.getItem(key)) {\n        localStorage.setItem(key, JSON.stringify(state));\n      }\n    },\n  },\n});\n\nexport function getBrowserStore() {\n  return useBrowserStore(store);\n}\n"
  },
  {
    "path": "src/renderer/src/store/modules/player.ts",
    "content": "import { cloneDeep } from 'es-toolkit';\nimport type { PiniaPluginContext } from 'pinia';\nimport { defineStore } from 'pinia';\n\nimport type { IStorePlayer } from '@/config/player';\nimport PLAY_CONFIG from '@/config/player';\nimport { store } from '@/store';\n\nconst state: IStorePlayer = cloneDeep(PLAY_CONFIG);\n\nexport const usePlayerStore = defineStore('play', {\n  state: () => state,\n  getters: {},\n  actions: {\n    updateConfig(payload: Partial<IStorePlayer>) {\n      for (const key in payload) {\n        if (payload[key] !== undefined) {\n          this[key] = payload[key];\n        }\n      }\n    },\n  },\n  persist: {\n    beforeHydrate: (context: PiniaPluginContext) => {\n      const key = context.store.$id;\n      const state = context.store.$state;\n\n      if (!localStorage.getItem(key)) {\n        localStorage.setItem(key, JSON.stringify(state));\n      }\n    },\n  },\n});\n\nexport function getPlayStore() {\n  return usePlayerStore(store);\n}\n"
  },
  {
    "path": "src/renderer/src/store/modules/setting.ts",
    "content": "import { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport type { IThemeWithoutSystem } from '@shared/config/theme';\nimport { THEME } from '@shared/config/theme';\nimport type { ILangWithoutSystem } from '@shared/locales';\nimport { defaultLocale } from '@shared/locales';\nimport { usePreferredDark, usePreferredLanguages } from '@vueuse/core';\nimport { cloneDeep } from 'es-toolkit';\nimport type { PiniaPluginContext } from 'pinia';\nimport { defineStore } from 'pinia';\n\nimport type { IStoreSetting } from '@/config/setting';\nimport SYSTEM_CONFIG from '@/config/setting';\nimport i18n, { langCode } from '@/locales';\nimport { store } from '@/store';\n\nconst state: IStoreSetting = cloneDeep(SYSTEM_CONFIG);\n\nexport const useSettingStore = defineStore('setting', {\n  state: () => state,\n  getters: {\n    displayTheme: (state): IThemeWithoutSystem => {\n      let theme = state.theme;\n\n      if (theme === THEME.SYSTEM) {\n        const isDark = usePreferredDark();\n        theme = isDark.value ? THEME.DARK : THEME.LIGHT;\n      }\n\n      return theme;\n    },\n    displayLang: (state): ILangWithoutSystem => {\n      let lang = state.lang;\n\n      if (lang === 'system') {\n        const languages = usePreferredLanguages();\n        lang = languages.value[0] as ILangWithoutSystem;\n      }\n\n      lang = langCode.includes(lang) ? lang : defaultLocale;\n\n      return lang;\n    },\n    isCHS: (state): boolean => {\n      let lang = state.lang;\n\n      if (lang === 'system') {\n        const languages = usePreferredLanguages();\n        lang = languages.value[0] as ILangWithoutSystem;\n      }\n\n      lang = langCode.includes(lang) ? lang : defaultLocale;\n\n      return lang === 'zh-CN';\n    },\n  },\n  actions: {\n    changePreferredTheme() {\n      const theme = this.displayTheme;\n\n      document.documentElement.setAttribute('theme-mode', theme);\n    },\n    changePreferredLang() {\n      const lang = this.displayLang;\n\n      i18n.global.locale.value = lang;\n      document.documentElement.setAttribute('lang', lang);\n\n      window.electron.ipcRenderer.invoke(IPC_CHANNEL.CHANGE_LANG, lang);\n    },\n    changePreferredZoom() {\n      const zoom = this.zoom;\n\n      window.electron.ipcRenderer.invoke(IPC_CHANNEL.CHANGE_ZOOM, zoom);\n    },\n    changePreferredBossKey() {\n      const bossKey = this.bossKey;\n\n      window.electron.ipcRenderer.invoke(\n        IPC_CHANNEL.SHORTCUT_REGISTER,\n        'bossKey',\n        { type: 'global', shortcut: bossKey, handler: 'bossKey' },\n        true,\n      );\n    },\n    updateConfig(payload: Partial<IStoreSetting>) {\n      for (const key in payload) {\n        if (payload[key] !== undefined) {\n          this[key] = payload[key];\n        }\n\n        if (key === 'theme') {\n          this.changePreferredTheme();\n        }\n        if (key === 'lang') {\n          this.changePreferredLang();\n        }\n        if (key === 'zoom') {\n          this.changePreferredZoom();\n        }\n        if (key === 'bossKey') {\n          this.changePreferredBossKey();\n        }\n      }\n    },\n  },\n  persist: {\n    beforeHydrate: (context: PiniaPluginContext) => {\n      const key = context.store.$id;\n      const state = context.store.$state;\n\n      if (!localStorage.getItem(key)) {\n        localStorage.setItem(key, JSON.stringify(state));\n      }\n    },\n  },\n});\n\nexport function getSettingStore() {\n  return useSettingStore(store);\n}\n"
  },
  {
    "path": "src/renderer/src/style/base.less",
    "content": "/* Native style\n   ========================================================================== */\n\npre {\n  font-family: var(--td-font-family-code);\n}\n\n::-webkit-scrollbar {\n  width: var(--td-size-4) !important;\n  height: var(--td-size-4) !important;\n  background: transparent !important;\n}\n\n::-webkit-scrollbar-thumb {\n  border-radius: var(--td-radius-medium) !important;\n  border: var(--td-size-1) solid transparent !important;\n  background-clip: content-box !important;\n  background-color: var(--td-scrollbar-color) !important;\n}\n\n/* Components style\n   ========================================================================== */\n\n// message\n.t-message {\n  border-radius: var(--td-radius-round);\n\n  &.t-is-closable {\n    .t-message__close {\n      margin-left: var(--td-comp-margin-s);\n    }\n  }\n\n  &.t-is-info > .t-icon,\n  &.t-is-info .t-loading {\n    color: var(--td-brand-color-blue);\n  }\n}\n\n// alert\n.t-alert {\n  padding: var(--td-comp-paddingTB-s) var(--td-comp-paddingLR-s);\n\n  &--info {\n    background-color: var(--td-brand-color-blue-focus);\n\n    .t-alert__icon {\n      color: var(--td-brand-color-blue);\n    }\n  }\n}\n\n// qrcode\n.t-qrcode {\n  background-color: var(--td-bg-color-component) !important;\n  border: none;\n  padding: var(--td-comp-paddingTB-s) var(--td-comp-paddingLR-s);\n\n  &.t-borderless {\n    background-color: transparent !important;\n    padding: 0;\n  }\n\n  & > canvas,\n  & > svg {\n    border-radius: var(--td-radius-default);\n    width: 100%;\n    height: 100%;\n  }\n}\n\n// #tdesign-message-container--top::part(t-message__list) {\n//   .t-message {\n//     border-radius: var(--td-radius-round);\n//   }\n// }\n\n// input\n.t-input {\n  border-radius: var(--td-radius-medium);\n  border-color: var(--td-bg-color-component);\n  background-color: var(--td-bg-color-component);\n\n  &--focused {\n    box-shadow: none !important;\n  }\n\n  &.t-is-readonly {\n    background-color: var(--td-bg-color-component);\n  }\n}\n\n.t-input-number {\n  &.t-is-controls-right {\n    .t-input {\n      border-radius: var(--td-radius-medium);\n      background-color: var(--td-bg-color-component);\n    }\n\n    .t-input-number__increase {\n      border-top-right-radius: calc(var(--td-radius-medium) - 1px);\n    }\n\n    .t-input-number__decrease {\n      border-bottom-right-radius: calc(var(--td-radius-medium) - 1px);\n    }\n  }\n\n  &.t-input-number--normal {\n    border-radius: var(--td-radius-medium);\n  }\n}\n\n.t-input-adornment {\n  > :first-child,\n  > :first-child .t-input,\n  > :first-child .t-input-adornment__text,\n  > :first-child .t-textarea__inner {\n    border-radius: var(--td-radius-medium) 0 0 var(--td-radius-medium);\n  }\n\n  > :last-child,\n  > :last-child .t-input,\n  > :last-child .t-input-adornment__text,\n  > :last-child .t-textarea__inner {\n    border-radius: 0 var(--td-radius-medium) var(--td-radius-medium) 0;\n  }\n}\n\n.t-tag-input {\n  border-radius: var(--td-radius-medium);\n\n  .t-tag {\n    border-radius: var(--td-radius-medium);\n  }\n\n  .t-tag--default {\n    background-color: var(--td-bg-color-component-hover);\n  }\n}\n\n// textarea\n.t-textarea {\n  textarea {\n    border-radius: var(--td-radius-medium);\n    border-color: var(--td-bg-color-component);\n    background-color: var(--td-bg-color-component);\n  }\n\n  &__inner {\n    &:focus {\n      box-shadow: none !important;\n    }\n  }\n}\n\n// radio-group\n.t-radio-group {\n  &.t-radio-group--filled {\n    border-radius: var(--td-radius-medium);\n  }\n\n  &.t-size-m {\n    .t-radio-button {\n      padding: var(--td-comp-paddingTB-xs) var(--td-comp-paddingLR-s);\n    }\n  }\n}\n\n// checkbox\n.t-checkbox {\n  .t-checkbox__input {\n    border-radius: var(--td-radius-medium);\n\n    --ripple-color: transparent;\n  }\n}\n\n// button\n.t-button {\n  border-radius: var(--td-radius-medium);\n\n  &:not(.t-is-disabled, .t-button--ghost) {\n    --ripple-color: transparent !important;\n  }\n}\n\n// back-top\n.t-back-top {\n  border: none;\n\n  &--theme-light {\n    background-color: var(--td-bg-color-component);\n\n    &:hover {\n      background-color: var(--td-bg-color-secondarycontainer-hover);\n    }\n  }\n}\n\n// image\n.t-image__wrapper {\n  background: transparent;\n}\n\n// collapse\n.t-collapse {\n  border-radius: var(--td-radius-medium);\n  border-bottom: solid 1px var(--td-component-border);\n  overflow: hidden;\n\n  .t-collapse-panel__wrapper {\n    .t-collapse-panel__header {\n      padding: var(--td-comp-paddingTB-xs) var(--td-comp-paddingTB-s);\n      background: var(--td-bg-color-component);\n      border: 1px solid var(--td-bg-color-component);\n\n      .t-collapse-panel__icon {\n        &:hover {\n          background: transparent;\n        }\n      }\n    }\n\n    .t-collapse-panel__body {\n      background: transparent;\n      border-top: solid 1px var(--td-component-border);\n    }\n\n    .t-collapse-panel__content {\n      padding: var(--td-comp-paddingTB-s) var(--td-comp-paddingLR-s);\n    }\n  }\n\n  .t-collapse-panel:last-child {\n    .t-collapse-panel__body {\n      border-bottom: none;\n    }\n  }\n}\n\n// table\n.t-table {\n  background-color: transparent;\n\n  > div:first-child {\n    position: absolute;\n  }\n\n  .t-table__pagination-wrap {\n    .t-table__pagination {\n      .t-pagination__select {\n        margin-right: var(--td-comp-margin-s);\n      }\n\n      .t-input-number {\n        .t-input {\n          border-radius: var(--td-radius-default);\n        }\n      }\n\n      .t-pagination__jump {\n        margin-left: 0;\n        border-radius: var(--td-radius-medium);\n      }\n    }\n  }\n}\n\n// tabs\n.t-tabs__nav-item {\n  &-wrapper {\n    --ripple-color: transparent;\n  }\n}\n\n// menu\n.t-default-menu {\n  .t-menu__item {\n    --ripple-color: transparent;\n  }\n}\n\n// dropdown\n.t-dropdown {\n  &__item {\n    border-radius: var(--td-radius-medium);\n\n    --ripple-color: transparent;\n  }\n\n  .t-popup__content& {\n    padding: 0;\n  }\n}\n\n// popup\n.t-popup__content {\n  border: none;\n}\n\n// divider\n.t-divider--vertical {\n  margin: 0 var(--td-comp-margin-s);\n}\n\n// transfer\n.t-transfer {\n  background-color: var(--td-bg-color-component);\n  border-radius: var(--td-radius-medium);\n  width: 100%;\n\n  &__search-wrapper {\n    .t-input__wrap {\n      .t-input {\n        border-color: var(--td-border-level-2-color);\n      }\n    }\n  }\n\n  &__list {\n    width: calc((100% - var(--td-comp-size-xs)) / 2);\n  }\n\n  &__list-source,\n  &__list-target {\n    border-color: transparent;\n  }\n\n  &__operations {\n    margin: auto;\n    width: var(--td-comp-size-xs);\n  }\n\n  &__list-header {\n    padding: 0;\n\n    & + :not(.t-transfer__list--with-search) {\n      border-top-color: transparent;\n    }\n  }\n\n  &__list-item {\n    &.t-is-checked {\n      background: var(--td-bg-color-component-active);\n    }\n  }\n}\n\n// dialog\n.t-dialog {\n  border-radius: 24px;\n\n  // &:has(.t-textarea, .t-input) {\n  //   .t-header {\n  //     padding: 0 var(--td-size-1);\n  //   }\n\n  //   .t-dialog__body {\n  //     padding: var(--td-comp-paddingTB-m) var(--td-size-1) var(--td-size-1);\n  //   }\n\n  //   .t-dialog__footer {\n  //     padding: var(--td-comp-paddingTB-l) var(--td-size-1) 0;\n  //   }\n  // }\n\n  .t-form {\n    &__label {\n      label {\n        display: flex;\n        align-items: center;\n      }\n    }\n\n    > :last-child.t-form__item-with-extra {\n      margin-bottom: var(--td-line-height-body-small);\n    }\n  }\n\n  .t-dialog__body {\n    padding: var(--td-comp-paddingTB-m) 0 0;\n\n    .t-dialog__tip {\n      bottom: calc(var(--td-comp-paddingTB-xxl) + 8px);\n      font-size: var(--td-font-size-link-small);\n      position: absolute;\n      left: calc(var(--td-comp-paddingLR-xxl) + var(--td-size-1));\n    }\n  }\n\n  .t-dialog__footer {\n    padding: var(--td-comp-paddingTB-l) 0 0;\n  }\n}\n\n// splitpanes\n.splitpanes {\n  &__pane {\n    background-color: transparent;\n  }\n\n  &__splitter {\n    background-color: var(--td-bg-color-component-hover);\n  }\n\n  &--vertical > &__splitter {\n    min-width: var(--td-size-2) !important;\n  }\n\n  &--horizontal > &__splitter {\n    min-height: var(--td-size-2) !important;\n  }\n}\n\n// infinite-loading\n.infinite-loading-container {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  color: var(--td-text-color-placeholder);\n  text-align: center;\n}\n\n/* Custom style\n   ========================================================================== */\n\n.title-label {\n  font-weight: 500;\n  color: var(--td-text-color-primary);\n\n  &::before {\n    content: '';\n    border: 1px solid var(--td-brand-color);\n    height: 0.6rem;\n    border-radius: var(--td-radius-default);\n    display: inline-block;\n    opacity: 1;\n    transition: all 0.4s ease-in-out;\n    margin-right: var(--td-comp-paddingLR-xs);\n  }\n}\n\n.transition-transform {\n  transition-property: transform;\n  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n  transition-duration: 0.15s;\n}\n\n.cursor-pointer {\n  cursor: pointer;\n}\n\n.txthide {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.txthide1,\n.txthide2,\n.txthide3,\n.txthide4 {\n  display: -webkit-box;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  -webkit-line-clamp: 1;\n  -webkit-box-orient: vertical;\n}\n\n.txthide2 {\n  -webkit-line-clamp: 2;\n}\n\n.txthide3 {\n  -webkit-line-clamp: 3;\n}\n\n.txthide4 {\n  -webkit-line-clamp: 4;\n}\n\n.drag-region {\n  -webkit-app-region: drag;\n}\n\n.no-drag-region {\n  -webkit-app-region: no-drag;\n}\n"
  },
  {
    "path": "src/renderer/src/style/browser.less",
    "content": ".layout-browser {\n  height: 100vh;\n  width: 100vw;\n  overflow: hidden;\n\n  :deep(.@{starter-prefix}) {\n    &-layout {\n      height: 100%;\n      width: 100%;\n\n      &-component {\n        background: transparent;\n      }\n    }\n\n    &-header {\n      height: var(--td-layout-size-header);\n      width: 100%;\n      flex: 0 0 var(--td-layout-size-header);\n      padding: 0 var(--td-comp-paddingLR-s) 0 0;\n      z-index: 9;\n      position: relative;\n      overflow: hidden;\n      display: flex;\n      align-items: center;\n\n      &::after {\n        content: '';\n        position: absolute;\n        bottom: calc(0px - var(--td-size-3));\n        left: 0;\n        width: 100%;\n        height: var(--td-size-3);\n        box-shadow:\n          0 0 var(--td-size-1) color-mix(in srgb, var(--td-bg-color-container-hover) 80%, transparent),\n          0 0 var(--td-size-3) color-mix(in srgb, var(--td-bg-color-container-hover) 40%, transparent);\n      }\n\n      &-container {\n        height: 100%;\n        width: 100%;\n        display: flex;\n        justify-content: space-between;\n\n        .system-functions {\n          display: flex;\n          flex-direction: row;\n          align-items: center;\n          gap: var(--td-size-2);\n          justify-content: space-between;\n\n          .system-function {\n            display: flex;\n            align-items: center;\n            height: var(--td-comp-size-m);\n\n            .t-button {\n              background-color: transparent;\n              border: none;\n              color: var(--td-text-color-secondary);\n\n              .t-icon {\n                width: var(--td-comp-size-xxxs);\n                height: var(--td-comp-size-xxxs);\n              }\n\n              &.t-is-disabled {\n                color: var(--td-text-color-placeholder);\n              }\n\n              &:not(.t-is-disabled, .t-button--ghost) {\n                &:hover {\n                  color: var(--td-text-color-primary);\n                }\n              }\n            }\n          }\n\n          .tabs {\n            display: flex;\n            flex-direction: row;\n            align-items: center;\n            gap: var(--td-size-4);\n            overflow: hidden;\n\n            .tab-item {\n              height: var(--td-comp-size-m);\n              padding: 0 var(--td-comp-paddingLR-s);\n              border-radius: var(--td-radius-medium);\n              display: flex;\n              align-items: center;\n              min-width: 60px;\n              user-select: none;\n\n              .icon {\n                height: var(--td-comp-size-xxxs);\n\n                .favicon {\n                  width: var(--td-comp-size-xxxs);\n                  height: var(--td-comp-size-xxxs);\n                  border-radius: var(--td-radius-medium);\n\n                  .t-image__error {\n                    color: var(--td-text-color-primary);\n                  }\n                }\n              }\n\n              .title {\n                padding: 0 var(--td-comp-paddingLR-xs);\n                width: 160px;\n                min-width: 0;\n                overflow: hidden;\n                flex: 1 1 0;\n              }\n\n              .close {\n                width: var(--td-comp-size-xxxs);\n\n                .t-icon {\n                  width: var(--td-comp-size-xxxs);\n                  height: var(--td-comp-size-xxxs);\n                }\n              }\n\n              &:hover {\n                background: var(--td-bg-color-container-active);\n              }\n            }\n\n            .is-active {\n              background: var(--td-bg-color-container-active);\n            }\n          }\n        }\n\n        .left {\n          overflow: hidden;\n\n          &:first-of-type {\n            padding-left: var(--td-comp-paddingLR-s);\n          }\n        }\n      }\n    }\n\n    &-main {\n      flex: 1 1 0;\n      height: calc(100% - var(--td-layout-size-header));\n      width: 100%;\n      overflow: hidden;\n      position: relative;\n    }\n\n    &-content {\n      flex: 1 1 0;\n      height: 100%;\n      width: 100%;\n      position: relative;\n      overflow: hidden;\n\n      &-container {\n        height: 100%;\n        width: 100%;\n        position: relative;\n        transition: padding 0.2s ease-in-out;\n      }\n    }\n  }\n}\n\n[platform='darwin'] {\n  .layout-browser {\n    :deep(.@{starter-prefix}) {\n      &-header {\n        &-container {\n          .left {\n            &:first-of-type {\n              padding-left: calc(var(--td-size-16) + var(--td-comp-paddingLR-xs));\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\n[fullscreen='true'][platform='darwin'] {\n  .layout-browser {\n    :deep(.@{starter-prefix}) {\n      &-header {\n        &-container {\n          .left {\n            &:first-of-type {\n              padding-left: 0;\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\n.drawer-more-content {\n  &-container {\n    height: 100%;\n    width: 100%;\n    display: flex;\n    flex-direction: column;\n\n    .action {\n      display: flex;\n      flex-direction: column;\n\n      &-btn {\n        justify-content: flex-start;\n        padding: 0 var(--td-comp-paddingLR-s);\n      }\n    }\n\n    .divider {\n      margin: var(--td-comp-margin-s) 0;\n      color: var(--td-text-color-disabled);\n    }\n\n    .history {\n      display: flex;\n      flex-direction: column;\n      gap: var(--td-size-4);\n      flex: 1 1 0;\n      overflow: hidden;\n\n      &-header {\n        height: fit-content;\n        flex: 0;\n        display: flex;\n        justify-content: space-between;\n        padding: 0 var(--td-comp-paddingLR-s);\n\n        .title {\n          color: var(--td-text-color-secondary);\n        }\n\n        .clear {\n          color: var(--td-brand-color-active);\n          cursor: pointer;\n        }\n      }\n\n      .history-content {\n        flex: 1 1 0;\n        height: 100%;\n        overflow-y: auto;\n\n        .history-items {\n          display: flex;\n          flex-direction: column;\n\n          .history-item {\n            width: 100%;\n            height: var(--td-comp-size-m);\n            padding: 0 var(--td-comp-paddingLR-s);\n            border-radius: var(--td-radius-medium);\n            display: flex;\n            align-items: center;\n            gap: var(--td-size-4);\n            user-select: none;\n            color: var(--td-text-color-primary);\n\n            .icon {\n              flex: 0;\n              height: var(--td-comp-size-xxxs);\n\n              .favicon {\n                width: var(--td-comp-size-xxxs);\n                height: var(--td-comp-size-xxxs);\n                border-radius: var(--td-radius-medium);\n\n                .t-image__error {\n                  color: var(--td-text-color-primary);\n                }\n              }\n            }\n\n            .title {\n              flex: 1 1 auto;\n              width: 100%;\n            }\n\n            &:hover {\n              background: var(--td-bg-color-container-active);\n            }\n          }\n        }\n\n        .history-empty {\n          border-radius: var(--td-radius-medium);\n          border: 1px dashed var(--td-text-color-disabled);\n          padding: var(--td-comp-paddingTB-m) 0;\n        }\n      }\n\n      .history-tip {\n        height: fit-content;\n        flex: 0;\n        text-align: center;\n        color: var(--td-text-color-disabled);\n        font-size: var(--td-font-size-link-small);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/renderer/src/style/font-family.less",
    "content": "@font-face {\n  font-family: MiSans;\n  src: url('@/assets/font/MiSans-Medium.woff2') format('woff2');\n  font-weight: normal;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: JetBrainsMono;\n  src: url('@/assets/font/JetBrainsMono-Regular.woff2') format('woff2');\n  font-weight: normal;\n  font-style: normal;\n}\n"
  },
  {
    "path": "src/renderer/src/style/index.less",
    "content": "@import './normalize.less';\n@import './font-family.less';\n@import './theme.less';\n@import './base.less';\n@import './variables.less';\n"
  },
  {
    "path": "src/renderer/src/style/layout.less",
    "content": ".layout {\n  height: 100vh;\n  width: 100vw;\n  overflow: hidden;\n\n  :deep(.@{starter-prefix}) {\n    &-layout {\n      height: 100%;\n      width: 100%;\n\n      &-component {\n        background: transparent;\n      }\n    }\n\n    &-aside {\n      height: 100%;\n      width: var(--td-layout-size-aside);\n      flex: 0 0 var(--td-layout-size-aside);\n      user-select: none;\n      position: relative;\n      overflow: hidden;\n      background: var(--td-bg-color-secondarycontainer);\n\n      &-container {\n        height: 100%;\n        width: 100%;\n\n        .t-default-menu {\n          background: transparent;\n\n          .t-menu__item {\n            width: var(--td-comp-size-xxl);\n            height: var(--td-comp-size-xxl);\n            color: var(--td-text-color-secondary);\n            border-radius: var(--td-radius-medium);\n            flex-direction: column;\n            justify-content: center;\n            align-items: center;\n            font-size: var(--td-font-size-body-small);\n            font-weight: 500;\n            line-height: 16.8px;\n            padding: 0;\n            margin: 0 0 var(--td-comp-margin-s) 0;\n            display: flex;\n\n            &:last-of-type {\n              margin-bottom: 0;\n            }\n\n            &.t-is-active:not(.t-is-opened) {\n              background-color: transparent;\n\n              .t-menu__content {\n                color: var(--td-brand-color);\n              }\n            }\n\n            &:hover:not(.t-is-active, .t-is-opened, .t-is-disabled) {\n              background: var(--td-bg-color-secondarycontainer-hover);\n            }\n\n            .t-menu__icon {\n              width: var(--td-comp-size-xxs);\n              height: var(--td-comp-size-xxs);\n              margin-bottom: calc(var(--td-comp-margin-xs) + var(--td-comp-margin-xxs));\n              font-size: var(--td-font-size-title-extraLarge);\n              text-align: center;\n              text-transform: none;\n              vertical-align: -0.125em;\n              text-rendering: optimizelegibility;\n              -webkit-font-smoothing: antialiased;\n              font-style: normal;\n              line-height: 0;\n              display: inline-block;\n\n              .t-icon {\n                display: inline-block;\n                margin-right: 0;\n              }\n            }\n\n            .t-menu__content {\n              text-align: center;\n            }\n          }\n\n          .t-menu__operations:not(:empty) {\n            border-top: none;\n            padding: 0 0 var(--td-comp-paddingTB-s) 0;\n\n            .t-default-menu__inner {\n              padding-top: 0;\n            }\n          }\n        }\n\n        .t-default-menu__inner {\n          &:not(:has(.t-menu__logo)) {\n            padding-top: var(--td-size-12);\n          }\n\n          .t-menu {\n            padding: 0;\n            margin: 0 auto;\n\n            &__logo {\n              width: var(--td-comp-size-xxl);\n              height: var(--td-comp-size-xxl);\n              margin: 0 auto;\n\n              img {\n                margin: auto;\n                width: var(--td-comp-size-xxs);\n                height: var(--td-comp-size-xxs);\n              }\n\n              &:not(:empty) {\n                border-bottom: none;\n              }\n            }\n          }\n        }\n      }\n    }\n\n    &-main {\n      flex: 1 1 0;\n      height: 100%;\n      width: calc(100% - var(--td-layout-size-aside));\n      position: relative;\n      overflow: hidden;\n      background: var(--td-bg-color-container);\n    }\n\n    &-header {\n      height: var(--td-layout-size-header);\n      width: 100%;\n      flex: 0 0 var(--td-layout-size-header);\n      z-index: 9;\n      position: relative;\n      overflow: hidden;\n      display: flex;\n      align-items: center;\n\n      &::after {\n        content: '';\n        position: absolute;\n        bottom: calc(0px - var(--td-size-3));\n        left: 0;\n        width: 100%;\n        height: var(--td-size-3);\n        box-shadow:\n          0 0 var(--td-size-1) color-mix(in srgb, var(--td-bg-color-container-hover) 80%, transparent),\n          0 0 var(--td-size-3) color-mix(in srgb, var(--td-bg-color-container-hover) 40%, transparent);\n      }\n\n      &-container {\n        height: 100%;\n        width: 100%;\n        padding: 0 var(--td-comp-paddingLR-s) 0 0;\n        display: flex;\n        justify-content: space-between;\n\n        .system-functions {\n          display: flex;\n          flex-direction: row;\n          align-items: center;\n          gap: var(--td-size-2);\n          justify-content: space-between;\n\n          .system-function {\n            display: flex;\n            align-items: center;\n            height: var(--td-comp-size-m);\n\n            .t-button {\n              background-color: transparent;\n              border: none;\n              color: var(--td-text-color-secondary);\n\n              .t-icon {\n                width: var(--td-comp-size-xxxs);\n                height: var(--td-comp-size-xxxs);\n              }\n\n              &.t-is-disabled {\n                color: var(--td-text-color-placeholder);\n              }\n\n              &:not(.t-is-disabled, .t-button--ghost) {\n                &:hover {\n                  color: var(--td-text-color-primary);\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    &-content {\n      flex: 1 1 0;\n      height: calc(100% - var(--td-layout-size-header));\n      width: 100%;\n      position: relative;\n      overflow: hidden;\n      background: var(--td-bg-color-container);\n\n      &-container {\n        height: 100%;\n        width: 100%;\n        padding: var(--td-comp-paddingTB-s) 0 0 0;\n        position: relative;\n        overflow: hidden;\n      }\n    }\n  }\n}\n\n[platform='darwin'],\n[platform='win32'] {\n  .layout {\n    background: var(--td-mica-background);\n\n    :deep(.@{starter-prefix}) {\n      &-aside {\n        background: transparent;\n        backdrop-filter: blur(18px);\n\n        &-container {\n          .t-default-menu {\n            .t-menu__item {\n              &:hover:not(.t-is-active):not(.t-is-opened):not(.t-is-disabled) {\n                background: var(--td-mica-surface-2);\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\n[fullscreen='true'][platform='darwin'] {\n  .layout {\n    :deep(.@{starter-prefix}) {\n      &-aside {\n        &-container {\n          .t-default-menu__inner {\n            padding-top: var(---td-comp-paddingTB-xs);\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/renderer/src/style/normalize.less",
    "content": "/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n   ========================================================================== */\n\n/**\n * 1. Correct the `box-sizing` in Firefox.\n * 2. Remove the margin in all browsers.\n * 3. Remove the padding in all browsers.\n */\n\n* {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n}\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n  line-height: 1.15; /* 1 */\n  text-size-adjust: 100%; /* 2 */\n  -webkit-font-smoothing: antialiased; /* chrome、safari */\n  -moz-osx-font-smoothing: grayscale; /* firefox */\n}\n\n/* Sections\n   ========================================================================== */\n\n/**\n * Default font family\n */\n\nbody {\n  font-family:\n    -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue',\n    sans-serif;\n  -webkit-font-smoothing: antialiased;\n  text-size-adjust: 100%;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n  display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n  margin: 0.67em 0;\n  font-size: 2em;\n}\n\n/* Grouping content\n   ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n  box-sizing: content-box; /* 1 */\n  height: 0; /* 1 */\n  overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n  font-size: 1em; /* 2 */\n  font-family: monospace; /* 1 */\n}\n\n/* Text-level semantics\n   ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n  background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n  text-decoration: underline; /* 2 */\n  text-decoration: underline dotted; /* 2 */\n  border-bottom: none; /* 1 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n  font-size: 1em; /* 2 */\n  font-family: monospace; /* 1 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n  font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\n/* Embedded content\n   ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n  border-style: none;\n}\n\n/* Forms\n   ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  margin: 0; /* 2 */\n  font-size: 100%; /* 1 */\n  font-family: inherit; /* 1 */\n  line-height: 1.15; /* 1 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n  /* 1 */\n  overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n  /* 1 */\n  text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n  appearance: auto;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type='button']::-moz-focus-inner,\n[type='reset']::-moz-focus-inner,\n[type='submit']::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type='button']:-moz-focusring,\n[type='reset']:-moz-focusring,\n[type='submit']:-moz-focusring {\n  outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n  padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n *    `fieldset` elements in all browsers.\n */\n\nlegend {\n  display: table; /* 1 */\n  box-sizing: border-box; /* 1 */\n  max-width: 100%; /* 1 */\n  padding: 0; /* 3 */\n  color: inherit; /* 2 */\n  white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n  vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n  overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type='checkbox'],\n[type='radio'] {\n  box-sizing: border-box; /* 1 */\n  padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type='number']::-webkit-inner-spin-button,\n[type='number']::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type='search'] {\n  outline-offset: -2px; /* 2 */\n  appearance: textfield; /* 1 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type='search']::-webkit-search-decoration {\n  appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n  font: inherit; /* 2 */\n  appearance: auto; /* 1 */\n}\n\n/* Interactive\n   ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n  display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n  display: list-item;\n}\n\n/* Misc\n   ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n  display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n  display: none;\n}\n"
  },
  {
    "path": "src/renderer/src/style/player.less",
    "content": ".layout-player {\n  height: 100vh;\n  width: 100vw;\n  overflow: hidden;\n\n  :deep(.@{starter-prefix}) {\n    &-layout {\n      height: 100%;\n      width: 100%;\n\n      &-component {\n        background: transparent;\n      }\n    }\n\n    &-header {\n      height: var(--td-layout-size-header);\n      width: 100%;\n      flex: 0 0 var(--td-layout-size-header);\n      padding: 0 var(--td-comp-paddingLR-s) 0 0;\n      z-index: 9;\n      position: relative;\n      overflow: hidden;\n      display: flex;\n      align-items: center;\n\n      &::after {\n        content: '';\n        position: absolute;\n        bottom: calc(0px - var(--td-size-3));\n        left: 0;\n        width: 100%;\n        height: var(--td-size-3);\n        box-shadow:\n          0 0 var(--td-size-1) color-mix(in srgb, var(--td-bg-color-container-hover) 80%, transparent),\n          0 0 var(--td-size-3) color-mix(in srgb, var(--td-bg-color-container-hover) 40%, transparent);\n\n        @media only screen and (width <= 640px) {\n          content: '';\n          position: fixed;\n          inset: 0;\n          width: 100%;\n          height: var(--td-size-4);\n          -webkit-app-region: drag;\n          z-index: 999;\n          box-shadow: none;\n        }\n      }\n\n      @media only screen and (width <= 640px) {\n        padding: 0;\n        position: absolute;\n        top: var(--td-size-4);\n        left: 0;\n        width: 100%;\n        z-index: 999;\n        height: var(--td-comp-size-xs);\n        opacity: 0;\n        transition: opacity 0.15s ease-in-out;\n        // transition:\n        //   opacity 0.15s linear 3s,\n        //   visibility 0s linear 3s;\n        background: transparent;\n        -webkit-app-region: no-drag;\n      }\n\n      &-container {\n        height: 100%;\n        width: 100%;\n        display: flex;\n        justify-content: space-between;\n        gap: var(--td-size-4);\n\n        .system-functions {\n          display: flex;\n          flex-direction: row;\n          align-items: center;\n          gap: var(--td-size-2);\n          justify-content: space-between;\n\n          .system-function {\n            display: flex;\n            align-items: center;\n            height: var(--td-comp-size-m);\n\n            .t-button {\n              background-color: transparent;\n              border: none;\n              color: var(--td-text-color-secondary);\n\n              .t-icon {\n                width: var(--td-comp-size-xxxs);\n                height: var(--td-comp-size-xxxs);\n              }\n\n              &.t-is-disabled {\n                color: var(--td-text-color-placeholder);\n              }\n\n              &:not(.t-is-disabled, .t-button--ghost) {\n                &:hover {\n                  color: var(--td-text-color-primary);\n                }\n              }\n            }\n          }\n        }\n\n        .left {\n          &:first-of-type {\n            padding-left: var(--td-comp-paddingLR-s);\n          }\n\n          .back-main {\n            border-radius: var(--td-radius-medium);\n            background: var(--td-bg-color-container-hover);\n\n            @media only screen and (width <= 640px) {\n              background: transparent;\n\n              .t-icon {\n                color: #fbfbfb;\n              }\n\n              .t-button__text {\n                display: none;\n              }\n            }\n          }\n        }\n\n        .spacer {\n          user-select: none;\n          overflow: hidden;\n\n          @media only screen and (width <= 640px) {\n            color: #fbfbfb;\n          }\n        }\n\n        .right {\n          .system-controls {\n            @media only screen and (width <= 640px) {\n              .control-button {\n                color: #fbfbfb;\n\n                &:not(.t-is-disabled, .t-button--ghost):hover {\n                  color: #fbfbfb;\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    &-main {\n      flex: 1 1 0;\n      height: calc(100% - var(--td-layout-size-header));\n      width: 100%;\n      overflow: hidden;\n      position: relative;\n\n      @media only screen and (width <= 640px) {\n        height: 100%;\n\n        // &::before {\n        //   content: '';\n        //   position: absolute;\n        //   width: 100%;\n        //   height: var(--td-layout-size-header);\n        //   inset: 0;\n        //   z-index: 5;\n        //   -webkit-app-region: drag;\n        // }\n      }\n\n      z-index: 10;\n    }\n\n    &-content {\n      flex: 1 1 0;\n      height: 100%;\n      width: calc(100% - 300px);\n      position: relative;\n      overflow: hidden;\n\n      @media only screen and (width <= 640px) {\n        width: 100%;\n      }\n\n      &-container {\n        height: 100%;\n        width: 100%;\n        position: relative;\n        transition: padding 0.2s ease-in-out;\n\n        .media-player:hover ~ .dock-show {\n          display: flex;\n\n          @media only screen and (width <= 640px) {\n            display: none;\n          }\n        }\n\n        .dock-show {\n          display: none;\n          transition: 0.15s ease-out;\n          background: var(--td-mask-active);\n          border-radius: var(--td-radius-large) 0 0 var(--td-radius-large);\n          width: var(--td-comp-size-m);\n          height: var(--td-comp-size-xxxxxl);\n          position: absolute;\n          top: 50%;\n          right: 0;\n          transform: translateY(-50%);\n          flex-direction: column;\n          justify-content: center;\n          align-items: center;\n          cursor: pointer;\n          z-index: 95;\n\n          &:hover {\n            display: flex;\n          }\n\n          .dock-icon {\n            width: var(--td-comp-size-s);\n            height: var(--td-comp-size-s);\n            color: var(--td-font-white-1);\n          }\n        }\n      }\n    }\n\n    &-aside {\n      height: 100%;\n      width: 300px;\n      flex: 0 0 300px;\n      user-select: none;\n      position: relative;\n      overflow: hidden;\n\n      @media only screen and (width <= 640px) {\n        display: none;\n      }\n\n      &-container {\n        height: 100%;\n        width: 100%;\n\n        .container-aside-wrap {\n          height: 100%;\n          width: 100%;\n          display: flex;\n          flex-direction: column;\n          gap: var(--td-size-4);\n\n          .container-wrap {\n            height: 100%;\n            width: 100%;\n          }\n        }\n\n        .main-wrap {\n          padding-left: var(--td-comp-paddingLR-s);\n          display: flex;\n          flex-direction: column;\n          gap: var(--td-size-4);\n\n          .info-wrap {\n            height: fit-content;\n            width: 100%;\n            padding-right: var(--td-comp-paddingLR-s);\n            display: flex;\n            flex-direction: column;\n            gap: var(--td-size-4);\n\n            .new-title-wrap {\n              .new-title-name {\n                display: flex;\n                gap: var(--td-size-4);\n                line-height: var(--td-font-size-headline-large);\n\n                .title {\n                  font-size: var(--td-font-size-headline-small);\n                  font-weight: 500;\n                  flex: 1 1 0;\n                }\n\n                .title-unfold {\n                  line-height: var(--td-font-size-headline-large);\n                  color: var(--td-text-color-secondary);\n                  font-size: var(--td-font-size-body-small);\n                  cursor: pointer;\n                  height: var(--td-comp-size-l);\n                }\n\n                .icon-title-right {\n                  font-size: var(--td-font-size-body-small);\n                }\n              }\n\n              .new-title-feature {\n                position: relative;\n                height: var(--td-comp-size-xxs);\n                width: 100%;\n                line-height: var(--td-line-height-link-small);\n                color: var(--td-text-color-secondary);\n\n                .meta-info {\n                  margin-right: var(--td-comp-margin-m);\n\n                  &:last-child {\n                    margin-right: 0;\n                  }\n                }\n\n                .heat {\n                  color: var(--td-error-color-5);\n                  font-weight: 500;\n\n                  &::before {\n                    content: '__';\n                    margin-right: var(--td-comp-margin-xxs);\n                    mask-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAeCAYAAAAy2w7YAAAAAXNSR0IArs4c6QAAAfRJREFUSEu9lsF1wjAMhqXHy70cYsONbgAblAnablA2gAlKJ4BO0HYC2KDZoNmgufFiH+DOC2qVF+c5QIlj8uoj0a/PkoUkBIez3W5v9vv9FwAkWZZN+v1+4iCrmKCLIE3TOSI+F7ZJEASjbre7c9EaGyeQUuoTAO4sx+9CiEmrIK31HRExqJoKxHEYhpErrDaiM9EY37EQYtQK6OhtTnxig6j+jKgOUlCd3+osyBHCrEQIceuSvhNQA0ju3zV9FVBTCIMOh8Os1+stTVRa6ykR3R//sUtQYbBwSYNtg4jrMAwfzW9WlXIXGZsukoOUUkMA4BbjcyIhxJiFRav6BoCbwlH5zYD448CHQkSJlDIvCKUUZ2Rq+yGiFynlHNM0fUDElQ/E0kyIaGD1w4q7LMtuUWu9IqKHK0EX5VwwHNE3InqlrcHlIlRKUQOBr+nuv0DAoK1Vjr43rtPlER0PtTqRz/eYq25BRJXa9/F0SYOISwadnaBtwrjxXt0ZHC6UtyEDegKANwdRYxMzRsrurZRiEAPbPOUELkHWkthWl6jsf5XBt9lsBp1Ohxssj41rTmUWsaOTUV5Exlupb8m/B0EwO95k/9yCirJnoL2hXooyIqJXKeX6nFHtAsnA3+l7T0TDYuaYN+TdO0bEmIg+hBDxpVv8AKFN+Y7hDj2fAAAAAElFTkSuQmCC');\n                    mask-repeat: no-repeat;\n                    mask-size: contain;\n                    background-color: var(--td-error-color-5);\n                  }\n                }\n              }\n            }\n\n            .play-paction {\n              width: 100%;\n              display: flex;\n              flex-direction: row;\n              justify-content: space-evenly;\n              align-items: center;\n              font-size: 14px;\n              height: 40px;\n              position: relative;\n              box-shadow: 0 2px 8px 0 rgb(0 0 0 / 8%);\n              // background-image: linear-gradient(hsl(0deg 0% 100% / 4%), hsl(0deg 0% 100% / 6%));\n              border-radius: var(--td-radius-medium);\n              background-color: #ffffff0f;\n              background-image: url('data:image/png;base64,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');\n              background-repeat: no-repeat;\n              background-size: cover;\n\n              .paction-item {\n                align-items: center;\n                display: flex;\n                flex: 1 1 0;\n                height: 40px;\n                justify-content: center;\n                overflow: hidden;\n                position: relative;\n                cursor: pointer;\n                color: var(--td-text-color-secondary);\n\n                &:hover {\n                  color: var(--td-text-color-primary);\n                }\n\n                .tip {\n                  vertical-align: top;\n                  line-height: 25px;\n                  text-align: center;\n                  margin-left: 4px;\n                }\n              }\n\n              .more {\n                flex-grow: 0;\n                min-width: 40px;\n                width: 40px;\n\n                .t-button--variant-text {\n                  color: var(--td-text-color-secondary);\n\n                  &:hover {\n                    border-color: transparent;\n                    background-color: transparent;\n                    color: var(--td-text-color-primary);\n                  }\n                }\n              }\n\n              .t-divider--vertical {\n                margin: 0 var(--td-comp-margin-xxs);\n              }\n            }\n          }\n\n          .anthology-container {\n            height: 100%;\n            width: 100%;\n            flex: 1 1 0;\n            display: flex;\n            flex-direction: column;\n            gap: var(--td-size-4);\n\n            .anthology-title {\n              position: relative;\n              font-weight: 500;\n              height: var(--td-comp-size-m);\n              line-height: var(--td-comp-size-m);\n              font-size: var(--td-font-size-title-extraLarge);\n            }\n\n            .anthology-series-wrap {\n              height: var(--td-comp-size-m);\n              width: 100%;\n              padding-right: var(--td-comp-paddingLR-s);\n              display: flex;\n              justify-content: space-between;\n\n              .anthology-series-nav {\n                flex: 1 1 0;\n              }\n\n              .anthology-series-extra {\n                height: var(--td-comp-size-m);\n                display: flex;\n                align-items: center;\n                gap: var(--td-size-4);\n\n                // .anthology-series-parse {\n                // }\n\n                // .anthology-series-reverse {\n                // }\n\n                .anthology-series-btn {\n                  border: none;\n                  padding-right: 0;\n                  padding-left: 0;\n\n                  .t-button__suffix {\n                    margin-left: 0;\n                  }\n\n                  &:hover {\n                    background-color: transparent;\n                  }\n                }\n              }\n            }\n\n            .box-anthology-wrap {\n              height: calc(100% - var(--td-comp-size-m) - var(--td-size-4));\n              width: 100%;\n              flex: 1 1 0;\n              overflow: hidden;\n\n              .box-anthology-item {\n                height: 100%;\n                width: 100%;\n                display: flex;\n                flex-direction: column;\n                gap: var(--td-size-4);\n\n                .box-anthology-header {\n                  height: fit-content;\n                  width: 100%;\n                  padding-right: var(--td-comp-paddingLR-s);\n                }\n\n                .box-anthology-content {\n                  width: 100%;\n                  height: 100%;\n                  flex: 1 1 0;\n                  overflow-y: scroll;\n                  // padding-bottom: var(--td-comp-paddingTB-s);\n\n                  .list-wrap {\n                    .item-wrap {\n                      width: 100%;\n                      height: calc(var(--td-comp-size-m) + 2px);\n                      padding: 0;\n                      cursor: pointer;\n                      margin-bottom: 1px;\n\n                      &::after {\n                        content: none;\n                      }\n\n                      &:last-of-type {\n                        margin-bottom: var(--td-comp-margin-s);\n                      }\n\n                      .t-list-item-main {\n                        display: block;\n                        overflow: hidden;\n                      }\n\n                      .list-item {\n                        display: flex;\n                        align-items: center;\n                        justify-content: space-between;\n                        width: 100%;\n                        height: var(--td-comp-size-m);\n                        flex: 1;\n                        padding: 0 var(--td-comp-paddingTB-xs);\n                        border-radius: var(--td-radius-medium);\n                        margin-bottom: 1px;\n\n                        .logo {\n                          width: var(--td-comp-size-l);\n                          height: var(--td-comp-size-m);\n                          color: var(--td-warning-color);\n                          border-radius: var(--td-radius-medium);\n                          margin-right: var(--td-comp-margin-m);\n                          margin-left: calc(0px - var(--td-comp-margin-xs));\n                          overflow: hidden;\n                          background-color: var(--td-bg-color-component);\n\n                          .logo-lazy {\n                            width: 100%;\n                            height: 100%;\n\n                            .render-icon {\n                              padding: var(--td-comp-paddingTB-xs) 0;\n                            }\n                          }\n                        }\n\n                        .time {\n                          width: var(--td-comp-size-l);\n                          color: var(--td-warning-color);\n                          margin-right: var(--td-comp-margin-m);\n                        }\n\n                        .title {\n                          flex: 1;\n                        }\n                      }\n\n                      .divider {\n                        border-bottom: 1px dashed var(--td-border-level-1-color);\n                        width: calc(100% - var(--td-size-4));\n                        margin: 0 auto;\n                      }\n\n                      &:hover {\n                        .content {\n                          background-color: var(--td-bg-color-component-hover);\n                        }\n                      }\n                    }\n\n                    .is-active {\n                      .list-item {\n                        background-color: var(--td-bg-color-component-hover);\n                      }\n                    }\n                  }\n\n                  .grid-wrap {\n                    display: grid;\n                    grid-template-columns: repeat(5, calc(var(--td-comp-size-xxxs) + var(--td-comp-size-l)));\n                    grid-template-rows: repeat(1, auto);\n                    gap: var(--td-size-4) calc((100% - 5 * (var(--td-comp-size-xxxs) + var(--td-comp-size-l))) / 4);\n                    width: 100%;\n                    padding-bottom: var(--td-comp-paddingTB-s);\n\n                    .item-wrap {\n                      position: relative;\n                      width: calc(var(--td-comp-size-xxxs) + var(--td-comp-size-l));\n                      height: var(--td-comp-size-xxl);\n                      line-height: var(--td-comp-size-xxl);\n                      font-size: var(--td-font-size-title-large);\n                      border-radius: var(--td-radius-medium);\n                      text-align: center;\n                      cursor: pointer;\n                      background-color: var(--td-border-level-1-color);\n\n                      &:not(.is-active):hover {\n                        .list-item {\n                          background-color: var(--td-bg-color-component-active);\n\n                          .title {\n                            color: var(--td-text-color-primary);\n                          }\n                        }\n                      }\n\n                      .list-item {\n                        border-radius: var(--td-radius-medium);\n\n                        .title {\n                          color: var(--td-text-color-secondary);\n                        }\n                      }\n                    }\n\n                    .is-active {\n                      .list-item {\n                        background-color: var(--td-brand-color-2);\n\n                        .title {\n                          color: var(--td-brand-color);\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n\n              // film recommend\n              .box-anthology-recommend {\n                .box-anthology-content {\n                  padding-bottom: 0;\n\n                  .list-wrap {\n                    .item-wrap {\n                      height: var(--td-comp-size-xxxxxl);\n                      margin-bottom: var(--td-comp-margin-s);\n\n                      &:last-of-type {\n                        margin-bottom: var(--td-comp-paddingTB-s);\n                      }\n\n                      .list-item {\n                        height: var(--td-comp-size-xxxxxl);\n\n                        .logo {\n                          width: 126px;\n                          height: 100%;\n                        }\n\n                        .title {\n                          line-height: var(--td-line-height-title-small);\n                          max-height: var(--td-comp-size-xl);\n                          color: var(--td-text-color-primary);\n                          white-space: wrap;\n                        }\n                      }\n\n                      &:hover {\n                        .content {\n                          background-color: transparent;\n\n                          .logo {\n                            img {\n                              transform: scale(1.05);\n                            }\n                          }\n\n                          .title {\n                            color: var(--td-brand-color);\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n\n              .infinite-loading {\n                margin-bottom: var(--td-comp-margin-s);\n\n                .infinite-loading-container {\n                  display: flex;\n                  justify-content: center;\n                  align-items: center;\n                  color: var(--td-text-color-placeholder);\n                  text-align: center;\n                  height: fit-content;\n                }\n              }\n            }\n          }\n        }\n\n        .intro-wrap {\n          padding-left: var(--td-comp-paddingLR-s);\n          display: flex;\n          flex-direction: column;\n          gap: var(--td-size-4);\n\n          .side-head {\n            .header {\n              display: flex;\n              align-items: center;\n              min-height: var(--td-comp-size-xl);\n              width: 100%;\n              font: var(--td-font-title-medium);\n              color: var(--td-text-color-primary);\n            }\n\n            .close-btn {\n              position: absolute;\n              display: flex;\n              justify-content: center;\n              align-items: center;\n              width: var(--td-comp-size-xs);\n              height: var(--td-comp-size-xs);\n              top: calc((var(--td-comp-size-xl) - var(--td-comp-size-xs)) / 2);\n              right: var(--td-comp-margin-s);\n              color: var(--td-text-color-secondary);\n              background-color: var(--td-bg-color-container);\n              border-radius: var(--td-radius-default);\n              cursor: pointer;\n              transition: background-color 0.2s;\n\n              &:hover {\n                background-color: var(--td-bg-color-container-hover);\n              }\n\n              .t-icon-close {\n                font-size: calc(var(--td-font-size-body-medium) + 2px);\n                vertical-align: unset;\n              }\n            }\n          }\n\n          .side-body {\n            flex: 1 1 0;\n            width: 100%;\n            display: flex;\n            flex-direction: column;\n            gap: var(--td-size-6);\n            overflow-y: scroll;\n            padding-bottom: var(--td-comp-paddingTB-s);\n\n            .new-intro-base {\n              display: flex;\n              flex-direction: column;\n              align-items: center;\n              gap: var(--td-size-4);\n\n              .new-intro-img {\n                width: 126px;\n                height: 168px;\n                border-radius: var(--td-radius-medium);\n                overflow: hidden;\n\n                &::after {\n                  content: '';\n                  position: absolute;\n                  left: 0;\n                  bottom: 0;\n                  width: 100%;\n                  height: 60px;\n                  background-image: linear-gradient(0deg, rgb(0 0 0 / 50%), rgb(0 0 0 / 0%));\n                  border-radius: var(--td-radius-medium) var(--td-radius-medium) 0 0;\n                }\n              }\n\n              .title {\n                height: var(--td-comp-size-m);\n                width: 100%;\n                font-size: var(--td-font-size-headline-small);\n                line-height: var(--td-line-height-headline-small);\n                font-weight: 500;\n                color: var(--td-text-color-primary);\n                text-align: center;\n              }\n            }\n\n            .new-intro-detail {\n              display: flex;\n              flex-direction: column;\n              gap: var(--td-size-4);\n\n              .new-intro-case {\n                display: flex;\n                flex-direction: column;\n                gap: var(--td-size-2);\n\n                .new-intro-title {\n                  font-size: var(--td-font-size-title-large);\n                  font-weight: 500;\n                  line-height: var(--td-line-height-link-small);\n                  color: var(--td-text-color-primary);\n                }\n\n                .new-intro-content {\n                  .new-intro-roles {\n                    color: var(--td-text-color-primary);\n\n                    // .intro-role-title {\n                    // }\n\n                    // .intro-role-subtitle {\n                    // }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  @media only screen and (width <= 640px) {\n    &:hover {\n      :deep(.@{starter-prefix}) {\n        &-header {\n          opacity: 1;\n        }\n      }\n\n      &::after {\n        content: '';\n        position: fixed;\n        width: 100%;\n        height: var(--td-layout-size-header);\n        inset: 0;\n        z-index: 10;\n        background: linear-gradient(360deg, rgb(0 0 0 / 0%), rgb(0 0 0 / 37%), rgb(0 0 0 / 80%));\n      }\n    }\n  }\n}\n\n[platform='darwin'] {\n  .layout-player {\n    :deep(.@{starter-prefix}) {\n      &-header {\n        &-container {\n          .left {\n            &:first-of-type {\n              padding-left: calc(var(--td-size-16) + var(--td-comp-paddingLR-xs));\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\n[fullscreen='true'][platform='darwin'] {\n  .layout-player {\n    :deep(.@{starter-prefix}) {\n      &-header {\n        &-container {\n          .left {\n            &:first-of-type {\n              padding-left: 0;\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/renderer/src/style/theme.less",
    "content": ":root {\n  --td-font-family: 'MiSans', 'Arial Regular';\n  --td-font-family-medium: 'MiSans', 'Arial Medium';\n  --td-font-family-code: 'JetBrainsMono', 'monospace';\n  --td-radius-xxs: var(--td-size-1);\n  --td-radius-xs: var(--td-size-2);\n  --td-radius-s: var(--td-size-4);\n  --td-radius-m: var(--td-size-5);\n  --td-radius-l: var(--td-size-6);\n  --td-radius-xl: var(--td-size-8);\n  --td-radius-xxl: var(--td-size-10);\n  --td-layout-size-aside: calc(var(--td-comp-size-xxxl) + var(--td-comp-size-xxs)); // 76px\n  --td-layout-size-header: calc(var(--td-comp-size-s) + var(--td-comp-size-xxxs)); // 44px\n}\n\n:root,\n:root[theme-mode='light'] {\n  --td-mica-background: rgb(243 243 243 / 55%);\n  --td-mica-surface-1: rgb(255 255 255 / 42%);\n  --td-mica-surface-2: rgb(255 255 255 / 56%);\n  --td-mica-surface-3: rgb(255 255 255 / 68%);\n  --td-mica-border: rgb(255 255 255 / 22%);\n  --td-brand-color-blue: #0052d9;\n  --td-brand-color-blue-focus: #d9e1ff;\n  --td-brand-color-light: var(--td-brand-color-1);\n  --td-brand-color-focus: var(--td-brand-color-2);\n  --td-brand-color-disabled: var(--td-brand-color-3);\n  --td-brand-color-hover: var(--td-brand-color-3);\n  --td-brand-color: var(--td-brand-color-4);\n  --td-brand-color-active: var(--td-brand-color-5);\n  --td-brand-color-1: #e4f9e9;\n  --td-brand-color-2: #c8f2d7;\n  --td-brand-color-3: #94dab2;\n  --td-brand-color-4: #45c58b;\n  --td-brand-color-5: #33a371;\n  --td-brand-color-6: #008857;\n  --td-brand-color-7: #006c44;\n  --td-brand-color-8: #005333;\n  --td-brand-color-9: #003b23;\n  --td-brand-color-10: #002515;\n}\n\n:root[theme-mode='dark'] {\n  --td-mica-background: rgb(24 24 32 / 60%);\n  --td-mica-surface-1: rgb(24 24 24 / 42%);\n  --td-mica-surface-2: rgb(24 24 24 / 56%);\n  --td-mica-surface-3: rgb(24 24 24 / 68%);\n  --td-mica-border: rgb(255 255 255 / 8%);\n  --td-brand-color-blue: #2667d4;\n  --td-brand-color-blue-focus: #173463;\n  --td-brand-color-light: var(--td-brand-color-1);\n  --td-brand-color-focus: var(--td-brand-color-2);\n  --td-brand-color-disabled: var(--td-brand-color-3);\n  --td-brand-color-hover: var(--td-brand-color-5);\n  --td-brand-color: var(--td-brand-color-6);\n  --td-brand-color-active: var(--td-brand-color-7);\n  --td-brand-color-1: #33a37120;\n  --td-brand-color-2: #003b23;\n  --td-brand-color-3: #005333;\n  --td-brand-color-4: #006c44;\n  --td-brand-color-5: #008857;\n  --td-brand-color-6: #33a371;\n  --td-brand-color-7: #45c58b;\n  --td-brand-color-8: #94dab2;\n  --td-brand-color-9: #c8f2d7;\n  --td-brand-color-10: #e4f9e9;\n}\n"
  },
  {
    "path": "src/renderer/src/style/variables.less",
    "content": "/** 公共前缀 */\n@starter-prefix: zy;\n\n// 颜色、尺寸、阴影、圆角、字体 variables 请参考 https://tdesign.tencent.com/starter/docs/vue/design-token\n// 响应式断点\n@screen-sm: 768px;\n@screen-md: 992px;\n@screen-lg: 1200px;\n@screen-xl: 1400px;\n\n@screen-sm-min: @screen-sm;\n@screen-md-min: @screen-md;\n@screen-lg-min: @screen-lg;\n@screen-xl-min: @screen-xl;\n\n@screen-sm-max: calc(@screen-md-min - 1px);\n@screen-md-max: calc(@screen-lg-min - 1px);\n@screen-lg-max: calc(@screen-xl-min - 1px);\n\n// 动画\n@anim-time-fn-easing: cubic-bezier(0.38, 0, 0.24, 1);\n@anim-time-fn-ease-out: cubic-bezier(0, 0, 0.15, 1);\n@anim-time-fn-ease-in: cubic-bezier(0.82, 0, 1, 0.9);\n@anim-duration-base: 0.2s;\n@anim-duration-moderate: 0.24s;\n@anim-duration-slow: 0.28s;\n"
  },
  {
    "path": "src/renderer/src/types/globals.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n\n// Vue\ndeclare module '*.vue' {\n  import type { DefineComponent } from 'vue';\n\n  const component: DefineComponent<object, object, any>;\n  export default component;\n}\n\ndeclare type ClassName = { [className: string]: any } | ClassName[] | string;\n\ndeclare module '*.svg' {\n  const CONTENT: string;\n  export default CONTENT;\n}\n\ndeclare type Recordable<T = any> = Record<string, T>;\n\ndeclare global {\n  interface Window {}\n}\n"
  },
  {
    "path": "src/renderer/src/types/interface.d.ts",
    "content": "import type { TabValue } from 'tdesign-vue-next';\nimport type { LocationQueryRaw, RouteRecordName } from 'vue-router';\n\nexport interface RouteMeta {\n  title?: string | Record<string, string>;\n  icon?: string;\n  expanded?: boolean;\n  orderNo?: number;\n  hidden?: boolean;\n  hiddenBreadcrumb?: boolean;\n  single?: boolean;\n  keepAlive?: boolean;\n  frameSrc?: string;\n  frameBlank?: boolean;\n  position?: string;\n}\n\nexport interface MenuRoute {\n  // TODO: menuitem 组件实际支持 string 类型但是类型错误，暂时使用 any 类型避免打包错误待组件类型修复\n  path: any;\n  title?: string | Record<string, string>;\n  name?: string;\n  icon?:\n    | string\n    | {\n        render: () => void;\n      };\n  redirect?: string;\n  children: MenuRoute[];\n  meta: RouteMeta;\n  position?: string;\n}\n\nexport interface TRouterInfo {\n  path: string;\n  query?: LocationQueryRaw;\n  routeIdx?: number;\n  title?: string;\n  name?: RouteRecordName;\n  isAlive?: boolean;\n  isHome?: boolean;\n  meta?: any;\n}\n\nexport interface TTabRouterType {\n  isRefreshing: boolean;\n  tabRouterList: Array<TRouterInfo>;\n}\n\nexport interface TTabRemoveOptions {\n  value: TabValue;\n  index: number;\n  e: MouseEvent;\n}\n"
  },
  {
    "path": "src/renderer/src/types/player.ts",
    "content": "export interface IVideoOptions {\n  url: string;\n  playEnd: boolean;\n  watchTime: number;\n  duration: number;\n  skipTimeInStart: number;\n  skipTimeInEnd: number;\n}\n\nexport interface IVideoProcess {\n  currentTime: number;\n  duration: number;\n}\n"
  },
  {
    "path": "src/renderer/src/types/vue-virtual-scroller.d.ts",
    "content": "declare module 'vue-virtual-scroller' {\n  import type { DefineComponent } from 'vue';\n\n  export const DynamicScroller: DefineComponent<any>;\n  export const DynamicScrollerItem: DefineComponent<any>;\n  export const RecycleScroller: DefineComponent<any>;\n}\n"
  },
  {
    "path": "src/renderer/src/utils/console.ts",
    "content": "import pkg from '@pkg';\n\nexport const print = () => {\n  console.log(\n    `%c${pkg.name} %c${pkg.version} %c${pkg.homepage}`,\n    'color:#ffffff; background:#13987f; padding:4px 0 4px 6px;',\n    'color:#581845; background:#cef9ec; padding:4px 0 4px 6px;',\n    'color:#0969da; background:transparent; padding:4px 0 4px 6px;',\n  );\n};\n"
  },
  {
    "path": "src/renderer/src/utils/emitter.ts",
    "content": "import Emittery from 'emittery';\n\nconst emitter = new Emittery();\n\nexport default emitter;\n"
  },
  {
    "path": "src/renderer/src/utils/logger.ts",
    "content": "import { IPC_CHANNEL } from '@shared/config/ipcChannel';\nimport type { LogContextData, LogLevel, LogSourceWithContext } from '@shared/config/logger';\nimport { LEVEL, LEVEL_MAP } from '@shared/config/logger';\n\n// check if the current process is a worker\nconst IS_WORKER = typeof window === 'undefined';\n// check if we are in the dev env\n// DO NOT use `constants.ts` here, because the files contains other dependencies that will fail in worker process\nconst IS_DEV = IS_WORKER ? false : window.electron?.process?.env?.NODE_ENV === 'development';\n\nconst DEFAULT_LEVEL = IS_DEV ? LEVEL.SILLY : LEVEL.INFO;\nconst MAIN_LOG_LEVEL = LEVEL.WARN;\n\n/**\n * IMPORTANT: How to use LoggerService\n * please refer to\n *   English: `docs/technical/how-to-use-logger-en.md`\n *   Chinese: `docs/technical/how-to-use-logger-zh.md`\n */\nclass LoggerService {\n  private static instance: LoggerService;\n\n  // env variables, only used in dev mode\n  // only affect console output, not affect logToMain\n  private envLevel: LogLevel = LEVEL.NONE;\n  private envShowModules: string[] = [];\n\n  private level: LogLevel = DEFAULT_LEVEL;\n  private logToMainLevel: LogLevel = MAIN_LOG_LEVEL;\n\n  private window: string = '';\n  private module: string = '';\n  private context: Record<string, any> = {};\n\n  private constructor() {\n    if (IS_DEV) {\n      if (\n        window.electron?.process?.env?.CSLOGGER_RENDERER_LEVEL &&\n        Object.values(LEVEL).includes(window.electron?.process?.env?.CSLOGGER_RENDERER_LEVEL as LogLevel)\n      ) {\n        this.envLevel = window.electron?.process?.env?.CSLOGGER_RENDERER_LEVEL as LogLevel;\n\n        console.log(\n          `%c[LoggerService] env CSLOGGER_RENDERER_LEVEL loaded: ${this.envLevel}`,\n          'color: blue; font-weight: bold',\n        );\n      }\n\n      if (window.electron?.process?.env?.CSLOGGER_RENDERER_SHOW_MODULES) {\n        const showModules = window.electron?.process?.env?.CSLOGGER_RENDERER_SHOW_MODULES.split(',')\n          .map((module) => module.trim())\n          .filter((module) => module !== '');\n        if (showModules.length > 0) {\n          this.envShowModules = showModules;\n\n          console.log(\n            `%c[LoggerService] env CSLOGGER_RENDERER_SHOW_MODULES loaded: ${this.envShowModules.join(' ')}`,\n            'color: blue; font-weight: bold',\n          );\n        }\n      }\n    }\n  }\n\n  /**\n   * Get the singleton instance of LoggerService\n   */\n  public static getInstance(): LoggerService {\n    if (!LoggerService.instance) {\n      LoggerService.instance = new LoggerService();\n    }\n    return LoggerService.instance;\n  }\n\n  /**\n   * Initialize window source for renderer process (can only be called once)\n   * @param window - The window identifier\n   * @returns The logger service instance\n   */\n  public initWindowSource(window: string): LoggerService {\n    if (this.window) {\n      console.warn(\n        '[LoggerService] window source already initialized, current: %s, want to set: %s',\n        this.window,\n        window,\n      );\n      return this;\n    }\n    this.window = window;\n    return this;\n  }\n\n  /**\n   * Create a new logger with module name and additional context\n   * @param module - The module name for logging\n   * @param context - Additional context data\n   * @returns A new logger instance with the specified context\n   */\n  public withContext(module: string, context?: Record<string, any>): LoggerService {\n    const newLogger = Object.create(this);\n\n    // Copy all properties from the base logger\n    newLogger.module = module;\n    newLogger.context = { ...this.context, ...context };\n\n    return newLogger;\n  }\n\n  /**\n   * Process and output log messages based on level and configuration\n   * @param level - The log level\n   * @param message - The log message\n   * @param data - Additional data to log\n   */\n  private processLog(level: LogLevel, message: string, data: any[]): void {\n    let windowSource = this.window;\n    if (!this.window) {\n      console.error('[LoggerService] window source not initialized, please initialize window source first');\n      windowSource = 'UNKNOWN';\n    }\n\n    const currentLevel = LEVEL_MAP[level];\n\n    // if in dev mode, check if the env variables are set and use the env level and show modules to skip logs\n    if (IS_DEV) {\n      if (this.envLevel !== LEVEL.NONE && currentLevel < LEVEL_MAP[this.envLevel]) {\n        return;\n      }\n      if (this.module && this.envShowModules.length > 0 && !this.envShowModules.includes(this.module)) {\n        return;\n      }\n    }\n\n    // skip log if level is lower than default level\n    if (currentLevel < LEVEL_MAP[this.level]) {\n      return;\n    }\n\n    const logMessage = this.module ? `[${this.module}] ${message}` : message;\n\n    switch (level) {\n      case LEVEL.ERROR:\n        console.error('%c<error>', 'color: red; font-weight: bold', logMessage, ...data);\n        break;\n      case LEVEL.WARN:\n        console.warn('%c<warn>', 'color: #FFA500; font-weight: bold', logMessage, ...data);\n        break;\n      case LEVEL.INFO:\n        console.info('%c<info>', 'color: #32CD32; font-weight: bold', logMessage, ...data);\n        break;\n      case LEVEL.VERBOSE:\n        console.debug('%c<verbose>', 'color: #808080', logMessage, ...data);\n        break;\n      case LEVEL.DEBUG:\n        console.debug('%c<debug>', 'color: #7B68EE', logMessage, ...data);\n        break;\n      case LEVEL.SILLY:\n        console.debug('%c<silly>', 'color: #808080', logMessage, ...data);\n        break;\n    }\n\n    // if the last data is an object with logToMain: true, force log to main\n    const forceLogToMain = data.length > 0 && data.at(-1)?.logToMain === true;\n\n    if (currentLevel >= LEVEL_MAP[this.logToMainLevel] || forceLogToMain) {\n      const source: LogSourceWithContext = {\n        process: 'renderer',\n        window: windowSource,\n        module: this.module,\n      };\n\n      if (Object.keys(this.context).length > 0) {\n        source.context = this.context;\n      }\n\n      // remove the last item if it is an object with logToMain: true\n      if (forceLogToMain) {\n        data = data.slice(0, -1);\n      }\n\n      // In renderer process, use window.api.logToMain to send log to main process\n      if (!IS_WORKER) {\n        window.electron.ipcRenderer.invoke(IPC_CHANNEL.APP_LOG_TO_MAIN, source, level, message, data);\n      } else {\n        // TODO support worker to send log to main process\n      }\n    }\n  }\n\n  /**\n   * Log log message\n   */\n  public log(message: string, ...data: LogContextData): void {\n    this.processLog(LEVEL.INFO, message, data);\n  }\n\n  /**\n   * Log error message\n   */\n  public error(message: string, ...data: LogContextData): void {\n    this.processLog(LEVEL.ERROR, message, data);\n  }\n\n  /**\n   * Log warning message\n   */\n  public warn(message: string, ...data: LogContextData): void {\n    this.processLog(LEVEL.WARN, message, data);\n  }\n\n  /**\n   * Log info message\n   */\n  public info(message: string, ...data: LogContextData): void {\n    this.processLog(LEVEL.INFO, message, data);\n  }\n\n  /**\n   * Log verbose message\n   */\n  public verbose(message: string, ...data: LogContextData): void {\n    this.processLog(LEVEL.VERBOSE, message, data);\n  }\n\n  /**\n   * Log debug message\n   */\n  public debug(message: string, ...data: LogContextData): void {\n    this.processLog(LEVEL.DEBUG, message, data);\n  }\n\n  /**\n   * Log silly level message\n   */\n  public silly(message: string, ...data: LogContextData): void {\n    this.processLog(LEVEL.SILLY, message, data);\n  }\n\n  /**\n   * Set the minimum log level\n   * @param level - The log level to set\n   */\n  public setLevel(level: LogLevel): void {\n    this.level = level;\n  }\n\n  /**\n   * Get the current log level\n   * @returns The current log level\n   */\n  public getLevel(): string {\n    return this.level;\n  }\n\n  /**\n   * Reset log level to environment default\n   */\n  public resetLevel(): void {\n    this.setLevel(DEFAULT_LEVEL);\n  }\n\n  /**\n   * Set the minimum level for logging to main process\n   * @param level - The log level to set\n   */\n  public setLogToMainLevel(level: LogLevel): void {\n    this.logToMainLevel = level;\n  }\n\n  /**\n   * Get the current log to main level\n   * @returns The current log to main level\n   */\n  public getLogToMainLevel(): LogLevel {\n    return this.logToMainLevel;\n  }\n\n  /**\n   * Reset log to main level to default\n   */\n  public resetLogToMainLevel(): void {\n    this.setLogToMainLevel(MAIN_LOG_LEVEL);\n  }\n}\n\nexport const loggerService = LoggerService.getInstance();\n"
  },
  {
    "path": "src/renderer/src/utils/ospy.ts",
    "content": "import '@huolala-tech/page-spy-plugin-ospy/dist/index.css';\n\nimport OSpy from '@huolala-tech/page-spy-plugin-ospy';\n\nimport { t } from '@/locales';\nimport { useSettingStore } from '@/store';\n\nlet oSpy: OSpy | null = null;\n\nexport const start = () => {\n  if (oSpy) return;\n\n  const storeSetting = useSettingStore();\n\n  oSpy = new OSpy({\n    lang: storeSetting.displayLang.includes('zh') ? 'zh' : 'en',\n    title: t('common.debug'),\n    primaryColor: 'var(--td-brand-color-active)',\n  });\n};\n\nexport const stop = () => {\n  if (!oSpy) return;\n\n  try {\n    oSpy?.abort?.();\n  } catch {}\n  oSpy = null;\n};\n"
  },
  {
    "path": "src/renderer/src/utils/request/api.ts",
    "content": "// axios配置  可自行根据项目进行更改，只需更改该文件即可，其他文件可以不动\nimport { ORIGIN, PREFIX } from '@shared/config/env';\nimport { VAxios } from '@shared/modules/request';\nimport type { AxiosTransform, CreateAxiosOptions } from '@shared/modules/request/axios/AxiosTransform';\nimport { ContentTypeEnum } from '@shared/modules/request/constants';\nimport { formatRequestDate, joinTimestamp, setObjToUrlParams } from '@shared/modules/request/utils';\nimport { isHttp, isString } from '@shared/modules/validate';\nimport type { AxiosInstance } from 'axios';\nimport { merge } from 'es-toolkit';\n\nimport { getTimeout } from '@/utils/tool';\n\n// 数据处理，方便区分多种处理方式\nconst transform: AxiosTransform = {\n  // 处理请求数据。如果数据不是预期格式，可直接抛出错误\n  transformRequestHook: (res, options) => {\n    const { isTransformResponse, isReturnNativeResponse } = options;\n\n    // 如果204无内容直接返回\n    const method = res.config.method?.toLowerCase();\n    if (res.status === 204 && ['put', 'patch', 'delete'].includes(method!)) {\n      return res;\n    }\n\n    // 是否返回原生响应头 比如：需要获取响应头时使用该属性\n    if (isReturnNativeResponse) {\n      return res;\n    }\n\n    // 不进行任何处理，直接返回\n    // 用于页面代码可能需要直接获取code，data，message这些信息时开启\n    if (!isTransformResponse) {\n      return res.data;\n    }\n\n    // 错误的时候返回\n    const { data } = res;\n    if (!data) {\n      throw new Error('请求接口错误');\n    }\n\n    //  这里 code为 后台统一的字段，需要在 types.ts内修改为项目自己的接口返回格式\n    const { code } = data;\n\n    // 这里逻辑可以根据项目进行修改\n    const hasSuccess = data && code === 0;\n    if (hasSuccess) {\n      return data.data;\n    }\n\n    throw new Error(`请求接口错误, 错误码: ${code}`);\n  },\n\n  // 请求前处理配置\n  beforeRequestHook: (config, options) => {\n    const { apiUrl, isJoinPrefix, urlPrefix, joinParamsToUrl, formatDate, joinTime = true } = options;\n\n    // 添加接口前缀\n    if (isJoinPrefix && urlPrefix && isString(urlPrefix) && !isHttp(config.url)) {\n      config.url = `${urlPrefix}${config.url}`;\n    }\n\n    // 将baseUrl拼接\n    if (apiUrl && isString(apiUrl) && !isHttp(config.url)) {\n      config.url = `${apiUrl}${config.url}`;\n    }\n    const params = config.params || {};\n    const data = config.data || false;\n\n    if (formatDate && data && !isString(data)) {\n      formatRequestDate(data);\n    }\n    if (config.method?.toUpperCase() === 'GET') {\n      if (!isString(params)) {\n        // 给 get 请求加上时间戳参数，避免从缓存中拿数据。\n        config.params = Object.assign(params || {}, joinTimestamp(joinTime, false));\n      } else {\n        // 兼容restful风格\n        config.url = `${config.url + params}${joinTimestamp(joinTime, true)}`;\n        config.params = undefined;\n      }\n    } else if (!isString(params)) {\n      if (formatDate) {\n        formatRequestDate(params);\n      }\n      if (\n        Reflect.has(config, 'data') &&\n        config.data &&\n        (Object.keys(config.data).length > 0 || data instanceof FormData)\n      ) {\n        config.data = data;\n        config.params = params;\n      } else {\n        // 非GET请求如果没有提供data，则将params视为data\n        config.data = params;\n        config.params = undefined;\n      }\n      if (joinParamsToUrl) {\n        config.url = setObjToUrlParams(config.url as string, { ...config.params, ...config.data });\n      }\n    } else {\n      // 兼容restful风格\n      config.url += params;\n      config.params = undefined;\n    }\n    // 设置超时时间\n    config.timeout = getTimeout(config?.timeout);\n    return config;\n  },\n\n  // 请求拦截器处理\n  requestInterceptors: (config, _options) => {\n    // 请求之前处理config\n    return config;\n  },\n\n  // 响应拦截器处理\n  responseInterceptors: (res) => {\n    return res;\n  },\n\n  // 响应错误处理\n  responseInterceptorsCatch: (error: any, instance: AxiosInstance) => {\n    const { config } = error;\n    if (!config || !config.requestOptions.retry) return Promise.reject(error);\n\n    config.retryCount = config.retryCount || 0;\n\n    if (config.retryCount >= config.requestOptions.retry.count) return Promise.reject(error);\n\n    config.retryCount += 1;\n\n    const backoff = new Promise((resolve) => {\n      setTimeout(() => {\n        resolve(config);\n      }, config.requestOptions.retry.delay || 1);\n    });\n    config.headers = { ...config.headers, 'Content-Type': ContentTypeEnum.Json };\n    return backoff.then((config) => instance.request(config!));\n  },\n};\n\nfunction createAxios(opt?: Partial<CreateAxiosOptions>) {\n  return new VAxios(\n    merge(\n      <CreateAxiosOptions>{\n        // https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#authentication_schemes\n        // 例如: authenticationScheme: 'Bearer'\n        authenticationScheme: '',\n        // 超时\n        timeout: 10 * 1000,\n        // 携带Cookie\n        withCredentials: true,\n        // 头信息\n        headers: { 'Content-Type': ContentTypeEnum.Json },\n        // 数据处理方式\n        transform,\n        // 配置项，下面的选项都可以在独立的接口请求中覆盖\n        requestOptions: {\n          // 接口地址\n          apiUrl: ORIGIN,\n          // 是否自动添加接口前缀\n          isJoinPrefix: true,\n          // 接口前缀\n          // 例如: https://www.baidu.com/api\n          urlPrefix: PREFIX,\n          // 是否返回原生响应头 比如：需要获取响应头时使用该属性\n          isReturnNativeResponse: false,\n          // 需要对返回数据进行处理\n          isTransformResponse: true,\n          // post请求的时候添加参数到url\n          joinParamsToUrl: false,\n          // 格式化提交参数时间\n          formatDate: true,\n          // 是否加入时间戳\n          joinTime: true,\n          // 是否忽略请求取消令牌\n          // 如果启用，则重复请求时不进行处理\n          // 如果禁用，则重复请求时会取消当前请求\n          ignoreCancelToken: true,\n          // 是否携带token\n          withToken: false,\n          // 重试\n          retry: {\n            count: 0,\n            delay: 1000,\n          },\n        },\n      },\n      opt || {},\n    ),\n  );\n}\nexport const request = createAxios();\n"
  },
  {
    "path": "src/renderer/src/utils/request/index.ts",
    "content": "import { request as apiRequest } from './api';\nimport { request as normalRequest } from './normal';\nimport { request as sseRequest } from './sse';\nimport { request as wsRequest } from './ws';\n\nexport { apiRequest, normalRequest, sseRequest, wsRequest };\n"
  },
  {
    "path": "src/renderer/src/utils/request/normal.ts",
    "content": "// axios配置  可自行根据项目进行更改，只需更改该文件即可，其他文件可以不动\nimport { VAxios } from '@shared/modules/request';\nimport type { AxiosTransform, CreateAxiosOptions } from '@shared/modules/request/axios/AxiosTransform';\nimport { ContentTypeEnum } from '@shared/modules/request/constants';\nimport { formatRequestDate, joinTimestamp, setObjToUrlParams } from '@shared/modules/request/utils';\nimport { isHttp, isString } from '@shared/modules/validate';\nimport type { AxiosInstance } from 'axios';\nimport { merge } from 'es-toolkit';\n\nimport { getTimeout } from '@/utils/tool';\n\n// 数据处理，方便区分多种处理方式\nconst transform: AxiosTransform = {\n  // 处理请求数据。如果数据不是预期格式，可直接抛出错误\n  transformRequestHook: (res, options) => {\n    const { isTransformResponse, isReturnNativeResponse } = options;\n\n    // 如果204无内容直接返回\n    const method = res.config.method?.toLowerCase();\n    if (res.status === 204 && ['put', 'patch', 'delete'].includes(method!)) {\n      return res;\n    }\n\n    // 是否返回原生响应头 比如：需要获取响应头时使用该属性\n    if (isReturnNativeResponse) {\n      return res;\n    }\n\n    // 不进行任何处理，直接返回\n    // 用于页面代码可能需要直接获取code，data，message这些信息时开启\n    if (!isTransformResponse) {\n      return res.data;\n    }\n\n    // 错误的时候返回\n    const { data } = res;\n    if (!data) {\n      throw new Error('请求接口错误');\n    }\n\n    return data as any;\n  },\n\n  // 请求前处理配置\n  beforeRequestHook: (config, options) => {\n    const { apiUrl, isJoinPrefix, urlPrefix, joinParamsToUrl, formatDate, joinTime = true } = options;\n\n    // 添加接口前缀\n    if (isJoinPrefix && urlPrefix && isString(urlPrefix) && !isHttp(config.url)) {\n      config.url = `${urlPrefix}${config.url}`;\n    }\n\n    // 将baseUrl拼接\n    if (apiUrl && isString(apiUrl) && !isHttp(config.url)) {\n      config.url = `${apiUrl}${config.url}`;\n    }\n    const params = config.params || {};\n    const data = config.data || false;\n\n    if (formatDate && data && !isString(data)) {\n      formatRequestDate(data);\n    }\n    if (config.method?.toUpperCase() === 'GET') {\n      if (!isString(params)) {\n        // 给 get 请求加上时间戳参数，避免从缓存中拿数据。\n        config.params = Object.assign(params || {}, joinTimestamp(joinTime, false));\n      } else {\n        // 兼容restful风格\n        config.url = `${config.url + params}${joinTimestamp(joinTime, true)}`;\n        config.params = undefined;\n      }\n    } else if (!isString(params)) {\n      if (formatDate) {\n        formatRequestDate(params);\n      }\n      if (\n        Reflect.has(config, 'data') &&\n        config.data &&\n        (Object.keys(config.data).length > 0 || data instanceof FormData)\n      ) {\n        config.data = data;\n        config.params = params;\n      } else {\n        // 非GET请求如果没有提供data，则将params视为data\n        config.data = params;\n        config.params = undefined;\n      }\n      if (joinParamsToUrl) {\n        config.url = setObjToUrlParams(config.url as string, { ...config.params, ...config.data });\n      }\n    } else {\n      // 兼容restful风格\n      config.url += params;\n      config.params = undefined;\n    }\n    // 设置超时时间\n    config.timeout = getTimeout(config?.timeout);\n    return config;\n  },\n\n  // 请求拦截器处理\n  requestInterceptors: (config, _options) => {\n    // 请求之前处理config\n    return config;\n  },\n\n  // 响应拦截器处理\n  responseInterceptors: (res) => {\n    return res;\n  },\n\n  // 响应错误处理\n  responseInterceptorsCatch: (error: any, instance: AxiosInstance) => {\n    const { config } = error;\n    if (!config || !config.requestOptions.retry) return Promise.reject(error);\n\n    config.retryCount = config.retryCount || 0;\n\n    if (config.retryCount >= config.requestOptions.retry.count) return Promise.reject(error);\n\n    config.retryCount += 1;\n\n    const backoff = new Promise((resolve) => {\n      setTimeout(() => {\n        resolve(config);\n      }, config.requestOptions.retry.delay || 1);\n    });\n    config.headers = { ...config.headers, 'Content-Type': ContentTypeEnum.Json };\n    return backoff.then((config) => instance.request(config!));\n  },\n};\n\nfunction createAxios(opt?: Partial<CreateAxiosOptions>) {\n  return new VAxios(\n    merge(\n      <CreateAxiosOptions>{\n        // https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#authentication_schemes\n        // 例如: authenticationScheme: 'Bearer'\n        authenticationScheme: '',\n        // 超时\n        timeout: 10 * 1000,\n        // 携带Cookie\n        withCredentials: false,\n        // 头信息\n        headers: { 'Content-Type': ContentTypeEnum.Json },\n        // 数据处理方式\n        transform,\n        // 配置项，下面的选项都可以在独立的接口请求中覆盖\n        requestOptions: {\n          // 接口地址\n          apiUrl: '',\n          // apiUrl: host,\n          // 是否自动添加接口前缀\n          isJoinPrefix: true,\n          // 接口前缀\n          // 例如: https://www.baidu.com/api\n          urlPrefix: '',\n          // 是否返回原生响应头 比如：需要获取响应头时使用该属性\n          isReturnNativeResponse: true,\n          // 需要对返回数据进行处理\n          isTransformResponse: true,\n          // post请求的时候添加参数到url\n          joinParamsToUrl: false,\n          // 格式化提交参数时间\n          formatDate: true,\n          // 是否加入时间戳\n          joinTime: true,\n          // 是否忽略请求取消令牌\n          // 如果启用，则重复请求时不进行处理\n          // 如果禁用，则重复请求时会取消当前请求\n          ignoreCancelToken: true,\n          // 是否携带token\n          withToken: false,\n          // 重试\n          retry: {\n            count: 0,\n            delay: 1000,\n          },\n        },\n      },\n      opt || {},\n    ),\n  );\n}\nexport const request = createAxios();\n"
  },
  {
    "path": "src/renderer/src/utils/request/sse.ts",
    "content": "// sse配置  可自行根据项目进行更改，只需更改该文件即可，其他文件可以不动\nimport { ORIGIN, PREFIX } from '@shared/config/env';\nimport { VSse } from '@shared/modules/request';\nimport { ContentTypeEnum } from '@shared/modules/request/constants';\nimport type { ICreateSseInsOptions, ISseTransform } from '@shared/modules/request/sse/SseTransform';\nimport { formatRequestDate, joinTimestamp, setObjToUrlParams } from '@shared/modules/request/utils';\nimport { isString, merge } from 'es-toolkit';\n\nimport { getTimeout } from '@/utils/tool';\n\n// 数据处理，方便区分多种处理方式\nconst transform: ISseTransform = {\n  // 处理请求数据。如果数据不是预期格式，可直接抛出错误\n  transformRequestHook: (res, options) => {\n    const { isTransformResponse, isReturnNativeResponse } = options;\n\n    // 是否返回原生响应头 比如：需要获取响应头时使用该属性\n    if (isReturnNativeResponse) {\n      return res;\n    }\n\n    // 不进行任何处理，直接返回\n    // 用于页面代码可能需要直接获取code，data，message这些信息时开启\n    if (!isTransformResponse) {\n      return res.data;\n    }\n\n    return res;\n  },\n\n  // 请求前处理配置\n  beforeRequestHook: (config, options) => {\n    const { apiUrl, isJoinPrefix, urlPrefix, joinParamsToUrl, formatDate, joinTime = true } = options;\n\n    if (!config.url.startsWith('http') && !config.url.startsWith('https')) {\n      // 添加接口前缀\n      if (isJoinPrefix && urlPrefix && isString(urlPrefix)) {\n        config.url = `${urlPrefix}${config.url}`;\n      }\n\n      // 将baseUrl拼接\n      if (apiUrl && isString(apiUrl)) {\n        config.url = `${apiUrl}${config.url}`;\n      }\n    }\n\n    const params = config.params || {};\n    const data = config.data || {};\n\n    if (formatDate && data && !isString(data)) {\n      formatRequestDate(data);\n    }\n    if (config.method?.toUpperCase() === 'GET') {\n      if (!isString(params)) {\n        // 给 get 请求加上时间戳参数，避免从缓存中拿数据。\n        config.params = Object.assign(params || {}, joinTimestamp(joinTime, false));\n      } else {\n        // 兼容restful风格\n        config.url = `${config.url + params}${joinTimestamp(joinTime, true)}`;\n        config.params = undefined;\n      }\n    } else if (!isString(params)) {\n      if (formatDate) {\n        formatRequestDate(params);\n      }\n      if (\n        Reflect.has(config, 'data') &&\n        config.data &&\n        (Object.keys(config.data).length > 0 || data instanceof FormData)\n      ) {\n        config.data = data;\n        config.params = params;\n      } else {\n        // 非GET请求如果没有提供data，则将params视为data\n        config.data = params;\n        config.params = undefined;\n      }\n      if (joinParamsToUrl) {\n        config.url = setObjToUrlParams(config.url as string, { ...config.params, ...config.data });\n      }\n    } else {\n      // 兼容restful风格\n      config.url += params;\n      config.params = undefined;\n    }\n    // 设置超时时间\n    config.timeout = getTimeout(config?.timeout);\n    return config;\n  },\n\n  // 请求拦截器处理\n  requestInterceptors: (config, _options) => {\n    // 请求之前处理config\n    return config;\n  },\n\n  // 响应拦截器处理\n  responseInterceptors: (res) => {\n    return res.data;\n  },\n\n  // 响应错误处理\n  responseInterceptorsCatch: (error: any) => {\n    throw error;\n  },\n};\n\nfunction createSse(opt?: Partial<ICreateSseInsOptions>) {\n  return new VSse(\n    merge(\n      <ICreateSseInsOptions>{\n        // https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#authentication_schemes\n        // 例如: authenticationScheme: 'Bearer'\n        authenticationScheme: '',\n        // 超时\n        timeout: 10 * 1000,\n        // 携带Cookie\n        withCredentials: true,\n        // 头信息\n        headers: { 'Content-Type': ContentTypeEnum.Json },\n        // 数据处理方式\n        transform,\n        // 配置项，下面的选项都可以在独立的接口请求中覆盖\n        requestOptions: {\n          // 接口地址\n          apiUrl: ORIGIN,\n          // 是否自动添加接口前缀\n          isJoinPrefix: true,\n          // 接口前缀\n          // 例如: https://www.baidu.com/api\n          urlPrefix: PREFIX,\n          // 是否返回原生响应头 比如：需要获取响应头时使用该属性\n          isReturnNativeResponse: false,\n          // 需要对返回数据进行处理\n          isTransformResponse: true,\n          // post请求的时候添加参数到url\n          joinParamsToUrl: false,\n          // 格式化提交参数时间\n          formatDate: true,\n          // 是否加入时间戳\n          joinTime: true,\n          // 是否忽略请求取消令牌\n          // 如果启用，则重复请求时不进行处理\n          // 如果禁用，则重复请求时会取消当前请求\n          ignoreCancelToken: false,\n          // 是否携带token\n          withToken: false,\n          // 重试\n          retry: {\n            count: 0,\n            delay: 1000,\n          },\n        },\n      },\n      opt || {},\n    ),\n  );\n}\nexport const request = createSse();\n"
  },
  {
    "path": "src/renderer/src/utils/request/ws.ts",
    "content": "// sse配置  可自行根据项目进行更改，只需更改该文件即可，其他文件可以不动\nimport { ORIGIN, PREFIX } from '@shared/config/env';\nimport { VWs } from '@shared/modules/request';\nimport { ContentTypeEnum } from '@shared/modules/request/constants';\nimport { formatRequestDate, joinTimestamp, setObjToUrlParams } from '@shared/modules/request/utils';\nimport type { ICreateWsInsOptions, IWsTransform } from '@shared/modules/request/ws/WsTransform';\nimport { isString, merge } from 'es-toolkit';\n\n// 数据处理，方便区分多种处理方式\nconst transform: IWsTransform = {\n  // 处理请求数据。如果数据不是预期格式，可直接抛出错误\n  transformRequestHook: (res, options) => {\n    const { isTransformResponse, isReturnNativeResponse } = options;\n\n    // 是否返回原生响应头 比如：需要获取响应头时使用该属性\n    if (isReturnNativeResponse) {\n      return res;\n    }\n\n    // 不进行任何处理，直接返回\n    // 用于页面代码可能需要直接获取code，data，message这些信息时开启\n    if (!isTransformResponse) {\n      return res.data;\n    }\n\n    return res;\n  },\n\n  // 请求前处理配置\n  beforeRequestHook: (config, options) => {\n    const { apiUrl, isJoinPrefix, urlPrefix, joinParamsToUrl, formatDate, joinTime = true } = options;\n\n    if (!config.url.startsWith('ws') && !config.url.startsWith('wss')) {\n      // 添加接口前缀\n      if (isJoinPrefix && urlPrefix && isString(urlPrefix)) {\n        config.url = `${urlPrefix}${config.url}`;\n      }\n\n      // 将baseUrl拼接\n      if (apiUrl && isString(apiUrl)) {\n        config.url = `${apiUrl}${config.url}`;\n      }\n    }\n\n    const params = config.params || {};\n    const data = config.data || {};\n\n    if (formatDate && data && !isString(data)) {\n      formatRequestDate(data);\n    }\n    if (config.method?.toUpperCase() === 'GET') {\n      if (!isString(params)) {\n        // 给 get 请求加上时间戳参数，避免从缓存中拿数据。\n        config.params = Object.assign(params || {}, joinTimestamp(joinTime, false));\n      } else {\n        // 兼容restful风格\n        config.url = `${config.url + params}${joinTimestamp(joinTime, true)}`;\n        config.params = undefined;\n      }\n    } else if (!isString(params)) {\n      if (formatDate) {\n        formatRequestDate(params);\n      }\n      if (\n        !(\n          Reflect.has(config, 'data') &&\n          config.data &&\n          (Object.keys(config.data).length > 0 || data instanceof FormData)\n        )\n      ) {\n        // 非GET请求如果没有提供data，则将params视为data\n        config.data = params;\n        config.params = undefined;\n      }\n      if (joinParamsToUrl) {\n        config.url = setObjToUrlParams(config.url as string, { ...config.params, ...config.data });\n      }\n    } else {\n      // 兼容restful风格\n      config.url += params;\n      config.params = undefined;\n    }\n    return config;\n  },\n\n  // 请求拦截器处理\n  requestInterceptors: (config, _options) => {\n    // 请求之前处理config\n    return config;\n  },\n\n  // 响应拦截器处理\n  responseInterceptors: (res) => {\n    return res.data;\n  },\n\n  // 响应错误处理\n  responseInterceptorsCatch: (error: any) => {\n    throw error;\n  },\n};\n\nfunction createWs(opt?: Partial<ICreateWsInsOptions>) {\n  return new VWs(\n    merge(\n      <ICreateWsInsOptions>{\n        // https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#authentication_schemes\n        // 例如: authenticationScheme: 'Bearer'\n        authenticationScheme: '',\n        // 超时\n        timeout: 10 * 1000,\n        // 携带Cookie\n        withCredentials: true,\n        // 头信息\n        headers: { 'Content-Type': ContentTypeEnum.Json },\n        // 数据处理方式\n        transform,\n        // 配置项，下面的选项都可以在独立的接口请求中覆盖\n        requestOptions: {\n          // 接口地址\n          apiUrl: ORIGIN,\n          // 是否自动添加接口前缀\n          isJoinPrefix: true,\n          // 接口前缀\n          // 例如: https://www.baidu.com/api\n          urlPrefix: PREFIX,\n          // 是否返回原生响应头 比如：需要获取响应头时使用该属性\n          isReturnNativeResponse: false,\n          // 需要对返回数据进行处理\n          isTransformResponse: true,\n          // post请求的时候添加参数到url\n          joinParamsToUrl: false,\n          // 格式化提交参数时间\n          formatDate: true,\n          // 是否加入时间戳\n          joinTime: true,\n          // 是否忽略请求取消令牌\n          // 如果启用，则重复请求时不进行处理\n          // 如果禁用，则重复请求时会取消当前请求\n          ignoreCancelToken: false,\n          // 是否携带token\n          withToken: false,\n          // 重试\n          retry: {\n            count: 0,\n            delay: 1000,\n          },\n        },\n      },\n      opt || {},\n    ),\n  );\n}\nexport const request = createWs();\n"
  },
  {
    "path": "src/renderer/src/utils/setup.ts",
    "content": "import { isElectron, platform } from '@/utils/systeminfo';\n\nexport const dom = () => {\n  document.documentElement.setAttribute('platform', platform);\n  document.documentElement.setAttribute('desktop', String(isElectron));\n};\n"
  },
  {
    "path": "src/renderer/src/utils/systeminfo.ts",
    "content": "import type { IPlatform } from '@shared/types/systeminfo';\n\nexport const platformNavigator: IPlatform = (() => {\n  const plat = (navigator as any).userAgentData?.platform || navigator.platform;\n  if (/win/i.test(plat)) return 'win32';\n  if (/mac|darwin/i.test(plat)) return 'darwin';\n  if (/harmony/i.test(plat)) return 'ohos'; // It has to be prioritized over Linux, which is the underlying layer of OpenHarmony.\n  if (/linux/i.test(plat)) return 'linux';\n  return 'unknown';\n})();\nexport const platformElectron: IPlatform = (() => {\n  const plat = window?.electron?.process?.platform;\n  if (plat === 'win32') return 'win32';\n  if (plat === 'darwin') return 'darwin';\n  if (plat === 'linux') return 'linux';\n  if (plat === 'ohos' || plat === 'openharmony' || plat === 'harmonyos') return 'ohos';\n  return 'unknown';\n})();\nexport const platform: IPlatform = (() => {\n  if (window?.electron?.process?.platform) {\n    return platformElectron;\n  }\n  return platformNavigator;\n})();\n\nexport const isMacOS: boolean = platform === 'darwin';\nexport const isWindows: boolean = platform === 'win32';\nexport const isLinux: boolean = platform === 'linux';\nexport const isOhOS: boolean = platform === 'ohos';\n\nexport const isElectronNavigator: boolean = navigator.userAgent.toLowerCase().includes('electron');\nexport const isElectronElectron: boolean = !!window?.electron?.process?.versions?.electron;\nexport const isElectron: boolean = (() => {\n  if (window?.electron?.process?.versions?.electron) {\n    return isElectronNavigator;\n  }\n  return isElectronNavigator;\n})();\n\nexport const isDev: boolean = import.meta.env.DEV;\nexport const isProd: boolean = import.meta.env.PROD;\n\nexport const delimiter = isWindows ? '\\\\' : '/';\n\nexport default {\n  isElectron,\n  isWindows,\n  isLinux,\n  isMacOS,\n  isOhOS,\n  isDev,\n  isProd,\n  delimiter,\n  platform,\n};\n"
  },
  {
    "path": "src/renderer/src/utils/tool.ts",
    "content": "import { isPositiveFiniteNumber } from '@shared/modules/validate';\n\nimport { useBrowserStore, usePlayerStore, useSettingStore } from '@/store';\n\nexport const getPinia = (store: string, key: string): any => {\n  switch (store) {\n    case 'browser': {\n      const storePlay = useBrowserStore();\n      return storePlay[key] || null;\n    }\n    case 'play': {\n      const storePlay = usePlayerStore();\n      return storePlay[key] || null;\n    }\n    case 'setting': {\n      const storeSetting = useSettingStore();\n      return storeSetting[key] || null;\n    }\n    default:\n      return null;\n  }\n};\n\n/**\n * Get timeout value\n * Priority: Current > Option > Database > Default\n * @param timeout Current timeout(ms)\n * @param optionTimeout Option timeout(ms)\n * @returns Timeout(ms)\n */\nexport const getTimeout = (timeout?: number, optionTimeout?: number): number => {\n  const MAX_TIMEOUT = 60 * 1000;\n  const MIN_TIMEOUT = 0;\n  const DEFAULT_TIMEOUT = 10 * 1000;\n\n  const storeTimeout = Number.parseInt(String(getPinia('setting', 'timeout')));\n\n  const isVisable = (val?: number): boolean => {\n    if (isPositiveFiniteNumber(val) && val! >= MIN_TIMEOUT && val! <= MAX_TIMEOUT) {\n      return true;\n    }\n    return false;\n  };\n\n  if (isVisable(timeout)) return timeout as number;\n  if (isVisable(optionTimeout)) return optionTimeout as number;\n  if (isVisable(storeTimeout)) return storeTimeout as number;\n\n  return DEFAULT_TIMEOUT;\n};\n"
  },
  {
    "path": "src/renderer/src/utils/vitalsObserver.ts",
    "content": "import type { Metric } from 'web-vitals';\nimport { onCLS, onFCP, onINP, onLCP, onTTFB } from 'web-vitals';\n\ntype IVitalMetric =\n  | (Metric & { type: 'web-vital' })\n  | {\n      type: 'longtask';\n      name: string;\n      startTime: number;\n      duration: number;\n      attribution?: Record<string, unknown>;\n    };\n\ntype IReporter = (metric: IVitalMetric) => void;\n\nconst defaultReporter: IReporter = (metric) => {\n  const label = metric.type === 'web-vital' ? metric.name : 'longtask';\n  console.info('[performance]', label, metric);\n};\n\nlet hasStarted = false;\nlet longTaskObserver: PerformanceObserver | null = null;\n\nexport const start = (reporter: IReporter = defaultReporter) => {\n  if (hasStarted || typeof window === 'undefined') return;\n  hasStarted = true;\n\n  const report = (metric: Metric) => {\n    reporter({ ...metric, type: 'web-vital' });\n  };\n\n  onCLS(report, { reportAllChanges: true });\n  onFCP(report);\n  onINP(report, { reportAllChanges: true });\n  onLCP(report, { reportAllChanges: true });\n  onTTFB(report);\n\n  if (\n    'PerformanceObserver' in window &&\n    Array.isArray((PerformanceObserver as any).supportedEntryTypes) &&\n    (PerformanceObserver as any).supportedEntryTypes.includes('longtask')\n  ) {\n    longTaskObserver = new PerformanceObserver((entryList) => {\n      for (const entry of entryList.getEntries()) {\n        reporter({\n          type: 'longtask',\n          name: entry.name || 'longtask',\n          startTime: entry.startTime,\n          duration: entry.duration,\n          attribution: (entry as any).attribution,\n        });\n      }\n    });\n\n    try {\n      longTaskObserver.observe({ type: 'longtask', buffered: true });\n    } catch (error) {\n      console.warn('[performance] longtask observer failed:', error);\n    }\n  }\n};\n\nexport const stop = () => {\n  if (!hasStarted) return;\n\n  if (longTaskObserver) {\n    try {\n      longTaskObserver.disconnect();\n    } catch {}\n    longTaskObserver = null;\n  }\n\n  hasStarted = false;\n};\n"
  },
  {
    "path": "tests/__mocks__/MainLoggerService.ts",
    "content": "/* oslint-disable @typescript-eslint/no-empty-function */\n\n// Simple mock LoggerService class for main process\nexport class MockMainLoggerService {\n  private static instance: MockMainLoggerService;\n\n  public static getInstance(): MockMainLoggerService {\n    if (!MockMainLoggerService.instance) {\n      MockMainLoggerService.instance = new MockMainLoggerService();\n    }\n    return MockMainLoggerService.instance;\n  }\n\n  public static resetInstance(): void {\n    MockMainLoggerService.instance = new MockMainLoggerService();\n  }\n\n  public withContext(): MockMainLoggerService {\n    return this;\n  }\n\n  public finish(): void {}\n  public setLevel(): void {}\n  public getLevel(): string {\n    return 'silly';\n  }\n\n  public resetLevel(): void {}\n  public getLogsDir(): string {\n    return '/mock/logs';\n  }\n\n  public getBaseLogger(): any {\n    return {};\n  }\n\n  public error(...args: any[]): void {\n    console.error(...args);\n  }\n\n  public warn(...args: any[]): void {\n    console.warn(...args);\n  }\n\n  public info(...args: any[]): void {\n    console.info(...args);\n  }\n\n  public verbose(...args: any[]): void {\n    console.log(...args);\n  }\n\n  public debug(...args: any[]): void {\n    console.debug(...args);\n  }\n\n  public silly(...args: any[]): void {\n    console.log(...args);\n  }\n}\n\n// Create and export the mock instance\nexport const mockMainLoggerService = MockMainLoggerService.getInstance();\n\n// Mock the LoggerService module for main process\nconst MainLoggerServiceMock = {\n  LoggerService: MockMainLoggerService,\n  loggerService: mockMainLoggerService,\n};\n\nexport default MainLoggerServiceMock;\n"
  },
  {
    "path": "tests/__mocks__/RendererLoggerService.ts",
    "content": "/* oxlint-disable @typescript-eslint/no-empty-function */\n\n// Simple mock LoggerService class for renderer process\nexport class MockRendererLoggerService {\n  private static instance: MockRendererLoggerService;\n\n  public static getInstance(): MockRendererLoggerService {\n    if (!MockRendererLoggerService.instance) {\n      MockRendererLoggerService.instance = new MockRendererLoggerService();\n    }\n    return MockRendererLoggerService.instance;\n  }\n\n  public static resetInstance(): void {\n    MockRendererLoggerService.instance = new MockRendererLoggerService();\n  }\n\n  public initWindowSource(): void {}\n  public withContext(): MockRendererLoggerService {\n    return this;\n  }\n\n  public setLevel(): void {}\n  public getLevel(): string {\n    return 'silly';\n  }\n\n  public resetLevel(): void {}\n  public error(...args: any[]): void {\n    console.error(...args);\n  }\n\n  public warn(...args: any[]): void {\n    console.warn(...args);\n  }\n\n  public info(...args: any[]): void {\n    console.info(...args);\n  }\n\n  public verbose(...args: any[]): void {\n    console.log(...args);\n  }\n\n  public debug(...args: any[]): void {\n    console.debug(...args);\n  }\n\n  public silly(...args: any[]): void {\n    console.log(...args);\n  }\n}\n\n// Create and export the mock instance\nexport const mockRendererLoggerService = MockRendererLoggerService.getInstance();\n\n// Mock the LoggerService module\nconst RendererLoggerServiceMock = {\n  LoggerService: MockRendererLoggerService,\n  loggerService: mockRendererLoggerService,\n};\n\nexport default RendererLoggerServiceMock;\n"
  },
  {
    "path": "tests/main.setup.ts",
    "content": "import { vi } from 'vitest';\n\n// Mock LoggerService globally for main process tests\nvi.mock('@logger', async () => {\n  const { MockMainLoggerService, mockMainLoggerService } = await import('./__mocks__/MainLoggerService');\n  return {\n    LoggerService: MockMainLoggerService,\n    loggerService: mockMainLoggerService,\n  };\n});\n\n// Mock electron modules that are commonly used in main process\nvi.mock('electron', () => ({\n  app: {\n    getPath: vi.fn((key: string) => {\n      switch (key) {\n        case 'userData':\n          return '/mock/userData';\n        case 'temp':\n          return '/mock/temp';\n        case 'logs':\n          return '/mock/logs';\n        default:\n          return '/mock/unknown';\n      }\n    }),\n    getVersion: vi.fn(() => '1.0.0'),\n  },\n  ipcMain: {\n    handle: vi.fn(),\n    on: vi.fn(),\n    once: vi.fn(),\n    removeHandler: vi.fn(),\n    removeAllListeners: vi.fn(),\n  },\n  BrowserWindow: vi.fn(),\n  dialog: {\n    showErrorBox: vi.fn(),\n    showMessageBox: vi.fn(),\n    showOpenDialog: vi.fn(),\n    showSaveDialog: vi.fn(),\n  },\n  shell: {\n    openExternal: vi.fn(),\n    showItemInFolder: vi.fn(),\n  },\n  session: {\n    defaultSession: {\n      clearCache: vi.fn(),\n      clearStorageData: vi.fn(),\n    },\n  },\n  webContents: {\n    getAllWebContents: vi.fn(() => []),\n  },\n  systemPreferences: {\n    getMediaAccessStatus: vi.fn(),\n    askForMediaAccess: vi.fn(),\n  },\n  screen: {\n    getPrimaryDisplay: vi.fn(),\n    getAllDisplays: vi.fn(),\n  },\n  Notification: vi.fn(),\n}));\n\n// Mock Winston for LoggerService dependencies\nvi.mock('winston', () => ({\n  createLogger: vi.fn(() => ({\n    log: vi.fn(),\n    error: vi.fn(),\n    warn: vi.fn(),\n    info: vi.fn(),\n    debug: vi.fn(),\n    level: 'info',\n    on: vi.fn(),\n    end: vi.fn(),\n  })),\n  format: {\n    combine: vi.fn(),\n    splat: vi.fn(),\n    timestamp: vi.fn(),\n    errors: vi.fn(),\n    json: vi.fn(),\n  },\n  transports: {\n    Console: vi.fn(),\n    File: vi.fn(),\n  },\n}));\n\n// Mock winston-daily-rotate-file\nvi.mock('winston-daily-rotate-file', () => {\n  return vi.fn().mockImplementation(() => ({\n    on: vi.fn(),\n    log: vi.fn(),\n  }));\n});\n\n// Mock Node.js modules\nvi.mock('node:os', () => ({\n  platform: vi.fn(() => 'darwin'),\n  arch: vi.fn(() => 'x64'),\n  version: vi.fn(() => '20.0.0'),\n  cpus: vi.fn(() => [{ model: 'Mock CPU' }]),\n  totalmem: vi.fn(() => 8 * 1024 * 1024 * 1024), // 8GB\n}));\n\nvi.mock('node:path', async () => {\n  const actual = await vi.importActual('node:path');\n  return {\n    ...actual,\n    join: vi.fn((...args: string[]) => args.join('/')),\n    resolve: vi.fn((...args: string[]) => args.join('/')),\n  };\n});\n\nvi.mock('node:fs', () => ({\n  promises: {\n    access: vi.fn(),\n    readFile: vi.fn(),\n    writeFile: vi.fn(),\n    mkdir: vi.fn(),\n    readdir: vi.fn(),\n    stat: vi.fn(),\n    unlink: vi.fn(),\n    rmdir: vi.fn(),\n  },\n  existsSync: vi.fn(),\n  readFileSync: vi.fn(),\n  writeFileSync: vi.fn(),\n  mkdirSync: vi.fn(),\n  readdirSync: vi.fn(),\n  statSync: vi.fn(),\n  unlinkSync: vi.fn(),\n  rmdirSync: vi.fn(),\n  createReadStream: vi.fn(),\n  createWriteStream: vi.fn(),\n}));\n"
  },
  {
    "path": "tests/renderer.setup.ts",
    "content": "import '@testing-library/jest-dom/vitest';\n\nimport { styleSheetSerializer } from 'jest-styled-components/serializer';\nimport { expect, vi } from 'vitest';\n\nexpect.addSnapshotSerializer(styleSheetSerializer);\n\n// Mock LoggerService globally for renderer tests\nvi.mock('@logger', async () => {\n  const { MockRendererLoggerService, mockRendererLoggerService } = await import('./__mocks__/RendererLoggerService');\n  return {\n    LoggerService: MockRendererLoggerService,\n    loggerService: mockRendererLoggerService,\n  };\n});\n\n// Mock uuid globally for renderer tests\nlet uuidCounter = 0;\nvi.mock('uuid', () => ({\n  v4: () => `test-uuid-${++uuidCounter}`,\n}));\n\nvi.mock('axios', () => {\n  const defaultAxiosMock = {\n    get: vi.fn().mockResolvedValue({ data: {} }), // Mocking axios GET request\n    post: vi.fn().mockResolvedValue({ data: {} }), // Mocking axios POST request\n    // You can add other axios methods like put, delete etc. as needed\n  };\n\n  const isAxiosError = (error: unknown): error is { isAxiosError?: boolean } =>\n    Boolean((error as { isAxiosError?: boolean } | undefined)?.isAxiosError);\n\n  return {\n    default: defaultAxiosMock,\n    isAxiosError,\n  };\n});\n\nvi.stubGlobal('electron', {\n  ipcRenderer: {\n    on: vi.fn(),\n    send: vi.fn(),\n  },\n});\nvi.stubGlobal('api', {\n  file: {\n    read: vi.fn().mockResolvedValue('[]'),\n    writeWithId: vi.fn().mockResolvedValue(undefined),\n  },\n});\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"tsDecorators\": \"legacy\",\n  \"files\": [],\n  \"references\": [\n    { \"path\": \"./tsconfig.node.json\" },\n    { \"path\": \"./tsconfig.web.json\" }\n  ],\n  \"compilerOptions\": {\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n    \"useDefineForClassFields\": true,\n    \"baseUrl\": \".\",\n  }\n}\n"
  },
  {
    "path": "tsconfig.node.json",
    "content": "{\n  \"extends\": \"@electron-toolkit/tsconfig/tsconfig.node.json\",\n  \"include\": [\n    \"electron.vite.config.*\",\n    \"scripts\",\n    \"src/main/**/*\",\n    \"src/main/env.d.ts\",\n    \"src/preload/**/*\",\n    \"packages/shared/**/*\",\n  ],\n  \"exclude\": [\n    \"src/main/services/FastifyService/routes/v1/film/cms/adapter/t3AppMumo.ts\",\n    \"src/main/services/FastifyService/routes/v1/film/cms/adapter/t3AppGet.ts\",\n  ],\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"incremental\": true,\n    \"tsBuildInfoFile\": \".tsbuildinfo/tsconfig.node.tsbuildinfo\",\n    \"moduleResolution\": \"bundler\",\n    \"types\": [\"electron-vite/node\", \"vitest/globals\"],\n    \"paths\": {\n      \"@main/*\": [\"./src/main/*\"],\n      \"@preload/*\": [\"./src/preload/*\"],\n      \"@renderer/*\": [\"./src/renderer/*\"],\n      \"@shared/*\": [\"./packages/shared/*\"],\n      \"@db/*\": [\"./src/main/services/DatabaseService/*\"],\n      \"@server/*\": [\"./src/main/services/FastifyService/*\"],\n      \"@logger\": [\"./src/main/services/LoggerService\"],\n      \"@pkg\": [\"./package.json\"]\n    },\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n    \"useDefineForClassFields\": true\n  }\n}\n"
  },
  {
    "path": "tsconfig.web.json",
    "content": "{\n  \"extends\": \"@electron-toolkit/tsconfig/tsconfig.web.json\",\n  \"include\": [\n    \"src/renderer/src/**/*\",\n    \"src/preload/**/*\",\n    \"packages/shared/**/*\",\n  ],\n  \"exclude\": [\n    \"src/renderer/src/pages/lab/components/edit/utils/inject/**/*\"\n  ],\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"incremental\": true,\n    \"tsBuildInfoFile\": \".tsbuildinfo/tsconfig.web.tsbuildinfo\",\n    \"jsx\": \"preserve\",\n    \"jsxImportSource\": \"vue\",\n    \"moduleResolution\": \"bundler\",\n    \"types\": [\"vite/client\", \"vitest/globals\"],\n    \"paths\": {\n      \"@/*\": [\"./src/renderer/src/*\"],\n      \"@main/*\": [\"./src/main/*\"],\n      \"@preload/*\": [\"./src/preload/*\"],\n      \"@renderer/*\": [\"./src/renderer/*\"],\n      \"@shared/*\": [\"./packages/shared/*\"],\n      \"@logger\": [\"./src/main/services/LoggerService\"],\n      \"@pkg\": [\"./package.json\"]\n    },\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n    \"useDefineForClassFields\": true\n  }\n}\n"
  },
  {
    "path": "vitest.config.ts",
    "content": "import { resolve } from 'node:path';\n\nimport { defineConfig } from 'vitest/config';\n\nimport electronViteConfig from './electron.vite.config';\n\nconst mainConfig = (electronViteConfig as any).main;\nconst rendererConfig = (electronViteConfig as any).renderer;\n\nexport default defineConfig({\n  test: {\n    projects: [\n      // main\n      {\n        extends: true,\n        plugins: mainConfig.plugins,\n        resolve: {\n          alias: mainConfig.resolve.alias,\n        },\n        test: {\n          name: 'main',\n          environment: 'node',\n          setupFiles: ['tests/main.setup.ts'],\n          include: ['src/main/**/*.{test,spec}.{ts,tsx}', 'src/main/**/__tests__/**/*.{test,spec}.{ts,tsx}'],\n        },\n      },\n      // renderer\n      {\n        extends: true,\n        plugins: rendererConfig.plugins,\n        resolve: {\n          alias: rendererConfig.resolve.alias,\n        },\n        test: {\n          name: 'renderer',\n          environment: 'jsdom',\n          setupFiles: ['@vitest/web-worker', 'tests/renderer.setup.ts'],\n          include: ['src/renderer/**/*.{test,spec}.{ts,tsx}', 'src/renderer/**/__tests__/**/*.{test,spec}.{ts,tsx}'],\n        },\n      },\n      // shared\n      {\n        extends: true,\n        resolve: {\n          alias: {\n            '@shared': resolve('packages/shared'),\n          },\n        },\n        test: {\n          name: 'shared',\n          environment: 'node',\n          include: [\n            'packages/shared/**/*.{test,spec}.{ts,tsx}',\n            'packages/shared/**/__tests__/**/*.{test,spec}.{ts,tsx}',\n          ],\n        },\n      },\n      // script\n      {\n        extends: true,\n        test: {\n          name: 'scripts',\n          environment: 'node',\n          include: ['scripts/**/*.{test,spec}.{ts,tsx}', 'scripts/**/__tests__/**/*.{test,spec}.{ts,tsx}'],\n        },\n      },\n    ],\n    // global\n    globals: true,\n    setupFiles: [],\n    exclude: ['**/node_modules/**', '**/dist/**', '**/out/**', '**/build/**'],\n    coverage: {\n      provider: 'v8',\n      reporter: ['text', 'json', 'html', 'lcov', 'text-summary'],\n      exclude: [\n        '**/node_modules/**',\n        '**/dist/**',\n        '**/out/**',\n        '**/build/**',\n        '**/coverage/**',\n        '**/tests/**',\n        '**/.yarn/**',\n        '**/.cursor/**',\n        '**/.vscode/**',\n        '**/.github/**',\n        '**/.husky/**',\n        '**/*.d.ts',\n        '**/types/**',\n        '**/__tests__/**',\n        '**/*.{test,spec}.{ts,tsx}',\n        '**/*.config.{js,ts}',\n      ],\n    },\n    testTimeout: 20000,\n    pool: 'threads',\n    poolOptions: {\n      threads: {\n        singleThread: false,\n      },\n    },\n  },\n});\n"
  }
]